[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51059] trunk/blender: Cycles: add " From Dupli" option for texture coordinate node.

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Oct 4 23:40:39 CEST 2012


Revision: 51059
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51059
Author:   blendix
Date:     2012-10-04 21:40:39 +0000 (Thu, 04 Oct 2012)
Log Message:
-----------
Cycles: add "From Dupli" option for texture coordinate node. This gets the
Generated and UV coordinates from the duplicator of instance instead of the
object itself.

This was used in e.g. Big Buck Bunny for texturing instanced feathers with
a UV map on the bird. Many files changed, mainly to do some refactoring to
get rid of G.rendering global in duplilist code.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_object.cpp
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/blender/blender_sync.h
    trunk/blender/intern/cycles/blender/blender_util.h
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/object.h
    trunk/blender/source/blender/blenkernel/BKE_anim.h
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/pointcache.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/editors/transform/transform_snap.c
    trunk/blender/source/blender/gpu/intern/gpu_material.c
    trunk/blender/source/blender/makesrna/intern/rna_internal.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_coord.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp	2012-10-04 21:40:39 UTC (rev 51059)
@@ -194,8 +194,10 @@
 
 /* Object */
 
-void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint layer_flag, int motion, int particle_id)
+void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::DupliObject b_dupli_ob, Transform& tfm, uint layer_flag, int motion, int particle_id)
 {
+	BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent);
+	
 	/* light is handled separately */
 	if(object_is_light(b_ob)) {
 		if(!motion)
@@ -274,6 +276,15 @@
 			object->visibility &= ~PATH_RAY_CAMERA;
 		}
 
+		if (b_dupli_ob) {
+			object->dupli_generated = get_float3(b_dupli_ob.orco());
+			object->dupli_uv = get_float2(b_dupli_ob.uv());
+		}
+		else {
+			object->dupli_generated = make_float3(0.0f, 0.0f, 0.0f);
+			object->dupli_uv = make_float2(0.0f, 0.0f);
+		}
+
 		object->particle_id = particle_id;
 
 		object->tag_update(scene);
@@ -328,7 +339,7 @@
 						bool dup_hide = (b_v3d)? b_dup_ob.hide(): b_dup_ob.hide_render();
 
 						if(!(b_dup->hide() || dup_hide)) {
-							sync_object(*b_ob, b_index, b_dup_ob, tfm, ob_layer, motion, b_dup->particle_index() + particle_offset);
+							sync_object(*b_ob, b_index, *b_dup, tfm, ob_layer, motion, b_dup->particle_index() + particle_offset);
 						}
 						
 						++b_index;
@@ -346,7 +357,7 @@
 				if(!hide) {
 					/* object itself */
 					Transform tfm = get_transform(b_ob->matrix_world());
-					sync_object(*b_ob, 0, *b_ob, tfm, ob_layer, motion, 0);
+					sync_object(*b_ob, 0, PointerRNA_NULL, tfm, ob_layer, motion, 0);
 				}
 
 				particle_offset += num_particles;

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-10-04 21:40:39 UTC (rev 51059)
@@ -490,7 +490,10 @@
 			break;
 		}
 		case BL::ShaderNode::type_TEX_COORD: {
-			node = new TextureCoordinateNode();
+			BL::ShaderNodeTexCoord b_tex_coord_node(b_node);
+			TextureCoordinateNode *tex_coord = new TextureCoordinateNode();
+			tex_coord->from_dupli = b_tex_coord_node.from_dupli();
+			node = tex_coord;
 			break;
 		}
 		case BL::ShaderNode::type_TEX_SKY: {

Modified: trunk/blender/intern/cycles/blender/blender_sync.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.h	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/blender/blender_sync.h	2012-10-04 21:40:39 UTC (rev 51059)
@@ -81,7 +81,7 @@
 
 	void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
 	Mesh *sync_mesh(BL::Object b_ob, bool object_updated);
-	void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint layer_flag, int motion, int particle_id);
+	void sync_object(BL::Object b_parent, int b_index, BL::DupliObject b_dupli_object, Transform& tfm, uint layer_flag, int motion, int particle_id);
 	void sync_light(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm);
 	void sync_background_light();
 	void sync_mesh_motion(BL::Object b_ob, Mesh *mesh, int motion);

