示例#1
0
        void UpdateRenderedSpriteInner(CPos cell, RendererCellContents content)
        {
            if (content.Density > 0)
            {
                var clear = FindClearSides(cell, content.Type);

                if (clear == ClearSides.None)
                {
                    var maxDensity = ResourceLayer.GetMaxDensity(content.Type);
                    var index      = content.Density > maxDensity / 2 ? 1 : 0;
                    UpdateSpriteLayers(cell, content.Sequence, index, content.Palette);
                }
                else if (SpriteMap.TryGetValue(clear, out var index))
                {
                    UpdateSpriteLayers(cell, content.Sequence, index, content.Palette);
                }
                else
                {
                    throw new InvalidOperationException($"SpriteMap does not contain an index for ClearSides type '{clear}'");
                }
            }
            else
            {
                UpdateSpriteLayers(cell, null, 0, null);
            }
        }
示例#2
0
        void UpdateRenderedSpriteInner(CPos cell, RendererCellContents content)
        {
            var density    = content.Density;
            var renderType = content.Type;

            if (density > 0 && renderType != null)
            {
                // The call chain for this method (that starts with AddDirtyCell()) guarantees
                // that the new content type would still be suitable for this renderer,
                // but that is a bit too fragile to rely on in case the code starts changing.
                if (!Info.RenderTypes.Contains(renderType.Info.Type))
                {
                    return;
                }

                var clear = FindClearSides(renderType, cell);
                int index;
                if (SpriteMap.TryGetValue(clear, out index))
                {
                    UpdateSpriteLayers(cell, renderType.Variants.First().Value, index, renderType.Palette);
                }
                else
                {
                    Log.Write("debug", "{1}: SpriteMap does not contain an index for ClearSides type '{0}'".F(clear, cell));
                }
            }
            else
            {
                UpdateSpriteLayers(cell, null, 0, null);
            }
        }
示例#3
0
        protected virtual void UpdateRenderedSprite(CPos cell, RendererCellContents content)
        {
            var density = content.Density;
            var type    = content.Type;

            if (content.Density > 0)
            {
                // The call chain for this method (that starts with AddDirtyCell()) guarantees
                // that the new content type would still be suitable for this renderer,
                // but that is a bit too fragile to rely on in case the code starts changing.
                if (!Info.RenderTypes.Contains(type.Info.Type))
                {
                    return;
                }

                var sprites    = type.Variants[content.Variant];
                var maxDensity = type.Info.MaxDensity;
                var frame      = int2.Lerp(0, sprites.Length - 1, density, maxDensity);

                UpdateSpriteLayers(cell, sprites, frame, type.Palette);
            }
            else
            {
                UpdateSpriteLayers(cell, null, 0, null);
            }
        }
示例#4
0
        protected override void UpdateRenderedSprite(CPos cell, RendererCellContents content)
        {
            UpdateRenderedSpriteInner(cell, content);

            for (var i = 0; i < Directions.Length; i++)
            {
                UpdateRenderedSpriteInner(cell + Directions[i]);
            }
        }
        public override void UpdateRenderedSprite(CPos cell, RendererCellContents content)
        {
            UpdateRenderedSpriteInner(cell, content);

            var directions = CVec.Directions;

            for (var i = 0; i < directions.Length; i++)
            {
                UpdateRenderedSpriteInner(cell + directions[i]);
            }
        }
示例#6
0
        protected override void UpdateRenderedSprite(CPos cell, RendererCellContents content)
        {
            UpdateRenderedSpriteInner(cell, content);

            var directions = CVec.Directions;

            for (var i = 0; i < directions.Length; i++)
            {
                var neighbour = cell + directions[i];
                UpdateRenderedSpriteInner(neighbour, RenderContents[neighbour]);
            }
        }
