Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
InstancedModelsManager.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public static class InstancedModelsManager {
6 public struct SourceModelVertex {
7 public float X;
8
9 public float Y;
10
11 public float Z;
12
13 public float Nx;
14
15 public float Ny;
16
17 public float Nz;
18
19 public float Tx;
20
21 public float Ty;
22 }
23
24 public struct InstancedVertex {
25 public float X;
26
27 public float Y;
28
29 public float Z;
30
31 public float Nx;
32
33 public float Ny;
34
35 public float Nz;
36
37 public float Tx;
38
39 public float Ty;
40
41 public float Instance;
42 }
43
44 public static Dictionary<Model, InstancedModelData> m_cache;
45
47 m_cache = [];
48 Display.DeviceReset += delegate {
49 foreach (InstancedModelData value in m_cache.Values) {
50 value.VertexBuffer.Dispose();
51 value.IndexBuffer.Dispose();
52 }
53 m_cache.Clear();
54 };
55 }
56
57 public static InstancedModelData GetInstancedModelData(Model model, int[] meshDrawOrders) {
58 if (!m_cache.TryGetValue(model, out InstancedModelData value)) {
59 value = CreateInstancedModelData(model, meshDrawOrders);
60 m_cache.Add(model, value);
61 }
62 return value;
63 }
64
65 public static InstancedModelData CreateInstancedModelData(Model model, int[] meshDrawOrders) {
66 DynamicArray<InstancedVertex> dynamicArray = new();
67 DynamicArray<int> dynamicArray2 = new();
68 for (int i = 0; i < meshDrawOrders.Length; i++) {
69 ModelMesh modelMesh = model.Meshes[meshDrawOrders[i]];
70 foreach (ModelMeshPart meshPart in modelMesh.MeshParts) {
71 _ = dynamicArray.Count;
72 VertexBuffer vertexBuffer = meshPart.VertexBuffer;
73 IndexBuffer indexBuffer = meshPart.IndexBuffer;
74 ReadOnlyList<VertexElement> vertexElements = vertexBuffer.VertexDeclaration.VertexElements;
75 int[] indexData = BlockMesh.GetIndexData<int>(indexBuffer);
76 Dictionary<int, int> dictionary = new();
77 if (vertexElements.Count != 3
78 || vertexElements[0].Offset != 0
79 || !(vertexElements[0].Semantic == VertexElementSemantic.Position.GetSemanticString())
80 || vertexElements[1].Offset != 12
81 || !(vertexElements[1].Semantic == VertexElementSemantic.Normal.GetSemanticString())
82 || vertexElements[2].Offset != 24
83 || !(vertexElements[2].Semantic == VertexElementSemantic.TextureCoordinate.GetSemanticString())) {
84 throw new InvalidOperationException("Unsupported vertex format.");
85 }
86 SourceModelVertex[] vertexData = BlockMesh.GetVertexData<SourceModelVertex>(vertexBuffer);
87 for (int j = meshPart.StartIndex; j < meshPart.StartIndex + meshPart.IndicesCount; j++) {
88 int num = indexData[j];
89 if (!dictionary.ContainsKey(num)) {
90 dictionary.Add(num, dynamicArray.Count);
91 InstancedVertex item = default;
92 SourceModelVertex sourceModelVertex = vertexData[num];
93 item.X = sourceModelVertex.X;
94 item.Y = sourceModelVertex.Y;
95 item.Z = sourceModelVertex.Z;
96 item.Nx = sourceModelVertex.Nx;
97 item.Ny = sourceModelVertex.Ny;
98 item.Nz = sourceModelVertex.Nz;
99 item.Tx = sourceModelVertex.Tx;
100 item.Ty = sourceModelVertex.Ty;
101 item.Instance = modelMesh.ParentBone.Index;
102 dynamicArray.Add(item);
103 }
104 }
105 for (int k = 0; k < meshPart.IndicesCount / 3; k++) {
106 dynamicArray2.Add(dictionary[indexData[meshPart.StartIndex + 3 * k]]);
107 dynamicArray2.Add(dictionary[indexData[meshPart.StartIndex + 3 * k + 1]]);
108 dynamicArray2.Add(dictionary[indexData[meshPart.StartIndex + 3 * k + 2]]);
109 }
110 }
111 }
112 InstancedModelData instancedModelData = new() {
114 IndexBuffer = new IndexBuffer(IndexFormat.ThirtyTwoBits, dynamicArray2.Count)
115 };
116 instancedModelData.VertexBuffer.SetData(dynamicArray.Array, 0, dynamicArray.Count);
117 instancedModelData.IndexBuffer.SetData(dynamicArray2.Array, 0, dynamicArray2.Count);
118 return instancedModelData;
119 }
120 }
121}
ReadOnlyList< ModelMesh > Meshes
ReadOnlyList< VertexElement > VertexElements
static readonly VertexDeclaration VertexDeclaration
static InstancedModelData CreateInstancedModelData(Model model, int[] meshDrawOrders)
static InstancedModelData GetInstancedModelData(Model model, int[] meshDrawOrders)
static Dictionary< Model, InstancedModelData > m_cache