예제 #1
0
 static void applyHeightMap(Vector3[] vertices, IXHeightMap heightMap)
 {
     for (int i = 0; i < vertices.Length; i++)
     {
         Vector3 vertex = vertices[i];
         vertices[i].y = heightMap.yFor(vertex.x, vertex.z);
     }
 }
예제 #2
0
    public CaveMesh create(OIGrid grid, int wallHeight)
    {
        //grid = grid.mirror();
        grid = grid.rotate90();

        IXHeightMap floorHeight = new XFlatHeightMap(0);
        //IXHeightMap ceilHeight = new XFlatHeightMap(wallHeight);
        IXHeightMap ceilHeight = _ceilHeightMap;

        Mesh floorMesh = createPlaneMesh(grid.invert(), floorHeight);
        Mesh ceilMesh  = createPlaneMesh(grid, ceilHeight);
        Mesh wallMesh  = createWallMesh(grid, floorHeight, ceilHeight);

        return(new CaveMesh(ceilMesh, wallMesh, floorMesh));
    }
예제 #3
0
    static Mesh createPlaneMesh(OIGrid grid, IXHeightMap heightMap)
    {
        Mesh mesh = new XTriangulator().triangolate(grid);

        Vector3[] vert = mesh.vertices; //NOTA: mesh.vertices ritorna un CLONE

        mesh.uv = flatUVfor(vert);

        applyHeightMap(vert, heightMap);
        mesh.vertices = vert;

        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
        //TANGENTS ????
        return(mesh);
    }
예제 #4
0
    private Mesh createWallMesh(OIGrid grid, IXHeightMap floorHeighMap, IXHeightMap ceilHeightMap)
    {
        int[,] map = grid.asMatrix();

        Vector3 center     = new Vector3(-map.GetLength(1) / 2f + 0.5f, 0, -map.GetLength(0) / 2f + 0.5f);
        int     squareSize = 1;

        List <Vector3[]> outlines    = XOutlineGenerator.Generate(grid, center, squareSize);
        XMeshAdapter     meshAdapter = new XMeshAdapter();

        meshAdapter.vertices  = XWallBuilder.GetVertices(outlines, floorHeighMap, ceilHeightMap);
        meshAdapter.uv        = XWallBuilder.GetUVs(outlines, meshAdapter.vertices);
        meshAdapter.triangles = XWallBuilder.GetTriangles(outlines);

        return(meshAdapter.asMesh());
    }
예제 #5
0
    /*
     *  public static MeshData Build(WallGrid grid, IHeightMap floorHeightMap, IHeightMap ceilingHeightMap)
     *  {
     *      List<Vector3[]> outlines = OutlineGenerator.Generate(grid);
     *
     *      MeshData mesh = new MeshData();
     *      mesh.vertices  = GetVertices(outlines, floorHeightMap, ceilingHeightMap);
     *      mesh.uv        = GetUVs(outlines, mesh.vertices);
     *      mesh.triangles = GetTriangles(outlines);
     *      return mesh;
     *  }
     */
    public static Vector3[] GetVertices(List <Vector3[]> outlines, IXHeightMap floorHeightMap, IXHeightMap ceilHeightMap)
    {
        int numWallVertices = 2 * outlines.Sum(outline => outline.Length);
        var vertices        = new Vector3[numWallVertices];

        int vertexIndex = 0;

        foreach (Vector3[] outline in outlines)
        {
            for (int i = 0; i < outline.Length; i++)
            {
                Vector3 vertex = outline[i];
                float   x      = vertex.x;
                float   z      = vertex.z;
                //vertices[vertexIndex++] = new Vector3(x, ceilingHeightMap.GetHeight(x, z), z);
                //vertices[vertexIndex++] = new Vector3(x, floorHeightMap.GetHeight(x, z), z);
                vertices[vertexIndex++] = new Vector3(x, floorHeightMap.yFor(x, z), z);
                vertices[vertexIndex++] = new Vector3(x, ceilHeightMap.yFor(x, z), z);
            }
        }
        return(vertices);
    }
예제 #6
0
 public CaveMeshFactory(IXHeightMap ceilHeightMap)
 {
     _ceilHeightMap = ceilHeightMap;
 }