project: moved color manager outside of node graph

This commit is contained in:
itsmattkc
2023-02-28 15:20:05 -08:00
parent f12c3b01d5
commit b88b738071
31 changed files with 706 additions and 393 deletions
+32 -80
View File
@@ -30,29 +30,22 @@
namespace olive {
const QString ColorManager::kConfigFilenameIn = QStringLiteral("config");
const QString ColorManager::kDefaultColorspaceIn = QStringLiteral("default_input");
const QString ColorManager::kReferenceSpaceIn = QStringLiteral("reference_space");
#define super Node
OCIO::ConstConfigRcPtr ColorManager::default_config_ = nullptr;
ColorManager::ColorManager() :
ColorManager::ColorManager(Project *project) :
QObject(project),
config_(nullptr)
{
// Filename input
AddInput(kConfigFilenameIn, NodeValue::kFile, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));
// Colorspace input
AddInput(kDefaultColorspaceIn, NodeValue::kCombo, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));
// Default reference space is scene linear
AddInput(kReferenceSpaceIn, NodeValue::kCombo, 0, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));
}
void ColorManager::Init()
{
// Set config to our built-in default
SetConfig(GetDefaultConfig());
config_ = GetDefaultConfig();
SetDefaultInputColorSpace(config_->getCanonicalName(OCIO::ROLE_DEFAULT));
project()->SetColorReferenceSpace(OCIO::ROLE_SCENE_LINEAR);
}
OCIO::ConstConfigRcPtr ColorManager::GetConfig() const
@@ -62,14 +55,12 @@ OCIO::ConstConfigRcPtr ColorManager::GetConfig() const
OCIO::ConstConfigRcPtr ColorManager::CreateConfigFromFile(const QString &filename)
{
OCIO_SET_C_LOCALE_FOR_SCOPE;
return OCIO::Config::CreateFromFile(filename.toUtf8());
}
QString ColorManager::GetConfigFilename() const
{
return GetStandardValue(kConfigFilenameIn).toString();
return project()->GetColorConfigFilename();
}
OCIO::ConstConfigRcPtr ColorManager::GetDefaultConfig()
@@ -82,7 +73,6 @@ void ColorManager::SetUpDefaultConfig()
if (!qEnvironmentVariableIsEmpty("OCIO")) {
// Attempt to set config from "OCIO" environment variable
try {
OCIO_SET_C_LOCALE_FOR_SCOPE;
default_config_ = OCIO::Config::CreateFromEnv();
return;
@@ -100,15 +90,12 @@ void ColorManager::SetUpDefaultConfig()
qDebug() << "Extracting default OCIO config to" << dir;
{
OCIO_SET_C_LOCALE_FOR_SCOPE;
default_config_ = CreateConfigFromFile(QDir(dir).filePath(QStringLiteral("config.ocio")));
}
default_config_ = CreateConfigFromFile(QDir(dir).filePath(QStringLiteral("config.ocio")));
}
void ColorManager::SetConfigFilename(const QString &filename)
{
SetStandardValue(kConfigFilenameIn, filename);
project()->SetColorConfigFilename(filename);
}
QStringList ColorManager::ListAvailableDisplays()
@@ -167,23 +154,17 @@ QStringList ColorManager::ListAvailableColorspaces() const
QString ColorManager::GetDefaultInputColorSpace() const
{
return ListAvailableColorspaces().at(GetStandardValue(kDefaultColorspaceIn).toInt());
return project()->GetDefaultInputColorSpace();
}
void ColorManager::SetDefaultInputColorSpace(const QString &s)
{
SetStandardValue(kDefaultColorspaceIn, ListAvailableColorspaces().indexOf(s));
project()->SetDefaultInputColorSpace(s);
}
QString ColorManager::GetReferenceColorSpace() const
{
ReferenceSpace ref_space = static_cast<ReferenceSpace>(GetStandardValue(kReferenceSpaceIn).toInt());
if (ref_space == kCompositingLog) {
return OCIO::ROLE_COMPOSITING_LOG;
} else {
return OCIO::ROLE_SCENE_LINEAR;
}
return project()->GetColorReferenceSpace();
}
QString ColorManager::GetCompliantColorSpace(const QString &s)
@@ -253,62 +234,33 @@ void ColorManager::GetDefaultLumaCoefs(double *rgb) const
config_->getDefaultLumaCoefs(rgb);
}
void ColorManager::Retranslate()
Project *ColorManager::project() const
{
super::Retranslate();
SetInputName(kConfigFilenameIn, tr("Configuration"));
SetInputName(kDefaultColorspaceIn, tr("Default Input"));
SetInputName(kReferenceSpaceIn, tr("Reference Space"));
SetComboBoxStrings(kReferenceSpaceIn, {tr("Scene Linear"), tr("Compositing Log")});
SetInputProperty(kConfigFilenameIn, QStringLiteral("placeholder"), tr("(built-in)"));
return static_cast<Project*>(parent());
}
void ColorManager::InputValueChangedEvent(const QString &input, int element)
void ColorManager::UpdateConfigFromFilename()
{
Q_UNUSED(element)
try {
QString config_filename = GetConfigFilename();
QString old_default_cs = GetDefaultInputColorSpace();
if (input == kConfigFilenameIn) {
config_ = OCIO::Config::CreateFromFile(config_filename.toUtf8());
try {
QString old_default_cs = GetDefaultInputColorSpace();
SetConfig(OCIO::Config::CreateFromFile(GetConfigFilename().toUtf8()));
// Set new default colorspace appropriately
int new_default = 0;
QStringList available_cs = ListAvailableColorspaces();
for (int i=0; i<available_cs.size(); i++) {
if (available_cs.at(i).compare(old_default_cs, Qt::CaseInsensitive)) {
new_default = i;
break;
}
// Set new default colorspace appropriately
QString new_default = old_default_cs;
QStringList available_cs = ListAvailableColorspaces();
for (int i=0; i<available_cs.size(); i++) {
const QString &c = available_cs.at(i);
if (c.compare(old_default_cs, Qt::CaseInsensitive)) {
new_default = c;
break;
}
SetStandardValue(kDefaultColorspaceIn, new_default);
}
SetDefaultInputColorSpace(new_default);
emit ConfigChanged();
} catch (OCIO::Exception&) {}
}
}
ColorManager::SetLocale::SetLocale(const char* new_locale)
{
old_locale_ = setlocale(LC_NUMERIC, nullptr);
setlocale(LC_NUMERIC, new_locale);
}
ColorManager::SetLocale::~SetLocale()
{
setlocale(LC_NUMERIC, old_locale_.toUtf8());
}
void ColorManager::SetConfig(OCIO::ConstConfigRcPtr config)
{
config_ = config;
SetComboBoxStrings(kDefaultColorspaceIn, ListAvailableColorspaces());
emit ConfigChanged(config_filename);
} catch (OCIO::Exception&) {}
}
}
+9 -58
View File
@@ -28,37 +28,15 @@
#include "node/node.h"
#include "render/colorprocessor.h"
#define OCIO_SET_C_LOCALE_FOR_SCOPE ColorManager::SetLocale d("C")
namespace olive {
class ColorManager : public Node
class ColorManager : public QObject
{
Q_OBJECT
public:
ColorManager();
ColorManager(Project *project);
NODE_DEFAULT_FUNCTIONS(ColorManager)
virtual QString Name() const override
{
return tr("Color Manager");
}
virtual QString id() const override
{
return QStringLiteral("org.olivevideoeditor.Olive.colormanager");
}
virtual QVector<CategoryID> Category() const override
{
return {kCategoryColor};
}
virtual QString Description() const override
{
return tr("Color management configuration for project.");
}
void Init();
OCIO::ConstConfigRcPtr GetConfig() const;
@@ -98,47 +76,20 @@ public:
void GetDefaultLumaCoefs(double *rgb) const;
class SetLocale
{
public:
SetLocale(const char* new_locale);
Project *project() const;
~SetLocale();
private:
QString old_locale_;
};
QMutex* mutex()
{
return &mutex_;
}
static const QString kConfigFilenameIn;
static const QString kDefaultColorspaceIn;
static const QString kReferenceSpaceIn;
virtual void Retranslate() override;
void UpdateConfigFromFilename();
signals:
void ConfigChanged();
void ConfigChanged(const QString &s);
protected:
virtual void InputValueChangedEvent(const QString &input, int element) override;
void ReferenceSpaceChanged(const QString &s);
void DefaultInputChanged(const QString &s);
private:
enum ReferenceSpace {
kSceneLinear,
kCompositingLog
};
void SetConfig(OCIO::ConstConfigRcPtr config);
OCIO::ConstConfigRcPtr config_;
QMutex mutex_;
static OCIO::ConstConfigRcPtr default_config_;
};
+2 -5
View File
@@ -35,20 +35,17 @@ OCIOBaseNode::OCIOBaseNode() :
SetEffectInput(kTextureInput);
connect(this, &Node::AddedToGraph, this, &OCIOBaseNode::AddedToGraph);
connect(this, &Node::RemovedFromGraph, this, &OCIOBaseNode::RemovedFromGraph);
SetFlag(kVideoEffect);
}
void OCIOBaseNode::AddedToGraph(Project *p)
void OCIOBaseNode::AddedToGraphEvent(Project *p)
{
manager_ = p->color_manager();
connect(manager_, &ColorManager::ConfigChanged, this, &OCIOBaseNode::ConfigChanged);
ConfigChanged();
}
void OCIOBaseNode::RemovedFromGraph()
void OCIOBaseNode::RemovedFromGraphEvent(Project *p)
{
if (manager_) {
disconnect(manager_, &ColorManager::ConfigChanged, this, &OCIOBaseNode::ConfigChanged);
+3 -5
View File
@@ -32,6 +32,9 @@ class OCIOBaseNode : public Node
public:
OCIOBaseNode();
virtual void AddedToGraphEvent(Project *p) override;
virtual void RemovedFromGraphEvent(Project *p) override;
virtual void Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const override;
static const QString kTextureInput;
@@ -50,11 +53,6 @@ private:
ColorProcessorPtr processor_;
private slots:
void AddedToGraph(Project *p);
void RemovedFromGraph();
};
}