Modified: trunk/blender/intern/cycles/blender/blender_util.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_util.h	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/blender/blender_util.h	2012-10-04 21:40:39 UTC (rev 51059)
@@ -36,7 +36,7 @@
 
 ID *rna_Object_to_mesh(void *_self, void *reports, void *scene, int apply_modifiers, int settings);
 void rna_Main_meshes_remove(void *bmain, void *reports, void *mesh);
-void rna_Object_create_duplilist(void *ob, void *reports, void *sce);
+void rna_Object_create_duplilist(void *ob, void *reports, void *sce, int settings);
 void rna_Object_free_duplilist(void *ob);
 void rna_RenderLayer_rect_set(PointerRNA *ptr, const float *values);
 void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values);
@@ -84,7 +84,7 @@
 
 static inline void object_create_duplilist(BL::Object self, BL::Scene scene)
 {
-	rna_Object_create_duplilist(self.ptr.data, NULL, scene.ptr.data);
+	rna_Object_create_duplilist(self.ptr.data, NULL, scene.ptr.data, 2);
 }
 
 static inline void object_free_duplilist(BL::Object self)

Modified: trunk/blender/intern/cycles/kernel/kernel_object.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_object.h	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/kernel/kernel_object.h	2012-10-04 21:40:39 UTC (rev 51059)
@@ -23,7 +23,8 @@
 	OBJECT_INVERSE_TRANSFORM = 3,
 	OBJECT_PROPERTIES = 6,
 	OBJECT_TRANSFORM_MOTION_PRE = 8,
-	OBJECT_TRANSFORM_MOTION_POST = 12
+	OBJECT_TRANSFORM_MOTION_POST = 12,
+	OBJECT_DUPLI = 16
 };
 
 __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, float time, enum ObjectTransform type)
@@ -164,6 +165,27 @@
 	return __float_as_int(f.w);
 }
 
+__device_inline float3 object_dupli_generated(KernelGlobals *kg, int object)
+{
+	if(object == ~0)
+		return make_float3(0.0f, 0.0f, 0.0f);
+
+	int offset = object*OBJECT_SIZE + OBJECT_DUPLI;
+	float4 f = kernel_tex_fetch(__objects, offset);
+	return make_float3(f.x, f.y, f.z);
+}
+
+__device_inline float3 object_dupli_uv(KernelGlobals *kg, int object)
+{
+	if(object == ~0)
+		return make_float3(0.0f, 0.0f, 0.0f);
+
+	int offset = object*OBJECT_SIZE + OBJECT_DUPLI;
+	float4 f = kernel_tex_fetch(__objects, offset + 1);
+	return make_float3(f.x, f.y, 0.0f);
+}
+
+
 __device int shader_pass_id(KernelGlobals *kg, ShaderData *sd)
 {
 	return kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2 + 1);

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-04 21:40:39 UTC (rev 51059)
@@ -29,7 +29,7 @@
 CCL_NAMESPACE_BEGIN
 
 /* constants */
-#define OBJECT_SIZE 		16
+#define OBJECT_SIZE 		18
 #define LIGHT_SIZE			4
 #define FILTER_TABLE_SIZE	256
 #define RAMP_TABLE_SIZE		256

Modified: trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2012-10-04 21:40:39 UTC (rev 51059)
@@ -92,6 +92,14 @@
 				data = sd->I;
 			break;
 		}
+		case NODE_TEXCO_DUPLI_GENERATED: {
+			data = object_dupli_generated(kg, sd->object);
+			break;
+		}
+		case NODE_TEXCO_DUPLI_UV: {
+			data = object_dupli_uv(kg, sd->object);
+			break;
+		}
 	}
 
 	stack_store_float3(stack, out_offset, data);
