void AddGeometry(Geometry_000F g) { List <string> MaterialList = new List <string>(); foreach (Material_0007 m in g.materialList.materialList) { if (m.texture != null) { string textureName = m.texture.diffuseTextureName.stringString; if (!MaterialList.Contains(textureName)) { MaterialList.Add(textureName); } } else { MaterialList.Add(DefaultTexture); } } if (g.geometryStruct.geometryFlags2 == 0x0101) { AddNativeData(g.geometryExtension, MaterialList); return; } List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>(); if ((g.geometryStruct.geometryFlags & (int)GeometryFlags.hasVertexPositions) != 0) { foreach (Vertex3 v in g.geometryStruct.morphTargets[0].vertices) { vertexList.Add(new VertexColoredTextured(new Vector3(v.X, v.Y, v.Z), new Vector2(), SharpDX.Color.White )); this.vertexList.Add(new Vector3(v.X, v.Y, v.Z)); } } if ((g.geometryStruct.geometryFlags & (int)GeometryFlags.hasVertexColors) != 0) { for (int i = 0; i < vertexList.Count; i++) { RenderWareFile.Color c = g.geometryStruct.vertexColors[i]; VertexColoredTextured v = vertexList[i]; v.Color = new SharpDX.Color(c.R, c.G, c.B, c.A); vertexList[i] = v; } } else { for (int i = 0; i < vertexList.Count; i++) { VertexColoredTextured v = vertexList[i]; v.Color = SharpDX.Color.White; vertexList[i] = v; } } if ((g.geometryStruct.geometryFlags & (int)GeometryFlags.hasTextCoords) != 0) { for (int i = 0; i < vertexList.Count; i++) { TextCoord tc = g.geometryStruct.textCoords[i]; VertexColoredTextured v = vertexList[i]; v.TextureCoordinate = new Vector2(tc.X, tc.Y); vertexList[i] = v; } } List <SharpSubSet> SubsetList = new List <SharpSubSet>(); List <int> indexList = new List <int>(); int previousIndexCount = 0; for (int i = 0; i < MaterialList.Count; i++) { foreach (Triangle t in g.geometryStruct.triangles) { if (t.materialIndex == i) { indexList.Add(t.vertex1); indexList.Add(t.vertex2); indexList.Add(t.vertex3); triangleList.Add(t); } } if (indexList.Count - previousIndexCount > 0) { if (BSPRenderer.TextureStream.ContainsKey(MaterialList[i])) { SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount, BSPRenderer.TextureStream[MaterialList[i]])); } else { SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount, BSPRenderer.whiteDefault)); } } previousIndexCount = indexList.Count(); } if (SubsetList.Count > 0) { meshList.Add(SharpMesh.Create(SharpRenderer.device, vertexList.ToArray(), indexList.ToArray(), SubsetList)); } }
void AddAtomic(AtomicSector_0009 AtomicSector) { if (AtomicSector.atomicStruct.isNativeData) { AddNativeData(AtomicSector.atomicExtension, MaterialList); return; } List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>(); foreach (Vertex3 v in AtomicSector.atomicStruct.vertexArray) { vertexList.Add(new VertexColoredTextured(new Vector3(v.X, v.Y, v.Z), new Vector2(), new SharpDX.Color())); this.vertexList.Add(new Vector3(v.X, v.Y, v.Z)); } if (!isShadowCollision) { for (int i = 0; i < vertexList.Count; i++) { RenderWareFile.Color c = AtomicSector.atomicStruct.colorArray[i]; VertexColoredTextured v = vertexList[i]; v.Color = new SharpDX.Color(c.R, c.G, c.B, c.A); vertexList[i] = v; } for (int i = 0; i < vertexList.Count; i++) { TextCoord tc = AtomicSector.atomicStruct.uvArray[i]; VertexColoredTextured v = vertexList[i]; v.TextureCoordinate = new Vector2(tc.X, tc.Y); vertexList[i] = v; } } List <SharpSubSet> SubsetList = new List <SharpSubSet>(); List <int> indexList = new List <int>(); int previousIndexCount = 0; for (int i = 0; i < MaterialList.Count; i++) { for (int j = 0; j < AtomicSector.atomicStruct.triangleArray.Length; j++) // each (Triangle t in AtomicSector.atomicStruct.triangleArray) { Triangle t = AtomicSector.atomicStruct.triangleArray[j]; if (t.materialIndex == i) { indexList.Add(t.vertex1); indexList.Add(t.vertex2); indexList.Add(t.vertex3); if (isShadowCollision) { RenderWareFile.Color c = RenderWareFile.Color.FromString(MaterialList[i]); SharpDX.Color color = new SharpDX.Color(c.R, c.G, c.B, c.A); VertexColoredTextured v1 = vertexList[t.vertex1]; v1.Color = color; vertexList[t.vertex1] = v1; VertexColoredTextured v2 = vertexList[t.vertex2]; v2.Color = color; vertexList[t.vertex2] = v2; VertexColoredTextured v3 = vertexList[t.vertex3]; v3.Color = color; vertexList[t.vertex3] = v3; } triangleList.Add(t); } } if (indexList.Count - previousIndexCount > 0) { if (BSPRenderer.TextureStream.ContainsKey(MaterialList[i])) { SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount, BSPRenderer.TextureStream[MaterialList[i]])); } else { SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount, BSPRenderer.whiteDefault)); } } previousIndexCount = indexList.Count(); } if (SubsetList.Count > 0) { meshList.Add(SharpMesh.Create(SharpRenderer.device, vertexList.ToArray(), indexList.ToArray(), SubsetList)); } }