From 02f6f6769b36361d3619fa8d0f4bd8389f6b118e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Nov 2014 08:56:50 -0800 Subject: [PATCH 01/15] Enable different copies of otherwise identical text renderers Needed when using computeWidth() because it messes up draw() rendering. --- interface/src/ui/TextRenderer.cpp | 7 ++++--- interface/src/ui/TextRenderer.h | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/TextRenderer.cpp b/interface/src/ui/TextRenderer.cpp index 69df609ba9..f64f895d81 100644 --- a/interface/src/ui/TextRenderer.cpp +++ b/interface/src/ui/TextRenderer.cpp @@ -37,12 +37,13 @@ static uint qHash(const TextRenderer::Properties& key, uint seed = 0) { } static bool operator==(const TextRenderer::Properties& p1, const TextRenderer::Properties& p2) { - return p1.font == p2.font && p1.effect == p2.effect && p1.effectThickness == p2.effectThickness && p1.color == p2.color; + return p1.font == p2.font && p1.effect == p2.effect && p1.effectThickness == p2.effectThickness && p1.color == p2.color + && p1.copy == p2.copy; } TextRenderer* TextRenderer::getInstance(const char* family, int pointSize, int weight, bool italic, - EffectType effect, int effectThickness, const QColor& color) { - Properties properties = { QFont(family, pointSize, weight, italic), effect, effectThickness, color }; + EffectType effect, int effectThickness, const QColor& color, int copy) { + Properties properties = { QFont(family, pointSize, weight, italic), effect, effectThickness, color, copy }; TextRenderer*& instance = _instances[properties]; if (!instance) { instance = new TextRenderer(properties); diff --git a/interface/src/ui/TextRenderer.h b/interface/src/ui/TextRenderer.h index bcb0ce8890..b3a3e98b1d 100644 --- a/interface/src/ui/TextRenderer.h +++ b/interface/src/ui/TextRenderer.h @@ -50,10 +50,11 @@ public: EffectType effect; int effectThickness; QColor color; + int copy; // Use to separate renderers that are otherwise identical. }; static TextRenderer* getInstance(const char* family, int pointSize = -1, int weight = -1, bool italic = false, - EffectType effect = NO_EFFECT, int effectThickness = 1, const QColor& color = QColor(255, 255, 255)); + EffectType effect = NO_EFFECT, int effectThickness = 1, const QColor& color = QColor(255, 255, 255), int copy = 0); ~TextRenderer(); From 7e6d616f207fa34acb725f8915f1e98b1e8148e5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Nov 2014 08:58:31 -0800 Subject: [PATCH 02/15] Add text overlay textWidth() method Is accessible from JavaScript. --- interface/src/ui/overlays/Overlays.cpp | 16 ++++++++++++++++ interface/src/ui/overlays/Overlays.h | 4 ++++ interface/src/ui/overlays/Text3DOverlay.cpp | 11 +++++++++-- interface/src/ui/overlays/Text3DOverlay.h | 2 ++ interface/src/ui/overlays/TextOverlay.cpp | 7 +++++++ interface/src/ui/overlays/TextOverlay.h | 2 ++ 6 files changed, 40 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index df7a5fbcea..b65fe6d286 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -9,6 +9,7 @@ // #include +#include #include #include @@ -357,3 +358,18 @@ bool Overlays::isLoaded(unsigned int id) { return overlay->isLoaded(); } +float Overlays::textWidth(unsigned int id, const QString& text) { + if (_overlays2D.contains(id)) { + Overlay* thisOverlay = _overlays2D[id]; + if (typeid(*thisOverlay) == typeid(TextOverlay)) { + return static_cast(thisOverlay)->textWidth(text); + } + } + if (_overlays3D.contains(id)) { + Overlay* thisOverlay = _overlays3D[id]; + if (typeid(*thisOverlay) == typeid(Text3DOverlay)) { + return static_cast(thisOverlay)->textWidth(text); + } + } + return 0.f; +} diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 686b998267..dcda9a8ed7 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -65,6 +65,10 @@ public slots: /// returns whether the overlay's assets are loaded or not bool isLoaded(unsigned int id); + /// returns the width of the given text in the specified overlay if it is a text overlay: in pixels if it is a 2D text + /// overlay; in meters if it is a 3D text overlay + float textWidth(unsigned int id, const QString& text); + private: QMap _overlays2D; QMap _overlays3D; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index d8febbf0eb..3f225bc756 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -17,6 +17,8 @@ const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 }; const float DEFAULT_MARGIN = 0.1f; +const int FIXED_FONT_POINT_SIZE = 40; +const float LINE_SCALE_RATIO = 1.2f; Text3DOverlay::Text3DOverlay() : _backgroundColor(DEFAULT_BACKGROUND_COLOR), @@ -87,11 +89,9 @@ void Text3DOverlay::render(RenderArgs* args) { glVertex3f(-halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); glEnd(); - const int FIXED_FONT_POINT_SIZE = 40; const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 40.0f; // this is a ratio determined through experimentation TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); - float LINE_SCALE_RATIO = 1.2f; float maxHeight = (float)textRenderer->calculateHeight("Xy") * LINE_SCALE_RATIO; float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight; @@ -179,4 +179,11 @@ void Text3DOverlay::setProperties(const QScriptValue& properties) { } +float Text3DOverlay::textWidth(const QString& text) { + const int TEXT3DOVERLAY_TEXTWIDTH_RENDERER = 2; // Separate to that used for drawing text so that doesn't interfere. + TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE, -1, false, + TextRenderer::NO_EFFECT, 1, QColor(255, 255, 255), TEXT3DOVERLAY_TEXTWIDTH_RENDERER); + float scaleFactor = _lineHeight * LINE_SCALE_RATIO / (float)textRenderer->calculateHeight("X"); + return scaleFactor * (float)textRenderer->computeWidth(qPrintable(text)); +} diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index 45e311c554..f0369b4206 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -48,6 +48,8 @@ public: virtual void setProperties(const QScriptValue& properties); + float textWidth(const QString& text); // Meters + private: void enableClipPlane(GLenum plane, float x, float y, float z, float w); diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 530b30a856..455884c13e 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -126,3 +126,10 @@ void TextOverlay::setProperties(const QScriptValue& properties) { } +float TextOverlay::textWidth(const QString& text) { + const int TEXTOVERLAY_GETTEXTWIDTH_TEXTRENDERER = 1; // Separate to that used for drawing text so that doesn't interfere. + TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, _fontSize, -1, FALSE, TextRenderer::NO_EFFECT, 1, + QColor(255, 255, 255), TEXTOVERLAY_GETTEXTWIDTH_TEXTRENDERER); + + return textRenderer->computeWidth(qPrintable(text)); +} diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index f7ff83e542..fae9e7c582 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -53,6 +53,8 @@ public: virtual void setProperties(const QScriptValue& properties); + float textWidth(const QString& text); // Pixels + private: QString _text; From 8c3360d0a986f9800118d78ac7f57e71a0709f25 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Nov 2014 08:59:37 -0800 Subject: [PATCH 03/15] Auto-size load URL and file menu items in editModels and newEditEntities And fix a couple of typos. --- examples/editModels.js | 15 +++++++++------ examples/newEditEntities.js | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/examples/editModels.js b/examples/editModels.js index d26a6e14b0..7538a83fef 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -1125,12 +1125,12 @@ var toolBar = (function () { browseModelsButton, loadURLMenuItem, loadFileMenuItem, - menuItemWidth = 125, + menuItemWidth, menuItemOffset, menuItemHeight, menuItemMargin = 5, menuTextColor = { red: 255, green: 255, blue: 255 }, - menuBackgoundColor = { red: 18, green: 66, blue: 66 }; + menuBackgroundColor = { red: 18, green: 66, blue: 66 }; function initialize() { toolBar = new ToolBar(0, 0, ToolBar.VERTICAL); @@ -1167,9 +1167,8 @@ var toolBar = (function () { loadURLMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset, - width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgoundColor, + backgroundColor: menuBackgroundColor, topMargin: menuItemMargin, text: "Model URL", alpha: 0.9, @@ -1179,15 +1178,19 @@ var toolBar = (function () { loadFileMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset + menuItemHeight, - width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgoundColor, + backgroundColor: menuBackgroundColor, topMargin: menuItemMargin, text: "Model File", alpha: 0.9, visible: false }); + menuItemWidth = Math.max(Overlays.textWidth(loadURLMenuItem, "Model URL"), + Overlays.textWidth(loadFileMenuItem, "Model File")) + 20; + Overlays.editOverlay(loadURLMenuItem, { width: menuItemWidth }); + Overlays.editOverlay(loadFileMenuItem, { width: menuItemWidth }); + newCubeButton = toolBar.addTool({ imageURL: toolIconUrl + "add-cube.svg", subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, diff --git a/examples/newEditEntities.js b/examples/newEditEntities.js index 57f3f29670..20359d9718 100644 --- a/examples/newEditEntities.js +++ b/examples/newEditEntities.js @@ -83,12 +83,12 @@ var toolBar = (function () { browseModelsButton, loadURLMenuItem, loadFileMenuItem, - menuItemWidth = 125, + menuItemWidth, menuItemOffset, menuItemHeight, menuItemMargin = 5, menuTextColor = { red: 255, green: 255, blue: 255 }, - menuBackgoundColor = { red: 18, green: 66, blue: 66 }; + menuBackgroundColor = { red: 18, green: 66, blue: 66 }; function initialize() { toolBar = new ToolBar(0, 0, ToolBar.VERTICAL); @@ -125,9 +125,8 @@ var toolBar = (function () { loadURLMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset, - width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgoundColor, + backgroundColor: menuBackgroundColor, topMargin: menuItemMargin, text: "Model URL", alpha: 0.9, @@ -137,15 +136,19 @@ var toolBar = (function () { loadFileMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset + menuItemHeight, - width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgoundColor, + backgroundColor: menuBackgroundColor, topMargin: menuItemMargin, text: "Model File", alpha: 0.9, visible: false }); + menuItemWidth = Math.max(Overlays.textWidth(loadURLMenuItem, "Model URL"), + Overlays.textWidth(loadFileMenuItem, "Model File")) + 20; + Overlays.editOverlay(loadURLMenuItem, { width: menuItemWidth }); + Overlays.editOverlay(loadFileMenuItem, { width: menuItemWidth }); + newCubeButton = toolBar.addTool({ imageURL: toolIconUrl + "add-cube.svg", subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, From 12eb67c734da066d74b7ea6ed799c525b083b5ca Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Fri, 7 Nov 2014 14:18:57 -0800 Subject: [PATCH 04/15] fix bug with audio mixer muting too often --- assignment-client/src/audio/AudioMixer.cpp | 6 +++--- assignment-client/src/audio/AudioMixer.h | 2 +- domain-server/resources/describe-settings.json | 4 ++-- libraries/audio/src/PositionalAudioStream.cpp | 8 +++----- libraries/audio/src/PositionalAudioStream.h | 5 ++--- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 1c2c4137a4..2c78257d2b 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -61,7 +61,7 @@ const float LOUDNESS_TO_DISTANCE_RATIO = 0.00001f; const float DEFAULT_ATTENUATION_PER_DOUBLING_IN_DISTANCE = 0.18; -const float DEFAULT_NOISE_MUTING_THRESHOLD = 0.003f; +const float DEFAULT_NOISE_MUTING_THRESHOLD = 0.001f; const QString AUDIO_MIXER_LOGGING_TARGET_NAME = "audio-mixer"; const QString AUDIO_ENV_GROUP_KEY = "audio_env"; const QString AUDIO_BUFFER_GROUP_KEY = "audio_buffer"; @@ -78,7 +78,7 @@ bool AudioMixer::_printStreamStats = false; bool AudioMixer::_enableFilter = true; -bool AudioMixer::shouldMute(float quietestFrame, float loudestFrame) { +bool AudioMixer::shouldMute(float quietestFrame) { return (quietestFrame > _noiseMutingThreshold); } @@ -142,7 +142,7 @@ int AudioMixer::addStreamToMixForListeningNodeWithStream(AudioMixerClientData* l } // if the stream should be muted, bail - if (shouldMute(streamToAdd->getQuietestTrailingFrameLoudness(), streamToAdd->getLoudestTrailingFrameLoudness())) { + if (shouldMute(streamToAdd->getQuietestFrameLoudness())) { return 0; } diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 836554c44a..ccf7727265 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -60,7 +60,7 @@ private: void perSecondActions(); - bool shouldMute(float quietestFrame, float loudestFrame); + bool shouldMute(float quietestFrame); QString getReadPendingDatagramsCallsPerSecondsStatsString() const; QString getReadPendingDatagramsPacketsPerCallStatsString() const; diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index ba4cfe8dfd..a49e1072eb 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -93,8 +93,8 @@ "name": "noise_muting_threshold", "label": "Noise Muting Threshold", "help": "Loudness value for noise background between 0 and 1.0 (0: mute everyone, 1.0: never mute)", - "placeholder": "0.003", - "default": "0.003", + "placeholder": "0.001", + "default": "0.001", "advanced": false }, { diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index 162b11db0f..c315c04026 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -33,7 +33,7 @@ PositionalAudioStream::PositionalAudioStream(PositionalAudioStream::Type type, b _lastPopOutputTrailingLoudness(0.0f), _lastPopOutputLoudness(0.0f), _quietestTrailingFrameLoudness(std::numeric_limits::max()), - _loudestTrailingFrameLoudness(0.0f), + _quietestFrameLoudness(0.0f), _frameCounter(0) { } @@ -62,16 +62,14 @@ void PositionalAudioStream::updateLastPopOutputLoudnessAndTrailingLoudness() { } } if (_frameCounter++ == TRAILING_MUTE_THRESHOLD_FRAMES) { + _quietestFrameLoudness = _quietestTrailingFrameLoudness; _frameCounter = 0; _quietestTrailingFrameLoudness = std::numeric_limits::max(); - _loudestTrailingFrameLoudness = 0.0f; + } if (_lastPopOutputLoudness < _quietestTrailingFrameLoudness) { _quietestTrailingFrameLoudness = _lastPopOutputLoudness; } - if (_lastPopOutputLoudness > _loudestTrailingFrameLoudness) { - _loudestTrailingFrameLoudness = _lastPopOutputLoudness; - } } int PositionalAudioStream::parsePositionalData(const QByteArray& positionalByteArray) { diff --git a/libraries/audio/src/PositionalAudioStream.h b/libraries/audio/src/PositionalAudioStream.h index 4efadf5680..e641791ef5 100644 --- a/libraries/audio/src/PositionalAudioStream.h +++ b/libraries/audio/src/PositionalAudioStream.h @@ -36,8 +36,7 @@ public: void updateLastPopOutputLoudnessAndTrailingLoudness(); float getLastPopOutputTrailingLoudness() const { return _lastPopOutputTrailingLoudness; } float getLastPopOutputLoudness() const { return _lastPopOutputLoudness; } - float getQuietestTrailingFrameLoudness() const { return _quietestTrailingFrameLoudness; } - float getLoudestTrailingFrameLoudness() const { return _loudestTrailingFrameLoudness; } + float getQuietestFrameLoudness() const { return _quietestFrameLoudness; } bool shouldLoopbackForNode() const { return _shouldLoopbackForNode; } bool isStereo() const { return _isStereo; } @@ -67,7 +66,7 @@ protected: float _lastPopOutputTrailingLoudness; float _lastPopOutputLoudness; float _quietestTrailingFrameLoudness; - float _loudestTrailingFrameLoudness; + float _quietestFrameLoudness; int _frameCounter; }; From a904b128b3f8ae8772a9c8ab6a24e1d7889230b5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Nov 2014 15:28:39 -0800 Subject: [PATCH 05/15] Fix boolean literal value --- interface/src/ui/overlays/TextOverlay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 455884c13e..03c876c423 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -128,7 +128,7 @@ void TextOverlay::setProperties(const QScriptValue& properties) { float TextOverlay::textWidth(const QString& text) { const int TEXTOVERLAY_GETTEXTWIDTH_TEXTRENDERER = 1; // Separate to that used for drawing text so that doesn't interfere. - TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, _fontSize, -1, FALSE, TextRenderer::NO_EFFECT, 1, + TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, _fontSize, -1, false, TextRenderer::NO_EFFECT, 1, QColor(255, 255, 255), TEXTOVERLAY_GETTEXTWIDTH_TEXTRENDERER); return textRenderer->computeWidth(qPrintable(text)); From c04e653cf37936c6d9ceda8cb5dcad342f794f22 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Nov 2014 17:06:50 -0800 Subject: [PATCH 06/15] fix a memory leak in OctreeElement --- libraries/octree/src/OctreeElement.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 271e885d17..a0a331beb3 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -68,7 +68,8 @@ void OctreeElement::init(unsigned char * octalCode) { // set up the _children union _childBitmask = 0; _childrenExternal = false; - + + #ifdef BLENDED_UNION_CHILDREN _children.external = NULL; _singleChildrenCount++; @@ -660,6 +661,11 @@ void OctreeElement::deleteAllChildren() { delete childAt; } } + + if (_childrenExternal) { + // if the children_t union represents _children.external we need to delete it here + delete[] _children.external; + } #ifdef BLENDED_UNION_CHILDREN // now, reset our internal state and ANY and all population data @@ -757,6 +763,8 @@ void OctreeElement::setChildAtIndex(int childIndex, OctreeElement* child) { memset(_children.external, 0, sizeof(OctreeElement*) * NUMBER_OF_CHILDREN); _children.external[firstIndex] = previousChild; _children.external[childIndex] = child; + + _childrenExternal = true; _externalChildrenMemoryUsage += NUMBER_OF_CHILDREN * sizeof(OctreeElement*); @@ -764,7 +772,10 @@ void OctreeElement::setChildAtIndex(int childIndex, OctreeElement* child) { assert(!child); // we are removing a child, so this must be true! OctreeElement* previousFirstChild = _children.external[firstIndex]; OctreeElement* previousSecondChild = _children.external[secondIndex]; + delete[] _children.external; + _childrenExternal = false; + _externalChildrenMemoryUsage -= NUMBER_OF_CHILDREN * sizeof(OctreeElement*); if (childIndex == firstIndex) { _children.single = previousSecondChild; From 4fd22914c08c64110aa635cd7e1b6ea05f4a0e3f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Nov 2014 17:11:00 -0800 Subject: [PATCH 07/15] fix a leak in StdDev --- libraries/shared/src/StdDev.cpp | 11 ++++++----- libraries/shared/src/StdDev.h | 4 +++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/libraries/shared/src/StdDev.cpp b/libraries/shared/src/StdDev.cpp index 387b67cf4f..2069fbb8e4 100644 --- a/libraries/shared/src/StdDev.cpp +++ b/libraries/shared/src/StdDev.cpp @@ -13,14 +13,15 @@ #include #include "StdDev.h" -const int NUM_SAMPLES = 1000; - -StDev::StDev() { - _data = new float[NUM_SAMPLES]; - _sampleCount = 0; +StDev::StDev() : + _data(), + _sampleCount(0) +{ + reset(); } void StDev::reset() { + memset(&_data, 0, sizeof(_data)); _sampleCount = 0; } diff --git a/libraries/shared/src/StdDev.h b/libraries/shared/src/StdDev.h index 40148007a9..b7ea363a7f 100644 --- a/libraries/shared/src/StdDev.h +++ b/libraries/shared/src/StdDev.h @@ -12,6 +12,8 @@ #ifndef hifi_StdDev_h #define hifi_StdDev_h +const int NUM_SAMPLES = 1000; + class StDev { public: StDev(); @@ -21,7 +23,7 @@ public: float getStDev() const; int getSamples() const { return _sampleCount; } private: - float* _data; + float _data[NUM_SAMPLES]; int _sampleCount; }; From 2ca673175a639f242dc992e49e07c55d8a459a59 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Nov 2014 17:15:54 -0800 Subject: [PATCH 08/15] rename StdDev to StDev, patch its leak --- assignment-client/src/audio/AudioMixer.cpp | 2 +- interface/src/Audio.cpp | 2 +- interface/src/Audio.h | 4 ++-- libraries/audio/src/InboundAudioStream.h | 2 +- libraries/shared/src/{StdDev.cpp => StDev.cpp} | 7 ++++--- libraries/shared/src/{StdDev.h => StDev.h} | 8 ++++---- tests/jitter/src/main.cpp | 2 +- 7 files changed, 14 insertions(+), 13 deletions(-) rename libraries/shared/src/{StdDev.cpp => StDev.cpp} (95%) rename libraries/shared/src/{StdDev.h => StDev.h} (87%) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 2c78257d2b..e00d8eb44d 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include #include "AudioRingBuffer.h" diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 3039b7adfb..4a488bb296 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include diff --git a/interface/src/Audio.h b/interface/src/Audio.h index bec2ce32a0..6de7cf8d91 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -40,12 +40,12 @@ #include #include -#include +#include #include "MixedProcessedAudioStream.h" #include "AudioEffectOptions.h" #include -#include +#include extern "C" { #include diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index a9ebc70072..4621de2899 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -18,7 +18,7 @@ #include "SequenceNumberStats.h" #include "AudioStreamStats.h" #include "PacketHeaders.h" -#include "StdDev.h" +#include "StDev.h" #include "TimeWeightedAvg.h" // This adds some number of frames to the desired jitter buffer frames target we use when we're dropping frames. diff --git a/libraries/shared/src/StdDev.cpp b/libraries/shared/src/StDev.cpp similarity index 95% rename from libraries/shared/src/StdDev.cpp rename to libraries/shared/src/StDev.cpp index 2069fbb8e4..1c38426176 100644 --- a/libraries/shared/src/StdDev.cpp +++ b/libraries/shared/src/StDev.cpp @@ -1,5 +1,5 @@ // -// StdDev.cpp +// StDev.cpp // libraries/shared/src // // Created by Philip Rosedale on 3/12/13. @@ -11,10 +11,11 @@ #include #include -#include "StdDev.h" +#include + +#include "StDev.h" StDev::StDev() : - _data(), _sampleCount(0) { reset(); diff --git a/libraries/shared/src/StdDev.h b/libraries/shared/src/StDev.h similarity index 87% rename from libraries/shared/src/StdDev.h rename to libraries/shared/src/StDev.h index b7ea363a7f..ab48aae6b5 100644 --- a/libraries/shared/src/StdDev.h +++ b/libraries/shared/src/StDev.h @@ -1,5 +1,5 @@ // -// StdDev.h +// StDev.h // libraries/shared/src // // Created by Philip Rosedale on 3/12/13. @@ -9,8 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_StdDev_h -#define hifi_StdDev_h +#ifndef hifi_StDev_h +#define hifi_StDev_h const int NUM_SAMPLES = 1000; @@ -27,4 +27,4 @@ private: int _sampleCount; }; -#endif // hifi_StdDev_h +#endif // hifi_StDev_h diff --git a/tests/jitter/src/main.cpp b/tests/jitter/src/main.cpp index 985ce99530..baaa2d08d6 100644 --- a/tests/jitter/src/main.cpp +++ b/tests/jitter/src/main.cpp @@ -20,7 +20,7 @@ #include #include // for usecTimestampNow #include -#include +#include const quint64 MSEC_TO_USEC = 1000; const quint64 LARGE_STATS_TIME = 500; // we don't expect stats calculation to take more than this many usecs From 1e52232a4ce558646d69d31dfed4ff4ec27682b1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Nov 2014 17:21:53 -0800 Subject: [PATCH 09/15] add destructors for arrays in Hair --- interface/src/Hair.cpp | 11 +++++++++++ interface/src/Hair.h | 1 + 2 files changed, 12 insertions(+) diff --git a/interface/src/Hair.cpp b/interface/src/Hair.cpp index 637e00a8bc..119f5a31d0 100644 --- a/interface/src/Hair.cpp +++ b/interface/src/Hair.cpp @@ -90,6 +90,17 @@ Hair::Hair(int strands, } } +Hair::~Hair() { + delete[] _hairPosition; + delete[] _hairOriginalPosition; + delete[] _hairLastPosition; + delete[] _hairQuadDelta; + delete[] _hairNormals; + delete[] _hairColors; + delete[] _hairIsMoveable; + delete[] _hairConstraints; +} + const float SOUND_THRESHOLD = 40.0f; void Hair::simulate(float deltaTime) { diff --git a/interface/src/Hair.h b/interface/src/Hair.h index 05c82e66f7..436c6b836a 100644 --- a/interface/src/Hair.h +++ b/interface/src/Hair.h @@ -37,6 +37,7 @@ public: float radius = DEFAULT_HAIR_RADIUS, float linkLength = DEFAULT_HAIR_LINK_LENGTH, float hairThickness = DEFAULT_HAIR_THICKNESS); + ~Hair(); void simulate(float deltaTime); void render(); void setAcceleration(const glm::vec3& acceleration) { _acceleration = acceleration; } From 6a4808aac89d7855a3dbdfb76de24f40bc09d3dc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Nov 2014 17:22:54 -0800 Subject: [PATCH 10/15] include string.h for memset usage --- libraries/shared/src/StDev.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/StDev.cpp b/libraries/shared/src/StDev.cpp index 1c38426176..0126ab6ab1 100644 --- a/libraries/shared/src/StDev.cpp +++ b/libraries/shared/src/StDev.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include "StDev.h" From 9b2acadb4ba27128914642359d1e1d97fc595e1b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Nov 2014 17:24:05 -0800 Subject: [PATCH 11/15] include c++ header for memset --- libraries/shared/src/StDev.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/StDev.cpp b/libraries/shared/src/StDev.cpp index 0126ab6ab1..23afd12b98 100644 --- a/libraries/shared/src/StDev.cpp +++ b/libraries/shared/src/StDev.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include "StDev.h" From 94d82455a02589893409524195b46e556c559a51 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Nov 2014 19:56:54 -0800 Subject: [PATCH 12/15] Fix build warning --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e58f79cb5e..7f80407a6b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -108,7 +108,7 @@ static unsigned STARFIELD_SEED = 1; static const int BANDWIDTH_METER_CLICK_MAX_DRAG_LENGTH = 6; // farther dragged clicks are ignored -const unsigned MAXIMUM_CACHE_SIZE = 10737418240; // 10GB +const qint64 MAXIMUM_CACHE_SIZE = 10737418240; // 10GB static QTimer* idleTimer = NULL; From 09490b58b41df5412b56ef3d3838d3e0692f3c98 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 7 Nov 2014 21:47:28 -0800 Subject: [PATCH 13/15] Revert "Fix build warning" --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7f80407a6b..e58f79cb5e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -108,7 +108,7 @@ static unsigned STARFIELD_SEED = 1; static const int BANDWIDTH_METER_CLICK_MAX_DRAG_LENGTH = 6; // farther dragged clicks are ignored -const qint64 MAXIMUM_CACHE_SIZE = 10737418240; // 10GB +const unsigned MAXIMUM_CACHE_SIZE = 10737418240; // 10GB static QTimer* idleTimer = NULL; From 3a90e869d47d0a230ebec0a57340d3d26d5faf3a Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 7 Nov 2014 21:50:19 -0800 Subject: [PATCH 14/15] Revert "CR for Job #20140 - Add Overlays.getTextWidth" --- examples/editModels.js | 15 ++++++--------- examples/newEditEntities.js | 15 ++++++--------- interface/src/ui/TextRenderer.cpp | 7 +++---- interface/src/ui/TextRenderer.h | 3 +-- interface/src/ui/overlays/Overlays.cpp | 16 ---------------- interface/src/ui/overlays/Overlays.h | 4 ---- interface/src/ui/overlays/Text3DOverlay.cpp | 11 ++--------- interface/src/ui/overlays/Text3DOverlay.h | 2 -- interface/src/ui/overlays/TextOverlay.cpp | 7 ------- interface/src/ui/overlays/TextOverlay.h | 2 -- 10 files changed, 18 insertions(+), 64 deletions(-) diff --git a/examples/editModels.js b/examples/editModels.js index 7538a83fef..d26a6e14b0 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -1125,12 +1125,12 @@ var toolBar = (function () { browseModelsButton, loadURLMenuItem, loadFileMenuItem, - menuItemWidth, + menuItemWidth = 125, menuItemOffset, menuItemHeight, menuItemMargin = 5, menuTextColor = { red: 255, green: 255, blue: 255 }, - menuBackgroundColor = { red: 18, green: 66, blue: 66 }; + menuBackgoundColor = { red: 18, green: 66, blue: 66 }; function initialize() { toolBar = new ToolBar(0, 0, ToolBar.VERTICAL); @@ -1167,8 +1167,9 @@ var toolBar = (function () { loadURLMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset, + width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgroundColor, + backgroundColor: menuBackgoundColor, topMargin: menuItemMargin, text: "Model URL", alpha: 0.9, @@ -1178,19 +1179,15 @@ var toolBar = (function () { loadFileMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset + menuItemHeight, + width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgroundColor, + backgroundColor: menuBackgoundColor, topMargin: menuItemMargin, text: "Model File", alpha: 0.9, visible: false }); - menuItemWidth = Math.max(Overlays.textWidth(loadURLMenuItem, "Model URL"), - Overlays.textWidth(loadFileMenuItem, "Model File")) + 20; - Overlays.editOverlay(loadURLMenuItem, { width: menuItemWidth }); - Overlays.editOverlay(loadFileMenuItem, { width: menuItemWidth }); - newCubeButton = toolBar.addTool({ imageURL: toolIconUrl + "add-cube.svg", subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, diff --git a/examples/newEditEntities.js b/examples/newEditEntities.js index 20359d9718..57f3f29670 100644 --- a/examples/newEditEntities.js +++ b/examples/newEditEntities.js @@ -83,12 +83,12 @@ var toolBar = (function () { browseModelsButton, loadURLMenuItem, loadFileMenuItem, - menuItemWidth, + menuItemWidth = 125, menuItemOffset, menuItemHeight, menuItemMargin = 5, menuTextColor = { red: 255, green: 255, blue: 255 }, - menuBackgroundColor = { red: 18, green: 66, blue: 66 }; + menuBackgoundColor = { red: 18, green: 66, blue: 66 }; function initialize() { toolBar = new ToolBar(0, 0, ToolBar.VERTICAL); @@ -125,8 +125,9 @@ var toolBar = (function () { loadURLMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset, + width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgroundColor, + backgroundColor: menuBackgoundColor, topMargin: menuItemMargin, text: "Model URL", alpha: 0.9, @@ -136,19 +137,15 @@ var toolBar = (function () { loadFileMenuItem = Overlays.addOverlay("text", { x: newModelButton.x - menuItemWidth, y: newModelButton.y + menuItemOffset + menuItemHeight, + width: menuItemWidth, height: menuItemHeight, - backgroundColor: menuBackgroundColor, + backgroundColor: menuBackgoundColor, topMargin: menuItemMargin, text: "Model File", alpha: 0.9, visible: false }); - menuItemWidth = Math.max(Overlays.textWidth(loadURLMenuItem, "Model URL"), - Overlays.textWidth(loadFileMenuItem, "Model File")) + 20; - Overlays.editOverlay(loadURLMenuItem, { width: menuItemWidth }); - Overlays.editOverlay(loadFileMenuItem, { width: menuItemWidth }); - newCubeButton = toolBar.addTool({ imageURL: toolIconUrl + "add-cube.svg", subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, diff --git a/interface/src/ui/TextRenderer.cpp b/interface/src/ui/TextRenderer.cpp index f64f895d81..69df609ba9 100644 --- a/interface/src/ui/TextRenderer.cpp +++ b/interface/src/ui/TextRenderer.cpp @@ -37,13 +37,12 @@ static uint qHash(const TextRenderer::Properties& key, uint seed = 0) { } static bool operator==(const TextRenderer::Properties& p1, const TextRenderer::Properties& p2) { - return p1.font == p2.font && p1.effect == p2.effect && p1.effectThickness == p2.effectThickness && p1.color == p2.color - && p1.copy == p2.copy; + return p1.font == p2.font && p1.effect == p2.effect && p1.effectThickness == p2.effectThickness && p1.color == p2.color; } TextRenderer* TextRenderer::getInstance(const char* family, int pointSize, int weight, bool italic, - EffectType effect, int effectThickness, const QColor& color, int copy) { - Properties properties = { QFont(family, pointSize, weight, italic), effect, effectThickness, color, copy }; + EffectType effect, int effectThickness, const QColor& color) { + Properties properties = { QFont(family, pointSize, weight, italic), effect, effectThickness, color }; TextRenderer*& instance = _instances[properties]; if (!instance) { instance = new TextRenderer(properties); diff --git a/interface/src/ui/TextRenderer.h b/interface/src/ui/TextRenderer.h index b3a3e98b1d..bcb0ce8890 100644 --- a/interface/src/ui/TextRenderer.h +++ b/interface/src/ui/TextRenderer.h @@ -50,11 +50,10 @@ public: EffectType effect; int effectThickness; QColor color; - int copy; // Use to separate renderers that are otherwise identical. }; static TextRenderer* getInstance(const char* family, int pointSize = -1, int weight = -1, bool italic = false, - EffectType effect = NO_EFFECT, int effectThickness = 1, const QColor& color = QColor(255, 255, 255), int copy = 0); + EffectType effect = NO_EFFECT, int effectThickness = 1, const QColor& color = QColor(255, 255, 255)); ~TextRenderer(); diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index b65fe6d286..df7a5fbcea 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -9,7 +9,6 @@ // #include -#include #include #include @@ -358,18 +357,3 @@ bool Overlays::isLoaded(unsigned int id) { return overlay->isLoaded(); } -float Overlays::textWidth(unsigned int id, const QString& text) { - if (_overlays2D.contains(id)) { - Overlay* thisOverlay = _overlays2D[id]; - if (typeid(*thisOverlay) == typeid(TextOverlay)) { - return static_cast(thisOverlay)->textWidth(text); - } - } - if (_overlays3D.contains(id)) { - Overlay* thisOverlay = _overlays3D[id]; - if (typeid(*thisOverlay) == typeid(Text3DOverlay)) { - return static_cast(thisOverlay)->textWidth(text); - } - } - return 0.f; -} diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index dcda9a8ed7..686b998267 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -65,10 +65,6 @@ public slots: /// returns whether the overlay's assets are loaded or not bool isLoaded(unsigned int id); - /// returns the width of the given text in the specified overlay if it is a text overlay: in pixels if it is a 2D text - /// overlay; in meters if it is a 3D text overlay - float textWidth(unsigned int id, const QString& text); - private: QMap _overlays2D; QMap _overlays3D; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 3f225bc756..d8febbf0eb 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -17,8 +17,6 @@ const xColor DEFAULT_BACKGROUND_COLOR = { 0, 0, 0 }; const float DEFAULT_MARGIN = 0.1f; -const int FIXED_FONT_POINT_SIZE = 40; -const float LINE_SCALE_RATIO = 1.2f; Text3DOverlay::Text3DOverlay() : _backgroundColor(DEFAULT_BACKGROUND_COLOR), @@ -89,9 +87,11 @@ void Text3DOverlay::render(RenderArgs* args) { glVertex3f(-halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); glEnd(); + const int FIXED_FONT_POINT_SIZE = 40; const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 40.0f; // this is a ratio determined through experimentation TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE); + float LINE_SCALE_RATIO = 1.2f; float maxHeight = (float)textRenderer->calculateHeight("Xy") * LINE_SCALE_RATIO; float scaleFactor = (maxHeight / FIXED_FONT_SCALING_RATIO) * _lineHeight; @@ -179,11 +179,4 @@ void Text3DOverlay::setProperties(const QScriptValue& properties) { } -float Text3DOverlay::textWidth(const QString& text) { - const int TEXT3DOVERLAY_TEXTWIDTH_RENDERER = 2; // Separate to that used for drawing text so that doesn't interfere. - TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE, -1, false, - TextRenderer::NO_EFFECT, 1, QColor(255, 255, 255), TEXT3DOVERLAY_TEXTWIDTH_RENDERER); - float scaleFactor = _lineHeight * LINE_SCALE_RATIO / (float)textRenderer->calculateHeight("X"); - return scaleFactor * (float)textRenderer->computeWidth(qPrintable(text)); -} diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index f0369b4206..45e311c554 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -48,8 +48,6 @@ public: virtual void setProperties(const QScriptValue& properties); - float textWidth(const QString& text); // Meters - private: void enableClipPlane(GLenum plane, float x, float y, float z, float w); diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 03c876c423..530b30a856 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -126,10 +126,3 @@ void TextOverlay::setProperties(const QScriptValue& properties) { } -float TextOverlay::textWidth(const QString& text) { - const int TEXTOVERLAY_GETTEXTWIDTH_TEXTRENDERER = 1; // Separate to that used for drawing text so that doesn't interfere. - TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, _fontSize, -1, false, TextRenderer::NO_EFFECT, 1, - QColor(255, 255, 255), TEXTOVERLAY_GETTEXTWIDTH_TEXTRENDERER); - - return textRenderer->computeWidth(qPrintable(text)); -} diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index fae9e7c582..f7ff83e542 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -53,8 +53,6 @@ public: virtual void setProperties(const QScriptValue& properties); - float textWidth(const QString& text); // Pixels - private: QString _text; From fc89f92097387311ed8860ef5ed72c22720fc977 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 7 Nov 2014 21:53:56 -0800 Subject: [PATCH 15/15] Revert "Revert "Fix build warning"" --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e58f79cb5e..7f80407a6b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -108,7 +108,7 @@ static unsigned STARFIELD_SEED = 1; static const int BANDWIDTH_METER_CLICK_MAX_DRAG_LENGTH = 6; // farther dragged clicks are ignored -const unsigned MAXIMUM_CACHE_SIZE = 10737418240; // 10GB +const qint64 MAXIMUM_CACHE_SIZE = 10737418240; // 10GB static QTimer* idleTimer = NULL;