[Bf-blender-cvs] [5f44f4a] strand_editmode: Intermediate commit: switching strand edit data to BMesh.

Lukas Tönne noreply at git.blender.org
Mon Apr 20 14:22:52 CEST 2015


Commit: 5f44f4a2ffcbe7ab12aa02aac7ed22471d6807f5
Author: Lukas Tönne
Date:   Thu Nov 27 19:18:46 2014 +0100
Branches: strand_editmode
https://developer.blender.org/rB5f44f4a2ffcbe7ab12aa02aac7ed22471d6807f5

Intermediate commit: switching strand edit data to BMesh.

Hair/Strand editing will only use a subset of the bmesh topology and
expect a specific topology that needs to be verified and enforced.
However, this extra requirement is much less work than reimplementing a
whole edit data system with the same feature set as bmesh and avoids
much redundant code.

Conflicts:
	source/blender/blenkernel/intern/customdata.c
	source/blender/makesdna/DNA_customdata_types.h

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

M	source/blender/blenkernel/BKE_edithair.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/edithair.c
M	source/blender/blenkernel/intern/edithair_particles.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/bmesh/CMakeLists.txt
M	source/blender/bmesh/bmesh.h
M	source/blender/bmesh/intern/bmesh_mesh_conv.c
M	source/blender/bmesh/intern/bmesh_operators_private.h
A	source/blender/bmesh/intern/bmesh_strands.c
A	source/blender/bmesh/intern/bmesh_strands.h
A	source/blender/bmesh/intern/bmesh_strands_conv.c
A	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/makesdna/DNA_customdata_types.h
M	source/blender/makesdna/DNA_particle_types.h

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

diff --git a/source/blender/blenkernel/BKE_edithair.h b/source/blender/blenkernel/BKE_edithair.h
index 4f28aa9..e579a23 100644
--- a/source/blender/blenkernel/BKE_edithair.h
+++ b/source/blender/blenkernel/BKE_edithair.h
@@ -36,95 +36,31 @@
 
 #include "DNA_customdata_types.h"
 
-/* hair curve */
-typedef struct HairEditCurve {
-	void *data;
-	
-	struct HairEditVertex *v;
-} HairEditCurve;
+#include "BKE_customdata.h"
+#include "bmesh.h"
 
-typedef struct HairEditVertex {
-	struct HairEditVertex *next, *prev; /* next/prev verts on the strand */
-	
-	void *data;
+typedef struct BMEditStrands {
+	struct BMesh *bm;
 	
-	float co[3];
-} HairEditVertex;
-
-typedef struct HairEditData {
-	int totcurves, totverts;
+	/*this is for undoing failed operations*/
+	struct BMEditStrands *emcopy;
+	int emcopyusers;
 	
-	/* element pools */
-	struct BLI_mempool *cpool, *vpool;
+	/*selection mode*/
+	short selectmode;
 	
-	CustomData cdata, vdata;
-} HairEditData;
-
-/* ==== Iterators ==== */
-
-/* these iterate over all elements of a specific
- * type in the mesh.
- *
- * be sure to keep 'bm_iter_itype_htype_map' in sync with any changes
- */
-typedef enum HairEditIterType {
-	HAIREDIT_CURVES_OF_MESH = 1,
-	HAIREDIT_VERTS_OF_MESH = 2,
-	HAIREDIT_VERTS_OF_CURVE = 3,
-} HairEditIterType;
-
-#define HAIREDIT_ITYPE_MAX 4
-
-#define HAIREDIT_ITER(ele, iter, data, itype) \
-	for (ele = HairEdit_iter_new(iter, data, itype, NULL); ele; ele = HairEdit_iter_step(iter))
-
-#define HAIREDIT_ITER_INDEX(ele, iter, data, itype, indexvar) \
-	for (ele = HairEdit_iter_new(iter, data, itype, NULL), indexvar = 0; ele; ele = HairEdit_iter_step(iter), (indexvar)++)
-
-/* a version of HAIREDIT_ITER which keeps the next item in storage
- * so we can delete the current item */
-#ifdef DEBUG
-#  define HAIREDIT_ITER_MUTABLE(ele, ele_next, iter, data, itype) \
-	for (ele = HairEdit_iter_new(iter, data, itype, NULL); \
-	ele ? ((void)((iter)->count = HairEdit_iter_mesh_count(itype, data)), \
-	       (void)(ele_next = HairEdit_iter_step(iter)), 1) : 0; \
-	ele = ele_next)
-#else
-#  define HAIREDIT_ITER_MUTABLE(ele, ele_next, iter, data, itype) \
-	for (ele = HairEdit_iter_new(iter, data, itype, NULL); ele ? ((ele_next = HairEdit_iter_step(iter)), 1) : 0; ele = ele_next)
-#endif
+	/* Object this editmesh came from (if it came from one) */
+	struct Object *ob;
+} BMEditStrands;
 
