Rain in jME 2

I need help to transform this code, to run the jME 2, I was looking him in the forum, but not  managed to transform it completely, can someone help me?

The code comes from the topic (http://www.jmonkeyengine.com/forum/index.php?topic=7622.15).





package scene;

import java.util.Properties;
import java.util.logging.Logger;

import com.jme.bounding.BoundingSphere;
import com.jme.image.Texture;
import com.jme.math.FastMath;
import com.jme.math.Ring;
import com.jme.math.Vector3f;
import com.jme.renderer.ColorRGBA;
import com.jme.renderer.Renderer;
import com.jme.scene.Node;
import com.jme.scene.state.BlendState;
import com.jme.scene.state.TextureState;
import com.jme.scene.state.ZBufferState;
import com.jme.system.DisplaySystem;
import com.jme.util.TextureManager;
import com.jmex.effects.particles.Particle;
import com.jmex.effects.particles.ParticleFactory;
import com.jmex.effects.particles.ParticleInfluence;
import com.jmex.effects.particles.ParticleMesh;
import com.jmex.effects.particles.SimpleParticleInfluenceFactory;

public class RainManager extends Node {

   private static final long serialVersionUID = -1057124936652689175L;
   private static Logger log =
Logger.getLogger(RainManager.class.getCanonicalName());
   private ParticleMesh points;
   private SimpleParticleInfluenceFactory.BasicGravity gravity;
   private boolean useGravity = false;

   public RainManager(Properties prop) {
       super("rain");
       points = ParticleFactory.buildParticles("rainPoints", 1000,
ParticleMesh.ParticleType.Quad);
       applyParameters(prop);
       if (useGravity) {
           gravity = (SimpleParticleInfluenceFactory.BasicGravity)
SimpleParticleInfluenceFactory.createBasicGravity(new Vector3f(0, -1,
0), false);
           points.getParticleController().addInfluence(gravity);
       }
       points.addInfluence(new BoundInfluence());
       String texpath = "data/";
       TextureState ts =
DisplaySystem.getDisplaySystem().getRenderer().createTextureState();
       ts.setEnabled(true);
       Texture t1 =
TextureManager.loadTexture(TerrainManager.class.getClassLoader().getResource(texpath
+ "/rain.dds"),
               Texture.MinificationFilter.Trilinear,
               Texture.MagnificationFilter.Bilinear);
       ts.setTexture(t1, 1);
       points.setRenderState(ts);
       points.warmUp(10);
       attachChild(points);

       ParticleManager manager = new ParticleManager(200);
       manager.setGravityForce(new Vector3f(0.0f, -0.0020f, 0.0f));
       manager.setEmissionDirection(new Vector3f(0.0f, -1.0f, 0.0f));
       manager.setEmissionMaximumAngle(0.1f * FastMath.PI);
       manager.setEmissionMinimumAngle(0.0f);
       manager.setSpeed(0.3f);
       manager.setParticlesMinimumLifeTime(100.0f);
       manager.setStartSize(1.5f);
       manager.setEndSize(1.5f);
       manager.setStartColor(new ColorRGBA(0.3f, 0.3f, 0.6f, 0.8f));
       manager.setEndColor(new ColorRGBA(0.3f, 0.3f, 0.6f, 0.8f));
       manager.setRandomMod(1.0f);
       manager.setControlFlow(false);
       manager.setReleaseRate(400);
       manager.setReleaseVariance(0.5f);
       manager.setInitialVelocity(0.58f);
       manager.setParticleSpinSpeed(0.0f);

       manager.warmUp(1000);
       manager.getParticles().addController(manager);

       BlendState bs =
DisplaySystem.getDisplaySystem().getRenderer().createBlendState();
       bs.setBlendEnabled(true);
       bs.setSourceFunction(BlendState.SourceFunction.SourceAlpha);
       bs.setDestinationFunction(BlendState.DestinationFunction.OneMinusSourceAlpha);
       bs.setTestEnabled(true);
       bs.setTestFunction(BlendState.TestFunction.GreaterThan);
       bs.setEnabled(true);
       points.setRenderState(bs);
       points.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);
       points.setModelBound(new BoundingSphere());
       points.updateModelBound();
       points.setIsCollidable(false);
       ZBufferState zstate =
DisplaySystem.getDisplaySystem().getRenderer().createZBufferState();
       zstate.setEnabled(false);
       setIsCollidable(false);
       updateRenderState();
   }

   public void applyParameters(Properties prop) {
       points.setGeometry(new Ring(new Vector3f(0, 0, 0), new
Vector3f(0, 1, 0), 100,
               Float.parseFloat(prop.getProperty("radius", "1000"))));
       points.setNumParticles(Integer.parseInt(prop.getProperty("particles",
"1000")));
       points.setEmissionDirection(new Vector3f(0, -1, 0));
       points.setOriginOffset(new Vector3f(0, 0, 0));
       points.setInitialVelocity(Float.parseFloat(prop.getProperty("velocity",
"0.75f")));
       points.setParticleMass(Float.parseFloat(prop.getProperty("mass",
"0.5f")));
       points.setStartSize(Float.parseFloat(prop.getProperty("startSize",
"3")));
       points.setEndSize(Float.parseFloat(prop.getProperty("endSize", "3")));
       points.setMinimumLifeTime(Float.parseFloat(prop.getProperty("minLifeTime",
"3500")));
       points.setMaximumLifeTime(Float.parseFloat(prop.getProperty("maxLifeTime",
"5000")));
       points.setStartColor(parseColor(prop.getProperty("startColor",
"0.6, 0.6, 0.6, 1")));
       points.setEndColor(parseColor(prop.getProperty("endColor",
"0.6, 0.6, 0.6, 1")));
       points.setMaximumAngle(Float.parseFloat(prop.getProperty("maxAngle",
"5f")) * FastMath.DEG_TO_RAD);
       points.getParticleController().setControlFlow(false);
       //points.setLightCombineMode(LightState.);
       if (gravity != null) {
           gravity.setGravityForce(new Vector3f(0,
Float.parseFloat(prop.getProperty("gravity", "-1")), 0));
       }
       points.updateRenderState();
   }

   private ColorRGBA parseColor(String s) {
       ColorRGBA color = new ColorRGBA(ColorRGBA.white);
       try {
           float r = 1;
           float g = 1;
           float b = 1;
           float a = 1;
           String[] p = s.split(",\s+");
           r = Float.parseFloat(p[0]);
           if (p.length > 1) {
               g = Float.parseFloat(p[1]);
           }
           if (p.length > 2) {
               b = Float.parseFloat(p[2]);
           }
           if (p.length > 3) {
               a = Float.parseFloat(p[3]);
           }
           color.set(r, g, b, a);
       } catch (Exception ex) {
           log.warning("unparsable color: " + s + " (" + ex.toString() + ")");
       }
       return color;
   }

   class BoundInfluence extends ParticleInfluence {

       public void apply(float dt, Particle particle, int index) {
           //  if (Environment.getInstance().collides(particle.getPosition()))
           //          particle.setStatus(Particle.DEAD);
       }
   }
}

