Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
TerrainChunk.cs
浏览该文件的文档.
1using Engine;
2
3namespace Game {
4 public class TerrainChunk : IDisposable {
5 public struct BrushPaint {
7
9 }
10
11 public const int SizeBits = 4;
12
13 public const int Size = 16;
14
15 public const int HeightBits = 8;
16
17 public const int Height = 256;
18
19 public const int SizeMinusOne = 15;
20
21 public const int HeightMinusOne = 255;
22
23 public const int SliceHeight = 16;
24
25 public const int SlicesCount = 16;
26
28
29 public Point2 Coords;
30
31 public Point2 Origin;
32
34
36
38
40
41 public bool WasDowngraded;
42
44
45 public bool WasUpgraded;
46
48
50
51 public float[] HazeEnds = new float[4];
52
54
55 public bool IsLoaded;
56
57 public volatile bool NewGeometryData;
58
60
61 public int[] Cells;
62
63 public int[] Shafts;
64
65 public static ArrayCache<int> m_cellsCache = new([Size * Size * Height], 0.66f, 60f, 0.33f, 5f);
66
67 public static ArrayCache<int> m_shaftsCache = new([Size * Size], 0.66f, 60f, 0.33f, 5f);
68
69 public DynamicArray<BrushPaint> m_brushPaints = [];
70
72
73 public DynamicArray<TerrainChunkGeometry.Buffer> Buffers = [];
74
75 public int[] SliceContentsHashes = new int[SlicesCount];
76
78
79 public TerrainChunk(Terrain terrain, int x, int z) {
80 Terrain = terrain;
81 Coords = new Point2(x, z);
82 Origin = new Point2(x * Size, z * Size);
83 BoundingBox = new BoundingBox(new Vector3(Origin.X, 0f, Origin.Y), new Vector3(Origin.X + Size, Height, Origin.Y + Size));
84 Center = new Vector2((float)Origin.X + Size / 2, (float)Origin.Y + Size / 2);
85 Cells = m_cellsCache.Rent(Size * Size * Height, true);
86 Shafts = m_shaftsCache.Rent(Size * Size, true);
87 }
88
89 public virtual void DisposeVertexIndexBuffers() {
90 foreach (TerrainChunkGeometry.Buffer b in Buffers) {
91 b.Dispose();
92 }
93 Buffers.Clear();
94 }
95
96 public virtual void InvalidateSliceContentsHashes() {
97 for (int i = 0; i < GeneratedSliceContentsHashes.Length; i++) {
99 }
100 }
101
102 public virtual void CopySliceContentsHashes() {
103 for (int i = 0; i < GeneratedSliceContentsHashes.Length; i++) {
105 }
106 }
107
108 public virtual void Dispose() {
110 if (Geometry == null) {
111 throw new InvalidOperationException();
112 }
113 Geometry = null;
114 m_cellsCache.Return(Cells);
115 m_shaftsCache.Return(Shafts);
116 }
117
118 public static bool IsCellValid(int x, int y, int z) {
119 if (x >= 0
120 && x < Size
121 && y >= 0
122 && y < Height
123 && z >= 0) {
124 return z < Size;
125 }
126 return false;
127 }
128
129 public static bool IsShaftValid(int x, int z) {
130 if (x >= 0
131 && x < Size
132 && z >= 0) {
133 return z < Size;
134 }
135 return false;
136 }
137
138 public static int CalculateCellIndex(int x, int y, int z) {
139 if (y is >= 0 and < Height) {
140 return y | (x << HeightBits) | (z << 12);
141 }
142 int absY = Math.Abs(y);
143 int yUpperBits = absY >> HeightBits;
144 if (yUpperBits > 0x7FFF) {
145 throw new ArgumentOutOfRangeException(nameof(y), "Height is too large.");
146 }
147 int yLower8Bits = absY & 0xFF;
148 yUpperBits = yUpperBits & 0x7FFF;
149 return ((y < 0 ? 1 : 0) << 31) | (yUpperBits << 16) | (z << 12) | (x << HeightBits) | yLower8Bits;
150 }
151
152 public virtual int CalculateTopmostCellHeight(int x, int z) {
153 int num = CalculateCellIndex(x, HeightMinusOne, z);
154 int num2 = HeightMinusOne;
155 while (num2 >= 0) {
156 if (Terrain.ExtractContents(GetCellValueFast(num)) != 0) {
157 return num2;
158 }
159 num2--;
160 num--;
161 }
162 return 0;
163 }
164
165 public virtual int GetCellValueFast(int index) => Cells[index];
166
167 public virtual int GetCellValueFast(int x, int y, int z) => Cells[y + x * Height + z * Height * Size];
168
169 public virtual int GetCellValueFast(Point3 p) => Cells[p.Y + p.X * Height + p.Z * Height * Size];
170
171 public virtual void SetCellValueFast(int x, int y, int z, int value) {
172 Cells[y + x * Height + z * Height * Size] = value;
173 }
174
175 public virtual void SetCellValueFast(Point3 p, int value) {
176 Cells[p.Y + p.X * Height + p.Z * Height * Size] = value;
177 }
178
179 public virtual void SetCellValueFast(int index, int value) {
180 Cells[index] = value;
181 }
182
183 public virtual int GetCellContentsFast(int x, int y, int z) => Terrain.ExtractContents(GetCellValueFast(x, y, z));
184
185 public virtual int GetCellContentsFast(Point3 p) => Terrain.ExtractContents(GetCellValueFast(p));
186
187 public virtual int GetCellLightFast(int x, int y, int z) => Terrain.ExtractLight(GetCellValueFast(x, y, z));
188
189 public virtual int GetCellLightFast(Point3 p) => Terrain.ExtractLight(GetCellValueFast(p));
190
191 public virtual int GetShaftValueFast(int x, int z) => Shafts[x + z * Size];
192
193 public virtual int GetShaftValueFast(Point2 p) => Shafts[p.X + p.Y * Size];
194
195 public virtual void SetShaftValueFast(int x, int z, int value) => Shafts[x + z * Size] = value;
196
197 public virtual void SetShaftValueFast(Point2 p, int value) => Shafts[p.X + p.Y * Size] = value;
198
199 public virtual int GetTemperatureFast(int x, int z) => Terrain.ExtractTemperature(GetShaftValueFast(x, z));
200
201 public virtual int GetTemperatureFast(Point2 p) => Terrain.ExtractTemperature(GetShaftValueFast(p));
202
203 public virtual void SetTemperatureFast(int x, int z, int temperature) => SetShaftValueFast(x, z, Terrain.ReplaceTemperature(GetShaftValueFast(x, z), temperature));
204
205 public virtual void SetTemperatureFast(Point2 p, int temperature) => SetShaftValueFast(p, Terrain.ReplaceTemperature(GetShaftValueFast(p), temperature));
206
207 public virtual int GetHumidityFast(int x, int z) => Terrain.ExtractHumidity(GetShaftValueFast(x, z));
208
209 public virtual int GetHumidityFast(Point2 p) => Terrain.ExtractHumidity(GetShaftValueFast(p));
210
211 public virtual void SetHumidityFast(int x, int z, int humidity) => SetShaftValueFast(x, z, Terrain.ReplaceHumidity(GetShaftValueFast(x, z), humidity));
212
213 public virtual void SetHumidityFast(Point2 p, int humidity) => SetShaftValueFast(p, Terrain.ReplaceHumidity(GetShaftValueFast(p), humidity));
214
215 public virtual int GetTopHeightFast(int x, int z) => Terrain.ExtractTopHeight(GetShaftValueFast(x, z));
216
217 public virtual int GetTopHeightFast(Point2 p) => Terrain.ExtractTopHeight(GetShaftValueFast(p));
218
219 public virtual void SetTopHeightFast(int x, int z, int topHeight) => SetShaftValueFast(x, z, Terrain.ReplaceTopHeight(GetShaftValueFast(x, z), topHeight));
220
221 public virtual void SetTopHeightFast(Point2 p, int topHeight) => SetShaftValueFast(p, Terrain.ReplaceTopHeight(GetShaftValueFast(p), topHeight));
222
223 public virtual int GetBottomHeightFast(int x, int z) => Terrain.ExtractBottomHeight(GetShaftValueFast(x, z));
224
225 public virtual int GetBottomHeightFast(Point2 p) => Terrain.ExtractBottomHeight(GetShaftValueFast(p));
226
227 public virtual void SetBottomHeightFast(int x, int z, int bottomHeight) => SetShaftValueFast(x, z, Terrain.ReplaceBottomHeight(GetShaftValueFast(x, z), bottomHeight));
228
229 public virtual void SetBottomHeightFast(Point2 p, int bottomHeight) => SetShaftValueFast(p, Terrain.ReplaceBottomHeight(GetShaftValueFast(p), bottomHeight));
230
231 public virtual int GetSunlightHeightFast(int x, int z) => Terrain.ExtractSunlightHeight(GetShaftValueFast(x, z));
232
233 public virtual int GetSunlightHeightFast(Point2 p) => Terrain.ExtractSunlightHeight(GetShaftValueFast(p));
234
235 public virtual void SetSunlightHeightFast(int x, int z, int sunlightHeight) => SetShaftValueFast(x, z, Terrain.ReplaceSunlightHeight(GetShaftValueFast(x, z), sunlightHeight));
236
237 public virtual void SetSunlightHeightFast(Point2 p, int sunlightHeight) => SetShaftValueFast(p, Terrain.ReplaceSunlightHeight(GetShaftValueFast(p), sunlightHeight));
238
239 public virtual void AddBrushPaint(int x, int y, int z, TerrainBrush brush) => m_brushPaints.Add(new BrushPaint { Position = new Point3(x, y, z), Brush = brush });
240
241 public virtual void AddBrushPaint(Point3 p, TerrainBrush brush) => m_brushPaints.Add(new BrushPaint { Position = p, Brush = brush });
242
243 public virtual void ApplyBrushPaints(TerrainChunk chunk) {
244 foreach (BrushPaint brushPaint in m_brushPaints) {
245 brushPaint.Brush.PaintFast(chunk, brushPaint.Position.X, brushPaint.Position.Y, brushPaint.Position.Z);
246 }
247 }
248 }
249}
Engine.Vector3 Vector3
void PaintFast(TerrainChunk chunk, int x, int y, int z)
virtual void SetSunlightHeightFast(int x, int z, int sunlightHeight)
virtual void SetTemperatureFast(Point2 p, int temperature)
static int CalculateCellIndex(int x, int y, int z)
static ArrayCache< int > m_shaftsCache
TerrainChunkState? DowngradedState
virtual void SetShaftValueFast(int x, int z, int value)
virtual void CopySliceContentsHashes()
virtual int GetShaftValueFast(Point2 p)
virtual int GetTopHeightFast(Point2 p)
virtual int GetCellLightFast(Point3 p)
virtual void SetShaftValueFast(Point2 p, int value)
virtual void SetSunlightHeightFast(Point2 p, int sunlightHeight)
virtual int GetSunlightHeightFast(int x, int z)
virtual int GetSunlightHeightFast(Point2 p)
volatile bool NewGeometryData
virtual void DisposeVertexIndexBuffers()
TerrainChunkState State
virtual void AddBrushPaint(int x, int y, int z, TerrainBrush brush)
virtual int GetCellValueFast(int index)
virtual void SetHumidityFast(Point2 p, int humidity)
virtual void SetTopHeightFast(Point2 p, int topHeight)
virtual void SetCellValueFast(int x, int y, int z, int value)
virtual int GetCellValueFast(int x, int y, int z)
virtual int GetTemperatureFast(int x, int z)
virtual void SetHumidityFast(int x, int z, int humidity)
virtual int GetCellValueFast(Point3 p)
TerrainChunkState ThreadState
static bool IsCellValid(int x, int y, int z)
virtual void ApplyBrushPaints(TerrainChunk chunk)
virtual int GetTemperatureFast(Point2 p)
virtual int GetBottomHeightFast(int x, int z)
virtual int GetTopHeightFast(int x, int z)
TerrainGeometry[] ChunkSliceGeometries
virtual void SetTemperatureFast(int x, int z, int temperature)
virtual int GetHumidityFast(Point2 p)
virtual int GetCellContentsFast(int x, int y, int z)
TerrainChunkState? UpgradedState
static ArrayCache< int > m_cellsCache
virtual void SetCellValueFast(Point3 p, int value)
virtual int GetCellContentsFast(Point3 p)
virtual void SetTopHeightFast(int x, int z, int topHeight)
virtual int GetCellLightFast(int x, int y, int z)
virtual void AddBrushPaint(Point3 p, TerrainBrush brush)
virtual int GetShaftValueFast(int x, int z)
static bool IsShaftValid(int x, int z)
virtual int GetHumidityFast(int x, int z)
DynamicArray< TerrainChunkGeometry.Buffer > Buffers
virtual int CalculateTopmostCellHeight(int x, int z)
virtual void InvalidateSliceContentsHashes()
TerrainChunkGeometry Geometry
DynamicArray< BrushPaint > m_brushPaints
virtual void SetBottomHeightFast(Point2 p, int bottomHeight)
virtual int GetBottomHeightFast(Point2 p)
TerrainChunk(Terrain terrain, int x, int z)
virtual void SetCellValueFast(int index, int value)
virtual void SetBottomHeightFast(int x, int z, int bottomHeight)