| 970 | } |
| 971 | |
| 972 | bool VisualizerImpl::initialize() { |
| 973 | if (fully_initialized_) { |
| 974 | LOG_TRACE("Already fully initialized"); |
| 975 | return true; |
| 976 | } |
| 977 | |
| 978 | // Initialize window first and ensure it has proper size |
| 979 | if (!window_initialized_) { |
| 980 | { |
| 981 | LOG_TIMER("startup.window_manager.init"); // wraps Vulkan instance/device/swapchain bring-up |
| 982 | if (!window_manager_->init()) { |
| 983 | return false; |
| 984 | } |
| 985 | } |
| 986 | window_initialized_ = true; |
| 987 | |
| 988 | window_manager_->pollEvents(); |
| 989 | window_manager_->updateWindowSize(); |
| 990 | |
| 991 | viewport_.windowSize = window_manager_->getWindowSize(); |
| 992 | viewport_.frameBufferSize = window_manager_->getFramebufferSize(); |
| 993 | |
| 994 | if (viewport_.windowSize.x <= 0 || viewport_.windowSize.y <= 0) { |
| 995 | LOG_WARN("Window manager returned invalid size, using options fallback: {}x{}", |
| 996 | options_.width, options_.height); |
| 997 | viewport_.windowSize = glm::ivec2(options_.width, options_.height); |
| 998 | viewport_.frameBufferSize = glm::ivec2(options_.width, options_.height); |
| 999 | } |
| 1000 | |
| 1001 | LOG_DEBUG("Window initialized with actual size: {}x{}", |
| 1002 | viewport_.windowSize.x, viewport_.windowSize.y); |
| 1003 | } |
| 1004 | |
| 1005 | // Initialize GUI (sets up ImGui, builds font atlas) |
| 1006 | if (!gui_initialized_) { |
| 1007 | LOG_TIMER("startup.gui_manager.init"); |
| 1008 | gui_manager_->init(); |
| 1009 | gui_initialized_ = true; |
| 1010 | } |
| 1011 | |
| 1012 | // InputController requires ImGui to be initialized |
| 1013 | if (!input_controller_) { |
| 1014 | input_controller_ = std::make_unique<InputController>( |
| 1015 | window_manager_->getWindow(), viewport_); |
| 1016 | input_controller_->initialize(); |
| 1017 | window_manager_->setInputController(input_controller_.get()); |
| 1018 | python::set_keymap_bindings(&input_controller_->getBindings()); |
| 1019 | callback_cleanup_.add([] { python::set_keymap_bindings(nullptr); }); |
| 1020 | } |
| 1021 | |
| 1022 | // Initialize tools AFTER rendering is initialized |
| 1023 | if (!tools_initialized_) { |
| 1024 | initializeTools(); |
| 1025 | } |
| 1026 | |
| 1027 | setupViewContextBridge(); |
| 1028 | |
| 1029 | if (scene_manager_) |
no test coverage detected