| 191 | } |
| 192 | |
| 193 | void Stage::draw() { |
| 194 | auto ordered_components = std::set<Component*, CompareRenderOrder>{}; |
| 195 | |
| 196 | // TODO: use camera tags so I can have multiple cameras (useful for drawing |
| 197 | // GUI) |
| 198 | |
| 199 | const auto camera_it = all_game_objects.find("camera"); |
| 200 | if (camera_it == all_game_objects.end() || !camera_it->second) |
| 201 | [[unlikely]] { |
| 202 | std::cerr << "[Error] Camera game object not found" << std::endl; |
| 203 | return; |
| 204 | } |
| 205 | |
| 206 | const auto& [camera_name, camera_shared_ptr] = *camera_it; |
| 207 | const auto camera_obj = camera_shared_ptr.get(); |
| 208 | const auto camera_component_opt = |
| 209 | camera_obj->get_component<Camera>("camera_component"); |
| 210 | |
| 211 | if (!camera_component_opt.has_value()) [[unlikely]] { |
| 212 | std::cerr << "[Error] Camera component not found" << std::endl; |
| 213 | return; |
| 214 | } |
| 215 | |
| 216 | const auto& camera_component = camera_component_opt->get(); |
| 217 | const auto view_inv = camera_obj->get_pose().inv(); |
| 218 | |
| 219 | for (const auto& game_obj : all_game_objects | std::views::values) { |
| 220 | for (const auto& component : |
| 221 | game_obj->get_components() | std::views::values) { |
| 222 | ordered_components.insert(component.get()); |
| 223 | } |
| 224 | } |
| 225 | |
| 226 | for (const auto& component : ordered_components) { |
| 227 | component->draw(camera_component.projection(), view_inv); |
| 228 | } |
| 229 | } |
| 230 | |
| 231 | void Stage::scroll_callback(const float delta) const { |
| 232 | const auto camera_component_opt = get_camera_component(all_game_objects); |
no test coverage detected