[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