Difference between revisions of "Progress Bar"

From Second Life Wiki
Jump to navigation Jump to search
(Wow, so many interesting characters out there in UTF. Painstakingly cherry picked those that have potential.)
Line 3: Line 3:
This is a script to create very useful and realistic looking progress or health bars. They are suitable for creating quick, direct and visual feedback to a user without resorting to exotic dedicated prim displays.
This is a script to create very useful and realistic looking progress or health bars. They are suitable for creating quick, direct and visual feedback to a user without resorting to exotic dedicated prim displays.


== License ==
== Non-License ==
<lsl>
<lsl>
//===================================================//
//===================================================//
//                  Progress Bar v1                  //
//                  Progress Bar v1                  //
//      "September 24 2009", "04:24:00 GMT-0"      //
//      "September 24 2009", "04:24:00 GMT-0"      //
//     Copyright (C) 2009, Nexii Malthus (cc-by)    //
//                 By Nexii Malthus                 //
//   http://creativecommons.org/licenses/by/3.0/    //
//                   Public Domain                  //
//===================================================//
//===================================================//
</lsl>
</lsl>

Revision as of 08:21, 10 January 2010

This is a script to create very useful and realistic looking progress or health bars. They are suitable for creating quick, direct and visual feedback to a user without resorting to exotic dedicated prim displays.

Non-License

<lsl> //===================================================// // Progress Bar v1 // // "September 24 2009", "04:24:00 GMT-0" // // By Nexii Malthus // // Public Domain // //===================================================// </lsl>


Function

Progress Bars Function <lsl> string Bars( float Cur, integer Bars, list Charset ){

   // Input    = 0.0 to 1.0
   // Bars     = char length of progress bar
   // Charset  = [Blank,<Shades>,Solid];
   integer Shades = llGetListLength(Charset)-1;
           Cur *= Bars;
   integer Solids  = llFloor( Cur );
   integer Shade   = llRound( (Cur-Solids)*Shades );
   integer Blanks  = Bars - Solids - 1;
   string str;
   while( Solids-- >0 ) str += llList2String( Charset, -1 );
   if( Blanks >= 0 ) str += llList2String( Charset, Shade );
   while( Blanks-- >0 ) str += llList2String( Charset, 0 );
   return str; }

</lsl>

Character Sets

These are various characters in Unicode/UTF that may be of use with the progress bar function or for other creative visual indication purposes in hovertext or chat. <lsl> // Bars list Charset_Shade = [" ","░","▒","▓","█"];// Too rough list Charset_LeftRight = [" ","▏","▎","▍","▌","▋","▊","▉","█"];// Works Best list Charset_UpDown = [" ","▁","▂","▃","▄","▅","▆","▇","█"];// Good as single-bar progress bar list Charset_Central = [" ","❘","❙","❚","█"];// Too steppy list Charset_Braille = ["⠀","⠁","⠃","⠇","⠏","⠟","⠿"];

// Random Single-char list Charset_Box = ["□","▧","▨","▩","■"]; list Charset_Circle = ["○","◔","◑","◕","●"]; list Charset_Boxes = [" ","▝","▐","▟","█"]; list Charset_Dice = ["⚀","⚁","⚂","⚃","⚄","⚅"];// Hard to perceive detail list Charset_Tone = ["˩","˨","˧","˦","˥"]; list Charset_Num1 = ["⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑",

                          "⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛"];

list Charset_Num2 = ["⑴","⑵","⑶","⑷","⑸","⑹","⑺","⑻","⑼","⑽",

                          "⑾","⑿","⒀","⒁","⒂","⒃","⒄","⒅","⒆","⒇"];

list Charset_Num3 = ["①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩"]; list Charset_Num4 = ["❶","❷","❸","❹","❺","❻","❼","❽","❾","❿"]; list Charset_Num5 = ["➊","➋","➌","➍","➎","➏","➐","➑","➒","➓"]; list Chars_Fill = ["䷁","䷖","䷇","䷏","䷎","䷆","䷗","䷚","䷂","䷲","䷣","䷒","䷨","䷻","䷵","䷊","䷙","䷄","䷡","䷍","䷪","䷀"]; list Chars_Elevator = ["䷗","䷆","䷎","䷏","䷇","䷖"];

// Directional list Charset_Arrow1 = ["↑","↗","→","↘","↓","↙","←","↖"]; list Charset_Arrow2 = ["⇑","⇗","⇒","⇘","⇓","⇙","⇐","⇖"]; list Charset_Arrow3 = ["⬆","⬈","➨","⬊","⬇","⬋","⬅","⬉"];

// Other character sets I find possibly useful for some application out there list Charset_Layers = ["⿰","⿱","⿲","⿲","⿳","⿴","⿵","⿶","⿷","⿸","⿹","⿺","⿻"]; </lsl>

Simple Test

<lsl> list Charset_LeftRight = [" ","▏","▎","▍","▌","▋","▊","▉","█"];

