예제 #1
0
        /// <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);
        }
예제 #2
0
 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;
 }
예제 #3
0
        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);
            }
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        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);
        }
예제 #8
0
        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);
                }
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
 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;
 }
예제 #12
0
 public static NormalColorTextureVertex ToMono(this VertexPositionNormalColorTexture vertex) =>
 new NormalColorTextureVertex(
     vertex.Position.ToMono(),
     vertex.Normal.ToMono(),
     vertex.Color.ToMono(),
     vertex.TextureCoordinate.ToMono());