project: moved color manager outside of node graph
This commit is contained in:
@@ -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&) {}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user