Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
LeavesParticleSystem.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class LeavesParticleSystem : ParticleSystem<LeavesParticleSystem.Particle> {
6 public class Particle : Game.Particle {
7 public float Time;
8
9 public float EndTime;
10
11 public float Speed;
12
13 public float Phase;
14
15 public float PhaseSpeed;
16
18
19 public int Light;
20
21 public float Angle;
22
23 public float AngleSpeed;
24 }
25
27
29
31
33
35
36 public LeavesParticleSystem(SubsystemTerrain subsystemTerrain, Point3 point, int leavesCount, bool fadeIn, bool createFallenLeaves, int value)
37 : base(leavesCount) {
38 m_subsystemTerrain = subsystemTerrain;
39 m_point = point;
40 m_fadeIn = fadeIn;
41 m_createFallenLeaves = createFallenLeaves;
42 Texture = ContentManager.Get<Texture2D>("Textures/LeafParticle");
44 Color color = BlocksManager.Blocks[Terrain.ExtractContents(value)] is LeavesBlock leavesBlock
45 ? leavesBlock.GetLeavesBlockColor(value, m_subsystemTerrain.Terrain, point.X, point.Y, point.Z)
47 for (int i = 0; i < Particles.Length; i++) {
48 float f = m_random.Float();
49 Color color2 = Color.Lerp(new Color(180, 120, 120), new Color(200, 255, 255), m_random.Float(0f, 1f));
50 Particle particle = Particles[i];
51 particle.IsActive = true;
52 particle.EndTime = 12f;
53 particle.Position = new Vector3(point)
54 + new Vector3(0.5f)
55 + 0.45f * new Vector3(m_random.Float(-1f, 1f), MathUtils.Lerp(1f, -1f, f), m_random.Float(-1f, 1f));
56 particle.Light = 7;
57 particle.BaseColor = color * color2;
58 particle.Color = Color.Transparent;
59 particle.BillboardingMode = ParticleBillboardingMode.None;
60 particle.Size = new Vector2(0.18f) * m_random.Float(0.75f, 1f);
61 particle.Speed = MathUtils.Lerp(1.5f, 3.5f, f);
62 particle.Phase = m_random.Float(0f, (float)Math.PI * 2f);
63 particle.PhaseSpeed = 2f * particle.Speed * m_random.Float(0.75f, 1.25f);
64 particle.Angle = m_random.Float(0f, (float)Math.PI * 2f);
65 particle.AngleSpeed = m_random.Sign() * m_random.Float(1f, 3f);
66 particle.FlipX = m_random.Bool();
67 particle.FlipY = m_random.Bool();
68 }
69 }
70
71 public override bool Simulate(float dt) {
72 Terrain terrain = m_subsystemTerrain.Terrain;
73 bool flag = false;
74 for (int i = 0; i < Particles.Length; i++) {
75 Particle particle = Particles[i];
76 if (!particle.IsActive) {
77 continue;
78 }
79 if (particle.BillboardingMode == ParticleBillboardingMode.None) {
80 particle.Phase += particle.PhaseSpeed * dt;
81 particle.Rotation = -0.5f * MathF.Sin(particle.Phase) + (float)Math.PI / 2f;
82 particle.Angle += particle.AngleSpeed * dt;
84 Vector2 vector = Vector2.Perpendicular(v);
85 Vector2 vector2 = Vector2.Rotate(Vector2.UnitY, particle.Angle);
86 particle.Right = particle.Size.X * new Vector3(v.X * vector2.X, v.Y, v.X * vector2.Y);
87 particle.Up = particle.Size.Y * new Vector3(vector.X * vector2.X, vector.Y, vector.X * vector2.Y);
88 float num = MathUtils.Saturate(4f * particle.Time);
89 particle.Position += 0.8f * particle.Speed * num * dt * new Vector3(0f, -1f, 0f);
90 particle.Position += 0.4f * particle.Speed * num * dt * MathF.Cos(particle.Phase) * new Vector3(vector2.X, 0f, vector2.Y);
91 particle.Position += 0.3f * particle.Speed * num * dt * MathF.Cos(2f * particle.Phase) * new Vector3(0f, -1f, 0f);
92 }
93 int num2 = Terrain.ToCell(particle.Position.X);
94 int num3 = Terrain.ToCell(particle.Position.Y);
95 int num4 = Terrain.ToCell(particle.Position.Z);
96 TerrainChunk chunkAtCell = terrain.GetChunkAtCell(num2, num4);
97 if (chunkAtCell != null
98 && chunkAtCell.State >= TerrainChunkState.InvalidVertices1) {
99 particle.Light = terrain.GetCellLight(num2, num3, num4);
100 }
102 float num5 = MathUtils.Saturate(0.5f * (particle.EndTime - particle.Time));
103 if (m_fadeIn) {
104 num5 *= MathUtils.Saturate(1f * particle.Time);
105 }
106 particle.Color *= num5;
107 if (particle.BillboardingMode == ParticleBillboardingMode.None) {
108 int cellValue = terrain.GetCellValue(num2, num3, num4);
109 int num6 = Terrain.ExtractContents(cellValue);
110 Block block = BlocksManager.Blocks[num6];
111 if (block is WaterBlock) {
112 particle.EndTime = particle.Time;
113 }
114 else if (block.IsCollidable
115 && !(block is LeavesBlock)) {
116 float num7 = 0.5f;
117 Ray3 ray = new(particle.Position - new Vector3(num2, num3, num4) + new Vector3(0f, num7, 0f), -Vector3.UnitY);
118 float? num8 = block.Raycast(ray, m_subsystemTerrain, cellValue, false, out int _, out BoundingBox _);
119 if (num8.HasValue
120 && num8 < num7 - 0f) {
121 particle.BillboardingMode = ParticleBillboardingMode.Horizontal;
122 particle.Position = ray.Sample(num8.Value) + new Vector3(num2, num3 + 0.03f, num4);
123 particle.EndTime = particle.Time + 2f;
125 m_createFallenLeaves = false;
127 .CreateFallenLeaves(m_point, true);
128 }
129 }
130 }
131 }
132 particle.Time += dt;
133 if (particle.Time >= particle.EndTime) {
134 particle.IsActive = false;
135 }
136 else {
137 flag = true;
138 }
139 }
140 return !flag;
141 }
142 }
143}
Engine.Color Color
Engine.Vector3 Vector3
static float Saturate(float x)
static float Lerp(float x1, float x2, float f)
bool IsCollidable
virtual ? float Raycast(Ray3 ray, SubsystemTerrain subsystemTerrain, int value, bool useInteractionBoxes, out int nearestBoxIndex, out BoundingBox nearestBox)
static object Get(Type type, string name)
Color GetLeavesBlockColor(int value, Terrain terrain, int x, int y, int z)
LeavesParticleSystem(SubsystemTerrain subsystemTerrain, Point3 point, int leavesCount, bool fadeIn, bool createFallenLeaves, int value)
static readonly float[] LightIntensityByLightValue
ParticleBillboardingMode BillboardingMode
ParticleSystem(int particlesCount)
TerrainChunkState State
static int ExtractContents(int value)
virtual int GetCellLight(int x, int y, int z)
virtual int GetCellValue(int x, int y, int z)
static int ToCell(float x)
virtual TerrainChunk GetChunkAtCell(int x, int z)
static Color Lerp(Color c1, Color c2, float f)
static Color Transparent
定义 Color.cs:5
static Color MultiplyColorOnlyNotSaturated(Color c, float s)
Vector3 Sample(float distance)
static Vector2 Rotate(Vector2 v, float angle)
static readonly Vector2 UnitY
static readonly Vector2 UnitX
static Vector2 Perpendicular(Vector2 v)
static readonly Vector3 UnitY