Exemplo n.º 1
0
        public IEnumerable <IRenderable> UpdatePerFrameResources(IRendererContext context, IEnumerable <IRenderable> renderables)
        {
            var c  = (VeldridRendererContext)context;
            var cl = c.CommandList;
            var gd = c.GraphicsDevice;

            ITextureManager textureManager = Resolve <ITextureManager>();

            foreach (var buffer in _instanceBuffers)
            {
                buffer.Dispose();
            }
            _instanceBuffers.Clear();

            foreach (var resourceSet in _resourceSets)
            {
                resourceSet.Dispose();
            }
            _resourceSets.Clear();

            void UpdateTilemapWindow(TileMapWindow window)
            {
                var tilemap = window.TileMap;

                window.InstanceBufferId = _instanceBuffers.Count;
                var buffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)window.Length * TileMap.Tile.StructSize, BufferUsage.VertexBuffer));

                buffer.Name = $"B_Tile3DInst{_instanceBuffers.Count}";
                cl.UpdateBuffer(buffer, 0, ref tilemap.Tiles[window.Offset], TileMap.Tile.StructSize * (uint)window.Length);
                _instanceBuffers.Add(buffer);

                textureManager.PrepareTexture(tilemap.Floors, context);
                textureManager.PrepareTexture(tilemap.Walls, context);
            }

            foreach (var renderable in renderables)
            {
                if (renderable is TileMap tilemap)
                {
                    var dummyWindow = new TileMapWindow(tilemap, 0, tilemap.Tiles.Length);
                    UpdateTilemapWindow(dummyWindow);
                    yield return(dummyWindow);
                }
                else if (renderable is TileMapWindow window)
                {
                    UpdateTilemapWindow(window);
                    yield return(window);
                }
            }
        }
Exemplo n.º 2
0
        public IEnumerable <IRenderable> UpdatePerFrameResources(IRendererContext context, IEnumerable <IRenderable> renderables)
        {
            var c  = (VeldridRendererContext)context;
            var gd = c.GraphicsDevice;

            if (!(renderables.FirstOrDefault() is SkyboxRenderable skybox))
            {
                yield break;
            }

            ITextureManager      textureManager = Resolve <ITextureManager>();
            IDeviceObjectManager objectManager  = Resolve <IDeviceObjectManager>();

            textureManager?.PrepareTexture(skybox.Texture, context);
            TextureView textureView = (TextureView)textureManager?.GetTexture(skybox.Texture);

            var resourceSet = objectManager.Get <ResourceSet>((skybox, textureView));

            if (resourceSet == null)
            {
                resourceSet = gd.ResourceFactory.CreateResourceSet(new ResourceSetDescription(
                                                                       _resourceLayout,
                                                                       gd.PointSampler,
                                                                       textureView,
                                                                       _uniformBuffer));
                resourceSet.Name = $"RS_Sky:{skybox.Texture.Name}";
                PerfTracker.IncrementFrameCounter("Create ResourceSet");
                objectManager.Set((skybox, textureView), resourceSet);
            }

            yield return(skybox);
        }
Exemplo n.º 3
0
        public IEnumerable <IRenderable> UpdatePerFrameResources(GraphicsDevice gd, CommandList cl, SceneContext sc, IEnumerable <IRenderable> renderables)
        {
            ITextureManager textureManager = Resolve <ITextureManager>();

            foreach (var buffer in _instanceBuffers)
            {
                buffer.Dispose();
            }
            _instanceBuffers.Clear();

            foreach (var resourceSet in _resourceSets)
            {
                resourceSet.Dispose();
            }
            _resourceSets.Clear();

            void UpdateTilemapWindow(TileMapWindow window)
            {
                var tilemap = window.TileMap;

                window.InstanceBufferId = _instanceBuffers.Count;
                var buffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)window.Length * TileMap.Tile.StructSize, BufferUsage.VertexBuffer));

                buffer.Name = $"B_Tile3DInst{_instanceBuffers.Count}";
                cl.UpdateBuffer(buffer, 0, ref tilemap.Tiles[window.Offset], TileMap.Tile.StructSize * (uint)window.Length);
                _instanceBuffers.Add(buffer);

                textureManager.PrepareTexture(tilemap.Floors, gd);
                textureManager.PrepareTexture(tilemap.Walls, gd);
            }

            foreach (var tilemap in renderables.OfType <TileMap>())
            {
                var window = new TileMapWindow(tilemap, 0, tilemap.Tiles.Length);
                UpdateTilemapWindow(window);
                yield return(window);
            }

            foreach (var window in renderables.OfType <TileMapWindow>())
            {
                UpdateTilemapWindow(window);
                yield return(window);
            }
        }
