Revision: 49247
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49247
Author:   lukastoenne
Date:     2012-07-26 11:40:58 +0000 (Thu, 26 Jul 2012)
Log Message:
-----------
Added a particle index output to the Particle Info Cycles node. This is 
required to get consistent ID numbers for particles. The Object ID is not 
usable since it's a user defined value of the instanced object, which does not 
vary per instance. Also the random value from the object info node is not 
consistent over time, since it only depends on the index in the dupli list (so 
each emitted or dying particle shifts the value).

The particle index is always the same for a specific particle. Randomized 
values can be generated from this with the use of a noise texture.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_particles.cpp
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/svm/svm_geometry.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/object.h
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_particle_info.c

Modified: trunk/blender/intern/cycles/blender/blender_particles.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_particles.cpp   2012-07-26 
11:08:56 UTC (rev 49246)
+++ trunk/blender/intern/cycles/blender/blender_particles.cpp   2012-07-26 
11:40:58 UTC (rev 49247)
@@ -144,16 +144,20 @@
        BL::Object::particle_systems_iterator b_psys;
        for(b_ob.particle_systems.begin(b_psys); b_psys != 
b_ob.particle_systems.end(); ++b_psys) {
                if (use_particle_system(*b_psys)) {
+                       int pa_index = 0;
                        BL::ParticleSystem::particles_iterator b_pa;
                        for(b_psys->particles.begin(b_pa), index = 0; b_pa != 
b_psys->particles.end(); ++b_pa, ++index) {
                                if(use_particle(*b_pa)) {
                                        Particle pa;
                                        
+                                       pa.index = pa_index;
                                        pa.age = b_scene.frame_current() - 
b_pa->birth_time();
                                        pa.lifetime = b_pa->lifetime();
                                        
                                        ob->particles.push_back(pa);
                                }
+                               
+                               ++pa_index;
                        }
                }
        }

Modified: trunk/blender/intern/cycles/kernel/kernel_object.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_object.h  2012-07-26 11:08:56 UTC 
(rev 49246)
+++ trunk/blender/intern/cycles/kernel/kernel_object.h  2012-07-26 11:40:58 UTC 
(rev 49247)
@@ -169,20 +169,27 @@
        return kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2 + 
1);
 }
 
-__device float particle_age(KernelGlobals *kg, int particle)
+__device_inline float particle_index(KernelGlobals *kg, int particle)
 {
        int offset = particle*PARTICLE_SIZE;
        float4 f = kernel_tex_fetch(__particles, offset);
        return f.x;
 }
 
-__device float particle_lifetime(KernelGlobals *kg, int particle)
+__device float particle_age(KernelGlobals *kg, int particle)
 {
        int offset = particle*PARTICLE_SIZE;
        float4 f = kernel_tex_fetch(__particles, offset);
        return f.y;
 }
 
+__device float particle_lifetime(KernelGlobals *kg, int particle)
+{
+       int offset = particle*PARTICLE_SIZE;
+       float4 f = kernel_tex_fetch(__particles, offset);
+       return f.z;
+}
 
+
 CCL_NAMESPACE_END
 