@@ -141,6 +149,14 @@
 				data = sd->I;
 			break;
 		}
+		case NODE_TEXCO_DUPLI_GENERATED: {
+			data = object_dupli_generated(kg, sd->object);
+			break;
+		}
+		case NODE_TEXCO_DUPLI_UV: {
+			data = object_dupli_uv(kg, sd->object);
+			break;
+		}
 	}
 
 	stack_store_float3(stack, out_offset, data);
@@ -193,6 +209,14 @@
 				data = sd->I;
 			break;
 		}
+		case NODE_TEXCO_DUPLI_GENERATED: {
+			data = object_dupli_generated(kg, sd->object);
+			break;
+		}
+		case NODE_TEXCO_DUPLI_UV: {
+			data = object_dupli_uv(kg, sd->object);
+			break;
+		}
 	}
 
 	stack_store_float3(stack, out_offset, data);

Modified: trunk/blender/intern/cycles/kernel/svm/svm_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_types.h	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/kernel/svm/svm_types.h	2012-10-04 21:40:39 UTC (rev 51059)
@@ -43,6 +43,7 @@
 	NODE_TEX_IMAGE_BOX,
 	NODE_TEX_SKY,
 	NODE_GEOMETRY,
+	NODE_GEOMETRY_DUPLI,
 	NODE_LIGHT_PATH,
 	NODE_VALUE_F,
 	NODE_VALUE_V,
@@ -149,7 +150,9 @@
 	NODE_TEXCO_OBJECT,
 	NODE_TEXCO_CAMERA,
 	NODE_TEXCO_WINDOW,
-	NODE_TEXCO_REFLECTION
+	NODE_TEXCO_REFLECTION,
+	NODE_TEXCO_DUPLI_GENERATED,
+	NODE_TEXCO_DUPLI_UV
 } NodeTexCoord;
 
 typedef enum NodeMix {

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-10-04 21:40:39 UTC (rev 51059)
@@ -1681,9 +1681,15 @@
 			compiler.add_node(geom_node, NODE_GEOM_P, out->stack_offset);
 		}
 		else {
-			int attr = compiler.attribute(ATTR_STD_GENERATED);
-			compiler.stack_assign(out);
-			compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+			if(from_dupli) {
+				compiler.stack_assign(out);
+				compiler.add_node(texco_node, NODE_TEXCO_DUPLI_GENERATED, out->stack_offset);
+			}
+			else {
+				int attr = compiler.attribute(ATTR_STD_GENERATED);
+				compiler.stack_assign(out);
+				compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+			}
 		}
 	}
 
@@ -1695,9 +1701,15 @@
 
 	out = output("UV");
 	if(!out->links.empty()) {
-		int attr = compiler.attribute(ATTR_STD_UV);
-		compiler.stack_assign(out);
-		compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+		if(from_dupli) {
+			int attr = compiler.attribute(ATTR_STD_UV);
+			compiler.stack_assign(out);
+			compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+		}
+		else {
+			compiler.stack_assign(out);
+			compiler.add_node(texco_node, NODE_TEXCO_DUPLI_UV, out->stack_offset);
+		}
 	}
 
 	out = output("Object");

Modified: trunk/blender/intern/cycles/render/nodes.h
===================================================================
--- trunk/blender/intern/cycles/render/nodes.h	2012-10-04 21:40:10 UTC (rev 51058)
+++ trunk/blender/intern/cycles/render/nodes.h	2012-10-04 21:40:39 UTC (rev 51059)
@@ -284,6 +284,8 @@
 public:
 	SHADER_NODE_CLASS(TextureCoordinateNode)
 	void attributes(AttributeRequestSet *attributes);
+	
+	bool from_dupli;
 };
 
 class LightPathNode : public ShaderNode {

Modified: trunk/blender/intern/cycles/render/object.cpp

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list