From 07a5c7bd161b1b8ece0b5685afc44876c48afc25 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 19 Feb 2016 11:22:01 -0800 Subject: [PATCH] Update grid shader for major/minor lines --- interface/src/audio/AudioScope.cpp | 10 +++--- interface/src/ui/overlays/Grid3DOverlay.cpp | 13 +++----- libraries/render-utils/src/GeometryCache.cpp | 29 ++++++++++------- libraries/render-utils/src/GeometryCache.h | 33 ++++++++++---------- libraries/render-utils/src/grid.slf | 20 +++++++++--- 5 files changed, 61 insertions(+), 44 deletions(-) diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index b62dcf5f28..75abe0c4ca 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -117,8 +117,8 @@ void AudioScope::render(RenderArgs* renderArgs, int width, int height) { 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; + static const int gridCols = 2; + int gridRows = _framesPerScope; int x = (width - (int)SCOPE_WIDTH) / 2; int y = (height - (int)SCOPE_HEIGHT) / 2; @@ -128,8 +128,10 @@ void AudioScope::render(RenderArgs* renderArgs, int width, int height) { gpu::Batch& batch = *renderArgs->_batch; auto geometryCache = DependencyManager::get(); - // Grid uses its own pipeline - geometryCache->renderGrid(batch, x, y, w, h, gridRows, gridCols, gridColor, 0.005f, _audioScopeGrid); + // Grid uses its own pipeline, so draw it before setting another + const float GRID_EDGE = 0.005f; + geometryCache->renderGrid(batch, glm::vec2(x, y), glm::vec2(x + w, y + h), + gridRows, gridCols, GRID_EDGE, gridColor, _audioScopeGrid); geometryCache->useSimpleDrawPipeline(batch); auto textureCache = DependencyManager::get(); diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index 282595907e..d02219bcb6 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -71,15 +71,12 @@ void Grid3DOverlay::render(RenderArgs* args) { transform.setTranslation(position); batch->setModelTransform(transform); - // Minor grid const float MINOR_GRID_EDGE = 0.0025f; - DependencyManager::get()->renderGrid(*batch, - minCorner, maxCorner, _minorGridRowDivisions, _minorGridColDivisions, gridColor, MINOR_GRID_EDGE); - - // Major grid - const float MAJOR_GRID_EDGE = 0.01f; - DependencyManager::get()->renderGrid(*batch, - minCorner, maxCorner, _majorGridRowDivisions, _majorGridColDivisions, gridColor, MAJOR_GRID_EDGE); + const float MAJOR_GRID_EDGE = 0.005f; + DependencyManager::get()->renderGrid(*batch, minCorner, maxCorner, + _minorGridRowDivisions, _minorGridColDivisions, MINOR_GRID_EDGE, + _majorGridRowDivisions, _majorGridColDivisions, MAJOR_GRID_EDGE, + gridColor); } } diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index b5e09d0539..e1f5ce67ba 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -566,14 +566,17 @@ void GeometryCache::renderWireSphere(gpu::Batch& batch) { renderWireShape(batch, Sphere); } -void GeometryCache::renderGrid(gpu::Batch& batch, - const glm::vec2& minCorner, const glm::vec2& maxCorner, - int rows, int cols, const glm::vec4& color, float edge, int id) { - static const glm::vec2 minTexCoord(0.0f, 1.0f); - static const glm::vec2 maxTexCoord(1.0f, 0.0f); +void GeometryCache::renderGrid(gpu::Batch& batch, const glm::vec2& minCorner, const glm::vec2& maxCorner, + int majorRows, int majorCols, float majorEdge, + int minorRows, int minorCols, float minorEdge, + const glm::vec4& color, int id) { + static const glm::vec2 MIN_TEX_COORD(0.0f, 0.0f); + static const glm::vec2 MAX_TEX_COORD(1.0f, 1.0f); bool registered = (id != UNKNOWN_ID); - Vec2FloatPair key(glm::vec2(rows, cols), edge); + Vec2FloatPair majorKey(glm::vec2(majorRows, majorCols), majorEdge); + Vec2FloatPair minorKey(glm::vec2(minorRows, minorCols), minorEdge); + Vec2FloatPairPair key(majorKey, minorKey); // Make the gridbuffer if ((registered && (!_registeredGridBuffers.contains(id) || _lastRegisteredGridBuffer[id] != key)) || @@ -592,16 +595,20 @@ void GeometryCache::renderGrid(gpu::Batch& batch, _gridBuffers[key] = gridBuffer; } - gridBuffer.edit().period = glm::vec2(cols, rows); - gridBuffer.edit().offset.x = -(edge / cols) / 2; - gridBuffer.edit().offset.y = -(edge / rows) / 2; - gridBuffer.edit().balance = glm::vec2(1 - edge); + gridBuffer.edit().period = glm::vec4(majorRows, majorCols, minorRows, minorCols); + gridBuffer.edit().offset.x = -(majorEdge / majorRows) / 2; + gridBuffer.edit().offset.y = -(majorEdge / majorCols) / 2; + gridBuffer.edit().offset.z = -(minorEdge / minorRows) / 2; + gridBuffer.edit().offset.w = -(minorEdge / minorCols) / 2; + gridBuffer.edit().balance = glm::vec4(glm::vec2(1.0f - majorEdge), + // If rows or columns are not set, do not draw minor gridlines + glm::vec2((minorRows != 0 && minorCols != 0) ? 1.0f - minorEdge : 0.0f)); } // Set the grid pipeline useGridPipeline(batch, registered ? _registeredGridBuffers[id] : _gridBuffers[key]); - renderQuad(batch, minCorner, maxCorner, minTexCoord, maxTexCoord, color, id); + renderQuad(batch, minCorner, maxCorner, MIN_TEX_COORD, MAX_TEX_COORD, color, id); } void GeometryCache::updateVertices(int id, const QVector& points, const glm::vec4& color) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 51ec86f3fa..a10ec84db5 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -32,6 +32,7 @@ class SimpleProgramKey; typedef QPair Vec2FloatPair; +typedef QPair Vec2FloatPairPair; typedef QPair Vec2Pair; typedef QPair Vec2PairPair; typedef QPair Vec3Pair; @@ -42,14 +43,10 @@ typedef QPair Vec3PairVec4Pair; typedef QPair Vec4PairVec4; typedef QPair Vec4PairVec4Pair; -inline uint qHash(const glm::vec2& v, uint seed) { +inline uint qHash(const Vec2FloatPairPair& v, uint seed) { // multiply by prime numbers greater than the possible size - return qHash(v.x + 5009 * v.y, seed); -} - -inline uint qHash(const Vec2FloatPair& v, uint seed) { - // multiply by prime numbers greater than the possible size - return qHash(v.first.x + 5009 * v.first.y + 5011 * v.second); + return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.second + + 5021 * v.second.first.x + 5023 * v.second.first.y + 5039 * v.second.second); } inline uint qHash(const Vec2Pair& v, uint seed) { @@ -207,9 +204,13 @@ public: void renderWireSphere(gpu::Batch& batch); size_t getSphereTriangleCount(); - void renderGrid(gpu::Batch& batch, const glm::vec2& minCorner, const glm::vec2& maxCorner, int rows, int cols, const glm::vec4& color, float edge = 0.01f, int id = UNKNOWN_ID); - void renderGrid(gpu::Batch& batch, int x, int y, int width, int height, int rows, int cols, const glm::vec4& color, float edge = 0.01f, int id = UNKNOWN_ID) { - renderGrid(batch, glm::vec2(x, y), glm::vec2(x + width, y + height), rows, cols, color, edge, id); + void renderGrid(gpu::Batch& batch, const glm::vec2& minCorner, const glm::vec2& maxCorner, + int majorRows, int majorCols, float majorEdge, + int minorRows, int minorCols, float minorEdge, + const glm::vec4& color, int id = UNKNOWN_ID); + void renderGrid(gpu::Batch& batch, const glm::vec2& minCorner, const glm::vec2& maxCorner, + int rows, int cols, float edge, const glm::vec4& color, int id = UNKNOWN_ID) { + renderGrid(batch, minCorner, maxCorner, rows, cols, edge, 0, 0, 0.0f, color, id); } void renderBevelCornersRect(gpu::Batch& batch, int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id = UNKNOWN_ID); @@ -318,10 +319,10 @@ private: class GridSchema { public: - glm::vec2 period; - glm::vec2 offset; - glm::vec2 balance; - glm::vec2 _; + // data is arranged as majorRow, majorCol, minorRow, minorCol + glm::vec4 period; + glm::vec4 offset; + glm::vec4 balance; }; using GridBuffer = gpu::BufferView; void useGridPipeline(gpu::Batch& batch, GridBuffer gridBuffer); @@ -384,8 +385,8 @@ private: QHash _dashedLines; QHash _registeredDashedLines; - QHash _lastRegisteredGridBuffer; - QHash _gridBuffers; + QHash _lastRegisteredGridBuffer; + QHash _gridBuffers; QHash _registeredGridBuffers; QHash > _networkGeometry; diff --git a/libraries/render-utils/src/grid.slf b/libraries/render-utils/src/grid.slf index d835d4bbde..0c2b00b3b0 100644 --- a/libraries/render-utils/src/grid.slf +++ b/libraries/render-utils/src/grid.slf @@ -31,11 +31,16 @@ float paintGrid(vec2 value, vec2 offset, vec2 scale, vec2 balance) { paintStripe(value.y, offset.y, scale.y, balance.y)); } +float paintGridMajorMinor(vec2 value, vec4 offset, vec4 scale, vec4 balance) { + return max( + paintGrid(value, offset.xy, scale.xy, balance.xy), + paintGrid(value, offset.zw, scale.zw, balance.zw)); +} + struct Grid { - vec2 period; - vec2 offset; - vec2 balance; - vec2 _; + vec4 period; + vec4 offset; + vec4 balance; }; uniform gridBuffer { Grid grid; }; @@ -49,7 +54,12 @@ out vec4 outFragColor; void main(void) { Grid grid = getGrid(); - float alpha = paintGrid(varTexCoord0, grid.offset, grid.period, grid.balance); + float alpha; + if (grid.balance.z == 0.0) { + alpha = paintGrid(varTexCoord0, grid.offset.xy, grid.period.xy, grid.balance.xy); + } else { + alpha = paintGridMajorMinor(varTexCoord0, grid.offset, grid.period, grid.balance); + } if (alpha == 0.0) { discard; }