[Bf-blender-cvs] [8925290] strand_editmode: Port over the improved mesh sampling API from the mesh_samples branch.

Lukas Tönne noreply at git.blender.org
Sat Sep 19 17:34:51 CEST 2015


Commit: 892529029f08b4ca2e6c73a4e9299fb0b278f455
Author: Lukas Tönne
Date:   Sat Sep 19 17:33:37 2015 +0200
Branches: strand_editmode
https://developer.blender.org/rB892529029f08b4ca2e6c73a4e9299fb0b278f455

Port over the improved mesh sampling API from the mesh_samples branch.

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

M	source/blender/blenkernel/BKE_mesh_sample.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/mesh_sample.c
M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/bmesh/intern/bmesh_interp.h
M	source/blender/bmesh/intern/bmesh_strands_conv.c
M	source/blender/editors/hair/hair_stroke.c
M	source/blender/makesdna/DNA_meshdata_types.h
M	source/blender/makesrna/intern/rna_mesh_sample.c
M	source/blender/physics/intern/strands.cpp

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

diff --git a/source/blender/blenkernel/BKE_mesh_sample.h b/source/blender/blenkernel/BKE_mesh_sample.h
index 6b48955..06d7fd4 100644
--- a/source/blender/blenkernel/BKE_mesh_sample.h
+++ b/source/blender/blenkernel/BKE_mesh_sample.h
@@ -28,33 +28,38 @@
 struct DerivedMesh;
 struct Key;
 struct KeyBlock;
+struct MFace;
+struct MVert;
 
-struct MSurfaceSample;
+struct MeshSample;
+struct MeshSampleGenerator;
+
+typedef struct MeshSampleGenerator MeshSampleGenerator;
+typedef float (*MeshSampleVertexWeightFp)(struct DerivedMesh *dm, struct MVert *vert, unsigned int index, void *userdata);
+typedef bool (*MeshSampleRayFp)(void *userdata, float ray_start[3], float ray_end[3]);
 
 /* ==== Evaluate ==== */
 
-bool BKE_mesh_sample_eval(struct DerivedMesh *dm, const struct MSurfaceSample *sample, float loc[3], float nor[3], float tang[3]);
-bool BKE_mesh_sample_shapekey(struct Key *key, struct KeyBlock *kb, const struct MSurfaceSample *sample, float loc[3]);
+bool BKE_mesh_sample_is_volume_sample(const struct MeshSample *sample);
+
+bool BKE_mesh_sample_eval(struct DerivedMesh *dm, const struct MeshSample *sample, float loc[3], float nor[3], float tang[3]);
+bool BKE_mesh_sample_shapekey(struct Key *key, struct KeyBlock *kb, const struct MeshSample *sample, float loc[3]);
 
 
 /* ==== Sampling ==== */
 
-/* Storage descriptor to allow generic data storage by arbitrary algorithms */
-typedef struct MSurfaceSampleStorage {
-	bool (*store_sample)(void *data, int capacity, int index, const struct MSurfaceSample *sample);
-	void *data;
-	int capacity;
-	int free_data;
-} MSurfaceSampleStorage;
+/* face_weights is optional */
+struct MeshSampleGenerator *BKE_mesh_sample_gen_surface_random(struct DerivedMesh *dm, unsigned int seed);
+struct MeshSampleGenerator *BKE_mesh_sample_gen_surface_random_ex(struct DerivedMesh *dm, unsigned int seed,
+                                                                      MeshSampleVertexWeightFp vertex_weight_cb, void *userdata, bool use_facearea);
+
+struct MeshSampleGenerator *BKE_mesh_sample_gen_surface_raycast(struct DerivedMesh *dm, MeshSampleRayFp ray_cb, void *userdata);
 
