From 46c54b12b02d5b735df326ca9813bf35e94bdcf3 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 7 Apr 2022 12:33:47 -0500 Subject: Cleanup: Return early in metaball tessellation code Also declare variables where initialized and use const. --- .../blender/blenkernel/intern/mball_tessellate.c | 78 ++++++++++++---------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/source/blender/blenkernel/intern/mball_tessellate.c b/source/blender/blenkernel/intern/mball_tessellate.c index b3e6a854811..54def0189b1 100644 --- a/source/blender/blenkernel/intern/mball_tessellate.c +++ b/source/blender/blenkernel/intern/mball_tessellate.c @@ -1373,13 +1373,10 @@ static void init_meta(Depsgraph *depsgraph, PROCESS *process, Scene *scene, Obje void BKE_mball_polygonize(Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *dispbase) { - MetaBall *mb; - DispList *dl; - unsigned int a; PROCESS process = {0}; - bool is_render = DEG_get_mode(depsgraph) == DAG_EVAL_RENDER; + const bool is_render = DEG_get_mode(depsgraph) == DAG_EVAL_RENDER; - mb = ob->data; + MetaBall *mb = ob->data; process.thresh = mb->thresh; @@ -1419,47 +1416,54 @@ void BKE_mball_polygonize(Depsgraph *depsgraph, Scene *scene, Object *ob, ListBa /* initialize all mainb (MetaElems) */ init_meta(depsgraph, &process, scene, ob); + if (process.totelem == 0) { + freepolygonize(&process); + return; + } - if (process.totelem > 0) { - build_bvh_spatial(&process, &process.metaball_bvh, 0, process.totelem, &process.allbb); + build_bvh_spatial(&process, &process.metaball_bvh, 0, process.totelem, &process.allbb); - /* Don't polygonize meta-balls with too high resolution (base mball too small) - * NOTE: Eps was 0.0001f but this was giving problems for blood animation for - * the open movie "Sintel", using 0.00001f. */ - if (ob->scale[0] > 0.00001f * (process.allbb.max[0] - process.allbb.min[0]) || - ob->scale[1] > 0.00001f * (process.allbb.max[1] - process.allbb.min[1]) || - ob->scale[2] > 0.00001f * (process.allbb.max[2] - process.allbb.min[2])) { - polygonize(&process); + /* Don't polygonize meta-balls with too high resolution (base mball too small) + * NOTE: Eps was 0.0001f but this was giving problems for blood animation for + * the open movie "Sintel", using 0.00001f. */ + if (ob->scale[0] < 0.00001f * (process.allbb.max[0] - process.allbb.min[0]) || + ob->scale[1] < 0.00001f * (process.allbb.max[1] - process.allbb.min[1]) || + ob->scale[2] < 0.00001f * (process.allbb.max[2] - process.allbb.min[2])) { + freepolygonize(&process); + return; + } - /* add resulting surface to displist */ - if (process.curindex) { + polygonize(&process); + if (process.curindex == 0) { + freepolygonize(&process); + return; + } - /* Avoid over-allocation since this is stored in the displist. */ - if (process.curindex != process.totindex) { - process.indices = MEM_reallocN(process.indices, sizeof(int[4]) * process.curindex); - } - if (process.curvertex != process.totvertex) { - process.co = MEM_reallocN(process.co, process.curvertex * sizeof(float[3])); - process.no = MEM_reallocN(process.no, process.curvertex * sizeof(float[3])); - } + /* add resulting surface to displist */ - dl = MEM_callocN(sizeof(DispList), "mballdisp"); - BLI_addtail(dispbase, dl); - dl->type = DL_INDEX4; - dl->nr = (int)process.curvertex; - dl->parts = (int)process.curindex; + /* Avoid over-allocation since this is stored in the displist. */ + if (process.curindex != process.totindex) { + process.indices = MEM_reallocN(process.indices, sizeof(int[4]) * process.curindex); + } + if (process.curvertex != process.totvertex) { + process.co = MEM_reallocN(process.co, process.curvertex * sizeof(float[3])); + process.no = MEM_reallocN(process.no, process.curvertex * sizeof(float[3])); + } - dl->index = (int *)process.indices; + DispList *dl = MEM_callocN(sizeof(DispList), "mballdisp"); + BLI_addtail(dispbase, dl); + dl->type = DL_INDEX4; + dl->nr = (int)process.curvertex; + dl->parts = (int)process.curindex; - for (a = 0; a < process.curvertex; a++) { - normalize_v3(process.no[a]); - } + dl->index = (int *)process.indices; - dl->verts = (float *)process.co; - dl->nors = (float *)process.no; - } - } + for (uint a = 0; a < process.curvertex; a++) { + normalize_v3(process.no[a]); } + dl->verts = (float *)process.co; + dl->nors = (float *)process.no; + freepolygonize(&process); } -- cgit v1.2.3