Exemplo n.º 1
0
 void CleanData(MeshParams <WorldVertexDefinition> data)
 {
     data.ResetSize();
     lock (m_freeDatasLock)
     {
         m_freeDatas.Add(data);
     }
 }
Exemplo n.º 2
0
    public override void Render(Vector3 pos, MatrixView <BlockData> neighbors, MeshParams <WorldVertexDefinition> meshParams)
    {
        var       block    = neighbors.GetCenter();
        ShapeType shape    = GetShapeTypeData(block.data);
        Rotation  rotation = GetRotationData(block.data);

        if (m_data == null)
        {
            m_data = new BlockRendererData(id, m_material);
        }
        m_data.SetFaceUV(new Rect(0.25f, 0, 0.25f, 1)
                         , new Rect(0.5f, 0, 0.25f, 1)
                         , new Rect(0.0f, 0, 0.25f, 1));
        m_data.rotation = rotation;

        SetDrawFacesFromNeighbors(m_data, neighbors);

        switch (shape)
        {
        case ShapeType.AntiTetrahedral:
            BlockRenderer.DrawAntiTetrahedral(pos, meshParams, m_data);
            break;

        case ShapeType.Cubic:
            BlockRenderer.DrawCubic(pos, meshParams, m_data);
            break;

        case ShapeType.HalfCubic:
            BlockRenderer.DrawHalfCubic(pos, meshParams, m_data);
            break;

        case ShapeType.HorizontalHalfCubic:
            BlockRenderer.DrawHorizontalHalfCubic(pos, meshParams, m_data);
            break;

        case ShapeType.SmallPyramid:
            BlockRenderer.DrawSmallPyramid(pos, meshParams, m_data);
            break;

        case ShapeType.Tetrahedral:
            BlockRenderer.DrawThetrahedral(pos, meshParams, m_data);
            break;

        default:
            Debug.Assert(false);
            break;
        }
    }
Exemplo n.º 3
0
    static void CloneCollisions(MeshParams <WorldVertexDefinition> meshParams, MeshParamData <WorldVertexDefinition> data, int nbVertex, int nbIndex)
    {
        var collisionData = meshParams.AllocateCollider(nbVertex, nbIndex);

        for (int i = 0; i < nbVertex; i++)
        {
            collisionData.vertices[collisionData.verticesSize + i].pos    = data.vertices[data.verticesSize + i].pos;
            collisionData.vertices[collisionData.verticesSize + i].normal = data.vertices[data.verticesSize + i].normal;
        }
        for (int i = 0; i < nbIndex; i++)
        {
            collisionData.indexes[collisionData.indexesSize + i] = (ushort)(data.indexes[data.indexesSize + i] - data.verticesSize + collisionData.verticesSize);
        }

        collisionData.verticesSize += nbVertex;
        collisionData.indexesSize  += nbIndex;
    }
Exemplo n.º 4
0
    void UpdateLayerCollider(MeshCollider obj, int index, MeshParams <WorldVertexDefinition> meshParams)
    {
        var data = meshParams.GetColliderMesh(index);

        var mesh = obj.sharedMesh;

        MeshEx.SetColliderMeshParams(mesh, data.verticesSize, data.indexesSize);

        mesh.SetVertexBufferData(data.vertices, 0, 0, data.verticesSize);
        mesh.SetIndexBufferData(data.indexes, 0, 0, data.indexesSize);

        mesh.subMeshCount = 1;
        mesh.SetSubMesh(0, new UnityEngine.Rendering.SubMeshDescriptor(0, data.indexesSize, MeshTopology.Triangles));

        //full chunk layer
        mesh.bounds = new Bounds(new Vector3(Chunk.chunkSize, Chunk.chunkSize, Chunk.chunkSize) / 2, new Vector3(Chunk.chunkSize, Chunk.chunkSize, Chunk.chunkSize));
    }
Exemplo n.º 5
0
    void UpdateLayerObject(LayerObject obj, Material material, int index, MeshParams <WorldVertexDefinition> meshParams)
    {
        var data = meshParams.GetMesh(material, index);

        obj.meshRenderer.material = material;

        var mesh = obj.meshFilter.mesh;

        MeshEx.SetWorldMeshParams(mesh, data.verticesSize, data.indexesSize);

        mesh.SetVertexBufferData(data.vertices, 0, 0, data.verticesSize);
        mesh.SetIndexBufferData(data.indexes, 0, 0, data.indexesSize);

        mesh.subMeshCount = 1;
        mesh.SetSubMesh(0, new UnityEngine.Rendering.SubMeshDescriptor(0, data.indexesSize, MeshTopology.Triangles));

        //full chunk layer
        mesh.bounds = new Bounds(new Vector3(Chunk.chunkSize, Chunk.chunkSize, Chunk.chunkSize) / 2, new Vector3(Chunk.chunkSize, Chunk.chunkSize, Chunk.chunkSize));
    }
