2.5
authorTon Roosendaal <ton@blender.org>
Tue, 30 Dec 2008 16:03:29 +0000 (16:03 +0000)
committerTon Roosendaal <ton@blender.org>
Tue, 30 Dec 2008 16:03:29 +0000 (16:03 +0000)
EditMesh: further cleanup, made derivedmesh itterator functions
work by gathering all related data in local ViewContext struct.
(scene, editmesh, region, view3d, obedit).
Also removed bad inclusion of view3d_intern.h in mesh module.

12 files changed:
source/blender/editors/include/ED_mesh.h
source/blender/editors/include/ED_view3d.h
source/blender/editors/mesh/editmesh.c
source/blender/editors/mesh/editmesh.h
source/blender/editors/mesh/editmesh_loop.c
source/blender/editors/mesh/editmesh_mods.c
source/blender/editors/mesh/editmesh_tools.c
source/blender/editors/object/object_edit.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_intern.h
source/blender/editors/space_view3d/view3d_select.c
source/blender/editors/space_view3d/view3d_view.c

index 9e01857d06316a400742af51282ef441c1d02bf9..2437542a75a3deb6ce271e16c2495ce506be3c44 100644 (file)
@@ -29,6 +29,8 @@
 #define ED_MESH_H
 
 struct View3D;
+struct ARegion;
+struct EditMesh;
 
 // edge and face flag both
 #define EM_FGON                2
@@ -51,25 +53,36 @@ struct View3D;
 #define B_JOINTRIA_MAT         0X1000
 
 
+/* especially for derivedmesh drawing callbacks */
+typedef struct ViewContext {
+       Scene *scene;
+       Object *obact;
+       Object *obedit;
+       struct ARegion *ar;
+       struct View3D *v3d;
+       struct EditMesh *em;
+} ViewContext;
+
+
 /* editmesh.c */
 
-void           EM_init_index_arrays(EditMesh *em, int forVert, int forEdge, int forFace);
+void           EM_init_index_arrays(struct EditMesh *em, int forVert, int forEdge, int forFace);
 void           EM_free_index_arrays(void);
 EditVert       *EM_get_vert_for_index(int index);
 EditEdge       *EM_get_edge_for_index(int index);
 EditFace       *EM_get_face_for_index(int index);
-int                    EM_texFaceCheck(EditMesh *em);
-int                    EM_vertColorCheck(EditMesh *em);
+int                    EM_texFaceCheck(struct EditMesh *em);
+int                    EM_vertColorCheck(struct EditMesh *em);
 
 
 /* editmesh_lib.c */
 
-EditFace       *EM_get_actFace(EditMesh *em, int sloppy);
+EditFace       *EM_get_actFace(struct EditMesh *em, int sloppy);
 
 void           EM_select_edge(EditEdge *eed, int sel);
-void           EM_select_face_fgon(EditMesh *em, EditFace *efa, int val);
-void           EM_selectmode_flush(EditMesh *em);
-void           EM_deselect_flush(EditMesh *em);
+void           EM_select_face_fgon(struct EditMesh *em, EditFace *efa, int val);
+void           EM_selectmode_flush(struct EditMesh *em);
+void           EM_deselect_flush(struct EditMesh *em);
 
 
 
index 9b0dec908a8e7a82c6abca3ed27c04cdfced3a08..50ec1956425d683933edfd6139e9307f74487091 100644 (file)
 /* ********* exports for space_view3d/ module ********** */
 struct ARegion;
 struct View3D;
-
+struct ViewContext;
+struct BPoint;
+struct Nurb;
+struct BezTriple;
+struct EditVert;
+struct EditEdge;
+struct EditFace;
 
 float *give_cursor(Scene *scene, View3D *v3d);
 
@@ -52,5 +58,17 @@ void project_float_noclip(struct ARegion *ar, struct View3D *v3d, float *vec, fl
 void viewline(struct ARegion *ar, struct View3D *v3d, short mval[2], float ray_start[3], float ray_end[3]);
 void viewray(struct ARegion *ar, struct View3D *v3d, short mval[2], float ray_start[3], float ray_normal[3]);
 
+/* drawobject.c itterators */
+void mesh_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts);
+void mesh_foreachScreenEdge(struct ViewContext *vc, void (*func)(void *userData, struct EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts);
+void mesh_foreachScreenFace(struct ViewContext *vc, void (*func)(void *userData, struct EditFace *efa, int x, int y, int index), void *userData);
+void nurbs_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct Nurb *nu, struct BPoint *bp, struct BezTriple *bezt, int beztindex, int x, int y), void *userData);
+void lattice_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct BPoint *bp, int x, int y), void *userData);
+
+int view3d_test_clipping(struct View3D *v3d, float *vec);
+void view3d_align_axis_to_vector(struct View3D *v3d, int axisidx, float vec[3]);
+
+
+
 #endif /* ED_VIEW3D_H */
 
index e64667eee8bd1b81b97026564a383562567e1dbb..e723fb2375e1b7a76463b90ea2c2fbc81d7a6981 100644 (file)
 #include "BLI_dynstr.h"
 #include "BLI_rand.h"
 
-#include "BKE_DerivedMesh.h"
 #include "BKE_cloth.h"
-#include "BKE_customdata.h"
 #include "BKE_context.h"
+#include "BKE_customdata.h"
 #include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
 #include "BKE_global.h"
 #include "BKE_key.h"
 #include "BKE_library.h"
@@ -2188,3 +2188,15 @@ int EM_vertColorCheck(EditMesh *em)
        return 0;
 }
 
+
+void em_setup_viewcontext(bContext *C, ViewContext *vc)
+{
+       memset(vc, 0, sizeof(ViewContext));
+       vc->ar= CTX_wm_region(C);
+       vc->scene= CTX_data_scene(C);
+       vc->v3d= (View3D *)CTX_wm_space_data(C);
+       vc->obact= vc->scene->basact?vc->scene->basact->object:NULL;
+       vc->obedit= G.obedit; // XXX
+       vc->em= NULL; // XXX
+}
+
index a57408b87be6b94765f71f2e4197bbb0b631c734..4677c03b1b5c5d1980f9d7e4474f159e626b5491 100644 (file)
@@ -32,7 +32,7 @@
 #ifndef EDITMESH_H
 #define EDITMESH_H
 
-struct View3D;
+struct bContext;
 
 #define TEST_EDITMESH  if(G.obedit==0) return; /* layer test XXX */
 
@@ -98,6 +98,8 @@ int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve);
 int editface_containsVert(struct EditFace *efa, struct EditVert *eve);
 int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
 
+void em_setup_viewcontext(struct bContext *C, ViewContext *vc);
+
 /* ******************* editmesh_add.c */
 
 
