From 152b376c02a683dea02bcbbec361e3cc89f5a7e3 Mon Sep 17 00:00:00 2001 From: andreja6 Date: Mon, 11 Nov 2019 14:05:17 -0800 Subject: [PATCH] Multiselection and Models --- Application.cpp | 37 ++++++++++++++++----- GUDButtonListener.cpp | 36 ++++++++++++++++++++ GroupInstance.cpp | 14 ++++++++ GroupInstance.h | 1 + GuiRoot.cpp | 3 +- PartInstance.cpp | 77 +++++++++++++++++++++---------------------- 6 files changed, 119 insertions(+), 49 deletions(-) diff --git a/Application.cpp b/Application.cpp index 5948f9e..a2a50c6 100644 --- a/Application.cpp +++ b/Application.cpp @@ -711,13 +711,14 @@ void Application::onMouseLeftPressed(HWND hwnd,int x,int y) //Removed set focus - std::cout << "Click: " << x << "," << y << std::endl; + //std::cout << "Click: " << x << "," << y << std::endl; bool onGUI = _dataModel->getGuiRoot()->mouseInGUI(renderDevice, x, y); if(!onGUI) { + Instance * selectedInstance = NULL; testRay = cameraController.getCamera()->worldRay(_dataModel->mousex, _dataModel->mousey, renderDevice->getViewport()); float nearest=std::numeric_limits::infinity(); Vector3 camPos = cameraController.getCamera()->getCoordinateFrame().translation; @@ -735,8 +736,9 @@ void Application::onMouseLeftPressed(HWND hwnd,int x,int y) if (nearest>time) { nearest=time; - bool found = false; - for(size_t i = 0; i < g_selectedInstances.size(); i++) + //bool found = false; + selectedInstance = test; + /*for(size_t i = 0; i < g_selectedInstances.size(); i++) { if(g_selectedInstances.at(i) == test) { @@ -749,26 +751,43 @@ void Application::onMouseLeftPressed(HWND hwnd,int x,int y) } if(!found) { - g_selectedInstances.clear(); - g_selectedInstances.push_back(test); + selectedInstance = test; + //if(!GetHoldKeyState(VK_RCONTROL) && !GetHoldKeyState(VK_LCONTROL)) + //g_selectedInstances.clear(); + //if(std::find(g_selectedInstances.begin(), g_selectedInstances.end(),test)==g_selectedInstances.end()) + //g_selectedInstances.push_back(test); } - selectInstance(test, _propWindow); + //selectInstance(test, _propWindow); //_message = "Dragging = true."; //_messageTime = System::time(); - //_dragging = true; + //_dragging = true;*/ } } } } if(!objFound) selectInstance(_dataModel,_propWindow); + else + { + while(selectedInstance->getParent() != g_dataModel->getWorkspace()) + { + selectedInstance = selectedInstance->getParent(); + } + selectInstance(selectedInstance, _propWindow); + } } } void Application::selectInstance(Instance* selectedInstance, PropertyWindow* propWindow) { - g_selectedInstances.clear(); - g_selectedInstances.push_back(selectedInstance); + if(!GetHoldKeyState(VK_RCONTROL) && !GetHoldKeyState(VK_LCONTROL)) + { + printf("No control key hold \n"); + g_selectedInstances.clear(); + } + else printf("Control held\n"); + if(std::find(g_selectedInstances.begin(), g_selectedInstances.end(),selectedInstance)==g_selectedInstances.end()) + g_selectedInstances.push_back(selectedInstance); propWindow->UpdateSelected(selectedInstance); } diff --git a/GUDButtonListener.cpp b/GUDButtonListener.cpp index 1cf0424..d4711d1 100644 --- a/GUDButtonListener.cpp +++ b/GUDButtonListener.cpp @@ -36,5 +36,41 @@ void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) if(g_selectedInstances.size() > 0) g_usableApp->_propWindow->UpdateSelected(newinst.at(0)); } + else if(button->name == "Group") + { + GroupInstance * inst = new GroupInstance(); + for(size_t i = 0; i < g_selectedInstances.size(); i++) + { + if(g_selectedInstances.at(i)->canDelete) + { + g_selectedInstances.at(i)->setParent(inst); + } + /*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z)); + g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/ + } + inst->setParent(g_dataModel->getWorkspace()); + g_selectedInstances.clear(); + g_selectedInstances.push_back(inst); + if(g_selectedInstances.size() > 0) + g_usableApp->_propWindow->UpdateSelected(g_selectedInstances.at(0)); + } + else if(button->name == "UnGroup") + { + std::vector newinst; + for(size_t i = 0; i < g_selectedInstances.size(); i++) + { + if(g_selectedInstances.at(i)->canDelete) + { + if(GroupInstance* model = dynamic_cast(g_selectedInstances.at(i))) + newinst = model->unGroup(); + } + /*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z)); + g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/ + } + g_selectedInstances.clear(); + g_selectedInstances = newinst; + if(g_selectedInstances.size() > 0) + g_usableApp->_propWindow->UpdateSelected(newinst.at(0)); + } } } \ No newline at end of file diff --git a/GroupInstance.cpp b/GroupInstance.cpp index cd5f5a4..f6be69c 100644 --- a/GroupInstance.cpp +++ b/GroupInstance.cpp @@ -3,6 +3,7 @@ GroupInstance::GroupInstance(void) { PVInstance::PVInstance(); + name = "Model"; className = "GroupInstance"; listicon = 12; } @@ -10,6 +11,8 @@ GroupInstance::GroupInstance(void) GroupInstance::GroupInstance(const GroupInstance &oinst) { PVInstance::PVInstance(oinst); + name = "Model"; + className = "GroupInstance"; listicon = 12; } @@ -26,3 +29,14 @@ void GroupInstance::PropUpdate(LPPROPGRIDITEM &pItem) { PVInstance::PropUpdate(pItem); } + +std::vector GroupInstance::unGroup() +{ + std::vector child; + while(children.size() > 0) + { + child.push_back(children[0]); + children[0]->setParent(parent); + } + return child; +} \ No newline at end of file diff --git a/GroupInstance.h b/GroupInstance.h index 98d63e3..40d870d 100644 --- a/GroupInstance.h +++ b/GroupInstance.h @@ -10,4 +10,5 @@ public: GroupInstance(const GroupInstance &oinst); virtual std::vector getProperties(); virtual void PropUpdate(LPPROPGRIDITEM &pItem); + std::vector unGroup(); }; diff --git a/GuiRoot.cpp b/GuiRoot.cpp index 02036c6..6e15dc2 100644 --- a/GuiRoot.cpp +++ b/GuiRoot.cpp @@ -176,7 +176,7 @@ GuiRoot::GuiRoot() : _message(""), _messageTime(0) button->font = g_fntlighttrek; button->fontLocationRelativeTo = Vector2(10, 0); button->setParent(this); - + button->setButtonListener(new GUDButtonListener()); button = makeTextButton(); button->boxBegin = Vector2(0,240); @@ -192,6 +192,7 @@ GuiRoot::GuiRoot() : _message(""), _messageTime(0) button->font = g_fntlighttrek; button->fontLocationRelativeTo = Vector2(10, 0); button->setParent(this); + button->setButtonListener(new GUDButtonListener()); button = makeTextButton(); button->boxBegin = Vector2(0,265); diff --git a/PartInstance.cpp b/PartInstance.cpp index a21f095..987f11e 100644 --- a/PartInstance.cpp +++ b/PartInstance.cpp @@ -479,66 +479,66 @@ void PartInstance::render(RenderDevice* rd) { } //*/ - int obv = _bevelSize; - _bevelSize = this->size.y / 3.14159F; + + float sphFace = this->size.y / 3.14159F; // Front - addSmoothTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,renderSize.z), - Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,renderSize.z), - Vector3(renderSize.x-_bevelSize,-renderSize.y+_bevelSize,renderSize.z) + addSmoothTriangle(Vector3(renderSize.x-sphFace,renderSize.y-sphFace,renderSize.z), + Vector3(-renderSize.x+sphFace,-renderSize.y+sphFace,renderSize.z), + Vector3(renderSize.x-sphFace,-renderSize.y+sphFace,renderSize.z) ); - addSmoothTriangle(Vector3(-renderSize.x+_bevelSize,renderSize.y-_bevelSize,renderSize.z), - Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,renderSize.z), - Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,renderSize.z) + addSmoothTriangle(Vector3(-renderSize.x+sphFace,renderSize.y-sphFace,renderSize.z), + Vector3(-renderSize.x+sphFace,-renderSize.y+sphFace,renderSize.z), + Vector3(renderSize.x-sphFace,renderSize.y-sphFace,renderSize.z) ); // Top - addSmoothTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y,renderSize.z-_bevelSize), - Vector3(renderSize.x-_bevelSize,renderSize.y,-renderSize.z+_bevelSize), - Vector3(-renderSize.x+_bevelSize,renderSize.y,renderSize.z-_bevelSize) + addSmoothTriangle(Vector3(renderSize.x-sphFace,renderSize.y,renderSize.z-sphFace), + Vector3(renderSize.x-sphFace,renderSize.y,-renderSize.z+sphFace), + Vector3(-renderSize.x+sphFace,renderSize.y,renderSize.z-sphFace) ); - addSmoothTriangle(Vector3(-renderSize.x+_bevelSize,renderSize.y,renderSize.z-_bevelSize), - Vector3(renderSize.x-_bevelSize,renderSize.y,-renderSize.z+_bevelSize), - Vector3(-renderSize.x+_bevelSize,renderSize.y,-renderSize.z+_bevelSize) + addSmoothTriangle(Vector3(-renderSize.x+sphFace,renderSize.y,renderSize.z-sphFace), + Vector3(renderSize.x-sphFace,renderSize.y,-renderSize.z+sphFace), + Vector3(-renderSize.x+sphFace,renderSize.y,-renderSize.z+sphFace) ); // Back - addSmoothTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,-renderSize.z), - Vector3(renderSize.x-_bevelSize,-renderSize.y+_bevelSize,-renderSize.z), - Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,-renderSize.z) + addSmoothTriangle(Vector3(renderSize.x-sphFace,renderSize.y-sphFace,-renderSize.z), + Vector3(renderSize.x-sphFace,-renderSize.y+sphFace,-renderSize.z), + Vector3(-renderSize.x+sphFace,-renderSize.y+sphFace,-renderSize.z) ); - addSmoothTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,-renderSize.z), - Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,-renderSize.z), - Vector3(-renderSize.x+_bevelSize,renderSize.y-_bevelSize,-renderSize.z) + addSmoothTriangle(Vector3(renderSize.x-sphFace,renderSize.y-sphFace,-renderSize.z), + Vector3(-renderSize.x+sphFace,-renderSize.y+sphFace,-renderSize.z), + Vector3(-renderSize.x+sphFace,renderSize.y-sphFace,-renderSize.z) ); // Bottom - addSmoothTriangle(Vector3(renderSize.x-_bevelSize,-renderSize.y,-renderSize.z+_bevelSize), - Vector3(renderSize.x-_bevelSize,-renderSize.y,renderSize.z-_bevelSize), - Vector3(-renderSize.x+_bevelSize,-renderSize.y,renderSize.z-_bevelSize) + addSmoothTriangle(Vector3(renderSize.x-sphFace,-renderSize.y,-renderSize.z+sphFace), + Vector3(renderSize.x-sphFace,-renderSize.y,renderSize.z-sphFace), + Vector3(-renderSize.x+sphFace,-renderSize.y,renderSize.z-sphFace) ); - addSmoothTriangle(Vector3(-renderSize.x+_bevelSize,-renderSize.y,renderSize.z-_bevelSize), - Vector3(-renderSize.x+_bevelSize,-renderSize.y,-renderSize.z+_bevelSize), - Vector3(renderSize.x-_bevelSize,-renderSize.y,-renderSize.z+_bevelSize) + addSmoothTriangle(Vector3(-renderSize.x+sphFace,-renderSize.y,renderSize.z-sphFace), + Vector3(-renderSize.x+sphFace,-renderSize.y,-renderSize.z+sphFace), + Vector3(renderSize.x-sphFace,-renderSize.y,-renderSize.z+sphFace) ); // Left - addSmoothTriangle(Vector3(-renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize), - Vector3(-renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize), - Vector3(-renderSize.x,renderSize.y-_bevelSize,renderSize.z-_bevelSize) + addSmoothTriangle(Vector3(-renderSize.x,renderSize.y-sphFace,-renderSize.z+sphFace), + Vector3(-renderSize.x,-renderSize.y+sphFace,renderSize.z-sphFace), + Vector3(-renderSize.x,renderSize.y-sphFace,renderSize.z-sphFace) ); - addSmoothTriangle(Vector3(-renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize), - Vector3(-renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize), - Vector3(-renderSize.x,-renderSize.y+_bevelSize,-renderSize.z+_bevelSize) + addSmoothTriangle(Vector3(-renderSize.x,-renderSize.y+sphFace,renderSize.z-sphFace), + Vector3(-renderSize.x,renderSize.y-sphFace,-renderSize.z+sphFace), + Vector3(-renderSize.x,-renderSize.y+sphFace,-renderSize.z+sphFace) ); // Right - addSmoothTriangle(Vector3(renderSize.x,renderSize.y-_bevelSize,renderSize.z-_bevelSize), - Vector3(renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize), - Vector3(renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize) + addSmoothTriangle(Vector3(renderSize.x,renderSize.y-sphFace,renderSize.z-sphFace), + Vector3(renderSize.x,-renderSize.y+sphFace,renderSize.z-sphFace), + Vector3(renderSize.x,renderSize.y-sphFace,-renderSize.z+sphFace) ); - addSmoothTriangle(Vector3(renderSize.x,-renderSize.y+_bevelSize,-renderSize.z+_bevelSize), - Vector3(renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize), - Vector3(renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize) + addSmoothTriangle(Vector3(renderSize.x,-renderSize.y+sphFace,-renderSize.z+sphFace), + Vector3(renderSize.x,renderSize.y-sphFace,-renderSize.z+sphFace), + Vector3(renderSize.x,-renderSize.y+sphFace,renderSize.z-sphFace) ); @@ -594,7 +594,6 @@ void PartInstance::render(RenderDevice* rd) { makeSmoothFace(84,174,144); // Back Left Bottom Corner makeSmoothFace(174,84,132); - _bevelSize = obv;//*/ for (unsigned short i=0;i<_vertices.size()/6;i++) { _indices.push_back(i); }