示例#7
0
        void UpdateRenderedSpriteInner(CPos cell, RendererCellContents content)
        {
            var density    = content.Density;
            var renderType = content.Type;

            if (density > 0 && renderType != null)
            {
                // The call chain for this method (that starts with AddDirtyCell()) guarantees
                // that the new content type would still be suitable for this renderer,
                // but that is a bit too fragile to rely on in case the code starts changing.
                if (!Info.RenderTypes.Contains(renderType.Info.Type))
                {
                    return;
                }

                var clear = FindClearSides(renderType, cell);
                int index;

                if (clear == ClearSides.None && CellContainsMaxDensity(cell, renderType))
                {
                    var maxDensityClear = FindMaxDensityClearSides(renderType, cell);
                    if (SpriteMap.TryGetValue(maxDensityClear, out index))
                    {
                        // Max density sprites is right after normal sprites
                        index += 16;
                        UpdateSpriteLayers(cell, renderType.Variants.First().Value[index], renderType.Palette);
                    }
                    else
                    {
                        throw new InvalidOperationException("SpriteMap does not contain an index for Max Densitty ClearSides type '{0}'".F(clear));
                    }
                }
                else if (SpriteMap.TryGetValue(clear, out index))
                {
                    UpdateSpriteLayers(cell, renderType.Variants.First().Value[index], renderType.Palette);
                }
                else
                {
                    throw new InvalidOperationException("SpriteMap does not contain an index for ClearSides type '{0}'".F(clear));
                }
            }
            else
            {
                UpdateSpriteLayers(cell, null, null);
            }
        }
示例#8
0
        void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
        {
            var resources = w.WorldActor.TraitsImplementing <ResourceType>()
                            .ToDictionary(r => r.Info.ResourceType, r => r);

            // Build the sprite layer dictionary for rendering resources
            // All resources that have the same palette must also share a sheet and blend mode
            foreach (var r in resources)
            {
                var layer = spriteLayers.GetOrAdd(r.Value.Palette, pal =>
                {
                    var first = r.Value.Variants.First().Value.GetSprite(0);
                    return(new TerrainSpriteLayer(w, wr, first.Sheet, first.BlendMode, pal, wr.World.Type != WorldType.Editor));
                });

                // Validate that sprites are compatible with this layer
                var sheet   = layer.Sheet;
                var sprites = r.Value.Variants.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x)));
                if (sprites.Any(s => s.Sheet != sheet))
                {
                    throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
                }

                var blendMode = layer.BlendMode;
                if (sprites.Any(s => s.BlendMode != blendMode))
                {
                    throw new InvalidDataException("Resource sprites specify different blend modes. "
                                                   + "Try using different palettes for resource types that use different blend modes.");
                }
            }

            // Initialize the RenderContent with the initial map state
            // because the shroud may not be enabled.
            foreach (var cell in w.Map.AllCells)
            {
                var type = ResourceLayer.GetResourceType(cell);
                if (type != null && Info.RenderTypes.Contains(type.Info.Type))
                {
                    var resourceContent      = ResourceLayer.GetResource(cell);
                    var rendererCellContents = new RendererCellContents(ChooseRandomVariant(resourceContent.Type), resourceContent.Type, resourceContent.Density);
                    RenderContent[cell] = rendererCellContents;
                    UpdateRenderedSprite(cell, rendererCellContents);
                }
            }
        }
示例#9
0
        void UpdateRenderedSpriteInner(CPos cell, RendererCellContents content)
        {
            var density    = content.Density;
            var renderType = content.Type;

            if (density > 0 && renderType != null)
            {
                var clear = FindClearSides(cell, content.Type);
                if (SpriteMap.TryGetValue(clear, out var index))
                {
                    UpdateSpriteLayers(cell, content.Sequence, index, content.Palette);
                }
                else
                {
                    Log.Write("debug", "{1}: SpriteMap does not contain an index for ClearSides type '{0}'".F(clear, cell));
                }
            }
            else
            {
                UpdateSpriteLayers(cell, null, 0, null);
            }
        }
示例#10
0
        void ITickRender.TickRender(WorldRenderer wr, Actor self)
        {
            foreach (var cell in dirty)
            {
                if (self.World.FogObscures(cell))
                {
                    continue;
                }

                var resourceContent = ResourceLayer.GetResource(cell);
                if (resourceContent.Density > 0)
                {
                    var cellContents = RenderContent[cell];
                    var variant      = cellContents.Variant;
                    if (cellContents.Variant == null || cellContents.Type != resourceContent.Type)
                    {
                        variant = ChooseRandomVariant(resourceContent.Type);
                    }

                    var rendererCellContents = new RendererCellContents(variant, resourceContent.Type, resourceContent.Density);
                    RenderContent[cell] = rendererCellContents;

                    UpdateRenderedSprite(cell, rendererCellContents);
                }
                else
                {
                    var rendererCellContents = RendererCellContents.Empty;
                    RenderContent[cell] = rendererCellContents;
                    UpdateRenderedSprite(cell, rendererCellContents);
                }

                cleanDirty.Enqueue(cell);
            }

            while (cleanDirty.Count > 0)
            {
                dirty.Remove(cleanDirty.Dequeue());
            }
        }