Exemplo n.º 6
0
        public Octree(Vector3 minPoint, Vector3 maxPoint, float minimumSize, MeshParams meshParams)
        {
            m_MinimumSize = minimumSize;
            Root          = null;
            for (int triangleID = 0; triangleID < meshParams.Triangles.Length; triangleID += 3)
            {
                int vertexId1 = meshParams.Triangles[triangleID];
                int vertexId2 = meshParams.Triangles[triangleID + 1];
                int vertexId3 = meshParams.Triangles[triangleID + 2];

                Vector3[] triangleVertices = new Vector3[3]
                {
                    meshParams.VerticesWS[vertexId1],
                    meshParams.VerticesWS[vertexId2],
                    meshParams.VerticesWS[vertexId3]
                };

                Vector3 triangleNormal = meshParams.TrianglesNormals[triangleID / 3];
                Vector2 uv             = Vector2.zero;
                Color   color          = Color.white;

                // Get mesh properties (color, uv) from first vertex in triangle and set to voxel.
                if (meshParams.UVs.Length > 0)
                {
                    uv = meshParams.UVs[vertexId1];
                }
                if (meshParams.Colors.Length > 0)
                {
                    color = meshParams.Colors[vertexId1];
                }

                Vector3[] nodeVertices = Root != null ? Root.Vertices : GetNodeVertices(minPoint, maxPoint);

                if (MathHelper.CheckAABBAndTriangleIntersection(minPoint, maxPoint, triangleVertices,
                                                                nodeVertices, triangleNormal))
                {
                    ProcessRegion(ref Root, nodeVertices, minPoint, maxPoint, triangleVertices, triangleNormal, uv, color);
                }
            }
        }
Exemplo n.º 7
0
    public override void Render(Chunk c, int x, int y, int z, MeshParams <WorldVertexDefinition> meshParams)
    {
        var layer = c.GetLayer(y);

        if (layer == null)
        {
            return;
        }

        var world = c.world;

        int minX, minY, minZ;

        world.BlockPosInChunkToPos(Chunk.chunkSize - 1, Chunk.chunkSize - 1, c.x - 1, c.z - 1, out minX, out minZ);
        minY = c.LayerToHeight(y - 1, Chunk.chunkSize - 1);

        world.GetLocalMatrix(minX, minY, minZ, m_matrix);

        m_view.mat = m_matrix;

        for (int i = 0; i < Chunk.chunkSize; i++)
        {
            for (int j = 0; j < Chunk.chunkSize; j++)
            {
                for (int k = 0; k < Chunk.chunkSize; k++)
                {
                    m_view.SetPos(i + 1, j + 1, k + 1);
                    int centerID = m_matrix.Get(i + 1, j + 1, k + 1).id;
                    if (centerID == 0)
                    {
                        continue;
                    }

                    Vector3 pos = new Vector3(i, j, k);

                    BlockTypeList.instance.Get(centerID).Render(pos, m_view, meshParams);
                }
            }
        }
    }
Exemplo n.º 8
0
 public abstract void Render(Chunk c, int x, int y, int z, MeshParams <WorldVertexDefinition> meshParams);
Exemplo n.º 9
0
 public override void Render(Vector3 pos, MatrixView <BlockData> neighbors, MeshParams <WorldVertexDefinition> meshParams)
 {
     //do nothing here, it's an empty block
 }
