Revision: 18286
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18286
Author:   joeedh
Date:     2009-01-03 08:38:40 +0100 (Sat, 03 Jan 2009)

Log Message:
-----------
Refactored the way operators are defined, to make it
less messy, confusing and easier to maintain.

Also added a function to build a pointer array from
elements that share a certain flag (like
selection), and another function that counts the
number of elements with that flag.  Still need to
make use of them properly though.

Modified Paths:
--------------
    branches/bmesh/bmesh/bmesh_marking.h
    branches/bmesh/bmesh/bmesh_operators.h
    branches/bmesh/bmesh/intern/bmesh_marking.c
    branches/bmesh/bmesh/intern/bmesh_mods.c
    branches/bmesh/bmesh/intern/bmesh_operators.c
    branches/bmesh/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/bmesh/operators/bmesh_dupeops.c

Added Paths:
-----------
    branches/bmesh/bmesh/intern/bmesh_opdefines.c

Modified: branches/bmesh/bmesh/bmesh_marking.h
===================================================================
--- branches/bmesh/bmesh/bmesh_marking.h        2009-01-03 07:25:22 UTC (rev 
18285)
+++ branches/bmesh/bmesh/bmesh_marking.h        2009-01-03 07:38:40 UTC (rev 
18286)
@@ -7,6 +7,9 @@
 void BM_Select_Face(struct BMesh *bm, struct BMFace *f, int select);
 void BM_Selectmode_Set(struct BMesh *bm, int selectmode);
 
+/*counts number of elements with flag set*/
+int BM_CountFlag(struct BMesh *bm, int type, int flag);
+
 void BM_Select(struct BMesh *bm, void *element, int select);
 int BM_Is_Selected(BMesh *bm, void *element);
 

Modified: branches/bmesh/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/bmesh/bmesh_operators.h      2009-01-03 07:25:22 UTC (rev 
18285)
+++ branches/bmesh/bmesh/bmesh_operators.h      2009-01-03 07:38:40 UTC (rev 
18286)
@@ -47,10 +47,15 @@
 /*need to refactor code to use this*/
 typedef struct BMOpDefine {
        int slottypes[BMOP_MAX_SLOTS];
-       int totslots;
+       void (*exec)(BMesh *bm, BMOperator *op);
+       int totslot;
        int flag;
 } BMOpDefine;
 
+/*BMOpDefine->flag*/
+//doesn't do anything at the moment.
+#define BMO_NOFLAGS            1
+
 /*API for operators*/
 void BMO_Init_Op(struct BMOperator *op, int opcode);
 void BMO_Exec_Op(struct BMesh *bm, struct BMOperator *op);
@@ -72,45 +77,39 @@
 /*--------------------begin operator defines------------------------*/
 /*split op*/
 #define BMOP_SPLIT                             0
-#define BMOP_SPLIT_MULTIN              0
-#define BMOP_SPLIT_MULTOUT             1
-#define BMOP_SPLIT_TOTSLOT             2
 
