diff options
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/blender/blender_object.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/blender/blender_smoke.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/blender/blender_sync.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_object.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_textures.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_geometry.h | 17 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 7 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 32 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 6 | ||||
-rw-r--r-- | intern/cycles/render/object.cpp | 36 | ||||
-rw-r--r-- | intern/cycles/render/object.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/scene.h | 3 |
14 files changed, 122 insertions, 10 deletions
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index 3ae7cfc3524..26c0881aa16 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -255,7 +255,6 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, 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 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, 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); } diff --git a/intern/cycles/blender/blender_smoke.cpp b/intern/cycles/blender/blender_smoke.cpp index 742b488aa5a..e59d9bea01d 100644 --- a/intern/cycles/blender/blender_smoke.cpp +++ b/intern/cycles/blender/blender_smoke.cpp @@ -33,7 +33,7 @@ CCL_NAMESPACE_BEGIN /* 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 @@ bool BlenderSync::BKE_modifiers_isSmokeEnabled(BL::Object b_ob) 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); + } } } } diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h index 0ecd60c4dc0..f3fc318f8f9 100644 --- a/intern/cycles/blender/blender_sync.h +++ b/intern/cycles/blender/blender_sync.h @@ -91,7 +91,7 @@ private: /* 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); diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h index 18e0b1e8a87..51cf8fc73a6 100644 --- a/intern/cycles/kernel/kernel_object.h +++ b/intern/cycles/kernel/kernel_object.h @@ -183,6 +183,12 @@ __device float particle_lifetime(KernelGlobals *kg, int particle) 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 diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h index c1b8eed3dff..196dbdc9d60 100644 --- a/intern/cycles/kernel/kernel_textures.h +++ b/intern/cycles/kernel/kernel_textures.h @@ -55,6 +55,9 @@ KERNEL_TEX(float2, texture_float2, __light_background_conditional_cdf) /* 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) diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index d204b114b8e..1b5281ed486 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -361,6 +361,7 @@ typedef enum AttributeStandard { ATTR_STD_MOTION_PRE, ATTR_STD_MOTION_POST, ATTR_STD_PARTICLE, + ATTR_STD_SMOKE_DENSITY, ATTR_STD_NUM, ATTR_STD_NOT_FOUND = ~0 diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 8901e5e9628..1ee5ed21fc7 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -272,6 +272,9 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT 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); diff --git a/intern/cycles/kernel/svm/svm_geometry.h b/intern/cycles/kernel/svm/svm_geometry.h index 88127b56474..dc7f6414053 100644 --- a/intern/cycles/kernel/svm/svm_geometry.h +++ b/intern/cycles/kernel/svm/svm_geometry.h @@ -116,5 +116,22 @@ __device void svm_node_particle_info(KernelGlobals *kg, ShaderData *sd, float *s } } + +/* 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 diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index c1eeeb55268..fe8a9269a2f 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -89,7 +89,8 @@ typedef enum NodeType { 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 @@ typedef enum NodeParticleInfo { NODE_INFO_PAR_LIFETIME } NodeParticleInfo; +typedef enum NodeSmokeDensity { + NODE_INFO_SMO_DEN +} NodeSmokeDensity; + typedef enum NodeLightPath { NODE_LP_camera = 0, NODE_LP_shadow, diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index e4a4b874964..d48348d3f8c 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1834,6 +1834,38 @@ void ParticleInfoNode::compile(OSLCompiler& compiler) 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() diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index efd814e4ae6..f07ab9b3e33 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -296,6 +296,12 @@ public: 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) diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 478d8d9eadc..65dfa4cae50 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -280,6 +280,37 @@ void ObjectManager::device_update_particles(Device *device, DeviceScene *dscene, 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 @@ void ObjectManager::device_update(Device *device, DeviceScene *dscene, Scene *sc 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; } diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h index 0a4ad8d8d07..d4bb3039abb 100644 --- a/intern/cycles/render/object.h +++ b/intern/cycles/render/object.h @@ -58,7 +58,6 @@ public: vector<Particle> particles; /* Voxel / 3D volume data */ - bool use_volume; int3 resolution; vector<float> grid; @@ -83,6 +82,7 @@ public: 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); void tag_update(Scene *scene); diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index 8b9944cb76e..0cd94dd1e65 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -85,6 +85,9 @@ public: /* particles */ device_vector<float4> particles; + /* smoke */ + device_vector<float> smoke_density; + /* shaders */ device_vector<uint4> svm_nodes; device_vector<uint> shader_flag; |