예제 #1
0
    protected void AddFace(NBTMesh mesh, FaceAttributes fa, CubeAttributes ca)
    {
        UnityEngine.Profiling.Profiler.BeginSample("AddFace");
        ushort startIndex = mesh.vertexCount;

        if (fa.skyLight == null)
        {
            fa.skyLight = skylight_default;
        }
        if (fa.blockLight == null)
        {
            fa.blockLight = blocklight_default;
        }

        SetVertex(mesh, fa.pos[0] + ca.pos, fa.faceIndex, fa.uv[0], fa.skyLight[0], fa.blockLight[0], fa.color, fa.normal);
        SetVertex(mesh, fa.pos[1] + ca.pos, fa.faceIndex, fa.uv[1], fa.skyLight[1], fa.blockLight[1], fa.color, fa.normal);
        SetVertex(mesh, fa.pos[2] + ca.pos, fa.faceIndex, fa.uv[2], fa.skyLight[2], fa.blockLight[2], fa.color, fa.normal);
        SetVertex(mesh, fa.pos[3] + ca.pos, fa.faceIndex, fa.uv[3], fa.skyLight[3], fa.blockLight[3], fa.color, fa.normal);

        mesh.triangleArray[mesh.triangleCount++] = startIndex;
        mesh.triangleArray[mesh.triangleCount++] = (ushort)(startIndex + 1);
        mesh.triangleArray[mesh.triangleCount++] = (ushort)(startIndex + 2);
        mesh.triangleArray[mesh.triangleCount++] = startIndex;
        mesh.triangleArray[mesh.triangleCount++] = (ushort)(startIndex + 2);
        mesh.triangleArray[mesh.triangleCount++] = (ushort)(startIndex + 3);
        UnityEngine.Profiling.Profiler.EndSample();
    }
예제 #2
0
    public override Mesh GetItemMesh(NBTChunk chunk, Vector3Int pos, byte blockData)
    {
        CubeAttributes ca = new CubeAttributes();

        ca.blockData = blockData;

        NBTMesh nbtMesh = new NBTMesh(256);

        chunk.GetLights(pos.x - chunk.x * 16, pos.y, pos.z - chunk.z * 16, out float skyLight, out float blockLight);

        FaceAttributes fa = new FaceAttributes();

        fa.faceIndex  = TextureArrayManager.GetIndexByName(GetNameByData(blockData));
        fa.skyLight   = new float[] { skyLight, skyLight, skyLight, skyLight };
        fa.blockLight = new float[] { blockLight, blockLight, blockLight, blockLight };
        fa.color      = Color.white;

        FillMesh(fa, ca, nbtMesh);

        nbtMesh.Refresh();

        nbtMesh.Dispose();

        return(nbtMesh.mesh);
    }
예제 #3
0
    void FillMesh(NBTChunk chunk, CubeAttributes ca, NBTMesh nbtMesh)
    {
        chunk.GetLights(ca.pos.x, ca.pos.y, ca.pos.z, out float skyLight, out float blockLight);

        FaceAttributes fa = new FaceAttributes();

        fa.faceIndex  = TextureArrayManager.GetIndexByName("ladder");
        fa.color      = Color.white;
        fa.skyLight   = new float[] { skyLight, skyLight, skyLight, skyLight };
        fa.blockLight = new float[] { blockLight, blockLight, blockLight, blockLight };
        fa.normal     = Vector3.zero;
        fa.uv         = uv_zero;

        if (ca.blockData == 2)
        {
            fa.pos = frontFace;
            AddFace(nbtMesh, fa, ca);
        }
        else if (ca.blockData == 3)
        {
            fa.pos = backFace;
            AddFace(nbtMesh, fa, ca);
        }
        else if (ca.blockData == 4)
        {
            fa.pos = leftFace;
            AddFace(nbtMesh, fa, ca);
        }
        else if (ca.blockData == 5)
        {
            fa.pos = rightFace;
            AddFace(nbtMesh, fa, ca);
        }
    }
