Fix [#21288] Colour Ramp doesn't update output

Moved color ramp RNA to rna_color.c, was very texture-centric before.
This commit is contained in:
Matt Ebb 2010-03-15 04:54:31 +00:00
parent 72cc38e05d
commit e381395522
5 changed files with 251 additions and 181 deletions

@ -40,6 +40,7 @@ void ED_init_node_butfuncs(void);
/* node_draw.c */
void ED_node_changed_update(struct ID *id, struct bNode *node);
void ED_node_generic_update(struct Main *bmain, struct Scene *scene, struct bNodeTree *ntree, struct bNode *node);
/* node_edit.c */
void ED_node_shader_default(struct Material *ma);

@ -121,6 +121,41 @@ void ED_node_changed_update(ID *id, bNode *node)
}
}
static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
{
bNode *node;
if(ntree == lookup)
return 1;
for(node=ntree->nodes.first; node; node=node->next)
if(node->type == NODE_GROUP && node->id)
if(has_nodetree((bNodeTree*)node->id, lookup))
return 1;
return 0;
}
void ED_node_generic_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node)
{
Material *ma;
Tex *tex;
Scene *sce;
/* look through all datablocks, to support groups */
for(ma=bmain->mat.first; ma; ma=ma->id.next)
if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree))
ED_node_changed_update(&ma->id, node);
for(tex=bmain->tex.first; tex; tex=tex->id.next)
if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree))
ED_node_changed_update(&tex->id, node);
for(sce=bmain->scene.first; sce; sce=sce->id.next)
if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree))
ED_node_changed_update(&sce->id, node);
}
static void do_node_internal_buttons(bContext *C, void *node_v, int event)
{
if(event==B_NODE_EXEC) {

@ -32,7 +32,21 @@
#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,6 +127,150 @@ 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;
}
}
}
#else
static void rna_def_curvemappoint(BlenderRNA *brna)
@ -229,6 +387,60 @@ 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;
@ -243,6 +455,8 @@ 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);
}

@ -118,21 +118,6 @@ static char *rna_NodeSocket_path(PointerRNA *ptr)
return NULL;
}
static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
{
bNode *node;
if(ntree == lookup)
return 1;
for(node=ntree->nodes.first; node; node=node->next)
if(node->type == NODE_GROUP && node->id)
if(has_nodetree((bNodeTree*)node->id, lookup))
return 1;
return 0;
}
/* Button Set Funcs for Matte Nodes */
static void rna_Matte_t1_set(PointerRNA *ptr, float value)
{
@ -158,22 +143,7 @@ static void rna_Matte_t2_set(PointerRNA *ptr, float value)
static void node_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node)
{
Material *ma;
Tex *tex;
Scene *sce;
/* look through all datablocks, to support groups */
for(ma=bmain->mat.first; ma; ma=ma->id.next)
if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree))
ED_node_changed_update(&ma->id, node);
for(tex=bmain->tex.first; tex; tex=tex->id.next)
if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree))
ED_node_changed_update(&tex->id, node);
for(sce=bmain->scene.first; sce; sce=sce->id.next)
if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree))
ED_node_changed_update(&sce->id, node);
ED_node_generic_update(bmain, scene, ntree, node);
}
static void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr)

@ -363,156 +363,8 @@ static void rna_PointDensity_psys_set(PointerRNA *ptr, PointerRNA value)
pd->psys= BLI_findindex(&ob->particlesystem, value.data) + 1;
}
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:
{
// FIXME: we'll probably have to loop over nodes until we find one that uses the color ramp
}
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;
}
#else
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_Texture_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_Texture_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_Texture_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_Texture_update");
}
static void rna_def_texmapping(BlenderRNA *brna)
{
StructRNA *srna;
@ -1912,8 +1764,6 @@ void RNA_def_texture(BlenderRNA *brna)
rna_def_texture(brna);
rna_def_mtex(brna);
rna_def_environment_map(brna);
rna_def_color_ramp(brna);
rna_def_color_ramp_element(brna);
rna_def_texmapping(brna);
}