Esempio n. 1
0
        private void BuildMasks()
        {
            _min = new Vector3Int(int.MaxValue, int.MaxValue, int.MaxValue);
            _max = new Vector3Int(int.MinValue, int.MinValue, int.MinValue);
            for (var x = _cell.Min.x; x < _cell.Max.x; x++)
            {
                for (var z = _cell.Min.z; z < _cell.Max.z; z++)
                {
                    for (var y = _cell.Min.y; y < _cell.Max.y; y++)
                    {
                        var block = _cell.GetBlock(x, y, z);
                        if (!block.AddToRenderMesh)
                        {
                            continue;
                        }
                        var added      = false;
                        var blockLight = _cell.GetLight(x, y, z);
                        var blockId    = block.BlockId;
                        var block100   = _cell.GetBlock(x + 1, y, z);
                        var block010   = _cell.GetBlock(x, y + 1, z);
                        var block001   = _cell.GetBlock(x, y, z + 1);
                        var blockN100  = _cell.GetBlock(x - 1, y, z);
                        var block0N10  = _cell.GetBlock(x, y - 1, z);
                        var block00N1  = _cell.GetBlock(x, y, z - 1);


                        var light100  = _cell.GetLight(x + 1, y, z);
                        var light010  = _cell.GetLight(x, y + 1, z);
                        var light001  = _cell.GetLight(x, y, z + 1);
                        var lightN100 = _cell.GetLight(x - 1, y, z);
                        var light0N10 = _cell.GetLight(x, y - 1, z);
                        var light00N1 = _cell.GetLight(x, y, z - 1);

                        var light011    = _cell.GetLight(x + 0, y + 1, z + 1);
                        var light01N1   = _cell.GetLight(x + 0, y + 1, z - 1);
                        var light0N11   = _cell.GetLight(x + 0, y - 1, z + 1);
                        var light0N1N1  = _cell.GetLight(x + 0, y - 1, z - 1);
                        var light101    = _cell.GetLight(x + 1, y + 0, z + 1);
                        var light10N1   = _cell.GetLight(x + 1, y + 0, z - 1);
                        var light110    = _cell.GetLight(x + 1, y + 1, z + 0);
                        var light111    = _cell.GetLight(x + 1, y + 1, z + 1);
                        var light11N1   = _cell.GetLight(x + 1, y + 1, z - 1);
                        var light1N10   = _cell.GetLight(x + 1, y - 1, z + 0);
                        var light1N11   = _cell.GetLight(x + 1, y - 1, z + 1);
                        var light1N1N1  = _cell.GetLight(x + 1, y - 1, z - 1);
                        var lightN101   = _cell.GetLight(x - 1, y + 0, z + 1);
                        var lightN10N1  = _cell.GetLight(x - 1, y + 0, z - 1);
                        var lightN110   = _cell.GetLight(x - 1, y + 1, z + 0);
                        var lightN111   = _cell.GetLight(x - 1, y + 1, z + 1);
                        var lightN11N1  = _cell.GetLight(x - 1, y + 1, z - 1);
                        var lightN1N10  = _cell.GetLight(x - 1, y - 1, z + 0);
                        var lightN1N11  = _cell.GetLight(x - 1, y - 1, z + 1);
                        var lightN1N1N1 = _cell.GetLight(x - 1, y - 1, z - 1);

                        //XIncreasing
                        if (!(block100.RenderOpaque || block100.BlockId == blockId))
                        {
                            var blockFace = new BlockFace
                            {
                                Exists       = true,
                                BlockId      = block.BlockId,
                                Tint         = block.Tints[0],
                                TextureIndex = block.GetTextureMapping(FaceDirection.XIncreasing)
                            };
                            if (block.Emissivity > 0)
                            {
                                blockFace.LightTopLeft     = blockLight;
                                blockFace.LightTopRight    = blockLight;
                                blockFace.LightBottomRight = blockLight;
                                blockFace.LightBottomLeft  = blockLight;
                            }
                            else
                            {
                                blockFace.LightTopLeft     = LightProcessor.LightAverage(light100, light10N1, light11N1, light110);
                                blockFace.LightTopRight    = LightProcessor.LightAverage(light100, light101, light111, light110);
                                blockFace.LightBottomRight = LightProcessor.LightAverage(light100, light101, light1N11, light1N10);
                                blockFace.LightBottomLeft  = LightProcessor.LightAverage(light100, light10N1, light1N1N1, light1N10);
                            }

                            _masks[FaceDirection.XIncreasing][x, y, z] = blockFace;
                            added = true;
                        }

                        //YIncreasing
                        if (!(block010.RenderOpaque || block010.BlockId == blockId))
                        {
                            var blockFace = new BlockFace
                            {
                                Exists       = true,
                                BlockId      = block.BlockId,
                                Tint         = block.Tints[1],
                                TextureIndex = block.GetTextureMapping(FaceDirection.YIncreasing)
                            };
                            if (block.Emissivity > 0)
                            {
                                blockFace.LightTopLeft     = blockLight;
                                blockFace.LightTopRight    = blockLight;
                                blockFace.LightBottomRight = blockLight;
                                blockFace.LightBottomLeft  = blockLight;
                            }
                            else
                            {
                                blockFace.LightTopLeft     = LightProcessor.LightAverage(light010, lightN110, lightN111, light011);
                                blockFace.LightTopRight    = LightProcessor.LightAverage(light010, light110, light111, light011);
                                blockFace.LightBottomRight = LightProcessor.LightAverage(light010, light110, light11N1, light01N1);
                                blockFace.LightBottomLeft  = LightProcessor.LightAverage(light010, lightN110, lightN11N1, light01N1);
                            }

                            _masks[FaceDirection.YIncreasing][x, y, z] = blockFace;
                            added = true;
                        }

                        //ZIncreasing
                        if (!(block001.RenderOpaque || block001.BlockId == blockId))
                        {
                            var blockFace = new BlockFace
                            {
                                Exists       = true,
                                BlockId      = block.BlockId,
                                Tint         = block.Tints[2],
                                TextureIndex = block.GetTextureMapping(FaceDirection.ZIncreasing)
                            };
                            if (block.Emissivity > 0)
                            {
                                blockFace.LightTopLeft     = blockLight;
                                blockFace.LightTopRight    = blockLight;
                                blockFace.LightBottomRight = blockLight;
                                blockFace.LightBottomLeft  = blockLight;
                            }
                            else
                            {
                                blockFace.LightTopLeft     = LightProcessor.LightAverage(light001, light0N11, light1N11, light101);
                                blockFace.LightTopRight    = LightProcessor.LightAverage(light001, light011, light111, light101);
                                blockFace.LightBottomRight = LightProcessor.LightAverage(light001, light011, lightN111, lightN101);
                                blockFace.LightBottomLeft  = LightProcessor.LightAverage(light001, light0N11, lightN1N11, lightN101);
                            }

                            _masks[FaceDirection.ZIncreasing][x, y, z] = blockFace;
                            added = true;
                        }

                        //XDecreasing
                        if (!(blockN100.RenderOpaque || blockN100.BlockId == blockId))
                        {
                            var blockFace = new BlockFace
                            {
                                Exists       = true,
                                BlockId      = block.BlockId,
                                Tint         = block.Tints[3],
                                TextureIndex = block.GetTextureMapping(FaceDirection.XDecreasing)
                            };
                            if (block.Emissivity > 0)
                            {
                                blockFace.LightTopLeft     = blockLight;
                                blockFace.LightTopRight    = blockLight;
                                blockFace.LightBottomRight = blockLight;
                                blockFace.LightBottomLeft  = blockLight;
                            }
                            else
                            {
                                blockFace.LightTopLeft     = LightProcessor.LightAverage(lightN100, lightN10N1, lightN11N1, lightN110);
                                blockFace.LightTopRight    = LightProcessor.LightAverage(lightN100, lightN101, lightN111, lightN110);
                                blockFace.LightBottomRight = LightProcessor.LightAverage(lightN100, lightN101, lightN1N11, lightN1N10);
                                blockFace.LightBottomLeft  = LightProcessor.LightAverage(lightN100, lightN10N1, lightN1N1N1, lightN1N10);
                            }

                            _masks[FaceDirection.XDecreasing][x, y, z] = blockFace;
                            added = true;
                        }

                        //YDecreasing
                        if (!(block0N10.RenderOpaque || block0N10.BlockId == blockId))
                        {
                            var blockFace = new BlockFace
                            {
                                Exists       = true,
                                BlockId      = block.BlockId,
                                Tint         = block.Tints[4],
                                TextureIndex = block.GetTextureMapping(FaceDirection.YDecreasing)
                            };
                            if (block.Emissivity > 0)
                            {
                                blockFace.LightTopLeft     = blockLight;
                                blockFace.LightTopRight    = blockLight;
                                blockFace.LightBottomRight = blockLight;
                                blockFace.LightBottomLeft  = blockLight;
                            }
                            else
                            {
                                blockFace.LightTopLeft     = LightProcessor.LightAverage(light0N10, lightN1N10, lightN1N11, light0N11);
                                blockFace.LightTopRight    = LightProcessor.LightAverage(light0N10, light1N10, light1N11, light0N11);
                                blockFace.LightBottomRight = LightProcessor.LightAverage(light0N10, light1N10, light1N1N1, light0N1N1);
                                blockFace.LightBottomLeft  = LightProcessor.LightAverage(light0N10, lightN1N10, lightN1N1N1, light0N1N1);
                            }

                            _masks[FaceDirection.YDecreasing][x, y, z] = blockFace;
                            added = true;
                        }

                        //ZDecreasing
                        if (!(block00N1.RenderOpaque || block00N1.BlockId == blockId))
                        {
                            var blockFace = new BlockFace
                            {
                                Exists       = true,
                                BlockId      = block.BlockId,
                                Tint         = block.Tints[5],
                                TextureIndex = block.GetTextureMapping(FaceDirection.ZDecreasing)
                            };
                            if (block.Emissivity > 0)
                            {
                                blockFace.LightTopLeft     = blockLight;
                                blockFace.LightTopRight    = blockLight;
                                blockFace.LightBottomRight = blockLight;
                                blockFace.LightBottomLeft  = blockLight;
                            }
                            else
                            {
                                blockFace.LightTopLeft     = LightProcessor.LightAverage(light00N1, light0N1N1, light1N1N1, light10N1);
                                blockFace.LightTopRight    = LightProcessor.LightAverage(light00N1, light01N1, light11N1, light10N1);
                                blockFace.LightBottomRight = LightProcessor.LightAverage(light00N1, light01N1, lightN11N1, lightN10N1);
                                blockFace.LightBottomLeft  = LightProcessor.LightAverage(light00N1, light0N1N1, lightN1N1N1, lightN10N1);
                            }

                            _masks[FaceDirection.ZDecreasing][x, y, z] = blockFace;
                            added = true;
                        }

                        if (!added)
                        {
                            continue;
                        }
                        var vec = new Vector3Int(x, y, z);
                        _min = Vector3Int.Min(_min, vec);
                        _max = Vector3Int.Max(_max, vec);
                    }
                }
            }
            _max += Vector3Int.one;
        }