Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ParticleSystem.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class ParticleSystem<T> : ParticleSystemBase where T : Particle, new() {
6 public T[] m_particles;
7
9
10 public Vector3[] m_front = new Vector3[3];
11
12 public Vector3[] m_right = new Vector3[3];
13
14 public Vector3[] m_up = new Vector3[3];
15
17
19
20 public T[] Particles => m_particles;
21
23 get => m_texture;
24 set {
25 if (value != m_texture) {
26 m_texture = value;
27 AdditiveBatch = null;
28 AlphaBlendedBatch = null;
29 }
30 }
31 }
32
33 public int TextureSlotsCount { get; set; }
34
35 public ParticleSystem(int particlesCount) {
36 m_particles = new T[particlesCount];
37 for (int i = 0; i < m_particles.Length; i++) {
38 m_particles[i] = new T();
39 }
40 }
41
42 public override void Draw(Camera camera) {
43 if (AdditiveBatch == null
44 || AlphaBlendedBatch == null) {
45 AdditiveBatch = SubsystemParticles.PrimitivesRenderer.TexturedBatch(
47 true,
48 0,
50 null,
53 );
54 AlphaBlendedBatch = SubsystemParticles.PrimitivesRenderer.TexturedBatch(
56 true,
57 0,
59 null,
62 );
63 }
64 m_front[0] = camera.ViewDirection;
67 m_front[1] = camera.ViewDirection;
69 m_up[1] = Vector3.UnitY;
72 m_up[2] = Vector3.UnitZ;
73 float s = 1f / TextureSlotsCount;
74 for (int i = 0; i < m_particles.Length; i++) {
75 Particle particle = m_particles[i];
76 if (particle.IsActive) {
77 Vector3 position = particle.Position;
78 Vector2 size = particle.Size;
79 float rotation = particle.Rotation;
80 int textureSlot = particle.TextureSlot;
81 Vector3 p;
82 Vector3 p2;
83 Vector3 p3;
84 Vector3 p4;
85 if (particle.BillboardingMode == ParticleBillboardingMode.None) {
86 p = position + (-particle.Right - particle.Up);
87 p2 = position + (particle.Right - particle.Up);
88 p3 = position + (particle.Right + particle.Up);
89 p4 = position + (-particle.Right + particle.Up);
90 }
91 else if (particle.BillboardingMode == ParticleBillboardingMode.Horizontal
92 && rotation != 0f) {
93 Vector3 vector = new(MathF.Cos(rotation), 0f, MathF.Sin(rotation));
94 Vector3 vector2 = new(vector.Z, 0f, 0f - vector.X);
95 vector2 *= size.Y;
96 vector *= size.X;
97 p = position + (-vector2 - vector);
98 p2 = position + (vector2 - vector);
99 p3 = position + (vector2 + vector);
100 p4 = position + (-vector2 + vector);
101 }
102 else if (rotation != 0f) {
103 Vector3 v = m_front[(uint)particle.BillboardingMode];
104 Vector3 v2 = v.X * v.X > v.Z * v.Z
105 ? new Vector3(0f, MathF.Cos(rotation), MathF.Sin(rotation))
106 : new Vector3(MathF.Sin(rotation), MathF.Cos(rotation), 0f);
107 Vector3 vector3 = Vector3.Normalize(Vector3.Cross(v, v2));
108 v2 = Vector3.Normalize(Vector3.Cross(v, vector3));
109 vector3 *= size.Y;
110 v2 *= size.X;
111 p = position + (-vector3 - v2);
112 p2 = position + (vector3 - v2);
113 p3 = position + (vector3 + v2);
114 p4 = position + (-vector3 + v2);
115 }
116 else {
117 Vector3 vector4 = m_right[(uint)particle.BillboardingMode];
118 Vector3 vector5 = m_up[(uint)particle.BillboardingMode];
119 Vector3 vector6 = vector4 * size.X;
120 Vector3 vector7 = vector5 * size.Y;
121 p = position + (-vector6 - vector7);
122 p2 = position + (vector6 - vector7);
123 p3 = position + (vector6 + vector7);
124 p4 = position + (-vector6 + vector7);
125 }
126 TexturedBatch3D obj = particle.UseAdditiveBlending ? AdditiveBatch : AlphaBlendedBatch;
127 Vector2 v3 = new(textureSlot % TextureSlotsCount, textureSlot / TextureSlotsCount);
128 float num = 0f;
129 float num2 = 1f;
130 float num3 = 1f;
131 float num4 = 0f;
132 if (particle.FlipX) {
133 num = 1f - num;
134 num2 = 1f - num2;
135 }
136 if (particle.FlipY) {
137 num3 = 1f - num3;
138 num4 = 1f - num4;
139 }
140 Vector2 texCoord = (v3 + new Vector2(num, num3)) * s;
141 Vector2 texCoord2 = (v3 + new Vector2(num2, num3)) * s;
142 Vector2 texCoord3 = (v3 + new Vector2(num2, num4)) * s;
143 Vector2 texCoord4 = (v3 + new Vector2(num, num4)) * s;
144 obj.QueueQuad(
145 p,
146 p2,
147 p3,
148 p4,
149 texCoord,
150 texCoord2,
151 texCoord3,
152 texCoord4,
153 particle.Color
154 );
155 }
156 }
157 }
158
159 public override bool Simulate(float dt) => false;
160 }
161}
Engine.Vector3 Vector3
static readonly BlendState Additive
static readonly BlendState AlphaBlend
static readonly DepthStencilState Default
static readonly DepthStencilState DepthRead
void QueueQuad(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, Vector2 texCoord1, Vector2 texCoord2, Vector2 texCoord3, Vector2 texCoord4, Color color)
Vector3 ViewDirection
ParticleBillboardingMode BillboardingMode
override void Draw(Camera camera)
ParticleSystem(int particlesCount)
override bool Simulate(float dt)
SubsystemParticles SubsystemParticles
static Vector3 Cross(Vector3 v1, Vector3 v2)
static Vector3 Normalize(Vector3 v)
static readonly Vector3 UnitX
static readonly Vector3 UnitY
static readonly Vector3 UnitZ