forked from bartvdbraak/blender
view3d - replace magic numbers with an enum to be used with mesh_foreachScreenVert, mesh_foreachScreenEdge since it wasnt clear how the values are used.
also resolved use of un-initialized variable.
This commit is contained in:
parent
9c156c550f
commit
c126bfba82
@ -1702,6 +1702,8 @@ void BKE_tracking_solve_reconstruction(MovieReconstructContext *context, short *
|
||||
(void) stop;
|
||||
(void) do_update;
|
||||
(void) progress;
|
||||
(void) stats_message;
|
||||
(void) message_size;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,12 @@ typedef struct ViewDepths {
|
||||
char damaged;
|
||||
} ViewDepths;
|
||||
|
||||
/* enum for passing to foreach functions to test RV3D_CLIPPING */
|
||||
typedef enum eV3DClipTest {
|
||||
V3D_CLIP_TEST_OFF = 0, /* clipping is off */
|
||||
V3D_CLIP_TEST_RV3D_CLIPPING = 1, /* clip single points */
|
||||
V3D_CLIP_TEST_REGION = 2 /* use for edges to check if both verts are in the view, but not RV3D_CLIPPING */
|
||||
} eV3DClipTest;
|
||||
|
||||
float *give_cursor(struct Scene *scene, struct View3D *v3d);
|
||||
|
||||
@ -214,8 +220,8 @@ void ED_view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struc
|
||||
void ED_view3d_calc_camera_border_size(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, float size_r[2]);
|
||||
|
||||
/* drawobject.c iterators */
|
||||
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_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, eV3DClipTest 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, eV3DClipTest 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);
|
||||
|
@ -448,11 +448,11 @@ EditVert *findnearestvert(ViewContext *vc, int *dist, short sel, short strict)
|
||||
|
||||
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
|
||||
|
||||
mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, 1);
|
||||
mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
|
||||
|
||||
if (data.dist>3) {
|
||||
data.pass = 1;
|
||||
mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, 1);
|
||||
mesh_foreachScreenVert(vc, findnearestvert__doClosest, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
|
||||
}
|
||||
|
||||
*dist = data.dist;
|
||||
@ -540,7 +540,7 @@ EditEdge *findnearestedge(ViewContext *vc, int *dist)
|
||||
data.closest = NULL;
|
||||
|
||||
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
|
||||
mesh_foreachScreenEdge(vc, findnearestedge__doClosest, &data, 2);
|
||||
mesh_foreachScreenEdge(vc, findnearestedge__doClosest, &data, V3D_CLIP_TEST_REGION);
|
||||
|
||||
*dist = data.dist;
|
||||
return data.closest;
|
||||
|
@ -547,7 +547,7 @@ static void xsortvert_flag(bContext *C, int flag)
|
||||
sortblock[i].v1 = eve;
|
||||
|
||||
ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
|
||||
mesh_foreachScreenVert(&vc, xsortvert_flag__doSetX, sortblock, 0);
|
||||
mesh_foreachScreenVert(&vc, xsortvert_flag__doSetX, sortblock, V3D_CLIP_TEST_OFF);
|
||||
|
||||
qsort(sortblock, amount, sizeof(xvertsort), vergxco);
|
||||
|
||||
|
@ -149,7 +149,7 @@ static int check_ob_drawface_dot(Scene *sce, View3D *vd, char dt)
|
||||
/* ************* only use while object drawing **************
|
||||
* or after running ED_view3d_init_mats_rv3d
|
||||
* */
|
||||
static void view3d_project_short_clip(ARegion *ar, const float vec[3], short *adr, int local)
|
||||
static void view3d_project_short_clip(ARegion *ar, const float vec[3], short adr[2], int local)
|
||||
{
|
||||
RegionView3D *rv3d= ar->regiondata;
|
||||
float fx, fy, vec4[4];
|
||||
@ -184,7 +184,7 @@ static void view3d_project_short_clip(ARegion *ar, const float vec[3], short *ad
|
||||
}
|
||||
|
||||
/* only use while object drawing */
|
||||
static void view3d_project_short_noclip(ARegion *ar, const float vec[3], short *adr)
|
||||
static void view3d_project_short_noclip(ARegion *ar, const float vec[3], short adr[2])
|
||||
{
|
||||
RegionView3D *rv3d= ar->regiondata;
|
||||
float fx, fy, vec4[4];
|
||||
@ -212,7 +212,7 @@ static void view3d_project_short_noclip(ARegion *ar, const float vec[3], short *
|
||||
}
|
||||
|
||||
/* same as view3d_project_short_clip but use persmat instead of persmatob for projection */
|
||||
static void view3d_project_short_clip_persmat(ARegion *ar, float *vec, short *adr, int local)
|
||||
static void view3d_project_short_clip_persmat(ARegion *ar, float *vec, short adr[2], int local)
|
||||
{
|
||||
RegionView3D *rv3d= ar->regiondata;
|
||||
float fx, fy, vec4[4];
|
||||
@ -1900,13 +1900,15 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
|
||||
* use the object matrix in the useual way */
|
||||
static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
|
||||
{
|
||||
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ViewContext vc; int clipVerts; } *data = userData;
|
||||
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index);
|
||||
void *userData; ViewContext vc; eV3DClipTest clipVerts; } *data = userData;
|
||||
|
||||
EditVert *eve = EM_get_vert_for_index(index);
|
||||
|
||||
if (eve->h==0) {
|
||||
short s[2]= {IS_CLIPPED, 0};
|
||||
|
||||
if (data->clipVerts) {
|
||||
if (data->clipVerts != V3D_CLIP_TEST_OFF) {
|
||||
view3d_project_short_clip(data->vc.ar, co, s, 1);
|
||||
} else {
|
||||
view3d_project_short_noclip(data->vc.ar, co, s);
|
||||
@ -1917,9 +1919,11 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co
|
||||
}
|
||||
}
|
||||
|
||||
void mesh_foreachScreenVert(ViewContext *vc, 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, eV3DClipTest clipVerts)
|
||||
{
|
||||
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ViewContext vc; int clipVerts; } data;
|
||||
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index);
|
||||
void *userData; ViewContext vc; eV3DClipTest clipVerts; } data;
|
||||
|
||||
DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
|
||||
|
||||
data.vc= *vc;
|
||||
@ -1927,7 +1931,7 @@ void mesh_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, EditVe
|
||||
data.userData = userData;
|
||||
data.clipVerts = clipVerts;
|
||||
|
||||
if(clipVerts)
|
||||
if(clipVerts != V3D_CLIP_TEST_OFF)
|
||||
ED_view3d_local_clipping(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */
|
||||
|
||||
EM_init_index_arrays(vc->em, 1, 0, 0);
|
||||
@ -1963,24 +1967,36 @@ static void drawSelectedVertices(DerivedMesh *dm, Mesh *me)
|
||||
dm->foreachMappedVert(dm, drawSelectedVertices__mapFunc, me->mvert);
|
||||
glEnd();
|
||||
}
|
||||
static int is_co_in_region(ARegion *ar, const short co[2])
|
||||
{
|
||||
return ( (co[0] != IS_CLIPPED) && /* may be the only initialized value, check first */
|
||||
(co[0] >= 0) &&
|
||||
(co[0] < ar->winx) &&
|
||||
(co[1] >= 0) &&
|
||||
(co[1] < ar->winy));
|
||||
}
|
||||
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; ViewContext vc; int clipVerts; } *data = userData;
|
||||
struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index);
|
||||
void *userData; ViewContext vc; eV3DClipTest clipVerts; } *data = userData;
|
||||
EditEdge *eed = EM_get_edge_for_index(index);
|
||||
short s[2][2];
|
||||
|
||||
if (eed->h==0) {
|
||||
if (data->clipVerts==1) {
|
||||
if (data->clipVerts == V3D_CLIP_TEST_RV3D_CLIPPING) {
|
||||
view3d_project_short_clip(data->vc.ar, v0co, s[0], 1);
|
||||
view3d_project_short_clip(data->vc.ar, v1co, s[1], 1);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
view3d_project_short_noclip(data->vc.ar, v0co, s[0]);
|
||||
view3d_project_short_noclip(data->vc.ar, v1co, s[1]);
|
||||
|
||||
if (data->clipVerts==2) {
|
||||
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;
|
||||
if (data->clipVerts == V3D_CLIP_TEST_REGION) {
|
||||
if ( !is_co_in_region(data->vc.ar, s[0]) &&
|
||||
!is_co_in_region(data->vc.ar, s[1]))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1988,9 +2004,10 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, eV3DClipTest clipVerts)
|
||||
{
|
||||
struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ViewContext vc; int clipVerts; } data;
|
||||
struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index);
|
||||
void *userData; ViewContext vc; eV3DClipTest clipVerts; } data;
|
||||
DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
|
||||
|
||||
data.vc= *vc;
|
||||
@ -1998,7 +2015,7 @@ void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEd
|
||||
data.userData = userData;
|
||||
data.clipVerts = clipVerts;
|
||||
|
||||
if(clipVerts)
|
||||
if(clipVerts != V3D_CLIP_TEST_OFF)
|
||||
ED_view3d_local_clipping(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */
|
||||
|
||||
EM_init_index_arrays(vc->em, 0, 1, 0);
|
||||
|
@ -521,17 +521,17 @@ static void do_lasso_select_mesh(ViewContext *vc, int mcords[][2], short moves,
|
||||
EM_backbuf_checkAndSelectVerts(vc->em, select);
|
||||
}
|
||||
else {
|
||||
mesh_foreachScreenVert(vc, do_lasso_select_mesh__doSelectVert, &data, 1);
|
||||
mesh_foreachScreenVert(vc, do_lasso_select_mesh__doSelectVert, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
|
||||
}
|
||||
}
|
||||
if(ts->selectmode & SCE_SELECT_EDGE) {
|
||||
/* Does both bbsel and non-bbsel versions (need screen cos for both) */
|
||||
data.pass = 0;
|
||||
mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, 0);
|
||||
mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, V3D_CLIP_TEST_OFF);
|
||||
|
||||
if (data.done==0) {
|
||||
data.pass = 1;
|
||||
mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, 0);
|
||||
mesh_foreachScreenEdge(vc, do_lasso_select_mesh__doSelectEdge, &data, V3D_CLIP_TEST_OFF);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1644,18 +1644,18 @@ static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exten
|
||||
if (bbsel) {
|
||||
EM_backbuf_checkAndSelectVerts(vc->em, select);
|
||||
} else {
|
||||
mesh_foreachScreenVert(vc, do_mesh_box_select__doSelectVert, &data, 1);
|
||||
mesh_foreachScreenVert(vc, do_mesh_box_select__doSelectVert, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
|
||||
}
|
||||
}
|
||||
if(ts->selectmode & SCE_SELECT_EDGE) {
|
||||
/* Does both bbsel and non-bbsel versions (need screen cos for both) */
|
||||
|
||||
data.pass = 0;
|
||||
mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, 0);
|
||||
mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, V3D_CLIP_TEST_OFF);
|
||||
|
||||
if (data.done==0) {
|
||||
data.pass = 1;
|
||||
mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, 0);
|
||||
mesh_foreachScreenEdge(vc, do_mesh_box_select__doSelectEdge, &data, V3D_CLIP_TEST_OFF);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2170,7 +2170,7 @@ static void mesh_circle_select(ViewContext *vc, int select, const int mval[2], f
|
||||
if(bbsel) {
|
||||
EM_backbuf_checkAndSelectVerts(vc->em, select==LEFTMOUSE);
|
||||
} else {
|
||||
mesh_foreachScreenVert(vc, mesh_circle_doSelectVert, &data, 1);
|
||||
mesh_foreachScreenVert(vc, mesh_circle_doSelectVert, &data, V3D_CLIP_TEST_RV3D_CLIPPING);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2178,7 +2178,7 @@ static void mesh_circle_select(ViewContext *vc, int select, const int mval[2], f
|
||||
if (bbsel) {
|
||||
EM_backbuf_checkAndSelectEdges(vc->em, select==LEFTMOUSE);
|
||||
} else {
|
||||
mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, &data, 0);
|
||||
mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, &data, V3D_CLIP_TEST_OFF);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user