86 lines
3.8 KiB
C++
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);
|
|
}
|