[Bf-blender-cvs] [cdc1f42] hair_immediate_fixes: Apply the hair matrices when converting from particle keys to bmesh, so the edit data is consistently in object space.
Lukas Tönne
noreply at git.blender.org
Sat Dec 27 11:32:05 CET 2014
Commit: cdc1f42d451bb4a6a90915304604019723d84c5b
Author: Lukas Tönne
Date: Fri Nov 28 17:58:04 2014 +0100
Branches: hair_immediate_fixes
https://developer.blender.org/rBcdc1f42d451bb4a6a90915304604019723d84c5b
Apply the hair matrices when converting from particle keys to bmesh,
so the edit data is consistently in object space.
===================================================================
M source/blender/blenkernel/intern/edithair.c
M source/blender/bmesh/intern/bmesh_strands_conv.c
M source/blender/bmesh/intern/bmesh_strands_conv.h
===================================================================
diff --git a/source/blender/blenkernel/intern/edithair.c b/source/blender/blenkernel/intern/edithair.c
index 4bd5a8a..d9ced64 100644
--- a/source/blender/blenkernel/intern/edithair.c
+++ b/source/blender/blenkernel/intern/edithair.c
@@ -107,7 +107,7 @@ BMesh *BKE_particles_to_bmesh(Object *ob, ParticleSystem *psys)
if (psmd && psmd->dm) {
DM_ensure_tessface(psmd->dm);
- BM_strands_bm_from_psys(bm, psys, psmd->dm, true, psys->shapenr);
+ BM_strands_bm_from_psys(bm, ob, psys, psmd->dm, true, psys->shapenr);
}
return bm;
@@ -126,7 +126,7 @@ void BKE_particles_from_bmesh(Object *ob, ParticleSystem *psys)
bvhtree_from_mesh_faces(&bvhtree, psmd->dm, 0.0, 2, 6);
- BM_strands_bm_to_psys(bm, psys, psmd->dm, &bvhtree);
+ BM_strands_bm_to_psys(bm, ob, psys, psmd->dm, &bvhtree);
free_bvhtree_from_mesh(&bvhtree);
}
diff --git a/source/blender/bmesh/intern/bmesh_strands_conv.c b/source/blender/bmesh/intern/bmesh_strands_conv.c
index 95ee8cd..411d5ed 100644
--- a/source/blender/bmesh/intern/bmesh_strands_conv.c
+++ b/source/blender/bmesh/intern/bmesh_strands_conv.c
@@ -171,16 +171,19 @@ static KeyBlock *bm_set_shapekey_from_psys(BMesh *bm, ParticleSystem *psys, int
}
/* create vertex and edge data for BMesh based on particle hair keys */
-static void bm_make_particles(BMesh *bm, ParticleSystem *psys, struct DerivedMesh *emitter_dm, float (*keyco)[3], int cd_shape_keyindex_offset)
+static void bm_make_particles(BMesh *bm, Object *ob, ParticleSystem *psys, struct DerivedMesh *emitter_dm, float (*keyco)[3], int cd_shape_keyindex_offset)
{
KeyBlock *block;
ParticleData *pa;
HairKey *hkey;
int p, k, j;
+
int vindex, eindex;
BMVert *v = NULL, *v_prev;
BMEdge *e;
+ float hairmat[4][4];
+
/* XXX currently all particles and keys have the same mass, this may change */
float mass = psys->part->mass;
@@ -188,11 +191,18 @@ static void bm_make_particles(BMesh *bm, ParticleSystem *psys, struct DerivedMes
eindex = 0;
for (p = 0, pa = psys->particles; p < psys->totpart; ++p, ++pa) {
- for (k = 0, hkey = pa->hair; k < pa->totkey; ++k, ++hkey) {
+ /* hair keys are in a local "hair space", but edit data should be in object space */
+ psys_mat_hair_to_object(ob, emitter_dm, psys->part->from, pa, hairmat);
+ for (k = 0, hkey = pa->hair; k < pa->totkey; ++k, ++hkey) {
+ float co[3];
+
+ copy_v3_v3(co, keyco ? keyco[vindex] : hkey->co);
+ mul_m4_v3(hairmat, co);
+
v_prev = v;
- v = BM_vert_create(bm, keyco ? keyco[vindex] : hkey->co, NULL, BM_CREATE_SKIP_CD);
- BM_elem_index_set(v, vindex++); /* set_ok */
+ v = BM_vert_create(bm, co, NULL, BM_CREATE_SKIP_CD);
+ BM_elem_index_set(v, vindex); /* set_ok */
/* transfer flag */
// v->head.hflag = BM_vert_flag_from_mflag(mvert->flag & ~SELECT);
@@ -233,9 +243,11 @@ static void bm_make_particles(BMesh *bm, ParticleSystem *psys, struct DerivedMes
}
}
+ vindex += 1;
+
if (k > 0) {
e = BM_edge_create(bm, v_prev, v, NULL, BM_CREATE_SKIP_CD);
- BM_elem_index_set(e, eindex++); /* set_ok; one less edge than vertices for each particle */
+ BM_elem_index_set(e, eindex); /* set_ok; one less edge than vertices for each particle */
/* transfer flags */
// e->head.hflag = BM_edge_flag_from_mflag(medge->flag & ~SELECT);
@@ -246,10 +258,12 @@ static void bm_make_particles(BMesh *bm, ParticleSystem *psys, struct DerivedMes
// }
/* Copy Custom Data */
-// CustomData_to_bmesh_block(&me->edata, &bm->edata, vindex, &e->head.data, true);
+// CustomData_to_bmesh_block(&me->edata, &bm->edata, eindex, &e->head.data, true);
CustomData_bmesh_set_default(&bm->edata, &e->head.data);
+
+ eindex += 1;
}
-
+
} /* hair keys */
} /* particles */
@@ -260,7 +274,7 @@ static void bm_make_particles(BMesh *bm, ParticleSystem *psys, struct DerivedMes
/**
* \brief ParticleSystem -> BMesh
*/
-void BM_strands_bm_from_psys(BMesh *bm, ParticleSystem *psys, struct DerivedMesh *emitter_dm,
+void BM_strands_bm_from_psys(BMesh *bm, Object *ob, ParticleSystem *psys, struct DerivedMesh *emitter_dm,
const bool set_key, int act_key_nr)
{
KeyBlock *actkey;
@@ -303,7 +317,7 @@ void BM_strands_bm_from_psys(BMesh *bm, ParticleSystem *psys, struct DerivedMesh
cd_shape_keyindex_offset = psys->key ? CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX) : -1;
- bm_make_particles(bm, psys, emitter_dm, set_key ? keyco : NULL, cd_shape_keyindex_offset);
+ bm_make_particles(bm, ob, psys, emitter_dm, set_key ? keyco : NULL, cd_shape_keyindex_offset);
#if 0 /* TODO */
@@ -429,7 +443,7 @@ BLI_INLINE void bmesh_quick_edgedraw_flag(MEdge *med, BMEdge *e)
}
#endif
-static void make_particle_hair(BMesh *bm, BMVert *root, ParticleSystem *psys, struct DerivedMesh *emitter_dm, struct BVHTreeFromMesh *emitter_bvhtree, struct ParticleData *pa)
+static void make_particle_hair(BMesh *bm, BMVert *root, Object *ob, ParticleSystem *psys, struct DerivedMesh *emitter_dm, struct BVHTreeFromMesh *emitter_bvhtree, struct ParticleData *pa)
{
int totkey = BM_strands_keys_count(root);
HairKey *hair;
@@ -439,6 +453,8 @@ static void make_particle_hair(BMesh *bm, BMVert *root, ParticleSystem *psys, st
HairKey *hkey;
int k;
+ float inv_hairmat[4][4];
+
pa->alive = PARS_ALIVE;
pa->flag = 0;
@@ -460,10 +476,6 @@ static void make_particle_hair(BMesh *bm, BMVert *root, ParticleSystem *psys, st
hkey = hair;
k = 0;
BM_ITER_STRANDS_ELEM(v, &iter, root, BM_VERTS_OF_STRAND) {
- copy_v3_v3(hkey->co, v->co);
- hkey->time = totkey > 0 ? (float)k / (float)(totkey - 1) : 0.0f;
- hkey->weight = BM_elem_float_data_named_get(&bm->vdata, v, CD_PROP_FLT, CD_PSYS_WEIGHT);
-
/* root */
if (k == 0) {
MSurfaceSample root_loc;
@@ -474,8 +486,17 @@ static void make_particle_hair(BMesh *bm, BMVert *root, ParticleSystem *psys, st
zero_v4(pa->fuv);
pa->foffset = 0.0f;
}
+
+ /* edit data is in object space, hair keys must be converted back into "hair space" */
+ psys_mat_hair_to_object(ob, emitter_dm, psys->part->from, pa, inv_hairmat);
+ invert_m4(inv_hairmat);
}
+ mul_v3_m4v3(hkey->co, inv_hairmat, v->co);
+
+ hkey->time = totkey > 0 ? (float)k / (float)(totkey - 1) : 0.0f;
+ hkey->weight = BM_elem_float_data_named_get(&bm->vdata, v, CD_PROP_FLT, CD_PSYS_WEIGHT);
+
++hkey;
++k;
@@ -489,7 +510,7 @@ static void make_particle_hair(BMesh *bm, BMVert *root, ParticleSystem *psys, st
pa->totkey = totkey;
}
-void BM_strands_bm_to_psys(BMesh *bm, ParticleSystem *psys, struct DerivedMesh *emitter_dm, struct BVHTreeFromMesh *emitter_bvhtree)
+void BM_strands_bm_to_psys(BMesh *bm, Object *ob, ParticleSystem *psys, struct DerivedMesh *emitter_dm, struct BVHTreeFromMesh *emitter_bvhtree)
{
ParticleData *particles, *oldparticles;
int ototpart, ototkey, ntotpart;
@@ -520,7 +541,7 @@ void BM_strands_bm_to_psys(BMesh *bm, ParticleSystem *psys, struct DerivedMesh *
p = 0;
BM_ITER_STRANDS(root, &iter, bm, BM_STRANDS_OF_MESH) {
- make_particle_hair(bm, root, psys, emitter_dm, emitter_bvhtree, pa);
+ make_particle_hair(bm, root, ob, psys, emitter_dm, emitter_bvhtree, pa);
++pa;
++p;
diff --git a/source/blender/bmesh/intern/bmesh_strands_conv.h b/source/blender/bmesh/intern/bmesh_strands_conv.h
index caa27ee..92a29ef 100644
--- a/source/blender/bmesh/intern/bmesh_strands_conv.h
+++ b/source/blender/bmesh/intern/bmesh_strands_conv.h
@@ -34,6 +34,7 @@
struct BMesh;
struct Mesh;
+struct Object;
struct ParticleSystem;
struct DerivedMesh;
struct BVHTreeFromMesh;
@@ -48,9 +49,9 @@ void BM_strands_cd_flag_apply(struct BMesh *bm, const char cd_flag);
char BM_strands_cd_flag_from_bmesh(struct BMesh *bm);
int BM_strands_count_psys_keys(struct ParticleSystem *psys);
-void BM_strands_bm_from_psys(struct BMesh *bm, struct ParticleSystem *psys, struct DerivedMesh *emitter_dm,
+void BM_strands_bm_from_psys(struct BMesh *bm, struct Object *ob, struct ParticleSystem *psys, struct DerivedMesh *emitter_dm,
const bool set_key, int act_key_nr);
-void BM_strands_bm_to_psys(struct BMesh *bm, struct ParticleSystem *psys, struct DerivedMesh *emitter_dm, struct BVHTreeFromMesh *emitter_bvhtree);
+void BM_strands_bm_to_psys(struct BMesh *bm, struct Object *ob, struct ParticleSystem *psys, struct DerivedMesh *emitter_dm, struct BVHTreeFromMesh *emitter_bvhtree);
#define BMALLOC_TEMPLATE_FROM_PSYS(psys) { (CHECK_TYPE_INLINE(psys, ParticleSystem *), \
BM_strands_count_psys_keys(psys)), (BM_strands_count_psys_keys(psys) - (psys)->totpart), 0, 0 }
More information about the Bf-blender-cvs
mailing list