Difference between revisions of "User:Daemonika Nightfire/Scripts/*DS* Resize Script"

From Second Life Wiki
Jump to navigation Jump to search
m (<lsl> tag to <source>)
Line 2: Line 2:
Single resize script for a complete linkset with save and restore option.
Single resize script for a complete linkset with save and restore option.
<source lang="lsl2">
<source lang="lsl2">
/*
//
    ╔═════════════════════════════════════−−−­­­­­­→
//    ╔═════════════════════════════════════−−−­­­­­­→
    ║ *DS* Resize Script (m/c/t) by Daemonika Nightfire (daemonika.nightfire)
//    ║ *DS* Resize Script (m/c/t) by Daemonika Nightfire (daemonika.nightfire)
    ╚══════════════════════−−−­­­→
//    ╚══════════════════════−−−­­­→
   
//
    Resize Script for rezzed Objects and Attachments.
//
    Single-script for a complete linkset with save and restore option.
//   
   
//    Resize Script for rezzed Objects and Attachments.
        Featueres:
//    Single-script for a complete linkset with save and restore option.
        • By the first run or reset of this script, it will ask you to save all parameters.
//   
          The parameters will be stored in the descriptionfield of each prim, that needs no script-memory :)
//        Featueres:
        • You can save, resize and restore individual prims or the complette linkset.
//        • By the first run or reset of this script, it will ask you to save all parameters.
        • Deleting this script from the object is not required because its only one.
//          The parameters will be stored in the descriptionfield of each prim, that needs no script-memory :)
       
//        • You can save, resize and restore individual prims or the complette linkset.
            Standby-Time ~ 0.004 ms
//        • Deleting this script from the object is not required because its only one.
            Working-Time with 200 moving Prims ~ 4.000 up to 16.000 ms
//       
            after finalizing Standby-Time ~ 0.004 ms again
//            Standby-Time ~ 0.004 ms
   
//            Working-Time with 200 moving Prims ~ 4.000 up to 16.000 ms
        Note:
//            after finalizing Standby-Time ~ 0.004 ms again
        • You have to stand on a posestand, if you want to edit attached attachments.
//   
          This is necessary because otherwise the linkset is misadjusted, if you move your avatar during the process.
//        Note:
       
//        • You have to stand on a posestand, if you want to edit attached attachments.
        Important:
//          This is necessary because otherwise the linkset is misadjusted, if you move your avatar during the process.
        • Undersize is possible, but take care.
//       
          if you are small your object and several prims already have minimum dimensions, they are not further reduced, but they are moved proportionally.
//        Important:
        • Sculpted Prims are no problem, but take care.
//        • Undersize is possible, but take care.
          Sculpties with moved Bounding Box perhaps moving optical not correct
//          if you are small your object and several prims already have minimum dimensions, they are not further reduced, but they are moved proportionally.
          That is not true, they are moving correctly, but when the visible Sculptie is not the center of the Bounding Box, it will be looking wrong.
//        • Sculpted Prims are no problem, but take care.
   
//          Sculpties with moved Bounding Box perhaps moving optical not correct
    Terms of use:
//          That is not true, they are moving correctly, but when the visible Sculptie is not the center of the Bounding Box, it will be looking wrong.
    You can use, edit and sell this script inside your creations with the following permissions in Second Life:
//   
    • MOD Yes • COPY Yes • TRANSFER Yes
//    Terms of use:
   
//    You can use, edit and sell this script inside your creations with the following permissions in Second Life:
    Yes that means fullperm. Other settings, are against the following licenses.
//    • MOD Yes • COPY Yes • TRANSFER Yes
    The permission of your Object (prim), remain unaffected by these terms
//   
   
//    Yes that means fullperm. Other settings, are against the following licenses.
    https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/*DS*_Resize_Script
//    The permission of your Object (prim), remain unaffected by these terms
    http://wiki.secondlife.com/wiki/Project:Terms_of_Service
//   
    http://creativecommons.org/licenses/by-sa/3.0/
//    https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/*DS*_Resize_Script
   
//    http://wiki.secondlife.com/wiki/Project:Terms_of_Service
    violation of this Terms are against the Second Life TOS at §7 Content Licenses and Intellectual Property Rights.
//    http://creativecommons.org/licenses/by-sa/3.0/
    http://secondlife.com/corporate/tos.php
//   
*/
//    violation of this Terms are against the Second Life TOS at §7 Content Licenses and Intellectual Property Rights.
//    http://secondlife.com/corporate/tos.php
//


