forked from bartvdbraak/blender
small improvement to previous commit, use pre-calculated ngon normal to avoid calculating twice when dupli-scale is enabled.
This commit is contained in:
parent
b0bf816ece
commit
9d0875828e
@ -98,7 +98,7 @@ void BKE_mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart,
|
|||||||
struct MVert *mvarray, float cent[3]);
|
struct MVert *mvarray, float cent[3]);
|
||||||
|
|
||||||
float BKE_mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart,
|
float BKE_mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart,
|
||||||
struct MVert *mvarray, float polynormal[3]);
|
struct MVert *mvarray, const float polynormal[3]);
|
||||||
|
|
||||||
/* Find the index of the loop in 'poly' which references vertex,
|
/* Find the index of the loop in 'poly' which references vertex,
|
||||||
* returns -1 if not found */
|
* returns -1 if not found */
|
||||||
|
@ -1171,7 +1171,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa
|
|||||||
|
|
||||||
/* scale */
|
/* scale */
|
||||||
if (par->transflag & OB_DUPLIFACES_SCALE) {
|
if (par->transflag & OB_DUPLIFACES_SCALE) {
|
||||||
float size = BKE_mesh_calc_poly_area(mp, loopstart, mvert, NULL);
|
float size = BKE_mesh_calc_poly_area(mp, loopstart, mvert, f_no);
|
||||||
size = sqrtf(size) * par->dupfacesca;
|
size = sqrtf(size) * par->dupfacesca;
|
||||||
mul_m3_fl(mat, size);
|
mul_m3_fl(mat, size);
|
||||||
}
|
}
|
||||||
|
@ -3016,7 +3016,7 @@ void BKE_mesh_calc_poly_center(MPoly *mpoly, MLoop *loopstart,
|
|||||||
|
|
||||||
/* note, passing polynormal is only a speedup so we can skip calculating it */
|
/* note, passing polynormal is only a speedup so we can skip calculating it */
|
||||||
float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart,
|
float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart,
|
||||||
MVert *mvarray, float polynormal[3])
|
MVert *mvarray, const float polynormal[3])
|
||||||
{
|
{
|
||||||
if (mpoly->totloop == 3) {
|
if (mpoly->totloop == 3) {
|
||||||
return area_tri_v3(mvarray[loopstart[0].v].co,
|
return area_tri_v3(mvarray[loopstart[0].v].co,
|
||||||
@ -3035,7 +3035,7 @@ float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart,
|
|||||||
int i;
|
int i;
|
||||||
MLoop *l_iter = loopstart;
|
MLoop *l_iter = loopstart;
|
||||||
float area, polynorm_local[3], (*vertexcos)[3];
|
float area, polynorm_local[3], (*vertexcos)[3];
|
||||||
float *no = polynormal ? polynormal : polynorm_local;
|
const float *no = polynormal ? polynormal : polynorm_local;
|
||||||
BLI_array_fixedstack_declare(vertexcos, BM_NGON_STACK_SIZE, mpoly->totloop, __func__);
|
BLI_array_fixedstack_declare(vertexcos, BM_NGON_STACK_SIZE, mpoly->totloop, __func__);
|
||||||
|
|
||||||
/* pack vertex cos into an array for area_poly_v3 */
|
/* pack vertex cos into an array for area_poly_v3 */
|
||||||
@ -3045,7 +3045,7 @@ float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart,
|
|||||||
|
|
||||||
/* need normal for area_poly_v3 as well */
|
/* need normal for area_poly_v3 as well */
|
||||||
if (polynormal == NULL) {
|
if (polynormal == NULL) {
|
||||||
BKE_mesh_calc_poly_normal(mpoly, loopstart, mvarray, no);
|
BKE_mesh_calc_poly_normal(mpoly, loopstart, mvarray, polynorm_local);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finally calculate the area */
|
/* finally calculate the area */
|
||||||
|
Loading…
Reference in New Issue
Block a user