void AddAsteroidToBuffer(StaticAsteroid ast, Material mat) { 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++) { VertexPositionNormalColorTexture vert; if (vertType == typeof(VertexPositionNormalColorTexture)) { vert = l0.Mesh.verticesVertexPositionNormalColorTexture[i]; } else if (vertType == typeof(VertexPositionNormalTexture)) { var v = l0.Mesh.verticesVertexPositionNormalTexture[i]; vert = new VertexPositionNormalColorTexture( v.Position, v.Normal, Color4.White, v.TextureCoordinate); } else if (vertType == typeof(VertexPositionNormalTextureTwo)) { var v = l0.Mesh.verticesVertexPositionNormalTextureTwo[i]; vert = new VertexPositionNormalColorTexture( v.Position, v.Normal, Color4.White, v.TextureCoordinate); } else if (vertType == typeof(VertexPositionNormalDiffuseTextureTwo)) { var v = l0.Mesh.verticesVertexPositionNormalDiffuseTextureTwo[i]; vert = new VertexPositionNormalColorTexture( 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]; 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); } } }
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.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 = Vector3.Transform(vert.Position, transform); 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); } } }