SurfaceCtrl: Adding click and drag

git-svn-id: svn://ultimatepp.org/upp/trunk@14822 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
xemuth 2020-08-14 15:26:34 +00:00
parent 1c4ac02bba
commit 02cb43b94f
2 changed files with 40 additions and 18 deletions

View file

@ -5,7 +5,8 @@
namespace Upp{
class MagicCamera : public UOGL_Camera{
private:
Array<Object3D>* allObjects = nullptr;
Upp::Array<Object3D>* allObjects = nullptr;
Upp::Vector<Object3D*>* 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<Object3D>& all){allObjects = &all;return *this;}
MagicCamera& SetAllSelected(Upp::Vector<Object3D*>& 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<Object3D*>& 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<Object3D*>& 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;
}

View file

@ -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);