[Bf-blender-cvs] [a482385] temp_custom_loop_normals: Switch clnors data from float[2] to short[2].

Bastien Montagne noreply at git.blender.org
Thu Aug 7 19:42:43 CEST 2014


Commit: a4823853542897fc0a0d074f417183ed4b43f157
Author: Bastien Montagne
Date:   Thu Aug 7 19:22:32 2014 +0200
Branches: temp_custom_loop_normals
https://developer.blender.org/rBa4823853542897fc0a0d074f417183ed4b43f157

Switch clnors data from float[2] to short[2].

Suggested by Campbell, saves memory and does not make things slower (perhaps even slightly faster),
even though it asks for a few more operations...

Note the way alpha factor is handled is a bit different now, since with shorts it's simpler to
always keep factor-like value in the 'virtual' [-1, 1] (real [-SHRT_MAX, SHRT_MAX]) range.

Code is a bit more verbose, since we do not have much math helpers for short 2d vectors,
but this is a detail that can be solved later.

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/editderivedmesh.c
M	source/blender/blenkernel/intern/mesh_evaluate.c
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/bmesh/intern/bmesh_mesh.h

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 7fff22b..73751b2 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -202,12 +202,13 @@ typedef struct MLoopsNorSpaces {
 void BKE_init_loops_normal_spaces(MLoopsNorSpaces *lnors_spaces, const int numLoops);
 void BKE_free_loops_normal_spaces(MLoopsNorSpaces *lnors_spaces);
 MLoopNorSpace *BKE_lnor_space_create(MLoopsNorSpaces *lnors_spaces);
-void BKE_lnor_space_define(MLoopNorSpace *lnor_space, const float lnor[3], float vec_ref[3], float vec_other[3],
-                           struct BLI_Stack *edge_vectors);
-void BKE_lnor_space_add_loop(MLoopsNorSpaces *lnors_spaces, MLoopNorSpace *lnor_space, const int ml_index,
-                             const bool add_to_list);
-void BKE_lnor_space_custom_data_to_normal(MLoopNorSpace *lnor_space, float r_custom_lnor[3], const float clnor_data[2]);
-void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float custom_lnor[3], float r_clnor_data[2]);
+void BKE_lnor_space_define(
+        MLoopNorSpace *lnor_space, const float lnor[3], float vec_ref[3], float vec_other[3],
+        struct BLI_Stack *edge_vectors);
+void BKE_lnor_space_add_loop(
+        MLoopsNorSpaces *lnors_spaces, MLoopNorSpace *lnor_space, const int ml_index, const bool add_to_list);
+void BKE_lnor_space_custom_data_to_normal(MLoopNorSpace *lnor_space, float r_custom_lnor[3], const short clnor_data[2]);
+void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float custom_lnor[3], short r_clnor_data[2]);
 
 bool BKE_mesh_has_custom_loop_normals(struct Mesh *me);
 
