[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