From ecd752e961c72c212ea22257f9255c733df2b940 Mon Sep 17 00:00:00 2001 From: dnesov Date: Tue, 15 Oct 2024 17:10:48 +0200 Subject: [PATCH] Add blend modes to renderer. --- TestGame/Resources/test_emitter.toml | 2 +- TestGame/TestGame.cs | 4 +++ Voile/Source/Rendering/RaylibRenderSystem.cs | 10 ++++++ Voile/Source/Rendering/RenderSystem.cs | 35 +++++++++++++++++++ .../Source/Rendering/StandardRenderSystem.cs | 12 +++++++ 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/TestGame/Resources/test_emitter.toml b/TestGame/Resources/test_emitter.toml index e697410..fb14f2d 100644 --- a/TestGame/Resources/test_emitter.toml +++ b/TestGame/Resources/test_emitter.toml @@ -1,7 +1,7 @@ [ParticleEmitterSettings] MaxParticles = 1024 -EmitRadius = 128 +EmitRadius = 3 LifeTime = 0.5 Direction = { x = 0.0, y = 1.0 } LinearVelocity = 980.0 diff --git a/TestGame/TestGame.cs b/TestGame/TestGame.cs index 1f11579..d8fc6cc 100644 --- a/TestGame/TestGame.cs +++ b/TestGame/TestGame.cs @@ -74,6 +74,8 @@ public class TestGame : Game private void DrawEmitter(ParticleEmitter emitter) { + Renderer.BeginBlended(Voile.Rendering.BlendMode.BlendAdd); + for (int i = 0; i < emitter.Particles.Length; i++) { var particle = emitter.Particles[i]; @@ -83,6 +85,8 @@ public class TestGame : Game Renderer.SetTransform(emitter.OriginPosition + particle.Position, Vector2.Zero); Renderer.DrawCircle(16f * particle.Scale, color); } + + Renderer.EndBlended(); } private ParticleSystem? _particleSystem; diff --git a/Voile/Source/Rendering/RaylibRenderSystem.cs b/Voile/Source/Rendering/RaylibRenderSystem.cs index 0493559..c52458f 100644 --- a/Voile/Source/Rendering/RaylibRenderSystem.cs +++ b/Voile/Source/Rendering/RaylibRenderSystem.cs @@ -121,6 +121,16 @@ namespace Voile.Rendering Raylib.EndDrawing(); } + public override void BeginBlended(BlendMode blendMode) + { + Raylib.BeginBlendMode((Raylib_cs.BlendMode)blendMode); + } + + public override void EndBlended() + { + Raylib.EndBlendMode(); + } + public override void BeginCamera2d(Vector2 offset, Vector2 target, float rotation, float zoom) { var camera = new Camera2D(offset, target, rotation, zoom); diff --git a/Voile/Source/Rendering/RenderSystem.cs b/Voile/Source/Rendering/RenderSystem.cs index 1266462..1dbaa27 100644 --- a/Voile/Source/Rendering/RenderSystem.cs +++ b/Voile/Source/Rendering/RenderSystem.cs @@ -2,6 +2,38 @@ using System.Numerics; namespace Voile.Rendering { + public enum BlendMode + { + // + // Summary: + // Blend textures considering alpha (default) + BlendAlpha, + // + // Summary: + // Blend textures adding colors + BlendAdditive, + // + // Summary: + // Blend textures multiplying colors + BlendMultiplied, + // + // Summary: + // Blend textures adding colors (alternative) + BlendAdd, + // + // Summary: + // Blend textures subtracting colors (alternative) + BlendSubtract, + // + // Summary: + // Blend premultiplied textures considering alpha + BlendAlphaPremul, + // + // Summary: + // Blend textures using custom src/dst factors (use rlSetBlendMode()) + BlendCustom + } + /// /// An abstract class representing the graphics renderer. /// @@ -82,6 +114,9 @@ namespace Voile.Rendering /// public abstract void EndFrame(); + public abstract void BeginBlended(BlendMode blendMode); + public abstract void EndBlended(); + public abstract void BeginCamera2d(Vector2 offset, Vector2 target, float rotation, float zoom); public abstract void EndCamera2d(); diff --git a/Voile/Source/Rendering/StandardRenderSystem.cs b/Voile/Source/Rendering/StandardRenderSystem.cs index eace441..3ee0111 100644 --- a/Voile/Source/Rendering/StandardRenderSystem.cs +++ b/Voile/Source/Rendering/StandardRenderSystem.cs @@ -353,6 +353,18 @@ namespace Voile.Rendering { return null; } + + public override void BeginBlended(BlendMode blendMode) + { + throw new NotImplementedException(); + } + + public override void EndBlended() + { + throw new NotImplementedException(); + } + + private Vector2 _windowSize; private IWindow? _window;