/// <summary> /// Initializes the MazeCell. pos is in data-space. /// </summary> public void Init(MazeStructure mazeStruct, Point3 pos, Mesh cellFloor, Mesh cellWall, Mesh cellWallTop, Material cellFloorMat, Material cellWallMat, Material cellWallTopMat, VectorSpaceish vectors) { // create cell floor floor = new GameObject("floor - " + cellFloor.name); floor.AddComponent <MeshFilter>().mesh = Morph(cellFloor, mazeStruct, vectors, false); floor.AddComponent <MeshRenderer>().material = (Material)Instantiate(cellFloorMat); floor.transform.parent = transform; // create cell wall wall = new GameObject("cell wall - " + cellWall.name); wall.AddComponent <MeshFilter>().mesh = Morph(cellWall, mazeStruct, vectors, true); wall.AddComponent <MeshCollider>().sharedMesh = wall.GetComponent <MeshFilter>().mesh; wall.AddComponent <MeshRenderer>().material = (Material)Instantiate(cellWallMat); wall.transform.parent = transform; // create cell wall top wallTop = new GameObject("cell wall top - " + cellWallTop.name); wallTop.AddComponent <MeshFilter>().mesh = Morph(cellWallTop, mazeStruct, vectors, true); wallTop.AddComponent <MeshRenderer>().material = (Material)Instantiate(cellWallTopMat); wallTop.transform.parent = transform; plane = new Plane(vectors.vy, vectors.v00); children = new GameObject[] { floor, wall, wallTop }; }
private Mesh Morph(Mesh m, MazeStructure mazeStruct, VectorSpaceish vectors, bool invertTris) { Mesh result = new Mesh(); // create new vertices, the Vector Space given by x,y,z, with base at a Vector3[] verts = new Vector3[m.vertices.Length]; for (int i = 0; i < verts.Length; ++i) { verts[i] = (100 * m.vertices[i]) + new Vector3(1, 0, 1); if (verts[i].x <-0.01f || verts[i].y <-0.01f || verts[i].z <-0.01f || verts[i].x> 1.01f || verts[i].y> 1.01f || verts[i].z> 1.01f) { throw new Exception("Mesh vertices out of range for MazeCell (mesh is " + m.name + ", vertex is at (" + verts[i].x + ", " + verts[i].y + ", " + verts[i].z + "))"); } Vector3 floor = vectors.Translate(verts[i], false); verts[i] = vectors.Translate(verts[i], true); verts[i] = mazeStruct.Vector3FromCubeToSphere(verts[i], floor); } result.vertices = verts; // handle triangles if (invertTris) { int[] tris = new int[m.triangles.Length]; for (int i = 0; i < tris.Length; ++i) { tris[i] = m.triangles[tris.Length - i - 1]; } result.triangles = tris; } else { result.triangles = (int[])m.triangles.Clone(); } // directly copy uvs, calculate normals, optimize result.uv = (Vector2[])m.uv.Clone(); result.RecalculateNormals(); result.Optimize(); return(result); }