Exemplo n.º 10
0
    public static void DrawCubic(Vector3 pos, MeshParams <WorldVertexDefinition> meshParams, BlockRendererData blockData)
    {
        var data = meshParams.Allocate(24, 36, blockData.material);

        int vertexIndex = 0;
        int nb          = 0;

        if (blockData.GetFaceDraw(BlockFace.Left))
        {
            var rect = blockData.GetFaceUV(BlockFaceEx.Rotate(BlockFace.Left, blockData.rotation));
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(0, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(0, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(0, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            vertexIndex += 4;
            nb++;
        }

        if (blockData.GetFaceDraw(BlockFace.Up))
        {
            var rect = blockData.GetFaceUV(BlockFace.Up);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(0, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x + rect.width, rect.y);
            RotateUV(data, data.verticesSize + vertexIndex, 4, (int)blockData.rotation);
            vertexIndex += 4;
            nb++;
        }

        if (blockData.GetFaceDraw(BlockFace.Front))
        {
            var rect = blockData.GetFaceUV(BlockFaceEx.Rotate(BlockFace.Front, blockData.rotation));
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(0, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            vertexIndex += 4;
            nb++;
        }

        if (blockData.GetFaceDraw(BlockFace.Down))
        {
            var rect = blockData.GetFaceUV(BlockFace.Down);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(0, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x, rect.y);
            RotateUV(data, data.verticesSize + vertexIndex, 4, (int)blockData.rotation);
            vertexIndex += 4;
            nb++;
        }

        if (blockData.GetFaceDraw(BlockFace.Right))
        {
            var rect = blockData.GetFaceUV(BlockFaceEx.Rotate(BlockFace.Right, blockData.rotation));
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x, rect.y);
            vertexIndex += 4;
            nb++;
        }

        if (blockData.GetFaceDraw(BlockFace.Back))
        {
            var rect = blockData.GetFaceUV(BlockFaceEx.Rotate(BlockFace.Back, blockData.rotation));
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x, rect.y);
            vertexIndex += 4;
            nb++;
        }

        SetColor(data, data.verticesSize, vertexIndex, new Color32(255, 255, 255, 0));

        SetQuadsIndexs(data, data.verticesSize, data.indexesSize, nb);

        BakeNormals(data, data.indexesSize, nb * 2);
        BakeTangents(data, data.indexesSize, nb * 2);

        if (blockData.collision)
        {
            CloneCollisions(meshParams, data, vertexIndex, nb * 6);
        }

        data.verticesSize += vertexIndex;
        data.indexesSize  += nb * 6;
    }
Exemplo n.º 11
0
 public static void DrawSmallPyramid(Vector3 pos, MeshParams <WorldVertexDefinition> meshParams, BlockRendererData blockData)
 {
 }
Exemplo n.º 12
0
    public static void DrawThetrahedral(Vector3 pos, MeshParams <WorldVertexDefinition> meshParams, BlockRendererData blockData)
    {
        //4 triangles
        // each triangle have 3 vertex and 3 index
        var data = meshParams.Allocate(12, 12, blockData.material);

        var rot = blockData.rotation;

        int vertexIndex = 0;
        int nb          = 0;

        if (blockData.GetFaceDraw(BlockFace.Down))
        {
            var rect = blockData.GetFaceUV(BlockFace.Down);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x, rect.y);
            vertexIndex += 3;
            nb++;
        }

        if (blockData.GetFaceDraw(BlockFaceEx.Rotate(BlockFace.Back, rot)))
        {
            var rect = blockData.GetFaceUV(BlockFace.Back);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            vertexIndex += 3;
            nb++;
        }

        if (blockData.GetFaceDraw(BlockFaceEx.Rotate(BlockFace.Right, rot)))
        {
            var rect = blockData.GetFaceUV(BlockFace.Right);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            vertexIndex += 3;
            nb++;
        }

        //top face is drawn in all cases
        {
            var rect = blockData.GetFaceUV(BlockFace.Up);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            vertexIndex += 3;
            nb++;
        }

        SetColor(data, data.verticesSize, vertexIndex, new Color32(255, 255, 255, 0));

        SetTrianglesIndexs(data, data.verticesSize, data.indexesSize, nb);

        RotatePos(data, data.verticesSize, vertexIndex, pos, rot);

        BakeNormals(data, data.indexesSize, nb);
        BakeTangents(data, data.indexesSize, nb);

        if (blockData.collision)
        {
            CloneCollisions(meshParams, data, vertexIndex, nb * 3);
        }

        data.verticesSize += vertexIndex;
        data.indexesSize  += nb * 3;
    }
Exemplo n.º 13
0
    public static void DrawHorizontalHalfCubic(Vector3 pos, MeshParams <WorldVertexDefinition> meshParams, BlockRendererData blockData)
    {
        //3 square and 2 triangles
        // each square have 4 vertex and 6 index
        // each triangle have 3 vertex and 3 index
        var data = meshParams.Allocate(18, 24, blockData.material);

        var rot = blockData.rotation;

        int vertexIndex = 0;
        int nbSquare    = 0;
        int nbTriangle  = 0;

        if (blockData.GetFaceDraw(BlockFaceEx.Rotate(BlockFace.Right, rot)))
        {
            var rect = blockData.GetFaceUV(BlockFace.Right);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x, rect.y);
            vertexIndex += 4;
            nbSquare++;
        }

        if (blockData.GetFaceDraw(BlockFaceEx.Rotate(BlockFace.Back, rot)))
        {
            var rect = blockData.GetFaceUV(BlockFace.Back);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x, rect.y);
            vertexIndex += 4;
            nbSquare++;
        }

        //diagonal face is drawn in all cases
        {
            var rect = blockData.GetFaceUV(BlockFace.Front);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(0, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 3].pos = new Vector3(1, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 3].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            vertexIndex += 4;
            nbSquare++;
        }

        if (blockData.GetFaceDraw(BlockFace.Down))
        {
            var rect = blockData.GetFaceUV(BlockFace.Down);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(1, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(1, 0, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(0, 0, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x, rect.y);
            vertexIndex += 3;
            nbTriangle++;
        }

        if (blockData.GetFaceDraw(BlockFace.Up))
        {
            var rect = blockData.GetFaceUV(BlockFace.Up);
            data.vertices[data.verticesSize + vertexIndex].pos     = new Vector3(1, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex].uv      = new Vector2(rect.x + rect.width, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 1].pos = new Vector3(0, 1, 0) + pos;
            data.vertices[data.verticesSize + vertexIndex + 1].uv  = new Vector2(rect.x, rect.y);
            data.vertices[data.verticesSize + vertexIndex + 2].pos = new Vector3(1, 1, 1) + pos;
            data.vertices[data.verticesSize + vertexIndex + 2].uv  = new Vector2(rect.x + rect.width, rect.y + rect.height);
            vertexIndex += 3;
            nbTriangle++;
        }

        SetColor(data, data.verticesSize, vertexIndex, new Color32(255, 255, 255, 0));

        SetQuadsIndexs(data, data.verticesSize, data.indexesSize, nbSquare);
        SetTrianglesIndexs(data, data.verticesSize + 4 * nbSquare, data.indexesSize + 6 * nbSquare, nbTriangle);

        RotatePos(data, data.verticesSize, vertexIndex, pos, rot);

        BakeNormals(data, data.indexesSize, nbSquare * 2 + nbTriangle);
        BakeTangents(data, data.indexesSize, nbSquare * 2 + nbTriangle);

        if (blockData.collision)
        {
            CloneCollisions(meshParams, data, vertexIndex, nbSquare * 6 + nbTriangle * 3);
        }

        data.verticesSize += vertexIndex;
        data.indexesSize  += nbSquare * 6 + nbTriangle * 3;
    }
Exemplo n.º 14
0
 public abstract void Render(Vector3 pos, MatrixView <BlockData> neighbors, MeshParams <WorldVertexDefinition> meshParams);
Exemplo n.º 15
0
    void StartNextTask()
    {
        //create next task
        MeshParams <WorldVertexDefinition> data = null;

        lock (m_freeDatasLock)
        {
            if (m_freeDatas.Count > 0)
            {
                data = m_freeDatas[0];
                m_freeDatas.RemoveAt(0);
            }
        }
        if (data == null)
        {
            return;
        }

        int nextJobID = GetNearestJobIndex();

        lock (m_waitingJobsLock)
        {
            Job job = null;

            if (nextJobID >= 0)
            {
                job = m_waitingJobs[nextJobID];
                m_waitingJobs.RemoveAt(nextJobID);
            }

            if (job == null)
            {
                lock (m_freeDatasLock)
                {
                    m_freeDatas.Add(data);
                }
                return;
            }

            data.ResetSize();
            job.data = data;

            lock (m_doingJobStatusLock)
            {
                lock (m_doingJobLock)
                {
                    Debug.Assert(m_doingJob == null);
                    m_doingJob = job;
                    m_doingJobStatus.CloneJob(m_doingJob);
                }
            }
        }

        DoJob();

        //move task to ended task
        lock (m_doingJobLock)
        {
            lock (m_doingJobStatusLock)
            {
                m_doingJobStatus.working = false;
                m_doingJob.aborted       = m_doingJobStatus.aborted;
            }

            lock (m_endedJobsLock)
            {
                if (m_doingJob.aborted)
                {
                    CleanData(m_doingJob.data);
                }
                else
                {
                    m_endedJobs.Add(m_doingJob);
                }

                m_doingJob = null;
            }
        }
    }