View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:

- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes

Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).

To see it work; also added new feature for region split, 
press SHIFT+ALT+CTRL+S for four-split. 
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.

Note about the code:
- currently view3d still stores some depricated settings, to
  convert from older files. Not all settings are copied over
  though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
  for it should keep track of that.

Bugfix in transform: quat initialize in operator-invoke missed
one zero.

Als brought back GE to compile for missing Ipos and channels.
This commit is contained in:
Ton Roosendaal 2009-01-19 16:54:41 +00:00
parent 9b049d89a1
commit bc63213844
53 changed files with 1426 additions and 1211 deletions

@ -45,6 +45,8 @@ struct ReportList;
struct Scene;
struct ScrArea;
struct SpaceLink;
struct View3D;
struct RegionView3D;
struct StructRNA;
struct ToolSettings;
struct Image;
@ -96,6 +98,7 @@ struct bScreen *CTX_wm_screen(const bContext *C);
struct ScrArea *CTX_wm_area(const bContext *C);
struct SpaceLink *CTX_wm_space_data(const bContext *C);
struct View3D *CTX_wm_view3d(const bContext *C);
struct RegionView3D *CTX_wm_region_view3d(const bContext *C);
struct ARegion *CTX_wm_region(const bContext *C);
void *CTX_wm_region_data(const bContext *C);
struct uiBlock *CTX_wm_ui_block(const bContext *C);

@ -105,6 +105,10 @@ typedef struct ARegionType {
void (*free)(struct ARegion *);
/* split region, copy data optionally */
void *(*duplicate)(void *);
/* register operator types on startup */
void (*operatortypes)(void);
/* add own items to keymap */
@ -127,6 +131,7 @@ typedef struct ARegionType {
/* spacetypes */
struct SpaceType *BKE_spacetype_from_id(int spaceid);
struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
const struct ListBase *BKE_spacetypes_list(void);
void BKE_spacetype_register(struct SpaceType *st);
void BKE_spacetypes_free(void); /* only for quitting blender */
@ -136,8 +141,8 @@ void BKE_spacedata_freelist(ListBase *lb);
void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
/* area/regions */
struct ARegion *BKE_area_region_copy(struct ARegion *ar);
void BKE_area_region_free(struct ARegion *ar);
struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
void BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
void BKE_screen_area_free(struct ScrArea *sa);

@ -171,6 +171,13 @@ View3D *CTX_wm_view3d(const bContext *C)
return NULL;
}
RegionView3D *CTX_wm_region_view3d(const bContext *C)
{
if(C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
if(C->wm.region)
return C->wm.region->regiondata;
return NULL;
}
ARegion *CTX_wm_region(const bContext *C)
{

@ -546,11 +546,11 @@ void unlink_object(Scene *scene, Object *ob)
if(v3d->camera==ob) {
v3d->camera= NULL;
if(v3d->persp==V3D_CAMOB) v3d->persp= V3D_PERSP;
// XXX if(v3d->persp==V3D_CAMOB) v3d->persp= V3D_PERSP;
}
if(v3d->localvd && v3d->localvd->camera==ob ) {
v3d->localvd->camera= NULL;
if(v3d->localvd->persp==V3D_CAMOB) v3d->localvd->persp= V3D_PERSP;
// XXX if(v3d->localvd->persp==V3D_CAMOB) v3d->localvd->persp= V3D_PERSP;
}
}
else if(sl->spacetype==SPACE_OOPS) {

@ -82,6 +82,19 @@ SpaceType *BKE_spacetype_from_id(int spaceid)
return NULL;
}
ARegionType *BKE_regiontype_from_id(SpaceType *st, int regionid)
{
ARegionType *art;
for(art= st->regiontypes.first; art; art= art->next)
if(art->regionid==regionid)
return art;
printf("Error, region type missing in %s\n", st->name);
return st->regiontypes.first;
}
const ListBase *BKE_spacetypes_list()
{
return &spacetypes;
@ -113,9 +126,9 @@ void BKE_spacedata_freelist(ListBase *lb)
SpaceType *st= BKE_spacetype_from_id(sl->spacetype);
/* free regions for pushed spaces */
for(ar=sl->regionbase.first; ar; ar=ar->next) {
BKE_area_region_free(ar);
}
for(ar=sl->regionbase.first; ar; ar=ar->next)
BKE_area_region_free(st, ar);
BLI_freelistN(&sl->regionbase);
if(st && st->free)
@ -125,19 +138,26 @@ void BKE_spacedata_freelist(ListBase *lb)
BLI_freelistN(lb);
}
ARegion *BKE_area_region_copy(ARegion *ar)
ARegion *BKE_area_region_copy(SpaceType *st, ARegion *ar)
{
ARegion *newar= MEM_dupallocN(ar);
Panel *pa, *newpa, *patab;
newar->prev= newar->next= NULL;
newar->handlers.first= newar->handlers.last= NULL;
newar->uiblocks.first= newar->uiblocks.last= NULL;
newar->swinid= 0;
/* XXX regiondata callback */
if(ar->regiondata)
newar->regiondata= MEM_dupallocN(ar->regiondata);
/* use optional regiondata callback */
if(ar->regiondata) {
ARegionType *art= BKE_regiontype_from_id(st, ar->regiontype);
if(art && art->duplicate)
newar->regiondata= art->duplicate(ar->regiondata);
else
newar->regiondata= MEM_dupallocN(ar->regiondata);
}
newar->panels.first= newar->panels.last= NULL;
BLI_duplicatelist(&newar->panels, &ar->panels);
@ -160,7 +180,7 @@ ARegion *BKE_area_region_copy(ARegion *ar)
/* from lb2 to lb1, lb1 is supposed to be free'd */
static void region_copylist(ListBase *lb1, ListBase *lb2)
static void region_copylist(SpaceType *st, ListBase *lb1, ListBase *lb2)
{
ARegion *ar;
@ -168,7 +188,7 @@ static void region_copylist(ListBase *lb1, ListBase *lb2)
lb1->first= lb1->last= NULL;
for(ar= lb2->first; ar; ar= ar->next) {
ARegion *arnew= BKE_area_region_copy(ar);
ARegion *arnew= BKE_area_region_copy(st, ar);
BLI_addtail(lb1, arnew);
}
}
@ -189,18 +209,21 @@ void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2)
BLI_addtail(lb1, slnew);
region_copylist(&slnew->regionbase, &sl->regionbase);
region_copylist(st, &slnew->regionbase, &sl->regionbase);
}
}
}
/* not region itself */
void BKE_area_region_free(ARegion *ar)
void BKE_area_region_free(SpaceType *st, ARegion *ar)
{
if(st) {
ARegionType *art= BKE_regiontype_from_id(st, ar->regiontype);
if(art && art->free)
art->free(ar);
}
if(ar) {
if(ar->type && ar->type->free)
ar->type->free(ar);
BLI_freelistN(&ar->panels);
}
}
@ -208,16 +231,16 @@ void BKE_area_region_free(ARegion *ar)
/* not area itself */
void BKE_screen_area_free(ScrArea *sa)
{
ARegion *ar, *arn;
SpaceType *st= BKE_spacetype_from_id(sa->spacetype);
ARegion *ar;
for(ar=sa->regionbase.first; ar; ar=arn) {
arn= ar->next;
BKE_area_region_free(ar);
}
for(ar=sa->regionbase.first; ar; ar=ar->next)
BKE_area_region_free(st, ar);
BLI_freelistN(&sa->regionbase);
BKE_spacedata_freelist(&sa->spacedata);
BLI_freelistN(&sa->regionbase);
BLI_freelistN(&sa->actionzones);
#ifndef DISABLE_PYTHON
@ -229,12 +252,11 @@ void BKE_screen_area_free(ScrArea *sa)
void free_screen(bScreen *sc)
{
ScrArea *sa, *san;
ARegion *ar, *arn;
ARegion *ar;
for(ar=sc->regionbase.first; ar; ar=arn) {
arn= ar->next;
BKE_area_region_free(ar);
}
for(ar=sc->regionbase.first; ar; ar=ar->next)
BKE_area_region_free(NULL, ar);
BLI_freelistN(&sc->regionbase);
for(sa= sc->areabase.first; sa; sa= san) {

@ -4101,8 +4101,6 @@ static void lib_link_screen(FileData *fd, Main *main)
if(v3d->localvd) {
v3d->localvd->camera= newlibadr(fd, sc->id.lib, v3d->localvd->camera);
}
v3d->depths= NULL;
v3d->ri= NULL;
}
else if(sl->spacetype==SPACE_IPO) {
SpaceIpo *sipo= (SpaceIpo *)sl;
@ -4409,7 +4407,7 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
}
}
static void direct_link_region(FileData *fd, ARegion *ar)
static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
{
Panel *pa;
@ -4421,15 +4419,51 @@ static void direct_link_region(FileData *fd, ARegion *ar)
pa->sortcounter= 0;
pa->activedata= NULL;
}
ar->regiondata= newdataadr(fd, ar->regiondata);
if(ar->regiondata) {
if(spacetype==SPACE_VIEW3D) {
RegionView3D *rv3d= ar->regiondata;
rv3d->localvd= newdataadr(fd, rv3d->localvd);
rv3d->clipbb= newdataadr(fd, rv3d->clipbb);
rv3d->depths= NULL;
rv3d->retopo_view_data= NULL;
rv3d->ri= NULL;
rv3d->sms= NULL;
rv3d->smooth_timer= NULL;
}
}
ar->handlers.first= ar->handlers.last= NULL;
ar->uiblocks.first= ar->uiblocks.last= NULL;
ar->headerstr= NULL;
ar->regiondata= NULL;
ar->swinid= 0;
ar->type= NULL;
}
/* for the saved 2.50 files without regiondata */
/* and as patch for 2.48 and older */
static void view3d_split_250(View3D *v3d, ListBase *regions)
{
ARegion *ar;
for(ar= regions->first; ar; ar= ar->next) {
if(ar->regiontype==RGN_TYPE_WINDOW && ar->regiondata==NULL) {
RegionView3D *rv3d;
rv3d= ar->regiondata= MEM_callocN(sizeof(RegionView3D), "region v3d");
rv3d->persp= v3d->persp;
rv3d->view= v3d->view;
rv3d->dist= v3d->dist;
VECCOPY(rv3d->ofs, v3d->ofs);
QUATCOPY(rv3d->viewquat, v3d->viewquat);
Mat4One(rv3d->twmat);
}
}
}
static void direct_link_screen(FileData *fd, bScreen *sc)
{
ScrArea *sa;
@ -4482,6 +4516,9 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
sa->handlers.first= sa->handlers.last= NULL;
sa->type= NULL; /* spacetype callbacks */
for(ar= sa->regionbase.first; ar; ar= ar->next)
direct_link_region(fd, ar, sa->spacetype);
/* accident can happen when read/save new file with older version */
/* 2.50: we now always add spacedata for info */
if(sa->spacedata.first==NULL) {
@ -4489,12 +4526,15 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
sa->spacetype= SPACE_INFO;
BLI_addtail(&sa->spacedata, sinfo);
}
/* add local view3d too */
else if(sa->spacetype==SPACE_VIEW3D)
view3d_split_250(sa->spacedata.first, &sa->regionbase);
for (sl= sa->spacedata.first; sl; sl= sl->next) {
link_list(fd, &(sl->regionbase));
for(ar= sl->regionbase.first; ar; ar= ar->next)
direct_link_region(fd, ar);
direct_link_region(fd, ar, sl->spacetype);
if (sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*) sl;
@ -4507,11 +4547,9 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
}
v3d->localvd= newdataadr(fd, v3d->localvd);
v3d->afterdraw.first= v3d->afterdraw.last= NULL;
v3d->clipbb= newdataadr(fd, v3d->clipbb);
v3d->retopo_view_data= NULL;
v3d->properties_storage= NULL;
v3d->sms= NULL;
v3d->smooth_timer= NULL;
view3d_split_250(v3d, &sl->regionbase);
}
else if (sl->spacetype==SPACE_OOPS) {
SpaceOops *soops= (SpaceOops*) sl;
@ -4561,9 +4599,6 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
}
}
for(ar= sa->regionbase.first; ar; ar= ar->next)
direct_link_region(fd, ar);
sa->actionzones.first= sa->actionzones.last= NULL;
sa->v1= newdataadr(fd, sa->v1);
@ -5412,7 +5447,12 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
if(sl) {
/* if active spacetype has view2d data, copy that over to main region */
/* and we split view3d */
switch(sl->spacetype) {
case SPACE_VIEW3D:
view3d_split_250((View3D *)sl, lb);
break;
case SPACE_OOPS:
{
SpaceOops *soops= (SpaceOops *)sl;
@ -8679,7 +8719,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(ma->nodetree && strlen(ma->nodetree->id.name)==0)
strcpy(ma->nodetree->id.name, "NTShader Nodetree");
}
/* and composit trees */
for(sce= main->scene.first; sce; sce= sce->id.next) {
if(sce->nodetree && strlen(sce->nodetree->id.name)==0)

@ -1692,6 +1692,32 @@ static void write_windowmanagers(WriteData *wd, ListBase *lb)
}
}
static void write_region(WriteData *wd, ARegion *ar, int spacetype)
{
writestruct(wd, DATA, "ARegion", 1, ar);
if(ar->regiondata) {
switch(spacetype) {
case SPACE_VIEW3D:
if(ar->regiontype==RGN_TYPE_WINDOW) {
RegionView3D *rv3d= ar->regiondata;
writestruct(wd, DATA, "RegionView3D", 1, rv3d);
if(rv3d->localvd)
writestruct(wd, DATA, "RegionView3D", 1, rv3d->localvd);
if(rv3d->clipbb)
writestruct(wd, DATA, "BoundBox", 1, rv3d->clipbb);
}
else
printf("regiondata write missing!\n");
break;
default:
printf("regiondata write missing!\n");
}
}
}
static void write_screens(WriteData *wd, ListBase *scrbase)
{
bScreen *sc;
@ -1723,7 +1749,7 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
writestruct(wd, DATA, "ScrArea", 1, sa);
for(ar= sa->regionbase.first; ar; ar= ar->next) {
writestruct(wd, DATA, "ARegion", 1, ar);
write_region(wd, ar, sa->spacetype);
for(pa= ar->panels.first; pa; pa= pa->next)
writestruct(wd, DATA, "Panel", 1, pa);
@ -1735,14 +1761,13 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
sl= sa->spacedata.first;
while(sl) {
for(ar= sl->regionbase.first; ar; ar= ar->next)
writestruct(wd, DATA, "ARegion", 1, ar);
write_region(wd, ar, sl->spacetype);
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D *) sl;
writestruct(wd, DATA, "View3D", 1, v3d);
if(v3d->bgpic) writestruct(wd, DATA, "BGpic", 1, v3d->bgpic);
if(v3d->localvd) writestruct(wd, DATA, "View3D", 1, v3d->localvd);
if(v3d->clipbb) writestruct(wd, DATA, "BoundBox", 1, v3d->clipbb);
if(v3d->gpd) write_gpencil(wd, v3d->gpd);
}
else if(sl->spacetype==SPACE_IPO) {

@ -2023,7 +2023,7 @@ static EditBone *add_editbone(Object *obedit, char *name)
return bone;
}
static void add_primitive_bone(Scene *scene, View3D *v3d, short newob)
static void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d, short newob)
{
Object *obedit= scene->obedit; // XXX get from context
float obmat[3][3], curs[3], viewmat[3][3], totmat[3][3], imat[3][3];
@ -2035,7 +2035,8 @@ static void add_primitive_bone(Scene *scene, View3D *v3d, short newob)
Mat4Invert(obedit->imat, obedit->obmat);
Mat4MulVecfl(obedit->imat, curs);
if ( !(newob) || (U.flag & USER_ADD_VIEWALIGNED) ) Mat3CpyMat4(obmat, v3d->viewmat);
if ( !(newob) || (U.flag & USER_ADD_VIEWALIGNED) )
Mat3CpyMat4(obmat, rv3d->viewmat);
else Mat3One(obmat);
Mat3CpyMat4(viewmat, obedit->obmat);
@ -2058,6 +2059,7 @@ static void add_primitive_bone(Scene *scene, View3D *v3d, short newob)
void add_primitiveArmature(Scene *scene, View3D *v3d, int type)
{
RegionView3D *rv3d= NULL; // XXX get from context
Object *obedit= scene->obedit; // XXX get from context
short newob=0;
@ -2071,7 +2073,7 @@ void add_primitiveArmature(Scene *scene, View3D *v3d, int type)
/* If we're not the "obedit", make a new object and enter editmode */
if (obedit==NULL) {
add_object(scene, OB_ARMATURE);
ED_object_base_init_from_view(scene, v3d, BASACT);
ED_object_base_init_from_view(NULL, BASACT); // XXX NULL is C
obedit= BASACT->object;
where_is_object(scene, obedit);
@ -2082,7 +2084,7 @@ void add_primitiveArmature(Scene *scene, View3D *v3d, int type)
}
/* no primitive support yet */
add_primitive_bone(scene, v3d, newob);
add_primitive_bone(scene, v3d, rv3d, newob);
countall(); // flushes selection!
@ -4815,7 +4817,7 @@ void generateSkeletonFromReebGraph(Scene *scene, ReebGraph *rg)
}
dst = add_object(scene, OB_ARMATURE);
ED_object_base_init_from_view(scene, NULL, scene->basact);
ED_object_base_init_from_view(NULL, scene->basact); // XXX NULL is C
obedit= scene->basact->object;
/* Copy orientation from source */

@ -2827,6 +2827,7 @@ void mouse_nurb(bContext *C, short mval[2], int extend)
static void spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode)
{
ListBase *editnurb= curve_get_editcurve(obedit);
RegionView3D *rv3d= NULL; // XXX
View3D *v3d= NULL; // XXX
Nurb *nu;
float *curs, si,phi,n[3],q[4],cmat[3][3],tmat[3][3],imat[3][3];
@ -2837,7 +2838,7 @@ static void spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode)
if(v3d==0 || obedit==0 || obedit->type!=OB_SURF) return;
if( (v3d->lay & obedit->lay)==0 ) return;
if (mode != 2) Mat3CpyMat4(persmat, v3d->viewmat);
if (mode != 2) Mat3CpyMat4(persmat, rv3d->viewmat);
else Mat3One(persmat);
Mat3Inv(persinv, persmat);
@ -2854,9 +2855,9 @@ static void spin_nurb(Scene *scene, Object *obedit, float *dvec, short mode)
n[0]=n[1]= 0.0;
n[2]= 1.0;
} else {
n[0]= v3d->viewinv[2][0];
n[1]= v3d->viewinv[2][1];
n[2]= v3d->viewinv[2][2];
n[0]= rv3d->viewinv[2][0];
n[1]= rv3d->viewinv[2][1];
n[2]= rv3d->viewinv[2][2];
Normalize(n);
}
@ -4062,6 +4063,7 @@ Nurb *addNurbprim(Scene *scene, int type, int stype, int newname)
Object *obedit= scene->obedit; // XXX
ListBase *editnurb= curve_get_editcurve(obedit);
View3D *v3d= NULL; // XXX
RegionView3D *rv3d= NULL; // XXX
static int xzproj= 0;
Nurb *nu = NULL;
BezTriple *bezt;
@ -4084,7 +4086,8 @@ Nurb *addNurbprim(Scene *scene, int type, int stype, int newname)
cent[2]-= obedit->obmat[3][2];
if (v3d) {
if ( !(newname) || U.flag & USER_ADD_VIEWALIGNED) Mat3CpyMat4(imat, v3d->viewmat);
if ( !(newname) || U.flag & USER_ADD_VIEWALIGNED)
Mat3CpyMat4(imat, rv3d->viewmat);
else Mat3One(imat);
Mat3MulVecfl(imat, cent);
Mat3MulMat3(cmat, imat, mat);
@ -4515,7 +4518,7 @@ void add_primitiveCurve(Scene *scene, int stype)
/* if no obedit: new object and enter editmode */
if(obedit==NULL) {
// XXX add_object_draw(OB_CURVE);
ED_object_base_init_from_view(scene, v3d, BASACT);
ED_object_base_init_from_view(NULL, BASACT); // NULL is C
obedit= BASACT->object;
where_is_object(scene, obedit);
@ -4558,7 +4561,6 @@ void add_primitiveNurb(Scene *scene, int type)
{
Object *obedit= scene->obedit; // XXX
ListBase *editnurb= curve_get_editcurve(obedit);
View3D *v3d= NULL; // XXX
Nurb *nu;
int newname= 0;
@ -4569,7 +4571,7 @@ void add_primitiveNurb(Scene *scene, int type)
/* if no obedit: new object and enter editmode */
if(obedit==0) {
// XXX add_object_draw(OB_SURF);
ED_object_base_init_from_view(scene, v3d, BASACT);
ED_object_base_init_from_view(NULL, BASACT); // NULL is C
obedit= BASACT->object;
where_is_object(scene, obedit);

@ -763,7 +763,6 @@ void gpencil_delete_menu (void)
static void gp_strokepoint_convertcoords (bGPDstroke *gps, bGPDspoint *pt, float p3d[3])
{
ARegion *ar= NULL; // XXX
View3D *v3d= NULL; // XXX
if (gps->flag & GP_STROKE_3DSPACE) {
/* directly use 3d-coordinates */
@ -790,8 +789,8 @@ static void gp_strokepoint_convertcoords (bGPDstroke *gps, bGPDspoint *pt, float
/* convert screen coordinate to 3d coordinates
* - method taken from editview.c - mouse_cursor()
*/
project_short_noclip(ar, v3d, fp, mval);
window_to_3d(ar, v3d, dvec, mval[0]-mx, mval[1]-my);
project_short_noclip(ar, fp, mval);
window_to_3d(ar, dvec, mval[0]-mx, mval[1]-my);
VecSubf(p3d, fp, dvec);
}
}
@ -1037,6 +1036,7 @@ void gpencil_convert_operation (short mode)
{
Scene *scene= NULL; // XXX
View3D *v3d= NULL; // XXX
RegionView3D *rv3d= NULL; // XXX
bGPdata *gpd;
float *fp= give_cursor(scene, v3d);
@ -1045,7 +1045,7 @@ void gpencil_convert_operation (short mode)
if (gpd == NULL) return;
/* initialise 3d-cursor correction globals */
initgrabz(v3d, fp[0], fp[1], fp[2]);
initgrabz(rv3d, fp[0], fp[1], fp[2]);
/* handle selection modes */
switch (mode) {
@ -1195,7 +1195,6 @@ static short gp_stroke_filtermval (tGPsdata *p, short mval[2], short pmval[2])
/* convert screen-coordinates to buffer-coordinates */
static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
{
View3D *v3d= NULL; // XXX
bGPdata *gpd= p->gpd;
/* in 3d-space - pt->x/y/z are 3 side-by-side floats */
@ -1215,8 +1214,8 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
*/
/* method taken from editview.c - mouse_cursor() */
project_short_noclip(p->ar, v3d, fp, mval);
window_to_3d(p->ar, v3d, dvec, mval[0]-mx, mval[1]-my);
project_short_noclip(p->ar, fp, mval);
window_to_3d(p->ar, dvec, mval[0]-mx, mval[1]-my);
VecSubf(out, fp, dvec);
}
@ -1549,7 +1548,6 @@ static short gp_stroke_eraser_strokeinside (short mval[], short mvalo[], short r
static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[], short rad, rcti *rect, bGPDframe *gpf, bGPDstroke *gps)
{
bGPDspoint *pt1, *pt2;
View3D *v3d= NULL;
int x0=0, y0=0, x1=0, y1=0;
short xyval[2];
int i;
@ -1563,7 +1561,7 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[],
else if (gps->totpoints == 1) {
/* get coordinates */
if (gps->flag & GP_STROKE_3DSPACE) {
project_short(p->ar, v3d, &gps->points->x, xyval);
project_short(p->ar, &gps->points->x, xyval);
x0= xyval[0];
y0= xyval[1];
}
@ -1609,11 +1607,11 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[],
/* get coordinates */
if (gps->flag & GP_STROKE_3DSPACE) {
project_short(p->ar, v3d, &pt1->x, xyval);
project_short(p->ar, &pt1->x, xyval);
x0= xyval[0];
y0= xyval[1];
project_short(p->ar, v3d, &pt2->x, xyval);
project_short(p->ar, &pt2->x, xyval);
x1= xyval[0];
y1= xyval[1];
}
@ -1881,8 +1879,10 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
case SPACE_VIEW3D:
{
View3D *v3d= (View3D *)p->sa->spacedata.first;
RegionView3D *rv3d= NULL; // XXX
float *fp= give_cursor(p->scene, v3d);
initgrabz(v3d, fp[0], fp[1], fp[2]);
initgrabz(rv3d, fp[0], fp[1], fp[2]);
p->gpd->sbuffer_sflag |= GP_STROKE_3DSPACE;
}

@ -60,7 +60,7 @@ void ED_object_apply_obmat(struct Object *ob);
void ED_object_exit_editmode(struct bContext *C, int flag);
void ED_object_enter_editmode(struct bContext *C, int flag);
void ED_object_base_init_from_view(struct Scene *scene, struct View3D *v3d, struct Base *base);
void ED_object_base_init_from_view(struct bContext *C, struct Base *base);
/* cleanup */
int object_data_is_libdata(struct Object *ob);

@ -53,7 +53,6 @@ void ED_region_tag_redraw(struct ARegion *ar);
/* spaces */
void ED_spacetypes_init(void);
void ED_spacetypes_keymap(struct wmWindowManager *wm);
struct ARegionType *ED_regiontype_from_id(struct SpaceType *st, int regionid);
int ED_area_header_standardbuttons(const struct bContext *C, struct uiBlock *block, int yco);
void ED_area_overdraw(struct bContext *C);
void ED_area_overdraw_flush(struct bContext *C);

@ -31,6 +31,7 @@
/* ********* exports for space_view3d/ module ********** */
struct ARegion;
struct View3D;
struct RegionView3D;
struct ViewContext;
struct BPoint;
struct Nurb;
@ -49,6 +50,7 @@ typedef struct ViewContext {
Object *obedit;
struct ARegion *ar;
struct View3D *v3d;
struct RegionView3D *rv3d;
struct EditMesh *em;
short mval[2];
} ViewContext;
@ -56,8 +58,8 @@ typedef struct ViewContext {
float *give_cursor(struct Scene *scene, struct View3D *v3d);
void initgrabz(struct View3D *v3d, float x, float y, float z);
void window_to_3d(struct ARegion *ar, struct View3D *v3d, float *vec, short mx, short my);
void initgrabz(struct RegionView3D *rv3d, float x, float y, float z);
void window_to_3d(struct ARegion *ar, float *vec, short mx, short my);
/* Depth buffer */
float read_cached_depth(struct ViewContext *vc, int x, int y);
@ -65,14 +67,14 @@ void request_depth_update(struct ViewContext *vc);
/* Projection */
void project_short(struct ARegion *ar, struct View3D *v3d, float *vec, short *adr);
void project_short_noclip(struct ARegion *ar, struct View3D *v3d, float *vec, short *adr);
void project_short(struct ARegion *ar, float *vec, short *adr);
void project_short_noclip(struct ARegion *ar, float *vec, short *adr);
void project_int(struct ARegion *ar, struct View3D *v3d, float *vec, int *adr);
void project_int_noclip(struct ARegion *ar, struct View3D *v3d, float *vec, int *adr);
void project_int(struct ARegion *ar, float *vec, int *adr);
void project_int_noclip(struct ARegion *ar, float *vec, int *adr);
void project_float(struct ARegion *ar, struct View3D *v3d, float *vec, float *adr);
void project_float_noclip(struct ARegion *ar, struct View3D *v3d, float *vec, float *adr);
void project_float(struct ARegion *ar, float *vec, float *adr);
void project_float_noclip(struct ARegion *ar, float *vec, float *adr);
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]);
@ -84,8 +86,8 @@ void mesh_foreachScreenFace(struct ViewContext *vc, void (*func)(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 Scene *scene, struct View3D *v3d, int axisidx, float vec[3]);
int view3d_test_clipping(struct RegionView3D *rv3d, float *vec);
void view3d_align_axis_to_vector(struct View3D *v3d, struct RegionView3D *rv3d, int axisidx, float vec[3]);
void drawcircball(int mode, float *cent, float rad, float tmat[][4]);

@ -238,7 +238,7 @@ ARegion *ui_add_temporary_region(bScreen *sc)
void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar)
{
ED_region_exit(C, ar);
BKE_area_region_free(ar);
BKE_area_region_free(NULL, ar); /* NULL: no spacetype */
BLI_freelinkN(&sc->regionbase, ar);
}

@ -177,14 +177,14 @@ static void uv_calc_center_vector(Scene *scene, View3D *v3d, float *result, Obje
}
}
static void uv_calc_map_matrix(float result[][4], View3D *v3d, Object *ob, float upangledeg, float sideangledeg, float radius)
static void uv_calc_map_matrix(float result[][4], RegionView3D *rv3d, Object *ob, float upangledeg, float sideangledeg, float radius)
{
float rotup[4][4], rotside[4][4], viewmatrix[4][4], rotobj[4][4];
float sideangle= 0.0, upangle= 0.0;
int k;
/* get rotation of the current view matrix */
Mat4CpyMat4(viewmatrix,v3d->viewmat);
Mat4CpyMat4(viewmatrix, rv3d->viewmat);
/* but shifting */
for( k= 0; k< 4; k++) viewmatrix[3][k] =0.0;
@ -219,6 +219,7 @@ static void uv_calc_map_matrix(float result[][4], View3D *v3d, Object *ob, float
static void uv_calc_shift_project(ARegion *ar, View3D *v3d, float *target, float *shift, float rotmat[][4], int projectionmode, float *source, float *min, float *max)
{
RegionView3D *rv3d= ar->regiondata;
float pv[3];
VecSubf(pv, source, shift);
@ -257,7 +258,7 @@ static void uv_calc_shift_project(ARegion *ar, View3D *v3d, float *target, float
Mat4MulVec4fl(rotmat, pv4);
/* almost project_short */
Mat4MulVec4fl(v3d->persmat, pv4);
Mat4MulVec4fl(rv3d->persmat, pv4);
if (fabs(pv4[3]) > 0.00001) { /* avoid division by zero */
target[0] = dx/2.0 + (dx/2.0)*pv4[0]/pv4[3];
target[1] = dy/2.0 + (dy/2.0)*pv4[1]/pv4[3];
@ -368,6 +369,7 @@ static void default_uv(float uv[][2], float size)
static void calculate_uv_map(Scene *scene, ARegion *ar, View3D *v3d, EditMesh *em, unsigned short mapmode)
{
RegionView3D *rv3d= ar->regiondata;
MTFace *tface;
Object *ob;
EditFace *efa;
@ -412,7 +414,7 @@ static void calculate_uv_map(Scene *scene, ARegion *ar, View3D *v3d, EditMesh *e
max[0]= max[1]= -10000000.0;
cent[0] = cent[1] = cent[2] = 0.0;
uv_calc_map_matrix(rotatematrix, v3d, ob, upangledeg, sideangledeg, 1.0f);
uv_calc_map_matrix(rotatematrix, rv3d, ob, upangledeg, sideangledeg, 1.0f);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
@ -475,7 +477,7 @@ static void calculate_uv_map(Scene *scene, ARegion *ar, View3D *v3d, EditMesh *e
if (scene->toolsettings->uvcalc_mapdir== 2)
Mat4One(rotatematrix);
else
uv_calc_map_matrix(rotatematrix, v3d, ob, upangledeg,sideangledeg,radius);
uv_calc_map_matrix(rotatematrix, rv3d, ob, upangledeg,sideangledeg,radius);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);

@ -1396,17 +1396,14 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
{
Object *obedit= CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
ScrArea *sa = CTX_wm_area(C);
View3D *v3d = NULL;
View3D *v3d =CTX_wm_view3d(C);
ARegion *ar= CTX_wm_region(C);
float *curs, mat[3][3], vmat[3][3], cmat[3][3], imat[3][3];
Mat4One(primmat);
if(sa->spacetype==SPACE_VIEW3D)
v3d= sa->spacedata.first;
if(v3d)
Mat3CpyMat4(vmat, v3d->viewmat);
if(ar)
Mat3CpyMat4(vmat, ((RegionView3D *)ar->regiondata)->viewmat);
else
Mat3One(vmat);

@ -467,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(data->vc.v3d->flag & V3D_CLIPPING) {
if(data->vc.rv3d->rflag & RV3D_CLIPPING) {
float labda= labda_PdistVL2Dfl(data->mval, v1, v2);
float vec[3];
@ -476,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(data->vc.obedit->obmat, vec);
if(view3d_test_clipping(data->vc.v3d, vec)==0) {
if(view3d_test_clipping(data->vc.rv3d, vec)==0) {
data->dist = distance;
data->closest = eed;
}
@ -4089,7 +4089,7 @@ static int mface_is_selected(MFace *mf)
* which would use same as vertices method), then added
* to interface! Hoera! - zr
*/
void faceselect_align_view_to_selected(View3D *v3d, Mesh *me, int axis)
void faceselect_align_view_to_selected(View3D *v3d, RegionView3D *rv3d, Mesh *me, int axis)
{
float norm[3];
int i, totselected = 0;
@ -4122,7 +4122,7 @@ void faceselect_align_view_to_selected(View3D *v3d, Mesh *me, int axis)
if (totselected == 0)
error("No faces selected.");
else
view3d_align_axis_to_vector(NULL, v3d, axis, norm);
view3d_align_axis_to_vector(v3d, rv3d, axis, norm);
}
/* helper for below, to survive non-uniform scaled objects */
@ -4146,7 +4146,7 @@ static void face_getnormal_obspace(Object *obedit, EditFace *efa, float *fno)
}
void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, View3D *v3d, int axis)
void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, View3D *v3d, RegionView3D *rv3d, int axis)
{
int nselverts= EM_nvertices_selected(em);
float norm[3]={0.0, 0.0, 0.0}; /* used for storing the mesh normal */
@ -4167,7 +4167,7 @@ void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, View3D *v3d,
}
}
view3d_align_axis_to_vector(NULL, v3d, axis, norm);
view3d_align_axis_to_vector(v3d, rv3d, axis, norm);
}
else if (nselverts>2) {
float cent[3];
@ -4192,7 +4192,7 @@ void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, View3D *v3d,
}
Mat4Mul3Vecfl(obedit->obmat, norm);
view3d_align_axis_to_vector(NULL, v3d, axis, norm);
view3d_align_axis_to_vector(v3d, rv3d, axis, norm);
}
else if (nselverts==2) { /* Align view to edge (or 2 verts) */
EditVert *eve, *leve= NULL;
@ -4209,7 +4209,7 @@ void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, View3D *v3d,
}
}
Mat4Mul3Vecfl(obedit->obmat, norm);
view3d_align_axis_to_vector(NULL, v3d, axis, norm);
view3d_align_axis_to_vector(v3d, rv3d, axis, norm);
}
else if (nselverts==1) { /* Align view to vert normal */
EditVert *eve;
@ -4223,7 +4223,7 @@ void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, View3D *v3d,
}
}
Mat4Mul3Vecfl(obedit->obmat, norm);
view3d_align_axis_to_vector(NULL, v3d, axis, norm);
view3d_align_axis_to_vector(v3d, rv3d, axis, norm);
}
}

@ -688,15 +688,15 @@ void split_mesh(EditMesh *em)
}
void extrude_repeat_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float offs)
void extrude_repeat_mesh(RegionView3D *rv3d, Object *obedit, EditMesh *em, int steps, float offs)
{
float dvec[3], tmat[3][3], bmat[3][3], nor[3]= {0.0, 0.0, 0.0};
short a;
/* dvec */
dvec[0]= v3d->persinv[2][0];
dvec[1]= v3d->persinv[2][1];
dvec[2]= v3d->persinv[2][2];
dvec[0]= rv3d->persinv[2][0];
dvec[1]= rv3d->persinv[2][1];
dvec[2]= rv3d->persinv[2][2];
Normalize(dvec);
dvec[0]*= offs;
dvec[1]*= offs;
@ -723,6 +723,7 @@ void extrude_repeat_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, f
void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr, float *dvec, int mode)
{
RegionView3D *rv3d= NULL; // XXX from context
EditVert *eve,*nextve;
float nor[3]= {0.0, 0.0, 0.0};
float *curs, si,n[3],q[4],cmat[3][3],imat[3][3], tmat[3][3];
@ -734,7 +735,7 @@ void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr,
Mat3CpyMat4(bmat, obedit->obmat);
Mat3Inv(imat,bmat);
curs= give_cursor(NULL, v3d);
curs= give_cursor(NULL, v3d); // XXX
VECCOPY(cent, curs);
cent[0]-= obedit->obmat[3][0];
cent[1]-= obedit->obmat[3][1];
@ -746,13 +747,13 @@ void spin_mesh(View3D *v3d, Object *obedit, EditMesh *em, int steps, float degr,
// if(scene->toolsettings->editbutflag & B_CLOCKWISE) phi= -phi;
if(dvec) {
n[0]= v3d->viewinv[1][0];
n[1]= v3d->viewinv[1][1];
n[2]= v3d->viewinv[1][2];
n[0]= rv3d->viewinv[1][0];
n[1]= rv3d->viewinv[1][1];
n[2]= rv3d->viewinv[1][2];
} else {
n[0]= v3d->viewinv[2][0];
n[1]= v3d->viewinv[2][1];
n[2]= v3d->viewinv[2][2];
n[0]= rv3d->viewinv[2][0];
n[1]= rv3d->viewinv[2][1];
n[2]= rv3d->viewinv[2][2];
}
Normalize(n);

@ -437,6 +437,7 @@ static int float_sort(const void *v1, const void *v2)
void sort_faces(Scene *scene, View3D *v3d)
{
RegionView3D *rv3d= NULL; // get from context
Object *ob= OBACT;
Mesh *me;
CustomDataLayer *layer;
@ -490,7 +491,7 @@ void sort_faces(Scene *scene, View3D *v3d)
float cur[3];
if (event == 1)
Mat4MulMat4(mat, OBACT->obmat, v3d->viewmat); /* apply the view matrix to the object matrix */
Mat4MulMat4(mat, OBACT->obmat, rv3d->viewmat); /* apply the view matrix to the object matrix */
else if (event == 2) { /* sort from cursor */
if( v3d && v3d->localview ) {
VECCOPY(cur, v3d->cursor);

@ -222,8 +222,10 @@ int object_data_is_libdata(Object *ob)
/* exported */
void ED_object_base_init_from_view(Scene *scene, View3D *v3d, Base *base)
void ED_object_base_init_from_view(bContext *C, Base *base)
{
View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
Object *ob= base->object;
if (scene==NULL)
@ -244,10 +246,14 @@ void ED_object_base_init_from_view(Scene *scene, View3D *v3d, Base *base)
}
if (U.flag & USER_ADD_VIEWALIGNED) {
v3d->viewquat[0]= -v3d->viewquat[0];
QuatToEul(v3d->viewquat, ob->rot);
v3d->viewquat[0]= -v3d->viewquat[0];
ARegion *ar= CTX_wm_region(C);
if(ar) {
RegionView3D *rv3d= ar->regiondata;
rv3d->viewquat[0]= -rv3d->viewquat[0];
QuatToEul(rv3d->viewquat, ob->rot);
rv3d->viewquat[0]= -rv3d->viewquat[0];
}
}
}
}
@ -293,7 +299,7 @@ static int object_add_exec(bContext *C, wmOperator *op)
ED_base_object_activate(C, BASACT);
/* more editor stuff */
ED_object_base_init_from_view(scene, CTX_wm_view3d(C), BASACT);
ED_object_base_init_from_view(C, BASACT);
DAG_scene_sort(scene);

@ -298,7 +298,7 @@ static int rct_fits(rcti *rect, char dir, int size)
}
}
static void region_rect_recursive(ARegion *ar, rcti *remainder)
static void region_rect_recursive(ARegion *ar, rcti *remainder, int quad)
{
int prefsizex, prefsizey;
@ -307,7 +307,8 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder)
/* clear state flags first */
ar->flag &= ~RGN_FLAG_TOO_SMALL;
if(ar->next==NULL)
/* user errors */
if(ar->next==NULL && ar->alignment!=RGN_ALIGN_QSPLIT)
ar->alignment= RGN_ALIGN_NONE;
prefsizex= ar->type->minsizex;
@ -372,7 +373,7 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder)
}
}
}
else {
else if(ar->alignment==RGN_ALIGN_VSPLIT || ar->alignment==RGN_ALIGN_HSPLIT) {
/* percentage subdiv*/
ar->winrct= *remainder;
@ -395,11 +396,55 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder)
}
}
}
else if(ar->alignment==RGN_ALIGN_QSPLIT) {
ar->winrct= *remainder;
/* test if there's still 4 regions left */
if(quad==0) {
ARegion *artest= ar->next;
int count= 1;
while(artest) {
artest->alignment= RGN_ALIGN_QSPLIT;
artest= artest->next;
count++;
}
if(count!=4) {
/* let's stop adding regions */
BLI_init_rcti(remainder, 0, 0, 0, 0);
printf("region quadsplit failed\n");
}
else quad= 1;
}
if(quad) {
if(quad==1) { /* left bottom */
ar->winrct.xmax = (remainder->xmin + remainder->xmax)/2;
ar->winrct.ymax = (remainder->ymin + remainder->ymax)/2;
}
else if(quad==2) { /* left top */
ar->winrct.xmax = (remainder->xmin + remainder->xmax)/2;
ar->winrct.ymin = 1 + (remainder->ymin + remainder->ymax)/2;
}
else if(quad==3) { /* right bottom */
ar->winrct.xmin = 1 + (remainder->xmin + remainder->xmax)/2;
ar->winrct.ymax = (remainder->ymin + remainder->ymax)/2;
}
else { /* right top */
ar->winrct.xmin = 1 + (remainder->xmin + remainder->xmax)/2;
ar->winrct.ymin = 1 + (remainder->ymin + remainder->ymax)/2;
BLI_init_rcti(remainder, 0, 0, 0, 0);
}
quad++;
}
}
/* for speedup */
ar->winx= ar->winrct.xmax - ar->winrct.xmin + 1;
ar->winy= ar->winrct.ymax - ar->winrct.ymin + 1;
region_rect_recursive(ar->next, remainder);
region_rect_recursive(ar->next, remainder, quad);
}
static void area_calc_totrct(ScrArea *sa, int sizex, int sizey)
@ -508,14 +553,14 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
}
for(ar= sa->regionbase.first; ar; ar= ar->next)
ar->type= ED_regiontype_from_id(sa->type, ar->regiontype);
ar->type= BKE_regiontype_from_id(sa->type, ar->regiontype);
/* area sizes */
area_calc_totrct(sa, win->sizex, win->sizey);
/* region rect sizes */
rect= sa->totrct;
region_rect_recursive(sa->regionbase.first, &rect);
region_rect_recursive(sa->regionbase.first, &rect, 0);
/* default area handlers */
ed_default_handlers(wm, &sa->handlers, sa->type->keymapflag);
@ -569,11 +614,13 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space)
BKE_spacedata_copylist(&sa1->spacedata, &sa2->spacedata);
}
/* regions... XXX */
/* regions */
for(ar= sa1->regionbase.first; ar; ar= ar->next)
BKE_area_region_free(sa1->type, ar);
BLI_freelistN(&sa1->regionbase);
for(ar= sa2->regionbase.first; ar; ar= ar->next) {
ARegion *newar= BKE_area_region_copy(ar);
ARegion *newar= BKE_area_region_copy(sa2->type, ar);
BLI_addtail(&sa1->regionbase, newar);
}