what does not work yet ?

In the code snippet below this stretch is giving error, what is the correct way to work with the particles system in the jME 2:





ParticleManager manager = new ParticleManager(200);

almost every feature of jme is covered in the jmetest package.

You can use the ParticleFactory to create a particle system.

see also: TestParticleSystem.

I think this might be the solution, placed in patterns that Core-Dump've indicated in the examples of

TestParticleSystem. Some items that appear to exist before that do not make more sense.



package scene;

import java.util.Properties;
import java.util.logging.Logger;

import com.jme.bounding.BoundingSphere;
import com.jme.image.Texture;
import com.jme.math.FastMath;
import com.jme.math.Ring;
import com.jme.math.Vector3f;
import com.jme.renderer.ColorRGBA;
import com.jme.renderer.Renderer;
import com.jme.scene.Node;
import com.jme.scene.state.BlendState;
import com.jme.scene.state.TextureState;
import com.jme.scene.state.ZBufferState;
import com.jme.system.DisplaySystem;
import com.jme.util.TextureManager;
import com.jmex.effects.particles.Particle;
import com.jmex.effects.particles.ParticleFactory;
import com.jmex.effects.particles.ParticleInfluence;
import com.jmex.effects.particles.ParticleMesh;
import com.jmex.effects.particles.SimpleParticleInfluenceFactory;

public class RainManager extends Node {

    private static final long serialVersionUID = -1057124936652689175L;
    private static Logger log = Logger.getLogger(RainManager.class.getCanonicalName());
    private ParticleMesh points,  manager;
    private SimpleParticleInfluenceFactory.BasicGravity gravity;
    private boolean useGravity = false;

