コード例 #1
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);
                }
            }
        }
    }
コード例 #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);
    }
コード例 #3
0
    private static int ComputeMaxY(SunLightMap lightmap, int x, int z)
    {
        int maxY = lightmap.GetSunHeight(x, z);

        maxY = Mathf.Max(maxY, lightmap.GetSunHeight(x - 1, z));
        maxY = Mathf.Max(maxY, lightmap.GetSunHeight(x + 1, z));
        maxY = Mathf.Max(maxY, lightmap.GetSunHeight(x, z - 1));
        maxY = Mathf.Max(maxY, lightmap.GetSunHeight(x, z + 1));
        return(maxY);
    }
コード例 #4
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);
    }
コード例 #5
0
    public static void RecomputeLightAtPosition(Map map, Vector3i pos)
    {
        SunLightMap lightmap     = map.GetSunLightmap();
        int         oldSunHeight = lightmap.GetSunHeight(pos.x, pos.z);

        ComputeRayAtPosition(map, pos.x, pos.z);
        int newSunHeight = lightmap.GetSunHeight(pos.x, pos.z);

        if (newSunHeight < oldSunHeight)          // свет опустился
        // добавляем свет
        {
            list.Clear();
            for (int ty = newSunHeight; ty <= oldSunHeight; ty++)
            {
                pos.y = ty;
                lightmap.SetLight(MIN_LIGHT, pos);
                list.Add(pos);
            }
            Scatter(map, list);
        }
        if (newSunHeight > oldSunHeight)          // свет поднялся
        // удаляем свет
        {
            list.Clear();
            for (int ty = oldSunHeight; ty <= newSunHeight; ty++)
            {
                pos.y = ty;
                list.Add(pos);
            }
            RemoveLight(map, list);
        }

        if (newSunHeight == oldSunHeight)
        {
            if (map.GetBlock(pos).IsAlpha())
            {
                UpdateLight(map, pos);
            }
            else
            {
                RemoveLight(map, pos);
            }
        }
    }