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:
authorBastien Montagne <montagne29@wanadoo.fr>2016-01-17 00:37:34 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-01-17 00:45:04 +0300
commit143d423a191a575af76581df6d711c646ec7a4af (patch)
tree49d1bc306414a45ffbe5d70c8af1d00d919b9393
parentcdaf5ac96789f83eccdc26452c2e92edee602fa5 (diff)
Fix T47189: Large smoke simulation sometimes make Blender crash.
Issue was with very thin domains along one or two axes, these could lead to simulation with only one cell width - and smoke code assumes we have at least 4 cells in each direction. So now, we clamp resolution to a minimum of 4 in smoke_set_domain_from_derivedmesh(). Note: in extreme cases like this report, this will generate very un-cubic cells, check it still works OK in 3DView is needed here. Thanks to @genscher and @kevindietrich for help on this issue. :)
-rw-r--r--source/blender/blenkernel/intern/smoke.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index f5a6644e1bb..2d3fa2a3818 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -246,21 +246,21 @@ static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object *
scale = res / size[0];
sds->scale = size[0] / fabsf(ob->size[0]);
sds->base_res[0] = res;
- sds->base_res[1] = (int)(size[1] * scale + 0.5f);
- sds->base_res[2] = (int)(size[2] * scale + 0.5f);
+ sds->base_res[1] = max_ii((int)(size[1] * scale + 0.5f), 4);
+ sds->base_res[2] = max_ii((int)(size[2] * scale + 0.5f), 4);
}
else if (size[1] >= MAX2(size[0], size[2])) {
scale = res / size[1];
sds->scale = size[1] / fabsf(ob->size[1]);
- sds->base_res[0] = (int)(size[0] * scale + 0.5f);
+ sds->base_res[0] = max_ii((int)(size[0] * scale + 0.5f), 4);
sds->base_res[1] = res;
- sds->base_res[2] = (int)(size[2] * scale + 0.5f);
+ sds->base_res[2] = max_ii((int)(size[2] * scale + 0.5f), 4);
}
else {
scale = res / size[2];
sds->scale = size[2] / fabsf(ob->size[2]);
- sds->base_res[0] = (int)(size[0] * scale + 0.5f);
- sds->base_res[1] = (int)(size[1] * scale + 0.5f);
+ sds->base_res[0] = max_ii((int)(size[0] * scale + 0.5f), 4);
+ sds->base_res[1] = max_ii((int)(size[1] * scale + 0.5f), 4);
sds->base_res[2] = res;
}