MeshPartDefinition ToMeshPartDefinition(MeshPart meshPart) { if (meshPart == null) return new MeshPartDefinition(); return new MeshPartDefinition { Vertices = meshPart.Vertices, Indices = meshPart.Indices }; }
static MeshPart Create(MeshPart prototype, ref Vector2 texCoordOffset) { var newVertices = new VertexPositionNormalTexture[prototype.Vertices.Length]; Array.Copy(prototype.Vertices, newVertices, newVertices.Length); for (int j = 0; j < newVertices.Length; j++) { newVertices[j].TextureCoordinate.X /= Tile.Size; newVertices[j].TextureCoordinate.Y /= Tile.Size; newVertices[j].TextureCoordinate.X += texCoordOffset.X; newVertices[j].TextureCoordinate.Y += texCoordOffset.Y; } // 全てのメッシュで共通であるため配列を共有。 return new MeshPart(newVertices, prototype.Indices); }
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); } }