    public RainManager(Properties prop) {
        super("rain");
        points = ParticleFactory.buildParticles("rainPoints", 1000, ParticleMesh.ParticleType.Quad);
        applyParameters(prop);
        if (useGravity) {
            gravity = (SimpleParticleInfluenceFactory.BasicGravity) SimpleParticleInfluenceFactory.createBasicGravity(new Vector3f(0, -1, 0), false);
            points.getParticleController().addInfluence(gravity);
        }
        points.addInfluence(new BoundInfluence());
        String texpath = "data/";
        TextureState ts = DisplaySystem.getDisplaySystem().getRenderer().createTextureState();
        ts.setEnabled(true);
        Texture t1 = TextureManager.loadTexture(TerrainManager.class.getClassLoader().getResource(texpath + "/rain.dds"),
                Texture.MinificationFilter.Trilinear,
                Texture.MagnificationFilter.Bilinear);
        ts.setTexture(t1, 1);
        points.setRenderState(ts);
        points.warmUp(10);
        attachChild(points);

        //ParticleSystem manager = new ParticleSystem(200);
        //manager.setGravityForce(new Vector3f(0.0f, -0.0020f, 0.0f));
        manager.setEmissionDirection(new Vector3f(0.0f, -1.0f, 0.0f));
        //manager.setEmissionMaximumAngle(0.1f * FastMath.PI);
        //manager.setEmissionMinimumAngle(0.0f);
        manager.setSpeed(0.3f);
        manager.setMinimumLifeTime(100.0f);
        manager.setStartSize(1.5f);
        manager.setEndSize(1.5f);
        manager.setStartColor(new ColorRGBA(0.3f, 0.3f, 0.6f, 0.8f));
        manager.setEndColor(new ColorRGBA(0.3f, 0.3f, 0.6f, 0.8f));
        //manager.setRandomMod(1.0f);
        manager.getParticleController().setControlFlow(false);
        manager.setReleaseRate(400);
        manager.setReleaseVariance(0.5f);
        manager.setInitialVelocity(0.58f);
        manager.setParticleSpinSpeed(0.0f);
        manager.setParticlesInWorldCoords(true);

        manager.warmUp(1000);
        //manager.getParticleController().getParticles().addController(manager);

        BlendState bs = DisplaySystem.getDisplaySystem().getRenderer().createBlendState();
        bs.setBlendEnabled(true);
        bs.setSourceFunction(BlendState.SourceFunction.SourceAlpha);
        bs.setDestinationFunction(BlendState.DestinationFunction.OneMinusSourceAlpha);
        bs.setTestEnabled(true);
        bs.setTestFunction(BlendState.TestFunction.GreaterThan);
        bs.setEnabled(true);
        points.setRenderState(bs);
        points.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);
        points.setModelBound(new BoundingSphere());
        points.updateModelBound();
        points.setIsCollidable(false);
        ZBufferState zstate = DisplaySystem.getDisplaySystem().getRenderer().createZBufferState();
        zstate.setEnabled(false);
        setIsCollidable(false);
        updateRenderState();
    }

    public void applyParameters(Properties prop) {
        points.setGeometry(new Ring(new Vector3f(0, 0, 0), new Vector3f(0, 1, 0), 100,
                Float.parseFloat(prop.getProperty("radius", "1000"))));
        points.setNumParticles(Integer.parseInt(prop.getProperty("particles", "1000")));
        points.setEmissionDirection(new Vector3f(0, -1, 0));
        points.setOriginOffset(new Vector3f(0, 0, 0));
        points.setInitialVelocity(Float.parseFloat(prop.getProperty("velocity", "0.75f")));
        points.setParticleMass(Float.parseFloat(prop.getProperty("mass", "0.5f")));
        points.setStartSize(Float.parseFloat(prop.getProperty("startSize", "3")));
        points.setEndSize(Float.parseFloat(prop.getProperty("endSize", "3")));
        points.setMinimumLifeTime(Float.parseFloat(prop.getProperty("minLifeTime", "3500")));
        points.setMaximumLifeTime(Float.parseFloat(prop.getProperty("maxLifeTime", "5000")));
        points.setStartColor(parseColor(prop.getProperty("startColor", "0.6, 0.6, 0.6, 1")));
        points.setEndColor(parseColor(prop.getProperty("endColor", "0.6, 0.6, 0.6, 1")));
        points.setMaximumAngle(Float.parseFloat(prop.getProperty("maxAngle", "5f")) * FastMath.DEG_TO_RAD);
        points.getParticleController().setControlFlow(false);
        //points.setLightCombineMode(LightState.);
        if (gravity != null) {
            gravity.setGravityForce(new Vector3f(0, Float.parseFloat(prop.getProperty("gravity", "-1")), 0));
        }
        points.updateRenderState();
    }

    private ColorRGBA parseColor(String s) {
        ColorRGBA color = new ColorRGBA(ColorRGBA.white);
        try {
            float r = 1;
            float g = 1;
            float b = 1;
            float a = 1;
            String[] p = s.split(",\s+");
            r = Float.parseFloat(p[0]);
            if (p.length > 1) {
                g = Float.parseFloat(p[1]);
            }
            if (p.length > 2) {
                b = Float.parseFloat(p[2]);
            }
            if (p.length > 3) {
                a = Float.parseFloat(p[3]);
            }
            color.set(r, g, b, a);
        } catch (Exception ex) {
            log.warning("unparsable color: " + s + " (" + ex.toString() + ")");
        }
        return color;
    }

    class BoundInfluence extends ParticleInfluence {

        public void apply(float dt, Particle particle, int index) {
            //   if (Environment.getInstance().collides(particle.getPosition()))
            //      particle.setStatus(Particle.DEAD);
        }
    }
}

I used some of the code posted on this page and I managed to get something close to rain…



Bubbles!

Refine the particles to smaller and I think it will turn the rain!