Exemplo n.º 1
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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());
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
 public void SetFromHermiteGrid(DCOctreeNode node, AbstractHermiteGrid grid, Point3 pos, int len)
 {
 }