-void BKE_mesh_sample_storage_single(struct MSurfaceSampleStorage *storage, struct MSurfaceSample *sample);
-void BKE_mesh_sample_storage_array(struct MSurfaceSampleStorage *storage, struct MSurfaceSample *samples, int capacity);
-void BKE_mesh_sample_storage_release(struct MSurfaceSampleStorage *storage);
+struct MeshSampleGenerator *BKE_mesh_sample_gen_volume_random_bbray(struct DerivedMesh *dm, unsigned int seed, float density);
 
-int BKE_mesh_sample_generate_random(struct MSurfaceSampleStorage *dst, struct DerivedMesh *dm, unsigned int seed, int totsample);
+void BKE_mesh_sample_free_generator(struct MeshSampleGenerator *gen);
 
-typedef bool (*MeshSampleRayCallback)(void *userdata, float ray_start[3], float ray_end[3]);
-int BKE_mesh_sample_generate_raycast(struct MSurfaceSampleStorage *dst, struct DerivedMesh *dm, MeshSampleRayCallback ray_cb, void *userdata, int totsample);
+bool BKE_mesh_sample_generate(struct MeshSampleGenerator *gen, struct MeshSample *sample);
 
 /* ==== Utilities ==== */
 
@@ -62,7 +67,7 @@ struct ParticleSystem;
 struct ParticleData;
 struct BVHTreeFromMesh;
 
-bool BKE_mesh_sample_from_particle(struct MSurfaceSample *sample, struct ParticleSystem *psys, struct DerivedMesh *dm, struct ParticleData *pa);
-bool BKE_mesh_sample_to_particle(struct MSurfaceSample *sample, struct ParticleSystem *psys, struct DerivedMesh *dm, struct BVHTreeFromMesh *bvhtree, struct ParticleData *pa);
+bool BKE_mesh_sample_from_particle(struct MeshSample *sample, struct ParticleSystem *psys, struct DerivedMesh *dm, struct ParticleData *pa);
+bool BKE_mesh_sample_to_particle(struct MeshSample *sample, struct ParticleSystem *psys, struct DerivedMesh *dm, struct BVHTreeFromMesh *bvhtree, struct ParticleData *pa);
 
 #endif  /* __BKE_MESH_SAMPLE_H__ */
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index dac5ccd..2d3c44b 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1312,7 +1312,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
 	/* 41: CD_CUSTOMLOOPNORMAL */
 	{sizeof(short[2]), "vec2s", 1, NULL, NULL, NULL, NULL, NULL, NULL},
 	/* 42: CD_MESH_SAMPLE */
-	{sizeof(MSurfaceSample), "MSurfaceSample", 1, NULL, NULL, NULL, NULL, NULL, NULL},
+	{sizeof(MeshSample), "MeshSample", 1, NULL, NULL, NULL, NULL, NULL, NULL},
 };
 
 /* note, numbers are from trunk and need updating for bmesh */
@@ -1329,7 +1329,7 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
 	/* 30-34 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDPreviewLoopCol", "CDBMElemPyPtr", "CDPaintMask",
 	/* 35-36 */ "CDGridPaintMask", "CDMVertSkin",
 	/* 37-38 */ "CDFreestyleEdge", "CDFreestyleFace",
-	/* 39-42 */ "CDMLoopTangent", "CDTessLoopNormal", "CDCustomLoopNormal", "CDMSurfaceSample",
+	/* 39-42 */ "CDMLoopTangent", "CDTessLoopNormal", "CDCustomLoopNormal", "CDMeshSample",
 };
 
 
diff --git a/source/blender/blenkernel/intern/mesh_sample.c b/source/blender/blenkernel/intern/mesh_sample.c
index c36d2add..e798865 100644
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@ -43,7 +43,12 @@
 
 /* ==== Evaluate ==== */
 