key owner;
key owner;
Line 57: Line 59:
{
{
     llListenRemove(Listener);
     llListenRemove(Listener);
     Channel = (integer)(llFrand(999999.0) * -1);
     Channel = (integer)(llFrand(1) * -DEBUG_CHANNEL);
     Listener = llListen(Channel, "", owner, "");
     Listener = llListen(Channel, "", owner, "");
     llSetTimerEvent(60);
     llSetTimerEvent(60);

Revision as of 08:01, 13 July 2022

*DS* Resize Script (m/c/t) v2.0.01

Single resize script for a complete linkset with save and restore option.

//
//    ╔═════════════════════════════════════−−−­­­­­­→
//    ║ *DS* Resize Script (m/c/t) by Daemonika Nightfire (daemonika.nightfire)
//    ╚══════════════════════−−−­­­→
//
//
//    
//    Resize Script for rezzed Objects and Attachments.
//    Single-script for a complete linkset with save and restore option.
//    
//        Featueres:
//        • By the first run or reset of this script, it will ask you to save all parameters.
//          The parameters will be stored in the descriptionfield of each prim, that needs no script-memory :)
//        • You can save, resize and restore individual prims or the complette linkset.
//        • Deleting this script from the object is not required because its only one.
//        
//            Standby-Time ~ 0.004 ms
//            Working-Time with 200 moving Prims ~ 4.000 up to 16.000 ms
//            after finalizing Standby-Time ~ 0.004 ms again
//    
//        Note:
//        • You have to stand on a posestand, if you want to edit attached attachments.
//          This is necessary because otherwise the linkset is misadjusted, if you move your avatar during the process.
//        
//        Important:
//        • Undersize is possible, but take care.
//          if you are small your object and several prims already have minimum dimensions, they are not further reduced, but they are moved proportionally.
//        • Sculpted Prims are no problem, but take care.
//          Sculpties with moved Bounding Box perhaps moving optical not correct
//          That is not true, they are moving correctly, but when the visible Sculptie is not the center of the Bounding Box, it will be looking wrong.
//    
//    Terms of use:
//    You can use, edit and sell this script inside your creations with the following permissions in Second Life:
//    • MOD Yes • COPY Yes • TRANSFER Yes
//    
//    Yes that means fullperm. Other settings, are against the following licenses.
//    The permission of your Object (prim), remain unaffected by these terms
//    
//    https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/*DS*_Resize_Script
//    http://wiki.secondlife.com/wiki/Project:Terms_of_Service
//    http://creativecommons.org/licenses/by-sa/3.0/
//    
//    violation of this Terms are against the Second Life TOS at §7 Content Licenses and Intellectual Property Rights.
//    http://secondlife.com/corporate/tos.php
//

key owner;
integer new = TRUE;

integer LinkSet = TRUE;
integer Prim;

integer Channel;
integer Listener;
Chan()
{
    llListenRemove(Listener);
    Channel = (integer)(llFrand(1) * -DEBUG_CHANNEL);
    Listener = llListen(Channel, "", owner, "");
    llSetTimerEvent(60);
}

menu1()
{
    Chan();
    if(new)
    {
        llDialog(owner, "\nYour first run or reset of this script.\nDo you whish to save current parameters?",
        ["Save","Later"], Channel);
    }
    else
    {
        llDialog(owner, "\nselect an option\nThis = touched Prim\nAll = complete Object",
        ["This","All","Done"], Channel);
    }
}

menu2()
{
    Chan();
    llDialog(owner, "\n+ - = resize\nSave = record all parameters\nRestore = restore saved parameters",
    ["Save","Restore","Done","-1%","-5%","-10%","+1%","+5%","+10%"], Channel);
}

default
{
    state_entry()
    {
        owner = llGetOwner();
        llWhisper(0,"/me " + llGetScriptName() + " Free Memory: " + (string)llGetFreeMemory() + " bytes.");
    }
    
    touch_start(integer total_number)
    {
        owner = llGetOwner();
        if(llDetectedKey(0) == owner)
        {
            if(llGetAttached() != 0)
            {
                if(llGetAgentInfo(owner) & AGENT_SITTING)
                {
                    Prim = llDetectedLinkNumber(0);
                    menu1();
                }
                else
                {
                    llOwnerSay("Please use a posing stand for resizing!");
                }
            }
            else
            {
                Prim = llDetectedLinkNumber(0);
                menu1();
            }
        }
    }
    
    listen(integer channel, string name, key id, string msg)
    {
        float shift = 0;
        vector position;
        vector size;
        list link;
        integer i;
        
        if(msg == "This")
        {
            LinkSet = FALSE;
            menu2();
        }
        else if(msg == "All")
        {
            LinkSet = TRUE;
            menu2();
        }
        else if(msg == "Done" || msg == "Later")
        {
            llListenRemove(Listener);
            llSetTimerEvent(0);
        }
        else if(msg == "-1%")
        {
            shift = 0.99;
        }
        else if(msg == "-5%")
        {
            shift = 0.95;
        }
        else if(msg == "-10%")
        {
            shift = 0.9;
        }
        else if(msg == "+1%")
        {
            shift = 1.01;
        }
        else if(msg == "+5%")
        {
            shift = 1.05;
        }
        else if(msg == "+10%")
        {
            shift = 1.1;
        }
        
        // Record
        else if(msg == "Save")
        {
            llOwnerSay("Please wait...");
            if(!LinkSet)
            {
                link = llGetLinkPrimitiveParams(Prim, [PRIM_SIZE , PRIM_POSITION]);
                position = llList2Vector(link, 1);
                position = (position - llGetRootPosition()) / llGetRootRotation();
                size = llList2Vector(link, 0);
                
                llSetLinkPrimitiveParamsFast(Prim,[PRIM_DESC,(string)size + "#" + (string)position]);
            }
            else
            {
                for(i = 0; i <= llGetNumberOfPrims(); i++)
                {
                    link = llGetLinkPrimitiveParams(i, [PRIM_SIZE , PRIM_POSITION]);
                    size = llList2Vector(link, 0);
                    position = llList2Vector(link, 1);
                    position = (position - llGetRootPosition()) / llGetRootRotation();
                    
                    if(i > 1)
                    {
                        llSetLinkPrimitiveParamsFast(i,[PRIM_DESC,(string)size + "#" + (string)position]);
                    }
                    else
                    {
                        llSetLinkPrimitiveParamsFast(i,[PRIM_DESC,(string)size]);
                    }
                }
                new = FALSE;
            }
            llOwnerSay("All parameters are stored");
            menu2();
        }
        
        // Restore
        else if(msg == "Restore")
        {
            if(!new)
            {
                llOwnerSay("Please wait...");
                if(!LinkSet)
                {
                    link = llGetLinkPrimitiveParams(Prim, [PRIM_DESC]);
                    list parsed = llParseString2List(llList2CSV(link), ["#"], []);
                    string vect = llList2String(parsed, 0);
                    size = (vector)vect;
                    
                    llSetLinkPrimitiveParamsFast(Prim, [PRIM_SIZE, size]);
                }
                else
                {
                    for(i = 0; i <= llGetNumberOfPrims(); i++)
                    {
                        link = llGetLinkPrimitiveParams(i, [PRIM_DESC]);
                        list parsed = llParseString2List(llList2CSV(link), ["#"], []);
                        string vect = llList2String(parsed, 0);
                        size = (vector)vect;
                        string posi = llList2String(parsed, 1);
                        position = (vector)posi;
                        
                        if(i > 1)
                        {
                            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size, PRIM_POSITION, position]);
                        }
                        else
                        {
                            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);
                        }
                    }
                }
                llOwnerSay("All stored parameters restored.");
                menu2();
            }
            else if(new)
            {
                llOwnerSay("Please first save all paremeters to use this.");
            }
        }
        
        // Resize
        if(shift != 0)
        {
            llOwnerSay("Please wait...");
            if(!LinkSet)
            {
                link = llGetLinkPrimitiveParams(Prim, [PRIM_SIZE]);
                size = llList2Vector(link, 0) * shift;
                
                llSetLinkPrimitiveParamsFast(Prim, [PRIM_SIZE, size]);
            }
            else
            {
                for(i = 0; i <= llGetNumberOfPrims(); i++)
                {
                    link = llGetLinkPrimitiveParams(i, [PRIM_SIZE, PRIM_POSITION]);
                    size = llList2Vector(link, 0) * shift;
                    position = llList2Vector(link, 1);
                    position = (position - llGetRootPosition()) / llGetRootRotation() * shift;
                    
                    if(i > 1)
                    {
                        llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size, PRIM_POSITION, position]);
                    }
                    else
                    {
                        llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);
                    }
                }
            }
            llOwnerSay("Finish.");
            menu2();
        }
    }
    
    timer()
    {
        llSetTimerEvent(0);
        llListenRemove(Listener);
        llOwnerSay("Listener timeout, please touch again to use the menu.");
    }
    
    on_rez(integer Dae)
    {
        if(new)
        {
            llResetScript();
        }
    }
}