public FrozenActorLayer(Actor self, FrozenActorLayerInfo info)
        {
            binSize          = info.BinSize;
            world            = self.World;
            owner            = self.Owner;
            frozenActorsById = new Dictionary <uint, FrozenActor>();

            // PERF: Partition the map into a series of coarse-grained bins and track changes in the shroud against
            // bin - marking that bin dirty if it changes. This is fairly cheap to track and allows us to perform the
            // expensive visibility update for frozen actors in these regions.
            partitionedFrozenActorIds = new SpatiallyPartitioned <uint>(
                world.Map.MapSize.X, world.Map.MapSize.Y, binSize);
            var maxX = world.Map.MapSize.X / binSize + 1;
            var maxY = world.Map.MapSize.Y / binSize + 1;

            dirtyBins = new bool[maxX * maxY];
            self.Trait <Shroud>().CellsChanged += cells =>
            {
                foreach (var cell in cells)
                {
                    var x = cell.U / binSize;
                    var y = cell.V / binSize;
                    dirtyBins[y * maxX + x] = true;
                }
            };
        }
        public FrozenActorLayer(Actor self, FrozenActorLayerInfo info)
        {
            binSize          = info.BinSize;
            world            = self.World;
            owner            = self.Owner;
            frozenActorsById = new Dictionary <uint, FrozenActor>();

            partitionedFrozenActorIds = new SpatiallyPartitioned <uint>(
                world.Map.MapSize.X, world.Map.MapSize.Y, binSize);

            self.Trait <Shroud>().OnShroudChanged += uv => dirtyFrozenActorIds.UnionWith(partitionedFrozenActorIds.At(new int2(uv.U, uv.V)));
        }
Example #3
0
        public FrozenActorLayer(World world, FrozenActorLayerInfo info)
        {
            this.info = info;
            frozen    = new Dictionary <uint, FrozenActor>();
            bins      = new List <FrozenActor> [
                world.Map.MapSize.X * Game.CellSize / info.BinSize,
                world.Map.MapSize.Y *Game.CellSize / info.BinSize];

            for (var j = 0; j <= bins.GetUpperBound(1); j++)
            {
                for (var i = 0; i <= bins.GetUpperBound(0); i++)
                {
                    bins[i, j] = new List <FrozenActor>();
                }
            }
        }
        public FrozenActorLayer(World world, FrozenActorLayerInfo info)
        {
            this.info = info;
            frozen = new Dictionary<uint, FrozenActor>();
            bins = new List<FrozenActor>[
                world.Map.MapSize.X * Game.CellSize / info.BinSize,
                world.Map.MapSize.Y * Game.CellSize / info.BinSize];

            for (var j = 0; j <= bins.GetUpperBound(1); j++)
                for (var i = 0; i <= bins.GetUpperBound(0); i++)
                    bins[i, j] = new List<FrozenActor>();
        }