From c1c5991ac50032a2429f57488bbe09b0c445d4ce Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 12 Dec 2014 12:07:48 -0800 Subject: [PATCH 01/37] Fix for distorted replaced textures. --- interface/src/MetavoxelSystem.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 87060d7dfa..002acec9ed 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -2188,13 +2188,15 @@ void HeightfieldNodeRenderer::render(const HeightfieldNodePointer& node, const g bufferPair.second.release(); } if (_heightTextureID == 0) { + // we use non-aligned data for the various layers + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glGenTextures(1, &_heightTextureID); glBindTexture(GL_TEXTURE_2D, _heightTextureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); const QVector& heightContents = node->getHeight()->getContents(); glTexImage2D(GL_TEXTURE_2D, 0, GL_R16, width, height, 0, GL_RED, GL_UNSIGNED_SHORT, heightContents.constData()); @@ -2241,6 +2243,9 @@ void HeightfieldNodeRenderer::render(const HeightfieldNodePointer& node, const g glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 1, 1, 0, GL_RED, GL_UNSIGNED_BYTE, &ZERO_VALUE); } glBindTexture(GL_TEXTURE_2D, 0); + + // restore the default alignment; it's what Qt uses for image storage + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); } if (cursor) { From b8737ad5257058b6edea3f1fa17514b6a0bec2a4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:26:07 -0800 Subject: [PATCH 02/37] Update 'f' focus to only work when something is selected --- examples/editEntities.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index e9f42bf74c..fc48cf22b5 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -839,9 +839,11 @@ Controller.keyReleaseEvent.connect(function (event) { selectionDisplay.toggleSpaceMode(); } else if (event.text == "f") { if (isActive) { - cameraManager.focus(selectionManager.worldPosition, - selectionManager.worldDimensions, - Menu.isOptionChecked(MENU_EASE_ON_FOCUS)); + if (selectionManager.hasSelection()) { + cameraManager.focus(selectionManager.worldPosition, + selectionManager.worldDimensions, + Menu.isOptionChecked(MENU_EASE_ON_FOCUS)); + } } } else if (event.text == '[') { if (isActive) { From d1f5bf2e3cdf9c68229dded470df12adc90140e9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:27:30 -0800 Subject: [PATCH 03/37] Add rotation to properties window --- examples/editEntities.js | 5 +++++ examples/html/entityProperties.html | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/examples/editEntities.js b/examples/editEntities.js index fc48cf22b5..980f38f2cc 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -1004,6 +1004,7 @@ PropertiesTool = function(opts) { }; if (selectionManager.hasSelection()) { data.properties = Entities.getEntityProperties(selectionManager.selections[0]); + data.properties.rotation = Quat.safeEulerAngles(data.properties.rotation); } webView.eventBridge.emitScriptEvent(JSON.stringify(data)); }); @@ -1012,6 +1013,10 @@ PropertiesTool = function(opts) { print(data); data = JSON.parse(data); if (data.type == "update") { + if (data.properties.rotation !== undefined) { + var rotation = data.properties.rotation; + data.properties.rotation = Quat.fromPitchYawRollDegrees(rotation.x, rotation.y, rotation.z); + } Entities.editEntity(selectionManager.selections[0], data.properties); selectionManager._update(); } diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 17eb0ad88f..d30aac72ee 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -85,6 +85,10 @@ var elRegistrationY = document.getElementById("property-reg-y"); var elRegistrationZ = document.getElementById("property-reg-z"); + var elRotationX = document.getElementById("property-rot-x"); + var elRotationY = document.getElementById("property-rot-y"); + var elRotationZ = document.getElementById("property-rot-z"); + var elLinearVelocityX = document.getElementById("property-lvel-x"); var elLinearVelocityY = document.getElementById("property-lvel-y"); var elLinearVelocityZ = document.getElementById("property-lvel-z"); @@ -181,6 +185,10 @@ elRegistrationY.value = properties.registrationPoint.y.toFixed(2); elRegistrationZ.value = properties.registrationPoint.z.toFixed(2); + elRotationX.value = properties.rotation.x.toFixed(2); + elRotationY.value = properties.rotation.y.toFixed(2); + elRotationZ.value = properties.rotation.z.toFixed(2); + elLinearVelocityX.value = properties.velocity.x.toFixed(2); elLinearVelocityY.value = properties.velocity.y.toFixed(2); elLinearVelocityZ.value = properties.velocity.z.toFixed(2); @@ -302,6 +310,12 @@ elRegistrationY.addEventListener('change', registrationChangeFunction); elRegistrationZ.addEventListener('change', registrationChangeFunction); + var rotationChangeFunction = createEmitVec3PropertyUpdateFunction( + 'rotation', elRotationX, elRotationY, elRotationZ); + elRotationX.addEventListener('change', rotationChangeFunction); + elRotationY.addEventListener('change', rotationChangeFunction); + elRotationZ.addEventListener('change', rotationChangeFunction); + var velocityChangeFunction = createEmitVec3PropertyUpdateFunction( 'velocity', elLinearVelocityX, elLinearVelocityY, elLinearVelocityZ); elLinearVelocityX.addEventListener('change', velocityChangeFunction); @@ -486,6 +500,15 @@ + + Rotation + +
Pitch
+
Yaw
+
Roll
+ + + Linear Velocity From 1a90a810379dd1ad196af9aeafa3792b89fa5d91 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:27:56 -0800 Subject: [PATCH 04/37] Add id to properties window --- examples/editEntities.js | 1 + examples/html/entityProperties.html | 11 +++++++++++ examples/html/style.css | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/examples/editEntities.js b/examples/editEntities.js index 980f38f2cc..ea6496d4f5 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -1003,6 +1003,7 @@ PropertiesTool = function(opts) { type: 'update', }; if (selectionManager.hasSelection()) { + data.id = selectionManager.selections[0].id; data.properties = Entities.getEntityProperties(selectionManager.selections[0]); data.properties.rotation = Quat.safeEulerAngles(data.properties.rotation); } diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index d30aac72ee..a34f7ce13f 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -70,6 +70,7 @@ }; function loaded() { + var elID = document.getElementById("property-id"); var elType = document.getElementById("property-type"); var elLocked = document.getElementById("property-locked"); var elVisible = document.getElementById("property-visible"); @@ -160,6 +161,8 @@ } else { var properties = data.properties; + elID.innerHTML = data.id; + elType.innerHTML = properties.type; elLocked.checked = properties.locked; @@ -451,6 +454,14 @@ + + + ID + + + + + Type diff --git a/examples/html/style.css b/examples/html/style.css index 424933e14e..aa23cf97ab 100644 --- a/examples/html/style.css +++ b/examples/html/style.css @@ -17,6 +17,17 @@ body { user-select: none; } +.selectable { + -webkit-touch-callout: text; + -webkit-user-select: text; + -khtml-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + + cursor: text; +} + .color-box { display: inline-block; width: 20px; From a5cbc9b3e2fa3aa8e3544d30dc66529c4cc785f3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:28:22 -0800 Subject: [PATCH 05/37] Fix properties window to work with undo/redo --- examples/editEntities.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/editEntities.js b/examples/editEntities.js index ea6496d4f5..b671e45d7c 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -1014,11 +1014,13 @@ PropertiesTool = function(opts) { print(data); data = JSON.parse(data); if (data.type == "update") { + selectionManager.saveProperties(); if (data.properties.rotation !== undefined) { var rotation = data.properties.rotation; data.properties.rotation = Quat.fromPitchYawRollDegrees(rotation.x, rotation.y, rotation.z); } Entities.editEntity(selectionManager.selections[0], data.properties); + pushCommandForSelections(); selectionManager._update(); } }); From 33b4c614eae17ad3ef7c54a821e929f2ffb0ee52 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:28:57 -0800 Subject: [PATCH 06/37] Add buttons for moving selection to grid and resetting to natural dimensions --- examples/editEntities.js | 48 +++++++++++++++++++++++++++++ examples/html/entityProperties.html | 29 +++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/examples/editEntities.js b/examples/editEntities.js index b671e45d7c..3f133ac0b2 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -1022,6 +1022,54 @@ PropertiesTool = function(opts) { Entities.editEntity(selectionManager.selections[0], data.properties); pushCommandForSelections(); selectionManager._update(); + } else if (data.type == "action") { + if (data.action == "moveSelectionToGrid") { + if (!selectionManager.hasSelection()) { + return; + } + selectionManager.saveProperties(); + var dY = grid.getOrigin().y - (selectionManager.worldPosition.y - selectionManager.worldDimensions.y / 2), + var diff = { x: 0, y: dY, z: 0 }; + for (var i = 0; i < SelectionManager.selections.length; i++) { + var properties = SelectionManager.savedProperties[SelectionManager.selections[i].id]; + var newPosition = Vec3.sum(properties.position, diff); + Entities.editEntity(SelectionManager.selections[i], { + position: newPosition, + }); + } + pushCommandForSelections(); + selectionManager._update(); + } else if (data.action == "moveAllToGrid") { + if (!selectionManager.hasSelection()) { + return; + } + selectionManager.saveProperties(); + for (var i = 0; i < SelectionManager.selections.length; i++) { + var properties = SelectionManager.savedProperties[SelectionManager.selections[i].id]; + var bottomY = properties.boundingBox.center.y - properties.boundingBox.dimensions.y / 2; + var dY = grid.getOrigin().y - bottomY; + var diff = { x: 0, y: dY, z: 0 }; + var newPosition = Vec3.sum(properties.position, diff); + Entities.editEntity(SelectionManager.selections[i], { + position: newPosition, + }); + } + pushCommandForSelections(); + selectionManager._update(); + } else if (data.action == "resetToNaturalDimensions") { + if (!selectionManager.hasSelection()) { + return; + } + selectionManager.saveProperties(); + for (var i = 0; i < SelectionManager.selections.length; i++) { + var properties = SelectionManager.savedProperties[SelectionManager.selections[i].id]; + Entities.editEntity(SelectionManager.selections[i], { + dimensions: properties.naturalDimensions, + }); + } + pushCommandForSelections(); + selectionManager._update(); + } } }); diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index a34f7ce13f..48804d475a 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -77,10 +77,13 @@ var elPositionX = document.getElementById("property-pos-x"); var elPositionY = document.getElementById("property-pos-y"); var elPositionZ = document.getElementById("property-pos-z"); + var elMoveSelectionToGrid = document.getElementById("move-selection-to-grid"); + var elMoveAllToGrid = document.getElementById("move-all-to-grid"); var elDimensionsX = document.getElementById("property-dim-x"); var elDimensionsY = document.getElementById("property-dim-y"); var elDimensionsZ = document.getElementById("property-dim-z"); + var elResetToNaturalDimensions = document.getElementById("reset-to-natural-dimensions"); var elRegistrationX = document.getElementById("property-reg-x"); var elRegistrationY = document.getElementById("property-reg-y"); @@ -398,6 +401,25 @@ elTextBackgroundColorGreen.addEventListener('change', textBackgroundColorChangeFunction); elTextBackgroundColorBlue.addEventListener('change', textBackgroundColorChangeFunction); + elMoveSelectionToGrid.addEventListener("click", function() { + EventBridge.emitWebEvent(JSON.stringify({ + type: "action", + action: "moveSelectionToGrid", + })); + }); + elMoveAllToGrid.addEventListener("click", function() { + EventBridge.emitWebEvent(JSON.stringify({ + type: "action", + action: "moveAllToGrid", + })); + }); + elResetToNaturalDimensions.addEventListener("click", function() { + EventBridge.emitWebEvent(JSON.stringify({ + type: "action", + action: "resetToNaturalDimensions", + })); + }); + var resizing = false; var startX = 0; @@ -490,6 +512,10 @@
X
Y
Z
+
+ + +
@@ -508,6 +534,9 @@
X
Y
Z
+
+ +
From dde9b92dbd4a02d630f171a7f1d72dea36236a88 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:31:54 -0800 Subject: [PATCH 07/37] Update SelectionManager -> selectionManager --- examples/editEntities.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index 3f133ac0b2..c2f2ad4086 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -1030,10 +1030,10 @@ PropertiesTool = function(opts) { selectionManager.saveProperties(); var dY = grid.getOrigin().y - (selectionManager.worldPosition.y - selectionManager.worldDimensions.y / 2), var diff = { x: 0, y: dY, z: 0 }; - for (var i = 0; i < SelectionManager.selections.length; i++) { - var properties = SelectionManager.savedProperties[SelectionManager.selections[i].id]; + for (var i = 0; i < selectionManager.selections.length; i++) { + var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; var newPosition = Vec3.sum(properties.position, diff); - Entities.editEntity(SelectionManager.selections[i], { + Entities.editEntity(selectionManager.selections[i], { position: newPosition, }); } @@ -1044,13 +1044,13 @@ PropertiesTool = function(opts) { return; } selectionManager.saveProperties(); - for (var i = 0; i < SelectionManager.selections.length; i++) { - var properties = SelectionManager.savedProperties[SelectionManager.selections[i].id]; + for (var i = 0; i < selectionManager.selections.length; i++) { + var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; var bottomY = properties.boundingBox.center.y - properties.boundingBox.dimensions.y / 2; var dY = grid.getOrigin().y - bottomY; var diff = { x: 0, y: dY, z: 0 }; var newPosition = Vec3.sum(properties.position, diff); - Entities.editEntity(SelectionManager.selections[i], { + Entities.editEntity(selectionManager.selections[i], { position: newPosition, }); } @@ -1061,9 +1061,9 @@ PropertiesTool = function(opts) { return; } selectionManager.saveProperties(); - for (var i = 0; i < SelectionManager.selections.length; i++) { - var properties = SelectionManager.savedProperties[SelectionManager.selections[i].id]; - Entities.editEntity(SelectionManager.selections[i], { + for (var i = 0; i < selectionManager.selections.length; i++) { + var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; + Entities.editEntity(selectionManager.selections[i], { dimensions: properties.naturalDimensions, }); } From 2fab404f7fee8c04a0fe3ce2e8a117cb00a57b37 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:35:39 -0800 Subject: [PATCH 08/37] Reorganize selectionManager selection checking --- examples/editEntities.js | 79 +++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index c2f2ad4086..0b5c089c07 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -1024,51 +1024,48 @@ PropertiesTool = function(opts) { selectionManager._update(); } else if (data.type == "action") { if (data.action == "moveSelectionToGrid") { - if (!selectionManager.hasSelection()) { - return; - } - selectionManager.saveProperties(); - var dY = grid.getOrigin().y - (selectionManager.worldPosition.y - selectionManager.worldDimensions.y / 2), - var diff = { x: 0, y: dY, z: 0 }; - for (var i = 0; i < selectionManager.selections.length; i++) { - var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; - var newPosition = Vec3.sum(properties.position, diff); - Entities.editEntity(selectionManager.selections[i], { - position: newPosition, - }); - } - pushCommandForSelections(); - selectionManager._update(); - } else if (data.action == "moveAllToGrid") { - if (!selectionManager.hasSelection()) { - return; - } - selectionManager.saveProperties(); - for (var i = 0; i < selectionManager.selections.length; i++) { - var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; - var bottomY = properties.boundingBox.center.y - properties.boundingBox.dimensions.y / 2; - var dY = grid.getOrigin().y - bottomY; + if (selectionManager.hasSelection()) { + selectionManager.saveProperties(); + var dY = grid.getOrigin().y - (selectionManager.worldPosition.y - selectionManager.worldDimensions.y / 2), var diff = { x: 0, y: dY, z: 0 }; - var newPosition = Vec3.sum(properties.position, diff); - Entities.editEntity(selectionManager.selections[i], { - position: newPosition, - }); + for (var i = 0; i < selectionManager.selections.length; i++) { + var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; + var newPosition = Vec3.sum(properties.position, diff); + Entities.editEntity(selectionManager.selections[i], { + position: newPosition, + }); + } + pushCommandForSelections(); + selectionManager._update(); + } + } else if (data.action == "moveAllToGrid") { + if (selectionManager.hasSelection()) { + selectionManager.saveProperties(); + for (var i = 0; i < selectionManager.selections.length; i++) { + var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; + var bottomY = properties.boundingBox.center.y - properties.boundingBox.dimensions.y / 2; + var dY = grid.getOrigin().y - bottomY; + var diff = { x: 0, y: dY, z: 0 }; + var newPosition = Vec3.sum(properties.position, diff); + Entities.editEntity(selectionManager.selections[i], { + position: newPosition, + }); + } + pushCommandForSelections(); + selectionManager._update(); } - pushCommandForSelections(); - selectionManager._update(); } else if (data.action == "resetToNaturalDimensions") { - if (!selectionManager.hasSelection()) { - return; + if (selectionManager.hasSelection()) { + selectionManager.saveProperties(); + for (var i = 0; i < selectionManager.selections.length; i++) { + var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; + Entities.editEntity(selectionManager.selections[i], { + dimensions: properties.naturalDimensions, + }); + } + pushCommandForSelections(); + selectionManager._update(); } - selectionManager.saveProperties(); - for (var i = 0; i < selectionManager.selections.length; i++) { - var properties = selectionManager.savedProperties[selectionManager.selections[i].id]; - Entities.editEntity(selectionManager.selections[i], { - dimensions: properties.naturalDimensions, - }); - } - pushCommandForSelections(); - selectionManager._update(); } } }); From a9223f58879f2afbb3cef72ffc4181b24a61dbb2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 12 Dec 2014 15:45:31 -0800 Subject: [PATCH 09/37] Remove text from label --- examples/html/entityProperties.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 48804d475a..4e22637ad6 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -481,7 +481,7 @@ ID - + From 14cda00ebc46ba02f68bbbd3ae111059d1ccac9c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 12 Dec 2014 20:52:41 -0800 Subject: [PATCH 10/37] First implementation of the DependencyManager --- libraries/shared/src/DependencyManager.cpp | 33 +++++++++++++ libraries/shared/src/DependencyManager.h | 55 ++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 libraries/shared/src/DependencyManager.cpp create mode 100644 libraries/shared/src/DependencyManager.h diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp new file mode 100644 index 0000000000..b4b3061317 --- /dev/null +++ b/libraries/shared/src/DependencyManager.cpp @@ -0,0 +1,33 @@ +// +// DependencyManager.cpp +// +// +// Created by Clément Brisset on 12/10/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "DependencyManager.h" + +DependencyManager& DependencyManager::getInstance() { + static DependencyManager instance; + return instance; +} + +DependencyManager::DependencyManager() { + // Guard against request of ourself + // We could set the value to this, but since it doesn't make sense to access + // the DependencyManager instance from the outside let's set it to NULL + _instanceHash.insert(typeid(DependencyManager).name(), NULL); +} + +DependencyManager::~DependencyManager() { + foreach (Dependency* instance, _instanceHash) { + if (instance) { + instance->deleteInstance(); + } + } + _instanceHash.clear(); +} \ No newline at end of file diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h new file mode 100644 index 0000000000..690058cab4 --- /dev/null +++ b/libraries/shared/src/DependencyManager.h @@ -0,0 +1,55 @@ +// +// DependencyManager.h +// +// +// Created by Clément Brisset on 12/10/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_DependencyManager_h +#define hifi_DependencyManager_h + +#include +#include + +#include + +class DependencyManager { +public: + template + static T* get(); + + class Dependency { + virtual void deleteInstance() = 0; + friend DependencyManager; + }; +private: + static DependencyManager& getInstance(); + DependencyManager(); + ~DependencyManager(); + + typedef QHash InstanceHash; + static InstanceHash& getInstanceHash() { return getInstance()._instanceHash; } + InstanceHash _instanceHash; +}; + +template +T* DependencyManager::get() { + const QString& typeId = typeid(T).name(); + + // Search the hash for global instance + Dependency* instance = getInstanceHash().value(typeId, NULL); + if (instance) { + return dynamic_cast(instance); + } + + // Found no instance in hash so we create one. + T* newInstance = new T(); + getInstanceHash().insert(typeId, dynamic_cast(newInstance)); + return newInstance; +} + +#endif // hifi_DependencyManager_h \ No newline at end of file From 50fd52377ff72e63c038a2b5aff908b855f7c026 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 12 Dec 2014 21:10:45 -0800 Subject: [PATCH 11/37] Couple improvements to the dependency manager --- libraries/shared/src/DependencyManager.cpp | 9 +-------- libraries/shared/src/DependencyManager.h | 14 +++++++++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp index b4b3061317..41cb405ac7 100644 --- a/libraries/shared/src/DependencyManager.cpp +++ b/libraries/shared/src/DependencyManager.cpp @@ -16,17 +16,10 @@ DependencyManager& DependencyManager::getInstance() { return instance; } -DependencyManager::DependencyManager() { - // Guard against request of ourself - // We could set the value to this, but since it doesn't make sense to access - // the DependencyManager instance from the outside let's set it to NULL - _instanceHash.insert(typeid(DependencyManager).name(), NULL); -} - DependencyManager::~DependencyManager() { foreach (Dependency* instance, _instanceHash) { if (instance) { - instance->deleteInstance(); + delete instance; } } _instanceHash.clear(); diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h index 690058cab4..2a81941b8a 100644 --- a/libraries/shared/src/DependencyManager.h +++ b/libraries/shared/src/DependencyManager.h @@ -19,16 +19,24 @@ class DependencyManager { public: + // Only accessible method. + // usage: T* instance = DependencyManager::get(); template static T* get(); + // Any class T in the DependencyManager needs to subclass Dependency + // They also need to have protected constructor(s) and virtual destructor + // As well as declare DependencyManager a friend class class Dependency { - virtual void deleteInstance() = 0; + protected: + Dependency() {} + virtual ~Dependency() {} // Ensure the proper destruction of the object friend DependencyManager; }; + private: static DependencyManager& getInstance(); - DependencyManager(); + DependencyManager() {} ~DependencyManager(); typedef QHash InstanceHash; @@ -52,4 +60,4 @@ T* DependencyManager::get() { return newInstance; } -#endif // hifi_DependencyManager_h \ No newline at end of file +#endif // hifi_DependencyManager_h From 9aea2843ac89fbeae4a0463bc8e7d4c3f23691c2 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 12 Dec 2014 21:20:26 -0800 Subject: [PATCH 12/37] Remove pointer check --- libraries/shared/src/DependencyManager.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/shared/src/DependencyManager.cpp b/libraries/shared/src/DependencyManager.cpp index 41cb405ac7..c858cb7059 100644 --- a/libraries/shared/src/DependencyManager.cpp +++ b/libraries/shared/src/DependencyManager.cpp @@ -18,9 +18,7 @@ DependencyManager& DependencyManager::getInstance() { DependencyManager::~DependencyManager() { foreach (Dependency* instance, _instanceHash) { - if (instance) { - delete instance; - } + delete instance; } _instanceHash.clear(); } \ No newline at end of file From d28e274876491a7e0f5f4c05254294e9179c5cf7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 13 Dec 2014 07:43:40 -0800 Subject: [PATCH 13/37] fix warning --- interface/src/Application.h | 2 ++ interface/src/voxels/VoxelSystem.cpp | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index f82b14b47e..1b51b99e77 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -12,6 +12,8 @@ #ifndef hifi_Application_h #define hifi_Application_h +// testing + #include #include diff --git a/interface/src/voxels/VoxelSystem.cpp b/interface/src/voxels/VoxelSystem.cpp index 2f4fd3f0fa..67f3d585ea 100644 --- a/interface/src/voxels/VoxelSystem.cpp +++ b/interface/src/voxels/VoxelSystem.cpp @@ -874,7 +874,6 @@ int VoxelSystem::updateNodeInArrays(VoxelTreeElement* node, bool reuseIndex, boo if (node->getShouldRender()) { glm::vec3 startVertex = node->getCorner(); float voxelScale = node->getScale(); - nodeColor const & color = node->getColor(); glBufferIndex nodeIndex = GLBUFFER_INDEX_UNKNOWN; if (reuseIndex && node->isKnownBufferIndex()) { From 31db2188cb0f77060b070c0a485b05887dc84101 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 13 Dec 2014 07:58:13 -0800 Subject: [PATCH 14/37] remove test comment --- interface/src/Application.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index 1b51b99e77..f82b14b47e 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -12,8 +12,6 @@ #ifndef hifi_Application_h #define hifi_Application_h -// testing - #include #include From ad2dee5eaab5afa8e684d7e3274697a005567e8e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 16:26:08 -0800 Subject: [PATCH 15/37] Switched devices to DependencyManager for Faceshift --- interface/src/devices/FaceTracker.h | 2 +- interface/src/devices/Faceshift.h | 3 +++ interface/src/devices/Visage.cpp | 9 +++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/interface/src/devices/FaceTracker.h b/interface/src/devices/FaceTracker.h index 459f38cafc..75954871e5 100644 --- a/interface/src/devices/FaceTracker.h +++ b/interface/src/devices/FaceTracker.h @@ -23,8 +23,8 @@ class FaceTracker : public QObject { Q_OBJECT public: - FaceTracker(); + virtual ~FaceTracker() {} const glm::vec3& getHeadTranslation() const { return _headTranslation; } const glm::quat& getHeadRotation() const { return _headRotation; } diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 3b4092c099..618a8fb975 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -19,6 +19,8 @@ #include #endif +#include + #include "FaceTracker.h" /// Handles interaction with the Faceshift software, which provides head position/orientation and facial features. @@ -27,6 +29,7 @@ class Faceshift : public FaceTracker { public: Faceshift(); + virtual ~Faceshift() {} void init(); diff --git a/interface/src/devices/Visage.cpp b/interface/src/devices/Visage.cpp index 9c7416c219..38dcdb4ce6 100644 --- a/interface/src/devices/Visage.cpp +++ b/interface/src/devices/Visage.cpp @@ -11,11 +11,12 @@ #include + +#include +#include #include #include -#include - #include "Application.h" #include "Visage.h" @@ -119,7 +120,7 @@ static const QMultiHash >& getActionUnitNameMap() const float TRANSLATION_SCALE = 20.0f; void Visage::init() { - connect(Application::getInstance()->getFaceshift(), SIGNAL(connectionStateChanged()), SLOT(updateEnabled())); + connect(DependencyManager::get(), SIGNAL(connectionStateChanged()), SLOT(updateEnabled())); updateEnabled(); } @@ -171,7 +172,7 @@ void Visage::reset() { void Visage::updateEnabled() { setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Visage) && !(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift) && - Application::getInstance()->getFaceshift()->isConnectedOrConnecting())); + DependencyManager::get()->isConnectedOrConnecting())); } void Visage::setEnabled(bool enabled) { From 1d9e53e227026dfe685e082be3e2262a81724585 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 16:28:28 -0800 Subject: [PATCH 16/37] Switched avatar to DependencyManager for Faceshift --- interface/src/avatar/Head.cpp | 17 +++++++++-------- interface/src/avatar/MyAvatar.cpp | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 660ebfcbb3..4b1e9e358c 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -10,6 +10,7 @@ #include +#include #include #include "Application.h" @@ -196,14 +197,14 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { _mouth2 = glm::mix(_audioJawOpen * MMMM_POWER, _mouth2, MMMM_PERIOD + randFloat() * MMMM_RANDOM_PERIOD); _mouth4 = glm::mix(_audioJawOpen, _mouth4, SMILE_PERIOD + randFloat() * SMILE_RANDOM_PERIOD); - Application::getInstance()->getFaceshift()->updateFakeCoefficients(_leftEyeBlink, - _rightEyeBlink, - _browAudioLift, - _audioJawOpen, - _mouth2, - _mouth3, - _mouth4, - _blendshapeCoefficients); + DependencyManager::get()->updateFakeCoefficients(_leftEyeBlink, + _rightEyeBlink, + _browAudioLift, + _audioJawOpen, + _mouth2, + _mouth3, + _mouth4, + _blendshapeCoefficients); } else { _saccade = glm::vec3(); } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 32053ea076..17cda19980 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -421,8 +422,7 @@ void MyAvatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bo } void MyAvatar::renderHeadMouse(int screenWidth, int screenHeight) const { - - Faceshift* faceshift = Application::getInstance()->getFaceshift(); + Faceshift* faceshift = DependencyManager::get(); float pixelsPerDegree = screenHeight / Menu::getInstance()->getFieldOfView(); From 39a19a297ffd27fa92082ff389a6831c27e80cd5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 16:31:03 -0800 Subject: [PATCH 17/37] Switched menu to DependencyManager for Faceshift --- interface/src/Menu.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 5e35f08e95..ec9b93e072 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -31,9 +31,10 @@ #include #include -#include +#include #include #include +#include #include "Application.h" #include "AccountManager.h" @@ -432,7 +433,7 @@ Menu::Menu() : MenuOption::Faceshift, 0, true, - appInstance->getFaceshift(), + DependencyManager::get(), SLOT(setTCPEnabled(bool))); #endif #ifdef HAVE_VISAGE From 1db3592d4c593a595fe1a5905f94fb2c6c0b0271 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 19:56:42 -0800 Subject: [PATCH 18/37] Switched meFaceshifto DependencyManager for Faceshift --- interface/src/Application.cpp | 17 ++++++++++------- interface/src/Application.h | 4 +--- interface/src/devices/Faceshift.h | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7a0e61240a..8a13ef650d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -1690,8 +1691,10 @@ int Application::getMouseDragStartedY() const { } FaceTracker* Application::getActiveFaceTracker() { + Faceshift* faceshift = DependencyManager::get(); + return (_dde.isActive() ? static_cast(&_dde) : - (_faceshift.isActive() ? static_cast(&_faceshift) : + (faceshift->isActive() ? static_cast(faceshift) : (_visage.isActive() ? static_cast(&_visage) : NULL))); } @@ -1976,7 +1979,7 @@ void Application::init() { #endif // initialize our face trackers after loading the menu settings - _faceshift.init(); + DependencyManager::get()->init(); _visage.init(); Leapmotion::init(); @@ -2101,13 +2104,13 @@ void Application::updateMouseRay() { void Application::updateFaceshift() { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::updateFaceshift()"); - + Faceshift* faceshift = DependencyManager::get(); // Update faceshift - _faceshift.update(); + faceshift->update(); // Copy angular velocity if measured by faceshift, to the head - if (_faceshift.isActive()) { - _myAvatar->getHead()->setAngularVelocity(_faceshift.getHeadAngularVelocity()); + if (faceshift->isActive()) { + _myAvatar->getHead()->setAngularVelocity(faceshift->getHeadAngularVelocity()); } } @@ -3549,7 +3552,7 @@ void Application::deleteVoxelAt(const VoxelDetail& voxel) { } void Application::resetSensors() { - _faceshift.reset(); + DependencyManager::get()->reset(); _visage.reset(); _dde.reset(); diff --git a/interface/src/Application.h b/interface/src/Application.h index f82b14b47e..61ae317713 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -220,8 +220,7 @@ public: int getMouseDragStartedY() const; int getTrueMouseDragStartedX() const { return _mouseDragStartedX; } int getTrueMouseDragStartedY() const { return _mouseDragStartedY; } - bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated;; } - Faceshift* getFaceshift() { return &_faceshift; } + bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } Visage* getVisage() { return &_visage; } DdeFaceTracker* getDDE() { return &_dde; } FaceTracker* getActiveFaceTracker(); @@ -532,7 +531,6 @@ private: AvatarManager _avatarManager; MyAvatar* _myAvatar; // TODO: move this and relevant code to AvatarManager (or MyAvatar as the case may be) - Faceshift _faceshift; Visage _visage; DdeFaceTracker _dde; diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 618a8fb975..83be51c7fa 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -24,7 +24,7 @@ #include "FaceTracker.h" /// Handles interaction with the Faceshift software, which provides head position/orientation and facial features. -class Faceshift : public FaceTracker { +class Faceshift : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: From e40961df12f4edeee6c69250bfa9e9e8da09f37d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 21:34:27 -0800 Subject: [PATCH 19/37] Checking that T is in fact derived from Dependency --- libraries/shared/src/DependencyManager.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/DependencyManager.h b/libraries/shared/src/DependencyManager.h index 2a81941b8a..87c7c7b4a6 100644 --- a/libraries/shared/src/DependencyManager.h +++ b/libraries/shared/src/DependencyManager.h @@ -16,6 +16,7 @@ #include #include +#include class DependencyManager { public: @@ -56,7 +57,9 @@ T* DependencyManager::get() { // Found no instance in hash so we create one. T* newInstance = new T(); - getInstanceHash().insert(typeId, dynamic_cast(newInstance)); + instance = dynamic_cast(newInstance); + assert(instance != NULL); // If this triggers, check that T is derived from Dependency + getInstanceHash().insert(typeId, instance); return newInstance; } From 65094f21654e1ddd78232c20d9c0e8ff1e0985dd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 21:47:08 -0800 Subject: [PATCH 20/37] Update headers --- interface/src/Application.cpp | 1 + interface/src/Application.h | 1 - interface/src/Menu.cpp | 1 + interface/src/avatar/Head.cpp | 1 + interface/src/devices/Faceshift.cpp | 1 - interface/src/devices/Visage.cpp | 1 + 6 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8a13ef650d..3706206f1f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -77,6 +77,7 @@ #include "ModelUploader.h" #include "Util.h" +#include "devices/Faceshift.h" #include "devices/Leapmotion.h" #include "devices/MIDIManager.h" #include "devices/OculusManager.h" diff --git a/interface/src/Application.h b/interface/src/Application.h index 61ae317713..d1d15d22a9 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -54,7 +54,6 @@ #include "avatar/Avatar.h" #include "avatar/AvatarManager.h" #include "avatar/MyAvatar.h" -#include "devices/Faceshift.h" #include "devices/PrioVR.h" #include "devices/SixenseManager.h" #include "devices/Visage.h" diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ec9b93e072..c08df2b2c5 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -38,6 +38,7 @@ #include "Application.h" #include "AccountManager.h" +#include "devices/Faceshift.h" #include "Menu.h" #include "scripting/LocationScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 4b1e9e358c..a16cdd9270 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include "Application.h" diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index fb74f416a9..5c1bbfe709 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -14,7 +14,6 @@ #include #include -#include "Application.h" #include "Faceshift.h" #include "Menu.h" #include "Util.h" diff --git a/interface/src/devices/Visage.cpp b/interface/src/devices/Visage.cpp index 38dcdb4ce6..51b927df75 100644 --- a/interface/src/devices/Visage.cpp +++ b/interface/src/devices/Visage.cpp @@ -18,6 +18,7 @@ #include #include "Application.h" +#include "Faceshift.h" #include "Visage.h" // this has to go after our normal includes, because its definition of HANDLE conflicts with Qt's From 738f23f326a0e1d9ac353aeaef8c6c769d542166 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 14 Dec 2014 22:30:13 -0800 Subject: [PATCH 21/37] Moved visage and dde over to DependencyManager --- interface/src/Application.cpp | 18 +++++++++++------- interface/src/Application.h | 8 +------- interface/src/Menu.cpp | 5 +++-- interface/src/avatar/Head.cpp | 11 +++++++---- interface/src/devices/DdeFaceTracker.h | 13 ++++++++----- interface/src/devices/Faceshift.h | 6 +++--- interface/src/devices/Visage.h | 11 ++++++----- 7 files changed, 39 insertions(+), 33 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3706206f1f..fbe55071e4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -77,11 +77,13 @@ #include "ModelUploader.h" #include "Util.h" +#include "devices/DdeFaceTracker.h" #include "devices/Faceshift.h" #include "devices/Leapmotion.h" #include "devices/MIDIManager.h" #include "devices/OculusManager.h" #include "devices/TV3DManager.h" +#include "devices/Visage.h" #include "renderer/ProgramObject.h" #include "gpu/Batch.h" @@ -1693,10 +1695,12 @@ int Application::getMouseDragStartedY() const { FaceTracker* Application::getActiveFaceTracker() { Faceshift* faceshift = DependencyManager::get(); + Visage* visage = DependencyManager::get(); + DdeFaceTracker* dde = DependencyManager::get(); - return (_dde.isActive() ? static_cast(&_dde) : + return (dde->isActive() ? static_cast(dde) : (faceshift->isActive() ? static_cast(faceshift) : - (_visage.isActive() ? static_cast(&_visage) : NULL))); + (visage->isActive() ? static_cast(visage) : NULL))); } struct SendVoxelsOperationArgs { @@ -1981,7 +1985,7 @@ void Application::init() { // initialize our face trackers after loading the menu settings DependencyManager::get()->init(); - _visage.init(); + DependencyManager::get()->init(); Leapmotion::init(); @@ -2120,7 +2124,7 @@ void Application::updateVisage() { PerformanceWarning warn(showWarnings, "Application::updateVisage()"); // Update Visage - _visage.update(); + DependencyManager::get()->update(); } void Application::updateDDE() { @@ -2128,7 +2132,7 @@ void Application::updateDDE() { PerformanceWarning warn(showWarnings, "Application::updateDDE()"); // Update Cara - _dde.update(); + DependencyManager::get()->update(); } void Application::updateMyAvatarLookAtPosition() { @@ -3554,8 +3558,8 @@ void Application::deleteVoxelAt(const VoxelDetail& voxel) { void Application::resetSensors() { DependencyManager::get()->reset(); - _visage.reset(); - _dde.reset(); + DependencyManager::get()->reset(); + DependencyManager::get()->reset(); OculusManager::reset(); diff --git a/interface/src/Application.h b/interface/src/Application.h index d1d15d22a9..833f1374ce 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -56,8 +56,6 @@ #include "avatar/MyAvatar.h" #include "devices/PrioVR.h" #include "devices/SixenseManager.h" -#include "devices/Visage.h" -#include "devices/DdeFaceTracker.h" #include "entities/EntityTreeRenderer.h" #include "renderer/AmbientOcclusionEffect.h" #include "renderer/DeferredLightingEffect.h" @@ -99,6 +97,7 @@ class QMouseEvent; class QSettings; class QWheelEvent; +class FaceTracker; class Node; class ProgramObject; @@ -220,8 +219,6 @@ public: int getTrueMouseDragStartedX() const { return _mouseDragStartedX; } int getTrueMouseDragStartedY() const { return _mouseDragStartedY; } bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } - Visage* getVisage() { return &_visage; } - DdeFaceTracker* getDDE() { return &_dde; } FaceTracker* getActiveFaceTracker(); PrioVR* getPrioVR() { return &_prioVR; } BandwidthMeter* getBandwidthMeter() { return &_bandwidthMeter; } @@ -530,9 +527,6 @@ private: AvatarManager _avatarManager; MyAvatar* _myAvatar; // TODO: move this and relevant code to AvatarManager (or MyAvatar as the case may be) - Visage _visage; - DdeFaceTracker _dde; - PrioVR _prioVR; Camera _myCamera; // My view onto the world diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c08df2b2c5..6c2c3966fc 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -39,6 +39,8 @@ #include "Application.h" #include "AccountManager.h" #include "devices/Faceshift.h" +#include "devices/OculusManager.h" +#include "devices/Visage.h" #include "Menu.h" #include "scripting/LocationScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" @@ -51,7 +53,6 @@ #include "ui/ModelsBrowser.h" #include "ui/LoginDialog.h" #include "ui/NodeBounds.h" -#include "devices/OculusManager.h" Menu* Menu::_instance = NULL; @@ -439,7 +440,7 @@ Menu::Menu() : #endif #ifdef HAVE_VISAGE addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::Visage, 0, false, - appInstance->getVisage(), SLOT(updateEnabled())); + DependencyManager::get(), SLOT(updateEnabled())); #endif addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSkeletonCollisionShapes); diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index a16cdd9270..42b3c968e1 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include "Application.h" @@ -77,11 +78,13 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { // Only use face trackers when not playing back a recording. if (!myAvatar->isPlaying()) { FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); - if ((_isFaceshiftConnected = faceTracker)) { + DdeFaceTracker* dde = DependencyManager::get(); + Faceshift* faceshift = DependencyManager::get(); + + if ((_isFaceshiftConnected = (faceshift == faceTracker))) { _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); - _isFaceshiftConnected = true; - } else if (Application::getInstance()->getDDE()->isActive()) { - faceTracker = Application::getInstance()->getDDE(); + } else if (dde->isActive()) { + faceTracker = dde; _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); } } diff --git a/interface/src/devices/DdeFaceTracker.h b/interface/src/devices/DdeFaceTracker.h index 68d9e7d487..d80aa043e4 100644 --- a/interface/src/devices/DdeFaceTracker.h +++ b/interface/src/devices/DdeFaceTracker.h @@ -14,16 +14,14 @@ #include +#include + #include "FaceTracker.h" -class DdeFaceTracker : public FaceTracker { +class DdeFaceTracker : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: - DdeFaceTracker(); - DdeFaceTracker(const QHostAddress& host, quint16 port); - ~DdeFaceTracker(); - //initialization void init(); void reset(); @@ -57,6 +55,11 @@ private slots: void socketStateChanged(QAbstractSocket::SocketState socketState); private: + DdeFaceTracker(); + DdeFaceTracker(const QHostAddress& host, quint16 port); + ~DdeFaceTracker(); + friend DependencyManager; + float getBlendshapeCoefficient(int index) const; void decodePacket(const QByteArray& buffer); diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 83be51c7fa..3cca8f2bb1 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -28,9 +28,6 @@ class Faceshift : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: - Faceshift(); - virtual ~Faceshift() {} - void init(); bool isConnectedOrConnecting() const; @@ -90,6 +87,9 @@ private slots: void readFromSocket(); private: + Faceshift(); + virtual ~Faceshift() {} + friend DependencyManager; float getBlendshapeCoefficient(int index) const; diff --git a/interface/src/devices/Visage.h b/interface/src/devices/Visage.h index 33e2f0a7e1..73edddc4d7 100644 --- a/interface/src/devices/Visage.h +++ b/interface/src/devices/Visage.h @@ -16,6 +16,8 @@ #include #include +#include + #include "FaceTracker.h" namespace VisageSDK { @@ -24,14 +26,10 @@ namespace VisageSDK { } /// Handles input from the Visage webcam feature tracking software. -class Visage : public FaceTracker { +class Visage : public FaceTracker, public DependencyManager::Dependency { Q_OBJECT public: - - Visage(); - virtual ~Visage(); - void init(); bool isActive() const { return _active; } @@ -44,6 +42,9 @@ public slots: void updateEnabled(); private: + Visage(); + virtual ~Visage(); + friend DependencyManager; #ifdef HAVE_VISAGE VisageSDK::VisageTracker2* _tracker; From e253b8afa4cd83ef5dd89ad38d6634ce742aa9ea Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 12 Dec 2014 14:18:23 -0800 Subject: [PATCH 22/37] move TextureCache out of interface and Application --- interface/CMakeLists.txt | 2 +- interface/src/Application.cpp | 15 ++++++++----- interface/src/Application.h | 11 ++++++---- interface/src/MetavoxelSystem.h | 2 +- interface/src/avatar/Avatar.cpp | 2 +- interface/src/renderer/GeometryCache.h | 2 +- interface/src/renderer/Model.h | 2 +- interface/src/ui/overlays/BillboardOverlay.h | 3 ++- .../render-utils/src}/TextureCache.cpp | 22 +++++++++++++++---- .../render-utils/src}/TextureCache.h | 8 ++++++- 10 files changed, 49 insertions(+), 20 deletions(-) rename {interface/src/renderer => libraries/render-utils/src}/TextureCache.cpp (98%) rename {interface/src/renderer => libraries/render-utils/src}/TextureCache.h (97%) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 38dd02c655..ffc401ba63 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -107,7 +107,7 @@ endif() add_executable(${TARGET_NAME} MACOSX_BUNDLE ${INTERFACE_SRCS} ${QM}) # link required hifi libraries -link_hifi_libraries(shared octree voxels gpu fbx metavoxels networking entities avatars audio animation script-engine physics) +link_hifi_libraries(shared octree voxels gpu fbx metavoxels networking entities avatars audio animation script-engine physics render-utils) # find any optional and required libraries find_package(ZLIB REQUIRED) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fbe55071e4..0c1d2c3b9f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -177,6 +177,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _touchAvgY(0.0f), _isTouchPressed(false), _mousePressed(false), + _textureCache(NULL), _audio(), _enableProcessVoxelsThread(true), _octreeProcessor(), @@ -194,6 +195,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _isVSyncOn(true), _aboutToQuit(false) { + _textureCache = TextureCache::getInstance(); // read the ApplicationInfo.ini file for Name/Version/Domain information QSettings applicationInfo(Application::resourcesPath() + "info/ApplicationInfo.ini", QSettings::IniFormat); @@ -621,10 +623,10 @@ void Application::paintGL() { // Set the desired FBO texture size. If it hasn't changed, this does nothing. // Otherwise, it must rebuild the FBOs if (OculusManager::isConnected()) { - _textureCache.setFrameBufferSize(OculusManager::getRenderTargetSize()); + _textureCache->setFrameBufferSize(OculusManager::getRenderTargetSize()); } else { QSize fbSize = _glWidget->getDeviceSize() * getRenderResolutionScale(); - _textureCache.setFrameBufferSize(fbSize); + _textureCache->setFrameBufferSize(fbSize); } glEnable(GL_LINE_SMOOTH); @@ -2042,6 +2044,9 @@ void Application::init() { // save settings when avatar changes connect(_myAvatar, &MyAvatar::transformChanged, this, &Application::bumpSettings); + + // make sure our texture cache knows about window size changes + _textureCache->associateWithWidget(getGLWidget()); } void Application::closeMirrorView() { @@ -2772,7 +2777,7 @@ glm::vec3 Application::getSunDirection() { void Application::updateShadowMap() { PerformanceTimer perfTimer("shadowMap"); - QOpenGLFramebufferObject* fbo = _textureCache.getShadowFramebufferObject(); + QOpenGLFramebufferObject* fbo = _textureCache->getShadowFramebufferObject(); fbo->bind(); glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -2937,7 +2942,7 @@ void Application::setupWorldLight() { } QImage Application::renderAvatarBillboard() { - _textureCache.getPrimaryFramebufferObject()->bind(); + _textureCache->getPrimaryFramebufferObject()->bind(); // the "glow" here causes an alpha of one Glower glower; @@ -2948,7 +2953,7 @@ QImage Application::renderAvatarBillboard() { QImage image(BILLBOARD_SIZE, BILLBOARD_SIZE, QImage::Format_ARGB32); glReadPixels(0, 0, BILLBOARD_SIZE, BILLBOARD_SIZE, GL_BGRA, GL_UNSIGNED_BYTE, image.bits()); - _textureCache.getPrimaryFramebufferObject()->release(); + _textureCache->getPrimaryFramebufferObject()->release(); return image; } diff --git a/interface/src/Application.h b/interface/src/Application.h index 833f1374ce..99184e990d 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -12,6 +12,9 @@ #ifndef hifi_Application_h #define hifi_Application_h +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include #include @@ -34,9 +37,10 @@ #include #include #include +#include #include #include -#include +#include #include #include @@ -61,7 +65,6 @@ #include "renderer/DeferredLightingEffect.h" #include "renderer/GeometryCache.h" #include "renderer/GlowEffect.h" -#include "renderer/TextureCache.h" #include "scripting/ControllerScriptingInterface.h" #include "ui/BandwidthDialog.h" #include "ui/BandwidthMeter.h" @@ -251,7 +254,7 @@ public: GeometryCache* getGeometryCache() { return &_geometryCache; } AnimationCache* getAnimationCache() { return &_animationCache; } - TextureCache* getTextureCache() { return &_textureCache; } + TextureCache* getTextureCache() { return _textureCache; } DeferredLightingEffect* getDeferredLightingEffect() { return &_deferredLightingEffect; } GlowEffect* getGlowEffect() { return &_glowEffect; } ControllerScriptingInterface* getControllerScriptingInterface() { return &_controllerScriptingInterface; } @@ -571,7 +574,7 @@ private: GeometryCache _geometryCache; AnimationCache _animationCache; - TextureCache _textureCache; + TextureCache* _textureCache; DeferredLightingEffect _deferredLightingEffect; GlowEffect _glowEffect; diff --git a/interface/src/MetavoxelSystem.h b/interface/src/MetavoxelSystem.h index 2ebf7e1146..0c0f9b49b7 100644 --- a/interface/src/MetavoxelSystem.h +++ b/interface/src/MetavoxelSystem.h @@ -20,9 +20,9 @@ #include #include +#include #include "renderer/ProgramObject.h" -#include "renderer/TextureCache.h" class HeightfieldBaseLayerBatch; class HeightfieldSplatBatch; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index c680c75056..e4ea33a180 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "Application.h" #include "Avatar.h" @@ -36,7 +37,6 @@ #include "Recorder.h" #include "world.h" #include "devices/OculusManager.h" -#include "renderer/TextureCache.h" #include "ui/TextRenderer.h" using namespace std; diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index 6faad93fe4..2d06953eb5 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -13,7 +13,7 @@ #define hifi_GeometryCache_h // include this before QOpenGLBuffer, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" +#include #include #include diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index e875c8f06c..74b227083f 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -21,13 +21,13 @@ #include #include #include +#include #include "AnimationHandle.h" #include "GeometryCache.h" #include "InterfaceConfig.h" #include "JointState.h" #include "ProgramObject.h" -#include "TextureCache.h" class QScriptEngine; diff --git a/interface/src/ui/overlays/BillboardOverlay.h b/interface/src/ui/overlays/BillboardOverlay.h index 03daef934d..dcb8ab8b0c 100644 --- a/interface/src/ui/overlays/BillboardOverlay.h +++ b/interface/src/ui/overlays/BillboardOverlay.h @@ -15,8 +15,9 @@ #include #include +#include + #include "Base3DOverlay.h" -#include "../../renderer/TextureCache.h" class BillboardOverlay : public Base3DOverlay { Q_OBJECT diff --git a/interface/src/renderer/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp similarity index 98% rename from interface/src/renderer/TextureCache.cpp rename to libraries/render-utils/src/TextureCache.cpp index f40f0e3faf..11ccd4b797 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -10,20 +10,26 @@ // // include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" +#include #include #include #include +#include #include #include #include #include -#include "Application.h" #include "TextureCache.h" +TextureCache* TextureCache::getInstance() { + static TextureCache instance; + return &instance; +} + + TextureCache::TextureCache() : _permutationNormalTextureID(0), _whiteTextureID(0), @@ -35,7 +41,8 @@ TextureCache::TextureCache() : _secondaryFramebufferObject(NULL), _tertiaryFramebufferObject(NULL), _shadowFramebufferObject(NULL), - _frameBufferSize(100, 100) + _frameBufferSize(100, 100), + _associatedWidget(NULL) { } @@ -350,9 +357,16 @@ QSharedPointer TextureCache::createResource(const QUrl& url, &Resource::allReferencesCleared); } +void TextureCache::associateWithWidget(QGLWidget* widget) { + if (_associatedWidget) { + _associatedWidget->removeEventFilter(this); + } + _associatedWidget = widget; + _associatedWidget->installEventFilter(this); +} + QOpenGLFramebufferObject* TextureCache::createFramebufferObject() { QOpenGLFramebufferObject* fbo = new QOpenGLFramebufferObject(_frameBufferSize); - Application::getInstance()->getGLWidget()->installEventFilter(this); glBindTexture(GL_TEXTURE_2D, fbo->texture()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); diff --git a/interface/src/renderer/TextureCache.h b/libraries/render-utils/src/TextureCache.h similarity index 97% rename from interface/src/renderer/TextureCache.h rename to libraries/render-utils/src/TextureCache.h index 66734da9cd..3808485135 100644 --- a/interface/src/renderer/TextureCache.h +++ b/libraries/render-utils/src/TextureCache.h @@ -14,10 +14,11 @@ #include #include +#include #include -#include "InterfaceConfig.h" +#include class QOpenGLFramebufferObject; @@ -32,10 +33,14 @@ class TextureCache : public ResourceCache { Q_OBJECT public: + + static TextureCache* getInstance(); TextureCache(); virtual ~TextureCache(); + void associateWithWidget(QGLWidget* widget); + /// Sets the desired texture resolution for the framebuffer objects. void setFrameBufferSize(QSize frameBufferSize); const QSize& getFrameBufferSize() const { return _frameBufferSize; } @@ -115,6 +120,7 @@ private: GLuint _shadowDepthTextureID; QSize _frameBufferSize; + QGLWidget* _associatedWidget; }; /// A simple object wrapper for an OpenGL texture. From 2df4c017f1083c54a2fa00e199456b4813192f27 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 12 Dec 2014 14:56:27 -0800 Subject: [PATCH 23/37] move GeometryCache out of application and remove dependency on Model --- interface/src/Application.h | 2 +- interface/src/renderer/Model.cpp | 44 ++++++++++++++- interface/src/renderer/Model.h | 25 ++++++++- .../render-utils/src}/GeometryCache.cpp | 55 +++++-------------- .../render-utils/src}/GeometryCache.h | 12 ---- 5 files changed, 81 insertions(+), 57 deletions(-) rename {interface/src/renderer => libraries/render-utils/src}/GeometryCache.cpp (95%) rename {interface/src/renderer => libraries/render-utils/src}/GeometryCache.h (92%) diff --git a/interface/src/Application.h b/interface/src/Application.h index 99184e990d..5b97c1301f 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -63,7 +64,6 @@ #include "entities/EntityTreeRenderer.h" #include "renderer/AmbientOcclusionEffect.h" #include "renderer/DeferredLightingEffect.h" -#include "renderer/GeometryCache.h" #include "renderer/GlowEffect.h" #include "scripting/ControllerScriptingInterface.h" #include "ui/BandwidthDialog.h" diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index fd54f67377..c0295fd9b5 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -1149,7 +1149,7 @@ void Blender::run() { } } // post the result to the geometry cache, which will dispatch to the model if still alive - QMetaObject::invokeMethod(Application::getInstance()->getGeometryCache(), "setBlendedVertices", + QMetaObject::invokeMethod(ModelBlender::getInstance(), "setBlendedVertices", Q_ARG(const QPointer&, _model), Q_ARG(int, _blendNumber), Q_ARG(const QWeakPointer&, _geometry), Q_ARG(const QVector&, vertices), Q_ARG(const QVector&, normals)); @@ -1312,7 +1312,7 @@ void Model::simulateInternal(float deltaTime) { // post the blender if we're not currently waiting for one to finish if (geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { _blendedBlendshapeCoefficients = _blendshapeCoefficients; - Application::getInstance()->getGeometryCache()->noteRequiresBlend(this); + ModelBlender::getInstance()->noteRequiresBlend(this); } } @@ -2544,3 +2544,43 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod return meshPartsRendered; } + +ModelBlender* ModelBlender::getInstance() { + static ModelBlender instance; + return &instance; +} + +ModelBlender::ModelBlender() : + _pendingBlenders(0) { +} + +ModelBlender::~ModelBlender() { +} + +void ModelBlender::noteRequiresBlend(Model* model) { + if (_pendingBlenders < QThread::idealThreadCount()) { + if (model->maybeStartBlender()) { + _pendingBlenders++; + } + return; + } + if (!_modelsRequiringBlends.contains(model)) { + _modelsRequiringBlends.append(model); + } +} + +void ModelBlender::setBlendedVertices(const QPointer& model, int blendNumber, + const QWeakPointer& geometry, const QVector& vertices, const QVector& normals) { + if (!model.isNull()) { + model->setBlendedVertices(blendNumber, geometry, vertices, normals); + } + _pendingBlenders--; + while (!_modelsRequiringBlends.isEmpty()) { + Model* nextModel = _modelsRequiringBlends.takeFirst(); + if (nextModel && nextModel->maybeStartBlender()) { + _pendingBlenders++; + return; + } + } +} + diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index 74b227083f..d74f95095d 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -453,12 +453,35 @@ private: static int renderMeshesForModelsInScene(gpu::Batch& batch, RenderMode mode, bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args); - }; Q_DECLARE_METATYPE(QPointer) Q_DECLARE_METATYPE(QWeakPointer) Q_DECLARE_METATYPE(QVector) +/// Handle management of pending models that need blending +class ModelBlender : public QObject { + Q_OBJECT + +public: + + static ModelBlender* getInstance(); + + ModelBlender(); + virtual ~ModelBlender(); + + + /// Adds the specified model to the list requiring vertex blends. + void noteRequiresBlend(Model* model); + +public slots: + void setBlendedVertices(const QPointer& model, int blendNumber, const QWeakPointer& geometry, + const QVector& vertices, const QVector& normals); + +private: + QList > _modelsRequiringBlends; + int _pendingBlenders; +}; + #endif // hifi_Model_h diff --git a/interface/src/renderer/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp similarity index 95% rename from interface/src/renderer/GeometryCache.cpp rename to libraries/render-utils/src/GeometryCache.cpp index d753901243..6e0c40c28d 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -15,13 +15,13 @@ #include #include -#include "Application.h" -#include "GeometryCache.h" -#include "Model.h" -#include "world.h" +#include -GeometryCache::GeometryCache() : - _pendingBlenders(0) { +#include "TextureCache.h" + +#include "GeometryCache.h" + +GeometryCache::GeometryCache() { } GeometryCache::~GeometryCache() { @@ -505,33 +505,6 @@ QSharedPointer GeometryCache::getGeometry(const QUrl& url, cons return getResource(url, fallback, delayLoad).staticCast(); } -void GeometryCache::noteRequiresBlend(Model* model) { - if (_pendingBlenders < QThread::idealThreadCount()) { - if (model->maybeStartBlender()) { - _pendingBlenders++; - } - return; - } - if (!_modelsRequiringBlends.contains(model)) { - _modelsRequiringBlends.append(model); - } -} - -void GeometryCache::setBlendedVertices(const QPointer& model, int blendNumber, - const QWeakPointer& geometry, const QVector& vertices, const QVector& normals) { - if (!model.isNull()) { - model->setBlendedVertices(blendNumber, geometry, vertices, normals); - } - _pendingBlenders--; - while (!_modelsRequiringBlends.isEmpty()) { - Model* nextModel = _modelsRequiringBlends.takeFirst(); - if (nextModel && nextModel->maybeStartBlender()) { - _pendingBlenders++; - return; - } - } -} - QSharedPointer GeometryCache::createResource(const QUrl& url, const QSharedPointer& fallback, bool delayLoad, const void* extra) { QSharedPointer geometry(new NetworkGeometry(url, fallback.staticCast(), delayLoad), @@ -732,19 +705,19 @@ void NetworkGeometry::setTextureWithNameToURL(const QString& name, const QUrl& u QSharedPointer matchingTexture = QSharedPointer(); if (part.diffuseTextureName == name) { part.diffuseTexture = - Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, + TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, _geometry.meshes[i].isEye, QByteArray()); part.diffuseTexture->setLoadPriorities(_loadPriorities); } else if (part.normalTextureName == name) { - part.normalTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, + part.normalTexture = TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.normalTexture->setLoadPriorities(_loadPriorities); } else if (part.specularTextureName == name) { - part.specularTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, + part.specularTexture = TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.specularTexture->setLoadPriorities(_loadPriorities); } else if (part.emissiveTextureName == name) { - part.emissiveTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, + part.emissiveTexture = TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.emissiveTexture->setLoadPriorities(_loadPriorities); } @@ -945,28 +918,28 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { foreach (const FBXMeshPart& part, mesh.parts) { NetworkMeshPart networkPart; if (!part.diffuseTexture.filename.isEmpty()) { - networkPart.diffuseTexture = Application::getInstance()->getTextureCache()->getTexture( + networkPart.diffuseTexture = TextureCache::getInstance()->getTexture( _textureBase.resolved(QUrl(part.diffuseTexture.filename)), DEFAULT_TEXTURE, mesh.isEye, part.diffuseTexture.content); networkPart.diffuseTextureName = part.diffuseTexture.name; networkPart.diffuseTexture->setLoadPriorities(_loadPriorities); } if (!part.normalTexture.filename.isEmpty()) { - networkPart.normalTexture = Application::getInstance()->getTextureCache()->getTexture( + networkPart.normalTexture = TextureCache::getInstance()->getTexture( _textureBase.resolved(QUrl(part.normalTexture.filename)), NORMAL_TEXTURE, false, part.normalTexture.content); networkPart.normalTextureName = part.normalTexture.name; networkPart.normalTexture->setLoadPriorities(_loadPriorities); } if (!part.specularTexture.filename.isEmpty()) { - networkPart.specularTexture = Application::getInstance()->getTextureCache()->getTexture( + networkPart.specularTexture = TextureCache::getInstance()->getTexture( _textureBase.resolved(QUrl(part.specularTexture.filename)), SPECULAR_TEXTURE, false, part.specularTexture.content); networkPart.specularTextureName = part.specularTexture.name; networkPart.specularTexture->setLoadPriorities(_loadPriorities); } if (!part.emissiveTexture.filename.isEmpty()) { - networkPart.emissiveTexture = Application::getInstance()->getTextureCache()->getTexture( + networkPart.emissiveTexture = TextureCache::getInstance()->getTexture( _textureBase.resolved(QUrl(part.emissiveTexture.filename)), EMISSIVE_TEXTURE, false, part.emissiveTexture.content); networkPart.emissiveTextureName = part.emissiveTexture.name; diff --git a/interface/src/renderer/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h similarity index 92% rename from interface/src/renderer/GeometryCache.h rename to libraries/render-utils/src/GeometryCache.h index 2d06953eb5..9fe6a7d5a2 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -26,7 +26,6 @@ #include "gpu/Stream.h" -class Model; class NetworkGeometry; class NetworkMesh; class NetworkTexture; @@ -52,14 +51,6 @@ public: /// \param delayLoad if true, don't load the geometry immediately; wait until load is first requested QSharedPointer getGeometry(const QUrl& url, const QUrl& fallback = QUrl(), bool delayLoad = false); - /// Adds the specified model to the list requiring vertex blends. - void noteRequiresBlend(Model* model); - -public slots: - - void setBlendedVertices(const QPointer& model, int blendNumber, const QWeakPointer& geometry, - const QVector& vertices, const QVector& normals); - protected: virtual QSharedPointer createResource(const QUrl& url, @@ -78,9 +69,6 @@ private: QHash _gridBuffers; QHash > _networkGeometry; - - QList > _modelsRequiringBlends; - int _pendingBlenders; }; /// Geometry loaded from the network. From e9ea6b20ce0bd5904af864da058a16d5ef7f7305 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 12 Dec 2014 15:29:42 -0800 Subject: [PATCH 24/37] use TextureCache::getInstance() instead of Application::getInstance()->getTextureCache() --- interface/src/Application.cpp | 2 +- interface/src/MetavoxelSystem.cpp | 18 +++++++-------- interface/src/ModelUploader.cpp | 2 +- interface/src/devices/OculusManager.cpp | 6 ++--- .../src/renderer/AmbientOcclusionEffect.cpp | 6 ++--- .../src/renderer/DeferredLightingEffect.cpp | 22 +++++++++---------- interface/src/renderer/GlowEffect.cpp | 14 ++++++------ interface/src/renderer/Model.cpp | 20 ++++++++--------- interface/src/ui/MetavoxelEditor.cpp | 2 +- interface/src/voxels/VoxelSystem.cpp | 6 ++--- 10 files changed, 49 insertions(+), 49 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0c1d2c3b9f..eaaeb0534f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -716,7 +716,7 @@ void Application::paintGL() { _glowEffect.prepare(); // Viewport is assigned to the size of the framebuffer - QSize size = Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject()->size(); + QSize size = TextureCache::getInstance()->getPrimaryFramebufferObject()->size(); glViewport(0, 0, size.width(), size.height()); glMatrixMode(GL_MODELVIEW); diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 002acec9ed..2e3e9796f3 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -205,7 +205,7 @@ void MetavoxelSystem::render() { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, true); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); glDisable(GL_BLEND); glEnable(GL_CULL_FACE); @@ -251,7 +251,7 @@ void MetavoxelSystem::render() { glPopMatrix(); } - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); _baseHeightfieldProgram.release(); @@ -348,7 +348,7 @@ void MetavoxelSystem::render() { } if (!_voxelBaseBatches.isEmpty()) { - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, true); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); glEnableClientState(GL_VERTEX_ARRAY); glDisable(GL_BLEND); @@ -383,7 +383,7 @@ void MetavoxelSystem::render() { glDisable(GL_ALPHA_TEST); glEnable(GL_BLEND); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); if (!_voxelSplatBatches.isEmpty()) { glDepthFunc(GL_LEQUAL); @@ -463,7 +463,7 @@ void MetavoxelSystem::render() { } if (!_hermiteBatches.isEmpty() && Menu::getInstance()->isOptionChecked(MenuOption::DisplayHermiteData)) { - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, true); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); glEnableClientState(GL_VERTEX_ARRAY); @@ -486,7 +486,7 @@ void MetavoxelSystem::render() { glDisableClientState(GL_VERTEX_ARRAY); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); } _hermiteBatches.clear(); @@ -797,7 +797,7 @@ void MetavoxelSystem::applyMaterialEdit(const MetavoxelEditMessage& message, boo Q_ARG(bool, reliable)); return; } - QSharedPointer texture = Application::getInstance()->getTextureCache()->getTexture( + QSharedPointer texture = TextureCache::getInstance()->getTexture( material->getDiffuse(), SPLAT_TEXTURE); if (texture->isLoaded()) { MetavoxelEditMessage newMessage = message; @@ -1180,7 +1180,7 @@ void VoxelBuffer::render(bool cursor) { for (int i = 0; i < _materials.size(); i++) { const SharedObjectPointer material = _materials.at(i); if (material) { - _networkTextures[i] = Application::getInstance()->getTextureCache()->getTexture( + _networkTextures[i] = TextureCache::getInstance()->getTexture( static_cast(material.data())->getDiffuse(), SPLAT_TEXTURE); } } @@ -2234,7 +2234,7 @@ void HeightfieldNodeRenderer::render(const HeightfieldNodePointer& node, const g for (int i = 0; i < materials.size(); i++) { const SharedObjectPointer& material = materials.at(i); if (material) { - _networkTextures[i] = Application::getInstance()->getTextureCache()->getTexture( + _networkTextures[i] = TextureCache::getInstance()->getTexture( static_cast(material.data())->getDiffuse(), SPLAT_TEXTURE); } } diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index d9e8ed0c40..6c167ca59a 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -473,7 +473,7 @@ void ModelUploader::processCheck() { QMessageBox::Ok); Application::getInstance()->getGeometryCache()->refresh(_url); foreach (const QByteArray& filename, _textureFilenames) { - Application::getInstance()->getTextureCache()->refresh(_textureBase + filename); + TextureCache::getInstance()->refresh(_textureBase + filename); } deleteLater(); break; diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index dfec98c358..0eb0c732c9 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -449,7 +449,7 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p if (Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect)) { Application::getInstance()->getGlowEffect()->prepare(); } else { - Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject()->bind(); + TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } @@ -555,8 +555,8 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p QOpenGLFramebufferObject* fbo = Application::getInstance()->getGlowEffect()->render(true); glBindTexture(GL_TEXTURE_2D, fbo->texture()); } else { - Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject()->release(); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject()->texture()); + TextureCache::getInstance()->getPrimaryFramebufferObject()->release(); + glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryFramebufferObject()->texture()); } // restore our normal viewport diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index f75ed7e8c3..9ef0fa2d82 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -98,7 +98,7 @@ void AmbientOcclusionEffect::render() { glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryDepthTextureID()); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _rotationTextureID); @@ -116,7 +116,7 @@ void AmbientOcclusionEffect::render() { glGetIntegerv(GL_VIEWPORT, viewport); const int VIEWPORT_X_INDEX = 0; const int VIEWPORT_WIDTH_INDEX = 2; - QOpenGLFramebufferObject* primaryFBO = Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject(); + QOpenGLFramebufferObject* primaryFBO = TextureCache::getInstance()->getPrimaryFramebufferObject(); float sMin = viewport[VIEWPORT_X_INDEX] / (float)primaryFBO->width(); float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)primaryFBO->width(); @@ -141,7 +141,7 @@ void AmbientOcclusionEffect::render() { glActiveTexture(GL_TEXTURE0); // now render secondary to primary with 4x4 blur - Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject()->bind(); + TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); glEnable(GL_BLEND); glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); diff --git a/interface/src/renderer/DeferredLightingEffect.cpp b/interface/src/renderer/DeferredLightingEffect.cpp index be4e457131..7c3436b2bc 100644 --- a/interface/src/renderer/DeferredLightingEffect.cpp +++ b/interface/src/renderer/DeferredLightingEffect.cpp @@ -37,7 +37,7 @@ void DeferredLightingEffect::init() { } void DeferredLightingEffect::bindSimpleProgram() { - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, true, true); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, true, true); _simpleProgram.bind(); _simpleProgram.setUniformValue(_glowIntensityLocation, Application::getInstance()->getGlowEffect()->getIntensity()); glDisable(GL_BLEND); @@ -46,7 +46,7 @@ void DeferredLightingEffect::bindSimpleProgram() { void DeferredLightingEffect::releaseSimpleProgram() { glEnable(GL_BLEND); _simpleProgram.release(); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false, false); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, false, false); } void DeferredLightingEffect::renderSolidSphere(float radius, int slices, int stacks) { @@ -117,15 +117,15 @@ void DeferredLightingEffect::addSpotLight(const glm::vec3& position, float radiu void DeferredLightingEffect::prepare() { // clear the normal and specular buffers - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, true, false); + TextureCache::getInstance()->setPrimaryDrawBuffers(false, true, false); glClear(GL_COLOR_BUFFER_BIT); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, false, true); + TextureCache::getInstance()->setPrimaryDrawBuffers(false, false, true); // clearing to zero alpha for specular causes problems on my Nvidia card; clear to lowest non-zero value instead const float MAX_SPECULAR_EXPONENT = 128.0f; glClearColor(0.0f, 0.0f, 0.0f, 1.0f / MAX_SPECULAR_EXPONENT); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false, false); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, false, false); } void DeferredLightingEffect::render() { @@ -138,7 +138,7 @@ void DeferredLightingEffect::render() { glDisable(GL_COLOR_MATERIAL); glDepthMask(false); - QOpenGLFramebufferObject* primaryFBO = Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject(); + QOpenGLFramebufferObject* primaryFBO = TextureCache::getInstance()->getPrimaryFramebufferObject(); primaryFBO->release(); QOpenGLFramebufferObject* freeFBO = Application::getInstance()->getGlowEffect()->getFreeFramebufferObject(); @@ -148,13 +148,13 @@ void DeferredLightingEffect::render() { glBindTexture(GL_TEXTURE_2D, primaryFBO->texture()); glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryNormalTextureID()); + glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryNormalTextureID()); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimarySpecularTextureID()); + glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimarySpecularTextureID()); glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryDepthTextureID()); // get the viewport side (left, right, both) int viewport[4]; @@ -173,7 +173,7 @@ void DeferredLightingEffect::render() { bool shadowsEnabled = Menu::getInstance()->getShadowsEnabled(); if (shadowsEnabled) { glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getShadowDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getShadowDepthTextureID()); program = &_directionalLightShadowMap; locations = &_directionalLightShadowMapLocations; @@ -188,7 +188,7 @@ void DeferredLightingEffect::render() { program->bind(); } program->setUniformValue(locations->shadowScale, - 1.0f / Application::getInstance()->getTextureCache()->getShadowFramebufferObject()->width()); + 1.0f / TextureCache::getInstance()->getShadowFramebufferObject()->width()); } else { program->bind(); diff --git a/interface/src/renderer/GlowEffect.cpp b/interface/src/renderer/GlowEffect.cpp index 9e9c1f2ed5..8a9d957234 100644 --- a/interface/src/renderer/GlowEffect.cpp +++ b/interface/src/renderer/GlowEffect.cpp @@ -41,8 +41,8 @@ GlowEffect::~GlowEffect() { QOpenGLFramebufferObject* GlowEffect::getFreeFramebufferObject() const { return (_isOddFrame ? - Application::getInstance()->getTextureCache()->getSecondaryFramebufferObject(): - Application::getInstance()->getTextureCache()->getTertiaryFramebufferObject()); + TextureCache::getInstance()->getSecondaryFramebufferObject(): + TextureCache::getInstance()->getTertiaryFramebufferObject()); } static ProgramObject* createProgram(const QString& name) { @@ -88,7 +88,7 @@ void GlowEffect::init() { } void GlowEffect::prepare() { - Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject()->bind(); + TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); _isEmpty = true; @@ -122,7 +122,7 @@ static void maybeRelease(QOpenGLFramebufferObject* fbo) { QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { PerformanceTimer perfTimer("glowEffect"); - QOpenGLFramebufferObject* primaryFBO = Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject(); + QOpenGLFramebufferObject* primaryFBO = TextureCache::getInstance()->getPrimaryFramebufferObject(); primaryFBO->release(); glBindTexture(GL_TEXTURE_2D, primaryFBO->texture()); @@ -138,7 +138,7 @@ QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { glDepthMask(GL_FALSE); QOpenGLFramebufferObject* destFBO = toTexture ? - Application::getInstance()->getTextureCache()->getSecondaryFramebufferObject() : NULL; + TextureCache::getInstance()->getSecondaryFramebufferObject() : NULL; if (!Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect) || _isEmpty) { // copy the primary to the screen if (destFBO && QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()) { @@ -160,9 +160,9 @@ QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { } else { // diffuse into the secondary/tertiary (alternating between frames) QOpenGLFramebufferObject* oldDiffusedFBO = - Application::getInstance()->getTextureCache()->getSecondaryFramebufferObject(); + TextureCache::getInstance()->getSecondaryFramebufferObject(); QOpenGLFramebufferObject* newDiffusedFBO = - Application::getInstance()->getTextureCache()->getTertiaryFramebufferObject(); + TextureCache::getInstance()->getTertiaryFramebufferObject(); if (_isOddFrame) { qSwap(oldDiffusedFBO, newDiffusedFBO); } diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index c0295fd9b5..bea94c019f 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -749,7 +749,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { } - /*Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers( + /*TextureCache::getInstance()->setPrimaryDrawBuffers( mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE, mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE, mode == DEFAULT_RENDER_MODE); @@ -789,7 +789,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, args); // render translucent meshes afterwards - //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, true, true); + //TextureCache::getInstance()->setPrimaryDrawBuffers(false, true, true); { GLenum buffers[2]; int bufferCount = 0; @@ -814,7 +814,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { GLBATCH(glDepthMask)(false); GLBATCH(glDepthFunc)(GL_LEQUAL); - //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true); + //TextureCache::getInstance()->setPrimaryDrawBuffers(true); { GLenum buffers[1]; int bufferCount = 0; @@ -1705,7 +1705,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { } - /*Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers( + /*TextureCache::getInstance()->setPrimaryDrawBuffers( mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE, mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE, mode == DEFAULT_RENDER_MODE); @@ -1745,7 +1745,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, args); // render translucent meshes afterwards - //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, true, true); + //TextureCache::getInstance()->setPrimaryDrawBuffers(false, true, true); { GLenum buffers[2]; int bufferCount = 0; @@ -1770,7 +1770,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { GLBATCH(glDepthMask)(false); GLBATCH(glDepthFunc)(GL_LEQUAL); - //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true); + //TextureCache::getInstance()->setPrimaryDrawBuffers(true); { GLenum buffers[1]; int bufferCount = 0; @@ -2446,7 +2446,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod if (showDiffuse && diffuseMap) { GLBATCH(glBindTexture)(GL_TEXTURE_2D, diffuseMap->getID()); } else { - GLBATCH(glBindTexture)(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getWhiteTextureID()); + GLBATCH(glBindTexture)(GL_TEXTURE_2D, TextureCache::getInstance()->getWhiteTextureID()); } if (locations->texcoordMatrices >= 0) { @@ -2464,7 +2464,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE1); Texture* normalMap = networkPart.normalTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !normalMap ? - Application::getInstance()->getTextureCache()->getBlueTextureID() : normalMap->getID()); + TextureCache::getInstance()->getBlueTextureID() : normalMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } @@ -2472,7 +2472,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE0 + locations->specularTextureUnit); Texture* specularMap = networkPart.specularTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !specularMap ? - Application::getInstance()->getTextureCache()->getWhiteTextureID() : specularMap->getID()); + TextureCache::getInstance()->getWhiteTextureID() : specularMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } @@ -2493,7 +2493,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE0 + locations->emissiveTextureUnit); Texture* emissiveMap = networkPart.emissiveTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !emissiveMap ? - Application::getInstance()->getTextureCache()->getWhiteTextureID() : emissiveMap->getID()); + TextureCache::getInstance()->getWhiteTextureID() : emissiveMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } diff --git a/interface/src/ui/MetavoxelEditor.cpp b/interface/src/ui/MetavoxelEditor.cpp index 97c4c08b41..bc20def66f 100644 --- a/interface/src/ui/MetavoxelEditor.cpp +++ b/interface/src/ui/MetavoxelEditor.cpp @@ -916,7 +916,7 @@ void MaterialControl::updateTexture() { _texture.clear(); return; } - _texture = Application::getInstance()->getTextureCache()->getTexture(material->getDiffuse(), SPLAT_TEXTURE); + _texture = TextureCache::getInstance()->getTexture(material->getDiffuse(), SPLAT_TEXTURE); if (_texture) { if (_texture->isLoaded()) { textureLoaded(); diff --git a/interface/src/voxels/VoxelSystem.cpp b/interface/src/voxels/VoxelSystem.cpp index 67f3d585ea..3a50c07a71 100644 --- a/interface/src/voxels/VoxelSystem.cpp +++ b/interface/src/voxels/VoxelSystem.cpp @@ -1171,7 +1171,7 @@ void VoxelSystem::render() { void VoxelSystem::applyScaleAndBindProgram(bool texture) { if (texture) { bindPerlinModulateProgram(); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPermutationNormalTextureID()); + glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPermutationNormalTextureID()); } else { _program.bind(); } @@ -1179,7 +1179,7 @@ void VoxelSystem::applyScaleAndBindProgram(bool texture) { glPushMatrix(); glScalef(_treeScale, _treeScale, _treeScale); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, true); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); } void VoxelSystem::removeScaleAndReleaseProgram(bool texture) { @@ -1193,7 +1193,7 @@ void VoxelSystem::removeScaleAndReleaseProgram(bool texture) { _program.release(); } - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false); + TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); } int VoxelSystem::_nodeCount = 0; From 4ac673fe63befe2f478ed6547decbf1bfb73126f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 12 Dec 2014 15:44:54 -0800 Subject: [PATCH 25/37] more render util cleanup --- interface/src/Application.cpp | 6 +++--- interface/src/Application.h | 3 --- interface/src/Environment.cpp | 2 +- interface/src/ModelUploader.cpp | 2 +- interface/src/Util.cpp | 8 ++++---- interface/src/avatar/Avatar.cpp | 4 ++-- interface/src/avatar/Hand.cpp | 4 ++-- interface/src/avatar/MyAvatar.cpp | 4 ++-- interface/src/avatar/SkeletonModel.cpp | 14 +++++++------- interface/src/renderer/DeferredLightingEffect.cpp | 8 ++++---- interface/src/renderer/Model.cpp | 2 +- interface/src/ui/MetavoxelEditor.cpp | 2 +- interface/src/ui/overlays/Grid3DOverlay.cpp | 4 ++-- interface/src/ui/overlays/Sphere3DOverlay.cpp | 2 +- libraries/render-utils/src/GeometryCache.cpp | 5 +++++ libraries/render-utils/src/GeometryCache.h | 2 ++ 16 files changed, 38 insertions(+), 34 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index eaaeb0534f..c45267010b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3083,7 +3083,7 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly, RenderAr // draw a red sphere float originSphereRadius = 0.05f; glColor3f(1,0,0); - _geometryCache.renderSphere(originSphereRadius, 15, 15); + GeometryCache::getInstance()->renderSphere(originSphereRadius, 15, 15); // Draw voxels if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { @@ -3304,12 +3304,12 @@ void Application::renderRearViewMirror(const QRect& region, bool billboard) { // set the bounds of rear mirror view if (billboard) { - QSize size = getTextureCache()->getFrameBufferSize(); + QSize size = TextureCache::getInstance()->getFrameBufferSize(); glViewport(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); glScissor(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); } else { // if not rendering the billboard, the region is in device independent coordinates; must convert to device - QSize size = getTextureCache()->getFrameBufferSize(); + QSize size = TextureCache::getInstance()->getFrameBufferSize(); float ratio = QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale(); int x = region.x() * ratio, y = region.y() * ratio, width = region.width() * ratio, height = region.height() * ratio; glViewport(x, size.height() - y - height, width, height); diff --git a/interface/src/Application.h b/interface/src/Application.h index 5b97c1301f..c3979086bc 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -252,9 +252,7 @@ public: ToolWindow* getToolWindow() { return _toolWindow ; } - GeometryCache* getGeometryCache() { return &_geometryCache; } AnimationCache* getAnimationCache() { return &_animationCache; } - TextureCache* getTextureCache() { return _textureCache; } DeferredLightingEffect* getDeferredLightingEffect() { return &_deferredLightingEffect; } GlowEffect* getGlowEffect() { return &_glowEffect; } ControllerScriptingInterface* getControllerScriptingInterface() { return &_controllerScriptingInterface; } @@ -572,7 +570,6 @@ private: QSet _keysPressed; - GeometryCache _geometryCache; AnimationCache _animationCache; TextureCache* _textureCache; diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index 0ce43ecdaa..a754b63eec 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -261,7 +261,7 @@ void Environment::renderAtmosphere(Camera& camera, const EnvironmentData& data) glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); - Application::getInstance()->getGeometryCache()->renderSphere(1.0f, 100, 50); //Draw a unit sphere + GeometryCache::getInstance()->renderSphere(1.0f, 100, 50); //Draw a unit sphere glDepthMask(GL_TRUE); program->release(); diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index 6c167ca59a..ee38a2c094 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -471,7 +471,7 @@ void ModelUploader::processCheck() { QString("ModelUploader::processCheck()"), QString("Your model is now available in the browser."), QMessageBox::Ok); - Application::getInstance()->getGeometryCache()->refresh(_url); + GeometryCache::getInstance()->refresh(_url); foreach (const QByteArray& filename, _textureFilenames) { TextureCache::getInstance()->refresh(_textureBase + filename); } diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index c4f2ec8468..256e437e21 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -71,22 +71,22 @@ void renderWorldBox() { glPushMatrix(); glTranslatef(MARKER_DISTANCE, 0, 0); glColor3fv(red); - Application::getInstance()->getGeometryCache()->renderSphere(MARKER_RADIUS, 10, 10); + GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, MARKER_DISTANCE, 0); glColor3fv(green); - Application::getInstance()->getGeometryCache()->renderSphere(MARKER_RADIUS, 10, 10); + GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, 0, MARKER_DISTANCE); glColor3fv(blue); - Application::getInstance()->getGeometryCache()->renderSphere(MARKER_RADIUS, 10, 10); + GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glColor3fv(gray); glTranslatef(MARKER_DISTANCE, 0, MARKER_DISTANCE); - Application::getInstance()->getGeometryCache()->renderSphere(MARKER_RADIUS, 10, 10); + GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index e4ea33a180..d4ec5ddb1f 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -394,7 +394,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool } else { glTranslatef(_position.x, getDisplayNamePosition().y + LOOK_AT_INDICATOR_OFFSET, _position.z); } - Application::getInstance()->getGeometryCache()->renderSphere(LOOK_AT_INDICATOR_RADIUS, 15, 15); + GeometryCache::getInstance()->renderSphere(LOOK_AT_INDICATOR_RADIUS, 15, 15); glPopMatrix(); } } @@ -422,7 +422,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool glPushMatrix(); glTranslatef(_position.x, _position.y, _position.z); glScalef(height, height, height); - Application::getInstance()->getGeometryCache()->renderSphere(sphereRadius, 15, 15); + GeometryCache::getInstance()->renderSphere(sphereRadius, 15, 15); glPopMatrix(); } diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index 148abc3546..fef4ac2fac 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -114,7 +114,7 @@ void Hand::render(bool isMine, Model::RenderMode renderMode) { glPushMatrix(); glTranslatef(position.x, position.y, position.z); glColor3f(0.0f, 1.0f, 0.0f); - Application::getInstance()->getGeometryCache()->renderSphere(PALM_COLLISION_RADIUS * _owningAvatar->getScale(), 10, 10); + GeometryCache::getInstance()->renderSphere(PALM_COLLISION_RADIUS * _owningAvatar->getScale(), 10, 10); glPopMatrix(); } } @@ -179,7 +179,7 @@ void Hand::renderHandTargets(bool isMine) { Avatar::renderJointConnectingCone(root, offsetFromPalm, PALM_DISK_RADIUS, 0.0f); glPushMatrix(); glTranslatef(root.x, root.y, root.z); - Application::getInstance()->getGeometryCache()->renderSphere(PALM_BALL_RADIUS, 20.0f, 20.0f); + GeometryCache::getInstance()->renderSphere(PALM_BALL_RADIUS, 20.0f, 20.0f); glPopMatrix(); } } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 17cda19980..255e79ebcd 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -394,7 +394,7 @@ void MyAvatar::renderDebugBodyPoints() { glPushMatrix(); glColor4f(0, 1, 0, .5f); glTranslatef(position.x, position.y, position.z); - Application::getInstance()->getGeometryCache()->renderSphere(0.2f, 10.0f, 10.0f); + GeometryCache::getInstance()->renderSphere(0.2f, 10.0f, 10.0f); glPopMatrix(); // Head Sphere @@ -402,7 +402,7 @@ void MyAvatar::renderDebugBodyPoints() { glPushMatrix(); glColor4f(0, 1, 0, .5f); glTranslatef(position.x, position.y, position.z); - Application::getInstance()->getGeometryCache()->renderSphere(0.15f, 10.0f, 10.0f); + GeometryCache::getInstance()->renderSphere(0.15f, 10.0f, 10.0f); glPopMatrix(); } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 911ebb7412..9bc2b627be 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -561,9 +561,9 @@ void SkeletonModel::renderRagdoll() { glTranslatef(position.x, position.y, position.z); // draw each point as a yellow hexagon with black border glColor4f(0.0f, 0.0f, 0.0f, alpha); - Application::getInstance()->getGeometryCache()->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache::getInstance()->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); glColor4f(1.0f, 1.0f, 0.0f, alpha); - Application::getInstance()->getGeometryCache()->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache::getInstance()->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); glPopMatrix(); } glPopMatrix(); @@ -913,7 +913,7 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { endPoint = endPoint - _translation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); glColor4f(0.6f, 0.6f, 0.8f, alpha); - Application::getInstance()->getGeometryCache()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache::getInstance()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -922,7 +922,7 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); glColor4f(0.8f, 0.8f, 0.6f, alpha); - Application::getInstance()->getGeometryCache()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache::getInstance()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a green cylinder between the two points glm::vec3 origin(0.0f); @@ -955,7 +955,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { glTranslatef(position.x, position.y, position.z); // draw a grey sphere at shape position glColor4f(0.75f, 0.75f, 0.75f, alpha); - Application::getInstance()->getGeometryCache()->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache::getInstance()->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); } else if (shape->getType() == CAPSULE_SHAPE) { CapsuleShape* capsule = static_cast(shape); @@ -965,7 +965,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { endPoint = endPoint - simulationTranslation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); glColor4f(0.6f, 0.6f, 0.8f, alpha); - Application::getInstance()->getGeometryCache()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache::getInstance()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -974,7 +974,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); glColor4f(0.8f, 0.8f, 0.6f, alpha); - Application::getInstance()->getGeometryCache()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache::getInstance()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a green cylinder between the two points glm::vec3 origin(0.0f); diff --git a/interface/src/renderer/DeferredLightingEffect.cpp b/interface/src/renderer/DeferredLightingEffect.cpp index 7c3436b2bc..42da3e0b08 100644 --- a/interface/src/renderer/DeferredLightingEffect.cpp +++ b/interface/src/renderer/DeferredLightingEffect.cpp @@ -51,7 +51,7 @@ void DeferredLightingEffect::releaseSimpleProgram() { void DeferredLightingEffect::renderSolidSphere(float radius, int slices, int stacks) { bindSimpleProgram(); - Application::getInstance()->getGeometryCache()->renderSphere(radius, slices, stacks); + GeometryCache::getInstance()->renderSphere(radius, slices, stacks); releaseSimpleProgram(); } @@ -75,7 +75,7 @@ void DeferredLightingEffect::renderWireCube(float size) { void DeferredLightingEffect::renderSolidCone(float base, float height, int slices, int stacks) { bindSimpleProgram(); - Application::getInstance()->getGeometryCache()->renderCone(base, height, slices, stacks); + GeometryCache::getInstance()->renderCone(base, height, slices, stacks); releaseSimpleProgram(); } @@ -270,7 +270,7 @@ void DeferredLightingEffect::render() { } else { glTranslatef(light.position.x, light.position.y, light.position.z); - Application::getInstance()->getGeometryCache()->renderSphere(expandedRadius, 32, 32); + GeometryCache::getInstance()->renderSphere(expandedRadius, 32, 32); } glPopMatrix(); @@ -323,7 +323,7 @@ void DeferredLightingEffect::render() { glm::vec3 axis = glm::axis(spotRotation); glRotatef(glm::degrees(glm::angle(spotRotation)), axis.x, axis.y, axis.z); glTranslatef(0.0f, 0.0f, -light.radius * (1.0f + SCALE_EXPANSION * 0.5f)); - Application::getInstance()->getGeometryCache()->renderCone(expandedRadius * glm::tan(light.cutoff), + GeometryCache::getInstance()->renderCone(expandedRadius * glm::tan(light.cutoff), expandedRadius, 32, 1); } diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index bea94c019f..45c80852ad 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -997,7 +997,7 @@ void Model::setURL(const QUrl& url, const QUrl& fallback, bool retainCurrent, bo _url = url; // if so instructed, keep the current geometry until the new one is loaded - _nextBaseGeometry = _nextGeometry = Application::getInstance()->getGeometryCache()->getGeometry(url, fallback, delayLoad); + _nextBaseGeometry = _nextGeometry = GeometryCache::getInstance()->getGeometry(url, fallback, delayLoad); _nextLODHysteresis = NetworkGeometry::NO_HYSTERESIS; if (!retainCurrent || !isActive() || _nextGeometry->isLoaded()) { applyNextGeometry(); diff --git a/interface/src/ui/MetavoxelEditor.cpp b/interface/src/ui/MetavoxelEditor.cpp index bc20def66f..dde181c571 100644 --- a/interface/src/ui/MetavoxelEditor.cpp +++ b/interface/src/ui/MetavoxelEditor.cpp @@ -353,7 +353,7 @@ void MetavoxelEditor::render() { _gridProgram.bind(); - Application::getInstance()->getGeometryCache()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS); + GeometryCache::getInstance()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS); _gridProgram.release(); diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index 4bf0d9ce93..67dd0b8e21 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -87,7 +87,7 @@ void Grid3DOverlay::render(RenderArgs* args) { float scale = MINOR_GRID_DIVISIONS * spacing; glScalef(scale, scale, scale); - Application::getInstance()->getGeometryCache()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS); + GeometryCache::getInstance()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS); } glPopMatrix(); @@ -102,7 +102,7 @@ void Grid3DOverlay::render(RenderArgs* args) { float scale = MAJOR_GRID_DIVISIONS * spacing; glScalef(scale, scale, scale); - Application::getInstance()->getGeometryCache()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS); + GeometryCache::getInstance()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS); } glPopMatrix(); diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 34064675e5..b9aeb5145a 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -63,7 +63,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { glScalef(dimensions.x, dimensions.y, dimensions.z); //Application::getInstance()->getDeferredLightingEffect()->renderSolidCube(1.0f); if (_isSolid) { - Application::getInstance()->getGeometryCache()->renderSphere(1.0f, SLICES, SLICES); + GeometryCache::getInstance()->renderSphere(1.0f, SLICES, SLICES); } else { glutWireSphere(1.0f, SLICES, SLICES); } diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 6e0c40c28d..416148ab20 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -21,6 +21,11 @@ #include "GeometryCache.h" +GeometryCache* GeometryCache::getInstance() { + static GeometryCache instance; + return &instance; +} + GeometryCache::GeometryCache() { } diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 9fe6a7d5a2..f50dc8ccd9 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -35,6 +35,8 @@ class GeometryCache : public ResourceCache { Q_OBJECT public: + + static GeometryCache* getInstance(); GeometryCache(); virtual ~GeometryCache(); From 3de3540ebea88247d5b9d5a32a89ff42e68425ac Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 08:37:33 -0800 Subject: [PATCH 26/37] move back into interface for now --- interface/CMakeLists.txt | 2 +- interface/src/Application.h | 4 ++-- interface/src/MetavoxelSystem.h | 2 +- interface/src/avatar/Avatar.cpp | 2 +- .../src => interface/src/renderer}/GeometryCache.cpp | 0 .../src => interface/src/renderer}/GeometryCache.h | 0 interface/src/renderer/Model.h | 2 +- .../src => interface/src/renderer}/TextureCache.cpp | 0 .../src => interface/src/renderer}/TextureCache.h | 0 interface/src/ui/overlays/BillboardOverlay.h | 3 +-- 10 files changed, 7 insertions(+), 8 deletions(-) rename {libraries/render-utils/src => interface/src/renderer}/GeometryCache.cpp (100%) rename {libraries/render-utils/src => interface/src/renderer}/GeometryCache.h (100%) rename {libraries/render-utils/src => interface/src/renderer}/TextureCache.cpp (100%) rename {libraries/render-utils/src => interface/src/renderer}/TextureCache.h (100%) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index ffc401ba63..38dd02c655 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -107,7 +107,7 @@ endif() add_executable(${TARGET_NAME} MACOSX_BUNDLE ${INTERFACE_SRCS} ${QM}) # link required hifi libraries -link_hifi_libraries(shared octree voxels gpu fbx metavoxels networking entities avatars audio animation script-engine physics render-utils) +link_hifi_libraries(shared octree voxels gpu fbx metavoxels networking entities avatars audio animation script-engine physics) # find any optional and required libraries find_package(ZLIB REQUIRED) diff --git a/interface/src/Application.h b/interface/src/Application.h index c3979086bc..afb476ce97 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -35,13 +35,11 @@ #include #include -#include #include #include #include #include #include -#include #include #include @@ -64,7 +62,9 @@ #include "entities/EntityTreeRenderer.h" #include "renderer/AmbientOcclusionEffect.h" #include "renderer/DeferredLightingEffect.h" +#include "renderer/GeometryCache.h" #include "renderer/GlowEffect.h" +#include "renderer/TextureCache.h" #include "scripting/ControllerScriptingInterface.h" #include "ui/BandwidthDialog.h" #include "ui/BandwidthMeter.h" diff --git a/interface/src/MetavoxelSystem.h b/interface/src/MetavoxelSystem.h index 0c0f9b49b7..2ebf7e1146 100644 --- a/interface/src/MetavoxelSystem.h +++ b/interface/src/MetavoxelSystem.h @@ -20,9 +20,9 @@ #include #include -#include #include "renderer/ProgramObject.h" +#include "renderer/TextureCache.h" class HeightfieldBaseLayerBatch; class HeightfieldSplatBatch; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index d4ec5ddb1f..0edf59290f 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include "Application.h" #include "Avatar.h" @@ -37,6 +36,7 @@ #include "Recorder.h" #include "world.h" #include "devices/OculusManager.h" +#include "renderer/TextureCache.h" #include "ui/TextRenderer.h" using namespace std; diff --git a/libraries/render-utils/src/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp similarity index 100% rename from libraries/render-utils/src/GeometryCache.cpp rename to interface/src/renderer/GeometryCache.cpp diff --git a/libraries/render-utils/src/GeometryCache.h b/interface/src/renderer/GeometryCache.h similarity index 100% rename from libraries/render-utils/src/GeometryCache.h rename to interface/src/renderer/GeometryCache.h diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index d74f95095d..e95b2472ba 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -21,13 +21,13 @@ #include #include #include -#include #include "AnimationHandle.h" #include "GeometryCache.h" #include "InterfaceConfig.h" #include "JointState.h" #include "ProgramObject.h" +#include "TextureCache.h" class QScriptEngine; diff --git a/libraries/render-utils/src/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp similarity index 100% rename from libraries/render-utils/src/TextureCache.cpp rename to interface/src/renderer/TextureCache.cpp diff --git a/libraries/render-utils/src/TextureCache.h b/interface/src/renderer/TextureCache.h similarity index 100% rename from libraries/render-utils/src/TextureCache.h rename to interface/src/renderer/TextureCache.h diff --git a/interface/src/ui/overlays/BillboardOverlay.h b/interface/src/ui/overlays/BillboardOverlay.h index dcb8ab8b0c..c095a544b7 100644 --- a/interface/src/ui/overlays/BillboardOverlay.h +++ b/interface/src/ui/overlays/BillboardOverlay.h @@ -15,9 +15,8 @@ #include #include -#include - #include "Base3DOverlay.h" +#include "renderer/TextureCache.h" class BillboardOverlay : public Base3DOverlay { Q_OBJECT From ca39c79df45cd350656999a181e0ab22fb394721 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 08:50:36 -0800 Subject: [PATCH 27/37] unix compile --- interface/src/renderer/GeometryCache.cpp | 6 ++++-- interface/src/renderer/TextureCache.cpp | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 416148ab20..5cb544135c 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -9,6 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +// include this before QOpenGLBuffer, which includes an earlier version of OpenGL +#include + #include #include @@ -17,9 +20,8 @@ #include -#include "TextureCache.h" - #include "GeometryCache.h" +#include "TextureCache.h" GeometryCache* GeometryCache::getInstance() { static GeometryCache instance; diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index 11ccd4b797..e4c55db58b 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -10,6 +10,7 @@ // // include this before QGLWidget, which includes an earlier version of OpenGL +#include #include #include From 7d1081473eb0fdd69336b29c2856ca5a6bf6fe3c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 09:42:35 -0800 Subject: [PATCH 28/37] remove _textureCache --- interface/src/Application.cpp | 15 ++++++--------- interface/src/Application.h | 1 - 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c45267010b..1ec177163d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -177,7 +177,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _touchAvgY(0.0f), _isTouchPressed(false), _mousePressed(false), - _textureCache(NULL), _audio(), _enableProcessVoxelsThread(true), _octreeProcessor(), @@ -195,8 +194,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _isVSyncOn(true), _aboutToQuit(false) { - _textureCache = TextureCache::getInstance(); - // read the ApplicationInfo.ini file for Name/Version/Domain information QSettings applicationInfo(Application::resourcesPath() + "info/ApplicationInfo.ini", QSettings::IniFormat); @@ -623,10 +620,10 @@ void Application::paintGL() { // Set the desired FBO texture size. If it hasn't changed, this does nothing. // Otherwise, it must rebuild the FBOs if (OculusManager::isConnected()) { - _textureCache->setFrameBufferSize(OculusManager::getRenderTargetSize()); + TextureCache::getInstance()->setFrameBufferSize(OculusManager::getRenderTargetSize()); } else { QSize fbSize = _glWidget->getDeviceSize() * getRenderResolutionScale(); - _textureCache->setFrameBufferSize(fbSize); + TextureCache::getInstance()->setFrameBufferSize(fbSize); } glEnable(GL_LINE_SMOOTH); @@ -2046,7 +2043,7 @@ void Application::init() { connect(_myAvatar, &MyAvatar::transformChanged, this, &Application::bumpSettings); // make sure our texture cache knows about window size changes - _textureCache->associateWithWidget(getGLWidget()); + TextureCache::getInstance()->associateWithWidget(getGLWidget()); } void Application::closeMirrorView() { @@ -2777,7 +2774,7 @@ glm::vec3 Application::getSunDirection() { void Application::updateShadowMap() { PerformanceTimer perfTimer("shadowMap"); - QOpenGLFramebufferObject* fbo = _textureCache->getShadowFramebufferObject(); + QOpenGLFramebufferObject* fbo = TextureCache::getInstance()->getShadowFramebufferObject(); fbo->bind(); glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -2942,7 +2939,7 @@ void Application::setupWorldLight() { } QImage Application::renderAvatarBillboard() { - _textureCache->getPrimaryFramebufferObject()->bind(); + TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); // the "glow" here causes an alpha of one Glower glower; @@ -2953,7 +2950,7 @@ QImage Application::renderAvatarBillboard() { QImage image(BILLBOARD_SIZE, BILLBOARD_SIZE, QImage::Format_ARGB32); glReadPixels(0, 0, BILLBOARD_SIZE, BILLBOARD_SIZE, GL_BGRA, GL_UNSIGNED_BYTE, image.bits()); - _textureCache->getPrimaryFramebufferObject()->release(); + TextureCache::getInstance()->getPrimaryFramebufferObject()->release(); return image; } diff --git a/interface/src/Application.h b/interface/src/Application.h index afb476ce97..fe5c466e0e 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -571,7 +571,6 @@ private: AnimationCache _animationCache; - TextureCache* _textureCache; DeferredLightingEffect _deferredLightingEffect; GlowEffect _glowEffect; From 6b39783de7ae579191d927e6ecf27542fb955a10 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 10:12:04 -0800 Subject: [PATCH 29/37] revert out the InterfaceConfig.h changes --- interface/src/Application.h | 3 --- interface/src/renderer/GeometryCache.h | 2 +- interface/src/renderer/TextureCache.cpp | 2 +- interface/src/renderer/TextureCache.h | 2 +- interface/src/voxels/VoxelSystem.cpp | 2 +- 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index fe5c466e0e..d4a681f060 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -12,9 +12,6 @@ #ifndef hifi_Application_h #define hifi_Application_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index f50dc8ccd9..1eb9dcbc6a 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -13,7 +13,7 @@ #define hifi_GeometryCache_h // include this before QOpenGLBuffer, which includes an earlier version of OpenGL -#include +#include "InterfaceConfig.h" #include #include diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index e4c55db58b..4d246a4c9c 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -10,7 +10,7 @@ // // include this before QGLWidget, which includes an earlier version of OpenGL -#include +#include "InterfaceConfig.h" #include #include diff --git a/interface/src/renderer/TextureCache.h b/interface/src/renderer/TextureCache.h index 3808485135..3cbfaced49 100644 --- a/interface/src/renderer/TextureCache.h +++ b/interface/src/renderer/TextureCache.h @@ -18,7 +18,7 @@ #include -#include +#include "InterfaceConfig.h" class QOpenGLFramebufferObject; diff --git a/interface/src/voxels/VoxelSystem.cpp b/interface/src/voxels/VoxelSystem.cpp index 3a50c07a71..82384ce9a4 100644 --- a/interface/src/voxels/VoxelSystem.cpp +++ b/interface/src/voxels/VoxelSystem.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include // include this first #include #include @@ -24,7 +25,6 @@ #include #include "Application.h" -#include "InterfaceConfig.h" #include "Menu.h" #include "renderer/ProgramObject.h" #include "VoxelConstants.h" From c6b033fa0e5b4edc87afa4c367b9d1633299fea4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 10:12:55 -0800 Subject: [PATCH 30/37] revert out the InterfaceConfig.h changes --- interface/src/voxels/VoxelSystem.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/voxels/VoxelSystem.cpp b/interface/src/voxels/VoxelSystem.cpp index 82384ce9a4..6fd477d8f3 100644 --- a/interface/src/voxels/VoxelSystem.cpp +++ b/interface/src/voxels/VoxelSystem.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include // include this first - #include #include #include // to load voxels from file @@ -25,6 +23,7 @@ #include #include "Application.h" +#include "InterfaceConfig.h" #include "Menu.h" #include "renderer/ProgramObject.h" #include "VoxelConstants.h" From 7d75d2d1bfe76f46b0fa3685ca56461853ffa670 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 10:34:16 -0800 Subject: [PATCH 31/37] make TextureCache work with DependancyManager --- interface/src/Application.cpp | 18 +++++++-------- interface/src/MetavoxelSystem.cpp | 18 +++++++-------- interface/src/ModelUploader.cpp | 2 +- interface/src/devices/OculusManager.cpp | 6 ++--- .../src/renderer/AmbientOcclusionEffect.cpp | 6 ++--- .../src/renderer/DeferredLightingEffect.cpp | 22 +++++++++---------- interface/src/renderer/GeometryCache.cpp | 16 +++++++------- interface/src/renderer/GlowEffect.cpp | 14 ++++++------ interface/src/renderer/Model.cpp | 20 ++++++++--------- interface/src/renderer/TextureCache.cpp | 6 ----- interface/src/renderer/TextureCache.h | 12 +++++----- interface/src/ui/MetavoxelEditor.cpp | 2 +- interface/src/voxels/VoxelSystem.cpp | 6 ++--- 13 files changed, 70 insertions(+), 78 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1ec177163d..105e3e087c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -620,10 +620,10 @@ void Application::paintGL() { // Set the desired FBO texture size. If it hasn't changed, this does nothing. // Otherwise, it must rebuild the FBOs if (OculusManager::isConnected()) { - TextureCache::getInstance()->setFrameBufferSize(OculusManager::getRenderTargetSize()); + DependencyManager::get()->setFrameBufferSize(OculusManager::getRenderTargetSize()); } else { QSize fbSize = _glWidget->getDeviceSize() * getRenderResolutionScale(); - TextureCache::getInstance()->setFrameBufferSize(fbSize); + DependencyManager::get()->setFrameBufferSize(fbSize); } glEnable(GL_LINE_SMOOTH); @@ -713,7 +713,7 @@ void Application::paintGL() { _glowEffect.prepare(); // Viewport is assigned to the size of the framebuffer - QSize size = TextureCache::getInstance()->getPrimaryFramebufferObject()->size(); + QSize size = DependencyManager::get()->getPrimaryFramebufferObject()->size(); glViewport(0, 0, size.width(), size.height()); glMatrixMode(GL_MODELVIEW); @@ -2043,7 +2043,7 @@ void Application::init() { connect(_myAvatar, &MyAvatar::transformChanged, this, &Application::bumpSettings); // make sure our texture cache knows about window size changes - TextureCache::getInstance()->associateWithWidget(getGLWidget()); + DependencyManager::get()->associateWithWidget(getGLWidget()); } void Application::closeMirrorView() { @@ -2774,7 +2774,7 @@ glm::vec3 Application::getSunDirection() { void Application::updateShadowMap() { PerformanceTimer perfTimer("shadowMap"); - QOpenGLFramebufferObject* fbo = TextureCache::getInstance()->getShadowFramebufferObject(); + QOpenGLFramebufferObject* fbo = DependencyManager::get()->getShadowFramebufferObject(); fbo->bind(); glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -2939,7 +2939,7 @@ void Application::setupWorldLight() { } QImage Application::renderAvatarBillboard() { - TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); + DependencyManager::get()->getPrimaryFramebufferObject()->bind(); // the "glow" here causes an alpha of one Glower glower; @@ -2950,7 +2950,7 @@ QImage Application::renderAvatarBillboard() { QImage image(BILLBOARD_SIZE, BILLBOARD_SIZE, QImage::Format_ARGB32); glReadPixels(0, 0, BILLBOARD_SIZE, BILLBOARD_SIZE, GL_BGRA, GL_UNSIGNED_BYTE, image.bits()); - TextureCache::getInstance()->getPrimaryFramebufferObject()->release(); + DependencyManager::get()->getPrimaryFramebufferObject()->release(); return image; } @@ -3301,12 +3301,12 @@ void Application::renderRearViewMirror(const QRect& region, bool billboard) { // set the bounds of rear mirror view if (billboard) { - QSize size = TextureCache::getInstance()->getFrameBufferSize(); + QSize size = DependencyManager::get()->getFrameBufferSize(); glViewport(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); glScissor(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); } else { // if not rendering the billboard, the region is in device independent coordinates; must convert to device - QSize size = TextureCache::getInstance()->getFrameBufferSize(); + QSize size = DependencyManager::get()->getFrameBufferSize(); float ratio = QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale(); int x = region.x() * ratio, y = region.y() * ratio, width = region.width() * ratio, height = region.height() * ratio; glViewport(x, size.height() - y - height, width, height); diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 2e3e9796f3..a61f6e41d7 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -205,7 +205,7 @@ void MetavoxelSystem::render() { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); + DependencyManager::get()->setPrimaryDrawBuffers(true, true); glDisable(GL_BLEND); glEnable(GL_CULL_FACE); @@ -251,7 +251,7 @@ void MetavoxelSystem::render() { glPopMatrix(); } - TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); + DependencyManager::get()->setPrimaryDrawBuffers(true, false); _baseHeightfieldProgram.release(); @@ -348,7 +348,7 @@ void MetavoxelSystem::render() { } if (!_voxelBaseBatches.isEmpty()) { - TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); + DependencyManager::get()->setPrimaryDrawBuffers(true, true); glEnableClientState(GL_VERTEX_ARRAY); glDisable(GL_BLEND); @@ -383,7 +383,7 @@ void MetavoxelSystem::render() { glDisable(GL_ALPHA_TEST); glEnable(GL_BLEND); - TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); + DependencyManager::get()->setPrimaryDrawBuffers(true, false); if (!_voxelSplatBatches.isEmpty()) { glDepthFunc(GL_LEQUAL); @@ -463,7 +463,7 @@ void MetavoxelSystem::render() { } if (!_hermiteBatches.isEmpty() && Menu::getInstance()->isOptionChecked(MenuOption::DisplayHermiteData)) { - TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); + DependencyManager::get()->setPrimaryDrawBuffers(true, true); glEnableClientState(GL_VERTEX_ARRAY); @@ -486,7 +486,7 @@ void MetavoxelSystem::render() { glDisableClientState(GL_VERTEX_ARRAY); - TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); + DependencyManager::get()->setPrimaryDrawBuffers(true, false); } _hermiteBatches.clear(); @@ -797,7 +797,7 @@ void MetavoxelSystem::applyMaterialEdit(const MetavoxelEditMessage& message, boo Q_ARG(bool, reliable)); return; } - QSharedPointer texture = TextureCache::getInstance()->getTexture( + QSharedPointer texture = DependencyManager::get()->getTexture( material->getDiffuse(), SPLAT_TEXTURE); if (texture->isLoaded()) { MetavoxelEditMessage newMessage = message; @@ -1180,7 +1180,7 @@ void VoxelBuffer::render(bool cursor) { for (int i = 0; i < _materials.size(); i++) { const SharedObjectPointer material = _materials.at(i); if (material) { - _networkTextures[i] = TextureCache::getInstance()->getTexture( + _networkTextures[i] = DependencyManager::get()->getTexture( static_cast(material.data())->getDiffuse(), SPLAT_TEXTURE); } } @@ -2234,7 +2234,7 @@ void HeightfieldNodeRenderer::render(const HeightfieldNodePointer& node, const g for (int i = 0; i < materials.size(); i++) { const SharedObjectPointer& material = materials.at(i); if (material) { - _networkTextures[i] = TextureCache::getInstance()->getTexture( + _networkTextures[i] = DependencyManager::get()->getTexture( static_cast(material.data())->getDiffuse(), SPLAT_TEXTURE); } } diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index ee38a2c094..c3b6ba74c3 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -473,7 +473,7 @@ void ModelUploader::processCheck() { QMessageBox::Ok); GeometryCache::getInstance()->refresh(_url); foreach (const QByteArray& filename, _textureFilenames) { - TextureCache::getInstance()->refresh(_textureBase + filename); + DependencyManager::get()->refresh(_textureBase + filename); } deleteLater(); break; diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 0eb0c732c9..d27ab09876 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -449,7 +449,7 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p if (Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect)) { Application::getInstance()->getGlowEffect()->prepare(); } else { - TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); + DependencyManager::get()->getPrimaryFramebufferObject()->bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } @@ -555,8 +555,8 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p QOpenGLFramebufferObject* fbo = Application::getInstance()->getGlowEffect()->render(true); glBindTexture(GL_TEXTURE_2D, fbo->texture()); } else { - TextureCache::getInstance()->getPrimaryFramebufferObject()->release(); - glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryFramebufferObject()->texture()); + DependencyManager::get()->getPrimaryFramebufferObject()->release(); + glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimaryFramebufferObject()->texture()); } // restore our normal viewport diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index 9ef0fa2d82..3354f715cb 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -98,7 +98,7 @@ void AmbientOcclusionEffect::render() { glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); - glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimaryDepthTextureID()); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _rotationTextureID); @@ -116,7 +116,7 @@ void AmbientOcclusionEffect::render() { glGetIntegerv(GL_VIEWPORT, viewport); const int VIEWPORT_X_INDEX = 0; const int VIEWPORT_WIDTH_INDEX = 2; - QOpenGLFramebufferObject* primaryFBO = TextureCache::getInstance()->getPrimaryFramebufferObject(); + QOpenGLFramebufferObject* primaryFBO = DependencyManager::get()->getPrimaryFramebufferObject(); float sMin = viewport[VIEWPORT_X_INDEX] / (float)primaryFBO->width(); float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)primaryFBO->width(); @@ -141,7 +141,7 @@ void AmbientOcclusionEffect::render() { glActiveTexture(GL_TEXTURE0); // now render secondary to primary with 4x4 blur - TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); + DependencyManager::get()->getPrimaryFramebufferObject()->bind(); glEnable(GL_BLEND); glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); diff --git a/interface/src/renderer/DeferredLightingEffect.cpp b/interface/src/renderer/DeferredLightingEffect.cpp index 42da3e0b08..facec197a7 100644 --- a/interface/src/renderer/DeferredLightingEffect.cpp +++ b/interface/src/renderer/DeferredLightingEffect.cpp @@ -37,7 +37,7 @@ void DeferredLightingEffect::init() { } void DeferredLightingEffect::bindSimpleProgram() { - TextureCache::getInstance()->setPrimaryDrawBuffers(true, true, true); + DependencyManager::get()->setPrimaryDrawBuffers(true, true, true); _simpleProgram.bind(); _simpleProgram.setUniformValue(_glowIntensityLocation, Application::getInstance()->getGlowEffect()->getIntensity()); glDisable(GL_BLEND); @@ -46,7 +46,7 @@ void DeferredLightingEffect::bindSimpleProgram() { void DeferredLightingEffect::releaseSimpleProgram() { glEnable(GL_BLEND); _simpleProgram.release(); - TextureCache::getInstance()->setPrimaryDrawBuffers(true, false, false); + DependencyManager::get()->setPrimaryDrawBuffers(true, false, false); } void DeferredLightingEffect::renderSolidSphere(float radius, int slices, int stacks) { @@ -117,15 +117,15 @@ void DeferredLightingEffect::addSpotLight(const glm::vec3& position, float radiu void DeferredLightingEffect::prepare() { // clear the normal and specular buffers - TextureCache::getInstance()->setPrimaryDrawBuffers(false, true, false); + DependencyManager::get()->setPrimaryDrawBuffers(false, true, false); glClear(GL_COLOR_BUFFER_BIT); - TextureCache::getInstance()->setPrimaryDrawBuffers(false, false, true); + DependencyManager::get()->setPrimaryDrawBuffers(false, false, true); // clearing to zero alpha for specular causes problems on my Nvidia card; clear to lowest non-zero value instead const float MAX_SPECULAR_EXPONENT = 128.0f; glClearColor(0.0f, 0.0f, 0.0f, 1.0f / MAX_SPECULAR_EXPONENT); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - TextureCache::getInstance()->setPrimaryDrawBuffers(true, false, false); + DependencyManager::get()->setPrimaryDrawBuffers(true, false, false); } void DeferredLightingEffect::render() { @@ -138,7 +138,7 @@ void DeferredLightingEffect::render() { glDisable(GL_COLOR_MATERIAL); glDepthMask(false); - QOpenGLFramebufferObject* primaryFBO = TextureCache::getInstance()->getPrimaryFramebufferObject(); + QOpenGLFramebufferObject* primaryFBO = DependencyManager::get()->getPrimaryFramebufferObject(); primaryFBO->release(); QOpenGLFramebufferObject* freeFBO = Application::getInstance()->getGlowEffect()->getFreeFramebufferObject(); @@ -148,13 +148,13 @@ void DeferredLightingEffect::render() { glBindTexture(GL_TEXTURE_2D, primaryFBO->texture()); glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryNormalTextureID()); + glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimaryNormalTextureID()); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimarySpecularTextureID()); + glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimarySpecularTextureID()); glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPrimaryDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimaryDepthTextureID()); // get the viewport side (left, right, both) int viewport[4]; @@ -173,7 +173,7 @@ void DeferredLightingEffect::render() { bool shadowsEnabled = Menu::getInstance()->getShadowsEnabled(); if (shadowsEnabled) { glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getShadowDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getShadowDepthTextureID()); program = &_directionalLightShadowMap; locations = &_directionalLightShadowMapLocations; @@ -188,7 +188,7 @@ void DeferredLightingEffect::render() { program->bind(); } program->setUniformValue(locations->shadowScale, - 1.0f / TextureCache::getInstance()->getShadowFramebufferObject()->width()); + 1.0f / DependencyManager::get()->getShadowFramebufferObject()->width()); } else { program->bind(); diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 5cb544135c..048d3d0444 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -712,19 +712,19 @@ void NetworkGeometry::setTextureWithNameToURL(const QString& name, const QUrl& u QSharedPointer matchingTexture = QSharedPointer(); if (part.diffuseTextureName == name) { part.diffuseTexture = - TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, + DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, _geometry.meshes[i].isEye, QByteArray()); part.diffuseTexture->setLoadPriorities(_loadPriorities); } else if (part.normalTextureName == name) { - part.normalTexture = TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, + part.normalTexture = DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.normalTexture->setLoadPriorities(_loadPriorities); } else if (part.specularTextureName == name) { - part.specularTexture = TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, + part.specularTexture = DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.specularTexture->setLoadPriorities(_loadPriorities); } else if (part.emissiveTextureName == name) { - part.emissiveTexture = TextureCache::getInstance()->getTexture(url, DEFAULT_TEXTURE, + part.emissiveTexture = DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.emissiveTexture->setLoadPriorities(_loadPriorities); } @@ -925,28 +925,28 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { foreach (const FBXMeshPart& part, mesh.parts) { NetworkMeshPart networkPart; if (!part.diffuseTexture.filename.isEmpty()) { - networkPart.diffuseTexture = TextureCache::getInstance()->getTexture( + networkPart.diffuseTexture = DependencyManager::get()->getTexture( _textureBase.resolved(QUrl(part.diffuseTexture.filename)), DEFAULT_TEXTURE, mesh.isEye, part.diffuseTexture.content); networkPart.diffuseTextureName = part.diffuseTexture.name; networkPart.diffuseTexture->setLoadPriorities(_loadPriorities); } if (!part.normalTexture.filename.isEmpty()) { - networkPart.normalTexture = TextureCache::getInstance()->getTexture( + networkPart.normalTexture = DependencyManager::get()->getTexture( _textureBase.resolved(QUrl(part.normalTexture.filename)), NORMAL_TEXTURE, false, part.normalTexture.content); networkPart.normalTextureName = part.normalTexture.name; networkPart.normalTexture->setLoadPriorities(_loadPriorities); } if (!part.specularTexture.filename.isEmpty()) { - networkPart.specularTexture = TextureCache::getInstance()->getTexture( + networkPart.specularTexture = DependencyManager::get()->getTexture( _textureBase.resolved(QUrl(part.specularTexture.filename)), SPECULAR_TEXTURE, false, part.specularTexture.content); networkPart.specularTextureName = part.specularTexture.name; networkPart.specularTexture->setLoadPriorities(_loadPriorities); } if (!part.emissiveTexture.filename.isEmpty()) { - networkPart.emissiveTexture = TextureCache::getInstance()->getTexture( + networkPart.emissiveTexture = DependencyManager::get()->getTexture( _textureBase.resolved(QUrl(part.emissiveTexture.filename)), EMISSIVE_TEXTURE, false, part.emissiveTexture.content); networkPart.emissiveTextureName = part.emissiveTexture.name; diff --git a/interface/src/renderer/GlowEffect.cpp b/interface/src/renderer/GlowEffect.cpp index 8a9d957234..e6bbdb2ba1 100644 --- a/interface/src/renderer/GlowEffect.cpp +++ b/interface/src/renderer/GlowEffect.cpp @@ -41,8 +41,8 @@ GlowEffect::~GlowEffect() { QOpenGLFramebufferObject* GlowEffect::getFreeFramebufferObject() const { return (_isOddFrame ? - TextureCache::getInstance()->getSecondaryFramebufferObject(): - TextureCache::getInstance()->getTertiaryFramebufferObject()); + DependencyManager::get()->getSecondaryFramebufferObject(): + DependencyManager::get()->getTertiaryFramebufferObject()); } static ProgramObject* createProgram(const QString& name) { @@ -88,7 +88,7 @@ void GlowEffect::init() { } void GlowEffect::prepare() { - TextureCache::getInstance()->getPrimaryFramebufferObject()->bind(); + DependencyManager::get()->getPrimaryFramebufferObject()->bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); _isEmpty = true; @@ -122,7 +122,7 @@ static void maybeRelease(QOpenGLFramebufferObject* fbo) { QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { PerformanceTimer perfTimer("glowEffect"); - QOpenGLFramebufferObject* primaryFBO = TextureCache::getInstance()->getPrimaryFramebufferObject(); + QOpenGLFramebufferObject* primaryFBO = DependencyManager::get()->getPrimaryFramebufferObject(); primaryFBO->release(); glBindTexture(GL_TEXTURE_2D, primaryFBO->texture()); @@ -138,7 +138,7 @@ QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { glDepthMask(GL_FALSE); QOpenGLFramebufferObject* destFBO = toTexture ? - TextureCache::getInstance()->getSecondaryFramebufferObject() : NULL; + DependencyManager::get()->getSecondaryFramebufferObject() : NULL; if (!Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect) || _isEmpty) { // copy the primary to the screen if (destFBO && QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()) { @@ -160,9 +160,9 @@ QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { } else { // diffuse into the secondary/tertiary (alternating between frames) QOpenGLFramebufferObject* oldDiffusedFBO = - TextureCache::getInstance()->getSecondaryFramebufferObject(); + DependencyManager::get()->getSecondaryFramebufferObject(); QOpenGLFramebufferObject* newDiffusedFBO = - TextureCache::getInstance()->getTertiaryFramebufferObject(); + DependencyManager::get()->getTertiaryFramebufferObject(); if (_isOddFrame) { qSwap(oldDiffusedFBO, newDiffusedFBO); } diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 45c80852ad..7004b277ca 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -749,7 +749,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { } - /*TextureCache::getInstance()->setPrimaryDrawBuffers( + /*DependencyManager::get()->setPrimaryDrawBuffers( mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE, mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE, mode == DEFAULT_RENDER_MODE); @@ -789,7 +789,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, args); // render translucent meshes afterwards - //TextureCache::getInstance()->setPrimaryDrawBuffers(false, true, true); + //DependencyManager::get()->setPrimaryDrawBuffers(false, true, true); { GLenum buffers[2]; int bufferCount = 0; @@ -814,7 +814,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { GLBATCH(glDepthMask)(false); GLBATCH(glDepthFunc)(GL_LEQUAL); - //TextureCache::getInstance()->setPrimaryDrawBuffers(true); + //DependencyManager::get()->setPrimaryDrawBuffers(true); { GLenum buffers[1]; int bufferCount = 0; @@ -1705,7 +1705,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { } - /*TextureCache::getInstance()->setPrimaryDrawBuffers( + /*DependencyManager::get()->setPrimaryDrawBuffers( mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE, mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE, mode == DEFAULT_RENDER_MODE); @@ -1745,7 +1745,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, args); // render translucent meshes afterwards - //TextureCache::getInstance()->setPrimaryDrawBuffers(false, true, true); + //DependencyManager::get()->setPrimaryDrawBuffers(false, true, true); { GLenum buffers[2]; int bufferCount = 0; @@ -1770,7 +1770,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { GLBATCH(glDepthMask)(false); GLBATCH(glDepthFunc)(GL_LEQUAL); - //TextureCache::getInstance()->setPrimaryDrawBuffers(true); + //DependencyManager::get()->setPrimaryDrawBuffers(true); { GLenum buffers[1]; int bufferCount = 0; @@ -2446,7 +2446,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod if (showDiffuse && diffuseMap) { GLBATCH(glBindTexture)(GL_TEXTURE_2D, diffuseMap->getID()); } else { - GLBATCH(glBindTexture)(GL_TEXTURE_2D, TextureCache::getInstance()->getWhiteTextureID()); + GLBATCH(glBindTexture)(GL_TEXTURE_2D, DependencyManager::get()->getWhiteTextureID()); } if (locations->texcoordMatrices >= 0) { @@ -2464,7 +2464,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE1); Texture* normalMap = networkPart.normalTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !normalMap ? - TextureCache::getInstance()->getBlueTextureID() : normalMap->getID()); + DependencyManager::get()->getBlueTextureID() : normalMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } @@ -2472,7 +2472,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE0 + locations->specularTextureUnit); Texture* specularMap = networkPart.specularTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !specularMap ? - TextureCache::getInstance()->getWhiteTextureID() : specularMap->getID()); + DependencyManager::get()->getWhiteTextureID() : specularMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } @@ -2493,7 +2493,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE0 + locations->emissiveTextureUnit); Texture* emissiveMap = networkPart.emissiveTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !emissiveMap ? - TextureCache::getInstance()->getWhiteTextureID() : emissiveMap->getID()); + DependencyManager::get()->getWhiteTextureID() : emissiveMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index 4d246a4c9c..123a8a5384 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -25,12 +25,6 @@ #include "TextureCache.h" -TextureCache* TextureCache::getInstance() { - static TextureCache instance; - return &instance; -} - - TextureCache::TextureCache() : _permutationNormalTextureID(0), _whiteTextureID(0), diff --git a/interface/src/renderer/TextureCache.h b/interface/src/renderer/TextureCache.h index 3cbfaced49..2bdfda3217 100644 --- a/interface/src/renderer/TextureCache.h +++ b/interface/src/renderer/TextureCache.h @@ -16,6 +16,7 @@ #include #include +#include #include #include "InterfaceConfig.h" @@ -29,16 +30,11 @@ typedef QSharedPointer NetworkTexturePointer; enum TextureType { DEFAULT_TEXTURE, NORMAL_TEXTURE, SPECULAR_TEXTURE, EMISSIVE_TEXTURE, SPLAT_TEXTURE }; /// Stores cached textures, including render-to-texture targets. -class TextureCache : public ResourceCache { +class TextureCache : public ResourceCache, public DependencyManager::Dependency { Q_OBJECT public: - static TextureCache* getInstance(); - - TextureCache(); - virtual ~TextureCache(); - void associateWithWidget(QGLWidget* widget); /// Sets the desired texture resolution for the framebuffer objects. @@ -98,7 +94,9 @@ protected: const QSharedPointer& fallback, bool delayLoad, const void* extra); private: - + TextureCache(); + virtual ~TextureCache(); + friend class DependencyManager; friend class DilatableNetworkTexture; QOpenGLFramebufferObject* createFramebufferObject(); diff --git a/interface/src/ui/MetavoxelEditor.cpp b/interface/src/ui/MetavoxelEditor.cpp index dde181c571..1ca81f3d95 100644 --- a/interface/src/ui/MetavoxelEditor.cpp +++ b/interface/src/ui/MetavoxelEditor.cpp @@ -916,7 +916,7 @@ void MaterialControl::updateTexture() { _texture.clear(); return; } - _texture = TextureCache::getInstance()->getTexture(material->getDiffuse(), SPLAT_TEXTURE); + _texture = DependencyManager::get()->getTexture(material->getDiffuse(), SPLAT_TEXTURE); if (_texture) { if (_texture->isLoaded()) { textureLoaded(); diff --git a/interface/src/voxels/VoxelSystem.cpp b/interface/src/voxels/VoxelSystem.cpp index 6fd477d8f3..357bfe9c3e 100644 --- a/interface/src/voxels/VoxelSystem.cpp +++ b/interface/src/voxels/VoxelSystem.cpp @@ -1170,7 +1170,7 @@ void VoxelSystem::render() { void VoxelSystem::applyScaleAndBindProgram(bool texture) { if (texture) { bindPerlinModulateProgram(); - glBindTexture(GL_TEXTURE_2D, TextureCache::getInstance()->getPermutationNormalTextureID()); + glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPermutationNormalTextureID()); } else { _program.bind(); } @@ -1178,7 +1178,7 @@ void VoxelSystem::applyScaleAndBindProgram(bool texture) { glPushMatrix(); glScalef(_treeScale, _treeScale, _treeScale); - TextureCache::getInstance()->setPrimaryDrawBuffers(true, true); + DependencyManager::get()->setPrimaryDrawBuffers(true, true); } void VoxelSystem::removeScaleAndReleaseProgram(bool texture) { @@ -1192,7 +1192,7 @@ void VoxelSystem::removeScaleAndReleaseProgram(bool texture) { _program.release(); } - TextureCache::getInstance()->setPrimaryDrawBuffers(true, false); + DependencyManager::get()->setPrimaryDrawBuffers(true, false); } int VoxelSystem::_nodeCount = 0; From e0a017e963fd290822b7bef9c8360e2d5ec1033f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 10:49:34 -0800 Subject: [PATCH 32/37] make GeometryCache work with DependancyManager --- interface/src/Application.cpp | 2 +- interface/src/Environment.cpp | 2 +- interface/src/ModelUploader.cpp | 2 +- interface/src/Util.cpp | 8 ++++---- interface/src/avatar/Avatar.cpp | 4 ++-- interface/src/avatar/Hand.cpp | 4 ++-- interface/src/avatar/MyAvatar.cpp | 4 ++-- interface/src/avatar/SkeletonModel.cpp | 14 +++++++------- interface/src/renderer/DeferredLightingEffect.cpp | 8 ++++---- interface/src/renderer/GeometryCache.cpp | 5 ----- interface/src/renderer/GeometryCache.h | 12 +++++------- interface/src/renderer/Model.cpp | 2 +- interface/src/ui/MetavoxelEditor.cpp | 2 +- interface/src/ui/overlays/Grid3DOverlay.cpp | 4 ++-- interface/src/ui/overlays/Sphere3DOverlay.cpp | 2 +- 15 files changed, 34 insertions(+), 41 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 105e3e087c..766424ef4b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3080,7 +3080,7 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly, RenderAr // draw a red sphere float originSphereRadius = 0.05f; glColor3f(1,0,0); - GeometryCache::getInstance()->renderSphere(originSphereRadius, 15, 15); + DependencyManager::get()->renderSphere(originSphereRadius, 15, 15); // Draw voxels if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index a754b63eec..fa8f18ac3f 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -261,7 +261,7 @@ void Environment::renderAtmosphere(Camera& camera, const EnvironmentData& data) glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); - GeometryCache::getInstance()->renderSphere(1.0f, 100, 50); //Draw a unit sphere + DependencyManager::get()->renderSphere(1.0f, 100, 50); //Draw a unit sphere glDepthMask(GL_TRUE); program->release(); diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index c3b6ba74c3..b22457f847 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -471,7 +471,7 @@ void ModelUploader::processCheck() { QString("ModelUploader::processCheck()"), QString("Your model is now available in the browser."), QMessageBox::Ok); - GeometryCache::getInstance()->refresh(_url); + DependencyManager::get()->refresh(_url); foreach (const QByteArray& filename, _textureFilenames) { DependencyManager::get()->refresh(_textureBase + filename); } diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 256e437e21..d93c8a26ad 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -71,22 +71,22 @@ void renderWorldBox() { glPushMatrix(); glTranslatef(MARKER_DISTANCE, 0, 0); glColor3fv(red); - GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); + DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, MARKER_DISTANCE, 0); glColor3fv(green); - GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); + DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, 0, MARKER_DISTANCE); glColor3fv(blue); - GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); + DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glColor3fv(gray); glTranslatef(MARKER_DISTANCE, 0, MARKER_DISTANCE); - GeometryCache::getInstance()->renderSphere(MARKER_RADIUS, 10, 10); + DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 0edf59290f..49a6f436df 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -394,7 +394,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool } else { glTranslatef(_position.x, getDisplayNamePosition().y + LOOK_AT_INDICATOR_OFFSET, _position.z); } - GeometryCache::getInstance()->renderSphere(LOOK_AT_INDICATOR_RADIUS, 15, 15); + DependencyManager::get()->renderSphere(LOOK_AT_INDICATOR_RADIUS, 15, 15); glPopMatrix(); } } @@ -422,7 +422,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool glPushMatrix(); glTranslatef(_position.x, _position.y, _position.z); glScalef(height, height, height); - GeometryCache::getInstance()->renderSphere(sphereRadius, 15, 15); + DependencyManager::get()->renderSphere(sphereRadius, 15, 15); glPopMatrix(); } diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index fef4ac2fac..9d1ee52fde 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -114,7 +114,7 @@ void Hand::render(bool isMine, Model::RenderMode renderMode) { glPushMatrix(); glTranslatef(position.x, position.y, position.z); glColor3f(0.0f, 1.0f, 0.0f); - GeometryCache::getInstance()->renderSphere(PALM_COLLISION_RADIUS * _owningAvatar->getScale(), 10, 10); + DependencyManager::get()->renderSphere(PALM_COLLISION_RADIUS * _owningAvatar->getScale(), 10, 10); glPopMatrix(); } } @@ -179,7 +179,7 @@ void Hand::renderHandTargets(bool isMine) { Avatar::renderJointConnectingCone(root, offsetFromPalm, PALM_DISK_RADIUS, 0.0f); glPushMatrix(); glTranslatef(root.x, root.y, root.z); - GeometryCache::getInstance()->renderSphere(PALM_BALL_RADIUS, 20.0f, 20.0f); + DependencyManager::get()->renderSphere(PALM_BALL_RADIUS, 20.0f, 20.0f); glPopMatrix(); } } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 255e79ebcd..057b1f1fc6 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -394,7 +394,7 @@ void MyAvatar::renderDebugBodyPoints() { glPushMatrix(); glColor4f(0, 1, 0, .5f); glTranslatef(position.x, position.y, position.z); - GeometryCache::getInstance()->renderSphere(0.2f, 10.0f, 10.0f); + DependencyManager::get()->renderSphere(0.2f, 10.0f, 10.0f); glPopMatrix(); // Head Sphere @@ -402,7 +402,7 @@ void MyAvatar::renderDebugBodyPoints() { glPushMatrix(); glColor4f(0, 1, 0, .5f); glTranslatef(position.x, position.y, position.z); - GeometryCache::getInstance()->renderSphere(0.15f, 10.0f, 10.0f); + DependencyManager::get()->renderSphere(0.15f, 10.0f, 10.0f); glPopMatrix(); } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 9bc2b627be..f71c9318aa 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -561,9 +561,9 @@ void SkeletonModel::renderRagdoll() { glTranslatef(position.x, position.y, position.z); // draw each point as a yellow hexagon with black border glColor4f(0.0f, 0.0f, 0.0f, alpha); - GeometryCache::getInstance()->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + DependencyManager::get()->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); glColor4f(1.0f, 1.0f, 0.0f, alpha); - GeometryCache::getInstance()->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + DependencyManager::get()->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); glPopMatrix(); } glPopMatrix(); @@ -913,7 +913,7 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { endPoint = endPoint - _translation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); glColor4f(0.6f, 0.6f, 0.8f, alpha); - GeometryCache::getInstance()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + DependencyManager::get()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -922,7 +922,7 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); glColor4f(0.8f, 0.8f, 0.6f, alpha); - GeometryCache::getInstance()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + DependencyManager::get()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a green cylinder between the two points glm::vec3 origin(0.0f); @@ -955,7 +955,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { glTranslatef(position.x, position.y, position.z); // draw a grey sphere at shape position glColor4f(0.75f, 0.75f, 0.75f, alpha); - GeometryCache::getInstance()->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + DependencyManager::get()->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); } else if (shape->getType() == CAPSULE_SHAPE) { CapsuleShape* capsule = static_cast(shape); @@ -965,7 +965,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { endPoint = endPoint - simulationTranslation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); glColor4f(0.6f, 0.6f, 0.8f, alpha); - GeometryCache::getInstance()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + DependencyManager::get()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -974,7 +974,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); glColor4f(0.8f, 0.8f, 0.6f, alpha); - GeometryCache::getInstance()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + DependencyManager::get()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a green cylinder between the two points glm::vec3 origin(0.0f); diff --git a/interface/src/renderer/DeferredLightingEffect.cpp b/interface/src/renderer/DeferredLightingEffect.cpp index facec197a7..75af4647e4 100644 --- a/interface/src/renderer/DeferredLightingEffect.cpp +++ b/interface/src/renderer/DeferredLightingEffect.cpp @@ -51,7 +51,7 @@ void DeferredLightingEffect::releaseSimpleProgram() { void DeferredLightingEffect::renderSolidSphere(float radius, int slices, int stacks) { bindSimpleProgram(); - GeometryCache::getInstance()->renderSphere(radius, slices, stacks); + DependencyManager::get()->renderSphere(radius, slices, stacks); releaseSimpleProgram(); } @@ -75,7 +75,7 @@ void DeferredLightingEffect::renderWireCube(float size) { void DeferredLightingEffect::renderSolidCone(float base, float height, int slices, int stacks) { bindSimpleProgram(); - GeometryCache::getInstance()->renderCone(base, height, slices, stacks); + DependencyManager::get()->renderCone(base, height, slices, stacks); releaseSimpleProgram(); } @@ -270,7 +270,7 @@ void DeferredLightingEffect::render() { } else { glTranslatef(light.position.x, light.position.y, light.position.z); - GeometryCache::getInstance()->renderSphere(expandedRadius, 32, 32); + DependencyManager::get()->renderSphere(expandedRadius, 32, 32); } glPopMatrix(); @@ -323,7 +323,7 @@ void DeferredLightingEffect::render() { glm::vec3 axis = glm::axis(spotRotation); glRotatef(glm::degrees(glm::angle(spotRotation)), axis.x, axis.y, axis.z); glTranslatef(0.0f, 0.0f, -light.radius * (1.0f + SCALE_EXPANSION * 0.5f)); - GeometryCache::getInstance()->renderCone(expandedRadius * glm::tan(light.cutoff), + DependencyManager::get()->renderCone(expandedRadius * glm::tan(light.cutoff), expandedRadius, 32, 1); } diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 048d3d0444..534911ff46 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -23,11 +23,6 @@ #include "GeometryCache.h" #include "TextureCache.h" -GeometryCache* GeometryCache::getInstance() { - static GeometryCache instance; - return &instance; -} - GeometryCache::GeometryCache() { } diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index 1eb9dcbc6a..2d813ece09 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -31,16 +32,10 @@ class NetworkMesh; class NetworkTexture; /// Stores cached geometry. -class GeometryCache : public ResourceCache { +class GeometryCache : public ResourceCache, public DependencyManager::Dependency { Q_OBJECT public: - - static GeometryCache* getInstance(); - - GeometryCache(); - virtual ~GeometryCache(); - void renderHemisphere(int slices, int stacks); void renderSphere(float radius, int slices, int stacks); void renderSquare(int xDivisions, int yDivisions); @@ -59,6 +54,9 @@ protected: const QSharedPointer& fallback, bool delayLoad, const void* extra); private: + GeometryCache(); + virtual ~GeometryCache(); + friend class DependencyManager; typedef QPair IntPair; typedef QPair VerticesIndices; diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 7004b277ca..0ab3f82fda 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -997,7 +997,7 @@ void Model::setURL(const QUrl& url, const QUrl& fallback, bool retainCurrent, bo _url = url; // if so instructed, keep the current geometry until the new one is loaded - _nextBaseGeometry = _nextGeometry = GeometryCache::getInstance()->getGeometry(url, fallback, delayLoad); + _nextBaseGeometry = _nextGeometry = DependencyManager::get()->getGeometry(url, fallback, delayLoad); _nextLODHysteresis = NetworkGeometry::NO_HYSTERESIS; if (!retainCurrent || !isActive() || _nextGeometry->isLoaded()) { applyNextGeometry(); diff --git a/interface/src/ui/MetavoxelEditor.cpp b/interface/src/ui/MetavoxelEditor.cpp index 1ca81f3d95..158532e19a 100644 --- a/interface/src/ui/MetavoxelEditor.cpp +++ b/interface/src/ui/MetavoxelEditor.cpp @@ -353,7 +353,7 @@ void MetavoxelEditor::render() { _gridProgram.bind(); - GeometryCache::getInstance()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS); + DependencyManager::get()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS); _gridProgram.release(); diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index 67dd0b8e21..d1086ae534 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -87,7 +87,7 @@ void Grid3DOverlay::render(RenderArgs* args) { float scale = MINOR_GRID_DIVISIONS * spacing; glScalef(scale, scale, scale); - GeometryCache::getInstance()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS); + DependencyManager::get()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS); } glPopMatrix(); @@ -102,7 +102,7 @@ void Grid3DOverlay::render(RenderArgs* args) { float scale = MAJOR_GRID_DIVISIONS * spacing; glScalef(scale, scale, scale); - GeometryCache::getInstance()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS); + DependencyManager::get()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS); } glPopMatrix(); diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index b9aeb5145a..ded1b3917c 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -63,7 +63,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { glScalef(dimensions.x, dimensions.y, dimensions.z); //Application::getInstance()->getDeferredLightingEffect()->renderSolidCube(1.0f); if (_isSolid) { - GeometryCache::getInstance()->renderSphere(1.0f, SLICES, SLICES); + DependencyManager::get()->renderSphere(1.0f, SLICES, SLICES); } else { glutWireSphere(1.0f, SLICES, SLICES); } From 049cb25f07c3c4d52f5ef9238f5ae36956c9227e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 10:56:29 -0800 Subject: [PATCH 33/37] make ModelBlender work with DependancyManager --- interface/src/renderer/Model.cpp | 9 ++------- interface/src/renderer/Model.h | 13 ++++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 0ab3f82fda..62170efeed 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -1149,7 +1149,7 @@ void Blender::run() { } } // post the result to the geometry cache, which will dispatch to the model if still alive - QMetaObject::invokeMethod(ModelBlender::getInstance(), "setBlendedVertices", + QMetaObject::invokeMethod(DependencyManager::get(), "setBlendedVertices", Q_ARG(const QPointer&, _model), Q_ARG(int, _blendNumber), Q_ARG(const QWeakPointer&, _geometry), Q_ARG(const QVector&, vertices), Q_ARG(const QVector&, normals)); @@ -1312,7 +1312,7 @@ void Model::simulateInternal(float deltaTime) { // post the blender if we're not currently waiting for one to finish if (geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { _blendedBlendshapeCoefficients = _blendshapeCoefficients; - ModelBlender::getInstance()->noteRequiresBlend(this); + DependencyManager::get()->noteRequiresBlend(this); } } @@ -2545,11 +2545,6 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod return meshPartsRendered; } -ModelBlender* ModelBlender::getInstance() { - static ModelBlender instance; - return &instance; -} - ModelBlender::ModelBlender() : _pendingBlenders(0) { } diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index e95b2472ba..9b609de1d0 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -19,6 +19,7 @@ #include "Transform.h" #include #include +#include #include #include @@ -460,17 +461,11 @@ Q_DECLARE_METATYPE(QWeakPointer) Q_DECLARE_METATYPE(QVector) /// Handle management of pending models that need blending -class ModelBlender : public QObject { +class ModelBlender : public QObject, public DependencyManager::Dependency { Q_OBJECT public: - static ModelBlender* getInstance(); - - ModelBlender(); - virtual ~ModelBlender(); - - /// Adds the specified model to the list requiring vertex blends. void noteRequiresBlend(Model* model); @@ -479,6 +474,10 @@ public slots: const QVector& vertices, const QVector& normals); private: + ModelBlender(); + virtual ~ModelBlender(); + friend class DependencyManager; + QList > _modelsRequiringBlends; int _pendingBlenders; }; From 90c1132dd553bb10e221cdb569efc005ca975f42 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 11:28:57 -0800 Subject: [PATCH 34/37] reduce calls to DependencyManager::get<> where possible --- interface/src/Util.cpp | 9 +++++---- interface/src/avatar/SkeletonModel.cpp | 18 +++++++++++------- .../src/renderer/DeferredLightingEffect.cpp | 8 +++++--- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index d93c8a26ad..6d40726f14 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -71,22 +71,23 @@ void renderWorldBox() { glPushMatrix(); glTranslatef(MARKER_DISTANCE, 0, 0); glColor3fv(red); - DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); + GeometryCache* geometryCache = DependencyManager::get(); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, MARKER_DISTANCE, 0); glColor3fv(green); - DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, 0, MARKER_DISTANCE); glColor3fv(blue); - DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glColor3fv(gray); glTranslatef(MARKER_DISTANCE, 0, MARKER_DISTANCE); - DependencyManager::get()->renderSphere(MARKER_RADIUS, 10, 10); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index f71c9318aa..42c74db143 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -554,6 +554,7 @@ void SkeletonModel::renderRagdoll() { float radius1 = 0.008f; float radius2 = 0.01f; glm::vec3 simulationTranslation = _ragdoll->getTranslationInSimulationFrame(); + GeometryCache* geometryCache = DependencyManager::get(); for (int i = 0; i < numPoints; ++i) { glPushMatrix(); // NOTE: ragdollPoints are in simulation-frame but we want them to be model-relative @@ -561,9 +562,9 @@ void SkeletonModel::renderRagdoll() { glTranslatef(position.x, position.y, position.z); // draw each point as a yellow hexagon with black border glColor4f(0.0f, 0.0f, 0.0f, alpha); - DependencyManager::get()->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); glColor4f(1.0f, 1.0f, 0.0f, alpha); - DependencyManager::get()->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); glPopMatrix(); } glPopMatrix(); @@ -913,7 +914,8 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { endPoint = endPoint - _translation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); glColor4f(0.6f, 0.6f, 0.8f, alpha); - DependencyManager::get()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + GeometryCache* geometryCache = DependencyManager::get(); + geometryCache->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -922,7 +924,7 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); glColor4f(0.8f, 0.8f, 0.6f, alpha); - DependencyManager::get()->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a green cylinder between the two points glm::vec3 origin(0.0f); @@ -948,6 +950,8 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { continue; } + GeometryCache* geometryCache = DependencyManager::get(); + glPushMatrix(); // shapes are stored in simulation-frame but we want position to be model-relative if (shape->getType() == SPHERE_SHAPE) { @@ -955,7 +959,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { glTranslatef(position.x, position.y, position.z); // draw a grey sphere at shape position glColor4f(0.75f, 0.75f, 0.75f, alpha); - DependencyManager::get()->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); } else if (shape->getType() == CAPSULE_SHAPE) { CapsuleShape* capsule = static_cast(shape); @@ -965,7 +969,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { endPoint = endPoint - simulationTranslation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); glColor4f(0.6f, 0.6f, 0.8f, alpha); - DependencyManager::get()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -974,7 +978,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); glColor4f(0.8f, 0.8f, 0.6f, alpha); - DependencyManager::get()->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); // draw a green cylinder between the two points glm::vec3 origin(0.0f); diff --git a/interface/src/renderer/DeferredLightingEffect.cpp b/interface/src/renderer/DeferredLightingEffect.cpp index 75af4647e4..e40193c8c3 100644 --- a/interface/src/renderer/DeferredLightingEffect.cpp +++ b/interface/src/renderer/DeferredLightingEffect.cpp @@ -234,6 +234,8 @@ void DeferredLightingEffect::render() { const glm::vec3& eyePoint = Application::getInstance()->getDisplayViewFrustum()->getPosition(); float nearRadius = glm::distance(eyePoint, Application::getInstance()->getDisplayViewFrustum()->getNearTopLeft()); + + GeometryCache* geometryCache = DependencyManager::get(); if (!_pointLights.isEmpty()) { _pointLight.bind(); @@ -241,7 +243,7 @@ void DeferredLightingEffect::render() { _pointLight.setUniformValue(_pointLightLocations.depthScale, depthScale); _pointLight.setUniformValue(_pointLightLocations.depthTexCoordOffset, depthTexCoordOffsetS, depthTexCoordOffsetT); _pointLight.setUniformValue(_pointLightLocations.depthTexCoordScale, depthTexCoordScaleS, depthTexCoordScaleT); - + foreach (const PointLight& light, _pointLights) { _pointLight.setUniformValue(_pointLightLocations.radius, light.radius); glLightfv(GL_LIGHT1, GL_AMBIENT, (const GLfloat*)&light.ambient); @@ -270,7 +272,7 @@ void DeferredLightingEffect::render() { } else { glTranslatef(light.position.x, light.position.y, light.position.z); - DependencyManager::get()->renderSphere(expandedRadius, 32, 32); + geometryCache->renderSphere(expandedRadius, 32, 32); } glPopMatrix(); @@ -323,7 +325,7 @@ void DeferredLightingEffect::render() { glm::vec3 axis = glm::axis(spotRotation); glRotatef(glm::degrees(glm::angle(spotRotation)), axis.x, axis.y, axis.z); glTranslatef(0.0f, 0.0f, -light.radius * (1.0f + SCALE_EXPANSION * 0.5f)); - DependencyManager::get()->renderCone(expandedRadius * glm::tan(light.cutoff), + geometryCache->renderCone(expandedRadius * glm::tan(light.cutoff), expandedRadius, 32, 1); } From 3bc132154906013d13e9f4e90e069afa68d738a0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 11:40:17 -0800 Subject: [PATCH 35/37] reduce calls to DependencyManager::get<> where possible --- interface/src/MetavoxelSystem.cpp | 6 ++++-- .../src/renderer/DeferredLightingEffect.cpp | 21 +++++++++++-------- interface/src/renderer/GeometryCache.cpp | 19 ++++++++++------- interface/src/renderer/GlowEffect.cpp | 9 ++++---- interface/src/renderer/Model.cpp | 11 +++++----- 5 files changed, 38 insertions(+), 28 deletions(-) diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index a61f6e41d7..84ccf0f406 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -1177,10 +1177,11 @@ void VoxelBuffer::render(bool cursor) { if (!_materials.isEmpty()) { _networkTextures.resize(_materials.size()); + TextureCache* textureCache = DependencyManager::get(); for (int i = 0; i < _materials.size(); i++) { const SharedObjectPointer material = _materials.at(i); if (material) { - _networkTextures[i] = DependencyManager::get()->getTexture( + _networkTextures[i] = textureCache->getTexture( static_cast(material.data())->getDiffuse(), SPLAT_TEXTURE); } } @@ -2231,10 +2232,11 @@ void HeightfieldNodeRenderer::render(const HeightfieldNodePointer& node, const g const QVector& materials = node->getMaterial()->getMaterials(); _networkTextures.resize(materials.size()); + TextureCache* textureCache = DependencyManager::get(); for (int i = 0; i < materials.size(); i++) { const SharedObjectPointer& material = materials.at(i); if (material) { - _networkTextures[i] = DependencyManager::get()->getTexture( + _networkTextures[i] = textureCache->getTexture( static_cast(material.data())->getDiffuse(), SPLAT_TEXTURE); } } diff --git a/interface/src/renderer/DeferredLightingEffect.cpp b/interface/src/renderer/DeferredLightingEffect.cpp index e40193c8c3..22ac5d82b6 100644 --- a/interface/src/renderer/DeferredLightingEffect.cpp +++ b/interface/src/renderer/DeferredLightingEffect.cpp @@ -117,15 +117,16 @@ void DeferredLightingEffect::addSpotLight(const glm::vec3& position, float radiu void DeferredLightingEffect::prepare() { // clear the normal and specular buffers - DependencyManager::get()->setPrimaryDrawBuffers(false, true, false); + TextureCache* textureCache = DependencyManager::get(); + textureCache->setPrimaryDrawBuffers(false, true, false); glClear(GL_COLOR_BUFFER_BIT); - DependencyManager::get()->setPrimaryDrawBuffers(false, false, true); + textureCache->setPrimaryDrawBuffers(false, false, true); // clearing to zero alpha for specular causes problems on my Nvidia card; clear to lowest non-zero value instead const float MAX_SPECULAR_EXPONENT = 128.0f; glClearColor(0.0f, 0.0f, 0.0f, 1.0f / MAX_SPECULAR_EXPONENT); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - DependencyManager::get()->setPrimaryDrawBuffers(true, false, false); + textureCache->setPrimaryDrawBuffers(true, false, false); } void DeferredLightingEffect::render() { @@ -137,8 +138,10 @@ void DeferredLightingEffect::render() { glDisable(GL_DEPTH_TEST); glDisable(GL_COLOR_MATERIAL); glDepthMask(false); + + TextureCache* textureCache = DependencyManager::get(); - QOpenGLFramebufferObject* primaryFBO = DependencyManager::get()->getPrimaryFramebufferObject(); + QOpenGLFramebufferObject* primaryFBO = textureCache->getPrimaryFramebufferObject(); primaryFBO->release(); QOpenGLFramebufferObject* freeFBO = Application::getInstance()->getGlowEffect()->getFreeFramebufferObject(); @@ -148,13 +151,13 @@ void DeferredLightingEffect::render() { glBindTexture(GL_TEXTURE_2D, primaryFBO->texture()); glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimaryNormalTextureID()); + glBindTexture(GL_TEXTURE_2D, textureCache->getPrimaryNormalTextureID()); glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimarySpecularTextureID()); + glBindTexture(GL_TEXTURE_2D, textureCache->getPrimarySpecularTextureID()); glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimaryDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, textureCache->getPrimaryDepthTextureID()); // get the viewport side (left, right, both) int viewport[4]; @@ -173,7 +176,7 @@ void DeferredLightingEffect::render() { bool shadowsEnabled = Menu::getInstance()->getShadowsEnabled(); if (shadowsEnabled) { glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getShadowDepthTextureID()); + glBindTexture(GL_TEXTURE_2D, textureCache->getShadowDepthTextureID()); program = &_directionalLightShadowMap; locations = &_directionalLightShadowMapLocations; @@ -188,7 +191,7 @@ void DeferredLightingEffect::render() { program->bind(); } program->setUniformValue(locations->shadowScale, - 1.0f / DependencyManager::get()->getShadowFramebufferObject()->width()); + 1.0f / textureCache->getShadowFramebufferObject()->width()); } else { program->bind(); diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 534911ff46..974a542b0e 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -699,6 +699,7 @@ void NetworkGeometry::clearLoadPriority(const QPointer& owner) { void NetworkGeometry::setTextureWithNameToURL(const QString& name, const QUrl& url) { if (_meshes.size() > 0) { + TextureCache* textureCache = DependencyManager::get(); for (int i = 0; i < _meshes.size(); i++) { NetworkMesh& mesh = _meshes[i]; for (int j = 0; j < mesh.parts.size(); j++) { @@ -707,19 +708,19 @@ void NetworkGeometry::setTextureWithNameToURL(const QString& name, const QUrl& u QSharedPointer matchingTexture = QSharedPointer(); if (part.diffuseTextureName == name) { part.diffuseTexture = - DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, + textureCache->getTexture(url, DEFAULT_TEXTURE, _geometry.meshes[i].isEye, QByteArray()); part.diffuseTexture->setLoadPriorities(_loadPriorities); } else if (part.normalTextureName == name) { - part.normalTexture = DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, + part.normalTexture = textureCache->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.normalTexture->setLoadPriorities(_loadPriorities); } else if (part.specularTextureName == name) { - part.specularTexture = DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, + part.specularTexture = textureCache->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.specularTexture->setLoadPriorities(_loadPriorities); } else if (part.emissiveTextureName == name) { - part.emissiveTexture = DependencyManager::get()->getTexture(url, DEFAULT_TEXTURE, + part.emissiveTexture = textureCache->getTexture(url, DEFAULT_TEXTURE, false, QByteArray()); part.emissiveTexture->setLoadPriorities(_loadPriorities); } @@ -912,6 +913,8 @@ void NetworkGeometry::reinsert() { void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { _geometry = geometry; + + TextureCache* textureCache = DependencyManager::get(); foreach (const FBXMesh& mesh, _geometry.meshes) { NetworkMesh networkMesh; @@ -920,28 +923,28 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { foreach (const FBXMeshPart& part, mesh.parts) { NetworkMeshPart networkPart; if (!part.diffuseTexture.filename.isEmpty()) { - networkPart.diffuseTexture = DependencyManager::get()->getTexture( + networkPart.diffuseTexture = textureCache->getTexture( _textureBase.resolved(QUrl(part.diffuseTexture.filename)), DEFAULT_TEXTURE, mesh.isEye, part.diffuseTexture.content); networkPart.diffuseTextureName = part.diffuseTexture.name; networkPart.diffuseTexture->setLoadPriorities(_loadPriorities); } if (!part.normalTexture.filename.isEmpty()) { - networkPart.normalTexture = DependencyManager::get()->getTexture( + networkPart.normalTexture = textureCache->getTexture( _textureBase.resolved(QUrl(part.normalTexture.filename)), NORMAL_TEXTURE, false, part.normalTexture.content); networkPart.normalTextureName = part.normalTexture.name; networkPart.normalTexture->setLoadPriorities(_loadPriorities); } if (!part.specularTexture.filename.isEmpty()) { - networkPart.specularTexture = DependencyManager::get()->getTexture( + networkPart.specularTexture = textureCache->getTexture( _textureBase.resolved(QUrl(part.specularTexture.filename)), SPECULAR_TEXTURE, false, part.specularTexture.content); networkPart.specularTextureName = part.specularTexture.name; networkPart.specularTexture->setLoadPriorities(_loadPriorities); } if (!part.emissiveTexture.filename.isEmpty()) { - networkPart.emissiveTexture = DependencyManager::get()->getTexture( + networkPart.emissiveTexture = textureCache->getTexture( _textureBase.resolved(QUrl(part.emissiveTexture.filename)), EMISSIVE_TEXTURE, false, part.emissiveTexture.content); networkPart.emissiveTextureName = part.emissiveTexture.name; diff --git a/interface/src/renderer/GlowEffect.cpp b/interface/src/renderer/GlowEffect.cpp index e6bbdb2ba1..b6896eeaad 100644 --- a/interface/src/renderer/GlowEffect.cpp +++ b/interface/src/renderer/GlowEffect.cpp @@ -122,7 +122,8 @@ static void maybeRelease(QOpenGLFramebufferObject* fbo) { QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { PerformanceTimer perfTimer("glowEffect"); - QOpenGLFramebufferObject* primaryFBO = DependencyManager::get()->getPrimaryFramebufferObject(); + TextureCache* textureCache = DependencyManager::get(); + QOpenGLFramebufferObject* primaryFBO = textureCache->getPrimaryFramebufferObject(); primaryFBO->release(); glBindTexture(GL_TEXTURE_2D, primaryFBO->texture()); @@ -138,7 +139,7 @@ QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { glDepthMask(GL_FALSE); QOpenGLFramebufferObject* destFBO = toTexture ? - DependencyManager::get()->getSecondaryFramebufferObject() : NULL; + textureCache->getSecondaryFramebufferObject() : NULL; if (!Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect) || _isEmpty) { // copy the primary to the screen if (destFBO && QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()) { @@ -160,9 +161,9 @@ QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { } else { // diffuse into the secondary/tertiary (alternating between frames) QOpenGLFramebufferObject* oldDiffusedFBO = - DependencyManager::get()->getSecondaryFramebufferObject(); + textureCache->getSecondaryFramebufferObject(); QOpenGLFramebufferObject* newDiffusedFBO = - DependencyManager::get()->getTertiaryFramebufferObject(); + textureCache->getTertiaryFramebufferObject(); if (_isOddFrame) { qSwap(oldDiffusedFBO, newDiffusedFBO); } diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 62170efeed..2a6988a984 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -2324,7 +2324,8 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod bool dontCullOutOfViewMeshParts = Menu::getInstance()->isOptionChecked(MenuOption::DontCullOutOfViewMeshParts); bool cullTooSmallMeshParts = !Menu::getInstance()->isOptionChecked(MenuOption::DontCullTooSmallMeshParts); bool dontReduceMaterialSwitches = Menu::getInstance()->isOptionChecked(MenuOption::DontReduceMaterialSwitches); - + + TextureCache* textureCache = DependencyManager::get(); QString lastMaterialID; int meshPartsRendered = 0; updateVisibleJointStates(); @@ -2446,7 +2447,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod if (showDiffuse && diffuseMap) { GLBATCH(glBindTexture)(GL_TEXTURE_2D, diffuseMap->getID()); } else { - GLBATCH(glBindTexture)(GL_TEXTURE_2D, DependencyManager::get()->getWhiteTextureID()); + GLBATCH(glBindTexture)(GL_TEXTURE_2D, textureCache->getWhiteTextureID()); } if (locations->texcoordMatrices >= 0) { @@ -2464,7 +2465,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE1); Texture* normalMap = networkPart.normalTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !normalMap ? - DependencyManager::get()->getBlueTextureID() : normalMap->getID()); + textureCache->getBlueTextureID() : normalMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } @@ -2472,7 +2473,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE0 + locations->specularTextureUnit); Texture* specularMap = networkPart.specularTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !specularMap ? - DependencyManager::get()->getWhiteTextureID() : specularMap->getID()); + textureCache->getWhiteTextureID() : specularMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } @@ -2493,7 +2494,7 @@ int Model::renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMod GLBATCH(glActiveTexture)(GL_TEXTURE0 + locations->emissiveTextureUnit); Texture* emissiveMap = networkPart.emissiveTexture.data(); GLBATCH(glBindTexture)(GL_TEXTURE_2D, !emissiveMap ? - DependencyManager::get()->getWhiteTextureID() : emissiveMap->getID()); + textureCache->getWhiteTextureID() : emissiveMap->getID()); GLBATCH(glActiveTexture)(GL_TEXTURE0); } From 94cf8b33841a6a9ffbaaf9b973d1bb803626600c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 15 Dec 2014 11:43:30 -0800 Subject: [PATCH 36/37] reduce calls to DependencyManager::get<> where possible --- interface/src/ModelUploader.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index b22457f847..6f582d60eb 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -466,17 +466,19 @@ void ModelUploader::processCheck() { _timer.stop(); switch (reply->error()) { - case QNetworkReply::NoError: + case QNetworkReply::NoError: { QMessageBox::information(NULL, QString("ModelUploader::processCheck()"), QString("Your model is now available in the browser."), QMessageBox::Ok); DependencyManager::get()->refresh(_url); + TextureCache* textureCache = DependencyManager::get(); foreach (const QByteArray& filename, _textureFilenames) { - DependencyManager::get()->refresh(_textureBase + filename); + textureCache->refresh(_textureBase + filename); } deleteLater(); break; + } case QNetworkReply::ContentNotFoundError: if (--_numberOfChecks) { _timer.start(TIMEOUT); From 50c1e9fb4037cd9f225177ff9e6e5603c11c4776 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 15 Dec 2014 22:41:35 -0800 Subject: [PATCH 37/37] Fixes for missing audio device. --- interface/src/Audio.cpp | 7 ++++++- libraries/audio/src/AudioRingBuffer.h | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 101d16d3ba..bf176e0415 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -450,7 +450,9 @@ void Audio::start() { qDebug() << "Unable to set up audio output because of a problem with output format."; } - _inputFrameBuffer.initialize( _inputFormat.channelCount(), _audioInput->bufferSize() * 8 ); + if (_audioInput) { + _inputFrameBuffer.initialize( _inputFormat.channelCount(), _audioInput->bufferSize() * 8 ); + } _inputGain.initialize(); _sourceGain.initialize(); _noiseSource.initialize(); @@ -1935,6 +1937,9 @@ int Audio::calculateNumberOfFrameSamples(int numBytes) const { } float Audio::getAudioOutputMsecsUnplayed() const { + if (!_audioOutput) { + return 0.0f; + } int bytesAudioOutputUnplayed = _audioOutput->bufferSize() - _audioOutput->bytesFree(); float msecsAudioOutputUnplayed = bytesAudioOutputUnplayed / (float)_outputFormat.bytesForDuration(USECS_PER_MSEC); return msecsAudioOutputUnplayed; diff --git a/libraries/audio/src/AudioRingBuffer.h b/libraries/audio/src/AudioRingBuffer.h index f033ffa80f..9239527df3 100644 --- a/libraries/audio/src/AudioRingBuffer.h +++ b/libraries/audio/src/AudioRingBuffer.h @@ -62,7 +62,7 @@ public: float getNextOutputFrameLoudness() const; int samplesAvailable() const; - int framesAvailable() const { return samplesAvailable() / _numFrameSamples; } + int framesAvailable() const { return (_numFrameSamples == 0) ? 0 : samplesAvailable() / _numFrameSamples; } int getNumFrameSamples() const { return _numFrameSamples; }