[Bf-blender-cvs] [1d28579] strand_editmode strand_gpu: Merge branch 'mesh_samples' into strand_editmode

Lukas Tönne noreply at git.blender.org
Thu Jul 14 10:08:02 CEST 2016


Commit: 1d28579daf03ad3133f02400106f1853a4237761
Author: Lukas Tönne
Date:   Thu Jul 14 09:59:52 2016 +0200
Branches: strand_editmode strand_gpu
https://developer.blender.org/rB1d28579daf03ad3133f02400106f1853a4237761

Merge branch 'mesh_samples' into strand_editmode

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



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

diff --cc source/blender/blenkernel/intern/mesh_sample.c
index afc4959,24782ea..ca4cb6d
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@@ -687,92 -657,3 +662,93 @@@ bool BKE_mesh_sample_generate(MeshSampl
  {
  	return gen->make_sample(gen, sample);
  }
++
 +/* ==== Utilities ==== */
 +
 +#include "DNA_particle_types.h"
 +
 +#include "BKE_bvhutils.h"
 +#include "BKE_particle.h"
 +
 +bool BKE_mesh_sample_from_particle(MeshSample *sample, ParticleSystem *psys, DerivedMesh *dm, ParticleData *pa)
 +{
 +	MVert *mverts;
 +	MFace *mface;
 +	float mapfw[4];
 +	int mapindex;
 +	float *co1 = NULL, *co2 = NULL, *co3 = NULL, *co4 = NULL;
 +	float vec[3];
 +	float w[4];
 +	
 +	if (!psys_get_index_on_dm(psys, dm, pa, &mapindex, mapfw))
 +		return false;
 +	
 +	mface = dm->getTessFaceData(dm, mapindex, CD_MFACE);
 +	mverts = dm->getVertDataArray(dm, CD_MVERT);
 +	
 +	co1 = mverts[mface->v1].co;
 +	co2 = mverts[mface->v2].co;
 +	co3 = mverts[mface->v3].co;
 +	
 +	if (mface->v4) {
 +		co4 = mverts[mface->v4].co;
 +		
 +		interp_v3_v3v3v3v3(vec, co1, co2, co3, co4, mapfw);
 +	}
 +	else {
 +		interp_v3_v3v3v3(vec, co1, co2, co3, mapfw);
 +	}
 +	
 +	/* test both triangles of the face */
 +	interp_weights_face_v3(w, co1, co2, co3, NULL, vec);
 +	if (w[0] <= 1.0f && w[1] <= 1.0f && w[2] <= 1.0f) {
 +		sample->orig_verts[0] = mface->v1;
 +		sample->orig_verts[1] = mface->v2;
 +		sample->orig_verts[2] = mface->v3;
 +	
 +		copy_v3_v3(sample->orig_weights, w);
 +		return true;
 +	}
 +	else if (mface->v4) {
 +		interp_weights_face_v3(w, co3, co4, co1, NULL, vec);
 +		sample->orig_verts[0] = mface->v3;
 +		sample->orig_verts[1] = mface->v4;
 +		sample->orig_verts[2] = mface->v1;
 +	
 +		copy_v3_v3(sample->orig_weights, w);
 +		return true;
 +	}
 +	else
 +		return false;
 +}
 +
 +bool BKE_mesh_sample_to_particle(MeshSample *sample, ParticleSystem *UNUSED(psys), DerivedMesh *dm, BVHTreeFromMesh *bvhtree, ParticleData *pa)
 +{
 +	BVHTreeNearest nearest;
 +	float vec[3], nor[3], tang[3];
 +	
 +	BKE_mesh_sample_eval(dm, sample, vec, nor, tang);
 +	
 +	nearest.index = -1;
 +	nearest.dist_sq = FLT_MAX;
 +	BLI_bvhtree_find_nearest(bvhtree->tree, vec, &nearest, bvhtree->nearest_callback, bvhtree);
 +	if (nearest.index >= 0) {
 +		MFace *mface = dm->getTessFaceData(dm, nearest.index, CD_MFACE);
 +		MVert *mverts = dm->getVertDataArray(dm, CD_MVERT);
 +		
 +		float *co1 = mverts[mface->v1].co;
 +		float *co2 = mverts[mface->v2].co;
 +		float *co3 = mverts[mface->v3].co;
 +		float *co4 = mface->v4 ? mverts[mface->v4].co : NULL;
 +		
 +		pa->num = nearest.index;
 +		pa->num_dmcache = DMCACHE_NOTFOUND;
 +		
 +		interp_weights_face_v3(pa->fuv, co1, co2, co3, co4, vec);
 +		pa->foffset = 0.0f; /* XXX any sensible way to reconstruct this? */
 +		
 +		return true;
 +	}
 +	else
 +		return false;
 +}




More information about the Bf-blender-cvs mailing list