@ -34,6 +34,7 @@
#include "BKE_customdata.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@ -1402,21 +1403,28 @@ void SCREEN_OT_repeat_history(wmOperatorType *ot)
/* insert a region in the area region list */
static int region_split_exec(bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
ARegion *newar= BKE_area_region_copy(ar);
int dir= RNA_enum_get(op->ptr, "direction");
BLI_insertlinkafter(&sa->regionbase, CTX_wm_region(C), newar);
if(ar->regiontype==RGN_TYPE_HEADER)
BKE_report(op->reports, RPT_ERROR, "Cannot split header");
else if(ar->alignment==RGN_ALIGN_QSPLIT)
BKE_report(op->reports, RPT_ERROR, "Cannot split further");
else {
ScrArea *sa= CTX_wm_area(C);
ARegion *newar= BKE_area_region_copy(sa->type, ar);
int dir= RNA_enum_get(op->ptr, "type");
newar->alignment= ar->alignment;
if(dir=='h')
ar->alignment= RGN_ALIGN_HSPLIT;
else
ar->alignment= RGN_ALIGN_VSPLIT;
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
BLI_insertlinkafter(&sa->regionbase, ar, newar);
newar->alignment= ar->alignment;
if(dir=='h')
ar->alignment= RGN_ALIGN_HSPLIT;
else
ar->alignment= RGN_ALIGN_VSPLIT;
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
return OPERATOR_FINISHED;
}
@ -1428,13 +1436,60 @@ void SCREEN_OT_region_split(wmOperatorType *ot)
ot->idname= "SCREEN_OT_region_split";
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->invoke= WM_menu_invoke;
ot->exec= region_split_exec;
ot->poll= ED_operator_areaactive;
RNA_def_enum(ot->srna, "direction", prop_direction_items, 'h', "Direction", "");
RNA_def_enum(ot->srna, "type", prop_direction_items, 'h', "Direction", "");
}
/* ************** region four-split operator ***************************** */
/* insert a region in the area region list */
static int region_foursplit_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
/* some rules... */
if(ar->regiontype!=RGN_TYPE_WINDOW)
BKE_report(op->reports, RPT_ERROR, "Only window region can be 4-splitted");
else if(ar->next)
BKE_report(op->reports, RPT_ERROR, "Only last region can be 4-splitted");
else if(ar->alignment==RGN_ALIGN_QSPLIT)
BKE_report(op->reports, RPT_ERROR, "Cannot split further");
else {
ScrArea *sa= CTX_wm_area(C);
ARegion *newar;
int count;
ar->alignment= RGN_ALIGN_QSPLIT;
for(count=0; count<3; count++) {
newar= BKE_area_region_copy(sa->type, ar);
BLI_addtail(&sa->regionbase, newar);
}
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
return OPERATOR_FINISHED;
}
void SCREEN_OT_region_foursplit(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Split Region in 4 Parts";
ot->idname= "SCREEN_OT_region_foursplit";
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= region_foursplit_exec;
ot->poll= ED_operator_areaactive;
}
/* ************** region flip operator ***************************** */
/* flip a region alignment */
@ -1583,6 +1638,7 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_area_join);
WM_operatortype_append(SCREEN_OT_area_rip);
WM_operatortype_append(SCREEN_OT_region_split);
WM_operatortype_append(SCREEN_OT_region_foursplit);
WM_operatortype_append(SCREEN_OT_region_flip);
WM_operatortype_append(SCREEN_OT_screen_set);
WM_operatortype_append(SCREEN_OT_screen_full_area);
@ -1616,8 +1672,8 @@ void ED_keymap_screen(wmWindowManager *wm)
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL, 0);
/* tests */
RNA_enum_set(WM_keymap_add_item(keymap, "SCREEN_OT_region_split", SKEY, KM_PRESS, KM_CTRL|KM_ALT, 0)->ptr, "direction", 'h');
RNA_enum_set(WM_keymap_add_item(keymap, "SCREEN_OT_region_split", SKEY, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0)->ptr, "direction", 'v');
WM_keymap_add_item(keymap, "SCREEN_OT_region_split", SKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_region_foursplit", SKEY, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0);
/*frame offsets*/
WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", TIMER0, KM_ANY, KM_ANY, 0);

@ -1552,11 +1552,11 @@ static void sculpt_load_mats(bglMats *mats, ViewContext *vc)
float cpy[4][4];
int i, j;
Mat4MulMat4(cpy, vc->v3d->viewmat, vc->obact->obmat);
Mat4MulMat4(cpy, vc->rv3d->viewmat, vc->obact->obmat);
for(i = 0; i < 4; ++i) {
for(j = 0; j < 4; ++j) {
mats->projection[i*4+j] = vc->v3d->winmat[i][j];
mats->projection[i*4+j] = vc->rv3d->winmat[i][j];
mats->modelview[i*4+j] = cpy[i][j];
}
}

@ -47,19 +47,6 @@
#include "ED_space_api.h"
#include "ED_uvedit.h"
ARegionType *ED_regiontype_from_id(SpaceType *st, int regionid)
{
ARegionType *art;
for(art= st->regiontypes.first; art; art= art->next)
if(art->regionid==regionid)
return art;
printf("Error, region type missing in %s\n", st->name);
return st->regiontypes.first;
}
/* only call once on startup, storage is global in BKE kernel listbase */
void ED_spacetypes_init(void)
{

@ -1268,7 +1268,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
}
}
static void draw_custom_bone(Scene *scene, View3D *v3d, Object *ob, int dt, int armflag, int boneflag, unsigned int id, float length)
static void draw_custom_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int dt, int armflag, int boneflag, unsigned int id, float length)
{
if(ob==NULL) return;
@ -1283,7 +1283,7 @@ static void draw_custom_bone(Scene *scene, View3D *v3d, Object *ob, int dt, int
glLoadName((GLuint) id|BONESEL_BONE);
}
draw_object_instance(scene, v3d, ob, dt, armflag & ARM_POSEMODE);
draw_object_instance(scene, v3d, rv3d, ob, dt, armflag & ARM_POSEMODE);
}
@ -1513,7 +1513,7 @@ static void draw_pose_dofs(Object *ob)
}
/* assumes object is Armature with pose */
static void draw_pose_channels(Scene *scene, View3D *v3d, Base *base, int dt)
static void draw_pose_channels(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt)
{
Object *ob= base->object;
bArmature *arm= ob->data;
@ -1590,7 +1590,7 @@ static void draw_pose_channels(Scene *scene, View3D *v3d, Base *base, int dt)
if (pchan->bone->flag & BONE_DRAWWIRE)
draw_wire= 1;
else
draw_custom_bone(scene, v3d, pchan->custom, OB_SOLID, arm->flag, flag, index, bone->length);
draw_custom_bone(scene, v3d, rv3d, pchan->custom, OB_SOLID, arm->flag, flag, index, bone->length);
}
else if (arm->drawtype==ARM_LINE)
; /* nothing in solid */
@ -1656,7 +1656,7 @@ static void draw_pose_channels(Scene *scene, View3D *v3d, Base *base, int dt)
if ((bone->parent) && (bone->parent->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG)))
flag &= ~BONE_CONNECTED;
draw_custom_bone(scene, v3d, pchan->custom, OB_WIRE, arm->flag, flag, index, bone->length);
draw_custom_bone(scene, v3d, rv3d, pchan->custom, OB_WIRE, arm->flag, flag, index, bone->length);
glPopMatrix();
}
@ -1684,7 +1684,7 @@ static void draw_pose_channels(Scene *scene, View3D *v3d, Base *base, int dt)
}
/* if solid && posemode, we draw again with polygonoffset */
else if ((dt > OB_WIRE) && (arm->flag & ARM_POSEMODE)) {
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
}
else {
/* and we use selection indices if not done yet */
@ -1772,7 +1772,7 @@ static void draw_pose_channels(Scene *scene, View3D *v3d, Base *base, int dt)
}
/* restore things */
if ((arm->drawtype!=ARM_LINE)&& (dt>OB_WIRE) && (arm->flag & ARM_POSEMODE))
bglPolygonOffset(v3d->dist, 0.0);
bglPolygonOffset(rv3d->dist, 0.0);
}
/* restore */
@ -1849,7 +1849,7 @@ static void set_matrix_editbone(EditBone *eBone)
}
static void draw_ebones(View3D *v3d, Object *ob, int dt)
static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt)
{
EditBone *eBone;
bArmature *arm= ob->data;
@ -1920,7 +1920,7 @@ static void draw_ebones(View3D *v3d, Object *ob, int dt)
index= 0;
}
else if (dt > OB_WIRE)
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
else if (arm->flag & ARM_EDITMODE)
index= 0; /* do selection codes */
@ -1971,7 +1971,7 @@ static void draw_ebones(View3D *v3d, Object *ob, int dt)
/* restore */
if (arm->drawtype==ARM_LINE);
else if (dt>OB_WIRE) bglPolygonOffset(v3d->dist, 0.0);
else if (dt>OB_WIRE) bglPolygonOffset(rv3d->dist, 0.0);
/* finally names and axes */
if (arm->flag & (ARM_DRAWNAMES|ARM_DRAWAXES)) {
@ -2020,7 +2020,7 @@ static void draw_ebones(View3D *v3d, Object *ob, int dt)
/* draw bone paths
* - in view space
*/
static void draw_pose_paths(Scene *scene, View3D *v3d, Object *ob)
static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
@ -2035,7 +2035,7 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, Object *ob)
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
glPushMatrix();
glLoadMatrixf(v3d->viewmat);
glLoadMatrixf(rv3d->viewmat);
/* version patch here - cannot access frame info from file reading */
if (arm->pathsize == 0) arm->pathsize= 1;
@ -2257,7 +2257,7 @@ static void ghost_poses_tag_unselected(Object *ob, short unset)
/* draw ghosts that occur within a frame range
* note: object should be in posemode
*/
static void draw_ghost_poses_range(Scene *scene, View3D *v3d, Base *base)
static void draw_ghost_poses_range(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
{
Object *ob= base->object;
bArmature *arm= ob->data;
@ -2298,7 +2298,7 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, Base *base)
//do_all_pose_actions(scene, ob); // XXX old animation system
where_is_pose(scene, ob);
draw_pose_channels(scene, v3d, base, OB_WIRE);
draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@ -2318,7 +2318,7 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, Base *base)
/* draw ghosts on keyframes in action within range
* - object should be in posemode
*/
static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, Base *base)
static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
{
Object *ob= base->object;
bAction *act= ob->action; // XXX old animsys stuff... watch it!
@ -2374,7 +2374,7 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, Base *base)
//do_all_pose_actions(scene, ob); // XXX old animation system
where_is_pose(scene, ob);
draw_pose_channels(scene, v3d, base, OB_WIRE);
draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@ -2394,7 +2394,7 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, Base *base)
/* draw ghosts around current frame
* - object is supposed to be armature in posemode
*/
static void draw_ghost_poses(Scene *scene, View3D *v3d, Base *base)
static void draw_ghost_poses(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
{
Object *ob= base->object;
bArmature *arm= ob->data;
@ -2456,7 +2456,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, Base *base)
if (CFRA!=cfrao) {
//do_all_pose_actions(scene, ob); // xxx old animation system crap
where_is_pose(scene, ob);
draw_pose_channels(scene, v3d, base, OB_WIRE);
draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
}
}
@ -2472,7 +2472,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, Base *base)
if (CFRA != cfrao) {
//do_all_pose_actions(scene, ob); // XXX old animation system crap...
where_is_pose(scene, ob);
draw_pose_channels(scene, v3d, base, OB_WIRE);
draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
}
}
}
@ -2493,7 +2493,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, Base *base)
/* ********************************** Armature Drawing - Main ************************* */
/* called from drawobject.c, return 1 if nothing was drawn */
int draw_armature(Scene *scene, View3D *v3d, Base *base, int dt, int flag)
int draw_armature(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
{
Object *ob= base->object;
bArmature *arm= ob->data;
@ -2517,7 +2517,7 @@ int draw_armature(Scene *scene, View3D *v3d, Base *base, int dt, int flag)
/* editmode? */
if(arm->edbo) {
arm->flag |= ARM_EDITMODE;
draw_ebones(v3d, ob, dt);
draw_ebones(v3d, rv3d, ob, dt);
arm->flag &= ~ARM_EDITMODE;
}
else{
@ -2531,14 +2531,14 @@ int draw_armature(Scene *scene, View3D *v3d, Base *base, int dt, int flag)
}
else if(ob->flag & OB_POSEMODE) {
if (arm->ghosttype == ARM_GHOST_RANGE) {
draw_ghost_poses_range(scene, v3d, base);
draw_ghost_poses_range(scene, v3d, rv3d, base);
}
else if (arm->ghosttype == ARM_GHOST_KEYS) {
draw_ghost_poses_keys(scene, v3d, base);
draw_ghost_poses_keys(scene, v3d, rv3d, base);
}
else if (arm->ghosttype == ARM_GHOST_CUR) {
if (arm->ghostep)
draw_ghost_poses(scene, v3d, base);
draw_ghost_poses(scene, v3d, rv3d, base);
}
if ((flag & DRAW_SCENESET)==0) {
if(ob==OBACT)
@ -2547,11 +2547,11 @@ int draw_armature(Scene *scene, View3D *v3d, Base *base, int dt, int flag)
if(OBACT && ob==modifiers_isDeformedByArmature(OBACT))
arm->flag |= ARM_POSEMODE;
}
draw_pose_paths(scene, v3d, ob);
draw_pose_paths(scene, v3d, rv3d, ob);
}
}
}
draw_pose_channels(scene, v3d, base, dt);
draw_pose_channels(scene, v3d, rv3d, base, dt);
arm->flag &= ~ARM_POSEMODE;
if(ob->flag & OB_POSEMODE)

