Example #1
0
        public static string GetHalf2String(Half2 v, string d = ", ")
        {
            var c = CultureInfo.InvariantCulture;
            var f = Half.ConvertToFloat(new[] { v.X, v.Y });

            return(f[0].ToString(c) + d + f[1].ToString(c));
        }
Example #2
0
 /// <summary>
 /// Initializes a new <see cref="VertexTerrain"/> instance.
 /// </summary>
 /// <param name="position">The position of this vertex.</param>
 /// <param name="normal">The vertex normal.</param>
 /// <param name="textureCoordinate">UV texture coordinates.</param>
 /// <param name="material">Material ID.</param>
 public VertexTerrain(Vector3 position, Half4 normal, Half2 textureCoordinate, uint material = 0)
     : this()
 {
     Position          = position;
     Normal            = normal;
     TextureCoordinate = textureCoordinate;
     Material          = material;
 }
Example #3
0
        public static Half2 ReadFromFile(BinaryReader reader)
        {
            Half2 half = new Half2();

            half.X = reader.ReadSingle();
            half.Y = reader.ReadSingle();
            return(half);
        }
Example #4
0
        public static Half2 ReadFromFile(BinaryReader reader)
        {
            float XComp = reader.ReadSingle();
            float YComp = reader.ReadSingle();

            Half2 half = new Half2(XComp, YComp);

            return(half);
        }
Example #5
0
        public void WriteUvData(byte[] data, int i, int uvNum)
        {
            //Do X
            byte[] tempPosData = HalfExtenders.GetBytes(UVs[uvNum].X);
            Array.Copy(tempPosData, 0, data, i, 2);

            //Do Y
            UVs[uvNum]  = new Half2(UVs[uvNum].X, (Vortice.Mathematics.Half)(-UVs[uvNum].Y));
            tempPosData = HalfExtenders.GetBytes(UVs[uvNum].Y);
            Array.Copy(tempPosData, 0, data, i + 2, 2);
        }
Example #6
0
        /// <summary>
        /// Construct empty vertex.
        /// </summary>
        public Vertex()
        {
            position = new Vector3(0);
            normal   = new Vector3(0);
            tangent  = new Vector3(0);
            uvs      = new Half2[4];

            for (int i = 0; i != uvs.Length; i++)
            {
                uvs[i] = new Half2();
            }
        }
Example #7
0
 public void Serialize(ref Half2 value)
 {
     // Write optimized version without using Serialize methods
     if (Mode == SerializerMode.Write)
     {
         Writer.Write(value.X.RawValue);
         Writer.Write(value.Y.RawValue);
     }
     else
     {
         value.X.RawValue = Reader.ReadUInt16();
         value.Y.RawValue = Reader.ReadUInt16();
     }
 }
Example #8
0
        public Vertex()
        {
            position    = new Vector3(0);
            normal      = new Vector3(0);
            tangent     = new Vector3(0);
            color0      = new byte[4];
            color1      = new byte[4];
            boneWeights = new float[4];
            boneIDs     = new byte[4];
            uvs         = new Half2[4];

            for (int i = 0; i != uvs.Length; i++)
            {
                uvs[i] = new Half2();
            }
        }
Example #9
0
 public static void WriteToFile(this Half2 half, BinaryWriter writer)
 {
     writer.Write(half.X);
     writer.Write(half.Y);
 }
