Skip to content

Commit 6501e02

Browse files
author
tpat
committed
Added selection logic for use with arcball
1 parent 16cc78e commit 6501e02

File tree

2 files changed

+55
-25
lines changed

2 files changed

+55
-25
lines changed

src/Interface/Modules/Render/ES/SRInterface.cc

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
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>
@@ -64,7 +65,6 @@
6465
#include "comp/StaticWorldLight.h"
6566
#include "comp/LightingUniforms.h"
6667
#include "comp/ClippingPlaneUniforms.h"
67-
6868
using namespace SCIRun;
6969
using namespace SCIRun::Core::Datatypes;
7070
using 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);

src/Interface/Modules/Render/ES/SRInterface.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <memory>
3434
#include <Interface/Modules/Render/GLContext.h>
3535
#include <Interface/Modules/Render/ES/Core.h>
36+
#include <Externals/spire/arc-ball/ArcBall.hpp>
3637
#include <es-general/comp/Transform.hpp>
3738

3839
//freetype
@@ -315,9 +316,10 @@ namespace SCIRun {
315316
MouseMode mMouseMode {MOUSE_OLDSCIRUN}; // Current mouse mode.
316317

317318
std::string mSelected {}; // Current selection
318-
glm::vec4 mSelectedPos {};
319-
glm::vec3 mSelectedOrigin {};
319+
glm::vec3 mOriginWorld {};
320+
float mSelectedW {};
320321
gen::Transform mWidgetTransform {};
322+
bool firstMovement {true};
321323

322324
size_t mScreenWidth {640}; // Screen width in pixels.
323325
size_t mScreenHeight {480}; // Screen height in pixels.
@@ -361,6 +363,8 @@ namespace SCIRun {
361363

362364
const int frameInitLimit_ {};
363365
std::unique_ptr<SRCamera> mCamera; // Primary camera.
366+
367+
std::shared_ptr<spire::ArcBall> widgetBall {};
364368
};
365369

366370
} // namespace Render

0 commit comments

Comments
 (0)