fix: close STEP-085 V4 renderer efficiency
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
tei
2026-09-19 22:16:36 +09:00
parent bc6b8dd84b
commit 70f112ea27
19 changed files with 501 additions and 111 deletions

View File

@@ -409,14 +409,19 @@ TEST(Source, RasterArrayV4RendererStateMaterializesBindingsAndMixWithoutTouching
const auto& color = *source.impl().v4RendererState.color;
EXPECT_FLOAT_EQ(particles.sampleState.mix, 0.5f);
EXPECT_FLOAT_EQ(color.sampleState.mix, 0.5f);
EXPECT_EQ(particles.t0.vector, (std::vector<float>{1, 5, 2, 6, 3, 7, 4, 8}));
EXPECT_EQ(particles.t0.valid, (std::vector<uint8_t>{1, 1, 1, 1}));
EXPECT_EQ(color.t0.scalar, (std::vector<float>{1, 2, 3, 4}));
ASSERT_TRUE(particles.t0);
ASSERT_TRUE(color.t0);
EXPECT_EQ(particles.t0->vector, (std::vector<float>{1, 5, 2, 6, 3, 7, 4, 8}));
EXPECT_EQ(particles.t0->valid, (std::vector<uint8_t>{1, 1, 1, 1}));
EXPECT_EQ(color.t0->scalar, (std::vector<float>{1, 2, 3, 4}));
const auto particleIdentity = particles.contentIdentity;
const auto retainedParticleT0 = particles.t0;
ASSERT_TRUE(source.setRequestedForecastTime(Base + Hour / 4));
ASSERT_TRUE(source.impl().v4RendererState.particle);
EXPECT_EQ(source.impl().v4RendererState.particle->contentIdentity, particleIdentity);
EXPECT_FLOAT_EQ(source.impl().v4RendererState.particle->sampleState.mix, 0.25f);
ASSERT_TRUE(retainedParticleT0);
EXPECT_EQ(retainedParticleT0->vector, (std::vector<float>{1, 5, 2, 6, 3, 7, 4, 8}));
EXPECT_FALSE(source.impl().field);
EXPECT_FALSE(source.impl().nextField);
EXPECT_FALSE(source.impl().timeline);
@@ -457,15 +462,21 @@ TEST(Source, RasterArrayV4MaterializerUsesExplicitLittleEndianScaleOffsetAndStab
projection.sampleState = {Base + Hour / 2, 0.5f};
projection.t0Frame = t0;
projection.t1Frame = t1;
const auto materialized = particle::materializeColorProjection(projection);
auto materialized = particle::materializeColorProjection(projection);
ASSERT_TRUE(materialized);
EXPECT_EQ(materialized->t0.scalar, (std::vector<float>{4.0f, -3.0f, 7.5f, 9.0f}));
EXPECT_EQ(materialized->t0.valid, (std::vector<uint8_t>{1, 0, 1, 1}));
EXPECT_EQ(materialized->t0.generation, 17u);
EXPECT_EQ(materialized->t0.dataVersion, 23u);
EXPECT_EQ(materialized->t0.fieldSha256, "plane-t0");
EXPECT_EQ(materialized->t1.generation, 18u);
EXPECT_EQ(materialized->t1.dataVersion, 24u);
ASSERT_TRUE(materialized->t0);
ASSERT_TRUE(materialized->t1);
EXPECT_EQ(materialized->t0->scalar, (std::vector<float>{4.0f, -3.0f, 7.5f, 9.0f}));
EXPECT_EQ(materialized->t0->valid, (std::vector<uint8_t>{1, 0, 1, 1}));
EXPECT_EQ(materialized->t0->generation, 17u);
EXPECT_EQ(materialized->t0->dataVersion, 23u);
EXPECT_EQ(materialized->t0->fieldSha256, "plane-t0");
EXPECT_EQ(materialized->t1->generation, 18u);
EXPECT_EQ(materialized->t1->dataVersion, 24u);
const auto retainedT0 = materialized->t0;
materialized.reset();
ASSERT_TRUE(retainedT0);
EXPECT_EQ(retainedT0->scalar, (std::vector<float>{4.0f, -3.0f, 7.5f, 9.0f}));
}
TEST(Source, RasterArrayV4MaterializerDecodesDirectionToUInt16LittleEndian) {
@@ -512,14 +523,15 @@ TEST(Source, RasterArrayV4MaterializerDecodesDirectionToUInt16LittleEndian) {
projection.t1Frame = t1;
const auto materialized = particle::materializeParticleProjection(projection);
ASSERT_TRUE(materialized);
ASSERT_EQ(materialized->t0.vector.size(), 8u);
EXPECT_NEAR(materialized->t0.vector[0], 0.0f, 1e-5f);
EXPECT_NEAR(materialized->t0.vector[1], 1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0.vector[2], 1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0.vector[3], 0.0f, 1e-5f);
EXPECT_NEAR(materialized->t0.vector[4], 0.0f, 1e-5f);
EXPECT_NEAR(materialized->t0.vector[5], -1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0.vector[6], -1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0.vector[7], 0.0f, 1e-5f);
EXPECT_EQ(materialized->t0.vectorSemantics, particle::VectorSemantics::Direction);
ASSERT_TRUE(materialized->t0);
ASSERT_EQ(materialized->t0->vector.size(), 8u);
EXPECT_NEAR(materialized->t0->vector[0], 0.0f, 1e-5f);
EXPECT_NEAR(materialized->t0->vector[1], 1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0->vector[2], 1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0->vector[3], 0.0f, 1e-5f);
EXPECT_NEAR(materialized->t0->vector[4], 0.0f, 1e-5f);
EXPECT_NEAR(materialized->t0->vector[5], -1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0->vector[6], -1.0f, 1e-5f);
EXPECT_NEAR(materialized->t0->vector[7], 0.0f, 1e-5f);
EXPECT_EQ(materialized->t0->vectorSemantics, particle::VectorSemantics::Direction);
}

View File

@@ -884,6 +884,29 @@ TEST(Source, RasterArrayTimelineCadenceUsesOneSharedDeterministicDeadline) {
EXPECT_TRUE(timeline.cadenceDue(start));
}
TEST(Source, RasterArrayV4RendererCadenceGatesVisualSimulationWithoutForecastPlayback) {
style::RasterArrayRendererCadence cadence;
const auto start = std::chrono::steady_clock::time_point{} + std::chrono::seconds(1);
cadence.setTargetFps(style::RasterArrayTargetFps::Fps30);
EXPECT_TRUE(cadence.cadenceDue(start));
EXPECT_TRUE(cadence.consumeIfDue(start));
EXPECT_FALSE(cadence.consumeIfDue(start));
EXPECT_FALSE(cadence.cadenceDue(start + std::chrono::milliseconds(33)));
EXPECT_TRUE(cadence.cadenceDue(start + std::chrono::milliseconds(34)));
EXPECT_TRUE(cadence.consumeIfDue(start + std::chrono::milliseconds(34)));
const auto revisionAt30 = cadence.revision();
cadence.setTargetFps(style::RasterArrayTargetFps::Fps60);
EXPECT_TRUE(cadence.consumeIfDue(start + std::chrono::milliseconds(34)));
EXPECT_FALSE(cadence.consumeIfDue(start + std::chrono::milliseconds(50)));
EXPECT_TRUE(cadence.consumeIfDue(start + std::chrono::milliseconds(51)));
EXPECT_GT(cadence.revision(), revisionAt30);
cadence.setTargetFps(style::RasterArrayTargetFps::Auto);
EXPECT_TRUE(cadence.consumeIfDue(start + std::chrono::milliseconds(51)));
EXPECT_TRUE(cadence.consumeIfDue(start + std::chrono::milliseconds(51)));
}
TEST(Source, RasterArrayRuntimeFieldWindowAdvancesWithoutReplacingTheSource) {
SourceTest test;
const auto eastMetadata = fixtureBytes("uniform-east", "metadata.json");