feat(03-06): add Particles visual mode with per-region id/density (Task 3)

This commit is contained in:
2026-04-23 15:44:42 +02:00
parent ee1d1b9bdb
commit beba729115
3 changed files with 208 additions and 30 deletions
@@ -75,10 +75,51 @@ class RegionVisualizerTest {
assertEquals(DebugUtils.FLAG_NO_SOLID, RegionVisualizer.flagsForMode("Outline"));
assertEquals(DebugUtils.FLAG_NO_WIREFRAME, RegionVisualizer.flagsForMode("Faces"));
assertEquals(DebugUtils.FLAG_NONE, RegionVisualizer.flagsForMode("Both"));
assertEquals(DebugUtils.FLAG_NONE, RegionVisualizer.flagsForMode("Particles"));
// unknown → Outline
assertEquals(DebugUtils.FLAG_NO_SOLID, RegionVisualizer.flagsForMode("xxx"));
}
@Test
void parseMode_particlesAccepted() {
assertEquals("Particles", RegionVisualizer.normalizeMode("Particles"));
}
// ---------- Particles branch ----------
@Test
void visualize_particlesMode_callsParticleEmitterOncePerEdgePoint() {
List<String> particleCalls = new ArrayList<>();
RegionVisualizer.ParticleEmitter pe = (w, id, pos) -> particleCalls.add(id + "@" + pos.x + "," + pos.y + "," + pos.z);
RegionVisualizer viz = new RegionVisualizer(
t -> fail("errorHandler unexpectedly called: " + t),
(w, shape, m, c, o, t, f) -> fail("DebugEmitter should not fire in Particles mode"),
pe,
(w, r) -> r.run(),
() -> 0L);
// unit box at density=1 → 8 corner points emitted.
GravityFlipRegion r = region("pz", "#FFFFFF", "Particles", 1000, 0.5);
r.setVisualParticleId("Dust_Sparkles_Fine");
r.setVisualParticleDensity(1.0);
viz.visualize(null, snapshotOf(r));
assertEquals(8, particleCalls.size(), "unit box + density=1 → 8 corner emissions");
// All calls use the requested id (validation falls open in test context).
for (String call : particleCalls) {
assertTrue(call.startsWith("Dust_Sparkles_Fine@"), "unexpected call: " + call);
}
}
@Test
void particleDefaults_absentInConstructedRegion() {
// Defaults must match the codec's documented defaults (03-06).
GravityFlipRegion r = new GravityFlipRegion("x",
new Box(new Vector3d(0, 0, 0), new Vector3d(1, 1, 1)), true);
assertEquals("Dust_Sparkles_Fine", r.getVisualParticleId());
assertEquals(1.0, r.getVisualParticleDensity(), 1e-9);
}
// ---------- matrixFromBox ----------
@Test