Revision: 49230
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49230
Author:   genscher
Date:     2012-07-25 22:01:59 +0000 (Wed, 25 Jul 2012)
Log Message:
-----------
Smoke + Cycles:

- Add Smoke Density node
- Make density available on GPU
- *TOTALLY* untested! Will most likely crash and you cannot render at the 
moment since "Volume BSDF" is missing (from blenderartists volume patch)

TODO:
- Fix "svm_node_smoke_density()", atm I have no idea how

Modified Paths:
--------------
    branches/smoke2/intern/cycles/blender/blender_object.cpp
    branches/smoke2/intern/cycles/blender/blender_smoke.cpp
    branches/smoke2/intern/cycles/blender/blender_sync.h
    branches/smoke2/intern/cycles/kernel/kernel_object.h
    branches/smoke2/intern/cycles/kernel/kernel_textures.h
    branches/smoke2/intern/cycles/kernel/kernel_types.h
    branches/smoke2/intern/cycles/kernel/svm/svm.h
    branches/smoke2/intern/cycles/kernel/svm/svm_geometry.h
    branches/smoke2/intern/cycles/kernel/svm/svm_types.h
    branches/smoke2/intern/cycles/render/nodes.cpp
    branches/smoke2/intern/cycles/render/nodes.h
    branches/smoke2/intern/cycles/render/object.cpp
    branches/smoke2/intern/cycles/render/object.h
    branches/smoke2/intern/cycles/render/scene.h

Modified: branches/smoke2/intern/cycles/blender/blender_object.cpp
===================================================================
--- branches/smoke2/intern/cycles/blender/blender_object.cpp    2012-07-25 
21:06:13 UTC (rev 49229)
+++ branches/smoke2/intern/cycles/blender/blender_object.cpp    2012-07-25 
22:01:59 UTC (rev 49230)
@@ -255,7 +255,6 @@
                object->motion.pre = tfm;
                object->motion.post = tfm;
                object->use_motion = false;
-               object->use_volume = false;
 
                object->random_id = 
hash_int_2d(hash_string(object->name.c_str()), b_index);
 
@@ -279,11 +278,8 @@
                if (object_use_particles(b_ob))
                        sync_particles(object, b_ob);
 
-               if(BKE_modifiers_isSmokeEnabled(b_ob))
-               {
-                       object->use_volume = true;
+               if(object_use_smoke(b_ob))
                        sync_smoke(object, b_ob);
-               }
        
                object->tag_update(scene);
        }

Modified: branches/smoke2/intern/cycles/blender/blender_smoke.cpp
===================================================================
--- branches/smoke2/intern/cycles/blender/blender_smoke.cpp     2012-07-25 
21:06:13 UTC (rev 49229)
+++ branches/smoke2/intern/cycles/blender/blender_smoke.cpp     2012-07-25 
22:01:59 UTC (rev 49230)
@@ -33,7 +33,7 @@
 
 /* Only looking for Smoke domains */
 // TODO DG: disable rendering of smoke flow??
-bool BlenderSync::BKE_modifiers_isSmokeEnabled(BL::Object b_ob)
+bool BlenderSync::object_use_smoke(BL::Object b_ob)
 {
        BL::Object::modifiers_iterator b_modifiers;
        for(b_ob.modifiers.begin(b_modifiers); b_modifiers != 
b_ob.modifiers.end(); ++b_modifiers) {
@@ -43,7 +43,11 @@
                        BL::SmokeModifier smd(mod);
 
                        if(smd.smoke_type() == 
BL::SmokeModifier::smoke_type_DOMAIN) {
-                               return true;
+                               BL::ID key = (BKE_object_is_modified(b_ob))? 
b_ob: b_ob.data();
+                               Mesh *mesh = mesh_map.find(key);
+                               if (mesh) {
+                                       return mesh->need_attribute(scene, 
ATTR_STD_SMOKE_DENSITY);
+                               }
                        }
                }
        }

Modified: branches/smoke2/intern/cycles/blender/blender_sync.h
===================================================================
--- branches/smoke2/intern/cycles/blender/blender_sync.h        2012-07-25 
21:06:13 UTC (rev 49229)
+++ branches/smoke2/intern/cycles/blender/blender_sync.h        2012-07-25 
22:01:59 UTC (rev 49230)
@@ -91,7 +91,7 @@
        /* util */
        void find_shader(BL::ID id, vector<uint>& used_shaders, int 
default_shader);
        bool BKE_object_is_modified(BL::Object b_ob);
-       bool BKE_modifiers_isSmokeEnabled(BL::Object b_ob);
+       bool object_use_smoke(BL::Object b_ob);
        bool object_is_mesh(BL::Object b_ob);
        bool object_is_light(BL::Object b_ob);
        bool object_use_particles(BL::Object b_ob);

Modified: branches/smoke2/intern/cycles/kernel/kernel_object.h
===================================================================
--- branches/smoke2/intern/cycles/kernel/kernel_object.h        2012-07-25 
21:06:13 UTC (rev 49229)
+++ branches/smoke2/intern/cycles/kernel/kernel_object.h        2012-07-25 
22:01:59 UTC (rev 49230)
@@ -183,6 +183,12 @@
        return f.y;
 }
 
