some audio reflection cleanup

This commit is contained in:
ZappoMan 2014-04-14 10:12:08 -07:00
parent 7a993939bf
commit d3a9c6940c
2 changed files with 77 additions and 178 deletions

View file

@ -510,6 +510,7 @@ void AudioReflector::newEchoAudio(unsigned int sampleTime, const QByteArray& sam
_averageDelay = _delayCount == 0 ? 0 : _totalDelay / _delayCount;
_averageAttenuation = _attenuationCount == 0 ? 0 : _totalAttenuation / _attenuationCount;
_reflections = _audiblePoints.size();
//quint64 end = usecTimestampNow();
//qDebug() << "AudioReflector::addSamples()... elapsed=" << (end - start);
@ -554,125 +555,26 @@ void AudioReflector::oldEchoAudio(unsigned int sampleTime, const QByteArray& sam
}
void AudioReflector::drawRays() {
//qDebug() << "AudioReflector::drawRays()";
calculateAllReflections();
const glm::vec3 RED(1,0,0);
const glm::vec3 GREEN(0,1,0);
const glm::vec3 BLUE(0,0,1);
const glm::vec3 PURPLE(1,0,1);
const glm::vec3 YELLOW(1,1,0);
const glm::vec3 CYAN(0,1,1);
const glm::vec3 DARK_RED(0.8f,0.2f,0.2f);
const glm::vec3 DARK_GREEN(0.2f,0.8f,0.2f);
const glm::vec3 DARK_BLUE(0.2f,0.2f,0.8f);
const glm::vec3 DARK_PURPLE(0.8f,0.2f,0.8f);
const glm::vec3 DARK_YELLOW(0.8f,0.8f,0.2f);
const glm::vec3 DARK_CYAN(0.2f,0.8f,0.8f);
const glm::vec3 WHITE(1,1,1);
const glm::vec3 GRAY(0.5f,0.5f,0.5f);
glm::vec3 frontRightUpColor = RED;
glm::vec3 frontLeftUpColor = GREEN;
glm::vec3 backRightUpColor = BLUE;
glm::vec3 backLeftUpColor = CYAN;
glm::vec3 frontRightDownColor = PURPLE;
glm::vec3 frontLeftDownColor = YELLOW;
glm::vec3 backRightDownColor = WHITE;
glm::vec3 backLeftDownColor = DARK_RED;
glm::vec3 frontColor = GRAY;
glm::vec3 backColor = DARK_GREEN;
glm::vec3 leftColor = DARK_BLUE;
glm::vec3 rightColor = DARK_CYAN;
glm::vec3 upColor = DARK_PURPLE;
glm::vec3 downColor = DARK_YELLOW;
// attempt to determine insidness/outsideness based on number of directional rays that reflect
bool inside = false;
bool blockedUp = (_frontRightUpReflections.size() > 0) &&
(_frontLeftUpReflections.size() > 0) &&
(_backRightUpReflections.size() > 0) &&
(_backLeftUpReflections.size() > 0) &&
(_upReflections.size() > 0);
bool blockedDown = (_frontRightDownReflections.size() > 0) &&
(_frontLeftDownReflections.size() > 0) &&
(_backRightDownReflections.size() > 0) &&
(_backLeftDownReflections.size() > 0) &&
(_downReflections.size() > 0);
bool blockedFront = (_frontRightUpReflections.size() > 0) &&
(_frontLeftUpReflections.size() > 0) &&
(_frontRightDownReflections.size() > 0) &&
(_frontLeftDownReflections.size() > 0) &&
(_frontReflections.size() > 0);
bool blockedBack = (_backRightUpReflections.size() > 0) &&
(_backLeftUpReflections.size() > 0) &&
(_backRightDownReflections.size() > 0) &&
(_backLeftDownReflections.size() > 0) &&
(_backReflections.size() > 0);
bool blockedLeft = (_frontLeftUpReflections.size() > 0) &&
(_backLeftUpReflections.size() > 0) &&
(_frontLeftDownReflections.size() > 0) &&
(_backLeftDownReflections.size() > 0) &&
(_leftReflections.size() > 0);
bool blockedRight = (_frontRightUpReflections.size() > 0) &&
(_backRightUpReflections.size() > 0) &&
(_frontRightDownReflections.size() > 0) &&
(_backRightDownReflections.size() > 0) &&
(_rightReflections.size() > 0);
inside = blockedUp && blockedDown && blockedFront && blockedBack && blockedLeft && blockedRight;
if (inside) {
frontRightUpColor = RED;
frontLeftUpColor = RED;
backRightUpColor = RED;
backLeftUpColor = RED;
frontRightDownColor = RED;
frontLeftDownColor = RED;
backRightDownColor = RED;
backLeftDownColor = RED;
frontColor = RED;
backColor = RED;
leftColor = RED;
rightColor = RED;
upColor = RED;
downColor = RED;
}
QMutexLocker locker(&_mutex);
drawReflections(_origin, frontRightUpColor, _frontRightUpReflections);
drawReflections(_origin, frontLeftUpColor, _frontLeftUpReflections);
drawReflections(_origin, backRightUpColor, _backRightUpReflections);
drawReflections(_origin, backLeftUpColor, _backLeftUpReflections);
drawReflections(_origin, frontRightDownColor, _frontRightDownReflections);
drawReflections(_origin, frontLeftDownColor, _frontLeftDownReflections);
drawReflections(_origin, backRightDownColor, _backRightDownReflections);
drawReflections(_origin, backLeftDownColor, _backLeftDownReflections);
drawReflections(_origin, frontColor, _frontReflections);
drawReflections(_origin, backColor, _backReflections);
drawReflections(_origin, leftColor, _leftReflections);
drawReflections(_origin, rightColor, _rightReflections);
drawReflections(_origin, upColor, _upReflections);
drawReflections(_origin, downColor, _downReflections);
/*
qDebug() << "_reflections:" << _reflections
<< "_averageDelay:" << _averageDelay
<< "_maxDelay:" << _maxDelay
<< "_minDelay:" << _minDelay;
qDebug() << "_averageAttenuation:" << _averageAttenuation
<< "_maxAttenuation:" << _maxAttenuation
<< "_minAttenuation:" << _minAttenuation;
*/
drawReflections(_origin, RED, _frontRightUpReflections);
drawReflections(_origin, RED, _frontLeftUpReflections);
drawReflections(_origin, RED, _backRightUpReflections);
drawReflections(_origin, RED, _backLeftUpReflections);
drawReflections(_origin, RED, _frontRightDownReflections);
drawReflections(_origin, RED, _frontLeftDownReflections);
drawReflections(_origin, RED, _backRightDownReflections);
drawReflections(_origin, RED, _backLeftDownReflections);
drawReflections(_origin, RED, _frontReflections);
drawReflections(_origin, RED, _backReflections);
drawReflections(_origin, RED, _leftReflections);
drawReflections(_origin, RED, _rightReflections);
drawReflections(_origin, RED, _upReflections);
drawReflections(_origin, RED, _downReflections);
}
void AudioReflector::drawVector(const glm::vec3& start, const glm::vec3& end, const glm::vec3& color) {
@ -774,7 +676,6 @@ void AudioReflector::newDrawRays() {
drawPath(path, RED);
} else {
diffusionNumber++;
//qDebug() << "drawing diffusion path:" << diffusionNumber << "length:" << path->reflections.size();
drawPath(path, GREEN);
}
}
@ -794,9 +695,6 @@ void AudioReflector::drawPath(AudioPath* path, const glm::vec3& originalColor) {
void AudioReflector::anylizePaths() {
qDebug() << "AudioReflector::anylizePaths()...";
// clear our _audioPaths
foreach(AudioPath* const& path, _audioPaths) {
delete path;
@ -847,12 +745,8 @@ qDebug() << "AudioReflector::anylizePaths()...";
while(acitvePaths > 0) {
acitvePaths = anylizePathsSingleStep();
steps++;
//qDebug() << "acitvePaths=" << acitvePaths << "steps=" << steps << "_audioPaths.size()=" << _audioPaths.size();
}
_reflections = _audiblePoints.size();
qDebug() << "_audiblePoints.size()=" << _audiblePoints.size();
}
int AudioReflector::anylizePathsSingleStep() {
@ -863,14 +757,6 @@ int AudioReflector::anylizePathsSingleStep() {
bool isDiffusion = (path->startPoint != _origin);
/*
qDebug() << "ray intersection... "
<< " startPoint=[" << path->startPoint.x << "," << path->startPoint.y << "," << path->startPoint.z << "]"
<< " _origin=[" << _origin.x << "," << _origin.y << "," << _origin.z << "]"
<< " bouceCount= " << path->bounceCount
<< " isDiffusion=" << isDiffusion;
*/
glm::vec3 start = path->lastPoint;
glm::vec3 direction = path->lastDirection;
OctreeElement* elementHit; // output from findRayIntersection

View file

@ -293,11 +293,7 @@ void Stats::display(
glm::vec3 avatarPos = myAvatar->getPosition();
lines = _expanded ? 5 : 3;
if (_expanded && Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessing)) {
lines += 3; // spatial audio processing adds 3 extra lines
}
drawBackground(backgroundColor, horizontalOffset, 0, _geoStatsWidth, lines * STATS_PELS_PER_LINE + 10);
horizontalOffset += 5;
@ -338,49 +334,6 @@ void Stats::display(
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, downloads.str().c_str(), color);
if (Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessing)) {
const AudioReflector* audioReflector = Application::getInstance()->getAudioReflector();
// add some reflection stats
char reflectionsStatus[128];
sprintf(reflectionsStatus, "Reflections: %d, Original: %s, Ears: %s, Source: %s",
audioReflector->getReflections(),
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingIncudeOriginal)
? "with" : "without"),
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingSeparateEars)
? "two" : "one"),
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingStereoSource)
? "stereo" : "mono")
);
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, reflectionsStatus, color);
float preDelay = Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingPreDelay) ?
audioReflector->getPreDelay() : 0.0f;
sprintf(reflectionsStatus, "Delay: pre: %f, average %f, max %f, min %f, speed: %f",
preDelay,
audioReflector->getAverageDelayMsecs(),
audioReflector->getMaxDelayMsecs(),
audioReflector->getMinDelayMsecs(),
audioReflector->getSoundMsPerMeter());
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, reflectionsStatus, color);
sprintf(reflectionsStatus, "Attenuation: average %f, max %f, min %f, distance scale: %f",
audioReflector->getAverageAttenuation(),
audioReflector->getMaxAttenuation(),
audioReflector->getMinAttenuation(),
audioReflector->getDistanceAttenuationScalingFactor());
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, reflectionsStatus, color);
}
}
verticalOffset = 0;
@ -389,6 +342,10 @@ void Stats::display(
VoxelSystem* voxels = Application::getInstance()->getVoxels();
lines = _expanded ? 12 : 3;
if (_expanded && Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessing)) {
lines += 5; // spatial audio processing adds 1 spacing line and 4 extra lines of info
}
drawBackground(backgroundColor, horizontalOffset, 0, glWidget->width() - horizontalOffset, lines * STATS_PELS_PER_LINE + 10);
horizontalOffset += 5;
@ -545,5 +502,61 @@ void Stats::display(
voxelStats << "LOD: You can see " << qPrintable(displayLODDetails.trimmed());
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), color);
}
}
if (_expanded && Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessing)) {
verticalOffset += STATS_PELS_PER_LINE; // space one line...
const AudioReflector* audioReflector = Application::getInstance()->getAudioReflector();
// add some reflection stats
char reflectionsStatus[128];
sprintf(reflectionsStatus, "Reflections: %d, Diffusion: %s, Original: %s, Ears: %s, Source: %s",
audioReflector->getReflections(),
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingWithDiffusions)
? "yes" : "no"),
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingIncudeOriginal)
? "included" : "silent"),
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingSeparateEars)
? "two" : "one"),
(Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingStereoSource)
? "stereo" : "mono")
);
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, reflectionsStatus, color);
float preDelay = Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingPreDelay) ?
audioReflector->getPreDelay() : 0.0f;
sprintf(reflectionsStatus, "Delay: pre: %6.3f, average %6.3f, max %6.3f, min %6.3f, speed: %6.3f",
preDelay,
audioReflector->getAverageDelayMsecs(),
audioReflector->getMaxDelayMsecs(),
audioReflector->getMinDelayMsecs(),
audioReflector->getSoundMsPerMeter());
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, reflectionsStatus, color);
sprintf(reflectionsStatus, "Attenuation: average %5.3f, max %5.3f, min %5.3f, distance scale: %5.3f",
audioReflector->getAverageAttenuation(),
audioReflector->getMaxAttenuation(),
audioReflector->getMinAttenuation(),
audioReflector->getDistanceAttenuationScalingFactor());
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, reflectionsStatus, color);
bool diffusionEnabled = Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingWithDiffusions);
int fanout = diffusionEnabled ? audioReflector->getDiffusionFanout() : 0;
sprintf(reflectionsStatus, "Diffusion: %s, Fanout: %d", (diffusionEnabled ? "yes" : "no"), fanout);
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, reflectionsStatus, color);
}
}