| 299 | } |
| 300 | |
| 301 | void EditorSceneManager::moveEntity(float new_mouse_pos_x, |
| 302 | float new_mouse_pos_y, |
| 303 | float last_mouse_pos_x, |
| 304 | float last_mouse_pos_y, |
| 305 | Vector2 engine_window_pos, |
| 306 | Vector2 engine_window_size, |
| 307 | size_t cursor_on_axis, |
| 308 | Matrix4x4 model_matrix) |
| 309 | { |
| 310 | std::shared_ptr<GObject> selected_object = getSelectedGObject().lock(); |
| 311 | if (selected_object == nullptr) |
| 312 | return; |
| 313 | |
| 314 | float angularVelocity = |
| 315 | 18.0f / Math::max(engine_window_size.x, engine_window_size.y); // 18 degrees while moving full screen |
| 316 | Vector2 delta_mouse_move_uv = {(new_mouse_pos_x - last_mouse_pos_x), (new_mouse_pos_y - last_mouse_pos_y)}; |
| 317 | |
| 318 | Vector3 model_scale; |
| 319 | Quaternion model_rotation; |
| 320 | Vector3 model_translation; |
| 321 | model_matrix.decomposition(model_translation, model_scale, model_rotation); |
| 322 | |
| 323 | Matrix4x4 axis_model_matrix = Matrix4x4::IDENTITY; |
| 324 | axis_model_matrix.setTrans(model_translation); |
| 325 | |
| 326 | Matrix4x4 view_matrix = m_camera->getLookAtMatrix(); |
| 327 | Matrix4x4 proj_matrix = m_camera->getPersProjMatrix(); |
| 328 | |
| 329 | Vector4 model_world_position_4(model_translation, 1.f); |
| 330 | |
| 331 | Vector4 model_origin_clip_position = proj_matrix * view_matrix * model_world_position_4; |
| 332 | model_origin_clip_position /= model_origin_clip_position.w; |
| 333 | Vector2 model_origin_clip_uv = |
| 334 | Vector2((model_origin_clip_position.x + 1) / 2.0f, (model_origin_clip_position.y + 1) / 2.0f); |
| 335 | |
| 336 | Vector4 axis_x_local_position_4(1, 0, 0, 1); |
| 337 | if (m_axis_mode == EditorAxisMode::ScaleMode) |
| 338 | { |
| 339 | axis_x_local_position_4 = Matrix4x4(model_rotation) * axis_x_local_position_4; |
| 340 | } |
| 341 | Vector4 axis_x_world_position_4 = axis_model_matrix * axis_x_local_position_4; |
| 342 | axis_x_world_position_4.w = 1.0f; |
| 343 | Vector4 axis_x_clip_position = proj_matrix * view_matrix * axis_x_world_position_4; |
| 344 | axis_x_clip_position /= axis_x_clip_position.w; |
| 345 | Vector2 axis_x_clip_uv((axis_x_clip_position.x + 1) / 2.0f, (axis_x_clip_position.y + 1) / 2.0f); |
| 346 | Vector2 axis_x_direction_uv = axis_x_clip_uv - model_origin_clip_uv; |
| 347 | axis_x_direction_uv.normalise(); |
| 348 | |
| 349 | Vector4 axis_y_local_position_4(0, 1, 0, 1); |
| 350 | if (m_axis_mode == EditorAxisMode::ScaleMode) |
| 351 | { |
| 352 | axis_y_local_position_4 = Matrix4x4(model_rotation) * axis_y_local_position_4; |
| 353 | } |
| 354 | Vector4 axis_y_world_position_4 = axis_model_matrix * axis_y_local_position_4; |
| 355 | axis_y_world_position_4.w = 1.0f; |
| 356 | Vector4 axis_y_clip_position = proj_matrix * view_matrix * axis_y_world_position_4; |
| 357 | axis_y_clip_position /= axis_y_clip_position.w; |
| 358 | Vector2 axis_y_clip_uv((axis_y_clip_position.x + 1) / 2.0f, (axis_y_clip_position.y + 1) / 2.0f); |
no test coverage detected