Commit: e0b2c1374167cb29e642a9030fa1be6be7533425
Author: Lukas Tönne
Date:   Mon Dec 1 14:41:02 2014 +0100
Branches: hair_immediate_fixes
https://developer.blender.org/rBe0b2c1374167cb29e642a9030fa1be6be7533425

Better feedback about valid sample from mesh sampling methods.

Conflicts:
        source/blender/editors/object/object_shapekey.c

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

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 181900b..e43b162 100644
--- a/source/blender/blenkernel/BKE_mesh_sample.h
+++ b/source/blender/blenkernel/BKE_mesh_sample.h
@@ -51,10 +51,10 @@ void BKE_mesh_sample_storage_single(struct 
MSurfaceSampleStorage *storage, struc
 void BKE_mesh_sample_storage_array(struct MSurfaceSampleStorage *storage, 
struct MSurfaceSample *samples, int capacity);
 void BKE_mesh_sample_storage_release(struct MSurfaceSampleStorage *storage);
 
-void BKE_mesh_sample_generate_random(struct MSurfaceSampleStorage *dst, struct 
DerivedMesh *dm, unsigned int seed, int totsample);
+int BKE_mesh_sample_generate_random(struct MSurfaceSampleStorage *dst, struct 
DerivedMesh *dm, unsigned int seed, int totsample);
 
 typedef bool (*MeshSampleRayCallback)(void *userdata, float ray_start[3], 
float ray_end[3]);
-void BKE_mesh_sample_generate_raycast(struct MSurfaceSampleStorage *dst, 
struct DerivedMesh *dm, MeshSampleRayCallback ray_cb, void *userdata);
+int BKE_mesh_sample_generate_raycast(struct MSurfaceSampleStorage *dst, struct 
DerivedMesh *dm, MeshSampleRayCallback ray_cb, void *userdata, int totsample);
 
 /* ==== Utilities ==== */
 
diff --git a/source/blender/blenkernel/intern/mesh_sample.c 
b/source/blender/blenkernel/intern/mesh_sample.c
index 664dfea..cd568e4 100644
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@ -161,14 +161,14 @@ void 
BKE_mesh_sample_storage_release(MSurfaceSampleStorage *storage)
 }
 
 
-void BKE_mesh_sample_generate_random(MSurfaceSampleStorage *dst, DerivedMesh 
*dm, unsigned int seed, int totsample)
+int BKE_mesh_sample_generate_random(MSurfaceSampleStorage *dst, DerivedMesh 
*dm, unsigned int seed, int totsample)
 {
        MFace *mfaces;
        int totfaces;
        RNG *rng;
        MFace *mface;
        float a, b;
-       int i;
+       int i, stored = 0;
        
        rng = BLI_rng_new(seed);
        
@@ -202,11 +202,15 @@ void 
BKE_mesh_sample_generate_random(MSurfaceSampleStorage *dst, DerivedMesh *dm
                sample.orig_weights[1] = a;
                sample.orig_weights[2] = b;
                
-               if (!dst->store_sample(dst->data, dst->capacity, i, &sample))
+               if (dst->store_sample(dst->data, dst->capacity, i, &sample))
+                       ++stored;
+               else
                        break;
        }
        
        BLI_rng_free(rng);
+       
+       return stored;
 }
 
 
@@ -232,11 +236,11 @@ static bool sample_bvh_raycast(MSurfaceSample *sample, 
DerivedMesh *dm, BVHTreeF
                return false;
 }
 
-void BKE_mesh_sample_generate_raycast(MSurfaceSampleStorage *dst, DerivedMesh 
*dm, MeshSampleRayCallback ray_cb, void *userdata)
+int BKE_mesh_sample_generate_raycast(MSurfaceSampleStorage *dst, DerivedMesh 
*dm, MeshSampleRayCallback ray_cb, void *userdata, int totsample)
 {
        BVHTreeFromMesh bvhdata;
        float ray_start[3], ray_end[3];
-       int i;
+       int i, stored = 0;
        
        DM_ensure_tessface(dm);
        
@@ -244,20 +248,22 @@ void 
BKE_mesh_sample_generate_raycast(MSurfaceSampleStorage *dst, DerivedMesh *d
        bvhtree_from_mesh_faces(&bvhdata, dm, 0.0f, 4, 6);
        
        if (bvhdata.tree) {
-               i = 0;
-               while (ray_cb(userdata, ray_start, ray_end)) {
-                       MSurfaceSample sample;
-                       
-                       sample_bvh_raycast(&sample, dm, &bvhdata, ray_start, 
ray_end);
-                       
-                       if (!dst->store_sample(dst->data, dst->capacity, i, 
&sample))
-                               break;
-                       
-                       ++i;
+               for (i = 0; i < totsample; ++i) {
+                       if (ray_cb(userdata, ray_start, ray_end)) {
+                               MSurfaceSample sample;
+                               if (sample_bvh_raycast(&sample, dm, &bvhdata, 
ray_start, ray_end)) {
+                                       if (dst->store_sample(dst->data, 
dst->capacity, i, &sample))
+                                               ++stored;
+                                       else
+                                               break;
+                               }
+                       }
                }
        }
        
        free_bvhtree_from_mesh(&bvhdata);
+       
+       return stored;
 }
 
 /* ==== Utilities ==== */

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

Reply via email to