예제 #4
0
    public override Mesh GetItemMesh(byte data = 0)
    {
        CubeAttributes ca = new CubeAttributes();

        NBTMesh nbtMesh = new NBTMesh(256);

        FaceAttributes fa = new FaceAttributes();

        //fa.skyLight = skylight_default;
        //fa.blockLight = blocklight_default;
        fa.color = Color.white;
        fa.uv    = uv_zero;

        try
        {
            fa.pos       = frontVertices;
            fa.normal    = Vector3.forward;
            fa.faceIndex = TextureArrayManager.GetIndexByName(frontName);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = backVertices;
            fa.normal    = Vector3.back;
            fa.faceIndex = TextureArrayManager.GetIndexByName(backName);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = topVertices;
            fa.normal    = Vector3.up;
            fa.faceIndex = TextureArrayManager.GetIndexByName(topName);
            fa.color     = TintManager.tintColor;
            AddFace(nbtMesh, fa, ca);
            fa.color = Color.white;

            fa.pos       = bottomVertices;
            fa.normal    = Vector3.down;
            fa.faceIndex = TextureArrayManager.GetIndexByName(bottomName);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = leftVertices;
            fa.normal    = Vector3.left;
            fa.faceIndex = TextureArrayManager.GetIndexByName(leftName);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = rightVertices;
            fa.normal    = Vector3.right;
            fa.faceIndex = TextureArrayManager.GetIndexByName(rightName);
            AddFace(nbtMesh, fa, ca);
        }
        catch (System.Exception e)
        {
            Debug.LogError("GetItemMesh error,generator=" + GetType() + ",message=\n" + e.Message);
        }

        nbtMesh.Refresh();

        nbtMesh.Dispose();

        return(nbtMesh.mesh);
    }
예제 #5
0
    void AddAntiDiagonalFace(NBTChunk chunk, NBTMesh mesh, CubeAttributes ca)
    {
        chunk.GetLights(ca.pos.x, ca.pos.y, ca.pos.z, out float skyLight, out float blockLight);

        antidiagonalFA.pos           = antiDiagonalFace;
        antidiagonalFA.faceIndex     = GetPlantIndexByData(chunk, ca.pos, ca.blockData);
        antidiagonalFA.color         = GetTintColorByData(chunk, ca.pos, ca.blockData);
        antidiagonalFA.skyLight[0]   = skyLight;
        antidiagonalFA.skyLight[1]   = skyLight;
        antidiagonalFA.skyLight[2]   = skyLight;
        antidiagonalFA.skyLight[3]   = skyLight;
        antidiagonalFA.blockLight[0] = blockLight;
        antidiagonalFA.blockLight[1] = blockLight;
        antidiagonalFA.blockLight[2] = blockLight;
        antidiagonalFA.blockLight[3] = blockLight;
        antidiagonalFA.normal        = Vector3.zero;
        antidiagonalFA.uv            = uv_plant;

        AddFace(mesh, antidiagonalFA, ca);
    }
예제 #6
0
    protected void InitBlockAttributes(NBTChunk chunk, ref CubeAttributes ca)
    {
        UnityEngine.Profiling.Profiler.BeginSample("InitBlockAttributes");

        ca.front  = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y, ca.pos.z - 1);
        ca.back   = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y, ca.pos.z + 1);
        ca.left   = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y, ca.pos.z);
        ca.right  = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y, ca.pos.z);
        ca.top    = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y + 1, ca.pos.z);
        ca.bottom = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y - 1, ca.pos.z);

        if (ca.front.exist == 0 || ca.back.exist == 0 || ca.left.exist == 0 || ca.right.exist == 0 || ca.top.exist == 0 || ca.bottom.exist == 0)
        {
            ca.frontTop         = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y + 1, ca.pos.z - 1);
            ca.frontBottom      = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y - 1, ca.pos.z - 1);
            ca.frontLeft        = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y, ca.pos.z - 1);
            ca.frontRight       = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y, ca.pos.z - 1);
            ca.frontTopLeft     = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y + 1, ca.pos.z - 1);
            ca.frontTopRight    = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y + 1, ca.pos.z - 1);
            ca.frontBottomLeft  = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y - 1, ca.pos.z - 1);
            ca.frontBottomRight = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y - 1, ca.pos.z - 1);

            ca.backTop         = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y + 1, ca.pos.z + 1);
            ca.backBottom      = InitBlockLightAttributes(chunk, ca.pos.x, ca.pos.y - 1, ca.pos.z + 1);
            ca.backLeft        = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y, ca.pos.z + 1);
            ca.backRight       = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y, ca.pos.z + 1);
            ca.backTopLeft     = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y + 1, ca.pos.z + 1);
            ca.backTopRight    = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y + 1, ca.pos.z + 1);
            ca.backBottomLeft  = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y - 1, ca.pos.z + 1);
            ca.backBottomRight = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y - 1, ca.pos.z + 1);

            ca.topLeft  = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y + 1, ca.pos.z);
            ca.topRight = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y + 1, ca.pos.z);

            ca.bottomLeft  = InitBlockLightAttributes(chunk, ca.pos.x - 1, ca.pos.y - 1, ca.pos.z);
            ca.bottomRight = InitBlockLightAttributes(chunk, ca.pos.x + 1, ca.pos.y - 1, ca.pos.z);
        }
        UnityEngine.Profiling.Profiler.EndSample();
    }
