/** * @file TestRenderer.cpp * @brief 渲染功能综合测试实现。 */ #include "Test.h" #include "TestRenderer.h" #include "Graphics/Renderer.h" #include "Platform/Platform.h" #include "Platform/PlatformTypes.h" #include #include #ifdef TEST_RENDERER using namespace XEngine; time_it timer{}; graphics::render_surface _surfaces[4]; void destroy_render_surface(graphics::render_surface& surface); LRESULT win_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { bool toggle_fullscreen{ false }; switch (msg) { case WM_DESTROY: { bool all_closed{ true }; for (u32 i{ 0 }; i < _countof(_surfaces); ++i) { if(_surfaces[i].window.is_valid()){ if(_surfaces[i].window.is_closed()) { destroy_render_surface(_surfaces[i]); } else { all_closed = false; } } } if (all_closed) { PostQuitMessage(0); return 0; } break; } case WM_SYSCHAR: { if(wparam == VK_RETURN && (HIWORD(lparam) & KF_ALTDOWN)) { platform::window win{ platform::window_id{(id::id_type)GetWindowLongPtr(hwnd, GWLP_USERDATA)} }; win.set_fullscreen(!win.is_fullscreen()); return 0; } break; } case WM_KEYDOWN: if(wparam == VK_ESCAPE) { PostMessage(hwnd,WM_CLOSE,0,0); return 0; } } return DefWindowProc(hwnd, msg, wparam, lparam); } void create_render_surface(graphics::render_surface& surface, const platform::window_init_info info) { surface.window = platform::create_window(&info); surface.surface = graphics::create_surface(surface.window); } void destroy_render_surface(graphics::render_surface& surface) { graphics::render_surface temp{surface}; surface = {}; if(temp.surface.is_valid())graphics::remove_surface(temp.surface.get_id()); if(temp.window.is_valid())platform::remove_window(temp.window.get_id()); } bool engine_test::initialize() { bool result{ graphics::initialize(graphics::graphics_platform::direct3d12) }; if (!result) { return result; } platform::window_init_info info[] { {&win_proc, nullptr, L"Test Window 1", 200, 100,400,400}, {&win_proc, nullptr, L"Test Window 2", 700, 100,400,400}, {&win_proc, nullptr, L"Test Window 2", 700, 100,400,400}, {&win_proc, nullptr, L"Test Window 3", 1200,100,400,400}, }; static_assert(_countof(info) == _countof(_surfaces)); for (u32 i{ 0 }; i < _countof(_surfaces); ++i) { create_render_surface(_surfaces[i], info[i]); } return result; } void engine_test::run() { timer.begin(); //std::this_thread::sleep_for(std::chrono::milliseconds(10)); for (u32 i{ 0 }; i < _countof(_surfaces); ++i) { if(_surfaces[i].surface.is_valid()) { _surfaces[i].surface.render(); } } timer.end(); } bool engine_test::shutdown() { for (u32 i{ 0 }; i < _countof(_surfaces); ++i) { destroy_render_surface(_surfaces[i]); } graphics::shutdown(); return true; } #endif // TEST_RENDERER