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:
authorHans Goudey <h.goudey@me.com>2022-04-07 20:33:47 +0300
committerHans Goudey <h.goudey@me.com>2022-04-07 20:34:06 +0300
commit46c54b12b02d5b735df326ca9813bf35e94bdcf3 (patch)
tree793ab650e8bf4792c88e4776943b7e91652df657
parenta5beca7ba0daaca81805dbbf8857378a5bde6414 (diff)
Cleanup: Return early in metaball tessellation code
Also declare variables where initialized and use const.
-rw-r--r--source/blender/blenkernel/intern/mball_tessellate.c78
1 files 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);
}