Commit: ba3a650ddee5b0fa903d329ccbcf4a1f7e42b298
Author: Lukas Tönne
Date:   Thu May 24 13:08:59 2018 +0100
Branches: hair_guides hair_guides_grooming
https://developer.blender.org/rBba3a650ddee5b0fa903d329ccbcf4a1f7e42b298

Replace per-vertex sampling weights with per-loop for more control (e.g. face 
maps).

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

M       source/blender/blenkernel/BKE_mesh_sample.h
M       source/blender/blenkernel/intern/mesh_sample.c

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

diff --git a/source/blender/blenkernel/BKE_mesh_sample.h 
b/source/blender/blenkernel/BKE_mesh_sample.h
index 4a438ec9cb9..bd997a03aca 100644
--- a/source/blender/blenkernel/BKE_mesh_sample.h
+++ b/source/blender/blenkernel/BKE_mesh_sample.h
@@ -31,19 +31,21 @@ struct KeyBlock;
 struct Mesh;
 struct MFace;
 struct MVert;
+struct MPoly;
 
 struct MeshSample;
 struct MeshSampleGenerator;
 
 typedef struct MeshSampleGenerator MeshSampleGenerator;
-typedef float (*MeshSampleVertexWeightFp)(struct DerivedMesh *dm, struct MVert 
*vert, unsigned int index, void *userdata);
+
+typedef float (*MeshSampleLoopWeightFp)(struct DerivedMesh *dm, struct MLoop 
*loop, unsigned int index, void *userdata);
 typedef void* (*MeshSampleThreadContextCreateFp)(void *userdata, int start);
 typedef void (*MeshSampleThreadContextFreeFp)(void *userdata, void 
*thread_ctx);
 typedef bool (*MeshSampleRayFp)(void *userdata, void *thread_ctx, float 
ray_start[3], float ray_end[3]);
 
 /* ==== Utility Functions ==== */
 
-float* BKE_mesh_sample_calc_triangle_weights(struct DerivedMesh *dm, 
MeshSampleVertexWeightFp vertex_weight_cb, void *userdata, float *r_area);
+float* BKE_mesh_sample_calc_triangle_weights(struct DerivedMesh *dm, 
MeshSampleLoopWeightFp loop_weight_cb, void *userdata, float *r_area);
 
 void BKE_mesh_sample_weights_from_loc(struct MeshSample *sample, struct 
DerivedMesh *dm, int face_index, const float loc[3]);
 
@@ -71,7 +73,7 @@ struct MeshSampleGenerator 
*BKE_mesh_sample_gen_surface_vertices(void);
 
 /* vertex_weight_cb is optional */
 struct MeshSampleGenerator *BKE_mesh_sample_gen_surface_random(unsigned int 
seed, bool use_area_weight,
-                                                               
MeshSampleVertexWeightFp vertex_weight_cb, void *userdata);
+                                                               
MeshSampleLoopWeightFp loop_weight_cb, void *userdata);
 
 struct MeshSampleGenerator *BKE_mesh_sample_gen_surface_raycast(
         MeshSampleThreadContextCreateFp thread_context_create_cb,
@@ -80,7 +82,7 @@ struct MeshSampleGenerator 
*BKE_mesh_sample_gen_surface_raycast(
         void *userdata);
 
 struct MeshSampleGenerator *BKE_mesh_sample_gen_surface_poissondisk(unsigned 
int seed, float mindist, unsigned int max_samples,
-                                                                    
MeshSampleVertexWeightFp vertex_weight_cb, void *userdata);
+                                                                    
MeshSampleLoopWeightFp loop_weight_cb, void *userdata);
 
 struct MeshSampleGenerator *BKE_mesh_sample_gen_volume_random_bbray(unsigned 
int seed, float density);
 
diff --git a/source/blender/blenkernel/intern/mesh_sample.c 
b/source/blender/blenkernel/intern/mesh_sample.c
index a09ef3e3fd9..980273e3c86 100644
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@ -73,26 +73,26 @@ static float calc_mesh_area(DerivedMesh *dm)
        return totarea;
 }
 
-BLI_INLINE float triangle_weight(DerivedMesh *dm, const MLoopTri *tri, const 
float *vert_weights, float *r_area)
+BLI_INLINE float triangle_weight(DerivedMesh *dm, const MLoopTri *tri, const 
float *loop_weights, float *r_area)
 {
-       MVert *mverts = dm->getVertArray(dm);
-       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];
+       const MVert *mverts = dm->getVertArray(dm);
+       const MLoop *mloops = dm->getLoopArray(dm);
+       const unsigned int index1 = tri->tri[0];
+       const unsigned int index2 = tri->tri[1];
+       const unsigned int index3 = tri->tri[2];
+       const MVert *v1 = &mverts[mloops[index1].v];
+       const MVert *v2 = &mverts[mloops[index2].v];
+       const MVert *v3 = &mverts[mloops[index3].v];
        
        float weight = area_tri_v3(v1->co, v2->co, v3->co);
        if (r_area) {
                *r_area = weight;
        }
        
