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); } } }
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); }
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); } }
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); } }
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(); }
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(); }
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); } } }