Esempio n. 1
0
    private static void RemoveLight(Map map, List <Vector3i> list)
    {
        SunLightMap lightmap = map.GetSunLightmap();

        foreach (Vector3i pos in list)
        {
            lightmap.SetLight(MAX_LIGHT, pos);
        }

        List <Vector3i> lightPoints = new List <Vector3i>();

        for (int i = 0; i < list.Count; i++)
        {
            Vector3i pos = list[i];
            if (pos.y < 0)
            {
                continue;
            }
            if (lightmap.IsSunLight(pos.x, pos.y, pos.z))
            {
                lightPoints.Add(pos);
                continue;
            }
            byte light = (byte)(lightmap.GetLight(pos) - STEP_LIGHT);
            lightmap.SetLight(MIN_LIGHT, pos);
            if (light <= MIN_LIGHT)
            {
                continue;
            }

            foreach (Vector3i dir in Vector3i.directions)
            {
                Vector3i  nextPos = pos + dir;
                BlockData block   = map.GetBlock(nextPos);
                if (block.IsAlpha())
                {
                    if (lightmap.GetLight(nextPos) <= light)
                    {
                        list.Add(nextPos);
                    }
                    else
                    {
                        lightPoints.Add(nextPos);
                    }
                }
                if (!block.IsEmpty())
                {
                    LightComputerUtils.SetLightDirty(map, nextPos);
                }
            }
        }

        Scatter(map, lightPoints);
    }
Esempio n. 2
0
    public static void Scatter(Map map, ColumnMap columnMap, int cx, int cz)
    {
        int x1 = cx * Chunk.SIZE_X;
        int z1 = cz * Chunk.SIZE_Z;

        int x2 = x1 + Chunk.SIZE_X;
        int z2 = z1 + Chunk.SIZE_Z;

        SunLightMap lightmap = map.GetSunLightmap();

        list.Clear();
        for (int x = x1; x < x2; x++)
        {
            for (int z = z1; z < z2; z++)
            {
                int maxY = ComputeMaxY(lightmap, x, z) + 1;
                for (int y = 0; y < maxY; y++)
                {
                    if (lightmap.GetLight(x, y, z) > MIN_LIGHT)
                    {
                        list.Add(new Vector3i(x, y, z));
                    }
                }
            }
        }
        Scatter(map, columnMap, list);
    }
Esempio n. 3
0
    private static void Scatter(Map map, List <Vector3i> list)      // рассеивание
    {
        SunLightMap lightmap = map.GetSunLightmap();

        for (int i = 0; i < list.Count; i++)
        {
            Vector3i pos = list[i];
            if (pos.y < 0)
            {
                continue;
            }

            BlockData block = map.GetBlock(pos);
            int       light = lightmap.GetLight(pos) - LightComputerUtils.GetLightStep(block);
            if (light <= MIN_LIGHT)
            {
                continue;
            }

            foreach (Vector3i dir in Vector3i.directions)
            {
                Vector3i nextPos = pos + dir;
                block = map.GetBlock(nextPos);
                if (block.IsAlpha() && lightmap.SetMaxLight((byte)light, nextPos))
                {
                    list.Add(nextPos);
                }
                if (!block.IsEmpty())
                {
                    LightComputerUtils.SetLightDirty(map, nextPos);
                }
            }
        }
    }