+__device float smoke_density(KernelGlobals *kg, int cell)
+{
+       int offset = cell; // DG TODO *PARTICLE_SIZE
+       return kernel_tex_fetch(__smoke_density, offset);
+}
 
+
 CCL_NAMESPACE_END
 

Modified: branches/smoke2/intern/cycles/kernel/kernel_textures.h
===================================================================
--- branches/smoke2/intern/cycles/kernel/kernel_textures.h      2012-07-25 
21:06:13 UTC (rev 49229)
+++ branches/smoke2/intern/cycles/kernel/kernel_textures.h      2012-07-25 
22:01:59 UTC (rev 49230)
@@ -55,6 +55,9 @@
 /* particles */
 KERNEL_TEX(float4, texture_float4, __particles)
 
+/* Smoke */
+KERNEL_TEX(float, texture_float, __smoke_density)
+
 /* shaders */
 KERNEL_TEX(uint4, texture_uint4, __svm_nodes)
 KERNEL_TEX(uint, texture_uint, __shader_flag)

Modified: branches/smoke2/intern/cycles/kernel/kernel_types.h
===================================================================
--- branches/smoke2/intern/cycles/kernel/kernel_types.h 2012-07-25 21:06:13 UTC 
(rev 49229)
+++ branches/smoke2/intern/cycles/kernel/kernel_types.h 2012-07-25 22:01:59 UTC 
(rev 49230)
@@ -361,6 +361,7 @@
        ATTR_STD_MOTION_PRE,
        ATTR_STD_MOTION_POST,
        ATTR_STD_PARTICLE,
+       ATTR_STD_SMOKE_DENSITY,
        ATTR_STD_NUM,
 
        ATTR_STD_NOT_FOUND = ~0

Modified: branches/smoke2/intern/cycles/kernel/svm/svm.h
===================================================================
--- branches/smoke2/intern/cycles/kernel/svm/svm.h      2012-07-25 21:06:13 UTC 
(rev 49229)
+++ branches/smoke2/intern/cycles/kernel/svm/svm.h      2012-07-25 22:01:59 UTC 
(rev 49230)
@@ -272,6 +272,9 @@
                        case NODE_PARTICLE_INFO:
                                svm_node_particle_info(kg, sd, stack, node.y, 
node.z);
                                break;
+                       case NODE_SMOKE_DENSITY:
+                               svm_node_smoke_density(kg, sd, stack, node.y, 
node.z);
+                               break;
 #endif
                        case NODE_CONVERT:
                                svm_node_convert(sd, stack, node.y, node.z, 
node.w);

Modified: branches/smoke2/intern/cycles/kernel/svm/svm_geometry.h
===================================================================
--- branches/smoke2/intern/cycles/kernel/svm/svm_geometry.h     2012-07-25 
21:06:13 UTC (rev 49229)
+++ branches/smoke2/intern/cycles/kernel/svm/svm_geometry.h     2012-07-25 
22:01:59 UTC (rev 49230)
@@ -116,5 +116,22 @@
        }
 }
 
+
+/* Smoke Density */
+
+__device void svm_node_smoke_density(KernelGlobals *kg, ShaderData *sd, float 
*stack, uint type, uint out_offset)
+{
+       float data;
+
+       switch(type) {
+               case NODE_INFO_SMO_DEN: {
+                       // DG TODO uint particle_id = object_particle_id(kg, 
sd->object);
+                       // DG TODO data = smoke_density(kg, WHICH CELL IN 
GRID?);
+                       // DG TODO stack_store_float(stack, out_offset, data);
+                       break;
+               }
+       }
+}
+
 CCL_NAMESPACE_END
 

Modified: branches/smoke2/intern/cycles/kernel/svm/svm_types.h
===================================================================
--- branches/smoke2/intern/cycles/kernel/svm/svm_types.h        2012-07-25 
21:06:13 UTC (rev 49229)
+++ branches/smoke2/intern/cycles/kernel/svm/svm_types.h        2012-07-25 
22:01:59 UTC (rev 49230)
@@ -89,7 +89,8 @@
        NODE_MIN_MAX,
        NODE_LIGHT_FALLOFF,
        NODE_OBJECT_INFO,
-       NODE_PARTICLE_INFO
+       NODE_PARTICLE_INFO,
+       NODE_SMOKE_DENSITY
 } NodeType;
 
 typedef enum NodeAttributeType {
@@ -118,6 +119,10 @@
        NODE_INFO_PAR_LIFETIME
 } NodeParticleInfo;
 
+typedef enum NodeSmokeDensity {
+       NODE_INFO_SMO_DEN
+} NodeSmokeDensity;
+
 typedef enum NodeLightPath {
        NODE_LP_camera = 0,
        NODE_LP_shadow,

Modified: branches/smoke2/intern/cycles/render/nodes.cpp
===================================================================
--- branches/smoke2/intern/cycles/render/nodes.cpp      2012-07-25 21:06:13 UTC 
(rev 49229)
+++ branches/smoke2/intern/cycles/render/nodes.cpp      2012-07-25 22:01:59 UTC 
(rev 49230)
@@ -1834,6 +1834,38 @@
        compiler.add(this, "node_particle_info");
 }
 
