Exemplo n.º 1
0
    public void FloodLight(int[] chunk, byte[] light, int startx, int starty, int startz, int[] dataLightRadius, bool[] dataTransparent)
    {
        int start = Index3d(startx, starty, startz, 16, 16);

        if (light[start] == minlight)
        {
            return;
        }

        q.Clear();
        q.Push(start);
        for (; ;)
        {
            if (q.Count == 0)
            {
                break;
            }
            int vPos   = q.Pop();
            int vLight = light[vPos];
            if (vLight == minlight)
            {
                continue;
            }
            int vBlock = chunk[vPos];
            if (!dataTransparent[vBlock] &&
                dataLightRadius[vBlock] == 0)
            {
                continue;
            }
            int x = MapUtilCi.PosX(vPos, 16, 16);
            int y = MapUtilCi.PosY(vPos, 16, 16);
            int z = MapUtilCi.PosZ(vPos, 16, 16);
            if (x < 15)
            {
                Push(q, light, vLight, vPos + XPlus);
            }
            if (x > 0)
            {
                Push(q, light, vLight, vPos + XMinus);
            }
            if (y < 15)
            {
                Push(q, light, vLight, vPos + YPlus);
            }
            if (y > 0)
            {
                Push(q, light, vLight, vPos + YMinus);
            }
            if (z < 15)
            {
                Push(q, light, vLight, vPos + ZPlus);
            }
            if (z > 0)
            {
                Push(q, light, vLight, vPos + ZMinus);
            }
        }
    }
Exemplo n.º 2
0
    void LightEmitting(int[] workportion, byte[] worklight, int[] dataLightRadius, bool[] dataTransparent)
    {
        const int portionsize  = 16;
        const int portionsize3 = portionsize * portionsize * portionsize;

        for (int pos = 0; pos < portionsize3; pos++)
        {
            if (workportion[pos] >= 10)                     //optimization
            {
                if (dataLightRadius[workportion[pos]] != 0) //optimization
                {
                    if (dataLightRadius[workportion[pos]] > worklight[pos])
                    {
                        int xx = MapUtilCi.PosX(pos, portionsize, portionsize);
                        int yy = MapUtilCi.PosY(pos, portionsize, portionsize);
                        int zz = MapUtilCi.PosZ(pos, portionsize, portionsize);
                        int l  = dataLightRadius[workportion[pos]];
                        worklight[pos] = Game.IntToByte(MathCi.MaxInt(l, worklight[pos]));
                        flood.FloodLight(workportion, worklight, xx, yy, zz, dataLightRadius, dataTransparent);
                    }
                }
            }
        }
    }
Exemplo n.º 3
0
    public static void FloodLight_(FastQueueInt q, int[] portion, byte[] light, int startx, int starty, int startz, int[] dataLightRadius, bool[] dataTransparent)
    {
        const int portionsize = 16;
        int       pos         = Index3d(startx, starty, startz, portionsize, portionsize);

        if (light[pos] == minlight)
        {
            return;
        }
        int lightradius = dataLightRadius[portion[pos]];

        if (lightradius != 0)
        {
            light[pos] = Game.IntToByte(lightradius);
        }
        //if (light[pos + 1] == light[pos]
        //    && light[pos - 1] == light[pos]
        //    && light[pos + portionsize] == light[pos]
        //    && light[pos - portionsize] == light[pos]
        //    && light[pos + portionsize * portionsize] == light[pos]
        //    && light[pos - portionsize * portionsize] == light[pos])
        //{
        //    return;
        //}

        q.Clear();
        int start = Index3d(startx, starty, startz, portionsize, portionsize);

        q.Push(start);
        for (; ;)
        {
            if (q.Count == 0)
            {
                break;
            }
            int vpos   = q.Pop();
            int vlight = light[vpos];
            if (vlight == minlight)
            {
                continue;
            }
            int vblock = portion[vpos];
            if (!dataTransparent[vblock] &&
                dataLightRadius[vblock] == 0)
            {
                continue;
            }
            int x = MapUtilCi.PosX(vpos, 16, 16);
            int y = MapUtilCi.PosY(vpos, 16, 16);
            int z = MapUtilCi.PosZ(vpos, 16, 16);
            if (x < 15)
            {
                Push(q, light, vlight, vpos + XPlus);
            }
            if (x > 0)
            {
                Push(q, light, vlight, vpos + XMinus);
            }
            if (y < 15)
            {
                Push(q, light, vlight, vpos + YPlus);
            }
            if (y > 0)
            {
                Push(q, light, vlight, vpos + YMinus);
            }
            if (z < 15)
            {
                Push(q, light, vlight, vpos + ZPlus);
            }
            if (z > 0)
            {
                Push(q, light, vlight, vpos + ZMinus);
            }
        }
    }