-
-#define HAIREDIT_ITER_ELEM(ele, iter, data, itype) \
-	for (ele = HairEdit_iter_new(iter, NULL, itype, data); ele; ele = HairEdit_iter_step(iter))
-
-#define HAIREDIT_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar) \
-	for (ele = HairEdit_iter_new(iter, NULL, itype, data), indexvar = 0; ele; ele = HairEdit_iter_step(iter), (indexvar)++)
-
-#include "intern/edithair_inline.h"
-
-/* =================== */
-
-struct HairEditData *BKE_edithair_create(void);
-
-void BKE_edithair_data_free(struct HairEditData *hedit);
-void BKE_edithair_free(struct HairEditData *hedit);
-
-void BKE_edithair_clear(struct HairEditData *hedit);
-
-void BKE_edithair_get_min_max(struct HairEditData *hedit, float r_min[3], float r_max[3]);
-
-struct HairEditCurve *BKE_edithair_curve_create(struct HairEditData *hedit, struct HairEditCurve *example);
-
-int BKE_edithair_curve_vertex_count(struct HairEditData *hedit, struct HairEditCurve *c);
-struct HairEditVertex *BKE_edithair_curve_extend(struct HairEditData *hedit, struct HairEditCurve *c, struct HairEditVertex *example, int num);
+struct BMEditStrands *BKE_editstrands_create(struct BMesh *bm);
+struct BMEditStrands *BKE_editstrands_copy(struct BMEditStrands *em);
+void BKE_editstrands_update_linked_customdata(struct BMEditStrands *em);
+void BKE_editstrands_free(struct BMEditStrands *em);
 
 /* === particle conversion === */
 
-struct Object;
-struct ParticleSystem;
-
-void BKE_edithair_from_particles(struct HairEditData *hedit, struct Object *ob, struct ParticleSystem *psys);
-void BKE_edithair_to_particles(struct HairEditData *hedit, struct Object *ob, struct ParticleSystem *psys);
+struct BMesh *BKE_particles_to_bmesh(struct Object *ob, struct ParticleSystem *psys);
+void BKE_particles_from_bmesh(struct Object *ob, struct ParticleSystem *psys);
 
 #endif
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index a05082a..5fa778b 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1313,11 +1313,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
 	{sizeof(short[4][3]), "", 0, NULL, NULL, NULL, NULL, layerSwap_flnor, NULL},
 	/* 41: CD_CUSTOMLOOPNORMAL */
 	{sizeof(short[2]), "vec2s", 1, NULL, NULL, NULL, NULL, NULL, NULL},
-	/* 42: CD_HAIR_CURVE */
-	{sizeof(HairEditCurve), "HairEditCurve", 1, NULL, NULL, NULL, NULL, NULL, NULL},
-	/* 43: CD_HAIR_VERT */
-	{sizeof(HairEditVertex), "HairEditVertex", 1, NULL, NULL, NULL, NULL, NULL, NULL},
-	/* 44: CD_MESH_SAMPLE */
+	/* 42: CD_MESH_SAMPLE */
 	{sizeof(MSurfaceSample), "MSurfaceSample", 1, NULL, NULL, NULL, NULL, NULL, NULL},
 };
 
diff --git a/source/blender/blenkernel/intern/edithair.c b/source/blender/blenkernel/intern/edithair.c
index af0ea4e..30d1a11 100644
--- a/source/blender/blenkernel/intern/edithair.c
+++ b/source/blender/blenkernel/intern/edithair.c
@@ -39,6 +39,41 @@
 #include "BKE_customdata.h"
 #include "BKE_edithair.h"
 
+BMEditStrands *BKE_editstrands_create(BMesh *bm)
+{
+	BMEditStrands *es = MEM_callocN(sizeof(BMEditStrands), __func__);
+	
+	es->bm = bm;
+	
+	return es;
+}
+
+BMEditStrands *BKE_editstrands_copy(BMEditStrands *em)
+{
+	BMEditStrands *es_copy = MEM_callocN(sizeof(BMEditStrands), __func__);
+	*es_copy = *em;
+	
+	es_copy->bm = BM_mesh_copy(em->bm);
+	
+	return es_copy;
+}
+
+void BKE_editstrands_update_linked_customdata(BMEditStrands *em)
+{
+	BMesh *bm = em->bm;
+	
+	/* this is done for BMEditMesh, but should never exist for strands */
+	BLI_assert(!CustomData_has_layer(&bm->pdata, CD_MTEXPOLY));
+}
+
+/*does not free the BMEditStrands struct itself*/
+void BKE_editstrands_free(BMEditStrands *em)
+{
+	if (em->bm)
+		BM_mesh_free(em->bm);
+}
+
+#if 0
 static const int chunksize_default_totcurve = 512;
 static const int allocsize_default_totcurve = 512;
 
