void AddNativeData(Extension_0003 extension, List <string> MaterialStream) { NativeDataGC n = null; foreach (RWSection rw in extension.extensionSectionList) { if (rw is BinMeshPLG_050E binmesh) { if (binmesh.numMeshes == 0) { return; } } if (rw is NativeDataPLG_0510 native) { n = native.nativeDataStruct.nativeData; break; } } if (n == null) { throw new Exception(ChunkName + ChunkNumber.ToString()); } List <Vertex3> vertexList1 = new List <Vertex3>(); List <RenderWareFile.Color> colorList = new List <RenderWareFile.Color>(); List <TextCoord> textCoordList = new List <TextCoord>(); foreach (Declaration d in n.declarations) { foreach (object o in d.entryList) { if (o is Vertex3 v) { vertexList1.Add(v); } else if (o is RenderWareFile.Color c) { colorList.Add(c); } else if (o is TextCoord t) { textCoordList.Add(t); } else { throw new Exception(); } } } List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>(); List <int> indexList = new List <int>(); int k = 0; int previousAmount = 0; List <SharpSubSet> subSetList = new List <SharpSubSet>(); foreach (TriangleDeclaration td in n.triangleDeclarations) { foreach (TriangleList tl in td.TriangleListList) { foreach (int[] objectList in tl.entries) { VertexColoredTextured v = new VertexColoredTextured(); for (int j = 0; j < objectList.Count(); j++) { if (n.declarations[j].declarationType == Declarations.Vertex) { v.Position.X = vertexList1[objectList[j]].X; v.Position.Y = vertexList1[objectList[j]].Y; v.Position.Z = vertexList1[objectList[j]].Z; } else if (n.declarations[j].declarationType == Declarations.Color) { v.Color = new SharpDX.Color(colorList[objectList[j]].R, colorList[objectList[j]].G, colorList[objectList[j]].B, colorList[objectList[j]].A); } else if (n.declarations[j].declarationType == Declarations.TextCoord) { v.TextureCoordinate.X = textCoordList[objectList[j]].X; v.TextureCoordinate.Y = textCoordList[objectList[j]].Y; } } vertexList.Add(v); indexList.Add(k); k++; this.vertexList.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z)); } if (BSPRenderer.TextureStream.ContainsKey(MaterialStream[td.MaterialIndex])) { subSetList.Add(new SharpSubSet(previousAmount, vertexList.Count() - previousAmount, BSPRenderer.TextureStream[MaterialStream[td.MaterialIndex]])); } else { subSetList.Add(new SharpSubSet(previousAmount, vertexList.Count() - previousAmount, BSPRenderer.whiteDefault)); } previousAmount = vertexList.Count(); } } if (vertexList.Count > 0) { meshList.Add(SharpMesh.Create(SharpRenderer.device, vertexList.ToArray(), indexList.ToArray(), subSetList, SharpDX.Direct3D.PrimitiveTopology.TriangleStrip)); } }
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)); } }
private void AddGeometry(SharpDevice device, Geometry_000F g, Matrix transformMatrix) { 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 & GeometryFlags2.isNativeGeometry) != 0) { AddNativeData(device, g.geometryExtension, MaterialList, transformMatrix); return; } List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>(); if ((g.geometryStruct.geometryFlags & GeometryFlags.hasVertexPositions) != 0) { foreach (Vertex3 v in g.geometryStruct.morphTargets[0].vertices) { Vector3 Position = (Vector3)Vector3.Transform(new Vector3(v.X, v.Y, v.Z), transformMatrix); vertexList.Add(new VertexColoredTextured(Position, new Vector2(), SharpDX.Color.White)); vertexListG.Add(Position); } } if ((g.geometryStruct.geometryFlags & 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 & GeometryFlags.hasTextCoords) != 0) { for (int i = 0; i < vertexList.Count; i++) { Vertex2 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(new Triangle(t.materialIndex, (ushort)(t.vertex1 + triangleListOffset), (ushort)(t.vertex2 + triangleListOffset), (ushort)(t.vertex3 + triangleListOffset))); } } if (indexList.Count - previousIndexCount > 0) { SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount, TextureManager.GetTextureFromDictionary(MaterialList[i]), MaterialList[i])); } previousIndexCount = indexList.Count(); } triangleListOffset += vertexList.Count; if (SubsetList.Count > 0) { meshList.Add(SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), SubsetList)); } }
void AddAtomic(SharpDevice device, AtomicSector_0009 AtomicSector) { if (AtomicSector.atomicSectorStruct.isNativeData) { AddNativeData(device, AtomicSector.atomicSectorExtension, MaterialList, Matrix.Identity); return; } List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>(); foreach (Vertex3 v in AtomicSector.atomicSectorStruct.vertexArray) { vertexList.Add(new VertexColoredTextured(new Vector3(v.X, v.Y, v.Z), new Vector2(), new SharpDX.Color())); vertexListG.Add(new Vector3(v.X, v.Y, v.Z)); } if (!isShadowCollision) { for (int i = 0; i < vertexList.Count; i++) { RenderWareFile.Color c = AtomicSector.atomicSectorStruct.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++) { Vertex2 tc = AtomicSector.atomicSectorStruct.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.atomicSectorStruct.triangleArray.Length; j++) // each (Triangle t in AtomicSector.atomicStruct.triangleArray) { Triangle t = AtomicSector.atomicSectorStruct.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(new Triangle(t.materialIndex, (ushort)(t.vertex1 + triangleListOffset), (ushort)(t.vertex2 + triangleListOffset), (ushort)(t.vertex3 + triangleListOffset))); } } if (indexList.Count - previousIndexCount > 0) { SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount, TextureManager.GetTextureFromDictionary(MaterialList[i]), MaterialList[i])); } previousIndexCount = indexList.Count(); } triangleListOffset += AtomicSector.atomicSectorStruct.vertexArray.Length; if (SubsetList.Count > 0) { meshList.Add(SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), SubsetList)); } }
private void AddGeometry(SharpDevice device, Geometry_000F g, Matrix transformMatrix) { List <string> materialList = new List <string>(); foreach (Material_0007 m in g.materialList.materialList) { if (m.texture != null) { string textureName = m.texture.diffuseTextureName.stringString; materialList.Add(textureName); } else { materialList.Add(DefaultTexture); } } if ((g.geometryStruct.geometryFlags2 & GeometryFlags2.isNativeGeometry) != 0) { AddNativeData(device, g.geometryExtension, materialList, transformMatrix); return; } List <Vector3> vertexList1 = new List <Vector3>(); List <Vector3> normalList = new List <Vector3>(); List <Vector2> textCoordList = new List <Vector2>(); List <SharpDX.Color> colorList = new List <SharpDX.Color>(); if ((g.geometryStruct.geometryFlags & GeometryFlags.hasVertexPositions) != 0) { MorphTarget m = g.geometryStruct.morphTargets[0]; foreach (Vertex3 v in m.vertices) { Vector3 pos = (Vector3)Vector3.Transform(new Vector3(v.X, v.Y, v.Z), transformMatrix); vertexList1.Add(pos); vertexListG.Add(pos); } } if ((g.geometryStruct.geometryFlags & GeometryFlags.hasNormals) != 0) { for (int i = 0; i < vertexList1.Count; i++) { normalList.Add(new Vector3(g.geometryStruct.morphTargets[0].normals[i].X, g.geometryStruct.morphTargets[0].normals[i].Y, g.geometryStruct.morphTargets[0].normals[i].Z)); } } if ((g.geometryStruct.geometryFlags & GeometryFlags.hasVertexColors) != 0) { for (int i = 0; i < vertexList1.Count; i++) { RenderWareFile.Color c = g.geometryStruct.vertexColors[i]; colorList.Add(new SharpDX.Color(c.R, c.G, c.B, c.A)); } } else { for (int i = 0; i < vertexList1.Count; i++) { colorList.Add(new SharpDX.Color(1f, 1f, 1f, 1f)); } } if ((g.geometryStruct.geometryFlags & GeometryFlags.hasTextCoords) != 0) { for (int i = 0; i < vertexList1.Count; i++) { Vertex2 tc = g.geometryStruct.textCoords[i]; textCoordList.Add(new Vector2(tc.X, tc.Y)); } } else { for (int i = 0; i < vertexList1.Count; i++) { textCoordList.Add(new Vector2()); } } 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(new Triangle(t.materialIndex, (ushort)(t.vertex1 + triangleListOffset), (ushort)(t.vertex2 + triangleListOffset), (ushort)(t.vertex3 + triangleListOffset))); } } if (indexList.Count - previousIndexCount > 0) { SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount, TextureManager.GetTextureFromDictionary(materialList[i]), materialList[i])); } previousIndexCount = indexList.Count(); } triangleListOffset += vertexList1.Count; if (SubsetList.Count > 0) { VertexColoredTextured[] vertices = new VertexColoredTextured[vertexList1.Count]; for (int i = 0; i < vertices.Length; i++) { vertices[i] = new VertexColoredTextured(vertexList1[i], textCoordList[i], colorList[i]); } meshList.Add(SharpMesh.Create(device, vertices, indexList.ToArray(), SubsetList)); } }