-bool BKE_mesh_sample_eval(DerivedMesh *dm, const MSurfaceSample *sample, float loc[3], float nor[3], float tang[3])
+bool BKE_mesh_sample_is_volume_sample(const MeshSample *sample)
+{
+	return sample->orig_verts[0] == 0 && sample->orig_verts[1] == 0;
+}
+
+bool BKE_mesh_sample_eval(DerivedMesh *dm, const MeshSample *sample, float loc[3], float nor[3], float tang[3])
 {
 	MVert *mverts = dm->getVertArray(dm);
 	unsigned int totverts = (unsigned int)dm->getNumVerts(dm);
@@ -53,56 +58,65 @@ bool BKE_mesh_sample_eval(DerivedMesh *dm, const MSurfaceSample *sample, float l
 	zero_v3(nor);
 	zero_v3(tang);
 	
-	if (sample->orig_verts[0] >= totverts ||
-	    sample->orig_verts[1] >= totverts ||
-	    sample->orig_verts[2] >= totverts)
-		return false;
-	
-	v1 = &mverts[sample->orig_verts[0]];
-	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]);
+	if (BKE_mesh_sample_is_volume_sample(sample)) {
+		/* VOLUME SAMPLE */
+		copy_v3_v3(loc, sample->orig_weights);
 	}
-	
-	{ /* normal */
-		float vnor[3];
+	else {
+		/* SURFACE SAMPLE */
+		if (sample->orig_verts[0] >= totverts ||
+		    sample->orig_verts[1] >= totverts ||
+		    sample->orig_verts[2] >= totverts)
+			return false;
 		
-		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]);
+		v1 = &mverts[sample->orig_verts[0]];
+		v2 = &mverts[sample->orig_verts[1]];
+		v3 = &mverts[sample->orig_verts[2]];
 		
-		normalize_v3(nor);
-	}
-	
-	{ /* tangent */
-		float edge[3];
+		{ /* 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]);
+		}
 		
-		/* XXX simply using the v1-v2 edge as a tangent vector for now ...
+		{ /* 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);
+			
+			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);
+		}
 	}
 	
 	return true;
 }
 
-bool BKE_mesh_sample_shapekey(Key *key, KeyBlock *kb, const MSurfaceSample *sample, float loc[3])
+bool BKE_mesh_sample_shapekey(Key *key, KeyBlock *kb, const MeshSample *sample, float loc[3])
 {
 	float *v1, *v2, *v3;
-	
+
+	(void)key;  /* Unused in release builds. */
+
 	BLI_assert(key->elemsize == 3 * sizeof(float));
 	BLI_assert(sample->orig_verts[0] < (unsigned int)kb->totelem);
 	BLI_assert(sample->orig_verts[1] < (unsigned int)kb->totelem);
@@ -124,7 +138,7 @@ bool BKE_mesh_sample_shapekey(Key *key, KeyBlock *kb, const MSurfaceSample *samp
 
 /* ==== Sampling Utilities ==== */
 
-BLI_INLINE void mesh_sample_weights_from_loc(MSurfaceSample *sample, DerivedMesh *dm, int face_index, const float loc[3])
+BLI_INLINE void mesh_sample_weights_from_loc(MeshSample *sample, DerivedMesh *dm, int face_index, const float loc[3])
 {
 	MFace *face = &dm->getTessFaceArray(dm)[face_index];
 	unsigned int index[4] = { face->v1, face->v2, face->v3, face->v4 };
@@ -149,108 +163,278 @@ BLI_INLINE void mesh_sample_weights_from_loc(MSurfaceSample *sample, DerivedMesh
 
 /* ==== Sampling ==== */
 
-static bool mesh_sample_store_array_sample(void *vdata, int capacity, int index, const MSurfaceSample *sample)
+typedef void (*GeneratorFreeFp)(struct MeshSampleGenerator *gen);
+typedef bool (*GeneratorMakeSampleFp)(struct MeshSampleGenerator *gen, struct MeshSample *sample);
+
+typedef struct MeshSampleGenerator
 {
-	MSurfaceSample *data = vdata;
-	if (index >= capacity)
-		return false;
-	
-	data[index] = *sample;
-	return true;
-}
+	GeneratorFreeFp free;
+	GeneratorMakeSampleFp make_sample;
+} MeshSampleGenerator;
 
-void BKE_mesh_sample_storage_single(MSurfaceSamp

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list