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); } }