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)); }
/// <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; }
public static Half2 ReadFromFile(BinaryReader reader) { Half2 half = new Half2(); half.X = reader.ReadSingle(); half.Y = reader.ReadSingle(); return(half); }
public static Half2 ReadFromFile(BinaryReader reader) { float XComp = reader.ReadSingle(); float YComp = reader.ReadSingle(); Half2 half = new Half2(XComp, YComp); return(half); }
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); }
/// <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(); } }
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(); } }
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(); } }
public static void WriteToFile(this Half2 half, BinaryWriter writer) { writer.Write(half.X); writer.Write(half.Y); }
/// <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 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); }
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])); }