-       if (vert_weights) {
-               float w1 = vert_weights[index1];
-               float w2 = vert_weights[index2];
-               float w3 = vert_weights[index3];
+       if (loop_weights) {
+               float w1 = loop_weights[index1];
+               float w2 = loop_weights[index2];
+               float w3 = loop_weights[index3];
                
                weight *= (w1 + w2 + w3) / 3.0f;
        }
@@ -100,19 +100,19 @@ BLI_INLINE float triangle_weight(DerivedMesh *dm, const 
MLoopTri *tri, const flo
        return weight;
 }
 
-float* BKE_mesh_sample_calc_triangle_weights(DerivedMesh *dm, 
MeshSampleVertexWeightFp vertex_weight_cb, void *userdata, float *r_area)
+float* BKE_mesh_sample_calc_triangle_weights(DerivedMesh *dm, 
MeshSampleLoopWeightFp loop_weight_cb, void *userdata, float *r_area)
 {
-       int numverts = dm->getNumVerts(dm);
+       int numloops = dm->getNumLoops(dm);
        int numtris = dm->getNumLoopTri(dm);
        int numweights = numtris;
        
-       float *vert_weights = NULL;
-       if (vertex_weight_cb) {
-               vert_weights = MEM_mallocN(sizeof(float) * (size_t)numverts, 
"mesh sample vertex weights");
+       float *loop_weights = NULL;
+       if (loop_weight_cb) {
+               loop_weights = MEM_mallocN(sizeof(float) * (size_t)numloops, 
"mesh sample loop weights");
                {
-                       MVert *mv = dm->getVertArray(dm);
-                       for (int i = 0; i < numtris; ++i, ++mv) {
-                               vert_weights[i] = vertex_weight_cb(dm, mv, 
(unsigned int)i, userdata);
+                       MLoop *ml = dm->getLoopArray(dm);
+                       for (int i = 0; i < numloops; ++i, ++ml) {
+                               loop_weights[i] = loop_weight_cb(dm, ml, 
(unsigned int)i, userdata);
                        }
                }
        }
@@ -127,14 +127,14 @@ float* BKE_mesh_sample_calc_triangle_weights(DerivedMesh 
*dm, MeshSampleVertexWe
                        tri_weights[i] = totweight;
                        
                        float triarea;
-                       float triweight = triangle_weight(dm, mt, vert_weights, 
&triarea);
+                       float triweight = triangle_weight(dm, mt, loop_weights, 
&triarea);
                        totarea += triarea;
                        totweight += triweight;
                }
        }
        
-       if (vert_weights) {
-               MEM_freeN(vert_weights);
+       if (loop_weights) {
+               MEM_freeN(loop_weights);
        }
        
        /* normalize */
@@ -573,7 +573,7 @@ typedef struct MSurfaceSampleGenerator_Random {
        
        unsigned int seed;
        bool use_area_weight;
-       MeshSampleVertexWeightFp vertex_weight_cb;
+       MeshSampleLoopWeightFp loop_weight_cb;
        void *userdata;
        
        /* bind data */
@@ -597,7 +597,7 @@ static void 
generator_random_bind(MSurfaceSampleGenerator_Random *gen)
        DM_ensure_normals(dm);
        
        if (gen->use_area_weight) {
-               gen->tri_weights = BKE_mesh_sample_calc_triangle_weights(dm, 
gen->vertex_weight_cb, gen->userdata, NULL);
+               gen->tri_weights = BKE_mesh_sample_calc_triangle_weights(dm, 
gen->loop_weight_cb, gen->userdata, NULL);
                
 #ifdef USE_DEBUG_COUNT
                gen->debug_count = MEM_callocN(sizeof(int) * 
(size_t)dm->getNumLoopTri(dm), "surface sample debug counts");
@@ -713,7 +713,7 @@ static bool generator_random_make_sample(const 
MSurfaceSampleGenerator_Random *g
 }
 
 MeshSampleGenerator *BKE_mesh_sample_gen_surface_random(unsigned int seed, 
bool use_area_weight,
-                                                        
MeshSampleVertexWeightFp vertex_weight_cb, void *userdata)
+                                                        MeshSampleLoopWeightFp 
loop_weight_cb, void *userdata)
 {
        MSurfaceSampleGenerator_Random *gen;
        
@@ -729,7 +729,7 @@ MeshSampleGenerator 
*BKE_mesh_sample_gen_surface_random(unsigned int seed, bool
        
        gen->seed = seed;
        gen->use_area_weight = use_area_weight;
-       gen->vertex_weight_cb = vertex_weight_cb;
+       gen->loop_weight_cb = loop_weight_cb;
        gen->userdata = userdata;
        
        return &gen->base;
@@ -1220,7 +1220,7 @@ static bool generator_poissondisk_make_sample(const 
MSurfaceSampleGenerator_Pois
 }
 
 MeshSampleGenerator *BKE_mesh_sample_gen_surface_poissondisk(unsigned int 
seed, float mindist, unsigned int max_samples,
-                                                             
MeshSampleVertexWeightFp vertex_weight_cb, void *userdata)
+                                                             
MeshSampleLoopWeightFp loop_weight_cb, void *userdata)
 {
        MSurfaceSampleGenerator_PoissonDisk *gen;
        
@@ -1234,7 +1234,7 @@ MeshSampleGenerator 
*BKE_mesh_sample_gen_surface_poissondisk(unsigned int seed,
                              
(GeneratorMakeSampleFp)generator_poissondisk_make_sample,
                              
(GeneratorGetMaxSamplesFp)generator_poissondisk_get_max_samples);
        
-       gen->uniform_gen = BKE_mesh_sample_gen_surface_random(seed, true, 
vertex_weight_cb, userdata);
+       gen->uniform_gen = BKE_mesh_sample_gen_surface_random(seed, true, 
loop_weight_cb, userdata);
        gen->max_samples = max_samples;
        gen->mindist_squared = mindist * mindist;
        gen->cellsize = mindist / SQRT_3;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to