diff options
Diffstat (limited to 'intern/cycles/render/object.cpp')
-rw-r--r-- | intern/cycles/render/object.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
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; } |