Talk:Random AV Particle Name Generator
Particle Text Generator v1.0 ~ Help Page
What does it do?
- The Particle Text Generator randomly selects an AV from a crowd & then displays their first name as a stream of particles. For example, if "Joe Smith" is selected, the letters "J", "0" and "E" are emitted as particles out of the prim.
- If no AV's are in the vicinity, the Particle Text Generator will instead emit of stream of text from a selection of your choosing. For example, "HAPPY REZ DAY", "PARTICLE CRUCIBLE", "MY STORE NAME".
- It is possible to turn off the AV selection functionality entirely, and simply use the Particle Text Generator to emit your own text.
How does it do it?
Once the text has been determined, the Particle Text Generator maps each letter of the text against a font texture UUID. This UUID is then used as the texture for a particle emission. Each letter of the text constitutes a separate particle emission. Other attempts to do this are avaliable as free scripts in-world. However these have proven to be unstable and unreliable. This has been blamed on the "lag" but, in fact, there is a fundemental code error in these scripts that causes them to be unstable and unreliable, as well as other ineffcient procedures. These flaws are corrected in the version presented here. See section 'Code Improvements' below for further details.
How Do I Set-up the Particle Text Generator?
- Simply put the script in a prim and 'Touch'.
- Select the 'On' option from the blue dialog menu.
How Do I Set My Own Text?
- Open up the script.
- Find the line that says: "list DefaultTextPalette = [".....", ".....", ".....", "....."];".
- Carefully overwrite the existing text with your own text. Ensure you keep within the speech marks.
How Do I Get the Text to Be Seen From Further Away?
As a rule, the larger the prim, the further away that the text stream will be seen. However, draw distance, particle count settings and PC spec also have a bearing. This makes it difficult to predict how each client viewer will render the particle stream.
How Do I Use My Own Set of Fonts?
- Create for yourself or otherwise procure a set of individual textures for the letters [A - Z] and numbers [0 - 9]. 256 x 256 32bit alpha tga's are ideal. See this superb thread by Chosen Few if you need to learn more about this: http://forums.secondlife.com/showthread.php?t=80851
- Upload these into SL.
- Individually right-click each texture and capture it's UUID.
- In the script, locate the long list of UUID's (variable MasterUUIDPalette). You will see the the letters [A - Z] and numbers [0 - 9] marked on each line. Carefully paste your UUID over the existing one. Do this for each individual character. Ensure you keep within the speech marks for each character.
How Do I Get the Text to Emit in a Different Direction?
With the prim rotation set at 0, 0, 0 the particles will emit vertically. To have them emit in a different plane, simply rotate the prim.
Menu Options
A description of the buttons on the blue dialog menu:
- 'On': Starts the Particle Text Generator.
- 'Off': Stops the Particle Text Generator.
- 'Defaults': Will only emit text that is contained in variable DefaultTextPalette. It will not scan the area for nearby AV's.
- 'Names': Scans the vicinity for AV's. Selects one at random and emits their first name as a particle stream. If no AV's are in the vicintiy, then it will emit text contained in variable DefaultTextPalette until an AV re-enters the area.
- 'SetRange': Allows you to set how far a distance away from the prim that scans for AV's will be performed. This option is only avaliable in Names mode.
- 'ResetScript': Restores all settings.
- 'Help': Links to this page from in-world.
Code Improvements
This is not the first time attempt use the XYText technology to create a particle text stream. A number of free scripts are available in-world, although they all seem to stem from the same source. For the most part they are unstable and unreliable. This has been blamed on "lag". Indeed a text particle stream is a delicate operation and it is particularily susceptible to time dilation and so-called client-lag. However, although this is true, these scripts also contain a fundemental llParticleSystem() call flaw which, when corrected, helps balance the time dilation. Additionally, by making other code changes, the effciency of this time-critical operation is significantly improved. Numerous comparisons tests between the two scripts in both healthly and heavily time-dilated regions show that the code improvements in the version presented here makes it into a viable product. "Client-lag" so-called, is not so easily overcome as it usually due to the PC spec, rather than the script as such. High spec PC's with long draw distances and particles set to 8912 will have no problems rendering the characters but tests with lower-end specs have shown that they occasionaly miss letters.
Palette Design
Take the name "William" (7 characters). In the original scripts, seven searches would required of the 36 entry master UUID palette. In a worst case senerio, this amounts to 252 (7 x 36) individual searches. And this during the time critical period. In the new version, before even entering the time critcal period and actually firing any particles, we strip the name down to individual unique characters "Wilam" (5 characters) and then fetch only those UUIDs that we know we will need to generate the full name. Therefore, during the time critical period, in a worst case scenerio, only 35 (7 x 5) individual searches are required. Although this method adds of a fraction of a second before firing the first particle, the benefit in terms of stability is significant.
Optimisations
This version also introduces a number of code optimisations during the time critcal period. Although performing the same action, the method employed is more efficient. For example:
string WorkChar = llGetSubString(WorkDisplayText, 0, 0); StartParticle(WorkChar);
is changed to
StartParticle(llGetSubString(WorkChar, 0, 0));
and
string Texture = llList2Key(MasterUUIDPalette, llSubStringIndex(MasterCharIndex, llToUpper(ParticleChar)));
llParticleSystem([ ... PSYS_SRC_TEXTURE, Texture, ...];
is changed to
llParticleSystem([ ... PSYS_SRC_TEXTURE, llList2Key(WorkUUIDPalette, llListFindList(WorkCharIndex, (list)ParticleChar)), ...];
llParticleSystem() Parsing
In the original versions of the script, parameters such as PSYS_SRC_ACCEL and PSYS_SRC_OMEGA are being parsed even though they have no active effect on the particle emmsion. The new version removes such parameters entirely from the llParticleSystem() call. Furthermore, rather than passing PSYS_SRC_PATTERN and PSYS_PART_FLAGS constants that require interpretating, we directly pass the heximdecimal equivalent.
Burst Rate and System Age
Of all the code improvement discussed, the changes made to PSYS_SRC_BURST_RATE and PSYS_SRC_MAX_AGE are by far the single most significant. In the original Particle XYText scripts (and indeed in many particle scripts circulating in-world) PSYS_SRC_MAX_AGE is erroneously set to 0.00. According to the LSL Wiki, "Zero will give the particle system an infinite duration". So, if you want the particle system to last for one second you set PSYS_SRC_MAX_AGE to "1.00", or "2.00" for two seconds. But, if you set it to "0.00" it will continue pumping out particles at the rate defined in PSYS_SRC_BURST_RATE. However, as the emission of each individual character is controlled by a timer, we do not want a continuous emission, an infinite duration. The absolute maximum duration that we want for the particle system is one character ~ which clearly is the same float value that llSetTimerEvent() has been set to.
Similarly, PSYS_SRC_BURST_RATE ~ "the time interval, in seconds, between bursts of particles being emitted" must not be less than the float value that llSetTimerEvent() has been set to.
It is the combination of these two misunderstandings that has caused previous attempts at Particle XYText to emit, for example, the name "William" as "Wii lll iamm". It is not "lag" causing it but incorrect values for PSYS_SRC_BURST_RATE and PSYS_SRC_MAX_AGE.
The version presented here corrects this by introducing a new variable LetterTimeGap. The float value entered for LetterTimeGap not only controls the timer (llSetTimerEvent(LetterTimeGap)) but is also used to populate PSYS_SRC_BURST_RATE and PSYS_SRC_MAX_AGE. This ensures that only one character is capable of being emitted before the particle system shutsdown. Furthermore, if the region is subject to time dilation, the dilation is passed through to the particle system rather than just effecting the timer. Any time dilation then remains proportional throughout those parts of the script that it effects most.