Example #1
0
        /// <summary>
        /// Draw hermite info for given cube and outputs the info to a textarea
        /// </summary>
        private void drawHermiteInfoForCube(Point3 gridPoint, Textarea textarea)
        {
            textarea.Text = "";

            foreach (var edgeID in grid.GetAllEdgeIds())
            {
                var     points         = grid.GetEdgeOffsets(edgeID);
                Vector3 edgeWorldStart = (gridPoint + points[0]).ToVector3() * CellSize;
                TW.Graphics.LineManager3D.AddLine(edgeWorldStart, (gridPoint + points[1]).ToVector3() * CellSize,
                                                  Color.Purple.dx());
                var hasEdge = false;
                if (grid.HasEdgeData(gridPoint, edgeID))
                {
                    textarea.Text += grid.GetEdgeIntersectionCubeLocal(gridPoint, edgeID) + "n: " +
                                     grid.getEdgeData(gridPoint, edgeID).TakeXYZ() + "\n";
                    hasEdge = true;
                    var     normal            = grid.GetEdgeNormal(gridPoint, edgeID);
                    Vector3 worldIntersection = (grid.GetEdgeIntersectionCubeLocal(gridPoint, edgeID) + gridPoint) * CellSize;
                    TW.Graphics.LineManager3D.AddCenteredBox(worldIntersection, 0.04f, Color.LawnGreen.dx());
                    TW.Graphics.LineManager3D.AddLine(worldIntersection, worldIntersection + normal * 0.2f, Color.Blue.dx());
                }

                if (hasEdge)
                {
                    var qef = (Vector3)DualContouringAlgorithm.calculateQefPoint(grid, grid.GetCubeSigns(gridPoint), gridPoint);
                    TW.Graphics.LineManager3D.AddCenteredBox(((Vector3)gridPoint.ToVector3() + qef) * CellSize, 0.05f, Color.Orange.dx());
                }
            }
        }
Example #2
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);
        }
Example #3
0
        public VoxelCustomRenderer(DX11Game game, DeferredRenderer dRenderer, DualContouringMeshBuilder dcMeshBuilder, DualContouringAlgorithm dcAlgo, MeshRenderDataFactory renderDataFactory)
        {
            this.game              = game;
            this.dRenderer         = dRenderer;
            this.dcMeshBuilder     = dcMeshBuilder;
            this.dcAlgo            = dcAlgo;
            this.renderDataFactory = renderDataFactory;


            var tex = new RAMTexture();

            defaultMaterial = new DCVoxelMaterial()
            {
                Texture = DCFiles.UVCheckerMap11_512
            };

            objectBuffer = DeferredMaterial.CreatePerObjectCB(game);
        }
        private static void testExtractSurface(DelegateHermiteGrid srcGrid)
        {
            var grid  = HermiteDataGrid.CopyGrid(srcGrid);
            int times = 40;

            var vertices  = new List <Vector3>(10 * 1000 * 1000);
            var indices   = new List <int>(10 * 1000 * 1000);
            var extractor = new DualContouringAlgorithm();

            var time = PerformanceHelper.Measure(() =>
            {
                for (int i = 0; i < times; i++)
                {
                    vertices.Clear();
                    indices.Clear();
                    extractor.GenerateSurface(vertices, indices, srcGrid);
                }
            });

            Console.WriteLine("Time: " + time.Multiply(1f / times).PrettyPrint());
            Console.WriteLine("{0:#.0}x{0:#.0}x{0:#.0} grid per second", Math.Pow(srcGrid.Dimensions.X * srcGrid.Dimensions.Y * srcGrid.Dimensions.Z / (time.TotalSeconds / times), 1 / 3f));
        }
Example #5
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);
            }
        }