| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To convert the old snow particle system to new particles you can use a box emitter which is oriented at the top where the snow drops should appear and which is very thin. You can use a force effector with random acceleration on the XZ plane to get the effect that snowflakes drift. Here you see an example of a snow particle system in the world file:
<meshfact name="snowFact">
<plugin>crystalspace.mesh.loader.factory.particles</plugin>
<params>
<particlesize x="0.17" y="0.17" />
<minbb>
<min x="-5" y="-0.3" z="-5" />
<max x="10" y="6" z="10" />
</minbb>
<sortmode>none</sortmode>
<emitter type="box">
<emissionrate>250</emissionrate>
<mass min="5" max="7.5" />
<box>
<min x="-5" y="6" z="-5" />
<max x="10" y="6" z="10" />
</box>
<uniformvelocity />
<initialvelocity x="0" y="-1.42" z="0" />
<initialttl min="5" max="5" />
<placement>volume</placement>
</emitter>
<effector type="lincolor">
<color red="0" green="0" blue="1" time="5" />
</effector>
<effector type="force">
<randomacceleration x="2.5" y="0" z="2.5" />
</effector>
</params>
</meshfact>
...
<meshobj name="snowfall">
<priority>alpha</priority>
<plugin>crystalspace.mesh.loader.particles</plugin>
<ztest />
<params>
<factory>snowFact</factory>
<mixmode>
<add />
</mixmode>
<material>snow</material>
</params>
<move>
<v x="10" y="0" z="10" />
</move>
</meshobj>
|
Here is how this could work in code:
csRef<iMeshFactoryWrapper> mfw = engine->CreateMeshFactory (
"crystalspace.mesh.object.particles", "snow");
if (!mfw) return;
csRef<iMeshWrapper> exp = engine->CreateMeshWrapper (mfw, "custom snow",
sector, csVector3 (0, 0, 0));
exp->SetZBufMode(CS_ZBUF_TEST);
exp->GetMeshObject()->SetMixMode (CS_FX_ADD);
exp->GetMeshObject()->SetMaterialWrapper (mat);
csRef<iParticleBuiltinEmitterFactory> emit_factory =
csLoadPluginCheck<iParticleBuiltinEmitterFactory> (
Sys->object_reg, "crystalspace.mesh.object.particles.emitter", false);
csRef<iParticleBuiltinEffectorFactory> eff_factory =
csLoadPluginCheck<iParticleBuiltinEffectorFactory> (
Sys->object_reg, "crystalspace.mesh.object.particles.effector", false);
csRef<iParticleBuiltinEmitterBox> boxemit = emit_factory->CreateBox ();
boxemit->SetBox (bbox);
boxemit->SetParticlePlacement (CS_PARTICLE_BUILTIN_VOLUME);
boxemit->SetEmissionRate (num / 5f);
boxemit->SetInitialMass (5.0f, 7.5f);
boxemit->SetUniformVelocity (true);
boxemit->SetInitialTTL (5f, 5f);
boxemit->SetInitialVelocity (csVector3 (0, -1.42f, 0), csVector3 (0));
csRef<iParticleBuiltinEffectorLinColor> lincol = eff_factory->
CreateLinColor ();
lincol->AddColor (csColor4 (.25,.25,.25,1), 2.5f);
csRef<iParticleBuiltinEffectorForce> force = eff_factory->
CreateForce ();
force->SetRandomAcceleration (csVector3 (1.5f, 0.0f, 1.5f));
csRef<iParticleSystem> partstate =
scfQueryInterface<iParticleSystem> (exp->GetMeshObject ());
partstate->SetMinBoundingBox (bbox);
partstate->SetParticleSize (csVector2 (0.07f, 0.07f));
partstate->AddEmitter (boxemit);
partstate->AddEffector (lincol);
partstate->AddEffector (force);
|
This document was generated using texi2html 1.76.