* Fix for ParticleEmitter.clone()
* Enable smart cache for models git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7906 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
66d78be974
commit
7cd213b940
@ -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…
x
Reference in New Issue
Block a user