Files
Renderive/Kernel/tests/renderive/scene/Scene2D_Render_Order_Test.cpp
T
2026-08-11 23:17:03 +08:00

63 lines
2.8 KiB
C++

#include <gtest/gtest.h>
#include <cstdint>
#include <memory>
#include <vector>
#include "renderive/renderable/Renderable.hpp"
#include "renderive/scene/Scene.hpp"
struct Scene2D_Render_Order_State {
std::vector<std::uint64_t> render_order;
};
struct Scene2D_Render_Order_Renderable : Renderable_Base {
Scene2D_Render_Order_Renderable(Scene_Base& scene, Scene2D_Render_Order_State& state, std::uint64_t id)
: Renderable_Base(scene, {.cache_enabled = false}), state(&state), id(id) {}
void render(const Scene_Render_Context& context) override {
state->render_order.push_back(id);
dynamic_cast<Recording_Color_Cache&>(*context.color_cache).append(id);
}
Scene2D_Render_Order_State* state;
std::uint64_t id;
};
TEST(scene2d_render_order_test, separates_dependency_order_from_display_order) {
Scene2D_Context<> scene;
Scene2D_Render_Order_State state;
auto spectrum = std::make_shared<Scene2D_Render_Order_Renderable>(scene, state, 2);
auto axis = std::make_shared<Scene2D_Render_Order_Renderable>(scene, state, 1);
scene.attach_renderable(spectrum);
scene.attach_renderable(axis);
scene.set_dependency_parent(*spectrum, axis.get());
scene.set_display_parent(*axis, spectrum.get());
scene.render();
scene.wait_for_render();
EXPECT_EQ(state.render_order, (std::vector<std::uint64_t>{1, 2}));
std::vector<std::uint64_t> final_values;
scene.with_final_color_cache([&final_values](const Recording_Color_Cache& cache) {
final_values.assign(cache.values.begin(), cache.values.end());
});
EXPECT_EQ(final_values.size(), 2);
EXPECT_EQ(final_values.at(0), 2);
EXPECT_EQ(final_values.at(1), 1);
}
TEST(scene2d_render_order_test, shared_overlay_waits_for_every_display_parent) {
Scene2D_Context<> scene;
Scene2D_Render_Order_State state;
auto first_plot = std::make_shared<Scene2D_Render_Order_Renderable>(scene, state, 2);
auto axis = std::make_shared<Scene2D_Render_Order_Renderable>(scene, state, 1);
auto second_plot = std::make_shared<Scene2D_Render_Order_Renderable>(scene, state, 3);
scene.attach_renderable(first_plot);
scene.attach_renderable(axis);
scene.attach_renderable(second_plot);
scene.add_dependency_parent(*first_plot, *axis);
scene.add_dependency_parent(*second_plot, *axis);
scene.add_display_parent(*axis, *first_plot);
scene.add_display_parent(*axis, *second_plot);
scene.render();
scene.wait_for_render();
EXPECT_EQ(state.render_order.front(), 1);
std::vector<std::uint64_t> final_values;
scene.with_final_color_cache([&final_values](const Recording_Color_Cache& cache) {
final_values.assign(cache.values.begin(), cache.values.end());
});
ASSERT_EQ(final_values.size(), 3);
EXPECT_EQ(final_values.back(), 1);
}