[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:42:25 CEST 2012
Forgot to mention in commit log, this was a patch by Lukas, so thanks
to him for the implementation :)
Brecht.
On Thu, Oct 4, 2012 at 11:40 PM, Brecht Van Lommel
<brechtvanlommel at pandora.be> wrote:
> 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. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
More information about the Bf-blender-cvs
mailing list