コード例 #1
0
        protected static bool FillRange(VoxelField volume, Vector3i start, Vector3i end, Byte fillByte)
        {
            // 1. Ensure that we can safely expand into the area.
            if (!TestRangeForFreeSpace(volume, start, end))
            {
                return(false);
            }

            // 2. Fill area
            for (Int32 z = start.Z; z <= end.Z; ++z)
            {
                for (Int32 y = start.Y; y <= end.Y; ++y)
                {
                    for (Int32 x = start.X; x <= end.X; ++x)
                    {
                        volume.SetVoxel(x, y, z, fillByte);
                    }
                }
            }

            return(true);
        }
コード例 #2
0
        protected static AABBi ExpandAndFillBox(VoxelField volume, ref Vector3i originVoxel, Byte fillByte)
        {
            int pX, nX, pY, nY, pZ, nZ;

            pX = nX = pY = nY = pZ = nZ = 0;

            volume.SetVoxel(originVoxel.X, originVoxel.Y, originVoxel.Z, fillByte);

            bool boxGrew = false;

            do
            {
                // +Z Axis
                bool pZGrew = FillRange(volume,
                                        new Vector3i(originVoxel.X - nX, originVoxel.Y - nY, originVoxel.Z + (pZ + 1)),
                                        new Vector3i(originVoxel.X + pX, originVoxel.Y + pY, originVoxel.Z + (pZ + 1)), fillByte);
                if (pZGrew)
                {
                    pZ++;
                }

                // -Z Axis
                bool nZGrew = FillRange(volume,
                                        new Vector3i(originVoxel.X - nX, originVoxel.Y - nY, originVoxel.Z - (nZ + 1)),
                                        new Vector3i(originVoxel.X + pX, originVoxel.Y + pY, originVoxel.Z - (nZ + 1)), fillByte);
                if (nZGrew)
                {
                    nZ++;
                }

                // +Y Axis
                bool pYGrew = FillRange(volume,
                                        new Vector3i(originVoxel.X - nX, originVoxel.Y + (pY + 1), originVoxel.Z - nZ),
                                        new Vector3i(originVoxel.X + pX, originVoxel.Y + (pY + 1), originVoxel.Z + pZ), fillByte);
                if (pYGrew)
                {
                    pY++;
                }

                // -Y Axis
                bool nYGrew = FillRange(volume,
                                        new Vector3i(originVoxel.X - nX, originVoxel.Y - (nY + 1), originVoxel.Z - nZ),
                                        new Vector3i(originVoxel.X + pX, originVoxel.Y - (nY + 1), originVoxel.Z + pZ), fillByte);
                if (nYGrew)
                {
                    nY++;
                }

                // +X Axis
                bool pXGrew = FillRange(volume,
                                        new Vector3i(originVoxel.X + (pX + 1), originVoxel.Y - nY, originVoxel.Z - nZ),
                                        new Vector3i(originVoxel.X + (pX + 1), originVoxel.Y + pY, originVoxel.Z + pZ), fillByte);
                if (pXGrew)
                {
                    pX++;
                }

                // -X Axis
                bool nXGrew = FillRange(volume,
                                        new Vector3i(originVoxel.X - (nX + 1), originVoxel.Y - nY, originVoxel.Z - nZ),
                                        new Vector3i(originVoxel.X - (nX + 1), originVoxel.Y + pY, originVoxel.Z + pZ), fillByte);
                if (nXGrew)
                {
                    nX++;
                }

                boxGrew = (pZGrew || nZGrew || pYGrew || nYGrew || pXGrew || nXGrew);
            } while (boxGrew);

            AABBi box = new AABBi();

            box.MinX = originVoxel.X - nX;
            box.MinY = originVoxel.Y - nY;
            box.MinZ = originVoxel.Z - nZ;

            box.MaxX = originVoxel.X + pX + 1;
            box.MaxY = originVoxel.Y + pY + 1;
            box.MaxZ = originVoxel.Z + pZ + 1;

            return(box);
        }