Fix #135217: ColorManage Settings RNA paths incomplete/wrong

`ColorManagedDisplaySettings`, `ColorManagedViewSettings`,
`ColorManagedInputColorspaceSettings` were affected since these are used
from multiple places (Scene, File output nodes, ..).

Similar to how we are getting the path for `ImageFormatSettings` (which
pretty much has the distinction logic already), we can do so for the
ColorManage Settings as well (piggbacking on the already correct path to
the `ImageFormatSettings`.

With this, we can also remove these "known failures" from the test
introduced in 4032b853c3.

Pull Request: https://projects.blender.org/blender/blender/pulls/135238
This commit is contained in:
Philipp Oeser
2025-02-28 17:13:43 +01:00
committed by Philipp Oeser
parent 559d7575a6
commit 9855c11d2c
4 changed files with 55 additions and 36 deletions

View File

@@ -493,11 +493,6 @@ static void rna_ColorManagedDisplaySettings_display_device_update(Main *bmain,
} }
} }
static std::optional<std::string> rna_ColorManagedDisplaySettings_path(const PointerRNA * /*ptr*/)
{
return "display_settings";
}
static int rna_ColorManagedViewSettings_view_transform_get(PointerRNA *ptr) static int rna_ColorManagedViewSettings_view_transform_get(PointerRNA *ptr)
{ {
ColorManagedViewSettings *view = (ColorManagedViewSettings *)ptr->data; ColorManagedViewSettings *view = (ColorManagedViewSettings *)ptr->data;
@@ -587,11 +582,6 @@ static void rna_ColorManagedViewSettings_use_curves_set(PointerRNA *ptr, bool va
} }
} }
static std::optional<std::string> rna_ColorManagedViewSettings_path(const PointerRNA * /*ptr*/)
{
return "view_settings";
}
static void rna_ColorManagedViewSettings_whitepoint_get(PointerRNA *ptr, float value[3]) static void rna_ColorManagedViewSettings_whitepoint_get(PointerRNA *ptr, float value[3])
{ {
const ColorManagedViewSettings *view_settings = (ColorManagedViewSettings *)ptr->data; const ColorManagedViewSettings *view_settings = (ColorManagedViewSettings *)ptr->data;
@@ -744,12 +734,6 @@ static std::optional<std::string> rna_ColorManagedSequencerColorspaceSettings_pa
return "sequencer_colorspace_settings"; return "sequencer_colorspace_settings";
} }
static std::optional<std::string> rna_ColorManagedInputColorspaceSettings_path(
const PointerRNA * /*ptr*/)
{
return "colorspace_settings";
}
static void rna_ColorManagement_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr) static void rna_ColorManagement_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
{ {
ID *id = ptr->owner_id; ID *id = ptr->owner_id;

View File

@@ -391,6 +391,10 @@ std::optional<std::string> rna_Node_ImageUser_path(const PointerRNA *ptr);
std::optional<std::string> rna_CameraBackgroundImage_image_or_movieclip_user_path( std::optional<std::string> rna_CameraBackgroundImage_image_or_movieclip_user_path(
const PointerRNA *ptr); const PointerRNA *ptr);
std::optional<std::string> rna_ColorManagedDisplaySettings_path(const PointerRNA *ptr);
std::optional<std::string> rna_ColorManagedViewSettings_path(const PointerRNA *ptr);
std::optional<std::string> rna_ColorManagedInputColorspaceSettings_path(const PointerRNA *ptr);
/* Node socket subtypes for group interface. */ /* Node socket subtypes for group interface. */
void rna_def_node_socket_interface_subtypes(BlenderRNA *brna); void rna_def_node_socket_interface_subtypes(BlenderRNA *brna);

View File

@@ -1238,41 +1238,38 @@ static std::optional<std::string> rna_BakeSettings_path(const PointerRNA * /*ptr
return "render.bake"; return "render.bake";
} }
static std::optional<std::string> rna_ImageFormatSettings_path(const PointerRNA *ptr) static std::optional<std::string> rna_ImageFormatSettings_path(
const PointerRNA *ptr, blender::FunctionRef<bool(ImageFormatData *)> match)
{ {
ImageFormatData *imf = (ImageFormatData *)ptr->data;
ID *id = ptr->owner_id; ID *id = ptr->owner_id;
switch (GS(id->name)) { switch (GS(id->name)) {
case ID_SCE: { case ID_SCE: {
Scene *scene = (Scene *)id; Scene *scene = (Scene *)id;
if (&scene->r.im_format == imf) { if (match(&scene->r.im_format)) {
return "render.image_settings"; return "render.image_settings";
} }
else if (&scene->r.bake.im_format == imf) { else if (match(&scene->r.bake.im_format)) {
return "render.bake.image_settings"; return "render.bake.image_settings";
} }
return ".."; return std::nullopt;
} }
case ID_NT: { case ID_NT: {
bNodeTree *ntree = (bNodeTree *)id; bNodeTree *ntree = (bNodeTree *)id;
bNode *node;
for (node = static_cast<bNode *>(ntree->nodes.first); node; node = node->next) { for (const bNode *node : ntree->all_nodes()) {
if (node->type_legacy == CMP_NODE_OUTPUT_FILE) { if (node->type_legacy == CMP_NODE_OUTPUT_FILE) {
if (&((NodeImageMultiFile *)node->storage)->format == imf) { if (match(&((NodeImageMultiFile *)node->storage)->format)) {
char node_name_esc[sizeof(node->name) * 2]; char node_name_esc[sizeof(node->name) * 2];
BLI_str_escape(node_name_esc, node->name, sizeof(node_name_esc)); BLI_str_escape(node_name_esc, node->name, sizeof(node_name_esc));
return fmt::format("nodes[\"{}\"].format", node_name_esc); return fmt::format("nodes[\"{}\"].format", node_name_esc);
} }
else { else {
bNodeSocket *sock; LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
for (sock = static_cast<bNodeSocket *>(node->inputs.first); sock; sock = sock->next) {
NodeImageMultiFileSocket *sockdata = static_cast<NodeImageMultiFileSocket *>( NodeImageMultiFileSocket *sockdata = static_cast<NodeImageMultiFileSocket *>(
sock->storage); socket->storage);
if (&sockdata->format == imf) { if (match(&sockdata->format)) {
char node_name_esc[sizeof(node->name) * 2]; char node_name_esc[sizeof(node->name) * 2];
BLI_str_escape(node_name_esc, node->name, sizeof(node_name_esc)); BLI_str_escape(node_name_esc, node->name, sizeof(node_name_esc));
@@ -1286,13 +1283,52 @@ static std::optional<std::string> rna_ImageFormatSettings_path(const PointerRNA
} }
} }
} }
return ".."; return std::nullopt;
} }
default: default:
return ".."; return std::nullopt;
} }
} }
static std::optional<std::string> rna_ImageFormatSettings_path(const PointerRNA *ptr)
{
ImageFormatData *data = static_cast<ImageFormatData *>(ptr->data);
return rna_ImageFormatSettings_path(ptr, [&](ImageFormatData *imf) { return imf == data; });
}
std::optional<std::string> rna_ColorManagedDisplaySettings_path(const PointerRNA *ptr)
{
ColorManagedDisplaySettings *data = static_cast<ColorManagedDisplaySettings *>(ptr->data);
std::optional<std::string> path = rna_ImageFormatSettings_path(
ptr, [&](ImageFormatData *imf) { return &imf->display_settings == data; });
if (path) {
return *path + ".display_settings";
}
return std::nullopt;
}
std::optional<std::string> rna_ColorManagedViewSettings_path(const PointerRNA *ptr)
{
ColorManagedViewSettings *data = static_cast<ColorManagedViewSettings *>(ptr->data);
std::optional<std::string> path = rna_ImageFormatSettings_path(
ptr, [&](ImageFormatData *imf) { return &imf->view_settings == data; });
if (path) {
return *path + ".view_settings";
}
return std::nullopt;
}
std::optional<std::string> rna_ColorManagedInputColorspaceSettings_path(const PointerRNA *ptr)
{
ColorManagedColorspaceSettings *data = static_cast<ColorManagedColorspaceSettings *>(ptr->data);
std::optional<std::string> path = rna_ImageFormatSettings_path(
ptr, [&](ImageFormatData *imf) { return &imf->linear_colorspace_settings == data; });
if (path) {
return *path + ".linear_colorspace_settings";
}
return std::nullopt;
}
static int rna_RenderSettings_threads_get(PointerRNA *ptr) static int rna_RenderSettings_threads_get(PointerRNA *ptr)
{ {
RenderData *rd = (RenderData *)ptr->data; RenderData *rd = (RenderData *)ptr->data;

View File

@@ -10,13 +10,8 @@ import unittest
def process_rna_struct(self, struct, rna_path): def process_rna_struct(self, struct, rna_path):
# These paths are currently known failures of `path_from_id`. # These paths are currently known failures of `path_from_id`.
KNOWN_FAILURES = { KNOWN_FAILURES = {
"view_settings",
"display_settings",
"colorspace_settings",
"render.views[\"left\"]", "render.views[\"left\"]",
"render.views[\"right\"]", "render.views[\"right\"]",
"display_settings",
"colorspace_settings",
"uv_layers[\"UVMap\"]", "uv_layers[\"UVMap\"]",
"uv_layers[\"UVMap\"]", "uv_layers[\"UVMap\"]",
} }