diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_color.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_color.c | 303 |
1 files changed, 294 insertions, 9 deletions
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c index ee19bce6435..218ca55e72d 100644 --- a/source/blender/makesrna/intern/rna_color.c +++ b/source/blender/makesrna/intern/rna_color.c @@ -26,13 +26,27 @@ #include <stdio.h> #include "RNA_define.h" -#include "RNA_types.h" +#include "rna_internal.h" #include "DNA_color_types.h" #ifdef RNA_RUNTIME +#include "RNA_access.h" + +#include "DNA_material_types.h" +#include "DNA_node_types.h" + +#include "MEM_guardedalloc.h" + #include "BKE_colortools.h" +#include "BKE_depsgraph.h" +#include "BKE_node.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_node.h" static int rna_CurveMapping_curves_length(PointerRNA *ptr) { @@ -113,17 +127,166 @@ static void rna_CurveMapping_clipmaxy_range(PointerRNA *ptr, float *min, float * *max= 100.0f; } + +static char *rna_ColorRamp_path(PointerRNA *ptr) +{ + /* handle the cases where a single datablock may have 2 ramp types */ + if (ptr->id.data) { + ID *id= ptr->id.data; + + switch (GS(id->name)) { + case ID_MA: /* material has 2 cases - diffuse and specular */ + { + Material *ma= (Material*)id; + + if (ptr->data == ma->ramp_col) + return BLI_strdup("diffuse_ramp"); + else if (ptr->data == ma->ramp_spec) + return BLI_strdup("specular_ramp"); + } + break; + } + } + + /* everything else just uses 'color_ramp' */ + return BLI_strdup("color_ramp"); +} + +static char *rna_ColorRampElement_path(PointerRNA *ptr) +{ + PointerRNA ramp_ptr; + PropertyRNA *prop; + char *path = NULL; + int index; + + /* helper macro for use here to try and get the path + * - this calls the standard code for getting a path to a texture... + */ +#define COLRAMP_GETPATH \ +{ \ +prop= RNA_struct_find_property(&ramp_ptr, "elements"); \ +if (prop) { \ +index= RNA_property_collection_lookup_index(&ramp_ptr, prop, ptr); \ +if (index >= 0) { \ +char *texture_path= rna_ColorRamp_path(&ramp_ptr); \ +path= BLI_sprintfN("%s.elements[%d]", texture_path, index); \ +MEM_freeN(texture_path); \ +} \ +} \ +} + + /* determine the path from the ID-block to the ramp */ + // FIXME: this is a very slow way to do it, but it will have to suffice... + if (ptr->id.data) { + ID *id= ptr->id.data; + + switch (GS(id->name)) { + case ID_MA: /* 2 cases for material - diffuse and spec */ + { + Material *ma= (Material *)id; + + /* try diffuse first */ + if (ma->ramp_col) { + RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_col, &ramp_ptr); + COLRAMP_GETPATH; + } + /* try specular if not diffuse */ + if (!path && ma->ramp_spec) { + RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_spec, &ramp_ptr); + COLRAMP_GETPATH; + } + } + break; + + // TODO: node trees need special attention + case ID_NT: + { + bNodeTree *ntree = (bNodeTree *)id; + bNode *node; + + for(node=ntree->nodes.first; node; node=node->next) { + if (ELEM3(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + RNA_pointer_create(id, &RNA_ColorRamp, node->storage, &ramp_ptr); + COLRAMP_GETPATH; + } + } + } + break; + + default: /* everything else should have a "color_ramp" property */ + { + /* create pointer to the ID block, and try to resolve "color_ramp" pointer */ + RNA_id_pointer_create(id, &ramp_ptr); + if (RNA_path_resolve(&ramp_ptr, "color_ramp", &ramp_ptr, &prop)) { + COLRAMP_GETPATH; + } + } + } + } + + /* cleanup the macro we defined */ +#undef COLRAMP_GETPATH + + return path; +} + +static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + if (ptr->id.data) { + ID *id= ptr->id.data; + + switch (GS(id->name)) { + case ID_MA: + { + Material *ma= ptr->id.data; + + DAG_id_flush_update(&ma->id, 0); + WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma); + } + break; + case ID_NT: + { + bNodeTree *ntree = (bNodeTree *)id; + bNode *node; + + for(node=ntree->nodes.first; node; node=node->next) { + if (ELEM3(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + ED_node_generic_update(bmain, scene, ntree, node); + } + } + } + break; + case ID_TE: + { + Tex *tex= ptr->id.data; + + DAG_id_flush_update(&tex->id, 0); + WM_main_add_notifier(NC_TEXTURE, tex); + } + break; + default: + break; + } + } +} + +static void rna_Scopes_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + Scopes *s= (Scopes*)ptr->data; + s->ok = 0; +} + #else static void rna_def_curvemappoint(BlenderRNA *brna) { StructRNA *srna; - PropertyRNA *prop; + PropertyRNA *prop; static EnumPropertyItem prop_handle_type_items[] = { - {0, "AUTO", 0, "Auto Handle", ""}, - {CUMA_VECTOR, "VECTOR", 0, "Vector Handle", ""}, + {0, "AUTO", 0, "Auto Handle", ""}, + {CUMA_VECTOR, "VECTOR", 0, "Vector Handle", ""}, {0, NULL, 0, NULL, NULL} - }; + }; srna= RNA_def_struct(brna, "CurveMapPoint", NULL); RNA_def_struct_ui_text(srna, "CurveMapPoint", "Point of a curve used for a curve mapping"); @@ -150,12 +313,12 @@ static void rna_def_curvemappoint(BlenderRNA *brna) static void rna_def_curvemap(BlenderRNA *brna) { StructRNA *srna; - PropertyRNA *prop; + PropertyRNA *prop; static EnumPropertyItem prop_extend_items[] = { - {0, "HORIZONTAL", 0, "Horizontal", ""}, - {CUMA_EXTEND_EXTRAPOLATE, "EXTRAPOLATED", 0, "Extrapolated", ""}, + {0, "HORIZONTAL", 0, "Horizontal", ""}, + {CUMA_EXTEND_EXTRAPOLATE, "EXTRAPOLATED", 0, "Extrapolated", ""}, {0, NULL, 0, NULL, NULL} - }; + }; srna= RNA_def_struct(brna, "CurveMap", NULL); RNA_def_struct_ui_text(srna, "CurveMap", "Curve in a curve mapping"); @@ -229,21 +392,143 @@ static void rna_def_curvemapping(BlenderRNA *brna) RNA_def_property_float_funcs(prop, NULL, "rna_CurveMapping_white_level_set", NULL); } +static void rna_def_color_ramp_element(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "ColorRampElement", NULL); + RNA_def_struct_sdna(srna, "CBData"); + RNA_def_struct_path_func(srna, "rna_ColorRampElement_path"); + RNA_def_struct_ui_text(srna, "Color Ramp Element", "Element defining a color at a position in the color ramp"); + + prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "r"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Color", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); + + prop= RNA_def_property(srna, "position", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "pos"); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "Position", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); +} + +static void rna_def_color_ramp(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_interpolation_items[] = { + {1, "EASE", 0, "Ease", ""}, + {3, "CARDINAL", 0, "Cardinal", ""}, + {0, "LINEAR", 0, "Linear", ""}, + {2, "B_SPLINE", 0, "B-Spline", ""}, + {4, "CONSTANT", 0, "Constant", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "ColorRamp", NULL); + RNA_def_struct_sdna(srna, "ColorBand"); + RNA_def_struct_path_func(srna, "rna_ColorRamp_path"); + RNA_def_struct_ui_text(srna, "Color Ramp", "Color ramp mapping a scalar value to a color"); + + prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_COLOR); + RNA_def_property_collection_sdna(prop, NULL, "data", "tot"); + RNA_def_property_struct_type(prop, "ColorRampElement"); + RNA_def_property_ui_text(prop, "Elements", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); + + prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "ipotype"); + RNA_def_property_enum_items(prop, prop_interpolation_items); + RNA_def_property_ui_text(prop, "Interpolation", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); +} + static void rna_def_histogram(BlenderRNA *brna) { StructRNA *srna; + PropertyRNA *prop; + static EnumPropertyItem prop_mode_items[] = { + {HISTO_MODE_LUMA, "Luma", ICON_COLOR, "Luma", ""}, + {HISTO_MODE_RGB, "RGB", ICON_COLOR, "Red Green Blue", ""}, + {HISTO_MODE_R, "R", ICON_COLOR, "Red", ""}, + {HISTO_MODE_G, "G", ICON_COLOR, "Green", ""}, + {HISTO_MODE_B, "B", ICON_COLOR, "Blue", ""}, + {0, NULL, 0, NULL, NULL}}; + srna= RNA_def_struct(brna, "Histogram", NULL); RNA_def_struct_ui_text(srna, "Histogram", "Statistical view of the levels of color in an image"); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, prop_mode_items); + RNA_def_property_ui_text(prop, "Mode", "Channels to display when drawing the histogram"); + +} + +static void rna_def_scopes(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_wavefrm_mode_items[] = { + {SCOPES_WAVEFRM_LUMA, "LUMA", ICON_COLOR, "Luma", ""}, + {SCOPES_WAVEFRM_RGB, "RGB", ICON_COLOR, "Red Green Blue", ""}, + {SCOPES_WAVEFRM_YCC_601, "YCBCR601", ICON_COLOR, "YCbCr (ITU 601)", ""}, + {SCOPES_WAVEFRM_YCC_709, "YCBCR709", ICON_COLOR, "YCbCr (ITU 709)", ""}, + {SCOPES_WAVEFRM_YCC_JPEG, "YCBCRJPG", ICON_COLOR, "YCbCr (Jpeg)", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "Scopes", NULL); + RNA_def_struct_ui_text(srna, "Scopes", "Scopes for statistical view of an image"); + + prop= RNA_def_property(srna, "use_full_resolution", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, "Scopes", "sample_full", 1); + RNA_def_property_ui_text(prop, "Full Sample", "Sample every pixel of the image"); + RNA_def_property_update(prop, 0, "rna_Scopes_update"); + + prop= RNA_def_property(srna, "accuracy", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_sdna(prop, "Scopes", "accuracy"); + RNA_def_property_range(prop, 0.0, 100.0); + RNA_def_property_ui_range(prop, 0.0, 100.0, 10, 1); + RNA_def_property_ui_text(prop, "Accuracy", "Proportion of original image source pixel lines to sample"); + RNA_def_property_update(prop, 0, "rna_Scopes_update"); + + prop= RNA_def_property(srna, "histogram", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, "Scopes", "hist"); + RNA_def_property_struct_type(prop, "Histogram"); + RNA_def_property_ui_text(prop, "Histogram", "Histogram for viewing image statistics"); + + prop= RNA_def_property(srna, "waveform_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, "Scopes", "wavefrm_mode"); + RNA_def_property_enum_items(prop, prop_wavefrm_mode_items); + RNA_def_property_ui_text(prop, "Waveform Mode", ""); + RNA_def_property_update(prop, 0, "rna_Scopes_update"); + + prop= RNA_def_property(srna, "waveform_alpha", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_sdna(prop, "Scopes", "wavefrm_alpha"); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "Waveform Opacity", "Opacity of the points"); + + prop= RNA_def_property(srna, "vectorscope_alpha", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_sdna(prop, "Scopes", "vecscope_alpha"); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "Vectorscope Opacity", "Opacity of the points"); } + void RNA_def_color(BlenderRNA *brna) { rna_def_curvemappoint(brna); rna_def_curvemap(brna); rna_def_curvemapping(brna); + rna_def_color_ramp_element(brna); + rna_def_color_ramp(brna); rna_def_histogram(brna); + rna_def_scopes(brna); } #endif |