-static const int BMOP_SPLIT_TYPEINFO[BMOP_SPLIT_TOTSLOT] = {
-       BMOP_OPSLOT_PNT_BUF,
-       BMOP_OPSLOT_PNT_BUF
+enum {
+       BMOP_SPLIT_MULTIN,
+       BMOP_SPLIT_MULTOUT,
+       BMOP_SPLIT_TOTSLOT,
 };
 
 /*dupe op*/
-#define BMOP_DUPE                              1
+#define BMOP_DUPE      1
 
-#define BMOP_DUPE_MULTIN               0
-#define BMOP_DUPE_ORIG                 1
-#define BMOP_DUPE_NEW                  2
-#define BMOP_DUPE_TOTSLOT              3
-
-static const int BMOP_DUPE_TYPEINFO[BMOP_DUPE_TOTSLOT] = {
-       BMOP_OPSLOT_PNT_BUF,
-       BMOP_OPSLOT_PNT_BUF,
-       BMOP_OPSLOT_PNT_BUF,
+enum {
+       BMOP_DUPE_MULTIN,
+       BMOP_DUPE_ORIG,
+       BMOP_DUPE_NEW,
+       BMOP_DUPE_TOTSLOT
 };
 
 /*delete op*/
-#define BMOP_DEL                       2
-#define BMOP_DEL_MULTIN                0
-#define BMOP_DEL_CONTEXT       1
-#define BMOP_DEL_TOTSLOT       2
+#define BMOP_DEL       2
 
-/*BMOP_DEL_CONTEXT*/
-#define BMOP_DEL_VERTS                         1
-#define BMOP_DEL_EDGESFACES                    2
-#define BMOP_DEL_ONLYFACES                     3
-#define BMOP_DEL_FACES                         4
-#define BMOP_DEL_ALL                           5
+enum {
+       BMOP_DEL_MULTIN,
+       BMOP_DEL_CONTEXT,
+       BMOP_DEL_TOTSLOT,
+};
 
-static const int BMOP_DEL_TYPEINFO[BMOP_DEL_TOTSLOT] = {
-       BMOP_OPSLOT_PNT_BUF,
-       BMOP_OPSLOT_INT
+/*BMOP_DEL_CONTEXT*/
+enum {
+       BMOP_DEL_VERTS = 1,
+       BMOP_DEL_EDGESFACES,
+       BMOP_DEL_ONLYFACES,
+       BMOP_DEL_FACES,
+       BMOP_DEL_ALL,
 };
 
 /*editmesh->bmesh op*/
@@ -118,51 +117,21 @@
 #define BMOP_FROM_EDITMESH_EM  0
 #define BMOP_FROM_EDITMESH_TOTSLOT 1
 
-static const int BMOP_FROM_EDITMESH_TYPEINFO[BMOP_FROM_EDITMESH_TOTSLOT] = {
-       BMOP_OPSLOT_PNT
-};
-
-#define FROMEDIT_OPTIONS               NEEDFLAGS
-
 /*bmesh->editmesh op*/
 #define BMOP_TO_EDITMESH               4
 #define BMOP_TO_EDITMESH_EM            0
 #define BMOP_TO_EDITMESH_TOTSLOT 1
 
-static const int BMOP_TO_EDITMESH_TYPEINFO[BMOP_TO_EDITMESH_TOTSLOT] = {
-       BMOP_OPSLOT_PNT
-};
-
-
+/*edge subdivide op*/
 #define BMOP_ESUBDIVIDE                        5
 #define BMOP_ESUBDIVIDE_EDGES  0
 #define BMOP_ESUBDIVIDE_TOTSLOT        1
 
-static const int BMOP_ESUBDIVIDE_TYPEINFO[] = {
-       BMOP_OPSLOT_PNT_BUF
-};
-
 /*keep this updated!*/
 #define BMOP_TOTAL_OPS                         6
 /*-------------------------------end operator 
defines-------------------------------*/
 
-/*Following arrays are used by the init functions to init operator slot 
typecodes*/
-static const int *BMOP_TYPEINFO[] = {
-       BMOP_SPLIT_TYPEINFO,
-       BMOP_DUPE_TYPEINFO,
-       BMOP_DEL_TYPEINFO,
-       BMOP_FROM_EDITMESH_TYPEINFO,
-       BMOP_TO_EDITMESH_TYPEINFO,
-       BMOP_ESUBDIVIDE_TYPEINFO
-};
+extern BMOpDefine *opdefines[];
+extern int bmesh_total_ops;
 
-static const int BMOP_TYPETOTALS[] = {
-       BMOP_SPLIT_TOTSLOT,
-       BMOP_DUPE_TOTSLOT,
-       BMOP_DEL_TOTSLOT,
-       BMOP_FROM_EDITMESH_TOTSLOT,
-       BMOP_TO_EDITMESH_TOTSLOT,
-       BMOP_ESUBDIVIDE_TOTSLOT
-};
-
 #endif

Modified: branches/bmesh/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_marking.c 2009-01-03 07:25:22 UTC (rev 
18285)
+++ branches/bmesh/bmesh/intern/bmesh_marking.c 2009-01-03 07:38:40 UTC (rev 
18286)
@@ -200,6 +200,31 @@
 }
 
 
+int BM_CountFlag(struct BMesh *bm, int type, int flag)
+{
+       BMHeader *head;
+       BMIter iter;
+       int tot = 0;
+
+       if (type & BM_VERT) {
+               for (head = BMIter_New(&iter, bm, BM_VERTS, NULL); head; 
head=BMIter_Step(&iter)) {
+                       if (head->flag & flag) tot++;
+               }
+       }
+       if (type & BM_EDGE) {
+               for (head = BMIter_New(&iter, bm, BM_EDGES, NULL); head; 
head=BMIter_Step(&iter)) {
+                       if (head->flag & flag) tot++;
+               }
+       }
+       if (type & BM_FACE) {
+               for (head = BMIter_New(&iter, bm, BM_FACES, NULL); head; 
head=BMIter_Step(&iter)) {
+                       if (head->flag & flag) tot++;
+               }
+       }
+
+       return tot;
+}
+
 void BM_Select(struct BMesh *bm, void *element, int select)
 {
        BMHeader *head = element;

Modified: branches/bmesh/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_mods.c    2009-01-03 07:25:22 UTC (rev 
18285)
+++ branches/bmesh/bmesh/intern/bmesh_mods.c    2009-01-03 07:38:40 UTC (rev 
18286)
@@ -124,13 +124,22 @@
        return bmesh_jfke(bm, f1, f2, jed);
 }
 
+/*connects two verts together, automatically (if very naively) finding the
+  face they both share (if there is one) and splittling it.  use this at your 
+  own risk, as it doesn't handle the many complex cases it should (like 
zero-area faces,
+  multiple faces, etc).
+
+  this is really only meant for cases where you don't know before hand the face
+  the two verts belong to for splitting (e.g. the subdivision operator).
+*/
+
 BMEdge *BM_Connect_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **nf) {
        /*search radial disk for face that contains e1 and e2*/
        BMIter iter, iter2;
        BMVert *v;
        BMLoop *nl;
        BMFace *face;
-       
+
        /*this isn't the best thing in the world.  it doesn't handle cases 
where there's
          multiple faces yet.  that might require a convexity test to figure 
out which
          face is "best," and who knows what for non-manifold conditions.*/

Added: branches/bmesh/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_opdefines.c                               
(rev 0)
+++ branches/bmesh/bmesh/intern/bmesh_opdefines.c       2009-01-03 07:38:40 UTC 
(rev 18286)
@@ -0,0 +1,57 @@
+#include "bmesh.h"
+#include "bmesh_private.h"
+
+#include <stdio.h>
+
+BMOpDefine def_subdop = {
+       {BMOP_OPSLOT_PNT_BUF},
+       esubdivide_exec,
+       BMOP_ESUBDIVIDE_TOTSLOT,
+       0
+};
+
+BMOpDefine def_edit2bmesh = {
+       {BMOP_OPSLOT_PNT},
+       NULL,
+       BMOP_TO_EDITMESH_TOTSLOT,
+       0
+};
+
+BMOpDefine def_bmesh2edit = {
+       {BMOP_OPSLOT_PNT},
+       NULL,
+       BMOP_FROM_EDITMESH_TOTSLOT,
+       0
+};
+
+BMOpDefine def_delop = {
+       {BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_INT},
+       delop_exec,
+       BMOP_DEL_TOTSLOT,
+       0
+};
+
+BMOpDefine def_dupeop = {
+       {BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF},
+       dupeop_exec,
+       BMOP_DUPE_TOTSLOT,
+       0
+};
+
+BMOpDefine def_splitop = {
+       {BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF},
+       splitop_exec,
+       BMOP_SPLIT_TOTSLOT,
+       0
+};
+
+BMOpDefine *opdefines[] = {
+       &def_splitop,
+       &def_dupeop,
+       &def_delop,
+       &def_edit2bmesh,
+       &def_bmesh2edit,
+       &def_subdop,
+};
+
+int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));