예제 #7
0
    public override Mesh GetItemMesh(byte data = 0)
    {
        CubeAttributes ca = new CubeAttributes();

        ca.blockData = data;

        NBTMesh nbtMesh = new NBTMesh(256);

        FaceAttributes fa = new FaceAttributes();

        fa.faceIndex  = TextureArrayManager.GetIndexByName(GetNameByData(data));
        fa.skyLight   = skylight_default;
        fa.blockLight = blocklight_default;
        fa.color      = Color.white;

        FillMesh(fa, ca, nbtMesh);

        nbtMesh.Refresh();

        nbtMesh.Dispose();

        return(nbtMesh.mesh);
    }
예제 #8
0
    protected override FaceAttributes GetRightFaceAttributes(NBTChunk chunk, NBTMesh mesh, CubeAttributes ca)
    {
        chunk.GetLights(ca.pos.x + 1, ca.pos.y, ca.pos.z, out float skyLight, out float blockLight);

        FaceAttributes fa = new FaceAttributes();

        if (ca.blockData >= 8)
        {
            fa.pos = rightVertices_top;
            fa.uv  = uv_top;
        }
        else
        {
            fa.pos = rightVertices_bottom;
            fa.uv  = uv_bot;
        }
        fa.faceIndex  = GetRightIndexByData(chunk, ca.blockData);
        fa.color      = GetRightTintColorByData(chunk, ca.pos, ca.blockData);
        fa.skyLight   = new float[] { skyLight, skyLight, skyLight, skyLight };
        fa.blockLight = new float[] { blockLight, blockLight, blockLight, blockLight };
        fa.normal     = Vector3.right;

        return(fa);
    }
예제 #9
0
    void FillMesh(FaceAttributes fa, CubeAttributes ca, NBTMesh nbtMesh)
    {
        if (ca.blockData >= 8)
        {
            fa.pos = frontVertices_top;
            fa.uv  = uv_top;
        }
        else
        {
            fa.pos = frontVertices_bottom;
            fa.uv  = uv_bot;
        }
        fa.normal = Vector3.forward;
        AddFace(nbtMesh, fa, ca);

        if (ca.blockData >= 8)
        {
            fa.pos = backVertices_top;
            fa.uv  = uv_top;
        }
        else
        {
            fa.pos = backVertices_bottom;
            fa.uv  = uv_bot;
        }
        fa.normal = Vector3.back;
        AddFace(nbtMesh, fa, ca);

        if (ca.blockData >= 8)
        {
            fa.pos = topVertices_top;
        }
        else
        {
            fa.pos = topVertices_bottom;
        }
        fa.uv     = uv_full;
        fa.normal = Vector3.up;
        AddFace(nbtMesh, fa, ca);

        fa.color = Color.white;

        if (ca.blockData >= 8)
        {
            fa.pos = bottomVertices_top;
        }
        else
        {
            fa.pos = bottomVertices_bottom;
        }
        fa.uv     = uv_full;
        fa.normal = Vector3.down;
        AddFace(nbtMesh, fa, ca);

        if (ca.blockData >= 8)
        {
            fa.pos = leftVertices_top;
            fa.uv  = uv_top;
        }
        else
        {
            fa.pos = leftVertices_bottom;
            fa.uv  = uv_bot;
        }
        fa.normal = Vector3.left;
        AddFace(nbtMesh, fa, ca);

        if (ca.blockData >= 8)
        {
            fa.pos = rightVertices_top;
            fa.uv  = uv_top;
        }
        else
        {
            fa.pos = rightVertices_bottom;
            fa.uv  = uv_bot;
        }
        fa.normal = Vector3.right;
        AddFace(nbtMesh, fa, ca);
    }
