From 5f514642305d1d7b617cca4b93aa753a32630270 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 17 Jul 2013 17:15:19 -0700 Subject: [PATCH 1/7] Start clicking on voxels makes sound --- interface/src/Application.cpp | 37 +++++++++++++++++++++++++++++++---- interface/src/Application.h | 6 +++++- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 582bc4fcb4..a87564cf2e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -197,6 +197,8 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _pitchFromTouch(0.0f), _groundPlaneImpact(0.0f), _mousePressed(false), + _isHoverVoxel(false), + _isHoverVoxelSounding(false), _mouseVoxelScale(1.0f / 1024.0f), _justEditedVoxel(false), _paintOn(false), @@ -848,6 +850,15 @@ void Application::mousePressEvent(QMouseEvent* event) { _mouseVoxelDragging = _mouseVoxel; _mousePressed = true; maybeEditVoxelUnderCursor(); + if (_isHoverVoxel && !_isHoverVoxelSounding) { + _hoverVoxelOriginalColor[0] = _hoverVoxel.red; + _hoverVoxelOriginalColor[1] = _hoverVoxel.green; + _hoverVoxelOriginalColor[2] = _hoverVoxel.blue; + _hoverVoxelOriginalColor[3] = 1; + _audio.startCollisionSound(1.0, 220, 0.0, 0.999f); + qDebug("s = %f\n", _hoverVoxel.s); + _isHoverVoxelSounding = true; + } } else if (event->button() == Qt::RightButton && checkedVoxelModeAction() != 0) { deleteVoxelUnderCursor(); @@ -1927,7 +1938,27 @@ void Application::update(float deltaTime) { glm::vec3 myLookAtFromMouse(mouseRayOrigin + mouseRayDirection); _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); } - + + // Find the voxel we are hovering over, and respond if clicked + float distance; + BoxFace face; + + // If we have clicked on a voxel, update it's color + if (_isHoverVoxelSounding) { + qDebug("clicking on voxel\n"); + VoxelNode* hoveredNode = _voxels.getVoxelAt(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s); + nodeColor clickColor = { 1, 0, 0, 1 }; + float bright = _audio.getCollisionSoundMagnitude(); + hoveredNode->setColor(clickColor); + if (bright < 0.01f) { + hoveredNode->setColor(_hoverVoxelOriginalColor); + _isHoverVoxelSounding = false; + } + } else { + // Check for a new hover voxel + _isHoverVoxel = _voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _hoverVoxel, distance, face); + } + // If we are dragging on a voxel, add thrust according to the amount the mouse is dragging const float VOXEL_GRAB_THRUST = 0.0f; if (_mousePressed && (_mouseVoxel.s != 0)) { @@ -1953,8 +1984,6 @@ void Application::update(float deltaTime) { (fabs(_myAvatar.getVelocity().x) + fabs(_myAvatar.getVelocity().y) + fabs(_myAvatar.getVelocity().z)) / 3 < MAX_AVATAR_EDIT_VELOCITY) { - float distance; - BoxFace face; if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) { if (distance < MAX_VOXEL_EDIT_DISTANCE) { // find the nearest voxel with the desired scale @@ -2140,7 +2169,7 @@ void Application::update(float deltaTime) { } void Application::updateAvatar(float deltaTime) { - + // When head is rotated via touch/mouse look, slowly turn body to follow const float BODY_FOLLOW_HEAD_RATE = 0.5f; // update body yaw by body yaw delta diff --git a/interface/src/Application.h b/interface/src/Application.h index 9333808a27..1f65ea7586 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -358,8 +358,12 @@ private: glm::vec3 _voxelThrust; bool _mousePressed; // true if mouse has been pressed (clear when finished) + VoxelDetail _hoverVoxel; // Stuff about the voxel I am hovering or clicking + bool _isHoverVoxel; + bool _isHoverVoxelSounding; + nodeColor _hoverVoxelOriginalColor; - VoxelDetail _mouseVoxel; // details of the voxel under the mouse cursor + VoxelDetail _mouseVoxel; // details of the voxel to be edited float _mouseVoxelScale; // the scale for adding/removing voxels glm::vec3 _lastMouseVoxelPos; // the position of the last mouse voxel edit bool _justEditedVoxel; // set when we've just added/deleted/colored a voxel From 0b101699152dc48f4a63b2b644bb78fb2fd2e9df Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 18 Jul 2013 11:13:16 -0700 Subject: [PATCH 2/7] More audio collision on hover experiments --- interface/src/Application.cpp | 18 ++++++++++++++---- interface/src/Head.cpp | 4 ++-- interface/src/Physics.cpp | 4 ++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2001ba5d71..0cff3f0966 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -855,8 +855,7 @@ void Application::mousePressEvent(QMouseEvent* event) { _hoverVoxelOriginalColor[1] = _hoverVoxel.green; _hoverVoxelOriginalColor[2] = _hoverVoxel.blue; _hoverVoxelOriginalColor[3] = 1; - _audio.startCollisionSound(1.0, 220, 0.0, 0.999f); - qDebug("s = %f\n", _hoverVoxel.s); + _audio.startCollisionSound(1.0, 14080 * _hoverVoxel.s * TREE_SCALE, 0.0, 0.999f); _isHoverVoxelSounding = true; } @@ -1945,10 +1944,11 @@ void Application::update(float deltaTime) { // If we have clicked on a voxel, update it's color if (_isHoverVoxelSounding) { - qDebug("clicking on voxel\n"); VoxelNode* hoveredNode = _voxels.getVoxelAt(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s); - nodeColor clickColor = { 1, 0, 0, 1 }; float bright = _audio.getCollisionSoundMagnitude(); + nodeColor clickColor = { 255 * bright + _hoverVoxelOriginalColor[0] * (1.f - bright), + _hoverVoxelOriginalColor[1] * (1.f - bright), + _hoverVoxelOriginalColor[2] * (1.f - bright), 1 }; hoveredNode->setColor(clickColor); if (bright < 0.01f) { hoveredNode->setColor(_hoverVoxelOriginalColor); @@ -1956,7 +1956,17 @@ void Application::update(float deltaTime) { } } else { // Check for a new hover voxel + glm::vec4 oldVoxel(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s); _isHoverVoxel = _voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _hoverVoxel, distance, face); + if (_isHoverVoxel && glm::vec4(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s) != oldVoxel) { + //qDebug("bing! x,y,z = %f,%f,%f\n", _hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z); + _hoverVoxelOriginalColor[0] = _hoverVoxel.red; + _hoverVoxelOriginalColor[1] = _hoverVoxel.green; + _hoverVoxelOriginalColor[2] = _hoverVoxel.blue; + _hoverVoxelOriginalColor[3] = 1; + _audio.startCollisionSound(1.0, 14080 * _hoverVoxel.s * TREE_SCALE, 0.0, 0.992f); + _isHoverVoxelSounding = true; + } } // If we are dragging on a voxel, add thrust according to the amount the mouse is dragging diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 84ae9fffe9..bd73753b70 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -227,8 +227,8 @@ void Head::simulate(float deltaTime, bool isMine) { const float CAMERA_FOLLOW_HEAD_RATE_MAX = 0.5f; const float CAMERA_FOLLOW_HEAD_RATE_RAMP_RATE = 1.05f; const float CAMERA_STOP_TOLERANCE_DEGREES = 0.1f; - const float CAMERA_PITCH_START_TOLERANCE_DEGREES = 10.0f; - const float CAMERA_YAW_START_TOLERANCE_DEGREES = 3.0f; + const float CAMERA_PITCH_START_TOLERANCE_DEGREES = 20.0f; + const float CAMERA_YAW_START_TOLERANCE_DEGREES = 10.0f; float cameraHeadAngleDifference = glm::length(glm::vec2(_pitch - _cameraPitch, _yaw - _cameraYaw)); if (_isCameraMoving) { _cameraFollowHeadRate = glm::clamp(_cameraFollowHeadRate * CAMERA_FOLLOW_HEAD_RATE_RAMP_RATE, diff --git a/interface/src/Physics.cpp b/interface/src/Physics.cpp index 31e64ccad3..101087b1ef 100644 --- a/interface/src/Physics.cpp +++ b/interface/src/Physics.cpp @@ -38,3 +38,7 @@ void applyDamping(float deltaTime, glm::vec3& velocity, float linearStrength, fl } } +void applyDampedSpring(float deltaTime, glm::vec3& velocity, glm::vec3& position, glm::vec3& targetPosition, float k, float damping) { + +} + From 4af92d46f30040288452003e2b3b82e55d618320 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 18 Jul 2013 16:50:37 -0700 Subject: [PATCH 3/7] Set lookAt to hovered voxel --- interface/src/Application.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0cff3f0966..0b4b36eda1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1933,7 +1933,12 @@ void Application::update(float deltaTime) { // If the mouse is over another avatar's head... glm::vec3 myLookAtFromMouse(eyePosition); _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); + } else if (_isHoverVoxel) { + // Look at the hovered voxel + glm::vec3 lookAtSpot = getMouseVoxelWorldCoordinates(_hoverVoxel); + _myAvatar.getHead().setLookAtPosition(lookAtSpot); } else { + // Just look in direction of the mouse ray glm::vec3 myLookAtFromMouse(mouseRayOrigin + mouseRayDirection); _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); } From bc1ac6b455fb131c4a1e8afbe7553c1ca083acce Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 1 Aug 2013 12:49:10 -0700 Subject: [PATCH 4/7] turn down collision sounds --- interface/src/Application.cpp | 9 ++++++--- interface/src/Application.h | 4 ---- interface/src/Util.cpp | 8 +++++++- interface/src/avatar/Avatar.cpp | 6 ------ 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b6c2187256..8add2325d9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -196,7 +196,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _isTouchPressed(false), _yawFromTouch(0.0f), _pitchFromTouch(0.0f), - _groundPlaneImpact(0.0f), _mousePressed(false), _isHoverVoxel(false), _isHoverVoxelSounding(false), @@ -2789,8 +2788,12 @@ void Application::displayOverlay() { glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); - // Display a single screen-size quad to - renderCollisionOverlay(_glWidget->width(), _glWidget->height(), _audio.getCollisionSoundMagnitude()); + // Display a single screen-size quad to create an alpha blended 'collision' flash + float collisionSoundMagnitude = _audio.getCollisionSoundMagnitude(); + const float VISIBLE_COLLISION_SOUND_MAGNITUDE = 0.5f; + if (collisionSoundMagnitude > VISIBLE_COLLISION_SOUND_MAGNITUDE) { + renderCollisionOverlay(_glWidget->width(), _glWidget->height(), _audio.getCollisionSoundMagnitude()); + } #ifndef _WIN32 _audio.render(_glWidget->width(), _glWidget->height()); diff --git a/interface/src/Application.h b/interface/src/Application.h index 9d3d508b72..8a4a3bf18d 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -109,8 +109,6 @@ public slots: void sendAvatarFaceVideoMessage(int frameCount, const QByteArray& data); - void setGroundPlaneImpact(float groundPlaneImpact) { _groundPlaneImpact = groundPlaneImpact; } - private slots: @@ -371,8 +369,6 @@ private: float _yawFromTouch; float _pitchFromTouch; - float _groundPlaneImpact; - VoxelDetail _mouseVoxelDragging; glm::vec3 _voxelThrust; bool _mousePressed; // true if mouse has been pressed (clear when finished) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 0f2c3a8955..1830a30014 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -339,6 +339,7 @@ void renderCollisionOverlay(int width, int height, float magnitude) { } void renderGroundPlaneGrid(float size, float impact) { + float IMPACT_SOUND_MAGNITUDE_FOR_RECOLOR = 0.3f; glLineWidth(2.0); glm::vec4 impactColor(1, 0, 0, 1); glm::vec3 lineColor(0.4, 0.5, 0.3); @@ -355,7 +356,12 @@ void renderGroundPlaneGrid(float size, float impact) { } // Draw the floor, colored for recent impact - glm::vec4 floorColor = impact * impactColor + (1.f - impact) * surfaceColor; + glm::vec4 floorColor; + if (impact > IMPACT_SOUND_MAGNITUDE_FOR_RECOLOR) { + floorColor = impact * impactColor + (1.f - impact) * surfaceColor; + } else { + floorColor = surfaceColor; + } glColor4fv(&floorColor.x); glBegin(GL_QUADS); glVertex3f(0, 0, 0); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 1af82083ae..626be35d1b 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -892,21 +892,15 @@ void Avatar::updateCollisionWithSphere(glm::vec3 position, float radius, float d } void Avatar::updateCollisionWithEnvironment(float deltaTime) { - glm::vec3 up = getBodyUpDirection(); float radius = _height * 0.125f; const float ENVIRONMENT_SURFACE_ELASTICITY = 1.0f; const float ENVIRONMENT_SURFACE_DAMPING = 0.01; const float ENVIRONMENT_COLLISION_FREQUENCY = 0.05f; - const float VISIBLE_GROUND_COLLISION_VELOCITY = 0.2f; glm::vec3 penetration; if (Application::getInstance()->getEnvironment()->findCapsulePenetration( _position - up * (_pelvisFloatingHeight - radius), _position + up * (_height - _pelvisFloatingHeight - radius), radius, penetration)) { - float velocityTowardCollision = glm::dot(_velocity, glm::normalize(penetration)); - if (velocityTowardCollision > VISIBLE_GROUND_COLLISION_VELOCITY) { - Application::getInstance()->setGroundPlaneImpact(1.0f); - } _lastCollisionPosition = _position; updateCollisionSound(penetration, deltaTime, ENVIRONMENT_COLLISION_FREQUENCY); applyHardCollision(penetration, ENVIRONMENT_SURFACE_ELASTICITY, ENVIRONMENT_SURFACE_DAMPING); From fcf20a7ebc9a10e2f320310f34ba067af6114a3d Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 1 Aug 2013 15:00:08 -0700 Subject: [PATCH 5/7] Sound on click, but not on hover --- interface/src/Application.cpp | 16 ++++++++++------ interface/src/Util.cpp | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8add2325d9..70a1169d90 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -855,6 +855,11 @@ void Application::mouseMoveEvent(QMouseEvent* event) { } } +const bool MAKE_SOUND_ON_VOXEL_HOVER = false; +const bool MAKE_SOUND_ON_VOXEL_CLICK = true; +const float HOVER_VOXEL_FREQUENCY = 14080.f; +const float HOVER_VOXEL_DECAY = 0.999f; + void Application::mousePressEvent(QMouseEvent* event) { if (activeWindow() == _window) { if (event->button() == Qt::LeftButton) { @@ -865,12 +870,12 @@ void Application::mousePressEvent(QMouseEvent* event) { _mouseVoxelDragging = _mouseVoxel; _mousePressed = true; maybeEditVoxelUnderCursor(); - if (_isHoverVoxel && !_isHoverVoxelSounding) { + if (MAKE_SOUND_ON_VOXEL_CLICK && _isHoverVoxel && !_isHoverVoxelSounding) { _hoverVoxelOriginalColor[0] = _hoverVoxel.red; _hoverVoxelOriginalColor[1] = _hoverVoxel.green; _hoverVoxelOriginalColor[2] = _hoverVoxel.blue; _hoverVoxelOriginalColor[3] = 1; - _audio.startCollisionSound(1.0, 14080 * _hoverVoxel.s * TREE_SCALE, 0.0, 0.999f); + _audio.startCollisionSound(1.0, HOVER_VOXEL_FREQUENCY * _hoverVoxel.s * TREE_SCALE, 0.0, HOVER_VOXEL_DECAY); _isHoverVoxelSounding = true; } @@ -2090,18 +2095,17 @@ void Application::update(float deltaTime) { if (bright < 0.01f) { hoveredNode->setColor(_hoverVoxelOriginalColor); _isHoverVoxelSounding = false; - } + } } else { // Check for a new hover voxel glm::vec4 oldVoxel(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s); _isHoverVoxel = _voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _hoverVoxel, distance, face); - if (_isHoverVoxel && glm::vec4(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s) != oldVoxel) { - //qDebug("bing! x,y,z = %f,%f,%f\n", _hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z); + if (MAKE_SOUND_ON_VOXEL_HOVER && _isHoverVoxel && glm::vec4(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s) != oldVoxel) { _hoverVoxelOriginalColor[0] = _hoverVoxel.red; _hoverVoxelOriginalColor[1] = _hoverVoxel.green; _hoverVoxelOriginalColor[2] = _hoverVoxel.blue; _hoverVoxelOriginalColor[3] = 1; - _audio.startCollisionSound(1.0, 14080 * _hoverVoxel.s * TREE_SCALE, 0.0, 0.992f); + _audio.startCollisionSound(1.0, HOVER_VOXEL_FREQUENCY * _hoverVoxel.s * TREE_SCALE, 0.0, HOVER_VOXEL_DECAY); _isHoverVoxelSounding = true; } } diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 1830a30014..ffb9ea25e0 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -339,7 +339,7 @@ void renderCollisionOverlay(int width, int height, float magnitude) { } void renderGroundPlaneGrid(float size, float impact) { - float IMPACT_SOUND_MAGNITUDE_FOR_RECOLOR = 0.3f; + float IMPACT_SOUND_MAGNITUDE_FOR_RECOLOR = 1.f; glLineWidth(2.0); glm::vec4 impactColor(1, 0, 0, 1); glm::vec3 lineColor(0.4, 0.5, 0.3); From 9defa6255aa8b39c7cccab1d538577217a490650 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 1 Aug 2013 15:31:09 -0700 Subject: [PATCH 6/7] disable mouse wheel voxel scale change --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 551e666338..a82b9bc8f3 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -932,8 +932,10 @@ void Application::touchEndEvent(QTouchEvent* event) { _isTouchPressed = false; } +const bool USE_MOUSEWHEEL = false; void Application::wheelEvent(QWheelEvent* event) { - if (activeWindow() == _window) { + // Wheel Events disabled for now because they are also activated by touch look pitch up/down. + if (USE_MOUSEWHEEL && (activeWindow() == _window)) { if (checkedVoxelModeAction() == 0) { event->ignore(); return; From 8f955346448d64a3d70122fda112d6968e00de7f Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 1 Aug 2013 16:04:38 -0700 Subject: [PATCH 7/7] Fix jittering in view from body slowly following head --- interface/src/Application.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a82b9bc8f3..c297e578ca 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2324,19 +2324,17 @@ void Application::update(float deltaTime) { void Application::updateAvatar(float deltaTime) { - // When head is rotated via touch/mouse look, slowly turn body to follow - const float BODY_FOLLOW_HEAD_RATE = 0.5f; - // update body yaw by body yaw delta + // rotate body yaw for yaw received from multitouch _myAvatar.setOrientation(_myAvatar.getOrientation() - * glm::quat(glm::vec3(0, _yawFromTouch * deltaTime * BODY_FOLLOW_HEAD_RATE, 0) * deltaTime)); - _yawFromTouch -= _yawFromTouch * deltaTime * BODY_FOLLOW_HEAD_RATE; + * glm::quat(glm::vec3(0, _yawFromTouch * deltaTime, 0))); + _yawFromTouch = 0.f; // Update my avatar's state from gyros and/or webcam _myAvatar.updateFromGyrosAndOrWebcam(_gyroLook->isChecked(), glm::vec3(_headCameraPitchYawScale, _headCameraPitchYawScale, _headCameraPitchYawScale), - _yawFromTouch, + 0.f, _pitchFromTouch); if (_serialHeadSensor.isActive()) {