3131#include < gl-platform/GLPlatform.hpp>
3232#include < Interface/Modules/Render/UndefiningX11Cruft.h>
3333#include < QtOpenGL/QGLWidget>
34+ #include < glm/gtx/transform.hpp>
3435
3536#include < Interface/Modules/Render/ES/SRInterface.h>
3637#include < Interface/Modules/Render/ES/SRCamera.h>
@@ -370,6 +371,7 @@ namespace SCIRun {
370371
371372 // a map from selection id to name
372373 std::map<uint32_t , std::string> selMap;
374+ std::map<uint32_t , glm::vec3> originMap;
373375 std::vector<uint64_t > entityList;
374376
375377 // modify and add each object to draw
@@ -378,6 +380,7 @@ namespace SCIRun {
378380 std::string objectName = obj->uniqueID ();
379381 uint32_t selid = getSelectIDForName (objectName);
380382 selMap.insert (std::make_pair (selid, objectName));
383+ originMap.insert (std::make_pair (selid, obj->origin ));
381384 glm::vec4 selCol = getVectorForID (selid);
382385
383386 // Add vertex buffer objects.
@@ -574,7 +577,10 @@ namespace SCIRun {
574577 {
575578 auto it = selMap.find (value);
576579 if (it != selMap.end ())
580+ {
577581 mSelected = it->second ;
582+ mSelectedOrigin = originMap.find (value)->second ;
583+ }
578584 }
579585 // release and restore fbo
580586 fboMan->unbindFBO ();
@@ -647,13 +653,28 @@ namespace SCIRun {
647653 float zNear = mCamera ->getZNear ();
648654 float vDepth = 1.0 /(ssDepth * (1.0 /zFar - 1.0 /zNear) + 1.0 /zNear);
649655
650- glm::vec4 transVec = glm::vec4 ( glm:: vec3 (spos - mSelectedPos ) * glm::vec3 (vDepth , vDepth, 1.0 ), 0 . 0f );
656+ glm::vec3 transVec = glm::vec3 (spos - mSelectedPos ) * glm::vec3 (vDepth , vDepth, 1.0 );
651657 mWidgetTransform = gen::Transform ();
652- mWidgetTransform . setPosition (( glm::inverse (cam->data .projIV ) * transVec) .xyz () );
658+ glm::vec3 transProjVec = glm::vec3 ( glm::inverse (cam->data .projIV ) * glm::vec4 ( transVec, 0 . 0f )) .xyz ();
653659
654660 spire::CerealHeap<gen::Transform>* contTrans = mCore .getOrCreateComponentContainer <gen::Transform>();
655661 std::pair<const gen::Transform*, size_t > component = contTrans->getComponent (mSelectedID );
656662
663+ // Translate origin to center
664+ glm::vec3 newPos = -mSelectedOrigin ;
665+ mWidgetTransform .setPosition (newPos);
666+
667+ // Rotate
668+ glm::vec3 viewVec = (cam->data .projIV * glm::vec4 (0.0 , 0.0 , 1.0 , 0.0 )).xyz ();
669+ glm::vec3 rotAxis = glm::cross (glm::normalize (viewVec), transVec);
670+ glm::mat4 rot = glm::rotate (glm::length (transVec), rotAxis);
671+ mWidgetTransform .transform = rot * mWidgetTransform .transform ;
672+
673+ // Translate back to world space
674+ mWidgetTransform .transform [3 ][0 ] += mSelectedOrigin [0 ];
675+ mWidgetTransform .transform [3 ][1 ] += mSelectedOrigin [1 ];
676+ mWidgetTransform .transform [3 ][2 ] += mSelectedOrigin [2 ];
677+
657678 if (component.first != nullptr )
658679 contTrans->modifyIndex (mWidgetTransform , component.second , 0 );
659680 }
0 commit comments