예제 #10
0
    // for break effect & drop item (will be affected by light)
    public override Mesh GetItemMesh(NBTChunk chunk, Vector3Int pos, byte blockData)
    {
        CubeAttributes ca = new CubeAttributes();

        //ca.pos = pos;
        ca.blockData = blockData;

        NBTMesh nbtMesh = new NBTMesh(256);

        chunk.GetLights(pos.x - chunk.x * 16, pos.y, pos.z - chunk.z * 16, out float skyLight, out float blockLight);

        FaceAttributes fa = new FaceAttributes();

        fa.skyLight   = new float[] { skyLight, skyLight, skyLight, skyLight };
        fa.blockLight = new float[] { blockLight, blockLight, blockLight, blockLight };

        fa.uv = uv_zero;

        try
        {
            fa.pos       = frontVertices;
            fa.normal    = Vector3.forward;
            fa.faceIndex = GetFrontIndexByData(chunk, ca.blockData);
            fa.color     = GetFrontTintColorByData(chunk, pos, ca.blockData);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = backVertices;
            fa.normal    = Vector3.back;
            fa.faceIndex = GetBackIndexByData(chunk, ca.blockData);
            fa.color     = GetBackTintColorByData(chunk, pos, ca.blockData);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = topVertices;
            fa.normal    = Vector3.up;
            fa.faceIndex = GetTopIndexByData(chunk, ca.blockData);
            fa.color     = GetTopTintColorByData(chunk, pos, ca.blockData);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = bottomVertices;
            fa.normal    = Vector3.down;
            fa.faceIndex = GetBottomIndexByData(chunk, ca.blockData);
            fa.color     = GetBottomTintColorByData(chunk, pos, ca.blockData);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = leftVertices;
            fa.normal    = Vector3.left;
            fa.faceIndex = GetLeftIndexByData(chunk, ca.blockData);
            fa.color     = GetLeftTintColorByData(chunk, pos, ca.blockData);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = rightVertices;
            fa.normal    = Vector3.right;
            fa.faceIndex = GetRightIndexByData(chunk, ca.blockData);
            fa.color     = GetRightTintColorByData(chunk, pos, ca.blockData);
            AddFace(nbtMesh, fa, ca);
        }
        catch (System.Exception e)
        {
            Debug.LogError("GetItemMesh error,generator=" + GetType() + ",message=\n" + e.Message);
        }

        nbtMesh.Refresh();

        nbtMesh.Dispose();

        return(nbtMesh.mesh);
    }
예제 #11
0
    public override Mesh GetItemMesh(byte data = 0)
    {
        CubeAttributes ca = new CubeAttributes();

        NBTMesh nbtMesh = new NBTMesh(256);

        FaceAttributes fa = new FaceAttributes();

        fa.skyLight   = skylight_default;
        fa.blockLight = blocklight_default;

        try
        {
            fa.pos       = frontVertices;
            fa.normal    = Vector3.forward;
            fa.faceIndex = GetFrontIndexByData(null, data);
            fa.uv        = GetFrontRotationByData(data) == Rotation.Right ? uv_right : uv_zero;
            fa.color     = GetFrontTintColorByData(data);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = backVertices;
            fa.normal    = Vector3.back;
            fa.faceIndex = GetBackIndexByData(null, data);
            fa.uv        = GetBackRotationByData(data) == Rotation.Right ? uv_right : uv_zero;
            fa.color     = GetBackTintColorByData(data);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = topVertices;
            fa.normal    = Vector3.up;
            fa.faceIndex = GetTopIndexByData(null, data);
            fa.uv        = GetTopRotationByData(data) == Rotation.Right ? uv_right : uv_zero;
            fa.color     = GetTopTintColorByData(data);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = bottomVertices;
            fa.normal    = Vector3.down;
            fa.faceIndex = GetBottomIndexByData(null, data);
            fa.uv        = GetBottomRotationByData(data) == Rotation.Right ? uv_right : uv_zero;
            fa.color     = GetBottomTintColorByData(data);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = leftVertices;
            fa.normal    = Vector3.left;
            fa.faceIndex = GetLeftIndexByData(null, data);
            fa.uv        = GetLeftRotationByData(data) == Rotation.Right ? uv_right : uv_zero;
            fa.color     = GetLeftTintColorByData(data);
            AddFace(nbtMesh, fa, ca);

            fa.pos       = rightVertices;
            fa.normal    = Vector3.right;
            fa.faceIndex = GetRightIndexByData(null, data);
            fa.uv        = GetRightRotationByData(data) == Rotation.Right ? uv_right : uv_zero;
            fa.color     = GetRightTintColorByData(data);
            AddFace(nbtMesh, fa, ca);
        }
        catch (System.Exception e)
        {
            Debug.LogError("GetItemMesh error,generator=" + GetType() + ",message=\n" + e.Message);
        }

        nbtMesh.Refresh();

        nbtMesh.Dispose();

        return(nbtMesh.mesh);
    }
