Compositor: Cryptomatte compositing node.
ClosedPublic

Authored by Stefan Werner (swerner) on Jul 10 2018, 2:30 PM.

Details

Summary

This patch adds a new matte node that implements the Cryptomatte specification.
It also incluces a custom eye dropper that works outside of a color picker.
Cryptomatte export for the Cycles render engine will be in a separate patch.

Diff Detail

Repository
rB Blender
Branch
comp_cryptomatte
Build Status
Buildable 1816
Build 1816: arc lint + arc unit

This is a patch against the current master. Should I rather rebase this on top of the 2.8 branch?

source/blender/compositor/nodes/COM_CryptomatteNode.cpp
36

While it's not being used elsewhere yet, this hash function could be moved to a separate header file. What would be a good location for this?

Brecht Van Lommel (brecht) requested changes to this revision.Jul 10 2018, 3:08 PM

Looks generally fine, comments inline.

source/blender/compositor/nodes/COM_CryptomatteNode.cpp
36

Maybe rename BLI_hash_mm2a.h to BLI_hash_murmur.h, and then put both Murmur2A and Murmur3 in there.

43

Use BLI_INLINE instead of custom FORCE_INLINE.

116

Code style: for (...) {.

163–165

Could use a union for this.

185

Code style: while (...) {.

197–198

Code style: always use {}.

source/blender/editors/interface/interface_eyedropper_color.c
361–385

I don't think this needs a separate operator, it's also confusing to have two with the same name and description.

I think you can adjust the UI_OT_eyedropper_color poll function to test prop && RNA_property_subtype(prop) == PROP_COLOR instead of but->type == UI_BTYPE_COLOR, and then it should work for both?

source/blender/editors/space_node/node_edit.c
2635

Code style: always use {}.

2645

Rename to NODE_OT_cryptomatte_socket_add and similar for remove, to follow typical operator naming.

Maybe also replace "socket" by "pass"? To make it a bit more clear what is being added. Some description in the operator for when you would add more passes would also help.

2678–2682

Same.

source/blender/nodes/composite/nodes/node_composite_cryptomatte.c
175

Code style: { on new line.

195

Code style: if (...) {.

205

Code style: while (.

249

Code style: if (...) {.

359

I'm not sure what the render pass will be called in Cycles, but if it makes sense the same name could be used for the socket so it's a bit more obvious what is supposed to be linked here.

This revision now requires changes to proceed.Jul 10 2018, 3:08 PM
source/blender/compositor/nodes/COM_CryptomatteNode.cpp
163–165

Sort of. While unions work in all compilers that we currently use, the C++ standard does not require compilers to support this kind of usage.

I'll be happy to change this to union for style reasons. Memcpy() seems to me like the safer method though, and compilers typically are able to optimise this.

C++20 will get bit casts to solve this problem in the language: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html#bg

source/blender/editors/interface/interface_eyedropper_color.c
361–385

Unfortunately, that doesn't work. Doing that results in a comical situation where the user is presented two inactive eye dropper buttons, where a button only become active when the mouse hovers over the other button.

x - Compositor: Addressed Brecht's comments for Cryptomatte node.

  • Compositor: Added static sizeof() checks before type punning. Currently, sizeof(float) == 4 on all of our supported platforms, but the standards don't require that. You never know...
Stefan Werner (swerner) marked 10 inline comments as done.Jul 11 2018, 10:50 AM
source/blender/nodes/composite/nodes/node_composite_cryptomatte.c
359

The Cryptomatte standard doesn't require any specific naming. In practice, the passes tend to have "Crypto" in their names (e.g. "VrayCryptomatte", "uCryptoAsset", etc), so I now named the sockets "Crypto XX".

  • More code styling changes in Cryptomatte compositing node.
  • Code styling and warning suppression in murmur3 hash.
  • Removed unused code.

Here are some UI tweaks on top of the patch, trying to make it a bit easier to understand for first time users.

1diff --git a/source/blender/compositor/nodes/COM_CryptomatteNode.cpp b/source/blender/compositor/nodes/COM_CryptomatteNode.cpp
2index 07d75aa..58eb6d1 100644
3--- a/source/blender/compositor/nodes/COM_CryptomatteNode.cpp
4+++ b/source/blender/compositor/nodes/COM_CryptomatteNode.cpp
5@@ -56,7 +56,7 @@ void CryptomatteNode::convertToOperations(NodeConverter &converter, const Compos
6​ NodeInput *inputSocketImage = this->getInputSocket(0);
7​ NodeOutput *outputSocketImage = this->getOutputSocket(0);
8​ NodeOutput *outputSocketMatte = this->getOutputSocket(1);
9- NodeOutput *outputCryptoPick = this->getOutputSocket(2);
10+ NodeOutput *outputSocketPick = this->getOutputSocket(2);
11
12​ bNode *node = this->getbNode();
13​ NodeCryptomatte *cryptoMatteSettings = (NodeCryptomatte *)node->storage;
14@@ -106,7 +106,7 @@ void CryptomatteNode::convertToOperations(NodeConverter &converter, const Compos
15​ converter.mapInputSocket(inputSocketImage, operationAlpha->getInputSocket(0));
16​ converter.mapOutputSocket(outputSocketMatte, separateOperation->getOutputSocket(0));
17​ converter.mapOutputSocket(outputSocketImage, operationAlpha->getOutputSocket(0));
18- converter.mapOutputSocket(outputCryptoPick, operation->getOutputSocket(0));
19+ converter.mapOutputSocket(outputSocketPick, operation->getOutputSocket(0));
20
21​ converter.addLink(operation->getOutputSocket(0), separateOperation->getInputSocket(0));
22​ converter.addLink(separateOperation->getOutputSocket(0), operationAlpha->getInputSocket(1));
23diff --git a/source/blender/compositor/operations/COM_CryptomatteOperation.cpp b/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
24index 13e23d5..267eb70 100644
25--- a/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
26+++ b/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
27@@ -57,7 +57,7 @@ void CryptomatteOperation::executePixel(float output[4],
28​ /* Write the frontmost object as false color for picking. */
29​ output[0] = input[0];
30​ uint32_t m3hash;
31- ::memcpy(&m3hash, &input[0], 4);
32+ ::memcpy(&m3hash, &input[0], sizeof(uint32_t));
33​ output[1] = ((float) ((m3hash << 8)) / (float) UINT32_MAX);
34​ output[2] = ((float) ((m3hash << 16)) / (float) UINT32_MAX);
35​ }
36diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
37index 2007a0a..eefbeee 100644
38--- a/source/blender/editors/include/UI_interface.h
39+++ b/source/blender/editors/include/UI_interface.h
40@@ -969,7 +969,7 @@ void uiTemplateCurveMapping(
41​ bool levels, bool brush, bool neg_slope);
42​ void uiTemplateColorPicker(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool value_slider, bool lock, bool lock_luminosity, bool cubic);
43​ void uiTemplatePalette(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool color);
44-void uiTemplateEyedropper(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
45+void uiTemplateCryptoPicker(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
46​ void uiTemplateLayers(
47​ uiLayout *layout, struct PointerRNA *ptr, const char *propname,
48​ PointerRNA *used_ptr, const char *used_propname, int active_layer);
49diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c
50index a073129..67486f3 100644
51--- a/source/blender/editors/interface/interface_eyedropper.c
52+++ b/source/blender/editors/interface/interface_eyedropper.c
53@@ -82,10 +82,10 @@ wmKeyMap *eyedropper_modal_keymap(wmKeyConfig *keyconf)
54​ /* assign to operators */
55​ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_colorband");
56​ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_color");
57+ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_color_crypto");
58​ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_id");
59​ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_depth");
60​ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_driver");
61- WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_color_separate");
62
63​ return keymap;
64​ }
65diff --git a/source/blender/editors/interface/interface_eyedropper_color.c b/source/blender/editors/interface/interface_eyedropper_color.c
66index 6975076..bcb6001 100644
67--- a/source/blender/editors/interface/interface_eyedropper_color.c
68+++ b/source/blender/editors/interface/interface_eyedropper_color.c
69@@ -28,7 +28,6 @@
70​ *
71​ * Defines:
72​ * - #UI_OT_eyedropper_color
73- * - #UI_OT_eyedropper_color_separate
74​ */
75
76​ #include "MEM_guardedalloc.h"
77@@ -37,6 +36,7 @@
78​ #include "DNA_screen_types.h"
79
80​ #include "BLI_math_vector.h"
81+#include "BLI_string.h"
82
83​ #include "BKE_context.h"
84​ #include "BKE_main.h"
85@@ -73,6 +73,8 @@ typedef struct Eyedropper {
86​ bool accum_start; /* has mouse been pressed */
87​ float accum_col[3];
88​ int accum_tot;
89+
90+ bool accumulate; /* Color picking for cryptomatte, without accumulation. */
91​ } Eyedropper;
92
93​ static bool eyedropper_init(bContext *C, wmOperator *op)
94@@ -81,6 +83,7 @@ static bool eyedropper_init(bContext *C, wmOperator *op)
95​ Eyedropper *eye;
96
97​ op->customdata = eye = MEM_callocN(sizeof(Eyedropper), "Eyedropper");
98+ eye->accumulate = !STREQ(op->type->idname, "UI_OT_eyedropper_color_crypto");
99
100​ UI_context_active_but_prop_get(C, &eye->ptr, &eye->prop, &eye->index);
101
102@@ -208,29 +211,30 @@ static void eyedropper_color_set(bContext *C, Eyedropper *eye, const float col[3
103​ RNA_property_update(C, &eye->ptr, eye->prop);
104​ }
105
106-/* set sample from accumulated values */
107-static void eyedropper_color_set_accum(bContext *C, Eyedropper *eye)
108-{
109- float col[3];
110- mul_v3_v3fl(col, eye->accum_col, 1.0f / (float)eye->accum_tot);
111- eyedropper_color_set(C, eye, col);
112-}
113-
114-/* single point sample & set */
115​ static void eyedropper_color_sample(bContext *C, Eyedropper *eye, int mx, int my)
116​ {
117+ /* Accumulate color. */
118​ float col[3];
119​ eyedropper_color_sample_fl(C, mx, my, col);
120- eyedropper_color_set(C, eye, col);
121-}
122
123-static void eyedropper_color_sample_accum(bContext *C, Eyedropper *eye, int mx, int my)
124-{
125- float col[3];
126- eyedropper_color_sample_fl(C, mx, my, col);
127- /* delay linear conversion */
128- add_v3_v3(eye->accum_col, col);
129- eye->accum_tot++;
130+ if (eye->accumulate) {
131+ add_v3_v3(eye->accum_col, col);
132+ eye->accum_tot++;
133+ }
134+ else {
135+ copy_v3_v3(eye->accum_col, col);
136+ eye->accum_tot = 1;
137+ }
138+
139+ /* Apply to property. */
140+ float accum_col[3];
141+ if (eye->accum_tot > 1) {
142+ mul_v3_v3fl(accum_col, eye->accum_col, 1.0f / (float)eye->accum_tot);
143+ }
144+ else {
145+ copy_v3_v3(accum_col, eye->accum_col);
146+ }
147+ eyedropper_color_set(C, eye, accum_col);
148​ }
149
150​ static void eyedropper_cancel(bContext *C, wmOperator *op)
151@@ -255,29 +259,24 @@ static int eyedropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
152​ if (eye->accum_tot == 0) {
153​ eyedropper_color_sample(C, eye, event->x, event->y);
154​ }
155- else {
156- eyedropper_color_set_accum(C, eye);
157- }
158​ eyedropper_exit(C, op);
159​ return OPERATOR_FINISHED;
160​ case EYE_MODAL_SAMPLE_BEGIN:
161​ /* enable accum and make first sample */
162​ eye->accum_start = true;
163- eyedropper_color_sample_accum(C, eye, event->x, event->y);
164+ eyedropper_color_sample(C, eye, event->x, event->y);
165​ break;
166​ case EYE_MODAL_SAMPLE_RESET:
167​ eye->accum_tot = 0;
168​ zero_v3(eye->accum_col);
169- eyedropper_color_sample_accum(C, eye, event->x, event->y);
170- eyedropper_color_set_accum(C, eye);
171+ eyedropper_color_sample(C, eye, event->x, event->y);
172​ break;
173​ }
174​ }
175- else if (event->type == MOUSEMOVE) {
176+ else if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
177​ if (eye->accum_start) {
178​ /* button is pressed so keep sampling */
179- eyedropper_color_sample_accum(C, eye, event->x, event->y);
180- eyedropper_color_set_accum(C, eye);
181+ eyedropper_color_sample(C, eye, event->x, event->y);
182​ }
183​ }
184
185@@ -322,20 +321,9 @@ static int eyedropper_exec(bContext *C, wmOperator *op)
186
187​ static bool eyedropper_poll(bContext *C)
188​ {
189- PointerRNA ptr;
190- PropertyRNA *prop;
191- int index_dummy;
192- uiBut *but;
193-
194- /* Only color buttons */
195- if ((CTX_wm_window(C) != NULL) &&
196- (but = UI_context_active_but_prop_get(C, &ptr, &prop, &index_dummy)) &&
197- (but->type == UI_BTYPE_COLOR))
198- {
199- return 1;
200- }
201-
202- return 0;
203+ /* Actual test for active button happens later, since we don't
204+ * know which one is active until mouse over. */
205+ return (CTX_wm_window(C) != NULL);
206​ }
207
208​ void UI_OT_eyedropper_color(wmOperatorType *ot)
209@@ -354,32 +342,22 @@ void UI_OT_eyedropper_color(wmOperatorType *ot)
210
211​ /* flags */
212​ ot->flag = OPTYPE_BLOCKING | OPTYPE_INTERNAL;
213-
214- /* properties */
215-}
216-
217-static bool eyedropper_separate(bContext *C)
218-{
219- if(!CTX_wm_window(C)) return 0;
220- else return 1;
221​ }
222
223-void UI_OT_eyedropper_color_separate(wmOperatorType *ot)
224+void UI_OT_eyedropper_color_crypto(wmOperatorType *ot)
225​ {
226​ /* identifiers */
227- ot->name = "Eyedropper";
228- ot->idname = "UI_OT_eyedropper_color_separate";
229- ot->description = "Sample a color from the Blender Window to store in a property";
230+ ot->name = "Cryptomatte Eyedropper";
231+ ot->idname = "UI_OT_eyedropper_color_crypto";
232+ ot->description = "Pick a color from Cryptomatte node Pick output image";
233
234​ /* api callbacks */
235​ ot->invoke = eyedropper_invoke;
236​ ot->modal = eyedropper_modal;
237​ ot->cancel = eyedropper_cancel;
238​ ot->exec = eyedropper_exec;
239- ot->poll = eyedropper_separate;
240+ ot->poll = eyedropper_poll;
241
242​ /* flags */
243​ ot->flag = OPTYPE_BLOCKING | OPTYPE_INTERNAL;
244-
245- /* properties */
246​ }
247diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
248index f4ccdde..dc5e100 100644
249--- a/source/blender/editors/interface/interface_intern.h
250+++ b/source/blender/editors/interface/interface_intern.h
251@@ -763,6 +763,7 @@ struct wmKeyMap *eyedropper_colorband_modal_keymap(struct wmKeyConfig *keyconf);
252
253​ /* interface_eyedropper_color.c */
254​ void UI_OT_eyedropper_color(struct wmOperatorType *ot);
255+void UI_OT_eyedropper_color_crypto(struct wmOperatorType *ot);
256
257​ /* interface_eyedropper_colorband.c */
258​ void UI_OT_eyedropper_colorband(struct wmOperatorType *ot);
259@@ -776,6 +777,5 @@ void UI_OT_eyedropper_depth(struct wmOperatorType *ot);
260
261​ /* interface_eyedropper_driver.c */
262​ void UI_OT_eyedropper_driver(struct wmOperatorType *ot);
263-void UI_OT_eyedropper_color_separate(struct wmOperatorType *ot);
264
265​ #endif /* __INTERFACE_INTERN_H__ */
266diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
267index 83f3418..1e67ecd 100644
268--- a/source/blender/editors/interface/interface_ops.c
269+++ b/source/blender/editors/interface/interface_ops.c
270@@ -1138,12 +1138,12 @@ void ED_operatortypes_ui(void)
271
272​ /* external */
273​ WM_operatortype_append(UI_OT_eyedropper_color);
274+ WM_operatortype_append(UI_OT_eyedropper_color_crypto);
275​ WM_operatortype_append(UI_OT_eyedropper_colorband);
276​ WM_operatortype_append(UI_OT_eyedropper_colorband_point);
277​ WM_operatortype_append(UI_OT_eyedropper_id);
278​ WM_operatortype_append(UI_OT_eyedropper_depth);
279​ WM_operatortype_append(UI_OT_eyedropper_driver);
280- WM_operatortype_append(UI_OT_eyedropper_color_separate);
281​ }
282
283​ /**
284diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
285index 029899c..daee0d3 100644
286--- a/source/blender/editors/interface/interface_templates.c
287+++ b/source/blender/editors/interface/interface_templates.c
288@@ -2572,12 +2572,11 @@ void uiTemplatePalette(uiLayout *layout, PointerRNA *ptr, const char *propname,
289​ }
290​ }
291
292-void uiTemplateEyedropper(uiLayout *layout, PointerRNA *ptr, const char *propname)
293+void uiTemplateCryptoPicker(uiLayout *layout, PointerRNA *ptr, const char *propname)
294​ {
295​ PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
296​ uiBlock *block;
297​ uiBut *but;
298- uiLayout *col;
299
300​ if (!prop) {
301​ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
302@@ -2586,11 +2585,7 @@ void uiTemplateEyedropper(uiLayout *layout, PointerRNA *ptr, const char *propnam
303
304​ block = uiLayoutGetBlock(layout);
305
306- col = uiLayoutColumn(layout, true);
307- uiLayoutRow(col, true);
308-
309- uiDefBut(block, UI_BTYPE_LABEL, 0, RNA_property_ui_name(prop), 0, 19, 145, 19, NULL, 0, 0, 0, 0, RNA_property_ui_description(prop));
310- but = uiDefIconButO(block, UI_BTYPE_BUT, "UI_OT_eyedropper_color_separate", WM_OP_INVOKE_DEFAULT, ICON_EYEDROPPER, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
311+ but = uiDefIconTextButO(block, UI_BTYPE_BUT, "UI_OT_eyedropper_color_crypto", WM_OP_INVOKE_DEFAULT, ICON_EYEDROPPER, RNA_property_ui_name(prop), 0, 0, UI_UNIT_X, UI_UNIT_Y, RNA_property_ui_description(prop));
312​ but->rnapoin = *ptr;
313​ but->rnaprop = prop;
314​ but->rnaindex = -1;
315diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
316index 55d44a5..d67dbc2 100644
317--- a/source/blender/editors/space_node/drawnode.c
318+++ b/source/blender/editors/space_node/drawnode.c
319@@ -2544,9 +2544,15 @@ static void node_composit_buts_sunbeams(uiLayout *layout, bContext *UNUSED(C), P
320
321​ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
322​ {
323- uiItemR(layout, ptr, "matte_id", 0, NULL, ICON_NONE);
324- uiTemplateEyedropper(layout, ptr, "add");
325- uiTemplateEyedropper(layout, ptr, "remove");
326+ uiLayout *col = uiLayoutColumn(layout, true);
327+
328+ uiItemL(col, IFACE_("Matte Objects:"), ICON_NONE);
329+
330+ uiLayout *row = uiLayoutRow(col, true);
331+ uiTemplateCryptoPicker(row, ptr, "add");
332+ uiTemplateCryptoPicker(row, ptr, "remove");
333+
334+ uiItemR(col, ptr, "matte_id", 0, "", ICON_NONE);
335​ }
336
337​ static void node_composit_buts_cryptomatte_ex(uiLayout *layout, bContext *UNUSED(C), PointerRNA *UNUSED(ptr))
338diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
339index 0b1aafc..54fc1a4 100644
340--- a/source/blender/makesrna/intern/rna_nodetree.c
341+++ b/source/blender/makesrna/intern/rna_nodetree.c
342@@ -6973,25 +6973,19 @@ static void def_cmp_cryptomatte(StructRNA *srna)
343​ RNA_def_struct_sdna_from(srna, "NodeCryptomatte", "storage");
344​ prop = RNA_def_property(srna, "matte_id", PROP_STRING, PROP_NONE);
345​ RNA_def_property_string_sdna(prop, NULL, "matte_id");
346- RNA_def_property_ui_text(prop, "Matte List", "");
347+ RNA_def_property_ui_text(prop, "Matte Objects", "List of object and material crypto IDs to include in matte");
348​ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
349
350​ prop = RNA_def_property(srna, "add", PROP_FLOAT, PROP_COLOR);
351- RNA_def_property_float_sdna(prop, NULL, "add");
352- RNA_def_property_array(prop, 3);
353​ RNA_def_property_float_array_default(prop, default_1);
354​ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
355- RNA_def_property_ui_range(prop, 0, 2, 0.1, 3);
356- RNA_def_property_ui_text(prop, "Add", "Add to matte");
357+ RNA_def_property_ui_text(prop, "Add", "Add object or material to matte, by picking a color from the Pick output");
358​ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeCryptomatte_update_add");
359
360​ prop = RNA_def_property(srna, "remove", PROP_FLOAT, PROP_COLOR);
361- RNA_def_property_float_sdna(prop, NULL, "remove");
362- RNA_def_property_array(prop, 3);
363​ RNA_def_property_float_array_default(prop, default_1);
364​ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
365- RNA_def_property_ui_range(prop, 0, 2, 0.1, 3);
366- RNA_def_property_ui_text(prop, "Remove", "Remove from matte");
367+ RNA_def_property_ui_text(prop, "Remove", "Remove object or material from matte, by picking a color from the Pick output");
368​ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeCryptomatte_update_remove");
369​ }
370
371diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.c b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.c
372index 1941f54..0d78053 100644
373--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.c
374+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.c
375@@ -195,7 +195,7 @@ static void cryptomatte_remove(NodeCryptomatte*n, float f)
376​ static bNodeSocketTemplate outputs[] = {
377​ { SOCK_RGBA, 0, N_("Image")},
378​ { SOCK_FLOAT, 0, N_("Matte")},
379- { SOCK_RGBA, 0, N_("CryptoPick")},
380+ { SOCK_RGBA, 0, N_("Pick")},
381​ { -1, 0, "" }
382​ };
383

  • Make color picker dragging work for crypto, now allows you to easily select multiple objects by dragging.
  • Tweak UI layout and added more detailed tooltips to explain how to use the node.
  • Rename CryptoPick to Pick.

Besides that, if the CryptoPick output is fixed to always have alpha 1.0, I have no further concerns.

source/blender/editors/interface/interface_eyedropper_color.c
361–385

It seems this bug is already happening in the ColorRamp node actually.

Also just noticed the matte_id string has a fixed size, with a few dozens objects you already run into that limitation.

Cryptomatte support for Cycles is in D3538.

  • Compositor: Cryptomatte node now uses a dynamic string for matte ids, no more 1024 character limit.
  • Compositor: Fixed Cryptomatte string handling.
  • Compositor: Applied Brecht's UI improvements to Cryptomatte node
  • Compositor: Fixed broken add/remove in Cryptomatte node.
  • Compositor: Raised default number of Crypto inputs to three, as recommended by the Cryptomatte specification.

Looks good to me now, besides one accidental change.

source/blender/makesdna/intern/makesdna.c
20 ↗(On Diff #11430)

Accidental change should be removed.

This revision is now accepted and ready to land.Jul 17 2018, 11:59 PM
  • Reverted an accidental change.
This revision was automatically updated to reflect the committed changes.
Stefan Werner (swerner) marked an inline comment as done.Jul 18 2018, 1:43 PM