[Bf-blender-cvs] [ec51e83] strand_editmode: Proof-of-concept: Hair edit data from regular meshes.
Lukas Tönne
noreply at git.blender.org
Mon Apr 18 18:22:54 CEST 2016
Commit: ec51e83798c3739ae9295560fbe2a6fa46bcbf7f
Author: Lukas Tönne
Date: Mon Apr 18 18:13:26 2016 +0200
Branches: strand_editmode
https://developer.blender.org/rBec51e83798c3739ae9295560fbe2a6fa46bcbf7f
Proof-of-concept: Hair edit data from regular meshes.
This adds the possibility to edit a regular mesh like strand data.
It's more of a test for independence from particles than a real use case,
but could come in handy anyway.
===================================================================
M source/blender/blenkernel/BKE_editstrands.h
M source/blender/blenkernel/intern/editstrands.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/bmesh/intern/bmesh_strands_conv.c
M source/blender/bmesh/intern/bmesh_strands_conv.h
M source/blender/editors/hair/CMakeLists.txt
M source/blender/editors/hair/hair_edit.c
M source/blender/editors/hair/hair_intern.h
A source/blender/editors/hair/hair_object_mesh.c
M source/blender/editors/hair/hair_object_particles.c
M source/blender/makesdna/DNA_mesh_types.h
M source/blender/physics/intern/strands.cpp
===================================================================
diff --git a/source/blender/blenkernel/BKE_editstrands.h b/source/blender/blenkernel/BKE_editstrands.h
index 01082a0..920b44d 100644
--- a/source/blender/blenkernel/BKE_editstrands.h
+++ b/source/blender/blenkernel/BKE_editstrands.h
@@ -41,6 +41,7 @@
struct BMesh;
struct DerivedMesh;
+struct Mesh;
struct Object;
typedef struct BMEditStrands {
@@ -90,7 +91,11 @@ void BKE_editstrands_ensure(struct BMEditStrands *es);
/* === particle conversion === */
-struct BMesh *BKE_particles_to_bmesh(struct Object *ob, struct ParticleSystem *psys);
-void BKE_particles_from_bmesh(struct Object *ob, struct ParticleSystem *psys);
+struct BMesh *BKE_editstrands_particles_to_bmesh(struct Object *ob, struct ParticleSystem *psys);
+void BKE_editstrands_particles_from_bmesh(struct Object *ob, struct ParticleSystem *psys);
+
+/* === mesh conversion === */
+struct BMesh *BKE_editstrands_mesh_to_bmesh(struct Object *ob, struct Mesh *me);
+void BKE_editstrands_mesh_from_bmesh(struct Object *ob);
#endif
diff --git a/source/blender/blenkernel/intern/editstrands.c b/source/blender/blenkernel/intern/editstrands.c
index 3e03bf9..88fb1d0 100644
--- a/source/blender/blenkernel/intern/editstrands.c
+++ b/source/blender/blenkernel/intern/editstrands.c
@@ -31,10 +31,13 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_mempool.h"
#include "DNA_customdata_types.h"
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_particle_types.h"
@@ -46,10 +49,12 @@
#include "BKE_editstrands.h"
#include "BKE_effect.h"
#include "BKE_mesh_sample.h"
+#include "BKE_object.h"
#include "BKE_particle.h"
#include "BPH_strands.h"
+#include "intern/bmesh_mesh_conv.h"
#include "intern/bmesh_strands_conv.h"
BMEditStrands *BKE_editstrands_create(BMesh *bm, DerivedMesh *root_dm)
@@ -78,10 +83,18 @@ BMEditStrands *BKE_editstrands_copy(BMEditStrands *es)
*/
BMEditStrands *BKE_editstrands_from_object(Object *ob)
{
- ParticleSystem *psys = psys_get_current(ob);
- if (psys) {
- return psys->hairedit;
+ if (ob->type == OB_MESH) {
+ Mesh *me = ob->data;
+ if (me->edit_strands)
+ return me->edit_strands;
}
+
+ {
+ ParticleSystem *psys = psys_get_current(ob);
+ if (psys && psys->hairedit)
+ return psys->hairedit;
+ }
+
return NULL;
}
@@ -163,7 +176,7 @@ void BKE_editstrands_ensure(BMEditStrands *es)
/* === particle conversion === */
-BMesh *BKE_particles_to_bmesh(Object *ob, ParticleSystem *psys)
+BMesh *BKE_editstrands_particles_to_bmesh(Object *ob, ParticleSystem *psys)
{
ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
@@ -183,7 +196,7 @@ BMesh *BKE_particles_to_bmesh(Object *ob, ParticleSystem *psys)
return bm;
}
-void BKE_particles_from_bmesh(Object *ob, ParticleSystem *psys)
+void BKE_editstrands_particles_from_bmesh(Object *ob, ParticleSystem *psys)
{
ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
BMesh *bm = psys->hairedit ? psys->hairedit->bm : NULL;
@@ -202,3 +215,44 @@ void BKE_particles_from_bmesh(Object *ob, ParticleSystem *psys)
}
}
}
+
+
+/* === mesh conversion === */
+
+BMesh *BKE_editstrands_mesh_to_bmesh(Object *ob, Mesh *me)
+{
+ const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(me);
+ BMesh *bm;
+
+ bm = BM_mesh_create(&allocsize);
+
+ BM_mesh_bm_from_me(bm, me, false, true, ob->shapenr);
+ BM_strands_cd_flag_ensure(bm, 0);
+
+ editstrands_calc_segment_lengths(bm);
+
+ return bm;
+}
+
+void BKE_editstrands_mesh_from_bmesh(Object *ob)
+{
+ Mesh *me = ob->data;
+ BMesh *bm = me->edit_strands->bm;
+
+ /* Workaround for T42360, 'ob->shapenr' should be 1 in this case.
+ * however this isn't synchronized between objects at the moment. */
+ if (UNLIKELY((ob->shapenr == 0) && (me->key && !BLI_listbase_is_empty(&me->key->block)))) {
+ bm->shapenr = 1;
+ }
+
+ BM_mesh_bm_to_me(bm, me, false);
+
+#ifdef USE_TESSFACE_DEFAULT
+ BKE_mesh_tessface_calc(me);
+#endif
+
+ /* free derived mesh. usually this would happen through depsgraph but there
+ * are exceptions like file save that will not cause this, and we want to
+ * avoid ending up with an invalid derived mesh then */
+ BKE_object_free_derived_caches(ob);
+}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 4f80a24..4fcccd8 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4534,6 +4534,7 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
mesh->bb = NULL;
mesh->edit_btmesh = NULL;
+ mesh->edit_strands = NULL;
/* happens with old files */
if (mesh->mselect == NULL) {
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 4871dc2..c0b7f80 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2073,6 +2073,7 @@ static void write_meshes(WriteData *wd, ListBase *idbase)
CustomData_reset(&mesh->pdata);
CustomData_reset(&mesh->ldata);
mesh->edit_btmesh = NULL;
+ mesh->edit_strands = NULL;
/* now fill in polys to mfaces */
/* XXX This breaks writing desing, by using temp allocated memory, which will likely generate
diff --git a/source/blender/bmesh/intern/bmesh_strands_conv.c b/source/blender/bmesh/intern/bmesh_strands_conv.c
index 98657ca..d74ceac 100644
--- a/source/blender/bmesh/intern/bmesh_strands_conv.c
+++ b/source/blender/bmesh/intern/bmesh_strands_conv.c
@@ -52,18 +52,6 @@ const char *CD_HAIR_ROOT_LOCATION = "HAIR_ROOT_LOCATION";
/* ------------------------------------------------------------------------- */
-int BM_strands_count_psys_keys(ParticleSystem *psys)
-{
- ParticleData *pa;
- int p;
- int totkeys = 0;
-
- for (p = 0, pa = psys->particles; p < psys->totpart; ++p, ++pa)
- totkeys += pa->totkey;
-
- return totkeys;
-}
-
/**
* Currently this is only used for Python scripts
* which may fail to keep matching UV/TexFace layers.
@@ -108,6 +96,19 @@ char BM_strands_cd_flag_from_bmesh(BMesh *UNUSED(bm))
return cd_flag;
}
+/* particles */
+
+int BM_strands_count_psys_keys(ParticleSystem *psys)
+{
+ ParticleData *pa;
+ int p;
+ int totkeys = 0;
+
+ for (p = 0, pa = psys->particles; p < psys->totpart; ++p, ++pa)
+ totkeys += pa->totkey;
+
+ return totkeys;
+}
#if 0
static KeyBlock *bm_set_shapekey_from_psys(BMesh *bm, ParticleSystem *psys, int totvert, int act_key_nr)
diff --git a/source/blender/bmesh/intern/bmesh_strands_conv.h b/source/blender/bmesh/intern/bmesh_strands_conv.h
index 683c1e9..334fabb 100644
--- a/source/blender/bmesh/intern/bmesh_strands_conv.h
+++ b/source/blender/bmesh/intern/bmesh_strands_conv.h
@@ -49,6 +49,8 @@ void BM_strands_cd_flag_ensure(struct BMesh *bm, const char cd_flag);
void BM_strands_cd_flag_apply(struct BMesh *bm, const char cd_flag);
char BM_strands_cd_flag_from_bmesh(struct BMesh *bm);
+/* particles */
+
int BM_strands_count_psys_keys(struct ParticleSystem *psys);
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);
diff --git a/source/blender/editors/hair/CMakeLists.txt b/source/blender/editors/hair/CMakeLists.txt
index 277484f..3f9785b 100644
--- a/source/blender/editors/hair/CMakeLists.txt
+++ b/source/blender/editors/hair/CMakeLists.txt
@@ -41,6 +41,7 @@ set(SRC
hair_cursor.c
hair_edit.c
hair_mirror.c
+ hair_object_mesh.c
hair_object_particles.c
hair_ops.c
hair_select.c
diff --git a/source/blender/editors/hair/hair_edit.c b/source/blender/editors/hair/hair_edit.c
index 2e99d83..6133efe 100644
--- a/source/blender/editors/hair/hair_edit.c
+++ b/source/blender/editors/hair/hair_edit.c
@@ -65,6 +65,8 @@
#include "hair_intern.h"
#include "paint_intern.h"
+#define USE_PARTICLES 0
+
int hair_edit_poll(bContext *C)
{
Object *obact;
@@ -128,7 +130,11 @@ int hair_edit_toggle_poll(bContext *C)
if (CTX_data_edit_object(C))
return false;
- return ED_hair_object_has_hair_particle_data(ob);
+#if USE_PARTICLES
+ return ED_hair_object_has_hair_particle_data(ob);
+#else
+ return ob->type == OB_MESH;
+#endif
}
static void toggle_hair_cursor(bContext *C, bool enable)
@@ -162,14 +168,22 @@ static int hair_edit_toggle_exec(bContext *C, wmOperator *op)
}
if (!is_mode_set) {
- ED_hair_object_init_particle_edit(scene, ob);
+#if USE_PARTICLES
+ ED_hair_object_init_particle_edit(scene, ob);
+#else
+ ED_hair_object_init_mesh_edit(scene, ob);
+#endif
ob->mode |= mode_flag;
toggle_hair_cursor(C, true);
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_HAIR, NULL);
}
else {
+#if USE_PARTICLES
ED_hair_object_apply_particle_edit(ob);
+#else
+ ED_hair_object_apply_mesh_edit(ob);
+#endif
ob->mode &= ~mode_flag;
toggle_hair_cursor(C, false);
diff --git a/source/blender/editors/hair/hair_intern.h b/source/blender/editors/hair/hair_intern.h
index d26e9cf..afecc27 100644
--- a/source/blender/editors/hair/hair_intern.h
+++ b/source/blender/editors/hair/hair_intern.h
@@ -59,6 +59,10 @@ void HAIR_OT_select_linked(struct wmOperatorType *ot);
/* hair_stroke.c */
void HAIR_OT_stroke(struct wmOperatorType *ot);
+/* hair_object_mesh.c */
+bool ED_hair_object_init_mesh_edit(struct Scene *scene, struct Object *ob);
+bool ED_hair_object_apply_mesh_edit(struct Object *ob);
+
/* hair_object_particles.c */
bool ED_hair_object_has_hair_particle_data(struct Object *ob);
bool ED_hair_object_init_particle_edit(struct Scene *scene, struct Object *ob);
diff --git a/source/blender/editors/hair/hair_object_particles.c b/source/blender/editors/hair/hair_object_mesh.c
similarity index 56%
copy from source/blender/editors/hair/hair_object_particles.c
copy to source/blender/editors/hair/hair_object_mesh.c
index 6cd60c1..a1140c0 100644
--- a/source/blender/editors/hair/hair_object_particles.c
+++ b/source/blender/editors/hair/hair_object_mesh.c
@@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/editors/hair/hair_object_particles.c
+/** \file blender/editors/hair/ha
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list