merge with 2.5 (not trunk, last merge message said that on accident) at r22252
[blender.git] / source / blender / editors / mesh / editmesh_add.c
index 8651abac0a995a500776e52cdb060266e1fb44be..ff0814661ebd84cb6a5cfff6434a16e01a6eca2b 100644 (file)
 #include "BKE_object.h"
 #include "BKE_utildefines.h"
 #include "BKE_report.h"
 #include "BKE_object.h"
 #include "BKE_utildefines.h"
 #include "BKE_report.h"
-
-#include "BIF_retopo.h"
+#include "BKE_tessmesh.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
 
 #include "ED_mesh.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
 
 #include "ED_mesh.h"
+#include "ED_retopo.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
 #include "ED_util.h"
 #include "ED_view3d.h"
 #include "ED_util.h"
 #include "ED_view3d.h"
-#include "ED_screen.h"
 
 #include "bmesh.h"
 
 
 #include "bmesh.h"
 
 /* XXX */
 
 static float icovert[12][3] = {
 /* XXX */
 
 static float icovert[12][3] = {
-       {0,0,-200}, 
-       {144.72, -105.144,-89.443},
-       {-55.277, -170.128,-89.443}, 
-       {-178.885,0,-89.443},
-       {-55.277,170.128,-89.443}, 
-       {144.72,105.144,-89.443},
-       {55.277,-170.128,89.443},
-       {-144.72,-105.144,89.443},
-       {-144.72,105.144,89.443},
-       {55.277,170.128,89.443},
-       {178.885,0,89.443},
-       {0,0,200}
+       {0.0f,0.0f,-200.0f}, 
+       {144.72f, -105.144f,-89.443f},
+       {-55.277f, -170.128,-89.443f}, 
+       {-178.885f,0.0f,-89.443f},
+       {-55.277f,170.128f,-89.443f}, 
+       {144.72f,105.144f,-89.443f},
+       {55.277f,-170.128f,89.443f},
+       {-144.72f,-105.144f,89.443f},
+       {-144.72f,105.144f,89.443f},
+       {55.277f,170.128f,89.443f},
+       {178.885f,0.0f,89.443f},
+       {0.0f,0.0f,200.0f}
 };
 static short icoface[20][3] = {
        {1,0,2},
 };
 static short icoface[20][3] = {
        {1,0,2},
@@ -118,127 +119,6 @@ static short icoface[20][3] = {
        {10,9,11}
 };
 
        {10,9,11}
 };
 
-/* *************** add-click-mesh (extrude) operator ************** */
-
-static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
-{
-       ViewContext vc;
-       EditVert *eve, *v1;
-       float min[3], max[3];
-       int done= 0;
-       
-       em_setup_viewcontext(C, &vc);
-       
-       INIT_MINMAX(min, max);
-       
-       for(v1= vc.em->verts.first;v1; v1=v1->next) {
-               if(v1->f & SELECT) {
-                       DO_MINMAX(v1->co, min, max);
-                       done= 1;
-               }
-       }
-
-       /* call extrude? */
-       if(done) {
-               EditEdge *eed;
-               float vec[3], cent[3], mat[3][3];
-               float nor[3]= {0.0, 0.0, 0.0};
-               
-               /* check for edges that are half selected, use for rotation */
-               done= 0;
-               for(eed= vc.em->edges.first; eed; eed= eed->next) {
-                       if( (eed->v1->f & SELECT)+(eed->v2->f & SELECT) == SELECT ) {
-                               if(eed->v1->f & SELECT) VecSubf(vec, eed->v1->co, eed->v2->co);
-                               else VecSubf(vec, eed->v2->co, eed->v1->co);
-                               VecAddf(nor, nor, vec);
-                               done= 1;
-                       }
-               }
-               if(done) Normalize(nor);
-               
-               /* center */
-               VecAddf(cent, min, max);
-               VecMulf(cent, 0.5f);
-               VECCOPY(min, cent);
-               
-               Mat4MulVecfl(vc.obedit->obmat, min);    // view space
-               view3d_get_view_aligned_coordinate(&vc, min, event->mval);
-               Mat4Invert(vc.obedit->imat, vc.obedit->obmat); 
-               Mat4MulVecfl(vc.obedit->imat, min); // back in object space
-               
-               VecSubf(min, min, cent);
-               
-               /* calculate rotation */
-               Mat3One(mat);
-               if(done) {
-                       float dot;
-                       
-                       VECCOPY(vec, min);
-                       Normalize(vec);
-                       dot= INPR(vec, nor);
-
-                       if( fabs(dot)<0.999) {
-                               float cross[3], si, q1[4];
-                               
-                               Crossf(cross, nor, vec);
-                               Normalize(cross);
-                               dot= 0.5f*saacos(dot);
-                               si= (float)sin(dot);
-                               q1[0]= (float)cos(dot);
-                               q1[1]= cross[0]*si;
-                               q1[2]= cross[1]*si;
-                               q1[3]= cross[2]*si;
-                               
-                               QuatToMat3(q1, mat);
-                       }
-               }
-               
-               extrudeflag(vc.obedit, vc.em, SELECT, nor);
-               rotateflag(vc.em, SELECT, cent, mat);
-               translateflag(vc.em, SELECT, min);
-               
-               recalc_editnormals(vc.em);
-       }
-       else {
-               float mat[3][3],imat[3][3];
-               float *curs= give_cursor(vc.scene, vc.v3d);
-               
-               VECCOPY(min, curs);
-               view3d_get_view_aligned_coordinate(&vc, min, event->mval);
-               
-               eve= addvertlist(vc.em, 0, NULL);
-
-               Mat3CpyMat4(mat, vc.obedit->obmat);
-               Mat3Inv(imat, mat);
-               
-               VECCOPY(eve->co, min);
-               Mat3MulVecfl(imat, eve->co);
-               VecSubf(eve->co, eve->co, vc.obedit->obmat[3]);
-               
-               eve->f= SELECT;
-       }
-       
-       //retopo_do_all();
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit); 
-       DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA);
-       
-       return OPERATOR_FINISHED;
-}
-
-void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Duplicate or Extrude at 3D Cursor";
-       ot->idname= "MESH_OT_dupli_extrude_cursor";
-       
-       /* api callbacks */
-       ot->invoke= dupli_extrude_cursor;
-       ot->poll= ED_operator_editmesh;
-       
-       /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
 
 /* ********************** */
 
 
 /* ********************** */
 
