#include "render_3D/Point_Demo.h" #include #include #include #include #include #include #include #include namespace renderive::render_3d { namespace { struct Event_Point { float x{}; float y{}; }; std::size_t colored_pixel_count(const Pixel_Frame& frame) { if (frame.rgba8.size() < 4) return 0; const auto* bytes = reinterpret_cast(frame.rgba8.data()); const std::array background{ bytes[0], bytes[1], bytes[2], bytes[3]}; std::size_t result{}; for (std::size_t offset = 0; offset + 3 < frame.rgba8.size(); offset += 4) { result += bytes[offset] != background[0] || bytes[offset + 1] != background[1] || bytes[offset + 2] != background[2] || bytes[offset + 3] != background[3]; } return result; } TEST(PointRenderIntegration, RendersRealRgbaAndResizes) { try { auto demo = make_point_demo(Scene_Options{.viewport = {320, 200}}); ASSERT_TRUE(demo.scene->request_frame()); auto first = demo.scene->latest_frame(); ASSERT_NE(first, nullptr); EXPECT_EQ(first->extent, (Extent{320, 200})); EXPECT_EQ(first->rgba8.size(), 320U * 200U * 4U); EXPECT_GT(colored_pixel_count(*first), 100U); demo.scene->resize({480, 270}); ASSERT_TRUE(demo.scene->request_frame()); auto resized = demo.scene->latest_frame(); ASSERT_NE(resized, nullptr); EXPECT_EQ(resized->extent, (Extent{480, 270})); EXPECT_EQ(resized->rgba8.size(), 480U * 270U * 4U); EXPECT_GT(colored_pixel_count(*resized), 100U); } catch (const std::exception& error) { GTEST_SKIP() << "Vulkan/Datoviz unavailable: " << error.what(); } } TEST(PointRenderIntegration, KernelEventsReachDatovizArcballOnItsDomain) { try { auto demo = make_point_demo(Scene_Options{.viewport = {320, 200}}); ASSERT_TRUE(demo.scene->request_frame()); const auto before = demo.scene->latest_frame()->rgba8; ::renderive::Basic_Pointer_Event press( ::renderive::Event_Type::Pointer_Press); press.position = {120.0F, 90.0F}; press.button = ::renderive::Mouse_Button::Left; demo.scene->dispatch(press); ::renderive::Basic_Pointer_Event move( ::renderive::Event_Type::Pointer_Move); move.position = {210.0F, 125.0F}; move.buttons = 1; demo.scene->dispatch(move); move.position = {245.0F, 145.0F}; demo.scene->dispatch(move); ::renderive::Basic_Pointer_Event release( ::renderive::Event_Type::Pointer_Release); release.position = move.position; release.button = ::renderive::Mouse_Button::Left; demo.scene->dispatch(release); ASSERT_TRUE(demo.scene->request_frame()); const auto after_drag = demo.scene->latest_frame(); ASSERT_NE(after_drag, nullptr); EXPECT_NE(after_drag->rgba8, before); ::renderive::Basic_Wheel_Event wheel; wheel.position = {160.0F, 100.0F}; wheel.pixel_delta_y = 180.0; wheel.angle_delta_y = -216.0; demo.scene->dispatch(wheel); ASSERT_TRUE(demo.scene->request_frame()); const auto after_wheel = demo.scene->latest_frame(); ASSERT_NE(after_wheel, nullptr); EXPECT_GT(colored_pixel_count(*after_wheel), 100U); EXPECT_NE(after_wheel->rgba8, after_drag->rgba8); } catch (const std::exception& error) { GTEST_SKIP() << "Vulkan/Datoviz unavailable: " << error.what(); } } } // namespace } // namespace renderive::render_3d