string Bars( float Cur, integer Bars, list Charset ){

   // Input    = 0.0 to 1.0
   // Bars     = char length of progress bar
   // Charset  = [Blank,<Shades>,Solid];
   integer Shades = llGetListLength(Charset)-1;
           Cur *= Bars;
   integer Solids  = llFloor( Cur );
   integer Shade   = llRound( (Cur-Solids)*Shades );
   integer Blanks  = Bars - Solids - 1;
   string str;
   while( Solids-- >0 ) str += llList2String( Charset, -1 );
   if( Blanks >= 0 ) str += llList2String( Charset, Shade );
   while( Blanks-- >0 ) str += llList2String( Charset, 0 );
   return str; }

default {

   touch_start( integer d ){
       float Input;
       integer Length = 10;
       
       for( Input = 0.0; Input < 1.0; Input += 0.02 ){
           string Text = "▕"+Bars( Input, Length, Charset_LeftRight )+"▏";
           llSetText( Text, <0,0,0>, 1.0 );
           llSleep( 0.1 );
       }
   }

} </lsl>


Full Test Script

<lsl> string cleanF( float F ){// Clean a float for debug output

   string S = (string)F;
   while( llGetSubString( S, -1, -1 ) == "0" )// Clear zeroes
      S = llGetSubString( S, 0, -2 );
   if( llGetSubString( S, -1, -1 ) == "." )// Cut dot if lone
       S = llGetSubString( S, 0, -2 ); 
   return S; }

float fCub_I( float t, float b, float c, float d ){

   return c * llPow( t/d, 3 ) + b;}

float fCirc_I( float t, float b, float c, float d ){

   return c * ( 1 - llSqrt( 1 - ( t /= d ) * t ) ) + b;}

float fExpo_IO( float t, float b, float c, float d ){

   if( ( t /= d / 2 ) < 1 )
       return c / 2 * llPow( 2, 10 * ( t - 1 ) ) + b;
   return c / 2 * ( -llPow( 2 , -10 * --t ) + 2 ) + b;}


list Charset_Shade = [" ","░","▒","▓","█"]; list Charset_LeftRight = [" ","▏","▎","▍","▌","▋","▊","▉","█"]; list Charset_UpDown = [" ","▁","▂","▃","▄","▅","▆","▇","█"]; list Charset_Central = [" ","❘","❙","❚","█"]; list Charset_Box = ["□","▧","▨","▩","■"]; list Charset_Circle = ["○","◔","◑","◕","●"]; list Charset_Boxes = [" ","▝","▐","▟","█"]; list Charset_Dice = ["⚀","⚁","⚂","⚃","⚄","⚅"]; list Charset_Braille = ["⠀","⠁","⠃","⠇","⠏","⠟","⠿"];

string Bars( float Cur, integer Bars, list Charset ){

   // Input    = 0.0 to 1.0
   // Bars     = char length of progress bar
   // Charset  = [Blank,<Shades>,Solid];
   integer Shades = llGetListLength(Charset)-1;
           Cur *= Bars;
   integer Solids  = llFloor( Cur );
   integer Shade   = llRound( (Cur-Solids)*Shades );
   integer Blanks  = Bars - Solids - 1;
   string str;
   while( Solids-- >0 ) str += llList2String( Charset, -1 );
   if( Blanks >= 0 ) str += llList2String( Charset, Shade );
   while( Blanks-- >0 ) str += llList2String( Charset, 0 );
   return str; }

float Energy = 40.0; float EnergyCap = 100.0;

float Dir = 1;

default {

   state_entry(){
       llSetText("", <.0,.5,1.>, 1 );
       llSetTimerEvent( 0.1 );
   }
   
   timer(){
       Energy += 2 * Dir;
       if( Energy > EnergyCap ){
           Energy = EnergyCap; Dir = -Dir;
       } else if( Energy < 0 ){
           Energy = 0; Dir = -Dir;
       }
       
       float t = Energy / EnergyCap;
       
       float Bar1  = t;
       float Bar2  = fCirc_I(t,0,1,1);
       float Bar3  = fExpo_IO(1-t,0,1,1);
       float Bar4  = t;
       
       string Text;
       if( Dir == TRUE ) Text += "⟾ ";
                    else Text += "⟸ ";
       Text += Bars( Bar1, 10, Charset_LeftRight )+"\n";
       Text += Bars( Bar2, 8, Charset_UpDown )+"\n";
       Text += Bars( Bar2, 8, Charset_Braille )+"\n";
       Text += Bars( Bar3, 8, Charset_Shade )+"\n⟦ ";
       if( Dir == TRUE ) Text += "► ";
                    else Text += "◄ ";
       Text += Bars( Bar4, 1, Charset_LeftRight )+" | ";
       if( Dir == TRUE ) Text += "▲ ";
                    else Text += "▼ ";
       Text += Bars( Bar4, 1, Charset_UpDown )+" | ";
       Text += Bars( Bar4, 1, Charset_Central )+" ⟧\n⟦ ";
       Text += Bars( Bar4, 1, Charset_Box )+" | ";
       if( Dir == TRUE ) Text += "⟳ ";
                    else Text += "⟲ ";
       Text += Bars( Bar4, 1, Charset_Circle )+" ";
       Text += Bars( Bar4, 1, Charset_Boxes )+" ⟧\n";
       Text += "\n"+cleanF(Energy)+" / "+cleanF(EnergyCap);
       
       vector Color = llVecNorm(<1-t,t,0>);
       llSetText(Text,Color,1);
   }

} </lsl>