[Bf-blender-cvs] [81e0057c5c7] hair_object: Make return values for mesh sample eval optional.

Lukas Tönne noreply at git.blender.org
Sun Nov 11 12:45:58 CET 2018


Commit: 81e0057c5c770ddc10f68e9b98ea8e08188b73de
Author: Lukas Tönne
Date:   Sun Nov 11 09:53:41 2018 +0000
Branches: hair_object
https://developer.blender.org/rB81e0057c5c770ddc10f68e9b98ea8e08188b73de

Make return values for mesh sample eval optional.

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

M	source/blender/blenkernel/intern/hair.c
M	source/blender/blenkernel/intern/mesh_sample.c
M	source/blender/draw/intern/draw_cache_impl_hair.c
M	tests/gtests/blenkernel/BKE_mesh_sample_test.cc

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

diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index c5e184076c4..553d73e5ccb 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -733,8 +733,7 @@ int BKE_hair_export_cache_update(HairExportCache *cache, const HairSystem *hsys,
 			int i;
 			BKE_HAIR_ITER_FOLLICLES_INDEX(follicle, &iter, hsys->pattern, i) {
 				/* Cache fiber root position */
-				float nor[3], tang[3];
-				BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, cache->follicle_root_position[i], nor, tang);
+				BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, cache->follicle_root_position[i], NULL, NULL);
 			}
 		}
 	}
diff --git a/source/blender/blenkernel/intern/mesh_sample.c b/source/blender/blenkernel/intern/mesh_sample.c
index eec9d830fa2..dea533da823 100644
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@ -197,11 +197,17 @@ bool BKE_mesh_sample_is_volume_sample(const MeshSample *sample)
 
 /* Evaluate position and normal on the given mesh */
 
