Difference between revisions of "LlScaleByFactor"

From Second Life Wiki
Jump to navigation Jump to search
m
m (break lines for better readability on lower resolution screens)
Line 16: Line 16:
|constants
|constants
|examples=
|examples=
<lsl>// Touching this script causes the object to double or halve in size.
<lsl>// Touching this script causes the object to double or halve in size.
integer growing = FALSE;
 
integer growing;
 
default
default
{
{
     state_entry()
     state_entry()
     {
     {
         llSay(0, "Touch to toggle scale");
         llSay(PUBLIC_CHANNEL, "Touch to toggle scale.");
     }
     }
 
     touch_start(integer total_number)
     touch_start(integer num_detected)
     {
     {
        growing = !growing;
         float min_factor = llGetMinScaleFactor();
         float min_factor = llGetMinScaleFactor();
         float max_factor = llGetMaxScaleFactor();
         float max_factor = llGetMaxScaleFactor();
        llSay(PUBLIC_CHANNEL, "min_scale_factor = " + (string)min_factor
                            + "\nmax_scale_factor = " + (string)max_factor);
         integer success;
         integer success;
        llSay(0, "min_scale_factor = " + (string)min_factor + "  max_scale_factor = " + (string)max_factor);
 
        growing = !growing;
         if (growing) success = llScaleByFactor(2.0);
         if (growing)
         else        success = llScaleByFactor(0.5);
        {
 
            success = llScaleByFactor(2.0);
         if (!success) llSay(PUBLIC_CHANNEL, "Scaling failed!");
        }
         else
         {
            success = llScaleByFactor(0.5);
        }
         if (!success)
        {
            llSay(0, "Scaling failed!");
        }
     }
     }
}</lsl>
}</lsl>
Line 69: Line 67:
integer ScaleByFactor(float scale) {
integer ScaleByFactor(float scale) {
     vector root = llGetScale() * scale;
     vector root = llGetScale() * scale;
     if(VectorAbsStatistics(LIST_STAT_MAX, root) > 64 || VectorAbsStatistics(LIST_STAT_MIN, root) < 0.01 || scale <= 0) return ERR_MALFORMED_PARAMS;
 
     if (VectorAbsStatistics(LIST_STAT_MAX, root) > 64
        || VectorAbsStatistics(LIST_STAT_MIN, root) < 0.01
        || scale <= 0)
    {
        return ERR_MALFORMED_PARAMS;
    }


     integer prims = llGetNumberOfPrims();
     integer prims = llGetNumberOfPrims();
     list set = [PRIM_LINK_TARGET, prims > 1, PRIM_SIZE, root];
     list set = [PRIM_LINK_TARGET, prims > 1, PRIM_SIZE, root];
   
 
     if(prims > 1) {
     if (prims > 1) {
         list get = [];
         list get = [];
         integer count = prims;
         integer count = prims;
Line 84: Line 88:
         do {
         do {
             vector size = llList2Vector(get, ++count) * scale;
             vector size = llList2Vector(get, ++count) * scale;
             vector pos = llList2Vector(get, ++count) * scale;
             vector pos = llList2Vector(get, ++count) * scale;
             if(VectorAbsStatistics(LIST_STAT_MAX, size) > 64 || VectorAbsStatistics(LIST_STAT_MIN, size) < 0.01 || VectorAbsStatistics(LIST_STAT_MAX, pos) > 54 )
 
             if (VectorAbsStatistics(LIST_STAT_MAX, size) > 64
                || VectorAbsStatistics(LIST_STAT_MIN, size) < 0.01
                || VectorAbsStatistics(LIST_STAT_MAX, pos) > 54 )
            {
                 return ERR_MALFORMED_PARAMS;
                 return ERR_MALFORMED_PARAMS;
             set += [PRIM_LINK_TARGET, prims, PRIM_POS_LOCAL, pos, PRIM_SIZE, size];
            }
         } while(--prims > 1);
 
             set += [PRIM_LINK_TARGET, prims,
                        PRIM_POS_LOCAL, pos,
                        PRIM_SIZE, size];
         } while(--prims > 1);
     }
     }
     llSetPrimitiveParams(set);
     llSetPrimitiveParams(set);

Revision as of 17:33, 6 January 2014

Summary

Function: integer llScaleByFactor( float scaling_factor );
0.0 Forced Delay
10.0 Energy

Attempts to resize the entire object by scaling_factor, maintaining the size-position ratios of the prims.

Resizing is subject to prim scale limits and linkability limits. This function can not resize the object if the linkset is physical, a pathfinding character, in a keyframed motion, or if resizing would cause the parcel to overflow.
Returns a boolean (an integer) TRUE if it succeeds, FALSE if it fails.

• float scaling_factor The multiplier to be used with the prim sizes and their local positions.

Caveats

  • Due to floating point precision issues (often, sqrt(x*x) != x), avoid rescaling by the values returned by llGetMinScaleFactor and llGetMaxScaleFactor. To guarantee successful rescaling, use values slightly within the limits returned by those functions.

Examples

<lsl>// Touching this script causes the object to double or halve in size.

integer growing;

default {

   state_entry()
   {
       llSay(PUBLIC_CHANNEL, "Touch to toggle scale.");
   }
   touch_start(integer num_detected)
   {
       growing = !growing;
       float min_factor = llGetMinScaleFactor();
       float max_factor = llGetMaxScaleFactor();
       llSay(PUBLIC_CHANNEL, "min_scale_factor = " + (string)min_factor
                           + "\nmax_scale_factor = " + (string)max_factor);
       integer success;
       if (growing) success = llScaleByFactor(2.0);
       else         success = llScaleByFactor(0.5);
       if (!success) llSay(PUBLIC_CHANNEL, "Scaling failed!");
   }
}</lsl>

See Also

Deep Notes

This function is roughly equivalent to the following: <lsl> float VectorAbsStatistics(integer flag, vector a){

   return llListStatistics(flag, [llFabs(a.x), llFabs(a.y), llFabs(a.z)]);

}

integer ScaleByFactor(float scale) {

   vector root = llGetScale() * scale;
   if (VectorAbsStatistics(LIST_STAT_MAX, root) > 64

History

Signature

function integer llScaleByFactor( float scaling_factor );