// Use this for initialization void Start() { float voxelSize = 1.0f; int size = 33; Array3 <Voxel> voxels = WorldGenerator.CreateVoxels(size, 0, voxelSize, Vector3.zero); MeshData data = MarchingCubes.CalculateMeshData(voxels, voxelSize); data.CalculateNormals(); Mesh mesh = null; if (data != null) { mesh = data.CreateMesh(); } ChunkObject obj = SplitManager.GetObject(); obj.ov.shouldDraw = true; obj.mr.material = mat; obj.mf.mesh = mesh; Vector3 center = Vector3.one * (size - 1) / 2.0f; Bounds area = new Bounds(center, Vector3.one * voxelSize * (size - 1)); obj.ov.init(0, 0, center, area, null, Color.red); }
void Update() { if (Input.GetKeyDown(KeyCode.Space)) { for (int i = 0; i < 1000; ++i) { var edgeCost = simp.costs.RemoveFront(); simp.CollapseEdge(edgeCost); } simp.ToMesh(out data.vertices, out data.triangles); if (go.mf.sharedMesh != null) { Destroy(go.mf.sharedMesh); } data.CalculateNormals(); if (Input.GetKey(KeyCode.LeftShift)) { data.SplitEdgesCalcSmoothness(); } mesh = data.CreateMesh(); go.mf.sharedMesh = mesh; } }
// Loads a given OBJ file, calculates its surface normals and displays it public void ShowMesh() { meshData = parser.parse(OBJFile); if (isFlatShaded) { meshData.MakeFlatShaded(); } meshData.CalculateNormals(); meshFilter.mesh = meshData.ToUnityMesh(); }
public static Mesh CreateTerrain(float[,] noiseMap, float heightMultiplier, AnimationCurve heightCurve, int LOD) { MeshData meshData = GenerateTerrainMeshData(noiseMap, heightMultiplier, heightCurve, LOD); Mesh mesh = new Mesh(); mesh.vertices = meshData.GetVertices(); mesh.triangles = meshData.GetTriangles(); mesh.uv = meshData.GetUV(); mesh.normals = meshData.CalculateNormals(); return(mesh); }
void Start() { voxels = WorldGenerator.CreateVoxels(65, 0, 1, Vector3.zero); data = MarchingCubes.CalculateMeshData(voxels, 1); data.CalculateVertexSharing(); data.CalculateNormals(); simp = new Simplification(data.vertices, data.triangles); mesh = data.CreateMesh(); go = SplitManager.GetObject(); go.mr.material = mat; go.mf.sharedMesh = mesh; }
public static MeshData Poligonyze(IPoligonyzable source, Bounds bounds, Vector3 resolution, float isolevel) { MeshData meshData = new MeshData(); Grid[] grid = new Grid[8]; for (float x = bounds.min.x; x <= bounds.max.x - resolution.x; x += resolution.x) { for (float y = bounds.min.y; y <= bounds.max.y - resolution.y; y += resolution.y) { for (float z = bounds.min.z; z <= bounds.max.z - resolution.z; z += resolution.z) { // The weird array indices are due to how the lookup arrays are made grid[3] = new Grid(x, y, z, source.Sample(x, y, z)); grid[2] = new Grid(x + resolution.x, y, z, source.Sample(x + resolution.x, y, z)); grid[1] = new Grid(x + resolution.x, y, z + resolution.z, source.Sample(x + resolution.x, y, z + resolution.z)); grid[0] = new Grid(x, y, z + resolution.z, source.Sample(x, y, z + resolution.z)); grid[7] = new Grid(x, y + resolution.y, z, source.Sample(x, y + resolution.y, z)); grid[6] = new Grid(x + resolution.x, y + resolution.y, z, source.Sample(x + resolution.x, y + resolution.y, z)); grid[5] = new Grid(x + resolution.x, y + resolution.y, z + resolution.z, source.Sample(x + resolution.x, y + resolution.y, z + resolution.z)); grid[4] = new Grid(x, y + resolution.y, z + resolution.z, source.Sample(x, y + resolution.y, z + resolution.z)); ProcessPoint(isolevel, grid, meshData); } } } meshData.CalculateNormals(); return(meshData); }
public MeshData GenerateMesh(bool createVoxels) { // so while SIZE is 16, which means theres 16 cells/blocks in grid // you need 17 values to be able to construct those blocks // (think of 17 points in a grid and the blocks are the 16 spaces in between) // if smoothing then need a buffer of 2 around (front and back so +4) for smoothing and normal calculation // (so mesh goes from 2-19 basically (0, 1, 20, 21) are not visible in final result) #if (SMOOTH_SHADING) if (createVoxels) { voxels = WorldGenerator.CreateVoxels(SIZE + 5, depth, voxelSize, pos); } MeshData data = MarchingCubes.CalculateMeshData(voxels, voxelSize, 2, 2); data.CalculateVertexSharing(); //Simplification simp = new Simplification(data.vertices, data.triangles); //data.normals = VoxelUtils.CalculateSmoothNormals(voxels, voxelSize, data.vertices); //data.SplitEdgesCalcSmoothness(); data.CalculateSharedNormals(); // todo figure out why this doesnt make it smoothed... #else if (createVoxels) { voxels = WorldGenerator.CreateVoxels(SIZE + 1, depth, voxelSize, worldPos); } //if (!needsMesh) { // return null; //} //MeshData data = MarchingTetrahedra.CalculateMeshData(voxels, voxelSize); MeshData data = MarchingCubes.CalculateMeshData(voxels, voxelSize); data.CalculateNormals(); #endif //data.CalculateColorsByDepth(depth); return(data); }
void SpawnMap() { MeshData meshData = new MeshData(); Vector3Int[] directions = new Vector3Int[] { new Vector3Int(1, 0, 0), new Vector3Int(-1, 0, 0), new Vector3Int(0, 1, 0), new Vector3Int(0, -1, 0), new Vector3Int(0, 0, 1), new Vector3Int(0, 0, -1) }; // Invert y and z for visualization purposes voxelMap.Foreach((x, y, z, voxelPresent) => { if (voxelPresent) { //Instantiate(voxelPrefab, new Vector3(x, y, z), Quaternion.identity, transform); for (int i = 0; i < directions.Length; i++) { if (voxelMap.CheckVoxelAt(x + directions[i].x, y + directions[i].y, z + directions[i].z) == false) { CreateSquare(new Vector3Int(x, y, z), meshData, directions[i]); } } } }); meshData.CalculateNormals(); ThreadWorkManager.RequestMainThreadWork(() => { GameObject go = new GameObject(); go.AddComponent <MeshFilter>().mesh = meshData.ToMesh(); go.AddComponent <MeshRenderer>().sharedMaterial = voxelMaterial; go.transform.rotation = Quaternion.Euler(-90, 0, 0); /*MeshData m = new MeshData(); * * //CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(1, 0, 0)); * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(-1, 0, 0)); * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, 1, 0)); * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, -1, 0)); * //CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, 0, 1)); * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, 0, -1)); * * CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(1, 0, 0)); * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(-1, 0, 0)); * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 1, 0)); * CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, -1, 0)); * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 0, 1)); * CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 0, -1)); * * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(1, 0, 0)); * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(-1, 0, 0)); * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, 1, 0)); * //CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, -1, 0)); * //CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, 0, 1)); * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, 0, -1)); * * //CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(1, 0, 0)); * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(-1, 0, 0)); * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, 1, 0)); * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, -1, 0)); * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, 0, 1)); * //CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, 0, -1)); * * CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(1, 0, 0)); * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(-1, 0, 0)); * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 1, 0)); * CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(0, -1, 0)); * CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(0, 0, 1)); * //CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(0, 0, -1)); * * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(1, 0, 0)); * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(-1, 0, 0)); * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(0, 1, 0)); * //CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, -1, 0)); * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(0, 0, 1)); * //CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(0, 0, -1)); * * m.Smooth(); * go = new GameObject(); * go.AddComponent<MeshFilter>().mesh = m.ToMesh(); * go.AddComponent<MeshRenderer>().sharedMaterial = voxelMaterial;*/ }); }
public void RecreateMesh() { System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch(); s.Start(); if (mesh != null) { mesh.VertexBuffer.Dispose(); mesh.IndexBuffer.Dispose(); mesh = null; } //s.Stop(); //s.Start(); MeshData data = new MeshData(); for (int x = 0; x < Size; x++) { for (int y = 0; y < Size; y++) { for (int z = 0; z < Size; z++) { blocks[x, y, z].GetMeshData(data, this, x, y, z); } } } s.Stop(); Console.WriteLine(s.Elapsed.Ticks); s.Restart(); data.CalculateNormals(); if (data.Vertices.Count > 0) { mesh = new ModelMeshPart(); mesh.VertexBuffer = new VertexBuffer(Game3DPlatformer.Instance.GraphicsDevice, typeof(VertexPositionNormalTexture), data.Vertices.Count, BufferUsage.WriteOnly); mesh.IndexBuffer = new IndexBuffer(Game3DPlatformer.Instance.GraphicsDevice, typeof(short), data.Indices.Count, BufferUsage.WriteOnly); mesh.VertexBuffer.SetData(data.Vertices.Select((v, i) => new VertexPositionNormalTexture(v, data.Normals[i], data.UV[i])).ToArray()); mesh.IndexBuffer.SetData(data.Indices.ToArray()); mesh.NumVertices = data.Vertices.Count; mesh.PrimitiveCount = data.Indices.Count / 3; //meshPart.Effect = Game3DPlatformer.Instance.BasicEffect; //mesh = new ModelMesh(Game3DPlatformer.Instance.GraphicsDevice, new List<ModelMeshPart> { meshPart }); //mesh.Effects = new ModelEffectCollection(new List<Effect> { Game3DPlatformer.Instance.BasicEffect }); } else { mesh = null; } s.Stop(); Console.WriteLine(s.Elapsed.Ticks); Console.WriteLine("--"); }