コード例 #1
0
        private static void RemoveLight(OCMap map, List <Vector3i> list)
        {
            OCSunLightMap 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;
                    OCBlockData block   = map.GetBlock(nextPos);
                    if (block.IsAlpha())
                    {
                        if (lightmap.GetLight(nextPos) <= light)
                        {
                            list.Add(nextPos);
                        }
                        else
                        {
                            lightPoints.Add(nextPos);
                        }
                    }
                    if (!block.IsEmpty())
                    {
                        OCLightComputerUtils.SetLightDirty(map, nextPos);
                    }
                }
            }

            Scatter(map, lightPoints);
        }
コード例 #2
0
        public static void RecomputeLightAtPosition(OCMap map, Vector3i pos)
        {
            OCSunLightMap 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);
                }
            }
        }