/// <summary> /// Performs further custom initialization for this instance. /// </summary> protected override void Initialize() { base.Initialize(); VertexPositionNormalColorTexture[] vertices = new VertexPositionNormalColorTexture[3]; vertices[0].Position = new Vector3(-0.5f, -0.5f, 0f); vertices[0].Color = Color.Red; vertices[0].TexCoord = new Vector2(0, 1); vertices[1].Position = new Vector3(0f, 0.5f, 0f); vertices[1].Color = Color.Green; vertices[1].TexCoord = new Vector2(0.5f, 0); vertices[2].Position = new Vector3(0.5f, -0.5f, 0f); vertices[2].Color = Color.Yellow; vertices[2].TexCoord = new Vector2(1, 1); var vertexBuffer = new VertexBuffer(VertexPositionNormalColorTexture.VertexFormat); vertexBuffer.SetData(vertices, 3); ushort[] indices = new ushort[3]; indices[0] = 0; indices[1] = 1; indices[2] = 2; var indexBuffer = new IndexBuffer(indices); this.mesh = new Mesh(0, vertices.Length, 0, 1, vertexBuffer, indexBuffer, PrimitiveType.TriangleList); }
public override VertexPositionNormalColorTexture[] Render(BlockDescriptor descriptor, Vector3 offset, VisibleFaces faces, Tuple<int, int> textureMap, int indiciesOffset, out int[] indicies) { // This is similar to how wheat is rendered indicies = new int[5 * 6]; var verticies = new VertexPositionNormalColorTexture[5 * 6]; int[] _indicies; var center = new Vector3(-0.5f, -0.5f, -0.5f); CubeFace side; VertexPositionNormalColorTexture[] quad; for (int _side = 0; _side < 4; _side++) { side = (CubeFace)_side; quad = CreateQuad(side, center, Texture, 0, indiciesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (int i = 0; i < quad.Length; i++) { quad[i].Position.X *= 14f / 16f; quad[i].Position += offset; } } else { for (int i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 14f / 16f; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, _side * 4, 4); Array.Copy(_indicies, 0, indicies, _side * 6, 6); } side = CubeFace.PositiveY; quad = CreateQuad(side, center, TopTexture, 0, indiciesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (int i = 0; i < quad.Length; i++) { quad[i].Position.X *= 14f / 16f; quad[i].Position += offset; } } else { for (int i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 14f / 16f; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, (int)side * 4, 4); Array.Copy(_indicies, 0, indicies, (int)side * 6, 6); for (int i = 0; i < verticies.Length; i++) { verticies[i].Position.Y -= 1 / 16f; verticies[i].Position -= center; } return verticies; }
void AddMesh(int x, int y, int z, ref Color color, MeshPart source, ChunkVertices destination) { foreach (var index in source.Indices) { destination.AddIndex(index); } var vertices = source.Vertices; for (int i = 0; i < vertices.Length; i++) { var sourceVertex = vertices[i]; var vertex = new VertexPositionNormalColorTexture { Position = sourceVertex.Position, Normal = sourceVertex.Normal, Color = color, TextureCoordinate = sourceVertex.TextureCoordinate }; // ブロック位置へ移動。 vertex.Position.X += x; vertex.Position.Y += y; vertex.Position.Z += z; // ブロックの MeshPart はその中心に原点があるため、半ブロック移動。 vertex.Position += blockMeshOffset; // チャンク メッシュはメッシュの中心位置を原点とするため、半メッシュ移動。 vertex.Position -= meshManager.MeshOffset; destination.AddVertex(ref vertex); } }
public override void Setup(GraphicsDevice graphicsDevice) { var atlas = SetupTextureAtlas(graphicsDevice); var opaqueVertices = new List <VertexPositionNormalColorTexture>(); var transparentVertices = new List <VertexPositionNormalColorTexture>(); foreach (var staticModel in Models) { foreach (var triangle in staticModel.ModelTriangles) { var rec = triangle.AtlasTextureRectangle; var maxT = new Vector2(atlas.Width, atlas.Height); var vertices = triangle.OriginalVertices; var indices = triangle.OriginalIndices; for (int i = 0; i < 3; i++) { var vertex = vertices[i]; var index = indices[i]; var position = Vector3.Transform(vertex.Position, staticModel.WorldMatrix); var normal = Vector3.TransformNormal(vertex.Normal, staticModel.WorldMatrix); var color = staticModel.Entity.Shader; color.A *= (byte)staticModel.Entity.Opacity; var textCoord = new Vector2( vertex.TextureCoordinate.X == 0 ? rec.X / maxT.X : (rec.X + vertex.TextureCoordinate.X * rec.Width) / maxT.X, vertex.TextureCoordinate.Y == 0 ? rec.Y / maxT.Y : (rec.Y + vertex.TextureCoordinate.Y * rec.Height) / maxT.Y); var vertexNew = new VertexPositionNormalColorTexture(position, normal, color, textCoord); if (staticModel.HasTransparentPixels) { transparentVertices.Add(vertexNew); } else { opaqueVertices.Add(vertexNew); } } } } if (opaqueVertices.Any()) { StaticOpaqueRenderer = new OpaqueVertexRenderer(opaqueVertices, new List <int>(), atlas); StaticOpaqueRenderer.Setup(graphicsDevice); } if (transparentVertices.Any()) { StaticTransparentRenderer = new TransparentVertexRenderer(transparentVertices, new List <int>(), atlas); StaticTransparentRenderer.Setup(graphicsDevice); } }
/// <summary> /// 頂点を追加します。 /// </summary> /// <param name="vertex">頂点。</param> public void AddVertex(ref VertexPositionNormalColorTexture vertex) { vertices[VertexCount++] = vertex; // AABB を更新。 Vector3.Max(ref box.Max, ref vertex.Position, out box.Max); Vector3.Min(ref box.Min, ref vertex.Position, out box.Min); }
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(); 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.Zero, textureCoordinate); } CalculateNormals(verticesVertexPositionNormalTexture); 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: verticesVertexPositionNormalColorTexture = new VertexPositionNormalColorTexture[VertexCount]; for (int i = 0; i < VertexCount; i++) { Vector3 position = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); int r = reader.ReadByte(); int g = reader.ReadByte(); int b = reader.ReadByte(); int a = reader.ReadByte(); Color4 diffuse = new Color4(r / 255f, g / 255f, b / 255f, a / 255f); Vector2 textureCoordinate = new Vector2(reader.ReadSingle(), 1 - reader.ReadSingle()); verticesVertexPositionNormalColorTexture[i] = new VertexPositionNormalColorTexture(position, Vector3.Zero, diffuse, textureCoordinate); } FlexibleVertexFormat |= D3DFVF.NORMAL; CalculateNormals(verticesVertexPositionNormalColorTexture); break; case D3DFVF.XYZ | D3DFVF.NORMAL | D3DFVF.DIFFUSE | D3DFVF.TEX1: //(D3DFVF)0x0152: verticesVertexPositionNormalColorTexture = new VertexPositionNormalColorTexture[VertexCount]; for (int i = 0; i < VertexCount; i++) { //verticesVertexPositionNormalDiffuseTexture[i] = new VertexPositionNormalDiffuseTexture(reader); var position = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); var normal = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); int r = reader.ReadByte(); int g = reader.ReadByte(); int b = reader.ReadByte(); int a = reader.ReadByte(); Color4 diffuse = new Color4(r / 255f, g / 255f, b / 255f, a / 255f); Vector2 textureCoordinate = new Vector2(reader.ReadSingle(), 1 - reader.ReadSingle()); verticesVertexPositionNormalColorTexture[i] = new VertexPositionNormalColorTexture(position, normal, diffuse, 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."); } } }
/// <summary> /// Performs further custom initialization for this instance. /// </summary> protected override void Initialize() { base.Initialize(); VertexPositionNormalColorTexture[] vertices = new VertexPositionNormalColorTexture[3]; vertices[0].Position = new Vector3(-0.5f, -0.5f, 0f); vertices[0].Color = Color.Red; vertices[0].TexCoord = new Vector2(0, 1); vertices[1].Position = new Vector3(0f, 0.5f, 0f); vertices[1].Color = Color.Green; vertices[1].TexCoord = new Vector2(0.5f, 0); vertices[2].Position = new Vector3(0.5f, -0.5f, 0f); vertices[2].Color = Color.Yellow; vertices[2].TexCoord = new Vector2(1, 1); var vertexBuffer = new VertexBuffer(VertexPositionNormalColorTexture.VertexFormat); vertexBuffer.SetData(vertices, 3); ushort[] indices = new ushort[3]; indices[0] = 0; indices[1] = 1; indices[2] = 2; var indexBuffer = new IndexBuffer(indices); this.mesh = new Mesh(0, vertices.Length, 0, 1, vertexBuffer, indexBuffer, PrimitiveType.TriangleList); }
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); } } }
public override VertexPositionNormalColorTexture[] Render(BlockDescriptor descriptor, Vector3 offset, VisibleFaces faces, Tuple <int, int> textureMap, int indicesOffset, out int[] indices) { // This is similar to how wheat is rendered indices = new int[5 * 6]; var verticies = new VertexPositionNormalColorTexture[5 * 6]; int[] _indicies; var center = new Vector3(-0.5f, -0.5f, -0.5f); CubeFace side; VertexPositionNormalColorTexture[] quad; for (var _side = 0; _side < 4; _side++) { side = (CubeFace)_side; quad = CreateQuad(side, center, Texture, 0, indicesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (var i = 0; i < quad.Length; i++) { quad[i].Position.X *= 14f / 16f; quad[i].Position += offset; } } else { for (var i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 14f / 16f; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, _side * 4, 4); Array.Copy(_indicies, 0, indices, _side * 6, 6); } side = CubeFace.PositiveY; quad = CreateQuad(side, center, TopTexture, 0, indicesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (var i = 0; i < quad.Length; i++) { quad[i].Position.X *= 14f / 16f; quad[i].Position += offset; } } else { for (var i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 14f / 16f; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, (int)side * 4, 4); Array.Copy(_indicies, 0, indices, (int)side * 6, 6); for (var i = 0; i < verticies.Length; i++) { verticies[i].Position.Y -= 1 / 16f; verticies[i].Position -= center; } return(verticies); }
public override VertexPositionNormalColorTexture[] Render(BlockDescriptor descriptor, Vector3 offset, VisibleFaces faces, Tuple <int, int> textureMap, int indiciesOffset, out int[] indicies) { // Wheat is rendered by rendering the four vertical faces of a cube, then moving them // towards the middle. We also render a second set of four faces so that you can see // each face from the opposite side (to avoid culling) var texture = Textures[0]; if (descriptor.Metadata < Textures.Length) { texture = Textures[descriptor.Metadata]; } indicies = new int[4 * 2 * 6]; var verticies = new VertexPositionNormalColorTexture[4 * 2 * 6]; int[] _indicies; var center = new Vector3(-0.5f, -0.5f, -0.5f); for (int _side = 0; _side < 4; _side++) // Y faces are the last two in the CubeFace enum, so we can just iterate to 4 { var side = (CubeFace)_side; var quad = CreateQuad(side, center, texture, 0, indiciesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (int i = 0; i < quad.Length; i++) { quad[i].Position.X *= 0.5f; quad[i].Position += offset; } } else { for (int i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 0.5f; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, _side * 4, 4); Array.Copy(_indicies, 0, indicies, _side * 6, 6); } indiciesOffset += 4 * 6; for (int _side = 0; _side < 4; _side++) { var side = (CubeFace)_side; var quad = CreateQuad(side, center, texture, 0, indiciesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (int i = 0; i < quad.Length; i++) { quad[i].Position.X *= 0.5f; quad[i].Position.X = -quad[i].Position.X; quad[i].Position += offset; } } else { for (int i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 0.5f; quad[i].Position.Z = -quad[i].Position.Z; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, _side * 4 + 4 * 4, 4); Array.Copy(_indicies, 0, indicies, _side * 6 + 6 * 4, 6); } for (int i = 0; i < verticies.Length; i++) { verticies[i].Position.Y -= 1 / 16f; verticies[i].Position -= center; } return(verticies); }
public override VertexPositionNormalColorTexture[] Render(BlockDescriptor descriptor, Vector3 offset, VisibleFaces faces, Tuple<int, int> textureMap, int indiciesOffset, out int[] indicies) { // Wheat is rendered by rendering the four vertical faces of a cube, then moving them // towards the middle. We also render a second set of four faces so that you can see // each face from the opposite side (to avoid culling) var texture = Textures[0]; if (descriptor.Metadata < Textures.Length) texture = Textures[descriptor.Metadata]; indicies = new int[4 * 2 * 6]; var verticies = new VertexPositionNormalColorTexture[4 * 2 * 6]; int[] _indicies; var center = new Vector3(-0.5f, -0.5f, -0.5f); for (int _side = 0; _side < 4; _side++) // Y faces are the last two in the CubeFace enum, so we can just iterate to 4 { var side = (CubeFace)_side; var quad = CreateQuad(side, center, texture, 0, indiciesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (int i = 0; i < quad.Length; i++) { quad[i].Position.X *= 0.5f; quad[i].Position += offset; } } else { for (int i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 0.5f; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, _side * 4, 4); Array.Copy(_indicies, 0, indicies, _side * 6, 6); } indiciesOffset += 4 * 6; for (int _side = 0; _side < 4; _side++) { var side = (CubeFace)_side; var quad = CreateQuad(side, center, texture, 0, indiciesOffset, out _indicies, Color.White); if (side == CubeFace.NegativeX || side == CubeFace.PositiveX) { for (int i = 0; i < quad.Length; i++) { quad[i].Position.X *= 0.5f; quad[i].Position.X = -quad[i].Position.X; quad[i].Position += offset; } } else { for (int i = 0; i < quad.Length; i++) { quad[i].Position.Z *= 0.5f; quad[i].Position.Z = -quad[i].Position.Z; quad[i].Position += offset; } } Array.Copy(quad, 0, verticies, _side * 4 + 4 * 4, 4); Array.Copy(_indicies, 0, indicies, _side * 6 + 6 * 4, 6); } for (int i = 0; i < verticies.Length; i++) { verticies[i].Position.Y -= 1 / 16f; verticies[i].Position -= center; } return verticies; }
public static NormalColorTextureVertex ToMono(this VertexPositionNormalColorTexture vertex) => new NormalColorTextureVertex( vertex.Position.ToMono(), vertex.Normal.ToMono(), vertex.Color.ToMono(), vertex.TextureCoordinate.ToMono());