-bool BKE_mesh_sample_eval(const Mesh *mesh, const MeshSample *sample, float loc[3], float nor[3], float tang[3])
+bool BKE_mesh_sample_eval(const Mesh *mesh, const MeshSample *sample, float r_loc[3], float r_nor[3], float r_tang[3])
 {
-	zero_v3(loc);
-	zero_v3(nor);
-	zero_v3(tang);
+	if (r_loc) {
+		zero_v3(r_loc);
+	}
+	if (r_nor) {
+		zero_v3(r_nor);
+	}
+	if (r_tang) {
+		zero_v3(r_tang);
+	}
 	
 	if (BKE_mesh_sample_is_volume_sample(sample)) {
 		/* VOLUME SAMPLE */
@@ -209,7 +215,9 @@ bool BKE_mesh_sample_eval(const Mesh *mesh, const MeshSample *sample, float loc[
 		if (is_zero_v3(sample->orig_weights))
 			return false;
 		
-		copy_v3_v3(loc, sample->orig_weights);
+		if (r_loc) {
+			copy_v3_v3(r_loc, sample->orig_weights);
+		}
 		return true;
 	}
 	else {
@@ -228,38 +236,47 @@ bool BKE_mesh_sample_eval(const Mesh *mesh, const MeshSample *sample, float loc[
 		v2 = &mverts[sample->orig_verts[1]];
 		v3 = &mverts[sample->orig_verts[2]];
 		
-		{ /* location */
-			madd_v3_v3fl(loc, v1->co, sample->orig_weights[0]);
-			madd_v3_v3fl(loc, v2->co, sample->orig_weights[1]);
-			madd_v3_v3fl(loc, v3->co, sample->orig_weights[2]);
+		/* location */
+		if (r_loc) {
+			madd_v3_v3fl(r_loc, v1->co, sample->orig_weights[0]);
+			madd_v3_v3fl(r_loc, v2->co, sample->orig_weights[1]);
+			madd_v3_v3fl(r_loc, v3->co, sample->orig_weights[2]);
 		}
 		
-		{ /* normal */
-			float vnor[3];
-			
-			normal_short_to_float_v3(vnor, v1->no);
-			madd_v3_v3fl(nor, vnor, sample->orig_weights[0]);
-			normal_short_to_float_v3(vnor, v2->no);
-			madd_v3_v3fl(nor, vnor, sample->orig_weights[1]);
-			normal_short_to_float_v3(vnor, v3->no);
-			madd_v3_v3fl(nor, vnor, sample->orig_weights[2]);
-			
-			normalize_v3(nor);
-		}
-		
-		{ /* tangent */
-			float edge[3];
-			
-			/* XXX simply using the v1-v2 edge as a tangent vector for now ...
-			 * Eventually mikktspace generated tangents (CD_TANGENT tessface layer)
-			 * should be used for consistency, but requires well-defined tessface
-			 * indices for the mesh surface samples.
-			 */
-			
-			sub_v3_v3v3(edge, v2->co, v1->co);
-			/* make edge orthogonal to nor */
-			madd_v3_v3fl(edge, nor, -dot_v3v3(edge, nor));
-			normalize_v3_v3(tang, edge);
+		if (r_nor || r_tang) {
+			/* normal */
+			float nor[3] = {0.0f, 0.0f, 0.0f};
+			{
+				float vnor[3];
+				
+				normal_short_to_float_v3(vnor, v1->no);
+				madd_v3_v3fl(nor, vnor, sample->orig_weights[0]);
+				normal_short_to_float_v3(vnor, v2->no);
+				madd_v3_v3fl(nor, vnor, sample->orig_weights[1]);
+				normal_short_to_float_v3(vnor, v3->no);
+				madd_v3_v3fl(nor, vnor, sample->orig_weights[2]);
+				
+				normalize_v3(nor);
+			}
+			if (r_nor) {
+				copy_v3_v3(r_nor, nor);
+			}
+
+			/* tangent */
+			if (r_tang) {
+				float edge[3];
+				
+				/* XXX simply using the v1-v2 edge as a tangent vector for now ...
+				* Eventually mikktspace generated tangents (CD_TANGENT tessface layer)
+				* should be used for consistency, but requires well-defined tessface
+				* indices for the mesh surface samples.
+				*/
+				
+				sub_v3_v3v3(edge, v2->co, v1->co);
+				/* make edge orthogonal to nor */
+				madd_v3_v3fl(edge, nor, -dot_v3v3(edge, nor));
+				normalize_v3_v3(r_tang, edge);
+			}
 		}
 		
 		return true;
@@ -914,8 +931,7 @@ static void generator_poissondisk_uniform_sample_eval(
 	const MeshSample *sample = &samples[iter];
 	
 	memcpy(&isample->base, sample, sizeof(MeshSample));
-	float nor[3], tang[3];
-	BKE_mesh_sample_eval(mesh, sample, isample->co, nor, tang);
+	BKE_mesh_sample_eval(mesh, sample, isample->co, NULL, NULL);
 	
 	poissondisk_grid_from_loc(gen, isample->cell_index, isample->co);
 }
@@ -1717,9 +1733,9 @@ bool BKE_mesh_sample_from_particle(MeshSample *sample, ParticleSystem *psys, Mes
 bool BKE_mesh_sample_to_particle(MeshSample *sample, ParticleSystem *UNUSED(psys), Mesh *mesh, BVHTreeFromMesh *bvhtree, ParticleData *pa)
 {
 	BVHTreeNearest nearest;
-	float vec[3], nor[3], tang[3];
+	float vec[3];
 	
-	BKE_mesh_sample_eval(mesh, sample, vec, nor, tang);
+	BKE_mesh_sample_eval(mesh, sample, vec, NULL, NULL);
 	
 	nearest.index = -1;
 	nearest.dist_sq = FLT_MAX;
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c b/source/blender/draw/intern/draw_cache_impl_hair.c
index f7493df584c..de831a1e859 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -775,8 +775,8 @@ static void hair_batch_cache_ensure_edit_follicle_pos(
 	HairIterator iter;
 	int point_index;
 	BKE_HAIR_ITER_FOLLICLES_INDEX(follicle, &iter, pattern, point_index) {
-		float loc[3], nor[3], tang[3];
-		BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, loc, nor, tang);
+		float loc[3];
+		BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, loc, NULL, NULL);
 
 		GPU_vertbuf_attr_set(cache->edit_follicle_pos, pos_id, point_index, loc);
 
diff --git a/tests/gtests/blenkernel/BKE_mesh_sample_test.cc b/tests/gtests/blenkernel/BKE_mesh_sample_test.cc
index d95266754a8..025584151f1 100644
--- a/tests/gtests/blenkernel/BKE_mesh_sample_test.cc
+++ b/tests/gtests/blenkernel/BKE_mesh_sample_test.cc
@@ -142,8 +142,7 @@ void MeshSampleTest::dump_samples()
 		copy_v3_v3(dbg_verts[i], m_mesh->mvert[i].co);
 	}
 	for (int i = 0; i < m_numsamples; ++i) {
-		float nor[3], tang[3];
-		BKE_mesh_sample_eval(m_mesh, &m_samples[i], dbg_verts[numverts + i], nor, tang);
+		BKE_mesh_sample_eval(m_mesh, &m_samples[i], dbg_verts[numverts + i], NULL, NULL);
 	}
 	int *dbg_faces = (int *)MEM_mallocN(sizeof(int) * m_mesh->totloop, "faces");
 	int *dbg_face_lengths = (int *)MEM_mallocN(sizeof(int) * m_mesh->totpoly, "face_lengths");



More information about the Bf-blender-cvs mailing list