From 16edf45b8d2aa5e43158bc23c6157e5541e119bb Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 02:47:07 +0500 Subject: [PATCH 01/10] initial --- Hypercube.Client/Dependencies.cs | 6 + .../Entities/Systems/Sprite/SpriteSystem.cs | 10 +- .../Graphics/Drawing/RenderDrawing.cs | 7 +- .../Graphics/Rendering/Renderer.Render.cs | 3 +- .../Graphics/Rendering/Renderer.cs | 5 +- .../Graphics/Texturing/ITextureManager.cs | 1 - .../Graphics/Texturing/TextureManager.cs | 132 +----------------- .../Resources/Caching/CacheManager.Preload.cs | 35 +++++ .../Resources/Caching/CacheManager.cs | 110 +++++++++++++++ .../Resources/Caching/TextureResource.cs | 26 ++++ .../Dependency/DependencyManager.cs | 6 + .../Resources/Caching/ICacheManager.cs | 15 ++ .../Caching/ICacheManagerInternal.cs | 6 + .../Caching/Resource/BaseResource.cs | 19 +++ 14 files changed, 244 insertions(+), 137 deletions(-) create mode 100644 Hypercube.Client/Resources/Caching/CacheManager.Preload.cs create mode 100644 Hypercube.Client/Resources/Caching/CacheManager.cs create mode 100644 Hypercube.Client/Resources/Caching/TextureResource.cs create mode 100644 Hypercube.Shared/Resources/Caching/ICacheManager.cs create mode 100644 Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs create mode 100644 Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs diff --git a/Hypercube.Client/Dependencies.cs b/Hypercube.Client/Dependencies.cs index 9d2b084..f3c0357 100644 --- a/Hypercube.Client/Dependencies.cs +++ b/Hypercube.Client/Dependencies.cs @@ -4,12 +4,14 @@ using Hypercube.Client.Graphics.Viewports; using Hypercube.Client.Input.Handler; using Hypercube.Client.Input.Manager; +using Hypercube.Client.Resources.Caching; using Hypercube.Client.Runtimes; using Hypercube.Client.Runtimes.Loop; using Hypercube.Shared.Dependency; using Hypercube.Shared.Entities.Realisation.EventBus; using Hypercube.Shared.Entities.Realisation.Manager; using Hypercube.Shared.EventBus; +using Hypercube.Shared.Resources.Caching; using Hypercube.Shared.Resources.Manager; using Hypercube.Shared.Timing; @@ -39,6 +41,10 @@ public static void Register(DependenciesContainer rootContainer) // Texturing rootContainer.Register(); + // Caching + rootContainer.Register(); + rootContainer.Register(); + // Camera rootContainer.Register(); diff --git a/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs b/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs index 0fa23d1..3a23661 100644 --- a/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs +++ b/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs @@ -1,19 +1,21 @@ using Hypercube.Client.Graphics.Drawing; using Hypercube.Client.Graphics.Event; using Hypercube.Client.Graphics.Texturing; +using Hypercube.Client.Resources.Caching; using Hypercube.Shared.Dependency; using Hypercube.Shared.Entities.Realisation; using Hypercube.Shared.Entities.Realisation.Systems; using Hypercube.Shared.Entities.Systems.Transform; using Hypercube.Shared.Math.Transform; using Hypercube.Shared.Math.Vector; +using Hypercube.Shared.Resources.Caching; namespace Hypercube.Client.Entities.Systems.Sprite; public sealed class SpriteSystem : EntitySystem { [Dependency] private readonly IRenderDrawing _drawing = default!; - [Dependency] private readonly ITextureManager _textureManager = default!; + [Dependency] private readonly ICacheManager _cacheManager = default!; public override void Initialize() { @@ -34,6 +36,10 @@ private void OnRenderDrawing(ref RenderDrawingEvent ev) public void Render(Entity entity, Transform2 transform) { - _drawing.DrawTexture(entity.Component.TextureHandle ??= _textureManager.GetTextureHandle(entity.Component.TexturePath), Vector2.Zero, entity.Component.Color, transform.Matrix * entity.Component.Transform.Matrix); + if (entity.Component.TextureHandle == null) + entity.Component.TextureHandle = + _cacheManager.GetResource(entity.Component.TexturePath).Texture ?? throw new NullReferenceException(); + + _drawing.DrawTexture(entity.Component.TextureHandle, Vector2.Zero, entity.Component.Color, transform.Matrix * entity.Component.Transform.Matrix); } } \ No newline at end of file diff --git a/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs b/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs index 1dbece4..15326cf 100644 --- a/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs +++ b/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs @@ -1,18 +1,20 @@ using Hypercube.Client.Graphics.Rendering; using Hypercube.Client.Graphics.Texturing; using Hypercube.Client.Graphics.Texturing.TextureSettings; +using Hypercube.Client.Resources.Caching; using Hypercube.Shared.Dependency; using Hypercube.Shared.Math; using Hypercube.Shared.Math.Box; using Hypercube.Shared.Math.Matrix; using Hypercube.Shared.Math.Vector; +using Hypercube.Shared.Resources.Caching; namespace Hypercube.Client.Graphics.Drawing; public sealed class RenderDrawing : IRenderDrawing { - [Dependency] private readonly ITextureManager _textureManager = default!; [Dependency] private readonly IRenderer _renderer = default!; + [Dependency] private readonly ICacheManager _cacheManager = default!; public void DrawTexture(ITexture texture, Vector2 position) { @@ -36,7 +38,8 @@ public void DrawTexture(ITexture texture, Box2 quad, Box2 uv) public void DrawTexture(ITexture texture, Box2 quad, Box2 uv, Color color) { - _renderer.DrawTexture(_textureManager.GetTextureHandle(texture, new Texture2DCreationSettings()), quad, uv, color); + var handle = _cacheManager.GetResource(texture.Path).Texture; + _renderer.DrawTexture(handle, quad, uv, color); } public void DrawTexture(ITextureHandle texture, Vector2 position, Color color, Matrix4X4 model) diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs index 6ad7c89..018221c 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs @@ -2,6 +2,7 @@ using Hypercube.Client.Graphics.Shading; using Hypercube.Client.Graphics.Texturing; using Hypercube.Client.Graphics.Windows; +using Hypercube.Client.Resources.Caching; using Hypercube.Shared.Math.Matrix; using Hypercube.Shared.Runtimes.Loop.Event; using OpenToolkit.Graphics.OpenGL4; @@ -33,7 +34,7 @@ public sealed partial class Renderer private void OnLoad() { _baseShader = new Shader("/base", _resourceManager); - _baseTexture = _textureManager.GetTextureHandle("/icon.png"); + _baseTexture = _cacheManager.GetResource("/icon.png").Texture; _baseTexture.Bind(HTexTarget.Texture2D); _cameraManager.SetMainCamera(_cameraManager.CreateCamera2D(MainWindow.Size)); diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.cs b/Hypercube.Client/Graphics/Rendering/Renderer.cs index 25b9fe1..39a1782 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.cs @@ -9,6 +9,7 @@ using Hypercube.Shared.EventBus; using Hypercube.Shared.EventBus.Events; using Hypercube.Shared.Logging; +using Hypercube.Shared.Resources.Caching; using Hypercube.Shared.Resources.Manager; using Hypercube.Shared.Runtimes.Event; using Hypercube.Shared.Runtimes.Loop.Event; @@ -26,6 +27,8 @@ public sealed partial class Renderer : IRenderer, IPostInject, IEventSubscriber [Dependency] private readonly ITiming _timing = default!; [Dependency] private readonly ICameraManager _cameraManager = default!; [Dependency] private readonly IResourceManager _resourceManager = default!; + [Dependency] private readonly ICacheManagerInternal _cacheManagerInternal = default!; + [Dependency] private readonly ICacheManager _cacheManager = default!; private readonly ILogger _logger = LoggingManager.GetLogger("renderer"); private readonly ILogger _loggerOpenGL = LoggingManager.GetLogger("open_gl")!; @@ -117,7 +120,7 @@ private void OnStartup(ref RuntimeStartupEvent args) InitOpenGL(); - _textureManager.CacheHandles(); + _cacheManagerInternal.PreloadTextures(); OnLoad(); } diff --git a/Hypercube.Client/Graphics/Texturing/ITextureManager.cs b/Hypercube.Client/Graphics/Texturing/ITextureManager.cs index a1e85a9..aa38410 100644 --- a/Hypercube.Client/Graphics/Texturing/ITextureManager.cs +++ b/Hypercube.Client/Graphics/Texturing/ITextureManager.cs @@ -6,7 +6,6 @@ namespace Hypercube.Client.Graphics.Texturing; public interface ITextureManager { ITexture GetTexture(ResourcePath path); - void CacheHandles(); ITextureHandle GetTextureHandle(ResourcePath path, ITextureCreationSettings settings); ITextureHandle GetTextureHandle(ResourcePath path); diff --git a/Hypercube.Client/Graphics/Texturing/TextureManager.cs b/Hypercube.Client/Graphics/Texturing/TextureManager.cs index adac0d3..32e966a 100644 --- a/Hypercube.Client/Graphics/Texturing/TextureManager.cs +++ b/Hypercube.Client/Graphics/Texturing/TextureManager.cs @@ -4,23 +4,17 @@ using Hypercube.Client.Graphics.Texturing.Events; using Hypercube.Client.Graphics.Texturing.TextureSettings; using Hypercube.Shared.Dependency; -using Hypercube.Shared.EventBus; using Hypercube.Shared.Logging; using Hypercube.Shared.Resources; using Hypercube.Shared.Resources.Manager; -using Hypercube.Shared.Runtimes.Event; using StbImageSharp; namespace Hypercube.Client.Graphics.Texturing; -public sealed class TextureManager : ITextureManager, IEventSubscriber, IPostInject +public sealed class TextureManager : ITextureManager { - [Dependency] private readonly IEventBus _eventBus = default!; [Dependency] private readonly IResourceManager _resourceManager = default!; - private FrozenDictionary _cachedHandles = FrozenDictionary.Empty; - private FrozenDictionary _cachedTextures = FrozenDictionary.Empty; - private readonly Logger _logger = LoggingManager.GetLogger("texturing"); public TextureManager() @@ -28,66 +22,6 @@ public TextureManager() StbImage.stbi_set_flip_vertically_on_load(1); } - public void PostInject() - { - _eventBus.Subscribe(this, OnInitialization); - } - - private void OnInitialization(ref RuntimeInitializationEvent args) - { - _logger.EngineInfo("Caching textures..."); - var st = Stopwatch.StartNew(); - var ev = new TexturesPreloadEvent(new HashSet()); - var textures = new Dictionary(); - _eventBus.Raise(ref ev); - - foreach (var texturePath in ev.Textures) - { - if (textures.ContainsKey(texturePath)) - continue; - - var texture = CreateTexture(texturePath); - textures.Add(texturePath, texture); - } - - CacheTextures(textures); - st.Stop(); - _logger.EngineInfo($"Cached {_cachedTextures.Count} textures in {st.Elapsed}"); - } - - public void CacheHandles() - { - _logger.EngineInfo("Caching handles..."); - var st = Stopwatch.StartNew(); - - var ev = new HandlesPreloadEvent(new HashSet()); - _eventBus.Raise(ref ev); - - var handles = new Dictionary(); - - foreach (var handlePath in ev.Handles) - { - if (handles.ContainsKey(handlePath)) - continue; - - ITextureHandle handle; - - if (_cachedTextures.TryGetValue(handlePath, out var texture)) - { - handle = CreateTextureHandle(texture, new Texture2DCreationSettings()); - handles.Add(handlePath, handle); - continue; - } - - handle = CreateTextureHandle(handlePath, new Texture2DCreationSettings()); - handles.Add(handlePath, handle); - } - - CacheHandles(handles); - st.Stop(); - - _logger.EngineInfo($"Cached {_cachedHandles.Count} handles in {st.Elapsed}"); - } #region PublicAPI @@ -122,13 +56,7 @@ public ITextureHandle GetTextureHandle(ITexture texture, ITextureCreationSetting internal ITexture GetTextureInternal(ResourcePath path) { - if (_cachedTextures.TryGetValue(path, out var value)) - return value; - - // fallback to low performance method var texture = CreateTexture(path); - CacheTexture(texture); - return texture; } @@ -144,26 +72,7 @@ internal ITexture CreateTexture(ResourcePath path) internal ITextureHandle GetTextureHandleInternal(ResourcePath path, ITextureCreationSettings settings) { - if (_cachedHandles.TryGetValue(path, out var value)) - return value; - - ITextureHandle handle; - - if (_cachedTextures.TryGetValue(path, out var texture)) - { - // low performance method fallback - handle = CreateTextureHandle(texture, settings); - CacheHandle(handle); - - return handle; - } - - // fallback to low performance method - handle = CreateTextureHandle(path, settings); - - CacheHandle(handle); - - return handle; + return CreateTextureHandle(path, settings); } internal ITextureHandle CreateTextureHandle(ResourcePath path, ITextureCreationSettings settings) @@ -178,43 +87,6 @@ internal ITextureHandle CreateTextureHandle(ITexture texture, ITextureCreationSe { return new TextureHandle(texture, settings); } - - /// - /// Extremely high impact on performance, use when you know what you're doing - /// - internal void CacheTexture(ITexture texture) - { - var cached = _cachedTextures.ToDictionary(); - cached.Add(texture.Path, texture); - _cachedTextures = cached.ToFrozenDictionary(); - _logger.Warning($"Cached texture with path {texture.Path} in runtime"); - } - - /// - /// Extremely high impact on performance, use when you know what you're doing - /// - internal void CacheHandle(ITextureHandle texture) - { - var cached = _cachedHandles.ToDictionary(); - cached.Add(texture.Texture.Path, texture); - _cachedHandles = cached.ToFrozenDictionary(); - _logger.Warning($"Cached handle with path {texture.Texture.Path} in runtime"); - } #endregion - - #region Preloading - - internal void CacheTextures(Dictionary textures) - { - _cachedTextures = textures.ToFrozenDictionary(); - } - - internal void CacheHandles(Dictionary handles) - { - _cachedHandles = handles.ToFrozenDictionary(); - } - - #endregion - } \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs b/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs new file mode 100644 index 0000000..45aa937 --- /dev/null +++ b/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs @@ -0,0 +1,35 @@ +using System.Diagnostics; +using Hypercube.Shared.Dependency; +using Hypercube.Shared.Logging; + +namespace Hypercube.Client.Resources.Caching; + +public partial class CacheManager +{ + public void PreloadTextures() + { + var logger = LoggingManager.GetLogger("cache.preload"); + + PreloadTextures(logger); + } + private void PreloadTextures(Logger logger) + { + var container = DependencyManager.GetContainer(); + logger.EngineInfo("Preloading textures..."); + var st = Stopwatch.StartNew(); + + var texDict = GetTypeDict(); + + var files = _resourceManager.FindContentFiles("/Textures/") + .Where(p => !texDict.ContainsKey(p) && p.Extension == ".png") + .Select(p => new TextureResource() { Path = p}); + + + foreach (var file in files) + { + file.Load(file.Path, container); + + texDict[file.Path] = file; + } + } +} \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/CacheManager.cs b/Hypercube.Client/Resources/Caching/CacheManager.cs new file mode 100644 index 0000000..607e11b --- /dev/null +++ b/Hypercube.Client/Resources/Caching/CacheManager.cs @@ -0,0 +1,110 @@ +using System.Diagnostics.CodeAnalysis; +using Hypercube.Shared.Dependency; +using Hypercube.Shared.Logging; +using Hypercube.Shared.Resources; +using Hypercube.Shared.Resources.Caching; +using Hypercube.Shared.Resources.Caching.Resource; +using Hypercube.Shared.Resources.Manager; + +namespace Hypercube.Client.Resources.Caching; + +public partial class CacheManager : ICacheManager, ICacheManagerInternal +{ + [Dependency] private readonly IResourceManager _resourceManager = default!; + + private Dictionary> _cachedResources = + new Dictionary>(); + + private DependenciesContainer _container = default!; + + private readonly Logger _logger = LoggingManager.GetLogger("cache"); + + #region PublicAPI + + public CacheManager() + { + _container = DependencyManager.GetContainer(); + } + + public T GetResource(ResourcePath path, bool useFallback = true) where T : BaseResource, new() + { + var typeDict = GetTypeDict(); + + if (typeDict.TryGetValue(path, out var cache)) + return (T) cache; + + cache = new T(); + try + { + cache.Load(path, _container); + typeDict[path] = cache; + return (T) cache; + } + catch (Exception ex) + { + if (useFallback && cache.FallbackPath is not null) + return GetResource(cache.FallbackPath.Value, false); + + _logger.Error($"Exception while loading resource {ex.Message}, Stack Trace: {ex.StackTrace}"); + throw; + } + } + + public bool TryGetResource(ResourcePath path, [NotNullWhen(true)] out T? resource) where T : BaseResource, new() + { + var cont = DependencyManager.GetContainer(); + var cache = GetTypeDict(); + + if (cache.TryGetValue(path, out var res)) + { + resource = (T)res; + return true; + } + + res = new T(); + try + { + res.Load(path, cont); + cache[path] = res; + resource = (T)res; + return true; + } + catch (FileNotFoundException) + { + resource = null; + return false; + } + catch (Exception ex) + { + _logger.Error($"Exception while loading resource: {ex.Message}, Stack Trace: {ex.StackTrace}"); + throw; + } + } + + public void CacheResource(ResourcePath path, T resource) where T : BaseResource, new() + { + GetTypeDict()[path] = resource; + } + + public T GetFallback() where T : BaseResource, new() + { + throw new NotImplementedException(); + } + + #endregion + + #region Private + + private Dictionary GetTypeDict() + { + if (_cachedResources.TryGetValue(typeof(T), out var dict)) + return dict; + + dict = new Dictionary(); + _cachedResources[typeof(T)] = dict; + + return dict; + } + + #endregion +} \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/TextureResource.cs b/Hypercube.Client/Resources/Caching/TextureResource.cs new file mode 100644 index 0000000..4a5f1da --- /dev/null +++ b/Hypercube.Client/Resources/Caching/TextureResource.cs @@ -0,0 +1,26 @@ +using Hypercube.Client.Graphics.Texturing; +using Hypercube.Client.Graphics.Texturing.TextureSettings; +using Hypercube.Shared.Dependency; +using Hypercube.Shared.Resources; +using Hypercube.Shared.Resources.Caching.Resource; +using Hypercube.Shared.Resources.Manager; + +namespace Hypercube.Client.Resources.Caching; + +public class TextureResource : BaseResource +{ + public ITextureHandle Texture; + public ResourcePath Path; + + public override void Load(ResourcePath path, DependenciesContainer container) + { + var textureManager = container.Resolve(); + var handle = textureManager.GetTextureHandle(path, new Texture2DCreationSettings()); + Texture = handle; + } + + public override void Dispose() + { + base.Dispose(); + } +} \ No newline at end of file diff --git a/Hypercube.Shared/Dependency/DependencyManager.cs b/Hypercube.Shared/Dependency/DependencyManager.cs index 33ced29..a953275 100644 --- a/Hypercube.Shared/Dependency/DependencyManager.cs +++ b/Hypercube.Shared/Dependency/DependencyManager.cs @@ -75,4 +75,10 @@ public static DependenciesContainer Create() Debug.Assert(_container.IsValueCreated); return new DependenciesContainer(_container.Value!); } + + public static DependenciesContainer GetContainer() + { + Debug.Assert(_container.IsValueCreated); + return _container.Value!; + } } \ No newline at end of file diff --git a/Hypercube.Shared/Resources/Caching/ICacheManager.cs b/Hypercube.Shared/Resources/Caching/ICacheManager.cs new file mode 100644 index 0000000..8c312be --- /dev/null +++ b/Hypercube.Shared/Resources/Caching/ICacheManager.cs @@ -0,0 +1,15 @@ +using System.Diagnostics.CodeAnalysis; +using Hypercube.Shared.Resources.Caching.Resource; + +namespace Hypercube.Shared.Resources.Caching; + +public interface ICacheManager +{ + T GetResource(ResourcePath path, bool useFallback = true) where T : BaseResource, new(); + + bool TryGetResource(ResourcePath path, [NotNullWhen(true)] out T? resource) + where T : BaseResource, new(); + + void CacheResource(ResourcePath path, T resource) + where T : BaseResource, new(); +} \ No newline at end of file diff --git a/Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs b/Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs new file mode 100644 index 0000000..5fbc266 --- /dev/null +++ b/Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs @@ -0,0 +1,6 @@ +namespace Hypercube.Shared.Resources.Caching; + +public interface ICacheManagerInternal +{ + void PreloadTextures(); +} \ No newline at end of file diff --git a/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs b/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs new file mode 100644 index 0000000..5f69fa3 --- /dev/null +++ b/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs @@ -0,0 +1,19 @@ +using Hypercube.Shared.Dependency; + +namespace Hypercube.Shared.Resources.Caching.Resource; + +public abstract class BaseResource : IDisposable +{ + public abstract void Load(ResourcePath path, DependenciesContainer container); + + public virtual void Reload(ResourcePath path, DependenciesContainer container) + { + + } + + public ResourcePath? FallbackPath { get; } + + public virtual void Dispose() + { + } +} \ No newline at end of file From 1d2786b071a35c0a492ab354fc2098dcef9cfc30 Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 03:21:16 +0500 Subject: [PATCH 02/10] fix all shit i made --- Hypercube.Client/Dependencies.cs | 1 - .../Graphics/Rendering/Renderer.Render.cs | 2 +- Hypercube.Client/Graphics/Rendering/Renderer.cs | 16 +--------------- .../Resources/Caching/CacheManager.cs | 3 ++- Hypercube.Example/Example.cs | 4 ++-- .../Resources/Caching/ICacheManager.cs | 2 ++ .../Resources/Caching/ICacheManagerInternal.cs | 6 ------ 7 files changed, 8 insertions(+), 26 deletions(-) delete mode 100644 Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs diff --git a/Hypercube.Client/Dependencies.cs b/Hypercube.Client/Dependencies.cs index f3c0357..63a8e8c 100644 --- a/Hypercube.Client/Dependencies.cs +++ b/Hypercube.Client/Dependencies.cs @@ -43,7 +43,6 @@ public static void Register(DependenciesContainer rootContainer) // Caching rootContainer.Register(); - rootContainer.Register(); // Camera rootContainer.Register(); diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs index 018221c..07050d1 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs @@ -34,7 +34,7 @@ public sealed partial class Renderer private void OnLoad() { _baseShader = new Shader("/base", _resourceManager); - _baseTexture = _cacheManager.GetResource("/icon.png").Texture; + _baseTexture = _cacheManager.GetResource("/Textures/icon.png").Texture; _baseTexture.Bind(HTexTarget.Texture2D); _cameraManager.SetMainCamera(_cameraManager.CreateCamera2D(MainWindow.Size)); diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.cs b/Hypercube.Client/Graphics/Rendering/Renderer.cs index 39a1782..590e274 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.cs @@ -27,7 +27,6 @@ public sealed partial class Renderer : IRenderer, IPostInject, IEventSubscriber [Dependency] private readonly ITiming _timing = default!; [Dependency] private readonly ICameraManager _cameraManager = default!; [Dependency] private readonly IResourceManager _resourceManager = default!; - [Dependency] private readonly ICacheManagerInternal _cacheManagerInternal = default!; [Dependency] private readonly ICacheManager _cacheManager = default!; private readonly ILogger _logger = LoggingManager.GetLogger("renderer"); @@ -73,24 +72,11 @@ public sealed partial class Renderer : IRenderer, IPostInject, IEventSubscriber public void PostInject() { - _eventBus.Subscribe(this, OnTexturesPreload); - _eventBus.Subscribe(this, OnHandlesPreload); _eventBus.Subscribe(this, OnInitialization); _eventBus.Subscribe(this, OnStartup); _eventBus.Subscribe(this, OnFrameUpdate); _eventBus.Subscribe(this, OnFrameRender); } - - private void OnTexturesPreload(ref TexturesPreloadEvent args) - { - args.Textures.Add("/Icons/image.png"); - args.Textures.Add("/icon.png"); - } - - private void OnHandlesPreload(ref HandlesPreloadEvent args) - { - args.Handles.Add("/icon.png"); - } private void OnInitialization(ref RuntimeInitializationEvent args) { @@ -120,7 +106,7 @@ private void OnStartup(ref RuntimeStartupEvent args) InitOpenGL(); - _cacheManagerInternal.PreloadTextures(); + _cacheManager.PreloadTextures(); OnLoad(); } diff --git a/Hypercube.Client/Resources/Caching/CacheManager.cs b/Hypercube.Client/Resources/Caching/CacheManager.cs index 607e11b..9368d8a 100644 --- a/Hypercube.Client/Resources/Caching/CacheManager.cs +++ b/Hypercube.Client/Resources/Caching/CacheManager.cs @@ -8,7 +8,7 @@ namespace Hypercube.Client.Resources.Caching; -public partial class CacheManager : ICacheManager, ICacheManagerInternal +public partial class CacheManager : ICacheManager { [Dependency] private readonly IResourceManager _resourceManager = default!; @@ -33,6 +33,7 @@ public CacheManager() if (typeDict.TryGetValue(path, out var cache)) return (T) cache; + cache = new T(); try { diff --git a/Hypercube.Example/Example.cs b/Hypercube.Example/Example.cs index 35c1946..97cab3d 100644 --- a/Hypercube.Example/Example.cs +++ b/Hypercube.Example/Example.cs @@ -30,7 +30,7 @@ public void PostInject() private void Startup(ref RuntimeStartupEvent args) { - for (var i = 0; i < 300; i++) + for (var i = 0; i < 1000; i++) { var x = _random.NextSingle() * 800 - 400; var y = _random.NextSingle() * 800 - 400; @@ -46,7 +46,7 @@ private void CreateEntity(SceneCoordinates coordinates) var sprite = _entitiesComponentManager.AddComponent(entity); var example = _entitiesComponentManager.AddComponent(entity); - sprite.TexturePath = new ResourcePath("/icon.png"); + sprite.TexturePath = new ResourcePath("/Textures/icon.png"); example.Offset = _random.Next(0, 1000); } } \ No newline at end of file diff --git a/Hypercube.Shared/Resources/Caching/ICacheManager.cs b/Hypercube.Shared/Resources/Caching/ICacheManager.cs index 8c312be..6148d76 100644 --- a/Hypercube.Shared/Resources/Caching/ICacheManager.cs +++ b/Hypercube.Shared/Resources/Caching/ICacheManager.cs @@ -12,4 +12,6 @@ bool TryGetResource(ResourcePath path, [NotNullWhen(true)] out T? resource) void CacheResource(ResourcePath path, T resource) where T : BaseResource, new(); + + void PreloadTextures(); } \ No newline at end of file diff --git a/Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs b/Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs deleted file mode 100644 index 5fbc266..0000000 --- a/Hypercube.Shared/Resources/Caching/ICacheManagerInternal.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Hypercube.Shared.Resources.Caching; - -public interface ICacheManagerInternal -{ - void PreloadTextures(); -} \ No newline at end of file From 3b7947ba532878950b83edf570ebaab4780ebae8 Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 06:34:52 +0500 Subject: [PATCH 03/10] optimize me please --- .../Graphics/Rendering/Renderer.OpenGL.cs | 2 +- .../Graphics/Rendering/Renderer.Render.cs | 2 +- Hypercube.Client/Graphics/Shading/IShader.cs | 2 +- Hypercube.Client/Graphics/Shading/Shader.cs | 4 ++ .../Resources/Caching/AudioSourceResource.cs | 23 +++++++ .../Resources/Caching/CacheManager.Preload.cs | 63 ++++++++++++++++--- .../Resources/Caching/ShaderSourceResource.cs | 25 ++++++++ .../Resources/Caching/TextureResource.cs | 6 +- Hypercube.Example/Example.cs | 12 +++- .../Caching/Resource/BaseResource.cs | 6 +- 10 files changed, 124 insertions(+), 21 deletions(-) create mode 100644 Hypercube.Client/Resources/Caching/AudioSourceResource.cs create mode 100644 Hypercube.Client/Resources/Caching/ShaderSourceResource.cs diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs b/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs index bd1998e..8b4a44c 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs @@ -27,7 +27,7 @@ private void InitOpenGL() GLFW.SwapInterval(SwapInterval); _loggerOpenGL.EngineInfo($"Swap interval: {SwapInterval}"); - GL.DebugMessageCallback(DebugMessageCallback, IntPtr.Zero); + //GL.DebugMessageCallback(DebugMessageCallback, IntPtr.Zero); GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.DebugOutput); diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs index 07050d1..821d561 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs @@ -33,7 +33,7 @@ public sealed partial class Renderer private void OnLoad() { - _baseShader = new Shader("/base", _resourceManager); + _baseShader = _cacheManager.GetResource("/Shaders/base").Shader; _baseTexture = _cacheManager.GetResource("/Textures/icon.png").Texture; _baseTexture.Bind(HTexTarget.Texture2D); diff --git a/Hypercube.Client/Graphics/Shading/IShader.cs b/Hypercube.Client/Graphics/Shading/IShader.cs index 50e5533..c655d6e 100644 --- a/Hypercube.Client/Graphics/Shading/IShader.cs +++ b/Hypercube.Client/Graphics/Shading/IShader.cs @@ -2,7 +2,7 @@ namespace Hypercube.Client.Graphics.Shading; -public interface IShader +public interface IShader : IDisposable { void Use(); void Stop(); diff --git a/Hypercube.Client/Graphics/Shading/Shader.cs b/Hypercube.Client/Graphics/Shading/Shader.cs index 65bf371..b3bff85 100644 --- a/Hypercube.Client/Graphics/Shading/Shader.cs +++ b/Hypercube.Client/Graphics/Shading/Shader.cs @@ -141,4 +141,8 @@ private static void LinkProgram(int program) } //private readonly record struct AttributeInfo + public void Dispose() + { + GL.DeleteProgram(_handle); + } } \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/AudioSourceResource.cs b/Hypercube.Client/Resources/Caching/AudioSourceResource.cs new file mode 100644 index 0000000..af9b5cd --- /dev/null +++ b/Hypercube.Client/Resources/Caching/AudioSourceResource.cs @@ -0,0 +1,23 @@ +using Hypercube.Client.Audio; +using Hypercube.Shared.Dependency; +using Hypercube.Shared.Resources; +using Hypercube.Shared.Resources.Caching.Resource; + +namespace Hypercube.Client.Resources.Caching; + +public class AudioSourceResource : BaseResource, IDisposable +{ + public ResourcePath Path; + public IAudioSource Stream; + + public override void Load(ResourcePath path, DependenciesContainer container) + { + var audioMan = container.Resolve(); + Stream = audioMan.CreateSource(path, new AudioSettings()); + } + + public void Dispose() + { + Stream.Dispose(); + } +} \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs b/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs index 45aa937..c3d0289 100644 --- a/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs +++ b/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs @@ -9,12 +9,13 @@ public partial class CacheManager public void PreloadTextures() { var logger = LoggingManager.GetLogger("cache.preload"); - - PreloadTextures(logger); + var container = DependencyManager.GetContainer(); + PreloadTextures(logger, container); + PreloadShaders(logger, container); + PreloadAudio(logger, container); } - private void PreloadTextures(Logger logger) + private void PreloadTextures(Logger logger, DependenciesContainer container) { - var container = DependencyManager.GetContainer(); logger.EngineInfo("Preloading textures..."); var st = Stopwatch.StartNew(); @@ -22,14 +23,62 @@ private void PreloadTextures(Logger logger) var files = _resourceManager.FindContentFiles("/Textures/") .Where(p => !texDict.ContainsKey(p) && p.Extension == ".png") - .Select(p => new TextureResource() { Path = p}); + .Select(p => new TextureResource { Path = p}); - + // TODO: Find a way of making Parallel.ForEach, currently it causes AccessViolation ex + var count = 0; foreach (var file in files) { file.Load(file.Path, container); - texDict[file.Path] = file; + count++; + } + st.Stop(); + _logger.EngineInfo($"Preloaded {count} textures in {st.Elapsed}"); + } + + private void PreloadShaders(Logger logger, DependenciesContainer container) + { + logger.EngineInfo("Preloading shaders..."); + var st = Stopwatch.StartNew(); + + var shDict = GetTypeDict(); + + var files = _resourceManager.FindContentFiles("/Shaders/") + .Where(p => !shDict.ContainsKey(p) && p.Extension == ".vert") + .Select(p => new ShaderSourceResource { Base = $"{p.ParentDirectory}/{p.Filename}", VertexPath = $"{p.ParentDirectory}/{p.Filename}.vert", FragmentPath = $"{p.ParentDirectory}/{p.Filename}.frag"}); + + var count = 0; + // TODO: Find a way of making Parallel.ForEach, currently it causes AccessViolation ex + foreach (var file in files) + { + file.Load(file.Base, container); + shDict[file.Base] = file; + count++; + } + st.Stop(); + _logger.EngineInfo($"Preloaded {count} shaders in {st.Elapsed}"); + } + + private void PreloadAudio(Logger logger, DependenciesContainer container) + { + logger.EngineInfo("Preloading shaders..."); + var st = Stopwatch.StartNew(); + + var aDict = GetTypeDict(); + + var files = _resourceManager.FindContentFiles("/Audio/") + .Where(p => !aDict.ContainsKey(p) && p.Extension == ".wav" || p.Extension == ".ogg") + .Select(p => new AudioSourceResource() {Path = p}); + + var count = 0; + foreach (var file in files) + { + file.Load(file.Path, container); + aDict[file.Path] = file; + count++; } + st.Stop(); + _logger.EngineInfo($"Preloaded {count} audio files in {st.Elapsed}"); } } \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/ShaderSourceResource.cs b/Hypercube.Client/Resources/Caching/ShaderSourceResource.cs new file mode 100644 index 0000000..dd67b5f --- /dev/null +++ b/Hypercube.Client/Resources/Caching/ShaderSourceResource.cs @@ -0,0 +1,25 @@ +using Hypercube.Client.Graphics.Shading; +using Hypercube.Shared.Dependency; +using Hypercube.Shared.Resources; +using Hypercube.Shared.Resources.Caching.Resource; +using Hypercube.Shared.Resources.Manager; + +namespace Hypercube.Client.Resources.Caching; + +public class ShaderSourceResource : BaseResource, IDisposable +{ + public IShader Shader; + public string Base; + public ResourcePath VertexPath; + public ResourcePath FragmentPath; + + public override void Load(ResourcePath path, DependenciesContainer container) + { + Shader = new Shader(path, container.Resolve()); + } + + public void Dispose() + { + Shader.Dispose(); + } +} \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/TextureResource.cs b/Hypercube.Client/Resources/Caching/TextureResource.cs index 4a5f1da..03d2d9a 100644 --- a/Hypercube.Client/Resources/Caching/TextureResource.cs +++ b/Hypercube.Client/Resources/Caching/TextureResource.cs @@ -7,7 +7,7 @@ namespace Hypercube.Client.Resources.Caching; -public class TextureResource : BaseResource +public class TextureResource : BaseResource, IDisposable { public ITextureHandle Texture; public ResourcePath Path; @@ -19,8 +19,8 @@ public override void Load(ResourcePath path, DependenciesContainer container) Texture = handle; } - public override void Dispose() + public void Dispose() { - base.Dispose(); + Texture.Dispose(); } } \ No newline at end of file diff --git a/Hypercube.Example/Example.cs b/Hypercube.Example/Example.cs index a9f7eb1..7ab959a 100644 --- a/Hypercube.Example/Example.cs +++ b/Hypercube.Example/Example.cs @@ -1,11 +1,13 @@ using Hypercube.Client.Audio; using Hypercube.Client.Entities.Systems.Sprite; +using Hypercube.Client.Resources.Caching; using Hypercube.Shared.Dependency; using Hypercube.Shared.Entities.Realisation.Manager; using Hypercube.Shared.Entities.Systems.Transform.Coordinates; using Hypercube.Shared.EventBus; using Hypercube.Shared.Math.Vector; using Hypercube.Shared.Resources; +using Hypercube.Shared.Resources.Caching; using Hypercube.Shared.Runtimes.Event; using Hypercube.Shared.Scenes; @@ -13,7 +15,7 @@ namespace Hypercube.Example; public sealed class Example : IEventSubscriber, IPostInject { - [Dependency] private readonly IAudioManager _audioManager = default!; + [Dependency] private readonly ICacheManager _cacheManager = default!; [Dependency] private readonly IEventBus _eventBus = default!; [Dependency] private readonly IEntitiesManager _entitiesManager = default!; [Dependency] private readonly IEntitiesComponentManager _entitiesComponentManager = default!; @@ -32,7 +34,7 @@ public void PostInject() private void Startup(ref RuntimeStartupEvent args) { - for (var i = 0; i < 1000; i++) + for (var i = 0; i < 100; i++) { var x = _random.NextSingle() * 800 - 400; var y = _random.NextSingle() * 800 - 400; @@ -41,8 +43,12 @@ private void Startup(ref RuntimeStartupEvent args) CreateEntity(coord); } - var source = _audioManager.CreateSource("/game_boi_3.wav", new AudioSettings()); + var source = _cacheManager.GetResource("/game_boi_3.wav").Stream; + // it's too loud :D + source.Gain = 0.3f; source.Start(); + // var source = _audioManager.CreateSource("/game_boi_3.wav", new AudioSettings()); + // source.Start(); } private void CreateEntity(SceneCoordinates coordinates) diff --git a/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs b/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs index 5f69fa3..6cb6849 100644 --- a/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs +++ b/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs @@ -2,7 +2,7 @@ namespace Hypercube.Shared.Resources.Caching.Resource; -public abstract class BaseResource : IDisposable +public abstract class BaseResource { public abstract void Load(ResourcePath path, DependenciesContainer container); @@ -12,8 +12,4 @@ public virtual void Reload(ResourcePath path, DependenciesContainer container) } public ResourcePath? FallbackPath { get; } - - public virtual void Dispose() - { - } } \ No newline at end of file From 65168e7c6408f2e19bf08a92d2b290c3ca08c5a0 Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 06:43:35 +0500 Subject: [PATCH 04/10] review --- Hypercube.Client/Dependencies.cs | 2 +- .../Entities/Systems/Sprite/SpriteSystem.cs | 4 +- .../Graphics/Drawing/RenderDrawing.cs | 4 +- .../Graphics/Rendering/Renderer.Render.cs | 4 +- .../Graphics/Rendering/Renderer.cs | 4 +- .../Resources/Caching/AudioSourceResource.cs | 2 +- ...r.Preload.cs => ResourceCacher.Preload.cs} | 24 ++++++------ .../{CacheManager.cs => ResourceCacher.cs} | 39 +++++-------------- .../Resources/Caching/ShaderSourceResource.cs | 2 +- .../Resources/Caching/TextureResource.cs | 2 +- Hypercube.Example/Example.cs | 4 +- .../{ICacheManager.cs => IResourceCacher.cs} | 8 ++-- .../Resource/{BaseResource.cs => Resource.cs} | 7 ++-- 13 files changed, 44 insertions(+), 62 deletions(-) rename Hypercube.Client/Resources/Caching/{CacheManager.Preload.cs => ResourceCacher.Preload.cs} (79%) rename Hypercube.Client/Resources/Caching/{CacheManager.cs => ResourceCacher.cs} (69%) rename Hypercube.Shared/Resources/Caching/{ICacheManager.cs => IResourceCacher.cs} (70%) rename Hypercube.Shared/Resources/Caching/Resource/{BaseResource.cs => Resource.cs} (88%) diff --git a/Hypercube.Client/Dependencies.cs b/Hypercube.Client/Dependencies.cs index 99728e9..9d4aa35 100644 --- a/Hypercube.Client/Dependencies.cs +++ b/Hypercube.Client/Dependencies.cs @@ -49,7 +49,7 @@ public static void Register(DependenciesContainer rootContainer) rootContainer.Register(); // Caching - rootContainer.Register(); + rootContainer.Register(); // Camera rootContainer.Register(); diff --git a/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs b/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs index 3a23661..36fc2c1 100644 --- a/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs +++ b/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs @@ -15,7 +15,7 @@ namespace Hypercube.Client.Entities.Systems.Sprite; public sealed class SpriteSystem : EntitySystem { [Dependency] private readonly IRenderDrawing _drawing = default!; - [Dependency] private readonly ICacheManager _cacheManager = default!; + [Dependency] private readonly IResourceCacher _resourceCacher = default!; public override void Initialize() { @@ -38,7 +38,7 @@ public void Render(Entity entity, Transform2 transform) { if (entity.Component.TextureHandle == null) entity.Component.TextureHandle = - _cacheManager.GetResource(entity.Component.TexturePath).Texture ?? throw new NullReferenceException(); + _resourceCacher.GetResource(entity.Component.TexturePath).Texture ?? throw new NullReferenceException(); _drawing.DrawTexture(entity.Component.TextureHandle, Vector2.Zero, entity.Component.Color, transform.Matrix * entity.Component.Transform.Matrix); } diff --git a/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs b/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs index 15326cf..a3dad51 100644 --- a/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs +++ b/Hypercube.Client/Graphics/Drawing/RenderDrawing.cs @@ -14,7 +14,7 @@ namespace Hypercube.Client.Graphics.Drawing; public sealed class RenderDrawing : IRenderDrawing { [Dependency] private readonly IRenderer _renderer = default!; - [Dependency] private readonly ICacheManager _cacheManager = default!; + [Dependency] private readonly IResourceCacher _resourceCacher = default!; public void DrawTexture(ITexture texture, Vector2 position) { @@ -38,7 +38,7 @@ public void DrawTexture(ITexture texture, Box2 quad, Box2 uv) public void DrawTexture(ITexture texture, Box2 quad, Box2 uv, Color color) { - var handle = _cacheManager.GetResource(texture.Path).Texture; + var handle = _resourceCacher.GetResource(texture.Path).Texture; _renderer.DrawTexture(handle, quad, uv, color); } diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs index 821d561..b864141 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs @@ -33,8 +33,8 @@ public sealed partial class Renderer private void OnLoad() { - _baseShader = _cacheManager.GetResource("/Shaders/base").Shader; - _baseTexture = _cacheManager.GetResource("/Textures/icon.png").Texture; + _baseShader = _resourceCacher.GetResource("/Shaders/base").Shader; + _baseTexture = _resourceCacher.GetResource("/Textures/icon.png").Texture; _baseTexture.Bind(HTexTarget.Texture2D); _cameraManager.SetMainCamera(_cameraManager.CreateCamera2D(MainWindow.Size)); diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.cs b/Hypercube.Client/Graphics/Rendering/Renderer.cs index 590e274..8e7e952 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.cs @@ -27,7 +27,7 @@ public sealed partial class Renderer : IRenderer, IPostInject, IEventSubscriber [Dependency] private readonly ITiming _timing = default!; [Dependency] private readonly ICameraManager _cameraManager = default!; [Dependency] private readonly IResourceManager _resourceManager = default!; - [Dependency] private readonly ICacheManager _cacheManager = default!; + [Dependency] private readonly IResourceCacher _resourceCacher = default!; private readonly ILogger _logger = LoggingManager.GetLogger("renderer"); private readonly ILogger _loggerOpenGL = LoggingManager.GetLogger("open_gl")!; @@ -106,7 +106,7 @@ private void OnStartup(ref RuntimeStartupEvent args) InitOpenGL(); - _cacheManager.PreloadTextures(); + _resourceCacher.PreloadTextures(); OnLoad(); } diff --git a/Hypercube.Client/Resources/Caching/AudioSourceResource.cs b/Hypercube.Client/Resources/Caching/AudioSourceResource.cs index af9b5cd..76201ea 100644 --- a/Hypercube.Client/Resources/Caching/AudioSourceResource.cs +++ b/Hypercube.Client/Resources/Caching/AudioSourceResource.cs @@ -5,7 +5,7 @@ namespace Hypercube.Client.Resources.Caching; -public class AudioSourceResource : BaseResource, IDisposable +public sealed class AudioSourceResource : Resource, IDisposable { public ResourcePath Path; public IAudioSource Stream; diff --git a/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs b/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs similarity index 79% rename from Hypercube.Client/Resources/Caching/CacheManager.Preload.cs rename to Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs index c3d0289..057effb 100644 --- a/Hypercube.Client/Resources/Caching/CacheManager.Preload.cs +++ b/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs @@ -4,19 +4,21 @@ namespace Hypercube.Client.Resources.Caching; -public partial class CacheManager +public partial class ResourceCacher { + private readonly Logger _loggerPreload = LoggingManager.GetLogger("cache.preload"); + public void PreloadTextures() { - var logger = LoggingManager.GetLogger("cache.preload"); var container = DependencyManager.GetContainer(); - PreloadTextures(logger, container); - PreloadShaders(logger, container); - PreloadAudio(logger, container); + PreloadTextures(container); + PreloadShaders(container); + PreloadAudio(container); } - private void PreloadTextures(Logger logger, DependenciesContainer container) + + private void PreloadTextures(DependenciesContainer container) { - logger.EngineInfo("Preloading textures..."); + _loggerPreload.EngineInfo("Preloading textures..."); var st = Stopwatch.StartNew(); var texDict = GetTypeDict(); @@ -37,9 +39,9 @@ private void PreloadTextures(Logger logger, DependenciesContainer container) _logger.EngineInfo($"Preloaded {count} textures in {st.Elapsed}"); } - private void PreloadShaders(Logger logger, DependenciesContainer container) + private void PreloadShaders(DependenciesContainer container) { - logger.EngineInfo("Preloading shaders..."); + _loggerPreload.EngineInfo("Preloading shaders..."); var st = Stopwatch.StartNew(); var shDict = GetTypeDict(); @@ -60,9 +62,9 @@ private void PreloadShaders(Logger logger, DependenciesContainer container) _logger.EngineInfo($"Preloaded {count} shaders in {st.Elapsed}"); } - private void PreloadAudio(Logger logger, DependenciesContainer container) + private void PreloadAudio(DependenciesContainer container) { - logger.EngineInfo("Preloading shaders..."); + _loggerPreload.EngineInfo("Preloading shaders..."); var st = Stopwatch.StartNew(); var aDict = GetTypeDict(); diff --git a/Hypercube.Client/Resources/Caching/CacheManager.cs b/Hypercube.Client/Resources/Caching/ResourceCacher.cs similarity index 69% rename from Hypercube.Client/Resources/Caching/CacheManager.cs rename to Hypercube.Client/Resources/Caching/ResourceCacher.cs index 9368d8a..15cc32b 100644 --- a/Hypercube.Client/Resources/Caching/CacheManager.cs +++ b/Hypercube.Client/Resources/Caching/ResourceCacher.cs @@ -8,25 +8,17 @@ namespace Hypercube.Client.Resources.Caching; -public partial class CacheManager : ICacheManager +public partial class ResourceCacher : IResourceCacher { [Dependency] private readonly IResourceManager _resourceManager = default!; - private Dictionary> _cachedResources = - new Dictionary>(); + private Dictionary> _cachedResources = new(); - private DependenciesContainer _container = default!; + private DependenciesContainer _container = DependencyManager.GetContainer(); private readonly Logger _logger = LoggingManager.GetLogger("cache"); - #region PublicAPI - - public CacheManager() - { - _container = DependencyManager.GetContainer(); - } - - public T GetResource(ResourcePath path, bool useFallback = true) where T : BaseResource, new() + public T GetResource(ResourcePath path, bool useFallback = true) where T : Resource, new() { var typeDict = GetTypeDict(); @@ -46,12 +38,12 @@ public CacheManager() if (useFallback && cache.FallbackPath is not null) return GetResource(cache.FallbackPath.Value, false); - _logger.Error($"Exception while loading resource {ex.Message}, Stack Trace: {ex.StackTrace}"); + _logger.Fatal($"Exception while loading resource {ex.Message}, Stack Trace: {ex.StackTrace}"); throw; } } - public bool TryGetResource(ResourcePath path, [NotNullWhen(true)] out T? resource) where T : BaseResource, new() + public bool TryGetResource(ResourcePath path, [NotNullWhen(true)] out T? resource) where T : Resource, new() { var cont = DependencyManager.GetContainer(); var cache = GetTypeDict(); @@ -77,35 +69,24 @@ public CacheManager() } catch (Exception ex) { - _logger.Error($"Exception while loading resource: {ex.Message}, Stack Trace: {ex.StackTrace}"); + _logger.Fatal($"Exception while loading resource: {ex.Message}, Stack Trace: {ex.StackTrace}"); throw; } } - public void CacheResource(ResourcePath path, T resource) where T : BaseResource, new() + public void CacheResource(ResourcePath path, T resource) where T : Resource, new() { GetTypeDict()[path] = resource; } - public T GetFallback() where T : BaseResource, new() - { - throw new NotImplementedException(); - } - - #endregion - - #region Private - - private Dictionary GetTypeDict() + private Dictionary GetTypeDict() { if (_cachedResources.TryGetValue(typeof(T), out var dict)) return dict; - dict = new Dictionary(); + dict = new Dictionary(); _cachedResources[typeof(T)] = dict; return dict; } - - #endregion } \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/ShaderSourceResource.cs b/Hypercube.Client/Resources/Caching/ShaderSourceResource.cs index dd67b5f..c3e4969 100644 --- a/Hypercube.Client/Resources/Caching/ShaderSourceResource.cs +++ b/Hypercube.Client/Resources/Caching/ShaderSourceResource.cs @@ -6,7 +6,7 @@ namespace Hypercube.Client.Resources.Caching; -public class ShaderSourceResource : BaseResource, IDisposable +public sealed class ShaderSourceResource : Resource, IDisposable { public IShader Shader; public string Base; diff --git a/Hypercube.Client/Resources/Caching/TextureResource.cs b/Hypercube.Client/Resources/Caching/TextureResource.cs index 03d2d9a..6e69756 100644 --- a/Hypercube.Client/Resources/Caching/TextureResource.cs +++ b/Hypercube.Client/Resources/Caching/TextureResource.cs @@ -7,7 +7,7 @@ namespace Hypercube.Client.Resources.Caching; -public class TextureResource : BaseResource, IDisposable +public sealed class TextureResource : Resource, IDisposable { public ITextureHandle Texture; public ResourcePath Path; diff --git a/Hypercube.Example/Example.cs b/Hypercube.Example/Example.cs index 7ab959a..dd80bed 100644 --- a/Hypercube.Example/Example.cs +++ b/Hypercube.Example/Example.cs @@ -15,7 +15,7 @@ namespace Hypercube.Example; public sealed class Example : IEventSubscriber, IPostInject { - [Dependency] private readonly ICacheManager _cacheManager = default!; + [Dependency] private readonly IResourceCacher _resourceCacher = default!; [Dependency] private readonly IEventBus _eventBus = default!; [Dependency] private readonly IEntitiesManager _entitiesManager = default!; [Dependency] private readonly IEntitiesComponentManager _entitiesComponentManager = default!; @@ -43,7 +43,7 @@ private void Startup(ref RuntimeStartupEvent args) CreateEntity(coord); } - var source = _cacheManager.GetResource("/game_boi_3.wav").Stream; + var source = _resourceCacher.GetResource("/game_boi_3.wav").Stream; // it's too loud :D source.Gain = 0.3f; source.Start(); diff --git a/Hypercube.Shared/Resources/Caching/ICacheManager.cs b/Hypercube.Shared/Resources/Caching/IResourceCacher.cs similarity index 70% rename from Hypercube.Shared/Resources/Caching/ICacheManager.cs rename to Hypercube.Shared/Resources/Caching/IResourceCacher.cs index 6148d76..f3eb18f 100644 --- a/Hypercube.Shared/Resources/Caching/ICacheManager.cs +++ b/Hypercube.Shared/Resources/Caching/IResourceCacher.cs @@ -3,15 +3,15 @@ namespace Hypercube.Shared.Resources.Caching; -public interface ICacheManager +public interface IResourceCacher { - T GetResource(ResourcePath path, bool useFallback = true) where T : BaseResource, new(); + T GetResource(ResourcePath path, bool useFallback = true) where T : Resource.Resource, new(); bool TryGetResource(ResourcePath path, [NotNullWhen(true)] out T? resource) - where T : BaseResource, new(); + where T : Resource.Resource, new(); void CacheResource(ResourcePath path, T resource) - where T : BaseResource, new(); + where T : Resource.Resource, new(); void PreloadTextures(); } \ No newline at end of file diff --git a/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs b/Hypercube.Shared/Resources/Caching/Resource/Resource.cs similarity index 88% rename from Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs rename to Hypercube.Shared/Resources/Caching/Resource/Resource.cs index 6cb6849..124a70c 100644 --- a/Hypercube.Shared/Resources/Caching/Resource/BaseResource.cs +++ b/Hypercube.Shared/Resources/Caching/Resource/Resource.cs @@ -2,14 +2,13 @@ namespace Hypercube.Shared.Resources.Caching.Resource; -public abstract class BaseResource +public abstract class Resource { + public ResourcePath? FallbackPath { get; } + public abstract void Load(ResourcePath path, DependenciesContainer container); public virtual void Reload(ResourcePath path, DependenciesContainer container) { - } - - public ResourcePath? FallbackPath { get; } } \ No newline at end of file From 8616984198c5d5f318ea9b1938904006097ea2af Mon Sep 17 00:00:00 2001 From: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Date: Sun, 14 Jul 2024 11:44:20 +1000 Subject: [PATCH 05/10] Fixed DebugMessageCallback collection --- .../Graphics/Rendering/Renderer.OpenGL.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs b/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs index 8b4a44c..930fd0f 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs @@ -9,6 +9,12 @@ public sealed partial class Renderer { private const int SwapInterval = 1; + /// + /// This is where we store the callback + /// because otherwise GC will collect it. + /// + private DebugProc? _debugProc; + private void InitOpenGL() { GL.LoadBindings(_bindingsContext); @@ -26,8 +32,9 @@ private void InitOpenGL() GLFW.SwapInterval(SwapInterval); _loggerOpenGL.EngineInfo($"Swap interval: {SwapInterval}"); - - //GL.DebugMessageCallback(DebugMessageCallback, IntPtr.Zero); + + _debugProc = DebugMessageCallback; + GL.DebugMessageCallback(_debugProc, IntPtr.Zero); GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.DebugOutput); From 30cdeeec5d9eae594e96c0e7190cb5b044394330 Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 06:59:04 +0500 Subject: [PATCH 06/10] use ??= --- Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs b/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs index 36fc2c1..64bf90e 100644 --- a/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs +++ b/Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs @@ -36,10 +36,8 @@ private void OnRenderDrawing(ref RenderDrawingEvent ev) public void Render(Entity entity, Transform2 transform) { - if (entity.Component.TextureHandle == null) - entity.Component.TextureHandle = - _resourceCacher.GetResource(entity.Component.TexturePath).Texture ?? throw new NullReferenceException(); - + entity.Component.TextureHandle ??= + _resourceCacher.GetResource(entity.Component.TexturePath).Texture; _drawing.DrawTexture(entity.Component.TextureHandle, Vector2.Zero, entity.Component.Color, transform.Matrix * entity.Component.Transform.Matrix); } } \ No newline at end of file From f90493cc0b0569f70826e059694a66a3f4dbd7bf Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 07:04:59 +0500 Subject: [PATCH 07/10] fix tornado asked --- Hypercube.Client/Graphics/Rendering/Renderer.cs | 2 ++ .../Graphics/Texturing/TextureManager.cs | 9 --------- .../Resources/Caching/ResourceCacher.Preload.cs | 13 +++++++++---- .../Resources/Caching/IResourceCacher.cs | 2 ++ 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.cs b/Hypercube.Client/Graphics/Rendering/Renderer.cs index 8e7e952..949f829 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.cs @@ -107,6 +107,8 @@ private void OnStartup(ref RuntimeStartupEvent args) InitOpenGL(); _resourceCacher.PreloadTextures(); + _resourceCacher.PreloadShaders(); + _resourceCacher.PreloadAudio(); OnLoad(); } diff --git a/Hypercube.Client/Graphics/Texturing/TextureManager.cs b/Hypercube.Client/Graphics/Texturing/TextureManager.cs index 32e966a..e947959 100644 --- a/Hypercube.Client/Graphics/Texturing/TextureManager.cs +++ b/Hypercube.Client/Graphics/Texturing/TextureManager.cs @@ -22,9 +22,6 @@ public TextureManager() StbImage.stbi_set_flip_vertically_on_load(1); } - - #region PublicAPI - public ITextureHandle GetTextureHandle(ResourcePath path, ITextureCreationSettings settings) { return GetTextureHandleInternal(path, settings); @@ -50,10 +47,6 @@ public ITextureHandle GetTextureHandle(ITexture texture, ITextureCreationSetting return GetTextureHandleInternal(texture.Path, settings); } - #endregion - - #region Internal - internal ITexture GetTextureInternal(ResourcePath path) { var texture = CreateTexture(path); @@ -87,6 +80,4 @@ internal ITextureHandle CreateTextureHandle(ITexture texture, ITextureCreationSe { return new TextureHandle(texture, settings); } - - #endregion } \ No newline at end of file diff --git a/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs b/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs index 057effb..c264105 100644 --- a/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs +++ b/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs @@ -10,10 +10,15 @@ public partial class ResourceCacher public void PreloadTextures() { - var container = DependencyManager.GetContainer(); - PreloadTextures(container); - PreloadShaders(container); - PreloadAudio(container); + PreloadTextures(_container); + } + public void PreloadShaders() + { + PreloadShaders(_container); + } + public void PreloadAudio() + { + PreloadAudio(_container); } private void PreloadTextures(DependenciesContainer container) diff --git a/Hypercube.Shared/Resources/Caching/IResourceCacher.cs b/Hypercube.Shared/Resources/Caching/IResourceCacher.cs index f3eb18f..bdb2f76 100644 --- a/Hypercube.Shared/Resources/Caching/IResourceCacher.cs +++ b/Hypercube.Shared/Resources/Caching/IResourceCacher.cs @@ -14,4 +14,6 @@ void CacheResource(ResourcePath path, T resource) where T : Resource.Resource, new(); void PreloadTextures(); + void PreloadShaders(); + void PreloadAudio(); } \ No newline at end of file From 60451e9f3b265a8d72d687ccce7b1ca1898c8fd9 Mon Sep 17 00:00:00 2001 From: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Date: Sun, 14 Jul 2024 12:30:37 +1000 Subject: [PATCH 08/10] Rewrited PreloadTextures realisation --- .../Event/AudioLibraryInitializedEvent.cs | 5 +++++ .../OpenAL/ContextExtension.cs | 2 +- .../OpenAL/OpenALAudioManager.cs | 6 +++++- Hypercube.Client/Dependencies.cs | 2 +- .../Event/GraphicsLibraryInitializedEvent.cs | 5 +++++ .../Graphics/Rendering/Renderer.OpenGL.cs | 2 ++ .../Graphics/Rendering/Renderer.cs | 8 -------- .../Texture2DCreationSettings.cs | 4 ++-- .../Caching/ResourceCacher.Preload.cs | 18 +++++++++--------- .../Resources/Caching/ResourceCacher.cs | 18 +++++++++++++----- .../Resources/Caching/IResourceCacher.cs | 5 ----- 11 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 Hypercube.Client/Audio/Event/AudioLibraryInitializedEvent.cs rename Hypercube.Client/Audio/{Realisations => Realisation}/OpenAL/ContextExtension.cs (68%) rename Hypercube.Client/Audio/{Realisations => Realisation}/OpenAL/OpenALAudioManager.cs (97%) create mode 100644 Hypercube.Client/Graphics/Event/GraphicsLibraryInitializedEvent.cs diff --git a/Hypercube.Client/Audio/Event/AudioLibraryInitializedEvent.cs b/Hypercube.Client/Audio/Event/AudioLibraryInitializedEvent.cs new file mode 100644 index 0000000..10c5ca4 --- /dev/null +++ b/Hypercube.Client/Audio/Event/AudioLibraryInitializedEvent.cs @@ -0,0 +1,5 @@ +using Hypercube.Shared.EventBus.Events; + +namespace Hypercube.Client.Audio.Event; + +public readonly record struct AudioLibraryInitializedEvent : IEventArgs; \ No newline at end of file diff --git a/Hypercube.Client/Audio/Realisations/OpenAL/ContextExtension.cs b/Hypercube.Client/Audio/Realisation/OpenAL/ContextExtension.cs similarity index 68% rename from Hypercube.Client/Audio/Realisations/OpenAL/ContextExtension.cs rename to Hypercube.Client/Audio/Realisation/OpenAL/ContextExtension.cs index 5648e79..d88daa3 100644 --- a/Hypercube.Client/Audio/Realisations/OpenAL/ContextExtension.cs +++ b/Hypercube.Client/Audio/Realisation/OpenAL/ContextExtension.cs @@ -1,4 +1,4 @@ -namespace Hypercube.Client.Audio.Realisations.OpenAL; +namespace Hypercube.Client.Audio.Realisation.OpenAL; public static class ContextExtension { diff --git a/Hypercube.Client/Audio/Realisations/OpenAL/OpenALAudioManager.cs b/Hypercube.Client/Audio/Realisation/OpenAL/OpenALAudioManager.cs similarity index 97% rename from Hypercube.Client/Audio/Realisations/OpenAL/OpenALAudioManager.cs rename to Hypercube.Client/Audio/Realisation/OpenAL/OpenALAudioManager.cs index 399b8b2..6b592c3 100644 --- a/Hypercube.Client/Audio/Realisations/OpenAL/OpenALAudioManager.cs +++ b/Hypercube.Client/Audio/Realisation/OpenAL/OpenALAudioManager.cs @@ -1,4 +1,5 @@ using System.Collections.Frozen; +using Hypercube.Client.Audio.Event; using Hypercube.Client.Audio.Loading; using Hypercube.Client.Utilities.Helpers; using Hypercube.Shared.Dependency; @@ -9,7 +10,7 @@ using Hypercube.Shared.Runtimes.Event; using OpenTK.Audio.OpenAL; -namespace Hypercube.Client.Audio.Realisations.OpenAL; +namespace Hypercube.Client.Audio.Realisation.OpenAL; /// /// For some reason, on my Windows 11 machine there is no openal32.dll @@ -57,6 +58,9 @@ public void Initialize() return; CreateContext(); + + _logger.EngineInfo("Initialized"); + _eventBus.Raise(new AudioLibraryInitializedEvent()); } private AudioStream CreateAudio(ResourcePath path, AudioSettings settings) diff --git a/Hypercube.Client/Dependencies.cs b/Hypercube.Client/Dependencies.cs index 9d4aa35..f7b81fd 100644 --- a/Hypercube.Client/Dependencies.cs +++ b/Hypercube.Client/Dependencies.cs @@ -1,6 +1,6 @@ using Hypercube.Client.Audio; using Hypercube.Client.Audio.Loading; -using Hypercube.Client.Audio.Realisations.OpenAL; +using Hypercube.Client.Audio.Realisation.OpenAL; using Hypercube.Client.Graphics.Drawing; using Hypercube.Client.Graphics.Rendering; using Hypercube.Client.Graphics.Texturing; diff --git a/Hypercube.Client/Graphics/Event/GraphicsLibraryInitializedEvent.cs b/Hypercube.Client/Graphics/Event/GraphicsLibraryInitializedEvent.cs new file mode 100644 index 0000000..5444069 --- /dev/null +++ b/Hypercube.Client/Graphics/Event/GraphicsLibraryInitializedEvent.cs @@ -0,0 +1,5 @@ +using Hypercube.Shared.EventBus.Events; + +namespace Hypercube.Client.Graphics.Event; + +public readonly record struct GraphicsLibraryInitializedEvent : IEventArgs; \ No newline at end of file diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs b/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs index 930fd0f..0ded645 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs @@ -1,4 +1,5 @@ using System.Runtime.InteropServices; +using Hypercube.Client.Graphics.Event; using Hypercube.Shared.Logging; using OpenTK.Windowing.GraphicsLibraryFramework; using OpenToolkit.Graphics.OpenGL4; @@ -43,6 +44,7 @@ private void InitOpenGL() GL.ClearColor(0, 0, 0, 0); _loggerOpenGL.EngineInfo("Initialized"); + _eventBus.Raise(new GraphicsLibraryInitializedEvent()); } private void DebugMessageCallback(DebugSource source, DebugType type, int id, DebugSeverity severity, int length, IntPtr messagePointer, IntPtr userparam) diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.cs b/Hypercube.Client/Graphics/Rendering/Renderer.cs index 949f829..e1e641e 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.cs @@ -1,13 +1,11 @@ using System.Collections.Frozen; using Hypercube.Client.Graphics.OpenGL; using Hypercube.Client.Graphics.Texturing; -using Hypercube.Client.Graphics.Texturing.Events; using Hypercube.Client.Graphics.Viewports; using Hypercube.Client.Graphics.Windows; using Hypercube.Client.Graphics.Windows.Manager; using Hypercube.Shared.Dependency; using Hypercube.Shared.EventBus; -using Hypercube.Shared.EventBus.Events; using Hypercube.Shared.Logging; using Hypercube.Shared.Resources.Caching; using Hypercube.Shared.Resources.Manager; @@ -103,13 +101,7 @@ private void OnStartup(ref RuntimeStartupEvent args) var windowIcons = _windowManager.LoadWindowIcons(_textureManager, _resourceManager, "/Icons").ToList(); _windowManager.SetWindowIcons(MainWindow, windowIcons); - InitOpenGL(); - - _resourceCacher.PreloadTextures(); - _resourceCacher.PreloadShaders(); - _resourceCacher.PreloadAudio(); - OnLoad(); } diff --git a/Hypercube.Client/Graphics/Texturing/TextureSettings/Texture2DCreationSettings.cs b/Hypercube.Client/Graphics/Texturing/TextureSettings/Texture2DCreationSettings.cs index 984d7bc..d0677b5 100644 --- a/Hypercube.Client/Graphics/Texturing/TextureSettings/Texture2DCreationSettings.cs +++ b/Hypercube.Client/Graphics/Texturing/TextureSettings/Texture2DCreationSettings.cs @@ -36,8 +36,8 @@ public Texture2DCreationSettings() { new TextureParameter(TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat), new TextureParameter(TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat), - new TextureParameter(TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear), - new TextureParameter(TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear), + new TextureParameter(TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest), + new TextureParameter(TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest), }; PixelInternalFormat = PixelInternalFormat.Rgba; Level = 0; diff --git a/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs b/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs index c264105..b47e1d8 100644 --- a/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs +++ b/Hypercube.Client/Resources/Caching/ResourceCacher.Preload.cs @@ -1,4 +1,6 @@ using System.Diagnostics; +using Hypercube.Client.Audio.Event; +using Hypercube.Client.Graphics.Event; using Hypercube.Shared.Dependency; using Hypercube.Shared.Logging; @@ -7,20 +9,18 @@ namespace Hypercube.Client.Resources.Caching; public partial class ResourceCacher { private readonly Logger _loggerPreload = LoggingManager.GetLogger("cache.preload"); - - public void PreloadTextures() + + private void OnAudioLibraryInitialized(ref AudioLibraryInitializedEvent ev) { - PreloadTextures(_container); + PreloadAudio(_container); } - public void PreloadShaders() + + private void OnGraphicsLibraryInitialized(ref GraphicsLibraryInitializedEvent ev) { + PreloadTextures(_container); PreloadShaders(_container); } - public void PreloadAudio() - { - PreloadAudio(_container); - } - + private void PreloadTextures(DependenciesContainer container) { _loggerPreload.EngineInfo("Preloading textures..."); diff --git a/Hypercube.Client/Resources/Caching/ResourceCacher.cs b/Hypercube.Client/Resources/Caching/ResourceCacher.cs index 15cc32b..fed2466 100644 --- a/Hypercube.Client/Resources/Caching/ResourceCacher.cs +++ b/Hypercube.Client/Resources/Caching/ResourceCacher.cs @@ -1,5 +1,8 @@ using System.Diagnostics.CodeAnalysis; +using Hypercube.Client.Audio.Event; +using Hypercube.Client.Graphics.Event; using Hypercube.Shared.Dependency; +using Hypercube.Shared.EventBus; using Hypercube.Shared.Logging; using Hypercube.Shared.Resources; using Hypercube.Shared.Resources.Caching; @@ -8,16 +11,21 @@ namespace Hypercube.Client.Resources.Caching; -public partial class ResourceCacher : IResourceCacher +public partial class ResourceCacher : IResourceCacher, IEventSubscriber, IPostInject { + [Dependency] private readonly IEventBus _eventBus = default!; [Dependency] private readonly IResourceManager _resourceManager = default!; - private Dictionary> _cachedResources = new(); - - private DependenciesContainer _container = DependencyManager.GetContainer(); - + private readonly Dictionary> _cachedResources = new(); + private readonly DependenciesContainer _container = DependencyManager.GetContainer(); private readonly Logger _logger = LoggingManager.GetLogger("cache"); + public void PostInject() + { + _eventBus.Subscribe(this, OnAudioLibraryInitialized); + _eventBus.Subscribe(this, OnGraphicsLibraryInitialized); + } + public T GetResource(ResourcePath path, bool useFallback = true) where T : Resource, new() { var typeDict = GetTypeDict(); diff --git a/Hypercube.Shared/Resources/Caching/IResourceCacher.cs b/Hypercube.Shared/Resources/Caching/IResourceCacher.cs index bdb2f76..08deb21 100644 --- a/Hypercube.Shared/Resources/Caching/IResourceCacher.cs +++ b/Hypercube.Shared/Resources/Caching/IResourceCacher.cs @@ -1,5 +1,4 @@ using System.Diagnostics.CodeAnalysis; -using Hypercube.Shared.Resources.Caching.Resource; namespace Hypercube.Shared.Resources.Caching; @@ -12,8 +11,4 @@ bool TryGetResource(ResourcePath path, [NotNullWhen(true)] out T? resource) void CacheResource(ResourcePath path, T resource) where T : Resource.Resource, new(); - - void PreloadTextures(); - void PreloadShaders(); - void PreloadAudio(); } \ No newline at end of file From 416c24568879854b77a512740d6bd0188311bc33 Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 07:31:56 +0500 Subject: [PATCH 09/10] fix audio source caching --- .../Graphics/Rendering/Renderer.Render.cs | 2 -- .../Resources/Caching/AudioSourceResource.cs | 11 +++-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs index b864141..1fd2c69 100644 --- a/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs +++ b/Hypercube.Client/Graphics/Rendering/Renderer.Render.cs @@ -34,8 +34,6 @@ public sealed partial class Renderer private void OnLoad() { _baseShader = _resourceCacher.GetResource("/Shaders/base").Shader; - _baseTexture = _resourceCacher.GetResource("/Textures/icon.png").Texture; - _baseTexture.Bind(HTexTarget.Texture2D); _cameraManager.SetMainCamera(_cameraManager.CreateCamera2D(MainWindow.Size)); diff --git a/Hypercube.Client/Resources/Caching/AudioSourceResource.cs b/Hypercube.Client/Resources/Caching/AudioSourceResource.cs index 76201ea..997e7b9 100644 --- a/Hypercube.Client/Resources/Caching/AudioSourceResource.cs +++ b/Hypercube.Client/Resources/Caching/AudioSourceResource.cs @@ -5,19 +5,14 @@ namespace Hypercube.Client.Resources.Caching; -public sealed class AudioSourceResource : Resource, IDisposable +public sealed class AudioSourceResource : Resource { public ResourcePath Path; - public IAudioSource Stream; + public AudioStream Stream; public override void Load(ResourcePath path, DependenciesContainer container) { var audioMan = container.Resolve(); - Stream = audioMan.CreateSource(path, new AudioSettings()); - } - - public void Dispose() - { - Stream.Dispose(); + Stream = audioMan.GetAudio(path, new AudioSettings()); } } \ No newline at end of file From b5a3288b640217b7661fa97e3e5ea3b5d295b8a9 Mon Sep 17 00:00:00 2001 From: JerryImMouse Date: Sun, 14 Jul 2024 07:33:03 +0500 Subject: [PATCH 10/10] fix my shit --- Hypercube.Example/Example.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Hypercube.Example/Example.cs b/Hypercube.Example/Example.cs index dd80bed..2dea00d 100644 --- a/Hypercube.Example/Example.cs +++ b/Hypercube.Example/Example.cs @@ -15,6 +15,7 @@ namespace Hypercube.Example; public sealed class Example : IEventSubscriber, IPostInject { + [Dependency] private readonly IAudioManager _audioManager = default!; [Dependency] private readonly IResourceCacher _resourceCacher = default!; [Dependency] private readonly IEventBus _eventBus = default!; [Dependency] private readonly IEntitiesManager _entitiesManager = default!; @@ -43,9 +44,11 @@ private void Startup(ref RuntimeStartupEvent args) CreateEntity(coord); } - var source = _resourceCacher.GetResource("/game_boi_3.wav").Stream; + var stream = _resourceCacher.GetResource("/game_boi_3.wav").Stream; + var source = _audioManager.CreateSource(stream); + // it's too loud :D - source.Gain = 0.3f; + source.Gain = 0.1f; source.Start(); // var source = _audioManager.CreateSource("/game_boi_3.wav", new AudioSettings()); // source.Start();