[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