Difference between revisions of "User:Acheron Gloom"

From Second Life Wiki
Jump to navigation Jump to search
(Added some functions.)
 
(More functions - GetSubInteger and Int2Prim, need to upload Int2Prim image)
Line 1: Line 1:
== GetSubInteger ==
<lsl
integer getSubIntegerLowMem(integer x, integer place){
    integer tenExp = (integer)llPow(10.0, place);
    return (x/(tenExp/10)) - (x/tenExp)*10;
}
integer getSubIntegerFast(integer x, integer place){
    integer tenExp;
    if(place & 1){//1, 3, 5, 7, 9
        if(place & 2){//3, 7
            if(place & 4) tenExp = 10000000;
            else tenExp = 1000;
        }
        else{//1, 5, 9
            if(place & 4) tenExp = 100000;
            else if(place & 8) tenExp = 1000000000;
            else tenExp = 10;
        }
    }
    else{//2, 4, 6, 8, 10
        if(place & 2){//2, 6, 10
            if(place & 4) tenExp = 1000000;
            else{//2, 10
                if(place & 8) tenExp = 10000000000;
                else tenExp = 100;
            }
        }
        else{//4, 8
            if(place & 4) tenExp = 10000;
            else tenExp = 100000000;
        }
    }
    return (x/(tenExp/10)) - (x/tenExp)*10;
}
<lsl>
== IntegerLength ==
== IntegerLength ==
<lsl>
<lsl>
Line 57: Line 95:
     if(x >= 10) return 2;
     if(x >= 10) return 2;
     return 1;
     return 1;
}
</lsl>
== Int2Prim ==
The following functions make use of a texture that I keep inside of the prim named 'n' to save memory. Each list-UUID otherwise would be tens of bytes per face.
The texture is:
<lsl>
list Int2PrimLeft(integer p, integer text, vector color){//left aligned
    faces=[];
    //i = getDigitsTree(text); OR i = getDigitsNoBranch(text);
    i = -~((text >= 10) + (text >= 100) + (text >= 1000) + (text >= 10000) + (text >=  100000) + (text >=  1000000) + (text >= 10000000));
    tenExp = 1;
    while(i) faces = [PRIM_TEXTURE, i=~-i, "n", <1.0, 0.1, 0.0>, <0.0, 0.55 + 0.1*((text/(tenExp*=10))*10 - text/tenExp), 0.0>, 0.0] + faces;
    return [PRIM_LINK_TARGET, p, PRIM_COLOR, ALL_SIDES, color, 1.0] + faces;
}
list Int2PrimRight(integer p, integer text, vector color){//Right aligned
    faces=[];
    ///i = getDigitsTree(text); OR i = getDigitsNoBranch(text);
    i = (counter = 8) + ~((text >= 10) + (text >= 100) + (text >= 1000) + (text >= 10000) + (text >=  100000) + (text >=  1000000) + (text >= 10000000));
    tenExp = 1;
    while(counter != i) faces = [PRIM_TEXTURE, counter=~-counter, "n", <1.0, 0.1, 0.0>, <0.0, 0.55 + 0.1*((text/(tenExp*=10))*10 - text/tenExp), 0.0>, 0.0] + faces;
    return [PRIM_LINK_TARGET, p, PRIM_COLOR, ALL_SIDES, color, 1.0] + faces;
}
}
</lsl>
</lsl>

Revision as of 11:04, 1 August 2012

GetSubInteger

<lsl integer getSubIntegerLowMem(integer x, integer place){

   integer tenExp = (integer)llPow(10.0, place);
   return (x/(tenExp/10)) - (x/tenExp)*10;

}

integer getSubIntegerFast(integer x, integer place){

   integer tenExp;
   if(place & 1){//1, 3, 5, 7, 9
       if(place & 2){//3, 7
           if(place & 4) tenExp = 10000000;
           else tenExp = 1000;
       }
       else{//1, 5, 9
           if(place & 4) tenExp = 100000;
           else if(place & 8) tenExp = 1000000000;
           else tenExp = 10;
       }
   }
   else{//2, 4, 6, 8, 10
       if(place & 2){//2, 6, 10
           if(place & 4) tenExp = 1000000;
           else{//2, 10
               if(place & 8) tenExp = 10000000000;
               else tenExp = 100;
           }
       }
       else{//4, 8
           if(place & 4) tenExp = 10000;
           else tenExp = 100000000;
       }
   }
   return (x/(tenExp/10)) - (x/tenExp)*10;

} <lsl>


