From 02cb43b94ff40ef740aaa33930a3612919e119d2 Mon Sep 17 00:00:00 2001 From: xemuth Date: Fri, 14 Aug 2020 15:26:34 +0000 Subject: [PATCH] SurfaceCtrl: Adding click and drag git-svn-id: svn://ultimatepp.org/upp/trunk@14822 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- bazaar/SurfaceCtrl/MagicCamera.h | 45 ++++++++++++++++++++++-------- bazaar/SurfaceCtrl/SurfaceCtrl.cpp | 13 +++++---- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/bazaar/SurfaceCtrl/MagicCamera.h b/bazaar/SurfaceCtrl/MagicCamera.h index e75eb141d..8e2156c2c 100644 --- a/bazaar/SurfaceCtrl/MagicCamera.h +++ b/bazaar/SurfaceCtrl/MagicCamera.h @@ -5,7 +5,8 @@ namespace Upp{ class MagicCamera : public UOGL_Camera{ private: - Array* allObjects = nullptr; + Upp::Array* allObjects = nullptr; + Upp::Vector* Selected = nullptr; glm::vec3 focus; @@ -48,6 +49,7 @@ namespace Upp{ MagicCamera& Init(){transform.SetPosition(0, 10, 20); focus = glm::vec3(0.0f,0.0f,0.0f); return *this;} MagicCamera& SetAllObjects(Array& all){allObjects = &all;return *this;} + MagicCamera& SetAllSelected(Upp::Vector& selected){Selected = &selected; return *this;} glm::mat4 GetProjectionMatrix(){ if(type == CT_PERSPECTIVE){ @@ -127,9 +129,25 @@ namespace Upp{ return obj; } + virtual MagicCamera& ProcessMouseMouveLeftClick(float xoffset, float yoffset){ + if(Selected){ + glm::vec3 y = transform.GetUp() * ((yoffset * -1.0f) * MouvementSpeed); + glm::vec3 x = transform.GetRight() * (xoffset * MouvementSpeed); + + for(Object3D* obj : *(Selected)){ + if(obj){ + obj->GetTransform().Move(x + y); + } + } + CenterFocus(); + } + return *this; + } + virtual MagicCamera& ProcessMouveMouvement(float xoffset, float yoffset){ if(MouseMiddlePressed && !ShiftPressed ) return ProcessMouseWheelMouvement(xoffset,yoffset); if(MouseMiddlePressed && ShiftPressed ) return ProcessMouseWheelTranslation(xoffset,yoffset); + if(MouseLeftPressed) return ProcessMouseMouveLeftClick(xoffset,yoffset); return *this; } @@ -175,19 +193,22 @@ namespace Upp{ glm::vec3 GetFocus(){return focus;} MagicCamera& ResetFocus(){focus = glm::vec3(0,0,0); return *this;} - MagicCamera& CenterFocus(const Vector& selectedObj){ - if(selectedObj.GetCount() > 0){ - glm::vec3 center = selectedObj[0]->GetBoundingBoxTransformed().GetCenter(); // The crash is occuring here, During copy operator, - //the Append function on vector make things crash - if(selectedObj.GetCount() > 1){ - for(int e = 1; e < selectedObj.GetCount(); e++){ - glm::vec3 center2 = selectedObj[e]->GetBoundingBoxTransformed().GetCenter(); - center = glm::lerp(center,center2,0.5f); + MagicCamera& CenterFocus(){ + if(Selected){ + Upp::Vector& selectedObj = *(Selected); + if(selectedObj.GetCount() > 0){ + glm::vec3 center = selectedObj[0]->GetBoundingBoxTransformed().GetCenter(); // The crash is occuring here, During copy operator, + //the Append function on vector make things crash + if(selectedObj.GetCount() > 1){ + for(int e = 1; e < selectedObj.GetCount(); e++){ + glm::vec3 center2 = selectedObj[e]->GetBoundingBoxTransformed().GetCenter(); + center = glm::lerp(center,center2,0.5f); + } } + focus = center; + }else{ + focus = glm::vec3(0.0f,0.0f,0.0f); } - focus = center; - }else{ - focus = glm::vec3(0.0f,0.0f,0.0f); } return *this; } diff --git a/bazaar/SurfaceCtrl/SurfaceCtrl.cpp b/bazaar/SurfaceCtrl/SurfaceCtrl.cpp index def2cb5a9..60dbe3199 100644 --- a/bazaar/SurfaceCtrl/SurfaceCtrl.cpp +++ b/bazaar/SurfaceCtrl/SurfaceCtrl.cpp @@ -108,6 +108,7 @@ void SurfaceCtrl::InitCamera()noexcept{ camera.SetMouseSensitivity(0.2f); camera.SetMouvementSpeed(0.09f); camera.SetAllObjects(allObjects); + camera.SetAllSelected(SelectedObject); } void SurfaceCtrl::GLResize(int w, int h){ sizeW = w; @@ -120,22 +121,22 @@ bool SurfaceCtrl::Key(dword key,int count){ if( key == K_Z){ for(Object3D* obj : SelectedObject) obj->GetTransform().Move(camera.GetTransform().GetUp()); - camera.CenterFocus(SelectedObject); + camera.CenterFocus(); } if( key == K_S){ for(Object3D* obj : SelectedObject) obj->GetTransform().Move(-(camera.GetTransform().GetUp())); - camera.CenterFocus(SelectedObject); + camera.CenterFocus(); } if( key == K_Q){ for(Object3D* obj : SelectedObject) obj->GetTransform().Move(-(camera.GetTransform().GetRight())); - camera.CenterFocus(SelectedObject); + camera.CenterFocus(); } if( key == K_D){ for(Object3D* obj : SelectedObject) obj->GetTransform().Move(camera.GetTransform().GetRight()); - camera.CenterFocus(SelectedObject); + camera.CenterFocus(); } if( key == K_R){ /* float data[] = { 230.0f/255.0f, 140.0f/255.0f, 30.0f/255.0f}; @@ -240,7 +241,7 @@ bool SurfaceCtrl::Key(dword key,int count){ return true; } void SurfaceCtrl::MouseMove(Point p, dword keyflags){ - if(camera.MouseMiddlePressed || camera.MouseLeftPressed){ + if(camera.MouseMiddlePressed || camera.MouseLeftPressed ){ camera.ProcessMouveMouvement(p.x - camera.lastPress.x,p.y - camera.lastPress.y); Refresh(); } @@ -272,7 +273,7 @@ void SurfaceCtrl::LeftDown(Point p, dword){ obj->ShowBoundingBox(true); SelectedObject.Add(obj); } - camera.CenterFocus(SelectedObject); + camera.CenterFocus(); }else{ for(Object3D* obj : SelectedObject){ obj->ShowBoundingBox(false);