Cleanup: Return early in metaball tessellation code

Also declare variables where initialized and use const.
This commit is contained in:
Hans Goudey 2022-04-07 12:33:47 -05:00
parent a5beca7ba0
commit 46c54b12b0
1 changed files with 49 additions and 45 deletions

View File

@ -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) {
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);
/* add resulting surface to displist */
if (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 = MEM_callocN(sizeof(DispList), "mballdisp");
BLI_addtail(dispbase, dl);
dl->type = DL_INDEX4;
dl->nr = (int)process.curvertex;
dl->parts = (int)process.curindex;
dl->index = (int *)process.indices;
for (a = 0; a < process.curvertex; a++) {
normalize_v3(process.no[a]);
}
dl->verts = (float *)process.co;
dl->nors = (float *)process.no;
}
}
if (process.totelem == 0) {
freepolygonize(&process);
return;
}
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])) {
freepolygonize(&process);
return;
}
polygonize(&process);
if (process.curindex == 0) {
freepolygonize(&process);
return;
}
/* add resulting surface to displist */
/* 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]));
}
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;
dl->index = (int *)process.indices;
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);
}