Example #10
0
        /// <summary>
        /// Creates the vertices
        /// </summary>
        private unsafe int GenerateVertices()
        {
            MappedResource vertexMap    = GraphicsDevice.MapSubresource(TerrainVertexBuffer, 0, MapMode.WriteDiscard);
            var            vertexBuffer = (VertexTerrain *)vertexMap.DataBox.DataPointer;

            int index = 0;

            // Texture UV coordinates
            Half2
                textureTopLeft  = new Half2(0, 1),
                textureTopRight = new Half2(1, 1),
                textureBtmLeft  = new Half2(0, 0),
                textureBtmRight = new Half2(1, 0);

            // Size vector and corner positions
            Vector3
                corner1 = new Vector3(0, 1, 1),
                corner2 = new Vector3(0, 1, 0),
                corner3 = new Vector3(1, 1, 1),
                corner4 = new Vector3(1, 1, 0),
                corner5 = new Vector3(0, 0, 1),
                corner6 = new Vector3(0, 0, 0),
                corner7 = new Vector3(1, 0, 1),
                corner8 = new Vector3(1, 0, 0);


            foreach (var chunk in Blocks)
            {
                foreach (GraphicalBlock block in chunk.Value)
                {
                    #region Top
                    if (block.HasSide(BlockSides.Top))
                    {
                        Vector3
                         cornerTopLeft  = block.Position + corner1,
                         cornerBtmLeft  = block.Position + corner2,
                         cornerTopRight = block.Position + corner3,
                         cornerBtmRight = block.Position + corner4;
                        Half4
                            normal = new Half4((Half)0, (Half)1, (Half)0, (Half)0);

                        vertexBuffer[index++] = new VertexTerrain(cornerTopRight, normal, textureBtmLeft, block.GetMaterialCode(BlockSides.Top));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopLeft, normal, textureBtmRight, block.GetMaterialCode(BlockSides.Top));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmLeft, normal, textureTopRight, block.GetMaterialCode(BlockSides.Top));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmRight, normal, textureTopLeft, block.GetMaterialCode(BlockSides.Top));
                    }
                    #endregion

                    #region Bottom
                    if (block.HasSide(BlockSides.Bottom))
                    {
                        Vector3
                            cornerTopLeft  = block.Position + corner5,
                            cornerBtmLeft  = block.Position + corner6,
                            cornerTopRight = block.Position + corner7,
                            cornerBtmRight = block.Position + corner8;
                        Half4
                            normal = new Half4((Half)0, (Half)(-1), (Half)0, (Half)0);

                        vertexBuffer[index++] = new VertexTerrain(cornerBtmLeft, normal, textureTopRight, block.GetMaterialCode(BlockSides.Bottom));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopLeft, normal, textureBtmRight, block.GetMaterialCode(BlockSides.Bottom));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopRight, normal, textureBtmLeft, block.GetMaterialCode(BlockSides.Bottom));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmRight, normal, textureTopLeft, block.GetMaterialCode(BlockSides.Bottom));
                    }
                    #endregion

                    #region Front
                    if (block.HasSide(BlockSides.Front))
                    {
                        Vector3
                            cornerTopLeft  = block.Position + corner3,
                            cornerBtmLeft  = block.Position + corner7,
                            cornerTopRight = block.Position + corner1,
                            cornerBtmRight = block.Position + corner5;
                        Half4
                            normal = new Half4((Half)0, (Half)0, (Half)1, (Half)0);

                        vertexBuffer[index++] = new VertexTerrain(cornerTopRight, normal, textureBtmLeft, block.GetMaterialCode(BlockSides.Front));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopLeft, normal, textureBtmRight, block.GetMaterialCode(BlockSides.Front));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmLeft, normal, textureTopRight, block.GetMaterialCode(BlockSides.Front));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmRight, normal, textureTopLeft, block.GetMaterialCode(BlockSides.Front));
                    }
                    #endregion

                    #region Back
                    if (block.HasSide(BlockSides.Back))
                    {
                        Vector3
                            cornerTopLeft  = block.Position + corner4,
                            cornerBtmLeft  = block.Position + corner8,
                            cornerTopRight = block.Position + corner2,
                            cornerBtmRight = block.Position + corner6;
                        Half4
                            normal = new Half4((Half)0, (Half)0, (Half)(-1), (Half)0);

                        vertexBuffer[index++] = new VertexTerrain(cornerBtmLeft, normal, textureTopRight, block.GetMaterialCode(BlockSides.Back));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopLeft, normal, textureBtmRight, block.GetMaterialCode(BlockSides.Back));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopRight, normal, textureBtmLeft, block.GetMaterialCode(BlockSides.Back));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmRight, normal, textureTopLeft, block.GetMaterialCode(BlockSides.Back));
                    }
                    #endregion

                    #region Left
                    if (block.HasSide(BlockSides.Left))
                    {
                        Vector3
                            cornerTopLeft  = block.Position + corner1,
                            cornerBtmLeft  = block.Position + corner5,
                            cornerTopRight = block.Position + corner2,
                            cornerBtmRight = block.Position + corner6;
                        Half4
                            normal = new Half4((Half)(-1), (Half)0, (Half)0, (Half)0);

                        vertexBuffer[index++] = new VertexTerrain(cornerTopRight, normal, textureBtmLeft, block.GetMaterialCode(BlockSides.Left));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopLeft, normal, textureBtmRight, block.GetMaterialCode(BlockSides.Left));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmLeft, normal, textureTopRight, block.GetMaterialCode(BlockSides.Left));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmRight, normal, textureTopLeft, block.GetMaterialCode(BlockSides.Left));
                    }
                    #endregion

                    #region Right
                    if (block.HasSide(BlockSides.Right))
                    {
                        Vector3
                            cornerTopLeft  = block.Position + corner3,
                            cornerBtmLeft  = block.Position + corner7,
                            cornerTopRight = block.Position + corner4,
                            cornerBtmRight = block.Position + corner8;
                        Half4
                            normal = new Half4((Half)1, (Half)0, (Half)0, (Half)0);

                        vertexBuffer[index++] = new VertexTerrain(cornerBtmLeft, normal, textureTopRight, block.GetMaterialCode(BlockSides.Right));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopLeft, normal, textureBtmRight, block.GetMaterialCode(BlockSides.Right));
                        vertexBuffer[index++] = new VertexTerrain(cornerTopRight, normal, textureBtmLeft, block.GetMaterialCode(BlockSides.Right));
                        vertexBuffer[index++] = new VertexTerrain(cornerBtmRight, normal, textureTopLeft, block.GetMaterialCode(BlockSides.Right));
                    }
                    #endregion
                }
            }

            GraphicsDevice.UnmapSubresource(vertexMap);

            return(index);
        }
 public void Serialize(ref Half2 value)
 {
     // Write optimized version without using Serialize methods
     if (Mode == SerializerMode.Write)
     {
         Writer.Write(value.X.RawValue);
         Writer.Write(value.Y.RawValue);
     }
     else
     {
         value.X.RawValue = Reader.ReadUInt16();
         value.Y.RawValue = Reader.ReadUInt16();
     }
 }
