diff --git a/editor/editor.c b/editor/editor.c index e9a1d947..d6cf18d7 100644 --- a/editor/editor.c +++ b/editor/editor.c @@ -52,7 +52,7 @@ Index of this file: typedef struct _plAppData plAppData; static void pl_show_ecs_window(plAppData*, bool* pbShowWindow); -static void pl_render_translation_gizmo(plDrawList3D*, const plVec3* ptCenter, const plVec3* ptCameraPos); +static void pl_render_translation_gizmo(plDrawList3D*, const plVec3* ptCenter, const plCameraComponent* ptCamera); static void pl_render_rotation_gizmo(plDrawList3D*, const plVec3* ptCenter, const plVec3* ptCameraPos); static void pl_render_scale_gizmo(plDrawList3D*, const plVec3* ptCenter, const plVec3* ptCameraPos); @@ -387,6 +387,34 @@ pl_app_update(plAppData* ptAppData) pl_show_ecs_window(ptAppData, &ptAppData->bShowEntityWindow); } + { + static bool bSelected = false; + + static plVec3 tInitialPos = {0}; + static plVec3 tFinalPos = {0}; + + bool bOwnMouse = gptIO->get_io()->bWantCaptureMouse; + if(!bOwnMouse && gptIO->is_mouse_clicked(PL_MOUSE_BUTTON_LEFT, false)) + { + plVec2 tMousePos = gptIO->get_mouse_pos(); + + plMat4 tBlah = pl_mul_mat4(&ptCamera->tProjMat, &ptCamera->tViewMat); + tBlah = pl_mat4_invert(&tBlah); + + plVec4 tNDC = {-1.0f + 2.0f * tMousePos.x / gptIO->get_io()->afMainViewportSize[0], -1.0f + 2.0f * tMousePos.y / gptIO->get_io()->afMainViewportSize[1], 1.0f, 1.0f}; + tNDC = pl_mul_mat4_vec4(&tBlah, tNDC); + tNDC = pl_div_vec4_scalarf(tNDC, tNDC.w); + tFinalPos = tNDC.xyz; + tInitialPos = ptCamera->tPos; + bSelected = true; + } + + if(bSelected) + { + gptDraw->add_3d_line(gptRenderer->get_debug_drawlist(ptAppData->uSceneHandle0, ptAppData->uViewHandle0), tInitialPos, tFinalPos, (plVec4){1.0f, 1.0f, 0.0f, 1.0f}, 0.02f); + } + } + if(ptAppData->tSelectedEntity.uIndex != UINT32_MAX) { plObjectComponent* ptSelectedObject = gptEcs->get_component(ptMainComponentLibrary, PL_COMPONENT_TYPE_OBJECT, ptAppData->tSelectedEntity); @@ -397,7 +425,7 @@ pl_app_update(plAppData* ptAppData) { plDrawList3D* ptGizmoDrawlist = gptRenderer->get_gizmo_drawlist(ptAppData->uSceneHandle0, ptAppData->uViewHandle0); if(ptAppData->tSelectionMode == PL_SELECTION_MODE_TRANSLATION) - pl_render_translation_gizmo(ptGizmoDrawlist, &ptSelectedTransform->tWorld.col[3].xyz, &ptCamera->tPos); + pl_render_translation_gizmo(ptGizmoDrawlist, &ptSelectedTransform->tWorld.col[3].xyz, ptCamera); else if(ptAppData->tSelectionMode == PL_SELECTION_MODE_ROTATION) pl_render_rotation_gizmo(ptGizmoDrawlist, &ptSelectedTransform->tWorld.col[3].xyz, &ptCamera->tPos); else if(ptAppData->tSelectionMode == PL_SELECTION_MODE_SCALE) @@ -507,6 +535,7 @@ pl_app_update(plAppData* ptAppData) // add full screen quad for offscreen render gptDraw->add_image(ptAppData->ptDrawLayer, gptRenderer->get_view_color_texture(ptAppData->uSceneHandle0, ptAppData->uViewHandle0), (plVec2){0}, (plVec2){ptIO->afMainViewportSize[0], ptIO->afMainViewportSize[1]}); + gptDraw->submit_2d_layer(ptAppData->ptDrawLayer); gptRenderer->end_frame(); @@ -520,9 +549,9 @@ pl_app_update(plAppData* ptAppData) //----------------------------------------------------------------------------- static void -pl_render_translation_gizmo(plDrawList3D* ptDrawlist, const plVec3* ptCenter, const plVec3* ptCameraPos) +pl_render_translation_gizmo(plDrawList3D* ptDrawlist, const plVec3* ptCenter, const plCameraComponent* ptCamera) { - const float fScale = pl_length_vec3(pl_sub_vec3(*ptCenter, *ptCameraPos)); + const float fScale = pl_length_vec3(pl_sub_vec3(*ptCenter, ptCamera->tPos)); const float fAxisRadius = 0.0035f * fScale; const float fArrowRadius = 0.0075f * fScale; const float fArrowLength = 0.03f * fScale;