IntegerLength

<lsl> integer getDigitsStrLen(integer x){//Low memory usage, but horrible performance. Don't use this, its just an example.

   return llStringLength((string)x);

}

integer getDigitsLog(integer x){//Low memory usage (35 bytes), good performance. Use this if memory is your main concern. You can probably in-line it for a small performance gain.

   return (integer)llLog10(x);

}

//The two functions below only work up to 8 digits. I use them for text prims. integer get8DigitsNoBranch(integer x){ //Decent memory usage (123 bytes), Better performance. Use this if you want a balanced method.

   return -~((x >= 10) + (x >= 100) + (x >= 1000) + (x >= 10000) + (x >= 100000) + (x >= 1000000) + (x >= 10000000));

}

integer get8DigitsTree(integer x){//High memory usage (239 bytes), best performance. Use this if you need speed. Inline if you need even more speed.

   if (x >= 10000) {
       if (x >= 10000000) return 8;
       if (x >= 100000){
           if (x >= 1000000) return 7;
           return 6;
       }
       return 5;
   }
   if (x >= 100){
       if (x >= 1000) return 4;
       return 3;
   }
   if (x >= 10) return 2;
   return 1;

}

//The two functions below work up to the integer max. I don't need them, but someone might. They're just minor modifications. integer getDigitsNoBranch(integer x){ //Decent memory usage (123 bytes), Better performance. Use this if you want a balanced method.

   return -~((x >= 10) + (x >= 100) + (x >= 1000) + (x >= 10000) + (x >= 100000) + (x >= 1000000) + (x >= 10000000) + (x >= 100000000) + (x >= 1000000000));

}

integer getDigitsTree(integer x){//High memory usage (239 bytes), best performance. Use this if you need speed. Inline if you need even more speed.

   if(x >= 10000) {
       if(x >= 10000000){
           if(x >= 100000000){
               if(x >= 1000000000) return 10;
               return 9;
           }
           return 8;
       }
       if(x >= 100000){
           if(x >= 1000000) return 7;
           return 6;
       }
       return 5;
   }
   if(x >= 100){
       if(x >= 1000) return 4;
       return 3;
   }
   if(x >= 10) return 2;
   return 1;

} </lsl>

Int2Prim

The following functions make use of a texture that I keep inside of the prim named 'n' to save memory. Each list-UUID otherwise would be tens of bytes per face. The texture is:

<lsl> list Int2PrimLeft(integer p, integer text, vector color){//left aligned

   faces=[];
   //i = getDigitsTree(text); OR i = getDigitsNoBranch(text);
   i = -~((text >= 10) + (text >= 100) + (text >= 1000) + (text >= 10000) + (text >=  100000) + (text >=  1000000) + (text >= 10000000));
   tenExp = 1;
   while(i) faces = [PRIM_TEXTURE, i=~-i, "n", <1.0, 0.1, 0.0>, <0.0, 0.55 + 0.1*((text/(tenExp*=10))*10 - text/tenExp), 0.0>, 0.0] + faces;
   return [PRIM_LINK_TARGET, p, PRIM_COLOR, ALL_SIDES, color, 1.0] + faces;

}

list Int2PrimRight(integer p, integer text, vector color){//Right aligned

   faces=[];
   ///i = getDigitsTree(text); OR i = getDigitsNoBranch(text);
   i = (counter = 8) + ~((text >= 10) + (text >= 100) + (text >= 1000) + (text >= 10000) + (text >=  100000) + (text >=  1000000) + (text >= 10000000));
   tenExp = 1;
   while(counter != i) faces = [PRIM_TEXTURE, counter=~-counter, "n", <1.0, 0.1, 0.0>, <0.0, 0.55 + 0.1*((text/(tenExp*=10))*10 - text/tenExp), 0.0>, 0.0] + faces;
   return [PRIM_LINK_TARGET, p, PRIM_COLOR, ALL_SIDES, color, 1.0] + faces;

} </lsl>