@@ -255,3 +290,4 @@ void  *hairedit_iter__vert_of_curve_step(struct HairEditIter__vert_of_curve *ite
 }
 
 /* =================== */
+#endif
diff --git a/source/blender/blenkernel/intern/edithair_particles.c b/source/blender/blenkernel/intern/edithair_particles.c
index 667d0b4..785ee00 100644
--- a/source/blender/blenkernel/intern/edithair_particles.c
+++ b/source/blender/blenkernel/intern/edithair_particles.c
@@ -39,6 +39,30 @@
 #include "BKE_edithair.h"
 #include "BKE_particle.h"
 
+#include "intern/bmesh_strands_conv.h"
+
+BMesh *BKE_particles_to_bmesh(Object *UNUSED(ob), ParticleSystem *psys)
+{
+	BMesh *bm;
+	const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_PSYS(psys);
+
+	bm = BM_mesh_create(&allocsize);
+
+	BM_strands_bm_from_psys(bm, psys, true, psys->shapenr);
+
+	return bm;
+}
+
+void BKE_particles_from_bmesh(Object *UNUSED(ob), ParticleSystem *psys)
+{
+	BMesh *bm = psys->hairedit ? psys->hairedit->bm : NULL;
+	
+	if (bm)
+		BM_strands_bm_to_psys(bm, psys);
+}
+
+
+#if 0
 /* ==== convert particle data to hair edit ==== */
 
 static void copy_edit_curve(HairEditData *hedit, HairEditCurve *curve, ParticleData *pa)
@@ -169,3 +193,4 @@ void BKE_edithair_to_particles(HairEditData *hedit, Object *UNUSED(ob), Particle
 	free_particle_data(psys);
 	create_particle_data(psys, hedit);
 }
+#endif
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 1adfff3..b529d39 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -548,7 +548,7 @@ void psys_free(Object *ob, ParticleSystem *psys)
 		if (psys->edit && psys->free_edit)
 			psys->free_edit(psys->edit);
 		if (psys->hairedit)
-			BKE_edithair_free(psys->hairedit);
+			BKE_editstrands_free(psys->hairedit);
 
 		if (psys->child) {
 			MEM_freeN(psys->child);
diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt
index 80adb59..6002b41 100644
--- a/source/blender/bmesh/CMakeLists.txt
+++ b/source/blender/bmesh/CMakeLists.txt
@@ -114,6 +114,10 @@ set(SRC
 	intern/bmesh_queries.c
 	intern/bmesh_queries.h
 	intern/bmesh_queries_inline.h
+	intern/bmesh_strands.c
+	intern/bmesh_strands.h
+	intern/bmesh_strands_conv.c
+	intern/bmesh_strands_conv.h
 	intern/bmesh_structure.c
 	intern/bmesh_structure.h
 	intern/bmesh_structure_inline.h
diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h
index 87b1818..7ba700d 100644
--- a/source/blender/bmesh/bmesh.h
+++ b/source/blender/bmesh/bmesh.h
@@ -256,6 +256,8 @@ extern "C" {
 #include "intern/bmesh_mesh_validate.h"
 #include "intern/bmesh_mods.h"
 #include "intern/bmesh_operators.h"
+#include "intern/bmesh_strands.h"
+#include "intern/bmesh_strands_conv.h"
 #include "intern/bmesh_polygon.h"
 #include "intern/bmesh_queries.h"
 #include "intern/bmesh_walkers.h"
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c
index 3630bb7..cb75d75 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
@@ -98,6 +98,9 @@
 #include "bmesh.h"
 #include "intern/bmesh_private.h" /* for element checking */
 
+/* XXX stupid hack: linker otherwise strips bmesh_strands_conv.c because it is not used inside bmesh */
+void *__dummy_hack__ = &BM_strands_count_psys_keys;
+
 /**
  * Currently this is only used for Python scripts
  * which may fail to keep matching UV/TexFace layers.
diff --git a/source/blender/bmesh/intern/bmesh_operators_private.h b/source/blender/bmesh/intern/bmesh_operators_private.h
index 979f7d2..8b9c25b 100644
--- a/source/blender/bmesh/intern/bmesh_operators_private.h
+++ b/source/blender/bmesh/intern/bmesh_operators_private.h
@@ -54,6 +54,7 @@ void bmo_create_icosphere_exec(BMesh *bm, BMOperator *op);
 void bmo_create_monkey_exec(BMesh *bm, BMOperator *op);
 void bmo_create_uvsphere_exec(BMesh *bm, BMOperator *op);
 void bmo_create_vert_exec(BMesh *bm, BMOperator *op);
+//vo

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list