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:
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c13
-rw-r--r--source/blender/blenkernel/intern/pbvh.c24
2 files changed, 19 insertions, 18 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index dde04104654..19c4e66f7eb 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -450,6 +450,8 @@ static void cdDM_drawFacesSolid(
if (BKE_pbvh_has_faces(cddm->pbvh)) {
float (*face_nors)[3] = CustomData_get_layer(&dm->faceData, CD_NORMAL);
+ cdDM_update_normals_from_pbvh(dm);
+
BKE_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors,
setMaterial, false, false);
glShadeModel(GL_FLAT);
@@ -505,6 +507,7 @@ static void cdDM_drawFacesTex_common(
*/
if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) {
if (BKE_pbvh_has_faces(cddm->pbvh)) {
+ cdDM_update_normals_from_pbvh(dm);
GPU_set_tpage(NULL, false, false);
BKE_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, false, false);
}
@@ -523,8 +526,6 @@ static void cdDM_drawFacesTex_common(
mloopcol = dm->getLoopDataArray(dm, colType);
}
- cdDM_update_normals_from_pbvh(dm);
-
GPU_vertex_setup(dm);
GPU_normal_setup(dm);
GPU_triangle_setup(dm);
@@ -700,8 +701,6 @@ static void cdDM_drawMappedFaces(
}
}
else {
- cdDM_update_normals_from_pbvh(dm);
-
GPU_normal_setup(dm);
if (useColors) {
@@ -880,6 +879,7 @@ static void cdDM_drawMappedFacesGLSL(
*/
if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) {
if (BKE_pbvh_has_faces(cddm->pbvh)) {
+ cdDM_update_normals_from_pbvh(dm);
setMaterial(1, &gattribs);
BKE_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, false, false);
}
@@ -887,8 +887,6 @@ static void cdDM_drawMappedFacesGLSL(
return;
}
- cdDM_update_normals_from_pbvh(dm);
-
matnr = -1;
do_draw = false;
@@ -1149,10 +1147,9 @@ static void cdDM_drawMappedFacesMat(
* works fine for matcap
*/
- cdDM_update_normals_from_pbvh(dm);
-
if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) {
if (BKE_pbvh_has_faces(cddm->pbvh)) {
+ cdDM_update_normals_from_pbvh(dm);
setMaterial(userData, 1, &gattribs);
BKE_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, false, false);
}
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index e6579a3d56f..311e928c348 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -44,6 +44,8 @@
#include "pbvh_intern.h"
+#include <limits.h>
+
#define LEAF_LIMIT 10000
//#define PERFCNTRS
@@ -986,6 +988,8 @@ static void pbvh_update_normals(PBVH *bvh, PBVHNode **nodes,
if ((node->flag & PBVH_UpdateNormals)) {
int i, j, totface, *faces;
+ unsigned int mpoly_prev = UINT_MAX;
+ float fn[3];
faces = node->prim_indices;
totface = node->totprim;
@@ -997,14 +1001,18 @@ static void pbvh_update_normals(PBVH *bvh, PBVHNode **nodes,
bvh->mloop[lt->tri[1]].v,
bvh->mloop[lt->tri[2]].v,
};
- float fn[3];
const int sides = 3;
- normal_tri_v3(
- fn,
- bvh->verts[vtri[0]].co,
- bvh->verts[vtri[1]].co,
- bvh->verts[vtri[2]].co);
+ /* Face normal and mask */
+ if (lt->poly != mpoly_prev) {
+ const MPoly *mp = &bvh->mpoly[lt->poly];
+ BKE_mesh_calc_poly_normal(mp, &bvh->mloop[mp->loopstart], bvh->verts, fn);
+ mpoly_prev = lt->poly;
+
+ if (face_nors) {
+ copy_v3_v3(face_nors[lt->poly], fn);
+ }
+ }
for (j = 0; j < sides; ++j) {
int v = vtri[j];
@@ -1020,10 +1028,6 @@ static void pbvh_update_normals(PBVH *bvh, PBVHNode **nodes,
vnor[v][2] += fn[2];
}
}
-
- if (face_nors) {
- copy_v3_v3(face_nors[lt->poly], fn);
- }
}
}
}