3232#include < Interface/Modules/Render/UndefiningX11Cruft.h>
3333#include < QtOpenGL/QGLWidget>
3434#include < glm/gtx/transform.hpp>
35+ #include < glm/gtx/vector_angle.hpp>
3536
3637#include < Interface/Modules/Render/ES/SRInterface.h>
3738#include < Interface/Modules/Render/ES/SRCamera.h>
6465#include " comp/StaticWorldLight.h"
6566#include " comp/LightingUniforms.h"
6667#include " comp/ClippingPlaneUniforms.h"
67-
6868using namespace SCIRun ;
6969using namespace SCIRun ::Core::Datatypes;
7070using namespace SCIRun ::Graphics::Datatypes;
@@ -579,7 +579,7 @@ namespace SCIRun {
579579 if (it != selMap.end ())
580580 {
581581 mSelected = it->second ;
582- mSelectedOrigin = originMap.find (value)->second ;
582+ mOriginWorld = originMap.find (value)->second ;
583583 }
584584 }
585585 // release and restore fbo
@@ -589,10 +589,30 @@ namespace SCIRun {
589589 if (mSelected != " " )
590590 {
591591 widgetSelected_ = true ;
592- glm::vec4 spos ((float (2 * pos.x ) - float (mScreenWidth )) / float (mScreenWidth ),
593- (float (mScreenHeight ) - float (2 * pos.y )) / float (mScreenHeight ),
594- depth * 2 - 1 , 1 .0f );
595- mSelectedPos = spos;
592+ float zFar = mCamera ->getZFar ();
593+ float zNear = mCamera ->getZNear ();
594+ float z = -1.0 /(depth * (1.0 /zFar - 1.0 /zNear) + 1.0 /zNear);
595+ mSelectedW = -z;
596+
597+ glm::vec2 spos (float (pos.x ) / float (mScreenWidth ) * 2.0 - 1.0 ,
598+ -(float (pos.y ) / float (mScreenHeight ) * 2.0 - 1.0 ));
599+
600+ glm::vec3 sposView = glm::vec3 (glm::inverse (mCamera ->getViewToProjection ()) * glm::vec4 (spos * mSelectedW , 0.0 , 1.0 ));
601+ sposView.z = z;
602+ glm::vec3 originView = glm::vec3 (mCamera ->getWorldToView () * glm::vec4 (mOriginWorld , 1.0 ));
603+ float radius = glm::length (sposView - originView);
604+
605+ // glm::vec4 originClip = mCamera->getWorldToProjection() * glm::vec4(mOriginWorld, 1.0);
606+ // glm::vec2 projectedSposView = glm::vec2(glm::inverse(mCamera->getViewToProjection()) * glm::vec4(spos * originClip.w, 0.0, 1.0));
607+
608+ std::cout << " spos: " << spos[0 ] << " " << spos[1 ] << " \n " ;
609+ // std::cout << "mOriginWorld: " << mOriginWorld[0] << " " << mOriginWorld[1] << " " << mOriginWorld[2] << "\n";
610+ std::cout << " sposView: " << sposView[0 ] << " " << sposView[1 ] << " " << sposView[2 ] << " \n " ;
611+ std::cout << " originView: " << originView[0 ] << " " << originView[1 ] << " " << originView[2 ] << " \n " ;
612+ std::cout << " radius: " << radius << " \n\n " ;
613+
614+ widgetBall.reset (new spire::ArcBall (originView, radius));
615+ widgetBall->beginDrag (glm::vec2 (sposView));
596616 }
597617
598618 for (auto & it : entityList)
@@ -644,36 +664,42 @@ namespace SCIRun {
644664 void SRInterface::updateWidget (const glm::ivec2& pos)
645665 {
646666 gen::StaticCamera* cam = mCore .getStaticComponent <gen::StaticCamera>();
647- glm::vec4 spos ((float (2 * pos.x ) - float (mScreenWidth )) / float (mScreenWidth ),
648- (float (mScreenHeight ) - float (2 * pos.y )) / float (mScreenHeight ),
649- mSelectedPos .z , 1 .0f );
667+ glm::vec2 spos (float (pos.x ) / float (mScreenWidth ) * 2.0 - 1.0 ,
668+ -(float (pos.y ) / float (mScreenHeight ) * 2.0 - 1.0 ));
650669
651- float ssDepth = mSelectedPos .z * 0.5 + 0.5 ;
652- float zFar = mCamera ->getZFar ();
653- float zNear = mCamera ->getZNear ();
654- float vDepth = 1.0 /(ssDepth * (1.0 /zFar - 1.0 /zNear) + 1.0 /zNear);
670+ glm::vec2 sposView = glm::vec2 (glm::inverse (mCamera ->getViewToProjection ()) * glm::vec4 (spos * mSelectedW , 0.0 , 1.0 ));
671+ widgetBall->drag (sposView);
655672
656- glm::vec3 transVec = glm::vec3 (spos - mSelectedPos ) * glm::vec3 (vDepth , vDepth, 1.0 );
657673 mWidgetTransform = gen::Transform ();
658- glm::vec3 transProjVec = glm::vec3 (glm::inverse (cam->data .projIV ) * glm::vec4 (transVec, 0 .0f )).xyz ();
659674
660675 spire::CerealHeap<gen::Transform>* contTrans = mCore .getOrCreateComponentContainer <gen::Transform>();
661676 std::pair<const gen::Transform*, size_t > component = contTrans->getComponent (mSelectedID );
662677
663678 // Translate origin to center
664- glm::vec3 newPos = -mSelectedOrigin ;
679+ glm::vec3 newPos = -mOriginWorld ;
665680 mWidgetTransform .setPosition (newPos);
666681
667682 // Rotate
668- glm::vec3 viewVec = (cam->data .getView () * glm::vec4 (0.0 , 0.0 , 1.0 , 0.0 )).xyz ();
669- glm::vec3 rotAxis = glm::cross (glm::normalize (viewVec), glm::normalize (transProjVec));
670- glm::mat4 rot = glm::rotate (glm::length (transProjVec), rotAxis);
671- mWidgetTransform .transform = rot * mWidgetTransform .transform ;
683+ // glm::vec3 viewVec = (cam->data.getView() * glm::vec4(0.0, 0.0, 1.0, 0.0)).xyz();
684+
685+ // glm::vec3 dirFromOrigin = glm::normalize(glm::vec3(mSelectedPos.xyz()) - mSelectedOrigin);
686+ // std::cout << "old dir: " << oldDir[0] << ", " << oldDir[1] << ", " << oldDir[2] << std::endl;
687+ // std::cout << "new dir: " << newDir[0] << ", " << newDir[1] << ", " << newDir[2] << std::endl;
688+ // std::cout << "angle: " << glm::angle(oldDir, newDir) << std::endl << std::endl;
689+
690+ // glm::vec3 rotAxis = glm::normalize(glm::cross(oldDir, newDir));
691+ // float ang = glm::angle(oldDir, newDir);
692+ // float rad = ang/180.0f * 3.14f;
693+
694+ // glm::mat4 rot = glm::rotate(rad, rotAxis);
695+
696+
697+ mWidgetTransform .transform = widgetBall->getTransformation () * mWidgetTransform .transform ;
672698
673699 // 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 ];
700+ mWidgetTransform .transform [3 ][0 ] += mOriginWorld [0 ];
701+ mWidgetTransform .transform [3 ][1 ] += mOriginWorld [1 ];
702+ mWidgetTransform .transform [3 ][2 ] += mOriginWorld [2 ];
677703
678704 if (component.first != nullptr )
679705 contTrans->modifyIndex (mWidgetTransform , component.second , 0 );
0 commit comments