public void TestDensityBasedLOD() { TW.Graphics.SpectaterCamera.FarClip = 5000; var maxSampleSize = 64; var skipLevels = 1; var density = createDensityFunction5Perlin(19, maxSampleSize / 2); var meshBuilder = new DualContouringMeshBuilder(); var size = maxSampleSize * (int)(Math.Pow(2, skipLevels)); var minSize = skipLevels; var maxSize = Math.Log(size) / Math.Log(2); for (int i = minSize; i < maxSize; i++) { var currI = i; var multiplier = (int)(Math.Pow(2, i)); var resolution = size / multiplier; var grid = HermiteDataGrid.CopyGrid(new DensityFunctionHermiteGrid(v => density(v * multiplier), new Point3(resolution, resolution, resolution))); var mesh = meshBuilder.buildMesh(grid); var el = TW.Graphics.AcquireRenderer().CreateMeshElement(mesh); el.WorldMatrix = Matrix.Scaling(new Vector3(multiplier)) * Matrix.Translation((size * 1.1f) * (i - skipLevels), 0, 0); } EngineFactory.CreateEngine().AddSimulator(new WorldRenderingSimulator()); }
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); }
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); } }