From a03c2b79fa2ff6f61aa0199305760ae15e9f5f8f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 8 Jan 2015 15:52:33 -0800 Subject: [PATCH 001/238] 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 002/238] 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 003/238] 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 004/238] 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 005/238] 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 006/238] 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 007/238] 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 0041d489ccda8916250f5f5187a3f7a770cddc92 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 16 Jan 2015 14:37:38 -0800 Subject: [PATCH 008/238] Move stuf around in Menu for easier cleanup --- interface/src/Menu.cpp | 464 +++++++++++++++++++++-------------------- interface/src/Menu.h | 139 ++++++------ 2 files changed, 308 insertions(+), 295 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c96ca9bb6f..686de54894 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -757,10 +757,6 @@ void Menu::scanMenu(QMenu* menu, settingsAction modifySetting, QSettings* set) { set->endGroup(); } -bool Menu::getShadowsEnabled() const { - return isOptionChecked(MenuOption::SimpleShadows) || isOptionChecked(MenuOption::CascadedShadows); -} - void Menu::addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& actionName, int menuItemLocation) { QAction* actionBefore = NULL; if (menuItemLocation >= 0 && destinationMenu->actions().size() > menuItemLocation) { @@ -903,6 +899,236 @@ QAction* Menu::getActionForOption(const QString& menuOption) { return _actionHash.value(menuOption); } +QAction* Menu::getActionFromName(const QString& menuName, QMenu* menu) { + QList menuActions; + if (menu) { + menuActions = menu->actions(); + } else { + menuActions = actions(); + } + + foreach (QAction* menuAction, menuActions) { + if (menuName == menuAction->text()) { + return menuAction; + } + } + return NULL; +} + +QMenu* Menu::getSubMenuFromName(const QString& menuName, QMenu* menu) { + QAction* action = getActionFromName(menuName, menu); + if (action) { + return action->menu(); + } + return NULL; +} + +QMenu* Menu::getMenuParent(const QString& menuName, QString& finalMenuPart) { + QStringList menuTree = menuName.split(">"); + QMenu* parent = NULL; + QMenu* menu = NULL; + foreach (QString menuTreePart, menuTree) { + parent = menu; + finalMenuPart = menuTreePart.trimmed(); + menu = getSubMenuFromName(finalMenuPart, parent); + if (!menu) { + break; + } + } + return parent; +} + +QMenu* Menu::getMenu(const QString& menuName) { + QStringList menuTree = menuName.split(">"); + QMenu* parent = NULL; + QMenu* menu = NULL; + int item = 0; + foreach (QString menuTreePart, menuTree) { + menu = getSubMenuFromName(menuTreePart.trimmed(), parent); + if (!menu) { + break; + } + parent = menu; + item++; + } + return menu; +} + +QAction* Menu::getMenuAction(const QString& menuName) { + QStringList menuTree = menuName.split(">"); + QMenu* parent = NULL; + QAction* action = NULL; + foreach (QString menuTreePart, menuTree) { + action = getActionFromName(menuTreePart.trimmed(), parent); + if (!action) { + break; + } + parent = action->menu(); + } + return action; +} + +int Menu::findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem) { + int position = 0; + foreach(QAction* action, menu->actions()) { + if (action->text() == searchMenuItem) { + return position; + } + position++; + } + return UNSPECIFIED_POSITION; // not found +} + +int Menu::positionBeforeSeparatorIfNeeded(QMenu* menu, int requestedPosition) { + QList menuActions = menu->actions(); + if (requestedPosition > 1 && requestedPosition < menuActions.size()) { + QAction* beforeRequested = menuActions[requestedPosition - 1]; + if (beforeRequested->isSeparator()) { + requestedPosition--; + } + } + return requestedPosition; +} + + +QMenu* Menu::addMenu(const QString& menuName) { + QStringList menuTree = menuName.split(">"); + QMenu* addTo = NULL; + QMenu* menu = NULL; + foreach (QString menuTreePart, menuTree) { + menu = getSubMenuFromName(menuTreePart.trimmed(), addTo); + if (!menu) { + if (!addTo) { + menu = QMenuBar::addMenu(menuTreePart.trimmed()); + } else { + menu = addTo->addMenu(menuTreePart.trimmed()); + } + } + addTo = menu; + } + + QMenuBar::repaint(); + return menu; +} + +void Menu::removeMenu(const QString& menuName) { + QAction* action = getMenuAction(menuName); + + // only proceed if the menu actually exists + if (action) { + QString finalMenuPart; + QMenu* parent = getMenuParent(menuName, finalMenuPart); + if (parent) { + parent->removeAction(action); + } else { + QMenuBar::removeAction(action); + } + + QMenuBar::repaint(); + } +} + +bool Menu::menuExists(const QString& menuName) { + QAction* action = getMenuAction(menuName); + + // only proceed if the menu actually exists + if (action) { + return true; + } + return false; +} + +void Menu::addSeparator(const QString& menuName, const QString& separatorName) { + QMenu* menuObj = getMenu(menuName); + if (menuObj) { + addDisabledActionAndSeparator(menuObj, separatorName); + } +} + +void Menu::removeSeparator(const QString& menuName, const QString& separatorName) { + QMenu* menu = getMenu(menuName); + bool separatorRemoved = false; + if (menu) { + int textAt = findPositionOfMenuItem(menu, separatorName); + QList menuActions = menu->actions(); + QAction* separatorText = menuActions[textAt]; + if (textAt > 0 && textAt < menuActions.size()) { + QAction* separatorLine = menuActions[textAt - 1]; + if (separatorLine) { + if (separatorLine->isSeparator()) { + menu->removeAction(separatorText); + menu->removeAction(separatorLine); + separatorRemoved = true; + } + } + } + } + if (separatorRemoved) { + QMenuBar::repaint(); + } +} + +void Menu::addMenuItem(const MenuItemProperties& properties) { + QMenu* menuObj = getMenu(properties.menuName); + if (menuObj) { + QShortcut* shortcut = NULL; + if (!properties.shortcutKeySequence.isEmpty()) { + shortcut = new QShortcut(properties.shortcutKeySequence, this); + } + + // check for positioning requests + int requestedPosition = properties.position; + if (requestedPosition == UNSPECIFIED_POSITION && !properties.beforeItem.isEmpty()) { + requestedPosition = findPositionOfMenuItem(menuObj, properties.beforeItem); + // double check that the requested location wasn't a separator label + requestedPosition = positionBeforeSeparatorIfNeeded(menuObj, requestedPosition); + } + if (requestedPosition == UNSPECIFIED_POSITION && !properties.afterItem.isEmpty()) { + int afterPosition = findPositionOfMenuItem(menuObj, properties.afterItem); + if (afterPosition != UNSPECIFIED_POSITION) { + requestedPosition = afterPosition + 1; + } + } + + QAction* menuItemAction = NULL; + if (properties.isSeparator) { + addDisabledActionAndSeparator(menuObj, properties.menuItemName, requestedPosition); + } else if (properties.isCheckable) { + menuItemAction = addCheckableActionToQMenuAndActionHash(menuObj, properties.menuItemName, + properties.shortcutKeySequence, properties.isChecked, + MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()), requestedPosition); + } else { + menuItemAction = addActionToQMenuAndActionHash(menuObj, properties.menuItemName, properties.shortcutKeySequence, + MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()), + QAction::NoRole, requestedPosition); + } + if (shortcut && menuItemAction) { + connect(shortcut, SIGNAL(activated()), menuItemAction, SLOT(trigger())); + } + QMenuBar::repaint(); + } +} + +void Menu::removeMenuItem(const QString& menu, const QString& menuitem) { + QMenu* menuObj = getMenu(menu); + if (menuObj) { + removeAction(menuObj, menuitem); + QMenuBar::repaint(); + } +}; + +bool Menu::menuItemExists(const QString& menu, const QString& menuitem) { + QAction* menuItemAction = _actionHash.value(menuitem); + if (menuItemAction) { + return (getMenu(menu) != NULL); + } + return false; +}; + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////// TODO: Move to appropriate files //////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Menu::aboutApp() { InfoView::forcedShow(INFO_HELP_PATH); } @@ -911,6 +1137,10 @@ void Menu::showEditEntitiesHelp() { InfoView::forcedShow(INFO_EDIT_ENTITIES_PATH); } +bool Menu::getShadowsEnabled() const { + return isOptionChecked(MenuOption::SimpleShadows) || isOptionChecked(MenuOption::CascadedShadows); +} + void Menu::bumpSettings() { Application::getInstance()->bumpSettings(); } @@ -1511,232 +1741,6 @@ void Menu::runTests() { runTimingTests(); } -QAction* Menu::getActionFromName(const QString& menuName, QMenu* menu) { - QList menuActions; - if (menu) { - menuActions = menu->actions(); - } else { - menuActions = actions(); - } - - foreach (QAction* menuAction, menuActions) { - if (menuName == menuAction->text()) { - return menuAction; - } - } - return NULL; -} - -QMenu* Menu::getSubMenuFromName(const QString& menuName, QMenu* menu) { - QAction* action = getActionFromName(menuName, menu); - if (action) { - return action->menu(); - } - return NULL; -} - -QMenu* Menu::getMenuParent(const QString& menuName, QString& finalMenuPart) { - QStringList menuTree = menuName.split(">"); - QMenu* parent = NULL; - QMenu* menu = NULL; - foreach (QString menuTreePart, menuTree) { - parent = menu; - finalMenuPart = menuTreePart.trimmed(); - menu = getSubMenuFromName(finalMenuPart, parent); - if (!menu) { - break; - } - } - return parent; -} - -QMenu* Menu::getMenu(const QString& menuName) { - QStringList menuTree = menuName.split(">"); - QMenu* parent = NULL; - QMenu* menu = NULL; - int item = 0; - foreach (QString menuTreePart, menuTree) { - menu = getSubMenuFromName(menuTreePart.trimmed(), parent); - if (!menu) { - break; - } - parent = menu; - item++; - } - return menu; -} - -QAction* Menu::getMenuAction(const QString& menuName) { - QStringList menuTree = menuName.split(">"); - QMenu* parent = NULL; - QAction* action = NULL; - foreach (QString menuTreePart, menuTree) { - action = getActionFromName(menuTreePart.trimmed(), parent); - if (!action) { - break; - } - parent = action->menu(); - } - return action; -} - -int Menu::findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem) { - int position = 0; - foreach(QAction* action, menu->actions()) { - if (action->text() == searchMenuItem) { - return position; - } - position++; - } - return UNSPECIFIED_POSITION; // not found -} - -int Menu::positionBeforeSeparatorIfNeeded(QMenu* menu, int requestedPosition) { - QList menuActions = menu->actions(); - if (requestedPosition > 1 && requestedPosition < menuActions.size()) { - QAction* beforeRequested = menuActions[requestedPosition - 1]; - if (beforeRequested->isSeparator()) { - requestedPosition--; - } - } - return requestedPosition; -} - - -QMenu* Menu::addMenu(const QString& menuName) { - QStringList menuTree = menuName.split(">"); - QMenu* addTo = NULL; - QMenu* menu = NULL; - foreach (QString menuTreePart, menuTree) { - menu = getSubMenuFromName(menuTreePart.trimmed(), addTo); - if (!menu) { - if (!addTo) { - menu = QMenuBar::addMenu(menuTreePart.trimmed()); - } else { - menu = addTo->addMenu(menuTreePart.trimmed()); - } - } - addTo = menu; - } - - QMenuBar::repaint(); - return menu; -} - -void Menu::removeMenu(const QString& menuName) { - QAction* action = getMenuAction(menuName); - - // only proceed if the menu actually exists - if (action) { - QString finalMenuPart; - QMenu* parent = getMenuParent(menuName, finalMenuPart); - if (parent) { - parent->removeAction(action); - } else { - QMenuBar::removeAction(action); - } - - QMenuBar::repaint(); - } -} - -bool Menu::menuExists(const QString& menuName) { - QAction* action = getMenuAction(menuName); - - // only proceed if the menu actually exists - if (action) { - return true; - } - return false; -} - -void Menu::addSeparator(const QString& menuName, const QString& separatorName) { - QMenu* menuObj = getMenu(menuName); - if (menuObj) { - addDisabledActionAndSeparator(menuObj, separatorName); - } -} - -void Menu::removeSeparator(const QString& menuName, const QString& separatorName) { - QMenu* menu = getMenu(menuName); - bool separatorRemoved = false; - if (menu) { - int textAt = findPositionOfMenuItem(menu, separatorName); - QList menuActions = menu->actions(); - QAction* separatorText = menuActions[textAt]; - if (textAt > 0 && textAt < menuActions.size()) { - QAction* separatorLine = menuActions[textAt - 1]; - if (separatorLine) { - if (separatorLine->isSeparator()) { - menu->removeAction(separatorText); - menu->removeAction(separatorLine); - separatorRemoved = true; - } - } - } - } - if (separatorRemoved) { - QMenuBar::repaint(); - } -} - -void Menu::addMenuItem(const MenuItemProperties& properties) { - QMenu* menuObj = getMenu(properties.menuName); - if (menuObj) { - QShortcut* shortcut = NULL; - if (!properties.shortcutKeySequence.isEmpty()) { - shortcut = new QShortcut(properties.shortcutKeySequence, this); - } - - // check for positioning requests - int requestedPosition = properties.position; - if (requestedPosition == UNSPECIFIED_POSITION && !properties.beforeItem.isEmpty()) { - requestedPosition = findPositionOfMenuItem(menuObj, properties.beforeItem); - // double check that the requested location wasn't a separator label - requestedPosition = positionBeforeSeparatorIfNeeded(menuObj, requestedPosition); - } - if (requestedPosition == UNSPECIFIED_POSITION && !properties.afterItem.isEmpty()) { - int afterPosition = findPositionOfMenuItem(menuObj, properties.afterItem); - if (afterPosition != UNSPECIFIED_POSITION) { - requestedPosition = afterPosition + 1; - } - } - - QAction* menuItemAction = NULL; - if (properties.isSeparator) { - addDisabledActionAndSeparator(menuObj, properties.menuItemName, requestedPosition); - } else if (properties.isCheckable) { - menuItemAction = addCheckableActionToQMenuAndActionHash(menuObj, properties.menuItemName, - properties.shortcutKeySequence, properties.isChecked, - MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()), requestedPosition); - } else { - menuItemAction = addActionToQMenuAndActionHash(menuObj, properties.menuItemName, properties.shortcutKeySequence, - MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()), - QAction::NoRole, requestedPosition); - } - if (shortcut && menuItemAction) { - connect(shortcut, SIGNAL(activated()), menuItemAction, SLOT(trigger())); - } - QMenuBar::repaint(); - } -} - -void Menu::removeMenuItem(const QString& menu, const QString& menuitem) { - QMenu* menuObj = getMenu(menu); - if (menuObj) { - removeAction(menuObj, menuitem); - QMenuBar::repaint(); - } -}; - -bool Menu::menuItemExists(const QString& menu, const QString& menuitem) { - QAction* menuItemAction = _actionHash.value(menuitem); - if (menuItemAction) { - return (getMenu(menu) != NULL); - } - return false; -}; - QString Menu::getSnapshotsLocation() const { if (_snapshotsLocation.isNull() || _snapshotsLocation.isEmpty() || QDir(_snapshotsLocation).exists() == false) { return QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 52fb17a10d..392e7ddf71 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -83,7 +83,80 @@ public: void triggerOption(const QString& menuOption); QAction* getActionForOption(const QString& menuOption); - + + QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, + const QString& actionName, + const QKeySequence& shortcut = 0, + const QObject* receiver = NULL, + const char* member = NULL, + QAction::MenuRole role = QAction::NoRole, + int menuItemLocation = UNSPECIFIED_POSITION); + QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, + QAction* action, + const QString& actionName = QString(), + const QKeySequence& shortcut = 0, + QAction::MenuRole role = QAction::NoRole, + int menuItemLocation = UNSPECIFIED_POSITION); + + void removeAction(QMenu* menu, const QString& actionName); + +public slots: + void loadSettings(QSettings* settings = NULL); + void saveSettings(QSettings* settings = NULL); + void importSettings(); + void exportSettings(); + + QMenu* addMenu(const QString& menuName); + void removeMenu(const QString& menuName); + bool menuExists(const QString& menuName); + void addSeparator(const QString& menuName, const QString& separatorName); + void removeSeparator(const QString& menuName, const QString& separatorName); + void addMenuItem(const MenuItemProperties& properties); + void removeMenuItem(const QString& menuName, const QString& menuitem); + bool menuItemExists(const QString& menuName, const QString& menuitem); + bool isOptionChecked(const QString& menuOption) const; + void setIsOptionChecked(const QString& menuOption, bool isChecked); + +private: + static Menu* _instance; + Menu(); + + typedef void(*settingsAction)(QSettings*, QAction*); + static void loadAction(QSettings* set, QAction* action); + static void saveAction(QSettings* set, QAction* action); + void scanMenuBar(settingsAction modifySetting, QSettings* set); + void scanMenu(QMenu* menu, settingsAction modifySetting, QSettings* set); + + /// helper method to have separators with labels that are also compatible with OS X + void addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& actionName, + int menuItemLocation = UNSPECIFIED_POSITION); + + QAction* addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu, + const QString& actionName, + const QKeySequence& shortcut = 0, + const bool checked = false, + const QObject* receiver = NULL, + const char* member = NULL, + int menuItemLocation = UNSPECIFIED_POSITION); + + QAction* getActionFromName(const QString& menuName, QMenu* menu); + QMenu* getSubMenuFromName(const QString& menuName, QMenu* menu); + QMenu* getMenuParent(const QString& menuName, QString& finalMenuPart); + + QAction* getMenuAction(const QString& menuName); + int findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem); + int positionBeforeSeparatorIfNeeded(QMenu* menu, int requestedPosition); + QMenu* getMenu(const QString& menuName); + + + QHash _actionHash; + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////// TODO: Move to appropriate files //////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +public: const InboundAudioStream::Settings& getReceivedAudioStreamSettings() const { return _receivedAudioStreamSettings; } void setReceivedAudioStreamSettings(const InboundAudioStream::Settings& receivedAudioStreamSettings) { _receivedAudioStreamSettings = receivedAudioStreamSettings; } float getFieldOfView() const { return _fieldOfView; } @@ -140,22 +213,6 @@ public: // User Tweakable PPS from Voxel Server int getMaxOctreePacketsPerSecond() const { return _maxOctreePacketsPerSecond; } void setMaxOctreePacketsPerSecond(int value) { _maxOctreePacketsPerSecond = value; bumpSettings(); } - - QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, - const QString& actionName, - const QKeySequence& shortcut = 0, - const QObject* receiver = NULL, - const char* member = NULL, - QAction::MenuRole role = QAction::NoRole, - int menuItemLocation = UNSPECIFIED_POSITION); - QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, - QAction* action, - const QString& actionName = QString(), - const QKeySequence& shortcut = 0, - QAction::MenuRole role = QAction::NoRole, - int menuItemLocation = UNSPECIFIED_POSITION); - - void removeAction(QMenu* menu, const QString& actionName); const QByteArray& getWalletPrivateKey() const { return _walletPrivateKey; } @@ -172,10 +229,6 @@ public slots: void cachesSizeDialog(); void lodTools(); void hmdTools(bool showTools); - void loadSettings(QSettings* settings = NULL); - void saveSettings(QSettings* settings = NULL); - void importSettings(); - void exportSettings(); void toggleAddressBar(); void copyAddress(); void copyPath(); @@ -183,17 +236,6 @@ public slots: void toggleLoginMenuItem(); void toggleSixense(bool shouldEnable); - QMenu* addMenu(const QString& menuName); - void removeMenu(const QString& menuName); - bool menuExists(const QString& menuName); - void addSeparator(const QString& menuName, const QString& separatorName); - void removeSeparator(const QString& menuName, const QString& separatorName); - void addMenuItem(const MenuItemProperties& properties); - void removeMenuItem(const QString& menuName, const QString& menuitem); - bool menuItemExists(const QString& menuName, const QString& menuitem); - bool isOptionChecked(const QString& menuOption) const; - void setIsOptionChecked(const QString& menuOption, bool isChecked); - private slots: void aboutApp(); void showEditEntitiesHelp(); @@ -220,39 +262,6 @@ private slots: void loadRSSDKFile(); private: - static Menu* _instance; - - Menu(); - - typedef void(*settingsAction)(QSettings*, QAction*); - static void loadAction(QSettings* set, QAction* action); - static void saveAction(QSettings* set, QAction* action); - void scanMenuBar(settingsAction modifySetting, QSettings* set); - void scanMenu(QMenu* menu, settingsAction modifySetting, QSettings* set); - - /// helper method to have separators with labels that are also compatible with OS X - void addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& actionName, - int menuItemLocation = UNSPECIFIED_POSITION); - - QAction* addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu, - const QString& actionName, - const QKeySequence& shortcut = 0, - const bool checked = false, - const QObject* receiver = NULL, - const char* member = NULL, - int menuItemLocation = UNSPECIFIED_POSITION); - - QAction* getActionFromName(const QString& menuName, QMenu* menu); - QMenu* getSubMenuFromName(const QString& menuName, QMenu* menu); - QMenu* getMenuParent(const QString& menuName, QString& finalMenuPart); - - QAction* getMenuAction(const QString& menuName); - int findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem); - int positionBeforeSeparatorIfNeeded(QMenu* menu, int requestedPosition); - QMenu* getMenu(const QString& menuName); - - - QHash _actionHash; InboundAudioStream::Settings _receivedAudioStreamSettings; // in Degrees, doesn't apply to HMD like Oculus float _fieldOfView = DEFAULT_FIELD_OF_VIEW_DEGREES; From 8996bf8e0d3bd802bae5157b25fca695dad4ce6d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 16 Jan 2015 15:26:42 -0800 Subject: [PATCH 009/238] Use qApp Reuse qApp global variable following Qt's pattern --- interface/src/Application.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index a66a30abce..7b86236ffa 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -121,6 +121,12 @@ static const quint64 TOO_LONG_SINCE_LAST_SEND_DOWNSTREAM_AUDIO_STATS = 1 * USECS static const QString INFO_HELP_PATH = "html/interface-welcome-allsvg.html"; static const QString INFO_EDIT_ENTITIES_PATH = "html/edit-entities-commands.html"; +class Application; +#if defined(qApp) +#undef qApp +#endif +#define qApp (static_cast(QCoreApplication::instance())) + class Application : public QApplication, public AbstractViewStateInterface, AbstractScriptingServicesInterface { Q_OBJECT @@ -128,7 +134,7 @@ class Application : public QApplication, public AbstractViewStateInterface, Abst friend class DatagramProcessor; public: - static Application* getInstance() { return static_cast(QCoreApplication::instance()); } + static Application* getInstance() { return qApp; } // TODO: replace fully by qApp static const glm::vec3& getPositionForPath() { return getInstance()->_myAvatar->getPosition(); } static glm::quat getOrientationForPath() { return getInstance()->_myAvatar->getOrientation(); } From f34add9c9c3e58f65e6a60fff6e6ebf4a38f664c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 16 Jan 2015 16:30:33 -0800 Subject: [PATCH 010/238] Moved Bookmarks related funct out of Menu Took everything Bookmarks related in Menu and moved it over to Bookmarks. --- interface/src/Bookmarks.cpp | 132 ++++++++++++++++++++++++++++++++++++ interface/src/Bookmarks.h | 34 +++++++--- interface/src/Menu.cpp | 131 +---------------------------------- interface/src/Menu.h | 9 +-- 4 files changed, 161 insertions(+), 145 deletions(-) diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index d3ecf4097e..f8bc269635 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -9,10 +9,20 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include +#include +#include #include +#include #include +#include #include +#include + +#include "MainWindow.h" +#include "Menu.h" + #include "Bookmarks.h" Bookmarks::Bookmarks() { @@ -71,3 +81,125 @@ void Bookmarks::persistToFile() { QByteArray data = json.toJson(); saveFile.write(data); } + +void Bookmarks::setupMenus(Menu* menubar, QMenu* menu) { + // Add menus/actions + menubar->addActionToQMenuAndActionHash(menu, MenuOption::BookmarkLocation, 0, + this, SLOT(bookmarkLocation())); + _bookmarksMenu = menu->addMenu(MenuOption::Bookmarks); + _deleteBookmarksAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::DeleteBookmark, 0, + this, SLOT(deleteBookmark())); + + // Enable/Disable menus as needed + enableMenuItems(_bookmarks.count() > 0); + + // Load bookmarks + for (auto it = _bookmarks.begin(); it != _bookmarks.end(); ++it ) { + QString bookmarkName = it.key(); + QString bookmarkAddress = it.value().toString(); + addLocationToMenu(menubar, bookmarkName, bookmarkAddress); + } +} + +void Bookmarks::bookmarkLocation() { + QInputDialog bookmarkLocationDialog(qApp->getWindow()); + bookmarkLocationDialog.setWindowTitle("Bookmark Location"); + bookmarkLocationDialog.setLabelText("Name:"); + bookmarkLocationDialog.setInputMode(QInputDialog::TextInput); + bookmarkLocationDialog.resize(400, 200); + + if (bookmarkLocationDialog.exec() == QDialog::Rejected) { + return; + } + + QString bookmarkName = bookmarkLocationDialog.textValue().trimmed(); + bookmarkName = bookmarkName.replace(QRegExp("(\r\n|[\r\n\t\v ])+"), " "); + if (bookmarkName.length() == 0) { + return; + } + + auto addressManager = DependencyManager::get(); + QString bookmarkAddress = addressManager->currentAddress().toString(); + + Menu* menubar = Menu::getInstance(); + if (contains(bookmarkName)) { + QMessageBox duplicateBookmarkMessage; + duplicateBookmarkMessage.setIcon(QMessageBox::Warning); + duplicateBookmarkMessage.setText("The bookmark name you entered already exists in your list."); + duplicateBookmarkMessage.setInformativeText("Would you like to overwrite it?"); + duplicateBookmarkMessage.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + duplicateBookmarkMessage.setDefaultButton(QMessageBox::Yes); + if (duplicateBookmarkMessage.exec() == QMessageBox::No) { + return; + } + removeLocationFromMenu(menubar, bookmarkName); + } + + addLocationToMenu(menubar, bookmarkName, bookmarkAddress); + insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. + + enableMenuItems(true); +} + +void Bookmarks::teleportToBookmark() { + QAction* action = qobject_cast(sender()); + QString address = action->data().toString(); + DependencyManager::get()->handleLookupString(address); +} + +void Bookmarks::deleteBookmark() { + + QStringList bookmarkList; + QList menuItems = _bookmarksMenu->actions(); + for (int i = 0; i < menuItems.count(); i += 1) { + bookmarkList.append(menuItems[i]->text()); + } + + QInputDialog deleteBookmarkDialog(qApp->getWindow()); + deleteBookmarkDialog.setWindowTitle("Delete Bookmark"); + deleteBookmarkDialog.setLabelText("Select the bookmark to delete"); + deleteBookmarkDialog.resize(400, 400); + deleteBookmarkDialog.setOption(QInputDialog::UseListViewForComboBoxItems); + deleteBookmarkDialog.setComboBoxItems(bookmarkList); + deleteBookmarkDialog.setOkButtonText("Delete"); + + if (deleteBookmarkDialog.exec() == QDialog::Rejected) { + return; + } + + QString bookmarkName = deleteBookmarkDialog.textValue().trimmed(); + if (bookmarkName.length() == 0) { + return; + } + + removeLocationFromMenu(Menu::getInstance(), bookmarkName); + remove(bookmarkName); + + if (_bookmarksMenu->actions().count() == 0) { + enableMenuItems(false); + } +} + +void Bookmarks::enableMenuItems(bool enabled) { + if (_bookmarksMenu) { + _bookmarksMenu->setEnabled(enabled); + } + if (_deleteBookmarksAction) { + _deleteBookmarksAction->setEnabled(enabled); + } +} + +void Bookmarks::addLocationToMenu(Menu* menubar, QString& name, QString& address) { + QAction* teleportAction = new QAction(_bookmarksMenu); + teleportAction->setData(address); + connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); + + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, + name, 0, QAction::NoRole); +} + +void Bookmarks::removeLocationFromMenu(Menu* menubar, QString& name) { + menubar->removeAction(_bookmarksMenu, name); +} + + diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index 2f054bcdbc..59f9efb1b1 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -12,10 +12,13 @@ #ifndef hifi_Bookmarks_h #define hifi_Bookmarks_h -#include -#include #include #include +#include + +class QAction; +class QMenu; +class Menu; class Bookmarks: public QObject { Q_OBJECT @@ -23,19 +26,32 @@ class Bookmarks: public QObject { public: Bookmarks(); + void setupMenus(Menu* menubar, QMenu* menu); + +private slots: + void bookmarkLocation(); + void teleportToBookmark(); + void deleteBookmark(); + +private: + QVariantMap _bookmarks; // { name: address, ... } + + QPointer _bookmarksMenu; + QPointer _deleteBookmarksAction; + + const QString BOOKMARKS_FILENAME = "bookmarks.json"; + QString _bookmarksFilename; + void insert(const QString& name, const QString& address); // Overwrites any existing entry with same name. void remove(const QString& name); bool contains(const QString& name) const; - QVariantMap* getBookmarks() { return &_bookmarks; }; - -private: - QVariantMap _bookmarks; // { name: address, ... } - - const QString BOOKMARKS_FILENAME = "bookmarks.json"; - QString _bookmarksFilename; void readFromFile(); void persistToFile(); + + void enableMenuItems(bool enabled); + void addLocationToMenu(Menu* menubar, QString& name, QString& address); + void removeLocationFromMenu(Menu* menubar, QString& name); }; #endif // hifi_Bookmarks_h \ No newline at end of file diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 686de54894..6531344f9b 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -125,15 +125,8 @@ Menu::Menu() : appInstance, SLOT(toggleRunningScriptsWidget())); addDisabledActionAndSeparator(fileMenu, "Location"); - addActionToQMenuAndActionHash(fileMenu, MenuOption::BookmarkLocation, 0, - this, SLOT(bookmarkLocation())); - _bookmarksMenu = fileMenu->addMenu(MenuOption::Bookmarks); - _bookmarksMenu->setEnabled(false); - _deleteBookmarksMenu = addActionToQMenuAndActionHash(fileMenu, - MenuOption::DeleteBookmark, 0, - this, SLOT(deleteBookmark())); - _deleteBookmarksMenu->setEnabled(false); - loadBookmarks(); + qApp->getBookmarks()->setupMenus(this, fileMenu); + addActionToQMenuAndActionHash(fileMenu, MenuOption::AddressBar, Qt::Key_Enter, @@ -1264,125 +1257,6 @@ void Menu::changeVSync() { Application::getInstance()->setVSyncEnabled(isOptionChecked(MenuOption::RenderTargetFramerateVSyncOn)); } -void Menu::loadBookmarks() { - QVariantMap* bookmarks = Application::getInstance()->getBookmarks()->getBookmarks(); - if (bookmarks->count() > 0) { - - QMapIterator i(*bookmarks); - while (i.hasNext()) { - i.next(); - - QString bookmarkName = i.key(); - QString bookmarkAddress = i.value().toString(); - - QAction* teleportAction = new QAction(getMenu(MenuOption::Bookmarks)); - teleportAction->setData(bookmarkAddress); - connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); - - addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, bookmarkName, 0, QAction::NoRole); - } - - _bookmarksMenu->setEnabled(true); - _deleteBookmarksMenu->setEnabled(true); - } -} - -void Menu::bookmarkLocation() { - - QInputDialog bookmarkLocationDialog(Application::getInstance()->getWindow()); - bookmarkLocationDialog.setWindowTitle("Bookmark Location"); - bookmarkLocationDialog.setLabelText("Name:"); - bookmarkLocationDialog.setInputMode(QInputDialog::TextInput); - bookmarkLocationDialog.resize(400, 200); - - if (bookmarkLocationDialog.exec() == QDialog::Rejected) { - return; - } - - QString bookmarkName = bookmarkLocationDialog.textValue().trimmed(); - bookmarkName = bookmarkName.replace(QRegExp("(\r\n|[\r\n\t\v ])+"), " "); - if (bookmarkName.length() == 0) { - return; - } - - auto addressManager = DependencyManager::get(); - QString bookmarkAddress = addressManager->currentAddress().toString(); - - Bookmarks* bookmarks = Application::getInstance()->getBookmarks(); - if (bookmarks->contains(bookmarkName)) { - QMessageBox duplicateBookmarkMessage; - duplicateBookmarkMessage.setIcon(QMessageBox::Warning); - duplicateBookmarkMessage.setText("The bookmark name you entered already exists in your list."); - duplicateBookmarkMessage.setInformativeText("Would you like to overwrite it?"); - duplicateBookmarkMessage.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - duplicateBookmarkMessage.setDefaultButton(QMessageBox::Yes); - if (duplicateBookmarkMessage.exec() == QMessageBox::No) { - return; - } - removeAction(_bookmarksMenu, bookmarkName); - } - - QAction* teleportAction = new QAction(getMenu(MenuOption::Bookmarks)); - teleportAction->setData(bookmarkAddress); - connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); - - QList menuItems = _bookmarksMenu->actions(); - int position = 0; - while (position < menuItems.count() && bookmarkName > menuItems[position]->text()) { - position += 1; - } - - addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, bookmarkName, 0, - QAction::NoRole, position); - - bookmarks->insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. - - _bookmarksMenu->setEnabled(true); - _deleteBookmarksMenu->setEnabled(true); -} - -void Menu::teleportToBookmark() { - QAction *action = qobject_cast(sender()); - QString address = action->data().toString(); - DependencyManager::get()->handleLookupString(address); -} - -void Menu::deleteBookmark() { - - QStringList bookmarkList; - QList menuItems = _bookmarksMenu->actions(); - for (int i = 0; i < menuItems.count(); i += 1) { - bookmarkList.append(menuItems[i]->text()); - } - - QInputDialog deleteBookmarkDialog(Application::getInstance()->getWindow()); - deleteBookmarkDialog.setWindowTitle("Delete Bookmark"); - deleteBookmarkDialog.setLabelText("Select the bookmark to delete"); - deleteBookmarkDialog.resize(400, 400); - deleteBookmarkDialog.setOption(QInputDialog::UseListViewForComboBoxItems); - deleteBookmarkDialog.setComboBoxItems(bookmarkList); - deleteBookmarkDialog.setOkButtonText("Delete"); - - if (deleteBookmarkDialog.exec() == QDialog::Rejected) { - return; - } - - QString bookmarkName = deleteBookmarkDialog.textValue().trimmed(); - if (bookmarkName.length() == 0) { - return; - } - - removeAction(_bookmarksMenu, bookmarkName); - - Bookmarks* bookmarks = Application::getInstance()->getBookmarks(); - bookmarks->remove(bookmarkName); - - if (_bookmarksMenu->actions().count() == 0) { - _bookmarksMenu->setEnabled(false); - _deleteBookmarksMenu->setEnabled(false); - } -} - void Menu::displayNameLocationResponse(const QString& errorString) { if (!errorString.isEmpty()) { @@ -1753,3 +1627,4 @@ void Menu::setScriptsLocation(const QString& scriptsLocation) { bumpSettings(); emit scriptLocationChanged(scriptsLocation); } + diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 392e7ddf71..bafcf401c9 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -80,6 +80,7 @@ class Menu : public QMenuBar { Q_OBJECT public: static Menu* getInstance(); + QMenu* getMenu(const QString& menuName); void triggerOption(const QString& menuOption); QAction* getActionForOption(const QString& menuOption); @@ -146,7 +147,6 @@ private: QAction* getMenuAction(const QString& menuName); int findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem); int positionBeforeSeparatorIfNeeded(QMenu* menu, int requestedPosition); - QMenu* getMenu(const QString& menuName); QHash _actionHash; @@ -244,9 +244,6 @@ private slots: void editAttachments(); void editAnimations(); void changePrivateKey(); - void bookmarkLocation(); - void teleportToBookmark(); - void deleteBookmark(); void hmdToolsClosed(); void runTests(); void showMetavoxelEditor(); @@ -318,10 +315,6 @@ private: bool _shouldRenderTableNeedsRebuilding = true; QMap _shouldRenderTable; - - void loadBookmarks(); - QMenu* _bookmarksMenu; - QAction* _deleteBookmarksMenu; }; namespace MenuOption { From a9047b7b151df28322b28134f05db0dd1fb6c958 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 16 Jan 2015 17:49:22 -0800 Subject: [PATCH 011/238] LODManager class Moved most LOD related members in menu to new Dependency LODManager Replaced all Menu::getInstance() call that accessed those members by DM gets --- interface/src/Application.cpp | 15 +- interface/src/LODManager.cpp | 181 +++++++++++++++++++++++++ interface/src/LODManager.h | 98 +++++++++++++ interface/src/Menu.cpp | 142 +------------------ interface/src/Menu.h | 54 +------- interface/src/avatar/Avatar.cpp | 4 +- interface/src/ui/LodToolsDialog.cpp | 46 ++++--- interface/src/ui/Stats.cpp | 2 +- interface/src/ui/overlays/Overlays.cpp | 16 ++- 9 files changed, 330 insertions(+), 228 deletions(-) create mode 100644 interface/src/LODManager.cpp create mode 100644 interface/src/LODManager.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dbc409bac2..efbf429ab4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -80,6 +80,7 @@ #include "Application.h" #include "InterfaceVersion.h" +#include "LODManager.h" #include "Menu.h" #include "ModelUploader.h" #include "Util.h" @@ -173,6 +174,7 @@ bool setupEssentials(int& argc, char** argv) { auto ddeFaceTracker = DependencyManager::set(); auto modelBlender = DependencyManager::set(); auto audioToolBox = DependencyManager::set(); + auto lodManager = DependencyManager::set(); return true; } @@ -1772,9 +1774,9 @@ void Application::updateLOD() { PerformanceTimer perfTimer("LOD"); // adjust it unless we were asked to disable this feature, or if we're currently in throttleRendering mode if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableAutoAdjustLOD) && !isThrottleRendering()) { - Menu::getInstance()->autoAdjustLOD(_fps); + DependencyManager::get()->autoAdjustLOD(_fps); } else { - Menu::getInstance()->resetLODAdjust(); + DependencyManager::get()->resetLODAdjust(); } } @@ -2246,8 +2248,9 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node _octreeQuery.setCameraNearClip(_viewFrustum.getNearClip()); _octreeQuery.setCameraFarClip(_viewFrustum.getFarClip()); _octreeQuery.setCameraEyeOffsetPosition(_viewFrustum.getEyeOffsetPosition()); - _octreeQuery.setOctreeSizeScale(Menu::getInstance()->getOctreeSizeScale()); - _octreeQuery.setBoundaryLevelAdjust(Menu::getInstance()->getBoundaryLevelAdjust()); + auto lodManager = DependencyManager::get(); + _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale()); + _octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust()); unsigned char queryPacket[MAX_PACKET_SIZE]; @@ -2649,11 +2652,11 @@ bool Application::shouldRenderMesh(float largestDimension, float distanceToCamer } float Application::getSizeScale() const { - return Menu::getInstance()->getOctreeSizeScale(); + return DependencyManager::get()->getOctreeSizeScale(); } int Application::getBoundaryLevelAdjust() const { - return Menu::getInstance()->getBoundaryLevelAdjust(); + return DependencyManager::get()->getBoundaryLevelAdjust(); } PickRay Application::computePickRay(float x, float y) { diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp new file mode 100644 index 0000000000..837020dc36 --- /dev/null +++ b/interface/src/LODManager.cpp @@ -0,0 +1,181 @@ +// +// LODManager.cpp +// +// +// Created by Clement on 1/16/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 "Application.h" + +#include "LODManager.h" + +void LODManager::autoAdjustLOD(float currentFPS) { + // NOTE: our first ~100 samples at app startup are completely all over the place, and we don't + // really want to count them in our average, so we will ignore the real frame rates and stuff + // our moving average with simulated good data + const int IGNORE_THESE_SAMPLES = 100; + const float ASSUMED_FPS = 60.0f; + if (_fpsAverage.getSampleCount() < IGNORE_THESE_SAMPLES) { + currentFPS = ASSUMED_FPS; + } + _fpsAverage.updateAverage(currentFPS); + _fastFPSAverage.updateAverage(currentFPS); + + quint64 now = usecTimestampNow(); + + const quint64 ADJUST_AVATAR_LOD_DOWN_DELAY = 1000 * 1000; + if (_automaticAvatarLOD) { + if (_fastFPSAverage.getAverage() < _avatarLODDecreaseFPS) { + if (now - _lastAvatarDetailDrop > ADJUST_AVATAR_LOD_DOWN_DELAY) { + // attempt to lower the detail in proportion to the fps difference + float targetFps = (_avatarLODDecreaseFPS + _avatarLODIncreaseFPS) * 0.5f; + float averageFps = _fastFPSAverage.getAverage(); + const float MAXIMUM_MULTIPLIER_SCALE = 2.0f; + _avatarLODDistanceMultiplier = qMin(MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER, _avatarLODDistanceMultiplier * + (averageFps < EPSILON ? MAXIMUM_MULTIPLIER_SCALE : + qMin(MAXIMUM_MULTIPLIER_SCALE, targetFps / averageFps))); + _lastAvatarDetailDrop = now; + } + } else if (_fastFPSAverage.getAverage() > _avatarLODIncreaseFPS) { + // let the detail level creep slowly upwards + const float DISTANCE_DECREASE_RATE = 0.05f; + _avatarLODDistanceMultiplier = qMax(MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER, + _avatarLODDistanceMultiplier - DISTANCE_DECREASE_RATE); + } + } + + bool changed = false; + quint64 elapsed = now - _lastAdjust; + + if (elapsed > ADJUST_LOD_DOWN_DELAY && _fpsAverage.getAverage() < ADJUST_LOD_DOWN_FPS + && _octreeSizeScale > ADJUST_LOD_MIN_SIZE_SCALE) { + + _octreeSizeScale *= ADJUST_LOD_DOWN_BY; + + if (_octreeSizeScale < ADJUST_LOD_MIN_SIZE_SCALE) { + _octreeSizeScale = ADJUST_LOD_MIN_SIZE_SCALE; + } + changed = true; + _lastAdjust = now; + qDebug() << "adjusting LOD down... average fps for last approximately 5 seconds=" << _fpsAverage.getAverage() + << "_octreeSizeScale=" << _octreeSizeScale; + } + + if (elapsed > ADJUST_LOD_UP_DELAY && _fpsAverage.getAverage() > ADJUST_LOD_UP_FPS + && _octreeSizeScale < ADJUST_LOD_MAX_SIZE_SCALE) { + _octreeSizeScale *= ADJUST_LOD_UP_BY; + if (_octreeSizeScale > ADJUST_LOD_MAX_SIZE_SCALE) { + _octreeSizeScale = ADJUST_LOD_MAX_SIZE_SCALE; + } + changed = true; + _lastAdjust = now; + qDebug() << "adjusting LOD up... average fps for last approximately 5 seconds=" << _fpsAverage.getAverage() + << "_octreeSizeScale=" << _octreeSizeScale; + } + + if (changed) { + _shouldRenderTableNeedsRebuilding = true; + // TODO: reactivate lodToolsDialog here +// if (_lodToolsDialog) { +// _lodToolsDialog->reloadSliders(); +// } + } +} + +void LODManager::resetLODAdjust() { + _fpsAverage.reset(); + _fastFPSAverage.reset(); + _lastAvatarDetailDrop = _lastAdjust = usecTimestampNow(); +} + +QString LODManager::getLODFeedbackText() { + // determine granularity feedback + int boundaryLevelAdjust = getBoundaryLevelAdjust(); + QString granularityFeedback; + + switch (boundaryLevelAdjust) { + case 0: { + granularityFeedback = QString("at standard granularity."); + } break; + case 1: { + granularityFeedback = QString("at half of standard granularity."); + } break; + case 2: { + granularityFeedback = QString("at a third of standard granularity."); + } break; + default: { + granularityFeedback = QString("at 1/%1th of standard granularity.").arg(boundaryLevelAdjust + 1); + } break; + } + + // distance feedback + float octreeSizeScale = getOctreeSizeScale(); + float relativeToDefault = octreeSizeScale / DEFAULT_OCTREE_SIZE_SCALE; + QString result; + if (relativeToDefault > 1.01) { + result = QString("%1 further %2").arg(relativeToDefault,8,'f',2).arg(granularityFeedback); + } else if (relativeToDefault > 0.99) { + result = QString("the default distance %1").arg(granularityFeedback); + } else { + result = QString("%1 of default %2").arg(relativeToDefault,8,'f',3).arg(granularityFeedback); + } + return result; +} + +void LODManager::setOctreeSizeScale(float sizeScale) { + _octreeSizeScale = sizeScale; + _shouldRenderTableNeedsRebuilding = true; +} + +void LODManager::setBoundaryLevelAdjust(int boundaryLevelAdjust) { + _boundaryLevelAdjust = boundaryLevelAdjust; + _shouldRenderTableNeedsRebuilding = true; +} + + +void LODManager::loadSettings(QSettings* settings) { + bool lockedSettings = false; + if (!settings) { + settings = qApp->lockSettings(); + lockedSettings = true; + } + + _automaticAvatarLOD = settings->value("automaticAvatarLOD", true).toBool(); + _avatarLODDecreaseFPS = loadSetting(settings, "avatarLODDecreaseFPS", DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS); + _avatarLODIncreaseFPS = loadSetting(settings, "avatarLODIncreaseFPS", ADJUST_LOD_UP_FPS); + _avatarLODDistanceMultiplier = loadSetting(settings, "avatarLODDistanceMultiplier", + DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER); + _octreeSizeScale = loadSetting(settings, "octreeSizeScale", DEFAULT_OCTREE_SIZE_SCALE); + _boundaryLevelAdjust = loadSetting(settings, "boundaryLevelAdjust", 0); + + if (lockedSettings) { + qApp->unlockSettings(); + } +} + +void LODManager::saveSettings(QSettings* settings) { + bool lockedSettings = false; + if (!settings) { + settings = qApp->lockSettings(); + lockedSettings = true; + } + + settings->setValue("automaticAvatarLOD", _automaticAvatarLOD); + settings->setValue("avatarLODDecreaseFPS", _avatarLODDecreaseFPS); + settings->setValue("avatarLODIncreaseFPS", _avatarLODIncreaseFPS); + settings->setValue("avatarLODDistanceMultiplier", _avatarLODDistanceMultiplier); + settings->setValue("octreeSizeScale", _octreeSizeScale); + settings->setValue("boundaryLevelAdjust", _boundaryLevelAdjust); + + if (lockedSettings) { + qApp->unlockSettings(); + } +} + + diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h new file mode 100644 index 0000000000..1b02a931ed --- /dev/null +++ b/interface/src/LODManager.h @@ -0,0 +1,98 @@ +// +// LODManager.h +// +// +// Created by Clement on 1/16/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_LODManager_h +#define hifi_LODManager_h + +#include + +#include +#include +#include +#include + +const float ADJUST_LOD_DOWN_FPS = 40.0; +const float ADJUST_LOD_UP_FPS = 55.0; +const float DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS = 30.0f; + +const quint64 ADJUST_LOD_DOWN_DELAY = 1000 * 1000 * 5; +const quint64 ADJUST_LOD_UP_DELAY = ADJUST_LOD_DOWN_DELAY * 2; + +const float ADJUST_LOD_DOWN_BY = 0.9f; +const float ADJUST_LOD_UP_BY = 1.1f; + +const float ADJUST_LOD_MIN_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE * 0.25f; +const float ADJUST_LOD_MAX_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE; + +const float MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 0.1f; +const float MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 15.0f; +const float DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER = 1.0f; + +const int ONE_SECOND_OF_FRAMES = 60; +const int FIVE_SECONDS_OF_FRAMES = 5 * ONE_SECOND_OF_FRAMES; + +class LODManager : public Dependency { + SINGLETON_DEPENDENCY + +public: + // TODO: actually use them + bool shouldRenderTableNeedsRebuilding() const { return _shouldRenderTableNeedsRebuilding; } + void setShouldRenderTableNeedsRebuilding(bool shouldRenderTableNeedsRebuilding) { + _shouldRenderTableNeedsRebuilding = shouldRenderTableNeedsRebuilding; + } + + // TODO: replace bumpSettings() + void setAutomaticAvatarLOD(bool automaticAvatarLOD) { _automaticAvatarLOD = automaticAvatarLOD; } + bool getAutomaticAvatarLOD() const { return _automaticAvatarLOD; } + void setAvatarLODDecreaseFPS(float avatarLODDecreaseFPS) { _avatarLODDecreaseFPS = avatarLODDecreaseFPS; } + float getAvatarLODDecreaseFPS() const { return _avatarLODDecreaseFPS; } + void setAvatarLODIncreaseFPS(float avatarLODIncreaseFPS) { _avatarLODIncreaseFPS = avatarLODIncreaseFPS; } + float getAvatarLODIncreaseFPS() const { return _avatarLODIncreaseFPS; } + void setAvatarLODDistanceMultiplier(float multiplier) { _avatarLODDistanceMultiplier = multiplier; } + float getAvatarLODDistanceMultiplier() const { return _avatarLODDistanceMultiplier; } + + // User Tweakable LOD Items + QString getLODFeedbackText(); + void setOctreeSizeScale(float sizeScale); + float getOctreeSizeScale() const { return _octreeSizeScale; } + + void setBoundaryLevelAdjust(int boundaryLevelAdjust); + int getBoundaryLevelAdjust() const { return _boundaryLevelAdjust; } + + void autoAdjustLOD(float currentFPS); + void resetLODAdjust(); + +private: + LODManager(); + + void loadSettings(QSettings* settings); + void saveSettings(QSettings* settings); + + bool _automaticAvatarLOD = true; + float _avatarLODDecreaseFPS = DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS; + float _avatarLODIncreaseFPS = ADJUST_LOD_UP_FPS; + float _avatarLODDistanceMultiplier = DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER; + + float _octreeSizeScale = DEFAULT_OCTREE_SIZE_SCALE; + int _boundaryLevelAdjust = 0; + + quint64 _lastAdjust = 0; + quint64 _lastAvatarDetailDrop = 0; + SimpleMovingAverage _fpsAverage = FIVE_SECONDS_OF_FRAMES; + SimpleMovingAverage _fastFPSAverage = ONE_SECOND_OF_FRAMES; + + + // TODO: actually use them + bool _shouldRenderTableNeedsRebuilding = true; + QMap _shouldRenderTable; +}; + +#endif // hifi_LODManager_h \ No newline at end of file diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 6531344f9b..7f8e1b82ae 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -86,10 +86,7 @@ Menu* Menu::getInstance() { return _instance; } -Menu::Menu() : - _lastAdjust(usecTimestampNow()), - _lastAvatarDetailDrop(usecTimestampNow()) -{ +Menu::Menu() { Application *appInstance = Application::getInstance(); QMenu* fileMenu = addMenu("File"); @@ -606,13 +603,6 @@ void Menu::loadSettings(QSettings* settings) { _faceshiftEyeDeflection = loadSetting(settings, "faceshiftEyeDeflection", DEFAULT_FACESHIFT_EYE_DEFLECTION); _faceshiftHostname = settings->value("faceshiftHostname", DEFAULT_FACESHIFT_HOSTNAME).toString(); _maxOctreePacketsPerSecond = loadSetting(settings, "maxOctreePPS", DEFAULT_MAX_OCTREE_PPS); - _octreeSizeScale = loadSetting(settings, "octreeSizeScale", DEFAULT_OCTREE_SIZE_SCALE); - _automaticAvatarLOD = settings->value("automaticAvatarLOD", true).toBool(); - _avatarLODDecreaseFPS = loadSetting(settings, "avatarLODDecreaseFPS", DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS); - _avatarLODIncreaseFPS = loadSetting(settings, "avatarLODIncreaseFPS", ADJUST_LOD_UP_FPS); - _avatarLODDistanceMultiplier = loadSetting(settings, "avatarLODDistanceMultiplier", - DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER); - _boundaryLevelAdjust = loadSetting(settings, "boundaryLevelAdjust", 0); _snapshotsLocation = settings->value("snapshotsLocation", QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).toString(); setScriptsLocation(settings->value("scriptsLocation", QString()).toString()); @@ -669,12 +659,6 @@ void Menu::saveSettings(QSettings* settings) { settings->setValue("faceshiftEyeDeflection", _faceshiftEyeDeflection); settings->setValue("faceshiftHostname", _faceshiftHostname); settings->setValue("maxOctreePPS", _maxOctreePacketsPerSecond); - settings->setValue("octreeSizeScale", _octreeSizeScale); - settings->setValue("automaticAvatarLOD", _automaticAvatarLOD); - settings->setValue("avatarLODDecreaseFPS", _avatarLODDecreaseFPS); - settings->setValue("avatarLODIncreaseFPS", _avatarLODIncreaseFPS); - settings->setValue("avatarLODDistanceMultiplier", _avatarLODDistanceMultiplier); - settings->setValue("boundaryLevelAdjust", _boundaryLevelAdjust); settings->setValue("snapshotsLocation", _snapshotsLocation); settings->setValue("scriptsLocation", _scriptsLocation); #if defined(Q_OS_MAC) || defined(Q_OS_WIN) @@ -1404,130 +1388,6 @@ void Menu::octreeStatsDetails() { _octreeStatsDialog->raise(); } -QString Menu::getLODFeedbackText() { - // determine granularity feedback - int boundaryLevelAdjust = getBoundaryLevelAdjust(); - QString granularityFeedback; - - switch (boundaryLevelAdjust) { - case 0: { - granularityFeedback = QString("at standard granularity."); - } break; - case 1: { - granularityFeedback = QString("at half of standard granularity."); - } break; - case 2: { - granularityFeedback = QString("at a third of standard granularity."); - } break; - default: { - granularityFeedback = QString("at 1/%1th of standard granularity.").arg(boundaryLevelAdjust + 1); - } break; - } - - // distance feedback - float octreeSizeScale = getOctreeSizeScale(); - float relativeToDefault = octreeSizeScale / DEFAULT_OCTREE_SIZE_SCALE; - QString result; - if (relativeToDefault > 1.01) { - result = QString("%1 further %2").arg(relativeToDefault,8,'f',2).arg(granularityFeedback); - } else if (relativeToDefault > 0.99) { - result = QString("the default distance %1").arg(granularityFeedback); - } else { - result = QString("%1 of default %2").arg(relativeToDefault,8,'f',3).arg(granularityFeedback); - } - return result; -} - -void Menu::autoAdjustLOD(float currentFPS) { - // NOTE: our first ~100 samples at app startup are completely all over the place, and we don't - // really want to count them in our average, so we will ignore the real frame rates and stuff - // our moving average with simulated good data - const int IGNORE_THESE_SAMPLES = 100; - const float ASSUMED_FPS = 60.0f; - if (_fpsAverage.getSampleCount() < IGNORE_THESE_SAMPLES) { - currentFPS = ASSUMED_FPS; - } - _fpsAverage.updateAverage(currentFPS); - _fastFPSAverage.updateAverage(currentFPS); - - quint64 now = usecTimestampNow(); - - const quint64 ADJUST_AVATAR_LOD_DOWN_DELAY = 1000 * 1000; - if (_automaticAvatarLOD) { - if (_fastFPSAverage.getAverage() < _avatarLODDecreaseFPS) { - if (now - _lastAvatarDetailDrop > ADJUST_AVATAR_LOD_DOWN_DELAY) { - // attempt to lower the detail in proportion to the fps difference - float targetFps = (_avatarLODDecreaseFPS + _avatarLODIncreaseFPS) * 0.5f; - float averageFps = _fastFPSAverage.getAverage(); - const float MAXIMUM_MULTIPLIER_SCALE = 2.0f; - _avatarLODDistanceMultiplier = qMin(MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER, _avatarLODDistanceMultiplier * - (averageFps < EPSILON ? MAXIMUM_MULTIPLIER_SCALE : - qMin(MAXIMUM_MULTIPLIER_SCALE, targetFps / averageFps))); - _lastAvatarDetailDrop = now; - } - } else if (_fastFPSAverage.getAverage() > _avatarLODIncreaseFPS) { - // let the detail level creep slowly upwards - const float DISTANCE_DECREASE_RATE = 0.05f; - _avatarLODDistanceMultiplier = qMax(MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER, - _avatarLODDistanceMultiplier - DISTANCE_DECREASE_RATE); - } - } - - bool changed = false; - quint64 elapsed = now - _lastAdjust; - - if (elapsed > ADJUST_LOD_DOWN_DELAY && _fpsAverage.getAverage() < ADJUST_LOD_DOWN_FPS - && _octreeSizeScale > ADJUST_LOD_MIN_SIZE_SCALE) { - - _octreeSizeScale *= ADJUST_LOD_DOWN_BY; - - if (_octreeSizeScale < ADJUST_LOD_MIN_SIZE_SCALE) { - _octreeSizeScale = ADJUST_LOD_MIN_SIZE_SCALE; - } - changed = true; - _lastAdjust = now; - qDebug() << "adjusting LOD down... average fps for last approximately 5 seconds=" << _fpsAverage.getAverage() - << "_octreeSizeScale=" << _octreeSizeScale; - } - - if (elapsed > ADJUST_LOD_UP_DELAY && _fpsAverage.getAverage() > ADJUST_LOD_UP_FPS - && _octreeSizeScale < ADJUST_LOD_MAX_SIZE_SCALE) { - _octreeSizeScale *= ADJUST_LOD_UP_BY; - if (_octreeSizeScale > ADJUST_LOD_MAX_SIZE_SCALE) { - _octreeSizeScale = ADJUST_LOD_MAX_SIZE_SCALE; - } - changed = true; - _lastAdjust = now; - qDebug() << "adjusting LOD up... average fps for last approximately 5 seconds=" << _fpsAverage.getAverage() - << "_octreeSizeScale=" << _octreeSizeScale; - } - - if (changed) { - _shouldRenderTableNeedsRebuilding = true; - if (_lodToolsDialog) { - _lodToolsDialog->reloadSliders(); - } - } -} - -void Menu::resetLODAdjust() { - _fpsAverage.reset(); - _fastFPSAverage.reset(); - _lastAvatarDetailDrop = _lastAdjust = usecTimestampNow(); -} - -void Menu::setOctreeSizeScale(float sizeScale) { - _octreeSizeScale = sizeScale; - _shouldRenderTableNeedsRebuilding = true; - bumpSettings(); -} - -void Menu::setBoundaryLevelAdjust(int boundaryLevelAdjust) { - _boundaryLevelAdjust = boundaryLevelAdjust; - _shouldRenderTableNeedsRebuilding = true; - bumpSettings(); -} - // TODO: This is essentially the same logic used to render octree cells, but since models are more detailed then octree cells // I've added a voxelToModelRatio that adjusts how much closer to a model you have to be to see it. bool Menu::shouldRenderMesh(float largestDimension, float distanceToCamera) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index bafcf401c9..0b12bb5066 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -21,7 +21,6 @@ #include #include -#include #if defined(Q_OS_MAC) || defined(Q_OS_WIN) #include "SpeechRecognizer.h" @@ -29,32 +28,11 @@ #include "devices/Faceshift.h" #include "devices/SixenseManager.h" +#include "LODManager.h" #include "ui/ChatWindow.h" #include "ui/JSConsole.h" #include "ui/ScriptEditorWindow.h" -// Make an LOD handler class and move everything overthere -const float ADJUST_LOD_DOWN_FPS = 40.0; -const float ADJUST_LOD_UP_FPS = 55.0; -const float DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS = 30.0f; - -const quint64 ADJUST_LOD_DOWN_DELAY = 1000 * 1000 * 5; -const quint64 ADJUST_LOD_UP_DELAY = ADJUST_LOD_DOWN_DELAY * 2; - -const float ADJUST_LOD_DOWN_BY = 0.9f; -const float ADJUST_LOD_UP_BY = 1.1f; - -const float ADJUST_LOD_MIN_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE * 0.25f; -const float ADJUST_LOD_MAX_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE; - -const float MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 0.1f; -const float MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 15.0f; -const float DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER = 1.0f; - -const int ONE_SECOND_OF_FRAMES = 60; -const int FIVE_SECONDS_OF_FRAMES = 5 * ONE_SECOND_OF_FRAMES; -////////////////////////////////////////////////////////// - const float DEFAULT_OCULUS_UI_ANGULAR_SIZE = 72.0f; const QString SETTINGS_ADDRESS_KEY = "address"; @@ -187,23 +165,6 @@ public: bool getShadowsEnabled() const; - // User Tweakable LOD Items - QString getLODFeedbackText(); - void autoAdjustLOD(float currentFPS); - void resetLODAdjust(); - void setOctreeSizeScale(float sizeScale); - float getOctreeSizeScale() const { return _octreeSizeScale; } - void setAutomaticAvatarLOD(bool automaticAvatarLOD) { _automaticAvatarLOD = automaticAvatarLOD; bumpSettings(); } - bool getAutomaticAvatarLOD() const { return _automaticAvatarLOD; } - void setAvatarLODDecreaseFPS(float avatarLODDecreaseFPS) { _avatarLODDecreaseFPS = avatarLODDecreaseFPS; bumpSettings(); } - float getAvatarLODDecreaseFPS() const { return _avatarLODDecreaseFPS; } - void setAvatarLODIncreaseFPS(float avatarLODIncreaseFPS) { _avatarLODIncreaseFPS = avatarLODIncreaseFPS; bumpSettings(); } - float getAvatarLODIncreaseFPS() const { return _avatarLODIncreaseFPS; } - void setAvatarLODDistanceMultiplier(float multiplier) { _avatarLODDistanceMultiplier = multiplier; bumpSettings(); } - float getAvatarLODDistanceMultiplier() const { return _avatarLODDistanceMultiplier; } - void setBoundaryLevelAdjust(int boundaryLevelAdjust); - int getBoundaryLevelAdjust() const { return _boundaryLevelAdjust; } - bool shouldRenderMesh(float largestDimension, float distanceToCamera); #if defined(Q_OS_MAC) || defined(Q_OS_WIN) @@ -271,26 +232,13 @@ private: #if defined(Q_OS_MAC) || defined(Q_OS_WIN) SpeechRecognizer _speechRecognizer; #endif - float _octreeSizeScale = DEFAULT_OCTREE_SIZE_SCALE; float _oculusUIAngularSize = DEFAULT_OCULUS_UI_ANGULAR_SIZE; float _sixenseReticleMoveSpeed = DEFAULT_SIXENSE_RETICLE_MOVE_SPEED; bool _invertSixenseButtons = DEFAULT_INVERT_SIXENSE_MOUSE_BUTTONS; bool _hasLoginDialogDisplayed = false; - bool _automaticAvatarLOD = true; - float _avatarLODDecreaseFPS = DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS; - float _avatarLODIncreaseFPS = ADJUST_LOD_UP_FPS; - float _avatarLODDistanceMultiplier = DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER; - - int _boundaryLevelAdjust = 0; int _maxOctreePacketsPerSecond = DEFAULT_MAX_OCTREE_PPS; - quint64 _lastAdjust; - quint64 _lastAvatarDetailDrop; - - SimpleMovingAverage _fpsAverage = FIVE_SECONDS_OF_FRAMES; - SimpleMovingAverage _fastFPSAverage = ONE_SECOND_OF_FRAMES; - QPointer _addressBarDialog; QPointer _animationsDialog; QPointer _attachmentsDialog; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 7ad81d7bf5..b395fcadae 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -114,8 +114,8 @@ glm::quat Avatar::getWorldAlignedOrientation () const { } float Avatar::getLODDistance() const { - return Menu::getInstance()->getAvatarLODDistanceMultiplier() * - glm::distance(Application::getInstance()->getCamera()->getPosition(), _position) / _scale; + return DependencyManager::get()->getAvatarLODDistanceMultiplier() * + glm::distance(Application::getInstance()->getCamera()->getPosition(), _position) / _scale; } void Avatar::simulate(float deltaTime) { diff --git a/interface/src/ui/LodToolsDialog.cpp b/interface/src/ui/LodToolsDialog.cpp index 8ff9eadc51..5d079e840f 100644 --- a/interface/src/ui/LodToolsDialog.cpp +++ b/interface/src/ui/LodToolsDialog.cpp @@ -28,6 +28,7 @@ LodToolsDialog::LodToolsDialog(QWidget* parent) : QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint) { this->setWindowTitle("LOD Tools"); + auto lodManager = DependencyManager::get(); // Create layouter QFormLayout* form = new QFormLayout(this); @@ -45,7 +46,7 @@ LodToolsDialog::LodToolsDialog(QWidget* parent) : _lodSize->setTickPosition(QSlider::TicksBelow); _lodSize->setFixedWidth(SLIDER_WIDTH); _lodSize->setPageStep(PAGE_STEP_LOD_SIZE); - int sliderValue = Menu::getInstance()->getOctreeSizeScale() / TREE_SCALE; + int sliderValue = lodManager->getOctreeSizeScale() / TREE_SCALE; _lodSize->setValue(sliderValue); form->addRow("LOD Size Scale:", _lodSize); connect(_lodSize,SIGNAL(valueChanged(int)),this,SLOT(sizeScaleValueChanged(int))); @@ -60,7 +61,7 @@ LodToolsDialog::LodToolsDialog(QWidget* parent) : _boundaryLevelAdjust->setTickInterval(STEP_ADJUST); _boundaryLevelAdjust->setTickPosition(QSlider::TicksBelow); _boundaryLevelAdjust->setFixedWidth(SLIDER_WIDTH); - sliderValue = Menu::getInstance()->getBoundaryLevelAdjust(); + sliderValue = lodManager->getBoundaryLevelAdjust(); _boundaryLevelAdjust->setValue(sliderValue); form->addRow("Boundary Level Adjust:", _boundaryLevelAdjust); connect(_boundaryLevelAdjust,SIGNAL(valueChanged(int)),this,SLOT(boundaryLevelValueChanged(int))); @@ -71,22 +72,22 @@ LodToolsDialog::LodToolsDialog(QWidget* parent) : const unsigned redish = 0xfff00000; palette.setColor(QPalette::WindowText, QColor::fromRgb(redish)); _feedback->setPalette(palette); - _feedback->setText(Menu::getInstance()->getLODFeedbackText()); + _feedback->setText(lodManager->getLODFeedbackText()); const int FEEDBACK_WIDTH = 350; _feedback->setFixedWidth(FEEDBACK_WIDTH); form->addRow("You can see... ", _feedback); - + form->addRow("Automatic Avatar LOD Adjustment:", _automaticAvatarLOD = new QCheckBox(this)); - _automaticAvatarLOD->setChecked(Menu::getInstance()->getAutomaticAvatarLOD()); + _automaticAvatarLOD->setChecked(lodManager->getAutomaticAvatarLOD()); connect(_automaticAvatarLOD, SIGNAL(toggled(bool)), SLOT(updateAvatarLODControls())); form->addRow("Decrease Avatar LOD Below FPS:", _avatarLODDecreaseFPS = new QDoubleSpinBox(this)); - _avatarLODDecreaseFPS->setValue(Menu::getInstance()->getAvatarLODDecreaseFPS()); + _avatarLODDecreaseFPS->setValue(lodManager->getAvatarLODDecreaseFPS()); _avatarLODDecreaseFPS->setDecimals(0); connect(_avatarLODDecreaseFPS, SIGNAL(valueChanged(double)), SLOT(updateAvatarLODValues())); form->addRow("Increase Avatar LOD Above FPS:", _avatarLODIncreaseFPS = new QDoubleSpinBox(this)); - _avatarLODIncreaseFPS->setValue(Menu::getInstance()->getAvatarLODIncreaseFPS()); + _avatarLODIncreaseFPS->setValue(lodManager->getAvatarLODIncreaseFPS()); _avatarLODIncreaseFPS->setDecimals(0); connect(_avatarLODIncreaseFPS, SIGNAL(valueChanged(double)), SLOT(updateAvatarLODValues())); @@ -94,7 +95,7 @@ LodToolsDialog::LodToolsDialog(QWidget* parent) : _avatarLOD->setDecimals(3); _avatarLOD->setRange(1.0 / MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER, 1.0 / MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER); _avatarLOD->setSingleStep(0.001); - _avatarLOD->setValue(1.0 / Menu::getInstance()->getAvatarLODDistanceMultiplier()); + _avatarLOD->setValue(1.0 / lodManager->getAvatarLODDistanceMultiplier()); connect(_avatarLOD, SIGNAL(valueChanged(double)), SLOT(updateAvatarLODValues())); // Add a button to reset @@ -108,15 +109,17 @@ LodToolsDialog::LodToolsDialog(QWidget* parent) : } void LodToolsDialog::reloadSliders() { - _lodSize->setValue(Menu::getInstance()->getOctreeSizeScale() / TREE_SCALE); - _boundaryLevelAdjust->setValue(Menu::getInstance()->getBoundaryLevelAdjust()); - _feedback->setText(Menu::getInstance()->getLODFeedbackText()); + auto lodManager = DependencyManager::get(); + _lodSize->setValue(lodManager->getOctreeSizeScale() / TREE_SCALE); + _boundaryLevelAdjust->setValue(lodManager->getBoundaryLevelAdjust()); + _feedback->setText(lodManager->getLODFeedbackText()); } void LodToolsDialog::updateAvatarLODControls() { QFormLayout* form = static_cast(layout()); - Menu::getInstance()->setAutomaticAvatarLOD(_automaticAvatarLOD->isChecked()); + auto lodManager = DependencyManager::get(); + lodManager->setAutomaticAvatarLOD(_automaticAvatarLOD->isChecked()); _avatarLODDecreaseFPS->setVisible(_automaticAvatarLOD->isChecked()); form->labelForField(_avatarLODDecreaseFPS)->setVisible(_automaticAvatarLOD->isChecked()); @@ -128,7 +131,7 @@ void LodToolsDialog::updateAvatarLODControls() { form->labelForField(_avatarLOD)->setVisible(!_automaticAvatarLOD->isChecked()); if (!_automaticAvatarLOD->isChecked()) { - _avatarLOD->setValue(1.0 / Menu::getInstance()->getAvatarLODDistanceMultiplier()); + _avatarLOD->setValue(1.0 / lodManager->getAvatarLODDistanceMultiplier()); } if (isVisible()) { @@ -137,25 +140,28 @@ void LodToolsDialog::updateAvatarLODControls() { } void LodToolsDialog::updateAvatarLODValues() { + auto lodManager = DependencyManager::get(); if (_automaticAvatarLOD->isChecked()) { - Menu::getInstance()->setAvatarLODDecreaseFPS(_avatarLODDecreaseFPS->value()); - Menu::getInstance()->setAvatarLODIncreaseFPS(_avatarLODIncreaseFPS->value()); + lodManager->setAvatarLODDecreaseFPS(_avatarLODDecreaseFPS->value()); + lodManager->setAvatarLODIncreaseFPS(_avatarLODIncreaseFPS->value()); } else { - Menu::getInstance()->setAvatarLODDistanceMultiplier(1.0 / _avatarLOD->value()); + lodManager->setAvatarLODDistanceMultiplier(1.0 / _avatarLOD->value()); } } void LodToolsDialog::sizeScaleValueChanged(int value) { + auto lodManager = DependencyManager::get(); float realValue = value * TREE_SCALE; - Menu::getInstance()->setOctreeSizeScale(realValue); + lodManager->setOctreeSizeScale(realValue); - _feedback->setText(Menu::getInstance()->getLODFeedbackText()); + _feedback->setText(lodManager->getLODFeedbackText()); } void LodToolsDialog::boundaryLevelValueChanged(int value) { - Menu::getInstance()->setBoundaryLevelAdjust(value); - _feedback->setText(Menu::getInstance()->getLODFeedbackText()); + auto lodManager = DependencyManager::get(); + lodManager->setBoundaryLevelAdjust(value); + _feedback->setText(lodManager->getLODFeedbackText()); } void LodToolsDialog::resetClicked(bool checked) { diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 486a4621af..182cdce0cc 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -623,7 +623,7 @@ void Stats::display( // LOD Details if (_expanded) { octreeStats.str(""); - QString displayLODDetails = Menu::getInstance()->getLODFeedbackText(); + QString displayLODDetails = DependencyManager::get()->getLODFeedbackText(); octreeStats << "LOD: You can see " << qPrintable(displayLODDetails.trimmed()); verticalOffset += STATS_PELS_PER_LINE; drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color); diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 8f9f54c591..0c2279e22b 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -83,10 +83,13 @@ void Overlays::update(float deltatime) { void Overlays::renderHUD() { QReadLocker lock(&_lock); - + + auto lodManager = DependencyManager::get(); RenderArgs args = { NULL, Application::getInstance()->getViewFrustum(), - Menu::getInstance()->getOctreeSizeScale(), Menu::getInstance()->getBoundaryLevelAdjust(), - RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), + RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; foreach(Overlay* thisOverlay, _overlaysHUD) { if (thisOverlay->is3D()) { @@ -116,9 +119,12 @@ void Overlays::renderWorld(bool drawFront, RenderArgs::RenderMode renderMode, Re glm::vec3 axis(0.0f, 1.0f, 0.0f); float myAvatarScale = 1.0f; + auto lodManager = DependencyManager::get(); RenderArgs args = { NULL, Application::getInstance()->getViewFrustum(), - Menu::getInstance()->getOctreeSizeScale(), Menu::getInstance()->getBoundaryLevelAdjust(), - renderMode, renderSide, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), + renderMode, renderSide, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; foreach(Overlay* thisOverlay, _overlaysWorld) { From 3fbc8c5d449ae16f7380e35f88c426fee4e34d68 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 17 Jan 2015 17:56:33 -0800 Subject: [PATCH 012/238] Moved Menu::shouldRenderMesh() to LODManager --- interface/src/Application.cpp | 2 +- interface/src/LODManager.cpp | 38 +++++++++++++++++++++++++ interface/src/LODManager.h | 4 ++- interface/src/Menu.cpp | 39 -------------------------- interface/src/Menu.h | 3 -- interface/src/avatar/Avatar.cpp | 1 + interface/src/ui/LodToolsDialog.cpp | 11 ++++---- interface/src/ui/Stats.cpp | 1 + interface/src/ui/overlays/Overlays.cpp | 6 ++-- 9 files changed, 54 insertions(+), 51 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index efbf429ab4..1c1a57f3a7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2648,7 +2648,7 @@ void Application::setupWorldLight() { } bool Application::shouldRenderMesh(float largestDimension, float distanceToCamera) { - return Menu::getInstance()->shouldRenderMesh(largestDimension, distanceToCamera); + return DependencyManager::get()->shouldRenderMesh(largestDimension, distanceToCamera); } float Application::getSizeScale() const { diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp index 837020dc36..9f33677cff 100644 --- a/interface/src/LODManager.cpp +++ b/interface/src/LODManager.cpp @@ -138,6 +138,44 @@ void LODManager::setBoundaryLevelAdjust(int boundaryLevelAdjust) { _shouldRenderTableNeedsRebuilding = true; } +// TODO: This is essentially the same logic used to render octree cells, but since models are more detailed then octree cells +// I've added a voxelToModelRatio that adjusts how much closer to a model you have to be to see it. +bool LODManager::shouldRenderMesh(float largestDimension, float distanceToCamera) { + const float octreeToMeshRatio = 4.0f; // must be this many times closer to a mesh than a voxel to see it. + float octreeSizeScale = getOctreeSizeScale(); + int boundaryLevelAdjust = getBoundaryLevelAdjust(); + float maxScale = (float)TREE_SCALE; + float visibleDistanceAtMaxScale = boundaryDistanceForRenderLevel(boundaryLevelAdjust, octreeSizeScale) / octreeToMeshRatio; + + if (_shouldRenderTableNeedsRebuilding) { + _shouldRenderTable.clear(); + + float SMALLEST_SCALE_IN_TABLE = 0.001f; // 1mm is plenty small + float scale = maxScale; + float visibleDistanceAtScale = visibleDistanceAtMaxScale; + + while (scale > SMALLEST_SCALE_IN_TABLE) { + scale /= 2.0f; + visibleDistanceAtScale /= 2.0f; + _shouldRenderTable[scale] = visibleDistanceAtScale; + } + _shouldRenderTableNeedsRebuilding = false; + } + + float closestScale = maxScale; + float visibleDistanceAtClosestScale = visibleDistanceAtMaxScale; + QMap::const_iterator lowerBound = _shouldRenderTable.lowerBound(largestDimension); + if (lowerBound != _shouldRenderTable.constEnd()) { + closestScale = lowerBound.key(); + visibleDistanceAtClosestScale = lowerBound.value(); + } + + if (closestScale < largestDimension) { + visibleDistanceAtClosestScale *= 2.0f; + } + + return (distanceToCamera <= visibleDistanceAtClosestScale); +} void LODManager::loadSettings(QSettings* settings) { bool lockedSettings = false; diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h index 1b02a931ed..364f7f1192 100644 --- a/interface/src/LODManager.h +++ b/interface/src/LODManager.h @@ -70,8 +70,10 @@ public: void autoAdjustLOD(float currentFPS); void resetLODAdjust(); + bool shouldRenderMesh(float largestDimension, float distanceToCamera); + private: - LODManager(); + LODManager() {} void loadSettings(QSettings* settings); void saveSettings(QSettings* settings); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7f8e1b82ae..cf6951a9fc 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1388,45 +1388,6 @@ void Menu::octreeStatsDetails() { _octreeStatsDialog->raise(); } -// TODO: This is essentially the same logic used to render octree cells, but since models are more detailed then octree cells -// I've added a voxelToModelRatio that adjusts how much closer to a model you have to be to see it. -bool Menu::shouldRenderMesh(float largestDimension, float distanceToCamera) { - const float octreeToMeshRatio = 4.0f; // must be this many times closer to a mesh than a voxel to see it. - float octreeSizeScale = getOctreeSizeScale(); - int boundaryLevelAdjust = getBoundaryLevelAdjust(); - float maxScale = (float)TREE_SCALE; - float visibleDistanceAtMaxScale = boundaryDistanceForRenderLevel(boundaryLevelAdjust, octreeSizeScale) / octreeToMeshRatio; - - if (_shouldRenderTableNeedsRebuilding) { - _shouldRenderTable.clear(); - - float SMALLEST_SCALE_IN_TABLE = 0.001f; // 1mm is plenty small - float scale = maxScale; - float visibleDistanceAtScale = visibleDistanceAtMaxScale; - - while (scale > SMALLEST_SCALE_IN_TABLE) { - scale /= 2.0f; - visibleDistanceAtScale /= 2.0f; - _shouldRenderTable[scale] = visibleDistanceAtScale; - } - _shouldRenderTableNeedsRebuilding = false; - } - - float closestScale = maxScale; - float visibleDistanceAtClosestScale = visibleDistanceAtMaxScale; - QMap::const_iterator lowerBound = _shouldRenderTable.lowerBound(largestDimension); - if (lowerBound != _shouldRenderTable.constEnd()) { - closestScale = lowerBound.key(); - visibleDistanceAtClosestScale = lowerBound.value(); - } - - if (closestScale < largestDimension) { - visibleDistanceAtClosestScale *= 2.0f; - } - - return (distanceToCamera <= visibleDistanceAtClosestScale); -} - void Menu::cachesSizeDialog() { qDebug() << "Caches size:" << _cachesSizeDialog.isNull(); if (!_cachesSizeDialog) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 0b12bb5066..9d2861ac0d 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -28,7 +28,6 @@ #include "devices/Faceshift.h" #include "devices/SixenseManager.h" -#include "LODManager.h" #include "ui/ChatWindow.h" #include "ui/JSConsole.h" #include "ui/ScriptEditorWindow.h" @@ -165,8 +164,6 @@ public: bool getShadowsEnabled() const; - bool shouldRenderMesh(float largestDimension, float distanceToCamera); - #if defined(Q_OS_MAC) || defined(Q_OS_WIN) SpeechRecognizer* getSpeechRecognizer() { return &_speechRecognizer; } #endif diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b395fcadae..1f9796aa3f 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include diff --git a/interface/src/ui/LodToolsDialog.cpp b/interface/src/ui/LodToolsDialog.cpp index 5d079e840f..1b149bf903 100644 --- a/interface/src/ui/LodToolsDialog.cpp +++ b/interface/src/ui/LodToolsDialog.cpp @@ -9,17 +9,18 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include -#include - -#include #include #include +#include #include -#include +#include +#include #include +#include #include +#include + #include "Menu.h" #include "ui/LodToolsDialog.h" diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 182cdce0cc..9beedd4ac3 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include "Stats.h" diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 0c2279e22b..9e953344d6 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -8,12 +8,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include #include + #include #include -#include -#include +#include #include "BillboardOverlay.h" #include "Circle3DOverlay.h" From 10ec36874fbe5e3986a672cbd4cd278ad24782ce Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 17 Jan 2015 17:59:24 -0800 Subject: [PATCH 013/238] Remove Menu deprecated members --- interface/src/Menu.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 9d2861ac0d..83eb38b8d4 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -257,9 +257,6 @@ private: QString _snapshotsLocation; QString _scriptsLocation; QByteArray _walletPrivateKey; - - bool _shouldRenderTableNeedsRebuilding = true; - QMap _shouldRenderTable; }; namespace MenuOption { From 8175b4bb4419811a298962d8a572a95d0394be97 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 17 Jan 2015 18:23:43 -0800 Subject: [PATCH 014/238] Remove unused getter/setter --- interface/src/LODManager.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h index 364f7f1192..76a0c11a20 100644 --- a/interface/src/LODManager.h +++ b/interface/src/LODManager.h @@ -43,12 +43,6 @@ class LODManager : public Dependency { SINGLETON_DEPENDENCY public: - // TODO: actually use them - bool shouldRenderTableNeedsRebuilding() const { return _shouldRenderTableNeedsRebuilding; } - void setShouldRenderTableNeedsRebuilding(bool shouldRenderTableNeedsRebuilding) { - _shouldRenderTableNeedsRebuilding = shouldRenderTableNeedsRebuilding; - } - // TODO: replace bumpSettings() void setAutomaticAvatarLOD(bool automaticAvatarLOD) { _automaticAvatarLOD = automaticAvatarLOD; } bool getAutomaticAvatarLOD() const { return _automaticAvatarLOD; } @@ -91,8 +85,6 @@ private: SimpleMovingAverage _fpsAverage = FIVE_SECONDS_OF_FRAMES; SimpleMovingAverage _fastFPSAverage = ONE_SECOND_OF_FRAMES; - - // TODO: actually use them bool _shouldRenderTableNeedsRebuilding = true; QMap _shouldRenderTable; }; From 229791a9f22fe52d4ee2c4a99a64a78488df638f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 17 Jan 2015 19:45:48 -0800 Subject: [PATCH 015/238] Move Oculus UI ratio to ApplicationOverlay --- interface/src/Menu.h | 5 ----- interface/src/ui/ApplicationOverlay.cpp | 2 +- interface/src/ui/ApplicationOverlay.h | 7 +++++++ interface/src/ui/PreferencesDialog.cpp | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 83eb38b8d4..7d1a47f787 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -32,8 +32,6 @@ #include "ui/JSConsole.h" #include "ui/ScriptEditorWindow.h" -const float DEFAULT_OCULUS_UI_ANGULAR_SIZE = 72.0f; - const QString SETTINGS_ADDRESS_KEY = "address"; class QSettings; @@ -140,8 +138,6 @@ public: void setFieldOfView(float fieldOfView) { _fieldOfView = fieldOfView; bumpSettings(); } float getRealWorldFieldOfView() const { return _realWorldFieldOfView; } void setRealWorldFieldOfView(float realWorldFieldOfView) { _realWorldFieldOfView = realWorldFieldOfView; bumpSettings(); } - float getOculusUIAngularSize() const { return _oculusUIAngularSize; } - void setOculusUIAngularSize(float oculusUIAngularSize) { _oculusUIAngularSize = oculusUIAngularSize; bumpSettings(); } float getSixenseReticleMoveSpeed() const { return _sixenseReticleMoveSpeed; } void setSixenseReticleMoveSpeed(float sixenseReticleMoveSpeed) { _sixenseReticleMoveSpeed = sixenseReticleMoveSpeed; bumpSettings(); } bool getInvertSixenseButtons() const { return _invertSixenseButtons; } @@ -229,7 +225,6 @@ private: #if defined(Q_OS_MAC) || defined(Q_OS_WIN) SpeechRecognizer _speechRecognizer; #endif - float _oculusUIAngularSize = DEFAULT_OCULUS_UI_ANGULAR_SIZE; float _sixenseReticleMoveSpeed = DEFAULT_SIXENSE_RETICLE_MOVE_SPEED; bool _invertSixenseButtons = DEFAULT_INVERT_SIXENSE_MOUSE_BUTTONS; bool _hasLoginDialogDisplayed = false; diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 2c5cc5b267..6d00ad6912 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -164,7 +164,7 @@ void ApplicationOverlay::renderOverlay(bool renderToTexture) { Overlays& overlays = application->getOverlays(); auto glCanvas = DependencyManager::get(); - _textureFov = glm::radians(Menu::getInstance()->getOculusUIAngularSize()); + _textureFov = glm::radians(_oculusUIAngularSize); _textureAspectRatio = (float)glCanvas->getDeviceWidth() / (float)glCanvas->getDeviceHeight(); //Handle fading and deactivation/activation of UI diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index 33dcea67a3..68edbda691 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -20,6 +20,8 @@ const float MAGNIFY_WIDTH = 220.0f; const float MAGNIFY_HEIGHT = 100.0f; const float MAGNIFY_MULT = 2.0f; +const float DEFAULT_OCULUS_UI_ANGULAR_SIZE = 72.0f; + // Handles the drawing of the overlays to the screen class ApplicationOverlay { public: @@ -35,6 +37,9 @@ public: QPoint getPalmClickLocation(const PalmData *palm) const; bool calculateRayUICollisionPoint(const glm::vec3& position, const glm::vec3& direction, glm::vec3& result) const; + float getOculusUIAngularSize() const { return _oculusUIAngularSize; } + void setOculusUIAngularSize(float oculusUIAngularSize) { _oculusUIAngularSize = oculusUIAngularSize; } + // Converter from one frame of reference to another. // Frame of reference: // Screen: Position on the screen (x,y) @@ -80,6 +85,8 @@ private: VerticesIndices _vbo; }; + float _oculusUIAngularSize = DEFAULT_OCULUS_UI_ANGULAR_SIZE; + void renderReticle(glm::quat orientation, float alpha); void renderPointers();; void renderMagnifier(glm::vec2 magPos, float sizeMult, bool showBorder); diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index c0d87898d7..75000a457a 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -157,7 +157,7 @@ void PreferencesDialog::loadPreferences() { ui.maxOctreePPSSpin->setValue(menuInstance->getMaxOctreePacketsPerSecond()); - ui.oculusUIAngularSizeSpin->setValue(menuInstance->getOculusUIAngularSize()); + ui.oculusUIAngularSizeSpin->setValue(qApp->getApplicationOverlay().getOculusUIAngularSize()); ui.sixenseReticleMoveSpeedSpin->setValue(menuInstance->getSixenseReticleMoveSpeed()); @@ -238,7 +238,7 @@ void PreferencesDialog::savePreferences() { Menu::getInstance()->setMaxOctreePacketsPerSecond(ui.maxOctreePPSSpin->value()); - Menu::getInstance()->setOculusUIAngularSize(ui.oculusUIAngularSizeSpin->value()); + qApp->getApplicationOverlay().setOculusUIAngularSize(ui.oculusUIAngularSizeSpin->value()); Menu::getInstance()->setSixenseReticleMoveSpeed(ui.sixenseReticleMoveSpeedSpin->value()); From 2eff7867b59082ad592f3b6155806d4fd9dc2f37 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 17 Jan 2015 20:09:48 -0800 Subject: [PATCH 016/238] Remove LODManager::load/saveSettings() for now --- interface/src/LODManager.cpp | 40 ------------------------------------ interface/src/LODManager.h | 3 --- 2 files changed, 43 deletions(-) diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp index 9f33677cff..0455f41402 100644 --- a/interface/src/LODManager.cpp +++ b/interface/src/LODManager.cpp @@ -177,43 +177,3 @@ bool LODManager::shouldRenderMesh(float largestDimension, float distanceToCamera return (distanceToCamera <= visibleDistanceAtClosestScale); } -void LODManager::loadSettings(QSettings* settings) { - bool lockedSettings = false; - if (!settings) { - settings = qApp->lockSettings(); - lockedSettings = true; - } - - _automaticAvatarLOD = settings->value("automaticAvatarLOD", true).toBool(); - _avatarLODDecreaseFPS = loadSetting(settings, "avatarLODDecreaseFPS", DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS); - _avatarLODIncreaseFPS = loadSetting(settings, "avatarLODIncreaseFPS", ADJUST_LOD_UP_FPS); - _avatarLODDistanceMultiplier = loadSetting(settings, "avatarLODDistanceMultiplier", - DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER); - _octreeSizeScale = loadSetting(settings, "octreeSizeScale", DEFAULT_OCTREE_SIZE_SCALE); - _boundaryLevelAdjust = loadSetting(settings, "boundaryLevelAdjust", 0); - - if (lockedSettings) { - qApp->unlockSettings(); - } -} - -void LODManager::saveSettings(QSettings* settings) { - bool lockedSettings = false; - if (!settings) { - settings = qApp->lockSettings(); - lockedSettings = true; - } - - settings->setValue("automaticAvatarLOD", _automaticAvatarLOD); - settings->setValue("avatarLODDecreaseFPS", _avatarLODDecreaseFPS); - settings->setValue("avatarLODIncreaseFPS", _avatarLODIncreaseFPS); - settings->setValue("avatarLODDistanceMultiplier", _avatarLODDistanceMultiplier); - settings->setValue("octreeSizeScale", _octreeSizeScale); - settings->setValue("boundaryLevelAdjust", _boundaryLevelAdjust); - - if (lockedSettings) { - qApp->unlockSettings(); - } -} - - diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h index 76a0c11a20..2dffbf72f5 100644 --- a/interface/src/LODManager.h +++ b/interface/src/LODManager.h @@ -69,9 +69,6 @@ public: private: LODManager() {} - void loadSettings(QSettings* settings); - void saveSettings(QSettings* settings); - bool _automaticAvatarLOD = true; float _avatarLODDecreaseFPS = DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS; float _avatarLODIncreaseFPS = ADJUST_LOD_UP_FPS; From 8f5f634308a4acca012e7ea6e35c54b2c3e087fe Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 17 Jan 2015 21:22:02 -0800 Subject: [PATCH 017/238] Took audio settings out of Menu Hooked to actual settings in Audio class --- interface/src/Audio.h | 3 +- interface/src/Menu.cpp | 18 ---------- interface/src/Menu.h | 3 -- interface/src/ui/PreferencesDialog.cpp | 45 ++++++++++++------------ libraries/audio/src/InboundAudioStream.h | 12 +++++-- libraries/shared/src/MovingMinMaxAvg.h | 1 + 6 files changed, 34 insertions(+), 48 deletions(-) diff --git a/interface/src/Audio.h b/interface/src/Audio.h index abf322627b..34b36d41ac 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -96,14 +96,13 @@ public: }; const MixedProcessedAudioStream& getReceivedAudioStream() const { return _receivedAudioStream; } + MixedProcessedAudioStream& getReceivedAudioStream() { return _receivedAudioStream; } float getLastInputLoudness() const { return glm::max(_lastInputLoudness - _inputGate.getMeasuredFloor(), 0.0f); } float getTimeSinceLastClip() const { return _timeSinceLastClip; } float getAudioAverageInputLoudness() const { return _lastInputLoudness; } - void setReceivedAudioStreamSettings(const InboundAudioStream::Settings& settings) { _receivedAudioStream.setSettings(settings); } - int getDesiredJitterBufferFrames() const { return _receivedAudioStream.getDesiredJitterBufferFrames(); } bool isMuted() { return _muted; } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index cf6951a9fc..62b607fdd1 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -582,15 +582,6 @@ void Menu::loadSettings(QSettings* settings) { lockedSettings = true; } - _receivedAudioStreamSettings._dynamicJitterBuffers = settings->value("dynamicJitterBuffers", DEFAULT_DYNAMIC_JITTER_BUFFERS).toBool(); - _receivedAudioStreamSettings._maxFramesOverDesired = settings->value("maxFramesOverDesired", DEFAULT_MAX_FRAMES_OVER_DESIRED).toInt(); - _receivedAudioStreamSettings._staticDesiredJitterBufferFrames = settings->value("staticDesiredJitterBufferFrames", DEFAULT_STATIC_DESIRED_JITTER_BUFFER_FRAMES).toInt(); - _receivedAudioStreamSettings._useStDevForJitterCalc = settings->value("useStDevForJitterCalc", DEFAULT_USE_STDEV_FOR_JITTER_CALC).toBool(); - _receivedAudioStreamSettings._windowStarveThreshold = settings->value("windowStarveThreshold", DEFAULT_WINDOW_STARVE_THRESHOLD).toInt(); - _receivedAudioStreamSettings._windowSecondsForDesiredCalcOnTooManyStarves = settings->value("windowSecondsForDesiredCalcOnTooManyStarves", DEFAULT_WINDOW_SECONDS_FOR_DESIRED_CALC_ON_TOO_MANY_STARVES).toInt(); - _receivedAudioStreamSettings._windowSecondsForDesiredReduction = settings->value("windowSecondsForDesiredReduction", DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION).toInt(); - _receivedAudioStreamSettings._repetitionWithFade = settings->value("repetitionWithFade", DEFAULT_REPETITION_WITH_FADE).toBool(); - auto audio = DependencyManager::get