From 831fe7727559f7e16917520d582e92c90d79b009 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sun, 24 Apr 2022 21:03:00 +0100 Subject: [PATCH] Cleanup and rename OCIO Linear Grading node --- app/node/color/CMakeLists.txt | 2 +- .../ociogradingtransform.cpp | 157 ------------------ .../CMakeLists.txt | 4 +- .../ociogradingtransformlinear.cpp | 125 ++++++++++++++ .../ociogradingtransformlinear.h} | 20 +-- app/node/factory.cpp | 6 +- app/node/factory.h | 2 +- app/render/renderer.cpp | 8 +- app/shaders/chromakey.frag | 36 ++-- 9 files changed, 169 insertions(+), 191 deletions(-) delete mode 100644 app/node/color/ociogradingtransform/ociogradingtransform.cpp rename app/node/color/{ociogradingtransform => ociogradingtransformlinear}/CMakeLists.txt (84%) create mode 100644 app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp rename app/node/color/{ociogradingtransform/ociogradingtransform.h => ociogradingtransformlinear/ociogradingtransformlinear.h} (74%) diff --git a/app/node/color/CMakeLists.txt b/app/node/color/CMakeLists.txt index 0cdea800e..046c499da 100644 --- a/app/node/color/CMakeLists.txt +++ b/app/node/color/CMakeLists.txt @@ -17,7 +17,7 @@ add_subdirectory(colormanager) add_subdirectory(displaytransform) add_subdirectory(ociobase) -add_subdirectory(ociogradingtransform) +add_subdirectory(ociogradingtransformlinear) set(OLIVE_SOURCES ${OLIVE_SOURCES} diff --git a/app/node/color/ociogradingtransform/ociogradingtransform.cpp b/app/node/color/ociogradingtransform/ociogradingtransform.cpp deleted file mode 100644 index 27a8f57f0..000000000 --- a/app/node/color/ociogradingtransform/ociogradingtransform.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2021 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "ociogradingtransform.h" - -#include "common/ocioutils.h" -#include "node/project/project.h" -#include "render/colorprocessor.h" - -namespace olive { - -const QString OCIOGradingTransformNode::kTypeInput = QStringLiteral("type_in"); -const QString OCIOGradingTransformNode::kBrightnessInput = QStringLiteral("brightness_in"); -const QString OCIOGradingTransformNode::kContrastInput = QStringLiteral("contrast_in"); -const QString OCIOGradingTransformNode::kGammaInput = QStringLiteral("gamma_in"); -const QString OCIOGradingTransformNode::kOffsetInput = QStringLiteral("offset_in"); -const QString OCIOGradingTransformNode::kExposureInput = QStringLiteral("exposure_in"); -const QString OCIOGradingTransformNode::kLiftInput = QStringLiteral("lift_in"); -const QString OCIOGradingTransformNode::kGainInput = QStringLiteral("gain_in"); -const QString OCIOGradingTransformNode::kSaturationInput = QStringLiteral("saturation_in"); -const QString OCIOGradingTransformNode::kPivotInput = QStringLiteral("pivot_in"); -const QString OCIOGradingTransformNode::kPivotBlackInput = QStringLiteral("pivot_black_in"); -const QString OCIOGradingTransformNode::kPivotWhiteInput = QStringLiteral("pivot_white_in"); -const QString OCIOGradingTransformNode::kClampBlackInput = QStringLiteral("clamp_black_in"); -const QString OCIOGradingTransformNode::kClampWhiteInput = QStringLiteral("clamp_white_in"); - -#define super OCIOBaseNode - -OCIOGradingTransformNode::OCIOGradingTransformNode() -{ - AddInput(kTypeInput, NodeValue::kCombo, 0); - - //AddInput(kBrightnessInput, NodeValue::kVec4, QVector4D{0.0, 0.0, 0.0, 0.0}); - - AddInput(kContrastInput, NodeValue::kVec4, QVector4D{1.0, 1.0, 1.0, 1.0}, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); - SetInputProperty(kContrastInput, QStringLiteral("min"), QVector4D{0.001f, 0.001f, 0.001f, 0.001f}); - - //AddInput(kGammaInput, NodeValue::kVec4, QVector4D{1.0, 1.0, 1.0, 1.0}); - - AddInput(kOffsetInput, NodeValue::kVec4, QVector4D{0.0, 0.0, 0.0, 0.0}, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); - - AddInput(kExposureInput, NodeValue::kVec4, QVector4D{0.0, 0.0, 0.0, 0.0}, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); - - //AddInput(kLiftInput, NodeValue::kVec4, QVector4D{0.0, 0.0, 0.0, 0.0}); - - //AddInput(kGainInput, NodeValue::kVec4, QVector4D{1.0, 1.0, 1.0, 1.0}); - - AddInput(kSaturationInput, NodeValue::kFloat, 1.0, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); - SetInputProperty(kSaturationInput, QStringLiteral("min"), 0.0); - - AddInput(kPivotInput, NodeValue::kFloat, 0.203919098, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); - - // AddInput(kPivotBlackInput, NodeValue::kFloat, 0.0); - - //AddInput(kPivotWhiteInput, NodeValue::kFloat, 1.0); - - AddInput(kClampBlackInput, NodeValue::kFloat, 0.0, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); - - AddInput(kClampWhiteInput, NodeValue::kFloat, 200.0, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); -} - -QString OCIOGradingTransformNode::Name() const -{ - return tr("OCIO Grading Transform"); -} - -QString OCIOGradingTransformNode::id() const -{ - return QStringLiteral("org.olivevideoeditor.Olive.ociogradingtransform"); -} - -QVector OCIOGradingTransformNode::Category() const -{ - return {kCategoryColor}; -} - -QString OCIOGradingTransformNode::Description() const -{ - return tr("Simple color grading using OCIO"); -} - -void OCIOGradingTransformNode::Retranslate() -{ - super::Retranslate(); - - SetInputName(kTextureInput, tr("Input")); - SetInputName(kTypeInput, tr("Type")); - //SetInputName(kBrightnessInput, tr("Brightness")); - SetInputName(kContrastInput, tr("Contrast")); - //SetInputName(kGammaInput, tr("Gamma")); - SetInputName(kOffsetInput, tr("Offset")); - SetInputName(kExposureInput, tr("Exposure")); - //SetInputName(kLiftInput, tr("Lift")); - //SetInputName(kGainInput, tr("Gain")); - SetInputName(kSaturationInput, tr("Saturation")); - SetInputName(kPivotInput, tr("Pivot")); - //SetInputName(kPivotBlackInput, tr("Black Pivot")); - //SetInputName(kPivotWhiteInput, tr("White Pivot")); - SetInputName(kClampBlackInput, tr("Black Clamp")); - SetInputName(kClampWhiteInput, tr("White Clamp")); - - SetComboBoxStrings(kTypeInput, {"Linear"}); -} - -void OCIOGradingTransformNode::InputValueChangedEvent(const QString &input, int element) -{ - Q_UNUSED(element); - ConfigChanged(); -} - -void OCIOGradingTransformNode::ConfigChanged() -{ - OCIO::GradingPrimaryTransformRcPtr gp = OCIO::GradingPrimaryTransform::Create(OCIO::GRADING_LIN); - //auto gp = OCIO::GradingPrimaryTransform::Create(OCIO::GRADING_LIN); - gp->setDirection(OCIO::TransformDirection::TRANSFORM_DIR_FORWARD); - //gp->makeDynamic(); - - OCIO::GradingPrimary gpdata{OCIO::GRADING_LIN}; - //gpdata.m_lift = OCIOUtils::QVec4ToRGBM(GetStandardValue(kLiftInput).value()); - gpdata.m_contrast = OCIOUtils::QVec4ToRGBM(GetStandardValue(kContrastInput).value()); - gpdata.m_exposure = OCIOUtils::QVec4ToRGBM(GetStandardValue(kExposureInput).value()); - //gpdata.m_gamma = OCIOUtils::QVec4ToRGBM(GetStandardValue(kGammaInput).value()); - //gpdata.m_gain = OCIOUtils::QVec4ToRGBM(GetStandardValue(kGainInput).value()); - gpdata.m_offset = OCIOUtils::QVec4ToRGBM(GetStandardValue(kOffsetInput).value()); - gpdata.m_saturation = GetStandardValue(kSaturationInput).value(); - gpdata.m_pivot = GetStandardValue(kPivotInput).value(); - gpdata.m_clampBlack = GetStandardValue(kClampBlackInput).value(); - gpdata.m_clampWhite = GetStandardValue(kClampWhiteInput).value(); - //gpdata.m_pivotBlack = GetStandardValue(kPivotBlackInput).value(); - //gpdata.m_pivotWhite = GetStandardValue(kPivotWhiteInput).value(); - try { - gp->setValue(gpdata); - - set_processor(ColorProcessor::Create(manager()->GetConfig()->getProcessor(gp))); - } catch (const OCIO::Exception &e) { - std::cerr << std::endl << e.what() << std::endl; - } -} - -} diff --git a/app/node/color/ociogradingtransform/CMakeLists.txt b/app/node/color/ociogradingtransformlinear/CMakeLists.txt similarity index 84% rename from app/node/color/ociogradingtransform/CMakeLists.txt rename to app/node/color/ociogradingtransformlinear/CMakeLists.txt index ee382c689..05a3d4ae9 100644 --- a/app/node/color/ociogradingtransform/CMakeLists.txt +++ b/app/node/color/ociogradingtransformlinear/CMakeLists.txt @@ -16,7 +16,7 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} - node/color/ociogradingtransform/ociogradingtransform.cpp - node/color/ociogradingtransform/ociogradingtransform.h + node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp + node/color/ociogradingtransformlinear/ociogradingtransformlinear.h PARENT_SCOPE ) diff --git a/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp new file mode 100644 index 000000000..2a9b263d5 --- /dev/null +++ b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp @@ -0,0 +1,125 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2021 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "ociogradingtransformlinear.h" + +#include "common/ocioutils.h" +#include "node/project/project.h" +#include "render/colorprocessor.h" + +namespace olive { + +const QString OCIOGradingTransformLinearNode::kContrastInput = QStringLiteral("contrast_in"); +const QString OCIOGradingTransformLinearNode::kOffsetInput = QStringLiteral("offset_in"); +const QString OCIOGradingTransformLinearNode::kExposureInput = QStringLiteral("exposure_in"); +const QString OCIOGradingTransformLinearNode::kSaturationInput = QStringLiteral("saturation_in"); +const QString OCIOGradingTransformLinearNode::kPivotInput = QStringLiteral("pivot_in"); +const QString OCIOGradingTransformLinearNode::kClampBlackInput = QStringLiteral("clamp_black_in"); +const QString OCIOGradingTransformLinearNode::kClampWhiteInput = QStringLiteral("clamp_white_in"); + +#define super OCIOBaseNode + +OCIOGradingTransformLinearNode::OCIOGradingTransformLinearNode() +{ + AddInput(kContrastInput, NodeValue::kVec4, QVector4D{1.0, 1.0, 1.0, 1.0}); + SetInputProperty(kContrastInput, QStringLiteral("min"), QVector4D{0.001f, 0.001f, 0.001f, 0.001f}); + + AddInput(kOffsetInput, NodeValue::kVec4, QVector4D{0.0, 0.0, 0.0, 0.0}); + + AddInput(kExposureInput, NodeValue::kVec4, QVector4D{0.0, 0.0, 0.0, 0.0}); + + AddInput(kSaturationInput, NodeValue::kFloat, 1.0); + SetInputProperty(kSaturationInput, QStringLiteral("min"), 0.0); + + AddInput(kPivotInput, NodeValue::kFloat, 0.203919098); + + AddInput(kClampBlackInput, NodeValue::kFloat, 0.0); + + AddInput(kClampWhiteInput, NodeValue::kFloat, 200.0); +} + +QString OCIOGradingTransformLinearNode::Name() const +{ + return tr("OCIO Linear Grading Transform"); +} + +QString OCIOGradingTransformLinearNode::id() const +{ + return QStringLiteral("org.olivevideoeditor.Olive.ociogradingtransformlinear"); +} + +QVector OCIOGradingTransformLinearNode::Category() const +{ + return {kCategoryColor}; +} + +QString OCIOGradingTransformLinearNode::Description() const +{ + return tr("Simple linearcolor grading using OCIO"); +} + +void OCIOGradingTransformLinearNode::Retranslate() +{ + super::Retranslate(); + + SetInputName(kTextureInput, tr("Input")); + SetInputName(kContrastInput, tr("Contrast")); + SetInputName(kOffsetInput, tr("Offset")); + SetInputName(kExposureInput, tr("Exposure")); + SetInputName(kSaturationInput, tr("Saturation")); + SetInputName(kPivotInput, tr("Pivot")); + SetInputName(kClampBlackInput, tr("Black Clamp")); + SetInputName(kClampWhiteInput, tr("White Clamp")); +} + +void OCIOGradingTransformLinearNode::InputValueChangedEvent(const QString &input, int element) +{ + Q_UNUSED(element); + GenerateProcessor(); +} + +void OCIOGradingTransformLinearNode::GenerateProcessor() +{ + OCIO::GradingPrimaryTransformRcPtr gp = OCIO::GradingPrimaryTransform::Create(OCIO::GRADING_LIN); + gp->setDirection(OCIO::TransformDirection::TRANSFORM_DIR_FORWARD); + + OCIO::GradingPrimary gpdata{OCIO::GRADING_LIN}; + gpdata.m_contrast = OCIOUtils::QVec4ToRGBM(GetStandardValue(kContrastInput).value()); + gpdata.m_exposure = OCIOUtils::QVec4ToRGBM(GetStandardValue(kExposureInput).value()); + gpdata.m_offset = OCIOUtils::QVec4ToRGBM(GetStandardValue(kOffsetInput).value()); + gpdata.m_saturation = GetStandardValue(kSaturationInput).value(); + gpdata.m_pivot = GetStandardValue(kPivotInput).value(); + gpdata.m_clampBlack = GetStandardValue(kClampBlackInput).value(); + gpdata.m_clampWhite = GetStandardValue(kClampWhiteInput).value(); + try { + gp->setValue(gpdata); + + set_processor(ColorProcessor::Create(manager()->GetConfig()->getProcessor(gp))); + } catch (const OCIO::Exception &e) { + std::cerr << std::endl << e.what() << std::endl; + } +} + +void OCIOGradingTransformLinearNode::ConfigChanged() +{ + GenerateProcessor(); +} + +} diff --git a/app/node/color/ociogradingtransform/ociogradingtransform.h b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h similarity index 74% rename from app/node/color/ociogradingtransform/ociogradingtransform.h rename to app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h index 99f2db214..883432a15 100644 --- a/app/node/color/ociogradingtransform/ociogradingtransform.h +++ b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h @@ -18,22 +18,22 @@ ***/ -#ifndef OCIOGRADINGTRANSFORMNODE_H -#define OCIOGRADINGTRANSFORMNODE_H +#ifndef OCIOGRADINGTRANSFORMLINEARNODE_H +#define OCIOGRADINGTRANSFORMLINEARNODE_H #include "node/color/ociobase/ociobase.h" #include "render/colorprocessor.h" namespace olive { -class OCIOGradingTransformNode : public OCIOBaseNode +class OCIOGradingTransformLinearNode : public OCIOBaseNode { Q_OBJECT public: - OCIOGradingTransformNode(); + OCIOGradingTransformLinearNode(); - NODE_DEFAULT_DESTRUCTOR(OCIOGradingTransformNode) - NODE_COPY_FUNCTION(OCIOGradingTransformNode) + NODE_DEFAULT_DESTRUCTOR(OCIOGradingTransformLinearNode) + NODE_COPY_FUNCTION(OCIOGradingTransformLinearNode) virtual QString Name() const override; virtual QString id() const override; @@ -42,19 +42,13 @@ class OCIOGradingTransformNode : public OCIOBaseNode virtual void Retranslate() override; virtual void InputValueChangedEvent(const QString &input, int element) override; + void GenerateProcessor(); - static const QString kTypeInput; - static const QString kBrightnessInput; static const QString kContrastInput; - static const QString kGammaInput; static const QString kOffsetInput; static const QString kExposureInput; - static const QString kLiftInput; - static const QString kGainInput; static const QString kSaturationInput; static const QString kPivotInput; - static const QString kPivotBlackInput; - static const QString kPivotWhiteInput; static const QString kClampBlackInput; static const QString kClampWhiteInput; diff --git a/app/node/factory.cpp b/app/node/factory.cpp index 0958d2d92..ab7632d7f 100644 --- a/app/node/factory.cpp +++ b/app/node/factory.cpp @@ -30,7 +30,7 @@ #include "block/transition/crossdissolve/crossdissolvetransition.h" #include "block/transition/diptocolor/diptocolortransition.h" #include "color/displaytransform/displaytransform.h" -#include "color/ociogradingtransform/ociogradingtransform.h" +#include "color/ociogradingtransformlinear/ociogradingtransformlinear.h" #include "distort/cornerpin/cornerpindistortnode.h" #include "distort/crop/cropdistortnode.h" #include "distort/flip/flipdistortnode.h" @@ -282,8 +282,8 @@ Node *NodeFactory::CreateFromFactoryIndex(const NodeFactory::InternalID &id) return new CornerPinDistortNode(); case kDisplayTransform: return new DisplayTransformNode(); - case kOCIOGradingTransform: - return new OCIOGradingTransformNode(); + case kOCIOGradingTransformLinear: + return new OCIOGradingTransformLinearNode(); case kChromaKey: return new ChromaKeyNode(); diff --git a/app/node/factory.h b/app/node/factory.h index 42658cfb2..bb5878dab 100644 --- a/app/node/factory.h +++ b/app/node/factory.h @@ -71,7 +71,7 @@ public: kTimeOffsetNode, kCornerPinDistort, kDisplayTransform, - kOCIOGradingTransform, + kOCIOGradingTransformLinear, kChromaKey, // Count value diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index 6adab6348..3eb7070e5 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -226,8 +226,12 @@ void Renderer::BlitColorManagedInternal(ColorProcessorPtr color_processor, Textu } ShaderJob job; - - job.InsertValue(QStringLiteral("ove_maintex"), NodeValue(NodeValue::kTexture, QVariant::fromValue(source))); + if (shader_path.isEmpty()) { + job.InsertValue(QStringLiteral("ove_maintex"), NodeValue(NodeValue::kTexture, QVariant::fromValue(source))); + } else { + // If we are using a custom shader in a node use "tex_in" for consistency + job.InsertValue(QStringLiteral("tex_in"), NodeValue(NodeValue::kTexture, QVariant::fromValue(source))); + } job.InsertValue(QStringLiteral("ove_mvpmat"), NodeValue(NodeValue::kMatrix, matrix)); job.InsertValue(QStringLiteral("ove_cropmatrix"), NodeValue(NodeValue::kMatrix, crop_matrix.inverted())); job.InsertValue(QStringLiteral("ove_maintex_alpha"), NodeValue(NodeValue::kInt, source_alpha_association)); diff --git a/app/shaders/chromakey.frag b/app/shaders/chromakey.frag index b4b35e524..c6dfbdb19 100644 --- a/app/shaders/chromakey.frag +++ b/app/shaders/chromakey.frag @@ -1,8 +1,12 @@ +// Main texture input uniform sampler2D tex_in; + + +// Main texture coordinate in vec2 ove_texcoord; out vec4 frag_color; -// OCIO shader code +// Program will replace this with OCIO's auto-generated shader code %1 // Assume D65 white point @@ -19,16 +23,24 @@ float func(float t) { } } -void main() { - vec4 col = texture2D(tex_in, ove_texcoord); - vec4 new_col; - - new_col = %2(col); - +vec4 CIExyz_to_Lab(vec4 CIE) { vec4 lab; - lab.r = 116.0 * func(col.g / Yn) - 16.0; - lab.g = 500.0 * (func(col.r / Xn) - func(col.g / Yn)); - lab.b = 200.0 * (func(col.g / Yn) - func(col.b / Zn)); - lab.w = 1.0; - frag_color = col; + lab.r = 116.0 * func(CIE.g / Yn) - 16.0; + lab.g = 500.0 * (func(CIE.r / Xn) - func(CIE.g / Yn)); + lab.b = 200.0 * (func(CIE.g / Yn) - func(CIE.b / Zn)); + lab.w = CIE.w; + + return lab; +} + + +void main() { + + vec4 col = texture(tex_in, ove_texcoord); + + // Perform color conversion + vec4 cie_xyz = %2(col); + vec4 lab = CIExyz_to_Lab(cie_xyz); + + frag_color = vec4(lab.r); }