[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15072] trunk/blender/source/blender/src/ fluidsim.c: bufgfix for [#13584] SIGSEV in fluid bake with large amount of small fluid objects
Campbell Barton
ideasman42 at gmail.com
Sat May 31 21:01:18 CEST 2008
Revision: 15072
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15072
Author: campbellbarton
Date: 2008-05-31 21:01:14 +0200 (Sat, 31 May 2008)
Log Message:
-----------
bufgfix for [#13584] SIGSEV in fluid bake with large amount of small fluid objects
the maximum number of objects (255) wasnt being checked, added a check before baking.
also changed bakeing to use G.scene->base rather then G.main->objects since these can be in other scenes, from linked
groups, or used only by python so they should not be used for baking. it also meant having a domain in 2 scenes would fail with an error.
Nils, could be good to have a dynamic number of bakeable objects.
Modified Paths:
--------------
trunk/blender/source/blender/src/fluidsim.c
Modified: trunk/blender/source/blender/src/fluidsim.c
===================================================================
--- trunk/blender/source/blender/src/fluidsim.c 2008-05-31 18:52:23 UTC (rev 15071)
+++ trunk/blender/source/blender/src/fluidsim.c 2008-05-31 19:01:14 UTC (rev 15072)
@@ -481,6 +481,7 @@
struct Object *fsDomain = NULL;
FluidsimSettings *domainSettings;
struct Object *obit = NULL; /* object iterator */
+ Base *base;
int origFrame = G.scene->r.cfra;
char debugStrBuffer[256];
int dirExist = 0;
@@ -522,7 +523,7 @@
float *channelObjMove[256][3]; // object movments , 0=trans, 1=rot, 2=scale
float *channelObjInivel[256]; // initial velocities
float *channelObjActive[256]; // obj active channel
-
+
if(getenv(strEnvName)) {
int dlevel = atoi(getenv(strEnvName));
elbeemSetDebugLevel(dlevel);
@@ -545,7 +546,6 @@
/* no object pointer, find in selected ones.. */
if(!ob) {
- Base *base;
for(base=G.scene->base.first; base; base= base->next) {
if ( ((base)->flag & SELECT)
// ignore layer setting for now? && ((base)->lay & G.vd->lay)
@@ -561,8 +561,26 @@
if(!ob) return;
}
+ channelObjCount = 0;
+ for(base=G.scene->base.first; base; base= base->next) {
+ obit = base->object;
+ //{ snprintf(debugStrBuffer,256,"DEBUG object name=%s, type=%d ...\n", obit->id.name, obit->type); elbeemDebugOut(debugStrBuffer); } // DEBUG
+ if( (obit->fluidsimFlag & OB_FLUIDSIM_ENABLE) &&
+ (obit->type==OB_MESH) &&
+ (obit->fluidsimSettings->type != OB_FLUIDSIM_DOMAIN) && // if has to match 3 places! // CHECKMATCH
+ (obit->fluidsimSettings->type != OB_FLUIDSIM_PARTICLE) ) {
+ channelObjCount++;
+ }
+ }
+
+ if (channelObjCount>=255) {
+ pupmenu("Fluidsim Bake Error%t|Cannot bake with more then 256 objects");
+ return;
+ }
+
/* check if there's another domain... */
- for(obit= G.main->object.first; obit; obit= obit->id.next) {
+ for(base=G.scene->base.first; base; base= base->next) {
+ obit = base->object;
if((obit->fluidsimFlag & OB_FLUIDSIM_ENABLE)&&(obit->type==OB_MESH)) {
if(obit->fluidsimSettings->type == OB_FLUIDSIM_DOMAIN) {
if(obit != ob) {
@@ -605,7 +623,8 @@
// check if theres any fluid
// abort baking if not...
- for(obit= G.main->object.first; obit; obit= obit->id.next) {
+ for(base=G.scene->base.first; base; base= base->next) {
+ obit = base->object;
if( (obit->fluidsimFlag & OB_FLUIDSIM_ENABLE) &&
(obit->type==OB_MESH) && (
(obit->fluidsimSettings->type == OB_FLUIDSIM_FLUID) ||
@@ -749,7 +768,8 @@
// init obj movement channels
channelObjCount=0;
- for(obit= G.main->object.first; obit; obit= obit->id.next) {
+ for(base=G.scene->base.first; base; base= base->next) {
+ obit = base->object;
//{ snprintf(debugStrBuffer,256,"DEBUG object name=%s, type=%d ...\n", obit->id.name, obit->type); elbeemDebugOut(debugStrBuffer); } // DEBUG
if( (obit->fluidsimFlag & OB_FLUIDSIM_ENABLE) &&
(obit->type==OB_MESH) &&
@@ -952,7 +972,8 @@
// init objects
channelObjCount = 0;
- for(obit= G.main->object.first; obit; obit= obit->id.next) {
+ for(base=G.scene->base.first; base; base= base->next) {
+ obit = base->object;
//{ snprintf(debugStrBuffer,256,"DEBUG object name=%s, type=%d ...\n", obit->id.name, obit->type); elbeemDebugOut(debugStrBuffer); } // DEBUG
if( (obit->fluidsimFlag & OB_FLUIDSIM_ENABLE) && // if has to match 3 places! // CHECKMATCH
(obit->type==OB_MESH) &&
More information about the Bf-blender-cvs
mailing list