[Bf-blender-cvs] [50259dd] temp_custom_loop_normals: Add DM callback to get lnors spaces (needed by modifiers generating custom normals!)
Bastien Montagne
noreply at git.blender.org
Wed Aug 6 21:36:38 CEST 2014
Commit: 50259ddfd9c640820d470a05f62e2e816d21bcf2
Author: Bastien Montagne
Date: Tue Jul 15 16:20:54 2014 +0200
Branches: temp_custom_loop_normals
https://developer.blender.org/rB50259ddfd9c640820d470a05f62e2e816d21bcf2
Add DM callback to get lnors spaces (needed by modifiers generating custom normals!)
===================================================================
M source/blender/blenkernel/BKE_DerivedMesh.h
M source/blender/blenkernel/BKE_cdderivedmesh.h
M source/blender/blenkernel/intern/cdderivedmesh.c
M source/blender/blenkernel/intern/editderivedmesh.c
M source/blender/blenkernel/intern/subsurf_ccg.c
M source/blender/makesrna/intern/rna_mesh.c
M source/blender/makesrna/intern/rna_mesh_api.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index c8fa3a4..393d326 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -88,6 +88,7 @@ struct MTFace;
struct Object;
struct Scene;
struct Mesh;
+struct MLoopsNorSpaces;
struct BMEditMesh;
struct KeyBlock;
struct ModifierData;
@@ -198,6 +199,9 @@ struct DerivedMesh {
/** Calculate loop (split) normals */
void (*calcLoopNormals)(DerivedMesh *dm, const float split_angle);
+ /** Calculate loop (split) normals, and returns split loop normal spaces. */
+ void (*calcLoopNormalsSpaces)(DerivedMesh *dm, const float split_angle, struct MLoopsNorSpaces *r_lnors_spaces);
+
/** Recalculates mesh tessellation */
void (*recalcTessellation)(DerivedMesh *dm);
diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h
index dffc2b6..03e6aff 100644
--- a/source/blender/blenkernel/BKE_cdderivedmesh.h
+++ b/source/blender/blenkernel/BKE_cdderivedmesh.h
@@ -40,6 +40,7 @@
struct DerivedMesh;
struct BMEditMesh;
struct Mesh;
+struct MLoopsNorSpaces;
struct Object;
/* creates a new CDDerivedMesh */
@@ -101,6 +102,8 @@ void CDDM_calc_normals(struct DerivedMesh *dm);
void CDDM_calc_normals_tessface(struct DerivedMesh *dm);
void CDDM_calc_loop_normals(struct DerivedMesh *dm, const float split_angle);
+void CDDM_calc_loop_normals_spaces(struct DerivedMesh *dm, const float split_angle,
+ struct MLoopsNorSpaces *r_lnors_spaces);
/* calculates edges for a CDDerivedMesh (from face data)
* this completely replaces the current edge data in the DerivedMesh
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 2dede24..e964db9 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1889,6 +1889,7 @@ static CDDerivedMesh *cdDM_create(const char *desc)
dm->calcNormals = CDDM_calc_normals;
dm->calcLoopNormals = CDDM_calc_loop_normals;
+ dm->calcLoopNormalsSpaces = CDDM_calc_loop_normals_spaces;
dm->recalcTessellation = CDDM_recalc_tessellation;
dm->getVertCos = cdDM_getVertCos;
@@ -2507,6 +2508,11 @@ void CDDM_calc_normals(DerivedMesh *dm)
void CDDM_calc_loop_normals(DerivedMesh *dm, const float split_angle)
{
+ CDDM_calc_loop_normals_spaces(dm, split_angle, NULL);
+}
+
+void CDDM_calc_loop_normals_spaces(DerivedMesh *dm, const float split_angle, MLoopsNorSpaces *r_lnors_spaces)
+{
MVert *mverts = dm->getVertArray(dm);
MEdge *medges = dm->getEdgeArray(dm);
MLoop *mloops = dm->getLoopArray(dm);
@@ -2543,39 +2549,39 @@ void CDDM_calc_loop_normals(DerivedMesh *dm, const float split_angle)
dm->dirty &= ~DM_DIRTY_NORMALS;
{
- //MLoopsNorSpaces lnors_spaces = {NULL};
- //int i;
const float (*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,
- NULL /* &lnors_spaces */ , clnor_data, NULL);
+ r_lnors_spaces, clnor_data, NULL);
#if 0
- for (i = 0; i < numLoops; i++) {
- if (lnors_spaces.lspaces[i]->ref_alpha != 0.0f) {
- LinkNode *loops = lnors_spaces.lspaces[i]->loops;
- printf("Loop %d uses lnor space %p:\n", i, lnors_spaces.lspaces[i]);
- print_v3("\tfinal lnor", lnors[i]);
- print_v3("\tauto lnor", lnors_spaces.lspaces[i]->vec_lnor);
- print_v3("\tref_vec", lnors_spaces.lspaces[i]->vec_ref);
- printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", lnors_spaces.lspaces[i]->ref_alpha, lnors_spaces.lspaces[i]->ref_beta, lnors_spaces.lspaces[i]->loops);
- printf("\t\t(shared with loops");
- while(loops) {
- printf(" %d", GET_INT_FROM_POINTER(loops->link));
- loops = loops->next;
+ if (r_lnors_spaces) {
+ int i;
+ for (i = 0; i < numLoops; i++) {
+ if (r_lnors_spaces->lspaces[i]->ref_alpha != 0.0f) {
+ LinkNode *loops = r_lnors_spaces->lspaces[i]->loops;
+ printf("Loop %d uses lnor space %p:\n", i, r_lnors_spaces->lspaces[i]);
+ print_v3("\tfinal lnor", lnors[i]);
+ print_v3("\tauto lnor", r_lnors_spaces->lspaces[i]->vec_lnor);
+ print_v3("\tref_vec", r_lnors_spaces->lspaces[i]->vec_ref);
+ printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", r_lnors_spaces->lspaces[i]->ref_alpha,
+ r_lnors_spaces->lspaces[i]->ref_beta, r_lnors_spaces->lspaces[i]->loops);
+ printf("\t\t(shared with loops");
+ while(loops) {
+ printf(" %d", GET_INT_FROM_POINTER(loops->link));
+ loops = loops->next;
+ }
+ printf(")\n");
+ }
+ else {
+ printf("Loop %d has no lnor space\n", i);
}
- printf(")\n");
- }
- else {
- printf("Loop %d has no lnor space\n", i);
}
}
- BKE_free_loops_normal_spaces(&lnors_spaces);
#endif
}
}
-
void CDDM_calc_normals_tessface(DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 1b8120a..5966279 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -170,8 +170,15 @@ static void emDM_calcNormals(DerivedMesh *dm)
dm->dirty &= ~DM_DIRTY_NORMALS;
}
+static void emDM_calcLoopNormalsSpaces(DerivedMesh *dm, const float split_angle, MLoopsNorSpaces *r_lnors_spaces);
+
static void emDM_calcLoopNormals(DerivedMesh *dm, const float split_angle)
{
+ emDM_calcLoopNormalsSpaces(dm, split_angle, NULL);
+}
+
+static void emDM_calcLoopNormalsSpaces(DerivedMesh *dm, const float split_angle, MLoopsNorSpaces *r_lnors_spaces)
+{
EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
BMesh *bm = bmdm->em->bm;
const float (*vertexCos)[3], (*vertexNos)[3], (*polyNos)[3];
@@ -193,8 +200,6 @@ static void emDM_calcLoopNormals(DerivedMesh *dm, const float split_angle)
}
{
- //MLoopsNorSpaces lnors_spaces = {NULL};
- //int i;
/* XXX All this is really dirty!!! */
const int numLoops = dm->getNumLoops(dm);
float (*clnor_data)[2] = NULL;
@@ -218,29 +223,32 @@ static void emDM_calcLoopNormals(DerivedMesh *dm, const float split_angle)
}
BM_loops_calc_normal_vcos(bm, vertexCos, vertexNos, polyNos, split_angle, loopNos,
- NULL /* &lnors_spaces */, (const float (*)[2])clnor_data);
+ r_lnors_spaces, (const float (*)[2])clnor_data);
#if 0
- for (i = 0; i < numLoops; i++) {
- //if (i != 1) continue;
- if (lnors_spaces.lspaces[i]->ref_alpha != 0.0f) {
- LinkNode *loops = lnors_spaces.lspaces[i]->loops;
- printf("Loop %d uses lnor space %p:\n", i, lnors_spaces.lspaces[i]);
- print_v3("\tfinal lnor:", loopNos[i]);
- print_v3("\tauto lnor:", lnors_spaces.lspaces[i]->vec_lnor);
- print_v3("\tref_vec:", lnors_spaces.lspaces[i]->vec_ref);
- printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", lnors_spaces.lspaces[i]->ref_alpha, lnors_spaces.lspaces[i]->ref_beta, lnors_spaces.lspaces[i]->loops);
- printf("\t\t(shared with loops");
- while(loops) {
- printf(" %d", GET_INT_FROM_POINTER(loops->link));
- loops = loops->next;
+ if (r_lnors_spaces) {
+ int i;
+ for (i = 0; i < numLoops; i++) {
+ //if (i != 1) continue;
+ if (r_lnors_spaces->lspaces[i]->ref_alpha != 0.0f) {
+ LinkNode *loops = r_lnors_spaces->lspaces[i]->loops;
+ printf("Loop %d uses lnor space %p:\n", i, r_lnors_spaces->lspaces[i]);
+ print_v3("\tfinal lnor:", loopNos[i]);
+ print_v3("\tauto lnor:", r_lnors_spaces->lspaces[i]->vec_lnor);
+ print_v3("\tref_vec:", r_lnors_spaces->lspaces[i]->vec_ref);
+ printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", r_lnors_spaces->lspaces[i]->ref_alpha,
+ r_lnors_spaces->lspaces[i]->ref_beta, r_lnors_spaces->lspaces[i]->loops);
+ printf("\t\t(shared with loops");
+ while(loops) {
+ printf(" %d", GET_INT_FROM_POINTER(loops->link));
+ loops = loops->next;
+ }
+ printf(")\n");
+ }
+ else {
+ printf("Loop %d has no lnor space\n", i);
}
- printf(")\n");
- }
- else {
- printf("Loop %d has no lnor space\n", i);
}
}
- BKE_free_loops_normal_spaces(&lnors_spaces);
#endif
MEM_SAFE_FREE(clnor_data);
@@ -1809,6 +1817,7 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
bmdm->dm.calcNormals = emDM_calcNormals;
bmdm->dm.calcLoopNormals = emDM_calcLoopNormals;
+ bmdm->dm.calcLoopNormalsSpaces = emDM_calcLoopNormalsSpaces;
bmdm->dm.recalcTessellation = emDM_recalcTessellation;
bmdm->dm.foreachMappedVert = emDM_foreachMappedVert;
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 79c348a..2d755ba 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -3538,6 +3538,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgdm->dm.calcNormals = ccgDM_calcNormals;
ccgdm->dm.calcLoopNormals = CDDM_calc_loop_normals;
+ ccgdm->dm.calcLoopNormalsSpaces = CDDM_calc_loop_normals_spaces;
ccgdm->dm.recalcTessellation = ccgDM_recalcTessellation;
ccgdm->dm.getVertCos = ccgdm_getVertCos;
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 53d5586..71e1d23 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -345,7 +345,7 @@ static void rna_MeshLoop_normal_set(PointerRNA *ptr, const float *values)
float (*vec)[3] = CustomData_get(&me->ldata, (int)(ml - me->mloop), CD_NORMAL);
if (vec) {
- normalize_v3_v3(vec, values);
+ normalize_v3_v3(*vec, values);
}
}
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index 7aadf15..1c8581a 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -73,7 +73,7 @@ static void rna_Mesh_calc_normals_split(Mesh *mesh, floa
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list