[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33811] trunk/blender/source/blender: Bugfix #25301

Ton Roosendaal ton at blender.org
Mon Dec 20 14:02:33 CET 2010


Revision: 33811
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33811
Author:   ton
Date:     2010-12-20 14:02:33 +0100 (Mon, 20 Dec 2010)

Log Message:
-----------
Bugfix #25301

Material Node trees:
SSS wasn't displaying in Nodes.

Implementation notes:
- Currently copying local data for preview render, only copies
  the base material. Node materials are re-used.
- This causes data to be in 2 "main" databases... complex.
- To make it work for preview, I had to add another loop in the
  SSS code that checks the original Main dbase. That's marked
  as warning in code to be fixed up.

Another bug:
- Material properties "SSS presets" copied settings to the
  active material, not to the displayed one. Added RNA call 
  to retrieve this from Objects.

(Next commit will fix preset scripts)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_preview.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/render/intern/source/sss.c

Modified: trunk/blender/source/blender/editors/render/render_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c	2010-12-20 11:33:52 UTC (rev 33810)
+++ trunk/blender/source/blender/editors/render/render_preview.c	2010-12-20 13:02:33 UTC (rev 33811)
@@ -49,6 +49,7 @@
 #include "DNA_world_types.h"
 #include "DNA_camera_types.h"
 #include "DNA_material_types.h"
+#include "DNA_node_types.h"
 #include "DNA_object_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_space_types.h"
@@ -309,6 +310,32 @@
 	return ob;
 }
 
+static int preview_mat_has_sss(Material *mat, bNodeTree *ntree)
+{
+	if(mat) {
+		if(mat->sss_flag & MA_DIFF_SSS)
+			return 1;
+		if(mat->nodetree)
+			if( preview_mat_has_sss(NULL, mat->nodetree))
+				return 1;
+	}
+	else if(ntree) {
+		bNode *node;
+		for(node= ntree->nodes.first; node; node= node->next) {
+			if(node->type==NODE_GROUP && node->id) {
+				if( preview_mat_has_sss(NULL, (bNodeTree *)node->id))
+					return 1;
+			}
+			else if(node->id && ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) {
+				mat= (Material *)node->id;
+				if(mat->sss_flag & MA_DIFF_SSS)
+					return 1;
+			}
+		}
+	}
+	return 0;
+}
+
 /* call this with a pointer to initialize preview scene */
 /* call this with NULL to restore assigned ID pointers in preview scene */
 static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPreview *sp)
@@ -361,7 +388,7 @@
 					sce->r.mode |= R_RAYTRACE;
 				if((mat->mode_l & MA_RAYTRANSP) && (mat->mode_l & MA_TRANSP))
 					sce->r.mode |= R_RAYTRACE;
-				if(mat->sss_flag & MA_DIFF_SSS)
+				if(preview_mat_has_sss(mat, NULL))
 					sce->r.mode |= R_SSS;
 				
 				/* turn off fake shadows if needed */

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2010-12-20 11:33:52 UTC (rev 33810)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2010-12-20 13:02:33 UTC (rev 33811)
@@ -587,12 +587,29 @@
 	*max= MAX2(ob->totcol-1, 0);
 }
 
+/* returns active base material */
 static PointerRNA rna_Object_active_material_get(PointerRNA *ptr)
 {
 	Object *ob= (Object*)ptr->id.data;
 	Material *ma;
+	
+	ma= (ob->totcol)? give_current_material(ob, ob->actcol): NULL;
+	return rna_pointer_inherit_refine(ptr, &RNA_Material, ma);
+}
 
+/* returns (optional) active node material in base material */
+static PointerRNA rna_Object_active_node_material_get(PointerRNA *ptr)
+{
+	Object *ob= (Object*)ptr->id.data;
+	Material *ma;
+	
 	ma= (ob->totcol)? give_current_material(ob, ob->actcol): NULL;
+	if(ma) {
+		Material *manode= give_node_material(ma);
+		if(manode)
+			return rna_pointer_inherit_refine(ptr, &RNA_Material, manode);
+	}
+	
 	return rna_pointer_inherit_refine(ptr, &RNA_Material, ma);
 }
 
@@ -1777,6 +1794,13 @@
 	RNA_def_property_ui_text(prop, "Active Material", "Active material being displayed");
 	RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_MaterialSlot_update");
 
+	prop= RNA_def_property(srna, "active_node_material", PROP_POINTER, PROP_NONE);
+	RNA_def_property_struct_type(prop, "Material");
+	RNA_def_property_pointer_funcs(prop, "rna_Object_active_node_material_get", NULL, NULL, NULL);
+	RNA_def_property_ui_text(prop, "Active Material", "Active (node) material being displayed");
+	RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+	
+	
 	prop= RNA_def_property(srna, "active_material_index", PROP_INT, PROP_UNSIGNED);
 	RNA_def_property_int_sdna(prop, NULL, "actcol");
 	RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);

Modified: trunk/blender/source/blender/render/intern/source/sss.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/sss.c	2010-12-20 11:33:52 UTC (rev 33810)
+++ trunk/blender/source/blender/render/intern/source/sss.c	2010-12-20 13:02:33 UTC (rev 33811)
@@ -997,6 +997,14 @@
 		if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
 			sss_create_tree_mat(re, mat);
 	
+	/* XXX preview exception */
+	/* localizing preview render data is not fun for node trees :( */
+	if(re->main!=G.main) {
+		for(mat= G.main->mat.first; mat; mat= mat->id.next)
+			if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
+				sss_create_tree_mat(re, mat);
+	}
+	
 }
 
 void free_sss(Render *re)





More information about the Bf-blender-cvs mailing list