Exemplo n.º 4
0
        public IEnumerable <IRenderable> UpdatePerFrameResources(GraphicsDevice gd, CommandList cl, SceneContext sc, IEnumerable <IRenderable> renderables)
        {
            ITextureManager textureManager = Resolve <ITextureManager>();
            ISpriteResolver spriteResolver = Resolve <ISpriteResolver>();

            foreach (var buffer in _instanceBuffers)
            {
                buffer.Dispose();
            }
            _instanceBuffers.Clear();

            foreach (var resourceSet in _resourceSets)
            {
                resourceSet.Dispose();
            }
            _resourceSets.Clear();

            void SetupMultiSpriteResources(MultiSprite multiSprite)
            {
                textureManager?.PrepareTexture(multiSprite.Key.Texture, gd);
                multiSprite.BufferId = _instanceBuffers.Count;
                // multiSprite.RotateSprites(sc.Camera.Position);
                var buffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)multiSprite.Instances.Length * SpriteInstanceData.StructSize, BufferUsage.VertexBuffer));

                buffer.Name = $"B_SpriteInst{_instanceBuffers.Count}";
                cl.UpdateBuffer(buffer, 0, multiSprite.Instances);
                _instanceBuffers.Add(buffer);
            }

            var resolved = renderables.OfType <Sprite>().Select(spriteResolver.Resolve);
            var grouped  = resolved.GroupBy(x => x.Item1, x => x.Item2);

            foreach (var group in grouped)
            {
                var multiSprite = group.Key.Flags.HasFlag(SpriteFlags.NoTransform)
                    ? new UiMultiSprite(group.Key, _instanceBuffers.Count, group)
                    : new MultiSprite(group.Key, _instanceBuffers.Count, group);

                SetupMultiSpriteResources(multiSprite);
                yield return(multiSprite);
            }

            foreach (var multiSprite in renderables.OfType <MultiSprite>())
            {
                if (multiSprite.Instances.Length == 0)
                {
                    continue;
                }
                SetupMultiSpriteResources(multiSprite);
                yield return(multiSprite);
            }
        }
Exemplo n.º 5
0
        public IEnumerable <IRenderable> UpdatePerFrameResources(GraphicsDevice gd, CommandList cl, SceneContext sc, IEnumerable <IRenderable> renderables)
        {
            ITextureManager      textureManager = Resolve <ITextureManager>();
            IDeviceObjectManager dom            = Resolve <IDeviceObjectManager>();

            foreach (var sprite in renderables.OfType <MultiSprite>())
            {
                if (sprite.ActiveInstances == 0)
                {
                    continue;
                }

                uint bufferSize = (uint)sprite.Instances.Length * SpriteInstanceData.StructSize;
                var  buffer     = dom.Prepare((sprite, sprite),
                                              () =>
                {
                    var newBuffer  = gd.ResourceFactory.CreateBuffer(new BufferDescription(bufferSize, BufferUsage.VertexBuffer));
                    newBuffer.Name = $"B_SpriteInst:{sprite.Name}";
                    PerfTracker.IncrementFrameCounter("Create InstanceBuffer");
                    return(newBuffer);
                }, existing => existing.SizeInBytes != bufferSize);

                if (sprite.InstancesDirty)
                {
                    cl.UpdateBuffer(buffer, 0, sprite.Instances);
                    PerfTracker.IncrementFrameCounter("Update InstanceBuffers");
                }

                textureManager?.PrepareTexture(sprite.Key.Texture, gd);
                TextureView textureView = textureManager?.GetTexture(sprite.Key.Texture);
                dom.Prepare((sprite, textureView),
                            () =>
                {
                    var resourceSet = gd.ResourceFactory.CreateResourceSet(new ResourceSetDescription(
                                                                               _perSpriteResourceLayout,
                                                                               gd.PointSampler,
                                                                               textureView,
                                                                               _uniformBuffer));
                    resourceSet.Name = $"RS_Sprite:{sprite.Key.Texture.Name}";
                    PerfTracker.IncrementFrameCounter("Create ResourceSet");
                    return(resourceSet);
                }, _ => false
                            );

                sprite.InstancesDirty = false;
                yield return(sprite);
            }

            Resolve <ISpriteManager>().Cleanup();
        }
