From 5776514e6a0943c9151d2676fa9e29ac1fa7486f Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 14:48:01 -0700 Subject: [PATCH 1/6] Working on pushing the mirror camera back to prevent intersecting the near clip plane. Closes #2617. --- interface/src/Application.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6bc8bb62df..db75034e7f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -528,6 +528,16 @@ void Application::paintGL() { _myCamera.setDistance(MIRROR_FULLSCREEN_DISTANCE * _myAvatar->getScale()); _myCamera.setTargetPosition(_myAvatar->getPosition() + glm::vec3(0, headHeight, 0)); _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI, 0.0f))); + + // if the head would intersect the near clip plane, we must push the camera out + glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * + (_myAvatar->getHead()->getPosition() - _myCamera.getTargetPosition()); + const float HEAD_RADIUS = 0.1f; + float pushback = relativePosition.z + _myCamera.getNearClip() + HEAD_RADIUS; + if (pushback > 0.0f) { + _myCamera.setTargetPosition(_myCamera.getTargetPosition() + + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); + } } // Update camera position From add7bb26ed4d731d8167b3c6eed21a358c4c8166 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 14:55:46 -0700 Subject: [PATCH 2/6] Use the head height to determine the pushback amount. --- interface/src/Application.cpp | 4 ++-- interface/src/avatar/Avatar.cpp | 10 +++++----- interface/src/avatar/Avatar.h | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index db75034e7f..0b702c98a0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -532,8 +532,8 @@ void Application::paintGL() { // if the head would intersect the near clip plane, we must push the camera out glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * (_myAvatar->getHead()->getPosition() - _myCamera.getTargetPosition()); - const float HEAD_RADIUS = 0.1f; - float pushback = relativePosition.z + _myCamera.getNearClip() + HEAD_RADIUS; + const float HEAD_EXPANSION = 1.1f; + float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getHeadHeight() * HEAD_EXPANSION; if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 05f74755df..86378c6cdf 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -524,6 +524,11 @@ void Avatar::updateShapePositions() { headModel.updateShapePositions(); } +float Avatar::getHeadHeight() const { + Extents extents = getHead()->getFaceModel().getBindExtents(); + return extents.maximum.y - extents.minimum.y; +} + bool Avatar::findCollisions(const QVector& shapes, CollisionList& collisions) { // TODO: Andrew to fix: also collide against _skeleton //bool collided = _skeletonModel.findCollisions(shapes, collisions); @@ -750,11 +755,6 @@ float Avatar::getSkeletonHeight() const { return extents.maximum.y - extents.minimum.y; } -float Avatar::getHeadHeight() const { - Extents extents = getHead()->getFaceModel().getBindExtents(); - return extents.maximum.y - extents.minimum.y; -} - bool Avatar::collisionWouldMoveAvatar(CollisionInfo& collision) const { if (!collision._data || collision._type != MODEL_COLLISION) { return false; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index f57982b514..fca7173add 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -151,6 +151,8 @@ public: virtual float getBoundingRadius() const; void updateShapePositions(); + float getHeadHeight() const; + public slots: void updateCollisionFlags(); @@ -179,7 +181,6 @@ protected: void setScale(float scale); float getSkeletonHeight() const; - float getHeadHeight() const; float getPelvisFloatingHeight() const; float getPelvisToHeadLength() const; From faf8c353588b0e6fe238f34c8633fcf762414a35 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:01:56 -0700 Subject: [PATCH 3/6] Head height's kind of screwy; let's use the eye position. --- interface/src/Application.cpp | 9 +++++---- interface/src/avatar/Avatar.cpp | 10 +++++----- interface/src/avatar/Avatar.h | 3 +-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0b702c98a0..87cdaf8038 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -524,16 +524,17 @@ void Application::paintGL() { } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _myCamera.setTightness(0.0f); - float headHeight = _myAvatar->getHead()->calculateAverageEyePosition().y - _myAvatar->getPosition().y; + glm::vec3 eyePosition = _myAvatar->getHead()->calculateAverageEyePosition(); + float headHeight = eyePosition.y - _myAvatar->getPosition().y; _myCamera.setDistance(MIRROR_FULLSCREEN_DISTANCE * _myAvatar->getScale()); _myCamera.setTargetPosition(_myAvatar->getPosition() + glm::vec3(0, headHeight, 0)); _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI, 0.0f))); // if the head would intersect the near clip plane, we must push the camera out glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * - (_myAvatar->getHead()->getPosition() - _myCamera.getTargetPosition()); - const float HEAD_EXPANSION = 1.1f; - float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getHeadHeight() * HEAD_EXPANSION; + (eyePosition - _myCamera.getTargetPosition()); + const float PUSHBACK_RADIUS = 0.01f; + float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getScale() * PUSHBACK_RADIUS; if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 86378c6cdf..05f74755df 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -524,11 +524,6 @@ void Avatar::updateShapePositions() { headModel.updateShapePositions(); } -float Avatar::getHeadHeight() const { - Extents extents = getHead()->getFaceModel().getBindExtents(); - return extents.maximum.y - extents.minimum.y; -} - bool Avatar::findCollisions(const QVector& shapes, CollisionList& collisions) { // TODO: Andrew to fix: also collide against _skeleton //bool collided = _skeletonModel.findCollisions(shapes, collisions); @@ -755,6 +750,11 @@ float Avatar::getSkeletonHeight() const { return extents.maximum.y - extents.minimum.y; } +float Avatar::getHeadHeight() const { + Extents extents = getHead()->getFaceModel().getBindExtents(); + return extents.maximum.y - extents.minimum.y; +} + bool Avatar::collisionWouldMoveAvatar(CollisionInfo& collision) const { if (!collision._data || collision._type != MODEL_COLLISION) { return false; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index fca7173add..f57982b514 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -151,8 +151,6 @@ public: virtual float getBoundingRadius() const; void updateShapePositions(); - float getHeadHeight() const; - public slots: void updateCollisionFlags(); @@ -181,6 +179,7 @@ protected: void setScale(float scale); float getSkeletonHeight() const; + float getHeadHeight() const; float getPelvisFloatingHeight() const; float getPelvisToHeadLength() const; From 083e9076a96ff7e3f8276a24144ddf6a3b2803b3 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:17:05 -0700 Subject: [PATCH 4/6] Missed a spot. --- interface/src/Application.cpp | 3 ++- interface/src/Camera.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 87cdaf8038..a30ed648d8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -534,7 +534,8 @@ void Application::paintGL() { glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * (eyePosition - _myCamera.getTargetPosition()); const float PUSHBACK_RADIUS = 0.01f; - float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getScale() * PUSHBACK_RADIUS; + float pushback = relativePosition.z + _myCamera.getNearClip() + + _myAvatar->getScale() * PUSHBACK_RADIUS - _myCamera.getDistance(); if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 9973fd246e..3fd0efd50a 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -54,6 +54,7 @@ public: const glm::quat& getRotation() const { return _rotation; } CameraMode getMode() const { return _mode; } float getModeShiftPeriod() const { return _modeShiftPeriod; } + float getDistance() const { return _distance; } const glm::vec3& getTargetPosition() const { return _targetPosition; } const glm::quat& getTargetRotation() const { return _targetRotation; } float getFieldOfView() const { return _fieldOfView; } From 597d750af906117ca2cb71a1b8fb4675a5cad3d4 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:25:10 -0700 Subject: [PATCH 5/6] Better radius. --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a30ed648d8..45ae36a23b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -533,7 +533,7 @@ void Application::paintGL() { // if the head would intersect the near clip plane, we must push the camera out glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * (eyePosition - _myCamera.getTargetPosition()); - const float PUSHBACK_RADIUS = 0.01f; + const float PUSHBACK_RADIUS = 0.2f; float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getScale() * PUSHBACK_RADIUS - _myCamera.getDistance(); if (pushback > 0.0f) { From 94a7ded212fd1b3cf857ab9bc3cac56afae6ef33 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:36:21 -0700 Subject: [PATCH 6/6] Slip in a fix for Windows build warnings on mtc-generated code. --- tools/mtc/src/main.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/tools/mtc/src/main.cpp b/tools/mtc/src/main.cpp index 9c77851961..b7e2929d49 100644 --- a/tools/mtc/src/main.cpp +++ b/tools/mtc/src/main.cpp @@ -143,13 +143,15 @@ void generateOutput (QTextStream& out, const QList& streamables) { out << " }\n"; out << " index = nextIndex;\n"; } - out << " switch (index) {\n"; - for (int i = 0; i < str.fields.size(); i++) { - out << " case " << i << ":\n"; - out << " this->" << str.fields.at(i).name << " = value.value<" << str.fields.at(i).type << ">();\n"; - out << " break;\n"; + if (!str.fields.isEmpty()) { + out << " switch (index) {\n"; + for (int i = 0; i < str.fields.size(); i++) { + out << " case " << i << ":\n"; + out << " this->" << str.fields.at(i).name << " = value.value<" << str.fields.at(i).type << ">();\n"; + out << " break;\n"; + } + out << " }\n"; } - out << " }\n"; out << "}\n"; out << "QVariant " << name << "::getField(int index) const {\n"; @@ -162,12 +164,14 @@ void generateOutput (QTextStream& out, const QList& streamables) { out << " }\n"; out << " index = nextIndex;\n"; } - out << " switch (index) {\n"; - for (int i = 0; i < str.fields.size(); i++) { - out << " case " << i << ":\n"; - out << " return QVariant::fromValue(this->" << str.fields.at(i).name << ");\n"; + if (!str.fields.isEmpty()) { + out << " switch (index) {\n"; + for (int i = 0; i < str.fields.size(); i++) { + out << " case " << i << ":\n"; + out << " return QVariant::fromValue(this->" << str.fields.at(i).name << ");\n"; + } + out << " }\n"; } - out << " }\n"; out << " return QVariant();\n"; out << "}\n";