[Bf-blender-cvs] [59f238ba091] blender2.8: Mesh Auto-Smooth Split Normal Support

Germano noreply at git.blender.org
Tue Oct 31 18:15:26 CET 2017


Commit: 59f238ba091187b968a125417cc9323cb9249deb
Author: Germano
Date:   Tue Oct 31 15:15:14 2017 -0200
Branches: blender2.8
https://developer.blender.org/rB59f238ba091187b968a125417cc9323cb9249deb

Mesh Auto-Smooth Split Normal Support

>From D2906 with few changes

===================================================================

M	source/blender/draw/intern/draw_cache_impl_mesh.c

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 33d7cab285f..615b79328b6 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -136,6 +136,7 @@ typedef struct MeshRenderData {
 	MDeformVert *dvert;
 	MLoopUV *mloopuv;
 	MLoopCol *mloopcol;
+	float (*loop_normals)[3];
 
 	/* CustomData 'cd' cache for efficient access. */
 	struct {
@@ -446,6 +447,10 @@ static MeshRenderData *mesh_render_data_create_ex(
 			BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, rdata->mlooptri);
 		}
 		if (types & MR_DATATYPE_LOOP) {
+			if (me->flag & ME_AUTOSMOOTH) {
+				BKE_mesh_calc_normals_split(me);
+				rdata->loop_normals = CustomData_get_layer(&me->ldata, CD_NORMAL);
+			}
 			rdata->loop_len = me->totloop;
 			rdata->mloop = CustomData_get_layer(&me->ldata, CD_MLOOP);
 		}
@@ -659,18 +664,17 @@ static MeshRenderData *mesh_render_data_create_ex(
 				BMEditMesh *em = rdata->edit_bmesh;
 				BMesh *bm = em->bm;
 
-				if (is_auto_smooth) {
+				if (is_auto_smooth && rdata->loop_normals == NULL) {
 					/* TODO: split normals, see below */
+					rdata->loop_normals = CustomData_get_layer(cd_ldata, CD_NORMAL);
 				}
 
 				bool calc_active_tangent = false;
-				float (*poly_normals)[3] = rdata->poly_normals;
-				float (*loop_normals)[3] = CustomData_get_layer(cd_ldata, CD_NORMAL);
 
 				BKE_editmesh_loop_tangent_calc(
 				        em, calc_active_tangent,
 				        tangent_names, actual_tangent_len,
-				        poly_normals, loop_normals,
+				        rdata->poly_normals, rdata->loop_normals,
 				        rdata->orco,
 				        &rdata->cd.output.ldata, bm->totloop,
 				        &rdata->cd.output.tangent_mask);
@@ -678,15 +682,14 @@ static MeshRenderData *mesh_render_data_create_ex(
 			else {
 #undef me
 
-				if (is_auto_smooth) {
+				if (is_auto_smooth && rdata->loop_normals == NULL) {
 					if (!CustomData_has_layer(cd_ldata, CD_NORMAL)) {
 						BKE_mesh_calc_normals_split(me);
 					}
+					rdata->loop_normals = CustomData_get_layer(cd_ldata, CD_NORMAL);
 				}
 
 				bool calc_active_tangent = false;
-				const float (*poly_normals)[3] = rdata->poly_normals;
-				const float (*loop_normals)[3] = CustomData_get_layer(cd_ldata, CD_NORMAL);
 
 				BKE_mesh_calc_loop_tangent_ex(
 				        me->mvert,
@@ -696,7 +699,7 @@ static MeshRenderData *mesh_render_data_create_ex(
 				        cd_ldata,
 				        calc_active_tangent,
 				        tangent_names, actual_tangent_len,
-				        poly_normals, loop_normals,
+				        rdata->poly_normals, rdata->loop_normals,
 				        rdata->orco,
 				        &rdata->cd.output.ldata, me->totloop,
 				        &rdata->cd.output.tangent_mask);
@@ -2018,9 +2021,11 @@ static Gwn_VertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
 			}
 		}
 		else {
-
-			/* Use normals from vertex */
-			mesh_render_data_ensure_poly_normals_pack(rdata);
+			float (*lnors)[3] = rdata->loop_normals;
+			if (lnors == NULL) {
+				/* Use normals from vertex. */
+				mesh_render_data_ensure_poly_normals_pack(rdata);
+			}
 
 			for (int i = 0; i < tri_len; i++) {
 				const MLoopTri *mlt = &rdata->mlooptri[i];
@@ -2036,7 +2041,13 @@ static Gwn_VertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
 					rdata->mloop[mlt->tri[2]].v,
 				};
 
-				if (mp->flag & ME_SMOOTH) {
+				if (lnors) {
+					for (uint t = 0; t < 3; t++) {
+						const float *nor = lnors[mlt->tri[t]];
+						*((Gwn_PackedNormal *)GWN_vertbuf_raw_step(&nor_step)) = GWN_normal_convert_i10_v3(nor);
+					}
+				}
+				else if (mp->flag & ME_SMOOTH) {
 					for (uint t = 0; t < 3; t++) {
 						const MVert *mv = &rdata->mvert[vtri[t]];
 						*((Gwn_PackedNormal *)GWN_vertbuf_raw_step(&nor_step)) = GWN_normal_convert_i10_s3(mv->no);



More information about the Bf-blender-cvs mailing list