Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/render/object.cpp')
-rw-r--r--intern/cycles/render/object.cpp36
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;
}