@@ -341,23 +221,26 @@ int make_fgon(EditMesh *em, wmOperator *op, int make)
 static int make_fgon_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
 static int make_fgon_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
-       EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
+       EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
 
        if( make_fgon(em, op, 1) ) {
                DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);     
        
                WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
 
        if( make_fgon(em, op, 1) ) {
                DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);     
        
                WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-               
+
+               BKE_mesh_end_editmesh(obedit->data, em);
                return OPERATOR_FINISHED;
        }
                return OPERATOR_FINISHED;
        }
+
+       BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_CANCELLED;
 }
 
        return OPERATOR_CANCELLED;
 }
 
-void MESH_OT_make_fgon(struct wmOperatorType *ot)
+void MESH_OT_fgon_make(struct wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Make F-gon";
 {
        /* identifiers */
        ot->name= "Make F-gon";
-       ot->idname= "MESH_OT_make_fgon";
+       ot->idname= "MESH_OT_fgon_make";
        
        /* api callbacks */
        ot->exec= make_fgon_exec;
        
        /* api callbacks */
        ot->exec= make_fgon_exec;
@@ -370,23 +253,26 @@ void MESH_OT_make_fgon(struct wmOperatorType *ot)
 static int clear_fgon_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
 static int clear_fgon_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
-       EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
+       EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        
        if( make_fgon(em, op, 0) ) {
                DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);     
                
                WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        if( make_fgon(em, op, 0) ) {
                DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);     
                
                WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+               
+               BKE_mesh_end_editmesh(obedit->data, em);
                return OPERATOR_FINISHED;
        }
                return OPERATOR_FINISHED;
        }