@@ -167,7 +169,7 @@ extern struct EditFace *EM_face_from_faces(EditMesh *em, struct EditFace *efa1,
 
 
 /* ******************* editmesh_mods.c */
-extern EditEdge *findnearestedge(struct View3D *v3d, EditMesh *em, int *dist);
+extern EditEdge *findnearestedge(ViewContext *vc, int *dist);
 extern void EM_automerge(int update);
 void editmesh_select_by_material(EditMesh *em, int index);
 void righthandfaces(EditMesh *em, int select); /* makes faces righthand turning */
@@ -182,7 +184,7 @@ void EM_select_more(EditMesh *em);
  *             if 0, unselected vertice are given the bias
  * strict: if 1, the vertice corresponding to the sel parameter are ignored and not just biased 
  */
-extern EditVert *findnearestvert(struct View3D *v3d, EditMesh *em, int *dist, short sel, short strict);
+extern EditVert *findnearestvert(ViewContext *vc, int *dist, short sel, short strict);
 
 
 /* ******************* editmesh_tools.c */
index 2cb7f48cc7c1243779ff2ed23cb67660395cd709..a3e02cdd1c1771bf84ffce126ff38c5f8fb6173f 100644 (file)
@@ -195,7 +195,7 @@ static void edgering_sel(EditMesh *em, EditEdge *startedge, int select, int prev
 }
 void CutEdgeloop(EditMesh *em, int numcuts)
 {
-       View3D *v3d= NULL; // XXX
+       ViewContext vc; // XXX
        EditEdge *nearest=NULL, *eed;
        float fac;
        int keys = 0, holdnum=0, selectmode, dist;
@@ -219,7 +219,7 @@ void CutEdgeloop(EditMesh *em, int numcuts)
                        mvalo[0] = mval[0];
                        mvalo[1] = mval[1];
                        dist= 50;
-                       nearest = findnearestedge(v3d, em, &dist);      // returns actual distance in dist
+                       nearest = findnearestedge(&vc, &dist);  // returns actual distance in dist
 //                     scrarea_do_windraw(curarea);    // after findnearestedge, backbuf!
                        
                        sprintf(msg,"Number of Cuts: %d",numcuts);
index 41de2ea1bfe22cd748b9ddb4ba6cd0dfbda4d716..87b34a345d10fcd6674838b094479765f9158471 100644 (file)
@@ -57,6 +57,7 @@ editmesh_mods.c, UI level access, no geometry changes
 #include "BLI_editVert.h"
 #include "BLI_rand.h"
 
+#include "BKE_context.h"
 #include "BKE_displist.h"
 #include "BKE_depsgraph.h"
 #include "BKE_DerivedMesh.h"
@@ -74,6 +75,7 @@ editmesh_mods.c, UI level access, no geometry changes
 
 #include "ED_multires.h"
 #include "ED_mesh.h"
+#include "ED_view3d.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
@@ -82,12 +84,6 @@ editmesh_mods.c, UI level access, no geometry changes
 
 #include "BLO_sys_types.h" // for intptr_t support
 
-/* XXX ONLY TO GET COMPILED! XXX
-   the backbuffer select code will move to view3d later */
-#include "../space_view3d/view3d_intern.h"
-
-/* XXX ********************** XXX */
-
 static void *read_backbuf() {return NULL;}
 static int sample_backbuf_rect() {return 0;}
 static int sample_backbuf() {return 0;}
@@ -383,13 +379,12 @@ static unsigned int findnearestvert__backbufIndextest(unsigned int index)
  *             if 0, unselected vertice are given the bias
  * strict: if 1, the vertice corresponding to the sel parameter are ignored and not just biased 
  */
-EditVert *findnearestvert(View3D *v3d, EditMesh *em, int *dist, short sel, short strict)
+EditVert *findnearestvert(ViewContext *vc, int *dist, short sel, short strict)
 {
-       ARegion *ar= NULL;      // XXX
        short mval[2];
 
 // XXX getmouseco_areawin(mval);
-       if(v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT)){
+       if(vc->v3d->drawtype>OB_WIRE && (vc->v3d->flag & V3D_ZBUF_SELECT)){
                int distance;
                unsigned int index;
                EditVert *eve;
@@ -397,7 +392,7 @@ EditVert *findnearestvert(View3D *v3d, EditMesh *em, int *dist, short sel, short
                if(strict) index = sample_backbuf_rect(mval, 50, em_wireoffs, 0xFFFFFF, &distance, strict, findnearestvert__backbufIndextest); 
                else index = sample_backbuf_rect(mval, 50, em_wireoffs, 0xFFFFFF, &distance, 0, NULL); 
                
-               eve = BLI_findlink(&em->verts, index-1);
+               eve = BLI_findlink(&vc->em->verts, index-1);
                
                if(eve && distance < *dist) {
                        *dist = distance;
@@ -412,7 +407,7 @@ EditVert *findnearestvert(View3D *v3d, EditMesh *em, int *dist, short sel, short
                static int lastSelectedIndex=0;
                static EditVert *lastSelected=NULL;
 
-               if (lastSelected && BLI_findlink(&em->verts, lastSelectedIndex)!=lastSelected) {
+               if (lastSelected && BLI_findlink(&vc->em->verts, lastSelectedIndex)!=lastSelected) {
                        lastSelectedIndex = 0;
                        lastSelected = NULL;
                }
@@ -427,11 +422,11 @@ EditVert *findnearestvert(View3D *v3d, EditMesh *em, int *dist, short sel, short
                data.closestIndex = 0;
 
                data.pass = 0;
-               mesh_foreachScreenVert(ar, v3d, findnearestvert__doClosest, &data, 1);
+               mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, 1);
 
                if (data.dist>3) {
                        data.pass = 1;
-                       mesh_foreachScreenVert(ar, v3d, findnearestvert__doClosest, &data, 1);
+                       mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, 1);
                }
 
                *dist = data.dist;
@@ -459,8 +454,7 @@ static float labda_PdistVL2Dfl( float *v1, float *v2, float *v3)
 /* note; uses v3d, so needs active 3d window */
 static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
 {
-       View3D *v3d; /* XXX */
-       struct { float mval[2]; int dist; EditEdge *closest; } *data = userData;
+       struct { ViewContext vc; float mval[2]; int dist; EditEdge *closest; } *data = userData;
        float v1[2], v2[2];
        int distance;
                
@@ -473,7 +467,7 @@ static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, in
                
        if(eed->f & SELECT) distance+=5;
        if(distance < data->dist) {
-               if(v3d->flag & V3D_CLIPPING) {
+               if(data->vc.v3d->flag & V3D_CLIPPING) {
                        float labda= labda_PdistVL2Dfl(data->mval, v1, v2);
                        float vec[3];
 
@@ -482,7 +476,7 @@ static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, in
                        vec[2]= eed->v1->co[2] + labda*(eed->v2->co[2] - eed->v1->co[2]);
                        Mat4MulVecfl(G.obedit->obmat, vec);
 
-                       if(view3d_test_clipping(v3d, vec)==0) {
+                       if(view3d_test_clipping(data->vc.v3d, vec)==0) {
                                data->dist = distance;
                                data->closest = eed;
                        }
@@ -493,17 +487,16 @@ static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, in
                }
        }
 }
-EditEdge *findnearestedge(View3D *v3d, EditMesh *em, int *dist)
+EditEdge *findnearestedge(ViewContext *vc, int *dist)
 {
-       ARegion *ar= NULL; // XXX
        short mval[2];
                
 // XXX getmouseco_areawin(mval);
 
-       if(v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT)) {
+       if(vc->v3d->drawtype>OB_WIRE && (vc->v3d->flag & V3D_ZBUF_SELECT)) {
                int distance;
                unsigned int index = sample_backbuf_rect(mval, 50, em_solidoffs, em_wireoffs, &distance,0, NULL);
-               EditEdge *eed = BLI_findlink(&em->edges, index-1);
+               EditEdge *eed = BLI_findlink(&vc->em->edges, index-1);
 
                if (eed && distance<*dist) {
                        *dist = distance;
@@ -513,14 +506,15 @@ EditEdge *findnearestedge(View3D *v3d, EditMesh *em, int *dist)
                }
        }
        else {
-               struct { float mval[2]; int dist; EditEdge *closest; } data;
+               struct { ViewContext vc; float mval[2]; int dist; EditEdge *closest; } data;
 
+               data.vc= *vc;
                data.mval[0] = mval[0];
                data.mval[1] = mval[1];
                data.dist = *dist;
                data.closest = NULL;
 
-               mesh_foreachScreenEdge(ar, v3d, findnearestedge__doClosest, &data, 2);
+               mesh_foreachScreenEdge(vc, findnearestedge__doClosest, &data, 2);
 
                *dist = data.dist;
                return data.closest;
@@ -560,16 +554,15 @@ static void findnearestface__doClosest(void *userData, EditFace *efa, int x, int
                }
        }
 }
-static EditFace *findnearestface(View3D *v3d, EditMesh *em, int *dist)
+static EditFace *findnearestface(ViewContext *vc, int *dist)
 {
-       ARegion *ar= NULL; // XXX
        short mval[2];
 
 // XXX getmouseco_areawin(mval);
 
-       if(v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT)) {
+       if(vc->v3d->drawtype>OB_WIRE && (vc->v3d->flag & V3D_ZBUF_SELECT)) {
                unsigned int index = sample_backbuf(mval[0], mval[1]);
-               EditFace *efa = BLI_findlink(&em->faces, index-1);
+               EditFace *efa = BLI_findlink(&vc->em->faces, index-1);
 
                if (efa) {
                        struct { short mval[2]; int dist; EditFace *toFace; } data;
@@ -579,9 +572,9 @@ static EditFace *findnearestface(View3D *v3d, EditMesh *em, int *dist)
                        data.dist = 0x7FFF;             /* largest short */
                        data.toFace = efa;
 
-                       mesh_foreachScreenFace(ar, v3d, findnearestface__getDistance, &data);
+                       mesh_foreachScreenFace(vc, findnearestface__getDistance, &data);
 
-                       if(em->selectmode == SCE_SELECT_FACE || data.dist<*dist) {      /* only faces, no dist check */
+                       if(vc->em->selectmode == SCE_SELECT_FACE || data.dist<*dist) {  /* only faces, no dist check */
                                *dist= data.dist;
                                return efa;
                        }
@@ -594,7 +587,7 @@ static EditFace *findnearestface(View3D *v3d, EditMesh *em, int *dist)
                static int lastSelectedIndex=0;
                static EditFace *lastSelected=NULL;
 
-               if (lastSelected && BLI_findlink(&em->faces, lastSelectedIndex)!=lastSelected) {
+               if (lastSelected && BLI_findlink(&vc->em->faces, lastSelectedIndex)!=lastSelected) {
                        lastSelectedIndex = 0;
                        lastSelected = NULL;
                }
@@ -607,11 +600,11 @@ static EditFace *findnearestface(View3D *v3d, EditMesh *em, int *dist)
                data.closestIndex = 0;
 
                data.pass = 0;
-               mesh_foreachScreenFace(ar, v3d, findnearestface__doClosest, &data);
+               mesh_foreachScreenFace(vc, findnearestface__doClosest, &data);
 
                if (data.dist>3) {
                        data.pass = 1;
-                       mesh_foreachScreenFace(ar, v3d, findnearestface__doClosest, &data);
+                       mesh_foreachScreenFace(vc, findnearestface__doClosest, &data);
                }
 
                *dist = data.dist;
@@ -768,8 +761,9 @@ static void unified_select_draw(EditMesh *em, EditVert *eve, EditEdge *eed, Edit
    selected vertices and edges get disadvantage
    return 1 if found one
 */
-static int unified_findnearest(View3D *v3d, EditMesh *em, EditVert **eve, EditEdge **eed, EditFace **efa) 
+static int unified_findnearest(ViewContext *vc, EditVert **eve, EditEdge **eed, EditFace **efa) 
 {
+       EditMesh *em= vc->em;
        int dist= 75;
        
        *eve= NULL;
@@ -777,13 +771,13 @@ static int unified_findnearest(View3D *v3d, EditMesh *em, EditVert **eve, EditEd
        *efa= NULL;
        
        if(em->selectmode & SCE_SELECT_VERTEX)
-               *eve= findnearestvert(v3d, em, &dist, SELECT, 0);
+               *eve= findnearestvert(vc, &dist, SELECT, 0);
        if(em->selectmode & SCE_SELECT_FACE)
-               *efa= findnearestface(v3d, em, &dist);
+               *efa= findnearestface(vc, &dist);
 
        dist-= 20;      /* since edges select lines, we give dots advantage of 20 pix */
        if(em->selectmode & SCE_SELECT_EDGE)
-               *eed= findnearestedge(v3d, em, &dist);
+               *eed= findnearestedge(vc, &dist);
 
        /* return only one of 3 pointers, for frontbuffer redraws */
        if(*eed) {
@@ -2081,14 +2075,15 @@ void loop_multiselect(EditMesh *em, int looptype)
 
 /* just to have the functions nice together */
 
-static void mouse_mesh_loop(Scene *scene, View3D *v3d, EditMesh *em)
+static void mouse_mesh_loop(ViewContext *vc)
 {
+       EditMesh *em= vc->em;
        EditEdge *eed;
        int select= 1;
        int dist= 50;
        int shift= 0, alt= 0, ctrl= 0; // XXX
        
-       eed= findnearestedge(v3d, em, &dist);
+       eed= findnearestedge(vc, &dist);
        if(eed) {
                if (0) { // XXX G.scene->toolsettings->edge_mode == EDGE_MODE_SELECT) {
                        if(shift==0) EM_clear_flag_all(em, SELECT);
@@ -2118,7 +2113,7 @@ static void mouse_mesh_loop(Scene *scene, View3D *v3d, EditMesh *em)
                        EM_selectmode_flush(em);
 //                     if (EM_texFaceCheck())
                } else { /*(G.scene->toolsettings->edge_mode == EDGE_MODE_TAG_*)*/
-                       int act = (edgetag_context_check(scene, eed)==0);
+                       int act = (edgetag_context_check(vc->scene, eed)==0);
                        int path = 0;
                        
                        if (alt && ctrl && em->selected.last) {
@@ -2129,7 +2124,7 @@ static void mouse_mesh_loop(Scene *scene, View3D *v3d, EditMesh *em)
                                        eed_act = (EditEdge*)ese->data;
                                        if (eed_act != eed) {
                                                /* If shift is pressed we need to use the last active edge, (if it exists) */
-                                               if (edgetag_shortest_path(scene, em, eed_act, eed)) {
+                                               if (edgetag_shortest_path(vc->scene, em, eed_act, eed)) {
                                                        EM_remove_selection(em, eed_act, EDITEDGE);
                                                        EM_select_edge(eed_act, 0);
                                                        path = 1;
@@ -2138,7 +2133,7 @@ static void mouse_mesh_loop(Scene *scene, View3D *v3d, EditMesh *em)
                                }
                        }
                        if (path==0) {
-                               edgetag_context_set(scene, eed, act); /* switch the edge option */
+                               edgetag_context_set(vc->scene, eed, act); /* switch the edge option */
                        }
                        
                        if (act) {
@@ -2183,15 +2178,20 @@ static void mouse_mesh_loop(Scene *scene, View3D *v3d, EditMesh *em)
 
 
 /* here actual select happens */
-void mouse_mesh(Scene *scene, View3D *v3d, EditMesh *em)
+void mouse_mesh(bContext *C)
 {
+       ViewContext vc;
+       EditMesh *em= NULL; // XXX
        EditVert *eve;
        EditEdge *eed;
        EditFace *efa;
        int shift= 0, alt= 0; // XXX
        
-       if(alt) mouse_mesh_loop(scene, v3d, em);
-       else if(unified_findnearest(v3d, em, &eve, &eed, &efa)) {
+       /* setup view context for argument to callbacks */
+       em_setup_viewcontext(C, &vc);
+       
+       if(alt) mouse_mesh_loop(&vc);
+       else if(unified_findnearest(&vc, &eve, &eed, &efa)) {
                
                if((shift)==0) EM_clear_flag_all(em, SELECT);
                
@@ -2290,17 +2290,21 @@ void selectconnected_mesh_all(EditMesh *em)
        BIF_undo_push("Select Connected (All)");
 }
 
-void selectconnected_mesh(View3D *v3d, EditMesh *em)
+void selectconnected_mesh(bContext *C)
 {
+       ViewContext vc;
        EditVert *eve, *v1, *v2;
        EditEdge *eed;
        EditFace *efa;
        short done=1, sel, toggle=0;
        int shift= 0; // XXX
                
-       if(em->edges.first==0) return;
+       /* setup view context for argument to callbacks */
+       em_setup_viewcontext(C, &vc);
+       
+       if(vc.em->edges.first==0) return;
        
-       if( unified_findnearest(v3d, em, &eve, &eed, &efa)==0 ) {
+       if( unified_findnearest(&vc, &eve, &eed, &efa)==0 ) {
                /* error("Nothing indicated "); */ /* this is mostly annoying, eps with occluded geometry */
                return;
        }
@@ -2309,7 +2313,7 @@ void selectconnected_mesh(View3D *v3d, EditMesh *em)
        if(shift) sel=0;
 
        /* clear test flags */
-       for(v1= em->verts.first; v1; v1= v1->next) v1->f1= 0;
+       for(v1= vc.em->verts.first; v1; v1= v1->next) v1->f1= 0;
        
        /* start vertex/face/edge */
        if(eve) eve->f1= 1;
@@ -2321,8 +2325,8 @@ void selectconnected_mesh(View3D *v3d, EditMesh *em)
                done= 0;
                toggle++;
                
-               if(toggle & 1) eed= em->edges.first;
-               else eed= em->edges.last;
+               if(toggle & 1) eed= vc.em->edges.first;
+               else eed= vc.em->edges.last;
                
                while(eed) {
                        v1= eed->v1;
@@ -2345,11 +2349,11 @@ void selectconnected_mesh(View3D *v3d, EditMesh *em)
        }
        
        /* now use vertex f1 flag to select/deselect */
-       for(eed= em->edges.first; eed; eed= eed->next) {
+       for(eed= vc.em->edges.first; eed; eed= eed->next) {
                if(eed->v1->f1 && eed->v2->f1) 
                        EM_select_edge(eed, sel);
        }
-       for(efa= em->faces.first; efa; efa= efa->next) {
+       for(efa= vc.em->faces.first; efa; efa= efa->next) {
                if(efa->v1->f1 && efa->v2->f1 && efa->v3->f1 && (efa->v4==NULL || efa->v4->f1)) 
                        EM_select_face(efa, sel);
        }
@@ -2372,13 +2376,14 @@ void selectconnected_mesh(View3D *v3d, EditMesh *em)
 /* all - 1) use all faces for extending the selection  2) only use the mouse face
  * sel - 1) select  0) deselect 
  * */
-static void selectconnected_delimit_mesh__internal(EditMesh *em, short all, short sel)
+static void selectconnected_delimit_mesh__internal(ViewContext *vc, short all, short sel)
 {
-       View3D *v3d= NULL; // XXX
+       EditMesh *em= vc->em;
        EditFace *efa;
+       EditEdge *eed;
        short done=1, change=0;
        int dist = 75;
-       EditEdge *eed;
+       
        if(em->faces.first==0) return;
        
        /* flag all edges as off*/
@@ -2394,7 +2399,7 @@ static void selectconnected_delimit_mesh__internal(EditMesh *em, short all, shor
                        }
                }
        } else {
-               EditFace *efa_mouse = findnearestface(v3d, em, &dist);
+               EditFace *efa_mouse = findnearestface(vc, &dist);
                
                if( !efa_mouse ) {
                        /* error("Nothing indicated "); */ /* this is mostly annoying, eps with occluded geometry */
@@ -2461,9 +2466,9 @@ void selectconnected_delimit_mesh(EditMesh *em)
        
        // XXX selectconnected_delimit_mesh__internal(em, 0, ((G.qual & LR_SHIFTKEY)==0));
 }
-void selectconnected_delimit_mesh_all(EditMesh *em)
+void selectconnected_delimit_mesh_all(ViewContext *vc)
 {
-       selectconnected_delimit_mesh__internal(em, 1, 1);
+       selectconnected_delimit_mesh__internal(vc, 1, 1);
 }      
        
        
index 0204389c8198a3b30a153d1e1fa6e6af61056c4f..6cd23ebec53b1b97a3a7c8ac7ce17c81f667263e 100644 (file)
@@ -61,8 +61,9 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
 #include "BLI_linklist.h"
 #include "BLI_heap.h"
 
-#include "BKE_depsgraph.h"
+#include "BKE_context.h"
 #include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_mesh.h"
@@ -83,8 +84,6 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
 
 #include "editmesh.h"
 
-#include "../space_view3d/view3d_intern.h" // <---  mesh_foreachScreenVert XXX 
-
 /* XXX */
 static void BIF_undo_push() {}
 static int extern_qread() {return 0;}
@@ -491,22 +490,26 @@ static void xsortvert_flag__doSetX(void *userData, EditVert *eve, int x, int y,
        sortblock[index].x = x;
 }
 
-void xsortvert_flag(ARegion *ar, View3D *v3d, EditMesh *em, int flag)
+/* all verts with (flag & 'flag') are sorted */
+void xsortvert_flag(bContext *C, int flag)
 {
-       /* all verts with (flag & 'flag') are sorted */
+       ViewContext vc;
        EditVert *eve;
        xvertsort *sortblock;
        ListBase tbase;
-       int i, amount = BLI_countlist(&em->verts);
+       int i, amount;
        
        if(multires_test()) return;
        
+       em_setup_viewcontext(C, &vc);
+       
+       amount = BLI_countlist(&vc.em->verts);
        sortblock = MEM_callocN(sizeof(xvertsort)*amount,"xsort");
-       for (i=0,eve=em->verts.first; eve; i++,eve=eve->next)
+       for (i=0,eve= vc.em->verts.first; eve; i++,eve=eve->next)
                if(eve->f & flag)
                        sortblock[i].v1 = eve;
        
-       mesh_foreachScreenVert(ar, v3d, xsortvert_flag__doSetX, sortblock, 0);
+       mesh_foreachScreenVert(&vc, xsortvert_flag__doSetX, sortblock, 0);
        qsort(sortblock, amount, sizeof(xvertsort), vergxco);
        
                /* make temporal listbase */
@@ -515,12 +518,12 @@ void xsortvert_flag(ARegion *ar, View3D *v3d, EditMesh *em, int flag)
                eve = sortblock[i].v1;
 
                if (eve) {
-                       BLI_remlink(&em->verts, eve);
+                       BLI_remlink(&vc.em->verts, eve);
                        BLI_addtail(&tbase, eve);
                }
        }
        
-       addlisttolist(&em->verts, &tbase);
+       addlisttolist(&vc.em->verts, &tbase);
        
        MEM_freeN(sortblock);
 
index 1250e7c1bedb51a378cc3af2688e2fa7ce156385..6a570344400690273c69cfff76a85910beb3b419 100644 (file)
@@ -1029,9 +1029,7 @@ static EnumPropertyItem prop_clear_track_types[] = {
 /* note, poll should check for editable scene */
 static int object_clear_track_exec(bContext *C, wmOperator *op)
 {
-       Object *ob= CTX_data_active_object(C);
-       
-       if(G.obedit) return;
+       if(G.obedit) return OPERATOR_CANCELLED;
 
        CTX_DATA_BEGIN(C, Object*, ob, selected_objects) {
                /*if(TESTBASELIB(v3d, base)) {*/
@@ -1891,12 +1889,10 @@ static int make_track_exec(bContext *C, wmOperator *op)
 {
        Scene *scene= CTX_data_scene(C);
        ScrArea *sa= CTX_wm_area(C);
-       ARegion *ar= CTX_wm_region(C);
        View3D *v3d= sa->spacedata.first;
        Base *base;
        
-       if(scene->id.lib) return;
-
+       if(scene->id.lib) return OPERATOR_CANCELLED;
 
        if(RNA_enum_is_equal(op->ptr, "type", "TRACKTO")){
                bConstraint *con;
index 60497d52666b75300e601a6f73d812b613b5e225..7f8ab31f4c6ffb4c20cf25de9d83178f2de20f39 100644 (file)
@@ -1081,10 +1081,8 @@ static void lattice_draw_verts(Lattice *lt, DispList *dl, short sel)
        bglEnd();       
 }
 
-void lattice_foreachScreenVert(void (*func)(void *userData, BPoint *bp, int x, int y), void *userData)
+void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPoint *bp, int x, int y), void *userData)
 {
-       ARegion *ar= NULL;      // XXX
-       View3D *v3d= NULL; // XXX
        BPoint *bp = editLatt->def;
        DispList *dl = find_displist(&G.obedit->disp, DL_VERTS);
        float *co = dl?dl->verts:NULL;
@@ -1092,11 +1090,11 @@ void lattice_foreachScreenVert(void (*func)(void *userData, BPoint *bp, int x, i
        int i, N = editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
        short s[2];
 
-       view3d_get_object_project_mat(v3d, G.obedit, pmat, vmat);
+       view3d_get_object_project_mat(vc->v3d, vc->obedit, pmat, vmat);
 
        for (i=0; i<N; i++, bp++, co+=3) {
                if (bp->hide==0) {
-                       view3d_project_short_clip(ar, v3d, dl?co:bp->vec, s, pmat, vmat);
+                       view3d_project_short_clip(vc->ar, vc->v3d, dl?co:bp->vec, s, pmat, vmat);
                        func(userData, bp, s[0], s[1]);
                }
        }
@@ -1191,36 +1189,34 @@ static void drawlattice(View3D *v3d, Object *ob)
 
 static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
 {
-       struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ARegion *ar; View3D *v3d; int clipVerts; float pmat[4][4], vmat[4][4]; } *data = userData;
+       struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ViewContext vc; int clipVerts; float pmat[4][4], vmat[4][4]; } *data = userData;
        EditVert *eve = EM_get_vert_for_index(index);
        short s[2];
 
        if (eve->h==0) {
                if (data->clipVerts) {
-                       view3d_project_short_clip(data->ar, data->v3d, co, s, data->pmat, data->vmat);
+                       view3d_project_short_clip(data->vc.ar, data->vc.v3d, co, s, data->pmat, data->vmat);
                } else {
-                       view3d_project_short_noclip(data->ar, co, s, data->pmat);
+                       view3d_project_short_noclip(data->vc.ar, co, s, data->pmat);
                }
 
                data->func(data->userData, eve, s[0], s[1], index);
        }
 }
 
-void mesh_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userData, EditVert *eve, int x, int y, int index), void *userData, int clipVerts)
+void mesh_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, EditVert *eve, int x, int y, int index), void *userData, int clipVerts)
 {
-       struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ARegion *ar; View3D *v3d; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
+       struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ViewContext vc; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
        DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
-       EditMesh *em= NULL; // XXX
        
+       data.vc= *vc;
        data.func = func;
        data.userData = userData;
-       data.ar= ar;
-       data.v3d= v3d;
        data.clipVerts = clipVerts;
 
-       view3d_get_object_project_mat(v3d, G.obedit, data.pmat, data.vmat);
+       view3d_get_object_project_mat(vc->v3d, vc->obedit, data.pmat, data.vmat);
 
-       EM_init_index_arrays(em, 1, 0, 0);
+       EM_init_index_arrays(vc->em, 1, 0, 0);
        dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data);
        EM_free_index_arrays();
 
@@ -1229,21 +1225,21 @@ void mesh_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userDat
 
 static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0co, float *v1co)
 {
-       struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ARegion *ar; View3D *v3d; int clipVerts; float pmat[4][4], vmat[4][4]; } *data = userData;
+       struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ViewContext vc; int clipVerts; float pmat[4][4], vmat[4][4]; } *data = userData;
        EditEdge *eed = EM_get_edge_for_index(index);
        short s[2][2];
 
        if (eed->h==0) {
                if (data->clipVerts==1) {
-                       view3d_project_short_clip(data->ar, data->v3d, v0co, s[0], data->pmat, data->vmat);
-                       view3d_project_short_clip(data->ar, data->v3d, v1co, s[1], data->pmat, data->vmat);
+                       view3d_project_short_clip(data->vc.ar, data->vc.v3d, v0co, s[0], data->pmat, data->vmat);
+                       view3d_project_short_clip(data->vc.ar, data->vc.v3d, v1co, s[1], data->pmat, data->vmat);
                } else {
-                       view3d_project_short_noclip(data->ar, v0co, s[0], data->pmat);
-                       view3d_project_short_noclip(data->ar, v1co, s[1], data->pmat);
+                       view3d_project_short_noclip(data->vc.ar, v0co, s[0], data->pmat);
+                       view3d_project_short_noclip(data->vc.ar, v1co, s[1], data->pmat);
 
                        if (data->clipVerts==2) {
-                if (!(s[0][0]>=0 && s[0][1]>= 0 && s[0][0]<data->ar->winx && s[0][1]<data->ar->winy)) 
-                                       if (!(s[1][0]>=0 && s[1][1]>= 0 && s[1][0]<data->ar->winx && s[1][1]<data->ar->winy)) 
+                if (!(s[0][0]>=0 && s[0][1]>= 0 && s[0][0]<data->vc.ar->winx && s[0][1]<data->vc.ar->winy)) 
+                                       if (!(s[1][0]>=0 && s[1][1]>= 0 && s[1][0]<data->vc.ar->winx && s[1][1]<data->vc.ar->winy)) 
                                                return;
                        }
                }
@@ -1252,21 +1248,19 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0
        }
 }
 
-void mesh_foreachScreenEdge(ARegion *ar, View3D *v3d, void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts)
+void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts)
 {
-       struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ARegion *ar; View3D *v3d; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
+       struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ViewContext vc; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
        DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
-       EditMesh *em= NULL; // XXX
 
+       data.vc= *vc;
        data.func = func;
-       data.ar= ar;
-       data.v3d= v3d;
        data.userData = userData;
        data.clipVerts = clipVerts;
 
-       view3d_get_object_project_mat(v3d, G.obedit, data.pmat, data.vmat);
+       view3d_get_object_project_mat(vc->v3d, vc->obedit, data.pmat, data.vmat);
 
-       EM_init_index_arrays(em, 0, 1, 0);
+       EM_init_index_arrays(vc->em, 0, 1, 0);
        dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
        EM_free_index_arrays();
 
@@ -1275,45 +1269,43 @@ void mesh_foreachScreenEdge(ARegion *ar, View3D *v3d, void (*func)(void *userDat
 
 static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *no)
 {
-       struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ARegion *ar; View3D *v3d; float pmat[4][4], vmat[4][4]; } *data = userData;
+       struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ViewContext vc; float pmat[4][4], vmat[4][4]; } *data = userData;
        EditFace *efa = EM_get_face_for_index(index);
        short s[2];
 
        if (efa && efa->h==0 && efa->fgonf!=EM_FGON) {
-               view3d_project_short_clip(data->ar, data->v3d, cent, s, data->pmat, data->vmat);
+               view3d_project_short_clip(data->vc.ar, data->vc.v3d, cent, s, data->pmat, data->vmat);
 
                data->func(data->userData, efa, s[0], s[1], index);
        }
 }
 
-void mesh_foreachScreenFace(ARegion *ar, View3D *v3d, void (*func)(void *userData, EditFace *efa, int x, int y, int index), void *userData)
+void mesh_foreachScreenFace(ViewContext *vc, void (*func)(void *userData, EditFace *efa, int x, int y, int index), void *userData)
 {
-       struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ARegion *ar; View3D *v3d; float pmat[4][4], vmat[4][4]; } data;
+       struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ViewContext vc; float pmat[4][4], vmat[4][4]; } data;
        DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
-       EditMesh *em= NULL; // XXX
 
+       data.vc= *vc;
        data.func = func;
-       data.ar= ar;
-       data.v3d= v3d;
        data.userData = userData;
 
-       view3d_get_object_project_mat(v3d, G.obedit, data.pmat, data.vmat);
+       view3d_get_object_project_mat(vc->v3d, vc->obedit, data.pmat, data.vmat);
 
-       EM_init_index_arrays(em, 0, 0, 1);
+       EM_init_index_arrays(vc->em, 0, 0, 1);
        dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data);
        EM_free_index_arrays();
 
        dm->release(dm);
 }
 
-void nurbs_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y), void *userData)
+void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y), void *userData)
 {
        float pmat[4][4], vmat[4][4];
        short s[2];
        Nurb *nu;
        int i;
 
-       view3d_get_object_project_mat(v3d, G.obedit, pmat, vmat);
+       view3d_get_object_project_mat(vc->v3d, vc->obedit, pmat, vmat);
 
        for (nu= editNurb.first; nu; nu=nu->next) {
                if((nu->type & 7)==CU_BEZIER) {
@@ -1322,17 +1314,17 @@ void nurbs_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userDa
 
                                if(bezt->hide==0) {
                                        if (G.f & G_HIDDENHANDLES) {
-                                               view3d_project_short_clip(ar, v3d, bezt->vec[1], s, pmat, vmat);
+                                               view3d_project_short_clip(vc->ar, vc->v3d, bezt->vec[1], s, pmat, vmat);
                                                if (s[0] != IS_CLIPPED)
                                                        func(userData, nu, NULL, bezt, 1, s[0], s[1]);
                                        } else {
-                                               view3d_project_short_clip(ar, v3d, bezt->vec[0], s, pmat, vmat);
+                                               view3d_project_short_clip(vc->ar, vc->v3d, bezt->vec[0], s, pmat, vmat);
                                                if (s[0] != IS_CLIPPED)
                                                        func(userData, nu, NULL, bezt, 0, s[0], s[1]);
-                                               view3d_project_short_clip(ar, v3d, bezt->vec[1], s, pmat, vmat);
+                                               view3d_project_short_clip(vc->ar, vc->v3d, bezt->vec[1], s, pmat, vmat);
                                                if (s[0] != IS_CLIPPED)
                                                        func(userData, nu, NULL, bezt, 1, s[0], s[1]);
-                                               view3d_project_short_clip(ar, v3d, bezt->vec[2], s, pmat, vmat);
+                                               view3d_project_short_clip(vc->ar, vc->v3d, bezt->vec[2], s, pmat, vmat);
                                                if (s[0] != IS_CLIPPED)
                                                        func(userData, nu, NULL, bezt, 2, s[0], s[1]);
                                        }
@@ -1344,7 +1336,7 @@ void nurbs_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userDa
                                BPoint *bp = &nu->bp[i];
 
                                if(bp->hide==0) {
-                                       view3d_project_short_clip(ar, v3d, bp->vec, s, pmat, vmat);
+                                       view3d_project_short_clip(vc->ar, vc->v3d, bp->vec, s, pmat, vmat);
                                        func(userData, nu, bp, NULL, -1, s[0], s[1]);
                                }
                        }
@@ -1963,8 +1955,8 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, Object *ob, EditMesh *em, D
        EditEdge *eed_act = NULL;
        EditVert *eve_act = NULL;
        
-       if (G.editMesh->selected.last) {
-               EditSelection *ese = G.editMesh->selected.last;
+       if (em->selected.last) {
+               EditSelection *ese = em->selected.last;
                /* face is handeled above */
                /*if (ese->type == EDITFACE ) {
                        efa_act = (EditFace *)ese->data;
@@ -2361,6 +2353,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, Base *base, int dt, int f
 /* returns 1 if nothing was drawn, for detecting to draw an object center */
 static int draw_mesh_object(Scene *scene, View3D *v3d, Base *base, int dt, int flag)
 {
+       EditMesh *em= NULL;             // XXX
        Object *ob= base->object;
        Mesh *me= ob->data;
        int do_alpha_pass= 0, drawlinked= 0, retval= 0, glsl, check_alpha;
@@ -2385,7 +2378,7 @@ static int draw_mesh_object(Scene *scene, View3D *v3d, Base *base, int dt, int f
                        GPU_set_object_materials(v3d, scene, ob, glsl, NULL);
                }
 
-               draw_em_fancy(scene, v3d, ob, G.editMesh, cageDM, finalDM, dt);
+               draw_em_fancy(scene, v3d, ob, em, cageDM, finalDM, dt);
 
                if (G.obedit!=ob && finalDM)
                        finalDM->release(finalDM);
@@ -5370,7 +5363,7 @@ static void bbs_mesh_solid(Object *ob)
        dm->release(dm);
 }
 
-void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
+void draw_object_backbufsel(Scene *scene, View3D *v3d, EditMesh *em, Object *ob)
 {
 
        wmMultMatrix(ob->obmat);
@@ -5381,7 +5374,6 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
        switch( ob->type) {
        case OB_MESH:
                if(ob==G.obedit) {
-                       EditMesh *em= NULL; // XXX
                        DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
 
                        EM_init_index_arrays(em, 1, 1, 1);
index ecab49d77558d224c7394ac2b4f1041e574f3bec..60bc89304a163cdf660d5bd41cf8a1e695b3d53c 100644 (file)
@@ -36,14 +36,10 @@ struct BoundBox;
 struct Object;
 struct DerivedMesh;
 struct wmOperatorType;
-struct EditVert;
-struct EditEdge;
-struct EditFace;
-struct Nurb;
-struct BezTriple;
-struct BPoint;
 struct bContext;
 struct wmWindowManager;
+struct EditMesh;
+struct ViewContext;
 
 typedef struct ViewDepths {
        unsigned short w, h;
@@ -90,11 +86,6 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt);
 void drawcircball(int mode, float *cent, float rad, float tmat[][4]);
 void draw_object_instance(Scene *scene, View3D *v3d, Object *ob, int dt, int outline);
 void drawaxes(float size, int flag, char drawtype);
-void mesh_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts);
-void mesh_foreachScreenEdge(ARegion *ar, View3D *v3d, void (*func)(void *userData, struct EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts);
-void mesh_foreachScreenFace(ARegion *ar, View3D *v3d, void (*func)(void *userData, struct EditFace *efa, int x, int y, int index), void *userData);
-void nurbs_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userData, struct Nurb *nu, struct BPoint *bp, struct BezTriple *bezt, int beztindex, int x, int y), void *userData);
-void lattice_foreachScreenVert(void (*func)(void *userData, struct BPoint *bp, int x, int y), void *userData);
 
 /* drawarmature.c */
 int draw_armature(Scene *scene, View3D *v3d, Base *base, int dt, int flag);
@@ -105,7 +96,6 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, Object *ob, struct DerivedMes
 /* view3d_draw.c */
 void drawview3dspace(Scene *scene, ARegion *ar, View3D *v3d);
 void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *));
-int view3d_test_clipping(View3D *v3d, float *vec);
 void view3d_clr_clipping(void);
 void view3d_set_clipping(View3D *v3d);
 void add_view3d_after(View3D *v3d, Base *base, int type, int flag);
@@ -139,15 +129,13 @@ int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, flo
 void view_settings_from_ob(Object *ob, float *ofs, float *quat, float *dist, float *lens);
 void obmat_to_viewmat(View3D *v3d, Object *ob, short smooth);
 
-short view3d_opengl_select(Scene *scene, ARegion *ar, View3D *v3d, unsigned int *buffer, unsigned int bufsize, rcti *input);
+short view3d_opengl_select(struct ViewContext *vc, unsigned int *buffer, unsigned int bufsize, rcti *input);
 void initlocalview(Scene *scene, ARegion *ar, View3D *v3d);
 void restore_localviewdata(View3D *vd);
 void endlocalview(Scene *scene, ScrArea *sa);
 
 void centerview(ARegion *ar, View3D *v3d);
 
-void view3d_align_axis_to_vector(View3D *v3d, int axisidx, float vec[3]);
-
 void smooth_view(struct bContext *C, Object *, Object *, float *ofs, float *quat, float *dist, float *lens);
 
 void setwinmatrixview3d(View3D *v3d, int winx, int winy, rctf *rect);  /* rect: for picking */
index e4dc82c30a7c264357ecff8da4b5d93cbcd26d91..f2f1d8806ae110c2524caac904283c33a24c38fa 100644 (file)
@@ -286,8 +286,9 @@ int lasso_inside_edge(short mcords[][2], short moves, int x0, int y0, int x1, in
 /* warning; lasso select with backbuffer-check draws in backbuf with persp(PERSP_WIN) 
    and returns with persp(PERSP_VIEW). After lasso select backbuf is not OK
 */
-static void do_lasso_select_pose(ARegion *ar, View3D *v3d, Object *ob, short mcords[][2], short moves, short select)
+static void do_lasso_select_pose(ViewContext *vc, short mcords[][2], short moves, short select)
 {
+       Object *ob= vc->obact;
        bPoseChannel *pchan;
        float vec[3];
        short sco1[2], sco2[2];
@@ -297,10 +298,10 @@ static void do_lasso_select_pose(ARegion *ar, View3D *v3d, Object *ob, short mco
        for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
                VECCOPY(vec, pchan->pose_head);
                Mat4MulVecfl(ob->obmat, vec);
-               project_short(ar, v3d, vec, sco1);
+               project_short(vc->ar, vc->v3d, vec, sco1);
                VECCOPY(vec, pchan->pose_tail);
                Mat4MulVecfl(ob->obmat, vec);
-               project_short(ar, v3d, vec, sco2);
+               project_short(vc->ar, vc->v3d, vec, sco2);
                
                if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
                        if(select) pchan->bone->flag |= BONE_SELECTED;
@@ -310,13 +311,13 @@ static void do_lasso_select_pose(ARegion *ar, View3D *v3d, Object *ob, short mco
 }
 
 
-static void do_lasso_select_objects(Scene *scene, ARegion *ar, View3D *v3d, short mcords[][2], short moves, short select)
+static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short moves, short select)
 {
        Base *base;
        
-       for(base= scene->base.first; base; base= base->next) {
-               if(base->lay & v3d->lay) {
-                       project_short(ar, v3d, base->object->obmat[3], &base->sx);
+       for(base= vc->scene->base.first; base; base= base->next) {
+               if(base->lay & vc->v3d->lay) {
+                       project_short(vc->ar, vc->v3d, base->object->obmat[3], &base->sx);
                        if(lasso_inside(mcords, moves, base->sx, base->sy)) {
                                
                                if(select) ED_base_object_select(base, BA_SELECT);
@@ -324,7 +325,7 @@ static void do_lasso_select_objects(Scene *scene, ARegion *ar, View3D *v3d, shor
                                base->object->flag= base->flag;
                        }
                        if(base->object->flag & OB_POSEMODE) {
-                               do_lasso_select_pose(ar, v3d, base->object, mcords, moves, select);
+                               do_lasso_select_pose(vc, mcords, moves, select);
                        }
                }
        }
@@ -347,7 +348,7 @@ void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
 
 static void do_lasso_select_mesh__doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
 {
-       struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
+       struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
 
        if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
                eve->f = data->select?(eve->f|1):(eve->f&~1);
@@ -355,7 +356,7 @@ static void do_lasso_select_mesh__doSelectVert(void *userData, EditVert *eve, in
 }
 static void do_lasso_select_mesh__doSelectEdge(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
 {
-       struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
+       struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
 
        if (EM_check_backbuf(em_solidoffs+index)) {
                if (data->pass==0) {
@@ -374,23 +375,22 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, EditEdge *eed, in
 }
 static void do_lasso_select_mesh__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
 {
-       struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
-       EditMesh *em= NULL; // XXX
+       struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
 
        if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
-               EM_select_face_fgon(em, efa, data->select);
+               EM_select_face_fgon(data->vc.em, efa, data->select);
        }
 }
 
-static void do_lasso_select_mesh(Scene *scene, ARegion *ar, View3D *v3d, short mcords[][2], short moves, short select)
+static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves, short select)
 {
-       struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } data;
-       EditMesh *em = G.editMesh; // XXX
+       struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } data;
        rcti rect;
        int bbsel;
        
        lasso_select_boundbox(&rect, mcords, moves);
        
+       data.vc= *vc;
        data.rect = &rect;
        data.mcords = mcords;
        data.moves = moves;
@@ -398,44 +398,43 @@ static void do_lasso_select_mesh(Scene *scene, ARegion *ar, View3D *v3d, short m
        data.done = 0;
        data.pass = 0;
 
-       bbsel= EM_mask_init_backbuf_border(v3d, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
+       bbsel= EM_mask_init_backbuf_border(vc->v3d, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
        
-       if(scene->selectmode & SCE_SELECT_VERTEX) {
+       if(vc->scene->selectmode & SCE_SELECT_VERTEX) {
                if (bbsel) {
-                       EM_backbuf_checkAndSelectVerts(em, select);
+                       EM_backbuf_checkAndSelectVerts(vc->em, select);
                } else {
-                       mesh_foreachScreenVert(ar, v3d, do_lasso_select_mesh__doSelectVert, &data, 1);
+                       mesh_foreachScreenVert(vc, do_lasso_select_mesh__doSelectVert, &data, 1);
                }
        }
-       if(scene->selectmode & SCE_SELECT_EDGE) {
+       if(vc->scene->selectmode & SCE_SELECT_EDGE) {
                        /* Does both bbsel and non-bbsel versions (need screen cos for both) */
 
                data.pass = 0;
-               mesh_foreachScreenEdge(ar, v3d, do_lasso_select_mesh__doSelectEdge, &data, 0);
+               mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, 0);
 
                if (data.done==0) {
                        data.pass = 1;
-                       mesh_foreachScreenEdge(ar, v3d, do_lasso_select_mesh__doSelectEdge, &data, 0);
+                       mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, 0);
                }
        }
        
-       if(scene->selectmode & SCE_SELECT_FACE) {
+       if(vc->scene->selectmode & SCE_SELECT_FACE) {
                if (bbsel) {
-                       EM_backbuf_checkAndSelectFaces(em, select);
+                       EM_backbuf_checkAndSelectFaces(vc->em, select);
                } else {
-                       mesh_foreachScreenFace(ar, v3d, do_lasso_select_mesh__doSelectFace, &data);
+                       mesh_foreachScreenFace(vc, do_lasso_select_mesh__doSelectFace, &data);
                }
        }
        
        EM_free_backbuf();
-       EM_selectmode_flush(em);        
+       EM_selectmode_flush(vc->em);    
 }
 
 #if 0
 /* this is an exception in that its the only lasso that dosnt use the 3d view (uses space image view) */
 static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select)
 {
-       EditMesh *em = G.editMesh;
        EditFace *efa;
        MTFace *tf;
        int screenUV[2], nverts, i, ok = 1;
@@ -483,8 +482,8 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
                }
        }
        if (ok && G.sima->flag & SI_SYNC_UVSEL) {
-               if (select) EM_select_flush();
-               else            EM_deselect_flush(em);
+               if (select) EM_select_flush(vc->em);
+               else            EM_deselect_flush(vc->em);
        }
 }
 #endif
@@ -513,7 +512,7 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp
        }
 }
 
-static void do_lasso_select_curve(ARegion *ar, View3D *v3d, short mcords[][2], short moves, short select)
+static void do_lasso_select_curve(ViewContext *vc, short mcords[][2], short moves, short select)
 {
        struct { short (*mcords)[2]; short moves; short select; } data;
 
@@ -521,7 +520,7 @@ static void do_lasso_select_curve(ARegion *ar, View3D *v3d, short mcords[][2], s
        data.moves = moves;
        data.select = select;
 
-       nurbs_foreachScreenVert(ar, v3d, do_lasso_select_curve__doSelect, &data);
+       nurbs_foreachScreenVert(vc, do_lasso_select_curve__doSelect, &data);
 }
 
 static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x, int y)
@@ -532,7 +531,7 @@ static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x,
                bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
        }
 }
-static void do_lasso_select_lattice(short mcords[][2], short moves, short select)
+static void do_lasso_select_lattice(ViewContext *vc, short mcords[][2], short moves, short select)
 {
        struct { short (*mcords)[2]; short moves; short select; } data;
 
@@ -540,10 +539,10 @@ static void do_lasso_select_lattice(short mcords[][2], short moves, short select
        data.moves = moves;
        data.select = select;
 
-       lattice_foreachScreenVert(do_lasso_select_lattice__doSelect, &data);
+       lattice_foreachScreenVert(vc, do_lasso_select_lattice__doSelect, &data);
 }
 
-static void do_lasso_select_armature(ARegion *ar, View3D *v3d, short mcords[][2], short moves, short select)
+static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short moves, short select)
 {
        EditBone *ebone;
        float vec[3];
@@ -553,10 +552,10 @@ static void do_lasso_select_armature(ARegion *ar, View3D *v3d, short mcords[][2]
 
                VECCOPY(vec, ebone->head);
                Mat4MulVecfl(G.obedit->obmat, vec);
-               project_short(ar, v3d, vec, sco1);
+               project_short(vc->ar, vc->v3d, vec, sco1);
                VECCOPY(vec, ebone->tail);
                Mat4MulVecfl(G.obedit->obmat, vec);
-               project_short(ar, v3d, vec, sco2);
+               project_short(vc->ar, vc->v3d, vec, sco2);
                
                didpoint= 0;
                if(lasso_inside(mcords, moves, sco1[0], sco1[1])) {
@@ -578,9 +577,9 @@ static void do_lasso_select_armature(ARegion *ar, View3D *v3d, short mcords[][2]
        // XXX countall();      /* abused for flushing selection!!!! */
 }
 
-static void do_lasso_select_facemode(Scene *scene, View3D *v3d, short mcords[][2], short moves, short select)
+static void do_lasso_select_facemode(ViewContext *vc, short mcords[][2], short moves, short select)
 {
-       Object *ob= OBACT;
+       Object *ob= vc->obact;
        Mesh *me= ob?ob->data:NULL;
        rcti rect;
        
@@ -590,7 +589,7 @@ static void do_lasso_select_facemode(Scene *scene, View3D *v3d, short mcords[][2
        em_vertoffs= me->totface+1;     /* max index array */
        
        lasso_select_boundbox(&rect, mcords, moves);
-       EM_mask_init_backbuf_border(v3d, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
+       EM_mask_init_backbuf_border(vc->v3d, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
        
        EM_backbuf_checkAndSelectTFaces(me, select);
        
@@ -630,26 +629,26 @@ static void do_lasso_select_node(short mcords[][2], short moves, short select)
 }
 #endif
 
-void view3d_lasso_select(Scene *scene, ARegion *ar, View3D *v3d, short mcords[][2], short moves, short select)
+void view3d_lasso_select(ViewContext *vc, short mcords[][2], short moves, short select)
 {
        if(G.obedit==NULL) {
                if(FACESEL_PAINT_TEST)
-                       do_lasso_select_facemode(scene, v3d, mcords, moves, select);
+                       do_lasso_select_facemode(vc, mcords, moves, select);
                else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))
                        ;
 // XX          else if(G.f & G_PARTICLEEDIT)
 //                     PE_do_lasso_select(mcords, moves, select);
                else  
-                       do_lasso_select_objects(scene, ar, v3d, mcords, moves, select);
+                       do_lasso_select_objects(vc, mcords, moves, select);
        }
        else if(G.obedit->type==OB_MESH) {
-               do_lasso_select_mesh(scene, ar, v3d, mcords, moves, select);
+               do_lasso_select_mesh(vc, mcords, moves, select);
        } else if(G.obedit->type==OB_CURVE || G.obedit->type==OB_SURF) 
-               do_lasso_select_curve(ar, v3d, mcords, moves, select);
+               do_lasso_select_curve(vc, mcords, moves, select);
        else if(G.obedit->type==OB_LATTICE) 
-               do_lasso_select_lattice(mcords, moves, select);
+               do_lasso_select_lattice(vc, mcords, moves, select);
        else if(G.obedit->type==OB_ARMATURE)
-               do_lasso_select_armature(ar, v3d, mcords, moves, select);
+               do_lasso_select_armature(vc, mcords, moves, select);
 
        BIF_undo_push("Lasso select");
        
@@ -725,8 +724,10 @@ static void deselectall_except(Scene *scene, Base *b)   /* deselect all except b
        }
 }
 
-static Base *mouse_select_menu(Scene *scene, ARegion *ar, View3D *v3d, unsigned int *buffer, int hits, short *mval)
+static Base *mouse_select_menu(ViewContext *vc, unsigned int *buffer, int hits, short *mval)
 {
+       Scene *scene= vc->scene;
+       View3D *v3d= vc->v3d;
        Base *baseList[SEL_MENU_SIZE]={NULL}; /*baseList is used to store all possible bases to bring up a menu */
        Base *base;
        short baseCount = 0;
@@ -748,7 +749,7 @@ static Base *mouse_select_menu(Scene *scene, ARegion *ar, View3D *v3d, unsigned
                        else {
                                int temp, dist=15;
                                
-                               project_short(ar, v3d, base->object->obmat[3], &base->sx);
+                               project_short(vc->ar, vc->v3d, base->object->obmat[3], &base->sx);
                                
                                temp= abs(base->sx -mval[0]) + abs(base->sy -mval[1]);
                                if(temp<dist ) baseList[baseCount] = base;
@@ -778,7 +779,7 @@ static Base *mouse_select_menu(Scene *scene, ARegion *ar, View3D *v3d, unsigned
 
 /* we want a select buffer with bones, if there are... */
 /* so check three selection levels and compare */
-static short mixed_bones_object_selectbuffer(Scene *scene, ARegion *ar, View3D *v3d, unsigned int *buffer, short *mval)
+static short mixed_bones_object_selectbuffer(ViewContext *vc, unsigned int *buffer, short *mval)
 {
        rcti rect;
        int offs;
@@ -786,19 +787,19 @@ static short mixed_bones_object_selectbuffer(Scene *scene, ARegion *ar, View3D *
        short has_bones15=0, has_bones9=0, has_bones5=0;
        
        BLI_init_rcti(&rect, mval[0]-14, mval[0]+14, mval[1]-14, mval[1]+14);
-       hits15= view3d_opengl_select(scene, ar, v3d, buffer, MAXPICKBUF, &rect);
+       hits15= view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect);
        if(hits15>0) {
                for(a=0; a<hits15; a++) if(buffer[4*a+3] & 0xFFFF0000) has_bones15= 1;
                
                offs= 4*hits15;
                BLI_init_rcti(&rect, mval[0]-9, mval[0]+9, mval[1]-9, mval[1]+9);
-               hits9= view3d_opengl_select(scene, ar, v3d, buffer+offs, MAXPICKBUF-offs, &rect);
+               hits9= view3d_opengl_select(vc, buffer+offs, MAXPICKBUF-offs, &rect);
                if(hits9>0) {
                        for(a=0; a<hits9; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones9= 1;
                        
                        offs+= 4*hits9;
                        BLI_init_rcti(&rect, mval[0]-5, mval[0]+5, mval[1]-5, mval[1]+5);
-                       hits5= view3d_opengl_select(scene, ar, v3d, buffer+offs, MAXPICKBUF-offs, &rect);
+                       hits5= view3d_opengl_select(vc, buffer+offs, MAXPICKBUF-offs, &rect);
                        if(hits5>0) {
                                for(a=0; a<hits5; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones5= 1;
                        }
@@ -837,6 +838,7 @@ static short mixed_bones_object_selectbuffer(Scene *scene, ARegion *ar, View3D *
 /* mval is region coords */
 static void mouse_select(bContext *C, short *mval, short modifier)
 {
+       ViewContext vc;
        ARegion *ar= CTX_wm_region(C);
        View3D *v3d= (View3D *)CTX_wm_space_data(C);
        Scene *scene= CTX_data_scene(C);
@@ -845,6 +847,13 @@ static void mouse_select(bContext *C, short *mval, short modifier)
        int temp, a, dist=100;
        short hits;
        
+       /* setup view context for argument to callbacks */
+       memset(&vc, 0, sizeof(ViewContext));
+       vc.ar= ar;
+       vc.scene= scene;
+       vc.v3d= v3d;
+       vc.obact= OBACT;
+       
        /* always start list from basact in wire mode */
        startbase=  FIRSTBASE;
        if(BASACT && BASACT->next) startbase= BASACT->next;
@@ -854,7 +863,7 @@ static void mouse_select(bContext *C, short *mval, short modifier)
                
                /* note; shift+alt goes to group-flush-selecting */
                if(modifier == KM_ALT && modifier == KM_CTRL) 
-                       basact= mouse_select_menu(scene, ar, v3d, NULL, 0, mval);
+                       basact= mouse_select_menu(&vc, NULL, 0, mval);
                else {
                        base= startbase;
                        while(base) {
@@ -879,7 +888,7 @@ static void mouse_select(bContext *C, short *mval, short modifier)
        else {
                /* if objects have posemode set, the bones are in the same selection buffer */
                
-               hits= mixed_bones_object_selectbuffer(scene, ar, v3d, buffer, mval);
+               hits= mixed_bones_object_selectbuffer(&vc, buffer, mval);
                
                if(hits>0) {
                        int has_bones= 0;
@@ -888,7 +897,7 @@ static void mouse_select(bContext *C, short *mval, short modifier)
 
                        /* note; shift+alt goes to group-flush-selecting */
                        if(has_bones==0 && (modifier == KM_ALT)) 
-                               basact= mouse_select_menu(scene, ar, v3d, buffer, hits, mval);
+                               basact= mouse_select_menu(&vc, buffer, hits, mval);
                        else {
                                static short lastmval[2]={-100, -100};
                                int donearest= 0;
@@ -1067,7 +1076,7 @@ int edge_inside_circle(short centx, short centy, short rad, short x1, short y1,
 
 static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
 {
-       struct { rcti *rect; int select; } *data = userData;
+       struct { ViewContext vc; rcti *rect; int select; } *data = userData;
 
        if (BLI_in_rcti(data->rect, x, y)) {
                if (bp) {
@@ -1088,37 +1097,39 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp,
                }
        }
 }
-static void do_nurbs_box_select(ARegion *ar, View3D *v3d, rcti *rect, int select)
+static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select)
 {
-       struct { rcti *rect; int select; } data;
-
+       struct { ViewContext vc; rcti *rect; int select; } data;
+       
+       data.vc= *vc;
        data.rect = rect;
        data.select = select;
 
-       nurbs_foreachScreenVert(ar, v3d, do_nurbs_box_select__doSelect, &data);
+       nurbs_foreachScreenVert(vc, do_nurbs_box_select__doSelect, &data);
 }
 
 static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, int y)
 {
-       struct { rcti *rect; int select; } *data = userData;
+       struct { ViewContext vc; rcti *rect; int select; } *data = userData;
 
        if (BLI_in_rcti(data->rect, x, y)) {
                bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
        }
 }
-static void do_lattice_box_select(rcti *rect, int select)
+static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select)
 {
-       struct { rcti *rect; int select, pass, done; } data;
+       struct { ViewContext vc; rcti *rect; int select, pass, done; } data;
 
+       data.vc= *vc;
        data.rect = rect;
        data.select = select;
 
-       lattice_foreachScreenVert(do_lattice_box_select__doSelect, &data);
+       lattice_foreachScreenVert(vc, do_lattice_box_select__doSelect, &data);
 }
 
 static void do_mesh_box_select__doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
 {
-       struct { rcti *rect; short select, pass, done; } *data = userData;
+       struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
 
        if (BLI_in_rcti(data->rect, x, y)) {
                eve->f = data->select?(eve->f|1):(eve->f&~1);
@@ -1126,7 +1137,7 @@ static void do_mesh_box_select__doSelectVert(void *userData, EditVert *eve, int
 }
 static void do_mesh_box_select__doSelectEdge(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
 {
-       struct { rcti *rect; short select, pass, done; } *data = userData;
+       struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
 
        if(EM_check_backbuf(em_solidoffs+index)) {
                if (data->pass==0) {
@@ -1143,60 +1154,60 @@ static void do_mesh_box_select__doSelectEdge(void *userData, EditEdge *eed, int
 }
 static void do_mesh_box_select__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
 {
-       struct { rcti *rect; short select, pass, done; } *data = userData;
-       EditMesh *em= NULL; // XXX
+       struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
 
        if (BLI_in_rcti(data->rect, x, y)) {
-               EM_select_face_fgon(em, efa, data->select);
+               EM_select_face_fgon(data->vc.em, efa, data->select);
        }
 }
-static void do_mesh_box_select(Scene *scene, ARegion *ar, View3D *v3d, rcti *rect, int select)
+static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select)
 {
-       struct { rcti *rect; short select, pass, done; } data;
-       EditMesh *em = G.editMesh;
+       struct { ViewContext vc; rcti *rect; short select, pass, done; } data;
        int bbsel;
        
+       data.vc= *vc;
        data.rect = rect;
        data.select = select;
        data.pass = 0;
        data.done = 0;
 
-       bbsel= EM_init_backbuf_border(v3d, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
+       bbsel= EM_init_backbuf_border(vc->v3d, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
 
-       if(scene->selectmode & SCE_SELECT_VERTEX) {
+       if(vc->scene->selectmode & SCE_SELECT_VERTEX) {
                if (bbsel) {
-                       EM_backbuf_checkAndSelectVerts(em, select);
+                       EM_backbuf_checkAndSelectVerts(vc->em, select);
                } else {
-                       mesh_foreachScreenVert(ar, v3d, do_mesh_box_select__doSelectVert, &data, 1);
+                       mesh_foreachScreenVert(vc, do_mesh_box_select__doSelectVert, &data, 1);
                }
        }
-       if(scene->selectmode & SCE_SELECT_EDGE) {
+       if(vc->scene->selectmode & SCE_SELECT_EDGE) {
                        /* Does both bbsel and non-bbsel versions (need screen cos for both) */
 
                data.pass = 0;
-               mesh_foreachScreenEdge(ar, v3d, do_mesh_box_select__doSelectEdge, &data, 0);
+               mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, 0);
 
                if (data.done==0) {
                        data.pass = 1;
-                       mesh_foreachScreenEdge(ar, v3d, do_mesh_box_select__doSelectEdge, &data, 0);
+                       mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, 0);
                }
        }
        
-       if(scene->selectmode & SCE_SELECT_FACE) {
+       if(vc->scene->selectmode & SCE_SELECT_FACE) {
                if(bbsel) {
-                       EM_backbuf_checkAndSelectFaces(em, select);
+                       EM_backbuf_checkAndSelectFaces(vc->em, select);
                } else {
-                       mesh_foreachScreenFace(ar, v3d, do_mesh_box_select__doSelectFace, &data);
+                       mesh_foreachScreenFace(vc, do_mesh_box_select__doSelectFace, &data);
                }
        }
        
        EM_free_backbuf();
                
-       EM_selectmode_flush(em);
+       EM_selectmode_flush(vc->em);
 }
 
 static int view3d_borderselect_exec(bContext *C, wmOperator *op)
 {
+       ViewContext vc;
        Scene *scene= CTX_data_scene(C);
        ScrArea *sa= CTX_wm_area(C);
        ARegion *ar= CTX_wm_region(C);
@@ -1208,6 +1219,14 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
        int a, index;
        short hits, val;
 
+       /* setup view context for argument to callbacks */
+       memset(&vc, 0, sizeof(ViewContext));
+       vc.ar= ar;
+       vc.scene= scene;
+       vc.v3d= v3d;
+       vc.obact= OBACT;
+       
+       
        val= RNA_int_get(op->ptr, "event_type");
        rect.xmin= RNA_int_get(op->ptr, "xmin");
        rect.ymin= RNA_int_get(op->ptr, "ymin");
@@ -1225,18 +1244,18 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
        
        if(G.obedit) {
                if(G.obedit->type==OB_MESH) {
-                       do_mesh_box_select(scene, ar, v3d, &rect, (val==LEFTMOUSE));
+                       do_mesh_box_select(&vc, &rect, (val==LEFTMOUSE));
 //                     allqueue(REDRAWVIEW3D, 0);
 //                     if (EM_texFaceCheck())
 //                             allqueue(REDRAWIMAGE, 0);
                        
                }
                else if(ELEM(G.obedit->type, OB_CURVE, OB_SURF)) {
-                       do_nurbs_box_select(ar, v3d, &rect, val==LEFTMOUSE);
+                       do_nurbs_box_select(&vc, &rect, val==LEFTMOUSE);
 //                     allqueue(REDRAWVIEW3D, 0);
                }
                else if(G.obedit->type==OB_MBALL) {
-                       hits= view3d_opengl_select(scene, ar, v3d, buffer, MAXPICKBUF, &rect);
+                       hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
                        
                        ml= NULL; // XXX editelems.first;
                        
@@ -1265,7 +1284,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
                        for(ebone= G.edbo.first; ebone; ebone= ebone->next)
                                ebone->flag &= ~BONE_DONE;
                        
-                       hits= view3d_opengl_select(scene, ar, v3d, buffer, MAXPICKBUF, &rect);
+                       hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
                        
                        /* first we only check points inside the border */
                        for (a=0; a<hits; a++){
@@ -1312,7 +1331,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
                        
                }
                else if(G.obedit->type==OB_LATTICE) {
-                       do_lattice_box_select(&rect, val==LEFTMOUSE);
+                       do_lattice_box_select(&vc, &rect, val==LEFTMOUSE);
                }
        }
        else {  /* no editmode, unified for bones and objects */
@@ -1333,7 +1352,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
                
                /* selection buffer now has bones potentially too, so we add MAXPICKBUF */
                vbuffer = MEM_mallocN(4 * (G.totobj+MAXPICKBUF) * sizeof(unsigned int), "selection buffer");
-               hits= view3d_opengl_select(scene, ar, v3d, vbuffer, 4*(G.totobj+MAXPICKBUF), &rect);
+               hits= view3d_opengl_select(&vc, vbuffer, 4*(G.totobj+MAXPICKBUF), &rect);
                /*
                LOGIC NOTES (theeth):
                The buffer and ListBase have the same relative order, which makes the selection
@@ -1533,20 +1552,19 @@ static void mesh_selectionCB__doSelectFace(void *userData, EditFace *efa, int x,
        }
 }
 
-static void mesh_selectionCB(Scene *scene, ARegion *ar, View3D *v3d, int selecting, Object *editobj, short *mval, float rad)
+static void mesh_selectionCB(ViewContext *vc, int selecting, Object *editobj, short *mval, float rad)
 {
        struct { short select, mval[2]; float radius; } data;
-       EditMesh *em = G.editMesh;
        int bbsel;
 
        if(!G.obedit && (FACESEL_PAINT_TEST)) {
-               Object *ob= OBACT;
+               Object *ob= vc->obact;
                Mesh *me = ob?ob->data:NULL;
 
                if (me) {
                        em_vertoffs= me->totface+1;     /* max index array */
 
-                       bbsel= EM_init_backbuf_circle(v3d, mval[0], mval[1], (short)(rad+1.0));
+                       bbsel= EM_init_backbuf_circle(vc->v3d, mval[0], mval[1], (short)(rad+1.0));
                        EM_backbuf_checkAndSelectTFaces(me, selecting==LEFTMOUSE);
                        EM_free_backbuf();
 
@@ -1556,39 +1574,39 @@ static void mesh_selectionCB(Scene *scene, ARegion *ar, View3D *v3d, int selecti
                return;
        }
 
-       bbsel= EM_init_backbuf_circle(v3d, mval[0], mval[1], (short)(rad+1.0));
+       bbsel= EM_init_backbuf_circle(vc->v3d, mval[0], mval[1], (short)(rad+1.0));
        
        data.select = (selecting==LEFTMOUSE);
        data.mval[0] = mval[0];
        data.mval[1] = mval[1];
        data.radius = rad;
 
-       if(scene->selectmode & SCE_SELECT_VERTEX) {
+       if(vc->scene->selectmode & SCE_SELECT_VERTEX) {
                if(bbsel) {
-                       EM_backbuf_checkAndSelectVerts(em, selecting==LEFTMOUSE);
+                       EM_backbuf_checkAndSelectVerts(vc->em, selecting==LEFTMOUSE);
                } else {
-                       mesh_foreachScreenVert(ar, v3d, mesh_selectionCB__doSelectVert, &data, 1);
+                       mesh_foreachScreenVert(vc, mesh_selectionCB__doSelectVert, &data, 1);
                }
        }
 
-       if(scene->selectmode & SCE_SELECT_EDGE) {
+       if(vc->scene->selectmode & SCE_SELECT_EDGE) {
                if (bbsel) {
-                       EM_backbuf_checkAndSelectEdges(em, selecting==LEFTMOUSE);
+                       EM_backbuf_checkAndSelectEdges(vc->em, selecting==LEFTMOUSE);
                } else {
-                       mesh_foreachScreenEdge(ar, v3d, mesh_selectionCB__doSelectEdge, &data, 0);
+                       mesh_foreachScreenEdge(vc, mesh_selectionCB__doSelectEdge, &data, 0);
                }
        }
        
-       if(scene->selectmode & SCE_SELECT_FACE) {
+       if(vc->scene->selectmode & SCE_SELECT_FACE) {
                if(bbsel) {
-                       EM_backbuf_checkAndSelectFaces(em, selecting==LEFTMOUSE);
+                       EM_backbuf_checkAndSelectFaces(vc->em, selecting==LEFTMOUSE);
                } else {
-                       mesh_foreachScreenFace(ar, v3d, mesh_selectionCB__doSelectFace, &data);
+                       mesh_foreachScreenFace(vc, mesh_selectionCB__doSelectFace, &data);
                }
        }
 
        EM_free_backbuf();
-       EM_selectmode_flush(em);
+       EM_selectmode_flush(vc->em);
 }
 
 
@@ -1612,7 +1630,7 @@ static void nurbscurve_selectionCB__doSelect(void *userData, Nurb *nu, BPoint *b
                }
        }
 }
-static void nurbscurve_selectionCB(ARegion *ar, View3D *v3d, int selecting, Object *editobj, short *mval, float rad)
+static void nurbscurve_selectionCB(ViewContext *vc, int selecting, Object *editobj, short *mval, float rad)
 {
        struct { short select, mval[2]; float radius; } data;
 
@@ -1621,7 +1639,7 @@ static void nurbscurve_selectionCB(ARegion *ar, View3D *v3d, int selecting, Obje
        data.mval[1] = mval[1];
        data.radius = rad;
 
-       nurbs_foreachScreenVert(ar, v3d, nurbscurve_selectionCB__doSelect, &data);
+       nurbs_foreachScreenVert(vc, nurbscurve_selectionCB__doSelect, &data);
 }
 
 
@@ -1635,7 +1653,7 @@ static void latticecurve_selectionCB__doSelect(void *userData, BPoint *bp, int x
                bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
        }
 }
-static void lattice_selectionCB(int selecting, Object *editobj, short *mval, float rad)
+static void lattice_selectionCB(ViewContext *vc, int selecting, Object *editobj, short *mval, float rad)
 {
        struct { short select, mval[2]; float radius; } data;
 
@@ -1644,23 +1662,23 @@ static void lattice_selectionCB(int selecting, Object *editobj, short *mval, flo
        data.mval[1] = mval[1];
        data.radius = rad;
 
-       lattice_foreachScreenVert(latticecurve_selectionCB__doSelect, &data);
+       lattice_foreachScreenVert(vc, latticecurve_selectionCB__doSelect, &data);
 }
 
 /** Callbacks for selection in Editmode */
 
-void obedit_selectionCB(Scene *scene, ARegion *ar, View3D *v3d, short selecting, Object *editobj, short *mval, float rad) 
+void obedit_selectionCB(ViewContext *vc, short selecting, Object *editobj, short *mval, float rad) 
 {
        switch(editobj->type) {         
        case OB_MESH:
-               mesh_selectionCB(scene, ar, v3d, selecting, editobj, mval, rad);
+               mesh_selectionCB(vc, selecting, editobj, mval, rad);
                break;
        case OB_CURVE:
        case OB_SURF:
-               nurbscurve_selectionCB(ar, v3d, selecting, editobj, mval, rad);
+               nurbscurve_selectionCB(vc, selecting, editobj, mval, rad);
                break;
        case OB_LATTICE:
-               lattice_selectionCB(selecting, editobj, mval, rad);
+               lattice_selectionCB(vc, selecting, editobj, mval, rad);
                break;
        default:
                return;
index cfd3fbba7b5ec871f726c580c8f6638eaa7cb164..1949db88d280910ca3c4f8f86dae040730022429 100644 (file)
@@ -45,8 +45,9 @@
 
 #include "MEM_guardedalloc.h"
 
-#include "BLI_blenlib.h"
 #include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
 #include "BLI_rand.h"
 
 #include "BKE_anim.h"
@@ -66,7 +67,9 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "ED_mesh.h"
 #include "ED_screen.h"
+#include "ED_view3d.h"
 
 #include "UI_interface.h"
 #include "UI_resources.h"
@@ -974,8 +977,11 @@ void setcameratoview3d(View3D *v3d)
 *   This is an error, "Too many objects in select buffer"
 *   and no action should be taken (can crash blender) if this happens
 */
-short view3d_opengl_select(Scene *scene, ARegion *ar, View3D *v3d, unsigned int *buffer, unsigned int bufsize, rcti *input)
+short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int bufsize, rcti *input)
 {
+       Scene *scene= vc->scene;
+       View3D *v3d= vc->v3d;
+       ARegion *ar= vc->ar;
        rctf rect;
        short code, hits;