/// <summary>
        /// Generates gradients using a central differences scheme.
        /// </summary>
        /// <param name="data">Normalized voxel data</param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="depth"></param>
        /// <param name="sampleSize">The size/radius of the sample to take.</param>
        public static Half4[] GenerateGradients(float[] data, int width, int height, int depth, int sampleSize)
        {
            int n = sampleSize;

            var gradients = new Half4[width * height * depth];

            Parallel.For(0, depth, new ParallelOptions()
            {
                MaxDegreeOfParallelism = 4
            }, (z) =>
            {
                int index = z * width * height;
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++, ++index)
                    {
                        Vector3 s1, s2;
                        s1.X             = SampleVolume(data, width, height, depth, x - n, y, z);
                        s2.X             = SampleVolume(data, width, height, depth, x + n, y, z);
                        s1.Y             = SampleVolume(data, width, height, depth, x, y - n, z);
                        s2.Y             = SampleVolume(data, width, height, depth, x, y + n, z);
                        s1.Z             = SampleVolume(data, width, height, depth, x, y, z - n);
                        s2.Z             = SampleVolume(data, width, height, depth, x, y, z + n);
                        var v            = Vector3.Normalize(s2 - s1);
                        var sample       = SampleVolume(data, width, height, depth, x, y, z);
                        gradients[index] = new Half4(v.X, v.Y, v.Z, sample);
                        if (float.IsNaN(gradients[index].X))
                        {
                            gradients[index] = new Half4(0, 0, 0, sample);
                        }
                    }
                }
            });
            return(gradients);
        }
Example #2
0
        public static string GetHalf4String(Half4 v, string d = ", ")
        {
            var c = CultureInfo.InvariantCulture;
            var f = Half.ConvertToFloat(new[] { v.X, v.Y, v.Z, v.W });

            return(f[0].ToString(c) + d + f[1].ToString(c) + d + f[2].ToString(c) + d + f[3].ToString(c));
        }
Example #3
0
    Vector3 GerstnerOffset4(Vector2 xzVtx, Half4 steepness, Half4 amp, Half4 freq, Half4 speed, Half4 dirAB, Half4 dirCD)
    {
        Vector3 offsets;

        Half4 AB = new Half4();

        AB.x = steepness.x * amp.x * dirAB.x;
        AB.y = steepness.x * amp.x * dirAB.y;
        AB.z = steepness.y * amp.y * dirAB.z;
        AB.w = steepness.y * amp.y * dirAB.w;

        Half4 CD = new Half4();

        AB.x = steepness.z * amp.z * dirCD.x;
        AB.y = steepness.z * amp.z * dirCD.y;
        AB.z = steepness.w * amp.w * dirCD.z;
        AB.w = steepness.w * amp.w * dirCD.w;


        Half4 dotABCD = freq * new Half4(Vector2.Dot(dirAB.xy, xzVtx), Vector2.Dot(dirAB.zw, xzVtx), Vector2.Dot(dirCD.xy, xzVtx), Vector2.Dot(dirCD.zw, xzVtx));

        float t    = Time.time;
        Half4 TIME = new Half4(t) * speed;

        Half4 COS = Half4.Cos(dotABCD + TIME);
        Half4 SIN = Half4.Sin(dotABCD + TIME);

        offsets.x = Vector4.Dot(COS, new Half4(AB.xz, CD.xz));
        offsets.z = Vector4.Dot(COS, new Half4(AB.yw, CD.yw));
        offsets.y = Vector4.Dot(SIN, amp) * 0.5f;

        return(offsets);
    }
Example #4
0
		public void Dot()
		{
			Half4 a = new Half4(1, 2, 3, 4);
			Half4 b = new Half4(1, 2, 3, 4);
			half expected = (half)(1 + 4 + 9 + 16);
			Assert.AreEqual(expected, MathHelper.Dot(a, b));

		}
Example #5
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 #6
0
        private static float CheckVariationBetweenValueAndExpectedValue(DeviceContext context, int textureSize, int mipSlice, Vector4 mip0Colour, Texture2D readableTexture)
        {
            DataStream data = new DataStream(8 * textureSize * textureSize, true, true);

            context.MapSubresource(readableTexture, mipSlice, 0, MapMode.Read, MapFlags.None, out data);
            Half4 quickTest = data.ReadHalf4();

            context.UnmapSubresource(readableTexture, mipSlice);

            Vector4 conversion = (Vector4)quickTest;
            float   variance   = (conversion - mip0Colour).Length();

            return(variance);
        }
Example #7
0
 public void Serialize(ref Half4 value)
 {
     // Write optimized version without using Serialize methods
     if (Mode == SerializerMode.Write)
     {
         Writer.Write(value.X.RawValue);
         Writer.Write(value.Y.RawValue);
         Writer.Write(value.Z.RawValue);
         Writer.Write(value.W.RawValue);
     }
     else
     {
         value.X.RawValue = Reader.ReadUInt16();
         value.Y.RawValue = Reader.ReadUInt16();
         value.Z.RawValue = Reader.ReadUInt16();
         value.W.RawValue = Reader.ReadUInt16();
     }
 }
Example #8
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 Half4 value)
 {
     // Write optimized version without using Serialize methods
     if (Mode == SerializerMode.Write)
     {
         Writer.Write(value.X.RawValue);
         Writer.Write(value.Y.RawValue);
         Writer.Write(value.Z.RawValue);
         Writer.Write(value.W.RawValue);
     }
     else
     {
         value.X.RawValue = Reader.ReadUInt16();
         value.Y.RawValue = Reader.ReadUInt16();
         value.Z.RawValue = Reader.ReadUInt16();
         value.W.RawValue = Reader.ReadUInt16();
     }
 }
Example #10
0
 public static Half4 Cos(Half4 a)
 {
     return(new Half4(Mathf.Cos(a.x), Mathf.Cos(a.y), Mathf.Cos(a.z), Mathf.Cos(a.w)));
 }
Example #11
0
 public static Half4 Sin(Half4 a)
 {
     return(new Half4(Mathf.Sin(a.x), Mathf.Sin(a.y), Mathf.Sin(a.z), Mathf.Sin(a.w)));
 }
Example #12
0
 public static string ToString(Half4 value)
 {
     return(string.Format(CultureInfo.InvariantCulture, "{0}, {1}, {2}, {3}", value.X, value.Y, value.Z, value.W));
 }
Example #13
0
        public static string GetHalf4String(Half4 v, string d = ", ")
        {
            var f = Half.ConvertToFloat(new[] { v.X, v.Y, v.Z, v.W });

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