Files
EVEngine/test/particles_renderer.cpp

86 lines
3.8 KiB
C++

#include "zeroerr/assert.h"
#include "zeroerr/unittest.h"
#include "particles/ParticleEmitter.h"
#include "particles/Particles.h"
#include <cmath>
#include <string>
using namespace eve::particles;
TEST_CASE("particles.renderer.facingAndSortContract") {
auto* emitter = Particles::create()->newEmitter(32);
emitter->setRenderMode("axis");
emitter->setRenderAxis(37.5f);
emitter->setSortMode("distance");
CHECK_EQ(emitter->config()->renderMode, std::string("axis"));
CHECK(std::abs(emitter->config()->renderAxisDegrees - 37.5f) < 1e-5f);
CHECK_EQ(emitter->getSortMode(), std::string("distance"));
emitter->setRenderMode("velocity", 2.25f);
CHECK_EQ(emitter->config()->renderMode, std::string("stretched"));
CHECK(std::abs(emitter->config()->stretchFactor - 2.25f) < 1e-5f);
emitter->setSortMode("unsupported");
CHECK_EQ(emitter->getSortMode(), std::string("none"));
emitter->setRibbon(0.65f, 3.f);
CHECK_EQ(emitter->config()->renderMode, std::string("ribbon"));
CHECK(std::abs(emitter->config()->ribbonWidth - 0.65f) < 1e-5f);
CHECK(std::abs(emitter->config()->ribbonMinSegmentLength - 3.f) < 1e-5f);
emitter->setSoftParticles(true, 1.2f, 0.f);
CHECK(emitter->config()->softParticles);
CHECK(std::abs(emitter->config()->softParticleDepth - 1.f) < 1e-5f);
CHECK(emitter->config()->softFadeDistance >= 1e-5f);
CHECK(!emitter->isSoftParticlesActive());
emitter->setMaterialMode("lit");
CHECK_EQ(emitter->getMaterialMode(), std::string("lit"));
emitter->setGpuSimulation(true);
CHECK(!emitter->isGpuFeatureSetSupported());
CHECK_EQ(emitter->getSimulationBackend(), std::string("cpu"));
CHECK_EQ(emitter->getGpuFallbackReason(), std::string("lit_material"));
emitter->setMaterialMode("distortion");
emitter->setDistortionStrength(14.5f);
CHECK_EQ(emitter->getMaterialMode(), std::string("distortion"));
CHECK(std::abs(emitter->getDistortionStrength() - 14.5f) < 1e-5f);
CHECK_EQ(emitter->getGpuFallbackReason(), std::string("distortion_material"));
emitter->setDistortionStrength(-4.f);
CHECK_EQ(emitter->getDistortionStrength(), 0.f);
emitter->setMaterialMode("unsupported");
CHECK_EQ(emitter->getMaterialMode(), std::string("unlit"));
CHECK(emitter->isGpuFeatureSetSupported());
CHECK_EQ(emitter->getGpuFallbackReason(), std::string("backend_unavailable"));
}
TEST_CASE("particles.renderer.jsonContract") {
auto* emitter = Particles::create()->newEmitter(32);
REQUIRE(emitter->applyConfig(R"({
"renderMode": "axis",
"renderAxis": -22.5,
"sortMode": "youngest",
"ribbon": {"width": 0.75, "minSegmentLength": 2.5},
"softParticles": {"enabled": true, "depth": 0.42, "fadeDistance": 0.08},
"material": {"mode": "lit", "normalTexture": "particles/test-normal.png", "distortionStrength": 12.5},
"parameters": {"intensity": 1.75},
"parameterBindings": [
{"parameter": "intensity", "target": "emission", "scale": 2.0, "offset": 0.5}
]
})"));
CHECK_EQ(emitter->config()->renderMode, std::string("ribbon"));
CHECK(std::abs(emitter->config()->renderAxisDegrees + 22.5f) < 1e-5f);
CHECK_EQ(emitter->getSortMode(), std::string("youngest"));
CHECK(std::abs(emitter->config()->ribbonWidth - 0.75f) < 1e-5f);
CHECK(emitter->config()->softParticles);
CHECK(std::abs(emitter->config()->softParticleDepth - 0.42f) < 1e-5f);
CHECK_EQ(emitter->getMaterialMode(), std::string("lit"));
CHECK(std::abs(emitter->getDistortionStrength() - 12.5f) < 1e-5f);
CHECK_EQ(emitter->resource()->normalTexturePath, std::string("particles/test-normal.png"));
CHECK(std::abs(emitter->getFloatParameter("intensity") - 1.75f) < 1e-5f);
CHECK(std::abs(emitter->getResolvedParameterScale("emission") - 4.f) < 1e-5f);
}