[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