From 8f1500da005e4f84fd593492822c6d99e768c354 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 18 Apr 2010 10:28:37 +0000 Subject: remove config.h references, was added for automake build system rev around 124-126 but isnt used by any build systems now. --- source/blender/blenkernel/intern/mball.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 98578312766..3acc46967be 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -62,10 +62,6 @@ #include "BKE_mball.h" #include "BKE_object.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* Global variables */ static float thresh= 0.6f; -- cgit v1.2.3 From 3262dfdadd352f27043f2ba13540c3fb45d3743a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 27 Jun 2010 08:35:27 +0000 Subject: Fix #22051: crash when scaling parent metaball Keep the constant resolution for any motherball's scale --- source/blender/blenkernel/intern/mball.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 3acc46967be..8d2dbf964b8 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -876,11 +876,11 @@ CORNER *setcorner (PROCESS* p, int i, int j, int k) c = (CORNER *) new_pgn_element(sizeof(CORNER)); c->i = i; - c->x = ((float)i-0.5f)*p->size; + c->x = ((float)i-0.5f)*p->size/p->scale[0]; c->j = j; - c->y = ((float)j-0.5f)*p->size; + c->y = ((float)j-0.5f)*p->size/p->scale[1]; c->k = k; - c->z = ((float)k-0.5f)*p->size; + c->z = ((float)k-0.5f)*p->size/p->scale[2]; c->value = p->function(c->x, c->y, c->z); c->next = p->corners[index]; @@ -1409,9 +1409,9 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a) workp_v = in_v; max_len = sqrt((out.x-in.x)*(out.x-in.x) + (out.y-in.y)*(out.y-in.y) + (out.z-in.z)*(out.z-in.z)); - nx = abs((out.x - in.x)/mbproc->size); - ny = abs((out.y - in.y)/mbproc->size); - nz = abs((out.z - in.z)/mbproc->size); + nx = abs((out.x - in.x)/mbproc->size*mbproc->scale[0]); + ny = abs((out.y - in.y)/mbproc->size*mbproc->scale[1]); + nz = abs((out.z - in.z)/mbproc->size*mbproc->scale[2]); MAXN = MAX3(nx,ny,nz); if(MAXN!=0.0f) { @@ -1430,9 +1430,9 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a) if((tmp_v<0.0 && workp_v>=0.0)||(tmp_v>0.0 && workp_v<=0.0)) { /* indexes of CUBE, which includes "first point" */ - c_i= (int)floor(workp.x/mbproc->size); - c_j= (int)floor(workp.y/mbproc->size); - c_k= (int)floor(workp.z/mbproc->size); + c_i= (int)floor(workp.x/mbproc->size*mbproc->scale[0]); + c_j= (int)floor(workp.y/mbproc->size*mbproc->scale[1]); + c_k= (int)floor(workp.z/mbproc->size*mbproc->scale[2]); /* add CUBE (with indexes c_i, c_j, c_k) to the stack, * this cube includes found point of Implicit Surface */ @@ -2082,13 +2082,16 @@ void metaball_polygonize(Scene *scene, Object *ob) DispList *dl; int a, nr_cubes; float *ve, *no, totsize, width; - + float smat[3][3]; + mb= ob->data; if(totelem==0) return; if(!(G.rendering) && (mb->flag==MB_UPDATE_NEVER)) return; if(G.moving && mb->flag==MB_UPDATE_FAST) return; + object_scale_to_mat3(ob, smat); + freedisplist(&ob->disp); curindex= totindex= 0; indices= 0; @@ -2130,6 +2133,7 @@ void metaball_polygonize(Scene *scene, Object *ob) width= mb->wiresize; if(G.moving && mb->flag==MB_UPDATE_HALFRES) width*= 2; } + /* nr_cubes is just for safety, minimum is totsize */ nr_cubes= (int)(0.5+totsize/width); @@ -2140,6 +2144,11 @@ void metaball_polygonize(Scene *scene, Object *ob) mbproc.cubes= 0; mbproc.delta = width/(float)(RES*RES); + /* to keep constant resolution for any motherball scale */ + mbproc.scale[0]= smat[0][0]; + mbproc.scale[1]= smat[1][1]; + mbproc.scale[2]= smat[2][2]; + polygonize(&mbproc, mb); MEM_freeN(mainb); -- cgit v1.2.3 From 650de24271501bddce1c0782ea071e9d8727101a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 27 Jun 2010 12:45:09 +0000 Subject: Recalculate motherball when metaball is deleting --- source/blender/blenkernel/intern/mball.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 8d2dbf964b8..a15dad16e41 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -275,6 +275,19 @@ int is_basis_mball(Object *ob) return 1; } +/* return nonzero if ob1 is a basis mball for ob */ +int is_mball_basis_for(Object *ob1, Object *ob2) +{ + int basis1nr, basis2nr; + char basis1name[32], basis2name[32]; + + splitIDname(ob1->id.name+2, basis1name, &basis1nr); + splitIDname(ob2->id.name+2, basis2name, &basis2nr); + + if(!strcmp(basis1name, basis2name)) return is_basis_mball(ob1); + else return 0; +} + /* \brief copy some properties from object to other metaball object with same base name * * When some properties (wiresize, threshold, update flags) of metaball are changed, then this properties -- cgit v1.2.3 From 8517a7a3cd93532ef1ff53ccbf07e8fc14a5109e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 28 Jun 2010 11:07:02 +0000 Subject: Fix #20965: metaballs partticles and volume material crash rendering Fix #21187: 2.5svn26947 - particles + meta sphere = crash in rendering Use separated displists for mballs in view3d and render stuff. Do not recalculate displist for view3d while rendering - mball.c uses several global variables which shouldn't be accepted from parallel threads. --- source/blender/blenkernel/intern/mball.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index a15dad16e41..da9740a1486 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -226,7 +226,7 @@ void tex_space_mball(Object *ob) boundbox_set_from_min_max(bb, min, max); } -float *make_orco_mball(Object *ob) +float *make_orco_mball(Object *ob, ListBase *dispbase) { BoundBox *bb; DispList *dl; @@ -243,7 +243,7 @@ float *make_orco_mball(Object *ob) loc[2]= (bb->vec[0][2]+bb->vec[1][2])/2.0f; size[2]= bb->vec[1][2]-loc[2]; - dl= ob->disp.first; + dl= dispbase->first; orcodata= MEM_mallocN(sizeof(float)*3*dl->nr, "MballOrco"); data= dl->verts; @@ -2088,7 +2088,7 @@ void init_metaball_octal_tree(int depth) subdivide_metaball_octal_node(node, size[0], size[1], size[2], metaball_tree->depth); } -void metaball_polygonize(Scene *scene, Object *ob) +void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) { PROCESS mbproc; MetaBall *mb; @@ -2105,7 +2105,6 @@ void metaball_polygonize(Scene *scene, Object *ob) object_scale_to_mat3(ob, smat); - freedisplist(&ob->disp); curindex= totindex= 0; indices= 0; thresh= mb->thresh; @@ -2174,9 +2173,8 @@ void metaball_polygonize(Scene *scene, Object *ob) } if(curindex) { - dl= MEM_callocN(sizeof(DispList), "mbaldisp"); - BLI_addtail(&ob->disp, dl); + BLI_addtail(dispbase, dl); dl->type= DL_INDEX4; dl->nr= mbproc.vertices.count; dl->parts= curindex; -- cgit v1.2.3 From 137e53064cf65b736347b75f2580d82fe63d17ca Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 6 Jul 2010 11:44:45 +0000 Subject: Revert revision 29735: Fix #22051: crash when scaling parent metaball. Keep the constant resolution for any motherball's scale. This avoids running out of memory when scaling the metaball down, but there's a reason it depends on this scaling, for example for instancing it's more useful to have this. It also doesn't really solve the problem but only moves it, it's still possible to run out of memory with different setups/scales. --- source/blender/blenkernel/intern/mball.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index da9740a1486..a97bec670d6 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -889,11 +889,11 @@ CORNER *setcorner (PROCESS* p, int i, int j, int k) c = (CORNER *) new_pgn_element(sizeof(CORNER)); c->i = i; - c->x = ((float)i-0.5f)*p->size/p->scale[0]; + c->x = ((float)i-0.5f)*p->size; c->j = j; - c->y = ((float)j-0.5f)*p->size/p->scale[1]; + c->y = ((float)j-0.5f)*p->size; c->k = k; - c->z = ((float)k-0.5f)*p->size/p->scale[2]; + c->z = ((float)k-0.5f)*p->size; c->value = p->function(c->x, c->y, c->z); c->next = p->corners[index]; @@ -1422,9 +1422,9 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a) workp_v = in_v; max_len = sqrt((out.x-in.x)*(out.x-in.x) + (out.y-in.y)*(out.y-in.y) + (out.z-in.z)*(out.z-in.z)); - nx = abs((out.x - in.x)/mbproc->size*mbproc->scale[0]); - ny = abs((out.y - in.y)/mbproc->size*mbproc->scale[1]); - nz = abs((out.z - in.z)/mbproc->size*mbproc->scale[2]); + nx = abs((out.x - in.x)/mbproc->size); + ny = abs((out.y - in.y)/mbproc->size); + nz = abs((out.z - in.z)/mbproc->size); MAXN = MAX3(nx,ny,nz); if(MAXN!=0.0f) { @@ -1443,9 +1443,9 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a) if((tmp_v<0.0 && workp_v>=0.0)||(tmp_v>0.0 && workp_v<=0.0)) { /* indexes of CUBE, which includes "first point" */ - c_i= (int)floor(workp.x/mbproc->size*mbproc->scale[0]); - c_j= (int)floor(workp.y/mbproc->size*mbproc->scale[1]); - c_k= (int)floor(workp.z/mbproc->size*mbproc->scale[2]); + c_i= (int)floor(workp.x/mbproc->size); + c_j= (int)floor(workp.y/mbproc->size); + c_k= (int)floor(workp.z/mbproc->size); /* add CUBE (with indexes c_i, c_j, c_k) to the stack, * this cube includes found point of Implicit Surface */ @@ -2095,7 +2095,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) DispList *dl; int a, nr_cubes; float *ve, *no, totsize, width; - float smat[3][3]; mb= ob->data; @@ -2103,8 +2102,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) if(!(G.rendering) && (mb->flag==MB_UPDATE_NEVER)) return; if(G.moving && mb->flag==MB_UPDATE_FAST) return; - object_scale_to_mat3(ob, smat); - curindex= totindex= 0; indices= 0; thresh= mb->thresh; @@ -2145,7 +2142,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) width= mb->wiresize; if(G.moving && mb->flag==MB_UPDATE_HALFRES) width*= 2; } - /* nr_cubes is just for safety, minimum is totsize */ nr_cubes= (int)(0.5+totsize/width); @@ -2156,11 +2152,6 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) mbproc.cubes= 0; mbproc.delta = width/(float)(RES*RES); - /* to keep constant resolution for any motherball scale */ - mbproc.scale[0]= smat[0][0]; - mbproc.scale[1]= smat[1][1]; - mbproc.scale[2]= smat[2][2]; - polygonize(&mbproc, mb); MEM_freeN(mainb); -- cgit v1.2.3 From c013974a7c2e0365f8884390002ba9b515a5edb2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 12 Jul 2010 08:43:49 +0000 Subject: set metaball limit for not drawing small scale motherballs to a 1/10th of what it was. durian blood splats were reaching this threshold. also fix for memory leaks when the motherball is too small. --- source/blender/blenkernel/intern/mball.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index a97bec670d6..c41dcfa9588 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -2125,13 +2125,22 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) if((totelem > 512) && (totelem <= 1024)) init_metaball_octal_tree(4); if(totelem > 1024) init_metaball_octal_tree(5); - /* don't polygonize metaballs with too high resolution (base mball to small) */ + /* don't polygonize metaballs with too high resolution (base mball to small) + * note: Eps was 0.0001f but this was giving problems for blood animation for durian, using 0.00001f */ if(metaball_tree) { - if(ob->size[0]<=0.0001f*(metaball_tree->first->x_max - metaball_tree->first->x_min) || - ob->size[1]<=0.0001f*(metaball_tree->first->y_max - metaball_tree->first->y_min) || - ob->size[2]<=0.0001f*(metaball_tree->first->z_max - metaball_tree->first->z_min)) + if( ob->size[0] <= 0.00001f * (metaball_tree->first->x_max - metaball_tree->first->x_min) || + ob->size[1] <= 0.00001f * (metaball_tree->first->y_max - metaball_tree->first->y_min) || + ob->size[2] <= 0.00001f * (metaball_tree->first->z_max - metaball_tree->first->z_min)) { + new_pgn_element(-1); /* free values created by init_meta */ + MEM_freeN(mainb); + + /* free tree */ + free_metaball_octal_node(metaball_tree->first); + MEM_freeN(metaball_tree); + metaball_tree= NULL; + return; } } -- cgit v1.2.3 From 8ee36e1da56b10a84e02ba9790fbcafbdbf43f51 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 13 Jul 2010 16:06:51 +0000 Subject: - fix for eternal loop with metaballs in set scenes. - next_object() now loops through all set scenes, not just the first one. - removed F_SET, rather them having a mode for looping on a set, just use the set when the first scene ends. - metaballs can now glob between scenes however there are still some depsgraph issues that existed before. --- source/blender/blenkernel/intern/mball.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index c41dcfa9588..e35d8bce886 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -296,6 +296,7 @@ int is_mball_basis_for(Object *ob1, Object *ob2) * because this metaball influence polygonisation of metaballs. */ void copy_mball_properties(Scene *scene, Object *active_object) { + Scene *sce_iter= scene; Base *base; Object *ob; MetaBall *active_mball = (MetaBall*)active_object->data; @@ -305,10 +306,10 @@ void copy_mball_properties(Scene *scene, Object *active_object) splitIDname(active_object->id.name+2, basisname, &basisnr); /* XXX recursion check, see scene.c, just too simple code this next_object() */ - if(F_ERROR==next_object(scene, 0, 0, 0)) + if(F_ERROR==next_object(&sce_iter, 0, 0, 0)) return; - while(next_object(scene, 1, &base, &ob)) { + while(next_object(&sce_iter, 1, &base, &ob)) { if (ob->type==OB_MBALL) { if(ob!=active_object){ splitIDname(ob->id.name+2, obname, &obnr); @@ -338,6 +339,7 @@ void copy_mball_properties(Scene *scene, Object *active_object) */ Object *find_basis_mball(Scene *scene, Object *basis) { + Scene *sce_iter= scene; Base *base; Object *ob,*bob= basis; MetaElem *ml=NULL; @@ -348,10 +350,10 @@ Object *find_basis_mball(Scene *scene, Object *basis) totelem= 0; /* XXX recursion check, see scene.c, just too simple code this next_object() */ - if(F_ERROR==next_object(scene, 0, 0, 0)) + if(F_ERROR==next_object(&sce_iter, 0, 0, 0)) return NULL; - while(next_object(scene, 1, &base, &ob)) { + while(next_object(&sce_iter, 1, &base, &ob)) { if (ob->type==OB_MBALL) { if(ob==bob){ @@ -1507,6 +1509,7 @@ void polygonize(PROCESS *mbproc, MetaBall *mb) float init_meta(Scene *scene, Object *ob) /* return totsize */ { + Scene *sce_iter= scene; Base *base; Object *bob; MetaBall *mb; @@ -1523,9 +1526,8 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */ splitIDname(ob->id.name+2, obname, &obnr); /* make main array */ - - next_object(scene, 0, 0, 0); - while(next_object(scene, 1, &base, &bob)) { + next_object(&sce_iter, 0, 0, 0); + while(next_object(&sce_iter, 1, &base, &bob)) { if(bob->type==OB_MBALL) { zero_size= 0; -- cgit v1.2.3 From 11228cb4031c8e0a324d2ffa4463e2fb272f517c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 23 Aug 2010 00:57:19 +0000 Subject: rna: move metaball.active_element to metaball.elements.active added rna funcs... elem = metaball.elements.new() metaball.elements.remove(elem) --- source/blender/blenkernel/intern/mball.c | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'source/blender/blenkernel/intern/mball.c') diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index e35d8bce886..e6f38e04d76 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -176,6 +176,55 @@ void make_local_mball(MetaBall *mb) } } } + +/* most simple meta-element adding function + * dont do context menipulation here (rna uses) */ +MetaElem *add_metaball_element(MetaBall *mb, const int type) +{ + MetaElem *ml= MEM_callocN(sizeof(MetaElem), "metaelem"); + + unit_qt(ml->quat); + + ml->rad= 2.0; + ml->s= 2.0; + ml->flag= MB_SCALE_RAD; + + switch(type) { + case MB_BALL: + ml->type = MB_BALL; + ml->expx= ml->expy= ml->expz= 1.0; + + break; + case MB_TUBE: + ml->type = MB_TUBE; + ml->expx= ml->expy= ml->expz= 1.0; + + break; + case MB_PLANE: + ml->type = MB_PLANE; + ml->expx= ml->expy= ml->expz= 1.0; + + break; + case MB_ELIPSOID: + ml->type = MB_ELIPSOID; + ml->expx= 1.2f; + ml->expy= 0.8f; + ml->expz= 1.0; + + break; + case MB_CUBE: + ml->type = MB_CUBE; + ml->expx= ml->expy= ml->expz= 1.0; + + break; + default: + break; + } + + BLI_addtail(&mb->elems, ml); + + return ml; +} /** Compute bounding box of all MetaElems/MetaBalls. * * Bounding box is computed from polygonized surface. Object *ob is -- cgit v1.2.3