/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.graphics.g3d.particles;
import java.util.Arrays;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.particles.ParallelArray.ChannelDescriptor;
import com.badlogic.gdx.graphics.g3d.particles.ParallelArray.ChannelInitializer;
import com.badlogic.gdx.graphics.g3d.particles.ParallelArray.FloatChannel;
/** This contains all the definitions of particle related channels and channel initializers. It is also used by the
* {@link ParticleController} to handle temporary channels allocated by influencers.
* @author inferno */
public class ParticleChannels {
private static int currentGlobalId;
public static int newGlobalId () {
return currentGlobalId++;
}
// Initializers
public static class TextureRegionInitializer implements ChannelInitializer<FloatChannel> {
private static TextureRegionInitializer instance;
public static TextureRegionInitializer get () {
if (instance == null) instance = new TextureRegionInitializer();
return instance;
}
@Override
public void init (FloatChannel channel) {
for (int i = 0, c = channel.data.length; i < c; i += channel.strideSize) {
channel.data[i + ParticleChannels.UOffset] = 0;
channel.data[i + ParticleChannels.VOffset] = 0;
channel.data[i + ParticleChannels.U2Offset] = 1;
channel.data[i + ParticleChannels.V2Offset] = 1;
channel.data[i + ParticleChannels.HalfWidthOffset] = 0.5f;
channel.data[i + ParticleChannels.HalfHeightOffset] = 0.5f;
}
}
}
public static class ColorInitializer implements ChannelInitializer<FloatChannel> {
private static ColorInitializer instance;
public static ColorInitializer get () {
if (instance == null) instance = new ColorInitializer();
return instance;
}
@Override
public void init (FloatChannel channel) {
Arrays.fill(channel.data, 0, channel.data.length, 1);
}
}
public static class ScaleInitializer implements ChannelInitializer<FloatChannel> {
private static ScaleInitializer instance;
public static ScaleInitializer get () {
if (instance == null) instance = new ScaleInitializer();
return instance;
}
@Override
public void init (FloatChannel channel) {
Arrays.fill(channel.data, 0, channel.data.length, 1);
}
}
public static class Rotation2dInitializer implements ChannelInitializer<FloatChannel> {
private static Rotation2dInitializer instance;
public static Rotation2dInitializer get () {
if (instance == null) instance = new Rotation2dInitializer();
return instance;
}
@Override
public void init (FloatChannel channel) {
for (int i = 0, c = channel.data.length; i < c; i += channel.strideSize) {
channel.data[i + ParticleChannels.CosineOffset] = 1;
channel.data[i + ParticleChannels.SineOffset] = 0;
}
}
}
public static class Rotation3dInitializer implements ChannelInitializer<FloatChannel> {
private static Rotation3dInitializer instance;
public static Rotation3dInitializer get () {
if (instance == null) instance = new Rotation3dInitializer();
return instance;
}
@Override
public void init (FloatChannel channel) {
for (int i = 0, c = channel.data.length; i < c; i += channel.strideSize) {
channel.data[i + ParticleChannels.XOffset] = channel.data[i + ParticleChannels.YOffset] = channel.data[i
+ ParticleChannels.ZOffset] = 0;
channel.data[i + ParticleChannels.WOffset] = 1;
}
}
}
// Channels
/** Channels of common use like position, life, color, etc... */
public static final ChannelDescriptor Life = new ChannelDescriptor(newGlobalId(), float.class, 3);
public static final ChannelDescriptor Position = new ChannelDescriptor(newGlobalId(), float.class, 3); // gl units
public static final ChannelDescriptor PreviousPosition = new ChannelDescriptor(newGlobalId(), float.class, 3);
public static final ChannelDescriptor Color = new ChannelDescriptor(newGlobalId(), float.class, 4);
public static final ChannelDescriptor TextureRegion = new ChannelDescriptor(newGlobalId(), float.class, 6);
public static final ChannelDescriptor Rotation2D = new ChannelDescriptor(newGlobalId(), float.class, 2);
public static final ChannelDescriptor Rotation3D = new ChannelDescriptor(newGlobalId(), float.class, 4);
public static final ChannelDescriptor Scale = new ChannelDescriptor(newGlobalId(), float.class, 1);
public static final ChannelDescriptor ModelInstance = new ChannelDescriptor(newGlobalId(), ModelInstance.class, 1);
public static final ChannelDescriptor ParticleController = new ChannelDescriptor(newGlobalId(), ParticleController.class, 1);
public static final ChannelDescriptor Acceleration = new ChannelDescriptor(newGlobalId(), float.class, 3); // gl units/s2
public static final ChannelDescriptor AngularVelocity2D = new ChannelDescriptor(newGlobalId(), float.class, 1);
public static final ChannelDescriptor AngularVelocity3D = new ChannelDescriptor(newGlobalId(), float.class, 3);
public static final ChannelDescriptor Interpolation = new ChannelDescriptor(-1, float.class, 2);
public static final ChannelDescriptor Interpolation4 = new ChannelDescriptor(-1, float.class, 4);
public static final ChannelDescriptor Interpolation6 = new ChannelDescriptor(-1, float.class, 6);
// Offsets
/** Offsets to acess a particular value inside a stride of a given channel */
public static final int CurrentLifeOffset = 0, TotalLifeOffset = 1, LifePercentOffset = 2;
public static final int RedOffset = 0, GreenOffset = 1, BlueOffset = 2, AlphaOffset = 3;
public static final int InterpolationStartOffset = 0, InterpolationDiffOffset = 1;
public static final int VelocityStrengthStartOffset = 0, VelocityStrengthDiffOffset = 1, VelocityThetaStartOffset = 0,
VelocityThetaDiffOffset = 1, VelocityPhiStartOffset = 2, VelocityPhiDiffOffset = 3;
public static final int XOffset = 0, YOffset = 1, ZOffset = 2, WOffset = 3;
public static final int UOffset = 0, VOffset = 1, U2Offset = 2, V2Offset = 3, HalfWidthOffset = 4, HalfHeightOffset = 5;
public static final int CosineOffset = 0, SineOffset = 1;
private int currentId;
public ParticleChannels () {
resetIds();
}
public int newId () {
return currentId++;
}
protected void resetIds () {
currentId = currentGlobalId;
}
}