Skip to content

Commit

Permalink
Merge pull request #23 from Tornado-Technology/caching-manager
Browse files Browse the repository at this point in the history
Cache manager
  • Loading branch information
JerryImMouse committed Jul 14, 2024
2 parents dec412f + b5a3288 commit 1d14185
Show file tree
Hide file tree
Showing 24 changed files with 363 additions and 177 deletions.
5 changes: 5 additions & 0 deletions Hypercube.Client/Audio/Event/AudioLibraryInitializedEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using Hypercube.Shared.EventBus.Events;

namespace Hypercube.Client.Audio.Event;

public readonly record struct AudioLibraryInitializedEvent : IEventArgs;
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Hypercube.Client.Audio.Realisations.OpenAL;
namespace Hypercube.Client.Audio.Realisation.OpenAL;

public static class ContextExtension
{
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;

/// <remarks>
/// For some reason, on my Windows 11 machine there is no <c>openal32.dll</c>
Expand Down Expand Up @@ -57,6 +58,9 @@ public void Initialize()
return;

CreateContext();

_logger.EngineInfo("Initialized");
_eventBus.Raise(new AudioLibraryInitializedEvent());
}

private AudioStream CreateAudio(ResourcePath path, AudioSettings settings)
Expand Down
7 changes: 6 additions & 1 deletion Hypercube.Client/Dependencies.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
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;
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;

Expand Down Expand Up @@ -46,6 +48,9 @@ public static void Register(DependenciesContainer rootContainer)
// Texturing
rootContainer.Register<ITextureManager, TextureManager>();

// Caching
rootContainer.Register<IResourceCacher, ResourceCacher>();

// Camera
rootContainer.Register<ICameraManager, CameraManager>();

Expand Down
8 changes: 6 additions & 2 deletions Hypercube.Client/Entities/Systems/Sprite/SpriteSystem.cs
Original file line number Diff line number Diff line change
@@ -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 IResourceCacher _resourceCacher = default!;

public override void Initialize()
{
Expand All @@ -34,6 +36,8 @@ private void OnRenderDrawing(ref RenderDrawingEvent ev)

public void Render(Entity<SpriteComponent> entity, Transform2 transform)
{
_drawing.DrawTexture(entity.Component.TextureHandle ??= _textureManager.GetTextureHandle(entity.Component.TexturePath), Vector2.Zero, entity.Component.Color, transform.Matrix * entity.Component.Transform.Matrix);
entity.Component.TextureHandle ??=
_resourceCacher.GetResource<TextureResource>(entity.Component.TexturePath).Texture;
_drawing.DrawTexture(entity.Component.TextureHandle, Vector2.Zero, entity.Component.Color, transform.Matrix * entity.Component.Transform.Matrix);
}
}
7 changes: 5 additions & 2 deletions Hypercube.Client/Graphics/Drawing/RenderDrawing.cs
Original file line number Diff line number Diff line change
@@ -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 IResourceCacher _resourceCacher = default!;

public void DrawTexture(ITexture texture, Vector2 position)
{
Expand All @@ -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 = _resourceCacher.GetResource<TextureResource>(texture.Path).Texture;
_renderer.DrawTexture(handle, quad, uv, color);
}

public void DrawTexture(ITextureHandle texture, Vector2 position, Color color, Matrix4X4 model)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using Hypercube.Shared.EventBus.Events;

namespace Hypercube.Client.Graphics.Event;

public readonly record struct GraphicsLibraryInitializedEvent : IEventArgs;
13 changes: 11 additions & 2 deletions Hypercube.Client/Graphics/Rendering/Renderer.OpenGL.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -9,6 +10,12 @@ public sealed partial class Renderer
{
private const int SwapInterval = 1;

/// <summary>
/// This is where we store the callback
/// because otherwise GC will collect it.
/// </summary>
private DebugProc? _debugProc;

private void InitOpenGL()
{
GL.LoadBindings(_bindingsContext);
Expand All @@ -26,8 +33,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);
Expand All @@ -36,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)
Expand Down
5 changes: 2 additions & 3 deletions Hypercube.Client/Graphics/Rendering/Renderer.Render.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -32,9 +33,7 @@ public sealed partial class Renderer

private void OnLoad()
{
_baseShader = new Shader("/base", _resourceManager);
_baseTexture = _textureManager.GetTextureHandle("/icon.png");
_baseTexture.Bind(HTexTarget.Texture2D);
_baseShader = _resourceCacher.GetResource<ShaderSourceResource>("/Shaders/base").Shader;

_cameraManager.SetMainCamera(_cameraManager.CreateCamera2D(MainWindow.Size));

Expand Down
21 changes: 2 additions & 19 deletions Hypercube.Client/Graphics/Rendering/Renderer.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
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;
using Hypercube.Shared.Runtimes.Event;
using Hypercube.Shared.Runtimes.Loop.Event;
Expand All @@ -26,6 +25,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 IResourceCacher _resourceCacher = default!;

private readonly ILogger _logger = LoggingManager.GetLogger("renderer");
private readonly ILogger _loggerOpenGL = LoggingManager.GetLogger("open_gl")!;
Expand Down Expand Up @@ -70,24 +70,11 @@ public sealed partial class Renderer : IRenderer, IPostInject, IEventSubscriber

public void PostInject()
{
_eventBus.Subscribe<TexturesPreloadEvent>(this, OnTexturesPreload);
_eventBus.Subscribe<HandlesPreloadEvent>(this, OnHandlesPreload);
_eventBus.Subscribe<RuntimeInitializationEvent>(this, OnInitialization);
_eventBus.Subscribe<RuntimeStartupEvent>(this, OnStartup);
_eventBus.Subscribe<UpdateFrameEvent>(this, OnFrameUpdate);
_eventBus.Subscribe<RenderFrameEvent>(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)
{
Expand All @@ -114,11 +101,7 @@ private void OnStartup(ref RuntimeStartupEvent args)
var windowIcons = _windowManager.LoadWindowIcons(_textureManager, _resourceManager, "/Icons").ToList();
_windowManager.SetWindowIcons(MainWindow, windowIcons);


InitOpenGL();

_textureManager.CacheHandles();

OnLoad();
}

Expand Down
2 changes: 1 addition & 1 deletion Hypercube.Client/Graphics/Shading/IShader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Hypercube.Client.Graphics.Shading;

public interface IShader
public interface IShader : IDisposable
{
void Use();
void Stop();
Expand Down
4 changes: 4 additions & 0 deletions Hypercube.Client/Graphics/Shading/Shader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,8 @@ private static void LinkProgram(int program)
}

//private readonly record struct AttributeInfo
public void Dispose()
{
GL.DeleteProgram(_handle);
}
}
1 change: 0 additions & 1 deletion Hypercube.Client/Graphics/Texturing/ITextureManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading

0 comments on commit 1d14185

Please sign in to comment.