From b5d7be9e47ffb387c0e91163ed05d6b3f3aae78e Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sat, 7 May 2022 15:37:19 -0700 Subject: [PATCH 1/3] nodevalue: add convenience function for retrieving internal value --- app/node/value.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/node/value.h b/app/node/value.h index 886b4f470..e16fc1055 100644 --- a/app/node/value.h +++ b/app/node/value.h @@ -203,6 +203,12 @@ public: return type_; } + template + T value() const + { + return data_.value(); + } + const QVariant& data() const { return data_; From 862e462b2035e03ce7de1f3aabc532c940018af2 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sat, 7 May 2022 15:38:05 -0700 Subject: [PATCH 2/3] chromakey: add base properties --- app/node/keying/chromakey/chromakey.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/node/keying/chromakey/chromakey.cpp b/app/node/keying/chromakey/chromakey.cpp index 7915d00fa..8b63a9c9b 100644 --- a/app/node/keying/chromakey/chromakey.cpp +++ b/app/node/keying/chromakey/chromakey.cpp @@ -37,9 +37,11 @@ ChromaKeyNode::ChromaKeyNode() AddInput(kUpperToleranceInput, NodeValue::kFloat, 25.0); SetInputProperty(kUpperToleranceInput, QStringLiteral("min"), 0.0); + SetInputProperty(kUpperToleranceInput, QStringLiteral("base"), 0.1); AddInput(kLowerToleranceInput, NodeValue::kFloat, 5.0); SetInputProperty(kLowerToleranceInput, QStringLiteral("min"), 0.0); + SetInputProperty(kLowerToleranceInput, QStringLiteral("base"), 0.1); AddInput(kGarbageMatteInput, NodeValue::kTexture, InputFlags(kInputFlagNotKeyframable)); @@ -47,9 +49,11 @@ ChromaKeyNode::ChromaKeyNode() AddInput(kHighlightsInput, NodeValue::kFloat, 100.0f); SetInputProperty(kHighlightsInput, QStringLiteral("min"), 0.0); + SetInputProperty(kHighlightsInput, QStringLiteral("base"), 0.1); AddInput(kShadowsInput, NodeValue::kFloat, 100.0f); SetInputProperty(kShadowsInput, QStringLiteral("min"), 0.0); + SetInputProperty(kShadowsInput, QStringLiteral("base"), 0.1); AddInput(kMaskOnlyInput, NodeValue::kBoolean, false); } @@ -122,7 +126,6 @@ void ChromaKeyNode::Value(const NodeValueRow &value, const NodeGlobals &globals, job.SetInputTexture(value[kTextureInput].data().value()); job.SetNeedsCustomShader(this); job.SetFunctionName(QStringLiteral("SceneLinearToCIEXYZ_d65")); - job.SetOverrideID(id()); table->Push(NodeValue::kTexture, QVariant::fromValue(job), this); } From ab9114947d41ed24310c759dc081ed7ecba88c4b Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sat, 7 May 2022 15:38:20 -0700 Subject: [PATCH 3/3] ociogradingtransformlinear: update for dynamic processor --- .../ociogradingtransformlinear.cpp | 72 ++++++++++++------- .../ociogradingtransformlinear.h | 2 + 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp index 309c1e199..0a98c66d8 100644 --- a/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp +++ b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp @@ -25,18 +25,19 @@ #include "common/ocioutils.h" #include "node/project/project.h" #include "render/colorprocessor.h" +#include "widget/slider/floatslider.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::kContrastInput = QStringLiteral("ocio_grading_primary_contrast"); +const QString OCIOGradingTransformLinearNode::kOffsetInput = QStringLiteral("ocio_grading_primary_offset"); +const QString OCIOGradingTransformLinearNode::kExposureInput = QStringLiteral("ocio_grading_primary_exposure"); +const QString OCIOGradingTransformLinearNode::kSaturationInput = QStringLiteral("ocio_grading_primary_saturation"); +const QString OCIOGradingTransformLinearNode::kPivotInput = QStringLiteral("ocio_grading_primary_pivot"); const QString OCIOGradingTransformLinearNode::kClampBlackEnableInput = QStringLiteral("clamp_black_enable_in"); -const QString OCIOGradingTransformLinearNode::kClampBlackInput = QStringLiteral("clamp_black_in"); +const QString OCIOGradingTransformLinearNode::kClampBlackInput = QStringLiteral("ocio_grading_primary_clampBlack"); const QString OCIOGradingTransformLinearNode::kClampWhiteEnableInput = QStringLiteral("clamp_white_enable_in"); -const QString OCIOGradingTransformLinearNode::kClampWhiteInput = QStringLiteral("clamp_white_in"); +const QString OCIOGradingTransformLinearNode::kClampWhiteInput = QStringLiteral("ocio_grading_primary_clampWhite"); #define super OCIOBaseNode @@ -56,7 +57,7 @@ OCIOGradingTransformLinearNode::OCIOGradingTransformLinearNode() SetVec4InputColors(kExposureInput); AddInput(kSaturationInput, NodeValue::kFloat, 1.0); - SetInputProperty(kSaturationInput, QStringLiteral("base"), 0.01); + SetInputProperty(kSaturationInput, QStringLiteral("view"), FloatSlider::kPercentage); SetInputProperty(kSaturationInput, QStringLiteral("min"), 0.0); AddInput(kPivotInput, NodeValue::kFloat, 0.18); // Default listed in OCIO::GradingPrimary @@ -129,27 +130,10 @@ void OCIOGradingTransformLinearNode::GenerateProcessor() { if (manager()) { OCIO::GradingPrimaryTransformRcPtr gp = OCIO::GradingPrimaryTransform::Create(OCIO::GRADING_LIN); + gp->makeDynamic(); 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(); - if (!GetStandardValue(kClampBlackEnableInput).toBool()) { - gpdata.NoClampBlack(); - } else { - gpdata.m_clampBlack = GetStandardValue(kClampBlackInput).value(); - } - if (!GetStandardValue(kClampWhiteEnableInput).toBool()) { - gpdata.NoClampWhite(); - } else { - 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; @@ -157,6 +141,42 @@ void OCIOGradingTransformLinearNode::GenerateProcessor() } } +void OCIOGradingTransformLinearNode::Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const +{ + if (!value[kTextureInput].data().isNull() && processor()) { + ColorTransformJob job; + + job.SetColorProcessor(processor()); + job.SetInputTexture(value[kTextureInput].data().value()); + + job.InsertValue(value); + + // Oddly, OCIO uses RGBMs when setting the GradingPrimary on the CPU, but uses vec3s on the GPU. + // Even more oddly, the conversion from RGBM to vec3 does not appear to have a public API. + // Therefore, this code has been duplicated from OCIO here: + // https://github.com/AcademySoftwareFoundation/OpenColorIO/blob/3abbe5b20521169580fcfe3692aca81859859953/src/OpenColorIO/ops/gradingprimary/GradingPrimary.cpp#L157 + QVector4D offset = value[kOffsetInput].value(); + offset[0] = offset[3] + offset[0]; + offset[1] = offset[3] + offset[1]; + offset[2] = offset[3] + offset[2]; + job.InsertValue(kOffsetInput, NodeValue(NodeValue::kVec3, offset.toVector3D())); + + QVector4D exposure = value[kExposureInput].value(); + exposure[0] = std::pow(2.0f, static_cast(exposure[3] + exposure[0])); + exposure[1] = std::pow(2.0f, static_cast(exposure[3] + exposure[1])); + exposure[2] = std::pow(2.0f, static_cast(exposure[3] + exposure[2])); + job.InsertValue(kExposureInput, NodeValue(NodeValue::kVec3, exposure.toVector3D())); + + QVector4D contrast = value[kContrastInput].value(); + contrast[0] = static_cast(contrast[3] * contrast[0]); + contrast[1] = static_cast(contrast[3] * contrast[1]); + contrast[2] = static_cast(contrast[3] * contrast[2]); + job.InsertValue(kContrastInput, NodeValue(NodeValue::kVec3, contrast.toVector3D())); + + table->Push(NodeValue::kTexture, QVariant::fromValue(job), this); + } +} + void OCIOGradingTransformLinearNode::ConfigChanged() { GenerateProcessor(); diff --git a/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h index 3026f8803..fac1a8f78 100644 --- a/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h +++ b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h @@ -44,6 +44,8 @@ class OCIOGradingTransformLinearNode : public OCIOBaseNode virtual void InputValueChangedEvent(const QString &input, int element) override; void GenerateProcessor(); + virtual void Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const override; + static const QString kContrastInput; static const QString kOffsetInput; static const QString kExposureInput;