[Bf-blender-cvs] [28270f0] strand_editmode strand_gpu: Replace the deprecated TessFace usage for mesh sampling by LoopTri.
Lukas Tönne
noreply at git.blender.org
Thu Jul 14 10:07:57 CEST 2016
Commit: 28270f0953d957ac60b9751eff37c4ebe2258166
Author: Lukas Tönne
Date: Thu Jul 14 09:55:18 2016 +0200
Branches: strand_editmode strand_gpu
https://developer.blender.org/rB28270f0953d957ac60b9751eff37c4ebe2258166
Replace the deprecated TessFace usage for mesh sampling by LoopTri.
Also make sure a valid generator instance for random sampling is always
returned, regardless of triangle counts.
===================================================================
M source/blender/blenkernel/intern/mesh_sample.c
===================================================================
diff --git a/source/blender/blenkernel/intern/mesh_sample.c b/source/blender/blenkernel/intern/mesh_sample.c
index 07ddc42..24782ea 100644
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@ -187,7 +187,7 @@ typedef struct MSurfaceSampleGenerator_Random {
DerivedMesh *dm;
RNG *rng;
- float *face_weights;
+ float *tri_weights;
float *vertex_weights;
#ifdef USE_DEBUG_COUNT
@@ -199,8 +199,8 @@ static void generator_random_free(MSurfaceSampleGenerator_Random *gen)
{
#ifdef USE_DEBUG_COUNT
if (gen->debug_count) {
- if (gen->face_weights) {
- int num = gen->dm->getNumTessFaces(gen->dm);
+ if (gen->tri_weights) {
+ int num = gen->dm->getNumLoopTri(gen->dm);
int i;
int totsamples = 0;
@@ -209,7 +209,7 @@ static void generator_random_free(MSurfaceSampleGenerator_Random *gen)
totsamples += gen->debug_count[i];
for (i = 0; i < num; ++i) {
- float weight = i > 0 ? gen->face_weights[i] - gen->face_weights[i-1] : gen->face_weights[i];
+ float weight = i > 0 ? gen->tri_weights[i] - gen->tri_weights[i-1] : gen->tri_weights[i];
int samples = gen->debug_count[i];
printf(" %d: W = %f, N = %d/%d = %f\n", i, weight, samples, totsamples, (float)samples / (float)totsamples);
}
@@ -217,8 +217,8 @@ static void generator_random_free(MSurfaceSampleGenerator_Random *gen)
MEM_freeN(gen->debug_count);
}
#endif
- if (gen->face_weights)
- MEM_freeN(gen->face_weights);
+ if (gen->tri_weights)
+ MEM_freeN(gen->tri_weights);
if (gen->vertex_weights)
MEM_freeN(gen->vertex_weights);
if (gen->rng)
@@ -255,39 +255,31 @@ static bool generator_random_make_sample(MSurfaceSampleGenerator_Random *gen, Me
{
DerivedMesh *dm = gen->dm;
RNG *rng = gen->rng;
- MFace *mfaces = dm->getTessFaceArray(dm);
- int totfaces = dm->getNumTessFaces(dm);
- int totweights = totfaces * 2;
+ const MLoop *mloops = dm->getLoopArray(dm);
+ const MLoopTri *mtris = dm->getLoopTriArray(dm);
+ int tottris = dm->getNumLoopTri(dm);
+ int totweights = tottris;
- int faceindex, triindex, tri;
+ int triindex;
float a, b;
- MFace *mface;
+ const MLoopTri *mtri;
- if (gen->face_weights)
- triindex = weight_array_binary_search(gen->face_weights, totweights, BLI_rng_get_float(rng));
+ if (gen->tri_weights)
+ triindex = weight_array_binary_search(gen->tri_weights, totweights, BLI_rng_get_float(rng));
else
triindex = BLI_rng_get_int(rng) % totweights;
- faceindex = triindex >> 1;
#ifdef USE_DEBUG_COUNT
if (gen->debug_count)
- gen->debug_count[faceindex] += 1;
+ gen->debug_count[triindex] += 1;
#endif
- tri = triindex % 2;
a = BLI_rng_get_float(rng);
b = BLI_rng_get_float(rng);
- mface = &mfaces[faceindex];
+ mtri = &mtris[triindex];
- if (tri == 0) {
- sample->orig_verts[0] = mface->v1;
- sample->orig_verts[1] = mface->v2;
- sample->orig_verts[2] = mface->v3;
- }
- else {
- sample->orig_verts[0] = mface->v1;
- sample->orig_verts[1] = mface->v3;
- sample->orig_verts[2] = mface->v4;
- }
+ sample->orig_verts[0] = mloops[mtri->tri[0]].v;
+ sample->orig_verts[1] = mloops[mtri->tri[1]].v;
+ sample->orig_verts[2] = mloops[mtri->tri[2]].v;
if (a + b > 1.0f) {
a = 1.0f - a;
@@ -300,35 +292,28 @@ static bool generator_random_make_sample(MSurfaceSampleGenerator_Random *gen, Me
return true;
}
-BLI_INLINE void face_weight(DerivedMesh *dm, MFace *face, MeshSampleVertexWeightFp vertex_weight_cb, void *userdata, float weight[2])
+BLI_INLINE float triangle_weight(DerivedMesh *dm, const MLoopTri *tri, MeshSampleVertexWeightFp vertex_weight_cb, void *userdata)
{
MVert *mverts = dm->getVertArray(dm);
- MVert *v1 = &mverts[face->v1];
- MVert *v2 = &mverts[face->v2];
- MVert *v3 = &mverts[face->v3];
- MVert *v4 = NULL;
+ MLoop *mloops = dm->getLoopArray(dm);
+ unsigned int index1 = mloops[tri->tri[0]].v;
+ unsigned int index2 = mloops[tri->tri[1]].v;
+ unsigned int index3 = mloops[tri->tri[2]].v;
+ MVert *v1 = &mverts[index1];
+ MVert *v2 = &mverts[index2];
+ MVert *v3 = &mverts[index3];
- weight[0] = area_tri_v3(v1->co, v2->co, v3->co);
-
- if (face->v4) {
- v4 = &mverts[face->v4];
- weight[1] = area_tri_v3(v1->co, v3->co, v4->co);
- }
- else
- weight[1] = 0.0f;
+ float weight = area_tri_v3(v1->co, v2->co, v3->co);
if (vertex_weight_cb) {
- float w1 = vertex_weight_cb(dm, v1, face->v1, userdata);
- float w2 = vertex_weight_cb(dm, v2, face->v2, userdata);
- float w3 = vertex_weight_cb(dm, v3, face->v3, userdata);
-
- weight[0] *= (w1 + w2 + w3) / 3.0f;
+ float w1 = vertex_weight_cb(dm, v1, index1, userdata);
+ float w2 = vertex_weight_cb(dm, v2, index2, userdata);
+ float w3 = vertex_weight_cb(dm, v3, index3, userdata);
- if (v4) {
- float w4 = vertex_weight_cb(dm, v4, face->v4, userdata);
- weight[1] *= (w1 + w3 + w4) / 3.0f;
- }
+ weight *= (w1 + w2 + w3) / 3.0f;
}
+
+ return weight;
}
MeshSampleGenerator *BKE_mesh_sample_gen_surface_random_ex(DerivedMesh *dm, unsigned int seed,
@@ -337,10 +322,7 @@ MeshSampleGenerator *BKE_mesh_sample_gen_surface_random_ex(DerivedMesh *dm, unsi
MSurfaceSampleGenerator_Random *gen;
DM_ensure_normals(dm);
- DM_ensure_tessface(dm);
-
- if (dm->getNumTessFaces(dm) == 0)
- return NULL;
+ DM_ensure_looptri(dm);
gen = MEM_callocN(sizeof(MSurfaceSampleGenerator_Random), "MSurfaceSampleGenerator_Random");
sample_generator_init(&gen->base, (GeneratorFreeFp)generator_random_free, (GeneratorMakeSampleFp)generator_random_make_sample);
@@ -349,41 +331,34 @@ MeshSampleGenerator *BKE_mesh_sample_gen_surface_random_ex(DerivedMesh *dm, unsi
gen->rng = BLI_rng_new(seed);
if (use_facearea) {
- int numfaces = dm->getNumTessFaces(dm);
- int numweights = numfaces * 2;
- MFace *mfaces = dm->getTessFaceArray(dm);
- MFace *mf;
+ int numtris = dm->getNumLoopTri(dm);
+ int numweights = numtris;
+ const MLoopTri *mtris = dm->getLoopTriArray(dm);
+ const MLoopTri *mt;
int i;
float totweight;
- gen->face_weights = MEM_mallocN(sizeof(float) * (size_t)numweights, "mesh sample face weights");
+ gen->tri_weights = MEM_mallocN(sizeof(float) * (size_t)numweights, "mesh sample triangle weights");
/* accumulate weights */
totweight = 0.0f;
- for (i = 0, mf = mfaces; i < numfaces; ++i, ++mf) {
- int index = i << 1;
- float weight[2];
-
- face_weight(dm, mf, vertex_weight_cb, userdata, weight);
- gen->face_weights[index] = totweight;
- totweight += weight[0];
- gen->face_weights[index+1] = totweight;
- totweight += weight[1];
+ for (i = 0, mt = mtris; i < numtris; ++i, ++mt) {
+ float weight = triangle_weight(dm, mt, vertex_weight_cb, userdata);
+ gen->tri_weights[i] = totweight;
+ totweight += weight;
}
/* normalize */
if (totweight > 0.0f) {
float norm = 1.0f / totweight;
- for (i = 0, mf = mfaces; i < numfaces; ++i, ++mf) {
- int index = i << 1;
- gen->face_weights[index] *= norm;
- gen->face_weights[index+1] *= norm;
+ for (i = 0, mt = mtris; i < numtris; ++i, ++mt) {
+ gen->tri_weights[i] *= norm;
}
}
else {
/* invalid weights, remove to avoid invalid binary search */
- MEM_freeN(gen->face_weights);
- gen->face_weights = NULL;
+ MEM_freeN(gen->tri_weights);
+ gen->tri_weights = NULL;
}
#ifdef USE_DEBUG_COUNT
More information about the Bf-blender-cvs
mailing list