+
+       BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_CANCELLED;
 }
 
        return OPERATOR_CANCELLED;
 }
 
-void MESH_OT_clear_fgon(struct wmOperatorType *ot)
+void MESH_OT_fgon_clear(struct wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Clear F-gon";
 {
        /* identifiers */
        ot->name= "Clear F-gon";
-       ot->idname= "MESH_OT_clear_fgon";
+       ot->idname= "MESH_OT_fgon_clear";
        
        /* api callbacks */
        ot->exec= clear_fgon_exec;
        
        /* api callbacks */
        ot->exec= clear_fgon_exec;
@@ -662,24 +548,54 @@ void addfaces_from_edgenet(EditMesh *em)
 // XXX DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
 }
 
 // XXX DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
 }
 
-static void addedgeface_mesh(EditMesh *em, wmOperator *op)
+static void addedgeface_mesh(Mesh *me, BMEditMesh *bem, wmOperator *op)
 {
 {
+       EditMesh *em;
        EditVert *eve, *neweve[4];
        EditEdge *eed;
        EditFace *efa;
        short amount=0;
        
        EditVert *eve, *neweve[4];
        EditEdge *eed;
        EditFace *efa;
        short amount=0;
        
-       if (em->selectmode & SCE_SELECT_VERTEX) {
-               /*return if bmesh vert connect does anything.*/
-               if (BM_ConnectVerts(em, BM_SELECT)) return;
+       /*return if bmesh vert connect does anything.*/
+       if (bem->selectmode & SCE_SELECT_VERTEX) {
+               BMesh *bm = bem->bm;
+               BMOperator bmop;
+               int len, ok;
+               
+               EDBM_InitOpf(bem, &bmop, op, "connectverts verts=%hv", BM_SELECT);
+               BMO_Exec_Op(bem->bm, &bmop);
+
+               len = BMO_GetSlot(&bmop, "edgeout")->len;               
+
+               ok = EDBM_FinishOp(bem, &bmop, op, 1);
+               if (!ok) return OPERATOR_CANCELLED;
+
+               if (len) return;        
        }
 
        }
 
-       if (em->selectmode & SCE_SELECT_FACE) {
-               /*return if bmesh face dissolve finds stuff to
-                 dissolve.*/
-               if (BM_DissolveFaces(em, BM_SELECT)) return;
+       /*return if bmesh face dissolve finds stuff to
+         dissolve.  this entire tool should be
+         bmeshafied eventually, but until then
+         hacks like this to integrate with it
+         are necassary.*/
+       if (bem->selectmode & SCE_SELECT_VERTEX) {
+               BMesh *bm = bem->bm;
+               BMOperator bmop;
+               int len, ok;
+               
+               EDBM_InitOpf(bem, &bmop, op, "dissolvefaces faces=%hf", BM_SELECT);
+               BMO_Exec_Op(bem->bm, &bmop);
+
+               len = BMO_GetSlot(&bmop, "regionout")->len;             
+               
+               ok = EDBM_FinishOp(bem, &bmop, op, 1);
+               if (!ok) return OPERATOR_CANCELLED;
+
+               if (len) return;        
        }
 
        }
 
+       em = BKE_mesh_get_editmesh(me);
+
        /* how many selected ? */
        if(em->selectmode & SCE_SELECT_EDGE) {
                /* in edge mode finding selected vertices means flushing down edge codes... */
        /* how many selected ? */
        if(em->selectmode & SCE_SELECT_EDGE) {
                /* in edge mode finding selected vertices means flushing down edge codes... */
@@ -698,16 +614,19 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
        if(amount==2) {
                eed= addedgelist(em, neweve[0], neweve[1], NULL);
                EM_select_edge(eed, 1);
        if(amount==2) {
                eed= addedgelist(em, neweve[0], neweve[1], NULL);
                EM_select_edge(eed, 1);
-
+               
+               BKE_mesh_end_editmesh(me, em);
                // XXX          DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); 
                return;
        }
        else if(amount > 4) {
                addfaces_from_edgenet(em);
                // XXX          DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); 
                return;
        }
        else if(amount > 4) {
                addfaces_from_edgenet(em);
+               BKE_mesh_end_editmesh(me, em);
                return;
        }
        else if(amount<2) {
                BKE_report(op->reports, RPT_ERROR, "More vertices are needed to make an edge/face");
                return;
        }
        else if(amount<2) {
                BKE_report(op->reports, RPT_ERROR, "More vertices are needed to make an edge/face");
+               BKE_mesh_end_editmesh(me, em);
                return;
        }
 
                return;
        }
 
@@ -746,6 +665,7 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
                                
                                if(count++ > 4){
                                        addfaces_from_edgenet(em);
                                
                                if(count++ > 4){
                                        addfaces_from_edgenet(em);
+                                       BKE_mesh_end_editmesh(me, em);
                                        return;
                                } else {
                                /* if 4 edges exist, we just create the face, convex or not */
                                        return;
                                } else {
                                /* if 4 edges exist, we just create the face, convex or not */
@@ -787,39 +707,10 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
                
                recalc_editnormals(em);
        }
                
                recalc_editnormals(em);
        }
-       }
 
 
-static int addedgeface_mesh_exec(bContext *C, wmOperator *op)
-{
-       Object *obedit= CTX_data_edit_object(C);
-       EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
-       
-       addedgeface_mesh(em, op);
-       
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-       
-       DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);     
-       
-       return OPERATOR_FINISHED;
-}
-
-void MESH_OT_add_edge_face(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Make Edge/Face";
-       ot->idname= "MESH_OT_add_edge_face";
-       
-       /* api callbacks */
-       ot->exec= addedgeface_mesh_exec;
-       ot->poll= ED_operator_editmesh;
-       
-       /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-       
+       BKE_mesh_end_editmesh(me, em);
 }
 
 }
 
-
-
 /* ************************ primitives ******************* */
 
 // HACK: these can also be found in cmoview.tga.c, but are here so that they can be found by linker
 /* ************************ primitives ******************* */
 
 // HACK: these can also be found in cmoview.tga.c, but are here so that they can be found by linker
@@ -989,7 +880,7 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
         * fill - end capping, and option to fill in circle
         * cent[3] - center of the data. 
         * */
         * fill - end capping, and option to fill in circle
         * cent[3] - center of the data. 
         * */
-       EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
+       EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        EditVert *eve, *v1=NULL, *v2, *v3, *v4=NULL, *vtop, *vdown;
        float phi, phid, vec[3];
        float q[4], cmat[3][3], nor[3]= {0.0, 0.0, 0.0};
        EditVert *eve, *v1=NULL, *v2, *v3, *v4=NULL, *vtop, *vdown;
        float phi, phid, vec[3];
        float q[4], cmat[3][3], nor[3]= {0.0, 0.0, 0.0};
@@ -997,8 +888,8 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
        
        EM_clear_flag_all(em, SELECT);
 
        
        EM_clear_flag_all(em, SELECT);
 
-       phid= 2*M_PI/tot;
-       phi= .25*M_PI;
+       phid= 2.0f*(float)M_PI/tot;
+       phi= .25f*(float)M_PI;
 
        switch(type) {
        case PRIM_GRID: /*  grid */
 
        switch(type) {
        case PRIM_GRID: /*  grid */
@@ -1110,7 +1001,9 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
                        }
 
                        dia*=200;
                        }
 
                        dia*=200;
-                       for(a=1; a<subdiv; a++) esubdivideflag(obedit, em, 2, dia, 0,1,0);
+
+                       for(a=1; a<subdiv; a++) esubdivideflag(obedit, em, 2, dia, 0.0, 0, 1, 0);
+                       
                        /* and now do imat */
                        eve= em->verts.first;
                        while(eve) {
                        /* and now do imat */
                        eve= em->verts.first;
                        while(eve) {
@@ -1270,6 +1163,8 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
        
        if(type!=0 && type!=13)
                righthandfaces(em, 1);  /* otherwise monkey has eyes in wrong direction */
        
        if(type!=0 && type!=13)
                righthandfaces(em, 1);  /* otherwise monkey has eyes in wrong direction */
+
+       BKE_mesh_end_editmesh(obedit->data, em);
 }
 
 
 }
 
 
@@ -1280,14 +1175,14 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
        Object *obedit= CTX_data_edit_object(C);
        Scene *scene = CTX_data_scene(C);
        View3D *v3d =CTX_wm_view3d(C);
        Object *obedit= CTX_data_edit_object(C);
        Scene *scene = CTX_data_scene(C);
        View3D *v3d =CTX_wm_view3d(C);
-       RegionView3D *rv3d= CTX_wm_region_view3d(C);
+       RegionView3D *rv3d= ED_view3d_context_rv3d(C);
        float *curs, mat[3][3], vmat[3][3], cmat[3][3], imat[3][3];
        
        Mat4One(primmat);
        
        float *curs, mat[3][3], vmat[3][3], cmat[3][3], imat[3][3];
        
        Mat4One(primmat);
        
-       if(rv3d)
+       if(rv3d && (U.flag & USER_ADD_VIEWALIGNED)) {
                Mat3CpyMat4(vmat, rv3d->viewmat);
                Mat3CpyMat4(vmat, rv3d->viewmat);
-       else
+       else
                Mat3One(vmat);
        
        /* inverse transform for view and object */
                Mat3One(vmat);
        
        /* inverse transform for view and object */
@@ -1299,9 +1194,9 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
        /* center */
        curs= give_cursor(scene, v3d);
        VECCOPY(primmat[3], curs);
        /* center */
        curs= give_cursor(scene, v3d);
        VECCOPY(primmat[3], curs);
+       VECSUB(primmat[3], primmat[3], obedit->obmat[3]);
        Mat3Inv(imat, mat);
        Mat3MulVecfl(imat, primmat[3]);
        Mat3Inv(imat, mat);
        Mat3MulVecfl(imat, primmat[3]);
-       VECSUB(primmat[3], primmat[3], obedit->obmat[3]);
        
        if(v3d) return v3d->grid;
        return 1.0f;
        
        if(v3d) return v3d->grid;
        return 1.0f;
@@ -1311,6 +1206,7 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
 
 static int add_primitive_plane_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_plane_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene= CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1320,16 +1216,17 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op)
        
        make_prim(obedit, PRIM_PLANE, mat, 4, 0, 0, dia, 0.0f, 0, 1);
        
        
        make_prim(obedit, PRIM_PLANE, mat, 4, 0, 0, dia, 0.0f, 0, 1);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_plane(wmOperatorType *ot)
+void MESH_OT_primitive_plane_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Plane";
 {
        /* identifiers */
        ot->name= "Add Plane";
-       ot->idname= "MESH_OT_add_primitive_plane";
+       ot->idname= "MESH_OT_primitive_plane_add";
        
        /* api callbacks */
        ot->exec= add_primitive_plane_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_plane_exec;
@@ -1341,6 +1238,7 @@ void MESH_OT_add_primitive_plane(wmOperatorType *ot)
 
 static int add_primitive_cube_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_cube_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1350,16 +1248,17 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op)
        
        make_prim(obedit, PRIM_CUBE, mat, 4, 0, 0, dia, 1.0f, 1, 1);
        
        
        make_prim(obedit, PRIM_CUBE, mat, 4, 0, 0, dia, 1.0f, 1, 1);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_cube(wmOperatorType *ot)
+void MESH_OT_primitive_cube_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Cube";
 {
        /* identifiers */
        ot->name= "Add Cube";
-       ot->idname= "MESH_OT_add_primitive_cube";
+       ot->idname= "MESH_OT_primitive_cube_add";
        
        /* api callbacks */
        ot->exec= add_primitive_cube_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_cube_exec;
@@ -1371,6 +1270,7 @@ void MESH_OT_add_primitive_cube(wmOperatorType *ot)
 
 static int add_primitive_circle_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_circle_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1380,16 +1280,17 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op)
        make_prim(obedit, PRIM_CIRCLE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 0.0f, 0, 
                          RNA_boolean_get(op->ptr, "fill"));
        
        make_prim(obedit, PRIM_CIRCLE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 0.0f, 0, 
                          RNA_boolean_get(op->ptr, "fill"));
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_circle(wmOperatorType *ot)
+void MESH_OT_primitive_circle_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Circle";
 {
        /* identifiers */
        ot->name= "Add Circle";
-       ot->idname= "MESH_OT_add_primitive_circle";
+       ot->idname= "MESH_OT_primitive_circle_add";
        
        /* api callbacks */
        ot->exec= add_primitive_circle_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_circle_exec;
@@ -1406,6 +1307,7 @@ void MESH_OT_add_primitive_circle(wmOperatorType *ot)
 
 static int add_primitive_cylinder_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_cylinder_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1415,16 +1317,17 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op)
        make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 
                          RNA_float_get(op->ptr, "depth"), 1, 1);
        
        make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 
                          RNA_float_get(op->ptr, "depth"), 1, 1);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_cylinder(wmOperatorType *ot)
