|
Avil Creeggan
Crazy Stalker.
Join date: 16 Jul 2006
Posts: 39
|
08-11-2006 22:46
Alright, so, I have a half-sphere (size 9.7, 10, 9.5, notwist nodimple, rot 0,0,135), which is hollowed out (95) and path cut to form a sliver. I want to use the Torus Iris Door script to slowly increase the path cut to a quarter-sphere (0.25, 0.50) on one click, and slowly decrease it back to sliver (0.48, 0.50) on the next. The issue is that SetPrimParams doesn't seem to want to let me just alter that attribute; On leaving the correct number and type of variables undefined, it refused to run, giving runtime errors. Apon defining those as 0 (aside from hole shape (circle/sphere) and hollow), I get a 10x10x10 cone which is the size of my foot and which, apon being unhollowed, turns into a long pointer. Apon explicitly defining the attributes as they are now in every iteration of SetPrimParams, I get a even stranger shape. Mix and match between the two, and I get rewarded with the same. Here is one form of my script: integer g_OpenNow; // True (1) if iris is 'open' now
default { on_rez(integer param) { llResetScript(); } state_entry() { if (g_OpenNow == TRUE) // Prim is in open state, so calculate new 'closed' size { state WaitToClose; } else // Prim is in a closed (or undefined state), so calculate new 'open' size { g_OpenNow = FALSE; state WaitToOpen; } } } state WaitToClose // Iris is Open, and waiting to close { touch_start(integer total_number) { llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.23, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.28, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.33, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.38, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.43, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.48, 0.5, 0.0>, "", "", ""]); g_OpenNow = FALSE; state WaitToOpen; } }
state WaitToOpen // Iris is closed, and waiting to open { touch_start(integer total_number) { llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.48, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.43, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.38, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.33, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.28, 0.5, 0.0>, "", "", ""]); llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, "", <0.23, 0.5, 0.0>, "", "", ""]); g_OpenNow = TRUE; state WaitToClose; } }
|
|
Joannah Cramer
Registered User
Join date: 12 Apr 2006
Posts: 1,539
|
08-11-2006 23:12
Just a thought, but how about a loop of: llGetPrimitiveParams() to read current attributes of your half-sphere, then combine your cut parameter bits with these parts of list you received that don't have to change... then feed it back to llSetPrimitiveParams() ... rinse, repeat until fully done. o.O;
|
|
Joannah Cramer
Registered User
Join date: 12 Apr 2006
Posts: 1,539
|
08-11-2006 23:55
working prototype, sort of. fugly but well, working. vector lerp( vector A, vector B, float Time ) {
if( Time < 0.0 ) Time = 0.0; if( Time > 1.0 ) Time = 1.0;
return (A * (1.0 - Time)) + (B * Time); }
default { touch_start(integer total_number) {
list params = llGetPrimitiveParams( [ PRIM_TYPE ] ); vector cut_begin = <0.48, 0.50, 0.0>; vector cut_end = <0.25, 0.50, 0.0>; float step = 1.0 / 10.0; // change 10.0 to more or less in order to make it less or more "smooth" float idx = 0.0; do { idx += step; vector cut = lerp( cut_begin, cut_end, idx ); llSetPrimitiveParams( [ PRIM_TYPE ] + llList2List( params, 0, 1 ) + cut + llList2List( params, 3, -1 ) ); } while ( idx <= 1.0 ); state back; } }
state back { touch_start(integer total_number) {
list params = llGetPrimitiveParams( [ PRIM_TYPE ] ); vector cut_begin = <0.48, 0.50, 0.0>; vector cut_end = <0.25, 0.50, 0.0>; float step = 1.0 / 10.0; // change 10.0 to more or less in order to make it less or more "smooth" float idx = 0.0; do { idx += step; vector cut = lerp( cut_end, cut_begin, idx ); llSetPrimitiveParams( [ PRIM_TYPE ] + llList2List( params, 0, 1 ) + cut + llList2List( params, 3, -1 ) ); } while ( idx <= 1.0 );
state default; } }
|