public void ConvertTrianglesToVoxels(Blocks MyBlocks, Mesh InputMesh) { resolution = Mathf.Pow (resolution, 2); InputMesh.RecalculateBounds (); MyBounds = InputMesh.bounds; // draws the bounding box DebugShapes.DrawCube (transform.position + InputMesh.bounds.center, InputMesh.bounds.extents, Color.green); Debug.LogError ("Converting mesh to voxels"); MyBlocks = GetManager.GetDataManager().BlockStructuresList[BlockStructureIndex].MyBlocks; float SizeOfGrid = 1f; //real block size is x2 whatever i set here Vector3 Bounds = InputMesh.bounds.extents; float LargestSize = Bounds.x; if (LargestSize < Bounds.y) LargestSize = Bounds.y; if (LargestSize < Bounds.z) LargestSize = Bounds.z; //LargestSize = Mathf.CeilToInt (LargestSize); GridLength = Mathf.CeilToInt (LargestSize * resolution); Vector3 GridSize = new Vector3 (GridLength, GridLength, GridLength); BlockLength = Mathf.CeilToInt (LargestSize) / resolution; BlockSize = new Vector3 (BlockLength, BlockLength, BlockLength); //GridSize = GridSize / 2f; // calculate block size depending on the bounds size of the model // so if bounds size is 3, have block size as 3 // then set grid size to block size divided by resolution MyBlocks.Size = GridSize; MyBlocks.InitilizeData(); Vector3[] Verticies = InputMesh.vertices; int[] Indicies = InputMesh.GetIndices (0); Vector3[] Normals = InputMesh.normals; // i have to make the grid size the same as the bounding box //Vector3 BlockSize = new Vector3(resolution, resolution, resolution); //BlockSize = 2f*(BlockSize/(MyBounds.extents.magnitude)); Debug.LogError("Block Size is: " + BlockSize.ToString()); Debug.LogError("Indicies Size is: " + Indicies.Length.ToString()); for (int z = 0; z < Indicies.Length; z += 3) { Vector3 Vertex1 = Verticies[Indicies[z+0]]; Vector3 Vertex2 = Verticies[Indicies[z+1]]; Vector3 Vertex3 = Verticies[Indicies[z+2]]; if (IsNormalsDebug) { Debug.DrawLine (transform.position+Vertex1,transform.position+Vertex1 + Normals[Indicies[z+0]]*NormalsLength, Color.blue, 5); Debug.DrawLine (transform.position+Vertex2,transform.position+Vertex2 + Normals[Indicies[z+1]]*NormalsLength, Color.blue, 5); Debug.DrawLine (transform.position+Vertex3,transform.position+Vertex3 + Normals[Indicies[z+2]]*NormalsLength, Color.blue, 5); } //Debug.LogError ("Triangle " + (z/3) + ": " + Vertex1.ToString() + "---" + Vertex2.ToString() + "---" + Vertex3.ToString()); //Debug.DrawLine (transform.position+new Vector3(startX, startY, startZ),transform.position+new Vector3(endX,endY,endZ), Color.red, 5); // should only do this for the blocks around the triangles // need to optimize this asap // for blocks around triangle? //Vector3 StartBlock = new Vector3(); //StartBlock.x = Mathf.FloorToInt(); // minimum size of the Vertex AARB // find the size of each triangle as an Axis Aligned Rectangle Bounds - AARB Vector3 TrianglePosition = (Vertex2 + Vertex3)/2f; Vector3 TriangleMinimum = new Vector3 (Mathf.Min (Vertex1.x, Vertex2.x, Vertex3.x), Mathf.Min (Vertex1.y, Vertex2.y, Vertex3.y), Mathf.Min (Vertex1.z, Vertex2.z, Vertex3.z)); Vector3 TriangleMaximum = new Vector3 (Mathf.Max (Vertex1.x, Vertex2.x, Vertex3.x), Mathf.Max (Vertex1.y, Vertex2.y, Vertex3.y), Mathf.Max (Vertex1.z, Vertex2.z, Vertex3.z)); Vector3 TriangleSize = new Vector3(); TriangleSize = TriangleMaximum - TriangleMinimum; TriangleSize *= 0.5f; TrianglePosition = TriangleMinimum + TriangleSize; TrianglePosition += InputMesh.bounds.extents; int StartX = Mathf.FloorToInt((TrianglePosition.x-TriangleSize.x)); // before it was 0 int EndX = Mathf.CeilToInt((TrianglePosition.x+TriangleSize.x)/resolution);//MyBlocks.Size.x; i++) int StartY = Mathf.FloorToInt((TrianglePosition.y-TriangleSize.y)); int EndY = Mathf.CeilToInt((TrianglePosition.y+TriangleSize.y)/resolution); int StartZ = Mathf.FloorToInt((TrianglePosition.z-TriangleSize.z)); int EndZ = Mathf.CeilToInt((TrianglePosition.z+TriangleSize.z)/resolution); StartX = 0; StartY = 0; StartZ = 0; EndX = Mathf.CeilToInt(MyBlocks.Size.x)-1; EndY = Mathf.CeilToInt(MyBlocks.Size.y)-1; EndZ = Mathf.CeilToInt(MyBlocks.Size.z)-1; Debug.LogError (z + " || StartX: " + StartX + " - EndX: " + EndX + " || StartY: " + StartY + " - EndY: " + EndY + " || StartZ: " + StartZ + " - EndZ: " + EndZ); Debug.Break (); for (int i = StartX; i <= EndX; i++) for (int j = StartY; j <= EndY; j++) for (int k = StartZ; k <= EndZ; k++) { if (MyBlocks.GetBlockType(new Vector3(i,j,k)) == 0) { Vector3 BlockPosition = BlockSize + MyBounds.center; BlockPosition += 2f*(new Vector3(i*BlockSize.x,j*BlockSize.y,k*BlockSize.z)); if (IsTriangleInGrid(BlockPosition, BlockSize, TrianglePosition, TriangleSize)) { MyBlocks.UpdateBlock(new Vector3(i,j,k), 1); }// else //MyBlocks.UpdateBlock(new Vector3(i,j,k), 0); } } //break; // for now test it once } Debug.LogError ("Size of grid: " + MyBlocks.Size.ToString ()); if (IsDebugGrid) for (int i = 0; i < MyBlocks.Size.x; i++) for (int j = 0; j < MyBlocks.Size.y; j++) for (int k = 0; k < MyBlocks.Size.z; k++) { Vector3 BlockPosition = BlockSize + MyBounds.center; BlockPosition += 2f*(new Vector3(i*BlockSize.x,j*BlockSize.y,k*BlockSize.z)); if (MyBlocks.GetBlockType(new Vector3(i,j,k)) == 0) { if (IsDebugAllBlocks) DebugShapes.DrawCube (BlockPosition+transform.position - MyBounds.extents, BlockSize, Color.white, true); } else { DebugShapes.DrawCube (BlockPosition+transform.position - MyBounds.extents, BlockSize, Color.red, true); } } }