Merge branch 'ocio_node' of https://github.com/ThomasWilshaw/olive into ocio_node

This commit is contained in:
Thomas Wilshaw
2022-05-07 23:40:57 +01:00
4 changed files with 58 additions and 27 deletions
@@ -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
@@ -57,7 +58,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
@@ -135,27 +136,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<QVector4D>());
gpdata.m_exposure = OCIOUtils::QVec4ToRGBM(GetStandardValue(kExposureInput).value<QVector4D>());
gpdata.m_offset = OCIOUtils::QVec4ToRGBM(GetStandardValue(kOffsetInput).value<QVector4D>());
gpdata.m_saturation = GetStandardValue(kSaturationInput).value<double>();
gpdata.m_pivot = GetStandardValue(kPivotInput).value<double>();
if (!GetStandardValue(kClampBlackEnableInput).toBool()) {
gpdata.NoClampBlack();
} else {
gpdata.m_clampBlack = GetStandardValue(kClampBlackInput).value<double>();
}
if (!GetStandardValue(kClampWhiteEnableInput).toBool()) {
gpdata.NoClampWhite();
} else {
gpdata.m_clampWhite = GetStandardValue(kClampWhiteInput).value<double>();
}
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;
@@ -163,6 +147,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<TexturePtr>());
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<QVector4D>();
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<QVector4D>();
exposure[0] = std::pow(2.0f, static_cast<float>(exposure[3] + exposure[0]));
exposure[1] = std::pow(2.0f, static_cast<float>(exposure[3] + exposure[1]));
exposure[2] = std::pow(2.0f, static_cast<float>(exposure[3] + exposure[2]));
job.InsertValue(kExposureInput, NodeValue(NodeValue::kVec3, exposure.toVector3D()));
QVector4D contrast = value[kContrastInput].value<QVector4D>();
contrast[0] = static_cast<float>(contrast[3] * contrast[0]);
contrast[1] = static_cast<float>(contrast[3] * contrast[1]);
contrast[2] = static_cast<float>(contrast[3] * contrast[2]);
job.InsertValue(kContrastInput, NodeValue(NodeValue::kVec3, contrast.toVector3D()));
table->Push(NodeValue::kTexture, QVariant::fromValue(job), this);
}
}
void OCIOGradingTransformLinearNode::ConfigChanged()
{
GenerateProcessor();
@@ -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;
+4 -1
View File
@@ -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<TexturePtr>());
job.SetNeedsCustomShader(this);
job.SetFunctionName(QStringLiteral("SceneLinearToCIEXYZ_d65"));
job.SetOverrideID(id());
table->Push(NodeValue::kTexture, QVariant::fromValue(job), this);
}
+6
View File
@@ -203,6 +203,12 @@ public:
return type_;
}
template <typename T>
T value() const
{
return data_.value<T>();
}
const QVariant& data() const
{
return data_;