/** @return a copy of this controller */ public ParticleController copy () { Emitter emitter = (Emitter)this.emitter.copy(); Influencer[] influencers = new Influencer[this.influencers.size]; int i = 0; for (Influencer influencer : this.influencers) { influencers[i++] = (Influencer)influencer.copy(); } return new ParticleController(new String(this.name), emitter, (ParticleControllerRenderer<?, ?>)renderer.copy(), influencers); }
@SuppressWarnings("unchecked") public boolean setBatch (ParticleBatch<?> batch) { if (isCompatible(batch)) { this.batch = (T)batch; return true; } return false; }
@Override public void load (AssetManager manager, ResourceData data) { emitter.load(manager, data); for (Influencer influencer : influencers) influencer.load(manager, data); renderer.load(manager, data); } }
/** Updates the renderer used by this controller, usually this means the particles will be draw inside a batch. */ public void draw () { if (particles.size > 0) { renderer.update(); } }
/** Assign one batch, among those passed in, to each controller. The batch must be compatible with the controller to be * assigned. */ public void setBatch (Array<ParticleBatch<?>> batches) { for (ParticleController controller : controllers) { for (ParticleBatch<?> batch : batches) if (controller.renderer.setBatch(batch)) break; } }
@Override public void save (AssetManager manager, ResourceData data) { emitter.save(manager, data); for (Influencer influencer : influencers) influencer.save(manager, data); renderer.save(manager, data); }
protected void allocateChannels (int maxParticleCount) { particles = new ParallelArray(maxParticleCount); // Alloc additional channels emitter.allocateChannels(); for (Influencer influencer : influencers) influencer.allocateChannels(); renderer.allocateChannels(); }
/** Bind the sub systems to the controller Called once during the init phase. */ protected void bind () { emitter.set(this); for (Influencer influencer : influencers) influencer.set(this); renderer.set(this); }
/** Initialize the controller. All the sub systems will be initialized and binded to the controller. Must be called before any * other method. */ public void init () { bind(); if (particles != null) { end(); particleChannels.resetIds(); } allocateChannels(emitter.maxParticleCount); emitter.init(); for (Influencer influencer : influencers) influencer.init(); renderer.init(); }
/** Updates the renderer used by this controller, usually this means the particles will be draw inside a batch. */ public void draw () { if (particles.size > 0) { renderer.update(); } }
/** Assign one batch, among those passed in, to each controller. The batch must be compatible with the controller to be * assigned. */ public void setBatch (Array<ParticleBatch<?>> batches) { for (ParticleController controller : controllers) { for (ParticleBatch<?> batch : batches) if (controller.renderer.setBatch(batch)) break; } }
@Override public void save (AssetManager manager, ResourceData data) { emitter.save(manager, data); for (Influencer influencer : influencers) influencer.save(manager, data); renderer.save(manager, data); }
protected void allocateChannels (int maxParticleCount) { particles = new ParallelArray(maxParticleCount); // Alloc additional channels emitter.allocateChannels(); for (Influencer influencer : influencers) influencer.allocateChannels(); renderer.allocateChannels(); }
/** Bind the sub systems to the controller Called once during the init phase. */ protected void bind () { emitter.set(this); for (Influencer influencer : influencers) influencer.set(this); renderer.set(this); }
/** Initialize the controller. All the sub systems will be initialized and binded to the controller. Must be called before any * other method. */ public void init () { bind(); if (particles != null) { end(); particleChannels.resetIds(); } allocateChannels(emitter.maxParticleCount); emitter.init(); for (Influencer influencer : influencers) influencer.init(); renderer.init(); }
@Override public void update () { for (int i = 0, positionOffset = 0, c = controller.particles.size; i < c; ++i, positionOffset += renderData.positionChannel.strideSize) { ModelInstance instance = renderData.modelInstanceChannel.data[i]; float scale = hasScale ? renderData.scaleChannel.data[i] : 1; float qx = 0, qy = 0, qz = 0, qw = 1; if (hasRotation) { int rotationOffset = i * renderData.rotationChannel.strideSize; qx = renderData.rotationChannel.data[rotationOffset + ParticleChannels.XOffset]; qy = renderData.rotationChannel.data[rotationOffset + ParticleChannels.YOffset]; qz = renderData.rotationChannel.data[rotationOffset + ParticleChannels.ZOffset]; qw = renderData.rotationChannel.data[rotationOffset + ParticleChannels.WOffset]; } instance.transform.set(renderData.positionChannel.data[positionOffset + ParticleChannels.XOffset], renderData.positionChannel.data[positionOffset + ParticleChannels.YOffset], renderData.positionChannel.data[positionOffset + ParticleChannels.ZOffset], qx, qy, qz, qw, scale, scale, scale); if (hasColor) { int colorOffset = i * renderData.colorChannel.strideSize; ColorAttribute colorAttribute = (ColorAttribute)instance.materials.get(0).get(ColorAttribute.Diffuse); BlendingAttribute blendingAttribute = (BlendingAttribute)instance.materials.get(0).get(BlendingAttribute.Type); colorAttribute.color.r = renderData.colorChannel.data[colorOffset + ParticleChannels.RedOffset]; colorAttribute.color.g = renderData.colorChannel.data[colorOffset + ParticleChannels.GreenOffset]; colorAttribute.color.b = renderData.colorChannel.data[colorOffset + ParticleChannels.BlueOffset]; if (blendingAttribute != null) blendingAttribute.opacity = renderData.colorChannel.data[colorOffset + ParticleChannels.AlphaOffset]; } } super.update(); }
@SuppressWarnings("unchecked") public boolean setBatch (ParticleBatch<?> batch) { if (isCompatible(batch)) { this.batch = (T)batch; return true; } return false; }
/** Assign one batch, among those passed in, to each controller. The batch must be compatible with the controller to be * assigned. */ public void setBatch (Array<ParticleBatch<?>> batches) { for (ParticleController controller : controllers) { for (ParticleBatch<?> batch : batches) if (controller.renderer.setBatch(batch)) break; } }
@Override public void save (AssetManager manager, ResourceData data) { emitter.save(manager, data); for (Influencer influencer : influencers) influencer.save(manager, data); renderer.save(manager, data); }
/** @return a copy of this controller */ public ParticleController copy () { Emitter emitter = (Emitter)this.emitter.copy(); Influencer[] influencers = new Influencer[this.influencers.size]; int i = 0; for (Influencer influencer : this.influencers) { influencers[i++] = (Influencer)influencer.copy(); } return new ParticleController(new String(this.name), emitter, (ParticleControllerRenderer<?, ?>)renderer.copy(), influencers); }