From 89b0db30a251b257b65a7777c274d689177f15b4 Mon Sep 17 00:00:00 2001
From: Christopher Whitley <103014489+AristurtleDev@users.noreply.github.com>
Date: Wed, 25 Mar 2026 14:37:31 -0400
Subject: [PATCH 1/2] Add Uniform checkbox to Vector2 random scale UI
Closes #26
---
.../EmberExample/.config/dotnet-tools.json | 12 ++--
examples/EmberExample/Content/Content.mgcb | 6 +-
examples/EmberExample/EmberExample.csproj | 4 +-
examples/EmberExample/Game1.cs | 22 ++++---
external/monogame-extended | 2 +-
.../Architecture/Components/PropertyTable.cs | 66 ++++++++++++++++++-
6 files changed, 93 insertions(+), 19 deletions(-)
diff --git a/examples/EmberExample/.config/dotnet-tools.json b/examples/EmberExample/.config/dotnet-tools.json
index fbedee1..7f4505d 100644
--- a/examples/EmberExample/.config/dotnet-tools.json
+++ b/examples/EmberExample/.config/dotnet-tools.json
@@ -3,34 +3,34 @@
"isRoot": true,
"tools": {
"dotnet-mgcb": {
- "version": "3.8.4",
+ "version": "3.8.4.1",
"commands": [
"mgcb"
]
},
"dotnet-mgcb-editor": {
- "version": "3.8.4",
+ "version": "3.8.4.1",
"commands": [
"mgcb-editor"
]
},
"dotnet-mgcb-editor-linux": {
- "version": "3.8.4",
+ "version": "3.8.4.1",
"commands": [
"mgcb-editor-linux"
]
},
"dotnet-mgcb-editor-windows": {
- "version": "3.8.4",
+ "version": "3.8.4.1",
"commands": [
"mgcb-editor-windows"
]
},
"dotnet-mgcb-editor-mac": {
- "version": "3.8.4",
+ "version": "3.8.4.1",
"commands": [
"mgcb-editor-mac"
]
}
}
-}
\ No newline at end of file
+}
diff --git a/examples/EmberExample/Content/Content.mgcb b/examples/EmberExample/Content/Content.mgcb
index b9a4813..93acd95 100644
--- a/examples/EmberExample/Content/Content.mgcb
+++ b/examples/EmberExample/Content/Content.mgcb
@@ -10,6 +10,7 @@
#-------------------------------- References --------------------------------#
+/reference:..\..\..\external\monogame-extended\.artifacts\source\bin\MonoGame.Extended.Content.Pipeline\release\MonoGame.Extended.Content.Pipeline.dll
#---------------------------------- Content ---------------------------------#
@@ -20,7 +21,9 @@
/copy:loadtest/Pixel.png
#begin ring/ring.ember
-/copy:ring/ring.ember
+/importer:
+/processor:
+/build:ring/ring.ember
#begin ring/Ring.png
/copy:ring/Ring.png
@@ -36,3 +39,4 @@
#begin spark/spark.ember
/copy:spark/spark.ember
+
diff --git a/examples/EmberExample/EmberExample.csproj b/examples/EmberExample/EmberExample.csproj
index df7044e..2efa128 100644
--- a/examples/EmberExample/EmberExample.csproj
+++ b/examples/EmberExample/EmberExample.csproj
@@ -25,8 +25,8 @@
-
-
+
+
diff --git a/examples/EmberExample/Game1.cs b/examples/EmberExample/Game1.cs
index f87df9c..afc7365 100644
--- a/examples/EmberExample/Game1.cs
+++ b/examples/EmberExample/Game1.cs
@@ -127,8 +127,7 @@ private void DrawDebugWindow(GameTime gameTime)
ImGui.TableNextColumn();
if (ImGui.Button("Ring"u8, new System.Numerics.Vector2(-1, 0)))
{
- string fileName = Path.Combine(_contentPath, "ring", "ring.ember");
- LoadParticleEffect(fileName);
+ LoadParticleEffect("ring/ring", true);
}
ImGui.TableNextColumn();
@@ -156,7 +155,7 @@ private void DrawDebugWindow(GameTime gameTime)
ImGui.Text("Auto Trigger: ");
ImGui.TableNextColumn();
bool autoTrigger = _particleEffect.AutoTrigger;
- if(ImGui.Checkbox("##auto_trigger"u8, ref autoTrigger))
+ if (ImGui.Checkbox("##auto_trigger"u8, ref autoTrigger))
{
_particleEffect.AutoTrigger = autoTrigger;
}
@@ -213,7 +212,7 @@ private void DrawDebugWindow(GameTime gameTime)
ImGuiRenderer.AfterLayout();
}
- private void LoadParticleEffect(string fileName)
+ private void LoadParticleEffect(string fileName, bool useContentPipeline = false)
{
if (_particleEffect != null)
{
@@ -221,9 +220,16 @@ private void LoadParticleEffect(string fileName)
_particleEffect = null;
}
- using ParticleEffectReader reader = new(fileName, Content);
- _particleEffect = reader.ReadParticleEffect();
- _particleEffect.Position = GraphicsDevice.Viewport.Bounds.Center.ToVector2();
- _particleEffect.AutoTrigger = false;
+ if (useContentPipeline)
+ {
+ _particleEffect = Content.Load(fileName);
+ }
+ else
+ {
+ using ParticleEffectReader reader = new(fileName, Content);
+ _particleEffect = reader.ReadParticleEffect();
+ _particleEffect.Position = GraphicsDevice.Viewport.Bounds.Center.ToVector2();
+ _particleEffect.AutoTrigger = false;
+ }
}
}
diff --git a/external/monogame-extended b/external/monogame-extended
index 886254e..a7672bd 160000
--- a/external/monogame-extended
+++ b/external/monogame-extended
@@ -1 +1 @@
-Subproject commit 886254e9a8532a6c3bff40ecb7bb88a16df44f32
+Subproject commit a7672bd7fbdac5a0e1a76e14d5a7caca911b0084
diff --git a/src/Ember/Architecture/Components/PropertyTable.cs b/src/Ember/Architecture/Components/PropertyTable.cs
index 47f2f5e..dd738d3 100644
--- a/src/Ember/Architecture/Components/PropertyTable.cs
+++ b/src/Ember/Architecture/Components/PropertyTable.cs
@@ -471,10 +471,37 @@ public static bool ReleaseParameter(ReadOnlySpan label, ReadOnlySpan
}
else if (value.Kind == ParticleValueKind.Random)
{
- if (ReleaseParameterRandomVector2(ref value.RandomMin, ref value.RandomMax))
+ TableNextColumn();
+ bool uniform = value.Uniform;
+ if (Checkbox("Uniform##uniform"u8, ref uniform))
{
+ value.Uniform = uniform;
+ if (uniform)
+ {
+ value.RandomMin.Y = value.RandomMin.X;
+ value.RandomMax.Y = value.RandomMax.X;
+ }
changed = true;
}
+
+ TableNextRow();
+ TableNextColumn();
+ TableNextColumn();
+
+ if (value.Uniform)
+ {
+ if (ReleaseParameterUniformRandomVector2(ref value.RandomMin, ref value.RandomMax))
+ {
+ changed = true;
+ }
+ }
+ else
+ {
+ if (ReleaseParameterRandomVector2(ref value.RandomMin, ref value.RandomMax))
+ {
+ changed = true;
+ }
+ }
}
PopID();
@@ -657,6 +684,43 @@ private static bool ReleaseParameterConstantVector2(ref XnaVec2 value)
return changed;
}
+ private static bool ReleaseParameterUniformRandomVector2(ref XnaVec2 min, ref XnaVec2 max)
+ {
+ bool changed = false;
+
+ ImGuiStylePtr stylePtr = GetStyle();
+ TableNextColumn();
+
+ float availWidth = GetContentRegionAvail().X;
+ float toWidth = CalcTextSize(" to "u8).X;
+ float spacing = stylePtr.ItemSpacing.X * 2.0f;
+ float dragWidth = (availWidth - toWidth - spacing) * 0.5f;
+
+ SetNextItemWidth(dragWidth);
+ float minVal = min.X;
+ if (DragFloat("##uniform-min"u8, ref minVal, 0.1f, 0.0f, max.X, "%.2f"u8))
+ {
+ min.X = minVal;
+ min.Y = minVal;
+ changed = true;
+ }
+
+ SameLine();
+ Text(" to "u8);
+
+ SameLine();
+ SetNextItemWidth(dragWidth);
+ float maxVal = max.X;
+ if (DragFloat("##uniform-max"u8, ref maxVal, 0.1f, min.X, float.MaxValue, "%.2f"u8))
+ {
+ max.X = maxVal;
+ max.Y = maxVal;
+ changed = true;
+ }
+
+ return changed;
+ }
+
private static bool ReleaseParameterRandomVector2(ref XnaVec2 min, ref XnaVec2 max)
{
bool changed = false;
From 590efb3807889ffe5a86e7b2429544521cdcfd4f Mon Sep 17 00:00:00 2001
From: Christopher Whitley <103014489+AristurtleDev@users.noreply.github.com>
Date: Wed, 25 Mar 2026 14:40:37 -0400
Subject: [PATCH 2/2] Update submodule to new v5.5.0 MGE
---
external/monogame-extended | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/external/monogame-extended b/external/monogame-extended
index a7672bd..25d9e31 160000
--- a/external/monogame-extended
+++ b/external/monogame-extended
@@ -1 +1 @@
-Subproject commit a7672bd7fbdac5a0e1a76e14d5a7caca911b0084
+Subproject commit 25d9e317c19c2a9d1a28bd878eef8df3ff22aa21