/// <summary> /// コンストラクタ /// </summary> /// <param name="vertices">頂点データ</param> /// <param name="parts">パーツ情報</param> public MMDAccessory(MMDVertexNmTxVc[] vertices, IList<MMDAccessoryPart> parts) { this.vertexBuffer = new VertexBuffer(parts[0].indices.GraphicsDevice, typeof(VertexPositionNormalTextureColor), vertices.Length, BufferUsage.WriteOnly); VertexPositionNormalTextureColor[] gpuVertices = new VertexPositionNormalTextureColor[vertices.Length]; //初期値代入 for (int i = 0; i < vertices.Length; i++) { gpuVertices[i].Position = vertices[i].Position; gpuVertices[i].Normal = vertices[i].Normal; gpuVertices[i].Color = new Color(vertices[i].VertexColor); gpuVertices[i].TextureCoordinate = vertices[i].TextureCoordinate; } // put the vertices into our vertex buffer vertexBuffer.SetData(gpuVertices, 0, vertices.Length); m_parts = new ReadOnlyCollection<MMDAccessoryPart>(parts); }
protected VertexPositionNormalTextureColor[] GetFaceVertices(BlockFace blockFace, Vector3 startPosition, Vector3 endPosition, UVMap uvmap, out int[] indexes) { var size = (endPosition - startPosition); Color faceColor = Color.White; Vector3 normal = Vector3.Zero; Vector3 positionTopLeft = Vector3.Zero, positionBottomLeft = Vector3.Zero, positionBottomRight = Vector3.Zero, positionTopRight = Vector3.Zero; switch (blockFace) { case BlockFace.Up: //Positive Y positionTopLeft = From(startPosition, endPosition, endPosition); positionTopRight = From(endPosition, endPosition, endPosition); positionBottomLeft = From(startPosition, endPosition, startPosition); positionBottomRight = From(endPosition, endPosition, startPosition); normal = Vector3.Up; faceColor = uvmap.ColorTop; //new Color(0x00, 0x00, 0xFF); break; case BlockFace.Down: //Negative Y positionTopLeft = From(startPosition, startPosition, endPosition); positionTopRight = From(endPosition, startPosition, endPosition); positionBottomLeft = From(startPosition, startPosition, startPosition); positionBottomRight = From(endPosition, startPosition, startPosition); normal = Vector3.Down; faceColor = uvmap.ColorBottom; //new Color(0xFF, 0xFF, 0x00); break; case BlockFace.West: //Negative X positionTopLeft = From(startPosition, endPosition, startPosition); positionTopRight = From(startPosition, endPosition, endPosition); positionBottomLeft = From(startPosition, startPosition, startPosition); positionBottomRight = From(startPosition, startPosition, endPosition); normal = Vector3.Left; faceColor = uvmap.ColorLeft; // new Color(0xFF, 0x00, 0xFF); break; case BlockFace.East: //Positive X positionTopLeft = From(endPosition, endPosition, startPosition); positionTopRight = From(endPosition, endPosition, endPosition); positionBottomLeft = From(endPosition, startPosition, startPosition); positionBottomRight = From(endPosition, startPosition, endPosition); normal = Vector3.Right; faceColor = uvmap.ColorRight; //new Color(0x00, 0xFF, 0xFF); break; case BlockFace.South: //Positive Z positionTopLeft = From(startPosition, endPosition, startPosition); positionTopRight = From(endPosition, endPosition, startPosition); positionBottomLeft = From(startPosition, startPosition, startPosition); positionBottomRight = From(endPosition, startPosition, startPosition); normal = Vector3.Backward; faceColor = uvmap.ColorFront; // ew Color(0x00, 0xFF, 0x00); break; case BlockFace.North: //Negative Z positionTopLeft = From(startPosition, endPosition, endPosition); positionTopRight = From(endPosition, endPosition, endPosition); positionBottomLeft = From(startPosition, startPosition, endPosition); positionBottomRight = From(endPosition, startPosition, endPosition); normal = Vector3.Forward; faceColor = uvmap.ColorBack; // new Color(0xFF, 0x00, 0x00); break; case BlockFace.None: break; } var topLeft = new VertexPositionNormalTextureColor(positionTopLeft, normal, uvmap.TopLeft, faceColor); var topRight = new VertexPositionNormalTextureColor(positionTopRight, normal, uvmap.TopRight, faceColor); var bottomLeft = new VertexPositionNormalTextureColor(positionBottomLeft, normal, uvmap.BottomLeft, faceColor); var bottomRight = new VertexPositionNormalTextureColor(positionBottomRight, normal, uvmap.BottomRight, faceColor); switch (blockFace) { case BlockFace.Up: indexes = new int[] { 2, 0, 1, 3, 2, 1 }; break; case BlockFace.Down: indexes = new[] { 0, 2, 1, 2, 3, 1 }; break; case BlockFace.North: indexes = new[] { 0, 2, 1, 2, 3, 1 }; break; case BlockFace.East: indexes = new[] { 2, 0, 1, 3, 2, 1 }; break; case BlockFace.South: indexes = new[] { 2, 0, 1, 3, 2, 1 }; break; case BlockFace.West: indexes = new[] { 0, 2, 1, 2, 3, 1 }; break; default: indexes = new int[0]; break; } return(new[] { topLeft, topRight, bottomLeft, bottomRight }); return(new VertexPositionNormalTextureColor[0]); }
// 4+---------+3 // /| /| // 1+-|-------+2| // | | | | // |8+-------|-+7 // |/ |/ // 5+---------+6 public static Mesh CreateBox(GraphicsDevice device) { #region 写顶点数组 //创建24个顶点 VertexPositionNormalTextureColor[] vertices; vertices = new VertexPositionNormalTextureColor[24]; Vector3 v1 = new Vector3(-1.0f, 1.0f, 1.0f); Vector3 v2 = new Vector3(1.0f, 1.0f, 1.0f); Vector3 v3 = new Vector3(1.0f, 1.0f, -1.0f); Vector3 v4 = new Vector3(-1.0f, 1.0f, -1.0f); Vector3 v5 = new Vector3(-1.0f, -1.0f, 1.0f); Vector3 v6 = new Vector3(1.0f, -1.0f, 1.0f); Vector3 v7 = new Vector3(1.0f, -1.0f, -1.0f); Vector3 v8 = new Vector3(-1.0f, -1.0f, -1.0f); #region //5, 1, 2, 6 vertices[0].position = v5; vertices[0].texcoord = new Vector2(0, 0); vertices[0].normal = Vector3.Backward; vertices[0].color = Color.White; vertices[1].position = v1; vertices[1].texcoord = new Vector2(0, 1); vertices[1].normal = Vector3.Backward; vertices[1].color = Color.White; vertices[2].position = v2; vertices[2].texcoord = new Vector2(1, 1); vertices[2].normal = Vector3.Backward; vertices[2].color = Color.White; vertices[3].position = v6; vertices[3].texcoord = new Vector2(1, 0); vertices[3].normal = Vector3.Backward; vertices[3].color = Color.White; #endregion #region //8, 4, 3, 7 vertices[4].position = v8; vertices[4].texcoord = new Vector2(0, 0); vertices[4].normal = Vector3.Forward; vertices[4].color = Color.White; vertices[5].position = v4; vertices[5].texcoord = new Vector2(0, 1); vertices[5].normal = Vector3.Forward; vertices[5].color = Color.White; vertices[6].position = v3; vertices[6].texcoord = new Vector2(1, 1); vertices[6].normal = Vector3.Forward; vertices[6].color = Color.White; vertices[7].position = v7; vertices[7].texcoord = new Vector2(1, 0); vertices[7].normal = Vector3.Forward; vertices[7].color = Color.White; #endregion #region //5, 1, 4, 8 vertices[8].position = v5; vertices[8].texcoord = new Vector2(1, 0); vertices[8].normal = Vector3.Left; vertices[8].color = Color.White; vertices[9].position = v1; vertices[9].texcoord = new Vector2(1, 1); vertices[9].normal = Vector3.Left; vertices[9].color = Color.White; vertices[10].position = v4; vertices[10].texcoord = new Vector2(0, 1); vertices[10].normal = Vector3.Left; vertices[10].color = Color.White; vertices[11].position = v8; vertices[11].texcoord = new Vector2(0, 0); vertices[11].normal = Vector3.Left; vertices[11].color = Color.White; #endregion #region //6, 2, 3, 7 vertices[12].position = v6; vertices[12].texcoord = new Vector2(0, 0); vertices[12].normal = Vector3.Right; vertices[12].color = Color.White; vertices[13].position = v2; vertices[13].texcoord = new Vector2(0, 1); vertices[13].normal = Vector3.Right; vertices[13].color = Color.White; vertices[14].position = v3; vertices[14].texcoord = new Vector2(1, 1); vertices[14].normal = Vector3.Right; vertices[14].color = Color.White; vertices[15].position = v7; vertices[15].texcoord = new Vector2(1, 0); vertices[15].normal = Vector3.Right; vertices[15].color = Color.White; #endregion #region //5, 8, 7, 6 vertices[16].position = v5; vertices[16].texcoord = new Vector2(0, 0); vertices[16].normal = Vector3.Down; vertices[16].color = Color.White; vertices[17].position = v8; vertices[17].texcoord = new Vector2(0, 1); vertices[17].normal = Vector3.Down; vertices[17].color = Color.White; vertices[18].position = v7; vertices[18].texcoord = new Vector2(1, 1); vertices[18].normal = Vector3.Down; vertices[18].color = Color.White; vertices[19].position = v6; vertices[19].texcoord = new Vector2(1, 0); vertices[19].normal = Vector3.Down; vertices[19].color = Color.White; #endregion #region //1, 4, 3, 2 vertices[20].position = v1; vertices[20].texcoord = new Vector2(0, 0); vertices[20].normal = Vector3.Up; vertices[20].color = Color.White; vertices[21].position = v4; vertices[21].texcoord = new Vector2(0, 1); vertices[21].normal = Vector3.Up; vertices[21].color = Color.White; vertices[22].position = v3; vertices[22].texcoord = new Vector2(1, 1); vertices[22].normal = Vector3.Up; vertices[22].color = Color.White; vertices[23].position = v2; vertices[23].texcoord = new Vector2(1, 0); vertices[23].normal = Vector3.Up; vertices[23].color = Color.White; #endregion #endregion #region 索引数组 //创建36个索引 ushort[] indices = { 0, 1, 3, 1, 2, 3, 4, 5, 7, 5, 6, 7, 8, 9, 11, 9, 10, 11, 12, 13, 15, 13, 14, 15, 16, 17, 19, 17, 18, 19, 20, 21, 23, 21, 22, 23 }; #endregion VertexBuffer vb = new VertexBuffer(device, typeof(VertexPositionNormalTextureColor), vertices.Length, BufferUsage.WriteOnly); vb.SetData(vertices, 0, 24); VertexDeclaration vd = new VertexDeclaration(device, VertexPositionNormalTextureColor.VertexElements); IndexBuffer ib = new IndexBuffer(device, typeof(ushort), indices.Length, BufferUsage.WriteOnly); ib.SetData(indices); return new Mesh(PrimitiveType.TriangleList, vb, vd, ib); }