+void MESH_OT_primitive_cylinder_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Cylinder";
 {
        /* identifiers */
        ot->name= "Add Cylinder";
-       ot->idname= "MESH_OT_add_primitive_cylinder";
+       ot->idname= "MESH_OT_primitive_cylinder_add";
        
        /* api callbacks */
        ot->exec= add_primitive_cylinder_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_cylinder_exec;
@@ -1441,6 +1344,7 @@ void MESH_OT_add_primitive_cylinder(wmOperatorType *ot)
 
 static int add_primitive_tube_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_tube_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1450,16 +1354,17 @@ static int add_primitive_tube_exec(bContext *C, wmOperator *op)
        make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 
                          RNA_float_get(op->ptr, "depth"), 1, 0);
        
        make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 
                          RNA_float_get(op->ptr, "depth"), 1, 0);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_tube(wmOperatorType *ot)
+void MESH_OT_primitive_tube_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Tube";
 {
        /* identifiers */
        ot->name= "Add Tube";
-       ot->idname= "MESH_OT_add_primitive_tube";
+       ot->idname= "MESH_OT_primitive_tube_add";
        
        /* api callbacks */
        ot->exec= add_primitive_tube_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_tube_exec;
@@ -1476,6 +1381,7 @@ void MESH_OT_add_primitive_tube(wmOperatorType *ot)
 
 static int add_primitive_cone_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_cone_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1485,16 +1391,17 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op)
        make_prim(obedit, PRIM_CONE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 
                          RNA_float_get(op->ptr, "depth"), 0, RNA_boolean_get(op->ptr, "cap_end"));
        
        make_prim(obedit, PRIM_CONE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 
                          RNA_float_get(op->ptr, "depth"), 0, RNA_boolean_get(op->ptr, "cap_end"));
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_cone(wmOperatorType *ot)
+void MESH_OT_primitive_cone_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Cone";
 {
        /* identifiers */
        ot->name= "Add Cone";
-       ot->idname= "MESH_OT_add_primitive_cone";
+       ot->idname= "MESH_OT_primitive_cone_add";
        
        /* api callbacks */
        ot->exec= add_primitive_cone_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_cone_exec;
@@ -1513,6 +1420,7 @@ void MESH_OT_add_primitive_cone(wmOperatorType *ot)
 
 static int add_primitive_grid_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_grid_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1522,16 +1430,17 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op)
        make_prim(obedit, PRIM_GRID, mat, RNA_int_get(op->ptr, "x_subdivisions"), 
                          RNA_int_get(op->ptr, "y_subdivisions"), 0, dia, 0.0f, 0, 1);
        
        make_prim(obedit, PRIM_GRID, mat, RNA_int_get(op->ptr, "x_subdivisions"), 
                          RNA_int_get(op->ptr, "y_subdivisions"), 0, dia, 0.0f, 0, 1);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_grid(wmOperatorType *ot)
