Two in one:
[blender.git] / source / blender / src / editmball.c
index 1ba62b0720624cc25ac94204a54b224768cc11e3..f92a341c2b32fca9dd63e66ebc810ee9cc74ecfb 100644 (file)
 #include "BLI_arithb.h"
 
 #include "DNA_screen_types.h"
+#include "DNA_space_types.h"
 #include "DNA_meta_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_view3d_types.h"
 
 #include "BKE_utildefines.h"
-#include "BKE_displist.h"
+#include "BKE_depsgraph.h"
 #include "BKE_global.h"
 #include "BKE_object.h"
 
@@ -74,6 +75,8 @@ extern short editbutflag;
 ListBase editelems= {0, 0};
 MetaElem *lastelem;
 
+/* this function is called, when MetaBall Object is
+ * switched from object mode to edit mode */
 void make_editMball()
 {
        MetaBall *mb;
@@ -98,13 +101,16 @@ void make_editMball()
        countall();
 }
 
+/* this function is called, when MetaBall Object switched from
+ * edit mode to object mode. List od MetaElements is copied
+ * from editelems to to object->data structure (mb->elems) */
 void load_editMball()
 {
        /* load mball in object */
        MetaBall *mb;
        MetaElem *ml, *newml;
 
-       if(G.obedit==0) return;
+       if(G.obedit==NULL) return;
        
        mb= G.obedit->data;
        BLI_freelistN(&(mb->elems));
@@ -119,6 +125,7 @@ void load_editMball()
        }
 }
 
+/* add new MetaElement primitive */
 void add_primitiveMball(int dummy_argument)
 {
        MetaElem *ml;
@@ -132,13 +139,13 @@ void add_primitiveMball(int dummy_argument)
        check_editmode(OB_MBALL);
 
        /* if no obedit: new object and enter editmode */
-       if(G.obedit==0) {
+       if(G.obedit==NULL) {
                add_object_draw(OB_MBALL);
                base_init_from_view3d(BASACT, G.vd);
                G.obedit= BASACT->object;
                
-               where_is_object(G.obedit);
-
+               where_is_object(G.obedit);  // need now, for imat
+               
                make_editMball();
                setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
        }
@@ -180,40 +187,43 @@ void add_primitiveMball(int dummy_argument)
        ml->s= 2.0;
        ml->flag= SELECT | MB_SCALE_RAD;
 
-        switch(dummy_argument) {
-                case 1:
-                        ml->type = MB_BALL;
-                        ml->expx= ml->expy= ml->expz= 1.0;
-                        break;
-                case 2:
-                        ml->type = MB_TUBE;
-                        ml->expx= ml->expy= ml->expz= 1.0;
-                        break;
-                case 3:
-                        ml->type = MB_PLANE;
-                        ml->expx= ml->expy= ml->expz= 1.0;
-                        break;
-                case 4:
-                        ml->type = MB_ELIPSOID;
-                        ml->expx= 1.2f;
-                        ml->expy= 0.8f;
-                        ml->expz= 1.0;
-                        break;
-                case 5:
-                        ml->type = MB_CUBE;
-                        ml->expx= ml->expy= ml->expz= 1.0;
-                        break;
-                default:
-                        break;
-        }
+       switch(dummy_argument) {
+       case 1:
+               ml->type = MB_BALL;
+               ml->expx= ml->expy= ml->expz= 1.0;
+               break;
+       case 2:
+               ml->type = MB_TUBE;
+               ml->expx= ml->expy= ml->expz= 1.0;
+               break;
+       case 3:
+               ml->type = MB_PLANE;
+               ml->expx= ml->expy= ml->expz= 1.0;
+               break;
+       case 4:
+               ml->type = MB_ELIPSOID;
+               ml->expx= 1.2f;
+               ml->expy= 0.8f;
+               ml->expz= 1.0;
+               break;
+       case 5:
+               ml->type = MB_CUBE;
+               ml->expx= ml->expy= ml->expz= 1.0;
+               break;
+       default:
+               break;
+       }
        
        lastelem= ml;
        
+       DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);  // added ball can influence others
+
+       countall();     
        allqueue(REDRAWALL, 0);
-       makeDispList(G.obedit);
        BIF_undo_push("Add MetaElem");
 }
 
