[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