/// <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); }
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)); }
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); }
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)); }
/// <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; }
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); }
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(); } }
/// <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 Half4 Cos(Half4 a) { return(new Half4(Mathf.Cos(a.x), Mathf.Cos(a.y), Mathf.Cos(a.z), Mathf.Cos(a.w))); }
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))); }
public static string ToString(Half4 value) { return(string.Format(CultureInfo.InvariantCulture, "{0}, {1}, {2}, {3}", value.X, value.Y, value.Z, value.W)); }
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])); }