+/* deselect all MetaElements */
 void deselectall_mball()
 {
        MetaElem *ml;
@@ -233,10 +243,14 @@ void deselectall_mball()
                else ml->flag |= SELECT;
                ml= ml->next;
        }
+
        allqueue(REDRAWVIEW3D, 0);
-//     BIF_undo_push("Deselect MetaElem");
+       countall();
+       BIF_undo_push("Deselect MetaElem");
 }
 
+/* select MetaElement with mouse click (user can select radius circle or
+ * stiffness circle) */
 void mouse_mball()
 {
        static MetaElem *startelem=0;
@@ -244,7 +258,7 @@ void mouse_mball()
        int a, hits;
        unsigned int buffer[MAXPICKBUF];
        
-       hits= selectprojektie(buffer, 0, 0, 0, 0);
+       hits= view3d_opengl_select(buffer, MAXPICKBUF, 0, 0, 0, 0);
 
        /* does startelem exist? */
        ml= editelems.first;
@@ -252,7 +266,7 @@ void mouse_mball()
                if(ml==startelem) break;
                ml= ml->next;
        }
-       if(ml==0) startelem= editelems.first;
+       if(ml==NULL) startelem= editelems.first;
        
        if(hits>0) {
                ml= startelem;
@@ -274,7 +288,7 @@ void mouse_mball()
                        if(act) break;
                        
                        ml= ml->next;
-                       if(ml==0) ml= editelems.first;
+                       if(ml==NULL) ml= editelems.first;
                        if(ml==startelem) break;
                }
                if(act) {
@@ -294,9 +308,13 @@ void mouse_mball()
                        allqueue(REDRAWBUTSEDIT, 0);
                }
        }
+
+       allqueue(REDRAWBUTSOBJECT, 0);
+       countall();
        rightmouse_transform();
 }
 
+/* duplicate selected MetaElements */
 void adduplicate_mball()
 {
        MetaElem *ml, *newml;
@@ -313,7 +331,9 @@ void adduplicate_mball()
        }
        
        BIF_TransformSetUndo("Add Duplicate");
-       Transform(TFM_TRANSLATION, CTX_NO_PET);
+       countall();
+       initTransform(TFM_TRANSLATION, CTX_NO_PET);
+       Transform();
        allqueue(REDRAWBUTSEDIT, 0);
 }
 
@@ -335,10 +355,11 @@ void delete_mball()
                ml= next;
        }
        
-       makeDispList(G.obedit);
+       DAG_scene_sort(G.scene);
+       DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);     
        allqueue(REDRAWVIEW3D, 0);
        allqueue(REDRAWBUTSEDIT, 0);
-
+       countall();
        BIF_undo_push("Delete MetaElem");
 }
 
@@ -386,6 +407,7 @@ static void undoMball_to_editMball(void *lbv)
        for(nr=0, lastelem= editelems.first; lastelem; lastelem= lastelem->next, nr++)
                if(nr==lastmlnr) break;
        
+       countall();
 }
 
 static void *editMball_to_undoMball(void)
@@ -442,10 +464,10 @@ void hide_mball(char hide)
                ml= ml->next;
        }
 
-       makeDispList(G.obedit);
+       DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);     
        allqueue(REDRAWVIEW3D, 0);
        allqueue(REDRAWBUTSEDIT, 0);
-
+       countall();
        BIF_undo_push("Hide MetaElems");
 }
 
@@ -461,9 +483,10 @@ void reveal_mball(void)
                ml= ml->next;
        }
 
-       makeDispList(G.obedit);
+       DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);     
        allqueue(REDRAWVIEW3D, 0);
        allqueue(REDRAWBUTSEDIT, 0);
-
+       countall();
        BIF_undo_push("Unhide MetaElems");
 }
+