Example #12
0
 public static string ToString(Half2 value)
 {
     return(string.Format(CultureInfo.InvariantCulture, "{0}, {1}", value.X, value.Y));
 }
            public InstancedGeomClipMapping(GraphicsDevice graphicsDevice, float minPatchSizeWorld, uint ringThinkness, uint numRings)
            {
                this.ringThinkness = ringThinkness;
                this.numRings = numRings;
                this.minPatchSizeWorld = minPatchSizeWorld;

                // Patch vertex buffer
                Half2[] patchVertices = new Half2[9];
                for (int x = 0; x < 3; ++x)
                {
                    for (int y = 0; y < 3; ++y)
                    {
                        patchVertices[x + y * 3] = new Half2(x * 0.5f, y * 0.5f);
                    }
                }
                patchVertexBuffer = Buffer<Half2>.New(graphicsDevice, patchVertices, BufferFlags.VertexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable);

                // Instance buffers
                // Try to guess max number of patches:
                maxPatchInstances[(uint)PatchType.FULL] = ringThinkness * ringThinkness * 4 * numRings;
                maxPatchInstances[(uint)PatchType.STITCH1] = (uint)(maxPatchInstances[(uint)PatchType.FULL] * (float)(4 * 2 * ringThinkness) / (2 * ringThinkness * 2 * ringThinkness));
                maxPatchInstances[(uint)PatchType.STITCH2] = maxPatchInstances[(uint)PatchType.STITCH1] / 4;

                for(int i = 0; i < patchInstanceBuffer.Length; ++i)
                {
                    patchInstanceBuffer[i] = SharpDX.Toolkit.Graphics.Buffer.New(
                        graphicsDevice, (int)maxPatchInstances[i] * sizeof(float) * 4,  sizeof(float) * 4, BufferFlags.VertexBuffer, SharpDX.Direct3D11.ResourceUsage.Dynamic);
                    currentInstanceData[i] = new List<PatchInstanceData>();
                }

                // Input layout.
                vertexInputLayout = VertexInputLayout.New(
                    VertexBufferLayout.New(0, new VertexElement[]{ new VertexElement("RELPOS", 0, SharpDX.DXGI.Format.R16G16_Float, 0) }, 0),
                    VertexBufferLayout.New(1, new VertexElement[]{ new VertexElement("WORLDPOS", 0, SharpDX.DXGI.Format.R32G32_Float, 0),    // worldPosition
                                                                   new VertexElement("SCALE", 0, SharpDX.DXGI.Format.R32_Float, 8),       // worldScale
                                                                   new VertexElement("ROTATION", 0, SharpDX.DXGI.Format.R32_UInt, 12) }, 1));       // rotationType

                // Patch index buffer
                // Full patch
                ushort[] indicesFull = new ushort[]{ 0, 1, 4, 4, 1, 2, 0, 4, 3, 4, 2, 5, 3, 4, 6, 6, 4, 7, 7, 4, 8, 8, 4, 5 };  // optimize?
                patchIndexBuffer[(uint)PatchType.FULL] = Buffer<ushort>.New(graphicsDevice, indicesFull, BufferFlags.IndexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable);
                // First stitch: Only one triangle at bottom
                ushort[] indicesStitch1 = new ushort[]{ 0, 1, 4, 4, 1, 2, 0, 4, 3, 4, 2, 5, 3, 4, 6, 6, 4, 8, 8, 4, 5 };  // optimize?
                patchIndexBuffer[(uint)PatchType.STITCH1] = Buffer<ushort>.New(graphicsDevice, indicesStitch1, BufferFlags.IndexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable);
                // Second stitch: Only one triangle at bottom and right
                ushort[] indicesStitch2 = new ushort[]{ 0, 1, 4, 4, 1, 2, 0, 4, 3, 3, 4, 6, 6, 4, 8, 8, 4, 2 };  // optimize?
                patchIndexBuffer[(uint)PatchType.STITCH2] = Buffer<ushort>.New(graphicsDevice, indicesStitch2, BufferFlags.IndexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable);
            }
Example #14
0
        public static string GetHalf2String(Half2 v, string d = ", ")
        {
            var f = Half.ConvertToFloat(new[] { v.X, v.Y });

            return(ToString(f[0]) + d + ToString(f[1]));
        }