• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.badlogic.gdx.graphics.g3d.particles;
2 
3 import java.util.Arrays;
4 
5 import com.badlogic.gdx.graphics.g3d.ModelInstance;
6 import com.badlogic.gdx.graphics.g3d.particles.ParallelArray.ChannelDescriptor;
7 import com.badlogic.gdx.graphics.g3d.particles.ParallelArray.ChannelInitializer;
8 import com.badlogic.gdx.graphics.g3d.particles.ParallelArray.FloatChannel;
9 
10 /** This contains all the definitions of particle related channels and channel initializers.
11  * It is also used by the {@link ParticleController} to handle temporary channels allocated by influencers.
12  * @author inferno */
13 public class ParticleChannels {
14 	private static int currentGlobalId;
newGlobalId()15 	public static int newGlobalId(){
16 		return currentGlobalId++;
17 	}
18 
19 	//Initializers
20 	public static class TextureRegionInitializer implements ChannelInitializer<FloatChannel>{
21 		private static TextureRegionInitializer instance;
get()22 		public static TextureRegionInitializer get(){
23 				if(instance == null)
24 					instance = new TextureRegionInitializer();
25 				return instance;
26 		}
27 
28 		@Override
init(FloatChannel channel)29 		public void init (FloatChannel channel) {
30 			for(int i=0, c = channel.data.length; i < c; i+= channel.strideSize){
31 				channel.data[i + ParticleChannels.UOffset] = 0;
32 				channel.data[i + ParticleChannels.VOffset] = 0;
33 				channel.data[i + ParticleChannels.U2Offset] = 1;
34 				channel.data[i + ParticleChannels.V2Offset] = 1;
35 				channel.data[i + ParticleChannels.HalfWidthOffset] = 0.5f;
36 				channel.data[i + ParticleChannels.HalfHeightOffset] = 0.5f;
37 			}
38 		}
39 	}
40 
41 	public static class ColorInitializer implements ChannelInitializer<FloatChannel>{
42 		private static ColorInitializer instance;
get()43 		public static ColorInitializer get(){
44 			if(instance == null)
45 				instance = new ColorInitializer();
46 			return instance;
47 		}
48 		@Override
init(FloatChannel channel)49 		public void init (FloatChannel channel) {
50 			Arrays.fill(channel.data, 0, channel.data.length, 1);
51 		}
52 	}
53 
54 	public static class ScaleInitializer implements ChannelInitializer<FloatChannel>{
55 		private static ScaleInitializer instance;
get()56 		public static ScaleInitializer get(){
57 			if(instance == null)
58 				instance = new ScaleInitializer();
59 			return instance;
60 		}
61 		@Override
init(FloatChannel channel)62 		public void init (FloatChannel channel) {
63 			Arrays.fill(channel.data, 0, channel.data.length, 1);
64 		}
65 	}
66 
67 	public static class Rotation2dInitializer implements ChannelInitializer<FloatChannel>{
68 		private static Rotation2dInitializer instance;
get()69 		public static Rotation2dInitializer get(){
70 			if(instance == null)
71 				instance = new Rotation2dInitializer();
72 			return instance;
73 		}
74 		@Override
init(FloatChannel channel)75 		public void init (FloatChannel channel) {
76 			for(int i=0, c = channel.data.length; i < c; i+= channel.strideSize){
77 				channel.data[i + ParticleChannels.CosineOffset] = 1;
78 				channel.data[i + ParticleChannels.SineOffset] = 0;
79 			}
80 		}
81 	}
82 
83 	public static class Rotation3dInitializer implements ChannelInitializer<FloatChannel>{
84 		private static Rotation3dInitializer instance;
get()85 		public static Rotation3dInitializer get(){
86 			if(instance == null)
87 				instance = new Rotation3dInitializer();
88 			return instance;
89 		}
90 		@Override
init(FloatChannel channel)91 		public void init (FloatChannel channel) {
92 			for(int i=0, c = channel.data.length; i < c; i+= channel.strideSize){
93 				channel.data[i + ParticleChannels.XOffset] =
94 				channel.data[i + ParticleChannels.YOffset] =
95 				channel.data[i + ParticleChannels.ZOffset] = 0;
96 				channel.data[i + ParticleChannels.WOffset] = 1;
97 			}
98 		}
99 	}
100 
101 	//Channels
102 	/** Channels of common use like position, life, color, etc...*/
103 	public static final ChannelDescriptor Life = new ChannelDescriptor(newGlobalId(), float.class, 3);
104 	public static final ChannelDescriptor Position = new ChannelDescriptor(newGlobalId(), float.class, 3); //gl units
105 	public static final ChannelDescriptor PreviousPosition = new ChannelDescriptor(newGlobalId(), float.class, 3);
106 	public static final ChannelDescriptor Color = new ChannelDescriptor(newGlobalId(), float.class, 4);
107 	public static final ChannelDescriptor TextureRegion = new ChannelDescriptor(newGlobalId(), float.class, 6);
108 	public static final ChannelDescriptor Rotation2D = new ChannelDescriptor(newGlobalId(), float.class, 2);
109 	public static final ChannelDescriptor Rotation3D = new ChannelDescriptor(newGlobalId(), float.class, 4);
110 	public static final ChannelDescriptor Scale = new ChannelDescriptor(newGlobalId(), float.class, 1);
111 	public static final ChannelDescriptor ModelInstance = new ChannelDescriptor(newGlobalId(), ModelInstance.class, 1);
112 	public static final ChannelDescriptor ParticleController = new ChannelDescriptor(newGlobalId(), ParticleController.class, 1);
113 	public static final ChannelDescriptor Acceleration = new ChannelDescriptor(newGlobalId(), float.class, 3); //gl units/s2
114 	public static final ChannelDescriptor AngularVelocity2D = new ChannelDescriptor(newGlobalId(), float.class, 1);
115 	public static final ChannelDescriptor AngularVelocity3D = new ChannelDescriptor(newGlobalId(), float.class, 3);
116 	public static final ChannelDescriptor Interpolation = new ChannelDescriptor(-1, float.class, 2);
117 	public static final ChannelDescriptor Interpolation4 = new ChannelDescriptor(-1, float.class, 4);
118 	public static final ChannelDescriptor Interpolation6 = new ChannelDescriptor(-1, float.class, 6);
119 
120 	//Offsets
121 	/** Offsets to acess a particular value inside a stride of a given channel */
122 	public static final int CurrentLifeOffset = 0, TotalLifeOffset = 1, LifePercentOffset =2;
123 	public static final int RedOffset = 0, GreenOffset =1, BlueOffset = 2, AlphaOffset =3;
124 	public static final int InterpolationStartOffset = 0, InterpolationDiffOffset =1;
125 	public static final int VelocityStrengthStartOffset = 0, VelocityStrengthDiffOffset =1,
126 												VelocityThetaStartOffset = 0, VelocityThetaDiffOffset =1,
127 												VelocityPhiStartOffset = 2, VelocityPhiDiffOffset =3;
128 	public static final int XOffset = 0, YOffset = 1, ZOffset = 2, WOffset = 3;
129 	public static final int UOffset = 0, VOffset= 1, U2Offset = 2, V2Offset = 3,
130 												HalfWidthOffset = 4, HalfHeightOffset= 5;
131 	public static final int CosineOffset = 0, SineOffset= 1;
132 
133 	private int currentId;
134 
ParticleChannels()135 	public ParticleChannels(){
136 		resetIds();
137 	}
138 
newId()139 	public int newId(){
140 		return currentId++;
141 	}
142 
resetIds()143 	protected void resetIds(){
144 		currentId = currentGlobalId;
145 	}
146 
147 }
148