void AddAsteroidToBuffer(StaticAsteroid ast, Material mat, bool singleMat) { var model = ast.Drawable as ModelFile; var l0 = model.Levels[0]; var vertType = l0.Mesh.VertexBuffer.VertexType.GetType(); var transform = ast.RotationMatrix * Matrix4.CreateTranslation(ast.Position * field.CubeSize); var norm = transform; norm.Invert(); norm.Transpose(); int vertOffset = verts.Count; for (int i = 0; i < l0.Mesh.VertexCount; i++) { VertexPositionNormalDiffuseTexture vert; if (vertType == typeof(VertexPositionNormalDiffuseTexture)) { vert = l0.Mesh.verticesVertexPositionNormalDiffuseTexture[i]; } else if (vertType == typeof(VertexPositionNormalTexture)) { var v = l0.Mesh.verticesVertexPositionNormalTexture[i]; vert = new VertexPositionNormalDiffuseTexture( v.Position, v.Normal, (uint)Color4.White.ToArgb(), v.TextureCoordinate); } else if (vertType == typeof(VertexPositionNormalTextureTwo)) { var v = l0.Mesh.verticesVertexPositionNormalTextureTwo[i]; vert = new VertexPositionNormalDiffuseTexture( v.Position, v.Normal, (uint)Color4.White.ToArgb(), v.TextureCoordinate); } else if (vertType == typeof(VertexPositionNormalDiffuseTextureTwo)) { var v = l0.Mesh.verticesVertexPositionNormalDiffuseTextureTwo[i]; vert = new VertexPositionNormalDiffuseTexture( v.Position, v.Normal, v.Diffuse, v.TextureCoordinate); } else { throw new NotImplementedException("Asteroids: " + vertType.FullName); } vert.Position = VectorMath.Transform(vert.Position, transform); vert.Normal = (norm * new Vector4(vert.Normal, 0)).Xyz; verts.Add(vert); } for (int i = l0.StartMesh; i < l0.StartMesh + l0.MeshCount; i++) { var m = l0.Mesh.Meshes[i]; if (m.Material != mat && !singleMat) { continue; } var baseVertex = vertOffset + l0.StartVertex + m.StartVertex; int indexStart = m.TriangleStart; int indexCount = m.NumRefVertices; for (int j = indexStart; j < indexStart + indexCount; j++) { var idx = baseVertex + l0.Mesh.Indices[j]; if (idx > ushort.MaxValue) { throw new Exception(); } indices.Add((ushort)idx); } } }
public VMeshData(byte[] data, ILibFile materialLibrary, string name) { if (data == null) { throw new ArgumentNullException("data"); } if (materialLibrary == null) { throw new ArgumentNullException("materialLibrary"); } vmsname = name; ready = false; using (BinaryReader reader = new BinaryReader(new MemoryStream(data))) { // Read the data header. MeshType = reader.ReadUInt32(); SurfaceType = reader.ReadUInt32(); MeshCount = reader.ReadUInt16(); IndexCount = reader.ReadUInt16(); FlexibleVertexFormat = (D3DFVF)reader.ReadUInt16(); OriginalFVF = FlexibleVertexFormat; VertexCount = reader.ReadUInt16(); // Read the mesh headers. Meshes = new List <TMeshHeader>(); int triangleStartOffset = 0; for (int count = 0; count < MeshCount; count++) { TMeshHeader item = new TMeshHeader(reader, triangleStartOffset, materialLibrary); triangleStartOffset += item.NumRefVertices; Meshes.Add(item); } // Read the triangle data Indices = new ushort[IndexCount]; for (int i = 0; i < IndexCount; i++) { Indices[i] = reader.ReadUInt16(); } // Read the vertex data. // The FVF defines what fields are included for each vertex. switch (FlexibleVertexFormat) { case D3DFVF.XYZ: //(D3DFVF)0x0002: verticesVertexPosition = new VertexPosition[VertexCount]; for (int i = 0; i < VertexCount; i++) { verticesVertexPosition[i] = new VertexPosition(reader); } break; case D3DFVF.XYZ | D3DFVF.NORMAL: //(D3DFVF)0x0012: verticesVertexPositionNormal = new VertexPositionNormal[VertexCount]; for (int i = 0; i < VertexCount; i++) { verticesVertexPositionNormal[i] = new VertexPositionNormal(reader); } break; case D3DFVF.XYZ | D3DFVF.TEX1: //(D3DFVF)0x0102: verticesVertexPositionNormalTexture = new VertexPositionNormalTexture[VertexCount]; for (int i = 0; i < VertexCount; i++) { Vector3 position = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Vector2 textureCoordinate = new Vector2(reader.ReadSingle(), 1 - reader.ReadSingle()); verticesVertexPositionNormalTexture[i] = new VertexPositionNormalTexture(position, Vector3.One, textureCoordinate); } FlexibleVertexFormat |= D3DFVF.NORMAL; break; case D3DFVF.XYZ | D3DFVF.NORMAL | D3DFVF.TEX1: //(D3DFVF)0x0112: verticesVertexPositionNormalTexture = new VertexPositionNormalTexture[VertexCount]; for (int i = 0; i < VertexCount; i++) { Vector3 position = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Vector3 normal = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Vector2 textureCoordinate = new Vector2(reader.ReadSingle(), 1 - reader.ReadSingle()); verticesVertexPositionNormalTexture[i] = new VertexPositionNormalTexture(position, normal, textureCoordinate); } break; case D3DFVF.XYZ | D3DFVF.DIFFUSE | D3DFVF.TEX1: //(D3DFVF)0x0142: verticesVertexPositionNormalDiffuseTexture = new VertexPositionNormalDiffuseTexture[VertexCount]; Diffuse = new uint[VertexCount]; for (int i = 0; i < VertexCount; i++) { Vector3 position = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Diffuse[i] = reader.ReadUInt32(); Vector2 textureCoordinate = new Vector2(reader.ReadSingle(), 1 - reader.ReadSingle()); verticesVertexPositionNormalDiffuseTexture[i] = new VertexPositionNormalDiffuseTexture(position, Vector3.One, Diffuse[i], textureCoordinate); } FlexibleVertexFormat |= D3DFVF.NORMAL; break; case D3DFVF.XYZ | D3DFVF.NORMAL | D3DFVF.DIFFUSE | D3DFVF.TEX1: //(D3DFVF)0x0152: verticesVertexPositionNormalDiffuseTexture = new VertexPositionNormalDiffuseTexture[VertexCount]; Diffuse = new uint[VertexCount]; for (int i = 0; i < VertexCount; i++) { var position = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); var normal = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Diffuse[i] = reader.ReadUInt32(); Vector2 textureCoordinate = new Vector2(reader.ReadSingle(), 1 - reader.ReadSingle()); verticesVertexPositionNormalDiffuseTexture[i] = new VertexPositionNormalDiffuseTexture(position, normal, Diffuse[i], textureCoordinate); } break; case D3DFVF.XYZ | D3DFVF.NORMAL | D3DFVF.TEX2: //(D3DFVF)0x0212: verticesVertexPositionNormalTextureTwo = new VertexPositionNormalTextureTwo[VertexCount]; for (int i = 0; i < VertexCount; i++) { verticesVertexPositionNormalTextureTwo[i] = new VertexPositionNormalTextureTwo(reader); } break; case D3DFVF.XYZ | D3DFVF.NORMAL | D3DFVF.DIFFUSE | D3DFVF.TEX2: //(D3DFVF)0x0252: verticesVertexPositionNormalDiffuseTextureTwo = new VertexPositionNormalDiffuseTextureTwo[VertexCount]; for (int i = 0; i < VertexCount; i++) { verticesVertexPositionNormalDiffuseTextureTwo[i] = new VertexPositionNormalDiffuseTextureTwo(reader); } break; /*case D3DFVF.XYZ | D3DFVF.NORMAL | D3DFVF.TEX4: //(D3DFVF)0x0412: * for (int i = 0; i < VertexCount; i++) vertices[i] = new VertexPositionNormalTextureTangentBinormal(reader); * break;*/ default: throw new FileContentException("UTF:VMeshData", "FVF 0x" + FlexibleVertexFormat + " not supported."); } } }
void AddAsteroidToBuffer(StaticAsteroid ast, Material mat, bool singleMat) { var model = (ModelFile)ast.Drawable.LoadFile(sys.ResourceManager); model.Initialize(sys.ResourceManager); var l0 = model.Levels[0]; var vertType = l0.Mesh.VertexBuffer.VertexType.GetType(); var transform = ast.RotationMatrix * Matrix4x4.CreateTranslation(ast.Position * field.CubeSize); var norm = transform; Matrix4x4.Invert(norm, out norm); norm = Matrix4x4.Transpose(norm); int vertOffset = verts.Count; for (int i = 0; i < l0.Mesh.VertexCount; i++) { VertexPositionNormalDiffuseTexture vert; if (vertType == typeof(VertexPositionNormalDiffuseTexture)) { vert = l0.Mesh.verticesVertexPositionNormalDiffuseTexture[i]; } else if (vertType == typeof(VertexPositionNormalTexture)) { var v = l0.Mesh.verticesVertexPositionNormalTexture[i]; vert = new VertexPositionNormalDiffuseTexture( v.Position, v.Normal, (uint)Color4.White.ToAbgr(), v.TextureCoordinate); } else if (vertType == typeof(VertexPositionNormalTextureTwo)) { var v = l0.Mesh.verticesVertexPositionNormalTextureTwo[i]; vert = new VertexPositionNormalDiffuseTexture( v.Position, v.Normal, (uint)Color4.White.ToAbgr(), v.TextureCoordinate); } else if (vertType == typeof(VertexPositionNormalDiffuseTextureTwo)) { var v = l0.Mesh.verticesVertexPositionNormalDiffuseTextureTwo[i]; vert = new VertexPositionNormalDiffuseTexture( v.Position, v.Normal, v.Diffuse, v.TextureCoordinate); } else { FLLog.Error("Render", "Asteroids: " + vertType.FullName + " not support"); return; } vert.Position = Vector3.Transform(vert.Position, transform); cubeRadius = Math.Max(cubeRadius, vert.Position.Length()); vert.Normal = Vector3.TransformNormal(vert.Normal, norm); verts.Add(vert); } for (int i = l0.StartMesh; i < l0.StartMesh + l0.MeshCount; i++) { var m = l0.Mesh.Meshes[i]; if (m.Material != mat && !singleMat) { continue; } var baseVertex = vertOffset + l0.StartVertex + m.StartVertex; int indexStart = m.TriangleStart; int indexCount = m.NumRefVertices; for (int j = indexStart; j < indexStart + indexCount; j++) { var idx = baseVertex + l0.Mesh.Indices[j]; if (idx > ushort.MaxValue) { throw new Exception(); } indices.Add((ushort)idx); } } }