+/* Smoke Density */
+
+SmokeDensityNode::SmokeDensityNode()
+: ShaderNode("particle_info")
+{
+       add_output("Density", SHADER_SOCKET_FLOAT);
+}
+
+void SmokeDensityNode::attributes(AttributeRequestSet *attributes)
+{
+       if(!output("Density")->links.empty())
+               attributes->add(ATTR_STD_SMOKE_DENSITY);
+
+       ShaderNode::attributes(attributes);
+}
+
+void SmokeDensityNode::compile(SVMCompiler& compiler)
+{
+       ShaderOutput *out;
+       
+       out = output("Density");
+       if(!out->links.empty()) {
+               compiler.stack_assign(out);
+               compiler.add_node(NODE_SMOKE_DENSITY, NODE_INFO_SMO_DEN, 
out->stack_offset);
+       }
+}
+
+void SmokeDensityNode::compile(OSLCompiler& compiler)
+{
+       compiler.add(this, "node_smoke_density");
+}
+
 /* Value */
 
 ValueNode::ValueNode()

Modified: branches/smoke2/intern/cycles/render/nodes.h
===================================================================
--- branches/smoke2/intern/cycles/render/nodes.h        2012-07-25 21:06:13 UTC 
(rev 49229)
+++ branches/smoke2/intern/cycles/render/nodes.h        2012-07-25 22:01:59 UTC 
(rev 49230)
@@ -296,6 +296,12 @@
        void attributes(AttributeRequestSet *attributes);
 };
 
+class SmokeDensityNode : public ShaderNode {
+public:
+       SHADER_NODE_CLASS(SmokeDensityNode)
+       void attributes(AttributeRequestSet *attributes);
+};
+
 class ValueNode : public ShaderNode {
 public:
        SHADER_NODE_CLASS(ValueNode)

Modified: branches/smoke2/intern/cycles/render/object.cpp
===================================================================
--- branches/smoke2/intern/cycles/render/object.cpp     2012-07-25 21:06:13 UTC 
(rev 49229)
+++ branches/smoke2/intern/cycles/render/object.cpp     2012-07-25 22:01:59 UTC 
(rev 49230)
@@ -280,6 +280,37 @@
        device->tex_alloc("__particles", dscene->particles);
 }
 
+void ObjectManager::device_update_smoke(Device *device, DeviceScene *dscene, 
Scene *scene, Progress& progress)
+{
+       /* count smoke cells.
+        * adds one dummy particle at the beginning to avoid invalid lookups,
+        * in case a shader uses particle info without actual particle data.
+        */
+       int num_cells = 1;
+       foreach(Object *ob, scene->objects)
+               num_cells += ob->grid.size();
+       
+       float *density = dscene->smoke_density.resize(num_cells);
+       
+       /* dummy particle */
+       // DG TODO density[0] = 0.0f;
+       
+       int i = 0;
+       foreach(Object *ob, scene->objects) {
+               /* pack in texture */
+               for(i = 0; i < ob->grid.size(); i++) {
+
+                       // DG TODO: use "*PARTICLE_SIZE"?
+                       density[i] = ob->grid[i];
+                       
+                       if(progress.get_cancel()) return;
+
+               }
+       }
+       
+       device->tex_alloc("__smoke_density", dscene->smoke_density);
+}
+
 void ObjectManager::device_update(Device *device, DeviceScene *dscene, Scene 
*scene, Progress& progress)
 {
        if(!need_update)
@@ -310,6 +341,11 @@
        
        if(progress.get_cancel()) return;
        
+       progress.set_status("Updating Objects", "Copying Smoke Density to 
device");
+       device_update_smoke(device, dscene, scene, progress);
+       
+       if(progress.get_cancel()) return;
+
        need_update = false;
 }
 

Modified: branches/smoke2/intern/cycles/render/object.h
===================================================================
--- branches/smoke2/intern/cycles/render/object.h       2012-07-25 21:06:13 UTC 
(rev 49229)
+++ branches/smoke2/intern/cycles/render/object.h       2012-07-25 22:01:59 UTC 
(rev 49230)
@@ -58,7 +58,6 @@
        vector<Particle> particles;
 
        /* Voxel / 3D volume data */
-       bool use_volume;
        int3 resolution;
        vector<float> grid;
 
@@ -83,6 +82,7 @@
        void device_update(Device *device, DeviceScene *dscene, Scene *scene, 
Progress& progress);
        void device_update_transforms(Device *device, DeviceScene *dscene, 
Scene *scene, Progress& progress);
        void device_update_particles(Device *device, DeviceScene *dscene, Scene 
*scene, Progress& progress);
+       void device_update_smoke(Device *device, DeviceScene *dscene, Scene 
*scene, Progress& progress);
        void device_free(Device *device, DeviceScene *dscene);
 

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to