public static void CreateCube(ProceduralMesh mesh, float width, float height, float depth, Vector3 center, Rect[] uvRect, int excludeFaces = 0) { float halfWidth = width * 0.5f; float halfHeight = height * 0.5f; float halfDepth = depth * 0.5f; bool hasFrontFace = (excludeFaces & (int)FaceDirection.FRONT) == 0, hasTopFace = (excludeFaces & (int)FaceDirection.TOP) == 0, hasRightFace = (excludeFaces & (int)FaceDirection.RIGHT) == 0, hasBackFace = (excludeFaces & (int)FaceDirection.BACK) == 0, hasBottomFace = (excludeFaces & (int)FaceDirection.BOTTOM) == 0, hasLeftFace = (excludeFaces & (int)FaceDirection.LEFT) == 0; int i = mesh.vertexCount; // front mesh.AddVertex (center + new Vector3 (-halfWidth, halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, -halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, -halfHeight, -halfDepth)); // top mesh.AddVertex (center + new Vector3 (-halfWidth, halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, halfHeight, -halfDepth)); // right mesh.AddVertex (center + new Vector3 (halfWidth, halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, -halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, -halfHeight, -halfDepth)); // back mesh.AddVertex (center + new Vector3 (halfWidth, halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, -halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, -halfHeight, halfDepth)); // bottom mesh.AddVertex (center + new Vector3 (halfWidth, -halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, -halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, -halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (halfWidth, -halfHeight, halfDepth)); // left mesh.AddVertex (center + new Vector3 (-halfWidth, halfHeight, -halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, -halfHeight, halfDepth)); mesh.AddVertex (center + new Vector3 (-halfWidth, -halfHeight, -halfDepth)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, -1.0f)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, -1.0f)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, -1.0f)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, -1.0f)); mesh.AddNormal (new Vector3 (0.0f, 1.0f, 0.0f)); mesh.AddNormal (new Vector3 (0.0f, 1.0f, 0.0f)); mesh.AddNormal (new Vector3 (0.0f, 1.0f, 0.0f)); mesh.AddNormal (new Vector3 (0.0f, 1.0f, 0.0f)); mesh.AddNormal (new Vector3 (1.0f, 0.0f, 0.0f)); mesh.AddNormal (new Vector3 (1.0f, 0.0f, 0.0f)); mesh.AddNormal (new Vector3 (1.0f, 0.0f, 0.0f)); mesh.AddNormal (new Vector3 (1.0f, 0.0f, 0.0f)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, 1.0f)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, 1.0f)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, 1.0f)); mesh.AddNormal (new Vector3 (0.0f, 0.0f, 1.0f)); mesh.AddNormal (new Vector3 (0.0f, -1.0f, 0.0f)); mesh.AddNormal (new Vector3 (0.0f, -1.0f, 0.0f)); mesh.AddNormal (new Vector3 (0.0f, -1.0f, 0.0f)); mesh.AddNormal (new Vector3 (0.0f, -1.0f, 0.0f)); mesh.AddNormal (new Vector3 (-1.0f, 0.0f, 0.0f)); mesh.AddNormal (new Vector3 (-1.0f, 0.0f, 0.0f)); mesh.AddNormal (new Vector3 (-1.0f, 0.0f, 0.0f)); mesh.AddNormal (new Vector3 (-1.0f, 0.0f, 0.0f)); // front mesh.AddUv (new Vector2 (uvRect [0].xMin, uvRect [0].yMax)); mesh.AddUv (new Vector2 (uvRect [0].xMax, uvRect [0].yMax)); mesh.AddUv (new Vector2 (uvRect [0].xMax, uvRect [0].yMin)); mesh.AddUv (new Vector2 (uvRect [0].xMin, uvRect [0].yMin)); // top mesh.AddUv (new Vector2 (uvRect [1].xMin, uvRect [1].yMax)); mesh.AddUv (new Vector2 (uvRect [1].xMax, uvRect [1].yMax)); mesh.AddUv (new Vector2 (uvRect [1].xMax, uvRect [1].yMin)); mesh.AddUv (new Vector2 (uvRect [1].xMin, uvRect [1].yMin)); // right mesh.AddUv (new Vector2 (uvRect [2].xMin, uvRect [2].yMax)); mesh.AddUv (new Vector2 (uvRect [2].xMax, uvRect [2].yMax)); mesh.AddUv (new Vector2 (uvRect [2].xMax, uvRect [2].yMin)); mesh.AddUv (new Vector2 (uvRect [2].xMin, uvRect [2].yMin)); // back mesh.AddUv (new Vector2 (uvRect [3].xMin, uvRect [3].yMax)); mesh.AddUv (new Vector2 (uvRect [3].xMax, uvRect [3].yMax)); mesh.AddUv (new Vector2 (uvRect [3].xMax, uvRect [3].yMin)); mesh.AddUv (new Vector2 (uvRect [3].xMin, uvRect [3].yMin)); // bottom mesh.AddUv (new Vector2 (uvRect [4].xMin, uvRect [4].yMin)); mesh.AddUv (new Vector2 (uvRect [4].xMax, uvRect [4].yMin)); mesh.AddUv (new Vector2 (uvRect [4].xMax, uvRect [4].yMax)); mesh.AddUv (new Vector2 (uvRect [4].xMin, uvRect [4].yMax)); // left mesh.AddUv (new Vector2 (uvRect [5].xMin, uvRect [5].yMax)); mesh.AddUv (new Vector2 (uvRect [5].xMax, uvRect [5].yMax)); mesh.AddUv (new Vector2 (uvRect [5].xMax, uvRect [5].yMin)); mesh.AddUv (new Vector2 (uvRect [5].xMin, uvRect [5].yMin)); // front if (hasFrontFace) { mesh.AddIndex (i); mesh.AddIndex (i + 1); mesh.AddIndex (i + 2); mesh.AddIndex (i); mesh.AddIndex (i + 2); mesh.AddIndex (i + 3); } else { mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); } // top if (hasTopFace) { mesh.AddIndex (i + 4); mesh.AddIndex (i + 5); mesh.AddIndex (i + 6); mesh.AddIndex (i + 4); mesh.AddIndex (i + 6); mesh.AddIndex (i + 7); } else { mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); } // right if (hasRightFace) { mesh.AddIndex (i + 8); mesh.AddIndex (i + 9); mesh.AddIndex (i + 10); mesh.AddIndex (i + 8); mesh.AddIndex (i + 10); mesh.AddIndex (i + 11); } else { mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); } // back if (hasBackFace) { mesh.AddIndex (i + 12); mesh.AddIndex (i + 13); mesh.AddIndex (i + 14); mesh.AddIndex (i + 12); mesh.AddIndex (i + 14); mesh.AddIndex (i + 15); } else { mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); } // bottom if (hasBottomFace) { mesh.AddIndex (i + 16); mesh.AddIndex (i + 18); mesh.AddIndex (i + 17); mesh.AddIndex (i + 16); mesh.AddIndex (i + 19); mesh.AddIndex (i + 18); } else { mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); } // left if (hasLeftFace) { mesh.AddIndex (i + 20); mesh.AddIndex (i + 22); mesh.AddIndex (i + 21); mesh.AddIndex (i + 20); mesh.AddIndex (i + 23); mesh.AddIndex (i + 22); } else { mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); mesh.AddIndex (0); } }