From a03c2b79fa2ff6f61aa0199305760ae15e9f5f8f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 8 Jan 2015 15:52:33 -0800 Subject: [PATCH 01/98] first cut at adding colors to GeometryCache and supporting batch internally --- interface/src/Util.cpp | 30 +++-- interface/src/avatar/Avatar.cpp | 6 +- interface/src/avatar/Head.cpp | 9 +- interface/src/avatar/SkeletonModel.cpp | 12 +- interface/src/ui/overlays/Line3DOverlay.cpp | 3 +- libraries/render-utils/src/GeometryCache.cpp | 111 ++++++++++--------- libraries/render-utils/src/GeometryCache.h | 63 +++++++++-- 7 files changed, 138 insertions(+), 96 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index cd01996622..3d106895df 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -36,22 +36,18 @@ void renderWorldBox() { GeometryCache::SharedPointer geometryCache = DependencyManager::get(); // Show edge of world - float red[] = {1, 0, 0}; - float green[] = {0, 1, 0}; - float blue[] = {0, 0, 1}; - float gray[] = {0.5, 0.5, 0.5}; + glm::vec3 red(1.0f, 0.0f, 0.0f); + glm::vec3 green(0.0f, 1.0f, 0.0f); + glm::vec3 blue(0.0f, 0.0f, 1.0f); + glm::vec3 grey(0.5f, 0.5f, 0.5f); glDisable(GL_LIGHTING); glLineWidth(1.0); - glColor3fv(red); - geometryCache->renderLine(glm::vec3(0, 0, 0), glm::vec3(TREE_SCALE, 0, 0)); - glColor3fv(green); - geometryCache->renderLine(glm::vec3(0, 0, 0), glm::vec3(0, TREE_SCALE, 0)); - glColor3fv(blue); - geometryCache->renderLine(glm::vec3(0, 0, 0), glm::vec3(0, 0, TREE_SCALE)); - glColor3fv(gray); - geometryCache->renderLine(glm::vec3(0, 0, TREE_SCALE), glm::vec3(TREE_SCALE, 0, TREE_SCALE)); - geometryCache->renderLine(glm::vec3(TREE_SCALE, 0, TREE_SCALE), glm::vec3(TREE_SCALE, 0, 0)); + geometryCache->renderLine(glm::vec3(0, 0, 0), glm::vec3(TREE_SCALE, 0, 0), red); + geometryCache->renderLine(glm::vec3(0, 0, 0), glm::vec3(0, TREE_SCALE, 0), green); + geometryCache->renderLine(glm::vec3(0, 0, 0), glm::vec3(0, 0, TREE_SCALE), blue); + geometryCache->renderLine(glm::vec3(0, 0, TREE_SCALE), glm::vec3(TREE_SCALE, 0, TREE_SCALE), grey); + geometryCache->renderLine(glm::vec3(TREE_SCALE, 0, TREE_SCALE), glm::vec3(TREE_SCALE, 0, 0), grey); // Draw meter markers along the 3 axis to help with measuring things @@ -60,21 +56,21 @@ void renderWorldBox() { glEnable(GL_LIGHTING); glPushMatrix(); glTranslatef(MARKER_DISTANCE, 0, 0); - glColor3fv(red); + glColor3f(red.x, red.y, red.z); geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, MARKER_DISTANCE, 0); - glColor3fv(green); + glColor3f(green.x, green.y, green.z); geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); glTranslatef(0, 0, MARKER_DISTANCE); - glColor3fv(blue); + glColor3f(blue.x, blue.y, blue.z); geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); glPushMatrix(); - glColor3fv(gray); + glColor3f(grey.x, grey.y, grey.z); glTranslatef(MARKER_DISTANCE, 0, MARKER_DISTANCE); geometryCache->renderSphere(MARKER_RADIUS, 10, 10); glPopMatrix(); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index ddbaeece72..c97db94eb6 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -301,8 +301,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool glm::vec3 axis = glm::axis(rotation); glRotatef(angle, axis.x, axis.y, axis.z); - glColor3f(laserColor.x, laserColor.y, laserColor.z); - geometryCache->renderLine(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f)); + geometryCache->renderLine(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f), laserColor); } glPopMatrix(); } @@ -327,8 +326,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool float angle = glm::degrees(glm::angle(rotation)); glm::vec3 axis = glm::axis(rotation); glRotatef(angle, axis.x, axis.y, axis.z); - glColor3f(laserColor.x, laserColor.y, laserColor.z); - geometryCache->renderLine(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f)); + geometryCache->renderLine(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f), laserColor); } glPopMatrix(); } diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 32594a7225..f53975a4e8 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -345,11 +345,10 @@ void Head::renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosi glLineWidth(2.0); - // TODO: implement support for lines with gradient colors - // glColor4f(0.2f, 0.2f, 0.2f, 1.0f); --> to --> glColor4f(1.0f, 1.0f, 1.0f, 0.0f); - glColor4f(0.5f, 0.5f, 0.5f, 0.5f); - geometryCache->renderLine(leftEyePosition, lookatPosition, _leftEyeLookAtID); - geometryCache->renderLine(rightEyePosition, lookatPosition, _rightEyeLookAtID); + glm::vec4 startColor(0.2f, 0.2f, 0.2f, 1.0f); + glm::vec4 endColor(1.0f, 1.0f, 1.0f, 0.0f); + geometryCache->renderLine(leftEyePosition, lookatPosition, startColor, endColor, _leftEyeLookAtID); + geometryCache->renderLine(rightEyePosition, lookatPosition, startColor, endColor, _rightEyeLookAtID); DependencyManager::get()->end(); } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 54cd6c0bfe..31fa648d17 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -396,14 +396,14 @@ void SkeletonModel::renderOrientationDirections(int jointIndex, glm::vec3 positi glm::vec3 pUp = position + orientation * IDENTITY_UP * size; glm::vec3 pFront = position + orientation * IDENTITY_FRONT * size; - glColor3f(1.0f, 0.0f, 0.0f); - geometryCache->renderLine(position, pRight, jointLineIDs._right); + glm::vec3 red(1.0f, 0.0f, 0.0f); + geometryCache->renderLine(position, pRight, red, jointLineIDs._right); - glColor3f(0.0f, 1.0f, 0.0f); - geometryCache->renderLine(position, pUp, jointLineIDs._up); + glm::vec3 green(0.0f, 1.0f, 0.0f); + geometryCache->renderLine(position, pUp, green, jointLineIDs._up); - glColor3f(0.0f, 0.0f, 1.0f); - geometryCache->renderLine(position, pFront, jointLineIDs._front); + glm::vec3 blue(0.0f, 0.0f, 1.0f); + geometryCache->renderLine(position, pFront, blue, jointLineIDs._front); } diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 48a995b80b..ab537eea89 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -50,6 +50,7 @@ void Line3DOverlay::render(RenderArgs* args) { xColor color = getColor(); const float MAX_COLOR = 255.0f; glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); glm::vec3 position = getPosition(); glm::quat rotation = getRotation(); @@ -61,7 +62,7 @@ void Line3DOverlay::render(RenderArgs* args) { if (getIsDashedLine()) { DependencyManager::get()->renderDashedLine(_position, _end, _geometryCacheID); } else { - DependencyManager::get()->renderLine(_start, _end, _geometryCacheID); + DependencyManager::get()->renderLine(_start, _end, colorv4, _geometryCacheID); } glEnable(GL_LIGHTING); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 553e460a5c..4d09ab0163 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -18,6 +18,9 @@ #include #include +#include +#include + #include #include "TextureCache.h" @@ -1397,18 +1400,30 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en details.buffer.release(); } -void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, int id) { - bool registeredLine = (id != UNKNOWN_ID); +void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, + const glm::vec4& color1, const glm::vec4& color2, int id) { + + bool registered = (id != UNKNOWN_ID); Vec3Pair key(p1, p2); - VerticesIndices& vbo = registeredLine ? _registeredLine3DVBOs[id] : _line3DVBOs[key]; + BatchItemDetails& details = registered ? _registeredLine3DVBOs[id] : _line3DVBOs[key]; + + int compactColor1 = ((int(color1.x * 255.0f) & 0xFF)) | + ((int(color1.y * 255.0f) & 0xFF) << 8) | + ((int(color1.z * 255.0f) & 0xFF) << 16) | + ((int(color1.w * 255.0f) & 0xFF) << 24); + + int compactColor2 = ((int(color2.x * 255.0f) & 0xFF)) | + ((int(color2.y * 255.0f) & 0xFF) << 8) | + ((int(color2.z * 255.0f) & 0xFF) << 16) | + ((int(color2.w * 255.0f) & 0xFF) << 24); + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredLine && vbo.first != 0) { + if (registered && details.isCreated) { Vec3Pair& lastKey = _lastRegisteredLine3D[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredLine3D[id] = key; #ifdef WANT_DEBUG qDebug() << "renderLine() 3D ... RELEASING REGISTERED line"; #endif // def WANT_DEBUG @@ -1421,46 +1436,38 @@ void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, int id) } const int FLOATS_PER_VERTEX = 3; - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); const int vertices = 2; - const int indices = 2; - if (vbo.first == 0) { - _lastRegisteredLine3D[id] = key; + if (!details.isCreated) { - int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1}; - - int vertexPoint = 0; + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; - // p1 - vertex[vertexPoint++] = p1.x; - vertex[vertexPoint++] = p1.y; - vertex[vertexPoint++] = p1.z; + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); - // p2 - vertex[vertexPoint++] = p2.x; - vertex[vertexPoint++] = p2.y; - vertex[vertexPoint++] = p2.z; - + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + + float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { p1.x, p1.y, p1.z, p2.x, p2.y, p2.z }; + + const int NUM_COLOR_SCALARS = 2; + int colors[NUM_COLOR_SCALARS] = { compactColor1, compactColor2 }; + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - #ifdef WANT_DEBUG if (id == UNKNOWN_ID) { qDebug() << "new renderLine() 3D VBO made -- _line3DVBOs.size():" << _line3DVBOs.size(); @@ -1468,18 +1475,20 @@ void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, int id) qDebug() << "new registered renderLine() 3D VBO made -- _registeredLine3DVBOs.size():" << _registeredLine3DVBOs.size(); } #endif - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); - glDrawRangeElementsEXT(GL_LINES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + + gpu::Batch batch; + + // this is what it takes to render a quad + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::LINES, 2, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, int id) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 17b23da945..96e3f4c398 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -111,7 +111,20 @@ public: const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, int id = UNKNOWN_ID); - void renderLine(const glm::vec3& p1, const glm::vec3& p2, int id = UNKNOWN_ID); + void renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& color, int id = UNKNOWN_ID) + { renderLine(p1, p2, color, color, id); } + + void renderLine(const glm::vec3& p1, const glm::vec3& p2, + const glm::vec3& color1, const glm::vec3& color2, int id = UNKNOWN_ID) + { renderLine(p1, p2, glm::vec4(color1, 1.0f), glm::vec4(color2, 1.0f), id); } + + void renderLine(const glm::vec3& p1, const glm::vec3& p2, + const glm::vec4& color, int id = UNKNOWN_ID) + { renderLine(p1, p2, color, color, id); } + + void renderLine(const glm::vec3& p1, const glm::vec3& p2, + const glm::vec4& color1, const glm::vec4& color2, int id = UNKNOWN_ID); + void renderDashedLine(const glm::vec3& start, const glm::vec3& end, int id = UNKNOWN_ID); void renderLine(const glm::vec2& p1, const glm::vec2& p2, int id = UNKNOWN_ID); @@ -128,13 +141,46 @@ protected: virtual QSharedPointer createResource(const QUrl& url, const QSharedPointer& fallback, bool delayLoad, const void* extra); - + private: GeometryCache(); virtual ~GeometryCache(); typedef QPair IntPair; typedef QPair VerticesIndices; + struct BufferDetails { + QOpenGLBuffer buffer; + int vertices; + int vertexSize; + }; + + class BatchItemDetails { + public: + gpu::BufferPointer verticesBuffer; + gpu::BufferPointer colorBuffer; + gpu::Stream::FormatPointer streamFormat; + gpu::BufferStreamPointer stream; + + int vertices; + int vertexSize; + bool isCreated; + + BatchItemDetails() : + verticesBuffer(NULL), + colorBuffer(NULL), + streamFormat(NULL), + stream(NULL), + vertices(0), + vertexSize(0), + isCreated(false) + { + } + + void clear() { + // TODO: add the proper de-allocation of the gpu items + isCreated = false; + } + }; QHash _hemisphereVBOs; QHash _sphereVBOs; @@ -160,27 +206,20 @@ private: QHash _registeredRectVBOs; QHash _lastRegisteredLine3D; - QHash _line3DVBOs; - QHash _registeredLine3DVBOs; + QHash _line3DVBOs; + QHash _registeredLine3DVBOs; QHash _lastRegisteredLine2D; QHash _line2DVBOs; QHash _registeredLine2DVBOs; - struct BufferDetails { - QOpenGLBuffer buffer; - int vertices; - int vertexSize; - }; - QHash _registeredVertices; QHash _lastRegisteredDashedLines; QHash _dashedLines; QHash _registeredDashedLines; - - + QHash _colors; QHash _gridBuffers; QHash _registeredAlternateGridBuffers; From 17e48554d8f123c9a888245093a0f12b5c5af6fe Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 9 Jan 2015 15:06:11 -0800 Subject: [PATCH 02/98] implement support for proper cleanup in BatchItemDetails --- libraries/render-utils/src/GeometryCache.cpp | 44 ++++++++++++++++++++ libraries/render-utils/src/GeometryCache.h | 20 +++------ 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 4d09ab0163..0207b47fa1 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -40,6 +40,10 @@ GeometryCache::~GeometryCache() { glDeleteBuffers(1, &vbo.first); glDeleteBuffers(1, &vbo.second); } + qDebug() << "GeometryCache::~GeometryCache()... "; + qDebug() << " _registeredLine3DVBOs.size():" << _registeredLine3DVBOs.size(); + qDebug() << " _line3DVBOs.size():" << _line3DVBOs.size(); + qDebug() << " BatchItemDetails... population:" << GeometryCache::BatchItemDetails::population; } void GeometryCache::renderHemisphere(int slices, int stacks) { @@ -1400,11 +1404,51 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en details.buffer.release(); } +int GeometryCache::BatchItemDetails::population = 0; +GeometryCache::BatchItemDetails::BatchItemDetails() : + verticesBuffer(NULL), + colorBuffer(NULL), + streamFormat(NULL), + stream(NULL), + vertices(0), + vertexSize(0), + isCreated(false) +{ + population++; +} + +GeometryCache::BatchItemDetails::BatchItemDetails(const GeometryCache::BatchItemDetails& other) : + verticesBuffer(other.verticesBuffer), + colorBuffer(other.colorBuffer), + streamFormat(other.streamFormat), + stream(other.stream), + vertices(other.vertices), + vertexSize(other.vertexSize), + isCreated(other.isCreated) +{ + population++; +} + +GeometryCache::BatchItemDetails::~BatchItemDetails() { + population--; + clear(); + qDebug() << "~BatchItemDetails()... population:" << population << "**********************************"; +} + +void GeometryCache::BatchItemDetails::clear() { + isCreated = false; + verticesBuffer.clear(); + colorBuffer.clear(); + streamFormat.clear(); + stream.clear(); +} + void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec4& color1, const glm::vec4& color2, int id) { bool registered = (id != UNKNOWN_ID); Vec3Pair key(p1, p2); + BatchItemDetails& details = registered ? _registeredLine3DVBOs[id] : _line3DVBOs[key]; int compactColor1 = ((int(color1.x * 255.0f) & 0xFF)) | diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 96e3f4c398..0e216a5bc1 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -156,6 +156,7 @@ private: class BatchItemDetails { public: + static int population; gpu::BufferPointer verticesBuffer; gpu::BufferPointer colorBuffer; gpu::Stream::FormatPointer streamFormat; @@ -165,21 +166,10 @@ private: int vertexSize; bool isCreated; - BatchItemDetails() : - verticesBuffer(NULL), - colorBuffer(NULL), - streamFormat(NULL), - stream(NULL), - vertices(0), - vertexSize(0), - isCreated(false) - { - } - - void clear() { - // TODO: add the proper de-allocation of the gpu items - isCreated = false; - } + BatchItemDetails(); + BatchItemDetails(const GeometryCache::BatchItemDetails& other); + ~BatchItemDetails(); + void clear(); }; QHash _hemisphereVBOs; From e6388a65b9296cb3be47f0c48e8b7d191a832002 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 13 Jan 2015 20:53:05 -0800 Subject: [PATCH 03/98] rough pass at adding color to geometry cache --- interface/src/Application.cpp | 2 +- interface/src/Environment.cpp | 2 +- interface/src/MetavoxelSystem.cpp | 8 +- interface/src/Util.cpp | 19 +-- interface/src/Util.h | 2 - interface/src/audio/AudioIOStatsRenderer.cpp | 5 +- interface/src/audio/AudioScope.cpp | 28 ++-- interface/src/audio/AudioScope.h | 8 +- interface/src/audio/AudioToolBox.cpp | 12 +- interface/src/avatar/Avatar.cpp | 22 ++- interface/src/avatar/Avatar.h | 3 +- interface/src/avatar/Hand.cpp | 13 +- interface/src/avatar/MyAvatar.cpp | 9 +- interface/src/avatar/SkeletonModel.cpp | 31 ++-- interface/src/octree/OctreeFade.cpp | 3 +- interface/src/ui/ApplicationOverlay.cpp | 50 +++---- interface/src/ui/BandwidthMeter.cpp | 32 +++-- interface/src/ui/BandwidthMeter.h | 5 +- interface/src/ui/MetavoxelEditor.cpp | 14 +- interface/src/ui/NodeBounds.cpp | 13 +- interface/src/ui/RearMirrorTools.cpp | 7 +- interface/src/ui/Stats.cpp | 12 +- .../src/ui/overlays/BillboardOverlay.cpp | 4 +- interface/src/ui/overlays/Circle3DOverlay.cpp | 24 ++-- interface/src/ui/overlays/Cube3DOverlay.cpp | 14 +- interface/src/ui/overlays/Grid3DOverlay.cpp | 6 +- interface/src/ui/overlays/ImageOverlay.cpp | 6 +- .../src/ui/overlays/Rectangle3DOverlay.cpp | 6 +- interface/src/ui/overlays/Sphere3DOverlay.cpp | 4 +- interface/src/ui/overlays/Text3DOverlay.cpp | 4 +- interface/src/ui/overlays/TextOverlay.cpp | 4 +- .../src/EntityTreeRenderer.cpp | 39 ++--- .../src/RenderableBoxEntityItem.cpp | 4 +- .../src/RenderableModelEntityItem.cpp | 12 +- .../src/RenderableSphereEntityItem.cpp | 4 +- .../src/RenderableTextEntityItem.cpp | 4 +- .../src/DeferredLightingEffect.cpp | 20 ++- .../render-utils/src/DeferredLightingEffect.h | 8 +- libraries/render-utils/src/GeometryCache.cpp | 136 ++++++++++-------- libraries/render-utils/src/GeometryCache.h | 53 ++++--- libraries/render-utils/src/GlowEffect.cpp | 1 - libraries/render-utils/src/RenderUtil.cpp | 3 +- 42 files changed, 321 insertions(+), 335 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 22a2b6bc22..81ecff3df1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2769,7 +2769,7 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs // draw a red sphere float originSphereRadius = 0.05f; glColor3f(1,0,0); - DependencyManager::get()->renderSphere(originSphereRadius, 15, 15); + DependencyManager::get()->renderSphere(originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); // also, metavoxels if (Menu::getInstance()->isOptionChecked(MenuOption::Metavoxels)) { diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index 645bbbdc4f..5cc132bb7f 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -263,7 +263,7 @@ void Environment::renderAtmosphere(Camera& camera, const EnvironmentData& data) glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); - DependencyManager::get()->renderSphere(1.0f, 100, 50); //Draw a unit sphere + DependencyManager::get()->renderSphere(1.0f, 100, 50, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); //Draw a unit sphere glDepthMask(GL_TRUE); program->release(); diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 9a26ca6bb5..7f96e61cf0 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -1973,7 +1973,6 @@ SphereRenderer::SphereRenderer() { void SphereRenderer::render(const MetavoxelLOD& lod, bool contained, bool cursor) { Sphere* sphere = static_cast(_spanner); const QColor& color = sphere->getColor(); - glColor4f(color.redF(), color.greenF(), color.blueF(), color.alphaF()); glPushMatrix(); const glm::vec3& translation = sphere->getTranslation(); @@ -1982,7 +1981,8 @@ void SphereRenderer::render(const MetavoxelLOD& lod, bool contained, bool cursor glm::vec3 axis = glm::axis(rotation); glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - DependencyManager::get()->renderSolidSphere(sphere->getScale(), 32, 32); + DependencyManager::get()->renderSolidSphere(sphere->getScale(), 32, 32, + glm::vec4(color.redF(), color.greenF(), color.blueF(), color.alphaF())); glPopMatrix(); } @@ -1993,7 +1993,6 @@ CuboidRenderer::CuboidRenderer() { void CuboidRenderer::render(const MetavoxelLOD& lod, bool contained, bool cursor) { Cuboid* cuboid = static_cast(_spanner); const QColor& color = cuboid->getColor(); - glColor4f(color.redF(), color.greenF(), color.blueF(), color.alphaF()); glPushMatrix(); const glm::vec3& translation = cuboid->getTranslation(); @@ -2003,7 +2002,8 @@ void CuboidRenderer::render(const MetavoxelLOD& lod, bool contained, bool cursor glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); glScalef(1.0f, cuboid->getAspectY(), cuboid->getAspectZ()); - DependencyManager::get()->renderSolidCube(cuboid->getScale() * 2.0f); + DependencyManager::get()->renderSolidCube(cuboid->getScale() * 2.0f, + glm::vec4(color.redF(), color.greenF(), color.blueF(), color.alphaF())); glPopMatrix(); } diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 3d106895df..2c9840a218 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -56,23 +56,19 @@ void renderWorldBox() { glEnable(GL_LIGHTING); glPushMatrix(); glTranslatef(MARKER_DISTANCE, 0, 0); - glColor3f(red.x, red.y, red.z); - geometryCache->renderSphere(MARKER_RADIUS, 10, 10); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10, red); glPopMatrix(); glPushMatrix(); glTranslatef(0, MARKER_DISTANCE, 0); - glColor3f(green.x, green.y, green.z); - geometryCache->renderSphere(MARKER_RADIUS, 10, 10); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10, green); glPopMatrix(); glPushMatrix(); glTranslatef(0, 0, MARKER_DISTANCE); - glColor3f(blue.x, blue.y, blue.z); - geometryCache->renderSphere(MARKER_RADIUS, 10, 10); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10, blue); glPopMatrix(); glPushMatrix(); - glColor3f(grey.x, grey.y, grey.z); glTranslatef(MARKER_DISTANCE, 0, MARKER_DISTANCE); - geometryCache->renderSphere(MARKER_RADIUS, 10, 10); + geometryCache->renderSphere(MARKER_RADIUS, 10, 10, grey); glPopMatrix(); } @@ -120,15 +116,10 @@ void drawText(int x, int y, float scale, float radians, int mono, void renderCollisionOverlay(int width, int height, float magnitude, float red, float blue, float green) { const float MIN_VISIBLE_COLLISION = 0.01f; if (magnitude > MIN_VISIBLE_COLLISION) { - glColor4f(red, blue, green, magnitude); - DependencyManager::get()->renderQuad(0, 0, width, height); + DependencyManager::get()->renderQuad(0, 0, width, height, glm::vec4(red, blue, green, magnitude)); } } -void renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance) { - DependencyManager::get()->renderBevelCornersRect(x, y, width, height, bevelDistance); -} - // Do some basic timing tests and report the results void runTimingTests() { // How long does it take to make a call to get the time? diff --git a/interface/src/Util.h b/interface/src/Util.h index 74336168c0..6aeca985ec 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -27,8 +27,6 @@ void drawText(int x, int y, float scale, float radians, int mono, void renderCollisionOverlay(int width, int height, float magnitude, float red = 0, float blue = 0, float green = 0); -void renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance); - void runTimingTests(); float loadSetting(QSettings* settings, const char* name, float defaultValue); diff --git a/interface/src/audio/AudioIOStatsRenderer.cpp b/interface/src/audio/AudioIOStatsRenderer.cpp index 86662a28ed..1b385a4757 100644 --- a/interface/src/audio/AudioIOStatsRenderer.cpp +++ b/interface/src/audio/AudioIOStatsRenderer.cpp @@ -50,13 +50,12 @@ void AudioIOStatsRenderer::render(const float* color, int width, int height) { int statsHeight = STATS_HEIGHT_PER_LINE * lines; - static const float backgroundColor[4] = { 0.2f, 0.2f, 0.2f, 0.6f }; + static const glm::vec4 backgroundColor = { 0.2f, 0.2f, 0.2f, 0.6f }; int x = std::max((width - (int)STATS_WIDTH) / 2, 0); int y = std::max((height - CENTERED_BACKGROUND_HEIGHT) / 2, 0); int w = STATS_WIDTH; int h = statsHeight; - glColor4fv(backgroundColor); - DependencyManager::get()->renderQuad(x, y, w, h); + DependencyManager::get()->renderQuad(x, y, w, h, backgroundColor); glColor4f(1, 1, 1, 1); int horizontalOffset = x + 5; diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index 02e1d9ca4e..c9ca261ce4 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -111,11 +111,11 @@ void AudioScope::render(int width, int height) { return; } - static const float backgroundColor[4] = { 0.4f, 0.4f, 0.4f, 0.6f }; - static const float gridColor[4] = { 0.7f, 0.7f, 0.7f, 1.0f }; - static const float inputColor[4] = { 0.3f, 1.0f, 0.3f, 1.0f }; - static const float outputLeftColor[4] = { 1.0f, 0.3f, 0.3f, 1.0f }; - static const float outputRightColor[4] = { 0.3f, 0.3f, 1.0f, 1.0f }; + static const glm::vec4 backgroundColor = { 0.4f, 0.4f, 0.4f, 0.6f }; + static const glm::vec4 gridColor = { 0.7f, 0.7f, 0.7f, 1.0f }; + static const glm::vec4 inputColor = { 0.3f, 1.0f, 0.3f, 1.0f }; + static const glm::vec4 outputLeftColor = { 1.0f, 0.3f, 0.3f, 1.0f }; + static const glm::vec4 outputRightColor = { 0.3f, 0.3f, 1.0f, 1.0f }; static const int gridRows = 2; int gridCols = _framesPerScope; @@ -132,21 +132,15 @@ void AudioScope::render(int width, int height) { renderLineStrip(_outputRightD, outputRightColor, x, y, _samplesPerScope, _scopeOutputOffset, _scopeOutputRight); } -void AudioScope::renderBackground(const float* color, int x, int y, int width, int height) { - glColor4fv(color); - DependencyManager::get()->renderQuad(x, y, width, height); - glColor4f(1, 1, 1, 1); +void AudioScope::renderBackground(const glm::vec4& color, int x, int y, int width, int height) { + DependencyManager::get()->renderQuad(x, y, width, height, color); } -void AudioScope::renderGrid(const float* color, int x, int y, int width, int height, int rows, int cols) { - glColor4fv(color); - DependencyManager::get()->renderGrid(x, y, width, height, rows, cols, _audioScopeGrid); - glColor4f(1, 1, 1, 1); +void AudioScope::renderGrid(const glm::vec4& color, int x, int y, int width, int height, int rows, int cols) { + DependencyManager::get()->renderGrid(x, y, width, height, rows, cols, color, _audioScopeGrid); } -void AudioScope::renderLineStrip(int id, const float* color, int x, int y, int n, int offset, const QByteArray* byteArray) { - - glColor4fv(color); +void AudioScope::renderLineStrip(int id, const glm::vec4& color, int x, int y, int n, int offset, const QByteArray* byteArray) { int16_t sample; int16_t* samples = ((int16_t*) byteArray->data()) + offset; @@ -200,7 +194,7 @@ void AudioScope::renderLineStrip(int id, const float* color, int x, int y, int n } - geometryCache->updateVertices(id, points); + geometryCache->updateVertices(id, points, color); geometryCache->renderVertices(GL_LINE_STRIP, id); glColor4f(1, 1, 1, 1); diff --git a/interface/src/audio/AudioScope.h b/interface/src/audio/AudioScope.h index a061ad65d8..2e7c5897a9 100644 --- a/interface/src/audio/AudioScope.h +++ b/interface/src/audio/AudioScope.h @@ -12,6 +12,8 @@ #ifndef hifi_AudioScope_h #define hifi_AudioScope_h +#include + #include #include @@ -46,9 +48,9 @@ private slots: private: // Audio scope methods for rendering - static void renderBackground(const float* color, int x, int y, int width, int height); - void renderGrid(const float* color, int x, int y, int width, int height, int rows, int cols); - void renderLineStrip(int id, const float* color, int x, int y, int n, int offset, const QByteArray* byteArray); + static void renderBackground(const glm::vec4& color, int x, int y, int width, int height); + void renderGrid(const glm::vec4& color, int x, int y, int width, int height, int rows, int cols); + void renderLineStrip(int id, const glm::vec4& color, int x, int y, int n, int offset, const QByteArray* byteArray); // Audio scope methods for data acquisition int addBufferToScope(QByteArray* byteArray, int frameOffset, const int16_t* source, int sourceSamples, diff --git a/interface/src/audio/AudioToolBox.cpp b/interface/src/audio/AudioToolBox.cpp index 891d317fae..efb2177abe 100644 --- a/interface/src/audio/AudioToolBox.cpp +++ b/interface/src/audio/AudioToolBox.cpp @@ -56,17 +56,19 @@ void AudioToolBox::render(int x, int y, bool boxed) { glBindTexture(GL_TEXTURE_2D, _boxTextureId); + glm::vec4 quadColor; + if (isClipping) { - glColor3f(1.0f, 0.0f, 0.0f); + quadColor = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f); } else { - glColor3f(0.41f, 0.41f, 0.41f); + quadColor = glm::vec4(0.41f, 0.41f, 0.41f, 1.0f); } glm::vec2 topLeft(boxBounds.left(), boxBounds.top()); glm::vec2 bottomRight(boxBounds.right(), boxBounds.bottom()); glm::vec2 texCoordTopLeft(1,1); glm::vec2 texCoordBottomRight(0,0); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); } float iconColor = 1.0f; @@ -92,14 +94,14 @@ void AudioToolBox::render(int x, int y, bool boxed) { iconColor = PULSE_MIN + (PULSE_MAX - PULSE_MIN) * pulseFactor; } - glColor3f(iconColor, iconColor, iconColor); + glm::vec4 quadColor(iconColor, iconColor, iconColor, 1.0f); glm::vec2 topLeft(_iconBounds.left(), _iconBounds.top()); glm::vec2 bottomRight(_iconBounds.right(), _iconBounds.bottom()); glm::vec2 texCoordTopLeft(1,1); glm::vec2 texCoordBottomRight(0,0); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); glDisable(GL_TEXTURE_2D); } \ No newline at end of file diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index d6e29e0c31..70e53f84b7 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -402,15 +402,14 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool if (_isLookAtTarget && Menu::getInstance()->isOptionChecked(MenuOption::RenderFocusIndicator)) { const float LOOK_AT_INDICATOR_RADIUS = 0.03f; const float LOOK_AT_INDICATOR_OFFSET = 0.22f; - const float LOOK_AT_INDICATOR_COLOR[] = { 0.8f, 0.0f, 0.0f, 0.75f }; + const glm::vec4 LOOK_AT_INDICATOR_COLOR = { 0.8f, 0.0f, 0.0f, 0.75f }; glPushMatrix(); - glColor4fv(LOOK_AT_INDICATOR_COLOR); if (_displayName.isEmpty() || _displayNameAlpha == 0.0f) { glTranslatef(_position.x, getDisplayNamePosition().y, _position.z); } else { glTranslatef(_position.x, getDisplayNamePosition().y + LOOK_AT_INDICATOR_OFFSET, _position.z); } - DependencyManager::get()->renderSphere(LOOK_AT_INDICATOR_RADIUS, 15, 15); + DependencyManager::get()->renderSphere(LOOK_AT_INDICATOR_RADIUS, 15, 15, LOOK_AT_INDICATOR_COLOR); glPopMatrix(); } } @@ -434,11 +433,11 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool if (renderMode == NORMAL_RENDER_MODE && (sphereRadius > MIN_SPHERE_SIZE) && (angle < MAX_SPHERE_ANGLE) && (angle > MIN_SPHERE_ANGLE)) { - glColor4f(SPHERE_COLOR[0], SPHERE_COLOR[1], SPHERE_COLOR[2], 1.0f - angle / MAX_SPHERE_ANGLE); glPushMatrix(); glTranslatef(_position.x, _position.y, _position.z); glScalef(height, height, height); - DependencyManager::get()->renderSphere(sphereRadius, 15, 15); + DependencyManager::get()->renderSphere(sphereRadius, 15, 15, + glm::vec4(SPHERE_COLOR[0], SPHERE_COLOR[1], SPHERE_COLOR[2], 1.0f - angle / MAX_SPHERE_ANGLE)); glPopMatrix(); } @@ -569,14 +568,12 @@ void Avatar::renderBillboard() { float size = getBillboardSize(); glScalef(size, size, size); - glColor3f(1.0f, 1.0f, 1.0f); - glm::vec2 topLeft(-1.0f, -1.0f); glm::vec2 bottomRight(1.0f, 1.0f); glm::vec2 texCoordTopLeft(0.0f, 0.0f); glm::vec2 texCoordBottomRight(1.0f, 1.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); glPopMatrix(); @@ -703,8 +700,8 @@ void Avatar::renderDisplayName() { glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0f, 1.0f); - glColor4f(0.2f, 0.2f, 0.2f, _displayNameAlpha * DISPLAYNAME_BACKGROUND_ALPHA / DISPLAYNAME_ALPHA); - renderBevelCornersRect(left, bottom, right - left, top - bottom, 3); + DependencyManager::get()->renderBevelCornersRect(left, bottom, right - left, top - bottom, 3, + glm::vec4(0.2f, 0.2f, 0.2f, _displayNameAlpha * DISPLAYNAME_BACKGROUND_ALPHA / DISPLAYNAME_ALPHA)); glColor4f(0.93f, 0.93f, 0.93f, _displayNameAlpha); QByteArray ba = _displayName.toLocal8Bit(); @@ -946,7 +943,8 @@ int Avatar::parseDataAtOffset(const QByteArray& packet, int offset) { int Avatar::_jointConesID = GeometryCache::UNKNOWN_ID; // render a makeshift cone section that serves as a body part connecting joint spheres -void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, float radius1, float radius2) { +void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, + float radius1, float radius2, const glm::vec4& color) { GeometryCache::SharedPointer geometryCache = DependencyManager::get(); @@ -991,7 +989,7 @@ void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, // TODO: this is really inefficient constantly recreating these vertices buffers. It would be // better if the avatars cached these buffers for each of the joints they are rendering - geometryCache->updateVertices(_jointConesID, points); + geometryCache->updateVertices(_jointConesID, points, color); geometryCache->renderVertices(GL_TRIANGLES, _jointConesID); } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index f975e8dac3..6d1a21af94 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -133,7 +133,8 @@ public: virtual int parseDataAtOffset(const QByteArray& packet, int offset); - static void renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, float radius1, float radius2); + static void renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, + float radius1, float radius2, const glm::vec4& color); virtual void applyCollision(const glm::vec3& contactPoint, const glm::vec3& penetration) { } diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index 0ea0d1b725..a334b77c93 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -115,8 +115,7 @@ void Hand::render(bool isMine, Model::RenderMode renderMode) { glm::vec3 position = palm.getPosition(); glPushMatrix(); glTranslatef(position.x, position.y, position.z); - glColor3f(0.0f, 1.0f, 0.0f); - DependencyManager::get()->renderSphere(PALM_COLLISION_RADIUS * _owningAvatar->getScale(), 10, 10); + DependencyManager::get()->renderSphere(PALM_COLLISION_RADIUS * _owningAvatar->getScale(), 10, 10, glm::vec3(0.0f, 1.0f, 0.0f)); glPopMatrix(); } } @@ -152,8 +151,7 @@ void Hand::renderHandTargets(bool isMine) { glTranslatef(targetPosition.x, targetPosition.y, targetPosition.z); const float collisionRadius = 0.05f; - glColor4f(0.5f,0.5f,0.5f, alpha); - DependencyManager::get()->renderSphere(collisionRadius, 10, 10, false); + DependencyManager::get()->renderSphere(collisionRadius, 10, 10, glm::vec4(0.5f,0.5f,0.5f, alpha), false); glPopMatrix(); } } @@ -167,7 +165,6 @@ void Hand::renderHandTargets(bool isMine) { for (size_t i = 0; i < getNumPalms(); ++i) { PalmData& palm = getPalms()[i]; if (palm.isActive()) { - glColor4f(handColor.r, handColor.g, handColor.b, alpha); glm::vec3 tip = palm.getTipPosition(); glm::vec3 root = palm.getPosition(); @@ -175,13 +172,13 @@ void Hand::renderHandTargets(bool isMine) { myAvatar->scaleVectorRelativeToPosition(tip); myAvatar->scaleVectorRelativeToPosition(root); - Avatar::renderJointConnectingCone(root, tip, PALM_FINGER_ROD_RADIUS, PALM_FINGER_ROD_RADIUS); + Avatar::renderJointConnectingCone(root, tip, PALM_FINGER_ROD_RADIUS, PALM_FINGER_ROD_RADIUS, glm::vec4(handColor.r, handColor.g, handColor.b, alpha)); // Render sphere at palm/finger root glm::vec3 offsetFromPalm = root + palm.getNormal() * PALM_DISK_THICKNESS; - Avatar::renderJointConnectingCone(root, offsetFromPalm, PALM_DISK_RADIUS, 0.0f); + Avatar::renderJointConnectingCone(root, offsetFromPalm, PALM_DISK_RADIUS, 0.0f, glm::vec4(handColor.r, handColor.g, handColor.b, alpha)); glPushMatrix(); glTranslatef(root.x, root.y, root.z); - DependencyManager::get()->renderSphere(PALM_BALL_RADIUS, 20.0f, 20.0f); + DependencyManager::get()->renderSphere(PALM_BALL_RADIUS, 20.0f, 20.0f, glm::vec4(handColor.r, handColor.g, handColor.b, alpha)); glPopMatrix(); } } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 343a729298..658a5d3dc2 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -381,17 +381,15 @@ void MyAvatar::renderDebugBodyPoints() { // Torso Sphere position = torsoPosition; glPushMatrix(); - glColor4f(0, 1, 0, .5f); glTranslatef(position.x, position.y, position.z); - DependencyManager::get()->renderSphere(0.2f, 10.0f, 10.0f); + DependencyManager::get()->renderSphere(0.2f, 10.0f, 10.0f, glm::vec4(0, 1, 0, .5f)); glPopMatrix(); // Head Sphere position = headPosition; glPushMatrix(); - glColor4f(0, 1, 0, .5f); glTranslatef(position.x, position.y, position.z); - DependencyManager::get()->renderSphere(0.15f, 10.0f, 10.0f); + DependencyManager::get()->renderSphere(0.15f, 10.0f, 10.0f, glm::vec4(0, 1, 0, .5f)); glPopMatrix(); } @@ -1940,14 +1938,13 @@ void MyAvatar::renderLaserPointers() { for (size_t i = 0; i < getHand()->getNumPalms(); ++i) { PalmData& palm = getHand()->getPalms()[i]; if (palm.isActive()) { - glColor4f(0, 1, 1, 1); glm::vec3 tip = getLaserPointerTipPosition(&palm); glm::vec3 root = palm.getPosition(); //Scale the root vector with the avatar scale scaleVectorRelativeToPosition(root); - Avatar::renderJointConnectingCone(root, tip, PALM_TIP_ROD_RADIUS, PALM_TIP_ROD_RADIUS); + Avatar::renderJointConnectingCone(root, tip, PALM_TIP_ROD_RADIUS, PALM_TIP_ROD_RADIUS, glm::vec4(0, 1, 1, 1)); } } } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 31fa648d17..b5b82f091d 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -354,7 +354,7 @@ void SkeletonModel::renderJointConstraints(int jointIndex) { } else { otherAxis.x = 1.0f; } - glColor4f(otherAxis.r, otherAxis.g, otherAxis.b, 0.75f); + glm::vec4 color(otherAxis.r, otherAxis.g, otherAxis.b, 0.75f); QVector points; points << glm::vec3(0.0f, 0.0f, 0.0f); @@ -366,7 +366,7 @@ void SkeletonModel::renderJointConstraints(int jointIndex) { } // TODO: this is really inefficient constantly recreating these vertices buffers. It would be // better if the skeleton model cached these buffers for each of the joints they are rendering - geometryCache->updateVertices(_triangleFanID, points); + geometryCache->updateVertices(_triangleFanID, points, color); geometryCache->renderVertices(GL_TRIANGLE_FAN, _triangleFanID); } @@ -601,10 +601,8 @@ void SkeletonModel::renderRagdoll() { glm::vec3 position = points[i]._position - simulationTranslation; 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->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); - glColor4f(1.0f, 1.0f, 0.0f, alpha); - geometryCache->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(radius2, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS, glm::vec4(0.0f, 0.0f, 0.0f, alpha)); + geometryCache->renderSphere(radius1, BALL_SUBDIVISIONS, BALL_SUBDIVISIONS, glm::vec4(1.0f, 1.0f, 0.0f, alpha)); glPopMatrix(); } glPopMatrix(); @@ -953,9 +951,8 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { _boundingShape.getEndPoint(endPoint); endPoint = endPoint - _translation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); - glColor4f(0.6f, 0.6f, 0.8f, alpha); GeometryCache::SharedPointer geometryCache = DependencyManager::get(); - geometryCache->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS, glm::vec4(0.6f, 0.6f, 0.8f, alpha)); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -963,13 +960,11 @@ void SkeletonModel::renderBoundingCollisionShapes(float alpha) { startPoint = startPoint - _translation; glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); - glColor4f(0.8f, 0.8f, 0.6f, alpha); - geometryCache->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(_boundingShape.getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS, glm::vec4(0.8f, 0.8f, 0.6f, alpha)); // draw a green cylinder between the two points glm::vec3 origin(0.0f); - glColor4f(0.6f, 0.8f, 0.6f, alpha); - Avatar::renderJointConnectingCone( origin, axis, _boundingShape.getRadius(), _boundingShape.getRadius()); + Avatar::renderJointConnectingCone( origin, axis, _boundingShape.getRadius(), _boundingShape.getRadius(), glm::vec4(0.6f, 0.8f, 0.6f, alpha)); glPopMatrix(); } @@ -998,8 +993,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { glm::vec3 position = shape->getTranslation() - simulationTranslation; glTranslatef(position.x, position.y, position.z); // draw a grey sphere at shape position - glColor4f(0.75f, 0.75f, 0.75f, alpha); - geometryCache->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(shape->getBoundingRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS, glm::vec4(0.75f, 0.75f, 0.75f, alpha)); } else if (shape->getType() == CAPSULE_SHAPE) { CapsuleShape* capsule = static_cast(shape); @@ -1008,8 +1002,7 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { capsule->getEndPoint(endPoint); endPoint = endPoint - simulationTranslation; glTranslatef(endPoint.x, endPoint.y, endPoint.z); - glColor4f(0.6f, 0.6f, 0.8f, alpha); - geometryCache->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS, glm::vec4(0.6f, 0.6f, 0.8f, alpha)); // draw a yellow sphere at the capsule startpoint glm::vec3 startPoint; @@ -1017,13 +1010,11 @@ void SkeletonModel::renderJointCollisionShapes(float alpha) { startPoint = startPoint - simulationTranslation; glm::vec3 axis = endPoint - startPoint; glTranslatef(-axis.x, -axis.y, -axis.z); - glColor4f(0.8f, 0.8f, 0.6f, alpha); - geometryCache->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS); + geometryCache->renderSphere(capsule->getRadius(), BALL_SUBDIVISIONS, BALL_SUBDIVISIONS, glm::vec4(0.8f, 0.8f, 0.6f, alpha)); // draw a green cylinder between the two points glm::vec3 origin(0.0f); - glColor4f(0.6f, 0.8f, 0.6f, alpha); - Avatar::renderJointConnectingCone( origin, axis, capsule->getRadius(), capsule->getRadius()); + Avatar::renderJointConnectingCone( origin, axis, capsule->getRadius(), capsule->getRadius(), glm::vec4(0.6f, 0.8f, 0.6f, alpha)); } glPopMatrix(); } diff --git a/interface/src/octree/OctreeFade.cpp b/interface/src/octree/OctreeFade.cpp index 2e2e45eb90..917bb67124 100644 --- a/interface/src/octree/OctreeFade.cpp +++ b/interface/src/octree/OctreeFade.cpp @@ -43,12 +43,11 @@ void OctreeFade::render() { glDisable(GL_LIGHTING); glPushMatrix(); glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); - glColor4f(red, green, blue, opacity); glTranslatef(voxelDetails.x + voxelDetails.s * 0.5f, voxelDetails.y + voxelDetails.s * 0.5f, voxelDetails.z + voxelDetails.s * 0.5f); glLineWidth(1.0f); - DependencyManager::get()->renderSolidCube(voxelDetails.s); + DependencyManager::get()->renderSolidCube(voxelDetails.s, glm::vec4(red, green, blue, opacity)); glLineWidth(1.0f); glPopMatrix(); glEnable(GL_LIGHTING); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 106c74cdeb..174d45340b 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -245,13 +245,12 @@ void ApplicationOverlay::displayOverlayTexture() { glDisable(GL_LIGHTING); glEnable(GL_BLEND); - glColor4f(1.0f, 1.0f, 1.0f, _alpha); glm::vec2 topLeft(0.0f, 0.0f); glm::vec2 bottomRight(glCanvas->getDeviceWidth(), glCanvas->getDeviceHeight()); glm::vec2 texCoordTopLeft(0.0f, 1.0f); glm::vec2 texCoordBottomRight(1.0f, 0.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); } glPopMatrix(); @@ -673,14 +672,13 @@ void ApplicationOverlay::renderControllerPointers() { mouseY += reticleSize / 2.0f; - glColor3f(RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2]); - glm::vec2 topLeft(mouseX, mouseY); glm::vec2 bottomRight(mouseX + reticleSize, mouseY - reticleSize); glm::vec2 texCoordTopLeft(0.0f, 0.0f); glm::vec2 texCoordBottomRight(1.0f, 1.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, + glm::vec4(RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2], 1.0f)); } } @@ -756,7 +754,7 @@ void ApplicationOverlay::renderMagnifier(glm::vec2 magPos, float sizeMult, bool border << bottomRight; border << topRight; border << topLeft; - geometryCache->updateVertices(_magnifierBorder, border); + geometryCache->updateVertices(_magnifierBorder, border, glm::vec4(1.0f, 0.0f, 0.0f, _alpha)); _previousMagnifierBottomLeft = bottomLeft; _previousMagnifierBottomRight = bottomRight; @@ -769,7 +767,6 @@ void ApplicationOverlay::renderMagnifier(glm::vec2 magPos, float sizeMult, bool glDisable(GL_TEXTURE_2D); glLineWidth(1.0f); //Outer Line - glColor4f(1.0f, 0.0f, 0.0f, _alpha); geometryCache->renderVertices(GL_LINE_STRIP, _magnifierBorder); glEnable(GL_TEXTURE_2D); } @@ -810,9 +807,9 @@ void ApplicationOverlay::renderAudioMeter() { audioMeterY = AUDIO_METER_GAP + MUTE_ICON_PADDING; } - const float AUDIO_METER_BLUE[] = { 0.0, 0.0, 1.0 }; - const float AUDIO_METER_GREEN[] = { 0.0, 1.0, 0.0 }; - const float AUDIO_METER_RED[] = { 1.0, 0.0, 0.0 }; + const glm::vec4 AUDIO_METER_BLUE = { 0.0, 0.0, 1.0, 1.0 }; + const glm::vec4 AUDIO_METER_GREEN = { 0.0, 1.0, 0.0, 1.0 }; + const glm::vec4 AUDIO_METER_RED = { 1.0, 0.0, 0.0, 1.0 }; const float AUDIO_GREEN_START = 0.25 * AUDIO_METER_SCALE_WIDTH; const float AUDIO_RED_START = 0.80 * AUDIO_METER_SCALE_WIDTH; const float CLIPPING_INDICATOR_TIME = 1.0f; @@ -855,51 +852,53 @@ void ApplicationOverlay::renderAudioMeter() { audioMeterY += AUDIO_METER_HEIGHT; - glColor3f(0, 0, 0); // Draw audio meter background Quad - DependencyManager::get()->renderQuad(AUDIO_METER_X, audioMeterY, AUDIO_METER_WIDTH, AUDIO_METER_HEIGHT); + DependencyManager::get()->renderQuad(AUDIO_METER_X, audioMeterY, AUDIO_METER_WIDTH, AUDIO_METER_HEIGHT, glm::vec4(0, 0, 0, 1)); if (audioLevel > AUDIO_RED_START) { + glm::vec4 quadColor; if (!isClipping) { - glColor3fv(AUDIO_METER_RED); + quadColor = AUDIO_METER_RED; } else { - glColor3f(1, 1, 1); + quadColor = glm::vec4(1, 1, 1, 1); } // Draw Red Quad DependencyManager::get()->renderQuad(AUDIO_METER_X + AUDIO_METER_INSET + AUDIO_RED_START, audioMeterY + AUDIO_METER_INSET, audioLevel - AUDIO_RED_START, - AUDIO_METER_HEIGHT - AUDIO_METER_INSET, + AUDIO_METER_HEIGHT - AUDIO_METER_INSET, quadColor, _audioRedQuad); audioLevel = AUDIO_RED_START; } if (audioLevel > AUDIO_GREEN_START) { + glm::vec4 quadColor; if (!isClipping) { - glColor3fv(AUDIO_METER_GREEN); + quadColor = AUDIO_METER_GREEN; } else { - glColor3f(1, 1, 1); + quadColor = glm::vec4(1, 1, 1, 1); } // Draw Green Quad DependencyManager::get()->renderQuad(AUDIO_METER_X + AUDIO_METER_INSET + AUDIO_GREEN_START, audioMeterY + AUDIO_METER_INSET, audioLevel - AUDIO_GREEN_START, - AUDIO_METER_HEIGHT - AUDIO_METER_INSET, + AUDIO_METER_HEIGHT - AUDIO_METER_INSET, quadColor, _audioGreenQuad); audioLevel = AUDIO_GREEN_START; } // Draw Blue Quad + glm::vec4 quadColor; if (!isClipping) { - glColor3fv(AUDIO_METER_BLUE); + quadColor = AUDIO_METER_BLUE; } else { - glColor3f(1, 1, 1); + quadColor = glm::vec4(1, 1, 1, 1); } // Draw Blue (low level) quad DependencyManager::get()->renderQuad(AUDIO_METER_X + AUDIO_METER_INSET, audioMeterY + AUDIO_METER_INSET, - audioLevel, AUDIO_METER_HEIGHT - AUDIO_METER_INSET, + audioLevel, AUDIO_METER_HEIGHT - AUDIO_METER_INSET, quadColor, _audioBlueQuad); } @@ -955,20 +954,21 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder() { int height = glCanvas->height(); if (width != _previousBorderWidth || height != _previousBorderHeight) { + glm::vec4 color(CONNECTION_STATUS_BORDER_COLOR[0], + CONNECTION_STATUS_BORDER_COLOR[1], + CONNECTION_STATUS_BORDER_COLOR[2], 1.0f); + QVector border; border << glm::vec2(0, 0); border << glm::vec2(0, height); border << glm::vec2(width, height); border << glm::vec2(width, 0); border << glm::vec2(0, 0); - geometryCache->updateVertices(_domainStatusBorder, border); + geometryCache->updateVertices(_domainStatusBorder, border, color); _previousBorderWidth = width; _previousBorderHeight = height; } - glColor3f(CONNECTION_STATUS_BORDER_COLOR[0], - CONNECTION_STATUS_BORDER_COLOR[1], - CONNECTION_STATUS_BORDER_COLOR[2]); glLineWidth(CONNECTION_STATUS_BORDER_LINE_WIDTH); geometryCache->renderVertices(GL_LINE_STRIP, _domainStatusBorder); diff --git a/interface/src/ui/BandwidthMeter.cpp b/interface/src/ui/BandwidthMeter.cpp index 69cd20d9a2..a29f16b851 100644 --- a/interface/src/ui/BandwidthMeter.cpp +++ b/interface/src/ui/BandwidthMeter.cpp @@ -94,12 +94,21 @@ void BandwidthMeter::setColorRGBA(unsigned c) { GLubyte( c & 0xff)); } -void BandwidthMeter::renderBox(int x, int y, int w, int h) { - DependencyManager::get()->renderQuad(x, y, w, h); +glm::vec4 BandwidthMeter::getColorRGBA(unsigned c) { + + float r = (c >> 24) / 255.0f; + float g = ((c >> 16) & 0xff) / 255.0f; + float b = ((c >> 8) & 0xff) / 255.0f; + float a = (c & 0xff) / 255.0f; + return glm::vec4(r,g,b,a); } -void BandwidthMeter::renderVerticalLine(int x, int y, int h) { - DependencyManager::get()->renderLine(glm::vec2(x, y), glm::vec2(x, y + h)); +void BandwidthMeter::renderBox(int x, int y, int w, int h, unsigned c) { + DependencyManager::get()->renderQuad(x, y, w, h, getColorRGBA(c)); +} + +void BandwidthMeter::renderVerticalLine(int x, int y, int h, unsigned c) { + DependencyManager::get()->renderLine(glm::vec2(x, y), glm::vec2(x, y + h), getColorRGBA(c)); } inline int BandwidthMeter::centered(int subject, int object) { @@ -161,9 +170,9 @@ void BandwidthMeter::render(int screenWidth, int screenHeight) { _textRenderer->draw(-labelWidthOut - SPACING_RIGHT_CAPTION_IN_OUT, textYlowerLine, CAPTION_OUT); // Render vertical lines for the frame - setColorRGBA(COLOR_FRAME); - renderVerticalLine(0, 0, h); - renderVerticalLine(barWidth, 0, h); + //setColorRGBA(COLOR_FRAME); + renderVerticalLine(0, 0, h, COLOR_FRAME); + renderVerticalLine(barWidth, 0, h, COLOR_FRAME); // Adjust scale int steps; @@ -192,9 +201,8 @@ void BandwidthMeter::render(int screenWidth, int screenHeight) { } // Render scale indicators - setColorRGBA(COLOR_INDICATOR); for (int j = NUMBER_OF_MARKERS; --j > 0;) { - renderVerticalLine((barWidth * j) / NUMBER_OF_MARKERS, 0, h); + renderVerticalLine((barWidth * j) / NUMBER_OF_MARKERS, 0, h, COLOR_INDICATOR); } // Render bars @@ -205,15 +213,13 @@ void BandwidthMeter::render(int screenWidth, int screenHeight) { int wIn = (int)(barWidth * inputStream(chIdx).getValue() * UNIT_SCALE / scaleMax); int wOut = (int)(barWidth * outputStream(chIdx).getValue() * UNIT_SCALE / scaleMax); - setColorRGBA(channelInfo(chIdx).colorRGBA); - if (wIn > 0) { - renderBox(xIn, 0, wIn, barHeight); + renderBox(xIn, 0, wIn, barHeight, channelInfo(chIdx).colorRGBA); } xIn += wIn; if (wOut > 0) { - renderBox(xOut, h - barHeight, wOut, barHeight); + renderBox(xOut, h - barHeight, wOut, barHeight, channelInfo(chIdx).colorRGBA); } xOut += wOut; } diff --git a/interface/src/ui/BandwidthMeter.h b/interface/src/ui/BandwidthMeter.h index 0829cc86e9..4f69a9fb97 100644 --- a/interface/src/ui/BandwidthMeter.h +++ b/interface/src/ui/BandwidthMeter.h @@ -70,8 +70,9 @@ public: private: static void setColorRGBA(unsigned c); - static void renderBox(int x, int y, int w, int h); - static void renderVerticalLine(int x, int y, int h); + static glm::vec4 getColorRGBA(unsigned c); + static void renderBox(int x, int y, int w, int h, unsigned c); + static void renderVerticalLine(int x, int y, int h, unsigned c); static inline int centered(int subject, int object); diff --git a/interface/src/ui/MetavoxelEditor.cpp b/interface/src/ui/MetavoxelEditor.cpp index 23ff960aea..fc5d8773a7 100644 --- a/interface/src/ui/MetavoxelEditor.cpp +++ b/interface/src/ui/MetavoxelEditor.cpp @@ -353,11 +353,9 @@ void MetavoxelEditor::render() { float scale = GRID_DIVISIONS * spacing; glScalef(scale, scale, scale); - glColor3f(GRID_BRIGHTNESS, GRID_BRIGHTNESS, GRID_BRIGHTNESS); - _gridProgram.bind(); - DependencyManager::get()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS); + DependencyManager::get()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS, glm::vec4(GRID_BRIGHTNESS, GRID_BRIGHTNESS, GRID_BRIGHTNESS, 1.0f)); _gridProgram.release(); @@ -488,17 +486,17 @@ void BoxTool::render() { if (_state != HOVERING_STATE) { const float BOX_ALPHA = 0.25f; QColor color = getColor(); + glm::vec4 cubeColor; if (color.isValid()) { - glColor4f(color.redF(), color.greenF(), color.blueF(), BOX_ALPHA); + cubeColor = glm::vec4(color.redF(), color.greenF(), color.blueF(), BOX_ALPHA); } else { - glColor4f(GRID_BRIGHTNESS, GRID_BRIGHTNESS, GRID_BRIGHTNESS, BOX_ALPHA); + cubeColor = glm::vec4(GRID_BRIGHTNESS, GRID_BRIGHTNESS, GRID_BRIGHTNESS, BOX_ALPHA); } glEnable(GL_CULL_FACE); - DependencyManager::get()->renderSolidCube(1.0f); + DependencyManager::get()->renderSolidCube(1.0f, cubeColor); glDisable(GL_CULL_FACE); } - glColor3f(GRID_BRIGHTNESS, GRID_BRIGHTNESS, GRID_BRIGHTNESS); - DependencyManager::get()->renderWireCube(1.0f); + DependencyManager::get()->renderWireCube(1.0f, glm::vec4(GRID_BRIGHTNESS, GRID_BRIGHTNESS, GRID_BRIGHTNESS, 1.0f)); glPopMatrix(); } diff --git a/interface/src/ui/NodeBounds.cpp b/interface/src/ui/NodeBounds.cpp index 620efe20fb..704325f98e 100644 --- a/interface/src/ui/NodeBounds.cpp +++ b/interface/src/ui/NodeBounds.cpp @@ -127,8 +127,7 @@ void NodeBounds::draw() { float red, green, blue; getColorForNodeType(selectedNode->getType(), red, green, blue); - glColor4f(red, green, blue, 0.2f); - DependencyManager::get()->renderSolidCube(1.0f); + DependencyManager::get()->renderSolidCube(1.0f, glm::vec4(red, green, blue, 0.2f)); glPopMatrix(); @@ -152,8 +151,7 @@ void NodeBounds::drawNodeBorder(const glm::vec3& center, float scale, float red, glTranslatef(center.x, center.y, center.z); glScalef(scale, scale, scale); glLineWidth(2.5); - glColor3f(red, green, blue); - DependencyManager::get()->renderWireCube(1.0f); + DependencyManager::get()->renderWireCube(1.0f, glm::vec4(red, green, blue, 1.0f)); glPopMatrix(); } @@ -179,9 +177,10 @@ void NodeBounds::drawOverlay() { int mouseX = application->getTrueMouseX(), mouseY = application->getTrueMouseY(), textWidth = widthText(TEXT_SCALE, 0, _overlayText); - glColor4f(0.4f, 0.4f, 0.4f, 0.6f); - renderBevelCornersRect(mouseX + MOUSE_OFFSET, mouseY - TEXT_HEIGHT - PADDING, - textWidth + (2 * PADDING), TEXT_HEIGHT + (2 * PADDING), BACKGROUND_BEVEL); + DependencyManager::get()->renderBevelCornersRect( + mouseX + MOUSE_OFFSET, mouseY - TEXT_HEIGHT - PADDING, + textWidth + (2 * PADDING), TEXT_HEIGHT + (2 * PADDING), BACKGROUND_BEVEL, + glm::vec4(0.4f, 0.4f, 0.4f, 0.6f)); drawText(mouseX + MOUSE_OFFSET + PADDING, mouseY, TEXT_SCALE, ROTATION, FONT, _overlayText, TEXT_COLOR); } } diff --git a/interface/src/ui/RearMirrorTools.cpp b/interface/src/ui/RearMirrorTools.cpp index 29c8e67f61..c794fc1ecf 100644 --- a/interface/src/ui/RearMirrorTools.cpp +++ b/interface/src/ui/RearMirrorTools.cpp @@ -133,10 +133,11 @@ void RearMirrorTools::displayIcon(QRect bounds, QRect iconBounds, GLuint texture glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); + glm::vec4 quadColor; if (selected) { - glColor3f(.5f, .5f, .5f); + quadColor = glm::vec4(.5f, .5f, .5f, 1.0f); } else { - glColor3f(1, 1, 1); + quadColor = glm::vec4(1, 1, 1, 1); } glBindTexture(GL_TEXTURE_2D, textureId); @@ -146,7 +147,7 @@ void RearMirrorTools::displayIcon(QRect bounds, QRect iconBounds, GLuint texture glm::vec2 texCoordTopLeft(0.0f, 1.0f); glm::vec2 texCoordBottomRight(1.0f, 0.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); glPopMatrix(); diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 43565fcca8..cf24615938 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -154,14 +154,12 @@ void Stats::resetWidth(int width, int horizontalOffset) { // translucent background box that makes stats more readable void Stats::drawBackground(unsigned int rgba, int x, int y, int width, int height) { - glColor4f(((rgba >> 24) & 0xff) / 255.0f, - ((rgba >> 16) & 0xff) / 255.0f, - ((rgba >> 8) & 0xff) / 255.0f, - (rgba & 0xff) / 255.0f); + glm::vec4 color(((rgba >> 24) & 0xff) / 255.0f, + ((rgba >> 16) & 0xff) / 255.0f, + ((rgba >> 8) & 0xff) / 255.0f, + (rgba & 0xff) / 255.0f); - DependencyManager::get()->renderQuad(x, y, width, height); - - glColor4f(1, 1, 1, 1); + DependencyManager::get()->renderQuad(x, y, width, height, color); } bool Stats::includeTimingRecord(const QString& name) { diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index b34416f566..03decf046c 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -95,7 +95,6 @@ void BillboardOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; xColor color = getColor(); float alpha = getAlpha(); - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); glm::vec2 topLeft(-x, -y); glm::vec2 bottomRight(x, y); @@ -104,7 +103,8 @@ void BillboardOverlay::render(RenderArgs* args) { glm::vec2 texCoordBottomRight(((float)_fromImage.x() + (float)_fromImage.width()) / (float)_size.width(), ((float)_fromImage.y() + (float)_fromImage.height()) / _size.height()); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, + glm::vec4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha)); } } glPopMatrix(); diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 25bc8a0ddc..1805f9c7d8 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -95,10 +95,9 @@ void Circle3DOverlay::render(RenderArgs* args) { const float SLICE_ANGLE = FULL_CIRCLE / SLICES; //const int slices = 15; - xColor color = getColor(); + xColor colorX = getColor(); const float MAX_COLOR = 255.0f; - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); - + glm::vec4 color(colorX.red / MAX_COLOR, colorX.green / MAX_COLOR, colorX.blue / MAX_COLOR, alpha); glDisable(GL_LIGHTING); @@ -162,7 +161,7 @@ void Circle3DOverlay::render(RenderArgs* args) { points << lastOuterPoint << lastInnerPoint; - geometryCache->updateVertices(_quadVerticesID, points); + geometryCache->updateVertices(_quadVerticesID, points, color); } geometryCache->renderVertices(GL_QUAD_STRIP, _quadVerticesID); @@ -200,7 +199,7 @@ void Circle3DOverlay::render(RenderArgs* args) { glm::vec2 lastPoint(cos(angleInRadians) * outerRadius, sin(angleInRadians) * outerRadius); points << lastPoint; - geometryCache->updateVertices(_lineVerticesID, points); + geometryCache->updateVertices(_lineVerticesID, points, color); } if (getIsDashedLine()) { @@ -270,16 +269,19 @@ void Circle3DOverlay::render(RenderArgs* args) { } } - geometryCache->updateVertices(_majorTicksVerticesID, majorPoints); - geometryCache->updateVertices(_minorTicksVerticesID, minorPoints); + xColor majorColorX = getMajorTickMarksColor(); + glm::vec4 majorColor(majorColorX.red / MAX_COLOR, majorColorX.green / MAX_COLOR, majorColorX.blue / MAX_COLOR, alpha); + + geometryCache->updateVertices(_majorTicksVerticesID, majorPoints, majorColor); + + xColor minorColorX = getMinorTickMarksColor(); + glm::vec4 minorColor(minorColorX.red / MAX_COLOR, minorColorX.green / MAX_COLOR, minorColorX.blue / MAX_COLOR, alpha); + + geometryCache->updateVertices(_minorTicksVerticesID, minorPoints, minorColor); } - xColor majorColor = getMajorTickMarksColor(); - glColor4f(majorColor.red / MAX_COLOR, majorColor.green / MAX_COLOR, majorColor.blue / MAX_COLOR, alpha); geometryCache->renderVertices(GL_LINES, _majorTicksVerticesID); - xColor minorColor = getMinorTickMarksColor(); - glColor4f(minorColor.red / MAX_COLOR, minorColor.green / MAX_COLOR, minorColor.blue / MAX_COLOR, alpha); geometryCache->renderVertices(GL_LINES, _minorTicksVerticesID); } diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 62c2bea128..5d0a8ff037 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -47,7 +47,7 @@ void Cube3DOverlay::render(RenderArgs* args) { float alpha = getAlpha(); xColor color = getColor(); const float MAX_COLOR = 255.0f; - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); //glDisable(GL_LIGHTING); @@ -74,13 +74,12 @@ void Cube3DOverlay::render(RenderArgs* args) { // enough for the use-case. glDepthMask(GL_FALSE); glPushMatrix(); - glColor4f(1.0f, 1.0f, 1.0f, alpha); glScalef(dimensions.x * _borderSize, dimensions.y * _borderSize, dimensions.z * _borderSize); if (_drawOnHUD) { - DependencyManager::get()->renderSolidCube(1.0f); + DependencyManager::get()->renderSolidCube(1.0f, glm::vec4(1.0f, 1.0f, 1.0f, alpha)); } else { - DependencyManager::get()->renderSolidCube(1.0f); + DependencyManager::get()->renderSolidCube(1.0f, glm::vec4(1.0f, 1.0f, 1.0f, alpha)); } glPopMatrix(); @@ -88,12 +87,11 @@ void Cube3DOverlay::render(RenderArgs* args) { } glPushMatrix(); - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); glScalef(dimensions.x, dimensions.y, dimensions.z); if (_drawOnHUD) { - DependencyManager::get()->renderSolidCube(1.0f); + DependencyManager::get()->renderSolidCube(1.0f, cubeColor); } else { - DependencyManager::get()->renderSolidCube(1.0f); + DependencyManager::get()->renderSolidCube(1.0f, cubeColor); } glPopMatrix(); } else { @@ -130,7 +128,7 @@ void Cube3DOverlay::render(RenderArgs* args) { } else { glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderWireCube(1.0f); + DependencyManager::get()->renderWireCube(1.0f, cubeColor); } } glPopMatrix(); diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index fbcbf97077..b39b2c3274 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -79,7 +79,7 @@ void Grid3DOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + glm::vec4 gridColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); _gridProgram.bind(); @@ -92,7 +92,7 @@ void Grid3DOverlay::render(RenderArgs* args) { float scale = MINOR_GRID_DIVISIONS * spacing; glScalef(scale, scale, scale); - DependencyManager::get()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS); + DependencyManager::get()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS, gridColor); } glPopMatrix(); @@ -107,7 +107,7 @@ void Grid3DOverlay::render(RenderArgs* args) { float scale = MAJOR_GRID_DIVISIONS * spacing; glScalef(scale, scale, scale); - DependencyManager::get()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS); + DependencyManager::get()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS, gridColor); } glPopMatrix(); diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 1ecfc74e44..169a3eaa3d 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -85,7 +85,7 @@ void ImageOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; xColor color = getColor(); float alpha = getAlpha(); - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + glm::vec4 quadColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); float imageWidth = _textureImage.width(); float imageHeight = _textureImage.height(); @@ -115,9 +115,9 @@ void ImageOverlay::render(RenderArgs* args) { glm::vec2 texCoordBottomRight(x + w, 1.0f - (y + h)); if (_renderImage) { - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); } else { - DependencyManager::get()->renderQuad(topLeft, bottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); } if (_renderImage) { diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 2776754340..d3f82dd270 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -39,7 +39,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) { float alpha = getAlpha(); xColor color = getColor(); const float MAX_COLOR = 255.0f; - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + glm::vec4 rectangleColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); glDisable(GL_LIGHTING); @@ -72,7 +72,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) { if (getIsSolid()) { glm::vec3 topLeft(-halfDimensions.x, 0.0f, -halfDimensions.y); glm::vec3 bottomRight(halfDimensions.x, 0.0f, halfDimensions.y); - DependencyManager::get()->renderQuad(topLeft, bottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, rectangleColor); } else { if (getIsDashedLine()) { @@ -95,7 +95,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) { border << glm::vec3(halfDimensions.x, 0.0f, halfDimensions.y); border << glm::vec3(-halfDimensions.x, 0.0f, halfDimensions.y); border << glm::vec3(-halfDimensions.x, 0.0f, -halfDimensions.y); - geometryCache->updateVertices(_geometryCacheID, border); + geometryCache->updateVertices(_geometryCacheID, border, rectangleColor); _previousHalfDimensions = halfDimensions; diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 3e30ec033d..11bd7b97e8 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -39,7 +39,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { float alpha = getAlpha(); xColor color = getColor(); const float MAX_COLOR = 255.0f; - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + glm::vec4 sphereColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); glDisable(GL_LIGHTING); @@ -62,7 +62,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { glm::vec3 positionToCenter = center - position; glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderSphere(1.0f, SLICES, SLICES, _isSolid); + DependencyManager::get()->renderSphere(1.0f, SLICES, SLICES, sphereColor, _isSolid); glPopMatrix(); glPopMatrix(); diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 92f6350936..251039db22 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -92,7 +92,7 @@ void Text3DOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; xColor backgroundColor = getBackgroundColor(); - glColor4f(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, + glm::vec4 quadColor(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, getBackgroundAlpha()); glm::vec2 dimensions = getDimensions(); @@ -102,7 +102,7 @@ void Text3DOverlay::render(RenderArgs* args) { glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND); glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); - DependencyManager::get()->renderQuad(topLeft, bottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 40.0f; // this is a ratio determined through experimentation diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index ca83e1c595..1333134907 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -70,7 +70,7 @@ void TextOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; xColor backgroundColor = getBackgroundColor(); - glColor4f(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, + glm::vec4 quadColor(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, getBackgroundAlpha()); int left = _bounds.left(); @@ -80,7 +80,7 @@ void TextOverlay::render(RenderArgs* args) { glm::vec2 topLeft(left, top); glm::vec2 bottomRight(right, bottom); - DependencyManager::get()->renderQuad(topLeft, bottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); // Same font properties as textSize() TextRenderer* textRenderer = TextRenderer::getInstance(SANS_FONT_FAMILY, _fontSize, DEFAULT_FONT_WEIGHT); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 47e9237ddc..adb119cb9b 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -394,62 +394,53 @@ const Model* EntityTreeRenderer::getModelForEntityItem(const EntityItem* entityI void EntityTreeRenderer::renderElementProxy(EntityTreeElement* entityTreeElement) { glm::vec3 elementCenter = entityTreeElement->getAACube().calcCenter() * (float) TREE_SCALE; float elementSize = entityTreeElement->getScale() * (float) TREE_SCALE; - glColor3f(1.0f, 0.0f, 0.0f); glPushMatrix(); glTranslatef(elementCenter.x, elementCenter.y, elementCenter.z); - DependencyManager::get()->renderWireCube(elementSize); + DependencyManager::get()->renderWireCube(elementSize, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); glPopMatrix(); if (_displayElementChildProxies) { // draw the children float halfSize = elementSize / 2.0f; float quarterSize = elementSize / 4.0f; - glColor3f(1.0f, 1.0f, 0.0f); glPushMatrix(); glTranslatef(elementCenter.x - quarterSize, elementCenter.y - quarterSize, elementCenter.z - quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(1.0f, 1.0f, 0.0f, 1.0f)); glPopMatrix(); - glColor3f(1.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(elementCenter.x + quarterSize, elementCenter.y - quarterSize, elementCenter.z - quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f)); glPopMatrix(); - glColor3f(0.0f, 1.0f, 0.0f); glPushMatrix(); glTranslatef(elementCenter.x - quarterSize, elementCenter.y + quarterSize, elementCenter.z - quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); glPopMatrix(); - glColor3f(0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(elementCenter.x - quarterSize, elementCenter.y - quarterSize, elementCenter.z + quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); glPopMatrix(); - glColor3f(1.0f, 1.0f, 1.0f); glPushMatrix(); glTranslatef(elementCenter.x + quarterSize, elementCenter.y + quarterSize, elementCenter.z + quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); glPopMatrix(); - glColor3f(0.0f, 0.5f, 0.5f); glPushMatrix(); glTranslatef(elementCenter.x - quarterSize, elementCenter.y + quarterSize, elementCenter.z + quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(0.0f, 0.5f, 0.5f, 1.0f)); glPopMatrix(); - glColor3f(0.5f, 0.0f, 0.0f); glPushMatrix(); glTranslatef(elementCenter.x + quarterSize, elementCenter.y - quarterSize, elementCenter.z + quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(0.5f, 0.0f, 0.0f, 1.0f)); glPopMatrix(); - glColor3f(0.0f, 0.5f, 0.0f); glPushMatrix(); glTranslatef(elementCenter.x + quarterSize, elementCenter.y + quarterSize, elementCenter.z - quarterSize); - DependencyManager::get()->renderWireCube(halfSize); + DependencyManager::get()->renderWireCube(halfSize, glm::vec4(0.0f, 0.5f, 0.0f, 1.0f)); glPopMatrix(); } } @@ -473,25 +464,22 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg glm::vec3 entityBoxScale = entityBox.getScale(); // draw the max bounding cube - glColor4f(1.0f, 1.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(maxCenter.x, maxCenter.y, maxCenter.z); - DependencyManager::get()->renderWireCube(maxCube.getScale()); + DependencyManager::get()->renderWireCube(maxCube.getScale(), glm::vec4(1.0f, 1.0f, 0.0f, 1.0f)); glPopMatrix(); // draw the min bounding cube - glColor4f(0.0f, 1.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(minCenter.x, minCenter.y, minCenter.z); - DependencyManager::get()->renderWireCube(minCube.getScale()); + DependencyManager::get()->renderWireCube(minCube.getScale(), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); glPopMatrix(); // draw the entityBox bounding box - glColor4f(0.0f, 0.0f, 1.0f, 1.0f); glPushMatrix(); glTranslatef(entityBoxCenter.x, entityBoxCenter.y, entityBoxCenter.z); glScalef(entityBoxScale.x, entityBoxScale.y, entityBoxScale.z); - DependencyManager::get()->renderWireCube(1.0f); + DependencyManager::get()->renderWireCube(1.0f, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); glPopMatrix(); @@ -500,7 +488,6 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg glm::vec3 dimensions = entity->getDimensions() * (float) TREE_SCALE; glm::quat rotation = entity->getRotation(); - glColor4f(1.0f, 0.0f, 1.0f, 1.0f); glPushMatrix(); glTranslatef(position.x, position.y, position.z); glm::vec3 axis = glm::axis(rotation); @@ -509,7 +496,7 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg glm::vec3 positionToCenter = center - position; glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderWireCube(1.0f); + DependencyManager::get()->renderWireCube(1.0f, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f)); glPopMatrix(); glPopMatrix(); } diff --git a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp index 276db09477..7f2ba410d8 100644 --- a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp @@ -32,7 +32,7 @@ void RenderableBoxEntityItem::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; - glColor4f(getColor()[RED_INDEX] / MAX_COLOR, getColor()[GREEN_INDEX] / MAX_COLOR, + glm::vec4 cubeColor(getColor()[RED_INDEX] / MAX_COLOR, getColor()[GREEN_INDEX] / MAX_COLOR, getColor()[BLUE_INDEX] / MAX_COLOR, getLocalRenderAlpha()); glPushMatrix(); @@ -43,7 +43,7 @@ void RenderableBoxEntityItem::render(RenderArgs* args) { glm::vec3 positionToCenter = center - position; glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderSolidCube(1.0f); + DependencyManager::get()->renderSolidCube(1.0f, cubeColor); glPopMatrix(); glPopMatrix(); diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 699603cb21..48b30868d0 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -176,27 +176,27 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } } else { // if we couldn't get a model, then just draw a cube - glColor3ub(getColor()[RED_INDEX],getColor()[GREEN_INDEX],getColor()[BLUE_INDEX]); + glm::vec4 color(getColor()[RED_INDEX]/255, getColor()[GREEN_INDEX]/255, getColor()[BLUE_INDEX]/255, 1.0f); glPushMatrix(); glTranslatef(position.x, position.y, position.z); - DependencyManager::get()->renderWireCube(size); + DependencyManager::get()->renderWireCube(size, color); glPopMatrix(); } } else { // if we couldn't get a model, then just draw a cube - glColor3ub(getColor()[RED_INDEX],getColor()[GREEN_INDEX],getColor()[BLUE_INDEX]); + glm::vec4 color(getColor()[RED_INDEX]/255, getColor()[GREEN_INDEX]/255, getColor()[BLUE_INDEX]/255, 1.0f); glPushMatrix(); glTranslatef(position.x, position.y, position.z); - DependencyManager::get()->renderWireCube(size); + DependencyManager::get()->renderWireCube(size, color); glPopMatrix(); } } glPopMatrix(); } else { - glColor3ub(getColor()[RED_INDEX],getColor()[GREEN_INDEX],getColor()[BLUE_INDEX]); + glm::vec4 color(getColor()[RED_INDEX]/255, getColor()[GREEN_INDEX]/255, getColor()[BLUE_INDEX]/255, 1.0f); glPushMatrix(); glTranslatef(position.x, position.y, position.z); - DependencyManager::get()->renderWireCube(size); + DependencyManager::get()->renderWireCube(size, color); glPopMatrix(); } } diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index 97e3ee7869..e6ea75dfee 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -32,7 +32,7 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { glm::quat rotation = getRotation(); const float MAX_COLOR = 255.0f; - glColor4f(getColor()[RED_INDEX] / MAX_COLOR, getColor()[GREEN_INDEX] / MAX_COLOR, + glm::vec4 sphereColor(getColor()[RED_INDEX] / MAX_COLOR, getColor()[GREEN_INDEX] / MAX_COLOR, getColor()[BLUE_INDEX] / MAX_COLOR, getLocalRenderAlpha()); glPushMatrix(); @@ -46,7 +46,7 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderSolidSphere(0.5f, 15, 15); + DependencyManager::get()->renderSolidSphere(0.5f, 15, 15, sphereColor); glPopMatrix(); glPopMatrix(); }; diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index 76431b55bc..492543fd62 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -49,13 +49,13 @@ void RenderableTextEntityItem::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; xColor backgroundColor = getBackgroundColorX(); float alpha = 1.0f; //getBackgroundAlpha(); - glColor4f(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, alpha); + glm::vec4 color(backgroundColor.red / MAX_COLOR, backgroundColor.green / MAX_COLOR, backgroundColor.blue / MAX_COLOR, alpha); const float SLIGHTLY_BEHIND = -0.005f; glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, SLIGHTLY_BEHIND); glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, SLIGHTLY_BEHIND); - DependencyManager::get()->renderQuad(topLeft, bottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, color); const int FIXED_FONT_SCALING_RATIO = FIXED_FONT_POINT_SIZE * 40.0f; // this is a ratio determined through experimentation diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index fc84489a2f..59dbfd28b8 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -71,27 +71,27 @@ void DeferredLightingEffect::releaseSimpleProgram() { DependencyManager::get()->setPrimaryDrawBuffers(true, false, false); } -void DeferredLightingEffect::renderSolidSphere(float radius, int slices, int stacks) { +void DeferredLightingEffect::renderSolidSphere(float radius, int slices, int stacks, const glm::vec4& color) { bindSimpleProgram(); - DependencyManager::get()->renderSphere(radius, slices, stacks); + DependencyManager::get()->renderSphere(radius, slices, stacks, color); releaseSimpleProgram(); } -void DeferredLightingEffect::renderWireSphere(float radius, int slices, int stacks) { +void DeferredLightingEffect::renderWireSphere(float radius, int slices, int stacks, const glm::vec4& color) { bindSimpleProgram(); - DependencyManager::get()->renderSphere(radius, slices, stacks, false); + DependencyManager::get()->renderSphere(radius, slices, stacks, color, false); releaseSimpleProgram(); } -void DeferredLightingEffect::renderSolidCube(float size) { +void DeferredLightingEffect::renderSolidCube(float size, const glm::vec4& color) { bindSimpleProgram(); - DependencyManager::get()->renderSolidCube(size); + DependencyManager::get()->renderSolidCube(size, color); releaseSimpleProgram(); } -void DeferredLightingEffect::renderWireCube(float size) { +void DeferredLightingEffect::renderWireCube(float size, const glm::vec4& color) { bindSimpleProgram(); - DependencyManager::get()->renderWireCube(size); + DependencyManager::get()->renderWireCube(size, color); releaseSimpleProgram(); } @@ -153,8 +153,6 @@ void DeferredLightingEffect::prepare() { void DeferredLightingEffect::render() { // perform deferred lighting, rendering to free fbo - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glDisable(GL_BLEND); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); @@ -295,7 +293,7 @@ void DeferredLightingEffect::render() { } else { glTranslatef(light.position.x, light.position.y, light.position.z); - geometryCache->renderSphere(expandedRadius, 32, 32); + geometryCache->renderSphere(expandedRadius, 32, 32, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); } glPopMatrix(); diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index bf8bb53c92..18e52426c5 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -40,16 +40,16 @@ public: void releaseSimpleProgram(); //// Renders a solid sphere with the simple program. - void renderSolidSphere(float radius, int slices, int stacks); + void renderSolidSphere(float radius, int slices, int stacks, const glm::vec4& color); //// Renders a wireframe sphere with the simple program. - void renderWireSphere(float radius, int slices, int stacks); + void renderWireSphere(float radius, int slices, int stacks, const glm::vec4& color); //// Renders a solid cube with the simple program. - void renderSolidCube(float size); + void renderSolidCube(float size, const glm::vec4& color); //// Renders a wireframe cube with the simple program. - void renderWireCube(float size); + void renderWireCube(float size, const glm::vec4& color); //// Renders a solid cone with the simple program. void renderSolidCone(float base, float height, int slices, int stacks); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 1f4385b04d..d9a89ac4d9 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -134,7 +134,7 @@ const int NUM_COORDS_PER_VERTEX = 3; const int NUM_BYTES_PER_VERTEX = NUM_COORDS_PER_VERTEX * sizeof(GLfloat); const int NUM_BYTES_PER_INDEX = sizeof(GLushort); -void GeometryCache::renderSphere(float radius, int slices, int stacks, bool solid) { +void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid) { VerticesIndices& vbo = _sphereVBOs[IntPair(slices, stacks)]; int vertices = slices * (stacks - 1) + 2; int indices = slices * stacks * NUM_VERTICES_PER_TRIANGULATED_QUAD; @@ -478,7 +478,7 @@ void GeometryCache::renderCone(float base, float height, int slices, int stacks) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderGrid(int xDivisions, int yDivisions) { +void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& color) { QOpenGLBuffer& buffer = _gridBuffers[IntPair(xDivisions, yDivisions)]; int vertices = (xDivisions + 1 + yDivisions + 1) * 2; if (!buffer.isCreated()) { @@ -522,7 +522,7 @@ void GeometryCache::renderGrid(int xDivisions, int yDivisions) { buffer.release(); } -void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, int cols, int id) { +void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, int cols, const glm::vec4& color, int id) { bool registered = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, width), glm::vec3(height, rows, cols)); QOpenGLBuffer& buffer = registered ? _registeredAlternateGridBuffers[id] : _alternateGridBuffers[key]; @@ -606,7 +606,7 @@ void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, in buffer.release(); } -void GeometryCache::updateVertices(int id, const QVector& points) { +void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { BufferDetails& details = _registeredVertices[id]; if (details.buffer.isCreated()) { @@ -639,7 +639,7 @@ void GeometryCache::updateVertices(int id, const QVector& points) { #endif } -void GeometryCache::updateVertices(int id, const QVector& points) { +void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { BufferDetails& details = _registeredVertices[id]; if (details.buffer.isCreated()) { @@ -685,7 +685,7 @@ void GeometryCache::renderVertices(GLenum mode, int id) { } } -void GeometryCache::renderSolidCube(float size) { +void GeometryCache::renderSolidCube(float size, const glm::vec4& color) { VerticesIndices& vbo = _solidCubeVBOs[size]; const int FLOATS_PER_VERTEX = 3; const int VERTICES_PER_FACE = 4; @@ -779,7 +779,7 @@ void GeometryCache::renderSolidCube(float size) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderWireCube(float size) { +void GeometryCache::renderWireCube(float size, const glm::vec4& color) { VerticesIndices& vbo = _wireCubeVBOs[size]; const int FLOATS_PER_VERTEX = 3; const int VERTICES_PER_EDGE = 2; @@ -839,7 +839,7 @@ void GeometryCache::renderWireCube(float size) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, int id) { +void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id) { bool registeredRect = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, 0.0f), glm::vec3(width, height, bevelDistance)); VerticesIndices& vbo = registeredRect ? _registeredRectVBOs[id] : _rectVBOs[key]; @@ -939,7 +939,7 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, int id) { +void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) { bool registeredQuad = (id != UNKNOWN_ID); Vec2Pair key(minCorner, maxCorner); @@ -1022,7 +1022,8 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, - const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, int id) { + const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, + const glm::vec4& color, int id) { bool registeredQuad = (id != UNKNOWN_ID); Vec2PairPair key(Vec2Pair(minCorner, maxCorner), Vec2Pair(texCoordMinCorner, texCoordMaxCorner)); @@ -1120,7 +1121,7 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, int id) { +void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id) { bool registeredQuad = (id != UNKNOWN_ID); Vec3Pair key(minCorner, maxCorner); @@ -1537,87 +1538,96 @@ void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, glBindBuffer(GL_ARRAY_BUFFER, 0); } -void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, int id) { - bool registeredLine = (id != UNKNOWN_ID); +void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, + const glm::vec4& color1, const glm::vec4& color2, int id) { + + bool registered = (id != UNKNOWN_ID); Vec2Pair key(p1, p2); - VerticesIndices& vbo = registeredLine ? _registeredLine2DVBOs[id] : _line2DVBOs[key]; + + BatchItemDetails& details = registered ? _registeredLine2DVBOs[id] : _line2DVBOs[key]; + + int compactColor1 = ((int(color1.x * 255.0f) & 0xFF)) | + ((int(color1.y * 255.0f) & 0xFF) << 8) | + ((int(color1.z * 255.0f) & 0xFF) << 16) | + ((int(color1.w * 255.0f) & 0xFF) << 24); + + int compactColor2 = ((int(color2.x * 255.0f) & 0xFF)) | + ((int(color2.y * 255.0f) & 0xFF) << 8) | + ((int(color2.z * 255.0f) & 0xFF) << 16) | + ((int(color2.w * 255.0f) & 0xFF) << 24); + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredLine && vbo.first != 0) { + if (registered && details.isCreated) { Vec2Pair& lastKey = _lastRegisteredLine2D[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredLine2D[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderLine() 2D... RELEASING REGISTERED line"; + qDebug() << "renderLine() 2D ... RELEASING REGISTERED line"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderLine() 2D... REUSING PREVIOUSLY REGISTERED line"; + qDebug() << "renderLine() 2D ... REUSING PREVIOUSLY REGISTERED line"; } #endif // def WANT_DEBUG } const int FLOATS_PER_VERTEX = 2; - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); const int vertices = 2; - const int indices = 2; - if (vbo.first == 0) { - _lastRegisteredLine2D[id] = key; + if (!details.isCreated) { - int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1}; - - int vertexPoint = 0; + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; - // p1 - vertex[vertexPoint++] = p1.x; - vertex[vertexPoint++] = p1.y; + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); - // p2 - vertex[vertexPoint++] = p2.x; - vertex[vertexPoint++] = p2.y; - + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + + float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { p1.x, p1.y, p2.x, p2.y }; + + const int NUM_COLOR_SCALARS = 2; + int colors[NUM_COLOR_SCALARS] = { compactColor1, compactColor2 }; + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - #ifdef WANT_DEBUG if (id == UNKNOWN_ID) { - qDebug() << "new renderLine() 2D VBO made -- _line2DVBOs.size():" << _line2DVBOs.size(); + qDebug() << "new renderLine() 2D VBO made -- _line3DVBOs.size():" << _line2DVBOs.size(); } else { qDebug() << "new registered renderLine() 2D VBO made -- _registeredLine2DVBOs.size():" << _registeredLine2DVBOs.size(); } #endif - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); - glDrawRangeElementsEXT(GL_LINES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + + gpu::Batch batch; + + // this is what it takes to render a quad + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::LINES, 2, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 0e216a5bc1..1ea4d11631 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -85,30 +85,36 @@ public: static const int UNKNOWN_ID; void renderHemisphere(int slices, int stacks); - void renderSphere(float radius, int slices, int stacks, bool solid = true); void renderSquare(int xDivisions, int yDivisions); void renderHalfCylinder(int slices, int stacks); void renderCone(float base, float height, int slices, int stacks); - void renderGrid(int xDivisions, int yDivisions); - void renderGrid(int x, int y, int width, int height, int rows, int cols, int id = UNKNOWN_ID); - void renderSolidCube(float size); - void renderWireCube(float size); - void renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, int id = UNKNOWN_ID); - void renderQuad(int x, int y, int width, int height, int id = UNKNOWN_ID) - { renderQuad(glm::vec2(x,y), glm::vec2(x + width, y + height), id); } + void renderSphere(float radius, int slices, int stacks, const glm::vec3& color, bool solid = true) + { renderSphere(radius, slices, stacks, glm::vec4(color, 1.0f), solid); } + + void renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid = true); + void renderGrid(int xDivisions, int yDivisions, const glm::vec4& color); + void renderGrid(int x, int y, int width, int height, int rows, int cols, const glm::vec4& color, int id = UNKNOWN_ID); + void renderSolidCube(float size, const glm::vec4& color); + void renderWireCube(float size, const glm::vec4& color); + void renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id = UNKNOWN_ID); + + void renderQuad(int x, int y, int width, int height, const glm::vec4& color, int id = UNKNOWN_ID) + { renderQuad(glm::vec2(x,y), glm::vec2(x + width, y + height), color, id); } - void renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, int id = UNKNOWN_ID); + void renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id = UNKNOWN_ID); void renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, - const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, int id = UNKNOWN_ID); + const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, + const glm::vec4& color, int id = UNKNOWN_ID); - void renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, int id = UNKNOWN_ID); + void renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id = UNKNOWN_ID); void renderQuad(const glm::vec3& topLeft, const glm::vec3& bottomLeft, const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, - const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, int id = UNKNOWN_ID); + const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, + int id = UNKNOWN_ID); void renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& color, int id = UNKNOWN_ID) @@ -126,10 +132,23 @@ public: const glm::vec4& color1, const glm::vec4& color2, int id = UNKNOWN_ID); void renderDashedLine(const glm::vec3& start, const glm::vec3& end, int id = UNKNOWN_ID); - void renderLine(const glm::vec2& p1, const glm::vec2& p2, int id = UNKNOWN_ID); - void updateVertices(int id, const QVector& points); - void updateVertices(int id, const QVector& points); + void renderLine(const glm::vec2& p1, const glm::vec2& p2, const glm::vec3& color, int id = UNKNOWN_ID) + { renderLine(p1, p2, glm::vec4(color, 1.0f), id); } + + void renderLine(const glm::vec2& p1, const glm::vec2& p2, const glm::vec4& color, int id = UNKNOWN_ID) + { renderLine(p1, p2, color, color, id); } + + + void renderLine(const glm::vec2& p1, const glm::vec2& p2, + const glm::vec3& color1, const glm::vec3& color2, int id = UNKNOWN_ID) + { renderLine(p1, p2, glm::vec4(color1, 1.0f), glm::vec4(color2, 1.0f), id); } + + void renderLine(const glm::vec2& p1, const glm::vec2& p2, + const glm::vec4& color1, const glm::vec4& color2, int id = UNKNOWN_ID); + + void updateVertices(int id, const QVector& points, const glm::vec4& color); + void updateVertices(int id, const QVector& points, const glm::vec4& color); void renderVertices(GLenum mode, int id); /// Loads geometry from the specified URL. @@ -200,8 +219,8 @@ private: QHash _registeredLine3DVBOs; QHash _lastRegisteredLine2D; - QHash _line2DVBOs; - QHash _registeredLine2DVBOs; + QHash _line2DVBOs; + QHash _registeredLine2DVBOs; QHash _registeredVertices; diff --git a/libraries/render-utils/src/GlowEffect.cpp b/libraries/render-utils/src/GlowEffect.cpp index fb7189f61e..30daf8097c 100644 --- a/libraries/render-utils/src/GlowEffect.cpp +++ b/libraries/render-utils/src/GlowEffect.cpp @@ -167,7 +167,6 @@ QOpenGLFramebufferObject* GlowEffect::render(bool toTexture) { } glEnable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); - glColor3f(1.0f, 1.0f, 1.0f); renderFullscreenQuad(); glDisable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); diff --git a/libraries/render-utils/src/RenderUtil.cpp b/libraries/render-utils/src/RenderUtil.cpp index 140ced4c52..c27c56161a 100644 --- a/libraries/render-utils/src/RenderUtil.cpp +++ b/libraries/render-utils/src/RenderUtil.cpp @@ -17,9 +17,10 @@ #include "RenderUtil.h" void renderFullscreenQuad(float sMin, float sMax, float tMin, float tMax) { + glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f); glm::vec2 topLeft(-1.0f, -1.0f); glm::vec2 bottomRight(1.0f, 1.0f); glm::vec2 texCoordTopLeft(sMin, tMin); glm::vec2 texCoordBottomRight(sMax, tMax); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); } From 72f2e6f3aa8053f96427f33cac008d9a27593082 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 15 Jan 2015 11:37:53 -0800 Subject: [PATCH 04/98] work on colored quads --- libraries/render-utils/src/GeometryCache.cpp | 384 +++++++++---------- libraries/render-utils/src/GeometryCache.h | 21 +- 2 files changed, 199 insertions(+), 206 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 95f91e77d8..3bfff42e38 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -940,276 +940,257 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, } void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) { - - bool registeredQuad = (id != UNKNOWN_ID); + bool registered = (id != UNKNOWN_ID); Vec2Pair key(minCorner, maxCorner); - VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[id] : _quad2DVBOs[key]; - + BatchItemDetails& details = registered ? _registeredQuad2D[id] : _quad2D[key]; + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredQuad && vbo.first != 0) { + if (registered && details.isCreated) { Vec2Pair& lastKey = _lastRegisteredQuad2D[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredQuad2D[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec2... RELEASING REGISTERED QUAD"; + qDebug() << "renderQuad() 2D ... RELEASING REGISTERED"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderQuad() vec2... REUSING PREVIOUSLY REGISTERED QUAD"; + qDebug() << "renderQuad() 2D ... REUSING PREVIOUSLY REGISTERED"; } #endif // def WANT_DEBUG } - const int FLOATS_PER_VERTEX = 2; - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); + const int FLOATS_PER_VERTEX = 2; // vertices const int vertices = 4; - const int indices = 4; - if (vbo.first == 0) { - _lastRegisteredQuad2D[id] = key; - int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; - vertex[0] = minCorner.x; - vertex[1] = minCorner.y; - vertex[2] = maxCorner.x; - vertex[3] = minCorner.y; - vertex[4] = maxCorner.x; - vertex[5] = maxCorner.y; - vertex[6] = minCorner.x; - vertex[7] = maxCorner.y; - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << "new quad VBO made -- _quad2DVBOs.size():" << _quad2DVBOs.size(); - } else { - qDebug() << "new registered quad VBO made -- _registeredQuadVBOs.size():" << _registeredQuadVBOs.size(); - } - #endif + if (!details.isCreated) { + + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + + float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { + minCorner.x, minCorner.y, + maxCorner.x, minCorner.y, + maxCorner.x, maxCorner.y, + minCorner.x, maxCorner.y }; + + const int NUM_COLOR_SCALARS_PER_QUAD = 4; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor }; + + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); - glDrawRangeElementsEXT(GL_QUADS, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - glDisableClientState(GL_VERTEX_ARRAY); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); -} + gpu::Batch batch; + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::QUADS, 4, 0); + + gpu::GLBackend::renderBatch(batch); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); +} void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, const glm::vec4& color, int id) { - bool registeredQuad = (id != UNKNOWN_ID); + bool registered = (id != UNKNOWN_ID); Vec2PairPair key(Vec2Pair(minCorner, maxCorner), Vec2Pair(texCoordMinCorner, texCoordMaxCorner)); - VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[id] : _quad2DTextureVBOs[key]; - + BatchItemDetails& details = registered ? _registeredQuad2DTextures[id] : _quad2DTextures[key]; + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredQuad && vbo.first != 0) { + if (registered && details.isCreated) { Vec2PairPair& lastKey = _lastRegisteredQuad2DTexture[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredQuad2DTexture[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec2 + texture... RELEASING REGISTERED QUAD"; + qDebug() << "renderQuad() 2D+texture ... RELEASING REGISTERED"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderQuad() vec2 + texture... REUSING PREVIOUSLY REGISTERED QUAD"; + qDebug() << "renderQuad() 2D+texture ... REUSING PREVIOUSLY REGISTERED"; } #endif // def WANT_DEBUG } const int FLOATS_PER_VERTEX = 2 * 2; // text coords & vertices - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); const int vertices = 4; - const int indices = 4; - if (vbo.first == 0) { - _lastRegisteredQuad2DTexture[id] = key; - int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // text coords & vertices - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; - int v = 0; + const int NUM_POS_COORDS = 2; + const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float); - vertex[v++] = minCorner.x; - vertex[v++] = minCorner.y; - vertex[v++] = texCoordMinCorner.x; - vertex[v++] = texCoordMinCorner.y; - - vertex[v++] = maxCorner.x; - vertex[v++] = minCorner.y; - vertex[v++] = texCoordMaxCorner.x; - vertex[v++] = texCoordMinCorner.y; - - vertex[v++] = maxCorner.x; - vertex[v++] = maxCorner.y; - vertex[v++] = texCoordMaxCorner.x; - vertex[v++] = texCoordMaxCorner.y; - - vertex[v++] = minCorner.x; - vertex[v++] = maxCorner.y; - vertex[v++] = texCoordMinCorner.x; - vertex[v++] = texCoordMaxCorner.y; - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << "new quad + texture VBO made -- _quad2DTextureVBOs.size():" << _quad2DTextureVBOs.size(); - } else { - qDebug() << "new registered quad VBO made -- _registeredQuadVBOs.size():" << _registeredQuadVBOs.size(); - } - #endif - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + if (!details.isCreated) { + + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), VERTEX_TEXCOORD_OFFSET); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + + float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { + minCorner.x, minCorner.y, texCoordMinCorner.x, texCoordMinCorner.y, + maxCorner.x, minCorner.y, texCoordMaxCorner.x, texCoordMinCorner.y, + maxCorner.x, maxCorner.y, texCoordMaxCorner.x, texCoordMaxCorner.y, + minCorner.x, maxCorner.y, texCoordMinCorner.x, texCoordMaxCorner.y }; + + + const int NUM_COLOR_SCALARS_PER_QUAD = 4; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor }; + + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glVertexPointer(2, GL_FLOAT, NUM_BYTES_PER_VERTEX, 0); - glTexCoordPointer(2, GL_FLOAT, NUM_BYTES_PER_VERTEX, (const void *)(2 * sizeof(float))); + gpu::Batch batch; - glDrawRangeElementsEXT(GL_QUADS, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + glEnable(GL_TEXTURE_2D); + //glBindTexture(GL_TEXTURE_2D, _currentTextureID); // this is quad specific... + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::QUADS, 4, 0); + + gpu::GLBackend::renderBatch(batch); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); } void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id) { - - bool registeredQuad = (id != UNKNOWN_ID); + bool registered = (id != UNKNOWN_ID); Vec3Pair key(minCorner, maxCorner); - VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[id] : _quad3DVBOs[key]; - + BatchItemDetails& details = registered ? _registeredQuad3D[id] : _quad3D[key]; + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredQuad && vbo.first != 0) { + if (registered && details.isCreated) { Vec3Pair& lastKey = _lastRegisteredQuad3D[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredQuad3D[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec3... RELEASING REGISTERED QUAD"; + qDebug() << "renderQuad() 3D ... RELEASING REGISTERED"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderQuad() vec3... REUSING PREVIOUSLY REGISTERED QUAD"; + qDebug() << "renderQuad() 3D ... REUSING PREVIOUSLY REGISTERED"; } #endif // def WANT_DEBUG } - const int FLOATS_PER_VERTEX = 3; - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); + const int FLOATS_PER_VERTEX = 3; // vertices const int vertices = 4; - const int indices = 4; - if (vbo.first == 0) { - _lastRegisteredQuad3D[id] = key; - int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; - int v = 0; - vertex[v++] = minCorner.x; - vertex[v++] = minCorner.y; - vertex[v++] = minCorner.z; + if (!details.isCreated) { - vertex[v++] = maxCorner.x; - vertex[v++] = minCorner.y; - vertex[v++] = minCorner.z; + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; - vertex[v++] = maxCorner.x; - vertex[v++] = maxCorner.y; - vertex[v++] = maxCorner.z; + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); - vertex[v++] = minCorner.x; - vertex[v++] = maxCorner.y; - vertex[v++] = maxCorner.z; - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << "new quad VBO made -- _quad3DVBOs.size():" << _quad3DVBOs.size(); - } else { - qDebug() << "new registered quad VBO made -- _registeredQuadVBOs.size():" << _registeredQuadVBOs.size(); - } - #endif + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + + float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { + minCorner.x, minCorner.y, minCorner.z, + maxCorner.x, minCorner.y, minCorner.z, + maxCorner.x, maxCorner.y, maxCorner.z, + minCorner.x, maxCorner.y, maxCorner.z }; + + const int NUM_COLOR_SCALARS_PER_QUAD = 4; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor }; + + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); - glDrawRangeElementsEXT(GL_QUADS, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - glDisableClientState(GL_VERTEX_ARRAY); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); -} + gpu::Batch batch; + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::QUADS, 4, 0); + + gpu::GLBackend::renderBatch(batch); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); +} void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottomLeft, const glm::vec3& bottomRight, const glm::vec3& topRight, @@ -1407,6 +1388,7 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en details.buffer.release(); } + int GeometryCache::BatchItemDetails::population = 0; GeometryCache::BatchItemDetails::BatchItemDetails() : verticesBuffer(NULL), @@ -1435,7 +1417,7 @@ GeometryCache::BatchItemDetails::BatchItemDetails(const GeometryCache::BatchItem GeometryCache::BatchItemDetails::~BatchItemDetails() { population--; clear(); - qDebug() << "~BatchItemDetails()... population:" << population << "**********************************"; + //qDebug() << "~BatchItemDetails()... population:" << population << "**********************************"; } void GeometryCache::BatchItemDetails::clear() { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index ba1c32d51f..d9fb218a03 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -199,17 +199,28 @@ private: QHash _wireCubeVBOs; QHash _solidCubeVBOs; QHash _quad2DVBOs; - QHash _quad2DTextureVBOs; - QHash _quad3DVBOs; + QHash _quad2DTextureVBOs; + //QHash _quad3DVBOs; QHash _quad3DTextureVBOs; QHash _registeredQuadVBOs; int _nextID; - QHash _lastRegisteredQuad2D; - QHash _lastRegisteredQuad2DTexture; - QHash _lastRegisteredQuad3D; QHash _lastRegisteredQuad3DTexture; + + QHash _lastRegisteredQuad2DTexture; + QHash _quad2DTextures; + QHash _registeredQuad2DTextures; + + QHash _lastRegisteredQuad3D; + QHash _quad3D; + QHash _registeredQuad3D; + + QHash _lastRegisteredQuad2D; + QHash _quad2D; + QHash _registeredQuad2D; + + QHash _lastRegisteredRect; QHash _rectVBOs; QHash _registeredRectVBOs; From 149f3654100551650eeed1cb579a18427fdf55f7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 15 Jan 2015 11:55:45 -0800 Subject: [PATCH 05/98] fix colors for renderBevelCornersRect() --- libraries/render-utils/src/GeometryCache.cpp | 109 ++++++++++--------- libraries/render-utils/src/GeometryCache.h | 7 +- 2 files changed, 61 insertions(+), 55 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 3bfff42e38..0ab2a1a4cc 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -840,40 +840,55 @@ void GeometryCache::renderWireCube(float size, const glm::vec4& color) { } void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id) { - bool registeredRect = (id != UNKNOWN_ID); + bool registered = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, 0.0f), glm::vec3(width, height, bevelDistance)); - VerticesIndices& vbo = registeredRect ? _registeredRectVBOs[id] : _rectVBOs[key]; - + BatchItemDetails& details = registered ? _registeredBevelRects[id] : _bevelRects[key]; // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredRect && vbo.first != 0) { - Vec3Pair& lastKey = _lastRegisteredRect[id]; + if (registered && details.isCreated) { + Vec3Pair& lastKey = _lastRegisteredBevelRects[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredBevelRects[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderBevelCornersRect()... RELEASING REGISTERED RECT"; + qDebug() << "renderBevelCornersRect()... RELEASING REGISTERED"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderBevelCornersRect()... REUSING PREVIOUSLY REGISTERED RECT"; + qDebug() << "renderBevelCornersRect()... REUSING PREVIOUSLY REGISTERED"; } #endif // def WANT_DEBUG } - const int FLOATS_PER_VERTEX = 2; - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); + const int FLOATS_PER_VERTEX = 2; // vertices const int vertices = 8; - const int indices = 8; - if (vbo.first == 0) { - _lastRegisteredRect[id] = key; + + if (!details.isCreated) { + + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3, 4, 5, 6, 7}; - + GLfloat* vertexBuffer = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad + GLfloat* vertex = vertexBuffer; int vertexPoint = 0; // left side @@ -902,41 +917,33 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, vertex[vertexPoint++] = x +bevelDistance; vertex[vertexPoint++] = y; - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << "new rect VBO made -- _rectVBOs.size():" << _rectVBOs.size(); - } else { - qDebug() << "new registered rect VBO made -- _registeredRectVBOs.size():" << _registeredRectVBOs.size(); - } - #endif - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + const int NUM_COLOR_SCALARS_PER_QUAD = 8; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor }; + + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); + + delete[] vertexBuffer; } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); - glDrawRangeElementsEXT(GL_POLYGON, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + + gpu::Batch batch; + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::QUADS, 4, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index d9fb218a03..e42a34813d 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -220,10 +220,9 @@ private: QHash _quad2D; QHash _registeredQuad2D; - - QHash _lastRegisteredRect; - QHash _rectVBOs; - QHash _registeredRectVBOs; + QHash _lastRegisteredBevelRects; + QHash _bevelRects; + QHash _registeredBevelRects; QHash _lastRegisteredLine3D; QHash _line3DVBOs; From daafa20ec62f19938e534c8cb67413cd187ee951 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 15 Jan 2015 17:00:08 -0800 Subject: [PATCH 06/98] first cut at moving wire cube to support gpu streams --- libraries/render-utils/src/GeometryCache.cpp | 88 +++++++++++++------- libraries/render-utils/src/GeometryCache.h | 10 ++- 2 files changed, 67 insertions(+), 31 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 0ab2a1a4cc..8de81aef68 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -780,7 +780,8 @@ void GeometryCache::renderSolidCube(float size, const glm::vec4& color) { } void GeometryCache::renderWireCube(float size, const glm::vec4& color) { - VerticesIndices& vbo = _wireCubeVBOs[size]; + + Vec2Pair colorKey(glm::vec2(color.x, color.y),glm::vec2(color.z, color.y)); const int FLOATS_PER_VERTEX = 3; const int VERTICES_PER_EDGE = 2; const int TOP_EDGES = 4; @@ -788,7 +789,11 @@ void GeometryCache::renderWireCube(float size, const glm::vec4& color) { const int SIDE_EDGES = 4; const int vertices = 8; const int indices = (TOP_EDGES + BOTTOM_EDGES + SIDE_EDGES) * VERTICES_PER_EDGE; - if (vbo.first == 0) { + + if (!_cubeVerticies.contains(size)) { + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + _cubeVerticies[size] = verticesBuffer; + int vertexPoints = vertices * FLOATS_PER_VERTEX; GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a wire cube GLfloat* vertex = vertexData; @@ -799,42 +804,65 @@ void GeometryCache::renderWireCube(float size, const glm::vec4& color) { 1,-1, 1, 1,-1,-1, -1,-1,-1, -1,-1, 1 // v4, v5, v6, v7 (bottom) }; - // index array of vertex array for glDrawRangeElement() as a GL_LINES for each edge + for (int i = 0; i < vertexPoints; i++) { + vertex[i] = cannonicalVertices[i] * halfSize; + } + + verticesBuffer->append(sizeof(GLfloat) * vertexPoints, (gpu::Buffer::Byte*) vertexData); // I'm skeptical that this is right + } + + if (!_wireCubeIndexBuffer) { static GLubyte cannonicalIndices[indices] = { 0, 1, 1, 2, 2, 3, 3, 0, // (top) 4, 5, 5, 6, 6, 7, 7, 4, // (bottom) 0, 4, 1, 5, 2, 6, 3, 7, // (side edges) }; - - for (int i = 0; i < vertexPoints; i++) { - vertex[i] = cannonicalVertices[i] * halfSize; - } - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; + + gpu::BufferPointer indexBuffer(new gpu::Buffer()); + _wireCubeIndexBuffer = indexBuffer; - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + _wireCubeIndexBuffer->append(sizeof(cannonicalIndices), (gpu::Buffer::Byte*) cannonicalIndices); } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); - glDrawRangeElementsEXT(GL_LINES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - glDisableClientState(GL_VERTEX_ARRAY); + + if (!_cubeColors.contains(colorKey)) { + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + _cubeColors[colorKey] = colorBuffer; + + const int NUM_COLOR_SCALARS_PER_CUBE = 8; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_CUBE] = { compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor }; + + colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); + } + gpu::BufferPointer verticesBuffer = _cubeVerticies[size]; + gpu::BufferPointer colorBuffer = _cubeColors[colorKey]; + + const int VERTICES_SLOT = 0; + const int COLOR_SLOT = 1; + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); // 1 for everyone + streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + gpu::BufferView verticesView(verticesBuffer, streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); + gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); + + gpu::Batch batch; + + batch.setInputFormat(streamFormat); + batch.setInputBuffer(VERTICES_SLOT, verticesView); + batch.setInputBuffer(COLOR_SLOT, colorView); + batch.setIndexBuffer(gpu::UINT8, _wireCubeIndexBuffer, 0); + batch.drawIndexed(gpu::LINES, indices); + + gpu::GLBackend::renderBatch(batch); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index e42a34813d..dd743b802d 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -47,6 +47,11 @@ inline uint qHash(const Vec2Pair& v, uint seed) { return qHash(v.first.x + 5009 * v.first.y + 5011 * v.second.x + 5021 * v.second.y, seed); } +inline uint qHash(const glm::vec4& v, uint seed) { + // multiply by prime numbers greater than the possible size + return qHash(v.x + 5009 * v.y + 5011 * v.z + 5021 * v.w, seed); +} + inline uint qHash(const Vec2PairPair& v, uint seed) { // multiply by prime numbers greater than the possible size return qHash(v.first.first.x + 5009 * v.first.first.y @@ -74,7 +79,6 @@ inline uint qHash(const Vec3PairVec2Pair& v, uint seed) { 5077 * v.second.second.x + 5081 * v.second.second.y, seed); } - /// Stores cached geometry. class GeometryCache : public ResourceCache, public Dependency { Q_OBJECT @@ -173,6 +177,10 @@ private: int vertexSize; }; + QHash _cubeVerticies; + QHash _cubeColors; + gpu::BufferPointer _wireCubeIndexBuffer; + class BatchItemDetails { public: static int population; From 439a1c04957bb49cd8a5350c13669ccfb6719cba Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 15 Jan 2015 18:46:44 -0800 Subject: [PATCH 07/98] solid cube now streamizing --- libraries/gpu/src/gpu/Resource.h | 8 ++ libraries/render-utils/src/GeometryCache.cpp | 131 +++++++++++-------- libraries/render-utils/src/GeometryCache.h | 4 + 3 files changed, 92 insertions(+), 51 deletions(-) diff --git a/libraries/gpu/src/gpu/Resource.h b/libraries/gpu/src/gpu/Resource.h index 2ec616251c..694b4b5592 100644 --- a/libraries/gpu/src/gpu/Resource.h +++ b/libraries/gpu/src/gpu/Resource.h @@ -200,6 +200,14 @@ public: _element(element), _stride(uint16(element.getSize())) {}; + BufferView(const BufferPointer& buffer, Size offset, Size size, uint16 stride, const Element& element = Element(gpu::SCALAR, gpu::UINT8, gpu::RAW)) : + _buffer(buffer), + _offset(offset), + _size(size), + _element(element), + _stride(stride) + {}; + ~BufferView() {} BufferView(const BufferView& view) = default; BufferView& operator=(const BufferView& view) = default; diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 8de81aef68..75fb2171f7 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -686,20 +686,26 @@ void GeometryCache::renderVertices(GLenum mode, int id) { } void GeometryCache::renderSolidCube(float size, const glm::vec4& color) { - VerticesIndices& vbo = _solidCubeVBOs[size]; + Vec2Pair colorKey(glm::vec2(color.x, color.y),glm::vec2(color.z, color.y)); const int FLOATS_PER_VERTEX = 3; const int VERTICES_PER_FACE = 4; const int NUMBER_OF_FACES = 6; const int TRIANGLES_PER_FACE = 2; const int VERTICES_PER_TRIANGLE = 3; - const int vertices = NUMBER_OF_FACES * VERTICES_PER_FACE * FLOATS_PER_VERTEX; + const int vertices = NUMBER_OF_FACES * VERTICES_PER_FACE; const int indices = NUMBER_OF_FACES * TRIANGLES_PER_FACE * VERTICES_PER_TRIANGLE; const int vertexPoints = vertices * FLOATS_PER_VERTEX; - if (vbo.first == 0) { + const int VERTEX_STRIDE = sizeof(GLfloat) * FLOATS_PER_VERTEX * 2; // vertices and normals + const int NORMALS_OFFSET = sizeof(GLfloat) * FLOATS_PER_VERTEX; + + if (!_solidCubeVerticies.contains(size)) { + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + _solidCubeVerticies[size] = verticesBuffer; + GLfloat* vertexData = new GLfloat[vertexPoints * 2]; // vertices and normals GLfloat* vertex = vertexData; float halfSize = size / 2.0f; - + static GLfloat cannonicalVertices[vertexPoints] = { 1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, // v0,v1,v2,v3 (front) 1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, // v0,v3,v4,v5 (right) @@ -717,7 +723,26 @@ void GeometryCache::renderSolidCube(float size, const glm::vec4& color) { 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7,v4,v3,v2 (bottom) 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1 }; // v4,v7,v6,v5 (back) - // index array of vertex array for glDrawElements() & glDrawRangeElement() + + GLfloat* cannonicalVertex = &cannonicalVertices[0]; + GLfloat* cannonicalNormal = &cannonicalNormals[0]; + + for (int i = 0; i < vertices; i++) { + // vertices + *(vertex++) = halfSize * *cannonicalVertex++; + *(vertex++) = halfSize * *cannonicalVertex++; + *(vertex++) = halfSize * *cannonicalVertex++; + + //normals + *(vertex++) = *cannonicalNormal++; + *(vertex++) = *cannonicalNormal++; + *(vertex++) = *cannonicalNormal++; + } + + verticesBuffer->append(sizeof(GLfloat) * vertexPoints * 2, (gpu::Buffer::Byte*) vertexData); + } + + if (!_solidCubeIndexBuffer) { static GLubyte cannonicalIndices[indices] = { 0, 1, 2, 2, 3, 0, // front 4, 5, 6, 6, 7, 4, // right @@ -725,62 +750,66 @@ void GeometryCache::renderSolidCube(float size, const glm::vec4& color) { 12,13,14, 14,15,12, // left 16,17,18, 18,19,16, // bottom 20,21,22, 22,23,20 }; // back - - - GLfloat* cannonicalVertex = &cannonicalVertices[0]; - GLfloat* cannonicalNormal = &cannonicalNormals[0]; - - for (int i = 0; i < vertices; i++) { - //normals - *(vertex++) = *cannonicalNormal++; - *(vertex++) = *cannonicalNormal++; - *(vertex++) = *cannonicalNormal++; - - // vertices - *(vertex++) = halfSize * *cannonicalVertex++; - *(vertex++) = halfSize * *cannonicalVertex++; - *(vertex++) = halfSize * *cannonicalVertex++; - - } - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; + gpu::BufferPointer indexBuffer(new gpu::Buffer()); + _solidCubeIndexBuffer = indexBuffer; - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + _solidCubeIndexBuffer->append(sizeof(cannonicalIndices), (gpu::Buffer::Byte*) cannonicalIndices); } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, 6 * sizeof(float), 0); - glVertexPointer(3, GL_FLOAT, (6 * sizeof(float)), (const void *)(3 * sizeof(float))); - - glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); + if (!_solidCubeColors.contains(colorKey)) { + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + _solidCubeColors[colorKey] = colorBuffer; + + const int NUM_COLOR_SCALARS_PER_CUBE = 24; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_CUBE] = { compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor }; + + colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); + } + gpu::BufferPointer verticesBuffer = _solidCubeVerticies[size]; + gpu::BufferPointer colorBuffer = _solidCubeColors[colorKey]; + + const int VERTICES_SLOT = 0; + const int NORMALS_SLOT = 1; + const int COLOR_SLOT = 2; + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); // 1 for everyone + streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + streamFormat->setAttribute(gpu::Stream::NORMAL, NORMALS_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)); + streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + gpu::BufferView verticesView(verticesBuffer, 0, verticesBuffer->getSize(), VERTEX_STRIDE, streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); + gpu::BufferView normalsView(verticesBuffer, NORMALS_OFFSET, verticesBuffer->getSize(), VERTEX_STRIDE, streamFormat->getAttributes().at(gpu::Stream::NORMAL)._element); + gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); + + gpu::Batch batch; + + batch.setInputFormat(streamFormat); + batch.setInputBuffer(VERTICES_SLOT, verticesView); + batch.setInputBuffer(NORMALS_SLOT, normalsView); + batch.setInputBuffer(COLOR_SLOT, colorView); + batch.setIndexBuffer(gpu::UINT8, _solidCubeIndexBuffer, 0); + batch.drawIndexed(gpu::TRIANGLES, indices); + + gpu::GLBackend::renderBatch(batch); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void GeometryCache::renderWireCube(float size, const glm::vec4& color) { - Vec2Pair colorKey(glm::vec2(color.x, color.y),glm::vec2(color.z, color.y)); const int FLOATS_PER_VERTEX = 3; const int VERTICES_PER_EDGE = 2; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index dd743b802d..1a9230a23a 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -180,6 +180,10 @@ private: QHash _cubeVerticies; QHash _cubeColors; gpu::BufferPointer _wireCubeIndexBuffer; + + QHash _solidCubeVerticies; + QHash _solidCubeColors; + gpu::BufferPointer _solidCubeIndexBuffer; class BatchItemDetails { public: From bddb7856afdeef872a655314ddf97e76734a5e8c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 19 Jan 2015 13:34:09 -0800 Subject: [PATCH 08/98] more work --- interface/src/audio/AudioScope.cpp | 2 +- interface/src/avatar/Avatar.cpp | 3 +- interface/src/avatar/SkeletonModel.cpp | 2 +- interface/src/ui/ApplicationOverlay.cpp | 4 +- interface/src/ui/overlays/Circle3DOverlay.cpp | 10 +- interface/src/ui/overlays/ImageOverlay.cpp | 5 +- .../src/ui/overlays/Rectangle3DOverlay.cpp | 2 +- libraries/gpu/src/gpu/Batch.h | 2 + libraries/gpu/src/gpu/GLBackend.cpp | 2 + libraries/render-utils/src/GeometryCache.cpp | 176 +++++++++++++----- libraries/render-utils/src/GeometryCache.h | 8 +- libraries/render-utils/src/RenderUtil.cpp | 1 + 12 files changed, 150 insertions(+), 67 deletions(-) diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index 79e52fb5f5..b2e6d35dcf 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -195,7 +195,7 @@ void AudioScope::renderLineStrip(int id, const glm::vec4& color, int x, int y, i geometryCache->updateVertices(id, points, color); - geometryCache->renderVertices(GL_LINE_STRIP, id); + geometryCache->renderVertices(gpu::LINE_STRIP, id); glColor4f(1, 1, 1, 1); } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 690322201b..92f2b72352 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -574,7 +574,6 @@ void Avatar::renderBillboard() { glm::vec2 texCoordBottomRight(1.0f, 1.0f); DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); - glPopMatrix(); @@ -990,7 +989,7 @@ void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, // TODO: this is really inefficient constantly recreating these vertices buffers. It would be // better if the avatars cached these buffers for each of the joints they are rendering geometryCache->updateVertices(_jointConesID, points, color); - geometryCache->renderVertices(GL_TRIANGLES, _jointConesID); + geometryCache->renderVertices(gpu::TRIANGLES, _jointConesID); } } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 5e179a341c..296ff6fee9 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -367,7 +367,7 @@ void SkeletonModel::renderJointConstraints(int jointIndex) { // TODO: this is really inefficient constantly recreating these vertices buffers. It would be // better if the skeleton model cached these buffers for each of the joints they are rendering geometryCache->updateVertices(_triangleFanID, points, color); - geometryCache->renderVertices(GL_TRIANGLE_FAN, _triangleFanID); + geometryCache->renderVertices(gpu::TRIANGLE_FAN, _triangleFanID); } glPopMatrix(); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 8bf2755509..1a57a16bef 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -767,7 +767,7 @@ void ApplicationOverlay::renderMagnifier(glm::vec2 magPos, float sizeMult, bool glDisable(GL_TEXTURE_2D); glLineWidth(1.0f); //Outer Line - geometryCache->renderVertices(GL_LINE_STRIP, _magnifierBorder); + geometryCache->renderVertices(gpu::LINE_STRIP, _magnifierBorder); glEnable(GL_TEXTURE_2D); } glColor4f(1.0f, 1.0f, 1.0f, _alpha); @@ -970,7 +970,7 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder() { glLineWidth(CONNECTION_STATUS_BORDER_LINE_WIDTH); - geometryCache->renderVertices(GL_LINE_STRIP, _domainStatusBorder); + geometryCache->renderVertices(gpu::LINE_STRIP, _domainStatusBorder); } } diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 8244532d5a..f890999174 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -164,7 +164,7 @@ void Circle3DOverlay::render(RenderArgs* args) { geometryCache->updateVertices(_quadVerticesID, points, color); } - geometryCache->renderVertices(GL_QUAD_STRIP, _quadVerticesID); + geometryCache->renderVertices(gpu::QUAD_STRIP, _quadVerticesID); } else { if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { @@ -203,9 +203,9 @@ void Circle3DOverlay::render(RenderArgs* args) { } if (getIsDashedLine()) { - geometryCache->renderVertices(GL_LINES, _lineVerticesID); + geometryCache->renderVertices(gpu::LINES, _lineVerticesID); } else { - geometryCache->renderVertices(GL_LINE_STRIP, _lineVerticesID); + geometryCache->renderVertices(gpu::LINE_STRIP, _lineVerticesID); } } @@ -280,9 +280,9 @@ void Circle3DOverlay::render(RenderArgs* args) { geometryCache->updateVertices(_minorTicksVerticesID, minorPoints, minorColor); } - geometryCache->renderVertices(GL_LINES, _majorTicksVerticesID); + geometryCache->renderVertices(gpu::LINES, _majorTicksVerticesID); - geometryCache->renderVertices(GL_LINES, _minorTicksVerticesID); + geometryCache->renderVertices(gpu::LINES, _minorTicksVerticesID); } diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 169a3eaa3d..416643a846 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -89,7 +89,7 @@ void ImageOverlay::render(RenderArgs* args) { float imageWidth = _textureImage.width(); float imageHeight = _textureImage.height(); - + QRect fromImage; if (_wantClipFromImage) { fromImage = _fromImage; @@ -114,7 +114,8 @@ void ImageOverlay::render(RenderArgs* args) { glm::vec2 texCoordTopLeft(x, 1.0f - y); glm::vec2 texCoordBottomRight(x + w, 1.0f - (y + h)); - if (_renderImage) { + // if for some reason our image is not over 0 width or height, don't attempt to render the image + if (_renderImage && imageWidth > 0 && imageHeight > 0) { DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); } else { DependencyManager::get()->renderQuad(topLeft, bottomRight, quadColor); diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 45873380c4..0c81e932a3 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -100,7 +100,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) { _previousHalfDimensions = halfDimensions; } - geometryCache->renderVertices(GL_LINE_STRIP, _geometryCacheID); + geometryCache->renderVertices(gpu::LINE_STRIP, _geometryCacheID); } } diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index c3a87c8f19..f73ab66d14 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -45,7 +45,9 @@ enum Primitive { LINE_STRIP, TRIANGLES, TRIANGLE_STRIP, + TRIANGLE_FAN, QUADS, + QUAD_STRIP, NUM_PRIMITIVES, }; diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index f5f998d0d9..bd369c0806 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -93,7 +93,9 @@ static const GLenum _primitiveToGLmode[NUM_PRIMITIVES] = { GL_LINE_STRIP, GL_TRIANGLES, GL_TRIANGLE_STRIP, + GL_TRIANGLE_FAN, GL_QUADS, + GL_QUAD_STRIP, }; static const GLenum _elementTypeToGLType[NUM_TYPES]= { diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 75fb2171f7..8d0b7f276a 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -607,81 +607,149 @@ void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, in } void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { - BufferDetails& details = _registeredVertices[id]; + qDebug() << "GeometryCache::updateVertices(id=" << id <<")..."; + BatchItemDetails& details = _registeredVertices[id]; - if (details.buffer.isCreated()) { - details.buffer.destroy(); + if (details.isCreated) { + details.clear(); #ifdef WANT_DEBUG qDebug() << "updateVertices()... RELEASING REGISTERED"; #endif // def WANT_DEBUG } const int FLOATS_PER_VERTEX = 2; + details.isCreated = true; details.vertices = points.size(); details.vertexSize = FLOATS_PER_VERTEX; + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + details.vertices = points.size(); + details.vertexSize = FLOATS_PER_VERTEX; + + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + GLfloat* vertexData = new GLfloat[details.vertices * FLOATS_PER_VERTEX]; GLfloat* vertex = vertexData; + int* colorData = new int[details.vertices]; + int* colorDataAt = colorData; + foreach (const glm::vec2& point, points) { *(vertex++) = point.x; *(vertex++) = point.y; + + *(colorDataAt++) = compactColor; } - details.buffer.create(); - details.buffer.setUsagePattern(QOpenGLBuffer::StaticDraw); - details.buffer.bind(); - details.buffer.allocate(vertexData, details.vertices * FLOATS_PER_VERTEX * sizeof(GLfloat)); - delete[] vertexData; - - #ifdef WANT_DEBUG - qDebug() << "new registered vertices buffer made -- _registeredVertices.size():" << _registeredVertices.size(); - #endif -} - -void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { - BufferDetails& details = _registeredVertices[id]; - - if (details.buffer.isCreated()) { - details.buffer.destroy(); - #ifdef WANT_DEBUG - qDebug() << "updateVertices()... RELEASING REGISTERED"; - #endif // def WANT_DEBUG - } - - const int FLOATS_PER_VERTEX = 3; - details.vertices = points.size(); - details.vertexSize = FLOATS_PER_VERTEX; - - GLfloat* vertexData = new GLfloat[details.vertices * FLOATS_PER_VERTEX]; - GLfloat* vertex = vertexData; - - foreach (const glm::vec3& point, points) { - *(vertex++) = point.x; - *(vertex++) = point.y; - *(vertex++) = point.z; - } - - details.buffer.create(); - details.buffer.setUsagePattern(QOpenGLBuffer::StaticDraw); - details.buffer.bind(); - details.buffer.allocate(vertexData, details.vertices * FLOATS_PER_VERTEX * sizeof(GLfloat)); + details.verticesBuffer->append(FLOATS_PER_VERTEX * details.vertices, (gpu::Buffer::Byte*) vertexData); + details.colorBuffer->append(sizeof(int) * details.vertices, (gpu::Buffer::Byte*) colorData); delete[] vertexData; + delete[] colorData; #ifdef WANT_DEBUG qDebug() << "new registered linestrip buffer made -- _registeredVertices.size():" << _registeredVertices.size(); #endif } -void GeometryCache::renderVertices(GLenum mode, int id) { - BufferDetails& details = _registeredVertices[id]; - if (details.buffer.isCreated()) { - details.buffer.bind(); - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(details.vertexSize, GL_FLOAT, 0, 0); - glDrawArrays(mode, 0, details.vertices); +void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { + qDebug() << "GeometryCache::updateVertices(id=" << id <<")..."; + BatchItemDetails& details = _registeredVertices[id]; + + if (details.isCreated) { + details.clear(); + #ifdef WANT_DEBUG + qDebug() << "updateVertices()... RELEASING REGISTERED"; + #endif // def WANT_DEBUG + } + + const int FLOATS_PER_VERTEX = 3; + details.isCreated = true; + details.vertices = points.size(); + details.vertexSize = FLOATS_PER_VERTEX; + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + details.vertices = points.size(); + details.vertexSize = FLOATS_PER_VERTEX; + + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + + GLfloat* vertexData = new GLfloat[details.vertices * FLOATS_PER_VERTEX]; + GLfloat* vertex = vertexData; + + int* colorData = new int[details.vertices]; + int* colorDataAt = colorData; + + foreach (const glm::vec3& point, points) { + *(vertex++) = point.x; + *(vertex++) = point.y; + *(vertex++) = point.z; + + *(colorDataAt++) = compactColor; + } + + details.verticesBuffer->append(FLOATS_PER_VERTEX * details.vertices, (gpu::Buffer::Byte*) vertexData); + details.colorBuffer->append(sizeof(int) * details.vertices, (gpu::Buffer::Byte*) colorData); + delete[] vertexData; + delete[] colorData; + + #ifdef WANT_DEBUG + qDebug() << "new registered linestrip buffer made -- _registeredVertices.size():" << _registeredVertices.size(); + #endif +} + +void GeometryCache::renderVertices(gpu::Primitive primitiveType, int id) { + qDebug() << "GeometryCache::renderVertices(id=" << id <<")..."; + + BatchItemDetails& details = _registeredVertices[id]; + if (details.isCreated) { + gpu::Batch batch; + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(primitiveType, details.vertices, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - details.buffer.release(); + glDisableClientState(GL_COLOR_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); } } @@ -897,6 +965,7 @@ void GeometryCache::renderWireCube(float size, const glm::vec4& color) { } void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id) { + qDebug() << "GeometryCache::renderBevelCornersRect(id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, 0.0f), glm::vec3(width, height, bevelDistance)); BatchItemDetails& details = registered ? _registeredBevelRects[id] : _bevelRects[key]; @@ -1004,6 +1073,7 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, } void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) { + qDebug() << "GeometryCache::renderQuad(vec2,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec2Pair key(minCorner, maxCorner); BatchItemDetails& details = registered ? _registeredQuad2D[id] : _quad2D[key]; @@ -1087,6 +1157,7 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, const glm::vec4& color, int id) { + qDebug() << "GeometryCache::renderQuad(vec2/texture,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec2PairPair key(Vec2Pair(minCorner, maxCorner), Vec2Pair(texCoordMinCorner, texCoordMaxCorner)); BatchItemDetails& details = registered ? _registeredQuad2DTextures[id] : _quad2DTextures[key]; @@ -1177,6 +1248,7 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC } void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id) { + qDebug() << "GeometryCache::renderQuad(vec3,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(minCorner, maxCorner); BatchItemDetails& details = registered ? _registeredQuad3D[id] : _quad3D[key]; @@ -1464,6 +1536,7 @@ GeometryCache::BatchItemDetails::BatchItemDetails() : isCreated(false) { population++; + qDebug() << "BatchItemDetails()... population:" << population << "**********************************"; } GeometryCache::BatchItemDetails::BatchItemDetails(const GeometryCache::BatchItemDetails& other) : @@ -1476,12 +1549,13 @@ GeometryCache::BatchItemDetails::BatchItemDetails(const GeometryCache::BatchItem isCreated(other.isCreated) { population++; + qDebug() << "BatchItemDetails()... population:" << population << "**********************************"; } GeometryCache::BatchItemDetails::~BatchItemDetails() { population--; clear(); - //qDebug() << "~BatchItemDetails()... population:" << population << "**********************************"; + qDebug() << "~BatchItemDetails()... population:" << population << "**********************************"; } void GeometryCache::BatchItemDetails::clear() { @@ -1495,6 +1569,7 @@ void GeometryCache::BatchItemDetails::clear() { void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec4& color1, const glm::vec4& color2, int id) { + qDebug() << "GeometryCache::renderLine(vec3)..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(p1, p2); @@ -1587,6 +1662,7 @@ void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, const glm::vec4& color1, const glm::vec4& color2, int id) { + qDebug() << "GeometryCache::renderLine(vec2)..."; bool registered = (id != UNKNOWN_ID); Vec2Pair key(p1, p2); diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 1a9230a23a..3aa18efb7e 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -25,7 +25,9 @@ #include -#include "gpu/Stream.h" +#include +#include + class NetworkGeometry; class NetworkMesh; @@ -153,7 +155,7 @@ public: void updateVertices(int id, const QVector& points, const glm::vec4& color); void updateVertices(int id, const QVector& points, const glm::vec4& color); - void renderVertices(GLenum mode, int id); + void renderVertices(gpu::Primitive primitiveType, int id); /// Loads geometry from the specified URL. /// \param fallback a fallback URL to load if the desired one is unavailable @@ -244,7 +246,7 @@ private: QHash _line2DVBOs; QHash _registeredLine2DVBOs; - QHash _registeredVertices; + QHash _registeredVertices; QHash _lastRegisteredDashedLines; QHash _dashedLines; diff --git a/libraries/render-utils/src/RenderUtil.cpp b/libraries/render-utils/src/RenderUtil.cpp index c27c56161a..7744817625 100644 --- a/libraries/render-utils/src/RenderUtil.cpp +++ b/libraries/render-utils/src/RenderUtil.cpp @@ -22,5 +22,6 @@ void renderFullscreenQuad(float sMin, float sMax, float tMin, float tMax) { glm::vec2 bottomRight(1.0f, 1.0f); glm::vec2 texCoordTopLeft(sMin, tMin); glm::vec2 texCoordBottomRight(sMax, tMax); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, color); } From ef82aac7a5555410b2b544fddaf3bf44dfea3e81 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 19 Jan 2015 14:48:19 -0800 Subject: [PATCH 09/98] removed some debug, fixed a type mismatch for vec2 vs vec3 --- libraries/render-utils/src/GeometryCache.cpp | 22 ++++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 8d0b7f276a..67af878c52 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -607,7 +607,7 @@ void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, in } void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { - qDebug() << "GeometryCache::updateVertices(id=" << id <<")..."; + qDebug() << "GeometryCache::updateVertices(vec2.... id=" << id <<")..."; BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { @@ -632,7 +632,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con details.streamFormat = streamFormat; details.stream = stream; - details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::POS_XYZ), 0); details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); @@ -652,7 +652,11 @@ void GeometryCache::updateVertices(int id, const QVector& points, con int* colorData = new int[details.vertices]; int* colorDataAt = colorData; + //qDebug() << " details.vertices:" << details.vertices; + //qDebug() << " points.size:" << points.size(); + foreach (const glm::vec2& point, points) { + //qDebug() << " point:" << point; *(vertex++) = point.x; *(vertex++) = point.y; @@ -670,7 +674,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con } void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { - qDebug() << "GeometryCache::updateVertices(id=" << id <<")..."; + //qDebug() << "GeometryCache::updateVertices(id=" << id <<")..."; BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { @@ -965,7 +969,7 @@ void GeometryCache::renderWireCube(float size, const glm::vec4& color) { } void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id) { - qDebug() << "GeometryCache::renderBevelCornersRect(id=" << id <<")..."; + //qDebug() << "GeometryCache::renderBevelCornersRect(id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, 0.0f), glm::vec3(width, height, bevelDistance)); BatchItemDetails& details = registered ? _registeredBevelRects[id] : _bevelRects[key]; @@ -1073,7 +1077,7 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, } void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) { - qDebug() << "GeometryCache::renderQuad(vec2,id=" << id <<")..."; + //qDebug() << "GeometryCache::renderQuad(vec2,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec2Pair key(minCorner, maxCorner); BatchItemDetails& details = registered ? _registeredQuad2D[id] : _quad2D[key]; @@ -1157,7 +1161,7 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, const glm::vec4& color, int id) { - qDebug() << "GeometryCache::renderQuad(vec2/texture,id=" << id <<")..."; + //qDebug() << "GeometryCache::renderQuad(vec2/texture,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec2PairPair key(Vec2Pair(minCorner, maxCorner), Vec2Pair(texCoordMinCorner, texCoordMaxCorner)); BatchItemDetails& details = registered ? _registeredQuad2DTextures[id] : _quad2DTextures[key]; @@ -1248,7 +1252,7 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC } void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id) { - qDebug() << "GeometryCache::renderQuad(vec3,id=" << id <<")..."; + //qDebug() << "GeometryCache::renderQuad(vec3,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(minCorner, maxCorner); BatchItemDetails& details = registered ? _registeredQuad3D[id] : _quad3D[key]; @@ -1569,7 +1573,7 @@ void GeometryCache::BatchItemDetails::clear() { void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec4& color1, const glm::vec4& color2, int id) { - qDebug() << "GeometryCache::renderLine(vec3)..."; + //qDebug() << "GeometryCache::renderLine(vec3)..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(p1, p2); @@ -1662,7 +1666,7 @@ void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, const glm::vec4& color1, const glm::vec4& color2, int id) { - qDebug() << "GeometryCache::renderLine(vec2)..."; + //qDebug() << "GeometryCache::renderLine(vec2)..."; bool registered = (id != UNKNOWN_ID); Vec2Pair key(p1, p2); From 27268a6489bc1ab3f1977e1d7a3b14a2d700baf2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 19 Jan 2015 15:43:20 -0800 Subject: [PATCH 10/98] fix updateVertices to correctly copy all data --- libraries/render-utils/src/GeometryCache.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 67af878c52..e8a7a1d6cf 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -607,7 +607,7 @@ void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, in } void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { - qDebug() << "GeometryCache::updateVertices(vec2.... id=" << id <<")..."; + //qDebug() << "GeometryCache::updateVertices(vec2.... id=" << id <<")..."; BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { @@ -652,18 +652,14 @@ void GeometryCache::updateVertices(int id, const QVector& points, con int* colorData = new int[details.vertices]; int* colorDataAt = colorData; - //qDebug() << " details.vertices:" << details.vertices; - //qDebug() << " points.size:" << points.size(); - foreach (const glm::vec2& point, points) { - //qDebug() << " point:" << point; *(vertex++) = point.x; *(vertex++) = point.y; *(colorDataAt++) = compactColor; } - details.verticesBuffer->append(FLOATS_PER_VERTEX * details.vertices, (gpu::Buffer::Byte*) vertexData); + details.verticesBuffer->append(sizeof(GLfloat) * FLOATS_PER_VERTEX * details.vertices, (gpu::Buffer::Byte*) vertexData); details.colorBuffer->append(sizeof(int) * details.vertices, (gpu::Buffer::Byte*) colorData); delete[] vertexData; delete[] colorData; @@ -727,7 +723,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con *(colorDataAt++) = compactColor; } - details.verticesBuffer->append(FLOATS_PER_VERTEX * details.vertices, (gpu::Buffer::Byte*) vertexData); + details.verticesBuffer->append(sizeof(GLfloat) * FLOATS_PER_VERTEX * details.vertices, (gpu::Buffer::Byte*) vertexData); details.colorBuffer->append(sizeof(int) * details.vertices, (gpu::Buffer::Byte*) colorData); delete[] vertexData; delete[] colorData; @@ -738,7 +734,7 @@ void GeometryCache::updateVertices(int id, const QVector& points, con } void GeometryCache::renderVertices(gpu::Primitive primitiveType, int id) { - qDebug() << "GeometryCache::renderVertices(id=" << id <<")..."; + //qDebug() << "GeometryCache::renderVertices(id=" << id <<")..."; BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { From 0ae695ecf372040714d9b57010920b276b9576de Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 19 Jan 2015 16:54:43 -0800 Subject: [PATCH 11/98] first cut at renderGrid with color --- libraries/render-utils/src/GeometryCache.cpp | 103 ++++++++++++------- libraries/render-utils/src/GeometryCache.h | 14 ++- 2 files changed, 73 insertions(+), 44 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index e8a7a1d6cf..2b197dc078 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -523,31 +523,23 @@ void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& } void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, int cols, const glm::vec4& color, int id) { + qDebug() << "GeometryCache::renderGrid(x["<append(sizeof(GLfloat) * vertices * 2, (gpu::Buffer::Byte*) vertexData); delete[] vertexData; - - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << "new grid buffer made -- _alternateGridBuffers.size():" << _alternateGridBuffers.size(); - } else { - qDebug() << "new registered grid buffer made -- _registeredAlternateGridBuffers.size():" << _registeredAlternateGridBuffers.size(); - } - #endif - } else { - buffer.bind(); + if (registered) { + _registeredAlternateGridBuffers[id] = verticesBuffer; + } else { + _alternateGridBuffers[key] = verticesBuffer; + } } - glEnableClientState(GL_VERTEX_ARRAY); + + if (!_gridColors.contains(colorKey)) { + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + _gridColors[colorKey] = colorBuffer; + + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + + int* colorData = new int[vertices]; + int* colorDataAt = colorData; + + + for(int v = 0; v < vertices; v++) { + *(colorDataAt++) = compactColor; + } + + colorBuffer->append(sizeof(int) * vertices, (gpu::Buffer::Byte*) colorData); + delete[] colorData; + } + gpu::BufferPointer verticesBuffer = registered ? _registeredAlternateGridBuffers[id] : _alternateGridBuffers[key]; - glVertexPointer(2, GL_FLOAT, 0, 0); + gpu::BufferPointer colorBuffer = _gridColors[colorKey]; + + const int VERTICES_SLOT = 0; + const int COLOR_SLOT = 1; + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); // 1 for everyone - glDrawArrays(GL_LINES, 0, vertices); + streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::POS_XYZ), 0); + streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + gpu::BufferView verticesView(verticesBuffer, 0, verticesBuffer->getSize(), streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); + gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); + gpu::Batch batch; + + batch.setInputFormat(streamFormat); + batch.setInputBuffer(VERTICES_SLOT, verticesView); + batch.setInputBuffer(COLOR_SLOT, colorView); + batch.draw(gpu::LINES, vertices, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - - buffer.release(); + glDisableClientState(GL_COLOR_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); } void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 3aa18efb7e..399c9f9e24 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -178,7 +178,7 @@ private: int vertices; int vertexSize; }; - + QHash _cubeVerticies; QHash _cubeColors; gpu::BufferPointer _wireCubeIndexBuffer; @@ -255,9 +255,15 @@ private: QHash _colors; QHash _gridBuffers; - QHash _registeredAlternateGridBuffers; - QHash _alternateGridBuffers; - QHash _lastRegisteredGrid; + + //QHash _registeredAlternateGridBuffers; + //QHash _alternateGridBuffers; + //QHash _lastRegisteredGrid; + + QHash _registeredAlternateGridBuffers; + QHash _alternateGridBuffers; + QHash _gridColors; + QHash > _networkGeometry; }; From 2b2bd3cb47320387c90551050cd4baa7a5e1493c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 19 Jan 2015 18:08:34 -0800 Subject: [PATCH 12/98] more work on renderGrid with color --- libraries/render-utils/src/GeometryCache.cpp | 74 ++++++++++++++++---- libraries/render-utils/src/GeometryCache.h | 7 +- 2 files changed, 60 insertions(+), 21 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 2b197dc078..93bfb0a9cd 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -479,11 +479,18 @@ void GeometryCache::renderCone(float base, float height, int slices, int stacks) } void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& color) { - QOpenGLBuffer& buffer = _gridBuffers[IntPair(xDivisions, yDivisions)]; + qDebug() << "GeometryCache::renderGrid(xDivisions["<append(sizeof(GLfloat) * vertices * 2, (gpu::Buffer::Byte*) vertexData); delete[] vertexData; - } else { - buffer.bind(); + _gridBuffers[key] = verticesBuffer; } - glEnableClientState(GL_VERTEX_ARRAY); + + if (!_gridColors.contains(colorKey)) { + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + _gridColors[colorKey] = colorBuffer; + + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + + int* colorData = new int[vertices]; + int* colorDataAt = colorData; + + + for(int v = 0; v < vertices; v++) { + *(colorDataAt++) = compactColor; + } + + colorBuffer->append(sizeof(int) * vertices, (gpu::Buffer::Byte*) colorData); + delete[] colorData; + } + gpu::BufferPointer verticesBuffer = _gridBuffers[key]; + gpu::BufferPointer colorBuffer = _gridColors[colorKey]; + + const int VERTICES_SLOT = 0; + const int COLOR_SLOT = 1; + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); // 1 for everyone - glVertexPointer(2, GL_FLOAT, 0, 0); - - glDrawArrays(GL_LINES, 0, vertices); + streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::POS_XYZ), 0); + streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + gpu::BufferView verticesView(verticesBuffer, 0, verticesBuffer->getSize(), streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); + gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); + gpu::Batch batch; + + batch.setInputFormat(streamFormat); + batch.setInputBuffer(VERTICES_SLOT, verticesView); + batch.setInputBuffer(COLOR_SLOT, colorView); + batch.draw(gpu::LINES, vertices, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - - buffer.release(); + glDisableClientState(GL_COLOR_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + } +// TODO: properly handle the x,y,w,h changing for an ID +// TODO: why do we seem to create extra BatchItemDetails when we resize the window?? what's that?? void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, int cols, const glm::vec4& color, int id) { qDebug() << "GeometryCache::renderGrid(x["< _colors; - QHash _gridBuffers; - - //QHash _registeredAlternateGridBuffers; - //QHash _alternateGridBuffers; - //QHash _lastRegisteredGrid; - + QHash _gridBuffers; QHash _registeredAlternateGridBuffers; QHash _alternateGridBuffers; QHash _gridColors; From 44b48bab5e8e7e1fad38fb8cbb3cac8e2b1e0cdd Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 19 Jan 2015 18:15:47 -0800 Subject: [PATCH 13/98] remove some dead code we don't use --- libraries/render-utils/src/GeometryCache.cpp | 225 +------------------ libraries/render-utils/src/GeometryCache.h | 6 - 2 files changed, 2 insertions(+), 229 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 93bfb0a9cd..48095d615e 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -38,95 +38,12 @@ GeometryCache::GeometryCache() : } GeometryCache::~GeometryCache() { - foreach (const VerticesIndices& vbo, _hemisphereVBOs) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - } qDebug() << "GeometryCache::~GeometryCache()... "; qDebug() << " _registeredLine3DVBOs.size():" << _registeredLine3DVBOs.size(); qDebug() << " _line3DVBOs.size():" << _line3DVBOs.size(); qDebug() << " BatchItemDetails... population:" << GeometryCache::BatchItemDetails::population; } -void GeometryCache::renderHemisphere(int slices, int stacks) { - VerticesIndices& vbo = _hemisphereVBOs[IntPair(slices, stacks)]; - int vertices = slices * (stacks - 1) + 1; - int indices = slices * 2 * 3 * (stacks - 2) + slices * 3; - if (vbo.first == 0) { - GLfloat* vertexData = new GLfloat[vertices * 3]; - GLfloat* vertex = vertexData; - for (int i = 0; i < stacks - 1; i++) { - float phi = PI_OVER_TWO * (float)i / (float)(stacks - 1); - float z = sinf(phi), radius = cosf(phi); - - for (int j = 0; j < slices; j++) { - float theta = TWO_PI * (float)j / (float)slices; - - *(vertex++) = sinf(theta) * radius; - *(vertex++) = cosf(theta) * radius; - *(vertex++) = z; - } - } - *(vertex++) = 0.0f; - *(vertex++) = 0.0f; - *(vertex++) = 1.0f; - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - const int BYTES_PER_VERTEX = 3 * sizeof(GLfloat); - glBufferData(GL_ARRAY_BUFFER, vertices * BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < stacks - 2; i++) { - GLushort bottom = i * slices; - GLushort top = bottom + slices; - for (int j = 0; j < slices; j++) { - int next = (j + 1) % slices; - - *(index++) = bottom + j; - *(index++) = top + next; - *(index++) = top + j; - - *(index++) = bottom + j; - *(index++) = bottom + next; - *(index++) = top + next; - } - } - GLushort bottom = (stacks - 2) * slices; - GLushort top = bottom + slices; - for (int i = 0; i < slices; i++) { - *(index++) = bottom + i; - *(index++) = bottom + (i + 1) % slices; - *(index++) = top; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - const int BYTES_PER_INDEX = sizeof(GLushort); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - - glVertexPointer(3, GL_FLOAT, 0, 0); - glNormalPointer(GL_FLOAT, 0, 0); - - glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); -} - const int NUM_VERTICES_PER_TRIANGLE = 3; const int NUM_TRIANGLES_PER_QUAD = 2; const int NUM_VERTICES_PER_TRIANGULATED_QUAD = NUM_VERTICES_PER_TRIANGLE * NUM_TRIANGLES_PER_QUAD; @@ -240,146 +157,8 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderSquare(int xDivisions, int yDivisions) { - VerticesIndices& vbo = _squareVBOs[IntPair(xDivisions, yDivisions)]; - int xVertices = xDivisions + 1; - int yVertices = yDivisions + 1; - int vertices = xVertices * yVertices; - int indices = 2 * 3 * xDivisions * yDivisions; - if (vbo.first == 0) { - GLfloat* vertexData = new GLfloat[vertices * 3]; - GLfloat* vertex = vertexData; - for (int i = 0; i <= yDivisions; i++) { - float y = (float)i / yDivisions; - - for (int j = 0; j <= xDivisions; j++) { - *(vertex++) = (float)j / xDivisions; - *(vertex++) = y; - *(vertex++) = 0.0f; - } - } - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < yDivisions; i++) { - GLushort bottom = i * xVertices; - GLushort top = bottom + xVertices; - for (int j = 0; j < xDivisions; j++) { - int next = j + 1; - - *(index++) = bottom + j; - *(index++) = top + next; - *(index++) = top + j; - - *(index++) = bottom + j; - *(index++) = bottom + next; - *(index++) = top + next; - } - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - } - glEnableClientState(GL_VERTEX_ARRAY); - - // all vertices have the same normal - glNormal3f(0.0f, 0.0f, 1.0f); - - glVertexPointer(3, GL_FLOAT, 0, 0); - - glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - - glDisableClientState(GL_VERTEX_ARRAY); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); -} - -void GeometryCache::renderHalfCylinder(int slices, int stacks) { - VerticesIndices& vbo = _halfCylinderVBOs[IntPair(slices, stacks)]; - int vertices = (slices + 1) * stacks; - int indices = 2 * 3 * slices * (stacks - 1); - if (vbo.first == 0) { - GLfloat* vertexData = new GLfloat[vertices * 2 * 3]; - GLfloat* vertex = vertexData; - for (int i = 0; i <= (stacks - 1); i++) { - float y = (float)i / (stacks - 1); - - for (int j = 0; j <= slices; j++) { - float theta = 3.0f * PI_OVER_TWO + PI * (float)j / (float)slices; - - //normals - *(vertex++) = sinf(theta); - *(vertex++) = 0; - *(vertex++) = cosf(theta); - - // vertices - *(vertex++) = sinf(theta); - *(vertex++) = y; - *(vertex++) = cosf(theta); - } - } - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, 2 * vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < stacks - 1; i++) { - GLushort bottom = i * (slices + 1); - GLushort top = bottom + slices + 1; - for (int j = 0; j < slices; j++) { - int next = j + 1; - - *(index++) = bottom + j; - *(index++) = top + next; - *(index++) = top + j; - - *(index++) = bottom + j; - *(index++) = bottom + next; - *(index++) = top + next; - } - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - - glNormalPointer(GL_FLOAT, 6 * sizeof(float), 0); - glVertexPointer(3, GL_FLOAT, (6 * sizeof(float)), (const void *)(3 * sizeof(float))); - - glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); -} - void GeometryCache::renderCone(float base, float height, int slices, int stacks) { - VerticesIndices& vbo = _halfCylinderVBOs[IntPair(slices, stacks)]; + VerticesIndices& vbo = _coneVBOs[IntPair(slices, stacks)]; int vertices = (stacks + 2) * slices; int baseTriangles = slices - 2; int indices = NUM_VERTICES_PER_TRIANGULATED_QUAD * slices * stacks + NUM_VERTICES_PER_TRIANGLE * baseTriangles; @@ -479,7 +258,7 @@ void GeometryCache::renderCone(float base, float height, int slices, int stacks) } void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& color) { - qDebug() << "GeometryCache::renderGrid(xDivisions["< _hemisphereVBOs; QHash _sphereVBOs; - QHash _squareVBOs; - QHash _halfCylinderVBOs; QHash _coneVBOs; QHash _wireCubeVBOs; QHash _solidCubeVBOs; From e35c6be45eacf19201f8e3a048cf5d4cd6795235 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 20 Jan 2015 11:13:08 -0800 Subject: [PATCH 14/98] Lint: White space --- examples/notifications.js | 126 +++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index 9a6fbbce29..f6ff675cfb 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -58,12 +58,11 @@ // createNotification(welcome); // } - var width = 340.0; //width of notification overlay var height = 40.0; // height of a single line notification overlay var windowDimensions = Controller.getViewportDimensions(); // get the size of the interface window var overlayLocationX = (windowDimensions.x - (width + 20.0));// positions window 20px from the right of the interface window -var buttonLocationX = overlayLocationX + (width - 28.0); +var buttonLocationX = overlayLocationX + (width - 28.0); var locationY = 20.0; // position down from top of interface window var topMargin = 13.0; var leftMargin = 10.0; @@ -74,16 +73,16 @@ var fontSize = 12.0; var persistTime = 10.0; // time in seconds before notification fades var clickedText = false; var frame = 0; -var ourWidth = Window.innerWidth; -var ourHeight = Window.innerHeight; +var ourWidth = Window.innerWidth; +var ourHeight = Window.innerHeight; var text = "placeholder"; var last_users = GlobalServices.onlineUsers; var users = []; var ctrlIsPressed = false; var ready = true; - + // When our script shuts down, we should clean up all of our overlays -function scriptEnding() { +function scriptEnding() { for (i = 0; i < notifications.length; i++) { Overlays.deleteOverlay(notifications[i]); Overlays.deleteOverlay(buttons[i]); @@ -92,7 +91,7 @@ function scriptEnding() { Script.scriptEnding.connect(scriptEnding); var notifications = []; -var buttons = []; +var buttons = []; var times = []; var heights = []; var myAlpha = []; @@ -117,7 +116,7 @@ function createNotification(text) { height = height + extraLine; var overlayProperties = { x: overlayLocationX, - y: level, + y: level, width: width, height: height, color: textColor, @@ -126,10 +125,10 @@ function createNotification(text) { topMargin: topMargin, leftMargin: leftMargin, font: {size: fontSize}, - text: text, - }; + text: text, + }; var bLevel = level + 12.0; - var buttonProperties = { + var buttonProperties = { x: buttonLocationX, y: bLevel, width: 10.0, @@ -139,19 +138,17 @@ function createNotification(text) { color: { red: 255, green: 255, blue: 255}, visible: true, alpha: backgroundAlpha, - }; - - Notify(overlayProperties, buttonProperties, height); - + }; + + Notify(overlayProperties, buttonProperties, height); } // Pushes data to each array and sets up data for 2nd dimension array // to handle auxiliary data not carried by the overlay class // specifically notification "heights", "times" of creation, and . -function Notify(notice, button, height){ - +function Notify(notice, button, height) { notifications.push((Overlays.addOverlay("text", notice))); - buttons.push((Overlays.addOverlay("image",button))); + buttons.push((Overlays.addOverlay("image", button))); times.push(new Date().getTime() / 1000); height = height + 1.0; heights.push(height); @@ -165,11 +162,11 @@ function fadeIn(noticeIn, buttonIn) { var myLength = arrays.length; var q = 0; var pauseTimer = null; - pauseTimer = Script.setInterval(function() { + pauseTimer = Script.setInterval(function () { q++; qFade = q / 10.0; - Overlays.editOverlay(noticeIn, {alpha: qFade}); - Overlays.editOverlay(buttonIn, {alpha: qFade}); + Overlays.editOverlay(noticeIn, {alpha: qFade}); + Overlays.editOverlay(buttonIn, {alpha: qFade}); if (q >= 9.0) { Script.clearInterval(pauseTimer); } @@ -178,24 +175,25 @@ function fadeIn(noticeIn, buttonIn) { // push data from above to the 2 dimensional array -function createArrays(notice, button, createTime, height, myAlpha) { - arrays.push([notice, button, createTime, height, myAlpha]); +function createArrays(notice, button, createTime, height, myAlpha) { + arrays.push([notice, button, createTime, height, myAlpha]); } + // handles mouse clicks on buttons -function mousePressEvent(event) { +function mousePressEvent(event) { var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); //identify which overlay was clicked for (i = 0; i < buttons.length; i++) { //if user clicked a button - if(clickedOverlay == buttons[i]) { + if (clickedOverlay == buttons[i]) { Overlays.deleteOverlay(notifications[i]); Overlays.deleteOverlay(buttons[i]); notifications.splice(i, 1); buttons.splice(i, 1); times.splice(i, 1); heights.splice(i, 1); - myAlpha.splice(i, 1); + myAlpha.splice(i, 1); arrays.splice(i, 1); } - } + } } // Control key remains active only while key is held down @@ -204,20 +202,21 @@ function keyReleaseEvent(key) { ctrlIsPressed = false; } } - + // Triggers notification on specific key driven events function keyPressEvent(key) { if (key.key == 16777249) { ctrlIsPressed = true; } - if (key.text == "q") { //queries number of users online - var numUsers = GlobalServices.onlineUsers.length; - var welcome = "There are " + numUsers + " users online now."; - createNotification(welcome); - } - if (key.text == "s") { - if (ctrlIsPressed == true){ + if (key.text == "q") { //queries number of users online + var numUsers = GlobalServices.onlineUsers.length; + var welcome = "There are " + numUsers + " users online now."; + createNotification(welcome); + } + + if (key.text == "s") { + if (ctrlIsPressed == true) { var noteString = "Snapshot taken."; createNotification(noteString); } @@ -229,6 +228,7 @@ function wordWrap(str) { var result = stringDivider(str, 43.0, "\n"); createNotification(result); } + // wraps whole word to newline function stringDivider(str, slotWidth, spaceReplacer) { if (str.length > slotWidth) { @@ -241,15 +241,15 @@ function stringDivider(str, slotWidth, spaceReplacer) { return left + spaceReplacer + stringDivider(right, slotWidth, spaceReplacer); } } - return str; + return str; } // This fires a notification on window resize -function checkSize(){ - if((Window.innerWidth != ourWidth)||(Window.innerHeight != ourHeight)) { +function checkSize() { + if ((Window.innerWidth != ourWidth) || (Window.innerHeight != ourHeight)) { var windowResize = "Window has been resized"; ourWidth = Window.innerWidth; - ourHeight = Window.innerHeight; + ourHeight = Window.innerHeight; windowDimensions = Controller.getViewportDimensions(); overlayLocationX = (windowDimensions.x - (width + 60.0)); buttonLocationX = overlayLocationX + (width - 35.0); @@ -262,27 +262,30 @@ function onOnlineUsersChanged(users) { if (!isStartingUp()) { // Skip user notifications at startup. for (user in users) { if (last_users.indexOf(users[user]) == -1.0) { - createNotification(users[user] + " has joined"); + createNotification(users[user] + " has joined"); } } + for (user in last_users) { if (users.indexOf(last_users[user]) == -1.0) { - createNotification(last_users[user] + " has left"); + createNotification(last_users[user] + " has left"); } } } + last_users = users; } // Triggers notification if @MyUserName is mentioned in chat and returns the message to the notification. function onIncomingMessage(user, message) { - var myMessage = message; - var alertMe = "@" + GlobalServices.myUsername; - var thisAlert = user + ": " + myMessage; - if (myMessage.indexOf(alertMe) > -1.0) { + var myMessage = message; + var alertMe = "@" + GlobalServices.myUsername; + var thisAlert = user + ": " + myMessage; + if (myMessage.indexOf(alertMe) > -1.0) { wordWrap(thisAlert); } } + // Triggers mic mute notification function onMuteStateChanged() { var muteState = AudioDevice.getMuted() ? "muted" : "unmuted"; @@ -290,26 +293,26 @@ function onMuteStateChanged() { createNotification(muteString); } -function update(){ +function update() { frame++; if ((frame % 60.0) == 0) { // only update once a second checkSize(); // checks for size change to trigger windowResize notification locationY = 20.0; for (var i = 0; i < arrays.length; i++) { //repositions overlays as others fade - var nextOverlay = Overlays.getOverlayAtPoint({x: overlayLocationX, y: locationY}); - Overlays.editOverlay(notifications[i], { x:overlayLocationX, y:locationY}); - Overlays.editOverlay(buttons[i], { x:buttonLocationX, y:locationY + 12.0}); + var nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); + Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY}); + Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0}); locationY = locationY + arrays[i][3]; } } -// This checks the age of the notification and prepares to fade it after 9.0 seconds (var persistTime - 1) - for (var i = 0; i < arrays.length; i++) { - if (ready){ - var j = arrays[i][2]; - var k = j + persistTime; + // This checks the age of the notification and prepares to fade it after 9.0 seconds (var persistTime - 1) + for (var i = 0; i < arrays.length; i++) { + if (ready) { + var j = arrays[i][2]; + var k = j + persistTime; if (k < (new Date().getTime() / 1000)) { - ready = false; + ready = false; noticeOut = arrays[i][0]; buttonOut = arrays[i][1]; var arraysOut = i; @@ -324,11 +327,11 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { var myLength = arrays.length; var r = 9.0; var pauseTimer = null; - pauseTimer = Script.setInterval(function() { + pauseTimer = Script.setInterval(function () { r--; - rFade = r / 10.0; - Overlays.editOverlay(noticeOut, {alpha: rFade}); - Overlays.editOverlay(buttonOut, {alpha: rFade}); + rFade = r / 10.0; + Overlays.editOverlay(noticeOut, { alpha: rFade }); + Overlays.editOverlay(buttonOut, { alpha: rFade }); if (r < 0) { dismiss(noticeOut, buttonOut, arraysOut); arrays.splice(arraysOut, 1); @@ -339,7 +342,7 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { } // This handles the final dismissal of a notification after fading -function dismiss(firstNoteOut, firstButOut, firstOut) { +function dismiss(firstNoteOut, firstButOut, firstOut) { var working = firstOut Overlays.deleteOverlay(firstNoteOut); Overlays.deleteOverlay(firstButOut); @@ -347,7 +350,7 @@ function dismiss(firstNoteOut, firstButOut, firstOut) { buttons.splice(firstOut, 1); times.splice(firstOut, 1); heights.splice(firstOut, 1); - myAlpha.splice(firstOut,1); + myAlpha.splice(firstOut, 1); } // This reports the number of users online at startup @@ -378,7 +381,6 @@ function isStartingUp() { return startingUp; } - AudioDevice.muteToggled.connect(onMuteStateChanged); Controller.keyPressEvent.connect(keyPressEvent); Controller.mousePressEvent.connect(mousePressEvent); From c4b024e51005c3dd064959489f7903a3aa3ed67e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 20 Jan 2015 11:59:43 -0800 Subject: [PATCH 15/98] Lint: Variable declarations --- examples/notifications.js | 147 ++++++++++++++++++++++++-------------- 1 file changed, 95 insertions(+), 52 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index f6ff675cfb..35dd09f7f7 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -52,16 +52,16 @@ // 2. Declare a text string. // 3. Call createNotifications(text) parsing the text. // example: +// var welcome; // if (key.text == "q") { //queries number of users online -// var numUsers = GlobalServices.onlineUsers.length; -// var welcome = "There are " + numUsers + " users online now."; -// createNotification(welcome); +// var welcome = "There are " + GlobalServices.onlineUsers.length + " users online now."; +// createNotification(welcome); // } var width = 340.0; //width of notification overlay var height = 40.0; // height of a single line notification overlay var windowDimensions = Controller.getViewportDimensions(); // get the size of the interface window -var overlayLocationX = (windowDimensions.x - (width + 20.0));// positions window 20px from the right of the interface window +var overlayLocationX = (windowDimensions.x - (width + 20.0)); // positions window 20px from the right of the interface window var buttonLocationX = overlayLocationX + (width - 28.0); var locationY = 20.0; // position down from top of interface window var topMargin = 13.0; @@ -80,16 +80,6 @@ var last_users = GlobalServices.onlineUsers; var users = []; var ctrlIsPressed = false; var ready = true; - -// When our script shuts down, we should clean up all of our overlays -function scriptEnding() { - for (i = 0; i < notifications.length; i++) { - Overlays.deleteOverlay(notifications[i]); - Overlays.deleteOverlay(buttons[i]); - } -} -Script.scriptEnding.connect(scriptEnding); - var notifications = []; var buttons = []; var times = []; @@ -97,24 +87,42 @@ var heights = []; var myAlpha = []; var arrays = []; +// When our script shuts down, we should clean up all of our overlays +function scriptEnding() { + var i; + + for (i = 0; i < notifications.length; i++) { + Overlays.deleteOverlay(notifications[i]); + Overlays.deleteOverlay(buttons[i]); + } +} +Script.scriptEnding.connect(scriptEnding); + // This function creates and sizes the overlays function createNotification(text) { - var count = (text.match(/\n/g) || []).length; - var breakPoint = 43.0; // length when new line is added - var extraLine = 0; - var breaks = 0; - var height = 40.0; - var stack = 0; + var count = (text.match(/\n/g) || []).length, + breakPoint = 43.0, // length when new line is added + extraLine = 0, + breaks = 0, + height = 40.0, + stack = 0, + level, + overlayProperties, + bLevel, + buttonProperties, + i; + if (text.length >= breakPoint) { breaks = count; } - var extraLine = breaks * 16.0; + extraLine = breaks * 16.0; for (i = 0; i < heights.length; i++) { stack = stack + heights[i]; } - var level = (stack + 20.0); + + level = (stack + 20.0); height = height + extraLine; - var overlayProperties = { + overlayProperties = { x: overlayLocationX, y: level, width: width, @@ -127,8 +135,9 @@ function createNotification(text) { font: {size: fontSize}, text: text, }; - var bLevel = level + 12.0; - var buttonProperties = { + + bLevel = level + 12.0; + buttonProperties = { x: buttonLocationX, y: bLevel, width: 10.0, @@ -159,9 +168,10 @@ function Notify(notice, button, height) { } function fadeIn(noticeIn, buttonIn) { - var myLength = arrays.length; - var q = 0; - var pauseTimer = null; + var q = 0, + qFade, + pauseTimer = null; + pauseTimer = Script.setInterval(function () { q++; qFade = q / 10.0; @@ -181,7 +191,11 @@ function createArrays(notice, button, createTime, height, myAlpha) { // handles mouse clicks on buttons function mousePressEvent(event) { - var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); //identify which overlay was clicked + var clickedOverlay, + i; + + clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); //identify which overlay was clicked + for (i = 0; i < buttons.length; i++) { //if user clicked a button if (clickedOverlay == buttons[i]) { Overlays.deleteOverlay(notifications[i]); @@ -205,19 +219,23 @@ function keyReleaseEvent(key) { // Triggers notification on specific key driven events function keyPressEvent(key) { + var numUsers, + welcome, + noteString; + if (key.key == 16777249) { ctrlIsPressed = true; } if (key.text == "q") { //queries number of users online - var numUsers = GlobalServices.onlineUsers.length; - var welcome = "There are " + numUsers + " users online now."; + numUsers = GlobalServices.onlineUsers.length; + welcome = "There are " + numUsers + " users online now."; createNotification(welcome); } if (key.text == "s") { if (ctrlIsPressed == true) { - var noteString = "Snapshot taken."; + noteString = "Snapshot taken."; createNotification(noteString); } } @@ -231,13 +249,17 @@ function wordWrap(str) { // wraps whole word to newline function stringDivider(str, slotWidth, spaceReplacer) { + var p, + left, + right; + if (str.length > slotWidth) { - var p = slotWidth; + p = slotWidth; for (; p > 0 && str[p] != ' '; p--) { } if (p > 0) { - var left = str.substring(0, p); - var right = str.substring(p + 1); + left = str.substring(0, p); + right = str.substring(p + 1); return left + spaceReplacer + stringDivider(right, slotWidth, spaceReplacer); } } @@ -259,6 +281,8 @@ function checkSize() { // Triggers notification if a user logs on or off function onOnlineUsersChanged(users) { + var user; + if (!isStartingUp()) { // Skip user notifications at startup. for (user in users) { if (last_users.indexOf(users[user]) == -1.0) { @@ -278,9 +302,14 @@ function onOnlineUsersChanged(users) { // Triggers notification if @MyUserName is mentioned in chat and returns the message to the notification. function onIncomingMessage(user, message) { - var myMessage = message; - var alertMe = "@" + GlobalServices.myUsername; - var thisAlert = user + ": " + myMessage; + var myMessage, + alertMe, + thisAlert; + + myMessage = message; + alertMe = "@" + GlobalServices.myUsername; + thisAlert = user + ": " + myMessage; + if (myMessage.indexOf(alertMe) > -1.0) { wordWrap(thisAlert); } @@ -288,18 +317,29 @@ function onIncomingMessage(user, message) { // Triggers mic mute notification function onMuteStateChanged() { - var muteState = AudioDevice.getMuted() ? "muted" : "unmuted"; - var muteString = "Microphone is now " + muteState; + var muteState, + muteString; + + muteState = AudioDevice.getMuted() ? "muted" : "unmuted"; + muteString = "Microphone is now " + muteState; createNotification(muteString); } function update() { + var nextOverlay, + noticeOut, + buttonOut, + arraysOut, + i, + j, + k; + frame++; if ((frame % 60.0) == 0) { // only update once a second checkSize(); // checks for size change to trigger windowResize notification locationY = 20.0; - for (var i = 0; i < arrays.length; i++) { //repositions overlays as others fade - var nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); + for (i = 0; i < arrays.length; i++) { //repositions overlays as others fade + nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY}); Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0}); locationY = locationY + arrays[i][3]; @@ -307,15 +347,15 @@ function update() { } // This checks the age of the notification and prepares to fade it after 9.0 seconds (var persistTime - 1) - for (var i = 0; i < arrays.length; i++) { + for (i = 0; i < arrays.length; i++) { if (ready) { - var j = arrays[i][2]; - var k = j + persistTime; + j = arrays[i][2]; + k = j + persistTime; if (k < (new Date().getTime() / 1000)) { ready = false; noticeOut = arrays[i][0]; buttonOut = arrays[i][1]; - var arraysOut = i; + arraysOut = i; fadeOut(noticeOut, buttonOut, arraysOut); } } @@ -324,9 +364,10 @@ function update() { // this fades the notification ready for dismissal, and removes it from the arrays function fadeOut(noticeOut, buttonOut, arraysOut) { - var myLength = arrays.length; - var r = 9.0; - var pauseTimer = null; + var r = 9.0, + rFade, + pauseTimer = null; + pauseTimer = Script.setInterval(function () { r--; rFade = r / 10.0; @@ -343,7 +384,6 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { // This handles the final dismissal of a notification after fading function dismiss(firstNoteOut, firstButOut, firstOut) { - var working = firstOut Overlays.deleteOverlay(firstNoteOut); Overlays.deleteOverlay(firstButOut); notifications.splice(firstOut, 1); @@ -355,8 +395,11 @@ function dismiss(firstNoteOut, firstButOut, firstOut) { // This reports the number of users online at startup function reportUsers() { - var numUsers = GlobalServices.onlineUsers.length; - var welcome = "Welcome! There are " + numUsers + " users online now."; + var numUsers, + welcome; + + numUsers = GlobalServices.onlineUsers.length; + welcome = "Welcome! There are " + numUsers + " users online now."; createNotification(welcome); } From ce0c91628a5e788032d88f1c47965378a73599b0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 20 Jan 2015 12:15:27 -0800 Subject: [PATCH 16/98] Lint: Declaration order --- examples/notifications.js | 377 +++++++++++++++++++------------------- 1 file changed, 187 insertions(+), 190 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index 35dd09f7f7..6e73e67233 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -87,16 +87,72 @@ var heights = []; var myAlpha = []; var arrays = []; -// When our script shuts down, we should clean up all of our overlays -function scriptEnding() { - var i; - - for (i = 0; i < notifications.length; i++) { - Overlays.deleteOverlay(notifications[i]); - Overlays.deleteOverlay(buttons[i]); - } +// push data from above to the 2 dimensional array +function createArrays(notice, button, createTime, height, myAlpha) { + arrays.push([notice, button, createTime, height, myAlpha]); +} + +// This handles the final dismissal of a notification after fading +function dismiss(firstNoteOut, firstButOut, firstOut) { + Overlays.deleteOverlay(firstNoteOut); + Overlays.deleteOverlay(firstButOut); + notifications.splice(firstOut, 1); + buttons.splice(firstOut, 1); + times.splice(firstOut, 1); + heights.splice(firstOut, 1); + myAlpha.splice(firstOut, 1); +} + +function fadeIn(noticeIn, buttonIn) { + var q = 0, + qFade, + pauseTimer = null; + + pauseTimer = Script.setInterval(function () { + q++; + qFade = q / 10.0; + Overlays.editOverlay(noticeIn, { alpha: qFade }); + Overlays.editOverlay(buttonIn, { alpha: qFade }); + if (q >= 9.0) { + Script.clearInterval(pauseTimer); + } + }, 10); +} + +// this fades the notification ready for dismissal, and removes it from the arrays +function fadeOut(noticeOut, buttonOut, arraysOut) { + var r = 9.0, + rFade, + pauseTimer = null; + + pauseTimer = Script.setInterval(function () { + r--; + rFade = r / 10.0; + Overlays.editOverlay(noticeOut, { alpha: rFade }); + Overlays.editOverlay(buttonOut, { alpha: rFade }); + if (r < 0) { + dismiss(noticeOut, buttonOut, arraysOut); + arrays.splice(arraysOut, 1); + ready = true; + Script.clearInterval(pauseTimer); + } + }, 20); +} + +// Pushes data to each array and sets up data for 2nd dimension array +// to handle auxiliary data not carried by the overlay class +// specifically notification "heights", "times" of creation, and . +function Notify(notice, button, height) { + notifications.push((Overlays.addOverlay("text", notice))); + buttons.push((Overlays.addOverlay("image", button))); + times.push(new Date().getTime() / 1000); + height = height + 1.0; + heights.push(height); + myAlpha.push(0); + var last = notifications.length - 1; + createArrays(notifications[last], buttons[last], times[last], heights[last], myAlpha[last]); + fadeIn(notifications[last], buttons[last]) } -Script.scriptEnding.connect(scriptEnding); // This function creates and sizes the overlays function createNotification(text) { @@ -152,101 +208,6 @@ function createNotification(text) { Notify(overlayProperties, buttonProperties, height); } -// Pushes data to each array and sets up data for 2nd dimension array -// to handle auxiliary data not carried by the overlay class -// specifically notification "heights", "times" of creation, and . -function Notify(notice, button, height) { - notifications.push((Overlays.addOverlay("text", notice))); - buttons.push((Overlays.addOverlay("image", button))); - times.push(new Date().getTime() / 1000); - height = height + 1.0; - heights.push(height); - myAlpha.push(0); - var last = notifications.length - 1; - createArrays(notifications[last], buttons[last], times[last], heights[last], myAlpha[last]); - fadeIn(notifications[last], buttons[last]) -} - -function fadeIn(noticeIn, buttonIn) { - var q = 0, - qFade, - pauseTimer = null; - - pauseTimer = Script.setInterval(function () { - q++; - qFade = q / 10.0; - Overlays.editOverlay(noticeIn, {alpha: qFade}); - Overlays.editOverlay(buttonIn, {alpha: qFade}); - if (q >= 9.0) { - Script.clearInterval(pauseTimer); - } - }, 10); -} - - -// push data from above to the 2 dimensional array -function createArrays(notice, button, createTime, height, myAlpha) { - arrays.push([notice, button, createTime, height, myAlpha]); -} - -// handles mouse clicks on buttons -function mousePressEvent(event) { - var clickedOverlay, - i; - - clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); //identify which overlay was clicked - - for (i = 0; i < buttons.length; i++) { //if user clicked a button - if (clickedOverlay == buttons[i]) { - Overlays.deleteOverlay(notifications[i]); - Overlays.deleteOverlay(buttons[i]); - notifications.splice(i, 1); - buttons.splice(i, 1); - times.splice(i, 1); - heights.splice(i, 1); - myAlpha.splice(i, 1); - arrays.splice(i, 1); - } - } -} - -// Control key remains active only while key is held down -function keyReleaseEvent(key) { - if (key.key == 16777249) { - ctrlIsPressed = false; - } -} - -// Triggers notification on specific key driven events -function keyPressEvent(key) { - var numUsers, - welcome, - noteString; - - if (key.key == 16777249) { - ctrlIsPressed = true; - } - - if (key.text == "q") { //queries number of users online - numUsers = GlobalServices.onlineUsers.length; - welcome = "There are " + numUsers + " users online now."; - createNotification(welcome); - } - - if (key.text == "s") { - if (ctrlIsPressed == true) { - noteString = "Snapshot taken."; - createNotification(noteString); - } - } -} - -// formats string to add newline every 43 chars -function wordWrap(str) { - var result = stringDivider(str, 43.0, "\n"); - createNotification(result); -} - // wraps whole word to newline function stringDivider(str, slotWidth, spaceReplacer) { var p, @@ -266,6 +227,12 @@ function stringDivider(str, slotWidth, spaceReplacer) { return str; } +// formats string to add newline every 43 chars +function wordWrap(str) { + var result = stringDivider(str, 43.0, "\n"); + createNotification(result); +} + // This fires a notification on window resize function checkSize() { if ((Window.innerWidth != ourWidth) || (Window.innerHeight != ourHeight)) { @@ -279,6 +246,72 @@ function checkSize() { } } +function update() { + var nextOverlay, + noticeOut, + buttonOut, + arraysOut, + i, + j, + k; + + frame++; + if ((frame % 60.0) == 0) { // only update once a second + checkSize(); // checks for size change to trigger windowResize notification + locationY = 20.0; + for (i = 0; i < arrays.length; i++) { //repositions overlays as others fade + nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); + Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY }); + Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0 }); + locationY = locationY + arrays[i][3]; + } + } + + // This checks the age of the notification and prepares to fade it after 9.0 seconds (var persistTime - 1) + for (i = 0; i < arrays.length; i++) { + if (ready) { + j = arrays[i][2]; + k = j + persistTime; + if (k < (new Date().getTime() / 1000)) { + ready = false; + noticeOut = arrays[i][0]; + buttonOut = arrays[i][1]; + arraysOut = i; + fadeOut(noticeOut, buttonOut, arraysOut); + } + } + } +} + +var STARTUP_TIMEOUT = 500, // ms + startingUp = true, + startupTimer = null; + +// This reports the number of users online at startup +function reportUsers() { + var welcome; + + welcome = "Welcome! There are " + GlobalServices.onlineUsers.length + " users online now."; + createNotification(welcome); +} + +function finishStartup() { + startingUp = false; + Script.clearTimeout(startupTimer); + reportUsers(); +} + +function isStartingUp() { + // Is starting up until get no checks that it is starting up for STARTUP_TIMEOUT + if (startingUp) { + if (startupTimer) { + Script.clearTimeout(startupTimer); + } + startupTimer = Script.setTimeout(finishStartup, STARTUP_TIMEOUT); + } + return startingUp; +} + // Triggers notification if a user logs on or off function onOnlineUsersChanged(users) { var user; @@ -325,103 +358,66 @@ function onMuteStateChanged() { createNotification(muteString); } -function update() { - var nextOverlay, - noticeOut, - buttonOut, - arraysOut, - i, - j, - k; +// handles mouse clicks on buttons +function mousePressEvent(event) { + var clickedOverlay, + i; - frame++; - if ((frame % 60.0) == 0) { // only update once a second - checkSize(); // checks for size change to trigger windowResize notification - locationY = 20.0; - for (i = 0; i < arrays.length; i++) { //repositions overlays as others fade - nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); - Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY}); - Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0}); - locationY = locationY + arrays[i][3]; - } - } + clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); //identify which overlay was clicked - // This checks the age of the notification and prepares to fade it after 9.0 seconds (var persistTime - 1) - for (i = 0; i < arrays.length; i++) { - if (ready) { - j = arrays[i][2]; - k = j + persistTime; - if (k < (new Date().getTime() / 1000)) { - ready = false; - noticeOut = arrays[i][0]; - buttonOut = arrays[i][1]; - arraysOut = i; - fadeOut(noticeOut, buttonOut, arraysOut); - } + for (i = 0; i < buttons.length; i++) { //if user clicked a button + if (clickedOverlay == buttons[i]) { + Overlays.deleteOverlay(notifications[i]); + Overlays.deleteOverlay(buttons[i]); + notifications.splice(i, 1); + buttons.splice(i, 1); + times.splice(i, 1); + heights.splice(i, 1); + myAlpha.splice(i, 1); + arrays.splice(i, 1); } } } -// this fades the notification ready for dismissal, and removes it from the arrays -function fadeOut(noticeOut, buttonOut, arraysOut) { - var r = 9.0, - rFade, - pauseTimer = null; - - pauseTimer = Script.setInterval(function () { - r--; - rFade = r / 10.0; - Overlays.editOverlay(noticeOut, { alpha: rFade }); - Overlays.editOverlay(buttonOut, { alpha: rFade }); - if (r < 0) { - dismiss(noticeOut, buttonOut, arraysOut); - arrays.splice(arraysOut, 1); - ready = true; - Script.clearInterval(pauseTimer); - } - }, 20); +// Control key remains active only while key is held down +function keyReleaseEvent(key) { + if (key.key == 16777249) { + ctrlIsPressed = false; + } } -// This handles the final dismissal of a notification after fading -function dismiss(firstNoteOut, firstButOut, firstOut) { - Overlays.deleteOverlay(firstNoteOut); - Overlays.deleteOverlay(firstButOut); - notifications.splice(firstOut, 1); - buttons.splice(firstOut, 1); - times.splice(firstOut, 1); - heights.splice(firstOut, 1); - myAlpha.splice(firstOut, 1); -} - -// This reports the number of users online at startup -function reportUsers() { +// Triggers notification on specific key driven events +function keyPressEvent(key) { var numUsers, - welcome; + welcome, + noteString; - numUsers = GlobalServices.onlineUsers.length; - welcome = "Welcome! There are " + numUsers + " users online now."; - createNotification(welcome); -} - -var STARTUP_TIMEOUT = 500, // ms - startingUp = true, - startupTimer = null; - -function finishStartup() { - startingUp = false; - Script.clearTimeout(startupTimer); - reportUsers(); -} - -function isStartingUp() { - // Is starting up until get no checks that it is starting up for STARTUP_TIMEOUT - if (startingUp) { - if (startupTimer) { - Script.clearTimeout(startupTimer); - } - startupTimer = Script.setTimeout(finishStartup, STARTUP_TIMEOUT); + if (key.key == 16777249) { + ctrlIsPressed = true; + } + + if (key.text == "q") { //queries number of users online + numUsers = GlobalServices.onlineUsers.length; + welcome = "There are " + numUsers + " users online now."; + createNotification(welcome); + } + + if (key.text == "s") { + if (ctrlIsPressed == true) { + noteString = "Snapshot taken."; + createNotification(noteString); + } + } +} + +// When our script shuts down, we should clean up all of our overlays +function scriptEnding() { + var i; + + for (i = 0; i < notifications.length; i++) { + Overlays.deleteOverlay(notifications[i]); + Overlays.deleteOverlay(buttons[i]); } - return startingUp; } AudioDevice.muteToggled.connect(onMuteStateChanged); @@ -431,3 +427,4 @@ GlobalServices.onlineUsersChanged.connect(onOnlineUsersChanged); GlobalServices.incomingMessage.connect(onIncomingMessage); Controller.keyReleaseEvent.connect(keyReleaseEvent); Script.update.connect(update); +Script.scriptEnding.connect(scriptEnding); From 63310fac503b8d5f8b8baa3f931c977c7ac68369 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 20 Jan 2015 12:18:58 -0800 Subject: [PATCH 17/98] Lint: Syntax --- examples/notifications.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index 6e73e67233..d1d69e448d 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -151,7 +151,7 @@ function Notify(notice, button, height) { myAlpha.push(0); var last = notifications.length - 1; createArrays(notifications[last], buttons[last], times[last], heights[last], myAlpha[last]); - fadeIn(notifications[last], buttons[last]) + fadeIn(notifications[last], buttons[last]); } // This function creates and sizes the overlays @@ -189,7 +189,7 @@ function createNotification(text) { topMargin: topMargin, leftMargin: leftMargin, font: {size: fontSize}, - text: text, + text: text }; bLevel = level + 12.0; @@ -202,7 +202,7 @@ function createNotification(text) { imageURL: "http://hifi-public.s3.amazonaws.com/images/close-small-light.svg", color: { red: 255, green: 255, blue: 255}, visible: true, - alpha: backgroundAlpha, + alpha: backgroundAlpha }; Notify(overlayProperties, buttonProperties, height); @@ -242,7 +242,7 @@ function checkSize() { windowDimensions = Controller.getViewportDimensions(); overlayLocationX = (windowDimensions.x - (width + 60.0)); buttonLocationX = overlayLocationX + (width - 35.0); - createNotification(windowResize) + createNotification(windowResize); } } From adba46f90c7cc581bc72df94c691ca208211e531 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 20 Jan 2015 12:23:38 -0800 Subject: [PATCH 18/98] Lint: Preferred operators --- examples/notifications.js | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index d1d69e448d..a08a8b473e 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -109,7 +109,7 @@ function fadeIn(noticeIn, buttonIn) { pauseTimer = null; pauseTimer = Script.setInterval(function () { - q++; + q += 1; qFade = q / 10.0; Overlays.editOverlay(noticeIn, { alpha: qFade }); Overlays.editOverlay(buttonIn, { alpha: qFade }); @@ -126,7 +126,7 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { pauseTimer = null; pauseTimer = Script.setInterval(function () { - r--; + r -= 1; rFade = r / 10.0; Overlays.editOverlay(noticeOut, { alpha: rFade }); Overlays.editOverlay(buttonOut, { alpha: rFade }); @@ -142,7 +142,7 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { // Pushes data to each array and sets up data for 2nd dimension array // to handle auxiliary data not carried by the overlay class // specifically notification "heights", "times" of creation, and . -function Notify(notice, button, height) { +function notify(notice, button, height) { notifications.push((Overlays.addOverlay("text", notice))); buttons.push((Overlays.addOverlay("image", button))); times.push(new Date().getTime() / 1000); @@ -172,7 +172,7 @@ function createNotification(text) { breaks = count; } extraLine = breaks * 16.0; - for (i = 0; i < heights.length; i++) { + for (i = 0; i < heights.length; i += 1) { stack = stack + heights[i]; } @@ -205,7 +205,7 @@ function createNotification(text) { alpha: backgroundAlpha }; - Notify(overlayProperties, buttonProperties, height); + notify(overlayProperties, buttonProperties, height); } // wraps whole word to newline @@ -235,7 +235,7 @@ function wordWrap(str) { // This fires a notification on window resize function checkSize() { - if ((Window.innerWidth != ourWidth) || (Window.innerHeight != ourHeight)) { + if ((Window.innerWidth !== ourWidth) || (Window.innerHeight !== ourHeight)) { var windowResize = "Window has been resized"; ourWidth = Window.innerWidth; ourHeight = Window.innerHeight; @@ -255,11 +255,11 @@ function update() { j, k; - frame++; - if ((frame % 60.0) == 0) { // only update once a second + frame += 1; + if ((frame % 60.0) === 0) { // only update once a second checkSize(); // checks for size change to trigger windowResize notification locationY = 20.0; - for (i = 0; i < arrays.length; i++) { //repositions overlays as others fade + for (i = 0; i < arrays.length; i += 1) { //repositions overlays as others fade nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY }); Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0 }); @@ -268,7 +268,7 @@ function update() { } // This checks the age of the notification and prepares to fade it after 9.0 seconds (var persistTime - 1) - for (i = 0; i < arrays.length; i++) { + for (i = 0; i < arrays.length; i += 1) { if (ready) { j = arrays[i][2]; k = j + persistTime; @@ -318,13 +318,13 @@ function onOnlineUsersChanged(users) { if (!isStartingUp()) { // Skip user notifications at startup. for (user in users) { - if (last_users.indexOf(users[user]) == -1.0) { + if (last_users.indexOf(users[user]) === -1.0) { createNotification(users[user] + " has joined"); } } for (user in last_users) { - if (users.indexOf(last_users[user]) == -1.0) { + if (users.indexOf(last_users[user]) === -1.0) { createNotification(last_users[user] + " has left"); } } @@ -365,8 +365,8 @@ function mousePressEvent(event) { clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); //identify which overlay was clicked - for (i = 0; i < buttons.length; i++) { //if user clicked a button - if (clickedOverlay == buttons[i]) { + for (i = 0; i < buttons.length; i += 1) { //if user clicked a button + if (clickedOverlay === buttons[i]) { Overlays.deleteOverlay(notifications[i]); Overlays.deleteOverlay(buttons[i]); notifications.splice(i, 1); @@ -381,7 +381,7 @@ function mousePressEvent(event) { // Control key remains active only while key is held down function keyReleaseEvent(key) { - if (key.key == 16777249) { + if (key.key === 16777249) { ctrlIsPressed = false; } } @@ -392,18 +392,18 @@ function keyPressEvent(key) { welcome, noteString; - if (key.key == 16777249) { + if (key.key === 16777249) { ctrlIsPressed = true; } - if (key.text == "q") { //queries number of users online + if (key.text === "q") { //queries number of users online numUsers = GlobalServices.onlineUsers.length; welcome = "There are " + numUsers + " users online now."; createNotification(welcome); } - if (key.text == "s") { - if (ctrlIsPressed == true) { + if (key.text === "s") { + if (ctrlIsPressed === true) { noteString = "Snapshot taken."; createNotification(noteString); } @@ -414,7 +414,7 @@ function keyPressEvent(key) { function scriptEnding() { var i; - for (i = 0; i < notifications.length; i++) { + for (i = 0; i < notifications.length; i += 1) { Overlays.deleteOverlay(notifications[i]); Overlays.deleteOverlay(buttons[i]); } From 42b9ee8e77904b48f301cb74e9ca17674330d9ae Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 20 Jan 2015 12:51:34 -0800 Subject: [PATCH 19/98] Lint: Preferred control constructs --- examples/notifications.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index a08a8b473e..2929c61a64 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -216,8 +216,10 @@ function stringDivider(str, slotWidth, spaceReplacer) { if (str.length > slotWidth) { p = slotWidth; - for (; p > 0 && str[p] != ' '; p--) { + while (p > 0 && str[p] !== ' ') { + p -= 1; } + if (p > 0) { left = str.substring(0, p); right = str.substring(p + 1); @@ -314,18 +316,20 @@ function isStartingUp() { // Triggers notification if a user logs on or off function onOnlineUsersChanged(users) { - var user; + var user, + i; if (!isStartingUp()) { // Skip user notifications at startup. - for (user in users) { - if (last_users.indexOf(users[user]) === -1.0) { - createNotification(users[user] + " has joined"); + for (i = 0; i < users.length; i += 1) { + if (last_users.indexOf(users[i]) === -1.0) { + createNotification(users[i] + " has joined"); } + } - for (user in last_users) { - if (users.indexOf(last_users[user]) === -1.0) { - createNotification(last_users[user] + " has left"); + for (i = 0; i < last_users.length; i += 1) { + if (users.indexOf(last_users[i]) === -1.0) { + createNotification(last_users[i] + " has left"); } } } From 504bd5e1b1ac5b00940f1cde1b42a05d12655ec3 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 20 Jan 2015 18:34:47 -0800 Subject: [PATCH 20/98] Expose default eye position to JavaScript --- interface/src/avatar/MyAvatar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index a4a01373a0..e549abbc96 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -51,7 +51,7 @@ public: // getters float getLeanScale() const { return _leanScale; } glm::vec3 getGravity() const { return _gravity; } - glm::vec3 getDefaultEyePosition() const; + Q_INVOKABLE glm::vec3 getDefaultEyePosition() const; bool getShouldRenderLocally() const { return _shouldRender; } const QList& getAnimationHandles() const { return _animationHandles; } From 4c9b7f46a28ef85bc3ad8f977b7530d7410cfd7f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 21 Jan 2015 10:03:25 -0800 Subject: [PATCH 21/98] cleanup --- libraries/render-utils/src/GeometryCache.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index ab69528623..ae24fb74f9 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -208,7 +208,6 @@ private: QHash _solidCubeVBOs; QHash _quad2DVBOs; QHash _quad2DTextureVBOs; - //QHash _quad3DVBOs; QHash _quad3DTextureVBOs; QHash _registeredQuadVBOs; int _nextID; From be6c6ed8ca3ee83b67f2e016d40c6d3f8826517f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 21 Jan 2015 16:10:33 -0800 Subject: [PATCH 22/98] Add 3D notifications on a simple vertical plane --- examples/notifications.js | 110 ++++++++++++++++++++++++++++++-------- 1 file changed, 88 insertions(+), 22 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index 2929c61a64..0aad7c78d8 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -59,7 +59,6 @@ // } var width = 340.0; //width of notification overlay -var height = 40.0; // height of a single line notification overlay var windowDimensions = Controller.getViewportDimensions(); // get the size of the interface window var overlayLocationX = (windowDimensions.x - (width + 20.0)); // positions window 20px from the right of the interface window var buttonLocationX = overlayLocationX + (width - 28.0); @@ -86,6 +85,12 @@ var times = []; var heights = []; var myAlpha = []; var arrays = []; +var isOnHMD = false, + ENABLE_VR_MODE = "Enable VR Mode", + NOTIFICATIONS_3D_DISTANCE = 0.6, // Distance from avatar position. + NOTIFICATIONS_3D_ELEVATION = 0.0, // Height of top middle of top notification relative to avatar eyes. + NOTIFICATION_3D_SCALE = 0.002, // Multiplier that converts 2D overlay dimensions to 3D overlay dimensions. + NOTIFICATION_3D_BUTTON_WIDTH = 40 * NOTIFICATION_3D_SCALE; // Need a little more room for button in 3D. // push data from above to the 2 dimensional array function createArrays(notice, button, createTime, height, myAlpha) { @@ -143,13 +148,58 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { // to handle auxiliary data not carried by the overlay class // specifically notification "heights", "times" of creation, and . function notify(notice, button, height) { - notifications.push((Overlays.addOverlay("text", notice))); - buttons.push((Overlays.addOverlay("image", button))); - times.push(new Date().getTime() / 1000); + var noticeWidth, + noticeHeight, + noticeY, + position3D, + rotation3D, + last; + + if (isOnHMD) { + // Calculate 3D values using 2D overlay properties. + + rotation3D = MyAvatar.orientation; + + noticeWidth = notice.width * NOTIFICATION_3D_SCALE + NOTIFICATION_3D_BUTTON_WIDTH; + noticeHeight = notice.height * NOTIFICATION_3D_SCALE; + noticeY = NOTIFICATIONS_3D_ELEVATION - notice.y * NOTIFICATION_3D_SCALE - noticeHeight / 2; + + notice.size = { x: noticeWidth, y: noticeHeight }; + notice.topMargin = 0.75 * notice.topMargin * NOTIFICATION_3D_SCALE; + notice.leftMargin = 2 * notice.leftMargin * NOTIFICATION_3D_SCALE; + notice.bottomMargin = 0; + notice.rightMargin = 0; + notice.lineHeight = 10.0 * (fontSize / 12.0) * NOTIFICATION_3D_SCALE; + notice.isFacingAvatar = false; + + position3D = { x: 0, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE }; + position3D = Vec3.multiplyQbyV(rotation3D, position3D); + position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); + notice.position = position3D; + notice.rotation = rotation3D; + + button.url = button.imageURL; + button.scale = button.width * NOTIFICATION_3D_SCALE; + button.isFacingAvatar = false; + + position3D = { x: (noticeWidth - NOTIFICATION_3D_BUTTON_WIDTH) / 2, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE + 0.001 }; + position3D = Vec3.multiplyQbyV(rotation3D, position3D); + position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); + button.position = position3D; + button.rotation = rotation3D; + + notifications.push((Overlays.addOverlay("text3d", notice))); + buttons.push((Overlays.addOverlay("billboard", button))); + } else { + notifications.push((Overlays.addOverlay("text", notice))); + buttons.push((Overlays.addOverlay("image", button))); + } + height = height + 1.0; heights.push(height); + times.push(new Date().getTime() / 1000); myAlpha.push(0); - var last = notifications.length - 1; + last = notifications.length - 1; createArrays(notifications[last], buttons[last], times[last], heights[last], myAlpha[last]); fadeIn(notifications[last], buttons[last]); } @@ -163,7 +213,7 @@ function createNotification(text) { height = 40.0, stack = 0, level, - overlayProperties, + noticeProperties, bLevel, buttonProperties, i; @@ -178,7 +228,7 @@ function createNotification(text) { level = (stack + 20.0); height = height + extraLine; - overlayProperties = { + noticeProperties = { x: overlayLocationX, y: level, width: width, @@ -205,7 +255,18 @@ function createNotification(text) { alpha: backgroundAlpha }; - notify(overlayProperties, buttonProperties, height); + notify(noticeProperties, buttonProperties, height); +} + +function deleteNotification(index) { + Overlays.deleteOverlay(notifications[index]); + Overlays.deleteOverlay(buttons[index]); + notifications.splice(index, 1); + buttons.splice(index, 1); + times.splice(index, 1); + heights.splice(index, 1); + myAlpha.splice(index, 1); + arrays.splice(index, 1); } // wraps whole word to newline @@ -257,15 +318,27 @@ function update() { j, k; + if (isOnHMD !== Menu.isOptionChecked(ENABLE_VR_MODE)) { + while (arrays.length > 0) { + deleteNotification(0); + } + isOnHMD = !isOnHMD; + return; + } + frame += 1; if ((frame % 60.0) === 0) { // only update once a second checkSize(); // checks for size change to trigger windowResize notification - locationY = 20.0; - for (i = 0; i < arrays.length; i += 1) { //repositions overlays as others fade - nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); - Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY }); - Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0 }); - locationY = locationY + arrays[i][3]; + if (isOnHMD) { + // TODO + } else { + locationY = 20.0; + for (i = 0; i < arrays.length; i += 1) { //repositions overlays as others fade + nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); + Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY }); + Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0 }); + locationY = locationY + arrays[i][3]; + } } } @@ -371,14 +444,7 @@ function mousePressEvent(event) { for (i = 0; i < buttons.length; i += 1) { //if user clicked a button if (clickedOverlay === buttons[i]) { - Overlays.deleteOverlay(notifications[i]); - Overlays.deleteOverlay(buttons[i]); - notifications.splice(i, 1); - buttons.splice(i, 1); - times.splice(i, 1); - heights.splice(i, 1); - myAlpha.splice(i, 1); - arrays.splice(i, 1); + deleteNotification(i); } } } From 02a68096c364575d82e7bcad50c5be8f9f9bda83 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 21 Jan 2015 16:56:04 -0800 Subject: [PATCH 23/98] add debug for vec4 --- libraries/shared/src/StreamUtils.cpp | 10 ++++++++++ libraries/shared/src/StreamUtils.h | 1 + 2 files changed, 11 insertions(+) diff --git a/libraries/shared/src/StreamUtils.cpp b/libraries/shared/src/StreamUtils.cpp index 47bb8dd4e4..96967648ed 100644 --- a/libraries/shared/src/StreamUtils.cpp +++ b/libraries/shared/src/StreamUtils.cpp @@ -115,6 +115,16 @@ QDebug& operator<<(QDebug& dbg, const glm::vec3& v) { return dbg; } +QDebug& operator<<(QDebug& dbg, const glm::vec4& v) { + dbg.nospace() << "{type='glm::vec4'" + ", x=" << v.x << + ", y=" << v.y << + ", z=" << v.z << + ", w=" << v.w << + "}"; + return dbg; +} + QDebug& operator<<(QDebug& dbg, const glm::quat& q) { dbg.nospace() << "{type='glm::quat'" ", x=" << q.x << diff --git a/libraries/shared/src/StreamUtils.h b/libraries/shared/src/StreamUtils.h index d176d68e45..b9823a6743 100644 --- a/libraries/shared/src/StreamUtils.h +++ b/libraries/shared/src/StreamUtils.h @@ -51,6 +51,7 @@ class QDebug; // Add support for writing these to qDebug(). QDebug& operator<<(QDebug& s, const glm::vec2& v); QDebug& operator<<(QDebug& s, const glm::vec3& v); +QDebug& operator<<(QDebug& s, const glm::vec4& v); QDebug& operator<<(QDebug& s, const glm::quat& q); QDebug& operator<<(QDebug& s, const glm::mat4& m); #endif // QT_NO_DEBUG_STREAM From 9152865116dec05aaacb0a59dc6c391e8465e621 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 21 Jan 2015 16:56:41 -0800 Subject: [PATCH 24/98] first cut at supporting streamized spheres --- libraries/render-utils/src/GeometryCache.cpp | 113 ++++++++++++++----- libraries/render-utils/src/GeometryCache.h | 11 +- 2 files changed, 92 insertions(+), 32 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 48095d615e..294cd78544 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -52,10 +52,22 @@ const int NUM_BYTES_PER_VERTEX = NUM_COORDS_PER_VERTEX * sizeof(GLfloat); const int NUM_BYTES_PER_INDEX = sizeof(GLushort); void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid) { - VerticesIndices& vbo = _sphereVBOs[IntPair(slices, stacks)]; + + //Vec2Pair key(glm::vec2(radius, slices), glm::vec2(stacks, 0)); + IntPair key(slices, stacks); + +//qDebug() << " key:" << key; + + Vec3Pair colorKey(glm::vec3(color.x, color.y, slices),glm::vec3(color.z, color.y, stacks)); + + int vertices = slices * (stacks - 1) + 2; int indices = slices * stacks * NUM_VERTICES_PER_TRIANGULATED_QUAD; - if (vbo.first == 0) { + + if (!_sphereVertices.contains(key)) { + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + _sphereVertices[key] = verticesBuffer; + GLfloat* vertexData = new GLfloat[vertices * NUM_COORDS_PER_VERTEX]; GLfloat* vertex = vertexData; @@ -82,12 +94,21 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm *(vertex++) = 0.0f; *(vertex++) = 0.0f; *(vertex++) = 1.0f; - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); + + verticesBuffer->append(sizeof(GLfloat) * vertices * NUM_COORDS_PER_VERTEX, (gpu::Buffer::Byte*) vertexData); delete[] vertexData; - +qDebug() << "GeometryCache::renderSphere()..."; +qDebug() << " radius:" << radius; +qDebug() << " slices:" << slices; +qDebug() << " stacks:" << stacks; + +qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); + } + + if (!_sphereIndices.contains(key)) { + gpu::BufferPointer indicesBuffer(new gpu::Buffer()); + _sphereIndices[key] = indicesBuffer; + GLushort* indexData = new GLushort[indices]; GLushort* index = indexData; @@ -125,34 +146,73 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm *(index++) = bottom + i; *(index++) = top; } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); + indicesBuffer->append(sizeof(GLushort) * indices, (gpu::Buffer::Byte*) indexData); delete[] indexData; +qDebug() << "GeometryCache::renderSphere()..."; +qDebug() << " radius:" << radius; +qDebug() << " slices:" << slices; +qDebug() << " stacks:" << stacks; + +qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); + } + + if (!_sphereColors.contains(colorKey)) { + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + _sphereColors[colorKey] = colorBuffer; + + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + + int* colorData = new int[vertices]; + int* colorDataAt = colorData; + + for(int v = 0; v < vertices; v++) { + *(colorDataAt++) = compactColor; + } + + colorBuffer->append(sizeof(int) * vertices, (gpu::Buffer::Byte*) colorData); + delete[] colorData; + +qDebug() << "GeometryCache::renderSphere()..."; +qDebug() << " color:" << color; + +qDebug() << " _sphereColors.size():" << _sphereColors.size(); + + } + gpu::BufferPointer verticesBuffer = _sphereVertices[key]; + gpu::BufferPointer indicesBuffer = _sphereIndices[key]; + gpu::BufferPointer colorBuffer = _sphereColors[colorKey]; + - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); + const int VERTICES_SLOT = 0; + const int COLOR_SLOT = 1; + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); // 1 for everyone + streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + gpu::BufferView verticesView(verticesBuffer, streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); + gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); + + gpu::Batch batch; - glVertexPointer(3, GL_FLOAT, 0, 0); - glNormalPointer(GL_FLOAT, 0, 0); + batch.setInputFormat(streamFormat); + batch.setInputBuffer(VERTICES_SLOT, verticesView); + batch.setInputBuffer(COLOR_SLOT, colorView); + batch.setIndexBuffer(gpu::UINT16, indicesBuffer, 0); - glPushMatrix(); - glScalef(radius, radius, radius); if (solid) { - glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + batch.drawIndexed(gpu::TRIANGLES, indices); } else { - glDrawRangeElementsEXT(GL_LINES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + batch.drawIndexed(gpu::LINES, indices); } - glPopMatrix(); + + gpu::GLBackend::renderBatch(batch); glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } @@ -307,7 +367,6 @@ void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& int* colorData = new int[vertices]; int* colorDataAt = colorData; - for(int v = 0; v < vertices; v++) { *(colorDataAt++) = compactColor; } diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index ae24fb74f9..d53bd727d8 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -34,6 +34,8 @@ class NetworkMesh; class NetworkTexture; +typedef glm::vec3 Vec3Key; + typedef QPair Vec2Pair; typedef QPair Vec2PairPair; typedef QPair Vec3Pair; @@ -62,11 +64,6 @@ inline uint qHash(const Vec2PairPair& v, uint seed) { + 5051 * v.second.second.x + 5059 * v.second.second.y, seed); } -inline uint qHash(const glm::vec3& v, uint seed) { - // multiply by prime numbers greater than the possible size - return qHash(v.x + 5009 * v.y + 5011 * v.z, seed); -} - inline uint qHash(const Vec3Pair& v, uint seed) { // multiply by prime numbers greater than the possible size return qHash(v.first.x + 5009 * v.first.y + 5011 * v.first.z @@ -251,6 +248,10 @@ private: QHash _registeredAlternateGridBuffers; QHash _alternateGridBuffers; QHash _gridColors; + + QHash _sphereVertices; + QHash _sphereIndices; + QHash _sphereColors; QHash > _networkGeometry; From 567ac9eb2face9f817b4e24a08b1c15827a5273a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 21 Jan 2015 17:08:31 -0800 Subject: [PATCH 25/98] Update 3D notification positions as avatar moves --- examples/notifications.js | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index 0aad7c78d8..fcafe3a8b2 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -90,7 +90,8 @@ var isOnHMD = false, NOTIFICATIONS_3D_DISTANCE = 0.6, // Distance from avatar position. NOTIFICATIONS_3D_ELEVATION = 0.0, // Height of top middle of top notification relative to avatar eyes. NOTIFICATION_3D_SCALE = 0.002, // Multiplier that converts 2D overlay dimensions to 3D overlay dimensions. - NOTIFICATION_3D_BUTTON_WIDTH = 40 * NOTIFICATION_3D_SCALE; // Need a little more room for button in 3D. + NOTIFICATION_3D_BUTTON_WIDTH = 40 * NOTIFICATION_3D_SCALE, // Need a little more room for button in 3D. + overlay3DPositions = []; // push data from above to the 2 dimensional array function createArrays(notice, button, createTime, height, myAlpha) { @@ -106,6 +107,7 @@ function dismiss(firstNoteOut, firstButOut, firstOut) { times.splice(firstOut, 1); heights.splice(firstOut, 1); myAlpha.splice(firstOut, 1); + overlay3DPositions.splice(firstOut, 1); } function fadeIn(noticeIn, buttonIn) { @@ -151,6 +153,8 @@ function notify(notice, button, height) { var noticeWidth, noticeHeight, noticeY, + notificationPosition, + buttonPosition, position3D, rotation3D, last; @@ -172,8 +176,8 @@ function notify(notice, button, height) { notice.lineHeight = 10.0 * (fontSize / 12.0) * NOTIFICATION_3D_SCALE; notice.isFacingAvatar = false; - position3D = { x: 0, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE }; - position3D = Vec3.multiplyQbyV(rotation3D, position3D); + notificationPosition = { x: 0, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE }; + position3D = Vec3.multiplyQbyV(rotation3D, notificationPosition); position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); notice.position = position3D; notice.rotation = rotation3D; @@ -182,14 +186,19 @@ function notify(notice, button, height) { button.scale = button.width * NOTIFICATION_3D_SCALE; button.isFacingAvatar = false; - position3D = { x: (noticeWidth - NOTIFICATION_3D_BUTTON_WIDTH) / 2, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE + 0.001 }; - position3D = Vec3.multiplyQbyV(rotation3D, position3D); + buttonPosition = { + x: (noticeWidth - NOTIFICATION_3D_BUTTON_WIDTH) / 2, + y: noticeY, + z: -NOTIFICATIONS_3D_DISTANCE + 0.001 + }; + position3D = Vec3.multiplyQbyV(rotation3D, buttonPosition); position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); button.position = position3D; button.rotation = rotation3D; notifications.push((Overlays.addOverlay("text3d", notice))); buttons.push((Overlays.addOverlay("billboard", button))); + overlay3DPositions.push({ notification: notificationPosition, button: buttonPosition }); } else { notifications.push((Overlays.addOverlay("text", notice))); buttons.push((Overlays.addOverlay("image", button))); @@ -266,6 +275,7 @@ function deleteNotification(index) { times.splice(index, 1); heights.splice(index, 1); myAlpha.splice(index, 1); + overlay3DPositions.splice(index, 1); arrays.splice(index, 1); } @@ -314,6 +324,10 @@ function update() { noticeOut, buttonOut, arraysOut, + defaultEyePosition, + avatarOrientation, + notificationPosition, + buttonPosition, i, j, k; @@ -356,6 +370,21 @@ function update() { } } } + + if (isOnHMD && notifications.length > 0) { + // Update 3D overlays to maintain positions relative to avatar + defaultEyePosition = MyAvatar.getDefaultEyePosition(); + avatarOrientation = MyAvatar.orientation; + + for (i = 0; i < notifications.length; i += 1) { + notificationPosition = Vec3.sum(defaultEyePosition, + Vec3.multiplyQbyV(avatarOrientation, overlay3DPositions[i].notification)); + buttonPosition = Vec3.sum(defaultEyePosition, + Vec3.multiplyQbyV(avatarOrientation, overlay3DPositions[i].button)); + Overlays.editOverlay(notifications[i], { position: notificationPosition, rotation: avatarOrientation }); + Overlays.editOverlay(buttons[i], { position: buttonPosition, rotation: avatarOrientation }); + } + } } var STARTUP_TIMEOUT = 500, // ms From f3147ab3e4b05772ecb809aede47e4aacc890730 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 21 Jan 2015 17:58:50 -0800 Subject: [PATCH 26/98] Move 3D notifications up as old ones are deleted --- examples/notifications.js | 81 +++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index fcafe3a8b2..ecd95428aa 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -91,7 +91,7 @@ var isOnHMD = false, NOTIFICATIONS_3D_ELEVATION = 0.0, // Height of top middle of top notification relative to avatar eyes. NOTIFICATION_3D_SCALE = 0.002, // Multiplier that converts 2D overlay dimensions to 3D overlay dimensions. NOTIFICATION_3D_BUTTON_WIDTH = 40 * NOTIFICATION_3D_SCALE, // Need a little more room for button in 3D. - overlay3DPositions = []; + overlay3DDetails = []; // push data from above to the 2 dimensional array function createArrays(notice, button, createTime, height, myAlpha) { @@ -107,7 +107,7 @@ function dismiss(firstNoteOut, firstButOut, firstOut) { times.splice(firstOut, 1); heights.splice(firstOut, 1); myAlpha.splice(firstOut, 1); - overlay3DPositions.splice(firstOut, 1); + overlay3DDetails.splice(firstOut, 1); } function fadeIn(noticeIn, buttonIn) { @@ -146,15 +146,34 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { }, 20); } +function calculate3DOverlayPositions(noticeWidth, noticeHeight, y) { + var noticeY, + notificationPosition, + buttonPosition; + + noticeY = NOTIFICATIONS_3D_ELEVATION - y * NOTIFICATION_3D_SCALE - noticeHeight / 2; + notificationPosition = { x: 0, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE }; + buttonPosition = { + x: (noticeWidth - NOTIFICATION_3D_BUTTON_WIDTH) / 2, + y: noticeY, + z: -NOTIFICATIONS_3D_DISTANCE + 0.001 + }; + + return { + notificationPosition: notificationPosition, + buttonPosition: buttonPosition + }; +} + // Pushes data to each array and sets up data for 2nd dimension array // to handle auxiliary data not carried by the overlay class // specifically notification "heights", "times" of creation, and . function notify(notice, button, height) { var noticeWidth, noticeHeight, - noticeY, notificationPosition, buttonPosition, + positions, position3D, rotation3D, last; @@ -162,11 +181,8 @@ function notify(notice, button, height) { if (isOnHMD) { // Calculate 3D values using 2D overlay properties. - rotation3D = MyAvatar.orientation; - noticeWidth = notice.width * NOTIFICATION_3D_SCALE + NOTIFICATION_3D_BUTTON_WIDTH; noticeHeight = notice.height * NOTIFICATION_3D_SCALE; - noticeY = NOTIFICATIONS_3D_ELEVATION - notice.y * NOTIFICATION_3D_SCALE - noticeHeight / 2; notice.size = { x: noticeWidth, y: noticeHeight }; notice.topMargin = 0.75 * notice.topMargin * NOTIFICATION_3D_SCALE; @@ -176,21 +192,21 @@ function notify(notice, button, height) { notice.lineHeight = 10.0 * (fontSize / 12.0) * NOTIFICATION_3D_SCALE; notice.isFacingAvatar = false; - notificationPosition = { x: 0, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE }; + button.url = button.imageURL; + button.scale = button.width * NOTIFICATION_3D_SCALE; + button.isFacingAvatar = false; + + positions = calculate3DOverlayPositions(noticeWidth, noticeHeight, notice.y); + notificationPosition = positions.notificationPosition; + buttonPosition = positions.buttonPosition; + + rotation3D = MyAvatar.orientation; + position3D = Vec3.multiplyQbyV(rotation3D, notificationPosition); position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); notice.position = position3D; notice.rotation = rotation3D; - button.url = button.imageURL; - button.scale = button.width * NOTIFICATION_3D_SCALE; - button.isFacingAvatar = false; - - buttonPosition = { - x: (noticeWidth - NOTIFICATION_3D_BUTTON_WIDTH) / 2, - y: noticeY, - z: -NOTIFICATIONS_3D_DISTANCE + 0.001 - }; position3D = Vec3.multiplyQbyV(rotation3D, buttonPosition); position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); button.position = position3D; @@ -198,7 +214,12 @@ function notify(notice, button, height) { notifications.push((Overlays.addOverlay("text3d", notice))); buttons.push((Overlays.addOverlay("billboard", button))); - overlay3DPositions.push({ notification: notificationPosition, button: buttonPosition }); + overlay3DDetails.push({ + notificationPosition: notificationPosition, + buttonPosition: buttonPosition, + width: noticeWidth, + height: noticeHeight + }); } else { notifications.push((Overlays.addOverlay("text", notice))); buttons.push((Overlays.addOverlay("image", button))); @@ -275,7 +296,7 @@ function deleteNotification(index) { times.splice(index, 1); heights.splice(index, 1); myAlpha.splice(index, 1); - overlay3DPositions.splice(index, 1); + overlay3DDetails.splice(index, 1); arrays.splice(index, 1); } @@ -328,6 +349,7 @@ function update() { avatarOrientation, notificationPosition, buttonPosition, + positions, i, j, k; @@ -343,16 +365,17 @@ function update() { frame += 1; if ((frame % 60.0) === 0) { // only update once a second checkSize(); // checks for size change to trigger windowResize notification - if (isOnHMD) { - // TODO - } else { - locationY = 20.0; - for (i = 0; i < arrays.length; i += 1) { //repositions overlays as others fade - nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); - Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY }); - Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0 }); - locationY = locationY + arrays[i][3]; + locationY = 20.0; + for (i = 0; i < arrays.length; i += 1) { //repositions overlays as others fade + nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); + Overlays.editOverlay(notifications[i], { x: overlayLocationX, y: locationY }); + Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0 }); + if (isOnHMD) { + positions = calculate3DOverlayPositions(overlay3DDetails[i].width, overlay3DDetails[i].height, locationY); + overlay3DDetails[i].notificationPosition = positions.notificationPosition; + overlay3DDetails[i].buttonPosition = positions.buttonPosition; } + locationY = locationY + arrays[i][3]; } } @@ -378,9 +401,9 @@ function update() { for (i = 0; i < notifications.length; i += 1) { notificationPosition = Vec3.sum(defaultEyePosition, - Vec3.multiplyQbyV(avatarOrientation, overlay3DPositions[i].notification)); + Vec3.multiplyQbyV(avatarOrientation, overlay3DDetails[i].notificationPosition)); buttonPosition = Vec3.sum(defaultEyePosition, - Vec3.multiplyQbyV(avatarOrientation, overlay3DPositions[i].button)); + Vec3.multiplyQbyV(avatarOrientation, overlay3DDetails[i].buttonPosition)); Overlays.editOverlay(notifications[i], { position: notificationPosition, rotation: avatarOrientation }); Overlays.editOverlay(buttons[i], { position: buttonPosition, rotation: avatarOrientation }); } From 00de7062cc4bad4e9ab9b5bdc6b2b1f504114872 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 21 Jan 2015 18:03:00 -0800 Subject: [PATCH 27/98] Longer persist time for 3D notifications --- examples/notifications.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/notifications.js b/examples/notifications.js index ecd95428aa..d02e31cd0f 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -69,7 +69,9 @@ var textColor = { red: 228, green: 228, blue: 228}; // text color var backColor = { red: 2, green: 2, blue: 2}; // background color was 38,38,38 var backgroundAlpha = 0; var fontSize = 12.0; -var persistTime = 10.0; // time in seconds before notification fades +var PERSIST_TIME_2D = 10.0; // Time in seconds before notification fades +var PERSIST_TIME_3D = 15.0; +var persistTime = PERSIST_TIME_2D; var clickedText = false; var frame = 0; var ourWidth = Window.innerWidth; @@ -359,6 +361,7 @@ function update() { deleteNotification(0); } isOnHMD = !isOnHMD; + persistTime = isOnHMD ? PERSIST_TIME_3D : PERSIST_TIME_2D; return; } From ef7ea0eaa68ca6ffa323d8185eb7398f2bea67cf Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 21 Jan 2015 21:34:34 -0800 Subject: [PATCH 28/98] Position and angle 3D notifications in lower part of view --- examples/notifications.js | 67 ++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index d02e31cd0f..682750f56f 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -89,8 +89,11 @@ var myAlpha = []; var arrays = []; var isOnHMD = false, ENABLE_VR_MODE = "Enable VR Mode", - NOTIFICATIONS_3D_DISTANCE = 0.6, // Distance from avatar position. - NOTIFICATIONS_3D_ELEVATION = 0.0, // Height of top middle of top notification relative to avatar eyes. + NOTIFICATIONS_3D_DIRECTION = 0.0, // Degrees from avatar orientation. + NOTIFICATIONS_3D_DISTANCE = 0.6, // Horizontal distance from avatar position. + NOTIFICATIONS_3D_ELEVATION = -0.8, // Height of top middle of top notification relative to avatar eyes. + NOTIFICATIONS_3D_YAW = 0.0, // Degrees relative to notifications direction. + NOTIFICATIONS_3D_PITCH = -60.0, // Degrees from vertical. NOTIFICATION_3D_SCALE = 0.002, // Multiplier that converts 2D overlay dimensions to 3D overlay dimensions. NOTIFICATION_3D_BUTTON_WIDTH = 40 * NOTIFICATION_3D_SCALE, // Need a little more room for button in 3D. overlay3DDetails = []; @@ -149,19 +152,33 @@ function fadeOut(noticeOut, buttonOut, arraysOut) { } function calculate3DOverlayPositions(noticeWidth, noticeHeight, y) { + // Calculates overlay positions and orientations in avatar coordinates. var noticeY, + originOffset, + notificationOrientation, notificationPosition, buttonPosition; - noticeY = NOTIFICATIONS_3D_ELEVATION - y * NOTIFICATION_3D_SCALE - noticeHeight / 2; - notificationPosition = { x: 0, y: noticeY, z: -NOTIFICATIONS_3D_DISTANCE }; - buttonPosition = { - x: (noticeWidth - NOTIFICATION_3D_BUTTON_WIDTH) / 2, - y: noticeY, - z: -NOTIFICATIONS_3D_DISTANCE + 0.001 - }; + // Notification plane positions + noticeY = -y * NOTIFICATION_3D_SCALE - noticeHeight / 2; + notificationPosition = { x: 0, y: noticeY, z: 0 }; + buttonPosition = { x: (noticeWidth - NOTIFICATION_3D_BUTTON_WIDTH) / 2, y: noticeY, z: 0.001 }; + + // Rotate plane + notificationOrientation = Quat.fromPitchYawRollDegrees(NOTIFICATIONS_3D_PITCH, + NOTIFICATIONS_3D_DIRECTION + NOTIFICATIONS_3D_YAW, 0); + notificationPosition = Vec3.multiplyQbyV(notificationOrientation, notificationPosition); + buttonPosition = Vec3.multiplyQbyV(notificationOrientation, buttonPosition); + + // Translate plane + originOffset = Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, NOTIFICATIONS_3D_DIRECTION, 0), + { x: 0, y: 0, z: -NOTIFICATIONS_3D_DISTANCE }); + originOffset.y += NOTIFICATIONS_3D_ELEVATION; + notificationPosition = Vec3.sum(originOffset, notificationPosition); + buttonPosition = Vec3.sum(originOffset, buttonPosition); return { + notificationOrientation: notificationOrientation, notificationPosition: notificationPosition, buttonPosition: buttonPosition }; @@ -173,15 +190,11 @@ function calculate3DOverlayPositions(noticeWidth, noticeHeight, y) { function notify(notice, button, height) { var noticeWidth, noticeHeight, - notificationPosition, - buttonPosition, positions, - position3D, - rotation3D, last; if (isOnHMD) { - // Calculate 3D values using 2D overlay properties. + // Calculate 3D values from 2D overlay properties. noticeWidth = notice.width * NOTIFICATION_3D_SCALE + NOTIFICATION_3D_BUTTON_WIDTH; noticeHeight = notice.height * NOTIFICATION_3D_SCALE; @@ -199,26 +212,13 @@ function notify(notice, button, height) { button.isFacingAvatar = false; positions = calculate3DOverlayPositions(noticeWidth, noticeHeight, notice.y); - notificationPosition = positions.notificationPosition; - buttonPosition = positions.buttonPosition; - - rotation3D = MyAvatar.orientation; - - position3D = Vec3.multiplyQbyV(rotation3D, notificationPosition); - position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); - notice.position = position3D; - notice.rotation = rotation3D; - - position3D = Vec3.multiplyQbyV(rotation3D, buttonPosition); - position3D = Vec3.sum(MyAvatar.getDefaultEyePosition(), position3D); - button.position = position3D; - button.rotation = rotation3D; notifications.push((Overlays.addOverlay("text3d", notice))); buttons.push((Overlays.addOverlay("billboard", button))); overlay3DDetails.push({ - notificationPosition: notificationPosition, - buttonPosition: buttonPosition, + notificationOrientation: positions.notificationOrientation, + notificationPosition: positions.notificationPosition, + buttonPosition: positions.buttonPosition, width: noticeWidth, height: noticeHeight }); @@ -350,6 +350,7 @@ function update() { defaultEyePosition, avatarOrientation, notificationPosition, + notificationOrientation, buttonPosition, positions, i, @@ -375,6 +376,7 @@ function update() { Overlays.editOverlay(buttons[i], { x: buttonLocationX, y: locationY + 12.0 }); if (isOnHMD) { positions = calculate3DOverlayPositions(overlay3DDetails[i].width, overlay3DDetails[i].height, locationY); + overlay3DDetails[i].notificationOrientation = positions.notificationOrientation; overlay3DDetails[i].notificationPosition = positions.notificationPosition; overlay3DDetails[i].buttonPosition = positions.buttonPosition; } @@ -405,10 +407,11 @@ function update() { for (i = 0; i < notifications.length; i += 1) { notificationPosition = Vec3.sum(defaultEyePosition, Vec3.multiplyQbyV(avatarOrientation, overlay3DDetails[i].notificationPosition)); + notificationOrientation = Quat.multiply(avatarOrientation, overlay3DDetails[i].notificationOrientation); buttonPosition = Vec3.sum(defaultEyePosition, Vec3.multiplyQbyV(avatarOrientation, overlay3DDetails[i].buttonPosition)); - Overlays.editOverlay(notifications[i], { position: notificationPosition, rotation: avatarOrientation }); - Overlays.editOverlay(buttons[i], { position: buttonPosition, rotation: avatarOrientation }); + Overlays.editOverlay(notifications[i], { position: notificationPosition, rotation: notificationOrientation }); + Overlays.editOverlay(buttons[i], { position: buttonPosition, rotation: notificationOrientation }); } } } From 7d1cc1f20dc807a00392865fff529895c9d41060 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 21 Jan 2015 21:44:55 -0800 Subject: [PATCH 29/98] Make 3D "x" button work --- examples/notifications.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index 682750f56f..525d438fe6 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -495,12 +495,18 @@ function onMuteStateChanged() { // handles mouse clicks on buttons function mousePressEvent(event) { - var clickedOverlay, + var pickRay, + clickedOverlay, i; - clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); //identify which overlay was clicked + if (isOnHMD) { + pickRay = Camera.computePickRay(event.x, event.y); + clickedOverlay = Overlays.findRayIntersection(pickRay).overlayID; + } else { + clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); + } - for (i = 0; i < buttons.length; i += 1) { //if user clicked a button + for (i = 0; i < buttons.length; i += 1) { if (clickedOverlay === buttons[i]) { deleteNotification(i); } From 958d853b565237dc2c8aa649f62a1bfdf6cbd5aa Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Jan 2015 14:13:54 -0800 Subject: [PATCH 30/98] Add BatchLoader --- libraries/script-engine/src/BatchLoader.cpp | 82 +++++++++++++++++++++ libraries/script-engine/src/BatchLoader.h | 45 +++++++++++ 2 files changed, 127 insertions(+) create mode 100644 libraries/script-engine/src/BatchLoader.cpp create mode 100644 libraries/script-engine/src/BatchLoader.h diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp new file mode 100644 index 0000000000..c44742c0b6 --- /dev/null +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -0,0 +1,82 @@ +// +// BatchLoader.cpp +// libraries/script-engine/src +// +// Created by Ryan Huffman on 01/22/15 +// Copyright 2015 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 +#include + +#include +#include "BatchLoader.h" +#include + +BatchLoader::BatchLoader(const QList& urls) + : QObject(), + _finished(false), + _urls(urls.toSet()), + _started(false), + _data() { +} + +void BatchLoader::start() { + if (_started) { + return; + } + + _started = true; + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + for (QUrl url : _urls) { + if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + + qDebug() << "Downloading file at" << url; + + connect(reply, &QNetworkReply::finished, [=]() { + if (reply->error()) { + emit errorLoadingFile(url); + _data.insert(url, QString()); + } else { + _data.insert(url, reply->readAll()); + } + reply->deleteLater(); + checkFinished(); + }); + + // If we end up being destroyed before the reply finishes, clean it up + connect(this, &QObject::destroyed, reply, &QObject::deleteLater); + + } else { +#ifdef _WIN32 + QString fileName = url.toString(); +#else + QString fileName = url.toLocalFile(); +#endif + + qDebug() << "Reading file at " << fileName; + + QFile scriptFile(fileName); + if (scriptFile.open(QFile::ReadOnly | QFile::Text)) { + QTextStream in(&scriptFile); + _data.insert(url, in.readAll()); + // includeContents = in.readAll(); + } else { + emit errorLoadingFile(url); + _data.insert(url, QString()); + } + } + } + checkFinished(); +} + +void BatchLoader::checkFinished() { + if (!_finished && _urls.size() == _data.size()) { + _finished = true; + emit finished(_data); + } +} diff --git a/libraries/script-engine/src/BatchLoader.h b/libraries/script-engine/src/BatchLoader.h new file mode 100644 index 0000000000..f165aafed4 --- /dev/null +++ b/libraries/script-engine/src/BatchLoader.h @@ -0,0 +1,45 @@ +// +// BatchLoader.h +// libraries/script-engine/src +// +// Created by Ryan Huffman on 01/22/15 +// Copyright 2015 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_BatchLoader_h +#define hifi_BatchLoader_h + +#include +#include +#include +#include +#include +#include + +#include + +class BatchLoader : public QObject { + Q_OBJECT +public: + BatchLoader(const QList& urls) ; + + void start(); + bool isFinished() const { return _finished; }; + +signals: + void finished(const QMap& data); + void errorLoadingFile(QUrl url); + +private: + void checkFinished(); + + bool _finished; + bool _started; + QSet _urls; + QMap _data; +}; + +#endif // hifi_BatchLoader_h From 38b38eb063422d625afa3137ae094fb0a3984ebe Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Jan 2015 14:14:21 -0800 Subject: [PATCH 31/98] Update ScriptEngine to use BatchLoader --- libraries/script-engine/src/ScriptEngine.cpp | 77 +++++++++++--------- libraries/script-engine/src/ScriptEngine.h | 1 + 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 0f860208f4..a505b63b69 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -31,6 +31,7 @@ #include "AnimationObject.h" #include "ArrayBufferViewClass.h" +#include "BatchLoader.h" #include "DataViewClass.h" #include "EventTypes.h" #include "MenuItemProperties.h" @@ -304,7 +305,7 @@ QScriptValue ScriptEngine::evaluate(const QString& program, const QString& fileN QScriptValue result = QScriptEngine::evaluate(program, fileName, lineNumber); if (hasUncaughtException()) { int line = uncaughtExceptionLineNumber(); - qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ": " << result.toString(); + qDebug() << "Uncaught exception at (" << _fileNameString << " : " << fileName << ") line" << line << ": " << result.toString(); } emit evaluationFinished(result, hasUncaughtException()); clearExceptions(); @@ -595,46 +596,52 @@ void ScriptEngine::print(const QString& message) { emit printedMessage(message); } -void ScriptEngine::include(const QString& includeFile) { - QUrl url = resolvePath(includeFile); - QString includeContents; +void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callback) { + QList urls; + for (QString file : includeFiles) { + urls.append(resolvePath(file)); + } - if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { - QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); - qDebug() << "Downloading included script at" << includeFile; - QEventLoop loop; - QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - loop.exec(); - includeContents = reply->readAll(); - reply->deleteLater(); - } else { -#ifdef _WIN32 - QString fileName = url.toString(); -#else - QString fileName = url.toLocalFile(); -#endif - - QFile scriptFile(fileName); - if (scriptFile.open(QFile::ReadOnly | QFile::Text)) { - qDebug() << "Including file:" << fileName; - QTextStream in(&scriptFile); - includeContents = in.readAll(); - } else { - qDebug() << "ERROR Including file:" << fileName; - emit errorMessage("ERROR Including file:" + fileName); + BatchLoader* loader = new BatchLoader(urls); + + auto evaluateScripts = [=](const QMap& data) { + for (QUrl url : urls) { + QString contents = data[url]; + qDebug() << "About to load: " << url; + if (contents.isNull()) { + qDebug() << "Error loading file: " << url; + } else { + QScriptValue result = evaluate(contents, url.toString()); + } } - } - QScriptValue result = evaluate(includeContents); - if (hasUncaughtException()) { - int line = uncaughtExceptionLineNumber(); - qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString(); - emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString()); - clearExceptions(); + if (callback.isFunction()) { + QScriptValue(callback).call(); + } + + loader->deleteLater(); + }; + + connect(loader, &BatchLoader::finished, this, evaluateScripts); + + // If we are destroyed before the loader completes, make sure to clean it up + connect(this, &QObject::destroyed, loader, &QObject::deleteLater); + + loader->start(); + + if (!callback.isFunction() && !loader->isFinished()) { + QEventLoop loop; + QObject::connect(loader, &BatchLoader::finished, &loop, &QEventLoop::quit); + loop.exec(); } } +void ScriptEngine::include(const QString& includeFile) { + QStringList urls; + urls.append(includeFile); + include(urls); +} + void ScriptEngine::load(const QString& loadFile) { QUrl url = resolvePath(loadFile); emit loadScript(url.toString(), false); diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 10f419937a..126e943982 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -96,6 +96,7 @@ public slots: QObject* setTimeout(const QScriptValue& function, int timeoutMS); void clearInterval(QObject* timer) { stopTimer(reinterpret_cast(timer)); } void clearTimeout(QObject* timer) { stopTimer(reinterpret_cast(timer)); } + void include(const QStringList& includeFiles, QScriptValue callback = QScriptValue()); void include(const QString& includeFile); void load(const QString& loadfile); void print(const QString& message); From 4fd5f743651479c33db04c8e29ffb7d1a16bfc10 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Jan 2015 14:14:49 -0800 Subject: [PATCH 32/98] Update editEntities.js to load includes in parallel --- examples/editEntities.js | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index 9187b624fd..f9d881f0bd 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -12,34 +12,37 @@ // HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; -Script.include("libraries/stringHelpers.js"); -Script.include("libraries/dataviewHelpers.js"); -Script.include("libraries/httpMultiPart.js"); -Script.include("libraries/modelUploader.js"); -Script.include("libraries/toolBars.js"); -Script.include("libraries/progressDialog.js"); -Script.include("libraries/entitySelectionTool.js"); +Script.include([ + "http://public.highfidelity.io/scripts/libraries/stringHelpers.js", + "http://public.highfidelity.io/scripts/libraries/dataviewHelpers.js", + "http://public.highfidelity.io/scripts/libraries/httpMultiPart.js", + "http://public.highfidelity.io/scripts/libraries/modelUploader.js", + "http://public.highfidelity.io/scripts/libraries/toolBars.js", + "http://public.highfidelity.io/scripts/libraries/progressDialog.js", + + "http://public.highfidelity.io/scripts/libraries/entitySelectionTool.js", + "http://public.highfidelity.io/scripts/libraries/ModelImporter.js", + + "http://public.highfidelity.io/scripts/libraries/ExportMenu.js", + "http://public.highfidelity.io/scripts/libraries/ToolTip.js", + + "http://public.highfidelity.io/scripts/libraries/entityPropertyDialogBox.js", + "http://public.highfidelity.io/scripts/libraries/entityCameraTool.js", + "http://public.highfidelity.io/scripts/libraries/gridTool.js", + "http://public.highfidelity.io/scripts/libraries/entityList.js", +]); + var selectionDisplay = SelectionDisplay; var selectionManager = SelectionManager; - -Script.include("libraries/ModelImporter.js"); var modelImporter = new ModelImporter(); - -Script.include("libraries/ExportMenu.js"); -Script.include("libraries/ToolTip.js"); - -Script.include("libraries/entityPropertyDialogBox.js"); var entityPropertyDialogBox = EntityPropertyDialogBox; -Script.include("libraries/entityCameraTool.js"); var cameraManager = new CameraManager(); -Script.include("libraries/gridTool.js"); var grid = Grid(); gridTool = GridTool({ horizontalGrid: grid }); -Script.include("libraries/entityList.js"); var entityListTool = EntityListTool(); var hasShownPropertiesTool = false; From b4132f1e7dd596b384d1e61c2677971a63bb3b7e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Jan 2015 14:16:36 -0800 Subject: [PATCH 33/98] Remove commented line --- libraries/script-engine/src/BatchLoader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp index c44742c0b6..ed6591423f 100644 --- a/libraries/script-engine/src/BatchLoader.cpp +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -64,7 +64,6 @@ void BatchLoader::start() { if (scriptFile.open(QFile::ReadOnly | QFile::Text)) { QTextStream in(&scriptFile); _data.insert(url, in.readAll()); - // includeContents = in.readAll(); } else { emit errorLoadingFile(url); _data.insert(url, QString()); From e27db48e262c6297d3956bb36dcfa2de7a1c9c24 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Jan 2015 14:20:42 -0800 Subject: [PATCH 34/98] Remove qDebug and unnecessary include --- libraries/script-engine/src/BatchLoader.h | 2 -- libraries/script-engine/src/ScriptEngine.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/libraries/script-engine/src/BatchLoader.h b/libraries/script-engine/src/BatchLoader.h index f165aafed4..6d19b2322f 100644 --- a/libraries/script-engine/src/BatchLoader.h +++ b/libraries/script-engine/src/BatchLoader.h @@ -19,8 +19,6 @@ #include #include -#include - class BatchLoader : public QObject { Q_OBJECT public: diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index a505b63b69..246f9d3be3 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -607,7 +607,6 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac auto evaluateScripts = [=](const QMap& data) { for (QUrl url : urls) { QString contents = data[url]; - qDebug() << "About to load: " << url; if (contents.isNull()) { qDebug() << "Error loading file: " << url; } else { From 22cdf1cb226928fd806ebb415e1b191f3dace368 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Jan 2015 14:24:20 -0800 Subject: [PATCH 35/98] Remove BatchLoader::errorLoadingFile and reorder properties --- libraries/script-engine/src/BatchLoader.cpp | 4 +--- libraries/script-engine/src/BatchLoader.h | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp index ed6591423f..e2c345ce16 100644 --- a/libraries/script-engine/src/BatchLoader.cpp +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -18,9 +18,9 @@ BatchLoader::BatchLoader(const QList& urls) : QObject(), + _started(false), _finished(false), _urls(urls.toSet()), - _started(false), _data() { } @@ -39,7 +39,6 @@ void BatchLoader::start() { connect(reply, &QNetworkReply::finished, [=]() { if (reply->error()) { - emit errorLoadingFile(url); _data.insert(url, QString()); } else { _data.insert(url, reply->readAll()); @@ -65,7 +64,6 @@ void BatchLoader::start() { QTextStream in(&scriptFile); _data.insert(url, in.readAll()); } else { - emit errorLoadingFile(url); _data.insert(url, QString()); } } diff --git a/libraries/script-engine/src/BatchLoader.h b/libraries/script-engine/src/BatchLoader.h index 6d19b2322f..cda040d219 100644 --- a/libraries/script-engine/src/BatchLoader.h +++ b/libraries/script-engine/src/BatchLoader.h @@ -29,13 +29,12 @@ public: signals: void finished(const QMap& data); - void errorLoadingFile(QUrl url); private: void checkFinished(); - bool _finished; bool _started; + bool _finished; QSet _urls; QMap _data; }; From 812fbc58fb3da9a50c3dfe5dadbbb3d26c733af2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 23 Jan 2015 19:13:29 -0800 Subject: [PATCH 36/98] Use custom User-Agent string --- assignment-client/src/Agent.cpp | 4 +++- domain-server/src/DomainServer.cpp | 5 ++++- interface/src/Application.cpp | 1 + interface/src/ModelUploader.cpp | 1 + interface/src/ScriptsModel.cpp | 1 + interface/src/ui/ModelsBrowser.cpp | 3 +++ interface/src/ui/ScriptEditorWidget.cpp | 4 +++- interface/src/ui/SnapshotShareDialog.cpp | 3 +++ interface/src/ui/overlays/BillboardOverlay.cpp | 4 +++- libraries/avatars/src/AvatarData.cpp | 5 ++++- libraries/avatars/src/Recording.cpp | 4 +++- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 4 +++- libraries/networking/src/AccountManager.cpp | 6 +++++- libraries/networking/src/DomainHandler.cpp | 5 ++++- libraries/networking/src/OAuthNetworkAccessManager.cpp | 2 ++ libraries/networking/src/ResourceCache.cpp | 4 +++- libraries/script-engine/src/ScriptEngine.cpp | 8 ++++++-- libraries/script-engine/src/XMLHttpRequestClass.cpp | 1 + libraries/shared/src/SharedUtil.h | 5 ++++- 19 files changed, 57 insertions(+), 13 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index eab67818c4..cb1666536f 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -169,7 +169,9 @@ void Agent::run() { } QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply *reply = networkAccessManager.get(QNetworkRequest(scriptURL)); + QNetworkRequest networkRequest = QNetworkRequest(scriptURL); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); QNetworkDiskCache* cache = new QNetworkDiskCache(); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 791c7e37b6..f697438b85 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1712,6 +1712,7 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u .arg(authorizationCode, oauthRedirectURL().toString(), _oauthClientID, _oauthClientSecret); QNetworkRequest tokenRequest(tokenRequestUrl); + tokenRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); tokenRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply* tokenReply = NetworkAccessManager::getInstance().post(tokenRequest, tokenPostBody.toLocal8Bit()); @@ -1901,7 +1902,9 @@ QNetworkReply* DomainServer::profileRequestGivenTokenReply(QNetworkReply* tokenR profileURL.setPath("/api/v1/user/profile"); profileURL.setQuery(QString("%1=%2").arg(OAUTH_JSON_ACCESS_TOKEN_KEY, accessToken)); - return NetworkAccessManager::getInstance().get(QNetworkRequest(profileURL)); + QNetworkRequest profileRequest(profileURL); + profileRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + return NetworkAccessManager::getInstance().get(profileRequest); } const QString DS_SETTINGS_SESSIONS_GROUP = "web-sessions"; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 86af8b0e91..0b1b4236bb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3786,6 +3786,7 @@ void Application::initAvatarAndViewFrustum() { void Application::checkVersion() { QNetworkRequest latestVersionRequest((QUrl(CHECK_VERSION_URL))); + latestVersionRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); latestVersionRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); QNetworkReply* reply = NetworkAccessManager::getInstance().get(latestVersionRequest); connect(reply, SIGNAL(finished()), SLOT(parseVersionXml())); diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index dd691cf765..59a537a7e6 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -487,6 +487,7 @@ void ModelUploader::uploadFailed(QNetworkReply& errorReply) { void ModelUploader::checkS3() { qDebug() << "Checking S3 for " << _url; QNetworkRequest request(_url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = NetworkAccessManager::getInstance().head(request); connect(reply, SIGNAL(finished()), SLOT(processCheck())); } diff --git a/interface/src/ScriptsModel.cpp b/interface/src/ScriptsModel.cpp index b09762b73c..933994b8e2 100644 --- a/interface/src/ScriptsModel.cpp +++ b/interface/src/ScriptsModel.cpp @@ -165,6 +165,7 @@ void ScriptsModel::requestRemoteFiles(QString marker) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); } diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index 8c1d90d8b5..e22294876d 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "ModelsBrowser.h" @@ -226,6 +227,7 @@ void ModelHandler::update() { QUrl url(_model.item(i,0)->data(Qt::UserRole).toString()); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.head(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); } @@ -277,6 +279,7 @@ void ModelHandler::queryNewFiles(QString marker) { url.setQuery(query); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 660b9009b6..35334350f4 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -152,7 +152,9 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading included script at" << scriptPath; QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 47914e0a12..3053c3ee0a 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -11,6 +11,7 @@ #include "SnapshotShareDialog.h" #include "AccountManager.h" +#include "SharedUtil.h" #include #include @@ -112,6 +113,7 @@ void SnapshotShareDialog::uploadSnapshot() { QUrl url(FORUM_UPLOADS_URL); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = NetworkAccessManager::getInstance().post(request, multiPart); connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); @@ -124,6 +126,7 @@ void SnapshotShareDialog::uploadSnapshot() { void SnapshotShareDialog::sendForumPost(QString snapshotPath) { // post to Discourse forum QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QUrl forumUrl(FORUM_POST_URL); QUrlQuery query; diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index b34416f566..9c64280bd6 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -196,7 +196,9 @@ void BillboardOverlay::setBillboardURL(const QString& url) { _billboard.clear(); _newTextureNeeded = true; - QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(actualURL)); + QNetworkRequest request(actualURL); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(request); connect(reply, &QNetworkReply::finished, this, &BillboardOverlay::replyFinished); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 21bbdefc80..c8f6ca18ec 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1021,6 +1021,7 @@ void AvatarData::setBillboardFromURL(const QString &billboardURL) { qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); QNetworkRequest billboardRequest; + billboardRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); billboardRequest.setUrl(QUrl(billboardURL)); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); @@ -1089,7 +1090,9 @@ void AvatarData::updateJointMappings() { if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* networkReply = networkAccessManager.get(QNetworkRequest(_skeletonModelURL)); + QNetworkRequest networkRequest = QNetworkRequest(_skeletonModelURL); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* networkReply = networkAccessManager.get(networkRequest); connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply())); } } diff --git a/libraries/avatars/src/Recording.cpp b/libraries/avatars/src/Recording.cpp index a258247f13..7fa8b79bda 100644 --- a/libraries/avatars/src/Recording.cpp +++ b/libraries/avatars/src/Recording.cpp @@ -370,7 +370,9 @@ RecordingPointer readRecordingFromFile(RecordingPointer recording, const QString // Download file if necessary qDebug() << "Downloading recording at" << url; QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); // wait for file diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 47e9237ddc..c30b83aaa5 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -135,7 +135,9 @@ QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorTe } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading script at" << url; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index c4a4c4a458..8a17111b39 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -24,6 +24,7 @@ #include "NodeList.h" #include "PacketHeaders.h" #include "RSAKeypairGenerator.h" +#include "SharedUtil.h" #include "AccountManager.h" @@ -197,7 +198,8 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest; - + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QUrl requestURL = _authURL; if (path.startsWith("/")) { @@ -387,6 +389,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QUrl grantURL = _authURL; grantURL.setPath("/oauth/token"); @@ -456,6 +459,7 @@ void AccountManager::requestProfile() { profileURL.setPath("/api/v1/user/profile"); QNetworkRequest profileRequest(profileURL); + profileRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); profileRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue()); QNetworkReply* profileReply = networkAccessManager.get(profileRequest); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 67cf81a73a..fe50647c20 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -17,6 +17,7 @@ #include "HifiSockAddr.h" #include "NodeList.h" #include "PacketHeaders.h" +#include "SharedUtil.h" #include "UserActivityLogger.h" #include "DomainHandler.h" @@ -203,7 +204,9 @@ void DomainHandler::requestDomainSettings() { qDebug() << "Requesting domain-server settings at" << settingsJSONURL.toString(); - QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(settingsJSONURL)); + QNetworkRequest settingsRequest(settingsJSONURL); + settingsRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(settingsRequest); connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished); } } diff --git a/libraries/networking/src/OAuthNetworkAccessManager.cpp b/libraries/networking/src/OAuthNetworkAccessManager.cpp index 493398230a..1a52dc4ce7 100644 --- a/libraries/networking/src/OAuthNetworkAccessManager.cpp +++ b/libraries/networking/src/OAuthNetworkAccessManager.cpp @@ -14,6 +14,7 @@ #include #include "AccountManager.h" +#include "SharedUtil.h" #include "OAuthNetworkAccessManager.h" @@ -33,6 +34,7 @@ QNetworkReply* OAuthNetworkAccessManager::createRequest(QNetworkAccessManager::O if (accountManager.hasValidAccessToken()) { QNetworkRequest authenticatedRequest(req); + authenticatedRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); authenticatedRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, accountManager.getAccountInfo().getAccessToken().authorizationHeaderValue()); diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 5a95bd6028..9d61129d78 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -16,8 +16,9 @@ #include #include -#include "NetworkAccessManager.h" +#include +#include "NetworkAccessManager.h" #include "ResourceCache.h" #define clamp(x, min, max) (((x) < (min)) ? (min) :\ @@ -158,6 +159,7 @@ Resource::Resource(const QUrl& url, bool delayLoad) : init(); + _request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); _request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); // start loading immediately unless instructed otherwise diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 0f860208f4..3720ea8f7d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -178,7 +178,9 @@ void ScriptEngine::loadURL(const QUrl& scriptURL) { } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); connect(reply, &QNetworkReply::finished, this, &ScriptEngine::handleScriptDownload); } } @@ -601,7 +603,9 @@ void ScriptEngine::include(const QString& includeFile) { if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading included script at" << includeFile; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); diff --git a/libraries/script-engine/src/XMLHttpRequestClass.cpp b/libraries/script-engine/src/XMLHttpRequestClass.cpp index 92c9c1856c..cd2e2f3732 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.cpp +++ b/libraries/script-engine/src/XMLHttpRequestClass.cpp @@ -107,6 +107,7 @@ void XMLHttpRequestClass::abort() { } void XMLHttpRequestClass::setRequestHeader(const QString& name, const QString& value) { + _request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); _request.setRawHeader(QByteArray(name.toLatin1()), QByteArray(value.toLatin1())); } diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 01dcd7ff02..f09ff9bd72 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -65,7 +65,10 @@ static const quint64 USECS_PER_MSEC = 1000; static const quint64 MSECS_PER_SECOND = 1000; static const quint64 USECS_PER_SECOND = USECS_PER_MSEC * MSECS_PER_SECOND; -const int BITS_IN_BYTE = 8; +const int BITS_IN_BYTE = 8; + +// Use a custom User-Agent to avoid ModSecurity filtering, e.g. by hosting providers. +const QByteArray HIGH_FIDELITY_USER_AGENT = "Mozilla/5.0 (HighFidelity)"; quint64 usecTimestampNow(bool wantDebug = false); void usecTimestampNowForceClockSkew(int clockSkew); From c8a755df1bb902f96dfa42ffa9dd746d3a130181 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 26 Jan 2015 08:32:23 -0800 Subject: [PATCH 37/98] Remove unused variable --- examples/notifications.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/notifications.js b/examples/notifications.js index 525d438fe6..1b512634d7 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -447,8 +447,7 @@ function isStartingUp() { // Triggers notification if a user logs on or off function onOnlineUsersChanged(users) { - var user, - i; + var i; if (!isStartingUp()) { // Skip user notifications at startup. for (i = 0; i < users.length; i += 1) { From 5df45c7dce0685e0e1c764dd4fe9da15672e6276 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 27 Jan 2015 16:55:16 -0800 Subject: [PATCH 38/98] build buster and warnings fixes --- interface/src/ui/overlays/ImageOverlay.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 4ff49d1377..2ce00d9c17 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -30,9 +30,9 @@ ImageOverlay::ImageOverlay() : ImageOverlay::ImageOverlay(const ImageOverlay* imageOverlay) : Overlay2D(imageOverlay), - _texture(imageOverlay->_texture), _imageURL(imageOverlay->_imageURL), _textureImage(imageOverlay->_textureImage), + _texture(imageOverlay->_texture), _fromImage(imageOverlay->_fromImage), _renderImage(imageOverlay->_renderImage), _wantClipFromImage(imageOverlay->_wantClipFromImage) @@ -86,10 +86,11 @@ void ImageOverlay::render(RenderArgs* args) { glm::vec2 topLeft(left, top); glm::vec2 bottomRight(right, bottom); + float imageWidth = _texture->getWidth(); + float imageHeight = _texture->getHeight(); + // if for some reason our image is not over 0 width or height, don't attempt to render the image if (_renderImage && imageWidth > 0 && imageHeight > 0) { - float imageWidth = _texture->getWidth(); - float imageHeight = _texture->getHeight(); QRect fromImage; if (_wantClipFromImage) { From e7742351b7f278e07be703a15c0071ab79dff743 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 27 Jan 2015 20:30:58 -0800 Subject: [PATCH 39/98] get sizing for spheres to work properly --- .../src/RenderableSphereEntityItem.cpp | 4 ++- libraries/render-utils/src/GeometryCache.cpp | 36 ++++++++++--------- libraries/render-utils/src/GeometryCache.h | 2 +- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index e6ea75dfee..66536f76d6 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -46,7 +46,9 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderSolidSphere(0.5f, 15, 15, sphereColor); + const int SLICES = 40; + const int STACKS = 40; + DependencyManager::get()->renderSolidSphere(0.5f, SLICES, STACKS, sphereColor); glPopMatrix(); glPopMatrix(); }; diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 294cd78544..1b7fe97ccf 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -53,10 +53,11 @@ const int NUM_BYTES_PER_INDEX = sizeof(GLushort); void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid) { - //Vec2Pair key(glm::vec2(radius, slices), glm::vec2(stacks, 0)); - IntPair key(slices, stacks); + Vec2Pair keyRadius(glm::vec2(radius, slices), glm::vec2(stacks, 0)); + IntPair keySlicesStacks(slices, stacks); //qDebug() << " key:" << key; +//qDebug() << "renderSphere() radius:" << radius << "slices:" << slices << "stacks:" << stacks; Vec3Pair colorKey(glm::vec3(color.x, color.y, slices),glm::vec3(color.z, color.y, stacks)); @@ -64,9 +65,9 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm int vertices = slices * (stacks - 1) + 2; int indices = slices * stacks * NUM_VERTICES_PER_TRIANGULATED_QUAD; - if (!_sphereVertices.contains(key)) { + if (!_sphereVertices.contains(keyRadius)) { gpu::BufferPointer verticesBuffer(new gpu::Buffer()); - _sphereVertices[key] = verticesBuffer; + _sphereVertices[keyRadius] = verticesBuffer; GLfloat* vertexData = new GLfloat[vertices * NUM_COORDS_PER_VERTEX]; GLfloat* vertex = vertexData; @@ -74,18 +75,19 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm // south pole *(vertex++) = 0.0f; *(vertex++) = 0.0f; - *(vertex++) = -1.0f; + *(vertex++) = -1.0f * radius; //add stacks vertices climbing up Y axis for (int i = 1; i < stacks; i++) { float phi = PI * (float)i / (float)(stacks) - PI_OVER_TWO; - float z = sinf(phi), radius = cosf(phi); + float z = sinf(phi) * radius; + float stackRadius = cosf(phi) * radius; for (int j = 0; j < slices; j++) { float theta = TWO_PI * (float)j / (float)slices; - *(vertex++) = sinf(theta) * radius; - *(vertex++) = cosf(theta) * radius; + *(vertex++) = sinf(theta) * stackRadius; + *(vertex++) = cosf(theta) * stackRadius; *(vertex++) = z; } } @@ -93,11 +95,11 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm // north pole *(vertex++) = 0.0f; *(vertex++) = 0.0f; - *(vertex++) = 1.0f; + *(vertex++) = 1.0f * radius; verticesBuffer->append(sizeof(GLfloat) * vertices * NUM_COORDS_PER_VERTEX, (gpu::Buffer::Byte*) vertexData); delete[] vertexData; -qDebug() << "GeometryCache::renderSphere()..."; +qDebug() << "GeometryCache::renderSphere()... --- CREATING VERTICES BUFFER"; qDebug() << " radius:" << radius; qDebug() << " slices:" << slices; qDebug() << " stacks:" << stacks; @@ -105,9 +107,9 @@ qDebug() << " stacks:" << stacks; qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); } - if (!_sphereIndices.contains(key)) { + if (!_sphereIndices.contains(keySlicesStacks)) { gpu::BufferPointer indicesBuffer(new gpu::Buffer()); - _sphereIndices[key] = indicesBuffer; + _sphereIndices[keySlicesStacks] = indicesBuffer; GLushort* indexData = new GLushort[indices]; GLushort* index = indexData; @@ -148,7 +150,7 @@ qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); } indicesBuffer->append(sizeof(GLushort) * indices, (gpu::Buffer::Byte*) indexData); delete[] indexData; -qDebug() << "GeometryCache::renderSphere()..."; +qDebug() << "GeometryCache::renderSphere()... --- CREATING INDEX BUFFER"; qDebug() << " radius:" << radius; qDebug() << " slices:" << slices; qDebug() << " stacks:" << stacks; @@ -175,14 +177,16 @@ qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); colorBuffer->append(sizeof(int) * vertices, (gpu::Buffer::Byte*) colorData); delete[] colorData; -qDebug() << "GeometryCache::renderSphere()..."; +qDebug() << "GeometryCache::renderSphere()... --- CREATING COLORS BUFFER"; qDebug() << " color:" << color; +qDebug() << " slices:" << slices; +qDebug() << " stacks:" << stacks; qDebug() << " _sphereColors.size():" << _sphereColors.size(); } - gpu::BufferPointer verticesBuffer = _sphereVertices[key]; - gpu::BufferPointer indicesBuffer = _sphereIndices[key]; + gpu::BufferPointer verticesBuffer = _sphereVertices[keyRadius]; + gpu::BufferPointer indicesBuffer = _sphereIndices[keySlicesStacks]; gpu::BufferPointer colorBuffer = _sphereColors[colorKey]; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index d53bd727d8..b95e92dcd9 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -249,7 +249,7 @@ private: QHash _alternateGridBuffers; QHash _gridColors; - QHash _sphereVertices; + QHash _sphereVertices; QHash _sphereIndices; QHash _sphereColors; From 9631761f70d095ba17720ff398c323011e326928 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 27 Jan 2015 21:39:59 -0800 Subject: [PATCH 40/98] get sphere normals correct --- .../src/RenderableSphereEntityItem.cpp | 4 +-- libraries/render-utils/src/GeometryCache.cpp | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index 66536f76d6..a957bc6196 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -46,8 +46,8 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - const int SLICES = 40; - const int STACKS = 40; + const int SLICES = 10; //40; + const int STACKS = 10; DependencyManager::get()->renderSolidSphere(0.5f, SLICES, STACKS, sphereColor); glPopMatrix(); glPopMatrix(); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 1b7fe97ccf..9960c69f63 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -63,7 +63,7 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm int vertices = slices * (stacks - 1) + 2; - int indices = slices * stacks * NUM_VERTICES_PER_TRIANGULATED_QUAD; + int indices = slices * (stacks - 1) * NUM_VERTICES_PER_TRIANGULATED_QUAD; if (!_sphereVertices.contains(keyRadius)) { gpu::BufferPointer verticesBuffer(new gpu::Buffer()); @@ -113,6 +113,8 @@ qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); GLushort* indexData = new GLushort[indices]; GLushort* index = indexData; + + int indexCount = 0; // South cap GLushort bottom = 0; @@ -121,6 +123,8 @@ qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); *(index++) = bottom; *(index++) = top + i; *(index++) = top + (i + 1) % slices; + + indexCount += 3; } // (stacks - 2) ribbons @@ -133,10 +137,15 @@ qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); *(index++) = top + next; *(index++) = bottom + j; *(index++) = top + j; + + indexCount += 3; *(index++) = bottom + next; *(index++) = bottom + j; *(index++) = top + next; + + indexCount += 3; + } } @@ -147,6 +156,9 @@ qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); *(index++) = bottom + (i + 1) % slices; *(index++) = bottom + i; *(index++) = top; + + indexCount += 3; + } indicesBuffer->append(sizeof(GLushort) * indices, (gpu::Buffer::Byte*) indexData); delete[] indexData; @@ -154,6 +166,8 @@ qDebug() << "GeometryCache::renderSphere()... --- CREATING INDEX BUFFER"; qDebug() << " radius:" << radius; qDebug() << " slices:" << slices; qDebug() << " stacks:" << stacks; +qDebug() << "indexCount:" << indexCount; +qDebug() << " indices:" << indices; qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); } @@ -169,7 +183,7 @@ qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); int* colorData = new int[vertices]; int* colorDataAt = colorData; - + for(int v = 0; v < vertices; v++) { *(colorDataAt++) = compactColor; } @@ -178,6 +192,7 @@ qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); delete[] colorData; qDebug() << "GeometryCache::renderSphere()... --- CREATING COLORS BUFFER"; +qDebug() << " vertices:" << vertices; qDebug() << " color:" << color; qDebug() << " slices:" << slices; qDebug() << " stacks:" << stacks; @@ -188,21 +203,32 @@ qDebug() << " _sphereColors.size():" << _sphereColors.size(); gpu::BufferPointer verticesBuffer = _sphereVertices[keyRadius]; gpu::BufferPointer indicesBuffer = _sphereIndices[keySlicesStacks]; gpu::BufferPointer colorBuffer = _sphereColors[colorKey]; + + #ifdef WANT_DEBUG + qDebug() << "renderSphere() radius:" << radius << "slices:" << slices << "stacks:" << stacks; + qDebug() << " vertices:" << vertices; + qDebug() << " indices:" << indices; + qDebug() << " colorBuffer->getSize():" << colorBuffer->getSize(); + #endif //def WANT_DEBUG const int VERTICES_SLOT = 0; - const int COLOR_SLOT = 1; + const int NORMALS_SLOT = 1; + const int COLOR_SLOT = 2; gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); // 1 for everyone streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0); + streamFormat->setAttribute(gpu::Stream::NORMAL, NORMALS_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)); streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); - + gpu::BufferView verticesView(verticesBuffer, streamFormat->getAttributes().at(gpu::Stream::POSITION)._element); + gpu::BufferView normalsView(verticesBuffer, streamFormat->getAttributes().at(gpu::Stream::NORMAL)._element); gpu::BufferView colorView(colorBuffer, streamFormat->getAttributes().at(gpu::Stream::COLOR)._element); gpu::Batch batch; batch.setInputFormat(streamFormat); batch.setInputBuffer(VERTICES_SLOT, verticesView); + batch.setInputBuffer(NORMALS_SLOT, normalsView); batch.setInputBuffer(COLOR_SLOT, colorView); batch.setIndexBuffer(gpu::UINT16, indicesBuffer, 0); From dc01611f26bf95a0ecea85892ae9159d79ed232c Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 28 Jan 2015 10:22:37 -0800 Subject: [PATCH 41/98] Initiailize the jont indices to -1 in FBXGemoetry to avoid problems until the skeleton data is actually loaded --- libraries/fbx/src/FBXReader.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 98e4d60826..d94af5b4a3 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -226,16 +226,16 @@ public: glm::mat4 offset; - int leftEyeJointIndex; - int rightEyeJointIndex; - int neckJointIndex; - int rootJointIndex; - int leanJointIndex; - int headJointIndex; - int leftHandJointIndex; - int rightHandJointIndex; - int leftToeJointIndex; - int rightToeJointIndex; + int leftEyeJointIndex = -1; + int rightEyeJointIndex = -1; + int neckJointIndex = -1; + int rootJointIndex = -1; + int leanJointIndex = -1; + int headJointIndex = -1; + int leftHandJointIndex = -1; + int rightHandJointIndex = -1; + int leftToeJointIndex = -1; + int rightToeJointIndex = -1; QVector humanIKJointIndices; From 30f985a6fefa364cc4bdf2c687fed8d1186c6a83 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 10:30:05 -0800 Subject: [PATCH 42/98] some cleanup --- interface/src/ui/BandwidthMeter.cpp | 1 - .../src/RenderableSphereEntityItem.cpp | 9 +- libraries/render-utils/src/GeometryCache.cpp | 113 ++++++++---------- 3 files changed, 59 insertions(+), 64 deletions(-) diff --git a/interface/src/ui/BandwidthMeter.cpp b/interface/src/ui/BandwidthMeter.cpp index a29f16b851..d6ec937d1d 100644 --- a/interface/src/ui/BandwidthMeter.cpp +++ b/interface/src/ui/BandwidthMeter.cpp @@ -170,7 +170,6 @@ void BandwidthMeter::render(int screenWidth, int screenHeight) { _textRenderer->draw(-labelWidthOut - SPACING_RIGHT_CAPTION_IN_OUT, textYlowerLine, CAPTION_OUT); // Render vertical lines for the frame - //setColorRGBA(COLOR_FRAME); renderVerticalLine(0, 0, h, COLOR_FRAME); renderVerticalLine(barWidth, 0, h, COLOR_FRAME); diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index a957bc6196..427ed20a8b 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -46,8 +46,13 @@ void RenderableSphereEntityItem::render(RenderArgs* args) { glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - const int SLICES = 10; //40; - const int STACKS = 10; + + // TODO: it would be cool to select different slices/stacks geometry based on the size of the sphere + // and the distance to the viewer. This would allow us to reduce the triangle count for smaller spheres + // that aren't close enough to see the tessellation and use larger triangle count for spheres that would + // expose that effect + const int SLICES = 15; + const int STACKS = 15; DependencyManager::get()->renderSolidSphere(0.5f, SLICES, STACKS, sphereColor); glPopMatrix(); glPopMatrix(); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 9960c69f63..e44603cb60 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -38,10 +38,12 @@ GeometryCache::GeometryCache() : } GeometryCache::~GeometryCache() { - qDebug() << "GeometryCache::~GeometryCache()... "; - qDebug() << " _registeredLine3DVBOs.size():" << _registeredLine3DVBOs.size(); - qDebug() << " _line3DVBOs.size():" << _line3DVBOs.size(); - qDebug() << " BatchItemDetails... population:" << GeometryCache::BatchItemDetails::population; + #ifdef WANT_DEBUG + qDebug() << "GeometryCache::~GeometryCache()... "; + qDebug() << " _registeredLine3DVBOs.size():" << _registeredLine3DVBOs.size(); + qDebug() << " _line3DVBOs.size():" << _line3DVBOs.size(); + qDebug() << " BatchItemDetails... population:" << GeometryCache::BatchItemDetails::population; + #endif //def WANT_DEBUG } const int NUM_VERTICES_PER_TRIANGLE = 3; @@ -53,21 +55,16 @@ const int NUM_BYTES_PER_INDEX = sizeof(GLushort); void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid) { - Vec2Pair keyRadius(glm::vec2(radius, slices), glm::vec2(stacks, 0)); - IntPair keySlicesStacks(slices, stacks); - -//qDebug() << " key:" << key; -//qDebug() << "renderSphere() radius:" << radius << "slices:" << slices << "stacks:" << stacks; - + Vec2Pair radiusKey(glm::vec2(radius, slices), glm::vec2(stacks, 0)); + IntPair slicesStacksKey(slices, stacks); Vec3Pair colorKey(glm::vec3(color.x, color.y, slices),glm::vec3(color.z, color.y, stacks)); - int vertices = slices * (stacks - 1) + 2; int indices = slices * (stacks - 1) * NUM_VERTICES_PER_TRIANGULATED_QUAD; - if (!_sphereVertices.contains(keyRadius)) { + if (!_sphereVertices.contains(radiusKey)) { gpu::BufferPointer verticesBuffer(new gpu::Buffer()); - _sphereVertices[keyRadius] = verticesBuffer; + _sphereVertices[radiusKey] = verticesBuffer; GLfloat* vertexData = new GLfloat[vertices * NUM_COORDS_PER_VERTEX]; GLfloat* vertex = vertexData; @@ -99,17 +96,20 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm verticesBuffer->append(sizeof(GLfloat) * vertices * NUM_COORDS_PER_VERTEX, (gpu::Buffer::Byte*) vertexData); delete[] vertexData; -qDebug() << "GeometryCache::renderSphere()... --- CREATING VERTICES BUFFER"; -qDebug() << " radius:" << radius; -qDebug() << " slices:" << slices; -qDebug() << " stacks:" << stacks; -qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); + #ifdef WANT_DEBUG + qDebug() << "GeometryCache::renderSphere()... --- CREATING VERTICES BUFFER"; + qDebug() << " radius:" << radius; + qDebug() << " slices:" << slices; + qDebug() << " stacks:" << stacks; + + qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); + #endif } - if (!_sphereIndices.contains(keySlicesStacks)) { + if (!_sphereIndices.contains(slicesStacksKey)) { gpu::BufferPointer indicesBuffer(new gpu::Buffer()); - _sphereIndices[keySlicesStacks] = indicesBuffer; + _sphereIndices[slicesStacksKey] = indicesBuffer; GLushort* indexData = new GLushort[indices]; GLushort* index = indexData; @@ -162,14 +162,16 @@ qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); } indicesBuffer->append(sizeof(GLushort) * indices, (gpu::Buffer::Byte*) indexData); delete[] indexData; -qDebug() << "GeometryCache::renderSphere()... --- CREATING INDEX BUFFER"; -qDebug() << " radius:" << radius; -qDebug() << " slices:" << slices; -qDebug() << " stacks:" << stacks; -qDebug() << "indexCount:" << indexCount; -qDebug() << " indices:" << indices; - -qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); + + #ifdef WANT_DEBUG + qDebug() << "GeometryCache::renderSphere()... --- CREATING INDEX BUFFER"; + qDebug() << " radius:" << radius; + qDebug() << " slices:" << slices; + qDebug() << " stacks:" << stacks; + qDebug() << "indexCount:" << indexCount; + qDebug() << " indices:" << indices; + qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); + #endif } if (!_sphereColors.contains(colorKey)) { @@ -191,27 +193,20 @@ qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); colorBuffer->append(sizeof(int) * vertices, (gpu::Buffer::Byte*) colorData); delete[] colorData; -qDebug() << "GeometryCache::renderSphere()... --- CREATING COLORS BUFFER"; -qDebug() << " vertices:" << vertices; -qDebug() << " color:" << color; -qDebug() << " slices:" << slices; -qDebug() << " stacks:" << stacks; - -qDebug() << " _sphereColors.size():" << _sphereColors.size(); + #ifdef WANT_DEBUG + qDebug() << "GeometryCache::renderSphere()... --- CREATING COLORS BUFFER"; + qDebug() << " vertices:" << vertices; + qDebug() << " color:" << color; + qDebug() << " slices:" << slices; + qDebug() << " stacks:" << stacks; + qDebug() << " _sphereColors.size():" << _sphereColors.size(); + #endif } - gpu::BufferPointer verticesBuffer = _sphereVertices[keyRadius]; - gpu::BufferPointer indicesBuffer = _sphereIndices[keySlicesStacks]; + gpu::BufferPointer verticesBuffer = _sphereVertices[radiusKey]; + gpu::BufferPointer indicesBuffer = _sphereIndices[slicesStacksKey]; gpu::BufferPointer colorBuffer = _sphereColors[colorKey]; - #ifdef WANT_DEBUG - qDebug() << "renderSphere() radius:" << radius << "slices:" << slices << "stacks:" << stacks; - qDebug() << " vertices:" << vertices; - qDebug() << " indices:" << indices; - qDebug() << " colorBuffer->getSize():" << colorBuffer->getSize(); - #endif //def WANT_DEBUG - - const int VERTICES_SLOT = 0; const int NORMALS_SLOT = 1; const int COLOR_SLOT = 2; @@ -348,8 +343,6 @@ void GeometryCache::renderCone(float base, float height, int slices, int stacks) } void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& color) { - //qDebug() << "GeometryCache::renderGrid(xDivisions["<& points, const glm::vec4& color) { - //qDebug() << "GeometryCache::updateVertices(vec2.... id=" << id <<")..."; BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { @@ -605,7 +599,6 @@ void GeometryCache::updateVertices(int id, const QVector& points, con } void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { - //qDebug() << "GeometryCache::updateVertices(id=" << id <<")..."; BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { @@ -669,8 +662,6 @@ void GeometryCache::updateVertices(int id, const QVector& points, con } void GeometryCache::renderVertices(gpu::Primitive primitiveType, int id) { - //qDebug() << "GeometryCache::renderVertices(id=" << id <<")..."; - BatchItemDetails& details = _registeredVertices[id]; if (details.isCreated) { gpu::Batch batch; @@ -900,7 +891,6 @@ void GeometryCache::renderWireCube(float size, const glm::vec4& color) { } void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id) { - //qDebug() << "GeometryCache::renderBevelCornersRect(id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, 0.0f), glm::vec3(width, height, bevelDistance)); BatchItemDetails& details = registered ? _registeredBevelRects[id] : _bevelRects[key]; @@ -1008,7 +998,6 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, } void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) { - //qDebug() << "GeometryCache::renderQuad(vec2,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec2Pair key(minCorner, maxCorner); BatchItemDetails& details = registered ? _registeredQuad2D[id] : _quad2D[key]; @@ -1092,7 +1081,6 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, const glm::vec4& color, int id) { - //qDebug() << "GeometryCache::renderQuad(vec2/texture,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec2PairPair key(Vec2Pair(minCorner, maxCorner), Vec2Pair(texCoordMinCorner, texCoordMaxCorner)); BatchItemDetails& details = registered ? _registeredQuad2DTextures[id] : _quad2DTextures[key]; @@ -1183,7 +1171,6 @@ void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxC } void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id) { - //qDebug() << "GeometryCache::renderQuad(vec3,id=" << id <<")..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(minCorner, maxCorner); BatchItemDetails& details = registered ? _registeredQuad3D[id] : _quad3D[key]; @@ -1471,7 +1458,9 @@ GeometryCache::BatchItemDetails::BatchItemDetails() : isCreated(false) { population++; - qDebug() << "BatchItemDetails()... population:" << population << "**********************************"; + #ifdef WANT_DEBUG + qDebug() << "BatchItemDetails()... population:" << population << "**********************************"; + #endif } GeometryCache::BatchItemDetails::BatchItemDetails(const GeometryCache::BatchItemDetails& other) : @@ -1484,13 +1473,17 @@ GeometryCache::BatchItemDetails::BatchItemDetails(const GeometryCache::BatchItem isCreated(other.isCreated) { population++; - qDebug() << "BatchItemDetails()... population:" << population << "**********************************"; + #ifdef WANT_DEBUG + qDebug() << "BatchItemDetails()... population:" << population << "**********************************"; + #endif } GeometryCache::BatchItemDetails::~BatchItemDetails() { population--; clear(); - qDebug() << "~BatchItemDetails()... population:" << population << "**********************************"; + #ifdef WANT_DEBUG + qDebug() << "~BatchItemDetails()... population:" << population << "**********************************"; + #endif } void GeometryCache::BatchItemDetails::clear() { @@ -1504,7 +1497,6 @@ void GeometryCache::BatchItemDetails::clear() { void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec4& color1, const glm::vec4& color2, int id) { - //qDebug() << "GeometryCache::renderLine(vec3)..."; bool registered = (id != UNKNOWN_ID); Vec3Pair key(p1, p2); @@ -1597,7 +1589,6 @@ void GeometryCache::renderLine(const glm::vec3& p1, const glm::vec3& p2, void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, const glm::vec4& color1, const glm::vec4& color2, int id) { - //qDebug() << "GeometryCache::renderLine(vec2)..."; bool registered = (id != UNKNOWN_ID); Vec2Pair key(p1, p2); From 7d9de6d0eb3b72eae3c633b77a53e8ba80d52205 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 11:03:05 -0800 Subject: [PATCH 43/98] added some TODO comments and some cleanup --- interface/src/Application.cpp | 1 - interface/src/Util.cpp | 3 +++ interface/src/audio/AudioIOStatsRenderer.cpp | 3 ++- interface/src/audio/AudioScope.cpp | 2 -- interface/src/avatar/Avatar.cpp | 2 +- interface/src/ui/BandwidthMeter.cpp | 1 + interface/src/ui/overlays/Line3DOverlay.cpp | 3 ++- interface/src/ui/overlays/Text3DOverlay.cpp | 1 + interface/src/ui/overlays/TextOverlay.cpp | 1 + .../entities-renderer/src/RenderableLightEntityItem.cpp | 4 ++-- .../entities-renderer/src/RenderableTextEntityItem.cpp | 1 + libraries/render-utils/src/TextureCache.cpp | 6 ++++-- 12 files changed, 18 insertions(+), 10 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 36d6ded886..33ddad3c2b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2799,7 +2799,6 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs if (!selfAvatarOnly) { // draw a red sphere float originSphereRadius = 0.05f; - glColor3f(1,0,0); DependencyManager::get()->renderSphere(originSphereRadius, 15, 15, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); // also, metavoxels diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index ea65475ddc..ab313d03a2 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -106,7 +106,10 @@ void drawText(int x, int y, float scale, float radians, int mono, // glPushMatrix(); glTranslatef(static_cast(x), static_cast(y), 0.0f); + + // TODO: add support for color to rendering text glColor3fv(color); + glRotated(double(radians * DEGREES_PER_RADIAN), 0.0, 0.0, 1.0); glScalef(scale / 0.1f, scale / 0.1f, 1.0f); textRenderer(mono)->draw(0, 0, string); diff --git a/interface/src/audio/AudioIOStatsRenderer.cpp b/interface/src/audio/AudioIOStatsRenderer.cpp index c253794924..2f0c01beaa 100644 --- a/interface/src/audio/AudioIOStatsRenderer.cpp +++ b/interface/src/audio/AudioIOStatsRenderer.cpp @@ -56,7 +56,8 @@ void AudioIOStatsRenderer::render(const float* color, int width, int height) { int w = STATS_WIDTH; int h = statsHeight; DependencyManager::get()->renderQuad(x, y, w, h, backgroundColor); - glColor4f(1, 1, 1, 1); + + glColor4f(1, 1, 1, 1); // TODO: change text rendering to use collor as parameter int horizontalOffset = x + 5; int verticalOffset = y; diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index b2e6d35dcf..6ad3a60cba 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -196,8 +196,6 @@ void AudioScope::renderLineStrip(int id, const glm::vec4& color, int x, int y, i geometryCache->updateVertices(id, points, color); geometryCache->renderVertices(gpu::LINE_STRIP, id); - - glColor4f(1, 1, 1, 1); } int AudioScope::addBufferToScope(QByteArray* byteArray, int frameOffset, const int16_t* source, int sourceSamplesPerChannel, diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 9762f3fd4a..354ba174f8 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -703,7 +703,7 @@ void Avatar::renderDisplayName() { DependencyManager::get()->renderBevelCornersRect(left, bottom, right - left, top - bottom, 3, glm::vec4(0.2f, 0.2f, 0.2f, _displayNameAlpha * DISPLAYNAME_BACKGROUND_ALPHA / DISPLAYNAME_ALPHA)); - glColor4f(0.93f, 0.93f, 0.93f, _displayNameAlpha); + glColor4f(0.93f, 0.93f, 0.93f, _displayNameAlpha); // TODO: change text rendering to use collor as parameter QByteArray ba = _displayName.toLocal8Bit(); const char* text = ba.data(); diff --git a/interface/src/ui/BandwidthMeter.cpp b/interface/src/ui/BandwidthMeter.cpp index d6ec937d1d..d0f8b48568 100644 --- a/interface/src/ui/BandwidthMeter.cpp +++ b/interface/src/ui/BandwidthMeter.cpp @@ -88,6 +88,7 @@ void BandwidthMeter::Stream::updateValue(double amount) { void BandwidthMeter::setColorRGBA(unsigned c) { + // TODO: add support for color to rendering text, since that's why this method is used glColor4ub(GLubyte( c >> 24), GLubyte((c >> 16) & 0xff), GLubyte((c >> 8) & 0xff), diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index ab537eea89..f02006c5f8 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -49,7 +49,6 @@ void Line3DOverlay::render(RenderArgs* args) { float alpha = getAlpha(); xColor color = getColor(); const float MAX_COLOR = 255.0f; - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); glm::vec3 position = getPosition(); @@ -60,6 +59,8 @@ void Line3DOverlay::render(RenderArgs* args) { glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); if (getIsDashedLine()) { + // TODO: add support for color to renderDashedLine() + glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); DependencyManager::get()->renderDashedLine(_position, _end, _geometryCacheID); } else { DependencyManager::get()->renderLine(_start, _end, colorv4, _geometryCacheID); diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 623a487bb5..0d0741772c 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -124,6 +124,7 @@ void Text3DOverlay::render(RenderArgs* args) { enableClipPlane(GL_CLIP_PLANE2, 0.0f, -1.0f, 0.0f, clipMinimum.y + clipDimensions.y); enableClipPlane(GL_CLIP_PLANE3, 0.0f, 1.0f, 0.0f, -clipMinimum.y); + // TODO: add support for color to rendering text glColor3f(_color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR); float alpha = getAlpha(); QStringList lines = _text.split("\n"); diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 1333134907..d3893b5b04 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -90,6 +90,7 @@ void TextOverlay::render(RenderArgs* args) { int x = _bounds.left() + _leftMargin + leftAdjust; int y = _bounds.top() + _topMargin + topAdjust; + // TODO: add support for color to rendering text glColor3f(_color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR); float alpha = getAlpha(); QStringList lines = _text.split("\n"); diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 9097956c88..7eccaff06b 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -63,7 +63,7 @@ void RenderableLightEntityItem::render(RenderArgs* args) { } #ifdef WANT_DEBUG - glColor4f(diffuseR, diffuseG, diffuseB, 1.0f); + glm::vec4 color(diffuseR, diffuseG, diffuseB, 1.0f); glPushMatrix(); glTranslatef(position.x, position.y, position.z); glm::vec3 axis = glm::axis(rotation); @@ -73,7 +73,7 @@ void RenderableLightEntityItem::render(RenderArgs* args) { glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); glScalef(dimensions.x, dimensions.y, dimensions.z); - DependencyManager::get()->renderWireSphere(0.5f, 15, 15); + DependencyManager::get()->renderWireSphere(0.5f, 15, 15, color); glPopMatrix(); glPopMatrix(); #endif diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index 492543fd62..d142f76dfe 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -78,6 +78,7 @@ void RenderableTextEntityItem::render(RenderArgs* args) { enableClipPlane(GL_CLIP_PLANE3, 0.0f, 1.0f, 0.0f, -clipMinimum.y); xColor textColor = getTextColorX(); + // TODO: add support for color to rendering text glColor3f(textColor.red / MAX_COLOR, textColor.green / MAX_COLOR, textColor.blue / MAX_COLOR); QStringList lines = _text.split("\n"); int lineOffset = maxHeight; diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index 3644ded81c..28bda7689a 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -154,14 +154,16 @@ const gpu::TexturePointer& TextureCache::getPermutationNormalTexture() { } const unsigned char OPAQUE_WHITE[] = { 0xFF, 0xFF, 0xFF, 0xFF }; -const unsigned char TRANSPARENT_WHITE[] = { 0xFF, 0xFF, 0xFF, 0x0 }; -const unsigned char OPAQUE_BLACK[] = { 0x0, 0x0, 0x0, 0xFF }; +//const unsigned char TRANSPARENT_WHITE[] = { 0xFF, 0xFF, 0xFF, 0x0 }; +//const unsigned char OPAQUE_BLACK[] = { 0x0, 0x0, 0x0, 0xFF }; const unsigned char OPAQUE_BLUE[] = { 0x80, 0x80, 0xFF, 0xFF }; +/* static void loadSingleColorTexture(const unsigned char* color) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, color); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } +*/ const gpu::TexturePointer& TextureCache::getWhiteTexture() { if (_whiteTexture.isNull()) { From e1ca6d5048c786bed4b462a9a476187ab9f7b3d9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 12:16:28 -0800 Subject: [PATCH 44/98] Disable editentities auto-off when moving avatar --- examples/editEntities.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index e2c7a6d435..10cc7df894 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -820,9 +820,8 @@ function handeMenuEvent(menuItem) { Menu.menuItemEvent.connect(handeMenuEvent); Controller.keyPressEvent.connect(function(event) { - if (event.text == 'w' || event.text == 'a' || event.text == 's' || event.text == 'd' - || event.text == 'UP' || event.text == 'DOWN' || event.text == 'LEFT' || event.text == 'RIGHT') { - toolBar.setActive(false); + if (isActive) { + cameraManager.keyPressEvent(event); } }); From 5633be0e92d8020e0ca56e64d7785747698773c4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 12:19:42 -0800 Subject: [PATCH 45/98] Add ability to move orbit camera using keys --- examples/editEntities.js | 3 + examples/libraries/entityCameraTool.js | 83 ++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/examples/editEntities.js b/examples/editEntities.js index 10cc7df894..883362c4a4 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -826,6 +826,9 @@ Controller.keyPressEvent.connect(function(event) { }); Controller.keyReleaseEvent.connect(function (event) { + if (isActive) { + cameraManager.keyReleaseEvent(event); + } // since sometimes our menu shortcut keys don't work, trap our menu items here also and fire the appropriate menu items if (event.text == "BACKSPACE" || event.text == "DELETE") { deleteSelectedEntities(); diff --git a/examples/libraries/entityCameraTool.js b/examples/libraries/entityCameraTool.js index f5095bb149..ddbb6fafd5 100644 --- a/examples/libraries/entityCameraTool.js +++ b/examples/libraries/entityCameraTool.js @@ -15,6 +15,9 @@ var MOUSE_SENSITIVITY = 0.9; var SCROLL_SENSITIVITY = 0.05; var PAN_ZOOM_SCALE_RATIO = 0.4; +var KEY_ORBIT_SENSITIVITY = 40; +var KEY_ZOOM_SENSITIVITY = 10; + // Scaling applied based on the size of the object being focused var FOCUS_ZOOM_SCALE = 1.3; @@ -43,6 +46,10 @@ var easeOutCubic = function(t) { EASE_TIME = 0.5; +function clamp(value, minimum, maximum) { + return Math.min(Math.max(value, minimum), maximum); +} + function mergeObjects(obj1, obj2) { var newObj = {}; for (key in obj1) { @@ -60,6 +67,49 @@ CameraManager = function() { that.enabled = false; that.mode = MODE_INACTIVE; + var actions = { + orbitLeft: 0, + orbitRight: 0, + orbitUp: 0, + orbitDown: 0, + orbitForward: 0, + orbitBackward: 0, + } + + var keyToActionMapping = { + "a": "orbitLeft", + "d": "orbitRight", + "w": "orbitForward", + "s": "orbitBackward", + "e": "orbitUp", + "c": "orbitDown", + + "LEFT": "orbitLeft", + "RIGHT": "orbitRight", + "UP": "orbitForward", + "DOWN": "orbitBackward", + } + + var CAPTURED_KEYS = []; + for (key in keyToActionMapping) { + CAPTURED_KEYS.push(key); + } + + function getActionForKeyEvent(event) { + var action = keyToActionMapping[event.text]; + if (action !== undefined) { + if (event.isShifted) { + if (action == "orbitForward") { + action = "orbitUp"; + } else if (action == "orbitBackward") { + action = "orbitDown"; + } + } + return action; + } + return null; + } + that.zoomDistance = INITIAL_ZOOM_DISTANCE; that.targetZoomDistance = INITIAL_ZOOM_DISTANCE; @@ -82,6 +132,11 @@ CameraManager = function() { that.enable = function() { if (Camera.mode == "independent" || that.enabled) return; + for (var i = 0; i < CAPTURED_KEYS.length; i++) { + print("capturing: " + CAPTURED_KEYS[i]); + Controller.captureKeyEvents({ text: CAPTURED_KEYS[i] }); + } + that.enabled = true; that.mode = MODE_INACTIVE; @@ -112,6 +167,11 @@ CameraManager = function() { that.disable = function(ignoreCamera) { if (!that.enabled) return; + + for (var i = 0; i < CAPTURED_KEYS.length; i++) { + Controller.releaseKeyEvents({ text: CAPTURED_KEYS[i] }); + } + that.enabled = false; that.mode = MODE_INACTIVE; @@ -280,6 +340,20 @@ CameraManager = function() { that.mode = MODE_INACTIVE; } + that.keyPressEvent = function(event) { + var action = getActionForKeyEvent(event); + if (action) { + actions[action] = 1; + } + }; + + that.keyReleaseEvent = function(event) { + var action = getActionForKeyEvent(event); + if (action) { + actions[action] = 0; + } + }; + that.wheelEvent = function(event) { if (!that.enabled) return; @@ -333,6 +407,14 @@ CameraManager = function() { return; } + // Update based on current actions + that.targetYaw += (actions.orbitRight - actions.orbitLeft) * dt * KEY_ORBIT_SENSITIVITY; + that.targetPitch += (actions.orbitUp - actions.orbitDown) * dt * KEY_ORBIT_SENSITIVITY; + that.targetPitch = clamp(that.targetPitch, -90, 90); + var addZoom = (actions.orbitBackward - actions.orbitForward) * dt * KEY_ZOOM_SENSITIVITY; + that.targetZoomDistance = clamp(that.targetZoomDistance + addZoom, MIN_ZOOM_DISTANCE, MAX_ZOOM_DISTANCE); + + if (easing) { easingTime = Math.min(EASE_TIME, easingTime + dt); } @@ -384,6 +466,7 @@ CameraManager = function() { }); Script.update.connect(that.update); + Script.scriptEnding.connect(that.disable); Controller.wheelEvent.connect(that.wheelEvent); From 135c8c1bdf2ea17c4043d9c7243d615957f511c7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 12:19:54 -0800 Subject: [PATCH 46/98] Disable move entity by arrows --- examples/editEntities.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index 883362c4a4..f88a0e44d9 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -856,23 +856,23 @@ Controller.keyReleaseEvent.connect(function (event) { var delta = null; var increment = event.isShifted ? grid.getMajorIncrement() : grid.getMinorIncrement(); - if (event.text == 'UP') { - if (event.isControl || event.isAlt) { - delta = { x: 0, y: increment, z: 0 }; - } else { - delta = { x: 0, y: 0, z: -increment }; - } - } else if (event.text == 'DOWN') { - if (event.isControl || event.isAlt) { - delta = { x: 0, y: -increment, z: 0 }; - } else { - delta = { x: 0, y: 0, z: increment }; - } - } else if (event.text == 'LEFT') { - delta = { x: -increment, y: 0, z: 0 }; - } else if (event.text == 'RIGHT') { - delta = { x: increment, y: 0, z: 0 }; - } + // if (event.text == 'UP') { + // if (event.isControl || event.isAlt) { + // delta = { x: 0, y: increment, z: 0 }; + // } else { + // delta = { x: 0, y: 0, z: -increment }; + // } + // } else if (event.text == 'DOWN') { + // if (event.isControl || event.isAlt) { + // delta = { x: 0, y: -increment, z: 0 }; + // } else { + // delta = { x: 0, y: 0, z: increment }; + // } + // } else if (event.text == 'LEFT') { + // delta = { x: -increment, y: 0, z: 0 }; + // } else if (event.text == 'RIGHT') { + // delta = { x: increment, y: 0, z: 0 }; + // } if (delta != null) { // Adjust delta so that movements are relative to the current camera orientation From 55f41eb452c1115f8872285408578dc819bf7a2a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 12:20:08 -0800 Subject: [PATCH 47/98] Update gridTool to not use clone --- examples/libraries/gridTool.js | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/examples/libraries/gridTool.js b/examples/libraries/gridTool.js index 87b7f907e2..6fd3a8a660 100644 --- a/examples/libraries/gridTool.js +++ b/examples/libraries/gridTool.js @@ -292,7 +292,6 @@ GridTool = function(opts) { ]; // Add all overlays from spritesheet - var baseOverlay = null; var x = 0; for (var i = 0; i < UI_SPRITE_LIST.length; i++) { var info = UI_SPRITE_LIST[i]; @@ -306,17 +305,7 @@ GridTool = function(opts) { visible: false, }; - var overlay; - if (baseOverlay == null) { - overlay = Overlays.addOverlay("image", { - imageURL: UI_URL, - }); - baseOverlay = overlay; - } else { - overlay = Overlays.cloneOverlay(baseOverlay); - } - - Overlays.editOverlay(overlay, props); + var overlay = Overlays.addOverlay("image", props); addUIOverlay(info.name, overlay, x, 0, info.width, UI_HEIGHT); From a775476cfa87c1268604bc13f05d2748148423d9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 12:21:50 -0800 Subject: [PATCH 48/98] Remove editEntities move-by-arrow-key completely --- examples/editEntities.js | 49 ---------------------------------------- 1 file changed, 49 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index f88a0e44d9..083887819f 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -852,55 +852,6 @@ Controller.keyReleaseEvent.connect(function (event) { newPosition = Vec3.subtract(newPosition, { x: 0, y: selectionManager.worldDimensions.y * 0.5, z: 0 }); grid.setPosition(newPosition); } - } else if (isActive) { - var delta = null; - var increment = event.isShifted ? grid.getMajorIncrement() : grid.getMinorIncrement(); - - // if (event.text == 'UP') { - // if (event.isControl || event.isAlt) { - // delta = { x: 0, y: increment, z: 0 }; - // } else { - // delta = { x: 0, y: 0, z: -increment }; - // } - // } else if (event.text == 'DOWN') { - // if (event.isControl || event.isAlt) { - // delta = { x: 0, y: -increment, z: 0 }; - // } else { - // delta = { x: 0, y: 0, z: increment }; - // } - // } else if (event.text == 'LEFT') { - // delta = { x: -increment, y: 0, z: 0 }; - // } else if (event.text == 'RIGHT') { - // delta = { x: increment, y: 0, z: 0 }; - // } - - if (delta != null) { - // Adjust delta so that movements are relative to the current camera orientation - var lookDirection = Quat.getFront(Camera.getOrientation()); - lookDirection.z *= -1; - - var angle = Math.atan2(lookDirection.z, lookDirection.x); - angle -= (Math.PI / 4); - - var rotation = Math.floor(angle / (Math.PI / 2)) * (Math.PI / 2); - var rotator = Quat.fromPitchYawRollRadians(0, rotation, 0); - - delta = Vec3.multiplyQbyV(rotator, delta); - - SelectionManager.saveProperties(); - - for (var i = 0; i < selectionManager.selections.length; i++) { - var entityID = selectionManager.selections[i]; - var properties = Entities.getEntityProperties(entityID); - Entities.editEntity(entityID, { - position: Vec3.sum(properties.position, delta) - }); - } - - pushCommandForSelections(); - - selectionManager._update(); - } } }); From 09af7ed10faed02dec6a363b844a9165d81caabd Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 12:21:58 -0800 Subject: [PATCH 49/98] Remove extra print statement --- examples/libraries/entityCameraTool.js | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/libraries/entityCameraTool.js b/examples/libraries/entityCameraTool.js index ddbb6fafd5..df5daa561f 100644 --- a/examples/libraries/entityCameraTool.js +++ b/examples/libraries/entityCameraTool.js @@ -133,7 +133,6 @@ CameraManager = function() { if (Camera.mode == "independent" || that.enabled) return; for (var i = 0; i < CAPTURED_KEYS.length; i++) { - print("capturing: " + CAPTURED_KEYS[i]); Controller.captureKeyEvents({ text: CAPTURED_KEYS[i] }); } From 1b81ee17ab35a5f27b3fcd4a4e160d6b414e93ec Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 12:23:54 -0800 Subject: [PATCH 50/98] Update how orbit-by-key is appleid --- examples/libraries/entityCameraTool.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/libraries/entityCameraTool.js b/examples/libraries/entityCameraTool.js index df5daa561f..609c1db076 100644 --- a/examples/libraries/entityCameraTool.js +++ b/examples/libraries/entityCameraTool.js @@ -410,8 +410,8 @@ CameraManager = function() { that.targetYaw += (actions.orbitRight - actions.orbitLeft) * dt * KEY_ORBIT_SENSITIVITY; that.targetPitch += (actions.orbitUp - actions.orbitDown) * dt * KEY_ORBIT_SENSITIVITY; that.targetPitch = clamp(that.targetPitch, -90, 90); - var addZoom = (actions.orbitBackward - actions.orbitForward) * dt * KEY_ZOOM_SENSITIVITY; - that.targetZoomDistance = clamp(that.targetZoomDistance + addZoom, MIN_ZOOM_DISTANCE, MAX_ZOOM_DISTANCE); + that.targetZoomDistance += (actions.orbitBackward - actions.orbitForward) * dt * KEY_ZOOM_SENSITIVITY; + that.targetZoomDistance = clamp(that.targetZoomDistance, MIN_ZOOM_DISTANCE, MAX_ZOOM_DISTANCE); if (easing) { From 2f4e98082b00551222b6ebaa3f3afe4a18889e52 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 13:54:48 -0800 Subject: [PATCH 51/98] remove glColor calls related to text rendering --- interface/src/Util.cpp | 6 ++--- interface/src/audio/AudioIOStatsRenderer.cpp | 2 -- interface/src/avatar/Avatar.cpp | 4 ++-- interface/src/ui/BandwidthMeter.cpp | 22 +++++-------------- interface/src/ui/BandwidthMeter.h | 1 - interface/src/ui/overlays/Text3DOverlay.cpp | 6 ++--- interface/src/ui/overlays/TextOverlay.cpp | 5 ++--- .../src/RenderableTextEntityItem.cpp | 6 ++--- libraries/render-utils/src/TextRenderer.cpp | 15 +++++-------- libraries/render-utils/src/TextRenderer.h | 3 ++- 10 files changed, 24 insertions(+), 46 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index ab313d03a2..e2ec29ecdc 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -107,12 +107,12 @@ void drawText(int x, int y, float scale, float radians, int mono, glPushMatrix(); glTranslatef(static_cast(x), static_cast(y), 0.0f); - // TODO: add support for color to rendering text - glColor3fv(color); glRotated(double(radians * DEGREES_PER_RADIAN), 0.0, 0.0, 1.0); glScalef(scale / 0.1f, scale / 0.1f, 1.0f); - textRenderer(mono)->draw(0, 0, string); + + glm::vec4 colorV4 = {color[0], color[1], color[3], 1.0f }; + textRenderer(mono)->draw(0, 0, string, colorV4); glPopMatrix(); } diff --git a/interface/src/audio/AudioIOStatsRenderer.cpp b/interface/src/audio/AudioIOStatsRenderer.cpp index 2f0c01beaa..782010bd00 100644 --- a/interface/src/audio/AudioIOStatsRenderer.cpp +++ b/interface/src/audio/AudioIOStatsRenderer.cpp @@ -57,8 +57,6 @@ void AudioIOStatsRenderer::render(const float* color, int width, int height) { int h = statsHeight; DependencyManager::get()->renderQuad(x, y, w, h, backgroundColor); - glColor4f(1, 1, 1, 1); // TODO: change text rendering to use collor as parameter - int horizontalOffset = x + 5; int verticalOffset = y; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 354ba174f8..727f5f5d7c 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -703,12 +703,12 @@ void Avatar::renderDisplayName() { DependencyManager::get()->renderBevelCornersRect(left, bottom, right - left, top - bottom, 3, glm::vec4(0.2f, 0.2f, 0.2f, _displayNameAlpha * DISPLAYNAME_BACKGROUND_ALPHA / DISPLAYNAME_ALPHA)); - glColor4f(0.93f, 0.93f, 0.93f, _displayNameAlpha); // TODO: change text rendering to use collor as parameter + glm::vec4 color(0.93f, 0.93f, 0.93f, _displayNameAlpha); QByteArray ba = _displayName.toLocal8Bit(); const char* text = ba.data(); glDisable(GL_POLYGON_OFFSET_FILL); - textRenderer(DISPLAYNAME)->draw(text_x, text_y, text); + textRenderer(DISPLAYNAME)->draw(text_x, text_y, text, color); glPopMatrix(); diff --git a/interface/src/ui/BandwidthMeter.cpp b/interface/src/ui/BandwidthMeter.cpp index d0f8b48568..1b73ec9fcd 100644 --- a/interface/src/ui/BandwidthMeter.cpp +++ b/interface/src/ui/BandwidthMeter.cpp @@ -86,15 +86,6 @@ void BandwidthMeter::Stream::updateValue(double amount) { glm::clamp(dt / _msToAverage, 0.0, 1.0)); } -void BandwidthMeter::setColorRGBA(unsigned c) { - - // TODO: add support for color to rendering text, since that's why this method is used - glColor4ub(GLubyte( c >> 24), - GLubyte((c >> 16) & 0xff), - GLubyte((c >> 8) & 0xff), - GLubyte( c & 0xff)); -} - glm::vec4 BandwidthMeter::getColorRGBA(unsigned c) { float r = (c >> 24) / 255.0f; @@ -165,10 +156,10 @@ void BandwidthMeter::render(int screenWidth, int screenHeight) { glTranslatef((float)barX, (float)y, 0.0f); // Render captions - setColorRGBA(COLOR_TEXT); - _textRenderer->draw(barWidth + SPACING_LEFT_CAPTION_UNIT, textYcenteredLine, CAPTION_UNIT); - _textRenderer->draw(-labelWidthIn - SPACING_RIGHT_CAPTION_IN_OUT, textYupperLine, CAPTION_IN); - _textRenderer->draw(-labelWidthOut - SPACING_RIGHT_CAPTION_IN_OUT, textYlowerLine, CAPTION_OUT); + glm::vec4 textColor = getColorRGBA(COLOR_TEXT); + _textRenderer->draw(barWidth + SPACING_LEFT_CAPTION_UNIT, textYcenteredLine, CAPTION_UNIT, textColor); + _textRenderer->draw(-labelWidthIn - SPACING_RIGHT_CAPTION_IN_OUT, textYupperLine, CAPTION_IN, textColor); + _textRenderer->draw(-labelWidthOut - SPACING_RIGHT_CAPTION_IN_OUT, textYlowerLine, CAPTION_OUT, textColor); // Render vertical lines for the frame renderVerticalLine(0, 0, h, COLOR_FRAME); @@ -226,15 +217,14 @@ void BandwidthMeter::render(int screenWidth, int screenHeight) { // Render numbers char fmtBuf[8]; - setColorRGBA(COLOR_TEXT); sprintf(fmtBuf, "%0.1f", totalIn); _textRenderer->draw(glm::max(xIn - fontMetrics.width(fmtBuf) - PADDING_HORIZ_VALUE, PADDING_HORIZ_VALUE), - textYupperLine, fmtBuf); + textYupperLine, fmtBuf, textColor); sprintf(fmtBuf, "%0.1f", totalOut); _textRenderer->draw(glm::max(xOut - fontMetrics.width(fmtBuf) - PADDING_HORIZ_VALUE, PADDING_HORIZ_VALUE), - textYlowerLine, fmtBuf); + textYlowerLine, fmtBuf, textColor); glPopMatrix(); diff --git a/interface/src/ui/BandwidthMeter.h b/interface/src/ui/BandwidthMeter.h index 4f69a9fb97..bca4745cee 100644 --- a/interface/src/ui/BandwidthMeter.h +++ b/interface/src/ui/BandwidthMeter.h @@ -69,7 +69,6 @@ public: ChannelInfo const& channelInfo(ChannelIndex i) const { return _channels[i]; } private: - static void setColorRGBA(unsigned c); static glm::vec4 getColorRGBA(unsigned c); static void renderBox(int x, int y, int w, int h, unsigned c); static void renderVerticalLine(int x, int y, int h, unsigned c); diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 0d0741772c..00fd655f69 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -124,13 +124,11 @@ void Text3DOverlay::render(RenderArgs* args) { enableClipPlane(GL_CLIP_PLANE2, 0.0f, -1.0f, 0.0f, clipMinimum.y + clipDimensions.y); enableClipPlane(GL_CLIP_PLANE3, 0.0f, 1.0f, 0.0f, -clipMinimum.y); - // TODO: add support for color to rendering text - glColor3f(_color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR); - float alpha = getAlpha(); + glm::vec4 textColor = {_color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR, getAlpha() }; QStringList lines = _text.split("\n"); int lineOffset = maxHeight; foreach(QString thisLine, lines) { - textRenderer->draw(0, lineOffset, qPrintable(thisLine), alpha); + textRenderer->draw(0, lineOffset, qPrintable(thisLine), textColor); lineOffset += maxHeight; } diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index d3893b5b04..0e8ca29320 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -90,16 +90,15 @@ void TextOverlay::render(RenderArgs* args) { int x = _bounds.left() + _leftMargin + leftAdjust; int y = _bounds.top() + _topMargin + topAdjust; - // TODO: add support for color to rendering text - glColor3f(_color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR); float alpha = getAlpha(); + glm::vec4 textColor = {_color.red / MAX_COLOR, _color.green / MAX_COLOR, _color.blue / MAX_COLOR, alpha }; QStringList lines = _text.split("\n"); int lineOffset = 0; foreach(QString thisLine, lines) { if (lineOffset == 0) { lineOffset = textRenderer->calculateHeight(qPrintable(thisLine)); } - lineOffset += textRenderer->draw(x, y + lineOffset, qPrintable(thisLine), alpha); + lineOffset += textRenderer->draw(x, y + lineOffset, qPrintable(thisLine), textColor); const int lineGap = 2; lineOffset += lineGap; diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index d142f76dfe..54b6691eed 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -78,13 +78,11 @@ void RenderableTextEntityItem::render(RenderArgs* args) { enableClipPlane(GL_CLIP_PLANE3, 0.0f, 1.0f, 0.0f, -clipMinimum.y); xColor textColor = getTextColorX(); - // TODO: add support for color to rendering text - glColor3f(textColor.red / MAX_COLOR, textColor.green / MAX_COLOR, textColor.blue / MAX_COLOR); + glm::vec4 textColorV4(textColor.red / MAX_COLOR, textColor.green / MAX_COLOR, textColor.blue / MAX_COLOR, 1.0f); QStringList lines = _text.split("\n"); int lineOffset = maxHeight; - float textAlpha = 1.0f; // getTextAlpha() foreach(QString thisLine, lines) { - textRenderer->draw(0, lineOffset, qPrintable(thisLine), textAlpha); + textRenderer->draw(0, lineOffset, qPrintable(thisLine), textColorV4); lineOffset += maxHeight; } diff --git a/libraries/render-utils/src/TextRenderer.cpp b/libraries/render-utils/src/TextRenderer.cpp index ae7523a817..bf718b468e 100644 --- a/libraries/render-utils/src/TextRenderer.cpp +++ b/libraries/render-utils/src/TextRenderer.cpp @@ -70,16 +70,11 @@ int TextRenderer::calculateHeight(const char* str) { return maxHeight; } -int TextRenderer::draw(int x, int y, const char* str, float alpha) { - // Grab the current color - float currentColor[4]; - glGetFloatv(GL_CURRENT_COLOR, currentColor); - alpha = std::max(0.0f, std::min(alpha, 1.0f)); - currentColor[3] *= alpha; - int compactColor = ((int(currentColor[0] * 255.0f) & 0xFF)) | - ((int(currentColor[1] * 255.0f) & 0xFF) << 8) | - ((int(currentColor[2] * 255.0f) & 0xFF) << 16) | - ((int(currentColor[3] * 255.0f) & 0xFF) << 24); +int TextRenderer::draw(int x, int y, const char* str, const glm::vec4& color) { + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); int maxHeight = 0; for (const char* ch = str; *ch != 0; ch++) { diff --git a/libraries/render-utils/src/TextRenderer.h b/libraries/render-utils/src/TextRenderer.h index 078efb0463..671258e335 100644 --- a/libraries/render-utils/src/TextRenderer.h +++ b/libraries/render-utils/src/TextRenderer.h @@ -13,6 +13,7 @@ #define hifi_TextRenderer_h #include +#include #include #include @@ -70,7 +71,7 @@ public: int calculateHeight(const char* str); // also returns the height of the tallest character - int draw(int x, int y, const char* str, float alpha = 1.0f); + int draw(int x, int y, const char* str, const glm::vec4& color); int computeWidth(char ch); int computeWidth(const char* str); From 7bd45ba0cab313585b7e95223e20d35afceb0c21 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 14:52:33 -0800 Subject: [PATCH 52/98] change removing more glColor calls --- libraries/render-utils/src/GeometryCache.cpp | 3 ++- libraries/render-utils/src/GeometryCache.h | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index ab8b30f427..27019a2dd3 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1253,7 +1253,8 @@ void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxC void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottomLeft, const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, - const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, int id) { + const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, + const glm::vec4& quadColor, int id) { #ifdef WANT_DEBUG qDebug() << "renderQuad() vec3 + texture VBO..."; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index b95e92dcd9..038dcb352d 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -102,6 +102,9 @@ public: void renderQuad(int x, int y, int width, int height, const glm::vec4& color, int id = UNKNOWN_ID) { renderQuad(glm::vec2(x,y), glm::vec2(x + width, y + height), color, id); } + // TODO: I think there's a bug in this version of the renderQuad() that's not correctly rebuilding the vbos + // if the color changes by the corners are the same, as evidenced by the audio meter which should turn white + // when it's clipping void renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id = UNKNOWN_ID); void renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, @@ -114,7 +117,7 @@ public: const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, - int id = UNKNOWN_ID); + const glm::vec4& quadColor, int id = UNKNOWN_ID); void renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& color, int id = UNKNOWN_ID) From f9bcb65467e02173b11a837e36330d4b457fc997 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 14:52:40 -0800 Subject: [PATCH 53/98] change removing more glColor calls --- interface/src/ui/ApplicationOverlay.cpp | 32 +++++++++++++------------ 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 508c01e06f..1ad7676578 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -118,10 +118,16 @@ void ApplicationOverlay::renderReticle(glm::quat orientation, float alpha) { glm::vec3 topRight = getPoint(-reticleSize / 2.0f, -reticleSize / 2.0f); glm::vec3 bottomLeft = getPoint(reticleSize / 2.0f, reticleSize / 2.0f); glm::vec3 bottomRight = getPoint(-reticleSize / 2.0f, reticleSize / 2.0f); - glColor4f(RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2], alpha); + + // TODO: this version of renderQuad() needs to take a color + glm::vec4 reticleColor = { RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2], alpha }; + + + DependencyManager::get()->renderQuad(topLeft, bottomLeft, bottomRight, topRight, glm::vec2(0.0f, 0.0f), glm::vec2(1.0f, 0.0f), - glm::vec2(1.0f, 1.0f), glm::vec2(0.0f, 1.0f), _reticleQuad); + glm::vec2(1.0f, 1.0f), glm::vec2(0.0f, 1.0f), + reticleColor, _reticleQuad); } glPopMatrix(); } @@ -374,7 +380,7 @@ void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float as glTranslatef(pos.x, pos.y, pos.z); glRotatef(glm::degrees(glm::angle(rot)), axis.x, axis.y, axis.z); - glColor4f(1.0f, 1.0f, 1.0f, _alpha); + glm::vec4 overlayColor = {1.0f, 1.0f, 1.0f, _alpha}; //Render const GLfloat distance = 1.0f; @@ -393,7 +399,8 @@ void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float as glm::vec3(x + quadWidth, y, -distance), glm::vec3(x, y, -distance), glm::vec2(0.0f, 1.0f), glm::vec2(1.0f, 1.0f), - glm::vec2(1.0f, 0.0f), glm::vec2(0.0f, 0.0f)); + glm::vec2(1.0f, 0.0f), glm::vec2(0.0f, 0.0f), + overlayColor); auto glCanvas = DependencyManager::get(); if (_crosshairTexture == 0) { @@ -409,7 +416,7 @@ void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float as const float mouseX = (application->getMouseX() / (float)glCanvas->width()) * quadWidth; const float mouseY = (1.0 - (application->getMouseY() / (float)glCanvas->height())) * quadHeight; - glColor3f(RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2]); + glm::vec4 reticleColor = { RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2], 1.0f }; DependencyManager::get()->renderQuad(glm::vec3(x + mouseX, y + mouseY, -distance), glm::vec3(x + mouseX + reticleSize, y + mouseY, -distance), @@ -417,7 +424,7 @@ void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float as glm::vec3(x + mouseX, y + mouseY - reticleSize, -distance), glm::vec2(0.0f, 0.0f), glm::vec2(1.0f, 0.0f), glm::vec2(1.0f, 1.0f), glm::vec2(0.0f, 1.0f), - _reticleQuad); + reticleColor, _reticleQuad); glEnable(GL_DEPTH_TEST); @@ -771,14 +778,14 @@ void ApplicationOverlay::renderMagnifier(glm::vec2 magPos, float sizeMult, bool geometryCache->renderVertices(gpu::LINE_STRIP, _magnifierBorder); glEnable(GL_TEXTURE_2D); } - glColor4f(1.0f, 1.0f, 1.0f, _alpha); + glm::vec4 magnifierColor = { 1.0f, 1.0f, 1.0f, _alpha }; DependencyManager::get()->renderQuad(bottomLeft, bottomRight, topRight, topLeft, glm::vec2(magnifyULeft, magnifyVBottom), glm::vec2(magnifyURight, magnifyVBottom), glm::vec2(magnifyURight, magnifyVTop), glm::vec2(magnifyULeft, magnifyVTop), - _magnifierQuad); + magnifierColor, _magnifierQuad); } glPopMatrix(); } @@ -844,16 +851,11 @@ void ApplicationOverlay::renderAudioMeter() { DependencyManager::get()->render(glCanvas->width(), glCanvas->height()); DependencyManager::get()->render(WHITE_TEXT, glCanvas->width(), glCanvas->height()); - if (isClipping) { - glColor3f(1, 0, 0); - } else { - glColor3f(0.475f, 0.475f, 0.475f); - } - audioMeterY += AUDIO_METER_HEIGHT; // Draw audio meter background Quad - DependencyManager::get()->renderQuad(AUDIO_METER_X, audioMeterY, AUDIO_METER_WIDTH, AUDIO_METER_HEIGHT, glm::vec4(0, 0, 0, 1)); + DependencyManager::get()->renderQuad(AUDIO_METER_X, audioMeterY, AUDIO_METER_WIDTH, AUDIO_METER_HEIGHT, + glm::vec4(0, 0, 0, 1)); if (audioLevel > AUDIO_RED_START) { glm::vec4 quadColor; From efb044ea5e1dc7b91e3a4cec32583ec03755683c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 15:08:59 -0800 Subject: [PATCH 54/98] change renderDashedLine() to take a color paramter --- interface/src/ui/ApplicationOverlay.cpp | 4 ---- interface/src/ui/BandwidthMeter.cpp | 2 ++ interface/src/ui/overlays/Cube3DOverlay.cpp | 24 +++++++++---------- interface/src/ui/overlays/Line3DOverlay.cpp | 3 +-- .../src/ui/overlays/Rectangle3DOverlay.cpp | 8 +++---- libraries/render-utils/src/GeometryCache.cpp | 9 ++++++- libraries/render-utils/src/GeometryCache.h | 2 +- 7 files changed, 28 insertions(+), 24 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 1ad7676578..2e6e1a1df4 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -320,8 +320,6 @@ void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) { glDepthMask(GL_FALSE); glDisable(GL_ALPHA_TEST); - glColor4f(1.0f, 1.0f, 1.0f, _alpha); - static float textureFOV = 0.0f, textureAspectRatio = 1.0f; if (textureFOV != _textureFov || textureAspectRatio != _textureAspectRatio) { @@ -436,8 +434,6 @@ void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float as glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); glEnable(GL_LIGHTING); - - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } void ApplicationOverlay::computeOculusPickRay(float x, float y, glm::vec3& origin, glm::vec3& direction) const { diff --git a/interface/src/ui/BandwidthMeter.cpp b/interface/src/ui/BandwidthMeter.cpp index 1b73ec9fcd..f1bcb2f0c9 100644 --- a/interface/src/ui/BandwidthMeter.cpp +++ b/interface/src/ui/BandwidthMeter.cpp @@ -162,6 +162,8 @@ void BandwidthMeter::render(int screenWidth, int screenHeight) { _textRenderer->draw(-labelWidthOut - SPACING_RIGHT_CAPTION_IN_OUT, textYlowerLine, CAPTION_OUT, textColor); // Render vertical lines for the frame + // TODO: I think there may be a bug in this newest code and/or the GeometryCache code, because it seems like + // sometimes the bandwidth meter doesn't render the vertical lines renderVerticalLine(0, 0, h, COLOR_FRAME); renderVerticalLine(barWidth, 0, h, COLOR_FRAME); diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index a2a1755acd..53d7d4e70b 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -111,20 +111,20 @@ void Cube3DOverlay::render(RenderArgs* args) { auto geometryCache = DependencyManager::get(); - geometryCache->renderDashedLine(bottomLeftNear, bottomRightNear); - geometryCache->renderDashedLine(bottomRightNear, bottomRightFar); - geometryCache->renderDashedLine(bottomRightFar, bottomLeftFar); - geometryCache->renderDashedLine(bottomLeftFar, bottomLeftNear); + geometryCache->renderDashedLine(bottomLeftNear, bottomRightNear, cubeColor); + geometryCache->renderDashedLine(bottomRightNear, bottomRightFar, cubeColor); + geometryCache->renderDashedLine(bottomRightFar, bottomLeftFar, cubeColor); + geometryCache->renderDashedLine(bottomLeftFar, bottomLeftNear, cubeColor); - geometryCache->renderDashedLine(topLeftNear, topRightNear); - geometryCache->renderDashedLine(topRightNear, topRightFar); - geometryCache->renderDashedLine(topRightFar, topLeftFar); - geometryCache->renderDashedLine(topLeftFar, topLeftNear); + geometryCache->renderDashedLine(topLeftNear, topRightNear, cubeColor); + geometryCache->renderDashedLine(topRightNear, topRightFar, cubeColor); + geometryCache->renderDashedLine(topRightFar, topLeftFar, cubeColor); + geometryCache->renderDashedLine(topLeftFar, topLeftNear, cubeColor); - geometryCache->renderDashedLine(bottomLeftNear, topLeftNear); - geometryCache->renderDashedLine(bottomRightNear, topRightNear); - geometryCache->renderDashedLine(bottomLeftFar, topLeftFar); - geometryCache->renderDashedLine(bottomRightFar, topRightFar); + geometryCache->renderDashedLine(bottomLeftNear, topLeftNear, cubeColor); + geometryCache->renderDashedLine(bottomRightNear, topRightNear, cubeColor); + geometryCache->renderDashedLine(bottomLeftFar, topLeftFar, cubeColor); + geometryCache->renderDashedLine(bottomRightFar, topRightFar, cubeColor); } else { glScalef(dimensions.x, dimensions.y, dimensions.z); diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index f02006c5f8..d2bfa1955b 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -60,8 +60,7 @@ void Line3DOverlay::render(RenderArgs* args) { if (getIsDashedLine()) { // TODO: add support for color to renderDashedLine() - glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); - DependencyManager::get()->renderDashedLine(_position, _end, _geometryCacheID); + DependencyManager::get()->renderDashedLine(_position, _end, colorv4, _geometryCacheID); } else { DependencyManager::get()->renderLine(_start, _end, colorv4, _geometryCacheID); } diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 0c81e932a3..82a5383036 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -81,10 +81,10 @@ void Rectangle3DOverlay::render(RenderArgs* args) { glm::vec3 point3(halfDimensions.x, 0.0f, halfDimensions.y); glm::vec3 point4(-halfDimensions.x, 0.0f, halfDimensions.y); - geometryCache->renderDashedLine(point1, point2); - geometryCache->renderDashedLine(point2, point3); - geometryCache->renderDashedLine(point3, point4); - geometryCache->renderDashedLine(point4, point1); + geometryCache->renderDashedLine(point1, point2, rectangleColor); + geometryCache->renderDashedLine(point2, point3, rectangleColor); + geometryCache->renderDashedLine(point3, point4, rectangleColor); + geometryCache->renderDashedLine(point4, point1, rectangleColor); } else { diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 27019a2dd3..745b248bdd 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1366,7 +1366,8 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, int id) { +// TODO: switch this over to use BatchItemDetails like the other line and vertices functions +void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) { bool registered = (id != UNKNOWN_ID); Vec3Pair key(start, end); BufferDetails& details = registered ? _registeredDashedLines[id] : _dashedLines[key]; @@ -1383,6 +1384,12 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en } if (!details.buffer.isCreated()) { + + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + // draw each line segment with appropriate gaps const float DASH_LENGTH = 0.05f; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 038dcb352d..9316048981 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -134,7 +134,7 @@ public: void renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec4& color1, const glm::vec4& color2, int id = UNKNOWN_ID); - void renderDashedLine(const glm::vec3& start, const glm::vec3& end, int id = UNKNOWN_ID); + void renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id = UNKNOWN_ID); void renderLine(const glm::vec2& p1, const glm::vec2& p2, const glm::vec3& color, int id = UNKNOWN_ID) { renderLine(p1, p2, glm::vec4(color, 1.0f), id); } From 3447fea1dbcd0df43e4b9fabd66e894d84279b46 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Jan 2015 16:01:04 -0800 Subject: [PATCH 55/98] Revert "Update grid tool to be an overlay" This reverts commit 552a421f24ed8b856e8868ce3e2368c8135b552a. Conflicts: examples/libraries/gridTool.js --- examples/libraries/gridTool.js | 277 ++++----------------------------- 1 file changed, 27 insertions(+), 250 deletions(-) diff --git a/examples/libraries/gridTool.js b/examples/libraries/gridTool.js index 87b7f907e2..7eff1da5d0 100644 --- a/examples/libraries/gridTool.js +++ b/examples/libraries/gridTool.js @@ -224,273 +224,50 @@ Grid = function(opts) { GridTool = function(opts) { var that = {}; - var UI_URL = HIFI_PUBLIC_BUCKET + "images/tools/grid-toolbar.svg"; - var UI_WIDTH = 854; - var UI_HEIGHT = 37; - var horizontalGrid = opts.horizontalGrid; + var verticalGrid = opts.verticalGrid; + var listeners = []; - var uiOverlays = {}; - var allOverlays = []; + var url = Script.resolvePath('html/gridControls.html'); + var webView = new WebWindow('Grid', url, 200, 280); - function addUIOverlay(key, overlay, x, y, width, height) { - uiOverlays[key] = { - overlay: overlay, - x: x, - y: y, - width: width, - height: height, - }; - allOverlays.push(overlay); - } + horizontalGrid.addListener(function(data) { + webView.eventBridge.emitScriptEvent(JSON.stringify(data)); + selectionDisplay.updateHandles(); + }); - var lastKnownWindowWidth = null; - function repositionUI() { - if (lastKnownWindowWidth == Window.innerWidth) { - return; - } - - lastKnownWindowWidth = Window.innerWidth; - var x = Window.innerWidth / 2 - UI_WIDTH / 2; - var y = 10; - - for (var key in uiOverlays) { - info = uiOverlays[key]; - Overlays.editOverlay(info.overlay, { - x: x + info.x, - y: y + info.y, - }); - } - } - - // "Spritesheet" is laid out horizontally in this order - var UI_SPRITE_LIST = [ - { name: "gridText", width: 54 }, - { name: "visibleCheckbox", width: 60 }, - { name: "snapToGridCheckbox", width: 105 }, - - { name: "color0", width: 27 }, - { name: "color1", width: 27 }, - { name: "color2", width: 27 }, - { name: "color3", width: 27 }, - { name: "color4", width: 27 }, - - { name: "minorGridIcon", width: 34 }, - { name: "minorGridDecrease", width: 25 }, - { name: "minorGridInput", width: 26 }, - { name: "minorGridIncrease", width: 25 }, - - { name: "majorGridIcon", width: 40 }, - { name: "majorGridDecrease", width: 25 }, - { name: "majorGridInput", width: 26 }, - { name: "majorGridIncrease", width: 25 }, - - { name: "yPositionLabel", width: 160 }, - { name: "moveToLabel", width: 54 }, - { name: "moveToAvatar", width: 26 }, - { name: "moveToSelection", width: 34 }, - ]; - - // Add all overlays from spritesheet - var baseOverlay = null; - var x = 0; - for (var i = 0; i < UI_SPRITE_LIST.length; i++) { - var info = UI_SPRITE_LIST[i]; - - var props = { - imageURL: UI_URL, - subImage: { x: x, y: 0, width: info.width, height: UI_HEIGHT }, - width: info.width, - height: UI_HEIGHT, - alpha: 1.0, - visible: false, - }; - - var overlay; - if (baseOverlay == null) { - overlay = Overlays.addOverlay("image", { - imageURL: UI_URL, - }); - baseOverlay = overlay; - } else { - overlay = Overlays.cloneOverlay(baseOverlay); - } - - Overlays.editOverlay(overlay, props); - - addUIOverlay(info.name, overlay, x, 0, info.width, UI_HEIGHT); - - x += info.width; - } - - // Add Text overlays - var textProperties = { - color: { red: 255, green: 255, blue: 255 }, - topMargin: 6, - leftMargin: 4, - alpha: 1, - backgroundAlpha: 0, - text: "", - font: { size: 12 }, - visible: false, - }; - var minorGridWidthText = Overlays.addOverlay("text", textProperties); - var majorGridEveryText = Overlays.addOverlay("text", textProperties); - var yPositionText = Overlays.addOverlay("text", textProperties); - - addUIOverlay('minorGridWidthText', minorGridWidthText, 414, 8, 24, 24); - addUIOverlay('majorGridEveryText', majorGridEveryText, 530, 8, 24, 24); - addUIOverlay('yPositionText', yPositionText, 660, 8, 24, 24); - - var NUM_COLORS = 5; - function updateColorIndex(index) { - if (index < 0 || index >= NUM_COLORS) { - return; - } - - for (var i = 0 ; i < NUM_COLORS; i++) { - var info = uiOverlays['color' + i]; - Overlays.editOverlay(info.overlay, { - subImage: { - x: info.x, - y: i == index ? UI_HEIGHT : 0, - width: info.width, - height: info.height, - } - }); - } - } - - function updateGridVisible(value) { - var info = uiOverlays.visibleCheckbox; - Overlays.editOverlay(info.overlay, { - subImage: { - x: info.x, - y: value ? UI_HEIGHT : 0, - width: info.width, - height: info.height, + webView.eventBridge.webEventReceived.connect(function(data) { + data = JSON.parse(data); + if (data.type == "init") { + horizontalGrid.emitUpdate(); + } else if (data.type == "update") { + horizontalGrid.update(data); + for (var i = 0; i < listeners.length; i++) { + listeners[i](data); } - }); - } - - function updateSnapToGrid(value) { - var info = uiOverlays.snapToGridCheckbox; - Overlays.editOverlay(info.overlay, { - subImage: { - x: info.x, - y: value ? UI_HEIGHT : 0, - width: info.width, - height: info.height, - } - }); - } - - function updateMinorGridWidth(value) { - Overlays.editOverlay(minorGridWidthText, { - text: value.toFixed(1), - }); - } - - function updateMajorGridEvery(value) { - Overlays.editOverlay(majorGridEveryText, { - text: value, - }); - } - - function updateYPosition(value) { - Overlays.editOverlay(yPositionText, { - text: value.toFixed(2), - }); - } - - function updateOverlays() { - updateGridVisible(horizontalGrid.getVisible()); - updateSnapToGrid(horizontalGrid.getSnapToGrid()); - updateColorIndex(horizontalGrid.getColorIndex()); - - updateMinorGridWidth(horizontalGrid.getMinorGridWidth()); - updateMajorGridEvery(horizontalGrid.getMajorGridEvery()); - - updateYPosition(horizontalGrid.getOrigin().y); - } - - that.setVisible = function(visible) { - for (var i = 0; i < allOverlays.length; i++) { - Overlays.editOverlay(allOverlays[i], { visible: visible }); - } - } - - that.mousePressEvent = function(event) { - var overlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); - - if (allOverlays.indexOf(overlay) >= 0) { - if (overlay == uiOverlays.color0.overlay) { - horizontalGrid.setColorIndex(0); - } else if (overlay == uiOverlays.color1.overlay) { - horizontalGrid.setColorIndex(1); - } else if (overlay == uiOverlays.color2.overlay) { - horizontalGrid.setColorIndex(2); - } else if (overlay == uiOverlays.color3.overlay) { - horizontalGrid.setColorIndex(3); - } else if (overlay == uiOverlays.color4.overlay) { - horizontalGrid.setColorIndex(4); - } else if (overlay == uiOverlays.visibleCheckbox.overlay) { - horizontalGrid.setVisible(!horizontalGrid.getVisible()); - } else if (overlay == uiOverlays.snapToGridCheckbox.overlay) { - horizontalGrid.setSnapToGrid(!horizontalGrid.getSnapToGrid()); - } else if (overlay == uiOverlays.moveToAvatar.overlay) { + } else if (data.type == "action") { + var action = data.action; + if (action == "moveToAvatar") { var position = MyAvatar.getJointPosition("LeftFoot"); if (position.x == 0 && position.y == 0 && position.z == 0) { position = MyAvatar.position; } horizontalGrid.setPosition(position); - } else if (overlay == uiOverlays.moveToSelection.overlay) { + } else if (action == "moveToSelection") { var newPosition = selectionManager.worldPosition; newPosition = Vec3.subtract(newPosition, { x: 0, y: selectionManager.worldDimensions.y * 0.5, z: 0 }); - horizontalGrid.setPosition(newPosition); - } else if (overlay == uiOverlays.minorGridDecrease.overlay) { - var newValue = Math.max(0.1, horizontalGrid.getMinorGridWidth() - 0.1); - horizontalGrid.setMinorGridWidth(newValue); - } else if (overlay == uiOverlays.minorGridIncrease.overlay) { - horizontalGrid.setMinorGridWidth(horizontalGrid.getMinorGridWidth() + 0.1); - } else if (overlay == uiOverlays.majorGridDecrease.overlay) { - var newValue = Math.max(2, horizontalGrid.getMajorGridEvery() - 1); - horizontalGrid.setMajorGridEvery(newValue); - } else if (overlay == uiOverlays.majorGridIncrease.overlay) { - horizontalGrid.setMajorGridEvery(horizontalGrid.getMajorGridEvery() + 1); - } else if (overlay == uiOverlays.yPositionLabel.overlay) { - var newValue = Window.prompt("Y Position:", horizontalGrid.getOrigin().y.toFixed(4)); - if (newValue !== null) { - var y = parseFloat(newValue) - if (isNaN(y)) { - Window.alert("Invalid position"); - } else { - horizontalGrid.setPosition({ x: 0, y: y, z: 0 }); - } - } + grid.setPosition(newPosition); } - - // Clicking anywhere within the toolbar will "consume" this press event - return true; - } - - return false; - }; - - Script.scriptEnding.connect(function() { - for (var i = 0; i < allOverlays.length; i++) { - Overlays.deleteOverlay(allOverlays[i]); } }); - Script.update.connect(repositionUI); - horizontalGrid.addListener(function() { - selectionDisplay.updateHandles(); - updateOverlays(); - }); + that.addListener = function(callback) { + listeners.push(callback); + } - updateOverlays(); - repositionUI(); + that.setVisible = function(visible) { + webView.setVisible(visible); + } return that; }; From 018b38e56d23986624ba6c033023f288e6debed8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 18:51:10 -0800 Subject: [PATCH 56/98] fix warning --- interface/src/avatar/Hand.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index 7b885d85c3..55ba1701e0 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -131,7 +131,6 @@ void Hand::render(bool isMine, Model::RenderMode renderMode) { void Hand::renderHandTargets(bool isMine) { glPushMatrix(); - MyAvatar* myAvatar = Application::getInstance()->getAvatar(); const float avatarScale = Application::getInstance()->getAvatar()->getScale(); const float alpha = 1.0f; From 5d2df7b03f32095162b29f9da8c69d94c12a466c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 28 Jan 2015 18:51:23 -0800 Subject: [PATCH 57/98] implement color for dashed lines --- libraries/render-utils/src/GeometryCache.cpp | 61 ++++++++++++++------ libraries/render-utils/src/GeometryCache.h | 15 ++--- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 745b248bdd..eb4926c27f 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1369,13 +1369,13 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom // TODO: switch this over to use BatchItemDetails like the other line and vertices functions void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) { bool registered = (id != UNKNOWN_ID); - Vec3Pair key(start, end); - BufferDetails& details = registered ? _registeredDashedLines[id] : _dashedLines[key]; + Vec3PairVec2Pair key(Vec3Pair(start, end), Vec2Pair(glm::vec2(color.x, color.y), glm::vec2(color.z, color.w))); + BatchItemDetails& details = registered ? _registeredDashedLines[id] : _dashedLines[key]; // if this is a registered , and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registered && details.buffer.isCreated()) { + if (registered && details.isCreated) { if (_lastRegisteredDashedLines[id] != key) { - details.buffer.destroy(); + details.clear(); _lastRegisteredDashedLines[id] = key; #ifdef WANT_DEBUG qDebug() << "renderDashedLine()... RELEASING REGISTERED"; @@ -1383,14 +1383,13 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en } } - if (!details.buffer.isCreated()) { + if (!details.isCreated) { int compactColor = ((int(color.x * 255.0f) & 0xFF)) | ((int(color.y * 255.0f) & 0xFF) << 8) | ((int(color.z * 255.0f) & 0xFF) << 16) | ((int(color.w * 255.0f) & 0xFF) << 24); - - + // draw each line segment with appropriate gaps const float DASH_LENGTH = 0.05f; const float GAP_LENGTH = 0.025f; @@ -1406,6 +1405,26 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en const int FLOATS_PER_VERTEX = 3; details.vertices = (segmentCountFloor + 1) * 2; details.vertexSize = FLOATS_PER_VERTEX; + details.isCreated = true; + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + int* colorData = new int[details.vertices]; + int* colorDataAt = colorData; GLfloat* vertexData = new GLfloat[details.vertices * FLOATS_PER_VERTEX]; GLfloat* vertex = vertexData; @@ -1414,27 +1433,30 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en *(vertex++) = point.x; *(vertex++) = point.y; *(vertex++) = point.z; + *(colorDataAt++) = compactColor; for (int i = 0; i < segmentCountFloor; i++) { point += dashVector; *(vertex++) = point.x; *(vertex++) = point.y; *(vertex++) = point.z; + *(colorDataAt++) = compactColor; point += gapVector; *(vertex++) = point.x; *(vertex++) = point.y; *(vertex++) = point.z; + *(colorDataAt++) = compactColor; } *(vertex++) = end.x; *(vertex++) = end.y; *(vertex++) = end.z; + *(colorDataAt++) = compactColor; - details.buffer.create(); - details.buffer.setUsagePattern(QOpenGLBuffer::StaticDraw); - details.buffer.bind(); - details.buffer.allocate(vertexData, details.vertices * FLOATS_PER_VERTEX * sizeof(GLfloat)); + details.verticesBuffer->append(sizeof(GLfloat) * FLOATS_PER_VERTEX * details.vertices, (gpu::Buffer::Byte*) vertexData); + details.colorBuffer->append(sizeof(int) * details.vertices, (gpu::Buffer::Byte*) colorData); delete[] vertexData; + delete[] colorData; #ifdef WANT_DEBUG if (registered) { @@ -1443,15 +1465,20 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en qDebug() << "new dashed lines buffer made -- _dashedLines:" << _dashedLines.size(); } #endif - } else { - details.buffer.bind(); } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(details.vertexSize, GL_FLOAT, 0, 0); - glDrawArrays(GL_LINES, 0, details.vertices); + gpu::Batch batch; + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::LINES, details.vertices, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - details.buffer.release(); + glDisableClientState(GL_COLOR_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); } diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 9316048981..6a018a6ab3 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -202,12 +202,7 @@ private: void clear(); }; - QHash _sphereVBOs; QHash _coneVBOs; - QHash _wireCubeVBOs; - QHash _solidCubeVBOs; - QHash _quad2DVBOs; - QHash _quad2DTextureVBOs; QHash _quad3DTextureVBOs; QHash _registeredQuadVBOs; int _nextID; @@ -241,11 +236,9 @@ private: QHash _registeredVertices; - QHash _lastRegisteredDashedLines; - QHash _dashedLines; - QHash _registeredDashedLines; - - QHash _colors; + QHash _lastRegisteredDashedLines; + QHash _dashedLines; + QHash _registeredDashedLines; QHash _gridBuffers; QHash _registeredAlternateGridBuffers; @@ -281,7 +274,7 @@ public: const FBXGeometry& getFBXGeometry() const { return _geometry; } const QVector& getMeshes() const { return _meshes; } - +// QVector getJointMappings(const AnimationPointer& animation); virtual void setLoadPriority(const QPointer& owner, float priority); From ce9e8910e48c464c7e89f407370a9db52f2361d3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Jan 2015 09:04:57 -0800 Subject: [PATCH 58/98] Add callback to QScriptEngine::include(QString) --- libraries/script-engine/src/ScriptEngine.cpp | 4 ++-- libraries/script-engine/src/ScriptEngine.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 246f9d3be3..b400dd5cfb 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -635,10 +635,10 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac } } -void ScriptEngine::include(const QString& includeFile) { +void ScriptEngine::include(const QString& includeFile, QScriptValue callback) { QStringList urls; urls.append(includeFile); - include(urls); + include(urls, callback); } void ScriptEngine::load(const QString& loadFile) { diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 126e943982..f78a14bffa 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -97,7 +97,7 @@ public slots: void clearInterval(QObject* timer) { stopTimer(reinterpret_cast(timer)); } void clearTimeout(QObject* timer) { stopTimer(reinterpret_cast(timer)); } void include(const QStringList& includeFiles, QScriptValue callback = QScriptValue()); - void include(const QString& includeFile); + void include(const QString& includeFile, QScriptValue callback = QScriptValue()); void load(const QString& loadfile); void print(const QString& message); QUrl resolvePath(const QString& path) const; From e6caefa023f1e04095c23c76ae593557a07d64fc Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Jan 2015 09:08:55 -0800 Subject: [PATCH 59/98] Add comment to ScriptEngine::include() --- libraries/script-engine/src/ScriptEngine.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index b400dd5cfb..a002950d46 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -112,7 +112,7 @@ void ScriptEngine::setIsAvatar(bool isAvatar) { _avatarIdentityTimer->start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); _avatarBillboardTimer->start(AVATAR_BILLBOARD_PACKET_SEND_INTERVAL_MSECS); } - + if (!_isAvatar) { delete _avatarIdentityTimer; _avatarIdentityTimer = NULL; @@ -596,6 +596,12 @@ void ScriptEngine::print(const QString& message) { emit printedMessage(message); } +/** + * If a callback is specified, the included files will be loaded asynchronously and the callback will be called + * when all of the files have finished loading. + * If no callback is specified, the included files will be loaded synchronously and will block execution until + * all of the files have finished loading. + */ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callback) { QList urls; for (QString file : includeFiles) { From 4abb2481d6382c33cba8d0420f0706c21be33c58 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 10:10:53 -0800 Subject: [PATCH 60/98] removed old comment --- libraries/render-utils/src/GeometryCache.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index eb4926c27f..a493b815a8 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1366,7 +1366,6 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -// TODO: switch this over to use BatchItemDetails like the other line and vertices functions void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) { bool registered = (id != UNKNOWN_ID); Vec3PairVec2Pair key(Vec3Pair(start, end), Vec2Pair(glm::vec2(color.x, color.y), glm::vec2(color.z, color.w))); From 0f390a98b8add9b4c18f7b09d46ac0d998aec480 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 10:50:13 -0800 Subject: [PATCH 61/98] attempt to get color working for 3d textured quads --- interface/src/ui/ApplicationOverlay.cpp | 3 +- libraries/render-utils/src/GeometryCache.cpp | 153 +++++++++---------- libraries/render-utils/src/GeometryCache.h | 36 ++++- 3 files changed, 106 insertions(+), 86 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 2e6e1a1df4..9f5f6e21e5 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -257,7 +257,8 @@ void ApplicationOverlay::displayOverlayTexture() { glm::vec2 texCoordTopLeft(0.0f, 1.0f); glm::vec2 texCoordBottomRight(1.0f, 0.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, + glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); } glPopMatrix(); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index a493b815a8..2ddb46d196 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1254,9 +1254,9 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, - const glm::vec4& quadColor, int id) { + const glm::vec4& color, int id) { - #ifdef WANT_DEBUG + #if 1 // def WANT_DEBUG qDebug() << "renderQuad() vec3 + texture VBO..."; qDebug() << " topLeft:" << topLeft; qDebug() << " bottomLeft:" << bottomLeft; @@ -1264,106 +1264,99 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom qDebug() << " topRight:" << topRight; qDebug() << " texCoordTopLeft:" << texCoordTopLeft; qDebug() << " texCoordBottomRight:" << texCoordBottomRight; + qDebug() << " color:" << color; #endif //def WANT_DEBUG - bool registeredQuad = (id != UNKNOWN_ID); - Vec3PairVec2Pair key(Vec3Pair(topLeft, bottomRight), Vec2Pair(texCoordTopLeft, texCoordBottomRight)); - VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[id] : _quad3DTextureVBOs[key]; - + bool registered = (id != UNKNOWN_ID); + Vec3PairVec4Pair key(Vec3Pair(topLeft, bottomRight), + Vec4Pair(glm::vec4(texCoordTopLeft.x,texCoordTopLeft.y,texCoordBottomRight.x,texCoordBottomRight.y), + color)); + + BatchItemDetails& details = registered ? _registeredQuad3DTextures[id] : _quad3DTextures[key]; + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredQuad && vbo.first != 0) { - Vec3PairVec2Pair& lastKey = _lastRegisteredQuad3DTexture[id]; + if (registered && details.isCreated) { + Vec3PairVec4Pair& lastKey = _lastRegisteredQuad3DTexture[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredQuad3DTexture[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec3 + texture VBO... RELEASING REGISTERED QUAD"; + qDebug() << "renderQuad() 3D+texture ... RELEASING REGISTERED"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderQuad() vec3 + texture... REUSING PREVIOUSLY REGISTERED QUAD"; + qDebug() << "renderQuad() 3D+texture ... REUSING PREVIOUSLY REGISTERED"; } #endif // def WANT_DEBUG } - - const int FLOATS_PER_VERTEX = 5; // text coords & vertices - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); + + const int FLOATS_PER_VERTEX = 3 + 2; // 3d vertices + text coords const int vertices = 4; - const int indices = 4; - if (vbo.first == 0) { - _lastRegisteredQuad3DTexture[id] = key; - int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // text coords & vertices - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; - int v = 0; + const int NUM_POS_COORDS = 3; + const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float); - vertex[v++] = topLeft.x; - vertex[v++] = topLeft.y; - vertex[v++] = topLeft.z; - vertex[v++] = texCoordTopLeft.x; - vertex[v++] = texCoordTopLeft.y; - - vertex[v++] = bottomLeft.x; - vertex[v++] = bottomLeft.y; - vertex[v++] = bottomLeft.z; - vertex[v++] = texCoordBottomLeft.x; - vertex[v++] = texCoordBottomLeft.y; - - vertex[v++] = bottomRight.x; - vertex[v++] = bottomRight.y; - vertex[v++] = bottomRight.z; - vertex[v++] = texCoordBottomRight.x; - vertex[v++] = texCoordBottomRight.y; - - vertex[v++] = topRight.x; - vertex[v++] = topRight.y; - vertex[v++] = topRight.z; - vertex[v++] = texCoordTopRight.x; - vertex[v++] = texCoordTopRight.y; - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; + if (!details.isCreated) { - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << " _quad3DTextureVBOs.size():" << _quad3DTextureVBOs.size(); - } else { - qDebug() << "new registered quad VBO made -- _registeredQuadVBOs.size():" << _registeredQuadVBOs.size(); - } - #endif - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; // NOTE: this isn't used for BatchItemDetails maybe we can get rid of it + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), VERTEX_TEXCOORD_OFFSET); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + + float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { + topLeft.x, topLeft.y, topLeft.z, texCoordTopLeft.x, texCoordTopLeft.y, + bottomLeft.x, bottomLeft.y, bottomLeft.z, texCoordBottomLeft.x, texCoordBottomLeft.y, + bottomRight.x, bottomRight.y, bottomRight.z, texCoordBottomRight.x, texCoordBottomRight.y, + topRight.x, topRight.y, topRight.z, texCoordTopRight.x, texCoordTopRight.y, + }; + + const int NUM_COLOR_SCALARS_PER_QUAD = 4; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor }; + + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glVertexPointer(3, GL_FLOAT, NUM_BYTES_PER_VERTEX, 0); - glTexCoordPointer(2, GL_FLOAT, NUM_BYTES_PER_VERTEX, (const void *)(3 * sizeof(float))); + gpu::Batch batch; - glDrawRangeElementsEXT(GL_QUADS, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + glEnable(GL_TEXTURE_2D); + //glBindTexture(GL_TEXTURE_2D, _currentTextureID); // this is quad specific... + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::QUADS, 4, 0); + + gpu::GLBackend::renderBatch(batch); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); } void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 6a018a6ab3..300e68aadd 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -39,7 +39,10 @@ typedef glm::vec3 Vec3Key; typedef QPair Vec2Pair; typedef QPair Vec2PairPair; typedef QPair Vec3Pair; +typedef QPair Vec4Pair; typedef QPair Vec3PairVec2Pair; +typedef QPair Vec3PairVec4Pair; +typedef QPair Vec4PairVec4Pair; inline uint qHash(const glm::vec2& v, uint seed) { // multiply by prime numbers greater than the possible size @@ -70,6 +73,12 @@ inline uint qHash(const Vec3Pair& v, uint seed) { + 5021 * v.second.x + 5023 * v.second.y + 5039 * v.second.z, seed); } +inline uint qHash(const Vec4Pair& v, uint seed) { + // multiply by prime numbers greater than the possible size + return qHash(v.first.x + 5009 * v.first.y + 5011 * v.first.z + 5021 * v.first.w + + 5023 * v.second.x + 5039 * v.second.y + 5051 * v.second.z + 5059 * v.second.w , seed); +} + inline uint qHash(const Vec3PairVec2Pair& v, uint seed) { // multiply by prime numbers greater than the possible size return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + @@ -78,6 +87,24 @@ inline uint qHash(const Vec3PairVec2Pair& v, uint seed) { 5077 * v.second.second.x + 5081 * v.second.second.y, seed); } +inline uint qHash(const Vec3PairVec4Pair& v, uint seed) { + // multiply by prime numbers greater than the possible size + return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + + 5023 * v.first.second.x + 5039 * v.first.second.y + 5051 * v.first.second.z + + 5077 * v.second.first.x + 5081 * v.second.first.y + 5087 * v.second.first.z + 5099 * v.second.first.w + + 5101 * v.second.second.x + 5107 * v.second.second.y + 5113 * v.second.second.z + 5119 * v.second.second.w, + seed); +} + +inline uint qHash(const Vec4PairVec4Pair& v, uint seed) { + // multiply by prime numbers greater than the possible size + return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + 5021 * v.first.first.w + + 5023 * v.first.second.x + 5039 * v.first.second.y + 5051 * v.first.second.z + 5059 * v.first.second.w + + 5077 * v.second.first.x + 5081 * v.second.first.y + 5087 * v.second.first.z + 5099 * v.second.first.w + + 5101 * v.second.second.x + 5107 * v.second.second.y + 5113 * v.second.second.z + 5119 * v.second.second.w, + seed); +} + /// Stores cached geometry. class GeometryCache : public ResourceCache, public Dependency { Q_OBJECT @@ -117,7 +144,7 @@ public: const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, - const glm::vec4& quadColor, int id = UNKNOWN_ID); + const glm::vec4& color, int id = UNKNOWN_ID); void renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& color, int id = UNKNOWN_ID) @@ -203,12 +230,11 @@ private: }; QHash _coneVBOs; - QHash _quad3DTextureVBOs; - QHash _registeredQuadVBOs; int _nextID; - QHash _lastRegisteredQuad3DTexture; - + QHash _lastRegisteredQuad3DTexture; + QHash _quad3DTextures; + QHash _registeredQuad3DTextures; QHash _lastRegisteredQuad2DTexture; QHash _quad2DTextures; From 87e91a5a94db0bc392dab38e975cb921279e37f8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 11:44:36 -0800 Subject: [PATCH 62/98] Revert "attempt to get color working for 3d textured quads" This reverts commit 0f390a98b8add9b4c18f7b09d46ac0d998aec480. --- interface/src/ui/ApplicationOverlay.cpp | 3 +- libraries/render-utils/src/GeometryCache.cpp | 153 ++++++++++--------- libraries/render-utils/src/GeometryCache.h | 36 +---- 3 files changed, 86 insertions(+), 106 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 9f5f6e21e5..2e6e1a1df4 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -257,8 +257,7 @@ void ApplicationOverlay::displayOverlayTexture() { glm::vec2 texCoordTopLeft(0.0f, 1.0f); glm::vec2 texCoordBottomRight(1.0f, 0.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, - glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); } glPopMatrix(); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 2ddb46d196..a493b815a8 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1254,9 +1254,9 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, - const glm::vec4& color, int id) { + const glm::vec4& quadColor, int id) { - #if 1 // def WANT_DEBUG + #ifdef WANT_DEBUG qDebug() << "renderQuad() vec3 + texture VBO..."; qDebug() << " topLeft:" << topLeft; qDebug() << " bottomLeft:" << bottomLeft; @@ -1264,99 +1264,106 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom qDebug() << " topRight:" << topRight; qDebug() << " texCoordTopLeft:" << texCoordTopLeft; qDebug() << " texCoordBottomRight:" << texCoordBottomRight; - qDebug() << " color:" << color; #endif //def WANT_DEBUG - bool registered = (id != UNKNOWN_ID); - Vec3PairVec4Pair key(Vec3Pair(topLeft, bottomRight), - Vec4Pair(glm::vec4(texCoordTopLeft.x,texCoordTopLeft.y,texCoordBottomRight.x,texCoordBottomRight.y), - color)); - - BatchItemDetails& details = registered ? _registeredQuad3DTextures[id] : _quad3DTextures[key]; - + bool registeredQuad = (id != UNKNOWN_ID); + Vec3PairVec2Pair key(Vec3Pair(topLeft, bottomRight), Vec2Pair(texCoordTopLeft, texCoordBottomRight)); + VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[id] : _quad3DTextureVBOs[key]; + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registered && details.isCreated) { - Vec3PairVec4Pair& lastKey = _lastRegisteredQuad3DTexture[id]; + if (registeredQuad && vbo.first != 0) { + Vec3PairVec2Pair& lastKey = _lastRegisteredQuad3DTexture[id]; if (lastKey != key) { - details.clear(); - _lastRegisteredQuad3DTexture[id] = key; + glDeleteBuffers(1, &vbo.first); + glDeleteBuffers(1, &vbo.second); + vbo.first = vbo.second = 0; #ifdef WANT_DEBUG - qDebug() << "renderQuad() 3D+texture ... RELEASING REGISTERED"; + qDebug() << "renderQuad() vec3 + texture VBO... RELEASING REGISTERED QUAD"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderQuad() 3D+texture ... REUSING PREVIOUSLY REGISTERED"; + qDebug() << "renderQuad() vec3 + texture... REUSING PREVIOUSLY REGISTERED QUAD"; } #endif // def WANT_DEBUG } - - const int FLOATS_PER_VERTEX = 3 + 2; // 3d vertices + text coords - const int vertices = 4; - const int NUM_POS_COORDS = 3; - const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float); - - if (!details.isCreated) { - - details.isCreated = true; - details.vertices = vertices; - details.vertexSize = FLOATS_PER_VERTEX; // NOTE: this isn't used for BatchItemDetails maybe we can get rid of it - - gpu::BufferPointer verticesBuffer(new gpu::Buffer()); - gpu::BufferPointer colorBuffer(new gpu::Buffer()); - gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); - gpu::BufferStreamPointer stream(new gpu::BufferStream()); - - details.verticesBuffer = verticesBuffer; - details.colorBuffer = colorBuffer; - details.streamFormat = streamFormat; - details.stream = stream; - details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::XYZ), 0); - details.streamFormat->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), VERTEX_TEXCOORD_OFFSET); - details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + const int FLOATS_PER_VERTEX = 5; // text coords & vertices + const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); + const int vertices = 4; + const int indices = 4; + if (vbo.first == 0) { + _lastRegisteredQuad3DTexture[id] = key; + int vertexPoints = vertices * FLOATS_PER_VERTEX; + GLfloat* vertexData = new GLfloat[vertexPoints]; // text coords & vertices + GLfloat* vertex = vertexData; + static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; + int v = 0; - details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); - details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + vertex[v++] = topLeft.x; + vertex[v++] = topLeft.y; + vertex[v++] = topLeft.z; + vertex[v++] = texCoordTopLeft.x; + vertex[v++] = texCoordTopLeft.y; + + vertex[v++] = bottomLeft.x; + vertex[v++] = bottomLeft.y; + vertex[v++] = bottomLeft.z; + vertex[v++] = texCoordBottomLeft.x; + vertex[v++] = texCoordBottomLeft.y; + + vertex[v++] = bottomRight.x; + vertex[v++] = bottomRight.y; + vertex[v++] = bottomRight.z; + vertex[v++] = texCoordBottomRight.x; + vertex[v++] = texCoordBottomRight.y; + + vertex[v++] = topRight.x; + vertex[v++] = topRight.y; + vertex[v++] = topRight.z; + vertex[v++] = texCoordTopRight.x; + vertex[v++] = texCoordTopRight.y; + + glGenBuffers(1, &vbo.first); + glBindBuffer(GL_ARRAY_BUFFER, vbo.first); + glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); + delete[] vertexData; + + GLushort* indexData = new GLushort[indices]; + GLushort* index = indexData; + for (int i = 0; i < indices; i++) { + index[i] = cannonicalIndices[i]; + } + + glGenBuffers(1, &vbo.second); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); + delete[] indexData; - - float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { - topLeft.x, topLeft.y, topLeft.z, texCoordTopLeft.x, texCoordTopLeft.y, - bottomLeft.x, bottomLeft.y, bottomLeft.z, texCoordBottomLeft.x, texCoordBottomLeft.y, - bottomRight.x, bottomRight.y, bottomRight.z, texCoordBottomRight.x, texCoordBottomRight.y, - topRight.x, topRight.y, topRight.z, texCoordTopRight.x, texCoordTopRight.y, - }; - - const int NUM_COLOR_SCALARS_PER_QUAD = 4; - int compactColor = ((int(color.x * 255.0f) & 0xFF)) | - ((int(color.y * 255.0f) & 0xFF) << 8) | - ((int(color.z * 255.0f) & 0xFF) << 16) | - ((int(color.w * 255.0f) & 0xFF) << 24); - int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor }; - - - details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); - details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); + #ifdef WANT_DEBUG + if (id == UNKNOWN_ID) { + qDebug() << " _quad3DTextureVBOs.size():" << _quad3DTextureVBOs.size(); + } else { + qDebug() << "new registered quad VBO made -- _registeredQuadVBOs.size():" << _registeredQuadVBOs.size(); + } + #endif + } else { + glBindBuffer(GL_ARRAY_BUFFER, vbo.first); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); } - gpu::Batch batch; + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(3, GL_FLOAT, NUM_BYTES_PER_VERTEX, 0); + glTexCoordPointer(2, GL_FLOAT, NUM_BYTES_PER_VERTEX, (const void *)(3 * sizeof(float))); - glEnable(GL_TEXTURE_2D); - //glBindTexture(GL_TEXTURE_2D, _currentTextureID); // this is quad specific... - - batch.setInputFormat(details.streamFormat); - batch.setInputStream(0, *details.stream); - batch.draw(gpu::QUADS, 4, 0); - - gpu::GLBackend::renderBatch(batch); + glDrawRangeElementsEXT(GL_QUADS, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 300e68aadd..6a018a6ab3 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -39,10 +39,7 @@ typedef glm::vec3 Vec3Key; typedef QPair Vec2Pair; typedef QPair Vec2PairPair; typedef QPair Vec3Pair; -typedef QPair Vec4Pair; typedef QPair Vec3PairVec2Pair; -typedef QPair Vec3PairVec4Pair; -typedef QPair Vec4PairVec4Pair; inline uint qHash(const glm::vec2& v, uint seed) { // multiply by prime numbers greater than the possible size @@ -73,12 +70,6 @@ inline uint qHash(const Vec3Pair& v, uint seed) { + 5021 * v.second.x + 5023 * v.second.y + 5039 * v.second.z, seed); } -inline uint qHash(const Vec4Pair& v, uint seed) { - // multiply by prime numbers greater than the possible size - return qHash(v.first.x + 5009 * v.first.y + 5011 * v.first.z + 5021 * v.first.w - + 5023 * v.second.x + 5039 * v.second.y + 5051 * v.second.z + 5059 * v.second.w , seed); -} - inline uint qHash(const Vec3PairVec2Pair& v, uint seed) { // multiply by prime numbers greater than the possible size return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + @@ -87,24 +78,6 @@ inline uint qHash(const Vec3PairVec2Pair& v, uint seed) { 5077 * v.second.second.x + 5081 * v.second.second.y, seed); } -inline uint qHash(const Vec3PairVec4Pair& v, uint seed) { - // multiply by prime numbers greater than the possible size - return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z - + 5023 * v.first.second.x + 5039 * v.first.second.y + 5051 * v.first.second.z - + 5077 * v.second.first.x + 5081 * v.second.first.y + 5087 * v.second.first.z + 5099 * v.second.first.w - + 5101 * v.second.second.x + 5107 * v.second.second.y + 5113 * v.second.second.z + 5119 * v.second.second.w, - seed); -} - -inline uint qHash(const Vec4PairVec4Pair& v, uint seed) { - // multiply by prime numbers greater than the possible size - return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + 5021 * v.first.first.w - + 5023 * v.first.second.x + 5039 * v.first.second.y + 5051 * v.first.second.z + 5059 * v.first.second.w - + 5077 * v.second.first.x + 5081 * v.second.first.y + 5087 * v.second.first.z + 5099 * v.second.first.w - + 5101 * v.second.second.x + 5107 * v.second.second.y + 5113 * v.second.second.z + 5119 * v.second.second.w, - seed); -} - /// Stores cached geometry. class GeometryCache : public ResourceCache, public Dependency { Q_OBJECT @@ -144,7 +117,7 @@ public: const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, - const glm::vec4& color, int id = UNKNOWN_ID); + const glm::vec4& quadColor, int id = UNKNOWN_ID); void renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& color, int id = UNKNOWN_ID) @@ -230,11 +203,12 @@ private: }; QHash _coneVBOs; + QHash _quad3DTextureVBOs; + QHash _registeredQuadVBOs; int _nextID; - QHash _lastRegisteredQuad3DTexture; - QHash _quad3DTextures; - QHash _registeredQuad3DTextures; + QHash _lastRegisteredQuad3DTexture; + QHash _lastRegisteredQuad2DTexture; QHash _quad2DTextures; From 418b97a6485b84a0c17286b0630e5c5d47e223d0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 10:50:13 -0800 Subject: [PATCH 63/98] attempt to get color working for 3d textured quads --- interface/src/ui/ApplicationOverlay.cpp | 3 +- libraries/render-utils/src/GeometryCache.cpp | 153 +++++++++---------- libraries/render-utils/src/GeometryCache.h | 36 ++++- 3 files changed, 106 insertions(+), 86 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 2e6e1a1df4..9f5f6e21e5 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -257,7 +257,8 @@ void ApplicationOverlay::displayOverlayTexture() { glm::vec2 texCoordTopLeft(0.0f, 1.0f); glm::vec2 texCoordBottomRight(1.0f, 0.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, + glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); } glPopMatrix(); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index a493b815a8..2ddb46d196 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1254,9 +1254,9 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, - const glm::vec4& quadColor, int id) { + const glm::vec4& color, int id) { - #ifdef WANT_DEBUG + #if 1 // def WANT_DEBUG qDebug() << "renderQuad() vec3 + texture VBO..."; qDebug() << " topLeft:" << topLeft; qDebug() << " bottomLeft:" << bottomLeft; @@ -1264,106 +1264,99 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom qDebug() << " topRight:" << topRight; qDebug() << " texCoordTopLeft:" << texCoordTopLeft; qDebug() << " texCoordBottomRight:" << texCoordBottomRight; + qDebug() << " color:" << color; #endif //def WANT_DEBUG - bool registeredQuad = (id != UNKNOWN_ID); - Vec3PairVec2Pair key(Vec3Pair(topLeft, bottomRight), Vec2Pair(texCoordTopLeft, texCoordBottomRight)); - VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[id] : _quad3DTextureVBOs[key]; - + bool registered = (id != UNKNOWN_ID); + Vec3PairVec4Pair key(Vec3Pair(topLeft, bottomRight), + Vec4Pair(glm::vec4(texCoordTopLeft.x,texCoordTopLeft.y,texCoordBottomRight.x,texCoordBottomRight.y), + color)); + + BatchItemDetails& details = registered ? _registeredQuad3DTextures[id] : _quad3DTextures[key]; + // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredQuad && vbo.first != 0) { - Vec3PairVec2Pair& lastKey = _lastRegisteredQuad3DTexture[id]; + if (registered && details.isCreated) { + Vec3PairVec4Pair& lastKey = _lastRegisteredQuad3DTexture[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredQuad3DTexture[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec3 + texture VBO... RELEASING REGISTERED QUAD"; + qDebug() << "renderQuad() 3D+texture ... RELEASING REGISTERED"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderQuad() vec3 + texture... REUSING PREVIOUSLY REGISTERED QUAD"; + qDebug() << "renderQuad() 3D+texture ... REUSING PREVIOUSLY REGISTERED"; } #endif // def WANT_DEBUG } - - const int FLOATS_PER_VERTEX = 5; // text coords & vertices - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); + + const int FLOATS_PER_VERTEX = 3 + 2; // 3d vertices + text coords const int vertices = 4; - const int indices = 4; - if (vbo.first == 0) { - _lastRegisteredQuad3DTexture[id] = key; - int vertexPoints = vertices * FLOATS_PER_VERTEX; - GLfloat* vertexData = new GLfloat[vertexPoints]; // text coords & vertices - GLfloat* vertex = vertexData; - static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; - int v = 0; + const int NUM_POS_COORDS = 3; + const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float); - vertex[v++] = topLeft.x; - vertex[v++] = topLeft.y; - vertex[v++] = topLeft.z; - vertex[v++] = texCoordTopLeft.x; - vertex[v++] = texCoordTopLeft.y; - - vertex[v++] = bottomLeft.x; - vertex[v++] = bottomLeft.y; - vertex[v++] = bottomLeft.z; - vertex[v++] = texCoordBottomLeft.x; - vertex[v++] = texCoordBottomLeft.y; - - vertex[v++] = bottomRight.x; - vertex[v++] = bottomRight.y; - vertex[v++] = bottomRight.z; - vertex[v++] = texCoordBottomRight.x; - vertex[v++] = texCoordBottomRight.y; - - vertex[v++] = topRight.x; - vertex[v++] = topRight.y; - vertex[v++] = topRight.z; - vertex[v++] = texCoordTopRight.x; - vertex[v++] = texCoordTopRight.y; - - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; + if (!details.isCreated) { - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << " _quad3DTextureVBOs.size():" << _quad3DTextureVBOs.size(); - } else { - qDebug() << "new registered quad VBO made -- _registeredQuadVBOs.size():" << _registeredQuadVBOs.size(); - } - #endif - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; // NOTE: this isn't used for BatchItemDetails maybe we can get rid of it + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), VERTEX_TEXCOORD_OFFSET); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + + + float vertexBuffer[vertices * FLOATS_PER_VERTEX] = { + topLeft.x, topLeft.y, topLeft.z, texCoordTopLeft.x, texCoordTopLeft.y, + bottomLeft.x, bottomLeft.y, bottomLeft.z, texCoordBottomLeft.x, texCoordBottomLeft.y, + bottomRight.x, bottomRight.y, bottomRight.z, texCoordBottomRight.x, texCoordBottomRight.y, + topRight.x, topRight.y, topRight.z, texCoordTopRight.x, texCoordTopRight.y, + }; + + const int NUM_COLOR_SCALARS_PER_QUAD = 4; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor }; + + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); } - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glVertexPointer(3, GL_FLOAT, NUM_BYTES_PER_VERTEX, 0); - glTexCoordPointer(2, GL_FLOAT, NUM_BYTES_PER_VERTEX, (const void *)(3 * sizeof(float))); + gpu::Batch batch; - glDrawRangeElementsEXT(GL_QUADS, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + glEnable(GL_TEXTURE_2D); + //glBindTexture(GL_TEXTURE_2D, _currentTextureID); // this is quad specific... + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::QUADS, 4, 0); + + gpu::GLBackend::renderBatch(batch); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); } void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 6a018a6ab3..300e68aadd 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -39,7 +39,10 @@ typedef glm::vec3 Vec3Key; typedef QPair Vec2Pair; typedef QPair Vec2PairPair; typedef QPair Vec3Pair; +typedef QPair Vec4Pair; typedef QPair Vec3PairVec2Pair; +typedef QPair Vec3PairVec4Pair; +typedef QPair Vec4PairVec4Pair; inline uint qHash(const glm::vec2& v, uint seed) { // multiply by prime numbers greater than the possible size @@ -70,6 +73,12 @@ inline uint qHash(const Vec3Pair& v, uint seed) { + 5021 * v.second.x + 5023 * v.second.y + 5039 * v.second.z, seed); } +inline uint qHash(const Vec4Pair& v, uint seed) { + // multiply by prime numbers greater than the possible size + return qHash(v.first.x + 5009 * v.first.y + 5011 * v.first.z + 5021 * v.first.w + + 5023 * v.second.x + 5039 * v.second.y + 5051 * v.second.z + 5059 * v.second.w , seed); +} + inline uint qHash(const Vec3PairVec2Pair& v, uint seed) { // multiply by prime numbers greater than the possible size return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + @@ -78,6 +87,24 @@ inline uint qHash(const Vec3PairVec2Pair& v, uint seed) { 5077 * v.second.second.x + 5081 * v.second.second.y, seed); } +inline uint qHash(const Vec3PairVec4Pair& v, uint seed) { + // multiply by prime numbers greater than the possible size + return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + + 5023 * v.first.second.x + 5039 * v.first.second.y + 5051 * v.first.second.z + + 5077 * v.second.first.x + 5081 * v.second.first.y + 5087 * v.second.first.z + 5099 * v.second.first.w + + 5101 * v.second.second.x + 5107 * v.second.second.y + 5113 * v.second.second.z + 5119 * v.second.second.w, + seed); +} + +inline uint qHash(const Vec4PairVec4Pair& v, uint seed) { + // multiply by prime numbers greater than the possible size + return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.first.z + 5021 * v.first.first.w + + 5023 * v.first.second.x + 5039 * v.first.second.y + 5051 * v.first.second.z + 5059 * v.first.second.w + + 5077 * v.second.first.x + 5081 * v.second.first.y + 5087 * v.second.first.z + 5099 * v.second.first.w + + 5101 * v.second.second.x + 5107 * v.second.second.y + 5113 * v.second.second.z + 5119 * v.second.second.w, + seed); +} + /// Stores cached geometry. class GeometryCache : public ResourceCache, public Dependency { Q_OBJECT @@ -117,7 +144,7 @@ public: const glm::vec3& bottomRight, const glm::vec3& topRight, const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomLeft, const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, - const glm::vec4& quadColor, int id = UNKNOWN_ID); + const glm::vec4& color, int id = UNKNOWN_ID); void renderLine(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& color, int id = UNKNOWN_ID) @@ -203,12 +230,11 @@ private: }; QHash _coneVBOs; - QHash _quad3DTextureVBOs; - QHash _registeredQuadVBOs; int _nextID; - QHash _lastRegisteredQuad3DTexture; - + QHash _lastRegisteredQuad3DTexture; + QHash _quad3DTextures; + QHash _registeredQuad3DTextures; QHash _lastRegisteredQuad2DTexture; QHash _quad2DTextures; From 534575fd102c5bb599812ca5f5877c5f78b2bcf6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 13:16:14 -0800 Subject: [PATCH 64/98] fix a couple bugs in 3d textured version of renderQuad --- libraries/render-utils/src/GeometryCache.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 2ddb46d196..89be78e74f 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1256,7 +1256,7 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom const glm::vec2& texCoordBottomRight, const glm::vec2& texCoordTopRight, const glm::vec4& color, int id) { - #if 1 // def WANT_DEBUG + #ifdef WANT_DEBUG qDebug() << "renderQuad() vec3 + texture VBO..."; qDebug() << " topLeft:" << topLeft; qDebug() << " bottomLeft:" << bottomLeft; @@ -1312,7 +1312,7 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom details.streamFormat = streamFormat; details.stream = stream; - details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); details.streamFormat->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), VERTEX_TEXCOORD_OFFSET); details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); @@ -1334,7 +1334,6 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom ((int(color.w * 255.0f) & 0xFF) << 24); int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor }; - details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); } @@ -1355,8 +1354,12 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom glDisableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); + + // TODO: The callers of this method (renderMagnifier and renderReticle) assume that we won't disable an unbind + // the texture after rendering. I'm not sure if this is correct in general but it's currently required for the + // oculus overlay to work. + //glBindTexture(GL_TEXTURE_2D, 0); + //glDisable(GL_TEXTURE_2D); } void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) { From 8c0db268e639ec1a12ad1da7ae64692e44bb1460 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 13:41:39 -0800 Subject: [PATCH 65/98] fix build buster --- interface/src/devices/PrioVR.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/devices/PrioVR.cpp b/interface/src/devices/PrioVR.cpp index 78b802ac9c..56b2587b0d 100644 --- a/interface/src/devices/PrioVR.cpp +++ b/interface/src/devices/PrioVR.cpp @@ -218,6 +218,6 @@ void PrioVR::renderCalibrationCountdown() { auto glCanvas = DependencyManager::get(); textRenderer->draw((glCanvas->width() - textRenderer->computeWidth(text.constData())) / 2, glCanvas->height() / 2, - text); + text, glm::vec4(1,1,1,1)); #endif } From b2f16be92a19bc16869d4d4f53081b8bca25c911 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 29 Jan 2015 15:17:55 -0800 Subject: [PATCH 66/98] Fixing the non loading of some texture because the QImage bit size is not exactly what's expected --- interface/src/ui/overlays/ImageOverlay.cpp | 14 ++++++++++++-- libraries/gpu/src/gpu/Texture.cpp | 11 ++++++++++- libraries/render-utils/src/TextureCache.cpp | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 0c5d9a7737..73da8cc9c0 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -45,7 +45,6 @@ ImageOverlay::~ImageOverlay() { // TODO: handle setting image multiple times, how do we manage releasing the bound texture? void ImageOverlay::setImageURL(const QUrl& url) { _imageURL = url; - if (url.isEmpty()) { _isLoaded = true; _renderImage = false; @@ -57,6 +56,8 @@ void ImageOverlay::setImageURL(const QUrl& url) { } void ImageOverlay::render(RenderArgs* args) { + QString problem("http://s3.amazonaws.com/hifi-public/images/tools/grid-toolbar.svg"); + bool theONE = (_imageURL == problem); if (!_isLoaded && _renderImage) { _isLoaded = true; _texture = DependencyManager::get()->getTexture(_imageURL); @@ -69,8 +70,17 @@ void ImageOverlay::render(RenderArgs* args) { } if (_renderImage) { + glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, _texture->getID()); + if (theONE) { + std::string name = _imageURL.toString().toStdString(); + } + GLuint texID = _texture->getID(); + if (texID == 27) { + std::string name = _imageURL.toString().toStdString(); + glBindTexture(GL_TEXTURE_2D, texID); + } else + glBindTexture(GL_TEXTURE_2D, _texture->getID()); } const float MAX_COLOR = 255.0f; diff --git a/libraries/gpu/src/gpu/Texture.cpp b/libraries/gpu/src/gpu/Texture.cpp index d0779afb42..f9fbcb72df 100755 --- a/libraries/gpu/src/gpu/Texture.cpp +++ b/libraries/gpu/src/gpu/Texture.cpp @@ -254,7 +254,16 @@ bool Texture::assignStoredMip(uint16 level, const Element& format, Size size, co } // THen check that the mem buffer passed make sense with its format - if (size == evalStoredMipSize(level, format)) { + Size expectedSize = evalStoredMipSize(level, format); + if (size == expectedSize) { + _storage->assignMipData(level, format, size, bytes); + _stamp++; + return true; + } else if (size > expectedSize) { + // NOTE: We are facing this case sometime because apparently QImage (from where we get the bits) is generating images + // and alligning the line of pixels to 32 bits. + // We should probably consider something a bit more smart to get the correct result but for now (UI elements) + // it seems to work... _storage->assignMipData(level, format, size, bytes); _stamp++; return true; diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index 3644ded81c..aac2ec1b8c 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -387,7 +387,7 @@ NetworkTexture::NetworkTexture(const QUrl& url, TextureType type, const QByteArr if (!url.isValid()) { _loaded = true; } - + // default to white/blue/black /* glBindTexture(GL_TEXTURE_2D, getID()); switch (type) { From ec54ac7401a5186e882bbeaa5f4acea6a100af4f Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 29 Jan 2015 15:24:36 -0800 Subject: [PATCH 67/98] Fixing the non loading of some texture because the QImage bit size is not exactly what's expected --- interface/src/ui/overlays/ImageOverlay.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 73da8cc9c0..e354ea539e 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -56,8 +56,6 @@ void ImageOverlay::setImageURL(const QUrl& url) { } void ImageOverlay::render(RenderArgs* args) { - QString problem("http://s3.amazonaws.com/hifi-public/images/tools/grid-toolbar.svg"); - bool theONE = (_imageURL == problem); if (!_isLoaded && _renderImage) { _isLoaded = true; _texture = DependencyManager::get()->getTexture(_imageURL); @@ -70,17 +68,8 @@ void ImageOverlay::render(RenderArgs* args) { } if (_renderImage) { - glEnable(GL_TEXTURE_2D); - if (theONE) { - std::string name = _imageURL.toString().toStdString(); - } - GLuint texID = _texture->getID(); - if (texID == 27) { - std::string name = _imageURL.toString().toStdString(); - glBindTexture(GL_TEXTURE_2D, texID); - } else - glBindTexture(GL_TEXTURE_2D, _texture->getID()); + glBindTexture(GL_TEXTURE_2D, _texture->getID()); } const float MAX_COLOR = 255.0f; From c00346e8cb42fd72c36f646e10fdc09603a15aee Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Jan 2015 16:45:19 -0800 Subject: [PATCH 68/98] Revert "Remove gridControls.html" This reverts commit a0cb40597b416eba0294141e3cb4834e7ef9afd6. --- examples/html/gridControls.html | 167 ++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 examples/html/gridControls.html diff --git a/examples/html/gridControls.html b/examples/html/gridControls.html new file mode 100644 index 0000000000..06090da423 --- /dev/null +++ b/examples/html/gridControls.html @@ -0,0 +1,167 @@ + + + + + + +
+ +
+ +
+ +
+ + + + +
+ +
+ + + + +
+ +
+ + + + +
+ +
+ + + + +
+ +
+ + + + +
+ +
+ + +
+ +
+ + + +
+
+ + + +
+
+ + From eb69720af4565916ed6359b0c30750f64c4890be Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Jan 2015 16:58:44 -0800 Subject: [PATCH 69/98] Update when grid tool window is shown --- examples/editEntities.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index e2c7a6d435..43c36a0846 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -38,6 +38,7 @@ var cameraManager = new CameraManager(); Script.include("libraries/gridTool.js"); var grid = Grid(); gridTool = GridTool({ horizontalGrid: grid }); +gridTool.setVisible(false); Script.include("libraries/entityList.js"); var entityListTool = EntityListTool(); @@ -52,8 +53,10 @@ selectionManager.addEventListener(function() { // Open properties and model list, but force selection of model list tab propertiesTool.setVisible(false); entityListTool.setVisible(false); + gridTool.setVisible(false); propertiesTool.setVisible(true); entityListTool.setVisible(true); + gridTool.setVisible(true); hasShownPropertiesTool = true; } }); @@ -239,7 +242,6 @@ var toolBar = (function () { } else { hasShownPropertiesTool = false; cameraManager.enable(); - gridTool.setVisible(true); grid.setEnabled(true); } } From 0307448ec323ce282797d9b3323a635fa6b89b08 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Jan 2015 16:59:37 -0800 Subject: [PATCH 70/98] Fix color index for entity grid tool --- examples/html/gridControls.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/html/gridControls.html b/examples/html/gridControls.html index 06090da423..ef4c6aa8c5 100644 --- a/examples/html/gridControls.html +++ b/examples/html/gridControls.html @@ -11,6 +11,7 @@ { red: 0, green: 255, blue: 0}, { red: 0, green: 0, blue: 255 }, ]; + var gridColorIndex = 0; elPosY = document.getElementById("horiz-y"); elMinorSpacing = document.getElementById("minor-spacing"); @@ -59,6 +60,7 @@ minorGridSpacing: elMinorSpacing.value, majorGridEvery: elMajorSpacing.value, gridColor: gridColor, + colorIndex: gridColorIndex, snapToGrid: elSnapToGrid.checked, visible: elHorizontalGridVisible.checked, })); @@ -93,12 +95,13 @@ box.setAttribute('class', 'color-box'); box.style.background = 'rgb(' + colors.red + ', ' + colors.green + ', ' + colors.blue + ')'; document.getElementById("grid-colors").appendChild(box); - box.addEventListener("click", function(color) { + box.addEventListener("click", function(color, index) { return function() { gridColor = color; + gridColorIndex = index; emitUpdate(); } - }({ red: colors.red, green: colors.green, blue: colors.blue })); + }({ red: colors.red, green: colors.green, blue: colors.blue }, i)); } EventBridge.emitWebEvent(JSON.stringify({ type: 'init' })); From 7017fdbac08fbe302055f724df987783f2152d5a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Jan 2015 16:59:58 -0800 Subject: [PATCH 71/98] Update style of grid tools --- examples/html/gridControls.html | 4 ---- examples/html/style.css | 4 +--- examples/libraries/gridTool.js | 6 +++--- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/examples/html/gridControls.html b/examples/html/gridControls.html index ef4c6aa8c5..7e354c5bec 100644 --- a/examples/html/gridControls.html +++ b/examples/html/gridControls.html @@ -109,10 +109,6 @@ -
- -
-
diff --git a/examples/html/style.css b/examples/html/style.css index 08ca32aba5..8b52447ea2 100644 --- a/examples/html/style.css +++ b/examples/html/style.css @@ -73,8 +73,6 @@ body { } .grid-section { - border-top: 0.75pt solid #DDD; - background-color: #efefef; } input[type=button] { @@ -169,7 +167,7 @@ input { color: rgb(150, 150, 150); } -#properties-list input, #properties-list textarea { +input, textarea { background-color: rgb(102, 102, 102); color: rgb(204, 204, 204); border: none; diff --git a/examples/libraries/gridTool.js b/examples/libraries/gridTool.js index 7eff1da5d0..6e16186abc 100644 --- a/examples/libraries/gridTool.js +++ b/examples/libraries/gridTool.js @@ -2,11 +2,11 @@ Grid = function(opts) { var that = {}; var colors = [ - { red: 0, green: 255, blue: 0 }, - { red: 255, green: 255, blue: 255 }, { red: 0, green: 0, blue: 0 }, - { red: 0, green: 0, blue: 255 }, + { red: 255, green: 255, blue: 255 }, { red: 255, green: 0, blue: 0 }, + { red: 0, green: 255, blue: 0 }, + { red: 0, green: 0, blue: 255 }, ]; var colorIndex = 0; var gridAlpha = 0.6; From a4c82072a2f4b8247491c42c9dc2b8c93c4d5244 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Fri, 30 Jan 2015 02:00:35 +0100 Subject: [PATCH 72/98] changing texture size limit from 1024*1024 to 2M i.e. (1024 * 2048). It's dynamic and resizes the texture to the best fit within the 2M area. --- libraries/render-utils/src/TextureCache.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index 3644ded81c..a0c47585c7 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -458,13 +458,18 @@ void ImageReader::run() { int originalWidth = image.width(); int originalHeight = image.height(); - // enforce a fixed maximum - const int MAXIMUM_SIZE = 1024; - if (image.width() > MAXIMUM_SIZE || image.height() > MAXIMUM_SIZE) { - qDebug() << "Image greater than maximum size:" << _url << image.width() << image.height(); - image = image.scaled(MAXIMUM_SIZE, MAXIMUM_SIZE, Qt::KeepAspectRatio); - } + // enforce a fixed maximum area (1024 * 2048) + const float MAXIMUM_AREA_SIZE = 2097152.0f; int imageArea = image.width() * image.height(); + if (imageArea > MAXIMUM_AREA_SIZE) { + float scaleRatio = sqrtf(MAXIMUM_AREA_SIZE) / sqrtf((float)imageArea); + int resizeWidth = static_cast(std::floor(scaleRatio * static_cast(image.width()))); + int resizeHeight = static_cast(std::floor(scaleRatio * static_cast(image.height()))); + qDebug() << "Image greater than maximum size:" << _url << image.width() << image.height() << + " scaled to :" << resizeWidth << resizeHeight; + image = image.scaled(resizeWidth, resizeHeight, Qt::IgnoreAspectRatio); + imageArea = image.width() * image.height(); + } const int EIGHT_BIT_MAXIMUM = 255; if (!image.hasAlphaChannel()) { From ff29b1c8cc3954108edc7085a2afba3c9b74c420 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Fri, 30 Jan 2015 02:18:51 +0100 Subject: [PATCH 73/98] style/conversion fixes --- libraries/render-utils/src/TextureCache.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index a0c47585c7..a97b3f599a 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -459,14 +459,14 @@ void ImageReader::run() { int originalHeight = image.height(); // enforce a fixed maximum area (1024 * 2048) - const float MAXIMUM_AREA_SIZE = 2097152.0f; + const int MAXIMUM_AREA_SIZE = 2097152; int imageArea = image.width() * image.height(); if (imageArea > MAXIMUM_AREA_SIZE) { - float scaleRatio = sqrtf(MAXIMUM_AREA_SIZE) / sqrtf((float)imageArea); + float scaleRatio = sqrtf((float)MAXIMUM_AREA_SIZE) / sqrtf((float)imageArea); int resizeWidth = static_cast(std::floor(scaleRatio * static_cast(image.width()))); int resizeHeight = static_cast(std::floor(scaleRatio * static_cast(image.height()))); qDebug() << "Image greater than maximum size:" << _url << image.width() << image.height() << - " scaled to :" << resizeWidth << resizeHeight; + " scaled to:" << resizeWidth << resizeHeight; image = image.scaled(resizeWidth, resizeHeight, Qt::IgnoreAspectRatio); imageArea = image.width() * image.height(); } From c1bb03e9a861dc616230df352a108ed41c8aa19a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 17:23:48 -0800 Subject: [PATCH 74/98] CR feedback --- libraries/render-utils/src/GeometryCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 89be78e74f..351ee19930 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -57,7 +57,7 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm Vec2Pair radiusKey(glm::vec2(radius, slices), glm::vec2(stacks, 0)); IntPair slicesStacksKey(slices, stacks); - Vec3Pair colorKey(glm::vec3(color.x, color.y, slices),glm::vec3(color.z, color.y, stacks)); + Vec3Pair colorKey(glm::vec3(color.x, color.y, slices), glm::vec3(color.z, color.y, stacks)); int vertices = slices * (stacks - 1) + 2; int indices = slices * (stacks - 1) * NUM_VERTICES_PER_TRIANGULATED_QUAD; @@ -1478,6 +1478,7 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en int GeometryCache::BatchItemDetails::population = 0; + GeometryCache::BatchItemDetails::BatchItemDetails() : verticesBuffer(NULL), colorBuffer(NULL), From 66567fd89d20069e9d0670528251435f850ef209 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 29 Jan 2015 17:24:56 -0800 Subject: [PATCH 75/98] CR feedback --- libraries/render-utils/src/GeometryCache.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 351ee19930..c32b8ff757 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -344,7 +344,7 @@ void GeometryCache::renderCone(float base, float height, int slices, int stacks) void GeometryCache::renderGrid(int xDivisions, int yDivisions, const glm::vec4& color) { IntPair key(xDivisions, yDivisions); - Vec3Pair colorKey(glm::vec3(color.x, color.y, yDivisions),glm::vec3(color.z, color.y, xDivisions)); + Vec3Pair colorKey(glm::vec3(color.x, color.y, yDivisions), glm::vec3(color.z, color.y, xDivisions)); int vertices = (xDivisions + 1 + yDivisions + 1) * 2; if (!_gridBuffers.contains(key)) { @@ -441,7 +441,7 @@ void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, in bool registered = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, width), glm::vec3(height, rows, cols)); - Vec3Pair colorKey(glm::vec3(color.x, color.y, rows),glm::vec3(color.z, color.y, cols)); + Vec3Pair colorKey(glm::vec3(color.x, color.y, rows), glm::vec3(color.z, color.y, cols)); int vertices = (cols + 1 + rows + 1) * 2; if ((registered && !_registeredAlternateGridBuffers.contains(id)) || (!registered && !_alternateGridBuffers.contains(key))) { @@ -680,7 +680,7 @@ void GeometryCache::renderVertices(gpu::Primitive primitiveType, int id) { } void GeometryCache::renderSolidCube(float size, const glm::vec4& color) { - Vec2Pair colorKey(glm::vec2(color.x, color.y),glm::vec2(color.z, color.y)); + Vec2Pair colorKey(glm::vec2(color.x, color.y), glm::vec2(color.z, color.y)); const int FLOATS_PER_VERTEX = 3; const int VERTICES_PER_FACE = 4; const int NUMBER_OF_FACES = 6; From f26ad6c95c610d3990eab0d0f0146adebb17a902 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Fri, 30 Jan 2015 02:52:24 +0100 Subject: [PATCH 76/98] ignore multiple build directories ignore /build-test/, /build-vs2013/, /build-osx/, /build-ubuntu/ , /build-cygwin/ --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8365108df9..34f11c273a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ CMakeCache.txt CMakeFiles/ CMakeScripts/ cmake_install.cmake -build/ +build*/ Makefile *.user From 5d8825f5eb65597e7339965d2079aeb08e1e3a2a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Jan 2015 08:56:37 -0800 Subject: [PATCH 77/98] Remove call to gridTool.mousePressEvent --- examples/editEntities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index 1b551ab2e9..2d0fb3dc8a 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -512,7 +512,7 @@ function mousePressEvent(event) { mouseHasMovedSincePress = false; mouseCapturedByTool = false; - if (toolBar.mousePressEvent(event) || progressDialog.mousePressEvent(event) || gridTool.mousePressEvent(event)) { + if (toolBar.mousePressEvent(event) || progressDialog.mousePressEvent(event)) { mouseCapturedByTool = true; return; } From cddce8f7956951e1763a4bb8ac101b08f0668bb6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Jan 2015 09:21:27 -0800 Subject: [PATCH 78/98] Update editEntities to always be on + use right click for select --- examples/editEntities.js | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index e2c7a6d435..4605e040fd 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -56,6 +56,11 @@ selectionManager.addEventListener(function() { entityListTool.setVisible(true); hasShownPropertiesTool = true; } + if (!selectionManager.hasSelection()) { + toolBar.setActive(false); + } else { + toolBar.setActive(true); + } }); var windowDimensions = Controller.getViewportDimensions(); @@ -123,11 +128,13 @@ var toolBar = (function () { function initialize() { toolBar = new ToolBar(0, 0, ToolBar.VERTICAL); + // Hide active button for now - this may come back, so not deleting yet. activeButton = toolBar.addTool({ imageURL: toolIconUrl + "models-tool.svg", - subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, - width: toolWidth, - height: toolHeight, + // subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, + subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: 0, height: 0 }, + width: 0,//toolWidth, + height: 0,//toolHeight, alpha: 0.9, visible: true }, true, false); @@ -543,19 +550,16 @@ function mouseMoveEvent(event) { } mouseHasMovedSincePress = true; - if (isActive) { - // allow the selectionDisplay and cameraManager to handle the event first, if it doesn't handle it, then do our own thing - if (selectionDisplay.mouseMoveEvent(event) || cameraManager.mouseMoveEvent(event)) { - return; - } - lastMousePosition = { x: event.x, y: event.y }; - - highlightEntityUnderCursor(lastMousePosition, false); - idleMouseTimerId = Script.setTimeout(handleIdleMouse, IDLE_MOUSE_TIMEOUT); - } else { - cameraManager.mouseMoveEvent(event); + // allow the selectionDisplay and cameraManager to handle the event first, if it doesn't handle it, then do our own thing + if (selectionDisplay.mouseMoveEvent(event) || cameraManager.mouseMoveEvent(event)) { + return; } + + lastMousePosition = { x: event.x, y: event.y }; + + highlightEntityUnderCursor(lastMousePosition, false); + idleMouseTimerId = Script.setTimeout(handleIdleMouse, IDLE_MOUSE_TIMEOUT); } function handleIdleMouse() { @@ -608,7 +612,7 @@ function mouseReleaseEvent(event) { } function mouseClickEvent(event) { - if (!isActive) { + if (!event.isRightButton) { return; } @@ -619,6 +623,7 @@ function mouseClickEvent(event) { } return; } + toolBar.setActive(true); var pickRay = result.pickRay; var foundEntity = result.entityID; @@ -830,6 +835,8 @@ Controller.keyReleaseEvent.connect(function (event) { // since sometimes our menu shortcut keys don't work, trap our menu items here also and fire the appropriate menu items if (event.text == "BACKSPACE" || event.text == "DELETE") { deleteSelectedEntities(); + } else if (event.text == "ESC") { + selectionManager.clearSelections(); } else if (event.text == "TAB") { selectionDisplay.toggleSpaceMode(); } else if (event.text == "f") { @@ -1082,4 +1089,4 @@ PropertiesTool = function(opts) { }; propertiesTool = PropertiesTool(); - +toolBar.setActive(true); From 018a4af9d613fe023b6f98014a346e890df5c398 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Jan 2015 09:22:39 -0800 Subject: [PATCH 79/98] Update camera tool to wrap cursor to window bounds rather than keep at center --- examples/libraries/entityCameraTool.js | 41 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/examples/libraries/entityCameraTool.js b/examples/libraries/entityCameraTool.js index f5095bb149..9f53d585d2 100644 --- a/examples/libraries/entityCameraTool.js +++ b/examples/libraries/entityCameraTool.js @@ -208,6 +208,11 @@ CameraManager = function() { if (that.enabled && that.mode != MODE_INACTIVE) { var x = Window.getCursorPositionX(); var y = Window.getCursorPositionY(); + if (!hasDragged) { + that.lastMousePosition.x = x; + that.lastMousePosition.y = y; + hasDragged = true; + } if (that.mode == MODE_ORBIT) { var diffX = x - that.lastMousePosition.x; var diffY = y - that.lastMousePosition.y; @@ -235,9 +240,31 @@ CameraManager = function() { that.moveFocalPoint(dPosition); } - var newX = Window.x + Window.innerWidth / 2; - var newY = Window.y + Window.innerHeight / 2; - Window.setCursorPosition(newX, newY); + + var newX = x; + var newY = y; + var updatePosition = false; + + if (x <= Window.x) { + newX = Window.x + Window.innerWidth; + updatePosition = true; + } else if (x >= (Window.x + Window.innerWidth)) { + newX = Window.x; + updatePosition = true; + } + + if (y <= Window.y) { + newY = Window.y + Window.innerHeight; + updatePosition = true; + } else if (y >= (Window.y + Window.innerHeight)) { + newY = Window.y; + updatePosition = true; + } + + if (updatePosition) { + Window.setCursorPosition(newX, newY); + } + that.lastMousePosition.x = newX; that.lastMousePosition.y = newY; @@ -246,6 +273,7 @@ CameraManager = function() { return false; } + var hasDragged = false; that.mousePressEvent = function(event) { if (cameraTool.mousePressEvent(event)) { return true; @@ -260,12 +288,7 @@ CameraManager = function() { } if (that.mode != MODE_INACTIVE) { - var newX = Window.x + Window.innerWidth / 2; - var newY = Window.y + Window.innerHeight / 2; - Window.setCursorPosition(newX, newY); - that.lastMousePosition.x = newX; - that.lastMousePosition.y = newY; - Window.setCursorVisible(false); + hasDragged = false; return true; } From 0d1488e44f90bf42235345cffbf493356df51f07 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Jan 2015 10:03:37 -0800 Subject: [PATCH 80/98] Fix editEntities.js includes --- examples/editEntities.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index df8605f9df..92223827b9 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -14,23 +14,23 @@ HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; Script.include([ - "http://public.highfidelity.io/scripts/libraries/stringHelpers.js", - "http://public.highfidelity.io/scripts/libraries/dataviewHelpers.js", - "http://public.highfidelity.io/scripts/libraries/httpMultiPart.js", - "http://public.highfidelity.io/scripts/libraries/modelUploader.js", - "http://public.highfidelity.io/scripts/libraries/toolBars.js", - "http://public.highfidelity.io/scripts/libraries/progressDialog.js", + "libraries/stringHelpers.js", + "libraries/dataviewHelpers.js", + "libraries/httpMultiPart.js", + "libraries/modelUploader.js", + "libraries/toolBars.js", + "libraries/progressDialog.js", - "http://public.highfidelity.io/scripts/libraries/entitySelectionTool.js", - "http://public.highfidelity.io/scripts/libraries/ModelImporter.js", + "libraries/entitySelectionTool.js", + "libraries/ModelImporter.js", - "http://public.highfidelity.io/scripts/libraries/ExportMenu.js", - "http://public.highfidelity.io/scripts/libraries/ToolTip.js", + "libraries/ExportMenu.js", + "libraries/ToolTip.js", - "http://public.highfidelity.io/scripts/libraries/entityPropertyDialogBox.js", - "http://public.highfidelity.io/scripts/libraries/entityCameraTool.js", - "http://public.highfidelity.io/scripts/libraries/gridTool.js", - "http://public.highfidelity.io/scripts/libraries/entityList.js", + "libraries/entityPropertyDialogBox.js", + "libraries/entityCameraTool.js", + "libraries/gridTool.js", + "libraries/entityList.js", ]); var selectionDisplay = SelectionDisplay; From f0edba9a6b58ddc851ab7ca71fb3ce55658afc10 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 30 Jan 2015 11:11:17 -0800 Subject: [PATCH 81/98] Start on refactoring of bandwidth metrics --- interface/src/Application.cpp | 29 +-- interface/src/Application.h | 8 +- interface/src/Audio.cpp | 10 +- interface/src/DatagramProcessor.cpp | 2 +- interface/src/Menu.cpp | 1 - interface/src/Menu.h | 1 - interface/src/MetavoxelSystem.cpp | 4 +- interface/src/ui/ApplicationOverlay.cpp | 9 +- interface/src/ui/BandwidthDialog.cpp | 90 +++++---- interface/src/ui/BandwidthDialog.h | 30 ++- interface/src/ui/BandwidthMeter.cpp | 243 ------------------------ interface/src/ui/BandwidthMeter.h | 87 --------- interface/src/ui/DialogsManager.cpp | 2 +- interface/src/ui/Stats.cpp | 14 +- interface/src/ui/Stats.h | 1 + 15 files changed, 110 insertions(+), 421 deletions(-) delete mode 100644 interface/src/ui/BandwidthMeter.cpp delete mode 100644 interface/src/ui/BandwidthMeter.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5a60be39a1..a25de27298 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -774,19 +774,18 @@ void Application::controlledBroadcastToNodes(const QByteArray& packet, const Nod int nReceivingNodes = DependencyManager::get()->broadcastToNodes(packet, NodeSet() << type); // Feed number of bytes to corresponding channel of the bandwidth meter, if any (done otherwise) - BandwidthMeter::ChannelIndex channel; + double bandwidth_amount = nReceivingNodes * packet.size(); switch (type) { case NodeType::Agent: case NodeType::AvatarMixer: - channel = BandwidthMeter::AVATARS; + _bandwidthRecorder.avatarsChannel->output.updateValue(bandwidth_amount); break; case NodeType::EntityServer: - channel = BandwidthMeter::OCTREE; + _bandwidthRecorder.octreeChannel->output.updateValue(bandwidth_amount); break; default: continue; } - _bandwidthMeter.outputStream(channel).updateValue(nReceivingNodes * packet.size()); } } @@ -1261,7 +1260,6 @@ void Application::mouseReleaseEvent(QMouseEvent* event, unsigned int deviceID) { int horizontalOffset = MIRROR_VIEW_WIDTH; Stats::getInstance()->checkClick(getMouseX(), getMouseY(), getMouseDragStartedX(), getMouseDragStartedY(), horizontalOffset); - checkBandwidthMeterClick(); } // fire an action end event @@ -1448,23 +1446,6 @@ void Application::idle() { } } -void Application::checkBandwidthMeterClick() { - // ... to be called upon button release - auto glCanvas = DependencyManager::get(); - if (Menu::getInstance()->isOptionChecked(MenuOption::Bandwidth) && - Menu::getInstance()->isOptionChecked(MenuOption::Stats) && - Menu::getInstance()->isOptionChecked(MenuOption::UserInterface) && - glm::compMax(glm::abs(glm::ivec2(getMouseX() - getMouseDragStartedX(), - getMouseY() - getMouseDragStartedY()))) - <= BANDWIDTH_METER_CLICK_MAX_DRAG_LENGTH - && _bandwidthMeter.isWithinArea(getMouseX(), getMouseY(), glCanvas->width(), glCanvas->height())) { - - // The bandwidth meter is visible, the click didn't get dragged too far and - // we actually hit the bandwidth meter - DependencyManager::get()->bandwidthDetails(); - } -} - void Application::setFullscreen(bool fullscreen) { if (Menu::getInstance()->isOptionChecked(MenuOption::Fullscreen) != fullscreen) { Menu::getInstance()->getActionForOption(MenuOption::Fullscreen)->setChecked(fullscreen); @@ -2398,7 +2379,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node nodeList->writeUnverifiedDatagram(reinterpret_cast(queryPacket), packetLength, node); // Feed number of bytes to corresponding channel of the bandwidth meter - _bandwidthMeter.outputStream(BandwidthMeter::OCTREE).updateValue(packetLength); + _bandwidthRecorder.octreeChannel->output.updateValue(packetLength); } }); } @@ -3387,7 +3368,7 @@ int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePoin } void Application::packetSent(quint64 length) { - _bandwidthMeter.outputStream(BandwidthMeter::OCTREE).updateValue(length); + _bandwidthRecorder.octreeChannel->output.updateValue(length); } const QString SETTINGS_KEY = "Settings"; diff --git a/interface/src/Application.h b/interface/src/Application.h index 21f56a2c7b..9f2fac94db 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -55,7 +55,6 @@ #include "devices/SixenseManager.h" #include "scripting/ControllerScriptingInterface.h" #include "ui/BandwidthDialog.h" -#include "ui/BandwidthMeter.h" #include "ui/HMDToolsDialog.h" #include "ui/ModelsBrowser.h" #include "ui/NodeBounds.h" @@ -183,6 +182,7 @@ public: QUndoStack* getUndoStack() { return &_undoStack; } MainWindow* getWindow() { return _window; } OctreeQuery& getOctreeQuery() { return _octreeQuery; } + BandwidthRecorder* getBandwidthRecorder() { return &_bandwidthRecorder; } EntityTree* getEntityClipboard() { return &_entityClipboard; } EntityTreeRenderer* getEntityClipboardRenderer() { return &_entityClipboardRenderer; } @@ -204,7 +204,6 @@ public: bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } FaceTracker* getActiveFaceTracker(); - BandwidthMeter* getBandwidthMeter() { return &_bandwidthMeter; } QSystemTrayIcon* getTrayIcon() { return _trayIcon; } ApplicationOverlay& getApplicationOverlay() { return _applicationOverlay; } Overlays& getOverlays() { return _overlays; } @@ -435,7 +434,6 @@ private: void updateShadowMap(); void renderRearViewMirror(const QRect& region, bool billboard = false); - void checkBandwidthMeterClick(); void setMenuShortcutsEnabled(bool enabled); static void attachNewHeadToNode(Node *newNode); @@ -448,7 +446,6 @@ private: ToolWindow* _toolWindow; - BandwidthMeter _bandwidthMeter; QThread* _nodeThread; DatagramProcessor _datagramProcessor; @@ -486,6 +483,9 @@ private: OctreeQuery _octreeQuery; // NodeData derived class for querying octee cells from octree servers + BandwidthRecorder _bandwidthRecorder; + + AvatarManager _avatarManager; MyAvatar* _myAvatar; // TODO: move this and relevant code to AvatarManager (or MyAvatar as the case may be) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 97ff2f5dd1..77b06f14fb 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -769,8 +769,9 @@ void Audio::handleAudioInput() { nodeList->writeDatagram(audioDataPacket, packetBytes, audioMixer); _outgoingAvatarAudioSequenceNumber++; - Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::AUDIO) - .updateValue(packetBytes); + // Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::AUDIO).updateValue(packetBytes); + Application::getInstance()-> + getBandwidthRecorder()->audioChannel->output.updateValue(packetBytes); } delete[] inputAudioSamples; } @@ -829,7 +830,10 @@ void Audio::addReceivedAudioToStream(const QByteArray& audioByteArray) { _receivedAudioStream.parseData(audioByteArray); } - Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::AUDIO).updateValue(audioByteArray.size()); + // Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::AUDIO).updateValue(audioByteArray.size()); + Application::getInstance()-> + getBandwidthRecorder()->audioChannel->input.updateValue(audioByteArray.size()); + } void Audio::parseAudioEnvironmentData(const QByteArray &packet) { diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index aacd053a8c..aa8d9db298 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -117,7 +117,7 @@ void DatagramProcessor::processDatagrams() { Q_ARG(const QWeakPointer&, avatarMixer)); } - application->_bandwidthMeter.inputStream(BandwidthMeter::AVATARS).updateValue(incomingPacket.size()); + application->_bandwidthRecorder.avatarsChannel->input.updateValue(incomingPacket.size()); break; } case PacketTypeDomainConnectionDenied: { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 5ca78c85f2..46652a4421 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -282,7 +282,6 @@ Menu::Menu() { addDisabledActionAndSeparator(viewMenu, "Stats"); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats, Qt::Key_Percent); addActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::Key_L, qApp, SLOT(toggleLogDialog())); - addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Bandwidth, 0, true); addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0, dialogsManager.data(), SLOT(bandwidthDetails())); addActionToQMenuAndActionHash(viewMenu, MenuOption::OctreeStats, 0, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index a824afc27a..02b58b519c 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -120,7 +120,6 @@ namespace MenuOption { const QString AudioSourcePinkNoise = "Pink Noise"; const QString AudioSourceSine440 = "Sine 440hz"; const QString Avatars = "Avatars"; - const QString Bandwidth = "Bandwidth Display"; const QString BandwidthDetails = "Bandwidth Details"; const QString BlueSpeechSphere = "Blue Sphere While Speaking"; const QString BookmarkLocation = "Bookmark Location"; diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 80c7c3f41f..5140f5cd1c 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -899,7 +899,7 @@ int MetavoxelSystemClient::parseData(const QByteArray& packet) { } else { QMetaObject::invokeMethod(&_sequencer, "receivedDatagram", Q_ARG(const QByteArray&, packet)); } - Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::METAVOXELS).updateValue(packet.size()); + Application::getInstance()->getBandwidthRecorder()->metavoxelsChannel->input.updateValue (packet.size()); } return packet.size(); } @@ -1015,7 +1015,7 @@ void MetavoxelSystemClient::sendDatagram(const QByteArray& data) { } else { DependencyManager::get()->writeDatagram(data, _node); } - Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::METAVOXELS).updateValue(data.size()); + Application::getInstance()->getBandwidthRecorder()->metavoxelsChannel->output.updateValue (data.size()); } } diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 7031db4498..6eb61afd83 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -909,7 +909,6 @@ void ApplicationOverlay::renderStatsAndLogs() { auto glCanvas = DependencyManager::get(); const OctreePacketProcessor& octreePacketProcessor = application->getOctreePacketProcessor(); - BandwidthMeter* bandwidthMeter = application->getBandwidthMeter(); NodeBounds& nodeBoundsDisplay = application->getNodeBoundsDisplay(); // Display stats and log text onscreen @@ -923,11 +922,6 @@ void ApplicationOverlay::renderStatsAndLogs() { // Onscreen text about position, servers, etc Stats::getInstance()->display(WHITE_TEXT, horizontalOffset, application->getFps(), application->getPacketsPerSecond(), application->getBytesPerSecond(), voxelPacketsToProcess); - // Bandwidth meter - if (Menu::getInstance()->isOptionChecked(MenuOption::Bandwidth)) { - Stats::drawBackground(0x33333399, glCanvas->width() - 296, glCanvas->height() - 68, 296, 68); - bandwidthMeter->render(glCanvas->width(), glCanvas->height()); - } } // Show on-screen msec timer @@ -936,8 +930,7 @@ void ApplicationOverlay::renderStatsAndLogs() { quint64 mSecsNow = floor(usecTimestampNow() / 1000.0 + 0.5); sprintf(frameTimer, "%d\n", (int)(mSecsNow % 1000)); int timerBottom = - (Menu::getInstance()->isOptionChecked(MenuOption::Stats) && - Menu::getInstance()->isOptionChecked(MenuOption::Bandwidth)) + (Menu::getInstance()->isOptionChecked(MenuOption::Stats)) ? 80 : 20; drawText(glCanvas->width() - 100, glCanvas->height() - timerBottom, 0.30f, 0.0f, 0, frameTimer, WHITE_TEXT); diff --git a/interface/src/ui/BandwidthDialog.cpp b/interface/src/ui/BandwidthDialog.cpp index 3e6d9d876b..b6dde5873e 100644 --- a/interface/src/ui/BandwidthDialog.cpp +++ b/interface/src/ui/BandwidthDialog.cpp @@ -11,6 +11,7 @@ #include +#include "BandwidthRecorder.h" #include "ui/BandwidthDialog.h" #include @@ -19,56 +20,75 @@ #include #include -BandwidthDialog::BandwidthDialog(QWidget* parent, BandwidthMeter* model) : + +BandwidthDialog::ChannelDisplay::ChannelDisplay(BandwidthRecorder::Channel *ch, QFormLayout* form) { + this->ch = ch; + this->input_label = setupLabel(form, "input"); + this->output_label = setupLabel(form, "output"); +} + + +QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form, std::string i_or_o) { + QLabel* label = new QLabel(); + char strBuf[64]; + + label->setAlignment(Qt::AlignRight); + + QPalette palette = label->palette(); + unsigned rgb = ch->colorRGBA >> 8; + rgb = ((rgb & 0xfefefeu) >> 1) + ((rgb & 0xf8f8f8) >> 3); + palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); + + label->setPalette(palette); + + snprintf(strBuf, sizeof(strBuf), " %s %s Bandwidth:", i_or_o.c_str(), ch->caption); + form->addRow(strBuf, label); + + return label; +} + + + +void BandwidthDialog::ChannelDisplay::setLabelText() { + char strBuf[64]; + snprintf(strBuf, sizeof(strBuf), "%0.0f %s", ch->input.getValue() * ch->unitScale, ch->unitCaption); + input_label->setText(strBuf); + snprintf(strBuf, sizeof(strBuf), "%0.0f %s", ch->output.getValue() * ch->unitScale, ch->unitCaption); + output_label->setText(strBuf); +} + + + +BandwidthDialog::BandwidthDialog(QWidget* parent, BandwidthRecorder* model) : QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint), _model(model) { - char strBuf[64]; - this->setWindowTitle("Bandwidth Details"); // Create layouter QFormLayout* form = new QFormLayout(); this->QDialog::setLayout(form); - // Setup labels - for (size_t i = 0; i < BandwidthMeter::N_STREAMS; ++i) { - bool input = i % 2 == 0; - BandwidthMeter::ChannelInfo& ch = _model->channelInfo(BandwidthMeter::ChannelIndex(i / 2)); - QLabel* label = _labels[i] = new QLabel(); - label->setAlignment(Qt::AlignRight); - - // Set foreground color to 62.5% brightness of the meter (otherwise will be hard to read on the bright background) - QPalette palette = label->palette(); - unsigned rgb = ch.colorRGBA >> 8; - rgb = ((rgb & 0xfefefeu) >> 1) + ((rgb & 0xf8f8f8) >> 3); - palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); - label->setPalette(palette); - - snprintf(strBuf, sizeof(strBuf), " %s %s Bandwidth:", input ? "Input" : "Output", ch.caption); - form->addRow(strBuf, label); - } + audioChannelDisplay = new ChannelDisplay(_model->audioChannel, form); + avatarsChannelDisplay = new ChannelDisplay(_model->avatarsChannel, form); + octreeChannelDisplay = new ChannelDisplay(_model->octreeChannel, form); + metavoxelsChannelDisplay = new ChannelDisplay(_model->metavoxelsChannel, form); } + BandwidthDialog::~BandwidthDialog() { - for (size_t i = 0; i < BandwidthMeter::N_STREAMS; ++i) { - delete _labels[i]; - } + delete audioChannelDisplay; + delete avatarsChannelDisplay; + delete octreeChannelDisplay; + delete metavoxelsChannelDisplay; } -void BandwidthDialog::paintEvent(QPaintEvent* event) { - // Update labels - char strBuf[64]; - for (size_t i = 0; i < BandwidthMeter::N_STREAMS; ++i) { - BandwidthMeter::ChannelIndex chIdx = BandwidthMeter::ChannelIndex(i / 2); - bool input = i % 2 == 0; - BandwidthMeter::ChannelInfo& ch = _model->channelInfo(chIdx); - BandwidthMeter::Stream& s = input ? _model->inputStream(chIdx) : _model->outputStream(chIdx); - QLabel* label = _labels[i]; - snprintf(strBuf, sizeof(strBuf), "%0.2f %s", s.getValue() * ch.unitScale, ch.unitCaption); - label->setText(strBuf); - } +void BandwidthDialog::paintEvent(QPaintEvent* event) { + audioChannelDisplay->setLabelText(); + avatarsChannelDisplay->setLabelText(); + octreeChannelDisplay->setLabelText(); + metavoxelsChannelDisplay->setLabelText(); this->QDialog::paintEvent(event); this->setFixedSize(this->width(), this->height()); diff --git a/interface/src/ui/BandwidthDialog.h b/interface/src/ui/BandwidthDialog.h index c1e9c5b82e..bf08b39097 100644 --- a/interface/src/ui/BandwidthDialog.h +++ b/interface/src/ui/BandwidthDialog.h @@ -14,17 +14,36 @@ #include #include +#include -#include "BandwidthMeter.h" +#include "BandwidthRecorder.h" class BandwidthDialog : public QDialog { Q_OBJECT public: - // Sets up the UI based on the configuration of the BandwidthMeter - BandwidthDialog(QWidget* parent, BandwidthMeter* model); + // Sets up the UI based on the configuration of the BandwidthRecorder + BandwidthDialog(QWidget* parent, BandwidthRecorder* model); ~BandwidthDialog(); + class ChannelDisplay { + public: + ChannelDisplay(BandwidthRecorder::Channel *ch, QFormLayout* form); + QLabel* setupLabel(QFormLayout* form, std::string i_or_o); + void setLabelText(); + + private: + BandwidthRecorder::Channel *ch; + + QLabel* input_label; + QLabel* output_label; + }; + + ChannelDisplay* audioChannelDisplay; + ChannelDisplay* avatarsChannelDisplay; + ChannelDisplay* octreeChannelDisplay; + ChannelDisplay* metavoxelsChannelDisplay; + signals: void closed(); @@ -34,16 +53,13 @@ public slots: void reject(); protected: - - // State <- data model held by BandwidthMeter void paintEvent(QPaintEvent*); // Emits a 'closed' signal when this dialog is closed. void closeEvent(QCloseEvent*); private: - BandwidthMeter* _model; - QLabel* _labels[BandwidthMeter::N_STREAMS]; + BandwidthRecorder* _model; }; #endif // hifi_BandwidthDialog_h diff --git a/interface/src/ui/BandwidthMeter.cpp b/interface/src/ui/BandwidthMeter.cpp deleted file mode 100644 index 69cd20d9a2..0000000000 --- a/interface/src/ui/BandwidthMeter.cpp +++ /dev/null @@ -1,243 +0,0 @@ -// -// BandwidthMeter.cpp -// interface/src/ui -// -// Created by Tobias Schwinger on 6/20/13. -// Copyright 2013 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 - -#include -#include - -#include "BandwidthMeter.h" -#include "InterfaceConfig.h" - -#include "Util.h" - -namespace { // .cpp-local - - int const AREA_WIDTH = -280; // Width of the area used. Aligned to the right when negative. - int const AREA_HEIGHT = -40; // Height of the area used. Aligned to the bottom when negative. - int const BORDER_DISTANCE_HORIZ = -10; // Distance to edge of screen (use negative value when width is negative). - int const BORDER_DISTANCE_VERT = -15; // Distance to edge of screen (use negative value when height is negative). - - int SPACING_VERT_BARS = 2; // Vertical distance between input and output bar - int SPACING_RIGHT_CAPTION_IN_OUT = 4; // IN/OUT <--> |######## : | - int SPACING_LEFT_CAPTION_UNIT = 4; // |######## : | <--> UNIT - int PADDING_HORIZ_VALUE = 2; // |<-->X.XX<:-># | - - unsigned const COLOR_TEXT = 0xedededff; // ^ ^ ^ ^ ^ ^ - unsigned const COLOR_FRAME = 0xe0e0e0b0; // | | | - unsigned const COLOR_INDICATOR = 0xc0c0c0b0; // | - - char const* CAPTION_IN = "In"; - char const* CAPTION_OUT = "Out"; - char const* CAPTION_UNIT = "Mbps"; - - double const UNIT_SCALE = 8000.0 / (1024.0 * 1024.0); // Bytes/ms -> Mbps - int const INITIAL_SCALE_MAXIMUM_INDEX = 250; // / 9: exponent, % 9: mantissa - 2, 0 o--o 2 * 10^-10 - int const MIN_METER_SCALE = 10; // 10Mbps - int const NUMBER_OF_MARKERS = 10; -} - -BandwidthMeter::ChannelInfo BandwidthMeter::_CHANNELS[] = { - { "Audio" , "Kbps", 8000.0 / 1024.0, 0x33cc99ff }, - { "Avatars" , "Kbps", 8000.0 / 1024.0, 0xffef40c0 }, - { "Octree" , "Kbps", 8000.0 / 1024.0, 0xd0d0d0a0 }, - { "Metavoxels", "Kbps", 8000.0 / 1024.0, 0xd0d0d0a0 } -}; - -BandwidthMeter::BandwidthMeter() : - _textRenderer(TextRenderer::getInstance(INCONSOLATA_FONT_FAMILY, -1, INCONSOLATA_FONT_WEIGHT, false)), - _scaleMaxIndex(INITIAL_SCALE_MAXIMUM_INDEX) { - - _channels = static_cast( malloc(sizeof(_CHANNELS)) ); - memcpy(_channels, _CHANNELS, sizeof(_CHANNELS)); -} - -BandwidthMeter::~BandwidthMeter() { - - free(_channels); -} - -BandwidthMeter::Stream::Stream(float msToAverage) : _value(0.0f), _msToAverage(msToAverage) { - _prevTime.start(); -} - -void BandwidthMeter::Stream::updateValue(double amount) { - - // Determine elapsed time - double dt = (double)_prevTime.nsecsElapsed() / 1000000.0; // ns to ms - - // Ignore this value when timer imprecision yields dt = 0 - if (dt == 0.0) { - return; - } - - _prevTime.start(); - - // Compute approximate average - _value = glm::mix(_value, amount / dt, - glm::clamp(dt / _msToAverage, 0.0, 1.0)); -} - -void BandwidthMeter::setColorRGBA(unsigned c) { - - glColor4ub(GLubyte( c >> 24), - GLubyte((c >> 16) & 0xff), - GLubyte((c >> 8) & 0xff), - GLubyte( c & 0xff)); -} - -void BandwidthMeter::renderBox(int x, int y, int w, int h) { - DependencyManager::get()->renderQuad(x, y, w, h); -} - -void BandwidthMeter::renderVerticalLine(int x, int y, int h) { - DependencyManager::get()->renderLine(glm::vec2(x, y), glm::vec2(x, y + h)); -} - -inline int BandwidthMeter::centered(int subject, int object) { - return (object - subject) / 2; -} - -bool BandwidthMeter::isWithinArea(int x, int y, int screenWidth, int screenHeight) { - - int minX = BORDER_DISTANCE_HORIZ + (AREA_WIDTH >= 0 ? 0 : screenWidth + AREA_WIDTH); - int minY = BORDER_DISTANCE_VERT + (AREA_HEIGHT >= 0 ? 0 : screenHeight + AREA_HEIGHT); - - return x >= minX && x < minX + glm::abs(AREA_WIDTH) && - y >= minY && y < minY + glm::abs(AREA_HEIGHT); -} - -void BandwidthMeter::render(int screenWidth, int screenHeight) { - - int x = BORDER_DISTANCE_HORIZ + (AREA_WIDTH >= 0 ? 0 : screenWidth + AREA_WIDTH); - int y = BORDER_DISTANCE_VERT + (AREA_HEIGHT >= 0 ? 0 : screenHeight + AREA_HEIGHT); - int w = glm::abs(AREA_WIDTH), h = glm::abs(AREA_HEIGHT); - - // Determine total - float totalIn = 0.0f, totalOut = 0.0f; - for (size_t i = 0; i < N_CHANNELS; ++i) { - - totalIn += inputStream(ChannelIndex(i)).getValue(); - totalOut += outputStream(ChannelIndex(i)).getValue(); - } - totalIn *= UNIT_SCALE; - totalOut *= UNIT_SCALE; - float totalMax = glm::max(totalIn, totalOut); - - // Get font / caption metrics - QFontMetrics const& fontMetrics = _textRenderer->metrics(); - int fontDescent = fontMetrics.descent(); - int labelWidthIn = fontMetrics.width(CAPTION_IN); - int labelWidthOut = fontMetrics.width(CAPTION_OUT); - int labelWidthInOut = glm::max(labelWidthIn, labelWidthOut); - int labelHeight = fontMetrics.ascent() + fontDescent; - int labelWidthUnit = fontMetrics.width(CAPTION_UNIT); - int labelsWidth = labelWidthInOut + SPACING_RIGHT_CAPTION_IN_OUT + SPACING_LEFT_CAPTION_UNIT + labelWidthUnit; - - // Calculate coordinates and dimensions - int barX = x + labelWidthInOut + SPACING_RIGHT_CAPTION_IN_OUT; - int barWidth = w - labelsWidth; - int barHeight = (h - SPACING_VERT_BARS) / 2; - int textYcenteredLine = h - centered(labelHeight, h) - fontDescent; - int textYupperLine = barHeight - centered(labelHeight, barHeight) - fontDescent; - int textYlowerLine = h - centered(labelHeight, barHeight) - fontDescent; - - // Center of coordinate system -> upper left of bar - glPushMatrix(); - glTranslatef((float)barX, (float)y, 0.0f); - - // Render captions - setColorRGBA(COLOR_TEXT); - _textRenderer->draw(barWidth + SPACING_LEFT_CAPTION_UNIT, textYcenteredLine, CAPTION_UNIT); - _textRenderer->draw(-labelWidthIn - SPACING_RIGHT_CAPTION_IN_OUT, textYupperLine, CAPTION_IN); - _textRenderer->draw(-labelWidthOut - SPACING_RIGHT_CAPTION_IN_OUT, textYlowerLine, CAPTION_OUT); - - // Render vertical lines for the frame - setColorRGBA(COLOR_FRAME); - renderVerticalLine(0, 0, h); - renderVerticalLine(barWidth, 0, h); - - // Adjust scale - int steps; - double step, scaleMax; - bool commit = false; - do { - steps = (_scaleMaxIndex % 9) + 2; - step = pow(10.0, (_scaleMaxIndex / 9) - 10); - scaleMax = step * steps; - if (commit) { -// printLog("Bandwidth meter scale: %d\n", _scaleMaxIndex); - break; - } - if (totalMax < scaleMax * 0.5) { - _scaleMaxIndex = glm::max(0, _scaleMaxIndex - 1); - commit = true; - } else if (totalMax > scaleMax) { - _scaleMaxIndex += 1; - commit = true; - } - } while (commit); - - step = scaleMax / NUMBER_OF_MARKERS; - if (scaleMax < MIN_METER_SCALE) { - scaleMax = MIN_METER_SCALE; - } - - // Render scale indicators - setColorRGBA(COLOR_INDICATOR); - for (int j = NUMBER_OF_MARKERS; --j > 0;) { - renderVerticalLine((barWidth * j) / NUMBER_OF_MARKERS, 0, h); - } - - // Render bars - int xIn = 0, xOut = 0; - for (size_t i = 0; i < N_CHANNELS; ++i) { - - ChannelIndex chIdx = ChannelIndex(i); - int wIn = (int)(barWidth * inputStream(chIdx).getValue() * UNIT_SCALE / scaleMax); - int wOut = (int)(barWidth * outputStream(chIdx).getValue() * UNIT_SCALE / scaleMax); - - setColorRGBA(channelInfo(chIdx).colorRGBA); - - if (wIn > 0) { - renderBox(xIn, 0, wIn, barHeight); - } - xIn += wIn; - - if (wOut > 0) { - renderBox(xOut, h - barHeight, wOut, barHeight); - } - xOut += wOut; - } - - // Render numbers - char fmtBuf[8]; - setColorRGBA(COLOR_TEXT); - sprintf(fmtBuf, "%0.1f", totalIn); - _textRenderer->draw(glm::max(xIn - fontMetrics.width(fmtBuf) - PADDING_HORIZ_VALUE, - PADDING_HORIZ_VALUE), - textYupperLine, fmtBuf); - sprintf(fmtBuf, "%0.1f", totalOut); - _textRenderer->draw(glm::max(xOut - fontMetrics.width(fmtBuf) - PADDING_HORIZ_VALUE, - PADDING_HORIZ_VALUE), - textYlowerLine, fmtBuf); - - glPopMatrix(); - - // After rendering, indicate that no data has been sent/received since the last feed. - // This way, the meters fall when not continuously fed. - for (size_t i = 0; i < N_CHANNELS; ++i) { - inputStream(ChannelIndex(i)).updateValue(0); - outputStream(ChannelIndex(i)).updateValue(0); - } -} - - diff --git a/interface/src/ui/BandwidthMeter.h b/interface/src/ui/BandwidthMeter.h deleted file mode 100644 index 0829cc86e9..0000000000 --- a/interface/src/ui/BandwidthMeter.h +++ /dev/null @@ -1,87 +0,0 @@ -// -// BandwidthMeter.h -// interface/src/ui -// -// Created by Tobias Schwinger on 6/20/13. -// Copyright 2013 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_BandwidthMeter_h -#define hifi_BandwidthMeter_h - -#include - -#include - -#include - - -class BandwidthMeter { - -public: - - BandwidthMeter(); - ~BandwidthMeter(); - - void render(int screenWidth, int screenHeight); - bool isWithinArea(int x, int y, int screenWidth, int screenHeight); - - // Number of channels / streams. - static size_t const N_CHANNELS = 4; - static size_t const N_STREAMS = N_CHANNELS * 2; - - // Channel usage. - enum ChannelIndex { AUDIO, AVATARS, OCTREE, METAVOXELS }; - - // Meta information held for a communication channel (bidirectional). - struct ChannelInfo { - - char const* const caption; - char const* unitCaption; - double unitScale; - unsigned colorRGBA; - }; - - // Representation of a data stream (unidirectional; input or output). - class Stream { - - public: - - Stream(float msToAverage = 3000.0f); - void updateValue(double amount); - double getValue() const { return _value; } - - private: - double _value; // Current value. - double _msToAverage; // Milliseconds to average. - QElapsedTimer _prevTime; // Time of last feed. - }; - - // Data model accessors - Stream& inputStream(ChannelIndex i) { return _streams[i * 2]; } - Stream const& inputStream(ChannelIndex i) const { return _streams[i * 2]; } - Stream& outputStream(ChannelIndex i) { return _streams[i * 2 + 1]; } - Stream const& outputStream(ChannelIndex i) const { return _streams[i * 2 + 1]; } - ChannelInfo& channelInfo(ChannelIndex i) { return _channels[i]; } - ChannelInfo const& channelInfo(ChannelIndex i) const { return _channels[i]; } - -private: - static void setColorRGBA(unsigned c); - static void renderBox(int x, int y, int w, int h); - static void renderVerticalLine(int x, int y, int h); - - static inline int centered(int subject, int object); - - - static ChannelInfo _CHANNELS[]; - - TextRenderer* _textRenderer; - ChannelInfo* _channels; - Stream _streams[N_STREAMS]; - int _scaleMaxIndex; -}; - -#endif // hifi_BandwidthMeter_h diff --git a/interface/src/ui/DialogsManager.cpp b/interface/src/ui/DialogsManager.cpp index 7e52e313d0..fa04429bf2 100644 --- a/interface/src/ui/DialogsManager.cpp +++ b/interface/src/ui/DialogsManager.cpp @@ -102,7 +102,7 @@ void DialogsManager::editAnimations() { void DialogsManager::bandwidthDetails() { if (! _bandwidthDialog) { - _bandwidthDialog = new BandwidthDialog(qApp->getWindow(), qApp->getBandwidthMeter()); + _bandwidthDialog = new BandwidthDialog(qApp->getWindow(), qApp->getBandwidthRecorder()); connect(_bandwidthDialog, SIGNAL(closed()), _bandwidthDialog, SLOT(deleteLater())); if (_hmdToolsDialog) { diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 424bd4d50c..961739d158 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -35,6 +35,7 @@ using namespace std; const int STATS_PELS_PER_LINE = 20; const int STATS_GENERAL_MIN_WIDTH = 165; +const int STATS_BANDWIDTH_MIN_WIDTH = 150; const int STATS_PING_MIN_WIDTH = 190; const int STATS_GEO_MIN_WIDTH = 240; const int STATS_OCTREE_MIN_WIDTH = 410; @@ -49,6 +50,7 @@ Stats::Stats(): _recentMaxPackets(0), _resetRecentMaxPacketsSoon(true), _generalStatsWidth(STATS_GENERAL_MIN_WIDTH), + _bandwidthStatsWidth(STATS_BANDWIDTH_MIN_WIDTH), _pingStatsWidth(STATS_PING_MIN_WIDTH), _geoStatsWidth(STATS_GEO_MIN_WIDTH), _octreeStatsWidth(STATS_OCTREE_MIN_WIDTH), @@ -129,6 +131,7 @@ void Stats::resetWidth(int width, int horizontalOffset) { auto glCanvas = DependencyManager::get(); int extraSpace = glCanvas->width() - horizontalOffset -2 - STATS_GENERAL_MIN_WIDTH + - STATS_BANDWIDTH_MIN_WIDTH - (Menu::getInstance()->isOptionChecked(MenuOption::TestPing) ? STATS_PING_MIN_WIDTH -1 : 0) - STATS_GEO_MIN_WIDTH - STATS_OCTREE_MIN_WIDTH; @@ -136,6 +139,7 @@ void Stats::resetWidth(int width, int horizontalOffset) { int panels = 4; _generalStatsWidth = STATS_GENERAL_MIN_WIDTH; + _bandwidthStatsWidth = STATS_BANDWIDTH_MIN_WIDTH; if (Menu::getInstance()->isOptionChecked(MenuOption::TestPing)) { _pingStatsWidth = STATS_PING_MIN_WIDTH; } else { @@ -147,11 +151,13 @@ void Stats::resetWidth(int width, int horizontalOffset) { if (extraSpace > panels) { _generalStatsWidth += (int) extraSpace / panels; + _bandwidthStatsWidth += (int) extraSpace / panels; if (Menu::getInstance()->isOptionChecked(MenuOption::TestPing)) { _pingStatsWidth += (int) extraSpace / panels; } _geoStatsWidth += (int) extraSpace / panels; - _octreeStatsWidth += glCanvas->width() - (_generalStatsWidth + _pingStatsWidth + _geoStatsWidth + 3); + _octreeStatsWidth += glCanvas->width() - + (_generalStatsWidth + _bandwidthStatsWidth + _pingStatsWidth + _geoStatsWidth + 3); } } @@ -228,7 +234,7 @@ void Stats::display( if (_expanded && Menu::getInstance()->isOptionChecked(MenuOption::DisplayTimingDetails)) { - columnOneWidth = _generalStatsWidth + _pingStatsWidth + _geoStatsWidth; // make it 3 columns wide... + columnOneWidth = _generalStatsWidth + _bandwidthStatsWidth + _pingStatsWidth + _geoStatsWidth; // 4 columns wide... // we will also include room for 1 line per timing record and a header of 4 lines lines += 4; @@ -395,7 +401,7 @@ void Stats::display( } verticalOffset = 0; - horizontalOffset = _lastHorizontalOffset + _generalStatsWidth + _pingStatsWidth + 2; + horizontalOffset = _lastHorizontalOffset + _generalStatsWidth + _bandwidthStatsWidth + _pingStatsWidth + 2; } MyAvatar* myAvatar = Application::getInstance()->getAvatar(); @@ -473,7 +479,7 @@ void Stats::display( } verticalOffset = 0; - horizontalOffset = _lastHorizontalOffset + _generalStatsWidth + _pingStatsWidth + _geoStatsWidth + 3; + horizontalOffset = _lastHorizontalOffset + _generalStatsWidth + _bandwidthStatsWidth + _pingStatsWidth + _geoStatsWidth + 3; lines = _expanded ? 14 : 3; diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index d253c303a8..204ddec219 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -44,6 +44,7 @@ private: bool _resetRecentMaxPacketsSoon; int _generalStatsWidth; + int _bandwidthStatsWidth; int _pingStatsWidth; int _geoStatsWidth; int _octreeStatsWidth; From 18c77e1cca522d8858629b209b0af85fbce11e93 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 30 Jan 2015 11:27:45 -0800 Subject: [PATCH 82/98] Fix not saving stopped scripts --- interface/src/Application.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5a60be39a1..a3c67b516b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3407,8 +3407,10 @@ void Application::loadScripts() { } void Application::clearScriptsBeforeRunning() { - // clears all scripts from the settings - SettingHandles::SettingHandle(SETTINGS_KEY).remove(); + // clears all scripts from the settingsSettings settings; + Settings settings; + settings.beginWriteArray(SETTINGS_KEY); + settings.remove(""); } void Application::saveScripts() { @@ -3420,6 +3422,7 @@ void Application::saveScripts() { // Saves all currently running user-loaded scripts Settings settings; settings.beginWriteArray(SETTINGS_KEY); + settings.remove(""); int i = 0; for (auto it = runningScripts.begin(); it != runningScripts.end(); ++it) { if (getScriptEngine(*it)->isUserLoaded()) { From dd9d0542866d201d8441b534e5f0364feb9c6974 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 30 Jan 2015 11:44:57 -0800 Subject: [PATCH 83/98] Start on refactoring of bandwidth metrics --- interface/src/BandwidthRecorder.cpp | 63 +++++++++++++++++++++++++++++ interface/src/BandwidthRecorder.h | 55 +++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 interface/src/BandwidthRecorder.cpp create mode 100644 interface/src/BandwidthRecorder.h diff --git a/interface/src/BandwidthRecorder.cpp b/interface/src/BandwidthRecorder.cpp new file mode 100644 index 0000000000..7264cf5f47 --- /dev/null +++ b/interface/src/BandwidthRecorder.cpp @@ -0,0 +1,63 @@ +// +// BandwidthMeter.cpp +// interface/src/ui +// +// Created by Seth Alves on 2015-1-30 +// Copyright 2015 High Fidelity, Inc. +// +// Based on code by Tobias Schwinger +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include "BandwidthRecorder.h" + + +BandwidthRecorder::Channel::Channel(char const* const caption, + char const* unitCaption, + double unitScale, + unsigned colorRGBA) : + caption(caption), + unitCaption(unitCaption), + unitScale(unitScale), + colorRGBA(colorRGBA) +{ +} + + + +BandwidthRecorder::BandwidthRecorder() { +} + + +BandwidthRecorder::~BandwidthRecorder() { + delete audioChannel; + delete avatarsChannel; + delete octreeChannel; + delete metavoxelsChannel; +} + + +BandwidthRecorder::Stream::Stream(float msToAverage) : _value(0.0f), _msToAverage(msToAverage) { + _prevTime.start(); +} + + +void BandwidthRecorder::Stream::updateValue(double amount) { + + // Determine elapsed time + double dt = (double)_prevTime.nsecsElapsed() / 1000000.0; // ns to ms + + // Ignore this value when timer imprecision yields dt = 0 + if (dt == 0.0) { + return; + } + + _prevTime.start(); + + // Compute approximate average + _value = glm::mix(_value, amount / dt, + glm::clamp(dt / _msToAverage, 0.0, 1.0)); +} diff --git a/interface/src/BandwidthRecorder.h b/interface/src/BandwidthRecorder.h new file mode 100644 index 0000000000..1a896eac39 --- /dev/null +++ b/interface/src/BandwidthRecorder.h @@ -0,0 +1,55 @@ +// +// BandwidthRecorder.h +// +// Created by Seth Alves on 2015-1-30 +// Copyright 2015 High Fidelity, Inc. +// +// Based on code by Tobias Schwinger +// +// 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_BandwidthRecorder_h +#define hifi_BandwidthRecorder_h + +#include + +class BandwidthRecorder { + public: + BandwidthRecorder(); + ~BandwidthRecorder(); + + // keep track of data rate in one direction + class Stream { + public: + Stream(float msToAverage = 3000.0f); + void updateValue(double amount); + double getValue() const { return _value; } + private: + double _value; // Current value. + double _msToAverage; // Milliseconds to average. + QElapsedTimer _prevTime; // Time of last feed. + }; + + // keep track of data rate in two directions as well as units and style to use during display + class Channel { + public: + Channel(char const* const caption, char const* unitCaption, double unitScale, unsigned colorRGBA); + Stream input; + Stream output; + char const* const caption; + char const* unitCaption; + double unitScale; + unsigned colorRGBA; + }; + + // create the channels we keep track of + Channel* audioChannel = new Channel("Audio", "Kbps", 8000.0 / 1024.0, 0x33cc99ff); + Channel* avatarsChannel = new Channel("Avatars", "Kbps", 8000.0 / 1024.0, 0xffef40c0); + Channel* octreeChannel = new Channel("Octree", "Kbps", 8000.0 / 1024.0, 0xd0d0d0a0); + Channel* metavoxelsChannel = new Channel("Metavoxels", "Kbps", 8000.0 / 1024.0, 0xd0d0d0a0); +}; + +#endif From fae59ab939e2c7ff079e2b5114bd2f9dd17cf0f1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 30 Jan 2015 12:20:00 -0800 Subject: [PATCH 84/98] Edge case when removing all scripts --- interface/src/Application.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a3c67b516b..a4057f886a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3414,15 +3414,12 @@ void Application::clearScriptsBeforeRunning() { } void Application::saveScripts() { - QStringList runningScripts = getRunningScripts(); - if (runningScripts.isEmpty()) { - return; - } - // Saves all currently running user-loaded scripts Settings settings; settings.beginWriteArray(SETTINGS_KEY); settings.remove(""); + + QStringList runningScripts = getRunningScripts(); int i = 0; for (auto it = runningScripts.begin(); it != runningScripts.end(); ++it) { if (getScriptEngine(*it)->isUserLoaded()) { From a98829ed8a689d951948945e7f04d8352385c0c4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Jan 2015 13:12:00 -0800 Subject: [PATCH 85/98] Fix editEntities.js automatically turning on --- examples/editEntities.js | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index 92223827b9..5c26fc0805 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -1047,4 +1047,3 @@ PropertiesTool = function(opts) { }; propertiesTool = PropertiesTool(); -toolBar.setActive(true); From 620efb2bbe73925732599332e931c1c6fd7043c9 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 30 Jan 2015 13:43:28 -0800 Subject: [PATCH 86/98] change display style of bandwidth detail dialog, include a totals line --- interface/src/Application.cpp | 16 +++++++--- interface/src/Application.h | 12 +++++--- interface/src/Audio.cpp | 11 +++---- interface/src/BandwidthRecorder.cpp | 1 + interface/src/BandwidthRecorder.h | 1 + interface/src/DatagramProcessor.cpp | 10 ++++-- interface/src/DatagramProcessor.h | 14 ++++++--- interface/src/MetavoxelSystem.cpp | 6 ++-- interface/src/ui/ApplicationOverlay.cpp | 6 +++- interface/src/ui/BandwidthDialog.cpp | 20 ++++++------ interface/src/ui/BandwidthDialog.h | 8 +++-- interface/src/ui/Stats.cpp | 41 +++++++++++++++---------- interface/src/ui/Stats.h | 3 +- 13 files changed, 94 insertions(+), 55 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d2c0d549ff..e42a7f4f96 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -241,8 +241,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _mousePressed(false), _enableProcessOctreeThread(true), _octreeProcessor(), - _packetsPerSecond(0), - _bytesPerSecond(0), + _inPacketsPerSecond(0), + _outPacketsPerSecond(0), + _inBytesPerSecond(0), + _outBytesPerSecond(0), _nodeBoundsDisplay(this), _previousScriptLocation(), _applicationOverlay(), @@ -779,9 +781,11 @@ void Application::controlledBroadcastToNodes(const QByteArray& packet, const Nod case NodeType::Agent: case NodeType::AvatarMixer: _bandwidthRecorder.avatarsChannel->output.updateValue(bandwidth_amount); + _bandwidthRecorder.totalChannel->input.updateValue(bandwidth_amount); break; case NodeType::EntityServer: _bandwidthRecorder.octreeChannel->output.updateValue(bandwidth_amount); + _bandwidthRecorder.totalChannel->output.updateValue(bandwidth_amount); break; default: continue; @@ -1387,8 +1391,10 @@ void Application::timer() { _fps = (float)_frameCount / diffTime; - _packetsPerSecond = (float) _datagramProcessor.getPacketCount() / diffTime; - _bytesPerSecond = (float) _datagramProcessor.getByteCount() / diffTime; + _inPacketsPerSecond = (float) _datagramProcessor.getInPacketCount() / diffTime; + _outPacketsPerSecond = (float) _datagramProcessor.getOutPacketCount() / diffTime; + _inBytesPerSecond = (float) _datagramProcessor.getInByteCount() / diffTime; + _outBytesPerSecond = (float) _datagramProcessor.getOutByteCount() / diffTime; _frameCount = 0; _datagramProcessor.resetCounters(); @@ -2380,6 +2386,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node // Feed number of bytes to corresponding channel of the bandwidth meter _bandwidthRecorder.octreeChannel->output.updateValue(packetLength); + _bandwidthRecorder.totalChannel->output.updateValue(packetLength); } }); } @@ -3368,6 +3375,7 @@ int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePoin void Application::packetSent(quint64 length) { _bandwidthRecorder.octreeChannel->output.updateValue(length); + _bandwidthRecorder.totalChannel->output.updateValue(length); } const QString SETTINGS_KEY = "Settings"; diff --git a/interface/src/Application.h b/interface/src/Application.h index 9f2fac94db..17c67f6892 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -209,8 +209,10 @@ public: Overlays& getOverlays() { return _overlays; } float getFps() const { return _fps; } - float getPacketsPerSecond() const { return _packetsPerSecond; } - float getBytesPerSecond() const { return _bytesPerSecond; } + float getInPacketsPerSecond() const { return _inPacketsPerSecond; } + float getOutPacketsPerSecond() const { return _outPacketsPerSecond; } + float getInBytesPerSecond() const { return _inBytesPerSecond; } + float getOutBytesPerSecond() const { return _outBytesPerSecond; } const glm::vec3& getViewMatrixTranslation() const { return _viewMatrixTranslation; } void setViewMatrixTranslation(const glm::vec3& translation) { _viewMatrixTranslation = translation; } @@ -534,8 +536,10 @@ private: OctreePacketProcessor _octreeProcessor; EntityEditPacketSender _entityEditSender; - int _packetsPerSecond; - int _bytesPerSecond; + int _inPacketsPerSecond; + int _outPacketsPerSecond; + int _inBytesPerSecond; + int _outBytesPerSecond; StDev _idleLoopStdev; float _idleLoopMeasuredJitter; diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 77b06f14fb..2bc5aa5023 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -769,9 +769,8 @@ void Audio::handleAudioInput() { nodeList->writeDatagram(audioDataPacket, packetBytes, audioMixer); _outgoingAvatarAudioSequenceNumber++; - // Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::AUDIO).updateValue(packetBytes); - Application::getInstance()-> - getBandwidthRecorder()->audioChannel->output.updateValue(packetBytes); + Application::getInstance()->getBandwidthRecorder()->audioChannel->output.updateValue(packetBytes); + Application::getInstance()->getBandwidthRecorder()->totalChannel->output.updateValue(packetBytes); } delete[] inputAudioSamples; } @@ -830,10 +829,8 @@ void Audio::addReceivedAudioToStream(const QByteArray& audioByteArray) { _receivedAudioStream.parseData(audioByteArray); } - // Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::AUDIO).updateValue(audioByteArray.size()); - Application::getInstance()-> - getBandwidthRecorder()->audioChannel->input.updateValue(audioByteArray.size()); - + Application::getInstance()->getBandwidthRecorder()->audioChannel->input.updateValue(audioByteArray.size()); + Application::getInstance()->getBandwidthRecorder()->totalChannel->input.updateValue(audioByteArray.size()); } void Audio::parseAudioEnvironmentData(const QByteArray &packet) { diff --git a/interface/src/BandwidthRecorder.cpp b/interface/src/BandwidthRecorder.cpp index 7264cf5f47..db59c680f5 100644 --- a/interface/src/BandwidthRecorder.cpp +++ b/interface/src/BandwidthRecorder.cpp @@ -37,6 +37,7 @@ BandwidthRecorder::~BandwidthRecorder() { delete avatarsChannel; delete octreeChannel; delete metavoxelsChannel; + delete totalChannel; } diff --git a/interface/src/BandwidthRecorder.h b/interface/src/BandwidthRecorder.h index 1a896eac39..a64a07fd84 100644 --- a/interface/src/BandwidthRecorder.h +++ b/interface/src/BandwidthRecorder.h @@ -50,6 +50,7 @@ class BandwidthRecorder { Channel* avatarsChannel = new Channel("Avatars", "Kbps", 8000.0 / 1024.0, 0xffef40c0); Channel* octreeChannel = new Channel("Octree", "Kbps", 8000.0 / 1024.0, 0xd0d0d0a0); Channel* metavoxelsChannel = new Channel("Metavoxels", "Kbps", 8000.0 / 1024.0, 0xd0d0d0a0); + Channel* totalChannel = new Channel("Total", "Kbps", 8000.0 / 1024.0, 0xd0d0d0a0); }; #endif diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index aa8d9db298..01c1c0d0c2 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -42,8 +42,8 @@ void DatagramProcessor::processDatagrams() { nodeList->getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - _packetCount++; - _byteCount += incomingPacket.size(); + _inPacketCount++; + _inByteCount += incomingPacket.size(); if (nodeList->packetVersionAndHashMatch(incomingPacket)) { @@ -82,6 +82,8 @@ void DatagramProcessor::processDatagrams() { // this will keep creatorTokenIDs to IDs mapped correctly EntityItemID::handleAddEntityResponse(incomingPacket); application->getEntities()->getTree()->handleAddEntityResponse(incomingPacket); + application->_bandwidthRecorder.octreeChannel->input.updateValue(incomingPacket.size()); + application->_bandwidthRecorder.totalChannel->input.updateValue(incomingPacket.size()); break; case PacketTypeEntityData: case PacketTypeEntityErase: @@ -95,7 +97,8 @@ void DatagramProcessor::processDatagrams() { // add this packet to our list of octree packets and process them on the octree data processing application->_octreeProcessor.queueReceivedPacket(matchedNode, incomingPacket); } - + application->_bandwidthRecorder.octreeChannel->input.updateValue(incomingPacket.size()); + application->_bandwidthRecorder.totalChannel->input.updateValue(incomingPacket.size()); break; } case PacketTypeMetavoxelData: @@ -118,6 +121,7 @@ void DatagramProcessor::processDatagrams() { } application->_bandwidthRecorder.avatarsChannel->input.updateValue(incomingPacket.size()); + application->_bandwidthRecorder.totalChannel->input.updateValue(incomingPacket.size()); break; } case PacketTypeDomainConnectionDenied: { diff --git a/interface/src/DatagramProcessor.h b/interface/src/DatagramProcessor.h index 7d337ec02b..4ce090e52e 100644 --- a/interface/src/DatagramProcessor.h +++ b/interface/src/DatagramProcessor.h @@ -19,16 +19,20 @@ class DatagramProcessor : public QObject { public: DatagramProcessor(QObject* parent = 0); - int getPacketCount() const { return _packetCount; } - int getByteCount() const { return _byteCount; } + int getInPacketCount() const { return _inPacketCount; } + int getOutPacketCount() const { return _outPacketCount; } + int getInByteCount() const { return _inByteCount; } + int getOutByteCount() const { return _outByteCount; } - void resetCounters() { _packetCount = 0; _byteCount = 0; } + void resetCounters() { _inPacketCount = 0; _outPacketCount = 0; _inByteCount = 0; _outByteCount = 0; } public slots: void processDatagrams(); private: - int _packetCount; - int _byteCount; + int _inPacketCount; + int _outPacketCount; + int _inByteCount; + int _outByteCount; }; #endif // hifi_DatagramProcessor_h diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index dffb8fbb6e..c81286b579 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -899,7 +899,8 @@ int MetavoxelSystemClient::parseData(const QByteArray& packet) { } else { QMetaObject::invokeMethod(&_sequencer, "receivedDatagram", Q_ARG(const QByteArray&, packet)); } - Application::getInstance()->getBandwidthRecorder()->metavoxelsChannel->input.updateValue (packet.size()); + Application::getInstance()->getBandwidthRecorder()->metavoxelsChannel->input.updateValue(packet.size()); + Application::getInstance()->getBandwidthRecorder()->totalChannel->input.updateValue(packet.size()); } return packet.size(); } @@ -1015,7 +1016,8 @@ void MetavoxelSystemClient::sendDatagram(const QByteArray& data) { } else { DependencyManager::get()->writeDatagram(data, _node); } - Application::getInstance()->getBandwidthRecorder()->metavoxelsChannel->output.updateValue (data.size()); + Application::getInstance()->getBandwidthRecorder()->metavoxelsChannel->output.updateValue(data.size()); + Application::getInstance()->getBandwidthRecorder()->totalChannel->output.updateValue(data.size()); } } diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 11fd0fa3f8..2daa22ebdd 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -919,7 +919,11 @@ void ApplicationOverlay::renderStatsAndLogs() { int voxelPacketsToProcess = octreePacketProcessor.packetsToProcessCount(); // Onscreen text about position, servers, etc Stats::getInstance()->display(WHITE_TEXT, horizontalOffset, application->getFps(), - application->getPacketsPerSecond(), application->getBytesPerSecond(), voxelPacketsToProcess); + application->getInPacketsPerSecond(), + application->getOutPacketsPerSecond(), + application->getInBytesPerSecond(), + application->getOutBytesPerSecond(), + voxelPacketsToProcess); } // Show on-screen msec timer diff --git a/interface/src/ui/BandwidthDialog.cpp b/interface/src/ui/BandwidthDialog.cpp index b6dde5873e..653b8de93b 100644 --- a/interface/src/ui/BandwidthDialog.cpp +++ b/interface/src/ui/BandwidthDialog.cpp @@ -23,12 +23,11 @@ BandwidthDialog::ChannelDisplay::ChannelDisplay(BandwidthRecorder::Channel *ch, QFormLayout* form) { this->ch = ch; - this->input_label = setupLabel(form, "input"); - this->output_label = setupLabel(form, "output"); + this->label = setupLabel(form); } -QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form, std::string i_or_o) { +QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form) { QLabel* label = new QLabel(); char strBuf[64]; @@ -38,10 +37,9 @@ QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form, std::stri unsigned rgb = ch->colorRGBA >> 8; rgb = ((rgb & 0xfefefeu) >> 1) + ((rgb & 0xf8f8f8) >> 3); palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); - label->setPalette(palette); - snprintf(strBuf, sizeof(strBuf), " %s %s Bandwidth:", i_or_o.c_str(), ch->caption); + snprintf(strBuf, sizeof(strBuf), " %s Bandwidth In/Out:", ch->caption); form->addRow(strBuf, label); return label; @@ -51,10 +49,11 @@ QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form, std::stri void BandwidthDialog::ChannelDisplay::setLabelText() { char strBuf[64]; - snprintf(strBuf, sizeof(strBuf), "%0.0f %s", ch->input.getValue() * ch->unitScale, ch->unitCaption); - input_label->setText(strBuf); - snprintf(strBuf, sizeof(strBuf), "%0.0f %s", ch->output.getValue() * ch->unitScale, ch->unitCaption); - output_label->setText(strBuf); + snprintf(strBuf, sizeof(strBuf), "%0.0f/%0.0f %s", + ch->input.getValue() * ch->unitScale, + ch->output.getValue() * ch->unitScale, + ch->unitCaption); + label->setText(strBuf); } @@ -73,6 +72,7 @@ BandwidthDialog::BandwidthDialog(QWidget* parent, BandwidthRecorder* model) : avatarsChannelDisplay = new ChannelDisplay(_model->avatarsChannel, form); octreeChannelDisplay = new ChannelDisplay(_model->octreeChannel, form); metavoxelsChannelDisplay = new ChannelDisplay(_model->metavoxelsChannel, form); + totalChannelDisplay = new ChannelDisplay(_model->totalChannel, form); } @@ -81,6 +81,7 @@ BandwidthDialog::~BandwidthDialog() { delete avatarsChannelDisplay; delete octreeChannelDisplay; delete metavoxelsChannelDisplay; + delete totalChannelDisplay; } @@ -89,6 +90,7 @@ void BandwidthDialog::paintEvent(QPaintEvent* event) { avatarsChannelDisplay->setLabelText(); octreeChannelDisplay->setLabelText(); metavoxelsChannelDisplay->setLabelText(); + totalChannelDisplay->setLabelText(); this->QDialog::paintEvent(event); this->setFixedSize(this->width(), this->height()); diff --git a/interface/src/ui/BandwidthDialog.h b/interface/src/ui/BandwidthDialog.h index bf08b39097..a171c98e12 100644 --- a/interface/src/ui/BandwidthDialog.h +++ b/interface/src/ui/BandwidthDialog.h @@ -29,14 +29,13 @@ public: class ChannelDisplay { public: ChannelDisplay(BandwidthRecorder::Channel *ch, QFormLayout* form); - QLabel* setupLabel(QFormLayout* form, std::string i_or_o); + QLabel* setupLabel(QFormLayout* form); void setLabelText(); private: BandwidthRecorder::Channel *ch; - QLabel* input_label; - QLabel* output_label; + QLabel* label; }; ChannelDisplay* audioChannelDisplay; @@ -44,6 +43,9 @@ public: ChannelDisplay* octreeChannelDisplay; ChannelDisplay* metavoxelsChannelDisplay; + // sums of all the other channels + ChannelDisplay* totalChannelDisplay; + signals: void closed(); diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 0185a99b16..a913aff332 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -35,7 +35,7 @@ using namespace std; const int STATS_PELS_PER_LINE = 20; const int STATS_GENERAL_MIN_WIDTH = 165; -const int STATS_BANDWIDTH_MIN_WIDTH = 150; +const int STATS_BANDWIDTH_MIN_WIDTH = 250; const int STATS_PING_MIN_WIDTH = 190; const int STATS_GEO_MIN_WIDTH = 240; const int STATS_OCTREE_MIN_WIDTH = 410; @@ -199,8 +199,10 @@ void Stats::display( const float* color, int horizontalOffset, float fps, - int packetsPerSecond, - int bytesPerSecond, + int inPacketsPerSecond, + int outPacketsPerSecond, + int inBytesPerSecond, + int outBytesPerSecond, int voxelPacketsToProcess) { auto glCanvas = DependencyManager::get(); @@ -264,18 +266,6 @@ void Stats::display( drawText(horizontalOffset, verticalOffset, scale, rotation, font, avatarNodes, color); verticalOffset += STATS_PELS_PER_LINE; drawText(horizontalOffset, verticalOffset, scale, rotation, font, framesPerSecond, color); - - if (_expanded) { - char packetsPerSecondString[30]; - sprintf(packetsPerSecondString, "Pkts/sec: %d", packetsPerSecond); - char averageMegabitsPerSecond[30]; - sprintf(averageMegabitsPerSecond, "Mbps: %3.2f", (float)bytesPerSecond * 8.0f / 1000000.0f); - - verticalOffset += STATS_PELS_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, packetsPerSecondString, color); - verticalOffset += STATS_PELS_PER_LINE; - drawText(horizontalOffset, verticalOffset, scale, rotation, font, averageMegabitsPerSecond, color); - } // TODO: the display of these timing details should all be moved to JavaScript if (_expanded && Menu::getInstance()->isOptionChecked(MenuOption::DisplayTimingDetails)) { @@ -317,8 +307,27 @@ void Stats::display( } } + + verticalOffset = 0; - horizontalOffset = _lastHorizontalOffset + _generalStatsWidth +1; + horizontalOffset = _lastHorizontalOffset + _generalStatsWidth + 1; + + char packetsPerSecondString[30]; + sprintf(packetsPerSecondString, "Packets In/Out: %d/%d", inPacketsPerSecond, outPacketsPerSecond); + char averageMegabitsPerSecond[30]; + sprintf(averageMegabitsPerSecond, "Mbps In/Out: %3.2f/%3.2f", + (float)inBytesPerSecond * 8.0f / 1000000.0f, + (float)outBytesPerSecond * 8.0f / 1000000.0f); + + verticalOffset += STATS_PELS_PER_LINE; + drawText(horizontalOffset, verticalOffset, scale, rotation, font, packetsPerSecondString, color); + verticalOffset += STATS_PELS_PER_LINE; + drawText(horizontalOffset, verticalOffset, scale, rotation, font, averageMegabitsPerSecond, color); + + + + verticalOffset = 0; + horizontalOffset = _lastHorizontalOffset + _generalStatsWidth + _bandwidthStatsWidth +1; if (Menu::getInstance()->isOptionChecked(MenuOption::TestPing)) { int pingAudio = -1, pingAvatar = -1, pingVoxel = -1, pingOctreeMax = -1; diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index 204ddec219..136baf448b 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -29,7 +29,8 @@ public: void toggleExpanded(); void checkClick(int mouseX, int mouseY, int mouseDragStartedX, int mouseDragStartedY, int horizontalOffset); void resetWidth(int width, int horizontalOffset); - void display(const float* color, int horizontalOffset, float fps, int packetsPerSecond, int bytesPerSecond, int voxelPacketsToProcess); + void display(const float* color, int horizontalOffset, float fps, int inPacketsPerSecond, int outPacketsPerSecond, + int inBytesPerSecond, int outBytesPerSecond, int voxelPacketsToProcess); bool includeTimingRecord(const QString& name); Q_INVOKABLE void setMetavoxelStats(int internal, int leaves, int sendProgress, From b035c5b082258f3d0e0d24f23d0900d43e3c8580 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 30 Jan 2015 14:16:32 -0800 Subject: [PATCH 87/98] fix for updating moving models --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 699603cb21..7adb857902 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -148,7 +148,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } glm::quat rotation = getRotation(); - if (needsToCallUpdate() && _model->isActive()) { + bool movingOrAnimating = isMoving() || isAnimatingSomething(); + if (movingOrAnimating && _model->isActive()) { _model->setScaleToFit(true, dimensions); _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint()); _model->setRotation(rotation); @@ -168,7 +169,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("model->render"); // filter out if not needed to render if (args && (args->_renderMode == RenderArgs::SHADOW_RENDER_MODE)) { - if (isMoving() || isAnimatingSomething()) { + if (movingOrAnimating) { _model->renderInScene(alpha, args); } } else { From 80f6f718d0cfb6da8ce524106ba25af18f0f2a85 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 30 Jan 2015 14:17:29 -0800 Subject: [PATCH 88/98] EntityItem base class now computes shapeInfo --- libraries/entities/src/BoxEntityItem.cpp | 5 ----- libraries/entities/src/BoxEntityItem.h | 2 -- libraries/entities/src/EntityItem.cpp | 19 +++++++++++++++++++ libraries/entities/src/SphereEntityItem.cpp | 6 ------ libraries/entities/src/SphereEntityItem.h | 2 -- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 25ef2e6aaf..1e8c811122 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -96,11 +96,6 @@ void BoxEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitst APPEND_ENTITY_PROPERTY(PROP_COLOR, appendColor, getColor()); } -void BoxEntityItem::computeShapeInfo(ShapeInfo& info) const { - glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); - info.setBox(halfExtents); -} - void BoxEntityItem::debugDump() const { quint64 now = usecTimestampNow(); qDebug() << " BOX EntityItem id:" << getEntityItemID() << "---------------------------------------------"; diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index 8d68a13158..a9c3e724a7 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -51,8 +51,6 @@ public: _color[BLUE_INDEX] = value.blue; } - void computeShapeInfo(ShapeInfo& info) const; - virtual void debugDump() const; protected: diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 9012b2e50b..68b5d1bb05 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1022,6 +1022,25 @@ float EntityItem::getRadius() const { void EntityItem::computeShapeInfo(ShapeInfo& info) const { info.clear(); + if (_type == EntityTypes::Sphere) { + glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); + // TODO: support ellipsoid shapes + info.setSphere(halfExtents.x); + } else if (_type == EntityTypes::Box) { + glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); + info.setBox(halfExtents); + } else if (_type == EntityTypes::Model) { + // For first approximation we just boxify all models... but only if they are small enough. + // The limit here is chosen to something that most avatars could not comfortably fit inside + // to prevent houses from getting boxified... we don't want the things inside houses to + // collide with a house as if it were a giant solid block. + const float MAX_SIZE_FOR_BOXIFICATION_HACK = 3.0f; + float diagonal = glm::length(getDimensionsInMeters()); + if (diagonal < MAX_SIZE_FOR_BOXIFICATION_HACK) { + glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); + info.setBox(halfExtents); + } + } } void EntityItem::recalculateCollisionShape() { diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 181e5851f6..865fb88463 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -101,12 +101,6 @@ void SphereEntityItem::recalculateCollisionShape() { _sphereShape.setRadius(largestDiameter / 2.0f); } -void SphereEntityItem::computeShapeInfo(ShapeInfo& info) const { - glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); - // TODO: support ellipsoid shapes - info.setSphere(halfExtents.x); -} - bool SphereEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index f76c9f5600..fdc0b7f866 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -56,8 +56,6 @@ public: // TODO: implement proper contains for 3D ellipsoid //virtual bool contains(const glm::vec3& point) const; - void computeShapeInfo(ShapeInfo& info) const; - virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, From eda7785d3be25c37dc97021f0c92b62d07d919e9 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 30 Jan 2015 14:41:03 -0800 Subject: [PATCH 89/98] minor edit to make diff nicer --- interface/src/Application.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index 17c67f6892..7ac05d668b 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -182,8 +182,6 @@ public: QUndoStack* getUndoStack() { return &_undoStack; } MainWindow* getWindow() { return _window; } OctreeQuery& getOctreeQuery() { return _octreeQuery; } - BandwidthRecorder* getBandwidthRecorder() { return &_bandwidthRecorder; } - EntityTree* getEntityClipboard() { return &_entityClipboard; } EntityTreeRenderer* getEntityClipboardRenderer() { return &_entityClipboardRenderer; } @@ -204,6 +202,7 @@ public: bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } FaceTracker* getActiveFaceTracker(); + BandwidthRecorder* getBandwidthRecorder() { return &_bandwidthRecorder; } QSystemTrayIcon* getTrayIcon() { return _trayIcon; } ApplicationOverlay& getApplicationOverlay() { return _applicationOverlay; } Overlays& getOverlays() { return _overlays; } From ae87dac5230f9778305ab7ccc853e9f55d5ca276 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 30 Jan 2015 15:22:21 -0800 Subject: [PATCH 90/98] update to new interface icon --- interface/CMakeLists.txt | 14 ++++++++++---- interface/icon/Interface-beta.icns | Bin 0 -> 123151 bytes interface/icon/Interface-beta.ico | Bin 0 -> 370070 bytes interface/icon/Interface.icns | Bin 0 -> 126362 bytes interface/icon/Interface.ico | Bin 0 -> 370070 bytes interface/interface.icns | Bin 388541 -> 0 bytes 6 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 interface/icon/Interface-beta.icns create mode 100644 interface/icon/Interface-beta.ico create mode 100644 interface/icon/Interface.icns create mode 100644 interface/icon/Interface.ico delete mode 100644 interface/interface.icns diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 7817b9f520..f6684fe0e8 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -83,12 +83,18 @@ if (APPLE) set(MACOSX_BUNDLE_BUNDLE_NAME Interface) set(MACOSX_BUNDLE_GUI_IDENTIFIER io.highfidelity.Interface) - + + if (CMAKE_BUILD_TYPE EQUAL "RELEASE") + set(ICON_FILENAME "Interface.icns") + else () + set(ICON_FILENAME "Interface-beta.icns") + endif () + # set how the icon shows up in the Info.plist file - SET(MACOSX_BUNDLE_ICON_FILE interface.icns) + SET(MACOSX_BUNDLE_ICON_FILE "${ICON_FILENAME}") # set where in the bundle to put the resources file - SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/interface.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/icon/${ICON_FILENAME} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) # grab the directories in resources and put them in the right spot in Resources file(GLOB RESOURCE_SUBDIRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/resources" "${CMAKE_CURRENT_SOURCE_DIR}/resources/*") @@ -101,7 +107,7 @@ if (APPLE) endif() endforeach() - SET(INTERFACE_SRCS ${INTERFACE_SRCS} "${CMAKE_CURRENT_SOURCE_DIR}/interface.icns") + SET(INTERFACE_SRCS ${INTERFACE_SRCS} "${CMAKE_CURRENT_SOURCE_DIR}/icon/${ICON_FILENAME}") endif() # create the executable, make it a bundle on OS X diff --git a/interface/icon/Interface-beta.icns b/interface/icon/Interface-beta.icns new file mode 100644 index 0000000000000000000000000000000000000000..15b373767af3de955a8471c7b46097db1a237d32 GIT binary patch literal 123151 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

mIeg2=ZDmR!#%HTtBJ=c;lxKz95APiLvBO ztzm&#A)jZRU%)^x6m>8*mBJIcJeErtkCK8tLDNr+e zkHQ=0*V7{cM6VJ|TXcF(d3_KMXfW6XO3mSn2O#gf8)w15yFaHvH2NUpQLg)WG&68H@d=7X_Ggs2OzhQ8+Tgv$ z7j~TmONXE#twCeI^`@ilOBcF_4W6gE;-ueG{A~3EnHSO-h@pJ&z7J+<&j}6k9D6!x zpX7`;e36YYxJlGxD%&~FAp&hU8Ec75dyf@I76|#`MQH`wpq&t|C9WF6I-x|Z3F2sENGLV&*OAl))h2Ta5kn73BO+a zC~x|0x>taj{G`&Xoa22YgSQqwjXltMixBEh&_%%*$-J!n8dGlrtk6Br!cE$Ck1g<; zJV%EBafq~R1s5$L?mKn2+3?7TYYCLp2y{$_kkb)ylmBVDOyG3BxDMm&)EHvynX z>1$HKSd9+hAH1kH!TK(Hl1aIowCPEkf(lK4niW~pLfe29s?iT&w)j~P`wk#{llj80 zF<*UKzWek=ZYo_X-&rgp z%NokjKY!6QPT;~=y34ZD);vm8t3`J02_Ll0B7JvttRKE_4nkJHLdwt!aSWb$RP zz!BOx(QN}3mSAh10a|w;$F>|U=0&sa8CwU$4YwwyX~7ih&cND*_(I5>O0`833)8Ou z>{@{8F`G-o`vEBMOEVs|`v3fjY?Z)dtk7^<@x^^i(NQgagwV!!l z6M-|Ypp^Gz7p_ru<&OZ%0B_;&n&_5!k8`rnJLj$_W%Q$p#?|78S%*-*{iJ6(1IcA2K%FN76F+;`!t$6 z()^hHt4b8z&~28WwT9sgPQ{QK}>XYk~qxtvJ!S5WI~Trhl2ehp-MZ=&-|QQ)a`Zxc|#giTg_oJ*WxzI zn5;GkB#1H;@Y2&zvXgYCYnt`D0M{}NY#PB!4nWmq95XP&%#!(!IpG(6Oysm7jQ*NbaFpS8Em`^IP8sizs&kF=_!g}!>VScd)Kg!Jt`d11(%nQSJL#w+ng zN;aD~^fcDIqFrM6x3y9A6+)>ZOjm(4Ry<4jIpV(IB`3FzZ|VTfW;0|EH3fo0c4nq% z8CN>ZS@ZkNSm+yGP@nbjgw=o%XFhl@D$jwiBd2ia+dUxR&bko#YAXsX-#9GEi~gce zg}%nv^x~-kw%jPJY`p{*Hg%J=N$a5{43`VW+tn;^mw@%Sf5W{@I-r`on8!Qv>7AHA zOIx8<;Pl|L%QCBmZ`CDY_vL%Qb6y2IH=&+{yy?dj%We&%vjiz>)!76^`W_E&zFhYM zbDJyN!3G2P2N#kBJ=C+~VbqV5ryiVguxq@RU0~Y;H%IoMe*o{#c?7w6ud2m8U~oy! zKDLBa6Xee1E5r=JqY%5EXtaZ%Nf3I|)E#YrI-_Ee?I&j}rjUw!B>?mNIlxTmdLF7% zJQd&caR!DjvXSg7^43%m2q!C*1!4Ni_N%hwRpXnVCkcVvn7JJVRAqJ~1x8J1h1@Z5 z5UG{~%eC8!~GUH$vYjfLgvf^hv3O*OUI2wO`lcNCPMJtjdm~a$DuhF;= ziavAiQuw0Vs^+hm7a#!_{8vt|pHg+n`?+RnU;^L{^sd6!bWkk)ep>JIWIK<1*=L0aT)=@sODto#!lUmeP z7G0Ykcu%2mxCm!?nKSqjB(iN@g_5!|h!G_8`4wGRXm~dGQew5UvHfP+y|B`@ox&Ab z1`e<46*LrDMT@C?D`YGspP*X0HT=-3SR+0(E41(^)tz;8t*Kgxf{Fx1{S&i0zdTOhWZ zgk5SiBCNUHn7*c)ZLp{}0Aa{t<#cqG+p67J9a2|ZH|B%A1ZryAXVKfZ5Md> zolHnHg3=rOQ0KGA>MmS8aRk{_KHb)wGBDmf;N2pW9m6;E+@p1IrBn<3=}qc)7(mT1 zbC!9o2_2CY7^+lNf7mdX{e6rGWfm5b)_<9+i400Sf~t##i$kl)GPA<^K009~nrDDV zwF%|m#;4D2$tow0x}JoW8L2Duou7`9DFnYd3XNMcf?Q@}A0Hq+E zCYBh{jRQ_-sQ*k8Wc54MDw?+1!djcNP{hgl9ADyWQ~M+7tTW0OA?DTQ>{jpPk|n+Q zxi;ZDL5ea)B~=tV^(VHJHBu6gj(tH24Wf)BNg#Nf z3I3^vSy2G`o{W)H*agpm3rj{<2^6R#QNzMN4zUfj^B-)=sc|r<`gvAUP!%Xdy7!_D zUo&@rKU32W(tHk06HQB)Bp2&*2s>5X}ZVHy%V7ap2MRTCfie zEs&kw1tb6_w-!bn%q?3HZH&P8gnRsgp$-9X^1$O^>ERsriLWn{gBd3id;HQhi!;io0O42^!h{2 z#ia0!lcb!Y?}R>lv66CT1E0_QJ+PlVai?!*6m2xxVu#q9Du;1TECe0{+`3a3&ErZm z9hvghDb*c0w?E4fAC%ZXU8g9{Op|6*0oTgYsbsI5(9#kJ$H=-DOMrOUbb zF4ZEny51Ni=>@JP;Av%U*Jk9ZUs=PTtvWcxe8n%VPWJWcSow@$M3a!*0#4sjT-8sZrD)O3t4I$nl zXfLe5gIo{qQ-Wvi+gv|nzk!P0D_g**8bu$T#M(d&8#O;EVC2~l+ZW3WAUE}v+_n_0 zf?KFJ@3CNwo_hCOu-Lo*?3{PZfUH!%1cPtbWCHSrN2hrQ_+C@%Qo!UMErdtLe}g0{ z=(Z2HgHH|U8KwNyAP0eKaZIe0WtGiCnksb>Rk>9GWe{|9n2tAT;1=+5R$t&cLLFb- zsi8ftFW}{Sx#oe6>kW6^0GOTK1y5PJE$YL7z3f$D%w>h(eu!y#_D!YNQ6bN8;k^8Wh3Jp(%$#ur@kWD( z4fK>YMv&^%1&=YhP{47QM?)uX(PKO64)c61xgF_moYWe`a!*SAakP&MVMhk=a6ib+ zQDAO_thvx1_fog^f7mmT+2={kx}2gR(j{A-JNLfx_+}8-GCB7!TnLtol>XF3fDyYd zL`GZrR*C$uy4=Zn=_b=&(6~(fJIiWlvIS^iauPoIrAgQ*Vism^)6h*mbr@s;UOIgp zWJ)lxa)XFE%y_G#<(yGSkxHi=NL(zzDTTo)8Dl^~D3wu(=VxTa68o4D@mfUmHAjLp z0=eJk+HvPY*15m0#AFYRdMhL|T$th~5G6NBglwmL^BPwl7w#9;IaZR#I;Z;5igk4Z zjo)vaZzdcQqwI=c^C!ThyasscA4nSCOY`V%i0?V*#`rv^7DSqon!cGDGYmdt>dQDo zI?Gj+`&nCJ>qXkT%xB8@Prw$O8hORD66%;7nAi~_H_><%^MUzH>h^f|!KvzJwLN7$ z=LrF!NG*@A`RNX&0z7(d8MF{G-c0P9;lMma#ygN+AZjX|xxPLk9-qAv({mP3Xqe<=1sGUwF zSeU}a(K5+xbpBQ!4%u=>4ijOrO}K|TD0T1%lT-IXHBM#8NH}+!djt!lSn!^uCRq=V zN_BFxGq&GI=lJ#b8)~vlqii(xQSPa?V`-vJQ0h9k1R;ozvZXyrJtW7by2CSkEaxCi zh{4T)bojd$s&L>C0-x&hj$-(%do@Gz*I%k)^2T)adkdiuX4-TX&y~TjJmcR)apAEO zTXUZhRnp+V1oZjm32(+``?fVhI<|*+`!n~2VT<>WY2G27R_yzl#K>fGeyl2vp18Fp z&V|PV)V`Mh56AlwNw3Hb9VfXkEmvY5E?eQ3n=URZpdf2efHy8Xq6gyng!bR4BNOcd zrd;$1i37__y{T`Hi09gr1aMu;iCt5AF@y@o5^ew-kcfImVCbqVQKr6XZXijozO8>~ z8@*lWB_j9`WN`R7EUHHyGP>hmKXYdkN5~}lGUT}pTgeWME7O~H6bL&~MYllk*gte0 zKIz}Q8eASu5`&xt?QmCjk{l>IQ230h54!JUL(k1xtYg{&t&p$`XhcWwRe79oTSy>}CyA_*m%I zKBmVWroJxkC%xoV&x-L<4sb2FzT&(%P(L(6zW_}N{9@m=J^UB~W_LO3y3UJgYMF0dGSn@C$WVkm4bU+xlgb=<)tJPOX zBgVc?8BLWJ4({IrONT!Uwe>%K?saD2qnB1fwKCRfIjEcPoTH4Cr{t5-tBInH1SJRS zkQxEBP}>!kCHr$v1%YToJ2dp;E3ymbxvX=P25>M$%gB4N#k&+88 zfCl~QXCBo3hhD~% zxHfTzTjPU(Anfl8mvG7z?8zGU{>3CF0KvE}!O4PqK>%1#kX0}u1qBH^1RNZ3OcVt< z$6&I8zx2pApj(QkCm{IhPls8Nvp~QQeSv)fCZB_KXf(7}@_z)yl#mDH>(&vW{uJ*- z;d{JHEAVU=+loc_)53A|Z~4mr8o#*z&SnPudGDhclOGt6WNe6#5*0xc{@%V}d+hS} z;+B8{@ISfL|J@3}Uf3BLU~ARcsou(_sCFmnhWZs|U}fIyg8+Y(LA*EmJXMnKqg`0_ z6AA1eVT)Q%c+Bu7Va|B@ZX7cW<$p*%_&WbS-h>%EEvBLHX_l;P(GG-zg3}s`q#DXu z?ltz&Tsm6T$2n!4`C1AU*Zm>`!(?cbV7-81+NtP^{mJ-o{yf$mF8Q)eQy1hmgv!Mu z^vAw@vL^N`g2j>iTGGQ3i@H-fKyV>#>jX%`cw#c!404|j*)j32xNT-zmz2_^7R-?T8d&C=M)9hDPWXOlB|;BXdA|5nuz`~-#R=6Bvd zLxOWBt_A@j!xCsS1&8!zRRw^}IMd7;g=3;-B=bl^a@iT?F`?m;|5e)hpA9?_LX%tn zKqmZOk)^BlBl+y8QUs!l#QlZCB>m_2Ai)?BE)8r(tAWj{&fLFLVRnbt>#Ltfr{+FM zxKW&HfBH6uliQ3V$#2vK=>E$e*;*;8C%c#fPYowhlZpGd-=Peq|I87VxI|>wK4D?U z7_3zJ6u&{;jll_nS z|Hy^^l929XK>|ReATO>Q`oH*$V(8Jf-yh@DO7bZvsC{)>(1;W-Ujz=$O9G2Dt0S9}4fFmi> z%W0PWO86hz2`opWK_u*tzxk2(r>JM!y&p6h8Y&)GP*4ZC!=K`yz(2v}xv4xf5`n{# zATx>QDjc+o&Udj)#x=C_8Ed#;F7Yfs;JbKm^e{r|$=aGmD$L6@b+r_A-J3`@B3IPc z>Wi>#PP|lTICB#bwIr1tUT;(ipX4*(ksQk=EX0&6?fbP{z3na5zMGmFNe2PgP%wYmWS%5d122I;>72><|?G;;~Y#$(QO+FH6P z1p%-UGv$r;hLBL!vE;^{raoGo9b0N^e_IOxFa@!Mz_GN5f6Z-28cCicdASk@5#ul2 z`8t2*J)}3g;xzl&XOD?c7jc_l;hB-R1CSBJ#`ts4x~vVY7g-NYfbGZUKH)zT;-8yr zjTvT1x8PXIS@6y}W*iAJ3WF1CwxDd!Z-`1>f29Rw;=np|_mI~o+>C%x`0#Xsr+Y2Q z_E-?`SvyW=V6@5_1K=(~D&=!Aeo`bXdoWc=obZQ${5Adll6Rs|g6fEAl2XWFfKxw) zOEwai@NPda6;le?=4Ji@HA{=Ml_(0zN8CIBKphrLtC$qBdZP`1$g)K8&J!W1@3KCq zkbW48f~J_j<0jev7eD!D0~3Y(S2+J_V4@H`-!mmKvqtVHjb%Pw$uHxIP*)EA_uK3? z|6U5oj7=Qf-fup!lIO2M1Z!eaz}P>LhJb@}cM8khq@atCBy;-UE__}aZ#jt(%(hc< zZOL!37Q$PvnrvI|bTsD!_%VEE#0*A4hZiJMB3JvF2_F0e01NW_r2_{sw1@^yvW!T+ zIyIkBG?c?Gh4#*dDA}eRlOdVSo&QlVzV3D*l9_MvOlH4unvKb6CB zF7#mD<@3Q(v4_o%ApOpiL?$eX8hd8%#NU*QR$hWPWMnghk`KFa>HZlysz>I3ZnNMJ zSF=(J1N@wazu#a_s45sw;UuCNmgpmLeZ40He?SWz=Ek1`R zQyN)^4vd_O(bFkXb(P<0krX9Bus;MnwH#bo;ex}GWrjUC_53ELFycFu7__f*+FUyF zcQ7E7B#i*`^E^c=g5%U*g^yVAgROGfm}GOmddm3ejwK?9E^jxq;TsU?0tkg&qf z{M-m^KSI5uhXE9Py>;pqV*Ac~fc8t&D1rb=F;-moWWAQGkulM76gKzvqyw{dueb9~ ztH_$1BtZdPxV*~(OfwocXRG})9nnX~@XqqCK0Iq2ueJDdWVxY+gMm+G(1EzgZJC*@ zt>|DmZ0NG0CmncUsh7zo+Y>5t68*s9Ufg|3N#V+-VhSW?62-C?Z?hS5_9je3{Hymk zYpy}rIoPiks;wZAQ9FnUaxV~ZpoL)2{)rz*L5x8fqNt$Rbm?WFxjX(VnWzXc>RdC)`64<*SG{@AocmYXpYw@U(cA?}&r5?YTzJZ6osd$48_J43h&`Z0y*H}j zv*TL|Ztu1KENZj6nv2k2V@2}@k+U4{9&!{6`CNF10e#hZ5h>;4_DfssIb75V$Y2fz?y zhx~I|Q-c2gEBOCL41yLh5tF8-rRLnNvG-{x4)%qYpg)H$1Q15kO0bk`;79u z6fJ^Kemf6Pvpz;Sd*p8soXQO~0D`K6pBDmjuXSJtvSj0?@f9Cm0@ejQTo}ZqQHwDE zjAf%+Rqrfa;0?S85?kQpmflGUBUz!z%y+hOXNj)ccGaKvz_eYvv6X%-Qsc#7oS=ab zw02V4R^c614wE9~qf@eR|JkakKk=!7ct>2*vvlBpGiqLxfhVh^Dc=yZX-ri?gOC`A z=+a;TfW_Ws4I6F7D=UX*aI!FVT-vig=L!Je(GNc|K-te>Ro$k-$X+MA3~gZmW2Aef zDNi(ts9FlH>!@_udTC)ZRUM-zd^^*R-PrZhMis*RP^}eYhes-VT_bWM6!W z?dMg7VZ__RQLHpJ9KGLkJH?7*Yj%ekKq}?T(49rSdy8{eD_?EW>N2TA8e0nQy$;l+1h5-5v?9zh#wtT0nwRZV;JV!w~2fqi4Wh6^Ci$t5M+<0;Lrp6%bW3Z ziWrf3J2Yg_k6X#W8V`}NO@(|MYf&c#?r_0j)8qNW)Z#`A6O0s{c&_Kh;P=EDm`L4a z_4mq-RDsWm1s8yJF}dj$a`%%X7fDX%q;FxvD#dE4P<>k03kO^AI^#n>_`U4iuxDVD zTPqC^zvlyg3S~F~1nhV+dD_>vY2KrVJl!rm*bp?ybEcL>N0ocgxb0Y-lO&+7h}NtT z-MqO-A@gj=foqU}~bfV*! z2}o|M`-u<&mYY7WA&aRZ{%t^BOSZfFN&Z&^T@G7>==LeCTPYOJY!-PU6F;RL@GkFV z%JY6W5!j02=ITc(=H6LfHD&yn*`u0rJqDicl`0(1pbm{?nr^TDiejmJemtlk-$Jgr z^YbOlmH-Rn3x1{dURL|aS!nL%X+St{-Jyoh4AmKj6H)uGM@es#o5)1-^) ziGxM6;XHm`%5svMr?D6Iz0MOHpsz1^B&U%-@i1_%IXJAyGpKZze_n4xcRZQVRKdDJ zg!c(ki$WC-SiwgEFVEBGgmixtW4K~EaIPWY=j3F7u2Vm_&o-ZsGsM>hdFV8)Y2Nga zJPas!Ge?9{ON5un`^c;r*ja}3=r_d>W^d6&T}whRITr@-U|e_ z2u|oLm#HQ}IEW*18SS1GqSVlfCNcbFs4SscU%hf;#P&<2YGgH2p<;Lu5w@mGE{oe> zcleLGEc_W1J%!h)gL?8>geg!R!J%nhuudj{(ugA#z1rQ)W^>Yh?@)vJzm2*n8`t*I zI4af26#CBW5+QrX1AYEX_Emt1Y@v96kv<$<(x=+Q2zk_&{zB!avP> zB(9;QH=l7~5WwfQXaitdeX{rEzX9fSgMi19wAYsOqC6?WV<=HhbyhuJJo)Up|NNsH zK#CYZ%pXG8=4_$GbyYMdrB|6B!w|a?=`RterwY<3JYoLs`^fDv8XtZZ^70FcDA$q4 zClf5}=s1WTq?QT-E`_xfZPBf2InXbDw85v49k<|B|2HFillA-?BmBB9bU)Bz^Gf$O zMJR^#{XZ0;M@eq{@zBjd@&j-pfWTDVE;rI|)O=;l`(PK2TJh4jk;3|wJG2P}-Alok zNx=VmCP&=lFN{;IUIyDa82>NY3+ z$Va+@D6mC1oxc!aAoc`l7W~}lOBO6+hQ0}B+j>=6xt`;2kbTZXsWVIW73NmB+E3 zJA#0=d^ZUAHsoR#0h3?c&b?dPt9wy_bIa%J&PxEnX`H(f$&?9hf2 zRVQBiEK{aJ1k9w6nzp$9w8rsML1i{|G8f0bds2C~HN%Gy75L*)L6)@P=O;p>X=nTb z+~TGRDwGjyPuk1wxwlgO5XG8ko>mIMCM`CUdvrZoL~@IX#K*-UtpWW%d`$B&W7kJ< zk{<%$Z6||wL9We)$?7X0r^Y|uNwtESy`fSzYSc>ZthT+KZ`%FueDG_E{J-3Q`bp_iOd^rB!c5rd8{NL;#ZQ2ybL&L@+JF_$P zNgXMi_$l#gatJZ-KlI?Mbzw}@P2nb?_afT#WvjuK1_>rqe(AH_@5srr4u7Ld# zImX8hdx4`CG;SOa9TnCSSC$@?mV0$ztDVn2rUXetT2Ahp)*m5```X}bFV{!%MYXSg z(i(m<#!M1~B_b+@FEu+$uZk4`{&1%o^_O0jQiY;Xq_O zWQLgZaVaILKN>M-W^}*j@d}!nc3-4?lSD3lx4Wq?e!L}yF-KE+ZV>Wq?I`2n*Y`gJTpn<9Ob=e=doH?j2J50xO5q8f4VWz@euxP$pj~B++NOQP*D&bfjDu>lNCui+vFaT&gCTR628N1^Z8a zO7%1p`vMzte9eulXnc} z+}P;)l4!Q;Ly%~J-PxppSKC2q!MU@MtfX7&1_jM|Q9TfHN)Br4WNu+%)5u5rjc$b7 zgaa^RgQk}m2#0NY?7u40**Yv>>7o1LAc*JdRYoX&vur<|N56V5>w>pPAe=+g66C(x zLcgNN(PW+onLqINhRZYVmb%Hn#8c!iM<17XU%?QtKd-xCnLLUOw&R%9d!$ezQ2Zi0 zlto*Oe4c}wW7LS2v=p;WDEx`eiuWF~B@y5kBF#X(%BMVk@J-Y87I8hv5dN-|4}XbC z>Ju}c|H^a-X|;2Zi<%}YbHWt@EswIoM$VuK@Cr$q+W}YtRM-F>w~ld7=hKyX=QiZ} zev?n9kj+Zul;C#6Whw4Qxi$nR%VPM20~QUfkuF{DQlYlCUsS28SeW{0wNwBNHqo0% zy+jfP^zCFiM7Q@YR}r>hIjv=Lz?Z-jTJZ*8rf+eVH8=2%T8ku1i%^R!{54E^&-=X6 zOt+6MH)m`X8KUB@Px^DuMmps0;Cam5vV+YowMXz~o72LPA)19|Zv$6u+$SC!PEo>Z zL>Z=gUY*^?b_yk@9B|X40O&Q1QyeC%*h36+#JGDI$gU|D)cQMY()7#2fLd**l&&-? zVi!Gi7dD<9%df4W?br&8oQW=<3*DBQT8UV|+M6eFMvYRFZl$o(l=UuIqz%Dilyd}a zw%w{}3jMx6*x7{i%TEfjHjG!H6ll=6m9&Bbh`O9>S>rijp&}8Vwkfw#&NbVrW}G%A z{b$_4yC=K#67L9ZZRQR;6^bTKD+6%5JTXS%korw6eeCTBLq2p@e@iv|bgt6~HG>>p zQYTf{wiodVUJpFKABKZE*Fc&5yhk#I1oN}N+n_!FTLPqq9)g^Fz0A+L+KFGB{`Nl| zkOxdseqa}tCwkKxQpxu6(kkN}7CY3s)MPcHbpmJ5Et_2{h*+}M(~=n*4%;YK?n_o5 z1>azhK@j~xQF7gA2>16<=2MOf<G(*3+2hqMowF)RZRRuM2>(bM?<&Hd|&VV+~sD2W8a0iR!93r>v1^g?Wj(2+CHW znlgHDhKD-&Zyb-*>!|8q@9Y{Vs012|&Esg&pWoKbaBYZ@X}~W`h+Uf8Z#p~sYajwB zy7KzB;@~XQ1Cuh@!MlgLs@h>yFj?25XOgm)N?US`bFrqT^3-R#sMV~n$QpBWSobDA zm;<3I64eoEF4X)5L%v-ijs<;jg`qY6K{kTxG4T<7PDkOPG?hjjuWh{-ey3&x_=)1?wq(rd?q2!1{;{+QEU zX;_DT!M)v=p28vtmuJY!PLEEhu<@(i?+|U@0NlAw}$bvb^@t z{52?{*~nM&q)A|5(|H*3(J>*^*+{_o!dmHU-tcWsaop|*2y>ur-gisMN5DxuOUJ{D z&&OT~zQ)s#-B~hJ9ruXG)3yGkFhXseF3t*l1s=9N-AYT+vMR@Vj81cjVA02u!#!M> zh4{%fWzRC&SU37`x6?dJ>%0s5Eq%!E)nz!YXFS;FEr^+XfeeTSH$ymjmM;8;=sxkA zvlKxcEP++@*$<3C93k^UrJ3|Gq9_h|@imlQk@Jw2sK=G+QdS4?aLuai1MJ|qFSpGT z%!PT?HZ3z!E)kV6kq<7mRfWvTBRh0vm{ehG0)4_vxayU}pI(d{OyCXTn*YuUe1 z-^!_YUJE_6eLnHJU0%9}0XD*EOqsu(E6fwVD#p%x-5!2xo+kxq2Q|;zzgoiGE(zFD z^E;-_lk$7LJ)eMdtIMlgVh_tf3dV2e z9v^O7IsG4=<^8JMi$eqNl~-5%hm)!E z#jQ0H-!<%qQ-Sk^skL(AtH#S_!{+l+0b8Mu)xd{&;`5d2H4EmZ>i0I>S1aI}%Et!8 zd*hdUft(*7o>PZXQ-^ZTrv`_`-FyoRdw+q2<_py^{Z^!)J$72-|hm;md#%g>2e8l*WW*xnx^_iEEho}7}AB=o;@Xqs8>JzO`e&_Y5= z{&IWFq|n@d(oDMlY4>IzO*wl0dYY`%J){QmmZM2CUOYYcS9z>I4%7bKo>a&6Zw!-b zlGh#>fsO@4cT%R)#qgk|)$3#%yk|mNi6>_I4Kuj=YUjAgw9bYWh?XP4Up{com_}|l z@1>%loQ-D7EBbsiVs+9-TPSO|st@cEY* zGcGHk#!fOV;J9S^?b-KDaO{WMSJkjGcj;;|hib9~dlp9PR3^Dxj8&@` z{hHwa>8{?T6>QN+tumzQ8pWW;C@vGT`EBSkCq$AMd(R=(Ja^lwO ztZM8Jx8xHf6xC=o-LJSD9S9j8`8Ja>)2b+Jb=UmaMm%^E%srqVeAUu*V7o8K)-JoG zN@1)Q_(xc>=#r4IOg3jX%KH&SJ+w&YGOfF!WG17w<~m8?e+jr;GTTEgv1!g!Env8M zBFxw}YVL&8L&)N5X*7LK3rd zlvUFrFG}%@Pik~JO|CVC!mpn5C%()+()gjF3z3#}8*@H_s1z_P-Bkg6s1+}Cs7js39l4QOxH-uytdCn;zZ-+tKFah&7^@$E^XwqlKu zeYvl_>vTL+8(1S!2R(z;)zh*`g~#4c+|3Xp>{8zSU%s+${{14F%G2{{1J-T(eyk35 z^;8m)pAj6GNfOWJq;IKXt$S9B3LyohDrxI_z$7sHO5e)Y{n^-ogOPbzu7~+YCD;Y} z&C9N6#P1Ogpe{kYEtd|M$UY=RtZVfYR^r)H` z>6nD8dISFp*7uC&Dd;uEU=Y`5-(JY<-;8YSLwTk&a#Pg3qVNOI%_NN(_5aK z_6j0FP){#hk3@CirVoT2q^1#6=>E$x0;xwl zU9GTaLfq;_`z|=j&W?1Qne~0HphhE`!XL`yLY*!8I(p{nXhUe5sidx*`h7%b!x-z| z#U*eidM&$m+;+~+}~w9k^Y zj*vrCgymI&sXiN>d2r0c4_-~dOPr_6v#d=F`rinP6r;3CS$oKAp2J$xW@R9LwsUej zdjal}(Te=SR_m%XFsej9g($TV6hkA%t9mt?Rb0+L{pBpf19{{pLqy>? zp>3c$uEILYuQA{i=nE0ld%)1hj1io2O19^`G@t46NaYt6huCAmPn!m!I6K!VE^_&O zL%$TAzV+vp4wD_>(aA%5=2%&f%FX(oROTHR-@)}Uqy7+&)K{biF&{N7>SjpS|DY6)p!_ z4G+I$E+8Ngowof9_nG`#(`qmMotr}Hg^R?aJpQ|`mw>Q0ECEzLpf!QxhNZJ*KwAxC zsj^+#A^Jokwpp58u-R(|{zd1B(;s8|5-Ya;>;xG{mDQ1H(+gF?s2eLY#j0M$&ZWo6T{%Qu=47Ct8J*QK+y;%>zV)}X~TduZPud*G@?S4M|h2MZ+-FE6fxoz ziRi{yy|E(KV)YL68mYoB+F8!(QfJE8LG)uV6 z%Bte9Rb_KpjaWsvco$XfFBuE#uZY4lG245PBqH5wi22=m%~R8(RR(eV5qL-F#IVRK)LM$MB+laO zm_Eb}WHS9%0E3pih4fZt8ybU6T)b`?Dl&Z#%dtciWOV1&u%XV9O9-7(Z!|k6y4=l% zHggIpUX~p9qA>U8YcQoCF>+XkT8n(s9Tq98A#K6TAe`;JVY-r4FsW= z5{WokJ$v|?P{mO9J%F^d!MJwRfX(3WI$u`nw=g?>4L(G`>M5-4m@Le2miM~^tz#fcLNtA5NE>9UqQC)E zwY zM;HurPNY7iBSw0ck|c30-j(!yy}|=0*~UGy)XJtp@mXc9+p5AmlI#;J5l0+W{kri1 zl>~`1*X2jVnp8%|dYfVX#W+YN6Kcq|H1uT4jj39UUMAKiGV)x3$aJ8{7owx+;-}PQ zL^LxBhO4u)QzUHj<;GU7;us;gO|5xpEDR;Mx~|~tgSX+#=F^r6-FnNiUXcZwFQeyv1r#VW@;9m?XNwpfO<@4;@eY=+W2iSg}iU2`Khap4a3THm*ZI+@?GQYq>t0G&wH3VwQ z!=9-YuP9bXpehX6-|16nu7s{*Y8JXvWDzU^RHi<3J7MCL(9{vuM&P zBm(c^Lo`Fke5@6H&jN3>?eDNxm|@EZV)!^T5?s(=n>W?%uFGs{Dhc@mDMvnOdi~RR zASpzgE84#2?w@@$w3nd!gMnOe{>cCKX>Q#V`exqlsvmR?vP$|>mW5}9KA}AI&H-Q)VG4? zl6Z$>ZS_3Ed|Z>xE5L2 z@}eeLJ2+6$4`WgF1QQOQ?^&a#~BoPx@+#Z`|{dNF=JM}z*?{p_Jp)0HkqH9{}vj@(g;^*BZ=aR@2rFFb98zQbi| z;6iOT0@^QP6~%zB%RjoWdFZri)+6du#0RM<779ZmVMEnEWwG^88lsqv-MM`Dm;5N4 zQ`TeNVJtiNEId;NYd>~Rh_52*aI-tjrU1erB*Tb~FPLg^Kd)K+dc4$5z5Sp8{2!r@ zCG-hjl0x_9WWGuuw6QrIt>z$D%6I>-$zy;j(Z9$eOg~pJoC_E46I_0E#N~h0APWWl zU!g~5_(Kfe03Ms>9X=-ec0>_3$=hmx;QwRnNSNMF)rg*4I;C4l`kOm>-R(R5INPOV z_y0U|1gox^zJi<-;mGO+Ia~g){J^cE?HH2#KiIpcC|#O$U+`tywr$re+pbx*ZQHi3 zS++gPwr$(49`pOoT4%3)PVd#D_qpoPahvZ&M7|MEWah|U{{M~-`#x&Jkva|?9`ky*ZsGuQG9$|$H`(J{{I1KJnfKi@%`C% zWAJwt~8p#SRhoB-$(#MUS< z3NrZjzOnL!{9=rE@1MA_oHt2jIqs@d+EWX}J-~Ap4C+tl5-_C|3G_UMIM4_tc-8Rn zAWT}3TXUUfv_1huo)HNTYmloq=s9*^@EPn5;x{h$Yn+~8~bH!741NfBemt%R43oXeOT2hmoPMY_L$aHP*9pprDsCw+n5imiofblQAxQ(UE^p2 zyaBJm*Ayo6lQnJM57w7h@C8_INDo@g2T*qCR+&HVU)!jDoV@%^69I*uF$~QBM3E5f zz#`AUPnuZ*WcP4o@@Fn|8G3Uk=bK81YaCgLR~PESMMeVo0sLS{FiaC(V*Y`3q*bjA z_5Y?0fCPY-Hm%^>EE>&S+wtZ3xWo-z?-4(CIa2aBwKDT>6uW8k{Q+fZ<0WuE!cElw zA{7T>k?{YM+x#!4apdmzpl8mG1s2Sb-a%bG1*sw*Yf5cT? zVKBr+B~UjQ+)o}dSjFqdMm>M~et;*nGvMeX=A~nIR%K7I>i3SsulW5DW6BizgoJ>3 z7~*2x4oJ6qh(STdkv%#9?ZF5(%V!Y7Gl~v3uVT=-K|_%E^BE`*FeJnq4Eluh2Y!lU z%NL&#b+f@j8-#Y}`3-L?lg8)2Gx`7T!jeG1|B^D!%$IQFFDl^pCbbzR2AW4l?erQP z39&x^mhGG-eiI4MfM=&i$<}Bxa6MhnFQslDko|cg*e9sH3jMF|-J>ZL@ufZ}SGxiQ zHT*B?QNJ+sF*h$VM6%_V~$$!r9_W{4yctQ7+!qFJ&3 zAs5Tr{_1h;&jLbg4pJBA9i9#Hd^+85%SgS*%erMcchcT-tvN#Tx-J8J$Z1*Ue&6)8 zzxufK^Gg_rR`|<8y5fK@@|dw-ha#S9R#zG$>g>s>!6KoeB%PBi>>1zRXES`m^*|De^zn?zYZO^^c}Y z1R%DU4G8xaYXtxR02C3ouyIXA=2?RT3o>fa{PSy6R!;XctNcM`?@~9ZJffelWC{v# zmk;;jDykh489WJ)4Mf^7c~K-d2?GHC!9E%X|DE+F495_clFaOsC&A;$+sSoi- zI*K50^a<)-hmgLJUA+h)aD`WDv9cl@=GCfD8%gCc5)y z%x^R7|49-8Bz|KW$>{-Lh>OYmj3Oc3f#wIm5Ems7?-SG^7M}+G*8vA${S6_J#Q22% z^@t0hZD+UNA7SJe!i(BPXwnfkT zQ&_%8p#JorRK8D8cbfU2-|x>HWdssMLb{Qt{VRV?yqe=*6)KsqkkRxam z3F$8OpPq;@sQ+&V!879G;@2uJHR%5HpRt60H*SQ65R=V6h$Z#k%1DnVjEx>&4BjEX zl=mB|-;l+JzfJ%#`*|64AO%KDtJvJnBg7Wj=Ve-6HQ4FdBiL zb^$*L8fjHA-9jWJaoeS+6c^gzD$??}(kT0cn<%I%mB>pk1T} zNgTM7(ek9&eC(Zzm@~La+dXgdrxc!3z!eA_{)f6vg8XuFg6WDI*U24F4}44M!Cy?u zc&b)s=hCbNu=YZd-}LKcZ6*5oL&S@s3I2INv>gZOUnL~(h~Jr@a(K3o{t*K@g14vc zx9^ADyt>jsD$0-SB}Ij_`mo(U*!h3VE^hPYU}2@=wyP6nVpK_QNk6qF^0xDvYw z*giR%Q9rQ9FN7kw)4xI^|JoW-qj8iCnKD|=%$6)mJBBor9T>$!QB-0#o+XE4di4qE zA&E@?wUh!-__+}}?F0~GLb_sx^l?a8G|9{rd>|o6At5nV{#(`VMj*rvGRF1_iIS>d z>M;lJ(HC6v45a(d%Dr+)c(ow-4`TJFf#P8TqMA?s@LJ0IkB-vf62WVKz5tWpvEN** z;m-^wk=iBDN$cY`rVR?L5Jo~1-P^*eqMO)u^r&Ze^+Fbu__IR&Ry4zb5r+S|3L%l^ zCtmHH@hJHHO@a{}*^lcz!cbpSkj8^`OmY4hC@(d{JPLe;cO@WwHxyR2WSBB<%CP_? zA6jeu0r#9M;TR7{hbP@6N8y$nF+k<=jf>Hjh%sw-Rx^h;W!ECt#1AIR10K|}YFTI{sEjE#|Rdp=+NLq=c0Shew+w7SIf4Q0GX9ePKY@i9z@XBzKZ9%?um5@$v7`@XIH}kR3+33W@|4# z^2*kS-;>VoXOKo46`-fdX0A8C$;kjzvW__SU)Wh9;het9tIXvP=ICS}!$g?x?khx{ z+Uz+wm^eCiu)FTd`Zi0)ERt`@sT4TLm3eCnqeP=VC!$Lb4k|E7>-tY=gz>s$-qbvM zqSpWAS}~r9U5!>VD1S7Y)a#Z+{9uhmf0h?-$fV)QB0_U3$e*tBfvPrR78jHpG6eO7 zBr!y(`%g;AM2PUuistCD!z@)W^|mq=^k*{@EtUUsaflrV3F*9CiyGz0t$aj91hd4IY?|Nr;z z@Am)M^Y<@=b23>`eW6smVtD;sro{c*XsKa85WvyccZk3dAA&JAtMxcFZF*lG1Gi%) z0jc!%reC_T)OMF2ojZd9D#QGfwwGdv(41hTuN!5vxd}`J7I(|~Jr)X!mAQNF%F=O= zou&xd?vO~bU9*Be$(GR_8Wv)2YuKTPNF+@kmiUc>yM0OE?AS(+mm5$TlJ`ud7oIBQ zt#6c%SXMr7f(9Afy5d?`8H+vq{&9VCH=)!W|Cjtdz`o-VbG%Jb zsI*=8pPN!P`^%b?NWeJ;DV+IO4ukt2)LP;~jo~5Aqp-WABh@=w_7J5om{e$Mzb7Uj zH_2-us${SFO2lIfLHvXKjJ9`*xSEwgjdX*P5Q& z3P*Ff!oS@Kfq?^kLV$J*i?6hvPaYz=7^;2o;E6Xg5&)nS9~oz{u1mL*h1Vvh75}Ua zzeDY|-R)XYia?WFT!9%HOj1h1gKRyY_DzN>N!Xb`bGToq9*8k?t>xOX)qD zHA$$TtbPZJo5v7gcZHndbdKLbHck^P?TifLC`xoE*rk8}T zj4nb1zq1_zx64&{QX8Fy73(^lj4;-*(mEXM8w`EUd6aieR0<-GIYx}C6Dg71lK{Vz z&~u$18^jqx{jvRN3GrwKQ_P5m$ql`K%9kvbMO|@nm_%1kXq0z(v%VPGQ-G^(-kf3K zx{%l3Z0bUr-(eO6H}+zZjzhi+t>VhGxU!C4*J5&W&N|R_4-?6;x@(qAm~eG2_OfE2 z>rrPDZj5^;%<`_T{Z3qzYTZZc4!5n;T9z2m@VoaepO_QIz!RCx+b|_3>bFXvV}(oG zfFze)+j@KlBvrQms85;95dEVA`5J;!WS#v<9s-(-NEmNbFG^i123E%1*EuYJt$NU3 zUUN+?NG5aM+5wKI6{m!M%F$j#1S8XL6DI=+ls`}v&zQW$t5$9$#EF?^+Ty+Flz(6) zH)deWm)p8KPu8OK-Y3>@#?PN4W(@C^qGsEgjWGs9wZL@{#-YyDwuO!(oH`Fb_&7og z6Gp?&0&ka+H7%D2)_bmHl|6Lv4c-9=sr$d+i!$)gQA_m6+jM2=<=2 zE`&lW^o&&ZF@AKq(jxOJahrhDcp?pAeVB_ z^j?n=0YXLtR<9g*Q4MeNvzMfa7_44knNT=n$H%@~VW3L5R}v?K7npVgK6P0S%0R?<7;JIJE6Qj zLBbwaI}Q4)mD%DZXszV zXj5@T$gk3~Mpr1qT`-SfNlE#Hi_V~o=%-GJ!@ zbg>urj2st0x&>lHsL!cO2nBzsQ@3UG^KQFns$X0^k8kY+Zwc~N@2gl0JgSl0ps?1jX7B@yNpW3>{~km!8jLhSHaqirldbqUAf_}%zbwFOPW*3en5OJH+wd`AZOsFxXdId1fRLy-(kl1nPgMFTVi89ZB=h zfr0IR{lAo#4mIM=lYWPNy9h)B%--Wr?8_4WU3TdmW-(m=ajb7$3)hT@5W*42>)hPS z`QMh8-l$CoVo);8>((tKktsd3mVYLu1mAyYFF!ats+78KQ+xg^d+9A8&T{@6lKa23 zmzO*K%^U4TlrO5V{@Z`(rO(H|k(Z=atykaB{^&c49^rmj(-@!{Vd3_J4YP9|b!7A< zVahJ3_DWUae%^95Y|G9XJEl+};q?Q_I=5@TatRB!2j-M15ZSClFv_e~`YdCW~$=JCs?bY#z@H8zyryIr?&5zgYH0V4w!P<`9)Qj0KY5JqpH zhg_I-OVCm>67H5qOEd*fARG%O#Y3=UFk#?k;^%z=^uNnTwwX;PmXB3c6uC1mZJQIBooNlurau|$dQ4H&)_z>u&+&2LY)#tHSHFw3sWUA>GMao6%ho7-wS79azc1q6peY7K z;>JJ}(r#o?2?_0og;Rs51l|&s9)vWt*^$wcn?sy4zlDoMv*|3 zb^skO$Ax0B`#Kln+zWUyLLnf4TI0@Sne_?)-*Xj|wduxA9J?!v{9Ip|+9aD87w?X6 zC=t{g1hCFr&Go+^%s92HE=XW!DwbAvPc4{8I6OAYqf#YF#MTSfU>jm7O3S*)EvkpvD3gYC@i*KBLZMWWg^zs%_Xgi z(w`>gb{bc`W8A=No19RZJ|eN~spPq4wgSY8z82Kg^<=|CowTKt!drbq-#!S!u9dL= z6Ja{U5>L0D&3JJ;|2W&)>J{8Od#00HZwWj=%I#SvX}4qQw(fr*GL?wP1SnQ^c$x;Et~%s7=9 zBs((u0vU$wqOAyQ;#P9?GFJH0h9Y_51_}X-&eTcD4|8 z;aAYkykZTftc2%_Wg^uzAA325^nb=c?KBaHWU;zXZ|b$QK_aPfJ07Bze@nNr1jm`) zazs*70F7^!0jPFg>e4V_ATmB<<$-M`OFXCEL-N|LEl5F2^mV6w)bGh& z_gRPTtMuP5=*gAv9^5EaSy){Y6=W10}T;QLacK@{`xg~tL2>pdr+_d@eByRV(QF9h{pty zlL?RHnj$JQG(E<+Xz?Bl@v%d@12jnl&<~r`yqY5$_(kvaT3>2%8F@()tgrP`Cz2m; zr<%J~qXr4nTS28))Hg2CR0o)`D^t$W%ilk{VUFTS;;nG(8riGc-yB~y8w8=MC4Q~6 z7`u!mT;&8Ziio6m7NNQ5iLwSuq{cSVMHO3fm!toeP)+f2_f0rFa4bn45&eKC^uSg? zoNfIXuvNx2#6qUSC{B(+f^$2msJN@LPoBv+PZ-a{G4PN`vz|Jv$E`^cVl9(09q~zK z>8m2As(TC{4CPes^Zv(LB5dw7ca|<1-|;;ZgoBAyr&*J4JSI|y0#s2*g-!0o-3kJ< zYqeBc0KHVlT1O|5n=Jm}1C%1gmcdqwTwI|W-A=nkS2rA`5jdW##WF5tOga7g`LCi< z#kduBbg$h~xuA5;U^elmVYi#RY$G9#3|2>)yFxCd-fih(7vB-;XByQ7 z{=S!rneAu#F*V}e8SuF}@jpX++a>ckAhZM%Y~c+*B}Da|%cf9^@>arJ=k^Xa@ZM0; z5d`N>*$%L{pQIaL?=)E_zp7uWiES_3`NirGd76C2%SU)*W%O9+x+HyYcdA36d{hUa zAM(C99$Oq8kqt%bZ4RO>0_lTqP>+SfYCKF}Lg*wcVg~1p#U&a#ix+RT*%tz#T^^P9 z&fekXStBxaW-<7ZT1=CNpU+?jfO$X)OLovAlLjA1Jv@a_cZ4ZA4#Wly&MT3C-qlg# zfblFbBloq#h3@d55@{K?Tyh>lfL6H=3~^X1*Y(yWJ<*D--7hM4)kAL<)J)L0t}Lo5 zTxL45;QNkXSD{|p)NFZ=obAOB@B}E!PM_zCrG!d9JaEJKYj*14zE~m}k(g6qkTqsW z_@>M!-p)rq^p%8ASUOQ68}Uo6K30^DQ2e16@Q*`s%+d@JzFW4%_U=N)YGj zg#|H(GKF^;2Qm)IjypO))IS1u3$whTW1odfKO|C>Q zx5q>VoHV~GvOqUu%Ex1f2IiJcZN%va*W6N|YHSR}SItAhU_;!(6&UqW3%y>nz%PWG zr(2TF+MdIw*;GZuIlrcEz&|*lhbYJ+JkL?@`e}R zJA^Ao$(>CqPcNC16u5`!mHq=&%;QK*re<*K5%F$*w66?ZLvOSSpn!9iuWW4lQEgG= z_^jAAr)uu?V!J$Tc~Owh8ueWz@Tux+4ZnM>NOxE18<_F~yW<0E>|3V!-9pj3N$0as z>{2a}&!XqD5PeZtZc%bN;TQU}_NVgTqe4u@(`?t%BL45(p5H_77SZo!$&U)YO?rG5 zO^@=gZ)N&&i;}v$^0}nk#rG?cgZImPDs(>Ombxmi?`kB|YgOLLnoqNQyUO3dsjuzR z&1IjBnuXoVUGHWcXQGdfy_UvTG_USE)e-ev4-r#;p{)K4?$3x2wa3uSz3`S053YqvgYWN-1$3uW(S+iN%X=2$BgI9x}c3ONnY7+($6(QI>) zzcmn{*^rB=bYXKjwY7ojIbO{9WS(kkj zGm;s2-$7CpE!n=2zuz&0e~Lh}s%nUm?;b8;fHv0US|VK| zy0p$Qzaw7|YO5^a;X7-vC7D`=3pGiyymE!{EYP&jE2**qxM#$F%Tqw#+H)VXeN~+1 z6mMnTAqonnTfBaiL*UOpFVOUSuYRG}FW;V`JbqGN?!Pf@0W$xN6~fln0jMRAZ2e-; zItJg1AvARYx{>>l7GCh;cyoa+5|UaDK`ZU{ylcVSUr}v{kogi~Sjc9WxD~br^I3)l z^7|`nnxRINlWQADC;XustZ%mo4c;)s_xG z$u%i=wF*!gBNw4>ov+p&tTMogJWexSr6j>8Gxmm%<;8v|9gM8qGE?Tz4_IrLb9BA^ zUrg`u4_nBs>2byl2;$X^ZgYY#yh!Mkhy3_t&ypP zg)s?N^npOHiu~)2di-Z7%HMo>+#8cG@RP=nVCzt7O>>-9wgJp^O1e&fj@Tu16VG*x z<6uANBpTMh**rw!oGu{&1o0Cr&pzCkDZQUCe+0Qk}!od&Cnw5`Jz}G0q0DpabMDf8DnY*5>EHa zYNy}0^yYS#Y`dM`)KL^J;cx?jLCJ(}6s`8^UOgaeM58WM8$Srtx9<^>j$EjrQq+uBcO(}lae30O_ShnNd%s6-npQ&>K z9Sn}Usz%OD4+akJo7=$h`G@(&w|UNu!j=jP&&YUwMe&ylhl0`M(<{2er?zsQ>XlMg+9fVEruD5TJ?9ukDWhN-mL0k2 z)M3_du#m)~5DKF7dmH}g$gS3FdcvqO$Rt=J{gr00E1H(5?5JVe z470<9dS9-JJOr3jT0VQ~0Xy6I$HCAY{>qF}lUS+vV(2vw*f`CndWIvQ1R_tH!#RG{ zO&7n3J=AlWY3y-?)1yt7mqY}XsCuDL3C*^9c<8hYE4+K4MlGQW`A1U%?LW7+Ee7(N2Z|0XR4dz9_KQ-2`jUiEOnKp&1}u6DaIutUa3l{(WP+T^ zkOm!Y@4|NUvs1#Sj8bHp)%g51`HhtZNd5cZh$_T!NEqT9tuonuLeOLGg>iyw4URK zfjD@>k&o!ltjw${MQ3dhzV)LkSUvcKcS+ZU1@VB81^8H5GHBrvzH0H)G?m2M2SQ&G ztQ@P!Z^%PuNb-GjoFrn)9he(Gr%Hxh{WB*WbhI)<=j3KG=+Oh8iL)u!-(~Wd$(yX= zRwF@!Hl;O5*R$#aRLo-fM=qghY(c*J=}~ztfm~kl*pYm~lZNCi5kZ<@x$tKXfV@e+ zeI^KlG7v@rR-x5%98D_6iW|~|+s(Zv>>};YE17;Lgn=VhgWYR%DY|gn zpCGqXbv|_rMkIlvq-emfYWCu4&OlFMw5c6eFVehta`{_-)jfW|su99ec3t6!;s}YH zOAM<(n~q!9j8b>at6SDCZAzSLPIzEH*ez!oazClJgyc;jr8F3=1XfWpp)`&aio0AJ zyHgJAt932c=bp0FGKXjQ+E!NP38CIwUl)noieM+Pen<;Y*xLD^D((mOmXr+d#wC7> zS8GcV*?EdYNFG&^8zf^U>QO3+>WPgj<)L&xP>Y}Lu!CJ=oery}AO!k8K;gl{# zT-x{!`m9)iJYkR_t3hLi;HZpj{2(`&Ozw*4^5Oi&Ghm4D~D)t=m+)y}$Wa#&A7eT@ukeA#FO82jO zkBGp54LAhN;{@8(e&{*KYv?r4v*4?mA!?wnL^ssIlGqK>EPq)0C?d9+NU-o1>ZfYI%%eAQ1vT}*b-*H-HeVYx{Vj7XwHr5aRW(7U~Sn@{*d`-nV_dWMa7 z&lk7WZ6E>7VvJY?Z0L|{`|h>0qTR;$uA6W#OtNj(-=YxJ-9QO5Z+I)EkaN}`r$C*t zcnpz8o1Y9#1fqe1L-!`a*117YU&3K#D>Zj9CnIWPWvD`bTK^bSwh1Pzs=DS$Ocw%Y zIJ|4jD)kwsJl0 zGNTgp&Ekw~i@MeUw?whmo@C^(Pm)qin_6cS2*WkN#+;ZzmTJ$AnTZuP(7at3SPT!) zs#VVTqj)7h?d7xk={~CkUDWp>9RMTpE-EPl?y=nmL6d+kVP##%@ryk-p9=!Qz|VLJ ze0Nr?WvCQc$#1^vot0mhrY2PL0M!ZwHhVm79>?6R303 znkQ81+Ea?Hilw$jSC(kAGNUlH!CSyBTyCU;isEz`Puz-t;syeunjo((A2WhK+oEjAH%OKifJ!MW5KpfM}a#iuJw$C ziP*laCWNT&_lQ7YEk)wnK?xBY=CIO(aE2>Ms*6}JQJyhvPvZa`NTg9Aa`zC62pp1l z8q`nPr%3VPoRhFpnoLw&cUm6@Ik`2#I`iK^>BDZQ%+AV#4sd32P6^VqP!S48nZQ{I(}Z_#+MW2VAdh3l5Zrd*iFc z!BdzSADN{-u^{S}6>rI4>G-$e45|RZs!Z*0kHev5M=0^Yo@rb=xUuGx8eQ)N zxk_4Aj`2-9TVKf5uPAGm2CY_vqW~5~fXTP;zc>@euHO-atqgm7utq2s(c(Yb{1wCm zhezx#U?iusIFb5az==Z{s1m6nhu1l-a&^^Svq7p8!g_!8eq5_ph8AScqI7mYA1_VU z%Lf}-+(6_p63Mf8EJ|}Foz_gaUkxZ=#V*uitoI-^g6G?$?e2o3T=~A(O|TEazY=XR zB?&kEQeoPRHiZT#+PLS-eP~yG%aMXARljeG5l6|3hkTUwX>?I(pBUKRdP0a3#q; zw3U8vGWinJCS*wVPZ>N1nzN%tRqJy43JGUIoBNaBzSE1V_iF=+q4(*>;fvJFo?H+lqt2aVwi*lT1QsNU?@( zFR25HlS;94+{HWu#hAFxKro!ZBld>%|tvx?xG<#y%-}9iI5=e z7n+DRoEM&*(e;@X4))F{-FiK}Nq)I+L$K0bc~cl^3#b`lqS&UpvIiG#TXNMmZkw)zBmeX$2wUn#lz6 z1+a;s^Y9g}90>Xg1~}tpZ2jhUI=Ov8gG+dQ=S!g~T*;;V1Hjddkg|yaX?P!EXHI$< zN*mRL!l4dL-3%MrrV}YE1g5$x+mzlHk76Ydf>671yhN%7Bfo(goQt|V!2%LO1)88Wa1-h}ts z8L$@NCtpze(1M8>Ntkv(#3tnTA~LM3B`lo@EpGhtE=$(s3uzZH+vQJtS_bkTUnPwt z^&jun`CE*?ED#OR!Pg>>MB)PMXX%2QswCu2)bq6zj5AIch}L7A?!jp;=d(1RbJ7}` zJL!f~x1Wp3;5W>q)vs$#+;K@>%xPu~?rwDNNTQ+NaCt?vr0d9llPr**LDN1cP+vP> zP#n>i)GV)K4-DojR~q@HJ^eUO5WO56BoRLpggI*!Px0UF!xRDOSI7i)6P9bnV`GPfD{4J5#`a61m)qJF48w2SZQ^1Ee*`8 zwX4ibOVti7gTl37K3;j1#05%cCTxSV4qh?%oc?m-r2G6K`g^DP9QPZ6xbIbPsdG;= zz(D@}yn2Mek7Th-2x)fG{BEY2$g*SN@!^Z=I!VR8xgI8vNYoBA{Iy>iy(Cr?sh0zDY|;w8*RrMFr>))# zgTyRERmeUK1+p*TF*NvBTjG%N-u=+e8`ot!R#U@pTrG5c7?Vz^QZ00#uv&c4=8TqU zGz<;f6b9E(!Ecz{g@S&oI~Ht!z0cT;z4BiXeZI{QH82UtVvYmywE>Sr*y6V=^w983 zJ>%OMwQz`3bK=OBu`;CG+tCD=hEMMPj(!rjNP z*7!N7vNfSlleJ~yFf;xTW!O{_Bxp=IE0Z-YE558nidp+9WEFctl9&b|{-8lKyKM%) zQA-iVVFG?HksJqxGpO#a0u2oB@>TQKUdQ`)bopK&hHy=JB^hzaDn5wn#IA`*v~*;; zpeP`GONsN=?KLipo&f*YkmF&jjZ&sGix+#V4*S1bfF-vS6C3T$-gM9oV&WH)beu|;3!7S_lsILW+n@$wLu`lKPDQNYMU%l&| zHtN)U#An3=Q<^{CYI;6lbDrxlJcHH*2!B|wihGo4Hi@{IU)?(P-pRuF30=olNdngqr;V>x6jT?lg#G}@^N5Yg6y)k;t9NX(*CMJK|da)LT zZp%Kr1o%X~NKltQ#_qnsI;COJai7Zob8UcLr{R{0m%mza7f`I#;}#Xp9#IsDyu6`5 zz@XKAJWn`g*u;uQf*6a*1W$AXj#44tdYDcP!4&OY_qo^71F52Y5u;Dc_4rIksaLHFDyYgXCC-=0JQgGceL&aAa`f^=Ggl??kC8!2n`gSE7IX z^hmUg4T600Ptubc)E5#@mp>l6#8txL2?J{$I-*aiO@|jdwm&;Bz(j8D!CNdB{5tFo zWA^+}lP3{W|3f{TcNiw}I-1uABYrfAk#Fw|Mht5g>+W}8N?p|Sfyd~DmH9UyKRW|; z+g#YzL3e+i&vCMnKwHz(j$`TGHqtCEl#^XmL3*)aR5S$?++BK87vBpeU};HgO&#g} zWEqE#2HykXN>E^q@WSciIDVt^sv+A?Luv^kln;ypjg|m#M$iaLAMban>fz$XSw9FO z!dAOJJ8jLQt5!?=DrMK4JR2<`6$XOjD!Zmo=k^!h!u~i)h9qnLX%5d_td`ELJL|5g zZ~ERy8p@QBMHR`23TPC2f=Qv;#*U6|nxz1-5p(-Osx0l2URG0jq{|Lfvi-FBjGi=U zzm2yPPQ!?gBE_+ixi>OYf5G`=t5fC_Vcim@2c@?M*-PY#pn3TE8Z{hI-!2_dZC+5q zJ!7!+H9A%$cJ?`_L>aj7e)$<{Dd|fdfN21FFY{iSL z!QtUreuUa`@LABwuCO1qQ`N^TL~*&B56*9OG5~$#ee?GI-P)*rIICHC5Z}ImPIZ$V z<2FSd8_XAulzBa|L+Q1haTj@xCS#ydwTTV5_iDp=y>}M{yUty5@Y@o>5x+zB;w1xp z=(u-V;r4iv4H{g)HyEi&Pox#$O{_-y3-_gnH+yDbW4VN97%lgn4>MtRt=W= ztW$<65lp75)yah-rpet%t_o7AK8549rcvJ;T8+}@62`{KBTw&?^VM?aXXr!?BRAl8 zZu%)eTh749)dwj51a5{wq(q`8Dm4a?tCo-H2V9^`@BgI|Ki2%yDE0*&;4G&!d!Hs+ z{BRvdf|gW*SpNowOcu=#gD=}^O-fb7YI$8G?^j%ZC-Y)nJjhyu{TTPNvzk*H!y&v< zs36zdAzvWD{N2G;)oSh;L{LJhSK|+J+Gvq?o$bU85Vxh!GDf+Ztz`VKXdLzxMX_P7 z7sJJc?c;30kN$YeRh<@W=VC{|w9D-xx)PK3K)@?sxrK4$*0KG7X;RFfeKhMdYVybA zS3L6ubp~hmRghZPn(3>BDzX|iq69A0rIrs~D*02F_v8I<#5B_?FXpyp8BqZbd=*}g zXv4|zYMO*7#!js@(_6wCIFq>wVaFp`5j>NTj_bOwCRPm4Q=Hh$ZozHbRz~6y>BZIv zfz(2YRP8!>{%*Z=Glaq?Xw0Pj5d2i_QG(4kb`5t`y6*vPj2@QhEo^nSyxHKaOWdQdDVBq}-NmIi<3>a8v9t1u z{g(GdjbS{U#8{t-Of4eFxa_XpR34tf)a`-1&TqSpF27_I#N8M#bX!!3GqW2(k^H4( z?#Eq|FvW26jG5dx#L~55cJs=JRKlWno4xZsIlc1OnLbB2v(L7eZ&SU)tBW0&PiVWC z#}E5x@Q@Ftg_DRj{d2CT<${J{i5IoCLepHu$;Mn_CA~}1vYfY#UXJQ(od`!5OrraT znsyq>v021#-#d|?Aqkn{{QK&q1uDLix%*tOW`(jeLVirT1)^hfD%BeN{-Q-#4}sn5 zHBWOr_rM3AC8zMMl9279LQi^02ZGniStNrd{-*&u7Ty`#MyEz7IrGITsP>k<$~FAc zM#d?qdC3W;D1yZojnGP5Bs%Kot&te2NcbXwhsiI5{v50Zxs+rh8J0C4xyJ(^M7ilC zBEwP8*50KtAWFz_n&la_tbof8Xcs>MGtQgXcPKF{{KAQ8b@X?3>X$mIbPVB+R(9Jr zd6KsKFA)Gy(WOtGfehIE4zwY>uF72qmss`|p;*tLIr5mbF9Q|V%3Gs0ek&2@E(8@F zn^i2Gpr`l?hN1V=3@(HrDAJmp0fZ-Sq3|SrRTxabpOIbS5d!H8tV82?;1{Rv`_ymw z_E^Z3i@Gr_Eb<@|yTcH-5`V!&SAwu-G-}DvR)LaW4lf#^!)aP-xbC@e(_sZ9mt13eMy-aYS|CV0brauHhWIHaZ303u zG^+Dvc^K}@7fx_Z20eqr6nk$E58l-^+qp-ls_5akBM!r!{3aYD?zPt?Q88*AQSKf# zHxV2IQOgCsT^ArKYl#Y)2HeN|!dtpv_Jw;tsLj~`vjZf^$0?WK8(uFA-+pHx;vHx+hSG&u3|QAI zxi~qhv_Ns%e$X2c}BAx+n4(_f?MMXHZIW)I6l3;am4gTk?O$yos7r{qpw8j?s#v;Y>K4M|<5}sioHGJ}?39tSO8`dEz2WFP)kWYgAoz9z)AKsiVh?JVB zaD4h)6!_j>l8v)>lK!!<`nx6T`U!{WzLCL{^N*ifhnpSigDBFq851{3P9~e8a1r%E z#HA=!_laR_X%6_1Yp*eDN;d$FNqBpw03-}m)*JE9Iw#dl^)d9)&sb(zn5VLjkSOe} z46qXr(8J)|4-mMWG>+SWy~`kGy-S|BugE~8fjjui=Icb%<{UncoeQ{KU0@eXJ8I$I z%)3?3RQ^SpO|)H^2xE6Z?jugW76p(NiL1{l=lIq3Y7^X|so z3ox)YtL&04#;(#b6v*Emv9z%b>+>|MfSwCGV4S&Ll=@7H3ZZlKNBCwo9*{Jr-0Qj1 zTPx%yRy5>B&L}pJwF(P*#5qWN3@f-Kf$#d%;FwBjhxDyTs~6U}p)!>F_E(Q)Y6toV zBc-Y`rhQB4YpJdByM|^2%lH#XbJ07$AFic#4C8)ZT^t7d64TAJ{`e+?B3`aefBh|& zRS}!LA%|aDzS293z1v<&r8U2L20HP>YZOM8Cv;ov75QLM;dzUs>#+bEh+FVRCk^h{ z`$u;hFI_3PB6&q{^}qraA5q?JK@Qi0nS*Ch6{lw5kNsUB?(C>D!6hQ`)!;JMTG`)S5~vq zL@!l_N_{tTZ(|#JWu3iEC7nY$3e2EaKldqUVu5cFOEtm_WnV z4DG|!pm_tZvwNn=W12wx8sNjRw8e2cQy5DeC}sy-_&xUy_XEEd`xuB+MFBVu;{{5? zHd){z;5{P0gp!Iq+4^Z)U%zOh1XJ(5-haUb zOL!KnPP7Z7lrMr!bKE9pz;L#9c6$}Yv=>j@!{#iG@tTAi>rXiG%e!68t>bU@&iqhY=mbW$qvJl7Ge?ME=E_x2e`v-X?=7X2k|$iu+7tQLQXZE<5kX$d9Gv@9=8$D;8jEn+Q#LVMp3bCJj2KDS{Rt)y z=J;Ca;83=+xxnXw=lfk264pM@X%_Q<_(HB8;lL4VqjrG=%V`y#*|_diz>RT>`!@mo z{ZSrtV$)fy;z3mmq2PD&2lq4(I!stjd~UtNPi+a)TnH)IEe`a8*i{TECQi~kEbLhF zC1McBHX<{)63=&~nEf`4;iYnq({x93hk$SJ6*6HsPXrNPuj(UZLIMu3107B6hix3w zm0hL^vqr^392!2+-Y`PFE{{O^qK;g?uKJzJ7f<1+0#=-{#HKD=+MAKEsf>d!MY|^= z41k8qE<-%e+0J8-v3(uS%7}pxkP6(t{&y=8Z&SZXAQRvHpMfI!H|PaFSyq^>u)05j*tWmXmvuY2R5G z{B--f${oM9e)f-H$(uKWiUa(%W4^=*t(b^i{j{VGA=PL7_pEV>Bumx<;DiWnyiSIV zXXJ#lqtSEmEBkF}+GYv0?3Qoz6iRW!u$_h8knyIZ{p(Dm za{*?!0C8az4@ZXBUL4wVI(|X_dXEY~9WFfgU@M0?DHcZog4wP6z|kn442}_JEB|lS zBs{uIUY;aKwMV6-lqx&jn7i+jA;KuGlb`@ZxbS!eJY%+H4`C`;o|yj~o~*#WiVYK% Nad;VI1b98m|JjCFdQAWT literal 0 HcmV?d00001 diff --git a/interface/icon/Interface-beta.ico b/interface/icon/Interface-beta.ico new file mode 100644 index 0000000000000000000000000000000000000000..4d59dab12ed0b5febd1aebc06fc3a121d1d98dab GIT binary patch literal 370070 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 literal 0 HcmV?d00001 diff --git a/interface/icon/Interface.icns b/interface/icon/Interface.icns new file mode 100644 index 0000000000000000000000000000000000000000..d62e6127a059fa67b68c7512c9f90ef94b6a6b6a GIT binary patch literal 126362 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 %0H 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

l_b)0tLpdugOUtVRg3PJ*Jge*REUiFnZ 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 fKZyY#pNa;Ca$)9>3M1?EXp0Bb)wC?FK(0%tECI z=J&hZNi{l1>}{^&zQgGAOHdyWjsKaxSEn zlMmOJ8B|<^H+t>|m6psVb9BY~p9fLDA0iNaZkQvC}NczkJxki2dRHQLBK@=B-MA`rQ`_xn9smGRUrq78=u zWf$PpBqXO7C_3JQg~mMPo%v&}_Q2DIOV{icdj`(-DP5%-P4Z5VyjYseZ5Q8G_41Wq zY<&wMpEPWRx<61LV`l4z2dYe$~ z>+j-zzk1m7w;^F}lo%52ZG}lY2(EzI{F zz>Zcb#&M8f=Odg_E{E`oqmC+4_fV$HH)6GeImnK(zr&3?GrB+COw{&Uc6_%^3^|e~zLVtH(90}F znN(PFJWy8ZSmj8P4wy6G^^M^irM-YN$x9H-e~bAtb*sqG3_5*H^m|*nv@%kB*^!xP2kE1EfTj7oygonZThTrSC){rN&C75Q)~LUfiu!-MTKYo zfDT+s26c)vbJfndawK+{nVjSJEakQK+#ZAxf(4l>IO?H#0yULgTPxtKKJnc&h3K_w zqFH(f4K@@}iZfqJWDdmb6JK-vMiqsxVI1%VWSVJZq1-C7n`5B#-k;O_WyOURevW-M&C+C*NbgEm562nId3iISWZg`AgG2m zfVnu|hKKM5T1=r$>MPRe)1;IbJ6Jw9%JvzQ;kX=S@HfaINa>ojyJ24lLXa=-e7Cwk z`&fe-m{>Y&Z+)m_WR_eXZnEHV?>B0=qn5_!c-|VeKY7q!{cdoqFd;1eLq<}bIHf<6 zKS8Kp-`O0jUScT(U|=emQs(~V>v-HmF)3pw;9rh_utp!@OD8v&)&x3CrSzFNU)+o8;;EzR)j%V>}ctcbzO?8 z>MxuVe=oOu_vXgEL;?+9Nx+wjUqD~)m-6QPidj>DRdf#pg*v!+FffyT-DwND@L@e( zEpJpHYby7wCPyW7#{Q)e5H&g-^o?Bfc)5U+%$iM|2s_sIOe4wnGLgy_IQSeR2P?vp zsAOJA8k=WJlI~;NS8AV+?Lr!>Ts-uNEwh6q}081 zrOykKZ7V#c67KB&rV1ADLWTX({~(9ubeinQCdzd=gILDTJ?4ngWypqIc>ZL#T8LfW z>);(fEdNKD3hl_{81ZF#j%Z*4JklMQ5n6Kbq_B@f7t3nVoGFiQJ{2t=r0vI zY3Pm;i~{NtEzLIM5>>Z}GWje_WbxoDl8LIujv{e<-&`J>u}>Af990`e^!-yItlF0z zI0z00rqM?!dO4r-fijo41+Qq9; zaF?`X919ViL7WfVNwg4RU2u+QO37wrfb!UqYe)2)8oMA1nkjv8fgaM$D(P%SZDCzF zuP4@Z3f+{vb!+s};;n&E^XBwOUIHCxMbb(y)sKQP;-q2b3G!g~pzGS^dZxn$G|16p z$A-f%5AZvm;GS4QnWgI;uKb6dscR}^0X)KfS;}yRbO?H}sZ;Ua2*&t7mFtJbC68IHH1vU!2E-dB_mg{AoW5ls)wJ{CJx$;h@R zD$*oTbMuawKA-qlR*g%bse;D$g>LE}!|nmk8)V(dXtTr%U*@;m4BS25V1&HIBZJD+ zA%>RevY$UE7X;CvFQKV|$UL}YIcsSx69Np35!9>>OAuTNrSI7W1&v60y0dZmFIvYd76{Y|YuLlYENGX0pfQkd@EyMA)3>TIK4w_2 zJ&iSjP9lE0f!`y%02qACPk0fx(Vlj{a!%(Ku6;H#`7}Z06a)`DtP;K|IY@lRIw9aR zA5eyt5ZpAv^Hy~{X#R{8**NoU1EY8}6>O25wt}@!|91f@C0+54vvp6OPnRc#RDYO> z9^el5|66>(#1@46MmL}xN6AYYlB{`{J|KH`kN6WJ7P*b!oc|T>bVY%jZ^0KW$K`kI z(*361_Qa`g;cT?4pD;s9u3EKV1Or-r-S7)Mr5EcvVA7|_|8}h-dUt_in-hpQk@!I( zzhXWE6Om16&DlD85k#Y}S+31CnWdtBhoKIsIgzj->KH5;iZqHz>DP}E?RTI8`Zi}N zauF)IS#zo6kI3rrCOxVNk}!)duM6(whZqgSO6TqX2?Kp8_r=BnEAKU58X-?vlyG!okboW_8p%geqI&OLR`0zxqRjs{`*wiEBN|Bn1c?3odxk&&@9pl)H#<8! zyX$aNI7T=K6^+cqZ$ybeHL^~K2t>CH( zfNNM2j2TuBRTas~xgB0xH3!CC)dudHTfz0u0dV~^0IrAp;C#^s&Tbz#H~GMM$Oq1g zUT~rpsqjJ>)I-0u&9>pKB( zJ?sak*9XpZK5!oMLUp*m-0qJ(u>Z!g55h+D_`rG82hKHqa5hTYaAzC1-!&J;jY}re znJ~K24^C|lG|CEX;I8z8Ygi+U>BaYXFwT%%zb63Br~Tku;{)fp41IXC1**f!6=?zb zo0Be#T^<+G<;`&M_hP>j_YnRAJ%{d17e7xvE4hC`<@SN|v>%)+0^q6-g6jwEVBE40 zCOGXvZ-g|rr;f6&x)InkWjHoX8HSCME7M-q_l9G0 z-AM7<78otc6MGgv&tr&Z(ch)5VEaI}fy+vNOQ??*oKYV*5Bk9w2!iW3ZQ%aE0-HT} z2}V|sPt*qPs#2A^MtOtAxh+sV>}h2TzYbnmWrFdxAh>=``tJkh@g#gF&Pe_+&n3qN zzn$1Tb+q7eL#+d6PjcYwiSnA{5Pu_{i@tZ-I1D`X3T%DmdNiMV6L!4tR_vN_3wF)8 zImLAoc07M0wm>~IC7(y{$)1pXX@N18JxH)cWE*0B zLsFX{eS|{+a5c1o`-dH1yy+0UJ!U6ggb@{9Z3{F?0OZ?Kzx4u)i0SVlxO!w8xNntX z_YFR9Qvay-iR42QH^Nq*&Rlm{JfB<{;~nvvxb2%Z9?j?f0p~T|ip$!+g6kLl61T5@ z2={J%8V~OY;>p8H@a)Nrc;Vb0ynN{xhOV5&aOfgN!dEaFjbbz!NqL1smoVIO0edc= z#!D9t;rTN!oI~x zk-!9_g5uihcz!WV7|{;KM*`q_+z-y3wmzQwcZ=`TUkabS8k?q6#rkvVSN+q*W7mwE zaB16@aMRM?C(u2^)^o(Oxsp4fow<3 zZ(lw42e^0ZGkEUQW{gCxBxO^Kcf@naNsH6P0v=OH`#|LsHm5gwE}z8X2j}CqRS)9g zz&~N@)31ryL9&M;ju7*SVq=Abae@z=R|4Q_Zv*#N=fijx%e@7vt0?Zm?=>`Xfexq< zK7Ip?j?GP(VEn%TxN7A*Jo~KDw|7RkKWnPvzODj;)33v&tzW`j8|v`v$xWiawj<7U z>R-9vE>*Bykp4*$o6vLl6dv8zfg6|n7k1BnzZegYPt;IbA>toA&tMxTP&-G-$MS>o zKoDFHb|^kUGgQ;qK-&S00fEMr6mRlEwHRZrhHGd}>T`Z@wcFx&G$$9f;`44XhekTw zIJpYjpL-*&>HZ-e+U*m4Um~RcF8t|8k@e~Mg1ycvB6#l977;^O=(`XH^6lwrd-k=0^VF|V++Bt6-(!5&pmB^9vk3LFe;3c~6Y~uVy`K^>0=B6lkEz~B z<`and!~nRKw1fLg%iwA;chCT1Dk(;*?SMu)u%GXRYT@TEfN{=NaR1B?&RsGtO`I2V zS5{x|5`8@BCG}Oy+P;hjcQ#_E=d2_)`R^$8o8oxZdyUj!`zT_U3eKP2j$2nfh;wGX z(~2KXa)|sS8Xt(9MQh%G;shigIW}-@Y6JIOi(rCSaMK9YWC!%PK%*B(FIsx@exJg7 z>ElzsGe*p5HP%+*oSC;6yzb}oftX()?5kyCFJCx}FR%GKcE0p>YwT59A@Ykj zpMrfg#SUz41NR+A;I%^DK5)`}K`f@LQ9hvgVs-w$4c!0Y2j`}wyssM}cprH36}W!E zy?E}_R;l8ohtXbrltzAG#S7wj5j1alaAy-PY`F~^rwkXq8TkQXY+(5VV$2q|1Fog* zV0?_U{TUcWFjNR{RMsUpyieo9DIS zI;b%ikmCdC4-ifqT8K+q{}r3+MoBy1Oy&=WT;l+^nmeFIY?VP{KOGww+MwJJ;y%@K z4%A#702g?{NqqzL7uNV*`uQ}jYd%@96R(F*SGQ{IlM3zn}qM({rH4Y2tVgLQ$+}j53e&y8BLd)>m>Ao)^1(@_i+rEK z3ukr;T~~cT4Gq!l3TLY&`3mleF5Udb9-=+?{<+3LUV*lz5vY; zh&>AZ;0n%xaT7@YXdl8sqCi=q9o%BiH>!LaxIanzXvev4<$F?}-}TZ>c>36CA!yy_ zYh(k}7oa_rDSwd8L`V@E+|>@oyGRe|EF*ocS^h!$ZZ^fn`mSHnzL1o=VeOwS=k+Ez za838!7!I8mA{TS{8X8$bjS16!%k9s-N%SX{4G{Xq;{lo8WTnm-%snWNm+smHW5@Zy)e-mitD|I>sn0i`zcKFb)4mZp zwy!Zji1C2T1Kqmv&sI#SZj`#FFg8CB0M|=PV8STUQymw~9h5lV8)%Jwocq>TpX@U2 zB~5!v6D;m)XygcD&voigQ0(JM=PyxgS&0ddKOpkV{NP;J2{j^5faj((`VZzl#aZY~ zd*(i$J4tcA4U7Im3fjuw)zHX2;^P52tD)n?w<&Xkg8yU##N2=noLf0>nDtkq@1U3} z{i+Szx6zsm$$go>KT5=9IiJV!)8gyDH8k=8Ykt6r2~bYStjDcfa=DgJwE>6dtaH*| zZ3FraT5mzWY6bTfWez`$vqYRvoNrq{F1Bt*kM%VQ3AO<=uSDmd()d&Oqt@A`WCJKB zO@6@XHgJDf+kn17;r^X+evjg;R*b*40$ZQH!4~J!&?qoOOu$-0K<6P_`$zQ36(SpO ziE>o54ag46{UEsSlIP~exKC}|`O-V^!nxf-*t9249K3c{o>Qq`ML(t6AwTV4As!Q; zGu_1bg;U4a^99)ke4ZGgNWuN6kLLF#IkovDEofk)YOq15@ctCGt;y$g@rhOX-iQKpL=;^t19FOes;?dnfJi0reFWm-t z)PW#|d(KI-W9eT+3BoO_nR2ApmO<2_^p$~i}f>)sB=hkW3?Am{f*oS(+~>H2*Q zjbcS|8<4Q45RC;6cYquVJ5Ult;!bv&7&5m2&J`HhYWG8eXb%Cyc$;56(XMWSiFdVwj z2kvWV6d%|IP)v~K1ZdCcBsO5lVwm70KG2@^^g5Kmdn7D|@uO(1gyepRxKI1?&YAh{ z_&T1f`h5+J;sx7){V%^{eX$)p-0sw-9+^POpZ>&;j>rtLOee*Z|6Fl{Ubd^9E?|HwQ zp#a_s#RTL3(RnIXot;tggJ{gZZ`%t($ZR7uG=?T9SJ0ZLqWy(wJ&Ur3h{zH2gL7Xe z)V!K_&vEin2FLprzy!A+oa?2%3sb#m-Q<=P|0_hTxvxJ{s`@nMtS}FwmmOI%{EX&qdXC{ zeBWpU7qom*aKj!82!N}N`2REvE1BFt&S40G>#^9F-{Tgs{tb(NBSamMx&0a%v0`*X_vU1FY-=K5)m6bqK^v(DzS_E6B! zC>O-frm}QD9J(aV7^3-b#Rs6g0I_dKI~eaI8&J$=3-MgvTo_xUtm_f;n$iyt^BuI0 z*MS|gW8)udPE?=QqcQYh=l$i2hjG)g`!Vp;E3t7(mAXENIV0x;ol7^ub;HR96zdv+ z=J;G+9sB+CO7@H|%6X#wyBlgNaPF-4h*&@*d_@XA*M5Lr6HNZ4z6RC?xrL?Umo6N{ zO-p}|!RfD(dk2p}UwuuCCl+7gbAoala6j>%=hcb{ir@d4M8DrD`h4N4HtSp8M`P4lFm?>*L17M z2Uyv87oI$_ObCkR2IBozHv505u=@4xCl=kT&OSI2K~^1MHmiURFx|$ zu%EB$FpYUh-zoQHLCYt^zZZIm7jaHl|Go_u`EM8BBO4&s3yX0;09i@dzz`{&Q>kj)t%&!+>m8{yo^jkvn?4qV%D z7p^tGsW06Iebj+(2;I3X_oPVIhuQll^79YwXuw0e?E2i4mIKTY$_u1DL^m(HUyTb! zo1vQ42pydZW5pUF&b1jV%!Ee>gTwijV!(@lED`SBT&G>c`^R zdH3MCQ`;o%$qqzf{k(?8V8PzspFXx4S9IQmEigvveMJ^}o}3@FK9KgtQ1%NVUI~5$ z!8MII-wf4NgT?)T+_$t1+;>R7KhAx*w*mPr9Q*IztAQ<3N5^ubR(5?0&zx8n6L)$$ z5cd~YPWp9VvG8(izhto5AwC{Gb!0g%YyS#1)s2e9^SvIUpE@6(FO#u!o(tqxI!_2q zFvQuSZQw4r4d{@26)uGd)qZepl6+5?>t`D<@K>j`PI~GXVFxIWh}!z(;iWOrq_+ba z8o7a;_a_f8#wEcoh<@5S1GHLQ)1L#~PkIlI1$I;4Uki?c#{!izdw$I^zk%~SX9YtsJ_HVgH z(D(+~fI{vU)CO*0Z@OUYwX{Y_@?OOJ@^1sI_7rXHaf-1O&5_W2%Hcf$!GD1$pUbFo z2{if-JMWL|YZr5NjgyCo@x8_SguVO<#R0irkZbcYxVoBbK%w#iy)xzy1lQjr-wV+9 zCvR7ZDYS@v#41HjA>|qzczGs9leGoM7U>Lj8i&o9aWn4O@|2Rhq5T1k zOduTzV~qEakeG*_*Z3hB!>=qB-ZKXT@BHA}KOe@ACmWFO`9Pj;2!N|r@~~ITKN&v@ z^*6T5;hQusV45RctzlsiZ#X#JU`6U6%iFV7O|Q>ZVYKA-!S zLg{fIo|CXPAfGuwoO9d>#+!WLJTJ=_rExg7PqDnxS_UWMq<{Y5pxe~F?Z{e*Ui|ZHOi|0;n??1&g zh6pU)U%7MwUtaqtwmDc;8?1 zhIrrajM9E3w03!s|1-VT_w-)ZU|;7@$oHQX>n-Lte@v{aSQ7jfJha;<#(IhURDZ_> zmM&4Q=!yN^dd*SJ*BUJnYq@$Z9hbJJKl3`OZ$|z;ihU^QJdQcD-i`AbKP+^F)}=ua*Y@8!62 z)x+5M7YF(u8>ZLVWWClV^O_w0qgB}SpaTzWZ|H}v4XxNO^K8euiE<87%s&brpbgyj zQNJGqSI+hgZ%X9QARnP5SRsd#(B|LF>alh<<#^57vw|RVj9Jj9gGqyc* zgNWx-Y%iJYOYLuBZ-DqY!o)?96W9*!yNLh12me68He?B0RqX@k4$1q3Jb#{ZQ)82* z`fsWque+lB&ZGOg;xT7hb0~6)(~UjVF=lRK--&UG^1OGt_`jX^w71^o<$u7|>8}?1 z>r<>MCu?%l^*Mw3@7VreLT_8Z;$;9_iw44Z70SL|UzclTU;UL zeit-FP%Sto0k4goGDK^AT&<3&e;_6WjWK6TZQE6xsM9`_Zd^c_qvYCFK7{RTp^L7p7i8_Zqat+%cp|XmXuq< z?TZ)*UlMEb_H21l%*~NJXy3@8sBhWUsh!Rbn=*{z@jMr}{usPLjQ@GRo@}A?{of?+ zn_z@HJmWApsRH+JnJ#5EH1d7&iBxug^M$rAeL(C{9Go-^1CKk(<_b=%!j^{|xNp-F zmM%rCd^{DY+D;=8+?Q-w@xNm3O726#allUy=iB?ZM;MP8OfZ7Xf9usP`v0YkAHgLJ zAMSN6Z1^C~Yxn@pZFoO+i|YeoO+Ky5AF9_ps&nIq<#ns5H;qRxoZTe_6(8frVT~0o zUpS0sj;z45$JXN6V{6LjT8n3nuEd^8Ct_{Hi1+svP90r|%gwK2_w4uMyvAE&Z9P== zsqgiocKI-N&A3VAuke}xii5O*`w8N|Pv-At1BLrPE_SxaFch{i|ma zofQ(FL;YUI_oE3XZ=;;YOf!U z!TNE63tl?kjMn9r!zJR+PMM$W!j+xh!ZXL$#_T{GY!k>Xl;4#s{(t=70$dvWqFCEP zIT&bC{cQIMR$_mPCI2HP)L`3`Q5dYPz+i1< z)>mt7rMLpLheE9bn}$f9aJF$@nlm6BrgIMItT#FX?Z}>1Wq&daLL__{5A0~bd5s^$ znU6W}rAH{Ayu9Q2+3J}6dz9xW{Q%Adm___=%Hpg5#rJ;;#ry>SJvGs`x-q!mg}32K z|3Bdh@27Ev_x7x=<=)%HWqtoM;&myl#r1xw=+{{0ZVl+Cw-^q!?)_U*L9A)tyX9&0O&iboKynP=exCaLmNfGKitqpWWO4ssZB^Fe{=UQr)bILhE3rk! zKWEoE#AP4f==Vcot+ke8p5!>WlGg&ztJoVT0Iq`zVf@&1V*thX|F-n~<($9B|FL5K z6#p;K)#j-|Kb@%}*5PE%e@>Mbt^cmuuDo<07XN2E5TP+Z2N<6r{-;_KsO0>;l#KuK zZv}gmYYr%nne115{ZWduK=j{Z^44vk+d|a=J}2Zc;(xL|!j*Bq(*$F$~H^#DO|ttI{wnC}dw@Bgsm zU@YG+87BwpZ>mq=A7XZZ_H!zSF)^)CQS#I@-*eA*dz@O1^2lI3G321MEQuGPLKI*lO*g57rk2}<0 zow0?uck8oqo!X$Bo105cmD0Uc@9zY zzoh)=Qu6ujW#wGpud6WtrT?EPxl}S^|8(59e@3>znnNrupFs1!m!8`7R=>|p8*v`M zMB+c45vGj&hnrw*m7FPxd4D^9bM;>J35p?JsQIt?og;o{x{p{35Cqpk;{UTSyh4fl zQ_lYt$+41){q@H-kR6Eo1cR4Xr1_swZ!_t&{ye)jtpp zCF6Ofzo}ybbsb`^d;-mX&Hn=OpZ5dtD%>Ayf^kCfpe$m4nK+;7bG8M!%q!CT*ZeOa z|2YqE!vT05$Nt`?=)2~>-0vjaE8BrwC$k}J2a@egp!u))Uts==Ie=Dh(_TNLOfa@doz-*ydA0*| zf3^ke6A=Gt-#@+nU)zBK*#YMN1`~`4CY0`;KZW3HzMjE$pxrYTTWTxu_bRc!FF^lqe+Hea-c~ydPip=bLihDEq>T-Li~Rlf+VxSt z&u=Wi-oC{DR?UCS%L4m8l*?{{al6z<-S-!m_xwD~f6e_ubDy3^IVvU?Uz2*MV}F|e zc}0BxZ@vHLVDR1kOv(QrY5o`1-?!Tt-T&+U-_FfKyr+G!O)!2f^-<^k43Ztt{MY<1 z1mEq?ko^CX=D+U$3jyu_7nhx*9AFcSziR$#{uct8|3%6FI?aF0|3X0Xzu5R+P5u8= z&411RLO}Ch^IzH;{i@g;9sesXUfAPgL-oB^_y0v%K|`!)YH{|f=l|Dxpoy_)};|Am0&e^K)PJCgr;{r@1@0UiGBR}#e?xo$^V;7h@JbVZNMPd z0L_2R|H0sY(Axj=H6|Emv=1|Dz4uyG<}EOfc3+{_8n_L9hem z)Bnf$ADmQyot|-Y1}z4`Epkz)kJPrHAhsYvxxek;UMA1~G^O6_JwP@8^9Hs5C;oSM z#)TWLv@7Ov;%7Hk^H|?w!QZM z2f+^L{y(+twfh9*w^EEi#|ipx51OGmN^}36Q1cnd{|`yM*YUqJx|pxeH2+icUu|>t z30lFeeS-e;KT5VU2(HU>VC-8Y|F1W}xGdXR=Ky7?kGcAu=6`nl=k{hhV8shvv3Q~O z39|ADcC&?{*N-j*dyCl`v85^$ANxd^S^KWSKFIy0r>;l>^{K&{N$nf+mMX?PnWzOCSNDYw$yWgInc+x z+(Yw!;QUwHn{0v3D@ty^nxQ&m#r}<7+4%nh&Hvo$p{kSV{;m0+pLSP$0zHRl*#nyU zx5fUeq#byl)KMM(%acB)y07Mce)!MrO?Dve6O?sck%;}Zg1cu9jD4NteT94-Z-Q}B z+kpJ)BI~63s`+2IHfNupOy>|I6c1?w_qJtl^>E@nfz|-Y*CkRfbquhOI_VjUt+m7O zQhpNsN-ePoN8~;|D6fd~{!Y$?u~$p}^SGa1t4uI9$u`n? zfCbV^&Hv)#Kg*u&fZZo3!Mvg{#W+kb<`VY<;1Zl?m=N;?o|JXhF@OT;rRIO}@?X^f zvIV8OH-VD(^S`q17h`^g39%T!w`84l44^=Isrg?T{AYboeS%WSE3(G^ZW{Z4Qu1Gn z{TU|2VgPS4!RV27)iHnq=%(g>Y4M+Rg6u$v_yj!mKQb4_j+gvT@c&hqV62jL)G>ep z=%(g>Y4Tsy4fY9&G_Q!~{ac9Vt>6~%emj&gz(cZbItEYx-PHUqeg3naupMX@dzlu; z-UKxEr=0%|sQC$To_TJE5(E6WtdH*h3!s~t|3ioWs=lx-800xb&iRjYK@IQsldAvc zc|fP$52SE9srg^HwpRIBsDHB^7^FEw-s^jny}wTe#RqswwvQeIYS;kN>PsWC!9tLC*IkVBdekG8oS}{we4E7>W;|#{dP;P0j!E z<-e+5s!x!MyduT-{|j+Dlkd+^`2Wwce0m-rk23M)W>8a+w z=6@#LVmn};Lrk?dLEQJRxsQ0Ct?$oJ)&smZQ`z+A1Jhs4|ADn%x#=Ik<{MY=?p>A=UK4FjF{z8cZ-eksYi_Qnk zq0ValYyRg*pO}|)j?Z<(dG_H40>uV+WjS>mAcs1u`LFq(BYk3C)=BOs?D5rKC}V)z zWjXacKn`_Q^I!8n2l~W)KXLPB$^Smj`DKC$#v*M4a;vYJ|G90?9B`==@4-=%%v zJvG7>kUbdE7u0BZ_n-S5Yu{;tQA6D3nEYTs*(2!JvQBK9w2b>KV>g;*acSM?yKcnV zjD74oCHD(D?ze+&j|n0tXqBuN+o*xmvkZSr{bIRXZU)_y03L0 zy$+D?Ph5Jx{L(?O0h|-Sev6iIdKv5X(e0B=2be#9lH4yUzuyjJ95CJlF-J*t zV*e#s{q*0o-fJC5t^@2p(>lA6lK(~L_uHZP0D8aB`DEl*7zMA7&2U6<*_m$%OPR_G0 zHE_9Ujgnp;p!GeCzU$B8`oXcX9VQr86X&@vEk&^3VuEpptfTe;;>wjx5l)DZvFMc7pU(|Db*@FBR8VktRfVKf;ujl2? z^JMjB?mr>9U-JFF3MCeBl?ldnX#;qyldL`T-?W`57aia+@#136?;R+VyZ|~&{H)Y( zp64tVS?hXgyQb;@_ksIOFm51@abGzUp~M1s?_jFGwgH+GDksY2->mnPpp1rYQSJLs=hm-O9(_G51?d5NqPd?=5@oGZY(e zwF$;*?FVSvFobLa_hoHLeoxWt-CHbB@`JPu(EJ}N{MX#?18g>c&lBM`94b1Y>ro!| zjeUOI@Am=9SfIuPV}aBaZcELb^59OX%bE4HN!hzk`}|o#u>npKg#9Fa;5IFF-O%M9 zx;BjR`q*EkycRLP$NH?1J*ds(JPGX~_M+4oYFo~m);t=zJSs)ms@$JQnl5!%_xt^X z+I}V&k82xHlDsHIF88&}l*`ZScz-LoU)H%jxq|co#JVUGj9*C`K<&-zC;BQY{e5jm za;XEvd+z(cCAmLL&+q3B(guk2Q6?B)HbJbJBpI^J&80l`y|jJERtI>jf5HUgO=OfdE-cInp!fmwk_ko%(zo=NmlO;(~8A!C0@@06jmT zd2Hu#f8LWGv0q8!&FeMyiwivVGQk*af>9^+UX@#a4yXkS3vfIiv)HOBXp2}TWR zx*qG74tU*#lpDncPikL4+kp&rKpih0Fv0kO)E`=hqW%36gKa!;oe4&Rlt0IEb-sYM z31kyU57cq~G!u-mlKT|j*Xwsm7&c#k&K=q-^`2y|$~{y6pg$ja_JZV3{XWTdlL^Mh zB=2>fKZIcO1>7bW51C+G(RQG0ZJKKP&zoTUx3V{%j`0mqNMC^Ga427Z_GVIjK<*24 zUq3W$gF4118NXzL@mf-MwU5vkx{z}Ov9;MI7@s%6*r3<}%I(&6U}*85dCxJQB_{hWbg=7- z2}ZRE#YcU)g|`J{hwb}8FEYWnL)mkm_TJWObT#^gBzAyw>C+|{J|%yE zxKDnkT^F@Y$h}QSW^*sf{oy}I@*+Xo<))!A5G2zl6O4Z_!FbR%XF!}MJ3#h8^FKFj zK%D1sJ+&$O_}gWSMy$st$nm}I?=|uUb-sWg#|D&FOlu8!4@qCR!BUxW#g7In@Z>Dn#Ilq`WPr7W^XZ}pT#`n;-`%afkFiaDS z@0nm+!*W)9GQB=WW6+RF59RpaKDkHnWm~_;u`7BlSKmPG1Sr{X&C%5E3fHl+HE-L?$$ zJv~R|IQQwP`gM99m2tlbM!*E)_a+#(nP5z?%TfCFu{=x-jiCk^FQD~@N$08L8iZS9 zz7d^yJV$be_?3yfc3u)U*?%Ao^2HohU->hB<=^rv{hhv_sSG_P7`sd`+D$MXHo^FY z3C7zw7f*$17pYy;&ong30g?l34-&=-47soQ>*cuNhb9<*Gr^c`f>_5&T%&n0;%O#s z=Hhd*L#IqIcFOS!t)Zu}%y&&NK4OA#g9-7uITf1k8XD3Oi#q83z4(9$nCoyW)}yQ%zDiGNcNwyJl%@}~rd!_rbeLH^v4>IQSU^^zAc z${#x%w&5+No&-eE6*?eV<|5R)ClrUXjkTNs&GLtF8B70_Nhdja{eaon#ypjYv1N@i<4 zLV}L;DxR%?itaEHl(cv86DzYl#YwBLG(ghoD-Dpe`bq;Nt-jI#Nvp3kK=SIx8z5fgM92n6QT-Ul zQdB?I04b`U`E#k_DVitNKq;Ch)<7wmC)PljK2Ozr+<=LVrb0Ae%I0%q{9I^Q%I1{~ zn6h~@e=Zt0W%J4gPT9PfKNsCd%I1{<$n<&Y=C=fp>2p;ecHEEY#3KZhMtp(+X~dKH z^XoC4_=Jf_BVO@&8u4ZRd?cp-{YXqFe!;Lb>LET)BVM5ZnLbY^Uh2fse(uQpxm_g^ zasNO+Ppdu-$E^eXJgxdU9M=!@^R(*ca2WaiJgs^=93%7nd0O>$II0Hw^R)DFI4X+$ z^Yrv}Wcu8Z;rC_#xki4W^)Eg0+&)Eb-!j z)(qoc3P7Z@?-bz3^m#f3pcrVT&(kP?h+(F&U?TpI>GL!K79q$qpNsfO8Uc&X(+E%m zp)-A+Mu1iXGPMA#0AA|Ptq^o-0a%}>6o3pNr)*$3i;(hj8R1RY!1D8y4J_k>DH~A6 z_)|6@2XIq0kc@w({G22BsTzG|j#V#(jf_<U)k|K%c=eK3FkZc+6^KcXkVJw? z^^#Ulsb10wsKrlK0k!x^B%riDp_d9K6hBD;6N;Ba0*S@zUBJZR^(vsPc)eOMq4fwh zBcKRhB9Y|w$J+|f>+!Y%^m@Fl0KFfd*aBQA6^aOKjc-AzVY1t+N~+#Aj+hcADLo-( z2JEt9$P%Xbd8~@P+m<1!ki75~qOnOO#*Gdc!>MpMDjYXRDVBa3W)NHzK5!0ef-%Dq zRny^E0oPQug8S70aNXwjxbN|Mj7k1_Bj~HIS?8;-Iqa*ix$LX2L0`Rr-Xs_O-B)i! zeD%gDU%j!z=P?%eJnm=x9@qVTaD6!luD5qWO~P6h!VDNy>4oZH0dVzN1E4W*w1Qj6 zyb;DEv~MTWj0%GL7Qe^%iNC()Ilqvzan9>;Ve{0{*i<(h8z)y_!z2gJo@iaO@UCMi(CF_ycSX&X3W#g2psBhZ1u=)Hygy%JWD7>`w zUn8sM{vf(>$!~D$%0J`FYahX#>uVFP?Q0&!Ei3+r>lgh8uIl%!i8certKMTGT(^n&!u>v5A#Tp&B)2iNa{;JSI4=bD&~Ho)jgvQ=&1E`7sWK={B} z)d*u^{AmZHCg3qh=3ZaDakgdZXl$shh>|=SCs#&;(_a-@(ERbx`i1vK_H2GKdg9PR zym)ROM#7i5JM1^Yq4RkD%nm%Zzf0)L>bZAEyJx>Y?0;f>sG-&omSw;es3u*A`aH%) zKe+zb3huXZlg)rp!X~tWJ60!+-XN~1au>F}zNXGsUvo^zd{RY}?6q&&*zkguPlUFt z_*3NAfw|ao`D7aTMll)A-V{)&b$8jYm6C*q~^2l3EuA8uImtLWTW?+LfSn9!_= zj%Y(|Oc%mFk9&RqTz7WJJ?gzsO?ptJ`-Vgi-$&E7~}@ zO7zQQ&zA(h7}~RCdX%_rN0k0!8I!z){G#@+^#i0okpvw=`+cJkJbQ98zP$EPoZs}( zNb^)n7n-IFkBUCRV;uB@>wnt7{Yt8NGmNS53Oy+Ae!&l}D&hmR$-F79VF8c(%jCn6 zEuB5dL9&l_&wgKM$NEXpi|6-C*-4p3rM#oz-ts5}==svF*!AJ;$xXO<+5Kof|BvC> zlN{lO+RCWc<3yjwIOhlFqix{6j_TY5V=BGitZFZ_^>IOP3;ky+5CHdQ{q;3#$j_cV z(GhI{XLz~!_3-h7^O3m45Il^868=^!h?gyHbHd?EcwonDT-b73q;c}F5b3nkgY$lH z(*CmJs11k%esIRxV<NVRk8U)1$KQt zxU+%$gUGDM9U<~}ydHPN56-{MfpOv-I~ofO1v@}Cjp{LH@|cl+kNXjdv68L#KY2}P z&*mpc;6lV!`^5YDp$b(GLZJ(|Y3XmVxo%XrVRBVi#H7KwAqcKpsLd#j7%1WXz$12{2WFK@)#AQHKP8y5c>8)_>f zO?4x~!aoG(OFZ9HD&vCyxGEbwRxHO4uKyMGexf7NHRG1>*^?WExJ8_%3~YV2Q2T_# zdjc4E@)gmB+KL`A9|_g#TEYE#;(xLG1b#W^)mb}ogx}+Sf#zn&rmg6>Ga3$Euw)+% zW!o%ehPW-baCSF#&wf9}LPF9fI2Hic2T2Eb3{`BPSRR$BwQjWG_ZV|prjDU`*Pg8_ z|03mX#ZWcUgZV*oS1UU1B>srLzzfbResF$K>cH?~l7C$GW3KjljFruGqp+!NRL{Qc zFNn%g-xiJZ#Oxf~JN-)Y6umF2y(~MqY3c9C4n$hO8KF3tADsVAvZt{@G3WsMrop-~ z*ZAsPz*Xiz8;mMwQkH+ zzItPA)0E-pn|4*`Xt^ENw0;Fw2fw7Rv~6$)t`7Vwu5JH1_FOt1 z)0;h8p2Ei3%BZ3P-=el3EPsGy-#%ru%U^FSZJIIy{Um!C%d>cI4fRePT7>&HJ%IcZSV{p-1Y*p&m4*L2tC-l-ei--7%ZP)ztit=|H=z4 zidTj9zdR$Q>@{)=)&ZI~5Mx8iV~6VX9Z+MC-19kq%r+(fuG=}Tw|&jSqLb%xY2+K$ z94TQ%$2Y}%iZzE^J&WW|Imh|nKl^*FQ(dp|)fr6&q_E5pR7B`GcFfpvFZyKi_W=#tw=Ho;|i!UrF0w9iBP53NOpN7`0Ee+B2RT zMQf6_uYCmP&U!C)yzpk6JL^3-uknLICM{4M@j^8Q!ToWPH_y%V2kb}q!S!P=II(HU z@X)S}Q^k6yGsoA8H4mqcufgL7=i%vNtMSZMW6Bqz-1svm){C_U^lDw}NCzT~Q>xJCaj#wq zSB)gOxA&tT;BjOd7_an#^N5wB=!()=>ln)Kq?~SC68L9f8)DEo0BK>DJK5F6{?B9M*i+sp6JJQ4YV z$J@bpHOZa%oDE`QeQ>?Q3)MaHnc|-5pKs{|*@za8QOp!yzT%->%|g%n3X2=GmZCH+)ql$tNA{Vx(ECYjoH9(b zm#==TXhUktKDE6iE3x*J#%yiiely8En{~&r@!nL|ySyG}q;bj!ob{N4V$J=&c#n-2 z|6YMF{LO)F&)gvPV7PqYu=EYAwb}h?v(ke#ZWnrt5$w5q3U_ash8-{bBfj{s17CbN zzK_K~+MIqndtybH?13L#(@6eJS&Ro8V6>P+@_UTuDb7dhb12qxaAy-9+SM|k>+o*B z$Zy@h{UzM9WxDWPEyVi)(J#boA*qCA7k94uE3OQD5!agE#5L_-FYc@Dt9a?$URkxc zUAOASb+ukEp4)?aw?2#ew!L7r&u;&K+L&ZSvO2oA9k;Fezo^K^0_UZ6PmP!(45rzG zLh1M4;`O+$G))_R+mVz7M%j&a4x73mRiPLZz@jUcUaBb^RBc`d&1 zkONZkcL8wyjO3qe9SNOTO`mmm#(uB8t{S_ZeqDIof?wd; z1wR*8?rc-KKIC3pzvw<(JO3VB(Rml`ts~-E7A#x9?aXpNy4#O?MZZ9Of~TO@-VIan z%EhCicriO~y%YZ@-|po#f5#P_cjB7vABwtB-&dHn{JH3}sqbFoyFEg=xqgp(CCNA$ z_zceu&$zj5Q%2&l#*c=N?e^o5muKOT9SwMJ$86lcW0trM?3g9?wV=H%@^dxd!Cg&A zc}2T7Ps81tpTJ$4JR;W2?aOh|ovR+gwQXO+4PD>G^_|}?;Po9`*KrqKJhRJ^xb*XA zFRFdpo)bR(ZqmtZ&xyJm*x8V$wn{C7{V&fH{`ThOf57It5mCz5Y6C;e4+oW8F*?tc zbixGp+f1klw@-CqU}9yoOo}y*jkC@uO(JmNkA@Nv;iePF(TNX#VN+iFL|c6wgWJ_LcV5I&)%!*hhu( z&Ci_NkoRZC=hy6Y*?^~yuN8A~r;n`?^PyC>)Ze%Nz5wr!uf=nxx8dPEezC_0jRo60 zHMf!csSk+Te&a?HjF1Tic6i1{&8aR-b+u1*iA(*wZK@0XQ>&5oY2-O6`nUR?|31)H zx+krLqcN&=uT1kIsphH%_IG|ZzTXXk3zEjEgmP&3yN3(<#My%Z-Vhd zlD(w^ZhGzW)d2>!gBye3B0Gc4G$)*K&T3#XpnB1IQ;Jp697CZl@~27WC3evoLXyoo z(eVqP&k*rm6O36>=HdRxUj0o6)SwA9*ano7>Y_OaY|cwtImNtp@TqG>?n~E%24=!*~qiM-yuCVv#@V z755GCF=X$)LCe4Y@+V#ez*T30@u^~yJ?j9!vQ6N)659kV|9;C~_<(+Jc9>v%U$%2j z$Nen3T)rmS1gDTcoxh~V|9#d2;RE`?xy=OQk5Wd1;`{YSKS&RRF4T|1mWd8rqvJmr zePx?3E#&V5=V=p+`cjiW>r6-ecnnT-;KsQ>)bYQ*+W;}HL@l?DFUJ2l z%lqtaKi=Qp>HdFU{Xga0m|#qn?O!tSf7X{`kbiUO<$uO}LqCW-;NNQbXAidjv{z$m z-DnJe*n_`Md28AF=6U=c&;K1a!MIb(U&nv5fGYp?x-nv{L%Ymx?@tb69%Y>F-eUeg z0IrQD7$0VPT57L@Y5$4;B!61xLhY8An;_SN4X}UCqizWK2f-CE!MMQ$g$@99N2%({q82&6HGAv!Gu`f zUot*mDe^y=ZgAg_&6<}S$X~4gYz6njQv4);+6QE_EL+L=fI~(8tP|Wfq+9cn1Nn!^ z_iG13oF%X9|M7$@N6GjALrwmy2lUD|!M^5Yfbx%$&*=x}g}E?RoC~1H|Eu!(CF27O zW%;u%B-(_&uaUOt3-A4~fNZ}9Dk_xypRO~(I4hr95% zPJ2C!R=IA6;tyVHfvi$mUhKJiLYzlR=j8P_|0mD-!ahHZ zt%WQzWFYHAMWqQj{0%f`NS)*^NDK;cTKyh4`u92eRA?$j@{lN zWuJ7sp9zW|@VVlZKed-Tb|w*@O;m{2Jaf3e_h;F+NZI#__4Ngc4osKzExLZdDwlQU zjAf4t_3wVmsK2t!^gH(XD39YGawLC_3%|kyV}EhmfsE~wsr^d*bLQqxrR=jB?`48w z1HLHb&o-vi+iNJ5pJfuv1@G-pbYN0(_X9&prrGKz`{hSyJ!hWe&;04bys&6WSLTkjw@mZ}qp_=l@a4J|}&CDkyQG&nxn0zf&!j z{&)WMgJs_+Wj~;?Ubawl;ODZATn;Vs{L7r%nA?1%35H9`KkeLJE}`fE&lC3)umM`0c$<`cUi`gGkUAjr&IIEnS$C}i z`O^XBJ)PU~9x400`g@rmbwI2m(>jpX{)lCN$^_%R#UOhI+X4B?^8{oE^td25I>Ejk zrMU&+pco; z*ZWg%;tl&!i%c-Cp>}7VyI5h<0a{DMYsy)V`_mTX_8a01x7RZ!7$ZwT_9~S40G%() zXADuDc>GdsGR?NWEO%J5+@Y*1(zd|T2kPgkE!a;cdvCDp)wV2E*n9$7TgGe5sm|mZa^17FkwfKsRCo4` z518>ixni6dN+3JH{g?^HznCEG9LbVxU%BXkDtD?ooxw4dWKDikDck!@u=NMkCK!J( z!8ot@2C6L_Dm>?Uu-sYC>FnKGq}+!j=TpIE3tnx40VWt%Y<(hegWIl@UrFv%7nVDn zx%W@pHnJ^B*2n8F*e_svXM*uYc^>^mMGu%Wr6&JmecCD$gb&Oyva;fQDsZ2m=mG6R z^%oPw+C`E(@rEwy8%Q6DRTo(1Y8k1_w6ET$72ik8JqeQNfy)Hrnv$4ygyRet}?u@g@_D|B~m`Q+um6fNcZIfn}h6 zXQ2P4dy=lPyj70#y=krWQzjU<^Ij{m?3(ZWfWntpZj<~Q&Z+~TZ zk*w&V_jHjgQ(gQW{tdmR(x=NNi2OUsf%^onwPnb$T&(OG{YNsJK%h3KTo|bj#J%Mv zh}b+5aVJrS<9_wvlerE@h4Ma3wZ1j}hu!qPD*oPTl-PUmb%*16{=;eO^O5|1 zuJu0l1naGXZy( zcwp>t@`16($p^+CXVpmjQUXzZyeNQD98mzJIHCYbam0J2IHEua??<9qJW(K}c)j0O zpjuo}U@oc!w7tJSp}3A-?{7^gzN6Rs>l3Qu$oSq!sGg(O`;oTKM=H`G*xy&#KCen> z9!JLa6}InJDAFeM^}WOP`(E#d8Zy}AgqDtNukK2jf} zGJp)W`koBBqA{WeQ6wz7Bt>GPgHQ@2?71QV(L*UMXmxS%2U>k%?18ewiak*FfUyV2 z{wVeU*#X8Lz&$8Gz}6qeI#hW>+1(*G8ULJ{fPXG!5bIuLo5sH`gciHIzytj28yybE zM;w+Ns&I&P=A2kdW;8hc)i`@%#o^hHIVQF~G4Acu26gv4Dw;j6 zD!<2-FjmVqd>*56*5eK#^Ny#lyLQGSj=wh7jXt@^dpqvm{t||I&QX0s)@Fqk=zKxi zV^CaCQ9bK#^mp+-jL`^Pq1ai3{7br5&*jr$YK!?zAHl}S!>`PK-0{5m)GNd~p%))^ zRQNpZm=5L>zWN&RoD-Y>bNH;s9QQO%9)4s=@C$hI$WlvgVuMDE)d@3-I~}YxleZLi zCEYl7U~Y6l%Wc>&sq#`|?XZUz&AvsA=2?$9<`GAa z?(5)sM_HBwt8*$uE&Yhn;{?J7b~Z)YpM4X~dfc%i_{3G8BDv3+y3(; zk6HTOIH~HcrpY7DY*_pojD#->PP0B23d-}Mp(|&@tGj=MvnN$VTk1yr2{BytmtQz4 zf=^7yNgK32`HG6E_dCSBW0V4i3hj6fCsldUnJLyxNl=UUO2T4FJC+w>UiNT)CL>o&AjD0*#>>qgJ&PIbbjWe zj%o86Z^h7+vm|%CeBlrt-`9aB_Rqx=`{xwNH5ZTXZO8Mcw+fBCbpBwd^M$uj8?0K= z^ikn61?#hKgPD(5wra3CY?_OvN?o{=k|u$o_Res)H=L~So!xq zSbkb2G*2BZ_|jBc@s-x6UyJ9@><~BP`%>S={an87TVL;wvTr0mig5banvieW1oTcF z{THftjkTh) zCpvKUBnQrVyn=j83{HO)Zd&$xu@AF_V&H>ShRYWZN)@XRJ?b@mS+`FO2z>w|+eOpSU(0c=A;kc=Ec0%U3^v#$MR= z%#FBd=^yaY`F*i=h(vnC6^(|(KGIh%9nJA|%(_2uoA$#OLu$k;7mwhU<$o4sqOwsL z?d7KT{wH1;@=d#n&KI3U^`GS#BkCXUxW(AH^O@JzG))=4V_ExGaqEgdM>j6{9d25B zf5NqS*&lGr@;@Sdwx;_Y+`8&P+_&v{JbPk;YzG>ug>mmj5AIm;XWY5^A>6rYpx0k< z=gJ3h=c>P9&!rQw=bS&Y9rtg40k^LvUB3r6F8Qq}8A zh`(-(SZ7ahB%eGl&kwHewSW_w>Z-#{Q$}Ojt8O&5Om$(?l#zlLEie{Wc76{}9bF#N z2hs!5iKx(vD?(-@x4vIJ7>Np(TipBH>8-eS{x8ut?Hcjy#>peBveacL^OVupTsJ1v z0xtA{%OmW7w0VeF5v;B1UfTRA+_d<=BkSh>0@p6M7uPNLWrpiMT)*&FqC6`)zk}-* z+>85nG~kItOJx5O#eJ*`LJ$6mJF~tX#GR|-GCzH64IbL*!wpOR8&`CE3)jy7g?RS5 z1@~nrBiG?xT)*fy(dFhhv3bhK_GTH1IUE^GV@E^WLW7d76F z^BO;$^|he+vpBEmQ`j}*{Wxdldy&S+WQzsjWA;A4l6N?C5qGS69J^ z-YRThUwnD1e?y@!RCnLBaS8WUpVOazw|K;P>yZGsJ|lDbC>Jd293uPqywq>d8O-XL z>|T!x8z)yF#SPdW%@)*F1mexCi4OGE8wvMTpVQBOi}T`r;QYM_#(lEx{mQH2b4go8 zzhbomwM9bxMSaMgWp`2EDe6D(C;6(sI5XJ?&PEfACuRNnqyu(+VV$7!S^eM=dfCA8 z?_;biCjWVPlYf--#s}4#OfWhJB7b{3(0id1p0VhgT!r&U|BJ8wf;V2MruAu*H%8@7 zl?$4*j>+n+{;k6^7TYEd$E6J)F53E&4k&y7=e+){lZWGy;;%pLtxfHq>)(eyFw=KQ z|4T&v`^sGYd)QpP$KN4$IdTW4XTaL)1S2 zPC5^r#=vxrF5N$8HZY&{SKC3=37WScZe+=iP!QZ7rx=J_Z$2AfvsZv zm9`xO_r2iU(+y*JZ;pHAy>iBbLe`(#fnG@;=pt?eXdK!*HX(H153Xn8@h{^owmljW z?y25C+kX#M{nhfZogkg?#dSiA{e$58s?>ck{~_0M)9-V_fnumXw*~7&JGi5y6FzVr z=mPgRS%2QM;H&ccIq3(Bss2hkgrrV9BI_Po+hu|=#)OzJJm5A+tUtx`vWtDu_c;DV z{$H~GkL%ONSMJ*`Df`QdIY3(5DBI(1dCviJfa@>fA2C>S8kxZHug&v+p3C~PZGS@6 zH8%fCYyITkM#^=+)V2fC0j~ezS??Efw3ja&6uDEBKb7gC9J5f*dEC(Tec}I7Jid>z zwtt^xPyW8xw}94KQk@x!4yfn<*zeQF_ioV+T~A(zT~EHMZ`V`TVQ2jWaR%%F>rTIC z+5ds+%XPJb+eEGrRe#t2GE8+N%`NrkqTlAA?#$)YCKygx|D^fy3J+dog4mauo1+!s4oH{{x2YCHNp^CuVbDC9j@@A<6wv~_1FZSV`J zf2>1=Ec-y8#dV)X^mH*#_(*f6|25oB_1~KXD@3f&I; zOtwW!OfYWBXWbd3Q{1*D7+)~K*evY=mnomTAYG&TbG>PQ6N+6G^c(>jA84PRpDO+$ zm5naaOSP>1;RoG^>P+|I`~Ls-t~5HT<4Tt#un-bzf^m%TLNdV)UJ_$tupMU(v13m% zbB@OgOyU!d?RdPzGfCz+iOs}hJPVCHobfvTkMpB;%>PZ@?+So}chZ`m|1 zVz3C658$i7BRKDqSD{vL&bT3*GfoKSj0?heAB^+Cxkt~EVTcDKLMnEKr=27k1uSih z`P8CtkKC%AsRr#1oQT;%h@S)WhH)Zhj$VCMb6Bu#!%cm75Wkuo6dbo$+?Vth@$2-} zB00+(b|g3P)@FOsUGBo<`v_!Dx{GoXZ*gRqC!9=QEi7A>iQjMhK+H@0y%^6DWyMB@ zSPgg!W1X_iVL{edQ%LISa5-Pn{%hQ=TR#?yZ1Gd}?aF$p=UByiGRD98(th1e*WD_8 zwBe_XVYh92nA?D zKl}vUuO5FJ2-h&Cf~zlXLgF#FoL%mk;~U7nWtJ;-g^12v_jNfxv_wzn>!%}08S6sj z{h$3&+>>RFtUA7LDPrU#Pjb85kYhBlqq07zi|$9+>+EfJ9<5je|L}8ZE5s9!Ieksg zxSY7j0r#iv>u->IxzE zLrPgCLUQA$`dtT0w66Cp%f!F$%6yW#JFh_JPG@hsj8Q}kPqnm+97#`9y>f-+8#At>V3;H@m7WHX_V!3G*!D0Pk8ZkI$b=KdTr@+8l6A!8MQR* zL;vhSjCbk^y$&fV{&}#pZS6SuP4d|X;@MqUKf*IA$C7K&UxrJ})7jh6QAbF{>=&vF4txCX630eXKx2*Sx+-@pgB0G`JAEpSDu`7M8G38r7ZLLM`=sWJ7m2z9PIA5To>Y(JQ?>GQLll(c{gK-=gB-t>%exT*`@? zJl(QB_>zjXai^^gqU28nWtk)BKcntQ+vy4>Ta)B{p1|t$Mo`(?xf<>2X&raa^QV{|7`J7+}Y+Z zd|u0xyH>ombL)4hs^DkNO4~D3k@KviJvq;MC>L$AK%t4+sb4B`@X)=z=W)7ck*GvmxXDl#BxC_h?$orAq96|Z!2+A=}1l|Q9hTmeIAafieMh&rq z2TI?PeYv;iYTvvC?55zxI*58csZ0Y0^&HcC3elU+^~Ma_N)PUp@S?SoR-MHqZNdVB-G}H#^GsIq55A)grKt27;KVM$gg}I!?Euq$2s{ezpAh9KNfeR^hG~h_Ddzd9;4?gjiLUfZ?jbk z2Oj^Zd~_i{e95cJetq5LS8-O&N}sUv_UYE&W5^F*u>Y6e6Tc9M-@9Ei)m?A>pC0}A z!~GxfbDU1V&oAmdlKxY3cpYV~6_g!k^4F)_XPa2HaM-xBmHw}r{I!SI$!FeD4Q)#jCLA*$V@O^J-YoF*e+fq|05c-{~P5U@ZzeOF4vM=^Wc1~V(;4zE!FdBXOdoOr0-}eHMos*#s=u7Yi18>yfTDFBz=NKnn z9*OLn40V8w&WJ}d*7abySvT;fV!y#5`}=Uo%NOiTwO1Y50zA2$aqMs3;OqE)=z{OZ zd5w*YJ7d@aKYmuH2AB>1@n= znK*g1g~_g&ey-v>5&r}^0wKi9l`EWpY2e|@*K4d3`+6D6Rak95v1_JPcFk0*d@f;E zf_)5x`eA?CU3Sf6R{n_J@+xCQ{$oTnq3|gJ!5InuMl+C0cQGO0W)y;4x{V1T-H(gjckKn6XQpZIiMileZk-;SW!AB(hf5i2b^QN@w}~)Y{B0{v?*Ee$K3aN`4lY{x_^iCXHsoG`lNhLoZX#Qs3h&7FQa}Vra}g*IV>nA;U+1EWqt5R<<=il?TN%5 z-6z0Jtqq^ceG{7Mc2e`j3TmmZ^owvU?rFSGCa*^yMVU3#@x8mV|B28*5^4%SmhNRB63lh(o{bJxNadh{) zB+HJAq`ZxHxN;Mxlhr&?##c%`XyL0%w>^Tj=3cB}@5=lk^h8+GhrdT_<56<TJJAUmjj7F=%lw z%HXo}vKP3qw^wQUJV(lMF)Keh^o6obcTz>#!>;nwhiF&oLsXXfAQh)RK-f#7ICTyc zr_7fA2}Q~GQDy!@+E=8npJNT(LodDiu6^fsg9R@ zlGhB8_ zh5A~X#GeJm>@aqA{vY4y_{JT;)B7B3Qdo~XKVknUh}d6GWc76=FfeI?dx9a zP?En*ivX6|WHkpFQig&22R?t7YjXzhH_D-O!k9L#x!NQdxnS@$!SmR6kMVdQe~&){ zk3VRC@A@0dP{&TClO*}_)8~iZG(3ksp98jM*Bn|S$3E=i(9?NE5{})jZt3rs7Zoxb z{s)&Y_q8zCQr=hc!5+!7dgYN+wBcqdNxY-a7m9tNaISd6EyLNLx$J0FZ=;erp7r z40e=RhBYVXi`$FK3M9w9To3U69_yX?8k0c=;Cbxk{;J9dL=NW5^@h$FN5&^_PKLIC z-2r}Ju&1ETDAQ;sGRouqAL|JGfkhCG^0|J)B`>?yHCel$GtT=A$|=pYlv5yFHJ&Ag9yA~r+`@kwu(MGh0htP5Jf3J2x`0# zCHqg_#_v9Qa{otL>&|Syc=>#>`_lPh_k}Oh8;&91uLz zwbeO09p~Jgj&r2QjdQ(S%}&e{P9Ive`-2zsGLVW>X0K84GTrbm?rN)(V>iZcCjFe; zH>$g_zJdz3+#~U)auaTTq&W3~o|3e=?xVXGQOo56a_q+*e(lXC`v~uZ)+>hy*Oa8q zb(N&fapxvZf3kGb%=kT)Cun!(6LLR`(rw?9b1UpG+(*@MbY%BCRF?6WoHOmreB6co zV_{3NYmukbx}96c3Jj-hYXn_9YlSWlOGB5=70LZBbpO$C(zoIYNKj+dlpt`7tNN`^oUlnq6Ke+?At`mO@a^f>yDT{C^E>VW57jy1r^DoLE7zkd^M_2@^F*WkA% zJD-04c!OUm#ztpBOoZF>E{#B$^1R}M_wht^FJhBHC}X7>i)DLqyXtvg8^LZL#`kj0 zW3XK_%~5+P!2XOe3KrB>2ngSw7Q4vr|LWcxGAatY?I!WjtNbkKP z(wl%Fy-B+Z&;Nbzz32PxduC;2XZEva_RQ>gCiX9#-UB3?b?;^0IsgCxIY0maf}tIA za~+|A06=i124DUo!B-nV(dGHc>G}ET$@ygwaD^USTwGjUUR+!pT?PY!m*?jf7ngrO z=jWG#VV5UY&|m!W;VQg zCQc~e%frkGP=^Kwhg<_VnR$TQEKI-yTY61Co3l#@FdGo5C8-mvYrBLTmtOOG<@NDo*EjSkHh(Bm<0hY4&Z%sL}6h>)O&z~ z3kqCgXCe|8^!$&010pj0I?_-k{1;V z0GC%9Dk3&2I5;Xc0(G?kM8+e+0pt4-Z1LG&MCNg2LlbKx_oUKV`fp zC#PpT#UBw78yOpd`(6f%jD(ea$A-kBBEyP0a$-W^@X(mt&Z00BG6d6@hlIiPk$H_d zp~#4cu#v*Ra5y|XsAwb%8G($3HP=Jo;o)%Tw-&!>WMphm=5Rq|aByV7NM=wRDghZ5 z*_l?7m{^kD85xF*1)>rID|$M|#yWc{0uxbC;8s*ZC>o7Iq0ylUk$>YyA<@Y2a3mV} zH=RoW_!1q7L`Ft`xkCS@Us(<-t5+7C@&~0Y5U$( zQH;f5%fF4)WAaOJjU!DZI9yR)UQK^Zc5X=-cD}W+C?^|}{%s~ZFSoQhf3!a(3yP8Y z(leM+oLgFxRXJUomzj}QJ6)MkQc#+kl{;GAgu^wJkLG3N;(>yS^tOr7+1b&Fw)Bd8 zD8QRvo>f?wmsePrRi6Jhf&5%tL2hmVF88l`2>|#4ST0Ec{t9&b%YR~W;9o)v0K_Uj z#a-j$UBx~sSK2?oUm+v}=zOOCnF^Pem(xCUS9|{@L;&#S_vPi;pVPCmv$NAbXP1}1 z-vC$Je}x#JEWf-wx#Io5=EB9<$>n7^l2ly0|>PEC&byV&KhxO{D)*t`3}Bz5$2< zx~#aH;hL;sR1ytwP~^#4D+tBg)ByT-5X|9{z^U5@`J{6G2sPx1Yy z{QgsY{!@Jc=>Pma0K@kG_`bw|<9~J6|0(~wKL~-U|Ea$KLg3oue|h*@=zr_a|J2`C zRQn(K@s~*d6Tg7}#LvHX{6F|@?|Ak9M>!h+(5V6dR9uLkhl`7cUq~DZ0ICRpL|cf9 zjTr(1lR%i+xP-Jr0Wt#s5aD70fuLXlCMGDD3K_R4IFdG8{ z8yE&50kI0`0;+xhi2%LIl(D8Ni?06ROtcBPPjnRrzJ13!RSmlq6yfFWQu5bz=+ z!wdkifgx8ryt@7XkpL3}0tH{=1ekm)($Xt@zyK!{Oay^22|xi|RX~LG>LfEeARUc` z0e~MiN(x|SzS?6I0aO8PE)WC)W~T+LzqUpjTUZ#Q+iENUdUh}b0^-sJ03j9#7{Uqg z`V4m=gJBU&!I3?~UYr0Y1Poyj0-#sc%z#!(RdW!)MA=fEqz zBSQfZe=ZggAS@~yXAeNYjI6hWn89qohw=orFdKjk;&+v_O&D)di8H_oViMqofLVdq zY&IZ^hXDrR0D~bAdY(*xBP#}A0fBjVz+iU3y+qm!4RC`YU?_wI4CVr&O(n4I02>Iz z#RZ120$Sy^fervW7-!BD4?)80-gP0#k{k#(!a8 z1cMkkdB6}b2jJF{2ylbJfgn;YAhGcSzy<|f=i-Ne!EAu)2oku#7zko!6b8bFQ~(wb z2+S+Q42Cd4s0s&k0Zt}HKaejI7ogQ&cnt&wftUoYY5`^gJj?Ok00k!_2*k*79r#pI z`ROWNM%G(UE)W>R3K$eyhNSZVJRn9MfFmu;y4Vn41%Vhjp@0w*BM3svl@$dz6q^HF z+<;lpTOcZnixvW6WD){^dmId45F6lMcn9E1g#v(Y>Pgarg< z1x!lNh!FplhK3gZ5Cpo!1YiX-vWNhxPypbAf(b#4P-y10tauzgE-NcD6UqpJf&qSi zfLVhF1cJ~3>}+i8e3X=YS1UjV0fBgQ{jOSGl?TiKVS&*R(K0g9!sy6YAPiuhznx2} z3h45)Fn~iLq+kXXeqBH{;4epnIhYt313_erj7%I?^aurLw1qfXnZO`MMi7{Zl~YI? z@h{HZ65!?H z0EGqt6!`#DGXBj7Lu1snm7h(#p=Kz;x~3I$4I;;*)eBH-`{7=jdzh>s}+pnd>r zK2RDR6NZ2z5aEcRh=?FWI06AjgvCUc0{PItmeEmgI1E7s56m4I$qj_V5Y%vZRCFl- z1pp`z6N7+55!b>);B||`!;7`>&~PY1AC8EL0iZxVkQg6!V~lRM4%ohL;bxtEU0jPtt~ApE3IvPK0hezZwQfP01zJwhaXsmSgY%n ze%FQvg(Kkb*m$5G6@fs62Ywk`nt?+DV16tCQ26Z9KvG~h0ud2ipBN2CAVTr8W6d?N zNdIu=NLWql_zX5QJRFWriI0Vc2URTeA!~915&m!{L|{%0YG9!}I06wHkB&x!2ltGJ zhjfRB1;Qa=5#1pX6TKnf;b?SJBqBVpaxONb5f&Z@hlKkzX2i}_2Zke1Q79xLJow83 zwld!z5dfz~ga;HTf$1RmknvQ`xs0Y{*s(9sA)cyRJo-RDSnAc7hm=~cJ&B{%|sK%?Vh;ZOt_ zd}1{j7LI`XBb*{&i9f$z)fy2S|2OrBz}kh;GXJn}I069=5A!P-U91g^KwM>CkBSIK zLt#+ew;h>mhUzp@UbXUt4v;MIem%7A(xAs&H<2+m#TZEtN}nVwo{ zZfWmb$PJD_!2dox6hOzo5I{X_oM>=rY7jOK)WZ;zf13t?0@cycPy|&-M0j`v5`jQo ztszhZaWuLVfI@V~7d zaAgN1M#UlFPy|7E_*L;dZiu0ri8uf^hUP&^5)u%x6A2fc!^wdFlm ztR#j4J>}I<92Fji!xlCzEHo8jadHLV{NFoczFFsWx!`4>=^}tXm9t*|MV2fIR?Tpve*Vm2j zthW?lp*S)uzH|rxs_LLPGJGL^X#dwhFKmFUcVJ_G5MP9c;%L8B0hgs^I6S`a>)hr~ zY+eB@pQRuVx4Jn~Q&@s8E-JjNslwuM*v_@Z(Z0MAe>_V`UffM+w>1!;+VPQCCEUvJr4?nfunvs)TQe07k!xv92;)=fGv3@vqEDnb)9?Q&`pUBL? zV2jEt@%X~t^~!I<`FJc23&pV%7v!e&Rurvvr03)m7M7Lc@Wo#@+Iw0Gu29aRJWMtw zt**6Uy)-iilV5O!4F@ zq{WMy_>>$BEZY~8jmb&DZ7g6gIhgDcTul`YSCpULwLaaFnw67{!DQ!Tr8Z5kccKP83vP+ z@pWxtcxYf_X=!6%aCl<&-Of%-yxwjYKh`zpD=Kk$Y1SERk-LQz=` z1_R3>xcVZ)U~-&#Nso+ya{<2J>G(S_?jFF+2FvEjKIoQ{kui4|OFA`|?C)gOJ#Q;xGMtG0{0- zbc$}+Q0a&^(MZACqg$x%Ui#aOprgKD^Xy^d-J7W27mp5k>p#J#219xD8k|7v-pt3> zpY)74RA@8Slbs&hSCUTcv271a6B8B?#(5{xdknSp@;CTCjOa? z2|swi|0}+OS9aXZj=nSt0^Kq^E}M9{ipuSHW+Xy1VpwLJuJ? z@>P9K?-G;@s!~=|n@iF=BrhYG0p8U%a&RinQ=2SKGlC98= zb*b;f8>>9~PH@I)UAiI0YR8a;lbJ}`AlGh`Z=@!neD_u!bYs|C=wPo_&rKgJ|LF1V znX0!?$dkVBTP%NikrzRUIBk)AUcCWvDbq~`E;5GKZZbp4ISvjg8`O$jq+gHwHorMI zd^mI63!jF+ZI{M5wN*47Phj!4&fY#HRIvOM7MtF+{jrI{gO^>&j9{3b>X-AJ$-v~( zNqlDZ`Uz}+SD;a)L%C@Dc2$wGBT_1CV*K1!{>d&TjX5GThLqdTqo>< zNe$0A-;0=UsM{oRU$^Q~`6oVOEvy)(!(O}|bx6G<`0P>F=OxH8`mFY>M3EK8SZ%=( zowHQ8y+Luy-?8~vVG6IVDv1}Pn!%u6DNz5ikhFVMT@yT$@0&kQ z#H!lN>9_kIr?0>LZK@u8*`)Bx@U>|!gZC!wK|RZ4(Doy*70C=Z*+EU+!p}^tB~sKg zdED$N`@17*JyS(;%>OZb! zdhX4<=u`SR^}b*3XzEn)T{Y&8Lt*}M_boq*I_vvcl}`F^r&8_4E8{daU8>tZK4iz{ zv@FWrk62uiuMjkCIsEm`aN?!h3l3yX^NvTN(vzG)yyAg*w}oBI%BT@GetPEfIjeWA zMV)>0Er+p*x@G3gBgIVi2EOAlS*}mzqpVGFiq$rWpxvHO`NQ&x&7KPO1S`!P73nDh`9~O{Tx9uBF6tQ(Fa2jK{O6s!EH-`+i32{kS`Os$-f7DgjTTpk zUW2F))H3ihj}O*uV)wH<%tZQ=w@H%BY~`GBZJ)AbgbL?`uPkqg&h9K&KQtg-$#QP_NKZ)jm!QQ0M%v>(U0LPw0hZ z(Y9l18#r0rqUF3|+aW!DQOU_{os`Edkl)m&UNh6?*nIG@_W9@vW&2jOC_UaNkmv9WCnL1E`DJKu@V3gaE5d9;HgWc26r#>fYV5v$Y=^i-;6N4S}Cn0?eJZ(7q9^DbI@Ve!QCc4O){7x9I(*G+=xy!#H7w-^QgoII9& zr#BH7Gdwv)(Nw8G_aj2c&y?fQILieSel!l2tls_Vop^NqL@VR#ao9{cQU?0EQ=c#kfyQ?jj7mUxYb-L*wYkq0~*DUGK?X>;zHaN-@f}CtRY8H;0BXzl+@k$a7us)X-?~UJ&{pS6wkeSbOH~9^Ns&R zL2aCOO}+(JPSqbX+v;w**XY{H&t|^_Xmy3%#TlG-GEHYW-7;pce?GhRT)rl|y1KQk zj5Sc`pmoJ{;ko^Ga+qXzh|UPvK?6zrQ@M2X1l=mnOh(4t0x=owvqv6rj zspmbxsNdGO5aRb?n@_$0y!2!Kz$xa|$O96-eRCVMY^U8o;j9X&uh_ic$KnfF1$SyR z=B!^a1ADV|rM8|zzY9`6WeSaq9@ah9SDv0^h}jG8?Mk>uWqPC_V6Lgqc*^}$f;Xf@ z-}sfz0~D5PH3n+rLt3!xU}_}#cA;#$1xD1TB_E@KAedtN_Ih)LEQ9Ven0-N1&d9wl zV#1}<^B^SnT2KkY^CKIv$y08hGuJ5n0eS)-cy2#^L1ArASBy*MxShA_X}(RpEwfDV zg4^}sRxL5;&p(>xdvzDzS)0bO)3Va59+yS!thJ|RFZ|2gj{=Cy;k+Cp7ou9n`WY`8 z$QJ@KKJtl*tcr?oiZs6N|HGlT{|t+LJ_saRCDy{8K3P-FGq71d+Li#kB*aDr2#}?( zHe(g;p;kqIymcP@{+`MzchB;Z$K1|!icd4X*sOgPG2($m7|}IKta^J)_`y$;!4+u# z>A;wQcB-K~EiJLVtYfi_yj~Fhldq%D&&jP0GQQaM#nbceD}5P~ZUe{}sqs%o?ZlK_Rn2GxTc}*s&FJi&i+yqo?B=c*H`=jc_7L9znQ#BHyLPkF zbas={g2+ZTrZ!#Xml zuB2kn+h$+SZ?scirr)tP@GHH?wCf{vIQz1gQz+)?2cnRBWDl*YGHRtB&y_kT#$JxG z7l7HNs@Pv2K)O?(kct7feab%FpNRe0?;b$(({%E#8WzO0Ia=$UkmLrrXDg6W-P@Lu z%g*vFo|7s17tP77YVRNG`QfDP39sR9uMh;+EyZ?zH%3i4_op~V9~P%*HT>FfO?ifS zfl1@ARtlqgLIz=o*FmVZMWz?94_QbM#wIGI=Q4D5Q~zlT?}VhbpOEXc3Q`pZkEj;9 zXrNVz1~S?!6q$C8eM~N(GJRzWULwy*z?QIqTe2?c_(}I=_p>{0es?|}Z!66lcOZLR695k}w|F{E z0Hqg*zsVWeHIZgorL?VcS}QTQMRGRqWN;u7CCOx|%N%E}`hXVpF2tB< ztEKDR&g6V>#cch)5$O@8!}443h$az~{&cP{arl6+J!muh`_Y>vB;mqK@kex}6$&@C zAMV*KBPjE3c0#la10{R(pAJt5u+Av)nzBx2Npy=MX3|`k=>16V(YZ527zQk81M7hZ z$%1!YdB@3G8W?}IqkdWoVXuYh$DgUYE69f%OK$ZjhI!99G18`H)RBB!8GEgN;qfv1 z=GQkFVGC;dbSpj)@7D=wFU_@?UX-nEKHH5Zy7QFW{xS5kQY5LrMpRO~e_ezmfeWRN zI_*QLknKzgoBM>)FXZ%FT^@Ts(~dW8%g%#@2hAw{7-61MB(c-DyFpXY%q(Qr;tme+ zCCu=)ee_t_t@%UsyCxrp|o^lbAjomClQz%dAOV?EBN~X(a_z-v_{r}G!9xK%bDP@Ebr3~ zTPbozoLzp=!7E+a`o~&~hl#}Up-+54>K8PIJt&(}0m`3$$dwtlDC0*q>vURd)4Rhf$=eyw^ ziW_4|ycW73*P*tqMjo!OTZ;N3H0@oweoa~=;!1q^7>PfcU&F09nj|_X?h4=RvXA(a zoPZDn>KJ?fIEX1L-;PCDnR)eDQWyWMbhF}BcQnuoy?}!_g6#N|>pnj0ZtpNNj_19s zdRKfiUe28MedJxQr4`vHyx)Vl(2-|vPSs8>erehe##<>W)6{>|A9M0GmFFUnolG#g z=2=19*(gk)Ln2}XwlEM@F_Y6=S+>g)hKW6X%@p*i6ZNn~X`-L|mKMWMkd*alknMTn zkmw$ZYm-^%%pB$i{OsDm?=KAz#L zS_7MjWfZlJO#g90h0OL_sOT0am=$XXw4}XT zeH}$lsC#o`XnscZJ0V#=@^Dm(LtT@CQKfR#mU-+4lx~Isb38Ql;7t~ToRutUN+TKoF)|vjTPV_|57E5o(CKwoWpl%FfW;ztc=hO$o!Ef>nw=E) zsTPEvZ}HHC`t!oKZlLebDa5D7Q*(laXP@ze%|?)G*C?VluD<$2>D?y!ofAuF_&dmB zF4_wbBWH#~rnA#nqTS3o!EAcoxEUpxo$o62@T0J8M?$7wsYh&a7LH0lD^{~aO@9n@ z+Po1dG+~1{OLlS!Fg>x-QMm?x4|05!rH#*3PmGk#qO-R#-K7Z_9f%yS%T{JK2o&P= zN^(6_qB|Xpwqt#}&w8@sOI+@=kn(#<8iBJ7IqvVx*T*E#v}72GipwW37z5?2lLs%+ zTPg;kDuI$eU%3-=D5dh0^xZ#6qtMHWci1b+x~_iqA>Jpo4eb)M%M~?P_9On}Lk8M) zWdE*)*L>09F6UM<>S@{iY&86#H_wDVs?+(-5NJ;!x-G_7E!BK1e&CwR zu!e&>dS^pFJk5Q8U+JuqE8*jjFl{C=@7`A2i(8cz3I++5PY}v3ip2-TkA0qz4!|`F z>$g{)oOEw)<+fgkl$_V{%XOr}k*7br-=>Iffw+_jC6<1f(sXrm-E_~kAs{WehQg?D zI9WDI(Sg(zJEzC{(Rbj*>ZcrejZ*g~zS9gt%%~m01~o_$qHMEX_);A{)G2?$@YT5b zMZu4kO7Ckiw+UaJ4$#$g3|kc4^Li9eZM3cY*o5b(;fn&P!kb*L*4XXn=TB^)+s_Nv z&u5KhVqUrx#S_tnWG%Tr9ozR6+L)ukeEGfzUw*b{r{!sNo6O%jcO*>c&---Rl()Yl z+tVGL3LQ|PkENM^C_NQ{CsP8X30xA{B~x+B6P$C>Qul`S;}1T)?wWq{J?lF6?@@=K zHbmBw!O!*29@11Y+fTCK5;qqMqo7dcPI2EOxZ zK37;yXI|vuY2%Y^pjWG>K|6HN=U){{w7p;i2N({@%}mp&2qqC0sE4twTBS3D{C zo;j15y0=8o2>m?X5B#=?8x+)rLGe*ENP3PCCHD*x^ah^p#SGgqh3Gwhf*@0?ie@_4 z7!a$iv~o;zOIDcpx7nxp6j^iZ*t$1IGC)d^*i0 zXFl%nkbX0oIfkaf*1S%JRy9_`21;L!@~x0z*)jc$7xc_#&61uq8K~wvKYzS;86X*B zjpT2>-at(z7Wh;+UsG|$U$VV(b6h9JG33MKuvx^Nb&%$8$qxThf`D&C3ztrp4^D0= zIy;wr6n1x_Non858^>v^bc?wF$J|7s%+Z3J$uhdXtE~OZVCA8bT-&x)DV;(ZPxz6f z+`Z4`zb*^wQ2f&S61QW?gwfHVfQZp2R`6f(2|a!$72G0tzTimW&H2=rQQOL%CXVW<0r&|mQtfqK)8 z9lhREZS1dESsvdfbrzme0tBvQ^dTd}kjw#c{)*0uHMLiT4ZmY=pX|jQb?yzE*&l)$ zne~AnTTXN~l<-5Ere}tC(L~Ge7H_YgE%J;8oh5`8Yqd3id)cDe!9k~+_?o4Byl~>G<&}! z*z(O9)`NJVoH%X_fpTE*#2bg^yf=f}Zwz0(?sez|WSbBR7GIi!GbcP)Ab`PVg2q~MOzl4t4X}R(2=n zyZEGHG`^(Tpu`U5cBX_!Op1K1HOd^+C0HU@Di zqW~kjtpx$Sxg~Cd#+l@zB|~GnLLBG2!_ymKOG%YxnH$zOKJhu;UE*c%d5?A})!S+n&TIwI&h@oM)OS91JXJq-={*O^)}B{o?YUABh`(X5 zT70)BYz#P$rx;zk-(Ack`oke{$!dRXS~5I}gjBGogNTLbSRiI6b$Fh5!}!laSoLm0 z&%0J)DQE8xqKfnp`=xk$LerWH=Z`a#F2!yVr7 zw+dxwyR9bMW%0NE<_Ek&1p2DCQm=8(S}1EfrARUd_^S~HrO_{uPK9{=8A|=M`Ql_O z;+_lT{j4`;={kY4b=Rz(D{wu{Q%n3#1wwSSqzLP>crT&v+uCu)hKr)>Ea$LJ%Fvir z2K_Gdd#xhD7R~%brIE4@u2`C8i9g+e!|6kA+AkSJ&cITi`Q@%(gxLEWE8I!=j8}}O zbZNggso_Q7D@1SJMz82(p-XTEd-l~ZKb!$isSEOob+Uf1Z}~ILYw_ZQBcUBlfKgmP`Aq?-#ZPTzSlb;C*Zk%Q_Kf2|P3pLT_iFkefVKHmZ6Bqfd zbU{7=4MGddp?}-yey~pLJX>*h7Cuq-MYTn8iRd_WC%1(&9g`@!vGStBn$zg3L&=56 z$b1PO>e404ur;phTNq@Lh9vj6eIR|iq4?qX#Zge@E5VJ`2e=$&^~Mj)OHUE>j>CQv zUX?|r_kZnITrZSBW~c<7@cwCPvD;@>^sO-Yc0QE!4xr>|9)4g{ z}$)R%)LS^$Q9~ezZJx>eaO7&VG@?bxlNKDy-5*@ zhPYd*iam3vUy3J z1s-vaLu2*b;7=)ZI&0YbSGID5lH#C^j1$P>gWO+TG?^h@^pMKr^{mg z(?%dc_YGl)SanvVSN!^uU5C}IwS_T9sztqjl`eZ%HoH(=S?;CZ$b4c-JMsK*JNW@{ z!*6<8)=-81i&|nSe=A@(BH4aucfzC&{d^TDB@w@e&xK>aV_`Bago|TH=#)0fcf;%& zI-~LxyVnUD-K)omkIf+DYVO7qJ9?Y-)GYhmIV}7%ZbQqTtNEG|i5x76%<2wSiB6l8 z-O`;mULvXB4U|?kVmvC-zUmy`%S>4!MOlZq?x1GM=!+8qNCdUOHEp0KsibV%twoux zmVIDof|}Utk(6R^0*J`+qCS>*Ac(1eQ?{hB@Er%VFL2^#dWXIXxtF8jw%o-DyAF9||R8AYzjl0F`>ISFygXcgkADt5V z?HgdEobM;NI;eGSNl?T-ak~fi+FLeS?p?IArhhixT;Ha1v#%TFkgg~71Z9W>RnRkw zep>GPCHojp++J$l%@anz6>GP5M+ALd!{H8tkFoi7gvt88UyI#S2rXimpomj%DsHx0 zN;Q|e86BBJJhk!h=a6oX?w9wJrOOXPbmT+Lv-boIha0%V?x^@#Y>2A_fHsgS)U|$g zgK;5d1S%adf#&utQcpnM~rdUuasN2Y(sv!Dk(m=+ewo6y`>uePj0 z`d+w@>XJU~xS4s2j*lpIE$nb)&}umFzH#BvJ^T*>h9j*PnGz>p9jiHV>6myzJj-j3 zC&I}o(frTSx9__ohQ6cDldhs@T}U^5$7Tmcq;rT_zFH;CBVXuZASIIZ$Yim1&O2JS z5{EmF-_6W=&Q=R6yZ7o9!GJumT5_SYfoAdQu47afg16e3w63^T_4yq8h;&h(n(b@S zXFB)T<_s3w2TZfU`WXCzBe?EcB!7=`6LR@wq zOB(J@=$fd3LOw>7EjZ!`K+G3dPw|dg4+Cpjj17X1y;QSU^_UCNFsDD56v_GyHM#`j4lI|r`);FH5$LLRkALBG8p zkwhK8VEP;*7AzQktIdy%Sdm}z=99BZ9=}zpxh(Q9DIy&y{m_p(GjLzQUH<_~z*33j zM(MG7F#9}3Deq8D!_&zBMJL-iz@s`05$T!;R3B}x< zgAzeo1gZO8KCJa|q*Kf>ne?SExa+AiPnCVFf><^GeQUs~o>(Mi$}CGEtq`;k->hMPhAn`r9*YQjz2%I{Mmyc7`Mv0;w*~NYlFhMzvk#jap`8 z?sKP=DKGl#&_TUTU)+m2pi0V#Nk}(Ipe+B$Kz7>n#VxF^@LrKarhBya_je`K7nipS z4?!JYK>Vxk)jbc;56Cg8Bs)3EY~ob)C1*}HopWk{rsW{3(xWgBxjEf(hr^5BrPXP-GQZy03No|N-9y4O?Tn;? zf2PngTivi9Lup96OOlCG@jWg=wbx5Ij7UKr?QYD_G-|i0lHW!-t(?)Q{Ba5K9oB8? zKyqvfMDFsW8@Og9%_Jl~?z|t}m&0bl)Mz>na=gzeXdSr4YrG*(GMu!xlkEBuorB!w z6QnU@*v|FBKNdq^O?{LP>1=s7^o3&web!*2h zhSUldt*FkZ`--A}CRzO=vk}fASS4WCHr&m#8MqJ!RWU4*D9nBFj()_qd|h%|ERI#c zJr8DKniextFST9b9XluWnEb$_3$(dXKu) zh9?iBW#3ScL*TxcSatm{o>XbB?%3t4J}YBekuitHV_4WVmpCSJ9jA;^>X%Kf(ds;o ziFbDM`cPa_+DR?WA@PwEaA8B*V+Hk1 z&M0n^GuGn;sw_{G*`q-=ZJ9_Z!_T!z_oRrXBL}Qd{?zpp_;HFS8aDS94T=2f9Arz_ zQ^bjp+d|{d9y5(|Keeshy{LA0xHb8qf8SU8{n2~TX=i{gQ~ZZ&mZ1W**RGVvR%Qit@YB!q zjAm>LQCq*qoI)gs@AxrGp$5dB&###-y5i`O&Vq!8++l{eVC8ExZr`%jKb<#v35XJm zKYURmkbFB`M7n%`vWM3B4Vqq>Lvxtq%WIXH0#$Jfw*&pTG}R(+CgGmbvgGyWlS>AU z-aqAno}basT?Y#;#PDjpuzLJS?KF2-Ye-0(=y%m)26nIJ{AaXQ!MGw3?zRu6vbBJq zcf&>Nkh4OSH!H92pb02yL@%0DBf~Iyuuef>G+oLvUd$G5crS<=nuB>UtPE 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

-y0?+>(^^vxLG%z2y5 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 NpsjA8R;gke`afDd!eamc From 067deefeb6b7fd2b13c38f467d522d424880828d Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 30 Jan 2015 15:23:40 -0800 Subject: [PATCH 91/98] avoid use of snprintf --- interface/src/ui/BandwidthDialog.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/interface/src/ui/BandwidthDialog.cpp b/interface/src/ui/BandwidthDialog.cpp index 653b8de93b..8b1afc9abf 100644 --- a/interface/src/ui/BandwidthDialog.cpp +++ b/interface/src/ui/BandwidthDialog.cpp @@ -29,7 +29,6 @@ BandwidthDialog::ChannelDisplay::ChannelDisplay(BandwidthRecorder::Channel *ch, QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form) { QLabel* label = new QLabel(); - char strBuf[64]; label->setAlignment(Qt::AlignRight); @@ -39,8 +38,7 @@ QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form) { palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); label->setPalette(palette); - snprintf(strBuf, sizeof(strBuf), " %s Bandwidth In/Out:", ch->caption); - form->addRow(strBuf, label); + form->addRow((std::string(" ") + ch->caption + " Bandwidth In/Out:").c_str(), label); return label; } @@ -48,12 +46,10 @@ QLabel* BandwidthDialog::ChannelDisplay::setupLabel(QFormLayout* form) { void BandwidthDialog::ChannelDisplay::setLabelText() { - char strBuf[64]; - snprintf(strBuf, sizeof(strBuf), "%0.0f/%0.0f %s", - ch->input.getValue() * ch->unitScale, - ch->output.getValue() * ch->unitScale, - ch->unitCaption); - label->setText(strBuf); + std::string strBuf = + std::to_string ((int) (ch->input.getValue() * ch->unitScale)) + "/" + + std::to_string ((int) (ch->output.getValue() * ch->unitScale)) + " " + ch->unitCaption; + label->setText(strBuf.c_str()); } From c4a2da15d14a25ce3b7a5b8612c15eea6b0b1837 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 30 Jan 2015 15:26:07 -0800 Subject: [PATCH 92/98] change interface icon to lowercase --- interface/CMakeLists.txt | 4 ++-- .../Interface-beta.icns => interface-beta.icns} | Bin .../{icon/Interface-beta.ico => interface-beta.ico} | Bin interface/{icon/Interface.icns => interface.icns} | Bin interface/{icon/Interface.ico => interface.ico} | Bin 5 files changed, 2 insertions(+), 2 deletions(-) rename interface/{icon/Interface-beta.icns => interface-beta.icns} (100%) rename interface/{icon/Interface-beta.ico => interface-beta.ico} (100%) rename interface/{icon/Interface.icns => interface.icns} (100%) rename interface/{icon/Interface.ico => interface.ico} (100%) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index f6684fe0e8..edbf7ce762 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -85,9 +85,9 @@ if (APPLE) set(MACOSX_BUNDLE_GUI_IDENTIFIER io.highfidelity.Interface) if (CMAKE_BUILD_TYPE EQUAL "RELEASE") - set(ICON_FILENAME "Interface.icns") + set(ICON_FILENAME "interface.icns") else () - set(ICON_FILENAME "Interface-beta.icns") + set(ICON_FILENAME "interface-beta.icns") endif () # set how the icon shows up in the Info.plist file diff --git a/interface/icon/Interface-beta.icns b/interface/interface-beta.icns similarity index 100% rename from interface/icon/Interface-beta.icns rename to interface/interface-beta.icns diff --git a/interface/icon/Interface-beta.ico b/interface/interface-beta.ico similarity index 100% rename from interface/icon/Interface-beta.ico rename to interface/interface-beta.ico diff --git a/interface/icon/Interface.icns b/interface/interface.icns similarity index 100% rename from interface/icon/Interface.icns rename to interface/interface.icns diff --git a/interface/icon/Interface.ico b/interface/interface.ico similarity index 100% rename from interface/icon/Interface.ico rename to interface/interface.ico From 2c7450239406e7cc680622292a37a7c56ead4bf5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 30 Jan 2015 15:26:29 -0800 Subject: [PATCH 93/98] move Interface icon back in icon sub-folder --- interface/{ => icon}/interface-beta.icns | Bin interface/{ => icon}/interface-beta.ico | Bin interface/{ => icon}/interface.icns | Bin interface/{ => icon}/interface.ico | Bin 4 files changed, 0 insertions(+), 0 deletions(-) rename interface/{ => icon}/interface-beta.icns (100%) rename interface/{ => icon}/interface-beta.ico (100%) rename interface/{ => icon}/interface.icns (100%) rename interface/{ => icon}/interface.ico (100%) diff --git a/interface/interface-beta.icns b/interface/icon/interface-beta.icns similarity index 100% rename from interface/interface-beta.icns rename to interface/icon/interface-beta.icns diff --git a/interface/interface-beta.ico b/interface/icon/interface-beta.ico similarity index 100% rename from interface/interface-beta.ico rename to interface/icon/interface-beta.ico diff --git a/interface/interface.icns b/interface/icon/interface.icns similarity index 100% rename from interface/interface.icns rename to interface/icon/interface.icns diff --git a/interface/interface.ico b/interface/icon/interface.ico similarity index 100% rename from interface/interface.ico rename to interface/icon/interface.ico From f78f6ab4cf9c6118217a4a99ae565d236620ba90 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 30 Jan 2015 15:41:44 -0800 Subject: [PATCH 94/98] fix check for debug/release icon --- interface/CMakeLists.txt | 2 +- interface/icon/interface-beta.icns | Bin 123151 -> 125290 bytes interface/icon/interface.icns | Bin 126362 -> 138314 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index edbf7ce762..9c506fdc11 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -84,7 +84,7 @@ if (APPLE) set(MACOSX_BUNDLE_BUNDLE_NAME Interface) set(MACOSX_BUNDLE_GUI_IDENTIFIER io.highfidelity.Interface) - if (CMAKE_BUILD_TYPE EQUAL "RELEASE") + if (${CMAKE_BUILD_TYPE} MATCHES "RELEASE") set(ICON_FILENAME "interface.icns") else () set(ICON_FILENAME "interface-beta.icns") diff --git a/interface/icon/interface-beta.icns b/interface/icon/interface-beta.icns index 15b373767af3de955a8471c7b46097db1a237d32..af4f7cf4995878825665464bb0f028b7ea861f5f 100644 GIT binary patch literal 125290 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≺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 z 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

bj2dNIw=J%B_?Cr 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 VfnW8HU-mBm_(lIb!N2zJ{{xU7N6-KO literal 123151 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

mIeg2=ZDmR!#%HTtBJ=c;lxKz95APiLvBO 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 Nad;VI1b98m|JjCFdQAWT diff --git a/interface/icon/interface.icns b/interface/icon/interface.icns index d62e6127a059fa67b68c7512c9f90ef94b6a6b6a..bc2eff31e5c94b7fd61081681825948f7b267a6a 100644 GIT binary patch literal 138314 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 e0OCU4I|u6-pI{>o4;ax8J8A&yP8FY< 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 literal 126362 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 %0H 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

l_b)0tLpdugOUtVRg3PJ*Jge*REUiFnZ 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 fKZyY#pNa;Ca$)9>3M1?EXp0Bb)wC?FK(0%tECI z=J&hZNi{l1>}{^&zQgGAOHdyWjsKaxSEn zlMmOJ8B|<^H+t>|m6psVb9BY~p9fLDA0iNaZkQvC}NczkJxki2dRHQLBK@=B-MA`rQ`_xn9smGRUrq78=u zWf$PpBqXO7C_3JQg~mMPo%v&}_Q2DIOV{icdj`(-DP5%-P4Z5VyjYseZ5Q8G_41Wq zY<&wMpEPWRx<61LV`l4z2dYe$~ z>+j-zzk1m7w;^F}lo%52ZG}lY2(EzI{F zz>Zcb#&M8f=Odg_E{E`oqmC+4_fV$HH)6GeImnK(zr&3?GrB+COw{&Uc6_%^3^|e~zLVtH(90}F znN(PFJWy8ZSmj8P4wy6G^^M^irM-YN$x9H-e~bAtb*sqG3_5*H^m|*nv@%kB*^!xP2kE1EfTj7oygonZThTrSC){rN&C75Q)~LUfiu!-MTKYo zfDT+s26c)vbJfndawK+{nVjSJEakQK+#ZAxf(4l>IO?H#0yULgTPxtKKJnc&h3K_w zqFH(f4K@@}iZfqJWDdmb6JK-vMiqsxVI1%VWSVJZq1-C7n`5B#-k;O_WyOURevW-M&C+C*NbgEm562nId3iISWZg`AgG2m zfVnu|hKKM5T1=r$>MPRe)1;IbJ6Jw9%JvzQ;kX=S@HfaINa>ojyJ24lLXa=-e7Cwk z`&fe-m{>Y&Z+)m_WR_eXZnEHV?>B0=qn5_!c-|VeKY7q!{cdoqFd;1eLq<}bIHf<6 zKS8Kp-`O0jUScT(U|=emQs(~V>v-HmF)3pw;9rh_utp!@OD8v&)&x3CrSzFNU)+o8;;EzR)j%V>}ctcbzO?8 z>MxuVe=oOu_vXgEL;?+9Nx+wjUqD~)m-6QPidj>DRdf#pg*v!+FffyT-DwND@L@e( zEpJpHYby7wCPyW7#{Q)e5H&g-^o?Bfc)5U+%$iM|2s_sIOe4wnGLgy_IQSeR2P?vp zsAOJA8k=WJlI~;NS8AV+?Lr!>Ts-uNEwh6q}081 zrOykKZ7V#c67KB&rV1ADLWTX({~(9ubeinQCdzd=gILDTJ?4ngWypqIc>ZL#T8LfW z>);(fEdNKD3hl_{81ZF#j%Z*4JklMQ5n6Kbq_B@f7t3nVoGFiQJ{2t=r0vI zY3Pm;i~{NtEzLIM5>>Z}GWje_WbxoDl8LIujv{e<-&`J>u}>Af990`e^!-yItlF0z zI0z00rqM?!dO4r-fijo41+Qq9; zaF?`X919ViL7WfVNwg4RU2u+QO37wrfb!UqYe)2)8oMA1nkjv8fgaM$D(P%SZDCzF zuP4@Z3f+{vb!+s};;n&E^XBwOUIHCxMbb(y)sKQP;-q2b3G!g~pzGS^dZxn$G|16p z$A-f%5AZvm;GS4QnWgI;uKb6dscR}^0X)KfS;}yRbO?H}sZ;Ua2*&t7mFtJbC68IHH1vU!2E-dB_mg{AoW5ls)wJ{CJx$;h@R zD$*oTbMuawKA-qlR*g%bse;D$g>LE}!|nmk8)V(dXtTr%U*@;m4BS25V1&HIBZJD+ zA%>RevY$UE7X;CvFQKV|$UL}YIcsSx69Np35!9>>OAuTNrSI7W1&v60y0dZmFIvYd76{Y|YuLlYENGX0pfQkd@EyMA)3>TIK4w_2 zJ&iSjP9lE0f!`y%02qACPk0fx(Vlj{a!%(Ku6;H#`7}Z06a)`DtP;K|IY@lRIw9aR zA5eyt5ZpAv^Hy~{X#R{8**NoU1EY8}6>O25wt}@!|91f@C0+54vvp6OPnRc#RDYO> z9^el5|66>(#1@46MmL}xN6AYYlB{`{J|KH`kN6WJ7P*b!oc|T>bVY%jZ^0KW$K`kI z(*361_Qa`g;cT?4pD;s9u3EKV1Or-r-S7)Mr5EcvVA7|_|8}h-dUt_in-hpQk@!I( zzhXWE6Om16&DlD85k#Y}S+31CnWdtBhoKIsIgzj->KH5;iZqHz>DP}E?RTI8`Zi}N zauF)IS#zo6kI3rrCOxVNk}!)duM6(whZqg Date: Fri, 30 Jan 2015 15:56:01 -0800 Subject: [PATCH 95/98] A further custom User-Agent string --- libraries/script-engine/src/BatchLoader.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp index e2c345ce16..c455ca91ec 100644 --- a/libraries/script-engine/src/BatchLoader.cpp +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -15,6 +15,7 @@ #include #include "BatchLoader.h" #include +#include BatchLoader::BatchLoader(const QList& urls) : QObject(), @@ -33,7 +34,9 @@ void BatchLoader::start() { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); for (QUrl url : _urls) { if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest request = QNetworkRequest(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(request); qDebug() << "Downloading file at" << url; From bc52ba1d291d6c7b41cd3f9dd2f9b233b47d4d4b Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 30 Jan 2015 16:18:50 -0800 Subject: [PATCH 96/98] restore polymorphism for Box and Sphere entities --- libraries/entities/src/BoxEntityItem.cpp | 5 ++++ libraries/entities/src/BoxEntityItem.h | 2 ++ libraries/entities/src/EntityItem.cpp | 26 +++++++-------------- libraries/entities/src/SphereEntityItem.cpp | 6 +++++ libraries/entities/src/SphereEntityItem.h | 2 ++ 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 1e8c811122..25ef2e6aaf 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -96,6 +96,11 @@ void BoxEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitst APPEND_ENTITY_PROPERTY(PROP_COLOR, appendColor, getColor()); } +void BoxEntityItem::computeShapeInfo(ShapeInfo& info) const { + glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); + info.setBox(halfExtents); +} + void BoxEntityItem::debugDump() const { quint64 now = usecTimestampNow(); qDebug() << " BOX EntityItem id:" << getEntityItemID() << "---------------------------------------------"; diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index a9c3e724a7..8d68a13158 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -51,6 +51,8 @@ public: _color[BLUE_INDEX] = value.blue; } + void computeShapeInfo(ShapeInfo& info) const; + virtual void debugDump() const; protected: diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 68b5d1bb05..fa9487c6f6 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1021,25 +1021,17 @@ float EntityItem::getRadius() const { } void EntityItem::computeShapeInfo(ShapeInfo& info) const { - info.clear(); - if (_type == EntityTypes::Sphere) { - glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); - // TODO: support ellipsoid shapes - info.setSphere(halfExtents.x); - } else if (_type == EntityTypes::Box) { + // HACK: Default first first approximation is to boxify the entity... but only if it is small enough. + // The limit here is chosen to something that most avatars could not comfortably fit inside + // to prevent houses from getting boxified... we don't want the things inside houses to + // collide with a house as if it were a giant solid block. + const float MAX_SIZE_FOR_BOXIFICATION_HACK = 3.0f; + float diagonal = glm::length(getDimensionsInMeters()); + if (diagonal < MAX_SIZE_FOR_BOXIFICATION_HACK) { glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); info.setBox(halfExtents); - } else if (_type == EntityTypes::Model) { - // For first approximation we just boxify all models... but only if they are small enough. - // The limit here is chosen to something that most avatars could not comfortably fit inside - // to prevent houses from getting boxified... we don't want the things inside houses to - // collide with a house as if it were a giant solid block. - const float MAX_SIZE_FOR_BOXIFICATION_HACK = 3.0f; - float diagonal = glm::length(getDimensionsInMeters()); - if (diagonal < MAX_SIZE_FOR_BOXIFICATION_HACK) { - glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); - info.setBox(halfExtents); - } + } else { + info.clear(); } } diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 865fb88463..181e5851f6 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -101,6 +101,12 @@ void SphereEntityItem::recalculateCollisionShape() { _sphereShape.setRadius(largestDiameter / 2.0f); } +void SphereEntityItem::computeShapeInfo(ShapeInfo& info) const { + glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); + // TODO: support ellipsoid shapes + info.setSphere(halfExtents.x); +} + bool SphereEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index fdc0b7f866..f76c9f5600 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -56,6 +56,8 @@ public: // TODO: implement proper contains for 3D ellipsoid //virtual bool contains(const glm::vec3& point) const; + void computeShapeInfo(ShapeInfo& info) const; + virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, From 9da6b623a33408b0c25739a00bbfe48ba216e169 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 30 Jan 2015 16:25:35 -0800 Subject: [PATCH 97/98] move shape polymorphism to ModelEntityItem --- libraries/entities/src/EntityItem.cpp | 13 +------------ libraries/entities/src/ModelEntityItem.cpp | 15 +++++++++++++++ libraries/entities/src/ModelEntityItem.h | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index fa9487c6f6..9012b2e50b 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1021,18 +1021,7 @@ float EntityItem::getRadius() const { } void EntityItem::computeShapeInfo(ShapeInfo& info) const { - // HACK: Default first first approximation is to boxify the entity... but only if it is small enough. - // The limit here is chosen to something that most avatars could not comfortably fit inside - // to prevent houses from getting boxified... we don't want the things inside houses to - // collide with a house as if it were a giant solid block. - const float MAX_SIZE_FOR_BOXIFICATION_HACK = 3.0f; - float diagonal = glm::length(getDimensionsInMeters()); - if (diagonal < MAX_SIZE_FOR_BOXIFICATION_HACK) { - glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); - info.setBox(halfExtents); - } else { - info.clear(); - } + info.clear(); } void EntityItem::recalculateCollisionShape() { diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 2c3dcd0600..bfab8871a5 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -245,6 +245,21 @@ bool ModelEntityItem::needsToCallUpdate() const { return isAnimatingSomething() ? true : EntityItem::needsToCallUpdate(); } +void ModelEntityItem::computeShapeInfo(ShapeInfo& info) const { + // HACK: Default first first approximation is to boxify the entity... but only if it is small enough. + // The limit here is chosen to something that most avatars could not comfortably fit inside + // to prevent houses from getting boxified... we don't want the things inside houses to + // collide with a house as if it were a giant solid block. + const float MAX_SIZE_FOR_BOXIFICATION_HACK = 3.0f; + float diagonal = glm::length(getDimensionsInMeters()); + if (diagonal < MAX_SIZE_FOR_BOXIFICATION_HACK) { + glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); + info.setBox(halfExtents); + } else { + info.clear(); + } +} + void ModelEntityItem::update(const quint64& now) { // only advance the frame index if we're playing if (getAnimationIsPlaying()) { diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index a607745475..3db2a40db0 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -46,6 +46,7 @@ public: virtual void update(const quint64& now); virtual bool needsToCallUpdate() const; + void computeShapeInfo(ShapeInfo& info) const; virtual void debugDump() const; From a723c748f542864b2b4bfcd183d7b06b24311d93 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 30 Jan 2015 18:08:00 -0800 Subject: [PATCH 98/98] check initialization of _needsInitialSimulation --- libraries/entities-renderer/src/RenderableModelEntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 7adb857902..ee81c5b177 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -149,7 +149,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { glm::quat rotation = getRotation(); bool movingOrAnimating = isMoving() || isAnimatingSomething(); - if (movingOrAnimating && _model->isActive()) { + if ((movingOrAnimating || _needsInitialSimulation) && _model->isActive()) { _model->setScaleToFit(true, dimensions); _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint()); _model->setRotation(rotation);

J#*`?t?0Kf&`$P;vy4x!ydgi{#k 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 z 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