| 376 | } |
| 377 | |
| 378 | void Camera::move_to(const float x, const float y) { |
| 379 | const auto stage = game_object_ref().get_stage(); |
| 380 | if (!stage.has_value()) { |
| 381 | return; |
| 382 | } |
| 383 | const auto buffer_obj = stage->get().get_game_object("buffer"); |
| 384 | if (!buffer_obj.has_value()) { |
| 385 | return; |
| 386 | } |
| 387 | |
| 388 | const auto buff_opt = |
| 389 | buffer_obj->get().get_component<Buffer>("buffer_component"); |
| 390 | if (!buff_opt.has_value()) { |
| 391 | return; |
| 392 | } |
| 393 | const auto& buff = buff_opt->get(); |
| 394 | const auto buf_dim = |
| 395 | vec4(buff.buffer_width_f, buff.buffer_height_f, 0.0f, 1.0f); |
| 396 | const auto centered_coord = buf_dim * 0.5f - vec4(x, y, 0.0f, 0.0f); |
| 397 | |
| 398 | // Recompute zoom matrix to discard its internal translation |
| 399 | const auto zoom{1.0f / compute_zoom()}; |
| 400 | scale_ = mat4::scale(vec4(zoom, zoom, 1.0f, 1.0f)); |
| 401 | |
| 402 | const auto transformed_goal = |
| 403 | scale_.inv() * buffer_obj->get().get_pose() * centered_coord; |
| 404 | |
| 405 | camera_pos_x_ = transformed_goal.x(); |
| 406 | camera_pos_y_ = transformed_goal.y(); |
| 407 | |
| 408 | update_object_pose(); |
| 409 | } |
| 410 | |
| 411 | vec4 Camera::get_position() const { |
| 412 | const auto stage = game_object_ref().get_stage(); |
no test coverage detected