コード例 #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);
    }
コード例 #2
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);
            }
        }
    }