Exemplo n.º 6
0
        public IEnumerable <IRenderable> UpdatePerFrameResources(IRendererContext context, IEnumerable <IRenderable> renderables)
        {
            var c  = (VeldridRendererContext)context;
            var cl = c.CommandList;
            var gd = c.GraphicsDevice;
            var sc = c.SceneContext;

            ITextureManager      textureManager = Resolve <ITextureManager>();
            IDeviceObjectManager objectManager  = Resolve <IDeviceObjectManager>();
            EngineFlags          engineFlags    = Resolve <IEngineSettings>().Flags;

            foreach (var renderable in renderables)
            {
                var sprite = (MultiSprite)renderable;
                if (sprite.ActiveInstances == 0)
                {
                    continue;
                }

                var shaderKey = new SpriteShaderKey(sprite, engineFlags);
                if (!_pipelines.ContainsKey(shaderKey))
                {
                    _pipelines.Add(shaderKey, BuildPipeline(gd, sc, shaderKey));
                }

                uint bufferSize = (uint)sprite.Instances.Length * SpriteInstanceData.StructSize;
                var  buffer     = objectManager.Get <DeviceBuffer>((sprite, sprite));
                if (buffer?.SizeInBytes != bufferSize)
                {
                    buffer      = gd.ResourceFactory.CreateBuffer(new BufferDescription(bufferSize, BufferUsage.VertexBuffer));
                    buffer.Name = $"B_SpriteInst:{sprite.Name}";
                    PerfTracker.IncrementFrameCounter("Create InstanceBuffer");
                    objectManager.Set((sprite, sprite), buffer);
                }

                if (sprite.InstancesDirty)
                {
                    cl.UpdateBuffer(buffer, 0, sprite.Instances);
                    PerfTracker.IncrementFrameCounter("Update InstanceBuffers");
                }

                textureManager?.PrepareTexture(sprite.Key.Texture, context);
                TextureView textureView = (TextureView)textureManager?.GetTexture(sprite.Key.Texture);

                var resourceSet = objectManager.Get <ResourceSet>((sprite, textureView));
                if (resourceSet == null)
                {
                    resourceSet = gd.ResourceFactory.CreateResourceSet(new ResourceSetDescription(
                                                                           _perSpriteResourceLayout,
                                                                           gd.PointSampler,
                                                                           textureView,
                                                                           _uniformBuffer));
                    resourceSet.Name = $"RS_Sprite:{sprite.Key.Texture.Name}";
                    PerfTracker.IncrementFrameCounter("Create ResourceSet");
                    objectManager.Set((sprite, textureView), resourceSet);
                }

                sprite.InstancesDirty = false;
                yield return(sprite);
            }

            Resolve <ISpriteManager>().Cleanup();
        }
Exemplo n.º 7
0
        public void UpdatePerFrameResources(IRendererContext context, IEnumerable <IRenderable> renderables, IList <IRenderable> results)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (renderables == null)
            {
                throw new ArgumentNullException(nameof(renderables));
            }
            if (results == null)
            {
                throw new ArgumentNullException(nameof(results));
            }
            var c  = (VeldridRendererContext)context;
            var cl = c.CommandList;
            var gd = c.GraphicsDevice;

            ITextureManager textureManager = Resolve <ITextureManager>();

            foreach (var buffer in _instanceBuffers)
            {
                buffer.Dispose();
            }
            _instanceBuffers.Clear();

            foreach (var resourceSet in _resourceSets)
            {
                resourceSet.Dispose();
            }
            _resourceSets.Clear();

            void UpdateTilemapWindow(TileMapWindow window)
            {
                var tilemap = window.TileMap;

                cl.PushDebugGroup($"Tiles3D:{tilemap.Name}:{tilemap.RenderOrder}");
                window.InstanceBufferId = _instanceBuffers.Count;
                var buffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)window.Length * DungeonTile.StructSize, BufferUsage.VertexBuffer));

                buffer.Name = $"B_Tile3DInst{_instanceBuffers.Count}";
                unsafe
                {
                    fixed(DungeonTile *tile = &tilemap.Tiles[0])
                    {
                        cl.UpdateBuffer(
                            buffer,
                            0,
                            (IntPtr)(&tile[window.Offset]),
                            DungeonTile.StructSize * (uint)window.Length);
                    }
                }
                _instanceBuffers.Add(buffer);

                textureManager.PrepareTexture(tilemap.Floors, context);
                textureManager.PrepareTexture(tilemap.Walls, context);
                cl.PopDebugGroup();
            }

            foreach (var renderable in renderables)
            {
                if (renderable is DungeonTileMap tilemap)
                {
                    var dummyWindow = new TileMapWindow(tilemap, 0, tilemap.Tiles.Length);
                    UpdateTilemapWindow(dummyWindow);
                    results.Add(dummyWindow);
                }
                else if (renderable is TileMapWindow window)
                {
                    UpdateTilemapWindow(window);
                    results.Add(window);
                }
            }
        }