* Fix for ParticleEmitter.clone()

* Enable smart cache for models

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7906 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..rd 14 years ago
parent 66d78be974
commit 7cd213b940
  1. 5
      engine/src/core/com/jme3/asset/ModelKey.java
  2. 48
      engine/src/core/com/jme3/effect/ParticleEmitter.java
  3. 25
      engine/src/core/com/jme3/scene/Spatial.java

@ -48,6 +48,11 @@ public class ModelKey extends AssetKey<Spatial> {
super(); super();
} }
@Override
public boolean useSmartCache(){
return true;
}
@Override @Override
public Object createClonedInstance(Object asset){ public Object createClonedInstance(Object asset){
Spatial model = (Spatial) asset; Spatial model = (Spatial) asset;

@ -75,7 +75,7 @@ public class ParticleEmitter extends Geometry {
private static final EmitterShape DEFAULT_SHAPE = new EmitterPointShape(Vector3f.ZERO); private static final EmitterShape DEFAULT_SHAPE = new EmitterPointShape(Vector3f.ZERO);
private static final ParticleInfluencer DEFAULT_INFLUENCER = new DefaultParticleInfluencer(); private static final ParticleInfluencer DEFAULT_INFLUENCER = new DefaultParticleInfluencer();
private ParticleEmitterControl control = new ParticleEmitterControl(); private ParticleEmitterControl control = new ParticleEmitterControl(this);
private EmitterShape shape = DEFAULT_SHAPE; private EmitterShape shape = DEFAULT_SHAPE;
private ParticleMesh particleMesh; private ParticleMesh particleMesh;
private ParticleInfluencer particleInfluencer = DEFAULT_INFLUENCER; private ParticleInfluencer particleInfluencer = DEFAULT_INFLUENCER;
@ -106,29 +106,36 @@ public class ParticleEmitter extends Geometry {
//variable that helps with computations //variable that helps with computations
private transient Vector3f temp = new Vector3f(); private transient Vector3f temp = new Vector3f();
private class ParticleEmitterControl implements Control { private static class ParticleEmitterControl implements Control {
private ParticleEmitter parentEmitter;
public ParticleEmitterControl(ParticleEmitter parentEmitter){
this.parentEmitter = parentEmitter;
}
public Control cloneForSpatial(Spatial spatial) { public Control cloneForSpatial(Spatial spatial) {
return ((ParticleEmitter) spatial).control; return this; // WARNING: Sets wrong control on spatial. Will be
// fixed automatically by ParticleEmitter.clone() method.
} }
public void setSpatial(Spatial spatial) { public void setSpatial(Spatial spatial) {
} }
public void setEnabled(boolean enabled) { public void setEnabled(boolean enabled) {
ParticleEmitter.this.setEnabled(enabled); parentEmitter.setEnabled(enabled);
} }
public boolean isEnabled() { public boolean isEnabled() {
return ParticleEmitter.this.isEnabled(); return parentEmitter.isEnabled();
} }
public void update(float tpf) { public void update(float tpf) {
updateFromControl(tpf); parentEmitter.updateFromControl(tpf);
} }
public void render(RenderManager rm, ViewPort vp) { public void render(RenderManager rm, ViewPort vp) {
renderFromControl(rm, vp); parentEmitter.renderFromControl(rm, vp);
} }
public void write(JmeExporter ex) throws IOException { public void write(JmeExporter ex) throws IOException {
@ -144,12 +151,37 @@ public class ParticleEmitter extends Geometry {
public ParticleEmitter clone() { public ParticleEmitter clone() {
ParticleEmitter clone = (ParticleEmitter) super.clone(); ParticleEmitter clone = (ParticleEmitter) super.clone();
clone.shape = shape.deepClone(); clone.shape = shape.deepClone();
// Reinitialize particle list
clone.setNumParticles(particles.length); clone.setNumParticles(particles.length);
clone.faceNormal = faceNormal.clone(); clone.faceNormal = faceNormal.clone();
clone.startColor = startColor.clone(); clone.startColor = startColor.clone();
clone.endColor = endColor.clone(); clone.endColor = endColor.clone();
clone.particleInfluencer = particleInfluencer.clone(); clone.particleInfluencer = particleInfluencer.clone();
clone.controls.add(clone.control);
// remove wrong control
clone.controls.remove(control);
// put correct control
clone.controls.add(new ParticleEmitterControl(clone));
// Reinitialize particle mesh
switch (meshType) {
case Point:
clone.particleMesh = new ParticlePointMesh();
clone.setMesh(clone.particleMesh);
break;
case Triangle:
clone.particleMesh = new ParticleTriMesh();
clone.setMesh(clone.particleMesh);
break;
default:
throw new IllegalStateException("Unrecognized particle type: " + meshType);
}
clone.particleMesh.initParticleData(clone, clone.particles.length);
clone.particleMesh.setImagesXY(clone.imagesX, clone.imagesY);
return clone; return clone;
} }

@ -31,6 +31,8 @@
*/ */
package com.jme3.scene; package com.jme3.scene;
import com.jme3.asset.Asset;
import com.jme3.asset.AssetKey;
import com.jme3.bounding.BoundingVolume; import com.jme3.bounding.BoundingVolume;
import com.jme3.collision.Collidable; import com.jme3.collision.Collidable;
import com.jme3.export.JmeExporter; import com.jme3.export.JmeExporter;
@ -74,7 +76,7 @@ import java.util.logging.Logger;
* @author Joshua Slack * @author Joshua Slack
* @version $Revision: 4075 $, $Data$ * @version $Revision: 4075 $, $Data$
*/ */
public abstract class Spatial implements Savable, Cloneable, Collidable { public abstract class Spatial implements Savable, Cloneable, Collidable, Asset {
private static final Logger logger = Logger.getLogger(Spatial.class.getName()); private static final Logger logger = Logger.getLogger(Spatial.class.getName());
@ -111,20 +113,25 @@ public abstract class Spatial implements Savable, Cloneable, Collidable {
protected static final int RF_TRANSFORM = 0x01, // need light resort + combine transforms protected static final int RF_TRANSFORM = 0x01, // need light resort + combine transforms
RF_BOUND = 0x02, RF_BOUND = 0x02,
RF_LIGHTLIST = 0x04; // changes in light lists RF_LIGHTLIST = 0x04; // changes in light lists
protected CullHint cullHint = CullHint.Inherit; protected CullHint cullHint = CullHint.Inherit;
/** /**
* Spatial's bounding volume relative to the world. * Spatial's bounding volume relative to the world.
*/ */
protected BoundingVolume worldBound; protected BoundingVolume worldBound;
/** /**
* LightList * LightList
*/ */
protected LightList localLights; protected LightList localLights;
protected transient LightList worldLights; protected transient LightList worldLights;
/** /**
* This spatial's name. * This spatial's name.
*/ */
protected String name; protected String name;
// scale values // scale values
protected transient Camera.FrustumIntersect frustrumIntersects = Camera.FrustumIntersect.Intersects; protected transient Camera.FrustumIntersect frustrumIntersects = Camera.FrustumIntersect.Intersects;
protected RenderQueue.Bucket queueBucket = RenderQueue.Bucket.Inherit; protected RenderQueue.Bucket queueBucket = RenderQueue.Bucket.Inherit;
@ -134,6 +141,14 @@ public abstract class Spatial implements Savable, Cloneable, Collidable {
protected Transform worldTransform; protected Transform worldTransform;
protected SafeArrayList<Control> controls = new SafeArrayList<Control>(Control.class); protected SafeArrayList<Control> controls = new SafeArrayList<Control>(Control.class);
protected HashMap<String, Savable> userData = null; protected HashMap<String, Savable> userData = null;
/**
* Used for smart asset caching
*
* @see AssetKey#useSmartCache()
*/
protected AssetKey key;
/** /**
* Spatial's parent, or null if it has none. * Spatial's parent, or null if it has none.
*/ */
@ -170,6 +185,14 @@ public abstract class Spatial implements Savable, Cloneable, Collidable {
this.name = name; this.name = name;
} }
public void setKey(AssetKey key){
this.key = key;
}
public AssetKey getKey(){
return key;
}
/** /**
* Indicate that the transform of this spatial has changed and that * Indicate that the transform of this spatial has changed and that
* a refresh is required. * a refresh is required.

Loading…
Cancel
Save