From d2d8bad241875eb96b25648aea3fb92c5dfa98f6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 7 Aug 2013 14:47:36 -0700 Subject: [PATCH 1/3] simplified frustum camera mode, fixed resizeGL in case of frustum being on --- interface/src/Application.cpp | 46 +++++++++++++++++++---------------- interface/src/Application.h | 1 + interface/src/Camera.cpp | 1 - 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 61317cc4dd..20d2065a75 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -439,7 +439,7 @@ void Application::paintGL() { // myCamera is. But we also want to do meaningful camera transforms on OpenGL for the offset camera Camera whichCamera = _myCamera; - if (_viewFrustumFromOffset->isChecked() && _frustumOn->isChecked()) { + if (_frustumOn->isChecked()) { // set the camera to third-person view but offset so we can see the frustum _viewFrustumOffsetCamera.setTargetPosition(_myCamera.getTargetPosition()); @@ -467,32 +467,42 @@ void Application::paintGL() { _frameCount++; } -void Application::resizeGL(int width, int height) { +void Application::resetCamerasOnResizeGL(Camera& camera, int width, int height) { float aspectRatio = ((float)width/(float)height); // based on screen resize // reset the camera FOV to our preference... - _myCamera.setFieldOfView(_horizontalFieldOfView); - - // get the lens details from the current camera - Camera& camera = _viewFrustumFromOffset->isChecked() ? _viewFrustumOffsetCamera : _myCamera; - float nearClip = camera.getNearClip(); - float farClip = camera.getFarClip(); - float fov; + camera.setFieldOfView(_horizontalFieldOfView); if (OculusManager::isConnected()) { // more magic numbers; see Oculus SDK docs, p. 32 camera.setAspectRatio(aspectRatio *= 0.5); - camera.setFieldOfView(fov = 2 * atan((0.0468 * _oculusDistortionScale) / 0.041) * (180 / PIf)); - + camera.setFieldOfView(2 * atan((0.0468 * _oculusDistortionScale) / 0.041) * (180 / PIf)); + } else { + camera.setAspectRatio(aspectRatio); + camera.setFieldOfView(_horizontalFieldOfView); + } +} + +void Application::resizeGL(int width, int height) { + + // tell both cameras about our new size + resetCamerasOnResizeGL(_myCamera, width, height); + resetCamerasOnResizeGL(_viewFrustumOffsetCamera, width, height); + + float aspectRatio = ((float)width/(float)height); // based on screen resize + + // get the lens details from the current camera + Camera& camera = _frustumOn->isChecked() ? _viewFrustumOffsetCamera : _myCamera; + float nearClip = camera.getNearClip(); + float farClip = camera.getFarClip(); + + if (OculusManager::isConnected()) { // resize the render texture if (_oculusTextureID != 0) { glBindTexture(GL_TEXTURE_2D, _oculusTextureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); } - } else { - camera.setAspectRatio(aspectRatio); - camera.setFieldOfView(fov = _horizontalFieldOfView); } // Tell our viewFrustum about this change @@ -819,11 +829,7 @@ void Application::keyPressEvent(QKeyEvent* event) { _colorVoxelMode->trigger(); break; case Qt::Key_O: - if (isShifted) { - _viewFrustumFromOffset->trigger(); - } else { - _selectVoxelMode->trigger(); - } + _selectVoxelMode->trigger(); break; case Qt::Key_Slash: _renderStatsOn->trigger(); @@ -2060,8 +2066,6 @@ void Application::initMenu() { QMenu* frustumMenu = debugMenu->addMenu("View Frustum Debugging Tools"); (_frustumOn = frustumMenu->addAction("Display Frustum"))->setCheckable(true); _frustumOn->setShortcut(Qt::SHIFT | Qt::Key_F); - (_viewFrustumFromOffset = frustumMenu->addAction( - "Use Offset Camera", this, SLOT(setFrustumOffset(bool)), Qt::SHIFT | Qt::Key_O))->setCheckable(true); _frustumRenderModeAction = frustumMenu->addAction( "Render Mode", this, SLOT(cycleFrustumRenderMode()), Qt::SHIFT | Qt::Key_R); updateFrustumRenderModeAction(); diff --git a/interface/src/Application.h b/interface/src/Application.h index d9c945f34e..8de73edeb5 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -211,6 +211,7 @@ private slots: void toggleFollowMode(); private: + void resetCamerasOnResizeGL(Camera& camera, int width, int height); static void controlledBroadcastToNodes(unsigned char* broadcastData, size_t dataBytes, const char* nodeTypes, int numNodeTypes); diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index a91dfdce6c..29449e63b5 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -38,7 +38,6 @@ Camera::Camera() { _mode = CAMERA_MODE_THIRD_PERSON; _tightness = 10.0f; // default _fieldOfView = HORIZONTAL_FIELD_OF_VIEW_DEGREES; - _aspectRatio = 16.f/9.f; _nearClip = 0.08f; // default _farClip = 50.0f * TREE_SCALE; // default _upShift = 0.0f; From f4820143d747e4530ac081b2bfdc689e3714b4e5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 7 Aug 2013 16:12:03 -0700 Subject: [PATCH 2/3] cleanup resizeGL, and Display Frustum menus --- interface/src/Application.cpp | 74 ++++++++++++++++------------------- interface/src/Application.h | 1 - 2 files changed, 33 insertions(+), 42 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8261ad9585..79776321bd 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -439,7 +439,7 @@ void Application::paintGL() { // myCamera is. But we also want to do meaningful camera transforms on OpenGL for the offset camera Camera whichCamera = _myCamera; - if (_viewFrustumFromOffset->isChecked() && _frustumOn->isChecked()) { + if (_frustumOn->isChecked()) { // set the camera to third-person view but offset so we can see the frustum _viewFrustumOffsetCamera.setTargetPosition(_myCamera.getTargetPosition()); @@ -467,56 +467,52 @@ void Application::paintGL() { _frameCount++; } -void Application::resizeGL(int width, int height) { +void Application::resetCamerasOnResizeGL(Camera& camera, int width, int height) { float aspectRatio = ((float)width/(float)height); // based on screen resize + + if (OculusManager::isConnected()) { + // more magic numbers; see Oculus SDK docs, p. 32 + camera.setAspectRatio(aspectRatio *= 0.5); + camera.setFieldOfView(2 * atan((0.0468 * _oculusDistortionScale) / 0.041) * (180 / PIf)); + } else { + camera.setAspectRatio(aspectRatio); + camera.setFieldOfView(_fieldOfView); + } +} + +void Application::resizeGL(int width, int height) { + resetCamerasOnResizeGL(_viewFrustumOffsetCamera, width, height); + resetCamerasOnResizeGL(_myCamera, width, height); // reset the camera FOV to our preference... _myCamera.setFieldOfView(_fieldOfView); - // get the lens details from the current camera - Camera& camera = _viewFrustumFromOffset->isChecked() ? _viewFrustumOffsetCamera : _myCamera; - float nearClip = camera.getNearClip(); - float farClip = camera.getFarClip(); - float fov; - - if (OculusManager::isConnected()) { - // more magic numbers; see Oculus SDK docs, p. 32 - camera.setAspectRatio(aspectRatio *= 0.5); - camera.setFieldOfView(fov = 2 * atan((0.0468 * _oculusDistortionScale) / 0.041) * (180 / PIf)); - - // resize the render texture - if (_oculusTextureID != 0) { - glBindTexture(GL_TEXTURE_2D, _oculusTextureID); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glBindTexture(GL_TEXTURE_2D, 0); - } - } else { - camera.setAspectRatio(aspectRatio); - camera.setFieldOfView(fov = _fieldOfView); + // resize the render texture + if (OculusManager::isConnected() && _oculusTextureID != 0) { + glBindTexture(GL_TEXTURE_2D, _oculusTextureID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); } - // Tell our viewFrustum about this change - _viewFrustum.setAspectRatio(aspectRatio); + // Tell our viewFrustum about this change, using the application camera + loadViewFrustum(_myCamera, _viewFrustum); glViewport(0, 0, width, height); // shouldn't this account for the menu??? glMatrixMode(GL_PROJECTION); glLoadIdentity(); - // XXXBHG - If we're in view frustum mode, then we need to do this little bit of hackery so that - // OpenGL won't clip our frustum rendering lines. This is a debug hack for sure! Basically, this makes - // the near clip a little bit closer (therefor you see more) and the far clip a little bit farther (also, - // to see more.) - if (_frustumOn->isChecked()) { - nearClip -= 0.01f; - farClip += 0.01f; - } - // On window reshape, we need to tell OpenGL about our new setting float left, right, bottom, top, nearVal, farVal; glm::vec4 nearClipPlane, farClipPlane; - loadViewFrustum(camera, _viewFrustum); _viewFrustum.computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + + // If we're in Display Frustum mode, then we want to use the slightly adjust near/far clip values of the + // _viewFrustumOffsetCamera, so that we can see more of the application content in the application's frustum + if (_frustumOn->isChecked()) { + nearVal = _viewFrustumOffsetCamera.getNearClip(); + farVal = _viewFrustumOffsetCamera.getFarClip(); + } glFrustum(left, right, bottom, top, nearVal, farVal); glMatrixMode(GL_MODELVIEW); @@ -819,11 +815,7 @@ void Application::keyPressEvent(QKeyEvent* event) { _colorVoxelMode->trigger(); break; case Qt::Key_O: - if (isShifted) { - _viewFrustumFromOffset->trigger(); - } else { - _selectVoxelMode->trigger(); - } + _selectVoxelMode->trigger(); break; case Qt::Key_Slash: _renderStatsOn->trigger(); @@ -2060,8 +2052,6 @@ void Application::initMenu() { QMenu* frustumMenu = debugMenu->addMenu("View Frustum Debugging Tools"); (_frustumOn = frustumMenu->addAction("Display Frustum"))->setCheckable(true); _frustumOn->setShortcut(Qt::SHIFT | Qt::Key_F); - (_viewFrustumFromOffset = frustumMenu->addAction( - "Use Offset Camera", this, SLOT(setFrustumOffset(bool)), Qt::SHIFT | Qt::Key_O))->setCheckable(true); _frustumRenderModeAction = frustumMenu->addAction( "Render Mode", this, SLOT(cycleFrustumRenderMode()), Qt::SHIFT | Qt::Key_R); updateFrustumRenderModeAction(); @@ -2776,6 +2766,7 @@ void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) { float fov = camera.getFieldOfView(); float nearClip = camera.getNearClip(); float farClip = camera.getFarClip(); + float aspectRatio = camera.getAspectRatio(); glm::quat rotation = camera.getRotation(); @@ -2784,6 +2775,7 @@ void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) { viewFrustum.setOrientation(rotation); // Also make sure it's got the correct lens details from the camera + viewFrustum.setAspectRatio(aspectRatio); viewFrustum.setFieldOfView(fov); viewFrustum.setNearClip(nearClip); viewFrustum.setFarClip(farClip); diff --git a/interface/src/Application.h b/interface/src/Application.h index c49050ba8c..2904437c16 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -308,7 +308,6 @@ private: QAction* _voxelPaintColor; // The color with which to paint voxels QAction* _destructiveAddVoxel; // when doing voxel editing do we want them to be destructive QAction* _frustumOn; // Whether or not to display the debug view frustum - QAction* _viewFrustumFromOffset; // Whether or not to offset the view of the frustum QAction* _fullScreenMode; // whether we are in full screen mode QAction* _frustumRenderModeAction; QAction* _settingsAutosave; // Whether settings are saved automatically From cb211fbb04b1487bcae4b574de95d0419fc5ad6c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 7 Aug 2013 16:27:43 -0700 Subject: [PATCH 3/3] CR feedback --- interface/src/Application.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 79776321bd..35fdec8e68 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -484,9 +484,6 @@ void Application::resizeGL(int width, int height) { resetCamerasOnResizeGL(_viewFrustumOffsetCamera, width, height); resetCamerasOnResizeGL(_myCamera, width, height); - // reset the camera FOV to our preference... - _myCamera.setFieldOfView(_fieldOfView); - // resize the render texture if (OculusManager::isConnected() && _oculusTextureID != 0) { glBindTexture(GL_TEXTURE_2D, _oculusTextureID);