Exemplo n.º 1
0
    /// <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 };
    }
Exemplo n.º 2
0
    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);
    }