public static void addHermiteNormals(AbstractHermiteGrid grid, float cellSize, LineManager3DLines lines) { grid.ForEachGridPoint(p => { var sign = grid.GetSign(p); var dirs = new[] { new Point3(1, 0, 0), new Point3(0, 1, 0), new Point3(0, 0, 1) }; foreach (var dir in dirs) { if (sign == grid.GetSign(p + dir)) { continue; } //lines.AddLine(vertPos, end, Color.Black.dx()); var edge = grid.GetEdgeId(p, p + dir); var edgeStart = grid.GetEdgeOffsets(edge)[0] + p; var edgeEnd = grid.GetEdgeOffsets(edge)[1] + p; var normal = grid.GetEdgeNormal(p, edge); var pos = grid.GetEdgeIntersectionCubeLocal(p, edge); pos = (p + pos) * cellSize; lines.AddLine(pos, pos + normal * 0.4f * cellSize, Color.Blue); lines.AddLine(edgeStart.ToVector3() * cellSize, edgeEnd.ToVector3() * cellSize, Color.LightBlue); lines.AddCenteredBox(pos, 0.02f, Color.Red); } }); }
private void showGrid(AbstractHermiteGrid grid) { var testEnv = new DualContouringTestEnvironment(); testEnv.Grid = grid; engine.AddSimulator(() => TW.Graphics.LineManager3D.AddBox(new BoundingBox(new Vector3(0), grid.Dimensions.ToVector3() * testEnv.CellSize), Color.Black), "BoundingBox"); testEnv.AddToEngine(engine); }
private void testDensityFunction(Func <Vector3, float> densityFunction, Point3 dimensions) { AbstractHermiteGrid grid = null; grid = createGridFromDensityFunction(densityFunction, dimensions); grid = HermiteDataGrid.CopyGrid(grid); showGrid(grid); }
public VoxelSurface CreateSurface(AbstractHermiteGrid grid, Matrix world) { var vertices = new List <Vector3>(); var indices = new List <int>(); var materials = new List <DCVoxelMaterial>(); var algo = new DualContouringAlgorithm(); algo.GenerateSurface(vertices, indices, materials, grid); var triangleNormals = dcMeshBuilder.generateTriangleNormals(indices, vertices); var uniqueMaterials = materials.Distinct().ToArray(); if (!uniqueMaterials.Any()) { return new VoxelSurface(this) { WorldMatrix = world } } ; var ret = new VoxelSurface(this); ret.WorldMatrix = world; surfaces.Add(ret); foreach (var imat in uniqueMaterials) { var mat = imat; var mesh = new RawMeshData( indices.Where((i, index) => materials[index / 3] == mat).Select(i => vertices[i].dx()).ToArray(), indices.Select((i, index) => triangleNormals[index / 3].dx()).Where((i, index) => materials[index / 3] == mat).ToArray(), indices.Where((i, index) => materials[index / 3] == mat).Select(i => new Vector2().dx()).ToArray(), indices.Where((i, index) => materials[index / 3] == mat).Select(i => new Vector3().dx()).ToArray() ); var actualMat = mat; if (actualMat == null) { actualMat = defaultMaterial; } ret.MeshesWithMaterial.Add(new MeshWithMaterial(mesh, actualMat, renderDataFactory.CreateMeshPartData(mesh))); } return(ret); }
public static void addHermiteVertices(AbstractHermiteGrid grid, float cellSize, LineManager3DLines lines) { grid.ForEachGridPoint(p => { var sign = grid.GetSign(p); if (GridHelper.OrthogonalDirections3D.All(dir => grid.GetSign(p + dir) == sign)) { return; } var vertPos = p.ToVector3() * cellSize; var color = sign ? Color.Green.dx() : Color.LightGray.dx(); //if (!sign) lines.AddCenteredBox(vertPos, cellSize * 0.1f, color); }); }
private void testDensityFunction(Func <Vector3, float> densityFunction, Point3 dimensions) { AbstractHermiteGrid grid = null; grid = new DensityFunctionHermiteGrid(densityFunction, dimensions); var terrGen = PerformanceHelper.Measure(() => { grid = HermiteDataGrid.CopyGrid(grid); }); var testEnv = new DualContouringTestEnvironment(); testEnv.Grid = grid; testEnv.AdditionalText = "Terrain to Hermite: " + terrGen.PrettyPrint(); testEnv.AddToEngine(EngineFactory.CreateEngine()); }
public static void addFaceNormals(AbstractHermiteGrid grid, float cellSize, LineManager3DLines lines) { var vertices = new List <Vector3>(); var indices = new List <int>(); var algo = new DualContouringAlgorithm(); algo.GenerateSurface(vertices, indices, grid); var builder = new DualContouringMeshBuilder(); var triangleNormals = builder.generateTriangleNormals(indices, vertices); for (int i = 0; i < indices.Count; i += 3) { var v1 = vertices[indices[i]]; var v2 = vertices[indices[i + 1]]; var v3 = vertices[indices[i + 2]]; var mean = (v1 + v2 + v3) / 3f; lines.AddCenteredBox(mean * cellSize, 0.05f, Color.DarkCyan); lines.AddLine(mean * cellSize, (mean + triangleNormals[i / 3] * 0.5f) * cellSize, Color.Cyan); } }
public void SetFromHermiteGrid(DCOctreeNode node, AbstractHermiteGrid grid, Point3 pos, int len) { }