[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