public void RequestMesh(List <ChunkToGenerate> chunksToGen, int resolution, bool flatShaded) { for (int i = 0; i < chunksToGen.Count; i++) { IDensityFunc f = Activator.CreateInstance(chunksToGen[i].DensityFunc) as IDensityFunc; var chunk = chunksToGen[i].Chunk; ThreadedDataRequester.Instance.RequestData(() => { return(chunk.CubeMarch(resolution, f, flatShaded)); }, (obj) => OnDataRecieved((MeshData)obj, chunk)); } }
public void RequestMesh(List <ChunkToGenerate> chunksToGen, Type idensityFunc, int resolution, bool flatShaded) { //TODO maybe instance for each and every one extra instead of one IDensityFunc densFunc = Activator.CreateInstance(idensityFunc) as IDensityFunc; for (int i = 0; i < chunksToGen.Count; i++) { var chunk = chunksToGen[i].Chunk; ThreadedDataRequester.Instance.RequestData(() => { return(chunk.CubeMarch(resolution, densFunc, flatShaded)); }, (obj) => OnDataRecieved((MeshData)obj, chunk)); } }
public MeshData CubeMarch(Vector3 gridResolution, IDensityFunc func, bool flatShaded = true, float isoLevel = 0f) { List <Triangle> trianglesFromMarch = new List <Triangle>(); //loop over everything //stop at < gridResolution as we need to calculate the positions +1 anyways and the alst rows colums fileds voxel is out of the chunkbounds anyway for (int z = 0; z < gridResolution.z; z++) { for (int y = 0; y < gridResolution.y; y++) { for (int x = 0; x < gridResolution.x; x++) { Vertex[] voxel = GetVoxel(x, y, z, gridResolution, func); int lookUpIdx = GetLookUpIndex(voxel, isoLevel); for (int i = 0; MeshGenerationLUTs.triTable[lookUpIdx][i] != -1; i += 3) { int idxA0 = MeshGenerationLUTs.cornerIndexAFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i]]; int idxB0 = MeshGenerationLUTs.cornerIndexBFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i]]; int idxA1 = MeshGenerationLUTs.cornerIndexAFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 1]]; int idxB1 = MeshGenerationLUTs.cornerIndexBFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 1]]; int idxA2 = MeshGenerationLUTs.cornerIndexAFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 2]]; int idxB2 = MeshGenerationLUTs.cornerIndexBFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 2]]; trianglesFromMarch.Add( new Triangle() { A = CubeMarchLerp(voxel[idxA0], voxel[idxB0], isoLevel), VertexA_ID = new PointCreators(voxel[idxA0].ID, voxel[idxB0].ID), B = CubeMarchLerp(voxel[idxA1], voxel[idxB1], isoLevel), VertexB_ID = new PointCreators(voxel[idxA1].ID, voxel[idxB1].ID), C = CubeMarchLerp(voxel[idxA2], voxel[idxB2], isoLevel), VertexC_ID = new PointCreators(voxel[idxA2].ID, voxel[idxB2].ID) } ); } } } }// end for z return(CreatMeshData(trianglesFromMarch, flatShaded)); }
public MeshData CubeMarch(float girdResolution, IDensityFunc func, bool flatShaded = true, float isoLevel = 0f) { return(CubeMarch(Vector3.one * girdResolution, func, flatShaded, isoLevel)); }
Vertex[] GetVoxel(int x, int y, int z, Vector3 gridResolution, IDensityFunc densFunc) { Vertex[] voxel = new Vertex[8]; Vector3 localP = GetLocalPoint(x, y, z + 1, gridResolution); Vector3 p = LocalToWorld(localP); voxel[0] = new Vertex { ID = new VertexID(x, y, z + 1), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; localP = GetLocalPoint(x + 1, y, z + 1, gridResolution); p = LocalToWorld(localP); voxel[1] = new Vertex { ID = new VertexID(x + 1, y, z + 1), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; localP = GetLocalPoint(x + 1, y, z, gridResolution); p = LocalToWorld(localP); voxel[2] = new Vertex { ID = new VertexID(x + 1, y, z), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; localP = GetLocalPoint(x, y, z, gridResolution); p = LocalToWorld(localP); voxel[3] = new Vertex { ID = new VertexID(x, y, z), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; localP = GetLocalPoint(x, y + 1, z + 1, gridResolution); p = LocalToWorld(localP); voxel[4] = new Vertex { ID = new VertexID(x, y + 1, z + 1), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; localP = GetLocalPoint(x + 1, y + 1, z + 1, gridResolution); p = LocalToWorld(localP); voxel[5] = new Vertex { ID = new VertexID(x + 1, y + 1, z + 1), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; localP = GetLocalPoint(x + 1, y + 1, z, gridResolution); p = LocalToWorld(localP); voxel[6] = new Vertex { ID = new VertexID(x + 1, y + 1, z), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; localP = GetLocalPoint(x, y + 1, z, gridResolution); p = LocalToWorld(localP); voxel[7] = new Vertex { ID = new VertexID(x, y + 1, z), Point = p, IsoVal = densFunc.Evaluate( new SamplePointVariables(p.x, localP.x), new SamplePointVariables(p.y, localP.y), new SamplePointVariables(p.z, localP.z) ) }; return(voxel); }