[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

#### C.2.18.3 Snow

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);

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ]

This document was generated using texi2html 1.76.