[Bf-blender-cvs] [9340676] temp-derivedmesh-looptri: Refactor cdDM_buffer_copy_normal to avoid array allocation
Campbell Barton
noreply at git.blender.org
Thu Jul 16 16:52:14 CEST 2015
Commit: 934067619c96509732eee6f1ff65eb0d13b78892
Author: Campbell Barton
Date: Fri Jul 17 00:46:41 2015 +1000
Branches: temp-derivedmesh-looptri
https://developer.blender.org/rB934067619c96509732eee6f1ff65eb0d13b78892
Refactor cdDM_buffer_copy_normal to avoid array allocation
===================================================================
M source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index ae8308f..a26aa36 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -38,7 +38,6 @@
#include "BLI_edgehash.h"
#include "BLI_utildefines.h"
#include "BLI_stackdefines.h"
-#include "BLI_array.h"
#include "BKE_pbvh.h"
#include "BKE_cdderivedmesh.h"
@@ -1286,20 +1285,13 @@ static void cdDM_buffer_copy_normal(
int i, j, totpoly;
int start;
- const float **v_coords = NULL;
- BLI_array_staticdeclare(v_coords, BM_DEFAULT_NGON_STACK_SIZE);
-
const float (*nors)[3] = dm->getPolyDataArray(dm, CD_NORMAL);
const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL);
- const bool normal_loop_face = (nors || lnors) != 0;
-
const MVert *mvert;
const MPoly *mpoly;
const MLoop *mloop;
- short f_no_s[3];
-
mvert = dm->getVertArray(dm);
mpoly = dm->getPolyArray(dm);
mloop = dm->getLoopArray(dm);
@@ -1309,44 +1301,36 @@ static void cdDM_buffer_copy_normal(
for (i = 0; i < totpoly; i++, mpoly++) {
const bool smoothnormal = (mpoly->flag & ME_SMOOTH) != 0;
- /* if needed calculate the face normal now */
- if (!(normal_loop_face || smoothnormal)) {
- /* calculate face normal */
- float f_no[3];
-
- for (j = 0; j < mpoly->totloop; j++)
- BLI_array_append(v_coords, mvert[mloop[mpoly->loopstart + j].v].co);
- normal_poly_v3(f_no, (const float (*)[3]) v_coords, mpoly->totloop);
-
- normal_float_to_short_v3(f_no_s, f_no);
- BLI_array_empty(v_coords);
- }
-
- for (j = 0; j < mpoly->totloop; j++) {
- if (lnors) {
- /* Copy loop normals */
+ if (lnors) {
+ /* Copy loop normals */
+ for (j = 0; j < mpoly->totloop; j++, start += 4) {
normal_float_to_short_v3(&varray[start], lnors[mpoly->loopstart + j]);
}
- else if (smoothnormal) {
- /* copy vertex normal */
+ }
+ else if (smoothnormal) {
+ /* Copy vertex normal */
+ for (j = 0; j < mpoly->totloop; j++, start += 4) {
copy_v3_v3_short(&varray[start], mvert[mloop[mpoly->loopstart + j].v].no);
}
- else if (nors) {
- /* copy cached face normal */
- short f_no_s[3];
+ }
+ else {
+ /* Copy cached face normal */
+ short f_no_s[3];
+ if (nors) {
normal_float_to_short_v3(f_no_s, nors[i]);
-
- copy_v3_v3_short(&varray[start], f_no_s);
}
else {
+ float f_no[3];
+ BKE_mesh_calc_poly_normal(mpoly, &mloop[mpoly->loopstart], mvert, f_no);
+ normal_float_to_short_v3(f_no_s, f_no);
+ }
+
+ for (j = 0; j < mpoly->totloop; j++, start += 4) {
copy_v3_v3_short(&varray[start], f_no_s);
}
- start += 4;
}
}
-
- BLI_array_free(v_coords);
}
static void cdDM_buffer_copy_uv(
More information about the Bf-blender-cvs
mailing list