llScaleByFactor

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Summary

Function: integer llScaleByFactor( float scaling_factor );

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.
All Issues ~ Search JIRA for related Bugs

Examples

//  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!");
    }
}

See Also

Deep Notes

This function is roughly equivalent to the following:

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
        || VectorAbsStatistics(LIST_STAT_MIN, root) < 0.01
        || scale <= 0)
    {
        return ERR_MALFORMED_PARAMS;
    }

    integer prims = llGetNumberOfPrims();
    list set = [PRIM_LINK_TARGET, prims > 1, PRIM_SIZE, root];

    if (prims > 1) {
        list get = [];
        integer count = prims;
        do {
            get += [PRIM_LINK_TARGET, count, PRIM_SIZE, PRIM_POS_LOCAL];
        } while(--count);
        get = llGetPrimitiveParams(get);
        count = 0;
        do {
            vector size = 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 )
            {
                return ERR_MALFORMED_PARAMS;
            }

            set += [PRIM_LINK_TARGET, prims,
                        PRIM_POS_LOCAL, pos,
                        PRIM_SIZE, size];
        } while(--prims > 1);
    }
    llSetPrimitiveParams(set);
    return TRUE;
}

History

Search JIRA for related Issues

Signature

function integer llScaleByFactor( float scaling_factor );