Modified: branches/bmesh/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_operators.c       2009-01-03 07:25:22 UTC 
(rev 18285)
+++ branches/bmesh/bmesh/intern/bmesh_operators.c       2009-01-03 07:38:40 UTC 
(rev 18286)
@@ -14,18 +14,8 @@
 static void alloc_flag_layer(BMesh *bm);
 static void free_flag_layer(BMesh *bm);
 
-void esubdivide_exec(BMesh *bmesh, BMOperator *op);
-
 /*function pointer table*/
 typedef void (*opexec)(struct BMesh *bm, struct BMOperator *op);
-const opexec BMOP_OPEXEC[BMOP_TOTAL_OPS] = {
-       splitop_exec,
-       dupeop_exec,
-       delop_exec,
-       NULL,
-       NULL,
-       esubdivide_exec,
-};
 
 /*operator slot type information - size of one element of the type given.*/
 const int BMOP_OPSLOT_TYPEINFO[BMOP_OPSLOT_TYPES] = {
@@ -86,17 +76,18 @@
 
        memset(op, 0, sizeof(BMOperator));
        op->type = opcode;
+       
+       //currently not used, flags are always allocated
+       op->needflag = !(opdefines[opcode]->flag & BMO_NOFLAGS);
 
-       if (BMOP_OPTIONS[opcode] & NEEDFLAGS) op->needflag = 1;
-
        /*initialize the operator slot types*/
-       for(i = 0; i < BMOP_TYPETOTALS[opcode]; i++) {
-               op->slots[i].slottype = BMOP_TYPEINFO[opcode][i];
+       for(i = 0; i < opdefines[opcode]->totslot; i++) {
+               op->slots[i].slottype = opdefines[opcode]->slottypes[i];
                op->slots[i].index = i;
        }
 
        /*callback*/
-       op->exec = BMOP_OPEXEC[opcode];
+       op->exec = opdefines[opcode]->exec;
 
        /*memarena, used for operator's slot buffers*/
        op->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
@@ -178,8 +169,8 @@
                dest_slot->data.buf = NULL;
                dest_slot->len = source_slot->len;
                if(dest_slot->len){
-                       dest_slot->data.buf = 
BLI_memarena_alloc(dest_op->arena, BMOP_TYPETOTALS[dest_slot->slottype] * 
dest_slot->len);
-                       memcpy(dest_slot->data.buf, source_slot->data.buf, 
BMOP_TYPETOTALS[dest_slot->slottype] * dest_slot->len);
+                       dest_slot->data.buf = 
BLI_memarena_alloc(dest_op->arena, opdefines[dest_slot->slottype]->totslot * 
dest_slot->len);
+                       memcpy(dest_slot->data.buf, source_slot->data.buf, 
opdefines[dest_slot->slottype]->totslot * dest_slot->len);
                }
        } else {
                dest_slot->data = source_slot->data;
@@ -318,7 +309,7 @@
        
        op->slots[slotcode].len = len;
        if(len)
-               op->slots[slotcode].data.buf = BLI_memarena_alloc(op->arena, 
BMOP_TYPEINFO[op->type][slotcode] * len);
+               op->slots[slotcode].data.buf = BLI_memarena_alloc(op->arena, 
opdefines[op->type]->slottypes[slotcode] * len);
        return op->slots[slotcode].data.buf;
 }
 
@@ -331,6 +322,47 @@
  *
 */
 
+void BMO_HeaderFlag_To_Slot(BMesh *bm, BMOperator *op, int slotcode, int flag, 
int type)
+{
+       BMIter elements;
+       BMHeader *e;
+       BMOpSlot *output = BMO_GetSlot(op, slotcode);
+       int totelement=0, i=0;
+       
+       totelement = BM_CountFlag(bm, type, BM_SELECT);
+
+       if(totelement){
+               alloc_slot_buffer(op, slotcode, totelement);
+
+               if (type & BM_VERT) {
+                       for (e = BMIter_New(&elements, bm, BM_VERTS, bm); e; e 
= BMIter_Step(&elements)) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to