* 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();
}
@Override
public boolean useSmartCache(){
return true;
}
@Override
public Object createClonedInstance(Object 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 ParticleInfluencer DEFAULT_INFLUENCER = new DefaultParticleInfluencer();
private ParticleEmitterControl control = new ParticleEmitterControl();
private ParticleEmitterControl control = new ParticleEmitterControl(this);
private EmitterShape shape = DEFAULT_SHAPE;
private ParticleMesh particleMesh;
private ParticleInfluencer particleInfluencer = DEFAULT_INFLUENCER;
@ -106,29 +106,36 @@ public class ParticleEmitter extends Geometry {
//variable that helps with computations
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) {
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 setEnabled(boolean enabled) {
ParticleEmitter.this.setEnabled(enabled);
parentEmitter.setEnabled(enabled);
}
public boolean isEnabled() {
return ParticleEmitter.this.isEnabled();
return parentEmitter.isEnabled();
}
public void update(float tpf) {
updateFromControl(tpf);
parentEmitter.updateFromControl(tpf);
}
public void render(RenderManager rm, ViewPort vp) {
renderFromControl(rm, vp);
parentEmitter.renderFromControl(rm, vp);
}
public void write(JmeExporter ex) throws IOException {
@ -144,12 +151,37 @@ public class ParticleEmitter extends Geometry {
public ParticleEmitter clone() {
ParticleEmitter clone = (ParticleEmitter) super.clone();
clone.shape = shape.deepClone();
// Reinitialize particle list
clone.setNumParticles(particles.length);
clone.faceNormal = faceNormal.clone();
clone.startColor = startColor.clone();
clone.endColor = endColor.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;
}

@ -31,6 +31,8 @@
*/
package com.jme3.scene;
import com.jme3.asset.Asset;
import com.jme3.asset.AssetKey;
import com.jme3.bounding.BoundingVolume;
import com.jme3.collision.Collidable;
import com.jme3.export.JmeExporter;
@ -74,7 +76,7 @@ import java.util.logging.Logger;
* @author Joshua Slack
* @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());
@ -111,20 +113,25 @@ public abstract class Spatial implements Savable, Cloneable, Collidable {
protected static final int RF_TRANSFORM = 0x01, // need light resort + combine transforms
RF_BOUND = 0x02,
RF_LIGHTLIST = 0x04; // changes in light lists
protected CullHint cullHint = CullHint.Inherit;
/**
* Spatial's bounding volume relative to the world.
*/
protected BoundingVolume worldBound;
/**
* LightList
*/
protected LightList localLights;
protected transient LightList worldLights;
/**
* This spatial's name.
*/
protected String name;
// scale values
protected transient Camera.FrustumIntersect frustrumIntersects = Camera.FrustumIntersect.Intersects;
protected RenderQueue.Bucket queueBucket = RenderQueue.Bucket.Inherit;
@ -134,6 +141,14 @@ public abstract class Spatial implements Savable, Cloneable, Collidable {
protected Transform worldTransform;
protected SafeArrayList<Control> controls = new SafeArrayList<Control>(Control.class);
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.
*/
@ -170,6 +185,14 @@ public abstract class Spatial implements Savable, Cloneable, Collidable {
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
* a refresh is required.

Loading…
Cancel
Save