mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 04:44:11 +02:00
Update grid shader for major/minor lines
This commit is contained in:
parent
2d1c676a8b
commit
07a5c7bd16
5 changed files with 61 additions and 44 deletions
|
@ -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<GeometryCache>();
|
||||
|
||||
// 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<TextureCache>();
|
||||
|
|
|
@ -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<GeometryCache>()->renderGrid(*batch,
|
||||
minCorner, maxCorner, _minorGridRowDivisions, _minorGridColDivisions, gridColor, MINOR_GRID_EDGE);
|
||||
|
||||
// Major grid
|
||||
const float MAJOR_GRID_EDGE = 0.01f;
|
||||
DependencyManager::get<GeometryCache>()->renderGrid(*batch,
|
||||
minCorner, maxCorner, _majorGridRowDivisions, _majorGridColDivisions, gridColor, MAJOR_GRID_EDGE);
|
||||
const float MAJOR_GRID_EDGE = 0.005f;
|
||||
DependencyManager::get<GeometryCache>()->renderGrid(*batch, minCorner, maxCorner,
|
||||
_minorGridRowDivisions, _minorGridColDivisions, MINOR_GRID_EDGE,
|
||||
_majorGridRowDivisions, _majorGridColDivisions, MAJOR_GRID_EDGE,
|
||||
gridColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<GridSchema>().period = glm::vec2(cols, rows);
|
||||
gridBuffer.edit<GridSchema>().offset.x = -(edge / cols) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.y = -(edge / rows) / 2;
|
||||
gridBuffer.edit<GridSchema>().balance = glm::vec2(1 - edge);
|
||||
gridBuffer.edit<GridSchema>().period = glm::vec4(majorRows, majorCols, minorRows, minorCols);
|
||||
gridBuffer.edit<GridSchema>().offset.x = -(majorEdge / majorRows) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.y = -(majorEdge / majorCols) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.z = -(minorEdge / minorRows) / 2;
|
||||
gridBuffer.edit<GridSchema>().offset.w = -(minorEdge / minorCols) / 2;
|
||||
gridBuffer.edit<GridSchema>().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<glm::vec2>& points, const glm::vec4& color) {
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
class SimpleProgramKey;
|
||||
|
||||
typedef QPair<glm::vec2, float> Vec2FloatPair;
|
||||
typedef QPair<Vec2FloatPair, Vec2FloatPair> Vec2FloatPairPair;
|
||||
typedef QPair<glm::vec2, glm::vec2> Vec2Pair;
|
||||
typedef QPair<Vec2Pair, Vec2Pair> Vec2PairPair;
|
||||
typedef QPair<glm::vec3, glm::vec3> Vec3Pair;
|
||||
|
@ -42,14 +43,10 @@ typedef QPair<Vec3Pair, Vec4Pair> Vec3PairVec4Pair;
|
|||
typedef QPair<Vec4Pair, glm::vec4> Vec4PairVec4;
|
||||
typedef QPair<Vec4Pair, Vec4Pair> 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<Vec3PairVec2Pair, BatchItemDetails> _dashedLines;
|
||||
QHash<int, BatchItemDetails> _registeredDashedLines;
|
||||
|
||||
QHash<int, Vec2FloatPair> _lastRegisteredGridBuffer;
|
||||
QHash<Vec2FloatPair, GridBuffer> _gridBuffers;
|
||||
QHash<int, Vec2FloatPairPair> _lastRegisteredGridBuffer;
|
||||
QHash<Vec2FloatPairPair, GridBuffer> _gridBuffers;
|
||||
QHash<int, GridBuffer> _registeredGridBuffers;
|
||||
|
||||
QHash<QUrl, QWeakPointer<NetworkGeometry> > _networkGeometry;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue