From c0b4cb28e07d3140126d128c977e1415897ab329 Mon Sep 17 00:00:00 2001 From: Troy James Sobotka Date: Thu, 23 Apr 2020 01:00:02 -0700 Subject: [PATCH 1/9] Temp waveform work. --- app/shaders/rgbwaveform.frag | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/app/shaders/rgbwaveform.frag b/app/shaders/rgbwaveform.frag index c97562daa..0c102f013 100644 --- a/app/shaders/rgbwaveform.frag +++ b/app/shaders/rgbwaveform.frag @@ -14,19 +14,28 @@ out vec4 fragColor; void main(void) { vec3 col = vec3(0.0); - float s = ove_texcoord.y * 1.8 - 0.15; - float maxb = s + threshold; - float minb = s - threshold; + float increment = 1.0 / 255.0; + float maxb = ove_texcoord.y + increment; + float minb = ove_texcoord.y - increment; int y_lim = int(ove_resolution.y); + vec3 cur_col = vec3(0.0); for (int i = 0; i < y_lim; i++) { - vec3 x = texture(ove_maintex, vec2(ove_texcoord.x, float(i) / float(ove_resolution.y))).rgb; - col += step(x, vec3(maxb)) * step(vec3(minb), x) / (ove_resolution.y * 0.125); + cur_col = texture2D( + ove_maintex, + vec2(ove_texcoord.x, float(i) / float(ove_resolution.y)) + ).rgb; - float l = dot(x, x); - col += step(l, maxb * maxb) * step(minb * minb, l) / (ove_resolution.y * 0.125); + col += step(vec3(ove_texcoord.y - increment), cur_col) * + step(cur_col, vec3(ove_texcoord.y + increment)); + + //float l = dot(x, x); + //col += step(l, maxb*maxb)*step(minb*minb, l) / (ove_resolution.y * 0.125); } - - fragColor = vec4(col, 1.0); + // if (ove_texcoord.y > (240.0 / 255.0)) + // { + // col = vec3(1.0, 0.0, 1.0); + // } + gl_FragColor = vec4(col, 1.0); } From f82bd39f0e71516a6ee191795a81b357321dac36 Mon Sep 17 00:00:00 2001 From: Troy James Sobotka Date: Mon, 27 Apr 2020 10:17:17 -0700 Subject: [PATCH 2/9] Minor tweaks Cleanup. --- app/shaders/rgbwaveform.frag | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/shaders/rgbwaveform.frag b/app/shaders/rgbwaveform.frag index 0c102f013..dbdf0cdc0 100644 --- a/app/shaders/rgbwaveform.frag +++ b/app/shaders/rgbwaveform.frag @@ -5,6 +5,9 @@ uniform sampler2D ove_maintex; uniform vec2 ove_resolution; +uniform vec2 ove_viewport; +varying vec2 ove_texcoord; + uniform float threshold; @@ -33,9 +36,6 @@ void main(void) { //float l = dot(x, x); //col += step(l, maxb*maxb)*step(minb*minb, l) / (ove_resolution.y * 0.125); } - // if (ove_texcoord.y > (240.0 / 255.0)) - // { - // col = vec3(1.0, 0.0, 1.0); - // } + gl_FragColor = vec4(col, 1.0); } From 5dd999b406cc8ef985ed85be4cce8e98a5da3cc6 Mon Sep 17 00:00:00 2001 From: Troy James Sobotka Date: Mon, 27 Apr 2020 23:17:54 -0700 Subject: [PATCH 3/9] First working pass of Waveform Remove the sum, add some commments, and make it scale to the full window. TODO: * Hook up CM. * Add UI for intensity * Add lines at 20% increments, plus under / overshoot? * Add UI for increments. --- app/shaders/rgbwaveform.frag | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/app/shaders/rgbwaveform.frag b/app/shaders/rgbwaveform.frag index dbdf0cdc0..3e1d0fd40 100644 --- a/app/shaders/rgbwaveform.frag +++ b/app/shaders/rgbwaveform.frag @@ -6,8 +6,6 @@ uniform sampler2D ove_maintex; uniform vec2 ove_resolution; uniform vec2 ove_viewport; -varying vec2 ove_texcoord; - uniform float threshold; @@ -17,10 +15,21 @@ out vec4 fragColor; void main(void) { vec3 col = vec3(0.0); - float increment = 1.0 / 255.0; + // Set an increment default to 10 bit encodings. This would likely be + // better served as a UI control, as waveforms will change their combing + // based on how granular the increment is set. For example, it can be + // challenging to spot 8 bit combing with an increment of 1. / 2.^8 - 1. + float increment = 1.0 / (pow(2, 10) - 1.0); float maxb = ove_texcoord.y + increment; float minb = ove_texcoord.y - increment; + // Intensity would make sense to also expose via the UI, as a density + // slider allows you to peek past certain values or reveal very low + // values. Hard coding it for now, as there isn't a clear way to have + // the various bit depth / code values always display at a consistent + // emission output strength. + float intensity = 0.10; + int y_lim = int(ove_resolution.y); vec3 cur_col = vec3(0.0); @@ -31,10 +40,18 @@ void main(void) { ).rgb; col += step(vec3(ove_texcoord.y - increment), cur_col) * - step(cur_col, vec3(ove_texcoord.y + increment)); + step(cur_col, vec3(ove_texcoord.y + increment)) * intensity; + + // TODO: Implement proper luma / luminance based values. + // This is simply taking the luminance weights derived from the + // OCIO configuration or the RGB to XYZ matrix and multiplying + // the above step approach by the luminance weights. + // EG: + // cur_lum = cur_col * lum_coeffs; + // + // col += step(vec3(ove_texcoord.y - increment), cur_lum) * + // step(cur_lum, vec3(ove_texcoord.y + increment)); - //float l = dot(x, x); - //col += step(l, maxb*maxb)*step(minb*minb, l) / (ove_resolution.y * 0.125); } gl_FragColor = vec4(col, 1.0); From b9a62eb1aa211a0720059ceb2dee3f37d1033700 Mon Sep 17 00:00:00 2001 From: Troy James Sobotka Date: Tue, 28 Apr 2020 08:59:55 -0700 Subject: [PATCH 4/9] Add lines Adding waveform lines. Still requires scaling to fit in arbitrary range. --- app/shaders/rgbwaveform.frag | 12 ++++++------ app/widget/scope/waveform/waveform.cpp | 27 ++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/app/shaders/rgbwaveform.frag b/app/shaders/rgbwaveform.frag index 3e1d0fd40..94537a703 100644 --- a/app/shaders/rgbwaveform.frag +++ b/app/shaders/rgbwaveform.frag @@ -6,8 +6,7 @@ uniform sampler2D ove_maintex; uniform vec2 ove_resolution; uniform vec2 ove_viewport; - -uniform float threshold; +uniform vec3 luma_coeffs; in vec2 ove_texcoord; @@ -33,6 +32,7 @@ void main(void) { int y_lim = int(ove_resolution.y); vec3 cur_col = vec3(0.0); + vec3 cur_lum = vec3(0.0); for (int i = 0; i < y_lim; i++) { cur_col = texture2D( ove_maintex, @@ -47,10 +47,10 @@ void main(void) { // OCIO configuration or the RGB to XYZ matrix and multiplying // the above step approach by the luminance weights. // EG: - // cur_lum = cur_col * lum_coeffs; - // - // col += step(vec3(ove_texcoord.y - increment), cur_lum) * - // step(cur_lum, vec3(ove_texcoord.y + increment)); + cur_lum = vec3(dot(cur_col, luma_coeffs)); + + col += step(vec3(ove_texcoord.y - increment), cur_lum) * + step(cur_lum, vec3(ove_texcoord.y + increment)) * intensity; } diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 0ce873bc5..530be3981 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -21,6 +21,10 @@ #include "waveform.h" +#include +#include +#include + #include "node/node.h" #include "render/backend/opengl/openglrenderfunctions.h" @@ -95,6 +99,22 @@ void WaveformScope::paintGL() color_service()->ProcessOpenGL(); + QVector ire_lines(6); + + for (int i=1; i <= 5; i++) { + ire_lines[i].setLine( + 0.0, height() * (i * 0.20), width(), height() * + (i * 0.20)); + } + ire_lines[0].setLine(0.0, 0.0, width(), 0.0); + ire_lines[5].setLine(0.0, height() - 1.0, width(), height() - 1.0); + + QPainter p(this); + p.setCompositionMode(QPainter::CompositionMode_Plus); + + p.setPen(Qt::red); + p.drawLines(ire_lines); + texture_.Release(); framebuffer_.Release(); @@ -107,8 +127,11 @@ void WaveformScope::paintGL() pipeline_->setUniformValue("ove_resolution", texture_.width(), texture_.height()); pipeline_->setUniformValue("ove_viewport", width(), height()); - // The general size of a pixel - pipeline_->setUniformValue("threshold", 2.0f / static_cast(height())); + GLfloat luma[3] = {0.0, 0.0, 0.0}; + + color_manager()->GetDefaultLumaCoefs(luma); + // qDebug() << "LUMA" << luma[0] << " " << luma[1] << " " << luma[2]; + pipeline_->setUniformValue("luma_coeffs", luma[0], luma[1], luma[2]); pipeline_->release(); From 4af10b2b5cebbb2b640916d6fd7333275de19ec4 Mon Sep 17 00:00:00 2001 From: Troy James Sobotka Date: Tue, 28 Apr 2020 15:05:11 -0700 Subject: [PATCH 5/9] Update Waveform Output Updates: * Added IRE text on 20% increments * Added waveform lines that work * Scaled waveform to a subsection of the surface --- app/shaders/rgbwaveform.frag | 50 +++++++++++------- app/widget/scope/waveform/waveform.cpp | 71 +++++++++++++++++++------- 2 files changed, 84 insertions(+), 37 deletions(-) diff --git a/app/shaders/rgbwaveform.frag b/app/shaders/rgbwaveform.frag index 94537a703..3641541fa 100644 --- a/app/shaders/rgbwaveform.frag +++ b/app/shaders/rgbwaveform.frag @@ -8,6 +8,11 @@ uniform vec2 ove_resolution; uniform vec2 ove_viewport; uniform vec3 luma_coeffs; +uniform float waveform_scale; +uniform vec2 waveform_dims; +uniform vec4 waveform_region; +uniform vec4 waveform_uv; + in vec2 ove_texcoord; out vec4 fragColor; @@ -19,8 +24,8 @@ void main(void) { // based on how granular the increment is set. For example, it can be // challenging to spot 8 bit combing with an increment of 1. / 2.^8 - 1. float increment = 1.0 / (pow(2, 10) - 1.0); - float maxb = ove_texcoord.y + increment; - float minb = ove_texcoord.y - increment; + float maxb = waveform_dims.y + increment; + float minb = waveform_dims.y - increment; // Intensity would make sense to also expose via the UI, as a density // slider allows you to peek past certain values or reveal very low @@ -29,29 +34,38 @@ void main(void) { // emission output strength. float intensity = 0.10; - int y_lim = int(ove_resolution.y); + int y_lim = int(waveform_dims.y); vec3 cur_col = vec3(0.0); vec3 cur_lum = vec3(0.0); - for (int i = 0; i < y_lim; i++) { - cur_col = texture2D( - ove_maintex, - vec2(ove_texcoord.x, float(i) / float(ove_resolution.y)) - ).rgb; - col += step(vec3(ove_texcoord.y - increment), cur_col) * - step(cur_col, vec3(ove_texcoord.y + increment)) * intensity; + if ( + (gl_FragCoord.x >= waveform_region.x) && + (gl_FragCoord.y >= waveform_region.y) && + (gl_FragCoord.x < waveform_region.z) && + (gl_FragCoord.y < waveform_region.w) + ) { + // col = vec3(0.5, 0.5, 0.0); + // int start = int(waveform_region.y); + int stop = int(waveform_dims.y); + float ratio = 0.0; + float waveform_x = (ove_texcoord.x - waveform_uv.x) / waveform_scale; + float waveform_y = (ove_texcoord.y - waveform_uv.y) / waveform_scale; + for (int i = 0; i < waveform_dims.y; i++) { + ratio = float(i) / float(waveform_dims.y); + cur_col = texture2D( + ove_maintex, + vec2(waveform_x, ratio) + ).rgb; - // TODO: Implement proper luma / luminance based values. - // This is simply taking the luminance weights derived from the - // OCIO configuration or the RGB to XYZ matrix and multiplying - // the above step approach by the luminance weights. - // EG: - cur_lum = vec3(dot(cur_col, luma_coeffs)); + col += step(vec3(waveform_y - increment), cur_col) * + step(cur_col, vec3(waveform_y + increment)) * intensity; - col += step(vec3(ove_texcoord.y - increment), cur_lum) * - step(cur_lum, vec3(ove_texcoord.y + increment)) * intensity; + cur_lum = vec3(dot(cur_col, luma_coeffs)); + col += step(vec3(waveform_y - increment), cur_lum) * + step(cur_lum, vec3(waveform_y + increment)) * intensity; + } } gl_FragColor = vec4(col, 1.0); diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 530be3981..b81875b83 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -99,22 +99,6 @@ void WaveformScope::paintGL() color_service()->ProcessOpenGL(); - QVector ire_lines(6); - - for (int i=1; i <= 5; i++) { - ire_lines[i].setLine( - 0.0, height() * (i * 0.20), width(), height() * - (i * 0.20)); - } - ire_lines[0].setLine(0.0, 0.0, width(), 0.0); - ire_lines[5].setLine(0.0, height() - 1.0, width(), height() - 1.0); - - QPainter p(this); - p.setCompositionMode(QPainter::CompositionMode_Plus); - - p.setPen(Qt::red); - p.drawLines(ire_lines); - texture_.Release(); framebuffer_.Release(); @@ -126,13 +110,36 @@ void WaveformScope::paintGL() pipeline_->bind(); pipeline_->setUniformValue("ove_resolution", texture_.width(), texture_.height()); pipeline_->setUniformValue("ove_viewport", width(), height()); - GLfloat luma[3] = {0.0, 0.0, 0.0}; - color_manager()->GetDefaultLumaCoefs(luma); - // qDebug() << "LUMA" << luma[0] << " " << luma[1] << " " << luma[2]; pipeline_->setUniformValue("luma_coeffs", luma[0], luma[1], luma[2]); + // Scale of the waveform relative to the viewport surface. + float waveform_scale = 0.80; + pipeline_->setUniformValue("waveform_scale", waveform_scale); + float waveform_dim_x = width() * waveform_scale; + float waveform_dim_y = height() * waveform_scale; + pipeline_->setUniformValue( + "waveform_dims", waveform_dim_x, waveform_dim_y); + + float waveform_start_dim_x = (width() - waveform_dim_x) / 2.0; + float waveform_start_dim_y = (height() - waveform_dim_y) / 2.0; + float waveform_end_dim_x = width() - waveform_start_dim_x; + float waveform_end_dim_y = height() - waveform_start_dim_y; + pipeline_->setUniformValue( + "waveform_region", + waveform_start_dim_x, waveform_start_dim_y, + waveform_end_dim_x, waveform_end_dim_y); + + float waveform_start_uv_x = waveform_start_dim_x / width(); + float waveform_start_uv_y = waveform_start_dim_y / height(); + float waveform_end_uv_x = waveform_end_dim_x / width(); + float waveform_end_uv_y = waveform_end_dim_y / height(); + pipeline_->setUniformValue( + "waveform_uv", + waveform_start_uv_x, waveform_start_uv_y, + waveform_end_uv_x, waveform_end_uv_y); + pipeline_->release(); f->glViewport(0, 0, width(), height()); @@ -142,6 +149,32 @@ void WaveformScope::paintGL() OpenGLRenderFunctions::Blit(pipeline_); managed_tex_.Release(); + + QVector ire_lines(6); + QPainter p(this); + QFontMetrics font_metrics = QFontMetrics(QFont()); + QString label; + int font_width = 0; + + p.setCompositionMode(QPainter::CompositionMode_Plus); + + p.setPen(QColor(0.0, 0.6 * 255.0, 0.0)); + p.setFont(QFont()); + + for (int i=0; i <= 5; i++) { + ire_lines[i].setLine( + waveform_start_dim_x, + (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y, + waveform_end_dim_x, + (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y); + label = QString::number(i * 20); + font_width = font_metrics.width(label); + p.drawText( + waveform_start_dim_x - font_width, + (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y, + label); + } + p.drawLines(ire_lines); } } From c06bdc5eac7fe9a8ca6d8a23d30f04ba23f05881 Mon Sep 17 00:00:00 2001 From: Troy James Sobotka Date: Tue, 28 Apr 2020 15:39:16 -0700 Subject: [PATCH 6/9] Update flourishes Centre and align text. --- app/widget/scope/waveform/waveform.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index b81875b83..5ac659c3b 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -154,7 +154,8 @@ void WaveformScope::paintGL() QPainter p(this); QFontMetrics font_metrics = QFontMetrics(QFont()); QString label; - int font_width = 0; + int font_x_offset = 0; + int font_y_offset = font_metrics.capHeight() / 2.0; p.setCompositionMode(QPainter::CompositionMode_Plus); @@ -167,11 +168,12 @@ void WaveformScope::paintGL() (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y, waveform_end_dim_x, (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y); - label = QString::number(i * 20); - font_width = font_metrics.width(label); + label = QString::number(1.0 - (i * 0.2), 'f', 1); + font_x_offset = font_metrics.width(label) + 4; + p.drawText( - waveform_start_dim_x - font_width, - (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y, + waveform_start_dim_x - font_x_offset, + (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y + font_y_offset, label); } p.drawLines(ire_lines); From 949e43cada9193c4678ca1b9c966b128794a3178 Mon Sep 17 00:00:00 2001 From: Troy James Sobotka Date: Tue, 28 Apr 2020 15:59:40 -0700 Subject: [PATCH 7/9] Update IRE increments Move to 10% increments. --- app/widget/scope/waveform/waveform.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 5ac659c3b..2f47c8dcf 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -150,10 +150,12 @@ void WaveformScope::paintGL() managed_tex_.Release(); - QVector ire_lines(6); QPainter p(this); QFontMetrics font_metrics = QFontMetrics(QFont()); QString label; + float ire_increment = 0.1; + float ire_steps = int(1.0 / ire_increment); + QVector ire_lines(ire_steps + 1); int font_x_offset = 0; int font_y_offset = font_metrics.capHeight() / 2.0; @@ -162,18 +164,18 @@ void WaveformScope::paintGL() p.setPen(QColor(0.0, 0.6 * 255.0, 0.0)); p.setFont(QFont()); - for (int i=0; i <= 5; i++) { + for (int i=0; i <= ire_steps; i++) { ire_lines[i].setLine( waveform_start_dim_x, - (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y, + (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y, waveform_end_dim_x, - (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y); - label = QString::number(1.0 - (i * 0.2), 'f', 1); + (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y); + label = QString::number(1.0 - (i * ire_increment), 'f', 1); font_x_offset = font_metrics.width(label) + 4; p.drawText( waveform_start_dim_x - font_x_offset, - (waveform_dim_y * (i * 0.20)) + waveform_start_dim_y + font_y_offset, + (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y + font_y_offset, label); } p.drawLines(ire_lines); From dfedcb97b293a86c6861315ed101203f30184887 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 29 Apr 2020 15:56:24 +1000 Subject: [PATCH 8/9] waveform: use qfontmetrics macro for version compatibility --- app/widget/scope/waveform/waveform.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 2f47c8dcf..39c6f81cb 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -25,6 +25,7 @@ #include #include +#include "common/qtutils.h" #include "node/node.h" #include "render/backend/opengl/openglrenderfunctions.h" @@ -171,7 +172,7 @@ void WaveformScope::paintGL() waveform_end_dim_x, (waveform_dim_y * (i * ire_increment)) + waveform_start_dim_y); label = QString::number(1.0 - (i * ire_increment), 'f', 1); - font_x_offset = font_metrics.width(label) + 4; + font_x_offset = QFontMetricsWidth(font_metrics, label) + 4; p.drawText( waveform_start_dim_x - font_x_offset, From 544a8855d3f53e8744de04254cfcdfbeccdd220b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 29 Apr 2020 15:56:46 +1000 Subject: [PATCH 9/9] waveform: update for glsl 150 --- app/shaders/rgbwaveform.frag | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/shaders/rgbwaveform.frag b/app/shaders/rgbwaveform.frag index 3641541fa..3e839b386 100644 --- a/app/shaders/rgbwaveform.frag +++ b/app/shaders/rgbwaveform.frag @@ -53,7 +53,7 @@ void main(void) { float waveform_y = (ove_texcoord.y - waveform_uv.y) / waveform_scale; for (int i = 0; i < waveform_dims.y; i++) { ratio = float(i) / float(waveform_dims.y); - cur_col = texture2D( + cur_col = texture( ove_maintex, vec2(waveform_x, ratio) ).rgb; @@ -68,5 +68,5 @@ void main(void) { } } - gl_FragColor = vec4(col, 1.0); + fragColor = vec4(col, 1.0); }