예제 #12
0
    protected override FaceAttributes GetLeftFaceAttributes(NBTChunk chunk, NBTMesh mesh, CubeAttributes ca)
    {
        chunk.GetLights(ca.pos.x - 1, ca.pos.y, ca.pos.z, out float skyLight, out float blockLight);

        FaceAttributes fa = new FaceAttributes();

        fa.pos        = leftVertices_snow;
        fa.faceIndex  = GetLeftIndexByData(chunk, ca.blockData);
        fa.color      = GetLeftTintColorByData(chunk, ca.pos, ca.blockData);
        fa.skyLight   = new float[] { skyLight, skyLight, skyLight, skyLight };
        fa.blockLight = new float[] { blockLight, blockLight, blockLight, blockLight };
        fa.normal     = Vector3.left;
        fa.uv         = uv_bot;

        return(fa);
    }
예제 #13
0
    protected virtual FaceAttributes GetRightFaceAttributes(NBTChunk chunk, NBTMesh mesh, CubeAttributes ca)
    {
        UnityEngine.Profiling.Profiler.BeginSample("GetRightFaceAttributes");
        rightFA.pos       = rightVertices;
        rightFA.faceIndex = GetRightIndexByData(chunk, ca.blockData);
        rightFA.color     = GetRightTintColorByData(chunk, ca.pos, ca.blockData);
        rightFA.normal    = Vector3.right;

        //nearBottomRight, nearTopRight, farTopRight, farBottomRight
        rightFA.skyLight[0]   = (ca.right.skyLight + ca.frontRight.skyLight + ca.bottomRight.skyLight + ca.frontBottomRight.skyLight) / 60.0f;
        rightFA.skyLight[1]   = (ca.right.skyLight + ca.frontRight.skyLight + ca.topRight.skyLight + ca.frontTopRight.skyLight) / 60.0f;
        rightFA.skyLight[2]   = (ca.right.skyLight + ca.backRight.skyLight + ca.topRight.skyLight + ca.backTopRight.skyLight) / 60.0f;
        rightFA.skyLight[3]   = (ca.right.skyLight + ca.backRight.skyLight + ca.bottomRight.skyLight + ca.backBottomRight.skyLight) / 60.0f;
        rightFA.blockLight[0] = (ca.right.blockLight + ca.frontRight.blockLight + ca.bottomRight.blockLight + ca.frontBottomRight.blockLight) / 60.0f;
        rightFA.blockLight[1] = (ca.right.blockLight + ca.frontRight.blockLight + ca.topRight.blockLight + ca.frontTopRight.blockLight) / 60.0f;
        rightFA.blockLight[2] = (ca.right.blockLight + ca.backRight.blockLight + ca.topRight.blockLight + ca.backTopRight.blockLight) / 60.0f;
        rightFA.blockLight[3] = (ca.right.blockLight + ca.backRight.blockLight + ca.bottomRight.blockLight + ca.backBottomRight.blockLight) / 60.0f;

        Rotation rotation = GetFrontRotationByData(ca.blockData);

        if (rotation == Rotation.Right)
        {
            rightFA.uv = uv_right;
        }
        else
        {
            rightFA.uv = uv_zero;
        }
        UnityEngine.Profiling.Profiler.EndSample();

        return(rightFA);
    }
예제 #14
0
    protected virtual FaceAttributes GetBackFaceAttributes(NBTChunk chunk, NBTMesh mesh, CubeAttributes ca)
    {
        UnityEngine.Profiling.Profiler.BeginSample("GetBackFaceAttributes");
        backFA.pos       = backVertices;
        backFA.faceIndex = GetBackIndexByData(chunk, ca.blockData);
        backFA.color     = GetBackTintColorByData(chunk, ca.pos, ca.blockData);
        backFA.normal    = Vector3.back;

        //farBottomRight, farTopRight, farTopLeft, farBottomLeft
        backFA.skyLight[0]   = (ca.back.skyLight + ca.backBottom.skyLight + ca.backRight.skyLight + ca.backBottomRight.skyLight) / 60.0f;
        backFA.skyLight[1]   = (ca.back.skyLight + ca.backTop.skyLight + ca.backRight.skyLight + ca.backTopRight.skyLight) / 60.0f;
        backFA.skyLight[2]   = (ca.back.skyLight + ca.backTop.skyLight + ca.backLeft.skyLight + ca.backTopLeft.skyLight) / 60.0f;
        backFA.skyLight[3]   = (ca.back.skyLight + ca.backBottom.skyLight + ca.backLeft.skyLight + ca.backBottomLeft.skyLight) / 60.0f;
        backFA.blockLight[0] = (ca.back.blockLight + ca.backBottom.blockLight + ca.backRight.blockLight + ca.backBottomRight.blockLight) / 60.0f;
        backFA.blockLight[1] = (ca.back.blockLight + ca.backTop.blockLight + ca.backRight.blockLight + ca.backTopRight.blockLight) / 60.0f;
        backFA.blockLight[2] = (ca.back.blockLight + ca.backTop.blockLight + ca.backLeft.blockLight + ca.backTopLeft.blockLight) / 60.0f;
        backFA.blockLight[3] = (ca.back.blockLight + ca.backBottom.blockLight + ca.backLeft.blockLight + ca.backBottomLeft.blockLight) / 60.0f;

        Rotation rotation = GetFrontRotationByData(ca.blockData);

        if (rotation == Rotation.Right)
        {
            backFA.uv = uv_right;
        }
        else
        {
            backFA.uv = uv_zero;
        }
        UnityEngine.Profiling.Profiler.EndSample();

        return(backFA);
    }
예제 #15
0
파일: Class1.cs 프로젝트: mkramers/Projects
 public Cube(float _length)
 {
     Source = new CubeData(_length);
     Attributes = new CubeAttributes();
 }
