diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-12-02 19:26:25 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-04-20 13:23:11 +0300 |
commit | 2590231315b6d47cc83e6f39e8d922f53c40eb1c (patch) | |
tree | dec38705400c911799821a5a2c628ac18a2d5ba6 /source/blender/editors/hair | |
parent | 83b20c7ddfe60ca779f53a0d337cc1b7854fb14c (diff) |
Constrain hair root vertices to their mesh location after applying tools.
Conflicts:
source/blender/bmesh/intern/bmesh_interp.c
source/blender/bmesh/intern/bmesh_interp.h
Diffstat (limited to 'source/blender/editors/hair')
-rw-r--r-- | source/blender/editors/hair/hair_edit.c | 22 | ||||
-rw-r--r-- | source/blender/editors/hair/hair_stroke.c | 5 |
2 files changed, 17 insertions, 10 deletions
diff --git a/source/blender/editors/hair/hair_edit.c b/source/blender/editors/hair/hair_edit.c index 90884f5f17d..6b3bff3815c 100644 --- a/source/blender/editors/hair/hair_edit.c +++ b/source/blender/editors/hair/hair_edit.c @@ -43,8 +43,10 @@ #include "DNA_screen_types.h" #include "BKE_brush.h" +#include "BKE_cdderivedmesh.h" #include "BKE_context.h" #include "BKE_depsgraph.h" +#include "BKE_DerivedMesh.h" #include "BKE_edithair.h" #include "BKE_paint.h" #include "BKE_particle.h" @@ -73,13 +75,22 @@ static bool has_hair_data(Object *ob) return false; } -static bool init_hair_edit(Object *ob) +static bool init_hair_edit(Scene *scene, Object *ob) { ParticleSystem *psys = psys_get_current(ob); - if (psys->part->type == PART_HAIR) { + BMesh *bm; + DerivedMesh *dm; + + if (psys && psys->part->type == PART_HAIR) { if (!psys->hairedit) { - BMesh *bm = BKE_particles_to_bmesh(ob, psys); - psys->hairedit = BKE_editstrands_create(bm); + bm = BKE_particles_to_bmesh(ob, psys); + + if (ob->type == OB_MESH || ob->derivedFinal) + dm = ob->derivedFinal ? ob->derivedFinal : mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); + else + dm = NULL; + + psys->hairedit = BKE_editstrands_create(bm, dm); } return true; } @@ -146,6 +157,7 @@ int hair_edit_toggle_poll(bContext *C) static int hair_edit_toggle_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); const int mode_flag = OB_MODE_HAIR_EDIT; const bool is_mode_set = (ob->mode & mode_flag) != 0; @@ -157,7 +169,7 @@ static int hair_edit_toggle_exec(bContext *C, wmOperator *op) } if (!is_mode_set) { - init_hair_edit(ob); + init_hair_edit(scene, ob); ob->mode |= mode_flag; // toggle_particle_cursor(C, 1); diff --git a/source/blender/editors/hair/hair_stroke.c b/source/blender/editors/hair/hair_stroke.c index 6933c3b9837..656adb2817a 100644 --- a/source/blender/editors/hair/hair_stroke.c +++ b/source/blender/editors/hair/hair_stroke.c @@ -49,11 +49,6 @@ typedef void (*VertexToolCb)(HairToolData *data, BMVert *v, float factor); BLI_INLINE float hair_tool_filter_vertex(HairToolData *data, BMVert *v) { - // XXX for testing only, roots should be constrained instead by - // re-adjusting their location _after_ applying the tool, - // during the general process of constraint solving for strands -// if (BM_strands_vert_is_root(v)) -// return 0.0f; return 1.0f; // TODO } |