Further explanation:
// Christmas Particle Tree
// Ordinal Malaprop 2009-12-22
// LICENCE
// Creative Commons Attribution-Noncommercial 3.0
// See http://creativecommons.org/licenses/by-nc/3.0/ for more details
//---------------------------------------------------------------------
// Play with these values if you wish
float HEIGHT = 4.0;
float MAX_BEND = 0.05;
float BRANCH_LENGTH = 1.0;
integer BRANCH_DENSITY = 20;
vector BASE_COLOUR = <0.25, 0.75, 0.25>;
//---------------------------------------------------------------------
leaves(float z)
{
z /= HEIGHT;
llParticleSystem([
PSYS_PART_FLAGS, PSYS_PART_FOLLOW_VELOCITY_MASK | PSYS_PART_EMISSIVE_MASK,
PSYS_PART_START_COLOR, BASE_COLOUR * ((z * 0.7) + llFrand(0.3)),
PSYS_PART_START_ALPHA, 1.0,
PSYS_PART_START_SCALE, <0.1, BRANCH_LENGTH, 0.0>,
PSYS_PART_MAX_AGE, 30.0,
PSYS_SRC_ACCEL, <0.00,0.00,0.0>,
PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE_CONE,
PSYS_SRC_ANGLE_BEGIN, PI * (0.5 + z * 0.4),
PSYS_SRC_ANGLE_END, PI * (0.5 + z * 0.4),
PSYS_SRC_BURST_RATE, 0.05,
PSYS_SRC_BURST_PART_COUNT, BRANCH_DENSITY,
PSYS_SRC_BURST_RADIUS, BRANCH_LENGTH * 0.62,
PSYS_SRC_BURST_SPEED_MIN, 0.0,
PSYS_SRC_BURST_SPEED_MAX, 0.05,
PSYS_SRC_MAX_AGE, 0.0
]);
llSleep(0.8);
llParticleSystem([]);
}
//---------------------------------------------------------------------
default
{
state_entry()
{
llSetAlpha(0.0, ALL_SIDES);
llSetRot(ZERO_ROTATION);
vector startPos = llGetPos();
vector pos = startPos;
pos.z += 1.0;
rotation direction = llEuler2Rot(<0.0, 0.0, llFrand(TWO_PI)>);
float bendiness = llFrand(MAX_BEND);
llSetRot(direction);
while (pos.z < startPos.z + HEIGHT) {
llSetPos(pos);
leaves(pos.z - startPos.z);
llSetRot(llEuler2Rot(<0.0, bendiness + llFrand(0.05), 0.0>)
* llGetRot());
pos += <0.0, 0.0, 0.5> * llGetRot();
}
llSetRot(ZERO_ROTATION);
llSetPos(startPos);
llSetAlpha(1.0, ALL_SIDES);
}
on_rez(integer p)
{
llResetScript();
}
touch_start(integer n)
{
llResetScript();
}
}