Modified: trunk/blender/intern/cycles/kernel/svm/svm_geometry.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_geometry.h       2012-07-26 
11:08:56 UTC (rev 49246)
+++ trunk/blender/intern/cycles/kernel/svm/svm_geometry.h       2012-07-26 
11:40:58 UTC (rev 49247)
@@ -101,6 +101,12 @@
        float data;
 
        switch(type) {
+               case NODE_INFO_PAR_INDEX: {
+                       uint particle_id = object_particle_id(kg, sd->object);
+                       data = particle_index(kg, particle_id);
+                       stack_store_float(stack, out_offset, data);
+                       break;
+               }
                case NODE_INFO_PAR_AGE: {
                        uint particle_id = object_particle_id(kg, sd->object);
                        data = particle_age(kg, particle_id);

Modified: trunk/blender/intern/cycles/kernel/svm/svm_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_types.h  2012-07-26 11:08:56 UTC 
(rev 49246)
+++ trunk/blender/intern/cycles/kernel/svm/svm_types.h  2012-07-26 11:40:58 UTC 
(rev 49247)
@@ -114,6 +114,7 @@
 } NodeObjectInfo;
 
 typedef enum NodeParticleInfo {
+       NODE_INFO_PAR_INDEX,
        NODE_INFO_PAR_AGE,
        NODE_INFO_PAR_LIFETIME
 } NodeParticleInfo;

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp        2012-07-26 11:08:56 UTC 
(rev 49246)
+++ trunk/blender/intern/cycles/render/nodes.cpp        2012-07-26 11:40:58 UTC 
(rev 49247)
@@ -1798,12 +1798,15 @@
 ParticleInfoNode::ParticleInfoNode()
 : ShaderNode("particle_info")
 {
+       add_output("Index", SHADER_SOCKET_FLOAT);
        add_output("Age", SHADER_SOCKET_FLOAT);
        add_output("Lifetime", SHADER_SOCKET_FLOAT);
 }
 
 void ParticleInfoNode::attributes(AttributeRequestSet *attributes)
 {
+       if(!output("Index")->links.empty())
+               attributes->add(ATTR_STD_PARTICLE);
        if(!output("Age")->links.empty())
                attributes->add(ATTR_STD_PARTICLE);
        if(!output("Lifetime")->links.empty())
@@ -1816,6 +1819,12 @@
 {
        ShaderOutput *out;
        
+       out = output("Index");
+       if(!out->links.empty()) {
+               compiler.stack_assign(out);
+               compiler.add_node(NODE_PARTICLE_INFO, NODE_INFO_PAR_INDEX, 
out->stack_offset);
+       }
+       
        out = output("Age");
        if(!out->links.empty()) {
                compiler.stack_assign(out);

Modified: trunk/blender/intern/cycles/render/object.cpp
===================================================================
--- trunk/blender/intern/cycles/render/object.cpp       2012-07-26 11:08:56 UTC 
(rev 49246)
+++ trunk/blender/intern/cycles/render/object.cpp       2012-07-26 11:40:58 UTC 
(rev 49247)
@@ -269,7 +269,7 @@
                        /* pack in texture */
                        int offset = i*PARTICLE_SIZE;
                        
-                       particles[offset] = make_float4(pa.age, pa.lifetime, 
0.0f, 0.0f);
+                       particles[offset] = make_float4(pa.index, pa.age, 
pa.lifetime, 0.0f);
                        
                        i++;
                        

Modified: trunk/blender/intern/cycles/render/object.h
===================================================================
--- trunk/blender/intern/cycles/render/object.h 2012-07-26 11:08:56 UTC (rev 
49246)
+++ trunk/blender/intern/cycles/render/object.h 2012-07-26 11:40:58 UTC (rev 
49247)
@@ -36,6 +36,7 @@
 /* Object */
 
 struct Particle {
+       int index;
        float age;
        float lifetime;
 };

Modified: 
trunk/blender/source/blender/nodes/shader/nodes/node_shader_particle_info.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_particle_info.c 
2012-07-26 11:08:56 UTC (rev 49246)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_particle_info.c 
2012-07-26 11:40:58 UTC (rev 49247)
@@ -28,9 +28,10 @@
 #include "../node_shader_util.h"
 
 static bNodeSocketTemplate outputs[] = {
-        { SOCK_FLOAT,  0, "Age" },
-        { SOCK_FLOAT,  0, "Lifetime" },
-        { -1, 0, "" }
+    { SOCK_FLOAT,  0, "Index" },
+    { SOCK_FLOAT,  0, "Age" },
+    { SOCK_FLOAT,  0, "Lifetime" },
+    { -1, 0, "" }
 };
 
 /* node type definition */

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

Reply via email to