Revision: 27509
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27509
Author:   broken
Date:     2010-03-15 05:54:31 +0100 (Mon, 15 Mar 2010)

Log Message:
-----------
Fix [#21288] Colour Ramp doesn't update output

Moved color ramp RNA to rna_color.c, was very texture-centric before.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_node.h
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/makesrna/intern/rna_color.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_texture.c

Modified: trunk/blender/source/blender/editors/include/ED_node.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_node.h      2010-03-15 
02:30:53 UTC (rev 27508)
+++ trunk/blender/source/blender/editors/include/ED_node.h      2010-03-15 
04:54:31 UTC (rev 27509)
@@ -40,6 +40,7 @@
 
 /* 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);

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c 2010-03-15 
02:30:53 UTC (rev 27508)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c 2010-03-15 
04:54:31 UTC (rev 27509)
@@ -121,6 +121,41 @@
        }
 }
 
+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) {

Modified: trunk/blender/source/blender/makesrna/intern/rna_color.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_color.c    2010-03-15 
02:30:53 UTC (rev 27508)
+++ trunk/blender/source/blender/makesrna/intern/rna_color.c    2010-03-15 
04:54:31 UTC (rev 27509)
@@ -32,8 +32,22 @@
 
 #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)
 {
        CurveMapping *cumap= (CurveMapping*)ptr->data;
@@ -113,6 +127,150 @@
        *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 @@
        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 @@
        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);
 }
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c 2010-03-15 
02:30:53 UTC (rev 27508)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c 2010-03-15 
04:54:31 UTC (rev 27509)
@@ -118,21 +118,6 @@
        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 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);

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to