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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to