Ejemplo n.º 1
0
    /// <summary>
    /// Used to first generate the plane's verts, uvs and tris
    /// If already generated, turns on this CubeFace's renderer and collider (makes it active on the planet)
    /// </summary>
    public void Generate()
    {
        int vertCount      = 0;
        int cNeighborState = 0;

        int nowValue = terrain.GetQuadMatrixData(terrain.GetQuadX(this), terrain.GetQuadZ(this));

        // forward
        int forwardZ = terrain.GetQuadZ(this) + (int)this.scale;

        if (forwardZ < terrain.quadSize)
        {
            if (terrain.GetQuadMatrixData(terrain.GetQuadX(this), forwardZ) != 255 &&
                terrain.GetQuadMatrixData(terrain.GetQuadX(this), forwardZ) != 0)
            {
                cNeighborState |= (int)Neighbor.forward;
                vertCount++;
            }
        }
        int backZ = terrain.GetQuadZ(this) - (int)this.scale;

        if (backZ >= 0)
        {
            if (terrain.GetQuadMatrixData(terrain.GetQuadX(this), backZ) != 255 &&
                terrain.GetQuadMatrixData(terrain.GetQuadX(this), backZ) != 0)
            {
                cNeighborState |= (int)Neighbor.back;
                vertCount++;
            }
        }

        // left
        int leftX = terrain.GetQuadX(this) + (int)this.scale;

        if (leftX < terrain.quadSize)
        {
            if (terrain.GetQuadMatrixData(leftX, terrain.GetQuadZ(this)) != 255 &&
                terrain.GetQuadMatrixData(leftX, terrain.GetQuadZ(this)) != 0)
            {
                cNeighborState |= (int)Neighbor.left;
                vertCount++;
            }
        }
        int rightX = terrain.GetQuadX(this) - (int)this.scale;

        if (rightX >= 0)
        {
            if (terrain.GetQuadMatrixData(rightX, terrain.GetQuadZ(this)) != 255 &&
                terrain.GetQuadMatrixData(rightX, terrain.GetQuadZ(this)) != 0)
            {
                cNeighborState |= (int)Neighbor.right;
                vertCount++;
            }
        }

        renderer.enabled = true;

        if (generated && cNeighborState == neighborState)
        {
            //if (parent != null)
            //    parent.collider.enabled = false;
            //collider.enabled = true;
            return;
        }

        neighborState = cNeighborState;

        finalized = false;

        // 如果是lod最大值,即scale == 2,那么如果旁边是更高的scale,则跳过这个点即可
        // 如果不是,获得,上右,上左,下左,下右是否有子树,如果都没有子树,那么与lod最大值同理

        mesh      = new Mesh();
        mesh.name = "Mesh_" + gameObject.name;

        int size = 2;


        var verts = new Vector3[(size + 1) * (size + 1) - vertCount];
        var tris  = new int[size * size * 6 - vertCount * 3];

        var uvs      = new Vector2[(size + 1) * (size + 1) - vertCount];
        var uvFactor = 1.0f / size;

        int cx = 1;
        int cz = 1;
        var px = (float)cx / size;
        var pz = (float)cz / size;
        var vx = left * px * scale;
        var vz = forward * pz * scale;

        uvs[0]   = new Vector2(cx * uvFactor, cz * uvFactor);
        verts[0] = position + vx + vz;

        int i = 1;

        int x = 0;
        int z = 0;

        px       = (float)(x) / size;
        pz       = (float)z / size;
        vx       = left * px * scale;
        vz       = forward * pz * scale;
        uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
        verts[i] = position + vx + vz;

        i++;
        if ((cNeighborState & ((int)Neighbor.back)) == 0)
        {
            x = 1;
            z = 0;

            px       = (float)(x) / size;
            pz       = (float)z / size;
            vx       = left * px * scale;
            vz       = forward * pz * scale;
            uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
            verts[i] = position + vx + vz;

            i++;
        }

        x = 2;
        z = 0;

        px       = (float)(x) / size;
        pz       = (float)z / size;
        vx       = left * px * scale;
        vz       = forward * pz * scale;
        uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
        verts[i] = position + vx + vz;

        i++;

        if ((cNeighborState & ((int)Neighbor.left)) == 0)
        {
            x = 2;
            z = 1;

            px       = (float)(x) / size;
            pz       = (float)z / size;
            vx       = left * px * scale;
            vz       = forward * pz * scale;
            uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
            verts[i] = position + vx + vz;

            i++;
        }

        x = 2;
        z = 2;

        px       = (float)(x) / size;
        pz       = (float)z / size;
        vx       = left * px * scale;
        vz       = forward * pz * scale;
        uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
        verts[i] = position + vx + vz;

        i++;

        if ((cNeighborState & ((int)Neighbor.forward)) == 0)
        {
            x = 1;
            z = 2;

            px       = (float)(x) / size;
            pz       = (float)z / size;
            vx       = left * px * scale;
            vz       = forward * pz * scale;
            uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
            verts[i] = position + vx + vz;

            i++;
        }

        x = 0;
        z = 2;

        px       = (float)(x) / size;
        pz       = (float)z / size;
        vx       = left * px * scale;
        vz       = forward * pz * scale;
        uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
        verts[i] = position + vx + vz;

        i++;

        if ((cNeighborState & ((int)Neighbor.right)) == 0)
        {
            x = 0;
            z = 1;

            px       = (float)(x) / size;
            pz       = (float)z / size;
            vx       = left * px * scale;
            vz       = forward * pz * scale;
            uvs[i]   = new Vector2(x * uvFactor, z * uvFactor);
            verts[i] = position + vx + vz;
        }


        // Calculate tris
        int ti = 0;

        for (int vi = 1; vi < verts.Length - 1; ti += 3, vi += 1)
        {
            tris[ti]     = 0;
            tris[ti + 1] = vi + 1;
            tris[ti + 2] = vi;
        }

        tris[ti]     = 0;
        tris[ti + 1] = 1;
        tris[ti + 2] = verts.Length - 1;


        mesh.vertices  = verts;
        mesh.uv        = uvs;
        mesh.triangles = tris;

        if (parent != null)
        {
            parent.Dispose();
        }

        generated = true;
    }