@ -150,6 +150,7 @@ static int draw_tfaces3D__setHiddenOpts(void *userData, int index)
return (flags & eEdge_Select);
}
}
static int draw_tfaces3D__setSeamOpts(void *userData, int index)
{
struct { Mesh *me; EdgeHash *eh; } *data = userData;
@ -166,6 +167,7 @@ static int draw_tfaces3D__setSeamOpts(void *userData, int index)
return 0;
}
}
static int draw_tfaces3D__setSelectOpts(void *userData, int index)
{
struct { Mesh *me; EdgeHash *eh; } *data = userData;
@ -174,6 +176,7 @@ static int draw_tfaces3D__setSelectOpts(void *userData, int index)
return flags & eEdge_Select;
}
static int draw_tfaces3D__setActiveOpts(void *userData, int index)
{
struct { Mesh *me; EdgeHash *eh; } *data = userData;
@ -186,6 +189,7 @@ static int draw_tfaces3D__setActiveOpts(void *userData, int index)
return 0;
}
}
static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
{
Mesh *me = (Mesh*)userData;
@ -196,7 +200,8 @@ static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
else
return 0;
}
static void draw_tfaces3D(View3D *v3d, Object *ob, Mesh *me, DerivedMesh *dm)
static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh *dm)
{
struct { Mesh *me; EdgeHash *eh; } data;
@ -205,7 +210,7 @@ static void draw_tfaces3D(View3D *v3d, Object *ob, Mesh *me, DerivedMesh *dm)
glEnable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
/* Draw (Hidden) Edges */
UI_ThemeColor(TH_EDGE_FACESEL);
@ -232,7 +237,7 @@ static void draw_tfaces3D(View3D *v3d, Object *ob, Mesh *me, DerivedMesh *dm)
glDisable(GL_BLEND);
}
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
/* Draw Stippled Outline for selected faces */
glColor3ub(255, 255, 255);
@ -242,7 +247,7 @@ static void draw_tfaces3D(View3D *v3d, Object *ob, Mesh *me, DerivedMesh *dm)
dm->drawMappedEdges(dm, draw_tfaces3D__setActiveOpts, &data);
bglPolygonOffset(v3d->dist, 0.0); // resets correctly now, even after calling accumulated offsets
bglPolygonOffset(rv3d->dist, 0.0); // resets correctly now, even after calling accumulated offsets
BLI_edgehash_free(data.eh, NULL);
}
@ -335,7 +340,7 @@ struct TextureDrawState {
unsigned char obcol[4];
} Gtexdraw = {NULL, 0, 0, {0, 0, 0, 0}};
static void draw_textured_begin(Scene *scene, View3D *v3d, Object *ob)
static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob)
{
unsigned char obcol[4];
int istex, solidtex= 0;
@ -348,7 +353,7 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, Object *ob)
}
else
/* draw with lights in the scene otherwise */
Gtexdraw.islit= GPU_scene_object_lights(scene, ob, v3d->lay, v3d->viewmat);
Gtexdraw.islit= GPU_scene_object_lights(scene, ob, v3d->lay, rv3d->viewmat);
obcol[0]= CLAMPIS(ob->col[0]*255, 0, 255);
obcol[1]= CLAMPIS(ob->col[1]*255, 0, 255);
@ -540,7 +545,7 @@ void draw_mesh_text(Scene *scene, Object *ob, int glsl)
ddm->release(ddm);
}
void draw_mesh_textured(Scene *scene, View3D *v3d, Object *ob, DerivedMesh *dm, int faceselect)
void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int faceselect)
{
Mesh *me= ob->data;
@ -549,7 +554,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, Object *ob, DerivedMesh *dm,
else glFrontFace(GL_CCW);
/* draw the textured mesh */
draw_textured_begin(scene, v3d, ob);
draw_textured_begin(scene, v3d, rv3d, ob);
if(me->edit_mesh) {
dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, me->edit_mesh);
@ -570,7 +575,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, Object *ob, DerivedMesh *dm,
/* draw edges and selected faces over textured mesh */
if(!me->edit_mesh && faceselect)
draw_tfaces3D(v3d, ob, me, dm);
draw_tfaces3D(rv3d, ob, me, dm);
/* reset from negative scale correction */
glFrontFace(GL_CCW);

@ -111,6 +111,18 @@
#include "view3d_intern.h" // own include
/* this condition has been made more complex since editmode can draw textures */
#define CHECK_OB_DRAWTEXTURE(vd, dt) \
((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
(vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
#define CHECK_OB_DRAWFACEDOT(sce, vd, dt) \
( (sce->selectmode & SCE_SELECT_FACE) && \
(vd->drawtype<=OB_SOLID) && \
(((vd->drawtype==OB_SOLID) && (dt>=OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX) && (vd->flag & V3D_ZBUF_SELECT)) == 0) \
)
/* pretty stupid */
/* editmball.c */
extern ListBase editelems;
@ -386,12 +398,12 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4])
}
/* circle for object centers, special_color is for library or ob users */
static void drawcentercircle(View3D *v3d, float *vec, int selstate, int special_color)
static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int selstate, int special_color)
{
float size;
size= v3d->persmat[0][3]*vec[0]+ v3d->persmat[1][3]*vec[1]+ v3d->persmat[2][3]*vec[2]+ v3d->persmat[3][3];
size*= v3d->pixsize*((float)U.obcenter_dia*0.5f);
size= rv3d->persmat[0][3]*vec[0]+ rv3d->persmat[1][3]*vec[1]+ rv3d->persmat[2][3]*vec[2]+ rv3d->persmat[3][3];
size*= rv3d->pixsize*((float)U.obcenter_dia*0.5f);
/* using gldepthfunc guarantees that it does write z values, but not checks for it, so centers remain visible independt order of drawing */
if(v3d->zbuf) glDepthFunc(GL_ALWAYS);
@ -407,10 +419,10 @@ static void drawcentercircle(View3D *v3d, float *vec, int selstate, int special_
else if (selstate == SELECT) UI_ThemeColorShadeAlpha(TH_SELECT, 0, -80);
else if (selstate == DESELECT) UI_ThemeColorShadeAlpha(TH_TRANSFORM, 0, -80);
}
drawcircball(GL_POLYGON, vec, size, v3d->viewinv);
drawcircball(GL_POLYGON, vec, size, rv3d->viewinv);
UI_ThemeColorShadeAlpha(TH_WIRE, 0, -30);
drawcircball(GL_LINE_LOOP, vec, size, v3d->viewinv);
drawcircball(GL_LINE_LOOP, vec, size, rv3d->viewinv);
glDisable(GL_BLEND);
if(v3d->zbuf) glDepthFunc(GL_LEQUAL);
@ -645,7 +657,7 @@ static void spotvolume(float *lvec, float *vvec, float inp)
return;
}
static void drawlamp(Scene *scene, View3D *v3d, Object *ob)
static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob)
{
Lamp *la;
float vec[3], lvec[3], vvec[3], circrad, x,y,z;
@ -660,15 +672,15 @@ static void drawlamp(Scene *scene, View3D *v3d, Object *ob)
/* we first draw only the screen aligned & fixed scale stuff */
glPushMatrix();
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
/* lets calculate the scale: */
pixsize= v3d->persmat[0][3]*ob->obmat[3][0]+ v3d->persmat[1][3]*ob->obmat[3][1]+ v3d->persmat[2][3]*ob->obmat[3][2]+ v3d->persmat[3][3];
pixsize*= v3d->pixsize;
pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
pixsize*= rv3d->pixsize;
lampsize= pixsize*((float)U.obcenter_dia*0.5f);
/* and view aligned matrix: */
Mat4CpyMat4(imat, v3d->viewinv);
Mat4CpyMat4(imat, rv3d->viewinv);
Normalize(imat[0]);
Normalize(imat[1]);
@ -753,9 +765,9 @@ static void drawlamp(Scene *scene, View3D *v3d, Object *ob)
if ((la->type==LA_SPOT) || (la->type==LA_YF_PHOTON)) {
lvec[0]=lvec[1]= 0.0;
lvec[2] = 1.0;
x = v3d->persmat[0][2];
y = v3d->persmat[1][2];
z = v3d->persmat[2][2];
x = rv3d->persmat[0][2];
y = rv3d->persmat[1][2];
z = rv3d->persmat[2][2];
vvec[0]= x*ob->obmat[0][0] + y*ob->obmat[0][1] + z*ob->obmat[0][2];
vvec[1]= x*ob->obmat[1][0] + y*ob->obmat[1][1] + z*ob->obmat[1][2];
vvec[2]= x*ob->obmat[2][0] + y*ob->obmat[2][1] + z*ob->obmat[2][2];
@ -871,7 +883,7 @@ static void drawlamp(Scene *scene, View3D *v3d, Object *ob)
}
/* and back to viewspace */
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
VECCOPY(vec, ob->obmat[3]);
setlinestyle(0);
@ -937,7 +949,7 @@ static void draw_focus_cross(float dist, float size)
}
/* flag similar to draw_object() */
static void drawcamera(Scene *scene, View3D *v3d, Object *ob, int flag)
static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int flag)
{
/* a standing up pyramid with (0,0,0) as top */
Camera *cam;
@ -953,14 +965,14 @@ static void drawcamera(Scene *scene, View3D *v3d, Object *ob, int flag)
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
if(v3d->persp>=2 && cam->type==CAM_ORTHO && ob==v3d->camera) {
if(rv3d->persp>=2 && cam->type==CAM_ORTHO && ob==v3d->camera) {
facx= 0.5*cam->ortho_scale*1.28;
facy= 0.5*cam->ortho_scale*1.024;
depth= -cam->clipsta-0.1;
}
else {
fac= cam->drawsize;
if(v3d->persp>=2 && ob==v3d->camera) fac= cam->clipsta+0.1; /* that way it's always visible */
if(rv3d->persp>=2 && ob==v3d->camera) fac= cam->clipsta+0.1; /* that way it's always visible */
depth= - fac*cam->lens/16.0;
facx= fac*1.28;
@ -981,7 +993,7 @@ static void drawcamera(Scene *scene, View3D *v3d, Object *ob, int flag)
glEnd();
if(v3d->persp>=2 && ob==v3d->camera) return;
if(rv3d->persp>=2 && ob==v3d->camera) return;
glBegin(GL_LINE_STRIP);
glVertex3fv(vec[2]);
@ -1022,13 +1034,13 @@ static void drawcamera(Scene *scene, View3D *v3d, Object *ob, int flag)
if(flag==0) {
if(cam->flag & (CAM_SHOWLIMITS+CAM_SHOWMIST)) {
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
Mat4CpyMat4(vec, ob->obmat);
Mat4Ortho(vec);
wmMultMatrix(vec);
MTC_Mat4SwapMat4(v3d->persmat, tmat);
wmGetSingleMatrix(v3d->persmat);
MTC_Mat4SwapMat4(rv3d->persmat, tmat);
wmGetSingleMatrix(rv3d->persmat);
if(cam->flag & CAM_SHOWLIMITS) {
draw_limit_line(cam->clipsta, cam->clipend, 0x77FFFF);
@ -1040,7 +1052,7 @@ static void drawcamera(Scene *scene, View3D *v3d, Object *ob, int flag)
if(cam->flag & CAM_SHOWMIST)
if(wrld) draw_limit_line(wrld->miststa, wrld->miststa+wrld->mistdist, 0xFFFFFF);
MTC_Mat4SwapMat4(v3d->persmat, tmat);
MTC_Mat4SwapMat4(rv3d->persmat, tmat);
}
}
}
@ -1087,11 +1099,11 @@ void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPo
int i, N = lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
short s[2];
view3d_get_object_project_mat(vc->v3d, vc->obedit, pmat, vmat);
view3d_get_object_project_mat(vc->rv3d, vc->obedit, pmat, vmat);
for (i=0; i<N; i++, bp++, co+=3) {
if (bp->hide==0) {
view3d_project_short_clip(vc->ar, vc->v3d, dl?co:bp->vec, s, pmat, vmat);
view3d_project_short_clip(vc->ar, dl?co:bp->vec, s, pmat, vmat);
func(userData, bp, s[0], s[1]);
}
}
@ -1192,7 +1204,7 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co
if (eve->h==0) {
if (data->clipVerts) {
view3d_project_short_clip(data->vc.ar, data->vc.v3d, co, s, data->pmat, data->vmat);
view3d_project_short_clip(data->vc.ar, co, s, data->pmat, data->vmat);
} else {
view3d_project_short_noclip(data->vc.ar, co, s, data->pmat);
}
@ -1211,7 +1223,7 @@ void mesh_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, EditVe
data.userData = userData;
data.clipVerts = clipVerts;
view3d_get_object_project_mat(vc->v3d, vc->obedit, data.pmat, data.vmat);
view3d_get_object_project_mat(vc->rv3d, vc->obedit, data.pmat, data.vmat);
EM_init_index_arrays(vc->em, 1, 0, 0);
dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data);
@ -1228,8 +1240,8 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0
if (eed->h==0) {
if (data->clipVerts==1) {
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);
view3d_project_short_clip(data->vc.ar, v0co, s[0], data->pmat, data->vmat);
view3d_project_short_clip(data->vc.ar, v1co, s[1], data->pmat, data->vmat);
} else {
view3d_project_short_noclip(data->vc.ar, v0co, s[0], data->pmat);
view3d_project_short_noclip(data->vc.ar, v1co, s[1], data->pmat);
@ -1255,7 +1267,7 @@ void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEd
data.userData = userData;
data.clipVerts = clipVerts;
view3d_get_object_project_mat(vc->v3d, vc->obedit, data.pmat, data.vmat);
view3d_get_object_project_mat(vc->rv3d, vc->obedit, data.pmat, data.vmat);
EM_init_index_arrays(vc->em, 0, 1, 0);
dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
@ -1271,7 +1283,7 @@ static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *ce
short s[2];
if (efa && efa->h==0 && efa->fgonf!=EM_FGON) {
view3d_project_short_clip(data->vc.ar, data->vc.v3d, cent, s, data->pmat, data->vmat);
view3d_project_short_clip(data->vc.ar, cent, s, data->pmat, data->vmat);
data->func(data->userData, efa, s[0], s[1], index);
}
@ -1286,7 +1298,7 @@ void mesh_foreachScreenFace(ViewContext *vc, void (*func)(void *userData, EditFa
data.func = func;
data.userData = userData;
view3d_get_object_project_mat(vc->v3d, vc->obedit, data.pmat, data.vmat);
view3d_get_object_project_mat(vc->rv3d, vc->obedit, data.pmat, data.vmat);
EM_init_index_arrays(vc->em, 0, 0, 1);
dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data);
@ -1303,7 +1315,7 @@ void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb
Nurb *nu;
int i;
view3d_get_object_project_mat(vc->v3d, vc->obedit, pmat, vmat);
view3d_get_object_project_mat(vc->rv3d, vc->obedit, pmat, vmat);
for (nu= cu->editnurb->first; nu; nu=nu->next) {
if((nu->type & 7)==CU_BEZIER) {
@ -1312,17 +1324,17 @@ void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb
if(bezt->hide==0) {
if (G.f & G_HIDDENHANDLES) {
view3d_project_short_clip(vc->ar, vc->v3d, bezt->vec[1], s, pmat, vmat);
view3d_project_short_clip(vc->ar, 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(vc->ar, vc->v3d, bezt->vec[0], s, pmat, vmat);
view3d_project_short_clip(vc->ar, 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(vc->ar, vc->v3d, bezt->vec[1], s, pmat, vmat);
view3d_project_short_clip(vc->ar, 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(vc->ar, vc->v3d, bezt->vec[2], s, pmat, vmat);
view3d_project_short_clip(vc->ar, bezt->vec[2], s, pmat, vmat);
if (s[0] != IS_CLIPPED)
func(userData, nu, NULL, bezt, 2, s[0], s[1]);
}
@ -1334,7 +1346,7 @@ void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb
BPoint *bp = &nu->bp[i];
if(bp->hide==0) {
view3d_project_short_clip(vc->ar, vc->v3d, bp->vec, s, pmat, vmat);
view3d_project_short_clip(vc->ar, bp->vec, s, pmat, vmat);
func(userData, nu, bp, NULL, -1, s[0], s[1]);
}
}
@ -1759,7 +1771,7 @@ static void draw_em_fancy_edges(Scene *scene, View3D *v3d, DerivedMesh *cageDM,
}
}
static void draw_em_measure_stats(View3D *v3d, Object *ob, EditMesh *em)
static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em)
{
EditEdge *eed;
EditFace *efa;
@ -1788,7 +1800,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, EditMesh *em)
if(v3d->zbuf && (v3d->flag & V3D_ZBUF_SELECT)==0)
glDisable(GL_DEPTH_TEST);
if(v3d->zbuf) bglPolygonOffset(v3d->dist, 5.0);
if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0);
if(G.f & G_DRAW_EDGELEN) {
UI_GetThemeColor3fv(TH_TEXT, col);
@ -1923,7 +1935,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, EditMesh *em)
if(v3d->zbuf) {
glEnable(GL_DEPTH_TEST);
bglPolygonOffset(v3d->dist, 0.0);
bglPolygonOffset(rv3d->dist, 0.0);
}
}
@ -1946,7 +1958,7 @@ static int draw_em_fancy__setGLSLFaceOpts(void *userData, int index)
return (efa->h==0);
}
static void draw_em_fancy(Scene *scene, View3D *v3d, Object *ob, EditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, int dt)
static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, int dt)
{
Mesh *me = ob->data;
EditFace *efa_act = EM_get_actFace(em, 0); /* annoying but active faces is stored differently */
@ -1979,7 +1991,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, Object *ob, EditMesh *em, D
glFrontFace(GL_CCW);
}
else {
draw_mesh_textured(scene, v3d, ob, finalDM, 0);
draw_mesh_textured(scene, v3d, rv3d, ob, finalDM, 0);
}
}
else {
@ -1998,7 +2010,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, Object *ob, EditMesh *em, D
// write to show selected edge wires better
UI_ThemeColor(TH_WIRE);
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0);
}
else {
@ -2096,12 +2108,12 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, Object *ob, EditMesh *em, D
}
if(G.f & (G_DRAW_EDGELEN|G_DRAW_FACEAREA|G_DRAW_EDGEANG))
draw_em_measure_stats(v3d, ob, em);
draw_em_measure_stats(v3d, rv3d, ob, em);
}
if(dt>OB_WIRE) {
glDepthMask(1);
bglPolygonOffset(v3d->dist, 0.0);
bglPolygonOffset(rv3d->dist, 0.0);
GPU_disable_material();
}
@ -2140,7 +2152,7 @@ static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmoot
return 1;
}
static void draw_mesh_fancy(Scene *scene, View3D *v3d, Base *base, int dt, int flag)
static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
{
Object *ob= base->object;
Mesh *me = ob->data;
@ -2200,7 +2212,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, Base *base, int dt, int f
glFrontFace(GL_CCW);
}
else {
draw_mesh_textured(scene, v3d, ob, dm, faceselect);
draw_mesh_textured(scene, v3d, rv3d, ob, dm, faceselect);
}
if(!faceselect) {
@ -2333,7 +2345,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, Base *base, int dt, int f
* otherwise this wire is to overlay solid mode faces so do some depth buffer tricks.
*/
if (dt!=OB_WIRE && draw_wire==2) {
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
}
@ -2341,7 +2353,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, Base *base, int dt, int f
if (dt!=OB_WIRE && draw_wire==2) {
glDepthMask(1);
bglPolygonOffset(v3d->dist, 0.0);
bglPolygonOffset(rv3d->dist, 0.0);
}
}
@ -2349,7 +2361,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)
static int draw_mesh_object(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
{
Object *ob= base->object;
Object *obedit= scene->obedit; // XXX hrumf, see below
@ -2374,10 +2386,10 @@ static int draw_mesh_object(Scene *scene, View3D *v3d, Base *base, int dt, int f
if(dt>OB_WIRE) {
// no transp in editmode, the fancy draw over goes bad then
glsl = draw_glsl_material(scene, ob, v3d, dt);
GPU_set_object_materials(v3d, scene, ob, glsl, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
}
draw_em_fancy(scene, v3d, ob, em, cageDM, finalDM, dt);
draw_em_fancy(scene, v3d, rv3d, ob, em, cageDM, finalDM, dt);
if (obedit!=ob && finalDM)
finalDM->release(finalDM);
@ -2388,16 +2400,16 @@ static int draw_mesh_object(Scene *scene, View3D *v3d, Base *base, int dt, int f
// }
else {
/* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */
if(me->totface<=4 || boundbox_clip(v3d, ob->obmat, (ob->bb)? ob->bb: me->bb)) {
if(me->totface<=4 || boundbox_clip(rv3d, ob->obmat, (ob->bb)? ob->bb: me->bb)) {
glsl = draw_glsl_material(scene, ob, v3d, dt);
check_alpha = check_material_alpha(base, me, glsl);
if(dt==OB_SOLID || glsl) {
GPU_set_object_materials(v3d, scene, ob, glsl,
GPU_set_object_materials(v3d, rv3d, scene, ob, glsl,
(check_alpha)? &do_alpha_pass: NULL);
}
draw_mesh_fancy(scene, v3d, base, dt, flag);
draw_mesh_fancy(scene, v3d, rv3d, base, dt, flag);
if(me->totvert==0) retval= 1;
}
@ -2677,7 +2689,7 @@ static void drawDispListshaded(ListBase *lb, Object *ob)
}
/* returns 1 when nothing was drawn */
static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt)
{
Object *ob= base->object;
ListBase *lb=0;
@ -2708,7 +2720,7 @@ static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
}
else {
if(draw_glsl_material(scene, ob, v3d, dt)) {
GPU_set_object_materials(v3d, scene, ob, 1, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1);
}
else if(dt == OB_SHADED) {
@ -2716,7 +2728,7 @@ static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
drawDispListshaded(lb, ob);
}
else {
GPU_set_object_materials(v3d, scene, ob, 0, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, 0, NULL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
drawDispListsolid(lb, ob, 0);
}
@ -2746,7 +2758,7 @@ static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
if(dl->nors==NULL) addnormalsDispList(ob, lb);
if(draw_glsl_material(scene, ob, v3d, dt)) {
GPU_set_object_materials(v3d, scene, ob, 1, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1);
}
else if(dt==OB_SHADED) {
@ -2754,7 +2766,7 @@ static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
drawDispListshaded(lb, ob);
}
else {
GPU_set_object_materials(v3d, scene, ob, 0, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, 0, NULL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
drawDispListsolid(lb, ob, 0);
@ -2774,7 +2786,7 @@ static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
if(solid) {
if(draw_glsl_material(scene, ob, v3d, dt)) {
GPU_set_object_materials(v3d, scene, ob, 1, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1);
}
else if(dt == OB_SHADED) {
@ -2783,7 +2795,7 @@ static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
drawDispListshaded(lb, ob);
}
else {
GPU_set_object_materials(v3d, scene, ob, 0, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, 0, NULL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
drawDispListsolid(lb, ob, 0);
@ -2810,7 +2822,7 @@ static int drawDispList(Scene *scene, View3D *v3d, Base *base, int dt)
/* 5. start filling the arrays */
/* 6. draw the arrays */
/* 7. clean up */
static void draw_new_particle_system(Scene *scene, View3D *v3d, Base *base, ParticleSystem *psys, int dt)
static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ParticleSystem *psys, int dt)
{
Object *ob=base->object;
ParticleSystemModifierData *psmd;
@ -2899,7 +2911,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, Base *base, Part
timestep= psys_get_timestep(part);
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) {
float mat[4][4];
@ -2935,15 +2947,15 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, Base *base, Part
break;
case PART_DRAW_CIRC:
/* calculate view aligned matrix: */
Mat4CpyMat4(imat, v3d->viewinv);
Mat4CpyMat4(imat, rv3d->viewinv);
Normalize(imat[0]);
Normalize(imat[1]);
/* no break! */
case PART_DRAW_CROSS:
case PART_DRAW_AXIS:
/* lets calculate the scale: */
pixsize= v3d->persmat[0][3]*ob->obmat[3][0]+ v3d->persmat[1][3]*ob->obmat[3][1]+ v3d->persmat[2][3]*ob->obmat[3][2]+ v3d->persmat[3][3];
pixsize*= v3d->pixsize;
pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
pixsize*= rv3d->pixsize;
if(part->draw_size==0.0)
pixsize*=2.0;
else
@ -2984,7 +2996,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, Base *base, Part
break;
}
if(part->draw & PART_DRAW_SIZE && part->draw_as!=PART_DRAW_CIRC){
Mat4CpyMat4(imat, v3d->viewinv);
Mat4CpyMat4(imat, rv3d->viewinv);
Normalize(imat[0]);
Normalize(imat[1]);
}
@ -3486,11 +3498,11 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, Base *base, Part
psys->lattice= NULL;
}
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
wmMultMatrix(ob->obmat); // bring back local matrix for dtx
}
static void draw_particle_edit(Scene *scene, View3D *v3d, Object *ob, ParticleSystem *psys, int dt)
static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, ParticleSystem *psys, int dt)
{
ParticleEdit *edit = psys->edit;
ParticleData *pa;
@ -3522,7 +3534,7 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, Object *ob, ParticleSy
if((v3d->flag & V3D_ZBUF_SELECT)==0)
glDisable(GL_DEPTH_TEST);
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
/* get selection theme colors */
UI_GetThemeColor3ubv(TH_VERTEX_SELECT, sel);
@ -3878,7 +3890,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
}
}
static void drawnurb(Scene *scene, View3D *v3d, Base *base, Nurb *nurb, int dt)
static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, Nurb *nurb, int dt)
{
Object *ob= base->object;
Curve *cu = ob->data;
@ -3889,7 +3901,7 @@ static void drawnurb(Scene *scene, View3D *v3d, Base *base, Nurb *nurb, int dt)
/* DispList */
UI_ThemeColor(TH_WIRE);
drawDispList(scene, v3d, base, dt);
drawDispList(scene, v3d, rv3d, base, dt);
if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
@ -4171,7 +4183,7 @@ static void drawcone(float *vec, float radius, float height, float tmat[][4])
glEnd();
}
/* return 1 if nothing was drawn */
static int drawmball(Scene *scene, View3D *v3d, Base *base, int dt)
static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt)
{
Object *ob= base->object;
MetaBall *mb;
@ -4183,12 +4195,12 @@ static int drawmball(Scene *scene, View3D *v3d, Base *base, int dt)
if(mb->editelems) {
UI_ThemeColor(TH_WIRE);
if((G.f & G_PICKSEL)==0 ) drawDispList(scene, v3d, base, dt);
if((G.f & G_PICKSEL)==0 ) drawDispList(scene, v3d, rv3d, base, dt);
ml= mb->editelems->first;
}
else {
if((base->flag & OB_FROMDUPLI)==0)
drawDispList(scene, v3d, base, dt);
drawDispList(scene, v3d, rv3d, base, dt);
ml= mb->elems.first;
}
@ -4553,7 +4565,7 @@ static void drawtexspace(Object *ob)
}
/* draws wire outline */
static void drawSolidSelect(Scene *scene, View3D *v3d, Base *base)
static void drawSolidSelect(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
{
Object *ob= base->object;
@ -4562,7 +4574,7 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, Base *base)
if(ELEM3(ob->type, OB_FONT,OB_CURVE, OB_SURF)) {
Curve *cu = ob->data;
if (displist_has_faces(&cu->disp) && boundbox_clip(v3d, ob->obmat, cu->bb)) {
if (displist_has_faces(&cu->disp) && boundbox_clip(rv3d, ob->obmat, cu->bb)) {
draw_index_wire= 0;
drawDispListwire(&cu->disp);
draw_index_wire= 1;
@ -4573,14 +4585,14 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, Base *base)
}
else if(ob->type==OB_ARMATURE) {
if(!(ob->flag & OB_POSEMODE))
draw_armature(scene, v3d, base, OB_WIRE, 0);
draw_armature(scene, v3d, rv3d, base, OB_WIRE, 0);
}
glLineWidth(1.0);
glDepthMask(1);
}
static void drawWireExtra(Scene *scene, View3D *v3d, Object *ob)
static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob)
{
// XXX scene->obedit warning
if(ob!=scene->obedit && (ob->flag & SELECT)) {
@ -4605,12 +4617,12 @@ static void drawWireExtra(Scene *scene, View3D *v3d, Object *ob)
}
}
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
if (ELEM3(ob->type, OB_FONT, OB_CURVE, OB_SURF)) {
Curve *cu = ob->data;
if (boundbox_clip(v3d, ob->obmat, cu->bb)) {
if (boundbox_clip(rv3d, ob->obmat, cu->bb)) {
if (ob->type==OB_CURVE)
draw_index_wire= 0;
drawDispListwire(&cu->disp);
@ -4622,7 +4634,7 @@ static void drawWireExtra(Scene *scene, View3D *v3d, Object *ob)
}
glDepthMask(1);
bglPolygonOffset(v3d->dist, 0.0);
bglPolygonOffset(rv3d->dist, 0.0);
}
/* should be called in view space */
@ -4701,6 +4713,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
static int warning_recursive= 0;
Object *ob;
Curve *cu;
RegionView3D *rv3d= ar->regiondata;
//float cfraont;
float vec1[3], vec2[3];
unsigned int col=0;
@ -4814,7 +4827,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* which wire color */
if((flag & DRAW_CONSTCOLOR) == 0) {
project_short(ar, v3d, ob->obmat[3], &base->sx);
project_short(ar, ob->obmat[3], &base->sx);
if((G.moving & G_TRANSFORM_OBJ) && (base->flag & (SELECT+BA_WAS_SEL))) UI_ThemeColor(TH_TRANSFORM);
else {
@ -4903,7 +4916,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if((v3d->flag & V3D_SELECT_OUTLINE) && ob->type!=OB_MESH) {
if(dt>OB_WIRE && dt<OB_TEXTURE && ob!=scene->obedit && (flag && DRAW_SCENESET)==0) {
if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) {
drawSolidSelect(scene, v3d, base);
drawSolidSelect(scene, v3d, rv3d, base);
}
}
}
@ -4911,7 +4924,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
switch( ob->type) {
case OB_MESH:
if (!(base->flag&OB_RADIO)) {
empty_object= draw_mesh_object(scene, v3d, base, dt, flag);
empty_object= draw_mesh_object(scene, v3d, rv3d, base, dt, flag);
if(flag!=DRAW_CONSTCOLOR) dtx &= ~OB_DRAWWIRE; // mesh draws wire itself
}
@ -4925,10 +4938,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (cu->flag & CU_FAST) {
cpack(0xFFFFFF);
set_inverted_drawing(1);
drawDispList(scene, v3d, base, OB_WIRE);
drawDispList(scene, v3d, rv3d, base, OB_WIRE);
set_inverted_drawing(0);
} else {
drawDispList(scene, v3d, base, dt);
drawDispList(scene, v3d, rv3d, base, dt);
}
if (cu->linewidth != 0.0) {
@ -5003,8 +5016,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
else if(dt==OB_BOUNDBOX)
draw_bounding_volume(scene, ob);
else if(boundbox_clip(v3d, ob->obmat, cu->bb))
empty_object= drawDispList(scene, v3d, base, dt);
else if(boundbox_clip(rv3d, ob->obmat, cu->bb))
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
break;
case OB_CURVE:
@ -5014,12 +5027,12 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (cu->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
if(cu->editnurb) {
drawnurb(scene, v3d, base, cu->editnurb->first, dt);
drawnurb(scene, v3d, rv3d, base, cu->editnurb->first, dt);
}
else if(dt==OB_BOUNDBOX)
draw_bounding_volume(scene, ob);
else if(boundbox_clip(v3d, ob->obmat, cu->bb)) {
empty_object= drawDispList(scene, v3d, base, dt);
else if(boundbox_clip(rv3d, ob->obmat, cu->bb)) {
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
if(cu->path)
curve_draw_speed(scene, ob);
@ -5030,29 +5043,29 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
MetaBall *mb= ob->data;
if(mb->editelems)
drawmball(scene, v3d, base, dt);
drawmball(scene, v3d, rv3d, base, dt);
else if(dt==OB_BOUNDBOX)
draw_bounding_volume(scene, ob);
else
empty_object= drawmball(scene, v3d, base, dt);
empty_object= drawmball(scene, v3d, rv3d, base, dt);
break;
}
case OB_EMPTY:
drawaxes(ob->empty_drawsize, flag, ob->empty_drawtype);
break;
case OB_LAMP:
drawlamp(scene, v3d, ob);
drawlamp(scene, v3d, rv3d, ob);
if(dtx || (base->flag & SELECT)) wmMultMatrix(ob->obmat);
break;
case OB_CAMERA:
drawcamera(scene, v3d, ob, flag);
drawcamera(scene, v3d, rv3d, ob, flag);
break;
case OB_LATTICE:
drawlattice(scene, v3d, ob);
break;
case OB_ARMATURE:
if(dt>OB_WIRE) GPU_enable_material(0, NULL); // we use default material
empty_object= draw_armature(scene, v3d, base, dt, flag);
empty_object= draw_armature(scene, v3d, rv3d, base, dt, flag);
if(dt>OB_WIRE) GPU_disable_material();
break;
default:
@ -5071,12 +5084,12 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
glDepthMask(GL_FALSE);
for(psys=ob->particlesystem.first; psys; psys=psys->next)
draw_new_particle_system(scene, v3d, base, psys, dt);
draw_new_particle_system(scene, v3d, rv3d, base, psys, dt);
if(G.f & G_PARTICLEEDIT && ob==OBACT) {
psys= NULL; // XXX PE_get_current(ob);
if(psys && !scene->obedit && psys_in_edit_mode(scene, psys))
draw_particle_edit(scene, v3d, ob, psys, dt);
draw_particle_edit(scene, v3d, rv3d, ob, psys, dt);
}
glDepthMask(GL_TRUE);
if(col) cpack(col);
@ -5115,7 +5128,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
}
/*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
if((dtx & OB_DRAWWIRE) && dt>=OB_SOLID) drawWireExtra(scene, v3d, ob);
if((dtx & OB_DRAWWIRE) && dt>=OB_SOLID) drawWireExtra(scene, rv3d, ob);
}
if(dt<OB_SHADED) {
@ -5133,7 +5146,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
}
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
if(zbufoff) glDisable(GL_DEPTH_TEST);
@ -5161,7 +5174,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
else if((flag & DRAW_CONSTCOLOR)==0) {
/* we don't draw centers for duplicators and sets */
drawcentercircle(v3d, ob->obmat[3], do_draw_center, ob->id.lib || ob->id.us>1);
drawcentercircle(v3d, rv3d, ob->obmat[3], do_draw_center, ob->id.lib || ob->id.us>1);
}
}
}
@ -5231,41 +5244,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
free_old_images();
}
void draw_object_ext(ARegion *ar, View3D *v3d, Scene *scene, Base *base)
{
if(v3d==NULL || base==NULL) return;
if(v3d->drawtype > OB_WIRE) {
v3d->zbuf= 1;
glEnable(GL_DEPTH_TEST);
}
G.f |= G_DRAW_EXT;
glDrawBuffer(GL_FRONT);
// XXX persp(PERSP_VIEW);
if(v3d->flag & V3D_CLIPPING)
view3d_set_clipping(v3d);
draw_object(scene, ar, v3d, base, 0);
if(v3d->flag & V3D_CLIPPING)
view3d_clr_clipping();
G.f &= ~G_DRAW_EXT;
bglFlush(); /* reveil frontbuffer drawing */
glDrawBuffer(GL_BACK);
if(v3d->zbuf) {
v3d->zbuf= 0;
glDisable(GL_DEPTH_TEST);
}
// XXX ar->win_swap= WIN_FRONT_OK;
}
/* ***************** BACKBUF SEL (BBS) ********* */
static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
@ -5372,7 +5350,7 @@ static void bbs_mesh_solid(Scene *scene, View3D *v3d, Object *ob)
dm->release(dm);
}
void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob)
{
wmMultMatrix(ob->obmat);
@ -5396,7 +5374,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
else
em_solidoffs= 1;
bglPolygonOffset(v3d->dist, 1.0);
bglPolygonOffset(rv3d->dist, 1.0);
// we draw edges always, for loop (select) tools
bbs_mesh_wire(dm, em_solidoffs);
@ -5409,7 +5387,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
}
else em_vertoffs= em_wireoffs;
bglPolygonOffset(v3d->dist, 0.0);
bglPolygonOffset(rv3d->dist, 0.0);
dm->release(dm);
@ -5423,7 +5401,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
break;
}
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
}
@ -5431,7 +5409,8 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
/* assumes all matrices/etc set OK */
/* helper function for drawing object instances - meshes */
static void draw_object_mesh_instance(Scene *scene, View3D *v3d, Object *ob, int dt, int outline)
static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d,
Object *ob, int dt, int outline)
{
Mesh *me= ob->data;
DerivedMesh *dm=NULL, *edm=NULL;
@ -5454,7 +5433,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, Object *ob, int
if(dm) {
glsl = draw_glsl_material(scene, ob, v3d, dt);
GPU_set_object_materials(v3d, scene, ob, glsl, NULL);
GPU_set_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
}
else {
glEnable(GL_COLOR_MATERIAL);
@ -5480,14 +5459,14 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, Object *ob, int
if(dm) dm->release(dm);
}
void draw_object_instance(Scene *scene, View3D *v3d, Object *ob, int dt, int outline)
void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int dt, int outline)
{
if (ob == NULL)
return;
switch (ob->type) {
case OB_MESH:
draw_object_mesh_instance(scene, v3d, ob, dt, outline);
draw_object_mesh_instance(scene, v3d, rv3d, ob, dt, outline);
break;
case OB_EMPTY:
drawaxes(ob->empty_drawsize, 0, ob->empty_drawtype);

@ -66,53 +66,54 @@ static SpaceLink *view3d_new(const bContext *C)
{
Scene *scene= CTX_data_scene(C);
ARegion *ar;
View3D *vd;
View3D *v3d;
RegionView3D *rv3d;
vd= MEM_callocN(sizeof(View3D), "initview3d");
vd->spacetype= SPACE_VIEW3D;
vd->blockscale= 0.7f;
vd->lay= vd->layact= 1;
v3d= MEM_callocN(sizeof(View3D), "initview3d");
v3d->spacetype= SPACE_VIEW3D;
v3d->blockscale= 0.7f;
v3d->lay= v3d->layact= 1;
if(scene) {
vd->lay= vd->layact= scene->lay;
vd->camera= scene->camera;
v3d->lay= v3d->layact= scene->lay;
v3d->camera= scene->camera;
}
vd->scenelock= 1;
vd->grid= 1.0f;
vd->gridlines= 16;
vd->gridsubdiv = 10;
vd->drawtype= OB_WIRE;
v3d->scenelock= 1;
v3d->grid= 1.0f;
v3d->gridlines= 16;
v3d->gridsubdiv = 10;
v3d->drawtype= OB_WIRE;
vd->gridflag |= V3D_SHOW_X;
vd->gridflag |= V3D_SHOW_Y;
vd->gridflag |= V3D_SHOW_FLOOR;
vd->gridflag &= ~V3D_SHOW_Z;
v3d->gridflag |= V3D_SHOW_X;
v3d->gridflag |= V3D_SHOW_Y;
v3d->gridflag |= V3D_SHOW_FLOOR;
v3d->gridflag &= ~V3D_SHOW_Z;
vd->depths= NULL;
/* XXX move view data to region? */
vd->viewquat[0]= 1.0f;
vd->viewquat[1]= vd->viewquat[2]= vd->viewquat[3]= 0.0f;
vd->persp= 1;
vd->view= 7;
vd->dist= 10.0;
vd->lens= 35.0f;
vd->near= 0.01f;
vd->far= 500.0f;
v3d->lens= 35.0f;
v3d->near= 0.01f;
v3d->far= 500.0f;
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for view3d");
BLI_addtail(&vd->regionbase, ar);
BLI_addtail(&v3d->regionbase, ar);
ar->regiontype= RGN_TYPE_HEADER;
ar->alignment= RGN_ALIGN_BOTTOM;
/* main area */
ar= MEM_callocN(sizeof(ARegion), "main area for view3d");
BLI_addtail(&vd->regionbase, ar);
BLI_addtail(&v3d->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
return (SpaceLink *)vd;
ar->regiondata= MEM_callocN(sizeof(RegionView3D), "region view3d");
rv3d= ar->regiondata;
rv3d->viewquat[0]= 1.0f;
rv3d->persp= 1;
rv3d->view= 7;
rv3d->dist= 10.0;
Mat4One(rv3d->twmat);
return (SpaceLink *)v3d;
}
/* not spacelink itself */
@ -126,19 +127,8 @@ static void view3d_free(SpaceLink *sl)
}
if(vd->localvd) MEM_freeN(vd->localvd);
if(vd->clipbb) MEM_freeN(vd->clipbb);
if(vd->depths) {
if(vd->depths->depths) MEM_freeN(vd->depths->depths);
MEM_freeN(vd->depths);
vd->depths= NULL;
}
// XXX retopo_free_view_data(vd);
if(vd->properties_storage) MEM_freeN(vd->properties_storage);
if(vd->ri) {
// XXX BIF_view3d_previewrender_free(vd);
}
}
@ -157,8 +147,6 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
/* clear or remove stuff from old */
// XXX BIF_view3d_previewrender_free(v3do);
v3do->depths= NULL;
v3do->retopo_view_data= NULL;
if(v3do->localvd) {
// XXX restore_localviewdata(v3do);
@ -174,8 +162,6 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
v3dn->bgpic= MEM_dupallocN(v3dn->bgpic);
if(v3dn->bgpic->ima) v3dn->bgpic->ima->id.us++;
}
v3dn->clipbb= MEM_dupallocN(v3dn->clipbb);
v3dn->ri= NULL;
v3dn->properties_storage= NULL;
return (SpaceLink *)v3dn;
@ -200,6 +186,54 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
}
/* type callback, not region itself */
static void view3d_main_area_free(ARegion *ar)
{
RegionView3D *rv3d= ar->regiondata;
if(rv3d) {
if(rv3d->localvd) MEM_freeN(rv3d->localvd);
if(rv3d->clipbb) MEM_freeN(rv3d->clipbb);
// XXX retopo_free_view_data(rv3d);
if(rv3d->ri) {
// XXX BIF_view3d_previewrender_free(rv3d);
}
if(rv3d->depths) {
if(rv3d->depths->depths) MEM_freeN(rv3d->depths->depths);
MEM_freeN(rv3d->depths);
}
MEM_freeN(rv3d);
ar->regiondata= NULL;
}
}
/* copy regiondata */
static void *view3d_main_area_duplicate(void *poin)
{
if(poin) {
RegionView3D *rv3d= poin, *new;
new= MEM_dupallocN(rv3d);
if(rv3d->localvd)
new->localvd= MEM_dupallocN(rv3d->localvd);
if(rv3d->clipbb)
new->clipbb= MEM_dupallocN(rv3d->clipbb);
new->depths= NULL;
new->retopo_view_data= NULL;
new->ri= NULL;
new->gpd= NULL;
new->sms= NULL;
new->smooth_timer= NULL;
return new;
}
return NULL;
}
static void view3d_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype)
{
ListBase *keymap;
@ -422,6 +456,8 @@ void ED_spacetype_view3d(void)
art->regionid = RGN_TYPE_WINDOW;
art->draw= view3d_main_area_draw;
art->init= view3d_main_area_init;
art->free= view3d_main_area_free;
art->duplicate= view3d_main_area_duplicate;
art->listener= view3d_main_area_listener;
art->cursor= view3d_main_area_cursor;
BLI_addhead(&st->regiontypes, art);

@ -145,9 +145,9 @@ void circ(float x, float y, float rad)
/* ********* custom clipping *********** */
static void view3d_draw_clipping(View3D *v3d)
static void view3d_draw_clipping(RegionView3D *rv3d)
{
BoundBox *bb= v3d->clipbb;
BoundBox *bb= rv3d->clipbb;
UI_ThemeColorShade(TH_BACK, -8);
@ -163,13 +163,13 @@ static void view3d_draw_clipping(View3D *v3d)
glEnd();
}
void view3d_set_clipping(View3D *v3d)
void view3d_set_clipping(RegionView3D *rv3d)
{
double plane[4];
int a;
for(a=0; a<4; a++) {
QUATCOPY(plane, v3d->clip[a]);
QUATCOPY(plane, rv3d->clip[a]);
glClipPlane(GL_CLIP_PLANE0+a, plane);
glEnable(GL_CLIP_PLANE0+a);
}
@ -184,17 +184,17 @@ void view3d_clr_clipping(void)
}
}
int view3d_test_clipping(View3D *v3d, float *vec)
int view3d_test_clipping(RegionView3D *rv3d, float *vec)
{
/* vec in world coordinates, returns 1 if clipped */
float view[3];
VECCOPY(view, vec);
if(0.0f < v3d->clip[0][3] + INPR(view, v3d->clip[0]))
if(0.0f < v3d->clip[1][3] + INPR(view, v3d->clip[1]))
if(0.0f < v3d->clip[2][3] + INPR(view, v3d->clip[2]))
if(0.0f < v3d->clip[3][3] + INPR(view, v3d->clip[3]))
if(0.0f < rv3d->clip[0][3] + INPR(view, rv3d->clip[0]))
if(0.0f < rv3d->clip[1][3] + INPR(view, rv3d->clip[1]))
if(0.0f < rv3d->clip[2][3] + INPR(view, rv3d->clip[2]))
if(0.0f < rv3d->clip[3][3] + INPR(view, rv3d->clip[3]))
return 0;
return 1;
@ -252,6 +252,7 @@ void make_axis_color(char *col, char *col2, char axis)
static void drawgrid(ARegion *ar, View3D *v3d)
{
/* extern short bgpicmode; */
RegionView3D *rv3d= ar->regiondata;
float wx, wy, x, y, fw, fx, fy, dx;
float vec4[4];
char col[3], col2[3];
@ -259,7 +260,7 @@ static void drawgrid(ARegion *ar, View3D *v3d)
vec4[0]=vec4[1]=vec4[2]=0.0;
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
fx= vec4[0];
fy= vec4[1];
fw= vec4[3];
@ -273,7 +274,7 @@ static void drawgrid(ARegion *ar, View3D *v3d)
vec4[0]=vec4[1]=v3d->grid;
vec4[2]= 0.0;
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
fx= vec4[0];
fy= vec4[1];
fw= vec4[3];
@ -359,13 +360,13 @@ static void drawgrid(ARegion *ar, View3D *v3d)
setlinestyle(0);
/* center cross */
if(v3d->view==3) make_axis_color(col, col2, 'y');
if(rv3d->view==3) make_axis_color(col, col2, 'y');
else make_axis_color(col, col2, 'x');
glColor3ubv((GLubyte *)col2);
fdrawline(0.0, y, (float)ar->winx, y);
if(v3d->view==7) make_axis_color(col, col2, 'y');
if(rv3d->view==7) make_axis_color(col, col2, 'y');
else make_axis_color(col, col2, 'z');
glColor3ubv((GLubyte *)col2);
@ -506,7 +507,7 @@ static void drawcursor(Scene *scene, ARegion *ar, View3D *v3d)
/* we dont want the clipping for cursor */
flag= v3d->flag;
v3d->flag= 0;
project_short(ar, v3d, give_cursor(scene, v3d), co);
project_short(ar, give_cursor(scene, v3d), co);
v3d->flag= flag;
mx = co[0];
@ -530,7 +531,7 @@ static void drawcursor(Scene *scene, ARegion *ar, View3D *v3d)
}
/* Draw a live substitute of the view icon, which is always shown */
static void draw_view_axis(View3D *v3d)
static void draw_view_axis(RegionView3D *rv3d)
{
const float k = U.rvisize; /* axis size */
const float toll = 0.5; /* used to see when view is quasi-orthogonal */
@ -558,7 +559,7 @@ static void draw_view_axis(View3D *v3d)
/* X */
vec[0] = vec[3] = 1;
vec[1] = vec[2] = 0;
QuatMulVecf(v3d->viewquat, vec);
QuatMulVecf(rv3d->viewquat, vec);
make_axis_color((char *)gridcol, (char *)col, 'x');
rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
@ -579,7 +580,7 @@ static void draw_view_axis(View3D *v3d)
/* Y */
vec[1] = vec[3] = 1;
vec[0] = vec[2] = 0;
QuatMulVecf(v3d->viewquat, vec);
QuatMulVecf(rv3d->viewquat, vec);
make_axis_color((char *)gridcol, (char *)col, 'y');
rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
@ -600,7 +601,7 @@ static void draw_view_axis(View3D *v3d)
/* Z */
vec[2] = vec[3] = 1;
vec[1] = vec[0] = 0;
QuatMulVecf(v3d->viewquat, vec);
QuatMulVecf(rv3d->viewquat, vec);
make_axis_color((char *)gridcol, (char *)col, 'z');
rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
@ -623,13 +624,13 @@ static void draw_view_axis(View3D *v3d)
}
static void draw_view_icon(View3D *v3d)
static void draw_view_icon(RegionView3D *rv3d)
{
BIFIconID icon;
if(v3d->view==7) icon= ICON_AXIS_TOP;
else if(v3d->view==1) icon= ICON_AXIS_FRONT;
else if(v3d->view==3) icon= ICON_AXIS_SIDE;
if(rv3d->view==7) icon= ICON_AXIS_TOP;
else if(rv3d->view==1) icon= ICON_AXIS_FRONT;
else if(rv3d->view==3) icon= ICON_AXIS_SIDE;
else return ;
glEnable(GL_BLEND);
@ -640,31 +641,31 @@ static void draw_view_icon(View3D *v3d)
glDisable(GL_BLEND);
}
char *view3d_get_name(View3D *v3d)
static char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
{
char *name = NULL;
switch (v3d->view) {
switch (rv3d->view) {
case 1:
if (v3d->persp == V3D_ORTHO)
name = (v3d->flag2 & V3D_OPP_DIRECTION_NAME) ? "Back Ortho" : "Front Ortho";
if (rv3d->persp == V3D_ORTHO)
name = (rv3d->rflag & RV3D_OPP_DIRECTION_NAME) ? "Back Ortho" : "Front Ortho";
else
name = (v3d->flag2 & V3D_OPP_DIRECTION_NAME) ? "Back Persp" : "Front Persp";
name = (rv3d->rflag & RV3D_OPP_DIRECTION_NAME) ? "Back Persp" : "Front Persp";
break;
case 3:
if (v3d->persp == V3D_ORTHO)
name = (v3d->flag2 & V3D_OPP_DIRECTION_NAME) ? "Left Ortho" : "Right Ortho";
if (rv3d->persp == V3D_ORTHO)
name = (rv3d->rflag & RV3D_OPP_DIRECTION_NAME) ? "Left Ortho" : "Right Ortho";
else
name = (v3d->flag2 & V3D_OPP_DIRECTION_NAME) ? "Left Persp" : "Right Persp";
name = (rv3d->rflag & RV3D_OPP_DIRECTION_NAME) ? "Left Persp" : "Right Persp";
break;
case 7:
if (v3d->persp == V3D_ORTHO)
name = (v3d->flag2 & V3D_OPP_DIRECTION_NAME) ? "Bottom Ortho" : "Top Ortho";
if (rv3d->persp == V3D_ORTHO)
name = (rv3d->rflag & RV3D_OPP_DIRECTION_NAME) ? "Bottom Ortho" : "Top Ortho";
else
name = (v3d->flag2 & V3D_OPP_DIRECTION_NAME) ? "Bottom Persp" : "Top Persp";
name = (rv3d->rflag & RV3D_OPP_DIRECTION_NAME) ? "Bottom Persp" : "Top Persp";
break;
default:
if (v3d->persp==V3D_CAMOB) {
if (rv3d->persp==V3D_CAMOB) {
if ((v3d->camera) && (v3d->camera->type == OB_CAMERA)) {
Camera *cam;
cam = v3d->camera->data;
@ -673,7 +674,7 @@ char *view3d_get_name(View3D *v3d)
name = "Object as Camera";
}
} else {
name = (v3d->persp == V3D_ORTHO) ? "User Ortho" : "User Persp";
name = (rv3d->persp == V3D_ORTHO) ? "User Ortho" : "User Persp";
}
break;
}
@ -683,7 +684,8 @@ char *view3d_get_name(View3D *v3d)
static void draw_viewport_name(ARegion *ar, View3D *v3d)
{
char *name = view3d_get_name(v3d);
RegionView3D *rv3d= ar->regiondata;
char *name = view3d_get_name(v3d, rv3d);
char *printable = NULL;
if (v3d->localview) {
@ -841,6 +843,7 @@ static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2
void calc_viewborder(Scene *scene, ARegion *ar, View3D *v3d, rctf *viewborder_r)
{
RegionView3D *rv3d= ar->regiondata;
float zoomfac, size[2];
float dx= 0.0f, dy= 0.0f;
@ -854,7 +857,7 @@ void calc_viewborder(Scene *scene, ARegion *ar, View3D *v3d, rctf *viewborder_r)
* with multiple keypad presses (ton)
*/
zoomfac= (M_SQRT2 + v3d->camzoom/50.0);
zoomfac= (M_SQRT2 + rv3d->camzoom/50.0);
zoomfac= (zoomfac*zoomfac)*0.25;
size[0]= size[0]*zoomfac;
@ -866,8 +869,8 @@ void calc_viewborder(Scene *scene, ARegion *ar, View3D *v3d, rctf *viewborder_r)
viewborder_r->xmax= viewborder_r->xmin + size[0];
viewborder_r->ymax= viewborder_r->ymin + size[1];
dx= ar->winx*v3d->camdx*zoomfac*2.0f;
dy= ar->winy*v3d->camdy*zoomfac*2.0f;
dx= ar->winx*rv3d->camdx*zoomfac*2.0f;
dy= ar->winy*rv3d->camdy*zoomfac*2.0f;
/* apply offset */
viewborder_r->xmin-= dx;
@ -888,15 +891,16 @@ void calc_viewborder(Scene *scene, ARegion *ar, View3D *v3d, rctf *viewborder_r)
}
}
void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar, View3D *v3d)
void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar)
{
RegionView3D *rv3d= ar->regiondata;
float size[2];
int im_width= (scene->r.size*scene->r.xsch)/100;
view3d_get_viewborder_size(scene, ar, size);
v3d->camzoom= (sqrt(4.0*im_width/size[0]) - M_SQRT2)*50.0;
v3d->camzoom= CLAMPIS(v3d->camzoom, -30, 300);
rv3d->camzoom= (sqrt(4.0*im_width/size[0]) - M_SQRT2)*50.0;
rv3d->camzoom= CLAMPIS(rv3d->camzoom, -30, 300);
}
@ -1047,6 +1051,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
struct Base *base;
/*for 2.43 release, don't use glext and just define the constant.
@ -1099,14 +1104,14 @@ void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
glDisable(GL_DEPTH_TEST);
}
if(v3d->flag & V3D_CLIPPING)
view3d_set_clipping(v3d);
if(rv3d->rflag & RV3D_CLIPPING)
view3d_set_clipping(rv3d);
G.f |= G_BACKBUFSEL;
base= (scene->basact);
if(base && (base->lay & v3d->lay)) {
draw_object_backbufsel(scene, v3d, base->object);
draw_object_backbufsel(scene, v3d, rv3d, base->object);
}
v3d->flag &= ~V3D_NEEDBACKBUFDRAW;
@ -1116,7 +1121,7 @@ void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
glDisable(GL_DEPTH_TEST);
glEnable(GL_DITHER);
if(v3d->flag & V3D_CLIPPING)
if(rv3d->rflag & RV3D_CLIPPING)
view3d_clr_clipping();
#ifdef GL_MULTISAMPLE_ARB
@ -1279,6 +1284,7 @@ exit:
static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
BGpic *bgpic;
Image *ima;
ImBuf *ibuf= NULL;
@ -1299,7 +1305,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
if(ibuf->rect==NULL)
IMB_rect_from_float(ibuf);
if(v3d->persp==2) {
if(rv3d->persp==2) {
rctf vb;
calc_viewborder(scene, ar, v3d, &vb);
@ -1313,15 +1319,15 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
float sco[2];
/* calc window coord */
initgrabz(v3d, 0.0, 0.0, 0.0);
window_to_3d(ar, v3d, vec, 1, 0);
initgrabz(rv3d, 0.0, 0.0, 0.0);
window_to_3d(ar, vec, 1, 0);
fac= MAX3( fabs(vec[0]), fabs(vec[1]), fabs(vec[1]) );
fac= 1.0/fac;
asp= ( (float)ibuf->y)/(float)ibuf->x;
vec[0] = vec[1] = vec[2] = 0.0;
view3d_project_float(ar, vec, sco, v3d->persmat);
view3d_project_float(ar, vec, sco, rv3d->persmat);
cx = sco[0];
cy = sco[1];
@ -1463,6 +1469,7 @@ static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
*/
static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int color)
{
RegionView3D *rv3d= ar->regiondata;
ListBase *lb;
DupliObject *dob;
Base tbase;
@ -1523,9 +1530,9 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas
}
if(use_displist) {
wmMultMatrix(dob->mat);
if(boundbox_clip(v3d, dob->mat, bb))
if(boundbox_clip(rv3d, dob->mat, bb))
glCallList(displist);
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
}
else {
Mat4CpyMat4(dob->ob->obmat, dob->mat);
@ -1562,10 +1569,12 @@ static void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, Base *bas
void view3d_update_depths(ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
/* Create storage for, and, if necessary, copy depth buffer */
if(!v3d->depths) v3d->depths= MEM_callocN(sizeof(ViewDepths),"ViewDepths");
if(v3d->depths) {
ViewDepths *d= v3d->depths;
if(!rv3d->depths) rv3d->depths= MEM_callocN(sizeof(ViewDepths),"ViewDepths");
if(rv3d->depths) {
ViewDepths *d= rv3d->depths;
if(d->w != ar->winx ||
d->h != ar->winy ||
!d->depths) {
@ -1621,6 +1630,7 @@ static void draw_sculpt_depths(Scene *scene, ARegion *ar, View3D *v3d)
void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
{
RegionView3D *rv3d= ar->regiondata;
Base *base;
Scene *sce;
short zbuf, flag;
@ -1635,20 +1645,20 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
U.glalphaclip = 0.5; /* not that nice but means we wont zoom into billboards */
v3d->flag &= ~V3D_SELECT_OUTLINE;
setwinmatrixview3d(v3d, ar->winx, ar->winy, NULL); /* 0= no pick rect */
setviewmatrixview3d(scene, v3d); /* note: calls where_is_object for camera... */
setwinmatrixview3d(ar, v3d, NULL); /* 0= no pick rect */
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
Mat4MulMat4(v3d->persmat, v3d->viewmat, v3d->winmat);
Mat4Invert(v3d->persinv, v3d->persmat);
Mat4Invert(v3d->viewinv, v3d->viewmat);
Mat4MulMat4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
Mat4Invert(rv3d->persinv, rv3d->persmat);
Mat4Invert(rv3d->viewinv, rv3d->viewmat);
glClear(GL_DEPTH_BUFFER_BIT);
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
// persp(PERSP_STORE); // store correct view for persp(PERSP_VIEW) calls
if(v3d->flag & V3D_CLIPPING) {
view3d_set_clipping(v3d);
if(rv3d->rflag & RV3D_CLIPPING) {
view3d_set_clipping(rv3d);
}
v3d->zbuf= TRUE;
@ -1842,8 +1852,8 @@ static CustomDataMask get_viewedit_datamask(bScreen *screen)
void view3d_main_area_draw(const bContext *C, ARegion *ar)
{
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first; /* XXX get from region */
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *sce;
Base *base;
Object *ob;
@ -1871,27 +1881,27 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
gpu_update_lamps_shadows(scene, v3d);
setwinmatrixview3d(v3d, ar->winx, ar->winy, NULL); /* 0= no pick rect */
setviewmatrixview3d(scene, v3d); /* note: calls where_is_object for camera... */
setwinmatrixview3d(ar, v3d, NULL); /* 0= no pick rect */
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
Mat4MulMat4(v3d->persmat, v3d->viewmat, v3d->winmat);
Mat4Invert(v3d->persinv, v3d->persmat);
Mat4Invert(v3d->viewinv, v3d->viewmat);
Mat4MulMat4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
Mat4Invert(rv3d->persinv, rv3d->persmat);
Mat4Invert(rv3d->viewinv, rv3d->viewmat);
/* calculate pixelsize factor once, is used for lamps and obcenters */
{
float len1, len2, vec[3];
VECCOPY(vec, v3d->persinv[0]);
VECCOPY(vec, rv3d->persinv[0]);
len1= Normalize(vec);
VECCOPY(vec, v3d->persinv[1]);
VECCOPY(vec, rv3d->persinv[1]);
len2= Normalize(vec);
v3d->pixsize= 2.0f*(len1>len2?len1:len2);
rv3d->pixsize= 2.0f*(len1>len2?len1:len2);
/* correct for window size */
if(ar->winx > ar->winy) v3d->pixsize/= (float)ar->winx;
else v3d->pixsize/= (float)ar->winy;
if(ar->winx > ar->winy) rv3d->pixsize/= (float)ar->winx;
else rv3d->pixsize/= (float)ar->winy;
}
if(v3d->drawtype > OB_WIRE) {
@ -1909,10 +1919,10 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
if(v3d->flag & V3D_CLIPPING)
view3d_draw_clipping(v3d);
if(rv3d->rflag & RV3D_CLIPPING)
view3d_draw_clipping(rv3d);
/* set zbuffer after we draw clipping region */
if(v3d->drawtype > OB_WIRE) {
@ -1923,9 +1933,9 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
// needs to be done always, gridview is adjusted in drawgrid() now
v3d->gridview= v3d->grid;
if(v3d->view==0 || v3d->persp!=0) {
if(rv3d->view==0 || rv3d->persp!=0) {
drawfloor(scene, v3d);
if(v3d->persp==2) {
if(rv3d->persp==2) {
if(scene->world) {
if(scene->world->mode & WO_STARS) {
RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func,
@ -1940,17 +1950,17 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
drawgrid(ar, v3d);
/* XXX make function? replaces persp(1) */
glMatrixMode(GL_PROJECTION);
wmLoadMatrix(v3d->winmat);
wmLoadMatrix(rv3d->winmat);
glMatrixMode(GL_MODELVIEW);
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
if(v3d->flag & V3D_DISPBGPIC) {
draw_bgpic(scene, ar, v3d);
}
}
if(v3d->flag & V3D_CLIPPING)
view3d_set_clipping(v3d);
if(rv3d->rflag & RV3D_CLIPPING)
view3d_set_clipping(rv3d);
/* draw set first */
if(scene->set) {
@ -2020,7 +2030,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
view3d_update_depths(ar, v3d);
}
if(v3d->flag & V3D_CLIPPING)
if(rv3d->rflag & RV3D_CLIPPING)
view3d_clr_clipping();
// BIF_draw_manipulator(ar);
@ -2043,8 +2053,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* Draw particle edit brush XXX (removed) */
if(v3d->persp>1) drawviewborder(scene, ar, v3d);
if(v3d->flag2 & V3D_FLYMODE) drawviewborder_flymode(ar);
if(rv3d->persp>1) drawviewborder(scene, ar, v3d);
if(rv3d->rflag & RV3D_FLYMODE) drawviewborder_flymode(ar);
/* draw grease-pencil stuff */
// if (v3d->flag2 & V3D_DISPGP)
@ -2053,9 +2063,9 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
drawcursor(scene, ar, v3d);
if(U.uiflag & USER_SHOW_ROTVIEWICON)
draw_view_axis(v3d);
draw_view_axis(rv3d);
else
draw_view_icon(v3d);
draw_view_icon(rv3d);
/* XXX removed viewport fps */
if(U.uiflag & USER_SHOW_VIEWPORTNAME) {

File diff suppressed because it is too large Load Diff

@ -118,9 +118,6 @@ static void allqueue(int x, int y) {}
static void persptoetsen(int x) {}
static void fly(void) {}
static void editmesh_align_view_to_selected(void *x, int y) {}
static void play_anim(int x) {}
static void add_blockhandler(void *x, int y, int z) {}
static void toggle_blockhandler(void *x, int y, int z) {}
static void countall(void) {}
extern void borderselect();
static int retopo_mesh_paint_check() {return 0;}
@ -188,13 +185,14 @@ static void do_view3d_buttons(bContext *C, void *arg, int event);
#define B_LAY 201
/* temp hack to get the region window */
static ARegion *ed_regionwin(ScrArea *sa)
static RegionView3D *wm_region_view3d(const bContext *C)
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar;
/* XXX handle foursplit? */
for(ar= sa->regionbase.first; ar; ar= ar->next)
if(ar->regiontype==RGN_TYPE_WINDOW)
return ar;
return ar->regiondata;
return NULL;
}
@ -252,7 +250,6 @@ void do_layer_buttons(bContext *C, short event)
static void do_view3d_view_camerasmenu(bContext *C, void *arg, int event)
{
Scene *scene= CTX_data_scene(C);
View3D *v3d= (View3D*)CTX_wm_space_data(C);
Base *base;
int i=1;
@ -260,31 +257,16 @@ static void do_view3d_view_camerasmenu(bContext *C, void *arg, int event)
/* Set Active Object as Active Camera */
/* XXX ugly hack alert */
// G.qual |= LR_CTRLKEY;
persptoetsen(PAD0);
// persptoetsen(PAD0);
// G.qual &= ~LR_CTRLKEY;
} else {
/* store settings of current view before allowing overwriting with camera view */
/* this is a copy of the code in toets.c */
if(v3d->persp != V3D_CAMOB) {
QUATCOPY(v3d->lviewquat, v3d->viewquat);
v3d->lview= v3d->view;
v3d->lpersp= v3d->persp;
}
for( base = FIRSTBASE; base; base = base->next ) {
if (base->object->type == OB_CAMERA) {
i++;
if (event==i) {
if (v3d->camera == base->object && v3d->persp==V3D_CAMOB)
return;
/* XXX handle smooth view */
v3d->camera= base->object;
handle_view3d_lock();
v3d->persp= V3D_CAMOB;
v3d->view= 0;
/* XXX use api call! */
break;
}
@ -514,40 +496,25 @@ static uiBlock *view3d_view_spacehandlers(bContext *C, uiMenuBlockHandle *handle
static void do_view3d_viewmenu(bContext *C, void *arg, int event)
{
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
switch(event) {
case 0: /* User */
v3d->viewbut = 0;
v3d->persp = V3D_PERSP;
break;
case 1: /* Camera */
persptoetsen(PAD0);
break;
case 2: /* Top */
persptoetsen(PAD7);
break;
case 3: /* Front */
persptoetsen(PAD1);
break;
case 4: /* Side */
persptoetsen(PAD3);
break;
case 5: /* Perspective */
v3d->persp=V3D_PERSP;
break;
case 6: /* Orthographic */
v3d->persp=V3D_ORTHO;
break;
case 7: /* Local View */
v3d->localview= 1;
initlocalview(scene, ed_regionwin(sa), v3d);
break;
case 8: /* Global View */
v3d->localview= 0;
endlocalview(scene, sa);
break;
case 9: /* View All (Home) */
WM_operator_name_call(C, "VIEW3D_OT_viewhome", WM_OP_EXEC_REGION_WIN, NULL);
@ -556,28 +523,27 @@ static void do_view3d_viewmenu(bContext *C, void *arg, int event)
WM_operator_name_call(C, "VIEW3D_OT_viewcenter", WM_OP_EXEC_REGION_WIN, NULL);
break;
case 13: /* Play Back Animation */
play_anim(0);
break;
case 15: /* Background Image... */
add_blockhandler(sa, VIEW3D_HANDLER_BACKGROUND, UI_PNL_UNSTOW);
// add_blockhandler(sa, VIEW3D_HANDLER_BACKGROUND, UI_PNL_UNSTOW);
break;
case 16: /* View Panel */
add_blockhandler(sa, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
// add_blockhandler(sa, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
break;
case 17: /* Set Clipping Border */
WM_operator_name_call(C, "VIEW3D_OT_clipping", WM_OP_INVOKE_REGION_WIN, NULL);
break;
case 18: /* render preview */
toggle_blockhandler(sa, VIEW3D_HANDLER_PREVIEW, 0);
// toggle_blockhandler(sa, VIEW3D_HANDLER_PREVIEW, 0);
break;
case 19: /* zoom within border */
// view3d_border_zoom();
break;
case 20: /* Transform Space Panel */
add_blockhandler(sa, VIEW3D_HANDLER_TRANSFORM, UI_PNL_UNSTOW);
// add_blockhandler(sa, VIEW3D_HANDLER_TRANSFORM, UI_PNL_UNSTOW);
break;
case 21: /* Grease Pencil */
add_blockhandler(sa, VIEW3D_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
// add_blockhandler(sa, VIEW3D_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
break;
case 22: /* View all layers */
do_layer_buttons(C, -2);
@ -590,6 +556,7 @@ static uiBlock *view3d_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *ar
{
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
RegionView3D *rv3d= wm_region_view3d(C);
uiBlock *block;
short yco= 0, menuwidth=120;
@ -604,24 +571,24 @@ static uiBlock *view3d_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *ar
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
if ((v3d->viewbut == 0) && !(v3d->persp == V3D_CAMOB)) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "User", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
if ((rv3d->viewbut == 0) && !(rv3d->persp == V3D_CAMOB)) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "User", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "User", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
if (v3d->persp == V3D_CAMOB) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Camera|NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
if (rv3d->persp == V3D_CAMOB) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Camera|NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Camera|NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
if (v3d->viewbut == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Top|NumPad 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
if (rv3d->viewbut == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Top|NumPad 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Top|NumPad 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
if (v3d->viewbut == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Front|NumPad 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
if (rv3d->viewbut == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Front|NumPad 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Front|NumPad 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
if (v3d->viewbut == 3) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Side|NumPad 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
if (rv3d->viewbut == 3) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Side|NumPad 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Side|NumPad 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
uiDefIconTextBlockBut(block, view3d_view_camerasmenu, NULL, ICON_RIGHTARROW_THIN, "Cameras", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
if(v3d->persp==V3D_PERSP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Perspective|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
if(rv3d->persp==V3D_PERSP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Perspective|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Perspective|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
if(v3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
if(rv3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@ -643,11 +610,11 @@ static uiBlock *view3d_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *ar
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
if(v3d->flag & V3D_CLIPPING)
if(rv3d->rflag & RV3D_CLIPPING)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Clipping Border|Alt B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
else
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Clipping Border|Alt B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
if (v3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Within Border...|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, "");
if (rv3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Within Border...|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
if(!sa->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
@ -675,9 +642,9 @@ static uiBlock *view3d_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *ar
return block;
}
#if 0
void do_view3d_select_object_typemenu(bContext *C, void *arg, int event)
{
#if 0
extern void selectall_type(short obtype);
@ -717,7 +684,6 @@ void do_view3d_select_object_typemenu(bContext *C, void *arg, int event)
break;
}
allqueue(REDRAWVIEW3D, 0);
#endif
}
static uiBlock *view3d_select_object_typemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
@ -750,6 +716,7 @@ static uiBlock *view3d_select_object_typemenu(bContext *C, uiMenuBlockHandle *ha
return block;
}
void do_view3d_select_object_layermenu(bContext *C, void *arg, int event)
{
// XXX extern void selectall_layer(unsigned int layernum);
@ -821,7 +788,6 @@ static uiBlock *view3d_select_object_layermenu(bContext *C, uiMenuBlockHandle *h
void do_view3d_select_object_linkedmenu(bContext *C, void *arg, int event)
{
#if 0
switch(event) {
case 1: /* Object Ipo */
case 2: /* ObData */
@ -832,7 +798,6 @@ void do_view3d_select_object_linkedmenu(bContext *C, void *arg, int event)
}
countall();
allqueue(REDRAWVIEW3D, 0);
#endif
}
static uiBlock *view3d_select_object_linkedmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
@ -855,7 +820,7 @@ static uiBlock *view3d_select_object_linkedmenu(bContext *C, uiMenuBlockHandle *
void do_view3d_select_object_groupedmenu(bContext *C, void *arg, int event)
{
#if 0
switch(event) {
case 1: /* Children */
case 2: /* Immediate Children */
@ -872,7 +837,7 @@ void do_view3d_select_object_groupedmenu(bContext *C, void *arg, int event)
break;
}
allqueue(REDRAWVIEW3D, 0);
#endif
}
static uiBlock *view3d_select_object_groupedmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
@ -900,10 +865,12 @@ static uiBlock *view3d_select_object_groupedmenu(bContext *C, uiMenuBlockHandle
return block;
}
#endif
static uiBlock *view3d_select_objectmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
{
uiBlock *block;
short yco= 0, menuwidth=120;
// short yco= 0, menuwidth=120;
block= uiBeginBlock(C, handle->region, "view3d_select_objectmenu", UI_EMBOSSP, UI_HELV);
@ -4852,7 +4819,6 @@ uiBlock *view3d_sculpt_inputmenu(bContext *C, uiMenuBlockHandle *handle, void *a
uiBlock *view3d_sculptmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
{
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
uiBlock *block;
@ -5357,19 +5323,9 @@ static void do_view3d_buttons(bContext *C, void *arg, int event)
case B_VIEWBUT:
if(v3d->viewbut==1) persptoetsen(PAD7);
else if(v3d->viewbut==2) persptoetsen(PAD1);
else if(v3d->viewbut==3) persptoetsen(PAD3);
break;
case B_PERSP:
if(v3d->persp==V3D_CAMOB) persptoetsen(PAD0);
else {
if (v3d->persp==V3D_ORTHO) v3d->persp = V3D_PERSP;
else if (v3d->persp==V3D_PERSP) v3d->persp = V3D_ORTHO;
persptoetsen(PAD5);
}
break;
case B_VIEWRENDER:
@ -5585,20 +5541,21 @@ static void do_view3d_buttons(bContext *C, void *arg, int event)
}
}
static void view3d_header_pulldowns(const bContext *C, uiBlock *block, View3D *v3d, Object *ob, int *xcoord, int yco)
static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *ob, int *xcoord, int yco)
{
Object *obedit = CTX_data_edit_object(C);
RegionView3D *rv3d= wm_region_view3d(C);
short xmax, xco= *xcoord;
/* pull down menus */
uiBlockSetEmboss(block, UI_EMBOSSP);
/* compensate for local mode when setting up the viewing menu/iconrow values */
if(v3d->view==7) v3d->viewbut= 1;
else if(v3d->view==1) v3d->viewbut= 2;
else if(v3d->view==3) v3d->viewbut= 3;
else v3d->viewbut= 0;
if(rv3d->view==7) rv3d->viewbut= 1;
else if(rv3d->view==1) rv3d->viewbut= 2;
else if(rv3d->view==3) rv3d->viewbut= 3;
else rv3d->viewbut= 0;
/* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
* menu is drawn wider than it should be. The ypos of -2 is to make it properly fill the
@ -5746,7 +5703,7 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
xco= ED_area_header_standardbuttons(C, block, yco);
if((sa->flag & HEADER_NO_PULLDOWN)==0)
view3d_header_pulldowns(C, block, v3d, ob, &xco, yco);
view3d_header_pulldowns(C, block, ob, &xco, yco);
/* other buttons: */
uiBlockSetEmboss(block, UI_EMBOSS);

@ -87,21 +87,21 @@ void VIEW3D_OT_drawtype(struct wmOperatorType *ot);
/* drawobject.c */
void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, int flag);
int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt);
void draw_object_instance(Scene *scene, View3D *v3d, Object *ob, int dt, int outline);
void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob);
void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int dt, int outline);
void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob);
void drawaxes(float size, int flag, char drawtype);
/* drawarmature.c */
int draw_armature(Scene *scene, View3D *v3d, Base *base, int dt, int flag);
int draw_armature(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag);
/* drawmesh.c */
void draw_mesh_textured(Scene *scene, View3D *v3d, Object *ob, struct DerivedMesh *dm, int faceselect);
void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, struct DerivedMesh *dm, int faceselect);
/* view3d_draw.c */
void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);
void draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, int (* func)(void *));
void view3d_clr_clipping(void);
void view3d_set_clipping(View3D *v3d);
void view3d_set_clipping(RegionView3D *rv3d);
void add_view3d_after(View3D *v3d, Base *base, int type, int flag);
void make_axis_color(char *col, char *col2, char axis);
void calc_viewborder(Scene *scene, struct ARegion *ar, View3D *v3d, rctf *viewborder_r);
@ -127,14 +127,14 @@ void VIEW3D_OT_wpaint(struct wmOperatorType *ot);
void VIEW3D_OT_smoothview(struct wmOperatorType *ot);
void VIEW3D_OT_setcameratoview(struct wmOperatorType *ot);
int boundbox_clip(View3D *v3d, float obmat[][4], struct BoundBox *bb);
int boundbox_clip(RegionView3D *rv3d, float obmat[][4], struct BoundBox *bb);
void view3d_project_short_clip(struct ARegion *ar, View3D *v3d, float *vec, short *adr, float projmat[4][4], float wmat[4][4]);
void view3d_project_short_clip(struct ARegion *ar, float *vec, short *adr, float projmat[4][4], float wmat[4][4]);
void view3d_project_short_noclip(struct ARegion *ar, float *vec, short *adr, float mat[4][4]);
void view3d_project_float(struct ARegion *a, float *vec, float *adr, float mat[4][4]);
void view3d_get_object_project_mat(View3D *v3d, struct Object *ob, float pmat[4][4], float vmat[4][4]);
void view3d_get_object_project_mat(RegionView3D *v3d, struct Object *ob, float pmat[4][4], float vmat[4][4]);
int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
void initlocalview(Scene *scene, struct ARegion *ar, View3D *v3d);
void restore_localviewdata(View3D *vd);
@ -144,8 +144,8 @@ void centerview(struct ARegion *ar, View3D *v3d);
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 */
void setviewmatrixview3d(Scene *scene, View3D *v3d);
void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect); /* rect: for picking */
void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d);
#endif /* ED_VIEW3D_INTERN_H */

@ -80,6 +80,7 @@
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_types.h"
#include "ED_util.h"
#include "UI_interface.h"
#include "UI_resources.h"
@ -96,6 +97,7 @@ void view3d_set_viewcontext(bContext *C, ViewContext *vc)
vc->ar= CTX_wm_region(C);
vc->scene= CTX_data_scene(C);
vc->v3d= CTX_wm_view3d(C);
vc->rv3d= vc->ar->regiondata;
vc->obact= CTX_data_active_object(C);
vc->obedit= CTX_data_edit_object(C);
}
@ -310,10 +312,10 @@ static void do_lasso_select_pose(ViewContext *vc, short mcords[][2], short moves
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
VECCOPY(vec, pchan->pose_head);
Mat4MulVecfl(ob->obmat, vec);
project_short(vc->ar, vc->v3d, vec, sco1);
project_short(vc->ar, vec, sco1);
VECCOPY(vec, pchan->pose_tail);
Mat4MulVecfl(ob->obmat, vec);
project_short(vc->ar, vc->v3d, vec, sco2);
project_short(vc->ar, vec, sco2);
if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
if(select) pchan->bone->flag |= BONE_SELECTED;
@ -329,7 +331,7 @@ static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short mo
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);
project_short(vc->ar, base->object->obmat[3], &base->sx);
if(lasso_inside(mcords, moves, base->sx, base->sy)) {
if(select) ED_base_object_select(base, BA_SELECT);
@ -572,10 +574,10 @@ static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short m
VECCOPY(vec, ebone->head);
Mat4MulVecfl(vc->obedit->obmat, vec);
project_short(vc->ar, vc->v3d, vec, sco1);
project_short(vc->ar, vec, sco1);
VECCOPY(vec, ebone->tail);
Mat4MulVecfl(vc->obedit->obmat, vec);
project_short(vc->ar, vc->v3d, vec, sco2);
project_short(vc->ar, vec, sco2);
didpoint= 0;
if(lasso_inside(mcords, moves, sco1[0], sco1[1])) {
@ -819,7 +821,7 @@ static Base *mouse_select_menu(ViewContext *vc, unsigned int *buffer, int hits,
else {
int temp, dist=15;
project_short(vc->ar, vc->v3d, base->object->obmat[3], &base->sx);
project_short(vc->ar, base->object->obmat[3], &base->sx);
temp= abs(base->sx -mval[0]) + abs(base->sy -mval[1]);
if(temp<dist ) baseList[baseCount] = base;
@ -937,7 +939,7 @@ static void mouse_select(bContext *C, short *mval, short extend, short obcenter)
base= startbase;
while(base) {
if (BASE_SELECTABLE(v3d, base)) {
project_short(ar, v3d, base->object->obmat[3], &base->sx);
project_short(ar, base->object->obmat[3], &base->sx);
temp= abs(base->sx -mval[0]) + abs(base->sy -mval[1]);
if(base==BASACT) temp+=10;
@ -1758,7 +1760,7 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
for(base= FIRSTBASE; base; base= base->next) {
if(base->lay & v3d->lay) {
project_short(ar, v3d, base->object->obmat[3], &base->sx);
project_short(ar, base->object->obmat[3], &base->sx);
if(base->sx!=IS_CLIPPED) {
int dx= base->sx-x;
int dy= base->sy-y;

@ -94,14 +94,13 @@ void view3d_operator_needs_opengl(const bContext *C)
if(ar->regiontype!=RGN_TYPE_WINDOW)
printf("view3d_operator_needs_opengl error, wrong region\n");
else {
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
RegionView3D *rv3d= ar->regiondata;
wmSubWindowSet(CTX_wm_window(C), ar->swinid);
glMatrixMode(GL_PROJECTION);
wmLoadMatrix(v3d->winmat);
wmLoadMatrix(rv3d->winmat);
glMatrixMode(GL_MODELVIEW);
wmLoadMatrix(v3d->viewmat);
wmLoadMatrix(rv3d->viewmat);
}
}
@ -145,8 +144,7 @@ static void object_lens_clip_settings(Object *ob, float *lens, float *clipsta, f
*
* The dist is not modified for this function, if NULL its assimed zero
* */
/* Scene can be NULL */
static void view_settings_from_ob(Scene *scene, Object *ob, float *ofs, float *quat, float *dist, float *lens)
static void view_settings_from_ob(Object *ob, float *ofs, float *quat, float *dist, float *lens)
{
float bmat[4][4];
float imat[4][4];
@ -156,8 +154,6 @@ static void view_settings_from_ob(Scene *scene, Object *ob, float *ofs, float *q
/* Offset */
if (ofs) {
/* this should not be needed, nly for camera to prevent lag */
if(scene) where_is_object(scene, ob);
VECCOPY(ofs, ob->obmat[3]);
VecMulf(ofs, -1.0f); /*flip the vector*/
}
@ -204,14 +200,14 @@ struct SmoothViewStore {
/* the arguments are the desired situation */
void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, float *quat, float *dist, float *lens)
{
Scene *scene= CTX_data_scene(C);
View3D *v3d= (View3D *)CTX_wm_space_data(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
struct SmoothViewStore sms;
/* initialize sms */
VECCOPY(sms.new_ofs, v3d->ofs);
QUATCOPY(sms.new_quat, v3d->viewquat);
sms.new_dist= v3d->dist;
VECCOPY(sms.new_ofs, rv3d->ofs);
QUATCOPY(sms.new_quat, rv3d->viewquat);
sms.new_dist= rv3d->dist;
sms.new_lens= v3d->lens;
sms.to_camera= 0;
@ -222,27 +218,27 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
if(lens) sms.new_lens= *lens;
if (camera) {
view_settings_from_ob(scene, camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens);
view_settings_from_ob(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens);
sms.to_camera= 1; /* restore view3d values in end */
}
if (C && U.smooth_viewtx) {
int changed = 0; /* zero means no difference */
if (sms.new_dist != v3d->dist)
if (sms.new_dist != rv3d->dist)
changed = 1;
if (sms.new_lens != v3d->lens)
changed = 1;
if ((sms.new_ofs[0]!=v3d->ofs[0]) ||
(sms.new_ofs[1]!=v3d->ofs[1]) ||
(sms.new_ofs[2]!=v3d->ofs[2]) )
if ((sms.new_ofs[0]!=rv3d->ofs[0]) ||
(sms.new_ofs[1]!=rv3d->ofs[1]) ||
(sms.new_ofs[2]!=rv3d->ofs[2]) )
changed = 1;
if ((sms.new_quat[0]!=v3d->viewquat[0]) ||
(sms.new_quat[1]!=v3d->viewquat[1]) ||
(sms.new_quat[2]!=v3d->viewquat[2]) ||
(sms.new_quat[3]!=v3d->viewquat[3]) )
if ((sms.new_quat[0]!=rv3d->viewquat[0]) ||
(sms.new_quat[1]!=rv3d->viewquat[1]) ||
(sms.new_quat[2]!=rv3d->viewquat[2]) ||
(sms.new_quat[3]!=rv3d->viewquat[3]) )
changed = 1;
/* The new view is different from the old one
@ -268,30 +264,30 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
/* original values */
if (oldcamera) {
sms.orig_dist= v3d->dist; // below function does weird stuff with it...
view_settings_from_ob(scene, oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens);
sms.orig_dist= rv3d->dist; // below function does weird stuff with it...
view_settings_from_ob(oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens);
}
else {
VECCOPY(sms.orig_ofs, v3d->ofs);
QUATCOPY(sms.orig_quat, v3d->viewquat);
sms.orig_dist= v3d->dist;
VECCOPY(sms.orig_ofs, rv3d->ofs);
QUATCOPY(sms.orig_quat, rv3d->viewquat);
sms.orig_dist= rv3d->dist;
sms.orig_lens= v3d->lens;
}
/* grid draw as floor */
sms.orig_view= v3d->view;
v3d->view= 0;
sms.orig_view= rv3d->view;
rv3d->view= 0;
/* ensure it shows correct */
if(sms.to_camera) v3d->persp= V3D_PERSP;
if(sms.to_camera) rv3d->persp= V3D_PERSP;
/* keep track of running timer! */
if(v3d->sms==NULL)
v3d->sms= MEM_mallocN(sizeof(struct SmoothViewStore), "smoothview v3d");
*v3d->sms= sms;
if(v3d->smooth_timer)
WM_event_remove_window_timer(CTX_wm_window(C), v3d->smooth_timer);
if(rv3d->sms==NULL)
rv3d->sms= MEM_mallocN(sizeof(struct SmoothViewStore), "smoothview v3d");
*rv3d->sms= sms;
if(rv3d->smooth_timer)
WM_event_remove_window_timer(CTX_wm_window(C), rv3d->smooth_timer);
/* TIMER1 is hardcoded in keymap */
v3d->smooth_timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER1, 1.0/30.0); /* max 30 frs/sec */
rv3d->smooth_timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER1, 1.0/30.0); /* max 30 frs/sec */
return;
}
@ -299,9 +295,9 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
/* if we get here nothing happens */
if(sms.to_camera==0) {
VECCOPY(v3d->ofs, sms.new_ofs);
QUATCOPY(v3d->viewquat, sms.new_quat);
v3d->dist = sms.new_dist;
VECCOPY(rv3d->ofs, sms.new_ofs);
QUATCOPY(rv3d->viewquat, sms.new_quat);
rv3d->dist = sms.new_dist;
v3d->lens = sms.new_lens;
}
ED_region_tag_redraw(CTX_wm_region(C));
@ -310,40 +306,41 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
/* only meant for timer usage */
static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
View3D *v3d= (View3D *)CTX_wm_space_data(C);
struct SmoothViewStore *sms= v3d->sms;
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
struct SmoothViewStore *sms= rv3d->sms;
double step, step_inv;
/* escape if not our timer */
if(v3d->smooth_timer==NULL || v3d->smooth_timer!=event->customdata)
if(rv3d->smooth_timer==NULL || rv3d->smooth_timer!=event->customdata)
return OPERATOR_PASS_THROUGH;
step = (v3d->smooth_timer->duration)/sms->time_allowed;
step = (rv3d->smooth_timer->duration)/sms->time_allowed;
/* end timer */
if(step >= 1.0f) {
/* if we went to camera, store the original */
if(sms->to_camera) {
v3d->persp= V3D_CAMOB;
VECCOPY(v3d->ofs, sms->orig_ofs);
QUATCOPY(v3d->viewquat, sms->orig_quat);
v3d->dist = sms->orig_dist;
rv3d->persp= V3D_CAMOB;
VECCOPY(rv3d->ofs, sms->orig_ofs);
QUATCOPY(rv3d->viewquat, sms->orig_quat);
rv3d->dist = sms->orig_dist;
v3d->lens = sms->orig_lens;
}
else {
VECCOPY(v3d->ofs, sms->new_ofs);
QUATCOPY(v3d->viewquat, sms->new_quat);
v3d->dist = sms->new_dist;
VECCOPY(rv3d->ofs, sms->new_ofs);
QUATCOPY(rv3d->viewquat, sms->new_quat);
rv3d->dist = sms->new_dist;
v3d->lens = sms->new_lens;
}
v3d->view= sms->orig_view;
rv3d->view= sms->orig_view;
MEM_freeN(v3d->sms);
v3d->sms= NULL;
MEM_freeN(rv3d->sms);
rv3d->sms= NULL;
WM_event_remove_window_timer(CTX_wm_window(C), v3d->smooth_timer);
v3d->smooth_timer= NULL;
WM_event_remove_window_timer(CTX_wm_window(C), rv3d->smooth_timer);
rv3d->smooth_timer= NULL;
}
else {
int i;
@ -355,11 +352,11 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
step_inv = 1.0-step;
for (i=0; i<3; i++)
v3d->ofs[i] = sms->new_ofs[i]*step + sms->orig_ofs[i]*step_inv;
rv3d->ofs[i] = sms->new_ofs[i]*step + sms->orig_ofs[i]*step_inv;
QuatInterpol(v3d->viewquat, sms->orig_quat, sms->new_quat, step);
QuatInterpol(rv3d->viewquat, sms->orig_quat, sms->new_quat, step);
v3d->dist = sms->new_dist*step + sms->orig_dist*step_inv;
rv3d->dist = sms->new_dist*step + sms->orig_dist*step_inv;
v3d->lens = sms->new_lens*step + sms->orig_lens*step_inv;
}
@ -380,27 +377,25 @@ void VIEW3D_OT_smoothview(wmOperatorType *ot)
ot->poll= ED_operator_view3d_active;
}
static int view3d_setcameratoview_exec(bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
Object *ob;
float dvec[3];
ob= v3d->camera;
dvec[0]= v3d->dist*v3d->viewinv[2][0];
dvec[1]= v3d->dist*v3d->viewinv[2][1];
dvec[2]= v3d->dist*v3d->viewinv[2][2];
dvec[0]= rv3d->dist*rv3d->viewinv[2][0];
dvec[1]= rv3d->dist*rv3d->viewinv[2][1];
dvec[2]= rv3d->dist*rv3d->viewinv[2][2];
VECCOPY(ob->loc, dvec);
VecSubf(ob->loc, ob->loc, v3d->ofs);
v3d->viewquat[0]= -v3d->viewquat[0];
/* */
/*if (ob->transflag & OB_QUAT) {
QUATCOPY(ob->quat, v3d->viewquat);
} else {*/
QuatToEul(v3d->viewquat, ob->rot);
/*}*/
v3d->viewquat[0]= -v3d->viewquat[0];
rv3d->viewquat[0]= -rv3d->viewquat[0];
QuatToEul(rv3d->viewquat, ob->rot);
rv3d->viewquat[0]= -rv3d->viewquat[0];
ob->recalc= OB_RECALC_OB;
@ -409,6 +404,7 @@ static int view3d_setcameratoview_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
void VIEW3D_OT_setcameratoview(wmOperatorType *ot)
{
@ -426,23 +422,24 @@ void VIEW3D_OT_setcameratoview(wmOperatorType *ot)
/* create intersection coordinates in view Z direction at mouse coordinates */
void viewline(ARegion *ar, View3D *v3d, short mval[2], float ray_start[3], float ray_end[3])
{
RegionView3D *rv3d= ar->regiondata;
float vec[4];
if(v3d->persp != V3D_ORTHO){
if(rv3d->persp != V3D_ORTHO){
vec[0]= 2.0f * mval[0] / ar->winx - 1;
vec[1]= 2.0f * mval[1] / ar->winy - 1;
vec[2]= -1.0f;
vec[3]= 1.0f;
Mat4MulVec4fl(v3d->persinv, vec);
Mat4MulVec4fl(rv3d->persinv, vec);
VecMulf(vec, 1.0f / vec[3]);
VECCOPY(ray_start, v3d->viewinv[3]);
VECCOPY(ray_start, rv3d->viewinv[3]);
VECSUB(vec, vec, ray_start);
Normalize(vec);
VECADDFAC(ray_start, v3d->viewinv[3], vec, v3d->near);
VECADDFAC(ray_end, v3d->viewinv[3], vec, v3d->far);
VECADDFAC(ray_start, rv3d->viewinv[3], vec, v3d->near);
VECADDFAC(ray_end, rv3d->viewinv[3], vec, v3d->far);
}
else {
vec[0] = 2.0f * mval[0] / ar->winx - 1;
@ -450,10 +447,10 @@ void viewline(ARegion *ar, View3D *v3d, short mval[2], float ray_start[3], float
vec[2] = 0.0f;
vec[3] = 1.0f;
Mat4MulVec4fl(v3d->persinv, vec);
Mat4MulVec4fl(rv3d->persinv, vec);
VECADDFAC(ray_start, vec, v3d->viewinv[2], 1000.0f);
VECADDFAC(ray_end, vec, v3d->viewinv[2], -1000.0f);
VECADDFAC(ray_start, vec, rv3d->viewinv[2], 1000.0f);
VECADDFAC(ray_end, vec, rv3d->viewinv[2], -1000.0f);
}
}
@ -468,38 +465,40 @@ void viewray(ARegion *ar, View3D *v3d, short mval[2], float ray_start[3], float
}
void initgrabz(View3D *v3d, float x, float y, float z)
void initgrabz(RegionView3D *rv3d, float x, float y, float z)
{
if(v3d==NULL) return;
v3d->zfac= v3d->persmat[0][3]*x+ v3d->persmat[1][3]*y+ v3d->persmat[2][3]*z+ v3d->persmat[3][3];
if(rv3d==NULL) return;
rv3d->zfac= rv3d->persmat[0][3]*x+ rv3d->persmat[1][3]*y+ rv3d->persmat[2][3]*z+ rv3d->persmat[3][3];
/* if x,y,z is exactly the viewport offset, zfac is 0 and we don't want that
* (accounting for near zero values)
* */
if (v3d->zfac < 1.e-6f && v3d->zfac > -1.e-6f) v3d->zfac = 1.0f;
if (rv3d->zfac < 1.e-6f && rv3d->zfac > -1.e-6f) rv3d->zfac = 1.0f;
/* Negative zfac means x, y, z was behind the camera (in perspective).
* This gives flipped directions, so revert back to ok default case.
*/
if (v3d->zfac < 0.0f) v3d->zfac = 1.0f;
if (rv3d->zfac < 0.0f) rv3d->zfac = 1.0f;
}
void window_to_3d(ARegion *ar, View3D *v3d, float *vec, short mx, short my)
void window_to_3d(ARegion *ar, float *vec, short mx, short my)
{
RegionView3D *rv3d= ar->regiondata;
/* always call initgrabz */
float dx, dy;
dx= 2.0f*mx*v3d->zfac/ar->winx;
dy= 2.0f*my*v3d->zfac/ar->winy;
dx= 2.0f*mx*rv3d->zfac/ar->winx;
dy= 2.0f*my*rv3d->zfac/ar->winy;
vec[0]= (v3d->persinv[0][0]*dx + v3d->persinv[1][0]*dy);
vec[1]= (v3d->persinv[0][1]*dx + v3d->persinv[1][1]*dy);
vec[2]= (v3d->persinv[0][2]*dx + v3d->persinv[1][2]*dy);
vec[0]= (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy);
vec[1]= (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy);
vec[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy);
}
float read_cached_depth(ViewContext *vc, int x, int y)
{
ViewDepths *vd = vc->v3d->depths;
ViewDepths *vd = vc->rv3d->depths;
y -= vc->ar->winrct.ymin;
@ -511,29 +510,30 @@ float read_cached_depth(ViewContext *vc, int x, int y)
void request_depth_update(ViewContext *vc)
{
if(vc->v3d->depths)
vc->v3d->depths->damaged= 1;
if(vc->rv3d->depths)
vc->rv3d->depths->damaged= 1;
}
void view3d_get_object_project_mat(View3D *v3d, Object *ob, float pmat[4][4], float vmat[4][4])
void view3d_get_object_project_mat(RegionView3D *rv3d, Object *ob, float pmat[4][4], float vmat[4][4])
{
Mat4MulMat4(vmat, ob->obmat, v3d->viewmat);
Mat4MulMat4(pmat, vmat, v3d->winmat);
Mat4MulMat4(vmat, ob->obmat, rv3d->viewmat);
Mat4MulMat4(pmat, vmat, rv3d->winmat);
Mat4CpyMat4(vmat, ob->obmat);
}
/* projectmat brings it to window coords, wmat to rotated world space */
void view3d_project_short_clip(ARegion *ar, View3D *v3d, float *vec, short *adr, float projmat[4][4], float wmat[4][4])
void view3d_project_short_clip(ARegion *ar, float *vec, short *adr, float projmat[4][4], float wmat[4][4])
{
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
adr[0]= IS_CLIPPED;
/* clipplanes in eye space */
if(v3d->flag & V3D_CLIPPING) {
if(rv3d->rflag & RV3D_CLIPPING) {
VECCOPY(vec4, vec);
Mat4MulVecfl(wmat, vec4);
if(view3d_test_clipping(v3d, vec4))
if(view3d_test_clipping(rv3d, vec4))
return;
}
@ -602,7 +602,7 @@ void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4])
}
}
int boundbox_clip(View3D *v3d, float obmat[][4], BoundBox *bb)
int boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb)
{
/* return 1: draw */
@ -613,7 +613,7 @@ int boundbox_clip(View3D *v3d, float obmat[][4], BoundBox *bb)
if(bb==NULL) return 1;
if(bb->flag & OB_BB_DISABLED) return 1;
Mat4MulMat4(mat, obmat, v3d->persmat);
Mat4MulMat4(mat, obmat, rv3d->persmat);
for(a=0; a<8; a++) {
VECCOPY(vec, bb->vec[a]);
@ -637,20 +637,21 @@ int boundbox_clip(View3D *v3d, float obmat[][4], BoundBox *bb)
return 0;
}
void project_short(ARegion *ar, View3D *v3d, float *vec, short *adr) /* clips */
void project_short(ARegion *ar, float *vec, short *adr) /* clips */
{
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
adr[0]= IS_CLIPPED;
if(v3d->flag & V3D_CLIPPING) {
if(view3d_test_clipping(v3d, vec))
if(rv3d->rflag & RV3D_CLIPPING) {
if(view3d_test_clipping(rv3d, vec))
return;
}
VECCOPY(vec4, vec);
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
if( vec4[3]>BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
@ -667,15 +668,16 @@ void project_short(ARegion *ar, View3D *v3d, float *vec, short *adr) /* clips */
}
}
void project_int(ARegion *ar, View3D *v3d, float *vec, int *adr)
void project_int(ARegion *ar, float *vec, int *adr)
{
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
adr[0]= (int)2140000000.0f;
VECCOPY(vec4, vec);
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
if( vec4[3]>BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
@ -691,14 +693,15 @@ void project_int(ARegion *ar, View3D *v3d, float *vec, int *adr)
}
}
void project_int_noclip(ARegion *ar, View3D *v3d, float *vec, int *adr)
void project_int_noclip(ARegion *ar, float *vec, int *adr)
{
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
VECCOPY(vec4, vec);
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
if( fabs(vec4[3]) > BL_NEAR_CLIP ) {
fx = (ar->winx/2)*(1 + vec4[0]/vec4[3]);
@ -714,15 +717,16 @@ void project_int_noclip(ARegion *ar, View3D *v3d, float *vec, int *adr)
}
}
void project_short_noclip(ARegion *ar, View3D *v3d, float *vec, short *adr)
void project_short_noclip(ARegion *ar, float *vec, short *adr)
{
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
adr[0]= IS_CLIPPED;
VECCOPY(vec4, vec);
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
if( vec4[3]>BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
@ -739,15 +743,16 @@ void project_short_noclip(ARegion *ar, View3D *v3d, float *vec, short *adr)
}
}
void project_float(ARegion *ar, View3D *v3d, float *vec, float *adr)
void project_float(ARegion *ar, float *vec, float *adr)
{
RegionView3D *rv3d= ar->regiondata;
float vec4[4];
adr[0]= IS_CLIPPED;
VECCOPY(vec4, vec);
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
if( vec4[3]>BL_NEAR_CLIP ) {
adr[0] = (float)(ar->winx/2.0)+(ar->winx/2.0)*vec4[0]/vec4[3];
@ -755,14 +760,15 @@ void project_float(ARegion *ar, View3D *v3d, float *vec, float *adr)
}
}
void project_float_noclip(ARegion *ar, View3D *v3d, float *vec, float *adr)
void project_float_noclip(ARegion *ar, float *vec, float *adr)
{
RegionView3D *rv3d= ar->regiondata;
float vec4[4];
VECCOPY(vec4, vec);
vec4[3]= 1.0;
Mat4MulVec4fl(v3d->persmat, vec4);
Mat4MulVec4fl(rv3d->persmat, vec4);
if( fabs(vec4[3]) > BL_NEAR_CLIP ) {
adr[0] = (float)(ar->winx/2.0)+(ar->winx/2.0)*vec4[0]/vec4[3];
@ -778,7 +784,7 @@ void project_float_noclip(ARegion *ar, View3D *v3d, float *vec, float *adr)
/* also exposed in previewrender.c */
int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize)
int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize)
{
Camera *cam=NULL;
float lens, fac, x1, y1, x2, y2;
@ -790,7 +796,7 @@ int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, flo
*clipsta= v3d->near;
*clipend= v3d->far;
if(v3d->persp==V3D_CAMOB) {
if(rv3d->persp==V3D_CAMOB) {
if(v3d->camera) {
if(v3d->camera->type==OB_LAMP ) {
Lamp *la;
@ -813,13 +819,13 @@ int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, flo
}
}
if(v3d->persp==V3D_ORTHO) {
if(winx>winy) x1= -v3d->dist;
else x1= -winx*v3d->dist/winy;
if(rv3d->persp==V3D_ORTHO) {
if(winx>winy) x1= -rv3d->dist;
else x1= -winx*rv3d->dist/winy;
x2= -x1;
if(winx>winy) y1= -winy*v3d->dist/winx;
else y1= -v3d->dist;
if(winx>winy) y1= -winy*rv3d->dist/winx;
else y1= -rv3d->dist;
y2= -y1;
*clipend *= 0.5; // otherwise too extreme low zbuffer quality
@ -828,8 +834,8 @@ int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, flo
}
else {
/* fac for zoom, also used for camdx */
if(v3d->persp==V3D_CAMOB) {
fac= (1.41421+( (float)v3d->camzoom )/50.0);
if(rv3d->persp==V3D_CAMOB) {
fac= (1.41421+( (float)rv3d->camzoom )/50.0);
fac*= fac;
}
else fac= 2.0;
@ -862,8 +868,8 @@ int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, flo
}
/* cam view offset */
if(cam) {
float dx= 0.5*fac*v3d->camdx*(x2-x1);
float dy= 0.5*fac*v3d->camdy*(y2-y1);
float dx= 0.5*fac*rv3d->camdx*(x2-x1);
float dy= 0.5*fac*rv3d->camdy*(y2-y1);
x1+= dx;
x2+= dx;
y1+= dy;
@ -894,13 +900,14 @@ int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, flo
/* important to not set windows active in here, can be renderwin for example */
void setwinmatrixview3d(View3D *v3d, int winx, int winy, rctf *rect) /* rect: for picking */
void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect) /* rect: for picking */
{
RegionView3D *rv3d= ar->regiondata;
rctf viewplane;
float clipsta, clipend, x1, y1, x2, y2;
int orth;
orth= get_view3d_viewplane(v3d, winx, winy, &viewplane, &clipsta, &clipend, NULL);
orth= get_view3d_viewplane(v3d, rv3d, ar->winx, ar->winy, &viewplane, &clipsta, &clipend, NULL);
// printf("%d %d %f %f %f %f %f %f\n", winx, winy, viewplane.xmin, viewplane.ymin, viewplane.xmax, viewplane.ymax, clipsta, clipend);
x1= viewplane.xmin;
y1= viewplane.ymin;
@ -908,13 +915,13 @@ void setwinmatrixview3d(View3D *v3d, int winx, int winy, rctf *rect) /* rect: f
y2= viewplane.ymax;
if(rect) { /* picking */
rect->xmin/= (float)winx;
rect->xmin/= (float)ar->winx;
rect->xmin= x1+rect->xmin*(x2-x1);
rect->ymin/= (float)winy;
rect->ymin/= (float)ar->winy;
rect->ymin= y1+rect->ymin*(y2-y1);
rect->xmax/= (float)winx;
rect->xmax/= (float)ar->winx;
rect->xmax= x1+rect->xmax*(x2-x1);
rect->ymax/= (float)winy;
rect->ymax/= (float)ar->winy;
rect->ymax= y1+rect->ymax*(y2-y1);
if(orth) wmOrtho(rect->xmin, rect->xmax, rect->ymin, rect->ymax, -clipend, clipend);
@ -928,71 +935,71 @@ void setwinmatrixview3d(View3D *v3d, int winx, int winy, rctf *rect) /* rect: f
/* not sure what this was for? (ton) */
glMatrixMode(GL_PROJECTION);
wmGetMatrix(v3d->winmat);
wmGetMatrix(rv3d->winmat);
glMatrixMode(GL_MODELVIEW);
}
static void obmat_to_viewmat(Scene *scene, View3D *v3d, Object *ob, short smooth)
static void obmat_to_viewmat(View3D *v3d, RegionView3D *rv3d, Object *ob, short smooth)
{
float bmat[4][4];
float tmat[3][3];
v3d->view= 0; /* dont show the grid */
rv3d->view= 0; /* dont show the grid */
Mat4CpyMat4(bmat, ob->obmat);
Mat4Ortho(bmat);
Mat4Invert(v3d->viewmat, bmat);
Mat4Invert(rv3d->viewmat, bmat);
/* view quat calculation, needed for add object */
Mat3CpyMat4(tmat, v3d->viewmat);
Mat3CpyMat4(tmat, rv3d->viewmat);
if (smooth) {
float new_quat[4];
if (v3d->persp==V3D_CAMOB && v3d->camera) {
if (rv3d->persp==V3D_CAMOB && v3d->camera) {
/* were from a camera view */
float orig_ofs[3];
float orig_dist= v3d->dist;
float orig_dist= rv3d->dist;
float orig_lens= v3d->lens;
VECCOPY(orig_ofs, v3d->ofs);
VECCOPY(orig_ofs, rv3d->ofs);
/* Switch from camera view */
Mat3ToQuat(tmat, new_quat);
v3d->persp=V3D_PERSP;
v3d->dist= 0.0;
rv3d->persp=V3D_PERSP;
rv3d->dist= 0.0;
view_settings_from_ob(scene, v3d->camera, v3d->ofs, NULL, NULL, &v3d->lens);
view_settings_from_ob(v3d->camera, rv3d->ofs, NULL, NULL, &v3d->lens);
smooth_view(NULL, NULL, NULL, orig_ofs, new_quat, &orig_dist, &orig_lens); // XXX
v3d->persp=V3D_CAMOB; /* just to be polite, not needed */
rv3d->persp=V3D_CAMOB; /* just to be polite, not needed */
} else {
Mat3ToQuat(tmat, new_quat);
smooth_view(NULL, NULL, NULL, NULL, new_quat, NULL, NULL); // XXX
}
} else {
Mat3ToQuat(tmat, v3d->viewquat);
Mat3ToQuat(tmat, rv3d->viewquat);
}
}
/* dont set windows active in in here, is used by renderwin too */
void setviewmatrixview3d(Scene *scene, View3D *v3d)
void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d)
{
if(v3d->persp==V3D_CAMOB) { /* obs/camera */
if(rv3d->persp==V3D_CAMOB) { /* obs/camera */
if(v3d->camera) {
where_is_object(scene, v3d->camera);
obmat_to_viewmat(scene, v3d, v3d->camera, 0);
obmat_to_viewmat(v3d, rv3d, v3d->camera, 0);
}
else {
QuatToMat4(v3d->viewquat, v3d->viewmat);
v3d->viewmat[3][2]-= v3d->dist;
QuatToMat4(rv3d->viewquat, rv3d->viewmat);
rv3d->viewmat[3][2]-= rv3d->dist;
}
}
else {
QuatToMat4(v3d->viewquat, v3d->viewmat);
if(v3d->persp==V3D_PERSP) v3d->viewmat[3][2]-= v3d->dist;
QuatToMat4(rv3d->viewquat, rv3d->viewmat);
if(rv3d->persp==V3D_PERSP) rv3d->viewmat[3][2]-= rv3d->dist;
if(v3d->ob_centre) {
Object *ob= v3d->ob_centre;
float vec[3];
@ -1005,9 +1012,9 @@ void setviewmatrixview3d(Scene *scene, View3D *v3d)
Mat4MulVecfl(ob->obmat, vec);
}
}
i_translate(-vec[0], -vec[1], -vec[2], v3d->viewmat);
i_translate(-vec[0], -vec[1], -vec[2], rv3d->viewmat);
}
else i_translate(v3d->ofs[0], v3d->ofs[1], v3d->ofs[2], v3d->viewmat);
else i_translate(rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2], rv3d->viewmat);
}
}
@ -1040,16 +1047,16 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
rect.ymax= input->ymax;
}
setwinmatrixview3d(v3d, ar->winx, ar->winy, &rect);
Mat4MulMat4(v3d->persmat, v3d->viewmat, v3d->winmat);
setwinmatrixview3d(ar, v3d, &rect);
Mat4MulMat4(vc->rv3d->persmat, vc->rv3d->viewmat, vc->rv3d->winmat);
if(v3d->drawtype > OB_WIRE) {
v3d->zbuf= TRUE;
glEnable(GL_DEPTH_TEST);
}
if(v3d->flag & V3D_CLIPPING)
view3d_set_clipping(v3d);
if(vc->rv3d->rflag & RV3D_CLIPPING)
view3d_set_clipping(vc->rv3d);
glSelectBuffer( bufsize, (GLuint *)buffer);
glRenderMode(GL_SELECT);
@ -1107,8 +1114,8 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
hits= glRenderMode(GL_RENDER);
G.f &= ~G_PICKSEL;
setwinmatrixview3d(v3d, ar->winx, ar->winy, NULL);
Mat4MulMat4(v3d->persmat, v3d->viewmat, v3d->winmat);
setwinmatrixview3d(ar, v3d, NULL);
Mat4MulMat4(vc->rv3d->persmat, vc->rv3d->viewmat, vc->rv3d->winmat);
if(v3d->drawtype > OB_WIRE) {
v3d->zbuf= 0;
@ -1116,7 +1123,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
}
// XXX persp(PERSP_WIN);
if(v3d->flag & V3D_CLIPPING)
if(vc->rv3d->rflag & RV3D_CLIPPING)
view3d_clr_clipping();
if(hits<0) printf("Too many objects in select buffer\n"); // XXX make error message
@ -1162,6 +1169,7 @@ static unsigned int free_localbit(void)
void initlocalview(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
Base *base;
float size = 0.0, min[3], max[3], afm[3];
unsigned int locallay;
@ -1210,25 +1218,25 @@ void initlocalview(Scene *scene, ARegion *ar, View3D *v3d)
v3d->localvd= MEM_mallocN(sizeof(View3D), "localview");
memcpy(v3d->localvd, v3d, sizeof(View3D));
v3d->ofs[0]= -(min[0]+max[0])/2.0;
v3d->ofs[1]= -(min[1]+max[1])/2.0;
v3d->ofs[2]= -(min[2]+max[2])/2.0;
rv3d->ofs[0]= -(min[0]+max[0])/2.0;
rv3d->ofs[1]= -(min[1]+max[1])/2.0;
rv3d->ofs[2]= -(min[2]+max[2])/2.0;
v3d->dist= size;
rv3d->dist= size;
// correction for window aspect ratio
if(ar->winy>2 && ar->winx>2) {
size= (float)ar->winx/(float)ar->winy;
if(size<1.0) size= 1.0/size;
v3d->dist*= size;
rv3d->dist*= size;
}
if (v3d->persp==V3D_CAMOB) v3d->persp= V3D_PERSP;
if (rv3d->persp==V3D_CAMOB) rv3d->persp= V3D_PERSP;
if (v3d->near> 0.1) v3d->near= 0.1;
v3d->cursor[0]= -v3d->ofs[0];
v3d->cursor[1]= -v3d->ofs[1];
v3d->cursor[2]= -v3d->ofs[2];
v3d->cursor[0]= -rv3d->ofs[0];
v3d->cursor[1]= -rv3d->ofs[1];
v3d->cursor[2]= -rv3d->ofs[2];
v3d->lay= locallay;
@ -1259,16 +1267,12 @@ void restore_localviewdata(View3D *vd)
if(vd->localvd==0) return;
VECCOPY(vd->ofs, vd->localvd->ofs);
vd->dist= vd->localvd->dist;
vd->persp= vd->localvd->persp;
vd->view= vd->localvd->view;
vd->near= vd->localvd->near;
vd->far= vd->localvd->far;
vd->lay= vd->localvd->lay;
vd->layact= vd->localvd->layact;
vd->drawtype= vd->localvd->drawtype;
vd->camera= vd->localvd->camera;
QUATCOPY(vd->viewquat, vd->localvd->viewquat);
}
@ -1315,7 +1319,7 @@ void endlocalview(Scene *scene, ScrArea *sa)
}
}
void view3d_align_axis_to_vector(Scene *scene, View3D *v3d, int axisidx, float vec[3])
void view3d_align_axis_to_vector(View3D *v3d, RegionView3D *rv3d, int axisidx, float vec[3])
{
float alignaxis[3] = {0.0, 0.0, 0.0};
float norm[3], axis[3], angle, new_quat[4];
@ -1330,21 +1334,21 @@ void view3d_align_axis_to_vector(Scene *scene, View3D *v3d, int axisidx, float v
Crossf(axis, alignaxis, norm);
VecRotToQuat(axis, -angle, new_quat);
v3d->view= 0;
rv3d->view= 0;
if (v3d->persp==V3D_CAMOB && v3d->camera) {
if (rv3d->persp==V3D_CAMOB && v3d->camera) {
/* switch out of camera view */
float orig_ofs[3];
float orig_dist= v3d->dist;
float orig_dist= rv3d->dist;
float orig_lens= v3d->lens;
VECCOPY(orig_ofs, v3d->ofs);
v3d->persp= V3D_PERSP;
v3d->dist= 0.0;
view_settings_from_ob(scene, v3d->camera, v3d->ofs, NULL, NULL, &v3d->lens);
VECCOPY(orig_ofs, rv3d->ofs);
rv3d->persp= V3D_PERSP;
rv3d->dist= 0.0;
view_settings_from_ob(v3d->camera, rv3d->ofs, NULL, NULL, &v3d->lens);
smooth_view(NULL, NULL, NULL, orig_ofs, new_quat, &orig_dist, &orig_lens); // XXX
} else {
if (v3d->persp==V3D_CAMOB) v3d->persp= V3D_PERSP; /* switch out of camera mode */
if (rv3d->persp==V3D_CAMOB) rv3d->persp= V3D_PERSP; /* switch out of camera mode */
smooth_view(NULL, NULL, NULL, NULL, new_quat, NULL, NULL); // XXX
}
}

@ -781,7 +781,7 @@ static int calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], floa
short vertco[2];
if(vp->flag & VP_SOFT) {
project_short_noclip(vc->ar, vc->v3d, vert_nor, vertco);
project_short_noclip(vc->ar, vert_nor, vertco);
dx= mval[0]-vertco[0];
dy= mval[1]-vertco[1];
@ -975,20 +975,20 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
else {
/* calc 3 or 4 corner weights */
dm->getVertCo(dm, mface->v1, co);
project_short_noclip(ar, v3d, co, sco);
project_short_noclip(ar, co, sco);
w1= ((mval[0]-sco[0])*(mval[0]-sco[0]) + (mval[1]-sco[1])*(mval[1]-sco[1]));
dm->getVertCo(dm, mface->v2, co);
project_short_noclip(ar, v3d, co, sco);
project_short_noclip(ar, co, sco);
w2= ((mval[0]-sco[0])*(mval[0]-sco[0]) + (mval[1]-sco[1])*(mval[1]-sco[1]));
dm->getVertCo(dm, mface->v3, co);
project_short_noclip(ar, v3d, co, sco);
project_short_noclip(ar, co, sco);
w3= ((mval[0]-sco[0])*(mval[0]-sco[0]) + (mval[1]-sco[1])*(mval[1]-sco[1]));
if(mface->v4) {
dm->getVertCo(dm, mface->v4, co);
project_short_noclip(ar, v3d, co, sco);
project_short_noclip(ar, co, sco);
w4= ((mval[0]-sco[0])*(mval[0]-sco[0]) + (mval[1]-sco[1])*(mval[1]-sco[1]));
}
else w4= 1.0e10;
@ -1235,9 +1235,9 @@ static int wpaint_modal(bContext *C, wmOperator *op, wmEvent *event)
/* load projection matrix */
wmMultMatrix(ob->obmat);
wmGetSingleMatrix(mat);
wmLoadMatrix(wpd->vc.v3d->viewmat);
wmLoadMatrix(wpd->vc.rv3d->viewmat);
MTC_Mat4SwapMat4(wpd->vc.v3d->persmat, mat);
MTC_Mat4SwapMat4(wpd->vc.rv3d->persmat, mat);
mval[0]= event->x - vc->ar->winrct.xmin;
mval[1]= event->y - vc->ar->winrct.ymin;
@ -1357,7 +1357,7 @@ static int wpaint_modal(bContext *C, wmOperator *op, wmEvent *event)
}
}
MTC_Mat4SwapMat4(vc->v3d->persmat, mat);
MTC_Mat4SwapMat4(vc->rv3d->persmat, mat);
DAG_object_flush_update(vc->scene, ob, OB_RECALC_DATA);
ED_region_tag_redraw(vc->ar);
@ -1431,7 +1431,7 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
// if(ob->lay & v3d->lay); else error("Active object is not in this layer");
/* imat for normals */
Mat4MulMat4(mat, ob->obmat, wpd->vc.v3d->viewmat);
Mat4MulMat4(mat, ob->obmat, wpd->vc.rv3d->viewmat);
Mat4Invert(imat, mat);
Mat3CpyMat4(wpd->wpimat, imat);
@ -1662,7 +1662,7 @@ static int vpaint_modal(bContext *C, wmOperator *op, wmEvent *event)
/* load projection matrix */
wmMultMatrix(ob->obmat);
wmGetSingleMatrix(mat);
wmLoadMatrix(vc->v3d->viewmat);
wmLoadMatrix(vc->rv3d->viewmat);
mval[0]= event->x - vc->ar->winrct.xmin;
mval[1]= event->y - vc->ar->winrct.ymin;
@ -1677,7 +1677,7 @@ static int vpaint_modal(bContext *C, wmOperator *op, wmEvent *event)
else totindex= 0;
}
MTC_Mat4SwapMat4(vc->v3d->persmat, mat);
MTC_Mat4SwapMat4(vc->rv3d->persmat, mat);
if(vp->flag & VP_COLINDEX) {
for(index=0; index<totindex; index++) {
@ -1737,7 +1737,7 @@ static int vpaint_modal(bContext *C, wmOperator *op, wmEvent *event)
}
}
MTC_Mat4SwapMat4(vc->v3d->persmat, mat);
MTC_Mat4SwapMat4(vc->rv3d->persmat, mat);
do_shared_vertexcol(me);
@ -1779,7 +1779,7 @@ static int vpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
copy_vpaint_prev(vp, (unsigned int *)me->mcol, me->totface);
/* some old cruft to sort out later */
Mat4MulMat4(mat, ob->obmat, vpd->vc.v3d->viewmat);
Mat4MulMat4(mat, ob->obmat, vpd->vc.rv3d->viewmat);
Mat4Invert(imat, mat);
Mat3CpyMat4(vpd->vpimat, imat);

@ -164,13 +164,13 @@ static void helpline(TransInfo *t, float *vec)
void setTransformViewMatrices(TransInfo *t)
{
if(t->spacetype==SPACE_VIEW3D) {
View3D *v3d = t->view;
RegionView3D *rv3d = t->ar->regiondata;
Mat4CpyMat4(t->viewmat, v3d->viewmat);
Mat4CpyMat4(t->viewinv, v3d->viewinv);
Mat4CpyMat4(t->persmat, v3d->persmat);
Mat4CpyMat4(t->persinv, v3d->persinv);
t->persp = v3d->persp;
Mat4CpyMat4(t->viewmat, rv3d->viewmat);
Mat4CpyMat4(t->viewinv, rv3d->viewinv);
Mat4CpyMat4(t->persmat, rv3d->persmat);
Mat4CpyMat4(t->persinv, rv3d->persinv);
t->persp = rv3d->persp;
}
else {
Mat4One(t->viewmat);
@ -186,7 +186,7 @@ void setTransformViewMatrices(TransInfo *t)
void convertViewVec(TransInfo *t, float *vec, short dx, short dy)
{
if (t->spacetype==SPACE_VIEW3D) {
window_to_3d(t->ar, t->view, vec, dx, dy);
window_to_3d(t->ar, vec, dx, dy);
}
else if(t->spacetype==SPACE_IMAGE) {
View2D *v2d = t->view;
@ -230,7 +230,7 @@ void convertViewVec(TransInfo *t, float *vec, short dx, short dy)
void projectIntView(TransInfo *t, float *vec, int *adr)
{
if (t->spacetype==SPACE_VIEW3D) {
project_int_noclip(t->ar, t->view, vec, adr);
project_int_noclip(t->ar, vec, adr);
}
else if(t->spacetype==SPACE_IMAGE) {
float aspx, aspy, v[2];
@ -255,7 +255,7 @@ void projectIntView(TransInfo *t, float *vec, int *adr)
void projectFloatView(TransInfo *t, float *vec, float *adr)
{
if (t->spacetype==SPACE_VIEW3D) {
project_float_noclip(t->ar, t->view, vec, adr);
project_float_noclip(t->ar, vec, adr);
}
else if(t->spacetype==SPACE_IMAGE) {
int a[2];
@ -995,9 +995,9 @@ void initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
if(t->spacetype == SPACE_VIEW3D)
{
View3D *v3d = t->view;
RegionView3D *rv3d = t->ar->regiondata;
//calc_manipulator_stats(curarea);
Mat3CpyMat4(t->spacemtx, v3d->twmat);
Mat3CpyMat4(t->spacemtx, rv3d->twmat);
Mat3Ortho(t->spacemtx);
t->draw_handle = ED_region_draw_cb_activate(t->ar->type, drawTransform, t, REGION_DRAW_POST);

@ -442,7 +442,7 @@ void flushTransNodes(TransInfo *t);
/*********************** exported from transform_manipulator.c ********** */
void draw_manipulator_ext(struct ScrArea *sa, int type, char axis, int col, float vec[3], float mat[][3]);
int calc_manipulator_stats(struct ScrArea *sa);
float get_drawsize(struct View3D *v3d, struct ScrArea *sa, float *co);
float get_drawsize(struct ARegion *ar, float *co);
/*********************** TransData Creation and General Handling *********** */
void createTransData(struct bContext *C, TransInfo *t);

@ -745,9 +745,9 @@ void drawPropCircle(TransInfo *t)
if (t->spacetype == SPACE_VIEW3D)
{
View3D *v3d = t->view;
RegionView3D *rv3d = t->ar->regiondata;
Mat4CpyMat4(tmat, v3d->viewmat);
Mat4CpyMat4(tmat, rv3d->viewmat);
Mat4Invert(imat, tmat);
}
else

@ -4269,12 +4269,13 @@ void createTransData(bContext *C, TransInfo *t)
#endif
else {
View3D *v3d = t->view;
RegionView3D *rv3d = t->ar->regiondata;
t->flag &= ~T_PROP_EDIT; /* no proportional edit in object mode */
createTransObject(C, t);
t->flag |= T_OBJECT;
if((t->flag & T_OBJECT) && v3d->camera == OBACT && v3d->persp==V3D_CAMOB)
if((t->flag & T_OBJECT) && v3d->camera == OBACT && rv3d->persp==V3D_CAMOB)
{
t->flag |= T_CAMERA;
}

@ -1053,8 +1053,9 @@ void calculateCenter(TransInfo *t)
{
View3D *v3d = t->view;
Scene *scene = t->scene;
RegionView3D *rv3d = t->ar->regiondata;
if(v3d->camera == OBACT && v3d->persp==V3D_CAMOB)
if(v3d->camera == OBACT && rv3d->persp==V3D_CAMOB)
{
float axis[3];
/* persinv is nasty, use viewinv instead, always right */
@ -1087,10 +1088,10 @@ void calculateCenter(TransInfo *t)
VECCOPY(vec, t->center);
Mat4MulVecfl(ob->obmat, vec);
initgrabz(t->view, vec[0], vec[1], vec[2]);
initgrabz(t->ar->regiondata, vec[0], vec[1], vec[2]);
}
else {
initgrabz(t->view, t->center[0], t->center[1], t->center[2]);
initgrabz(t->ar->regiondata, t->center[0], t->center[1], t->center[2]);
}
}
}
@ -1200,23 +1201,24 @@ TransInfo *BIF_GetTransInfo()
return NULL;
}
float get_drawsize(View3D *v3d, ScrArea *sa, float *co)
float get_drawsize(ARegion *ar, float *co)
{
RegionView3D *rv3d= ar->regiondata;
float size, vec[3], len1, len2;
/* size calculus, depending ortho/persp settings, like initgrabz() */
size= v3d->persmat[0][3]*co[0]+ v3d->persmat[1][3]*co[1]+ v3d->persmat[2][3]*co[2]+ v3d->persmat[3][3];
size= rv3d->persmat[0][3]*co[0]+ rv3d->persmat[1][3]*co[1]+ rv3d->persmat[2][3]*co[2]+ rv3d->persmat[3][3];
VECCOPY(vec, v3d->persinv[0]);
VECCOPY(vec, rv3d->persinv[0]);
len1= Normalize(vec);
VECCOPY(vec, v3d->persinv[1]);
VECCOPY(vec, rv3d->persinv[1]);
len2= Normalize(vec);
size*= 0.01f*(len1>len2?len1:len2);
/* correct for window size to make widgets appear fixed size */
if(sa->winx > sa->winy) size*= 1000.0f/(float)sa->winx;
else size*= 1000.0f/(float)sa->winy;
if(ar->winx > ar->winy) size*= 1000.0f/(float)ar->winx;
else size*= 1000.0f/(float)ar->winy;
return size;
}

@ -1347,10 +1347,10 @@ static void draw_manipulator_rotate_cyl(float mat[][4], int moving, int drawflag
/* ********************************************* */
static float get_manipulator_drawsize(ScrArea *sa)
static float get_manipulator_drawsize(ARegion *ar)
{
View3D *v3d= sa->spacedata.first;
float size = get_drawsize(v3d, v3d->twmat[3]);
RegionView3D *rv3d= ar->regiondata;
float size = get_drawsize(ar, rv3d->twmat[3]);
size*= (float)U.tw_size;

@ -180,7 +180,7 @@ static int transform_invoke(bContext *C, wmOperator *op, wmEvent *event)
void TFM_OT_transform(struct wmOperatorType *ot)
{
static const float value[4] = {0, 0, 0};
static const float value[4] = {0, 0, 0, 0};
static const float mtx[3][3] = {{1, 0, 0},{0, 1, 0},{0, 0, 1}};
static EnumPropertyItem transform_mode_types[] = {
{TFM_INIT, "INIT", "Init", ""},

@ -177,7 +177,7 @@ int manageMeshSpace(bContext *C, int confirm, int set) {
}
if (createSpaceNormal(mat, normal) == 0) {
error("Cannot use vertex with zero-length normal");
// XXX error("Cannot use vertex with zero-length normal");
return -1;
}
@ -189,7 +189,7 @@ int manageMeshSpace(bContext *C, int confirm, int set) {
}
if (createSpaceNormalTangent(mat, normal, plane) == 0) {
error("Cannot use zero-length edge");
// XXX error("Cannot use zero-length edge");
return -1;
}
@ -201,7 +201,7 @@ int manageMeshSpace(bContext *C, int confirm, int set) {
}
if (createSpaceNormalTangent(mat, normal, plane) == 0) {
error("Cannot use zero-area face");
// XXX error("Cannot use zero-area face");
return -1;
}
@ -335,7 +335,7 @@ void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target) {
void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target) {
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
View3D *v3d = CTX_wm_area(C)->spacedata.first;
View3D *v3d = CTX_wm_view3d(C);
TransformOrientation *ts = transform_spaces->first;
int i;
@ -348,7 +348,7 @@ void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target) {
}
void BIF_selectTransformOrientationValue(bContext *C, int orientation) {
View3D *v3d = CTX_wm_area(C)->spacedata.first;
View3D *v3d = CTX_wm_view3d(C);
v3d->twmode = orientation;
}
@ -387,7 +387,8 @@ int BIF_countTransformOrientation(const bContext *C) {
void applyTransformOrientation(bContext *C, TransInfo *t) {
TransformOrientation *ts;
View3D *v3d = CTX_wm_area(C)->spacedata.first;
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
int i;
@ -396,7 +397,7 @@ void applyTransformOrientation(bContext *C, TransInfo *t) {
if (selected_index == i) {
strcpy(t->spacename, ts->name);
Mat3CpyMat3(t->spacemtx, ts->mat);
Mat4CpyMat3(v3d->twmat, ts->mat);
Mat4CpyMat3(rv3d->twmat, ts->mat);
break;
}
}
@ -429,7 +430,8 @@ static int count_bone_select(bArmature *arm, ListBase *lb, int do_it)
void initTransformOrientation(bContext *C, TransInfo *t)
{
View3D *v3d = CTX_wm_area(C)->spacedata.first;
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
Object *ob = CTX_data_active_object(C);
Object *obedit = CTX_data_active_object(C);
float normal[3]={0.0, 0.0, 0.0};
@ -479,28 +481,28 @@ void initTransformOrientation(bContext *C, TransInfo *t)
if (type == ORIENTATION_NONE)
{
Mat4One(v3d->twmat);
Mat4One(rv3d->twmat);
}
else
{
Mat4CpyMat3(v3d->twmat, mat);
Mat4CpyMat3(rv3d->twmat, mat);
}
break;
}
/* no break we define 'normal' as 'local' in Object mode */
case V3D_MANIP_LOCAL:
strcpy(t->spacename, "local");
Mat4CpyMat4(v3d->twmat, ob->obmat);
Mat4Ortho(v3d->twmat);
Mat4CpyMat4(rv3d->twmat, ob->obmat);
Mat4Ortho(rv3d->twmat);
break;
case V3D_MANIP_VIEW:
{
float mat[3][3];
strcpy(t->spacename, "view");
Mat3CpyMat4(mat, v3d->viewinv);
Mat3CpyMat4(mat, rv3d->viewinv);
Mat3Ortho(mat);
Mat4CpyMat3(v3d->twmat, mat);
Mat4CpyMat3(rv3d->twmat, mat);
}
break;
default: /* V3D_MANIP_CUSTOM */
@ -512,8 +514,7 @@ void initTransformOrientation(bContext *C, TransInfo *t)
int getTransformOrientation(bContext *C, float normal[3], float plane[3], int activeOnly)
{
Scene *scene = CTX_data_scene(C);
ScrArea *sa = CTX_wm_area(C);
View3D *v3d = sa->spacedata.first;
View3D *v3d = CTX_wm_view3d(C);
Object *obedit= CTX_data_edit_object(C);
Base *base;
Object *ob = OBACT;
@ -730,11 +731,11 @@ int getTransformOrientation(bContext *C, float normal[3], float plane[3], int ac
}
else if(obedit->type==OB_MBALL)
{
#if 0 // XXX
/* editmball.c */
extern ListBase editelems; /* go away ! */
MetaElem *ml, *ml_sel = NULL;
#if 0 // XXX
/* loop and check that only one element is selected */
for (ml = editelems.first; ml; ml = ml->next)
{
@ -750,7 +751,6 @@ int getTransformOrientation(bContext *C, float normal[3], float plane[3], int ac
}
}
}
#endif
if (ml_sel)
{
@ -766,6 +766,8 @@ int getTransformOrientation(bContext *C, float normal[3], float plane[3], int ac
result = ORIENTATION_NORMAL;
}
#endif
}
else if (obedit->type == OB_ARMATURE)
{

@ -135,16 +135,17 @@ void drawSnapping(TransInfo *t)
if (t->spacetype == SPACE_VIEW3D) {
View3D *v3d = t->view;
RegionView3D *rv3d= t->ar->regiondata;
float tmat[4][4], imat[4][4];
float size;
glDisable(GL_DEPTH_TEST);
size = get_drawsize(v3d, t->sa, t->tsnap.snapPoint);
size = get_drawsize(t->ar, t->tsnap.snapPoint);
size *= 0.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
Mat4CpyMat4(tmat, v3d->viewmat);
Mat4CpyMat4(tmat, rv3d->viewmat);
Mat4Invert(imat, tmat);
drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, size, imat);
@ -874,7 +875,7 @@ int snapDerivedMesh(TransInfo *t, Object *ob, DerivedMesh *dm, float obmat[][4],
new_depth = VecLenf(location, ray_start);
project_int(t->ar, t->view, location, screen_loc);
project_int(t->ar, location, screen_loc);
new_dist = abs(screen_loc[0] - mval[0]) + abs(screen_loc[1] - mval[1]);
if (new_dist <= *dist && new_depth < *depth)
@ -918,7 +919,7 @@ int snapDerivedMesh(TransInfo *t, Object *ob, DerivedMesh *dm, float obmat[][4],
new_depth = VecLenf(location, ray_start);
project_int(t->ar, t->view, location, screen_loc);
project_int(t->ar, location, screen_loc);
new_dist = abs(screen_loc[0] - mval[0]) + abs(screen_loc[1] - mval[1]);
if (new_dist <= *dist && new_depth < *depth)
@ -1010,7 +1011,7 @@ int snapDerivedMesh(TransInfo *t, Object *ob, DerivedMesh *dm, float obmat[][4],
new_depth = VecLenf(location, ray_start);
project_int(t->ar, t->view, location, screen_loc);
project_int(t->ar, location, screen_loc);
new_dist = abs(screen_loc[0] - mval[0]) + abs(screen_loc[1] - mval[1]);
if (new_dist <= *dist && new_depth < *depth)
@ -1130,7 +1131,7 @@ int snapDerivedMesh(TransInfo *t, Object *ob, DerivedMesh *dm, float obmat[][4],
new_depth = VecLenf(location, ray_start);
project_int(t->ar, t->view, location, screen_loc);
project_int(t->ar, location, screen_loc);
new_dist = abs(screen_loc[0] - mval[0]) + abs(screen_loc[1] - mval[1]);
if (new_dist <= *dist && new_depth < *depth)

@ -62,8 +62,8 @@ void GPU_state_init(void);
* GPU_enable_material returns 0 if drawing should be skipped
* - after drawing, the material must be disabled again */
void GPU_set_object_materials(struct View3D *v3d, struct Scene *scene,
struct Object *ob, int glsl, int *do_alpha_pass);
void GPU_set_object_materials(struct View3D *v3d, struct RegionView3D *rv3d,
struct Scene *scene, struct Object *ob, int glsl, int *do_alpha_pass);
int GPU_enable_material(int nr, void *attribs);
void GPU_disable_material(void);

@ -782,7 +782,7 @@ Material *gpu_active_node_material(Material *ma)
return ma;
}
void GPU_set_object_materials(View3D *v3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass)
void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass)
{
extern Material defmaterial; /* from material.c */
Material *ma;
@ -800,8 +800,8 @@ void GPU_set_object_materials(View3D *v3d, Scene *scene, Object *ob, int glsl, i
GMS.gscene = scene;
GMS.totmat= ob->totcol;
GMS.glay= v3d->lay;
GMS.gviewmat= v3d->viewmat;
GMS.gviewinv= v3d->viewinv;
GMS.gviewmat= rv3d->viewmat;
GMS.gviewinv= rv3d->viewinv;
GMS.alphapass = (v3d && v3d->transp);
if(do_alpha_pass)

@ -339,18 +339,6 @@ extern Object workob;
#define OB_SHADED 4
#define OB_TEXTURE 5
/* this condition has been made more complex since editmode can draw textures */
#define CHECK_OB_DRAWTEXTURE(vd, dt) \
((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
(vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
#define CHECK_OB_DRAWFACEDOT(sce, vd, dt) \
( (sce->selectmode & SCE_SELECT_FACE) && \
(vd->drawtype<=OB_SOLID) && \
(((vd->drawtype==OB_SOLID) && (dt>=OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX) && (vd->flag & V3D_ZBUF_SELECT)) == 0) \
)
/* dtx: flags, char! */
#define OB_AXIS 2
#define OB_TEXSPACE 4

@ -206,6 +206,7 @@ typedef struct ARegion {
#define RGN_ALIGN_HSPLIT 5
#define RGN_ALIGN_VSPLIT 6
#define RGN_ALIGN_FLOAT 7
#define RGN_ALIGN_QSPLIT 8
/* region flag */
#define RGN_FLAG_HIDDEN 1

@ -71,80 +71,37 @@ typedef struct BGpic {
/* ********************************* */
/* 3D ViewPort Struct */
typedef struct View3D {
struct SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
float blockscale;
typedef struct RegionView3D {
short blockhandler[8];
float winmat[4][4];
float viewmat[4][4];
float viewinv[4][4];
float persmat[4][4];
float persinv[4][4];
float viewquat[4], dist, zfac; /* zfac is initgrabz() result */
int lay_used; /* used while drawing */
float twmat[4][4]; /* transform widget */
float viewquat[4], dist, zfac; /* zfac is initgrabz() result */
float camdx, camdy; /* camera view offsets, 1.0 = viewplane moves entire width/height */
float pixsize;
float ofs[3];
short camzoom, viewbut;
int pad1;
short rflag, pad2;
short persp;
short view;
struct Object *camera, *ob_centre;
struct BGpic *bgpic;
struct View3D *localvd;
/* user defined clipping planes */
float clip[4][4];
struct BoundBox *clipbb;
struct bGPdata *gpd; /* Grease-Pencil Data (annotation layers) */
struct RegionView3D *localvd;
struct RenderInfo *ri;
struct RetopoViewData *retopo_view_data;
struct ViewDepths *depths;
char ob_centre_bone[32]; /* optional string for armature bone to define center */
/**
* The drawing mode for the 3d display. Set to OB_WIRE, OB_SOLID,
* OB_SHADED or OB_TEXTURE */
short drawtype;
short localview;
int lay, layact;
short scenelock, around, camzoom;
char pivot_last, pad1; /* pivot_last is for rotating around the last edited element */
float lens, grid, gridview, pixsize, near, far;
float camdx, camdy; /* camera view offsets, 1.0 = viewplane moves entire width/height */
float ofs[3], cursor[3];
short gridlines, viewbut;
short gridflag;
short modeselect, menunr, texnr;
/* transform widget info */
short twtype, twmode, twflag, twdrawflag;
float twmat[4][4];
/* user defined clipping planes */
float clip[4][4];
struct BoundBox *clipbb;
/* afterdraw, for xray & transparent */
struct ListBase afterdraw;
/* drawflags, denoting state */
short zbuf, transp, xray;
short flag, flag2;
short gridsubdiv; /* Number of subdivisions in the grid between each highlighted grid line */
short keyflags; /* flags for display of keyframes */
char ndofmode; /* mode of transform for 6DOF devices -1 not found, 0 normal, 1 fly, 2 ob transform */
char ndoffilter; /*filter for 6DOF devices 0 normal, 1 dominant */
void *properties_storage; /* Nkey panel stores stuff here, not in file */
struct bGPdata *gpd; /* Grease-Pencil Data (annotation layers) */
/* animated smooth view */
struct SmoothViewStore *sms;
struct wmTimer *smooth_timer;
@ -152,11 +109,76 @@ typedef struct View3D {
/* last view */
float lviewquat[4];
short lpersp, lview;
int pad3;
} RegionView3D;
/* 3D ViewPort Struct */
typedef struct View3D {
struct SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
float blockscale;
short blockhandler[8];
float viewquat[4], dist, pad1; /* XXX depricated */
int lay_used; /* used while drawing */
short persp; /* XXX depricated */
short view; /* XXX depricated */
struct Object *camera, *ob_centre;
struct BGpic *bgpic;
struct View3D *localvd;
char ob_centre_bone[32]; /* optional string for armature bone to define center */
int lay, layact;
/**
* The drawing mode for the 3d display. Set to OB_WIRE, OB_SOLID,
* OB_SHADED or OB_TEXTURE */
short drawtype;
short localview;
short scenelock, around, pad3;
short flag, flag2;
short pivot_last; /* pivot_last is for rotating around the last edited element */
float lens, grid, gridview, padf, near, far;
float ofs[3]; /* XXX depricated */
float cursor[3];
short gridlines, pad4;
short gridflag;
short gridsubdiv; /* Number of subdivisions in the grid between each highlighted grid line */
short modeselect;
short keyflags; /* flags for display of keyframes */
/* transform widget info */
short twtype, twmode, twflag, twdrawflag;
/* customdata flags from modes */
unsigned int customdata_mask;
/* afterdraw, for xray & transparent */
struct ListBase afterdraw;
/* drawflags, denoting state */
short zbuf, transp, xray;
char ndofmode; /* mode of transform for 6DOF devices -1 not found, 0 normal, 1 fly, 2 ob transform */
char ndoffilter; /* filter for 6DOF devices 0 normal, 1 dominant */
void *properties_storage; /* Nkey panel stores stuff here, not in file */
/* XXX depricated? */
struct bGPdata *gpd; /* Grease-Pencil Data (annotation layers) */
} View3D;
/* XXX this needs cleaning */
/* View3D->flag (short) */
#define V3D_MODE (16+32+64+128+256+512)
@ -174,14 +196,14 @@ typedef struct View3D {
#define V3D_SELECT_OUTLINE 2048
#define V3D_ZBUF_SELECT 4096
#define V3D_GLOBAL_STATS 8192
#define V3D_CLIPPING 16384
#define V3D_DRAW_CENTERS 32768
/* RegionView3d->rflag */
#define RV3D_OPP_DIRECTION_NAME 1
#define RV3D_FLYMODE 2
#define RV3D_CLIPPING 4
/* View3d->flag2 (short) */
#define V3D_MODE2 (32)
#define V3D_OPP_DIRECTION_NAME 1
#define V3D_FLYMODE 2
#define V3D_DEPRECATED 4 /* V3D_TRANSFORM_SNAP, moved to a scene setting */
#define V3D_SOLID_TEX 8
#define V3D_DISPGP 16

@ -111,6 +111,7 @@ static BlendFileData *load_game_data(char *filename)
}
extern "C" void StartKetsjiShell(struct ScrArea *area,
struct ARegion *ar,
char* scenename,
struct Main* maggie1,
struct SpaceIpo *sipo,
@ -140,6 +141,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
do
{
View3D *v3d= (View3D*) area->spacedata.first;
RegionView3D *rv3d= ar->regiondata;
// get some preferences
SYS_SystemHandle syshandle = SYS_GetSystem();
@ -224,7 +226,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
for (i = 0; i < 16; i++)
{
float *viewmat_linear= (float*) v3d->viewmat;
float *viewmat_linear= (float*) rv3d->viewmat;
viewmat.setElem(i, viewmat_linear[i]);
}
for (i = 0; i < 16; i++)
@ -234,7 +236,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
}
if(v3d->persp==V3D_CAMOB) {
camzoom = (1.41421 + (v3d->camzoom / 50.0));
camzoom = (1.41421 + (rv3d->camzoom / 50.0));
camzoom *= camzoom;
}
else
@ -541,6 +543,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
}
extern "C" void StartKetsjiShellSimulation(struct ScrArea *area,
struct ARegion *ar,
char* scenename,
struct Main* maggie,
struct SpaceIpo *sipo,

@ -380,9 +380,9 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame)
m_blendstart = curtime;
}
// only interested in shape channel
extract_ipochannels_from_action(&tchanbase, &key->id, m_action, "Shape", m_localtime);
// XXX extract_ipochannels_from_action(&tchanbase, &key->id, m_action, "Shape", m_localtime);
if (!execute_ipochannels(&tchanbase)) {
if (0) { // XXX !execute_ipochannels(&tchanbase)) {
// no update, this is possible if action does not match the keys, stop the action
keepgoing = false;
}

@ -116,11 +116,11 @@ bool BL_ShapeDeformer::ExecuteShapeDrivers(void)
for (it=m_shapeDrivers.begin(); it!=m_shapeDrivers.end(); it++) {
// no need to set a specific time: this curve has a driver
IpoCurve *icu = *it;
calc_icu(icu, 1.0f);
poin = get_ipo_poin((ID*)m_bmesh->key, icu, &type);
if (poin)
write_ipo_poin(poin, type, icu->curval);
// XXX IpoCurve *icu = *it;
//calc_icu(icu, 1.0f);
//poin = get_ipo_poin((ID*)m_bmesh->key, icu, &type);
//if (poin)
// write_ipo_poin(poin, type, icu->curval);
}
ForceUpdate();

@ -36,7 +36,7 @@ extern "C" {
static const int BL_MAX_CHANNELS = 32;
float BL_ScalarInterpolator::GetValue(float currentTime) const {
return IPO_GetFloatValue(m_blender_ipo, m_channel, currentTime);
return 0; // XXX IPO_GetFloatValue(m_blender_ipo, m_channel, currentTime);
}
@ -44,7 +44,7 @@ float BL_ScalarInterpolator::GetValue(float currentTime) const {
BL_InterpolatorList::BL_InterpolatorList(struct Ipo *ipo) {
IPO_Channel channels[BL_MAX_CHANNELS];
int num_channels = IPO_GetChannels(ipo, channels);
int num_channels = 0; // XXX IPO_GetChannels(ipo, channels);
int i;