@@ -215,16 +216,16 @@ void BKE_mesh_normals_loop_split(
         struct MVert *mverts, const int numVerts, struct MEdge *medges, const int numEdges,
         struct MLoop *mloops, float (*r_loopnors)[3], const int numLoops,
         struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, float split_angle,
-        MLoopsNorSpaces *r_lnors_spaces, float (*clnors_data)[2], int *r_loop_to_poly);
+        MLoopsNorSpaces *r_lnors_spaces, short (*clnors_data)[2], int *r_loop_to_poly);
 
 void BKE_mesh_normals_loop_custom_set(
         struct MVert *mverts, const int numVerts, struct MEdge *medges, const int numEdges,
         struct MLoop *mloops, float (*custom_loopnors)[3], const float *custom_loopnors_facs, const int numLoops,
-        struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, float (*r_clnors_data)[2]);
+        struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, short (*r_clnors_data)[2]);
 void BKE_mesh_normals_loop_custom_from_vertices_set(
         struct MVert *mverts, float (*custom_vertnors)[3], const float *custom_vertnors_facs, const int numVerts,
         struct MEdge *medges, const int numEdges, struct MLoop *mloops, const int numLoops,
-        struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, float (*r_clnors_data)[2]);
+        struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, short (*r_clnors_data)[2]);
 
 void BKE_mesh_calc_poly_normal(
         struct MPoly *mpoly, struct MLoop *loopstart,
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index ffa04be..4b8925e 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -2551,7 +2551,7 @@ void CDDM_calc_loop_normals_spaces(DerivedMesh *dm, const float split_angle, MLo
 	dm->dirty &= ~DM_DIRTY_NORMALS;
 
 	{
-		float (*clnor_data)[2] = CustomData_get_layer(ldata, CD_CUSTOMLOOPNORMAL);
+		short (*clnor_data)[2] = CustomData_get_layer(ldata, CD_CUSTOMLOOPNORMAL);
 
 		BKE_mesh_normals_loop_split(mverts, numVerts, medges, numEdges, mloops, lnors, numLoops,
 		                            mpolys, (const float (*)[3])pnors, numPolys, split_angle,
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index e0116da..d28f731 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1078,12 +1078,12 @@ static void layerInterp_clnor(void **UNUSED(sources), const float *UNUSED(weight
 	 * would also imply we check all new custom normals are coherent (all loops of a same vert/same smooth fan
 	 * *must* have the same custom normal!!!).
 	 */
-	zero_v2((float *)dest);
+	fill_vn_short((short *)dest, 2, 0);
 }
 
 static void layerDefault_clnor(void *data, int count)
 {
-	fill_vn_fl((float *)data, count * 2, 0.0f);
+	fill_vn_short((short *)data, count * 2, 0);
 }
 
 static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
@@ -1200,7 +1200,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
 	/* 40: CD_TESSLOOPNORMAL */
 	{sizeof(short[4][3]), "", 0, NULL, NULL, NULL, NULL, layerSwap_flnor, NULL},
 	/* 41: CD_CUSTOMLOOPNORMAL */
-	{sizeof(float[2]), "vec2f", 1, NULL, NULL, NULL, layerInterp_clnor, NULL, layerDefault_clnor},
+	{sizeof(short[2]), "vec2f", 1, NULL, NULL, NULL, layerInterp_clnor, NULL, layerDefault_clnor},
 };
 
 /* note, numbers are from trunk and need updating for bmesh */
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index fb8bd22..41d1667 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -203,7 +203,7 @@ static void emDM_calcLoopNormalsSpaces(DerivedMesh *dm, const float split_angle,
 
 	{
 		/* We can have both, give priority to dm's data, and fallback to bm's ones. */
-		float (*clnors_data)[2] = dm->getLoopDataArray(dm, CD_CUSTOMLOOPNORMAL);
+		short (*clnors_data)[2] = dm->getLoopDataArray(dm, CD_CUSTOMLOOPNORMAL);
 		const int cd_loop_clnors_offset = clnors_data ? -1 : CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
 
 		BM_loops_calc_normal_vcos(bm, vertexCos, vertexNos, polyNos, split_angle, loopNos,
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c
index 0e5c69a..82a4e84 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.c
+++ b/source/blender/blenkernel/intern/mesh_evaluate.c
@@ -57,7 +57,7 @@
 
 #include "mikktspace.h"
 
-// #define DEBUG_TIME
+#define DEBUG_TIME
 
 #ifdef DEBUG_TIME
 #  include "PIL_time.h"
@@ -405,10 +405,10 @@ void BKE_lnor_space_add_loop(MLoopsNorSpaces *lnors_spaces, MLoopNorSpace *lnor_
 	}
 }
 
-void BKE_lnor_space_custom_data_to_normal(MLoopNorSpace *lnor_space, float r_custom_lnor[3], const float clnor_data[2])
+void BKE_lnor_space_custom_data_to_normal(MLoopNorSpace *lnor_space, float r_custom_lnor[3], const short clnor_data[2])
 {
 	/* NOP custom normal data or invalid lnor space, return. */
-	if (clnor_data[0] == 0.0f || lnor_space->ref_alpha == 0.0f || lnor_space->ref_beta == 0.0f) {
+	if (clnor_data[0] == 0 || lnor_space->ref_alpha == 0.0f || lnor_space->ref_beta == 0.0f) {
 		copy_v3_v3(r_custom_lnor, lnor_space->vec_lnor);
 		return;
 	}
@@ -416,8 +416,9 @@ void BKE_lnor_space_custom_data_to_normal(MLoopNorSpace *lnor_space, float r_cus
 	{
 		/* TODO Check whether using sincosf() gives any noticeable benefit! */
 		const float pi2 = (float)M_PI * 2.0f;
-		const float alpha = lnor_space->ref_alpha * clnor_data[0];
-		const float betafac = clnor_data[1];
+		const float alphafac = (float)clnor_data[0] / (float)SHRT_MAX;
+		const float alpha = (alphafac > 0.0f ? lnor_space->ref_alpha : pi2 - lnor_space->ref_alpha) * alphafac;
+		const float betafac = (float)clnor_data[1] / (float)SHRT_MAX;
 
 		mul_v3_v3fl(r_custom_lnor, lnor_space->vec_lnor, cosf(alpha));
 
@@ -433,11 +434,11 @@ void BKE_lnor_space_custom_data_to_normal(MLoopNorSpace *lnor_space, float r_cus
 	}
 }
 
-void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float custom_lnor[3], float r_clnor_data[2])
+void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float custom_lnor[3], short r_clnor_data[2])
 {
 	/* We use null vector as NOP custom normal (can be simpler than giving autocomputed lnor...). */
 	if (is_zero_v3(custom_lnor) || equals_v3v3(lnor_space->vec_lnor, custom_lnor)) {
-		zero_v2(r_clnor_data);
+		r_clnor_data[0] = r_clnor_data[1] = 0;
 		return;
 	}
 
@@ -445,8 +446,16 @@ void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float
 		const float pi2 = (float)M_PI * 2.0f;
 		const float cos_alpha = dot_v3v3(lnor_space->vec_lnor, custom_lnor);
 		float vec[3], cos_beta;
+		float alpha;
 
-		r_clnor_data[0] = saacosf(cos_alpha) / lnor_space->ref_alpha;
+		alpha = saacosf(cos_alpha);
+		if (alpha > lnor_space->ref_alpha) {
+			/* Note we could stick to [0, pi] range here, but makes decoding more complex, not worth it. */
+			r_clnor_data[0] = (short)(-(pi2 - alpha) / (pi2 - lnor_space->ref_alpha) * (float)SHRT_MAX);
+		}
+		else {
+			r_clnor_data[0] = (short)(alpha / lnor_space->ref_alpha * (float)SHRT_MAX);
+		}
 
 		/* Project custom lnor on (vec_ref, vec_ortho) plane. */
 		mul_v3_v3fl(vec, lnor_space->vec_lnor, -cos_alpha);
@@ -456,7 +465,7 @@ void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float
 		cos_beta = dot_v3v3(lnor_space->vec_ref, vec);
 
 		if (cos_beta > (1.0f - 1e-6f)) {
-			r_clnor_data[1] = 0.0f;
+			r_clnor_data[1] = 0;
 		}
 		else {
 			float beta = saacosf(cos_beta);
@@ -465,10 +474,10 @@ void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float
 			}
 
 			if (beta > lnor_space->ref_beta) {
-				r_clnor_data[1] = -(pi2 - beta) / (pi2 - lnor_space->ref_beta);
+				r_clnor_data[1] = (short)(-(pi2 - beta) / (pi2 - lnor_space->ref_beta) * (float)SHRT_MAX);
 			}
 			else {
-				r_clnor_data[1] = beta / lnor_space->ref_beta;
+				r_clnor_data[1] = (short)(beta / lnor_space->ref_beta * (float)SHRT_MAX);
 			}
 		}
 	}
@@ -481,7 +490,7 @@ void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float
 void BKE_mesh_normals_loop_split(MVert *mverts, const int numVerts, MEdge *medges, const int numEdges,
                                  MLoop *mloops, float (*r_loopnors)[3], const int numLoops,
                      

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list