+void MESH_OT_primitive_grid_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Grid";
 {
        /* identifiers */
        ot->name= "Add Grid";
-       ot->idname= "MESH_OT_add_primitive_grid";
+       ot->idname= "MESH_OT_primitive_grid_add";
        
        /* api callbacks */
        ot->exec= add_primitive_grid_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_grid_exec;
@@ -1548,6 +1457,7 @@ void MESH_OT_add_primitive_grid(wmOperatorType *ot)
 
 static int add_primitive_monkey_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_monkey_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float mat[4][4];
        
@@ -1555,16 +1465,17 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op)
        
        make_prim(obedit, PRIM_MONKEY, mat, 0, 0, 2, 0.0f, 0.0f, 0, 0);
        
        
        make_prim(obedit, PRIM_MONKEY, mat, 0, 0, 2, 0.0f, 0.0f, 0, 0);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_monkey(wmOperatorType *ot)
+void MESH_OT_primitive_monkey_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Monkey";
 {
        /* identifiers */
        ot->name= "Add Monkey";
-       ot->idname= "MESH_OT_add_primitive_monkey";
+       ot->idname= "MESH_OT_primitive_monkey_add";
        
        /* api callbacks */
        ot->exec= add_primitive_monkey_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_monkey_exec;
@@ -1576,6 +1487,7 @@ void MESH_OT_add_primitive_monkey(wmOperatorType *ot)
 
 static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1585,16 +1497,17 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
        make_prim(obedit, PRIM_UVSPHERE, mat, RNA_int_get(op->ptr, "rings"), 
                          RNA_int_get(op->ptr, "segments"), 0, dia, 0.0f, 0, 0);
        
        make_prim(obedit, PRIM_UVSPHERE, mat, RNA_int_get(op->ptr, "rings"), 
                          RNA_int_get(op->ptr, "segments"), 0, dia, 0.0f, 0, 0);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_uv_sphere(wmOperatorType *ot)
+void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add UV Sphere";
 {
        /* identifiers */
        ot->name= "Add UV Sphere";
-       ot->idname= "MESH_OT_add_primitive_uv_sphere";
+       ot->idname= "MESH_OT_primitive_uv_sphere_add";
        
        /* api callbacks */
        ot->exec= add_primitive_uvsphere_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_uvsphere_exec;
@@ -1611,6 +1524,7 @@ void MESH_OT_add_primitive_uv_sphere(wmOperatorType *ot)
 
 static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
 {
 
 static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
 {
+       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
        Object *obedit= CTX_data_edit_object(C);
        float dia, mat[4][4];
        
@@ -1620,16 +1534,17 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
        make_prim(obedit, PRIM_ICOSPHERE, mat, 0, 0, 
                          RNA_int_get(op->ptr, "subdivisions"), dia, 0.0f, 0, 0);
        
        make_prim(obedit, PRIM_ICOSPHERE, mat, 0, 0, 
                          RNA_int_get(op->ptr, "subdivisions"), dia, 0.0f, 0, 0);
        
+       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
        WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
        
        return OPERATOR_FINISHED;       
 }
 
-void MESH_OT_add_primitive_ico_sphere(wmOperatorType *ot)
+void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Add Ico Sphere";
 {
        /* identifiers */
        ot->name= "Add Ico Sphere";
-       ot->idname= "MESH_OT_add_primitive_ico_sphere";
+       ot->idname= "MESH_OT_primitive_ico_sphere_add";
        
        /* api callbacks */
        ot->exec= add_primitive_icosphere_exec;
        
        /* api callbacks */
        ot->exec= add_primitive_icosphere_exec;
@@ -1642,4 +1557,3 @@ void MESH_OT_add_primitive_ico_sphere(wmOperatorType *ot)
        RNA_def_int(ot->srna, "subdivisions", 2, 0, 6, "Subdivisions", "", 0, 8);
        RNA_def_float(ot->srna, "size", 1.0f, 0.0f, FLT_MAX, "Size", "", 0.001f, 100.00);
 }
        RNA_def_int(ot->srna, "subdivisions", 2, 0, 6, "Subdivisions", "", 0, 8);
        RNA_def_float(ot->srna, "size", 1.0f, 0.0f, FLT_MAX, "Size", "", 0.001f, 100.00);
 }
-