using GetObjectDesc for particle color
|
|
Lunar Tripsa
Registered User
Join date: 2 Feb 2007
Posts: 38
|
08-07-2008 07:53
Hello all, I'm trying to figure out how to use the objects description to change the color of the particles. A script in the root prim sends a linked meessage to a child prim with a script in to write the color vector onto the objects desciprion so that the particle script, also in the child prim can read it. That all works, but now I have no clue how to get that data. I know llGetObjectDesc is part of it, but I'm not sure where to put that info or how to then assign it to the PSYS_PART_START_COLOR and PSYS_PART_END_COLOR, Any help would be great, becuase i'm not really sure how where in the script to put this ir how to take the info from llGetObjectDesc. I'm using one of Jopsy Pendragon amazing templates which is below. I took out some of the commented info just to make it easier to read. Thanks so much! //// "Glow" PARTICLE TEMPLATE v1 - by Jopsy Pendragon - 4/8/2008 //// You are free to use this script as you please, so long as you include this line: //** The original 'free' version of this script came from THE PARTICLE LABORATORY. **//
default { state_entry() { particle_parameters = [ // start of particle settings // Texture Parameters: PSYS_SRC_TEXTURE, llGetInventoryName(INVENTORY_TEXTURE, 0), PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <2.0, 2.0, FALSE>, PSYS_PART_START_COLOR, <1.00,1.00,1.00>, PSYS_PART_END_COLOR, <1.00,1.00,1.00>, PSYS_PART_START_ALPHA, (float) .5, PSYS_PART_END_ALPHA, (float) 0.0, // Production Parameters: PSYS_SRC_BURST_PART_COUNT, (integer) 1, PSYS_SRC_BURST_RATE, (float) 0.05, PSYS_PART_MAX_AGE, (float) 0.75, // PSYS_SRC_MAX_AGE, (float) 0.00, // Placement Parameters: PSYS_SRC_PATTERN, (integer) 1, // 1=DROP, 2=EXPLODE, 4=ANGLE, 8=CONE, // Placement Parameters (for any non-DROP pattern): // PSYS_SRC_BURST_SPEED_MIN, (float) 00.1, PSYS_SRC_BURST_SPEED_MAX, (float) 00.1, // PSYS_SRC_BURST_RADIUS, (float) 00.00, // Placement Parameters (only for ANGLE & CONE patterns): // PSYS_SRC_ANGLE_BEGIN, (float) 0.25 * PI, PSYS_SRC_ANGLE_END, (float) 0.00 * PI, // PSYS_SRC_OMEGA, <00.00, 00.00, 00.00>, // After-Effect & Influence Parameters: // PSYS_SRC_ACCEL, < 00.00, 00.00, 00.0>, // PSYS_SRC_TARGET_KEY, (key) llGetLinkKey(llGetLinkNum() + 1), PSYS_PART_FLAGS, (integer) ( 0 // Texture Options: | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_EMISSIVE_MASK // | PSYS_PART_FOLLOW_VELOCITY_MASK // After-effect & Influence Options: // | PSYS_PART_WIND_MASK // | PSYS_PART_BOUNCE_MASK | PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK // | PSYS_PART_TARGET_LINEAR_MASK ) //end of particle settings ]; if ( AUTO_START ) llParticleSystem( particle_parameters ); } link_message( integer sibling, integer num, string mesg, key target_key ) { if ( mesg != CONTROLLER_ID ) { // this message isn't for me. Bail out. return; } else if ( num == 0 ) { // Message says to turn particles OFF: llParticleSystem( [ ] ); } else if ( num == 1 ) { // Message says to turn particles ON: llParticleSystem( particle_parameters + target_parameters ); } else if ( num == 2 ) { // Turn on, and remember and use the key sent us as a target: target_parameters = [ PSYS_SRC_TARGET_KEY, target_key ]; llParticleSystem( particle_parameters + target_parameters ); } else { // bad instruction number // do nothing. } } }
|
|
Pale Spectre
Registered User
Join date: 2 Sep 2005
Posts: 586
|
08-07-2008 11:38
Lets say llGetObjectDesc() returns this string: "<1.00,1.00,1.00>,<1.00,1.00,1.00>"
list lDesc = llCSV2List(llGetObjectDesc()); vector vStart = (vector)llList2String(Ldesc, 0); vector vEnd = (vector)llList2String(Ldesc, 1);
...will yield the two vector variables vStart, and vEnd, which can be substituted into your particle code.
Before you get carried away with this technique - useful as it can be - bear in mind that a prim's description is limited to 127 characters.
Incidentally, the whole use of state_entry in your example to create the particle_parameters variable is a real straight-jacket approach to scripting. Far better to put this kind of thing in its own, accessible, function:
pEffect() { llParticleSystem([ // Texture Parameters: PSYS_SRC_TEXTURE, llGetInventoryName(INVENTORY_TEXTURE, 0), PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <2.0, 2.0, FALSE>, PSYS_PART_START_COLOR, vStart, PSYS_PART_END_COLOR, vEnd, PSYS_PART_START_ALPHA, 0.5, PSYS_PART_END_ALPHA, 0.0,
// Production Parameters: PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_BURST_RATE, 0.05, PSYS_PART_MAX_AGE, 0.75, // PSYS_SRC_MAX_AGE, 0.00,
// Placement Parameters: PSYS_SRC_PATTERN, 1, // 1=DROP, 2=EXPLODE, 4=ANGLE, 8=CONE,
// Placement Parameters (for any non-DROP pattern): // PSYS_SRC_BURST_SPEED_MIN, 0.1, PSYS_SRC_BURST_SPEED_MAX, 0.1, // PSYS_SRC_BURST_RADIUS, 0.0,
// Placement Parameters (only for ANGLE & CONE patterns): // PSYS_SRC_ANGLE_BEGIN, 0.25 * PI, PSYS_SRC_ANGLE_END, 0.00 * PI, // PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>,
// After-Effect & Influence Parameters: // PSYS_SRC_ACCEL, < 0.0, 0.0, 0.0>, // PSYS_SRC_TARGET_KEY, llGetLinkKey(llGetLinkNum() + 1),
PSYS_PART_FLAGS, ( 0 // Texture Options: | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_EMISSIVE_MASK // | PSYS_PART_FOLLOW_VELOCITY_MASK // | PSYS_PART_WIND_MASK // | PSYS_PART_BOUNCE_MASK | PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK // | PSYS_PART_TARGET_LINEAR_MASK )]); }
...then you can call it as required...
: :
else if (num == 1) // Message says to turn particles ON: { lDesc = llCSV2List(llGetObjectDesc()); vStart = (vector)llList2String(Ldesc, 0); vEnd = (vector)llList2String(Ldesc, 1); pEffect(); }
|
|
Lunar Tripsa
Registered User
Join date: 2 Feb 2007
Posts: 38
|
08-07-2008 11:59
Oh thanks so much!!!
I;m having a little trouble with it (syntex error), but I'll play around and see if I can get it working. I definetly wouldn't have gotten there on my own. Thanks again
|
|
Lunar Tripsa
Registered User
Join date: 2 Feb 2007
Posts: 38
|
08-07-2008 12:18
okay I;m definetly having a problem with a Sytax Error at list lDesc = llCSV2List(llGetObjectDesc());
It get's stuck on (llGetObjectDesc());
I've only used lists in a very limited way, so I'm not sure how to fix this, or if I should be putting it somewhere else.
|
|
Pale Spectre
Registered User
Join date: 2 Sep 2005
Posts: 586
|
08-07-2008 12:41
list lDesc = llCSV2List(llGetObjectDesc()); is syntactically correct. You must have some adjacent problem. Unmatched curly brackets, for example? For someone to spot the problem you're going to have to post more of your code. 
|
|
Lunar Tripsa
Registered User
Join date: 2 Feb 2007
Posts: 38
|
08-07-2008 12:52
yes that would help. Guess I;m focused on it to much in world lol. I'm not sure if thus was how you suggested to set it up. I have a feeling I might be making a larger tangle out of this...
list lDesc = llCSV2List(llGetObjectDesc()); vector vStart = (vector)llList2String(Ldesc, 0); vector vEnd = (vector)llList2String(Ldesc, 1); pEffect() { llParticleSystem([ // Texture Parameters: PSYS_SRC_TEXTURE, llGetInventoryName(INVENTORY_TEXTURE, 0), PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <2.0, 2.0, FALSE>, PSYS_PART_START_COLOR, vStart, PSYS_PART_END_COLOR, vEnd, PSYS_PART_START_ALPHA, 0.5, PSYS_PART_END_ALPHA, 0.0,
// Production Parameters: PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_BURST_RATE, 0.05, PSYS_PART_MAX_AGE, 0.75, // PSYS_SRC_MAX_AGE, 0.00,
// Placement Parameters: PSYS_SRC_PATTERN, 1, // 1=DROP, 2=EXPLODE, 4=ANGLE, 8=CONE,
// Placement Parameters (for any non-DROP pattern): // PSYS_SRC_BURST_SPEED_MIN, 0.1, PSYS_SRC_BURST_SPEED_MAX, 0.1, // PSYS_SRC_BURST_RADIUS, 0.0,
// Placement Parameters (only for ANGLE & CONE patterns): // PSYS_SRC_ANGLE_BEGIN, 0.25 * PI, PSYS_SRC_ANGLE_END, 0.00 * PI, // PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>,
// After-Effect & Influence Parameters: // PSYS_SRC_ACCEL, < 0.0, 0.0, 0.0>, // PSYS_SRC_TARGET_KEY, llGetLinkKey(llGetLinkNum() + 1),
PSYS_PART_FLAGS, ( 0 // Texture Options: | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_EMISSIVE_MASK // | PSYS_PART_FOLLOW_VELOCITY_MASK // | PSYS_PART_WIND_MASK // | PSYS_PART_BOUNCE_MASK | PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK // | PSYS_PART_TARGET_LINEAR_MASK )]); }
default { state_entry(){ { link_message(integer sender, integer num, string message, key id) { if(message=="BURST-On") { lDesc = llCSV2List(llGetObjectDesc()); vStart = (vector)llList2String(Ldesc, 0); vEnd = (vector)llList2String(Ldesc, 1); pEffect();
} if(message=="BURST-Off") { llParticleSystem( [ ] ); } if(message=="BURST-Reset") { llResetScript(); } } }
|
|
Hewee Zetkin
Registered User
Join date: 20 Jul 2006
Posts: 2,702
|
08-07-2008 13:05
The problem is that you cannot call functions or, in fact, perform ANY calculation outside a function or event handler. You can ONLY initialize the value of a global variable with a constant value or the value of another global variable. You might try setting the value of those top three globals within the default/state_entry handler. Another useful pattern I've used quite often is: string CALCULATED_CONST_1; integer CALCULATED_CONST_2; list CALCULATED_CONST_3; // ...
integer initialized = FALSE; init() { if (initialized) { return; } initialized = TRUE;
CALCULATED_CONST_1 = functionCall(); CALCULATED_CONST_2 = llStringLength(CALCULATED_CONST_1); CALCULATED_CONST_3 = [ CALCULATED_CONST_1, CALCULATED_CONST_2 ]; // ... }
default { state_entry() { init();
// ... } }
|
|
Pale Spectre
Registered User
Join date: 2 Sep 2005
Posts: 586
|
08-07-2008 13:18
This should compile. Lets hope the link messages work!  list lDesc; vector vStart; vector vEnd;
pEffect() { llParticleSystem([ // Texture Parameters: PSYS_SRC_TEXTURE, llGetInventoryName(INVENTORY_TEXTURE, 0), PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <2.0, 2.0, FALSE>, PSYS_PART_START_COLOR, vStart, PSYS_PART_END_COLOR, vEnd, PSYS_PART_START_ALPHA, 0.5, PSYS_PART_END_ALPHA, 0.0, // Production Parameters: PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_BURST_RATE, 0.05, PSYS_PART_MAX_AGE, 0.75, // PSYS_SRC_MAX_AGE, 0.00, // Placement Parameters: PSYS_SRC_PATTERN, 1, // 1=DROP, 2=EXPLODE, 4=ANGLE, 8=CONE, // Placement Parameters (for any non-DROP pattern): // PSYS_SRC_BURST_SPEED_MIN, 0.1, PSYS_SRC_BURST_SPEED_MAX, 0.1, // PSYS_SRC_BURST_RADIUS, 0.0, // Placement Parameters (only for ANGLE & CONE patterns): // PSYS_SRC_ANGLE_BEGIN, 0.25 * PI, PSYS_SRC_ANGLE_END, 0.00 * PI, // PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>, // After-Effect & Influence Parameters: // PSYS_SRC_ACCEL, < 0.0, 0.0, 0.0>, // PSYS_SRC_TARGET_KEY, llGetLinkKey(llGetLinkNum() + 1), PSYS_PART_FLAGS, ( 0 // Texture Options: | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_EMISSIVE_MASK // | PSYS_PART_FOLLOW_VELOCITY_MASK // | PSYS_PART_WIND_MASK // | PSYS_PART_BOUNCE_MASK | PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK // | PSYS_PART_TARGET_LINEAR_MASK )]); }
default { link_message(integer sender, integer num, string message, key id) { if(message == "BURST-On") { lDesc = llCSV2List(llGetObjectDesc()); vStart = (vector)llList2String(lDesc, 0); vEnd = (vector)llList2String(lDesc, 1); pEffect(); } if(message == "BURST-Off") { llParticleSystem([ ]); } if(message == "BURST-Reset") { llResetScript(); } } }
|
|
Lunar Tripsa
Registered User
Join date: 2 Feb 2007
Posts: 38
|
08-07-2008 13:36
Oh wow!!! Thats awesome! Thanks so much Pale Spectre it worked perfectly.
and thanks Hewee, I;m going to take a look at you coding this evening.
I do have one more questions. I was hoping that by calling a script reset on an object color change I could get the particle script to update, but it doesn't seem to be working.
I really don't want to use a timer to check it for me, so is the anouther way to go about updating the particles on an object color change?
I don't want to turn the particles on everytime a color change happens. So I was hoping if the particles were off that the reset would not effect the particles, since they didn't exist, but if the script was on then the particle color would update. A test I did seem to suggest it might work, but now that I actually have everything else running the only way to update the color is to turn on the particles wether they are on already or not.
If thats all to confusing I suppose I could make it easier to turn of the particles from the dialog, but it's an extra step the user has to make.
Anyway, THANKS SO MUCH!!! I learned a lot from this.
|
|
Pale Spectre
Registered User
Join date: 2 Sep 2005
Posts: 586
|
08-07-2008 13:53
If I understand you correctly "BURST-Reset" is not really any different to "BURST-On" (except that the prim's Description has just changed). So, why not simply: //globals and particle stuff : :
default { link_message(integer sender, integer num, string message, key id) { if(message == "BURST-On" || message == ""BURST-Reset") { lDesc = llCSV2List(llGetObjectDesc()); vStart = (vector)llList2String(lDesc, 0); vEnd = (vector)llList2String(lDesc, 1); pEffect(); } if(message == "BURST-Off") { llParticleSystem([ ]); } } }
If you really still want a reset then: //globals and particle stuff : :
default { state_entry() { lDesc = llCSV2List(llGetObjectDesc()); vStart = (vector)llList2String(lDesc, 0); vEnd = (vector)llList2String(lDesc, 1); pEffect(); }
link_message(integer sender, integer num, string message, key id) { if(message == "BURST-On" || message == ""BURST-Reset") { lDesc = llCSV2List(llGetObjectDesc()); vStart = (vector)llList2String(lDesc, 0); vEnd = (vector)llList2String(lDesc, 1); pEffect(); } if(message == "BURST-Off") { llParticleSystem([ ]); } if(message == "BURST-Reset") { llResetScript(); } } }
or  because we now have code duplication: pEffect() { list lDesc = llCSV2List(llGetObjectDesc()); vector vStart = (vector)llList2String(lDesc, 0); vector vEnd = (vector)llList2String(lDesc, 1);
llParticleSystem([ // Texture Parameters: PSYS_SRC_TEXTURE, llGetInventoryName(INVENTORY_TEXTURE, 0), PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <2.0, 2.0, FALSE>, PSYS_PART_START_COLOR, vStart, PSYS_PART_END_COLOR, vEnd, PSYS_PART_START_ALPHA, 0.5, PSYS_PART_END_ALPHA, 0.0, // Production Parameters: PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_BURST_RATE, 0.05, PSYS_PART_MAX_AGE, 0.75, // PSYS_SRC_MAX_AGE, 0.00, // Placement Parameters: PSYS_SRC_PATTERN, 1, // 1=DROP, 2=EXPLODE, 4=ANGLE, 8=CONE, // Placement Parameters (for any non-DROP pattern): // PSYS_SRC_BURST_SPEED_MIN, 0.1, PSYS_SRC_BURST_SPEED_MAX, 0.1, // PSYS_SRC_BURST_RADIUS, 0.0, // Placement Parameters (only for ANGLE & CONE patterns): // PSYS_SRC_ANGLE_BEGIN, 0.25 * PI, PSYS_SRC_ANGLE_END, 0.00 * PI, // PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>, // After-Effect & Influence Parameters: // PSYS_SRC_ACCEL, < 0.0, 0.0, 0.0>, // PSYS_SRC_TARGET_KEY, llGetLinkKey(llGetLinkNum() + 1), PSYS_PART_FLAGS, ( 0 // Texture Options: | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_EMISSIVE_MASK // | PSYS_PART_FOLLOW_VELOCITY_MASK // | PSYS_PART_WIND_MASK // | PSYS_PART_BOUNCE_MASK | PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK // | PSYS_PART_TARGET_LINEAR_MASK )]); }
default { state_entry() { pEffect(); }
link_message(integer sender, integer num, string message, key id) { if(message == "BURST-On") pEffect(); else if(message == "BURST-Off") llParticleSystem([ ]); else if(message == "BURST-Reset") llResetScript(); } }
One cat... so many ways to skin it. 
|
|
Lunar Tripsa
Registered User
Join date: 2 Feb 2007
Posts: 38
|
08-07-2008 14:05
yes, I was thinking about doing that, in a similar less stylish way, but the problem is that it turns the particles on if there off.
If the particles are off and an object color change happens it turns them on and I'd like to keep off setting if possible. Of course if the particles are on I'd like the color to update just like that.
I'm making a lantern that with a dialog menu allows you to change a lot of variables sepertaly except for the particle colors. So if the particles are not desried I don't want to have to turn change the color then turn them off again. Of course I might just be overly fussy too.
|
|
Pale Spectre
Registered User
Join date: 2 Sep 2005
Posts: 586
|
08-07-2008 14:43
Resetting a script is pretty much like wiping its memory so it will have no idea whether the particles are running or not. So, steering away from llResetScript... integer iOnOff;
pEffect() { iOnOff = TRUE; //Particles are ON list lDesc = llCSV2List(llGetObjectDesc()); vector vStart = (vector)llList2String(lDesc, 0); vector vEnd = (vector)llList2String(lDesc, 1);
llParticleSystem([ // Texture Parameters: PSYS_SRC_TEXTURE, llGetInventoryName(INVENTORY_TEXTURE, 0), PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <2.0, 2.0, FALSE>, PSYS_PART_START_COLOR, vStart, PSYS_PART_END_COLOR, vEnd, PSYS_PART_START_ALPHA, 0.5, PSYS_PART_END_ALPHA, 0.0, // Production Parameters: PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_BURST_RATE, 0.05, PSYS_PART_MAX_AGE, 0.75, // PSYS_SRC_MAX_AGE, 0.00, // Placement Parameters: PSYS_SRC_PATTERN, 1, // 1=DROP, 2=EXPLODE, 4=ANGLE, 8=CONE, // Placement Parameters (for any non-DROP pattern): // PSYS_SRC_BURST_SPEED_MIN, 0.1, PSYS_SRC_BURST_SPEED_MAX, 0.1, // PSYS_SRC_BURST_RADIUS, 0.0, // Placement Parameters (only for ANGLE & CONE patterns): // PSYS_SRC_ANGLE_BEGIN, 0.25 * PI, PSYS_SRC_ANGLE_END, 0.00 * PI, // PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>, // After-Effect & Influence Parameters: // PSYS_SRC_ACCEL, < 0.0, 0.0, 0.0>, // PSYS_SRC_TARGET_KEY, llGetLinkKey(llGetLinkNum() + 1), PSYS_PART_FLAGS, ( 0 // Texture Options: | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_EMISSIVE_MASK // | PSYS_PART_FOLLOW_VELOCITY_MASK // | PSYS_PART_WIND_MASK // | PSYS_PART_BOUNCE_MASK | PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK // | PSYS_PART_TARGET_LINEAR_MASK )]); }
default { link_message(integer sender, integer num, string message, key id) { if(message == "BURST-On" || (message == "BURST-Reset" && iOnOff)) pEffect(); else if(message == "BURST-Off") { iOnOff = FALSE; //Particles are OFF llParticleSystem([ ]); } } }
|
|
Lunar Tripsa
Registered User
Join date: 2 Feb 2007
Posts: 38
|
08-07-2008 14:59
Well I thought yesterday it was doing something odd, but today it works perfectly, so "fingers crossed" it looks good, THANKS SO MUCH!!!
|