Ejemplo n.º 1
0
    public void Generate(Mesh mesh)
    {
        int nvertices = 4 * 6;

        Vector3[] vertices = new Vector3[nvertices];
        int vertexIdx = 0;

        Vector2[] uv = new Vector2[nvertices];
        int uvsIdx = 0;

        Vector3[] normals = new Vector3[nvertices];
        int normalIdx = 0;

        int [] indices = new int[6 * 8];
        int indexIdx = 0;

        Mesh tempMesh = new Mesh();
        QuadGenerator quadGenerator = new QuadGenerator();
        QuadGenerator.QuadProperties quadProperties;

        Vector2 HalfSizeXZ = new Vector2(_properties.HalfSize.x, _properties.HalfSize.z);
        Vector2 HalfSizeXY = new Vector2(_properties.HalfSize.x, _properties.HalfSize.y);
        Vector2 HalfSizeZY = new Vector2(_properties.HalfSize.z, _properties.HalfSize.y);

        // Bottom
        Vector3 position = -_properties.Up * _properties.HalfSize.y;
        Vector3 front = -_properties.Up;
        Vector3 up = Vector3.Cross(_properties.Right, front);
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXZ, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx += AddIndices(indices, tempMesh.triangles, indexIdx, 0);
        uvsIdx += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Top
        position = _properties.Up * _properties.HalfSize.y;
        front = _properties.Up;
        up = Vector3.Cross(_properties.Right, front);
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXZ, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx += AddIndices(indices, tempMesh.triangles, indexIdx, 4);
        uvsIdx += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Left
        position = -_properties.Right * _properties.HalfSize.x;
        front = -_properties.Right;
        up = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeZY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx += AddIndices(indices, tempMesh.triangles, indexIdx, 8);
        uvsIdx += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Right
        position = _properties.Right * _properties.HalfSize.x;
        front = _properties.Right;
        up = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeZY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx += AddIndices(indices, tempMesh.triangles, indexIdx, 12);
        uvsIdx += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Front
        position = _properties.Front * _properties.HalfSize.z;
        front = _properties.Front;
        up = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx += AddIndices(indices, tempMesh.triangles, indexIdx, 16);
        uvsIdx += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Bottom
        position = -_properties.Front * _properties.HalfSize.z;
        front = -_properties.Front;
        up = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx += AddIndices(indices, tempMesh.triangles, indexIdx, 20);
        uvsIdx += AddUVs(uv, tempMesh.uv, uvsIdx);

        mesh.vertices = vertices;
        mesh.normals = normals;
        mesh.triangles = indices;
        mesh.uv = uv;
    }
Ejemplo n.º 2
0
    public void Generate(Mesh mesh)
    {
        int nvertices = 4 * 6;

        Vector3[] vertices  = new Vector3[nvertices];
        int       vertexIdx = 0;

        Vector2[] uv     = new Vector2[nvertices];
        int       uvsIdx = 0;

        Vector3[] normals   = new Vector3[nvertices];
        int       normalIdx = 0;

        int [] indices  = new int[6 * 8];
        int    indexIdx = 0;

        Mesh          tempMesh      = new Mesh();
        QuadGenerator quadGenerator = new QuadGenerator();

        QuadGenerator.QuadProperties quadProperties;

        Vector2 HalfSizeXZ = new Vector2(_properties.HalfSize.x, _properties.HalfSize.z);
        Vector2 HalfSizeXY = new Vector2(_properties.HalfSize.x, _properties.HalfSize.y);
        Vector2 HalfSizeZY = new Vector2(_properties.HalfSize.z, _properties.HalfSize.y);

        // Bottom
        Vector3 position = -_properties.Up * _properties.HalfSize.y;
        Vector3 front    = -_properties.Up;
        Vector3 up       = Vector3.Cross(_properties.Right, front);

        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXZ, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx  += AddIndices(indices, tempMesh.triangles, indexIdx, 0);
        uvsIdx    += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Top
        position       = _properties.Up * _properties.HalfSize.y;
        front          = _properties.Up;
        up             = Vector3.Cross(_properties.Right, front);
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXZ, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx  += AddIndices(indices, tempMesh.triangles, indexIdx, 4);
        uvsIdx    += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Left
        position       = -_properties.Right * _properties.HalfSize.x;
        front          = -_properties.Right;
        up             = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeZY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx  += AddIndices(indices, tempMesh.triangles, indexIdx, 8);
        uvsIdx    += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Right
        position       = _properties.Right * _properties.HalfSize.x;
        front          = _properties.Right;
        up             = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeZY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx  += AddIndices(indices, tempMesh.triangles, indexIdx, 12);
        uvsIdx    += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Front
        position       = _properties.Front * _properties.HalfSize.z;
        front          = _properties.Front;
        up             = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx  += AddIndices(indices, tempMesh.triangles, indexIdx, 16);
        uvsIdx    += AddUVs(uv, tempMesh.uv, uvsIdx);

        // Bottom
        position       = -_properties.Front * _properties.HalfSize.z;
        front          = -_properties.Front;
        up             = _properties.Up;
        quadProperties = new QuadGenerator.QuadProperties(position, HalfSizeXY, front, up);
        quadGenerator.SetProperties(quadProperties);
        quadGenerator.Generate(tempMesh);
        vertexIdx += AddVector3(vertices, tempMesh.vertices, vertexIdx);
        normalIdx += AddVector3(normals, tempMesh.normals, normalIdx);
        indexIdx  += AddIndices(indices, tempMesh.triangles, indexIdx, 20);
        uvsIdx    += AddUVs(uv, tempMesh.uv, uvsIdx);

        mesh.vertices  = vertices;
        mesh.normals   = normals;
        mesh.triangles = indices;
        mesh.uv        = uv;
    }