예제 #16
0
    // upper door
    // 0x1: 0 if hinge is on the left (the default), 1 if on the right
    // 0x2: 0 if unpowered, 1 if powered
    // 0x4: unused
    // 0x8: Always 1 for the upper part of a door.

    // lower door
    // 0x1,0x2: Two bits storing a value from 0 to 3 specifying the direction the door is facing:
    // 0: Facing east
    // 1: Facing south
    // 2: Facing west
    // 3: Facing north
    // 0x4: 0 if the entire door is closed, 1 if open.
    // 0x8: Always 0 for the lower part of a door.
    void FillMesh(NBTChunk chunk, CubeAttributes ca, NBTMesh nbtMesh)
    {
        float skyLight, blockLight;

        if (ca.isItemMesh)
        {
            chunk.GetLights(ca.worldPos.x, ca.worldPos.y, ca.worldPos.z, out skyLight, out blockLight);
        }
        else
        {
            chunk.GetLights(ca.pos.x, ca.pos.y, ca.pos.z, out skyLight, out blockLight);
        }

        FaceAttributes fa = new FaceAttributes();

        fa.color      = Color.white;
        fa.skyLight   = new float[] { skyLight, skyLight, skyLight, skyLight };
        fa.blockLight = new float[] { blockLight, blockLight, blockLight, blockLight };
        fa.normal     = Vector3.zero;


        bool isUpper = (ca.blockData & 0b1000) > 0;

        int hinge;

        DoorDirection direction = 0;
        bool          isOpen    = false;

        if (isUpper)
        {
            chunk.GetBlockData(ca.pos.x, ca.pos.y - 1, ca.pos.z, out byte belowType, out byte belowData);
            if (belowType == 64)
            {
                isOpen    = (belowData & 0b0100) > 0;
                direction = (DoorDirection)(belowData & 0b0011);
            }
            hinge = (ca.blockData & 0b0001);
        }
        else
        {
            isOpen    = (ca.blockData & 0b0100) > 0;
            direction = (DoorDirection)(ca.blockData & 0b0011);
            chunk.GetBlockData(ca.pos.x, ca.pos.y + 1, ca.pos.z, out byte aboveType, out byte aboveData);
            hinge = (aboveData & 0b0001);
        }

        if (ca.isBreakingMesh)
        {
            ca.pos = Vector3Int.zero;
        }

        try
        {
            fa.faceIndex = TextureArrayManager.GetIndexByName(isUpper ? "door_wood_upper" : "door_wood_lower");

            if ((direction == DoorDirection.East && isOpen == false) ||
                (direction == DoorDirection.South && isOpen && hinge == 1) ||
                (direction == DoorDirection.North && isOpen && hinge == 0))
            {
                fa.uv  = uv_top;
                fa.pos = topVertices_east;
                AddFace(nbtMesh, fa, ca);
                fa.pos = bottomVertices_east;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = hinge == 0 ? uv_flip : uv_zero;
                fa.pos = leftVertices_east;
                AddFace(nbtMesh, fa, ca);
                fa.pos = rightVertices_east;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = hinge == 0 ? uv_side_flip : uv_side;
                fa.pos = frontVertices_east;
                AddFace(nbtMesh, fa, ca);
                fa.pos = backVertices_east;
                AddFace(nbtMesh, fa, ca);
            }
            else if ((direction == DoorDirection.South && isOpen == false) ||
                     (direction == DoorDirection.East && isOpen && hinge == 0) ||
                     (direction == DoorDirection.West && isOpen && hinge == 1))
            {
                fa.uv  = hinge == 0 ? uv_flip : uv_zero;
                fa.pos = frontVertices_south;
                AddFace(nbtMesh, fa, ca);
                fa.pos = backVertices_south;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = uv_top;
                fa.pos = topVertices_south;
                AddFace(nbtMesh, fa, ca);
                fa.pos = bottomVertices_south;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = hinge == 0 ? uv_side_flip : uv_side;
                fa.pos = leftVertices_south;
                AddFace(nbtMesh, fa, ca);
                fa.pos = rightVertices_south;
                AddFace(nbtMesh, fa, ca);
            }
            else if ((direction == DoorDirection.West && isOpen == false) ||
                     (direction == DoorDirection.South && isOpen && hinge == 0) ||
                     (direction == DoorDirection.North && isOpen && hinge == 1))
            {
                fa.uv  = uv_top;
                fa.pos = topVertices_west;
                AddFace(nbtMesh, fa, ca);
                fa.pos = bottomVertices_west;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = hinge == 0 ? uv_flip : uv_zero;
                fa.pos = leftVertices_west;
                AddFace(nbtMesh, fa, ca);
                fa.pos = rightVertices_west;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = hinge == 0 ? uv_side_flip : uv_side;
                fa.pos = frontVertices_west;
                AddFace(nbtMesh, fa, ca);
                fa.pos = backVertices_west;
                AddFace(nbtMesh, fa, ca);
            }
            else if ((direction == DoorDirection.North && isOpen == false) ||
                     (direction == DoorDirection.East && isOpen && hinge == 1) ||
                     (direction == DoorDirection.West && isOpen && hinge == 0))
            {
                fa.uv  = hinge == 0 ? uv_flip : uv_zero;
                fa.pos = frontVertices_north;
                AddFace(nbtMesh, fa, ca);
                fa.pos = backVertices_north;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = uv_top;
                fa.pos = topVertices_north;
                AddFace(nbtMesh, fa, ca);
                fa.pos = bottomVertices_north;
                AddFace(nbtMesh, fa, ca);
                fa.uv  = hinge == 0 ? uv_side_flip : uv_side;
                fa.pos = leftVertices_north;
                AddFace(nbtMesh, fa, ca);
                fa.pos = rightVertices_north;
                AddFace(nbtMesh, fa, ca);
            }
        }
        catch (System.Exception e)
        {
            Debug.Log(e.ToString() + "\n" + "pos=" + ca.pos + ",data=" + ca.blockData);
        }
    }