Files
Renderive/Kernel/tests/renderive/scene/Scene3D_Context_Test.cpp
T
2026-08-10 13:50:17 +08:00

53 lines
2.1 KiB
C++

#include <gtest/gtest.h>
#include <atomic>
#include <memory>
#include "renderive/renderable/Renderable.hpp"
#include "renderive/scene/Scene.hpp"
struct Scene3D_Context_Test_Renderable : Renderable_Base {
explicit Scene3D_Context_Test_Renderable(Scene_Base& scene) : Renderable_Base(scene) {}
void render(const Scene_Render_Context& context) override {
scene_is_3d = dynamic_cast<Scene_3D_Base*>(context.scene) != nullptr;
++render_count;
}
std::atomic<int> render_count{};
bool scene_is_3d{};
};
TEST(scene3d_context_test, uses_scene_3d_base_contract) {
Scene3D_Context<> scene;
auto renderable = std::make_shared<Scene3D_Context_Test_Renderable>(scene);
scene.attach_renderable(renderable);
scene.render();
scene.wait_for_render();
EXPECT_EQ(renderable->render_count.load(), 1);
EXPECT_TRUE(renderable->scene_is_3d);
}
struct Scene3D_Dependency_Cache_Test_Renderable : Renderable_Base {
explicit Scene3D_Dependency_Cache_Test_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = true}) {}
void render(const Scene_Render_Context&) override {
++render_count;
}
int render_count{};
};
TEST(scene3d_context_test, propagates_cache_invalidation_through_unsorted_dependency_chain) {
Scene3D_Context<> scene;
auto leaf = std::make_shared<Scene3D_Dependency_Cache_Test_Renderable>(scene);
auto middle = std::make_shared<Scene3D_Dependency_Cache_Test_Renderable>(scene);
auto root = std::make_shared<Scene3D_Dependency_Cache_Test_Renderable>(scene);
scene.attach_renderable(leaf);
scene.attach_renderable(middle);
scene.attach_renderable(root);
scene.set_dependency_parent(*leaf, middle.get());
scene.set_dependency_parent(*middle, root.get());
scene.render();
scene.wait_for_render();
EXPECT_EQ(root->render_count, 1);
EXPECT_EQ(middle->render_count, 1);
EXPECT_EQ(leaf->render_count, 1);
root->invalidate_cache();
scene.render();
scene.wait_for_render();
EXPECT_EQ(root->render_count, 2);
EXPECT_EQ(middle->render_count, 2);
EXPECT_EQ(leaf->render_count, 2);
}