From f45f30234f1ab669055af35af458f3f29cd12bc1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 3 Apr 2014 23:03:06 -0700 Subject: [PATCH] more tweaks to reflections --- interface/src/AudioReflector.cpp | 417 +++++++++++++++---------------- interface/src/AudioReflector.h | 51 +++- 2 files changed, 243 insertions(+), 225 deletions(-) diff --git a/interface/src/AudioReflector.cpp b/interface/src/AudioReflector.cpp index 177d0ecb93..1562055be7 100644 --- a/interface/src/AudioReflector.cpp +++ b/interface/src/AudioReflector.cpp @@ -6,8 +6,17 @@ // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // +#include + #include "AudioReflector.h" +AudioReflector::AudioReflector(QObject* parent) : + QObject(parent) +{ + reset(); +} + + void AudioReflector::render() { if (!_myAvatar) { return; // exit early if not set up correctly @@ -36,7 +45,7 @@ const float BOUNCE_ATTENUATION_FACTOR = 0.125f; const float PER_BOUNCE_ATTENUATION_ADJUSTMENT = 2.0f; // we don't grow larger than this, which means by the 4th bounce we don't get that much less quiet -const float MAX_BOUNCE_ATTENUATION = 0.9f; +const float MAX_BOUNCE_ATTENUATION = 0.99f; float getDistanceAttenuationCoefficient(float distance) { const float DISTANCE_SCALE = 2.5f; @@ -72,6 +81,97 @@ glm::vec3 getFaceNormal(BoxFace face) { return glm::vec3(0, 0, 0); //error case } +void AudioReflector::reset() { + _reflections = 0; + _averageAttenuation = 0.0f; + _maxAttenuation = 0.0f; + _minAttenuation = 0.0f; + _averageDelay = 0; + _maxDelay = 0; + _minDelay = 0; + + _reflections = _frontRightUpReflections.size() + + _frontLeftUpReflections.size() + + _backRightUpReflections.size() + + _backLeftUpReflections.size() + + _frontRightDownReflections.size() + + _frontLeftDownReflections.size() + + _backRightDownReflections.size() + + _backLeftDownReflections.size() + + _frontReflections.size() + + _backReflections.size() + + _leftReflections.size() + + _rightReflections.size() + + _upReflections.size() + + _downReflections.size(); + +} + +void AudioReflector::calculateAllReflections() { + + // only recalculate when we've moved... + // TODO: what about case where new voxels are added in front of us??? + if (_myAvatar->getHead()->getPosition() != _origin) { + QMutexLocker locker(&_mutex); + + qDebug() << "origin has changed..."; + qDebug(" _myAvatar->getHead()->getPosition()=%f,%f,%f", + _myAvatar->getHead()->getPosition().x, + _myAvatar->getHead()->getPosition().y, + _myAvatar->getHead()->getPosition().z); + + qDebug(" _origin=%f,%f,%f", + _origin.x, + _origin.y, + _origin.z); + + + quint64 start = usecTimestampNow(); + + _origin = _myAvatar->getHead()->getPosition(); + + glm::quat orientation = _myAvatar->getOrientation(); // _myAvatar->getHead()->getOrientation(); + glm::vec3 right = glm::normalize(orientation * IDENTITY_RIGHT); + glm::vec3 up = glm::normalize(orientation * IDENTITY_UP); + glm::vec3 front = glm::normalize(orientation * IDENTITY_FRONT); + glm::vec3 left = -right; + glm::vec3 down = -up; + glm::vec3 back = -front; + glm::vec3 frontRightUp = glm::normalize(front + right + up); + glm::vec3 frontLeftUp = glm::normalize(front + left + up); + glm::vec3 backRightUp = glm::normalize(back + right + up); + glm::vec3 backLeftUp = glm::normalize(back + left + up); + glm::vec3 frontRightDown = glm::normalize(front + right + down); + glm::vec3 frontLeftDown = glm::normalize(front + left + down); + glm::vec3 backRightDown = glm::normalize(back + right + down); + glm::vec3 backLeftDown = glm::normalize(back + left + down); + + const int BOUNCE_COUNT = 5; + + _frontRightUpReflections = calculateReflections(_origin, frontRightUp, BOUNCE_COUNT); + _frontLeftUpReflections = calculateReflections(_origin, frontLeftUp, BOUNCE_COUNT); + _backRightUpReflections = calculateReflections(_origin, backRightUp, BOUNCE_COUNT); + _backLeftUpReflections = calculateReflections(_origin, backLeftUp, BOUNCE_COUNT); + _frontRightDownReflections = calculateReflections(_origin, frontRightDown, BOUNCE_COUNT); + _frontLeftDownReflections = calculateReflections(_origin, frontLeftDown, BOUNCE_COUNT); + _backRightDownReflections = calculateReflections(_origin, backRightDown, BOUNCE_COUNT); + _backLeftDownReflections = calculateReflections(_origin, backLeftDown, BOUNCE_COUNT); + _frontReflections = calculateReflections(_origin, front, BOUNCE_COUNT); + _backReflections = calculateReflections(_origin, back, BOUNCE_COUNT); + _leftReflections = calculateReflections(_origin, left, BOUNCE_COUNT); + _rightReflections = calculateReflections(_origin, right, BOUNCE_COUNT); + _upReflections = calculateReflections(_origin, up, BOUNCE_COUNT); + _downReflections = calculateReflections(_origin, down, BOUNCE_COUNT); + + quint64 end = usecTimestampNow(); + + reset(); + + qDebug() << "Reflections recalculated in " << (end - start) << "usecs"; + + } +} + QVector AudioReflector::calculateReflections(const glm::vec3& origin, const glm::vec3& originalDirection, int maxBounces) { QVector reflectionPoints; glm::vec3 start = origin; @@ -150,6 +250,14 @@ void AudioReflector::echoReflections(const glm::vec3& origin, const QVector + #include #include "Audio.h" @@ -17,7 +19,7 @@ class AudioReflector : public QObject { Q_OBJECT public: - AudioReflector(QObject* parent = 0) : QObject(parent) { }; + AudioReflector(QObject* parent = NULL); void setVoxels(VoxelTree* voxels) { _voxels = voxels; } void setMyAvatar(MyAvatar* myAvatar) { _myAvatar = myAvatar; } @@ -25,6 +27,14 @@ public: void render(); + int getReflections() const { return _reflections; } + int getAverageDelayMsecs() const { return _averageDelay; } + float getAverageAttenuation() const { return _averageAttenuation; } + int getMaxDelayMsecs() const { return _maxDelay; } + float getMaxAttenuation() const { return _maxAttenuation; } + int getMinDelayMsecs() const { return _minDelay; } + float getMinAttenuation() const { return _minAttenuation; } + public slots: void processSpatialAudio(unsigned int sampleTime, const QByteArray& samples, const QAudioFormat& format); @@ -37,15 +47,48 @@ private: void drawRays(); void drawVector(const glm::vec3& start, const glm::vec3& end, const glm::vec3& color); - void oldEchoReflections(const glm::vec3& origin, const glm::vec3& originalDirection, - int bounces, const QByteArray& samples, - unsigned int sampleTime, int sampleRate); void echoReflections(const glm::vec3& origin, const QVector& reflections, const QByteArray& samples, unsigned int sampleTime, int sampleRate); QVector calculateReflections(const glm::vec3& origin, const glm::vec3& originalDirection, int maxBounces); void drawReflections(const glm::vec3& origin, const glm::vec3& originalColor, const QVector& reflections); + + void calculateAllReflections(); + void reset(); + + int _reflections; + + int _delayCount; + int _totalDelay; + int _averageDelay; + int _maxDelay; + int _minDelay; + + int _attenuationCount; + float _totalAttenuation; + float _averageAttenuation; + float _maxAttenuation; + float _minAttenuation; + + glm::vec3 _origin; + QVector _frontRightUpReflections; + QVector _frontLeftUpReflections; + QVector _backRightUpReflections; + QVector _backLeftUpReflections; + QVector _frontRightDownReflections; + QVector _frontLeftDownReflections; + QVector _backRightDownReflections; + QVector _backLeftDownReflections; + QVector _frontReflections; + QVector _backReflections; + QVector _leftReflections; + QVector _rightReflections; + QVector _upReflections; + QVector _downReflections; + + QMutex _mutex; + };