diff --git a/examples/flockingBirds.js b/examples/flockingBirds.js index 17c60d88aa..3fa8681abe 100644 --- a/examples/flockingBirds.js +++ b/examples/flockingBirds.js @@ -51,7 +51,7 @@ var flockGravity = { x: 0, y: -1, z: 0}; var enableRandomXZThrust = false; // leading birds randomly decide to thrust in some random direction. var enableSomeBirdsLead = false; // birds randomly decide not fly toward flock, causing other birds to follow var leaders = 0; // number of birds leading -var PROBABILITY_TO_LEAD = 0.1; // probabolity a bird will choose to lead +var PROBABILITY_TO_LEAD = 0.1; // probability a bird will choose to lead var birds = new Array(); // array of bird state data diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5f9a57f52b..512dfd0c6d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1007,6 +1007,12 @@ void Application::keyPressEvent(QKeyEvent* event) { case Qt::Key_At: Menu::getInstance()->goTo(); break; + case Qt::Key_B: + _applicationOverlay.setOculusAngle(_applicationOverlay.getOculusAngle() - 1.0f*RADIANS_PER_DEGREE); + break; + case Qt::Key_N: + _applicationOverlay.setOculusAngle(_applicationOverlay.getOculusAngle() + 1.0f*RADIANS_PER_DEGREE); + break; default: event->ignore(); break; diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index c8b2d0dcbc..87ba066347 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -86,7 +86,7 @@ void OculusManager::display(Camera& whichCamera) { // We only need to render the overlays to a texture once, then we just render the texture as a quad // PrioVR will only work if renderOverlay is called, calibration is connected to Application::renderingOverlay() applicationOverlay.renderOverlay(true); - const bool displayOverlays = false; + const bool displayOverlays = true; Application::getInstance()->getGlowEffect()->prepare(); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 740b310ff2..b9ef81ef5e 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -19,7 +19,8 @@ #include "ui/Stats.h" -ApplicationOverlay::ApplicationOverlay() : _framebufferObject(NULL) { +ApplicationOverlay::ApplicationOverlay() : _framebufferObject(NULL), + _oculusAngle(65.0f * RADIANS_PER_DEGREE) { } @@ -271,14 +272,21 @@ void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) { MyAvatar* myAvatar = application->getAvatar(); const glm::vec3& viewMatrixTranslation = application->getViewMatrixTranslation(); - // Calculates the world space width and height of the texture based on a desired FOV - const float overlayFov = whichCamera.getFieldOfView() * PI / 180.0f; - const float overlayDistance = 1; + // Get vertical FoV of the displayed overlay texture + const float halfVerticalAngle = _oculusAngle / 2.0f; + const float overlayDistance = 1.0; const float overlayAspectRatio = glWidget->width() / (float)glWidget->height(); - const float overlayHeight = overlayDistance * tan(overlayFov); - const float overlayWidth = overlayHeight * overlayAspectRatio; - const float halfOverlayWidth = overlayWidth / 2; - const float halfOverlayHeight = overlayHeight / 2; + const float halfOverlayHeight = overlayDistance * tan(halfVerticalAngle); + + // The more vertices, the better the curve + const int numHorizontalVertices = 20; + // U texture coordinate width at each quad + const float quadTexWidth = 1.0f / (numHorizontalVertices - 1); + + // Get horizontal angle and angle increment from vertical angle and aspect ratio + const float horizontalAngle = halfVerticalAngle * 2.0f * overlayAspectRatio; + const float angleIncrement = horizontalAngle / (numHorizontalVertices - 1); + const float halfHorizontalAngle = horizontalAngle / 2; glActiveTexture(GL_TEXTURE0); @@ -305,16 +313,29 @@ void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) { glm::vec3 pos = whichCamera.getPosition(); glm::quat rot = myAvatar->getOrientation(); glm::vec3 axis = glm::axis(rot); - pos += rot * glm::vec3(0.0, 0.0, -overlayDistance); - + glTranslatef(pos.x, pos.y, pos.z); glRotatef(glm::degrees(glm::angle(rot)), axis.x, axis.y, axis.z); + + float leftX, rightX, leftZ, rightZ; glBegin(GL_QUADS); - glTexCoord2f(1, 0); glVertex3f(-halfOverlayWidth, halfOverlayHeight, 0); - glTexCoord2f(0, 0); glVertex3f(halfOverlayWidth, halfOverlayHeight, 0); - glTexCoord2f(0, 1); glVertex3f(halfOverlayWidth, -halfOverlayHeight, 0); - glTexCoord2f(1, 1); glVertex3f(-halfOverlayWidth, -halfOverlayHeight, 0); + + // Place the vertices in a semicircle curve around the camera + for (int i = 0; i < numHorizontalVertices-1; i++) { + + // Calculate the X and Z coordinates from the angles and radius from camera + leftX = sin(angleIncrement * i - halfHorizontalAngle) * overlayDistance; + rightX = sin(angleIncrement * (i + 1) - halfHorizontalAngle) * overlayDistance; + leftZ = -cos(angleIncrement * i - halfHorizontalAngle) * overlayDistance; + rightZ = -cos(angleIncrement * (i + 1) - halfHorizontalAngle) * overlayDistance; + + glTexCoord2f(quadTexWidth * i, 1); glVertex3f(leftX, halfOverlayHeight, leftZ); + glTexCoord2f(quadTexWidth * (i + 1), 1); glVertex3f(rightX, halfOverlayHeight, rightZ); + glTexCoord2f(quadTexWidth * (i + 1), 0); glVertex3f(rightX, -halfOverlayHeight, rightZ); + glTexCoord2f(quadTexWidth * i, 0); glVertex3f(leftX, -halfOverlayHeight, leftZ); + } + glEnd(); glPopMatrix(); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index cdc4065f45..bab2897daa 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -28,11 +28,16 @@ public: // Getters QOpenGLFramebufferObject* getFramebufferObject(); + float getOculusAngle() const { return _oculusAngle; } + + // Setters + void setOculusAngle(float oculusAngle) { _oculusAngle = oculusAngle; } private: QOpenGLFramebufferObject* _framebufferObject; float _trailingAudioLoudness; + float _oculusAngle; }; #endif // hifi_ApplicationOverlay_h \ No newline at end of file