[Bf-blender-cvs] [f95dde2] strand_editmode: Better feedback about valid sample from mesh sampling methods.

Lukas Tönne noreply at git.blender.org
Mon Apr 20 14:23:53 CEST 2015


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

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 ==== */




More information about the Bf-blender-cvs mailing list