Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-01-19 19:54:41 +0300
committerTon Roosendaal <ton@blender.org>2009-01-19 19:54:41 +0300
commitbc63213844e723b0c552da446fb7fa9f9e7ea5f6 (patch)
tree433519ee3526536032e62226a058f6ec4fd17a1a
parent9b049d89a1bc36534875c67e097415e034d0624d (diff)
2.5
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.
-rw-r--r--source/blender/blenkernel/BKE_context.h3
-rw-r--r--source/blender/blenkernel/BKE_screen.h9
-rw-r--r--source/blender/blenkernel/intern/context.c7
-rw-r--r--source/blender/blenkernel/intern/object.c4
-rw-r--r--source/blender/blenkernel/intern/screen.c72
-rw-r--r--source/blender/blenloader/intern/readfile.c67
-rw-r--r--source/blender/blenloader/intern/writefile.c31
-rw-r--r--source/blender/editors/armature/editarmature.c12
-rw-r--r--source/blender/editors/curve/editcurve.c18
-rw-r--r--source/blender/editors/gpencil/gpencil.c24
-rw-r--r--source/blender/editors/include/ED_object.h2
-rw-r--r--source/blender/editors/include/ED_screen.h1
-rw-r--r--source/blender/editors/include/ED_view3d.h22
-rw-r--r--source/blender/editors/interface/interface_regions.c2
-rw-r--r--source/blender/editors/mesh/editface.c12
-rw-r--r--source/blender/editors/mesh/editmesh_add.c11
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c18
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c23
-rw-r--r--source/blender/editors/mesh/meshtools.c3
-rw-r--r--source/blender/editors/object/object_edit.c18
-rw-r--r--source/blender/editors/screen/area.c63
-rw-r--r--source/blender/editors/screen/screen_ops.c88
-rw-r--r--source/blender/editors/sculpt/sculpt.c4
-rw-r--r--source/blender/editors/space_api/spacetypes.c13
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c52
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c23
-rw-r--r--source/blender/editors/space_view3d/drawobject.c271
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c130
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c188
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c589
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c115
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h22
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c18
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c370
-rw-r--r--source/blender/editors/space_view3d/vpaint.c26
-rw-r--r--source/blender/editors/transform/transform.c22
-rw-r--r--source/blender/editors/transform/transform.h2
-rw-r--r--source/blender/editors/transform/transform_constraints.c4
-rw-r--r--source/blender/editors/transform/transform_conversions.c3
-rw-r--r--source/blender/editors/transform/transform_generics.c20
-rw-r--r--source/blender/editors/transform/transform_manipulator.c6
-rw-r--r--source/blender/editors/transform/transform_ops.c2
-rw-r--r--source/blender/editors/transform/transform_orientations.c38
-rw-r--r--source/blender/editors/transform/transform_snap.c13
-rw-r--r--source/blender/gpu/GPU_draw.h4
-rw-r--r--source/blender/gpu/intern/gpu_draw.c6
-rw-r--r--source/blender/makesdna/DNA_object_types.h12
-rw-r--r--source/blender/makesdna/DNA_screen_types.h1
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h122
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp7
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.cpp4
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.cpp10
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp4
53 files changed, 1413 insertions, 1198 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 7d6542ada08..160736d4a94 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -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);
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 7604dc8170b..a2e9329a18a 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -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);
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 1fd569e1081..81712acee5c 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -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)
{
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 8b3f495e495..2718981e398 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.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) {
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index fd15c69e775..a596827f470 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -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) {
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index eb1693cd22e..13e7bf91c73 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -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)
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index a6f470493c8..2f31320444b 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -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) {
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 5a751236e6e..67b8f211eaa 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -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 */
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index e1455d7dfb0..4d468fdd28b 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -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);
diff --git a/source/blender/editors/gpencil/gpencil.c b/source/blender/editors/gpencil/gpencil.c
index 96fe598ecae..b7874f25670 100644
--- a/source/blender/editors/gpencil/gpencil.c
+++ b/source/blender/editors/gpencil/gpencil.c
@@ -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;
}
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 0b61f8b50a7..d0815bba65c 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -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);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 7c38d167b0b..a33e85b1fdb 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -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);
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index f298fe14d64..a8501e83b42 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -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]);
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index e9ef10648e9..cc9e76dbd9c 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -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);
}
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index f5c14a34140..4ca302ab06c 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -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);
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index a84c57f2e88..e8311806ca6 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -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);
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index f9793a14faa..200c6a173ea 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -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);
}
}
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index ad56ebd5f50..bb81c7605e5 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -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);
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 4f5426b44ef..18169643bf5 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -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);
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index f213e4f9cac..f76edc40f53 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -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);
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index d6235384e6e..4acbe360ab4 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -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);
}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index ca057cd0b4d..bcc162b2b74 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -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);
-
- newar->alignment= ar->alignment;
- if(dir=='h')
- ar->alignment= RGN_ALIGN_HSPLIT;
- else
- ar->alignment= RGN_ALIGN_VSPLIT;
+ 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");
- 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);
diff --git a/source/blender/editors/sculpt/sculpt.c b/source/blender/editors/sculpt/sculpt.c
index b88eb188464..6cea3ba1928 100644
--- a/source/blender/editors/sculpt/sculpt.c
+++ b/source/blender/editors/sculpt/sculpt.c
@@ -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];
}
}
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index 89693b6cc2c..b7fc3b3a5f8 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -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)
{
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index 3556e27bbb7..b91ed0894e3 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -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)
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 1fa7a4d96e1..f34f520e269 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -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);
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 7a01e1ada7a..ad9de1453f5 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -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);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index a645f8f359d..0bb891e11b4 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -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;
-
- vd->gridflag |= V3D_SHOW_X;
- vd->gridflag |= V3D_SHOW_Y;
- vd->gridflag |= V3D_SHOW_FLOOR;
- vd->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->scenelock= 1;
+ v3d->grid= 1.0f;
+ v3d->gridlines= 16;
+ v3d->gridsubdiv = 10;
+ v3d->drawtype= OB_WIRE;
+
+ v3d->gridflag |= V3D_SHOW_X;
+ v3d->gridflag |= V3D_SHOW_Y;
+ v3d->gridflag |= V3D_SHOW_FLOOR;
+ v3d->gridflag &= ~V3D_SHOW_Z;
+
+ 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);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 618d30eea60..b2b4c2afb0d 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -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) {
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 3ccb5eb026c..b96dc4010bd 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -87,13 +87,14 @@
typedef struct ViewOpsData {
ARegion *ar;
- View3D *v3d;
+ RegionView3D *rv3d;
float oldquat[4];
float trackvec[3];
float ofs[3], obofs[3];
float reverse, dist0;
-
+ float grid, far;
+
int origx, origy, oldx, oldy;
int origkey;
@@ -130,26 +131,30 @@ static void calctrackballvec(rcti *rect, int mx, int my, float *vec)
static void viewops_data(bContext *C, wmOperator *op, wmEvent *event)
{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d;
ViewOpsData *vod= MEM_callocN(sizeof(ViewOpsData), "viewops data");
/* store data */
op->customdata= vod;
vod->ar= CTX_wm_region(C);
- vod->v3d= v3d;
- vod->dist0= v3d->dist;
- QUATCOPY(vod->oldquat, v3d->viewquat);
+ vod->rv3d= rv3d= vod->ar->regiondata;
+ vod->dist0= rv3d->dist;
+ QUATCOPY(vod->oldquat, rv3d->viewquat);
vod->origx= vod->oldx= event->x;
vod->origy= vod->oldy= event->y;
vod->origkey= event->type;
-
+
+ /* lookup, we dont pass on v3d to prevent confusement */
+ vod->grid= v3d->grid;
+ vod->far= v3d->far;
+
calctrackballvec(&vod->ar->winrct, event->x, event->y, vod->trackvec);
- initgrabz(v3d, -v3d->ofs[0], -v3d->ofs[1], -v3d->ofs[2]);
+ initgrabz(rv3d, -rv3d->ofs[0], -rv3d->ofs[1], -rv3d->ofs[2]);
vod->reverse= 1.0f;
- if (v3d->persmat[2][1] < 0.0f)
+ if (rv3d->persmat[2][1] < 0.0f)
vod->reverse= -1.0f;
}
@@ -209,10 +214,10 @@ static float snapquats[39][6] = {
static void viewrotate_apply(ViewOpsData *vod, int x, int y, int ctrl)
{
- View3D *v3d= vod->v3d;
+ RegionView3D *rv3d= vod->rv3d;
int use_sel= 0; /* XXX */
- v3d->view= 0; /* need to reset everytime because of view snapping */
+ rv3d->view= 0; /* need to reset everytime because of view snapping */
if (U.flag & USER_TRACKBALL) {
float phi, si, q1[4], dvec[3], newvec[3];
@@ -244,19 +249,19 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y, int ctrl)
q1[1]*= si;
q1[2]*= si;
q1[3]*= si;
- QuatMul(v3d->viewquat, q1, vod->oldquat);
+ QuatMul(rv3d->viewquat, q1, vod->oldquat);
if (use_sel) {
/* compute the post multiplication quat, to rotate the offset correctly */
QUATCOPY(q1, vod->oldquat);
QuatConj(q1);
- QuatMul(q1, q1, v3d->viewquat);
+ QuatMul(q1, q1, rv3d->viewquat);
QuatConj(q1); /* conj == inv for unit quat */
- VECCOPY(v3d->ofs, vod->ofs);
- VecSubf(v3d->ofs, v3d->ofs, vod->obofs);
- QuatMulVecf(q1, v3d->ofs);
- VecAddf(v3d->ofs, v3d->ofs, vod->obofs);
+ VECCOPY(rv3d->ofs, vod->ofs);
+ VecSubf(rv3d->ofs, rv3d->ofs, vod->obofs);
+ QuatMulVecf(q1, rv3d->ofs);
+ VecAddf(rv3d->ofs, rv3d->ofs, vod->obofs);
}
}
else {
@@ -272,7 +277,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y, int ctrl)
const float sensitivity = 0.0035;
/* Get the 3x3 matrix and its inverse from the quaternion */
- QuatToMat3(v3d->viewquat, m);
+ QuatToMat3(rv3d->viewquat, m);
Mat3Inv(m_inv,m);
/* Determine the direction of the x vector (for rotating up and down) */
@@ -286,13 +291,13 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y, int ctrl)
q1[1] = si * xvec[0];
q1[2] = si * xvec[1];
q1[3] = si * xvec[2];
- QuatMul(v3d->viewquat, v3d->viewquat, q1);
+ QuatMul(rv3d->viewquat, rv3d->viewquat, q1);
if (use_sel) {
QuatConj(q1); /* conj == inv for unit quat */
- VecSubf(v3d->ofs, v3d->ofs, vod->obofs);
- QuatMulVecf(q1, v3d->ofs);
- VecAddf(v3d->ofs, v3d->ofs, vod->obofs);
+ VecSubf(rv3d->ofs, rv3d->ofs, vod->obofs);
+ QuatMulVecf(q1, rv3d->ofs);
+ VecAddf(rv3d->ofs, rv3d->ofs, vod->obofs);
}
/* Perform the orbital rotation */
@@ -300,13 +305,13 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y, int ctrl)
q1[0] = cos(phi);
q1[1] = q1[2] = 0.0;
q1[3] = sin(phi);
- QuatMul(v3d->viewquat, v3d->viewquat, q1);
+ QuatMul(rv3d->viewquat, rv3d->viewquat, q1);
if (use_sel) {
QuatConj(q1);
- VecSubf(v3d->ofs, v3d->ofs, vod->obofs);
- QuatMulVecf(q1, v3d->ofs);
- VecAddf(v3d->ofs, v3d->ofs, vod->obofs);
+ VecSubf(rv3d->ofs, rv3d->ofs, vod->obofs);
+ QuatMulVecf(q1, rv3d->ofs);
+ VecAddf(rv3d->ofs, rv3d->ofs, vod->obofs);
}
}
@@ -316,7 +321,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y, int ctrl)
float viewmat[3][3];
- QuatToMat3(v3d->viewquat, viewmat);
+ QuatToMat3(rv3d->viewquat, viewmat);
for (i = 0 ; i < 39; i++){
float snapmat[3][3];
@@ -329,14 +334,14 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y, int ctrl)
(Inpf(snapmat[1], viewmat[1]) > thres) &&
(Inpf(snapmat[2], viewmat[2]) > thres)){
- QUATCOPY(v3d->viewquat, snapquats[i]);
+ QUATCOPY(rv3d->viewquat, snapquats[i]);
- v3d->view = view;
+ rv3d->view = view;
if (view){
if (oposite_dir){
- v3d->flag2 |= V3D_OPP_DIRECTION_NAME;
+ rv3d->rflag |= RV3D_OPP_DIRECTION_NAME;
}else{
- v3d->flag2 &= ~V3D_OPP_DIRECTION_NAME;
+ rv3d->rflag &= ~RV3D_OPP_DIRECTION_NAME;
}
}
@@ -382,12 +387,12 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
vod= op->customdata;
/* switch from camera view when: */
- if(vod->v3d->persp != V3D_PERSP) {
+ if(vod->rv3d->persp != V3D_PERSP) {
if (U.uiflag & USER_AUTOPERSP)
- vod->v3d->persp= V3D_PERSP;
- else if(vod->v3d->persp==V3D_CAMOB)
- vod->v3d->persp= V3D_PERSP;
+ vod->rv3d->persp= V3D_PERSP;
+ else if(vod->rv3d->persp==V3D_CAMOB)
+ vod->rv3d->persp= V3D_PERSP;
ED_region_tag_redraw(vod->ar);
}
@@ -415,20 +420,20 @@ void VIEW3D_OT_viewrotate(wmOperatorType *ot)
static void viewmove_apply(ViewOpsData *vod, int x, int y)
{
- if(vod->v3d->persp==V3D_CAMOB) {
+ if(vod->rv3d->persp==V3D_CAMOB) {
float max= (float)MAX2(vod->ar->winx, vod->ar->winy);
- vod->v3d->camdx += (vod->oldx - x)/(max);
- vod->v3d->camdy += (vod->oldy - y)/(max);
- CLAMP(vod->v3d->camdx, -1.0f, 1.0f);
- CLAMP(vod->v3d->camdy, -1.0f, 1.0f);
+ vod->rv3d->camdx += (vod->oldx - x)/(max);
+ vod->rv3d->camdy += (vod->oldy - y)/(max);
+ CLAMP(vod->rv3d->camdx, -1.0f, 1.0f);
+ CLAMP(vod->rv3d->camdy, -1.0f, 1.0f);
// XXX preview3d_event= 0;
}
else {
float dvec[3];
- window_to_3d(vod->ar, vod->v3d, dvec, x-vod->oldx, y-vod->oldy);
- VecAddf(vod->v3d->ofs, vod->v3d->ofs, dvec);
+ window_to_3d(vod->ar, dvec, x-vod->oldx, y-vod->oldy);
+ VecAddf(vod->rv3d->ofs, vod->rv3d->ofs, dvec);
}
vod->oldx= x;
@@ -488,8 +493,10 @@ void VIEW3D_OT_viewmove(wmOperatorType *ot)
/* ************************ viewzoom ******************************** */
-static void view_zoom_mouseloc(ARegion *ar, View3D *v3d, float dfac, int mx, int my)
+static void view_zoom_mouseloc(ARegion *ar, float dfac, int mx, int my)
{
+ RegionView3D *rv3d= ar->regiondata;
+
if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) {
float dvec[3];
float tvec[3];
@@ -504,13 +511,13 @@ static void view_zoom_mouseloc(ARegion *ar, View3D *v3d, float dfac, int mx, int
vb[0] = ar->winx;
vb[1] = ar->winy;
- tpos[0] = -v3d->ofs[0];
- tpos[1] = -v3d->ofs[1];
- tpos[2] = -v3d->ofs[2];
+ tpos[0] = -rv3d->ofs[0];
+ tpos[1] = -rv3d->ofs[1];
+ tpos[2] = -rv3d->ofs[2];
/* Project cursor position into 3D space */
- initgrabz(v3d, tpos[0], tpos[1], tpos[2]);
- window_to_3d(ar, v3d, dvec, mouseloc[0]-vb[0]/2, mouseloc[1]-vb[1]/2);
+ initgrabz(rv3d, tpos[0], tpos[1], tpos[2]);
+ window_to_3d(ar, dvec, mouseloc[0]-vb[0]/2, mouseloc[1]-vb[1]/2);
/* Calculate view target position for dolly */
tvec[0] = -(tpos[0] + dvec[0]);
@@ -518,19 +525,19 @@ static void view_zoom_mouseloc(ARegion *ar, View3D *v3d, float dfac, int mx, int
tvec[2] = -(tpos[2] + dvec[2]);
/* Offset to target position and dolly */
- new_dist = v3d->dist * dfac;
+ new_dist = rv3d->dist * dfac;
- VECCOPY(v3d->ofs, tvec);
- v3d->dist = new_dist;
+ VECCOPY(rv3d->ofs, tvec);
+ rv3d->dist = new_dist;
/* Calculate final offset */
dvec[0] = tvec[0] + dvec[0] * dfac;
dvec[1] = tvec[1] + dvec[1] * dfac;
dvec[2] = tvec[2] + dvec[2] * dfac;
- VECCOPY(v3d->ofs, dvec);
+ VECCOPY(rv3d->ofs, dvec);
} else {
- v3d->dist *= dfac;
+ rv3d->dist *= dfac;
}
}
@@ -553,36 +560,36 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y)
len1 = (int)sqrt((ctr[0] - x)*(ctr[0] - x) + (ctr[1] - y)*(ctr[1] - y)) + 5;
len2 = (int)sqrt((ctr[0] - vod->origx)*(ctr[0] - vod->origx) + (ctr[1] - vod->origy)*(ctr[1] - vod->origy)) + 5;
- zfac = vod->dist0 * ((float)len2/len1) / vod->v3d->dist;
+ zfac = vod->dist0 * ((float)len2/len1) / vod->rv3d->dist;
}
else { /* USER_ZOOM_DOLLY */
float len1 = (vod->ar->winrct.ymax - y) + 5;
float len2 = (vod->ar->winrct.ymax - vod->origy) + 5;
- zfac = vod->dist0 * (2.0*((len2/len1)-1.0) + 1.0) / vod->v3d->dist;
+ zfac = vod->dist0 * (2.0*((len2/len1)-1.0) + 1.0) / vod->rv3d->dist;
}
- if(zfac != 1.0 && zfac*vod->v3d->dist > 0.001*vod->v3d->grid &&
- zfac*vod->v3d->dist < 10.0*vod->v3d->far)
- view_zoom_mouseloc(vod->ar, vod->v3d, zfac, vod->oldx, vod->oldy);
+ if(zfac != 1.0 && zfac*vod->rv3d->dist > 0.001*vod->grid &&
+ zfac*vod->rv3d->dist < 10.0*vod->far)
+ view_zoom_mouseloc(vod->ar, zfac, vod->oldx, vod->oldy);
- if ((U.uiflag & USER_ORBIT_ZBUF) && (U.viewzoom==USER_ZOOM_CONT) && (vod->v3d->persp==V3D_PERSP)) {
+ if ((U.uiflag & USER_ORBIT_ZBUF) && (U.viewzoom==USER_ZOOM_CONT) && (vod->rv3d->persp==V3D_PERSP)) {
float upvec[3], mat[3][3];
/* Secret apricot feature, translate the view when in continues mode */
upvec[0] = upvec[1] = 0.0f;
- upvec[2] = (vod->dist0 - vod->v3d->dist) * vod->v3d->grid;
- vod->v3d->dist = vod->dist0;
- Mat3CpyMat4(mat, vod->v3d->viewinv);
+ upvec[2] = (vod->dist0 - vod->rv3d->dist) * vod->grid;
+ vod->rv3d->dist = vod->dist0;
+ Mat3CpyMat4(mat, vod->rv3d->viewinv);
Mat3MulVecfl(mat, upvec);
- VecAddf(vod->v3d->ofs, vod->v3d->ofs, upvec);
+ VecAddf(vod->rv3d->ofs, vod->rv3d->ofs, upvec);
} else {
- /* these limits are in toets.c too */
- if(vod->v3d->dist<0.001*vod->v3d->grid) vod->v3d->dist= 0.001*vod->v3d->grid;
- if(vod->v3d->dist>10.0*vod->v3d->far) vod->v3d->dist=10.0*vod->v3d->far;
+ /* these limits were in old code too */
+ if(vod->rv3d->dist<0.001*vod->grid) vod->rv3d->dist= 0.001*vod->grid;
+ if(vod->rv3d->dist>10.0*vod->far) vod->rv3d->dist=10.0*vod->far;
}
-// XXX if(vod->v3d->persp==V3D_ORTHO || vod->v3d->persp==V3D_CAMOB) preview3d_event= 0;
+// XXX if(vod->rv3d->persp==V3D_ORTHO || vod->rv3d->persp==V3D_CAMOB) preview3d_event= 0;
ED_region_tag_redraw(vod->ar);
}
@@ -613,24 +620,24 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event)
static int viewzoom_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);
int delta= RNA_int_get(op->ptr, "delta");
if(delta < 0) {
/* this min and max is also in viewmove() */
- if(v3d->persp==V3D_CAMOB) {
- v3d->camzoom-= 10;
- if(v3d->camzoom<-30) v3d->camzoom= -30;
+ if(rv3d->persp==V3D_CAMOB) {
+ rv3d->camzoom-= 10;
+ if(rv3d->camzoom<-30) rv3d->camzoom= -30;
}
- else if(v3d->dist<10.0*v3d->far) v3d->dist*=1.2f;
+ else if(rv3d->dist<10.0*v3d->far) rv3d->dist*=1.2f;
}
else {
- if(v3d->persp==V3D_CAMOB) {
- v3d->camzoom+= 10;
- if(v3d->camzoom>300) v3d->camzoom= 300;
+ if(rv3d->persp==V3D_CAMOB) {
+ rv3d->camzoom+= 10;
+ if(rv3d->camzoom>300) rv3d->camzoom= 300;
}
- else if(v3d->dist> 0.001*v3d->grid) v3d->dist*=.83333f;
+ else if(rv3d->dist> 0.001*v3d->grid) rv3d->dist*=.83333f;
}
ED_region_tag_redraw(CTX_wm_region(C));
@@ -675,9 +682,9 @@ void VIEW3D_OT_viewzoom(wmOperatorType *ot)
static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */
{
- ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
- View3D *v3d= sa->spacedata.first;
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
Base *base;
@@ -724,8 +731,8 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
new_dist*= size;
}
- if (v3d->persp==V3D_CAMOB) {
- v3d->persp= V3D_PERSP;
+ if (rv3d->persp==V3D_CAMOB) {
+ rv3d->persp= V3D_PERSP;
smooth_view(C, NULL, v3d->camera, new_ofs, NULL, &new_dist, NULL);
}
}
@@ -749,9 +756,9 @@ void VIEW3D_OT_viewhome(wmOperatorType *ot)
static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview without local!, was centerview() in 2.4x */
{
- ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
- View3D *v3d= sa->spacedata.first;
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
Object *obedit= CTX_data_edit_object(C);
@@ -850,8 +857,8 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with
v3d->cursor[1]= -new_ofs[1];
v3d->cursor[2]= -new_ofs[2];
- if (v3d->persp==V3D_CAMOB) {
- v3d->persp= V3D_PERSP;
+ if (rv3d->persp==V3D_CAMOB) {
+ rv3d->persp= V3D_PERSP;
smooth_view(C, v3d->camera, NULL, new_ofs, NULL, &new_dist, NULL);
}
else {
@@ -878,9 +885,8 @@ void VIEW3D_OT_viewcenter(wmOperatorType *ot)
static int render_border_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa= CTX_wm_area(C);
+ View3D *v3d = CTX_wm_view3d(C);
ARegion *ar= CTX_wm_region(C);
- View3D *v3d= sa->spacedata.first;
Scene *scene= CTX_data_scene(C);
rcti rect;
@@ -924,11 +930,10 @@ static int render_border_exec(bContext *C, wmOperator *op)
static int view3d_render_border_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
/* if not in camera view do not exec the operator*/
- if (v3d->persp == V3D_CAMOB) return WM_border_select_invoke(C, op, event);
+ if (rv3d->persp == V3D_CAMOB) return WM_border_select_invoke(C, op, event);
else return OPERATOR_PASS_THROUGH;
}
@@ -956,9 +961,9 @@ void VIEW3D_OT_render_border(wmOperatorType *ot)
static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
- View3D *v3d= sa->spacedata.first;
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
/* Zooms in on a border drawn by the user */
@@ -990,9 +995,9 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
draw_depth(scene, ar, v3d, NULL);
/* force updating */
- if (v3d->depths) {
+ if (rv3d->depths) {
had_depth = 1;
- v3d->depths->damaged = 1;
+ rv3d->depths->damaged = 1;
}
view3d_update_depths(ar, v3d);
@@ -1000,14 +1005,14 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
/* Constrain rect to depth bounds */
if (rect.xmin < 0) rect.xmin = 0;
if (rect.ymin < 0) rect.ymin = 0;
- if (rect.xmax >= v3d->depths->w) rect.xmax = v3d->depths->w-1;
- if (rect.ymax >= v3d->depths->h) rect.ymax = v3d->depths->h-1;
+ if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
+ if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
/* Find the closest Z pixel */
for (xs=rect.xmin; xs < rect.xmax; xs++) {
for (ys=rect.ymin; ys < rect.ymax; ys++) {
- depth= v3d->depths->depths[ys*v3d->depths->w+xs];
- if(depth < v3d->depths->depth_range[1] && depth > v3d->depths->depth_range[0]) {
+ depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
+ if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
if (depth_close > depth) {
depth_close = depth;
}
@@ -1016,15 +1021,15 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
}
if (had_depth==0) {
- MEM_freeN(v3d->depths->depths);
- v3d->depths->depths = NULL;
+ MEM_freeN(rv3d->depths->depths);
+ rv3d->depths->depths = NULL;
}
- v3d->depths->damaged = 1;
+ rv3d->depths->damaged = 1;
cent[0] = (((double)rect.xmin)+((double)rect.xmax)) / 2;
cent[1] = (((double)rect.ymin)+((double)rect.ymax)) / 2;
- if (v3d->persp==V3D_PERSP) {
+ if (rv3d->persp==V3D_PERSP) {
double p_corner[3];
/* no depths to use, we cant do anything! */
@@ -1052,7 +1057,7 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
vb[0] = ar->winx;
vb[1] = ar->winy;
- new_dist = v3d->dist;
+ new_dist = rv3d->dist;
/* convert the drawn rectangle into 3d space */
if (depth_close!=MAXFLOAT && gluUnProject(cent[0], cent[1], depth_close, mats.modelview, mats.projection, (GLint *)mats.viewport, &p[0], &p[1], &p[2])) {
@@ -1061,13 +1066,13 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
new_ofs[2] = -p[2];
} else {
/* We cant use the depth, fallback to the old way that dosnt set the center depth */
- new_ofs[0] = v3d->ofs[0];
- new_ofs[1] = v3d->ofs[1];
- new_ofs[2] = v3d->ofs[2];
+ new_ofs[0] = rv3d->ofs[0];
+ new_ofs[1] = rv3d->ofs[1];
+ new_ofs[2] = rv3d->ofs[2];
- initgrabz(v3d, -new_ofs[0], -new_ofs[1], -new_ofs[2]);
+ initgrabz(rv3d, -new_ofs[0], -new_ofs[1], -new_ofs[2]);
- window_to_3d(ar, v3d, dvec, (rect.xmin+rect.xmax-vb[0])/2, (rect.ymin+rect.ymax-vb[1])/2);
+ window_to_3d(ar, dvec, (rect.xmin+rect.xmax-vb[0])/2, (rect.ymin+rect.ymax-vb[1])/2);
/* center the view to the center of the rectangle */
VecSubf(new_ofs, new_ofs, dvec);
}
@@ -1085,15 +1090,18 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+
static int view3d_border_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
/* if in camera view do not exec the operator so we do not conflict with set render border*/
- if (v3d->persp != V3D_CAMOB) return WM_border_select_invoke(C, op, event);
- else return OPERATOR_PASS_THROUGH;
+ if (rv3d->persp != V3D_CAMOB)
+ return WM_border_select_invoke(C, op, event);
+ else
+ return OPERATOR_PASS_THROUGH;
}
+
void VIEW3D_OT_border_zoom(wmOperatorType *ot)
{
@@ -1136,26 +1144,28 @@ static EnumPropertyItem prop_view_items[] = {
{V3D_VIEW_PANDOWN, "PANDOWN", "Pan Down", "Pan the view Down"},
{0, NULL, NULL, NULL}};
-static void axis_set_view(bContext *C, View3D *v3d, float q1, float q2, float q3, float q4, short view, int perspo)
+static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, short view, int perspo)
{
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
float new_quat[4];
+
new_quat[0]= q1; new_quat[1]= q2;
new_quat[2]= q3; new_quat[3]= q4;
- v3d->view=0;
-
- v3d->view= view;
- if (v3d->persp==V3D_CAMOB && v3d->camera) {
+ rv3d->view= view;
+
+ if (rv3d->persp==V3D_CAMOB && v3d->camera) {
- if (U.uiflag & USER_AUTOPERSP) v3d->persp= V3D_ORTHO;
- else if(v3d->persp==V3D_CAMOB) v3d->persp= perspo;
+ if (U.uiflag & USER_AUTOPERSP) rv3d->persp= V3D_ORTHO;
+ else if(rv3d->persp==V3D_CAMOB) rv3d->persp= perspo;
- smooth_view(C, v3d->camera, NULL, v3d->ofs, new_quat, NULL, NULL);
+ smooth_view(C, v3d->camera, NULL, rv3d->ofs, new_quat, NULL, NULL);
}
else {
- if (U.uiflag & USER_AUTOPERSP) v3d->persp= V3D_ORTHO;
- else if(v3d->persp==V3D_CAMOB) v3d->persp= perspo;
+ if (U.uiflag & USER_AUTOPERSP) rv3d->persp= V3D_ORTHO;
+ else if(rv3d->persp==V3D_CAMOB) rv3d->persp= perspo;
smooth_view(C, NULL, NULL, NULL, new_quat, NULL, NULL);
}
@@ -1165,9 +1175,9 @@ static void axis_set_view(bContext *C, View3D *v3d, float q1, float q2, float q3
static int viewnumpad_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
- View3D *v3d= sa->spacedata.first;
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
float phi, si, q1[4], vec[3];
static int perspo=V3D_PERSP;
@@ -1180,40 +1190,40 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
/* Indicate that this view is inverted,
* but only if it actually _was_ inverted (jobbe) */
if (viewnum == V3D_VIEW_BOTTOM || viewnum == V3D_VIEW_BACK || viewnum == V3D_VIEW_LEFT)
- v3d->flag2 |= V3D_OPP_DIRECTION_NAME;
+ rv3d->rflag |= RV3D_OPP_DIRECTION_NAME;
else if (viewnum != V3D_VIEW_PERSPORTHO)
- v3d->flag2 &= ~V3D_OPP_DIRECTION_NAME;
+ rv3d->rflag &= ~RV3D_OPP_DIRECTION_NAME;
switch (viewnum) {
case V3D_VIEW_BOTTOM :
- axis_set_view(C, v3d, 0.0, -1.0, 0.0, 0.0, 7, perspo);
+ axis_set_view(C, 0.0, -1.0, 0.0, 0.0, 7, perspo);
break;
case V3D_VIEW_BACK:
- axis_set_view(C, v3d, 0.0, 0.0, (float)-cos(M_PI/4.0), (float)-cos(M_PI/4.0), 1, perspo);
+ axis_set_view(C, 0.0, 0.0, (float)-cos(M_PI/4.0), (float)-cos(M_PI/4.0), 1, perspo);
break;
case V3D_VIEW_LEFT:
- axis_set_view(C, v3d, 0.5, -0.5, 0.5, 0.5, 3, perspo);
+ axis_set_view(C, 0.5, -0.5, 0.5, 0.5, 3, perspo);
break;
case V3D_VIEW_TOP:
- axis_set_view(C, v3d, 1.0, 0.0, 0.0, 0.0, 7, perspo);
+ axis_set_view(C, 1.0, 0.0, 0.0, 0.0, 7, perspo);
break;
case V3D_VIEW_FRONT:
- axis_set_view(C, v3d, (float)cos(M_PI/4.0), (float)-sin(M_PI/4.0), 0.0, 0.0, 1, perspo);
+ axis_set_view(C, (float)cos(M_PI/4.0), (float)-sin(M_PI/4.0), 0.0, 0.0, 1, perspo);
break;
case V3D_VIEW_RIGHT:
- axis_set_view(C, v3d, 0.5, -0.5, -0.5, -0.5, 3, perspo);
+ axis_set_view(C, 0.5, -0.5, -0.5, -0.5, 3, perspo);
break;
case V3D_VIEW_PERSPORTHO:
- if(v3d->persp!=V3D_ORTHO)
- v3d->persp=V3D_ORTHO;
- else v3d->persp=V3D_PERSP;
+ if(rv3d->persp!=V3D_ORTHO)
+ rv3d->persp=V3D_ORTHO;
+ else rv3d->persp=V3D_PERSP;
ED_region_tag_redraw(ar);
break;
@@ -1221,11 +1231,11 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
case V3D_VIEW_CAMERA:
/* lastview - */
- if(v3d->persp != V3D_CAMOB) {
+ if(rv3d->persp != V3D_CAMOB) {
/* store settings of current view before allowing overwriting with camera view */
- QUATCOPY(v3d->lviewquat, v3d->viewquat);
- v3d->lview= v3d->view;
- v3d->lpersp= v3d->persp;
+ QUATCOPY(rv3d->lviewquat, rv3d->viewquat);
+ rv3d->lview= rv3d->view;
+ rv3d->lpersp= rv3d->persp;
#if 0
if(G.qual==LR_ALTKEY) {
@@ -1248,14 +1258,14 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
v3d->camera= scene_find_camera(scene);
/*handle_view3d_lock();*/
}
- v3d->persp= V3D_CAMOB;
- smooth_view(C, NULL, v3d->camera, v3d->ofs, v3d->viewquat, &v3d->dist, &v3d->lens);
+ rv3d->persp= V3D_CAMOB;
+ smooth_view(C, NULL, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens);
}
else{
/* return to settings of last view */
/* does smooth_view too */
- axis_set_view(C, v3d, v3d->lviewquat[0], v3d->lviewquat[1], v3d->lviewquat[2], v3d->lviewquat[3], v3d->lview, v3d->lpersp);
+ axis_set_view(C, rv3d->lviewquat[0], rv3d->lviewquat[1], rv3d->lviewquat[2], rv3d->lviewquat[3], rv3d->lview, rv3d->lpersp);
}
break;
@@ -1264,7 +1274,7 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
case V3D_VIEW_STEPUP:
case V3D_VIEW_STEPDOWN:
- if(v3d->persp != V3D_CAMOB) {
+ if(rv3d->persp != V3D_CAMOB) {
if(viewnum == V3D_VIEW_STEPLEFT || viewnum == V3D_VIEW_STEPRIGHT) {
/* z-axis */
phi= (float)(M_PI/360.0)*U.pad_rot_angle;
@@ -1273,12 +1283,12 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
q1[0]= (float)cos(phi);
q1[1]= q1[2]= 0.0;
q1[3]= si;
- QuatMul(v3d->viewquat, v3d->viewquat, q1);
- v3d->view= 0;
+ QuatMul(rv3d->viewquat, rv3d->viewquat, q1);
+ rv3d->view= 0;
}
if(viewnum == V3D_VIEW_STEPDOWN || viewnum == V3D_VIEW_STEPUP) {
/* horizontal axis */
- VECCOPY(q1+1, v3d->viewinv[0]);
+ VECCOPY(q1+1, rv3d->viewinv[0]);
Normalize(q1+1);
phi= (float)(M_PI/360.0)*U.pad_rot_angle;
@@ -1288,8 +1298,8 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
q1[1]*= si;
q1[2]*= si;
q1[3]*= si;
- QuatMul(v3d->viewquat, v3d->viewquat, q1);
- v3d->view= 0;
+ QuatMul(rv3d->viewquat, rv3d->viewquat, q1);
+ rv3d->view= 0;
}
ED_region_tag_redraw(ar);
}
@@ -1300,15 +1310,15 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
case V3D_VIEW_PANUP:
case V3D_VIEW_PANDOWN:
- initgrabz(v3d, 0.0, 0.0, 0.0);
+ initgrabz(rv3d, 0.0, 0.0, 0.0);
- if(viewnum == V3D_VIEW_PANRIGHT) window_to_3d(ar, v3d, vec, -32, 0);
- else if(viewnum == V3D_VIEW_PANLEFT) window_to_3d(ar, v3d, vec, 32, 0);
- else if(viewnum == V3D_VIEW_PANUP) window_to_3d(ar, v3d, vec, 0, -25);
- else if(viewnum == V3D_VIEW_PANDOWN) window_to_3d(ar, v3d, vec, 0, 25);
- v3d->ofs[0]+= vec[0];
- v3d->ofs[1]+= vec[1];
- v3d->ofs[2]+= vec[2];
+ if(viewnum == V3D_VIEW_PANRIGHT) window_to_3d(ar, vec, -32, 0);
+ else if(viewnum == V3D_VIEW_PANLEFT) window_to_3d(ar, vec, 32, 0);
+ else if(viewnum == V3D_VIEW_PANUP) window_to_3d(ar, vec, 0, -25);
+ else if(viewnum == V3D_VIEW_PANDOWN) window_to_3d(ar, vec, 0, 25);
+ rv3d->ofs[0]+= vec[0];
+ rv3d->ofs[1]+= vec[1];
+ rv3d->ofs[2]+= vec[2];
ED_region_tag_redraw(ar);
break;
@@ -1317,7 +1327,7 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
break;
}
- if(v3d->persp != V3D_CAMOB) perspo= v3d->persp;
+ if(rv3d->persp != V3D_CAMOB) perspo= rv3d->persp;
return OPERATOR_FINISHED;
}
@@ -1341,8 +1351,7 @@ void VIEW3D_OT_viewnumpad(wmOperatorType *ot)
static int view3d_clipping_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
rcti rect;
double mvmatrix[16];
double projmatrix[16];
@@ -1355,8 +1364,8 @@ static int view3d_clipping_exec(bContext *C, wmOperator *op)
rect.xmax= RNA_int_get(op->ptr, "xmax");
rect.ymax= RNA_int_get(op->ptr, "ymax");
- v3d->flag |= V3D_CLIPPING;
- v3d->clipbb= MEM_callocN(sizeof(BoundBox), "clipbb");
+ rv3d->rflag |= RV3D_CLIPPING;
+ rv3d->clipbb= MEM_callocN(sizeof(BoundBox), "clipbb");
/* note; otherwise opengl won't work */
view3d_operator_needs_opengl(C);
@@ -1383,35 +1392,35 @@ static int view3d_clipping_exec(bContext *C, wmOperator *op)
ys= (val==0||val==1)?rect.ymin:rect.ymax;
gluUnProject(xs, ys, 0.0, mvmatrix, projmatrix, viewport, &p[0], &p[1], &p[2]);
- VECCOPY(v3d->clipbb->vec[val], p);
+ VECCOPY(rv3d->clipbb->vec[val], p);
gluUnProject(xs, ys, 1.0, mvmatrix, projmatrix, viewport, &p[0], &p[1], &p[2]);
- VECCOPY(v3d->clipbb->vec[4+val], p);
+ VECCOPY(rv3d->clipbb->vec[4+val], p);
}
/* then plane equations */
for(val=0; val<4; val++) {
- CalcNormFloat(v3d->clipbb->vec[val], v3d->clipbb->vec[val==3?0:val+1], v3d->clipbb->vec[val+4],
- v3d->clip[val]);
+ CalcNormFloat(rv3d->clipbb->vec[val], rv3d->clipbb->vec[val==3?0:val+1], rv3d->clipbb->vec[val+4],
+ rv3d->clip[val]);
- v3d->clip[val][3]= - v3d->clip[val][0]*v3d->clipbb->vec[val][0]
- - v3d->clip[val][1]*v3d->clipbb->vec[val][1]
- - v3d->clip[val][2]*v3d->clipbb->vec[val][2];
+ rv3d->clip[val][3]= - rv3d->clip[val][0]*rv3d->clipbb->vec[val][0]
+ - rv3d->clip[val][1]*rv3d->clipbb->vec[val][1]
+ - rv3d->clip[val][2]*rv3d->clipbb->vec[val][2];
}
return OPERATOR_FINISHED;
}
static int view3d_clipping_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
-
- if(v3d->flag & V3D_CLIPPING) {
- v3d->flag &= ~V3D_CLIPPING;
- ED_area_tag_redraw(sa);
- if(v3d->clipbb) MEM_freeN(v3d->clipbb);
- v3d->clipbb= NULL;
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ ARegion *ar= CTX_wm_region(C);
+
+ if(rv3d->rflag & RV3D_CLIPPING) {
+ rv3d->rflag &= ~RV3D_CLIPPING;
+ ED_region_tag_redraw(ar);
+ if(rv3d->clipbb) MEM_freeN(rv3d->clipbb);
+ rv3d->clipbb= NULL;
return OPERATOR_FINISHED;
}
else {
@@ -1445,30 +1454,22 @@ void VIEW3D_OT_clipping(wmOperatorType *ot)
static int view3d_drawtype_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
+ View3D *v3d = CTX_wm_view3d(C);
int dt, dt_alt;
dt = RNA_int_get(op->ptr, "draw_type");
dt_alt = RNA_int_get(op->ptr, "draw_type_alternate");
- if (dt_alt != -1)
- {
+ if (dt_alt != -1) {
if (v3d->drawtype == dt)
- {
v3d->drawtype = dt_alt;
- }
else
- {
v3d->drawtype = dt;
- }
}
else
- {
v3d->drawtype = dt;
- }
- ED_area_tag_redraw(sa);
+ ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
@@ -1503,7 +1504,8 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
- View3D *v3d= CTX_wm_view3d(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
float dx, dy, fz, *fp = NULL, dvec[3], oldcurs[3];
short mx, my, mval[2];
// short ctrl= 0; // XXX
@@ -1515,26 +1517,26 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
mx= event->x - ar->winrct.xmin;
my= event->y - ar->winrct.ymin;
- project_short_noclip(ar, v3d, fp, mval);
+ project_short_noclip(ar, fp, mval);
- initgrabz(v3d, fp[0], fp[1], fp[2]);
+ initgrabz(rv3d, fp[0], fp[1], fp[2]);
if(mval[0]!=IS_CLIPPED) {
- window_to_3d(ar, v3d, dvec, mval[0]-mx, mval[1]-my);
+ window_to_3d(ar, dvec, mval[0]-mx, mval[1]-my);
VecSubf(fp, fp, dvec);
}
else {
- dx= ((float)(mx-(ar->winx/2)))*v3d->zfac/(ar->winx/2);
- dy= ((float)(my-(ar->winy/2)))*v3d->zfac/(ar->winy/2);
+ dx= ((float)(mx-(ar->winx/2)))*rv3d->zfac/(ar->winx/2);
+ dy= ((float)(my-(ar->winy/2)))*rv3d->zfac/(ar->winy/2);
- fz= v3d->persmat[0][3]*fp[0]+ v3d->persmat[1][3]*fp[1]+ v3d->persmat[2][3]*fp[2]+ v3d->persmat[3][3];
- fz= fz/v3d->zfac;
+ fz= rv3d->persmat[0][3]*fp[0]+ rv3d->persmat[1][3]*fp[1]+ rv3d->persmat[2][3]*fp[2]+ rv3d->persmat[3][3];
+ fz= fz/rv3d->zfac;
- fp[0]= (v3d->persinv[0][0]*dx + v3d->persinv[1][0]*dy+ v3d->persinv[2][0]*fz)-v3d->ofs[0];
- fp[1]= (v3d->persinv[0][1]*dx + v3d->persinv[1][1]*dy+ v3d->persinv[2][1]*fz)-v3d->ofs[1];
- fp[2]= (v3d->persinv[0][2]*dx + v3d->persinv[1][2]*dy+ v3d->persinv[2][2]*fz)-v3d->ofs[2];
+ fp[0]= (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy+ rv3d->persinv[2][0]*fz)-rv3d->ofs[0];
+ fp[1]= (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy+ rv3d->persinv[2][1]*fz)-rv3d->ofs[1];
+ fp[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy+ rv3d->persinv[2][2]*fz)-rv3d->ofs[2];
}
// if(lr_click) {
@@ -1573,18 +1575,14 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot)
/* XXX todo Zooms in on a border drawn by the user */
int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mouse_worldloc[3] ) //, float *autodist )
{
+ RegionView3D *rv3d= ar->regiondata;
+ bglMats mats; /* ZBuffer depth vars */
rcti rect;
- /* ZBuffer depth vars */
- bglMats mats;
float depth, depth_close= MAXFLOAT;
int had_depth = 0;
double cent[2], p[3];
int xs, ys;
- // XXX getmouseco_areawin(mval);
-
- // XXX persp(PERSP_VIEW);
-
rect.xmax = mval[0] + 4;
rect.ymax = mval[1] + 4;
@@ -1596,9 +1594,9 @@ int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mou
draw_depth(scene, ar, v3d, NULL);
/* force updating */
- if (v3d->depths) {
+ if (rv3d->depths) {
had_depth = 1;
- v3d->depths->damaged = 1;
+ rv3d->depths->damaged = 1;
}
view3d_update_depths(ar, v3d);
@@ -1606,14 +1604,14 @@ int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mou
/* Constrain rect to depth bounds */
if (rect.xmin < 0) rect.xmin = 0;
if (rect.ymin < 0) rect.ymin = 0;
- if (rect.xmax >= v3d->depths->w) rect.xmax = v3d->depths->w-1;
- if (rect.ymax >= v3d->depths->h) rect.ymax = v3d->depths->h-1;
+ if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
+ if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
/* Find the closest Z pixel */
for (xs=rect.xmin; xs < rect.xmax; xs++) {
for (ys=rect.ymin; ys < rect.ymax; ys++) {
- depth= v3d->depths->depths[ys*v3d->depths->w+xs];
- if(depth < v3d->depths->depth_range[1] && depth > v3d->depths->depth_range[0]) {
+ depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
+ if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
if (depth_close > depth) {
depth_close = depth;
}
@@ -1625,10 +1623,10 @@ int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mou
return 0;
if (had_depth==0) {
- MEM_freeN(v3d->depths->depths);
- v3d->depths->depths = NULL;
+ MEM_freeN(rv3d->depths->depths);
+ rv3d->depths->depths = NULL;
}
- v3d->depths->damaged = 1;
+ rv3d->depths->damaged = 1;
cent[0] = (double)mval[0];
cent[1] = (double)mval[1];
@@ -1693,8 +1691,8 @@ void filterNDOFvalues(float *sbval)
sbval[i]=0.0;
}
-// statics for controlling v3d->dist corrections.
-// viewmoveNDOF zeros and adjusts v3d->ofs.
+// statics for controlling rv3d->dist corrections.
+// viewmoveNDOF zeros and adjusts rv3d->ofs.
// viewmove restores based on dz_flag state.
int dz_flag = 0;
@@ -1702,6 +1700,7 @@ float m_dist;
void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
{
+ RegionView3D *rv3d= ar->regiondata;
int i;
float phi;
float dval[7];
@@ -1752,10 +1751,10 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
// until the first draw and doesn't update the menu
// to reflect persp mode.
- v3d->persp = V3D_PERSP;
+ rv3d->persp = V3D_PERSP;
- // Correct the distance jump if v3d->dist != 0
+ // Correct the distance jump if rv3d->dist != 0
// This is due to a side effect of the original
// mouse view rotation code. The rotation point is
@@ -1767,15 +1766,15 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
// movement devices must subtract this from their
// view transformations.
- if(v3d->dist != 0.0) {
+ if(rv3d->dist != 0.0) {
dz_flag = 1;
- m_dist = v3d->dist;
+ m_dist = rv3d->dist;
upvec[0] = upvec[1] = 0;
- upvec[2] = v3d->dist;
- Mat3CpyMat4(mat, v3d->viewinv);
+ upvec[2] = rv3d->dist;
+ Mat3CpyMat4(mat, rv3d->viewinv);
Mat3MulVecfl(mat, upvec);
- VecSubf(v3d->ofs, v3d->ofs, upvec);
- v3d->dist = 0.0;
+ VecSubf(rv3d->ofs, rv3d->ofs, upvec);
+ rv3d->dist = 0.0;
}
@@ -1788,7 +1787,7 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
// rotate device x and y by view z
- Mat3CpyMat4(mat, v3d->viewinv);
+ Mat3CpyMat4(mat, rv3d->viewinv);
mat[2][2] = 0.0f;
Mat3MulVecfl(mat, rvec);
@@ -1797,7 +1796,7 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
phi = Normalize(rvec);
if(phi != 0) {
VecRotToQuat(rvec,phi,q1);
- QuatMul(v3d->viewquat, v3d->viewquat, q1);
+ QuatMul(rv3d->viewquat, rv3d->viewquat, q1);
}
@@ -1810,13 +1809,13 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
// the next three lines rotate the x and y translation coordinates
// by the current z axis angle
- Mat3CpyMat4(mat, v3d->viewinv);
+ Mat3CpyMat4(mat, rv3d->viewinv);
mat[2][2] = 0.0f;
Mat3MulVecfl(mat, tvec);
// translate the view
- VecSubf(v3d->ofs, v3d->ofs, tvec);
+ VecSubf(rv3d->ofs, rv3d->ofs, tvec);
/*----------------------------------------------------
@@ -1828,55 +1827,56 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
// XXX BIF_view3d_previewrender_signal(ar, PR_DBASE|PR_DISPRECT);
}
-void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
+void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
{
- float fval[7];
- float dvec[3];
- float sbadjust = 1.0f;
- float len;
+ RegionView3D *rv3d= ar->regiondata;
+ float fval[7];
+ float dvec[3];
+ float sbadjust = 1.0f;
+ float len;
short use_sel = 0;
Object *ob = OBACT;
- float m[3][3];
- float m_inv[3][3];
- float xvec[3] = {1,0,0};
- float yvec[3] = {0,-1,0};
- float zvec[3] = {0,0,1};
+ float m[3][3];
+ float m_inv[3][3];
+ float xvec[3] = {1,0,0};
+ float yvec[3] = {0,-1,0};
+ float zvec[3] = {0,0,1};
float phi, si;
- float q1[4];
- float obofs[3];
- float reverse;
- //float diff[4];
- float d, curareaX, curareaY;
- float mat[3][3];
- float upvec[3];
+ float q1[4];
+ float obofs[3];
+ float reverse;
+ //float diff[4];
+ float d, curareaX, curareaY;
+ float mat[3][3];
+ float upvec[3];
/* Sensitivity will control how fast the view rotates. The value was
* obtained experimentally by tweaking until the author didn't get dizzy watching.
* Perhaps this should be a configurable user parameter.
*/
- float psens = 0.005f * (float) U.ndof_pan; /* pan sensitivity */
- float rsens = 0.005f * (float) U.ndof_rotate; /* rotate sensitivity */
- float zsens = 0.3f; /* zoom sensitivity */
+ float psens = 0.005f * (float) U.ndof_pan; /* pan sensitivity */
+ float rsens = 0.005f * (float) U.ndof_rotate; /* rotate sensitivity */
+ float zsens = 0.3f; /* zoom sensitivity */
- const float minZoom = -30.0f;
- const float maxZoom = 300.0f;
+ const float minZoom = -30.0f;
+ const float maxZoom = 300.0f;
//reset view type
- v3d->view = 0;
+ rv3d->view = 0;
//printf("passing here \n");
//
if (scene->obedit==NULL && ob && !(ob->flag & OB_POSEMODE)) {
use_sel = 1;
}
- if((dz_flag)||v3d->dist==0) {
+ if((dz_flag)||rv3d->dist==0) {
dz_flag = 0;
- v3d->dist = m_dist;
+ rv3d->dist = m_dist;
upvec[0] = upvec[1] = 0;
- upvec[2] = v3d->dist;
- Mat3CpyMat4(mat, v3d->viewinv);
+ upvec[2] = rv3d->dist;
+ Mat3CpyMat4(mat, rv3d->viewinv);
Mat3MulVecfl(mat, upvec);
- VecAddf(v3d->ofs, v3d->ofs, upvec);
+ VecAddf(rv3d->ofs, rv3d->ofs, upvec);
}
/*----------------------------------------------------
@@ -1904,25 +1904,24 @@ void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
// put scaling back here, was previously in ghostwinlay
- fval[0] = fval[0] * (1.0f/600.0f);
- fval[1] = fval[1] * (1.0f/600.0f);
- fval[2] = fval[2] * (1.0f/1100.0f);
- fval[3] = fval[3] * 0.00005f;
- fval[4] =-fval[4] * 0.00005f;
- fval[5] = fval[5] * 0.00005f;
- fval[6] = fval[6] / 1000000.0f;
+ fval[0] = fval[0] * (1.0f/600.0f);
+ fval[1] = fval[1] * (1.0f/600.0f);
+ fval[2] = fval[2] * (1.0f/1100.0f);
+ fval[3] = fval[3] * 0.00005f;
+ fval[4] =-fval[4] * 0.00005f;
+ fval[5] = fval[5] * 0.00005f;
+ fval[6] = fval[6] / 1000000.0f;
// scale more if not in perspective mode
- if (v3d->persp == V3D_ORTHO) {
- fval[0] = fval[0] * 0.05f;
- fval[1] = fval[1] * 0.05f;
- fval[2] = fval[2] * 0.05f;
- fval[3] = fval[3] * 0.9f;
- fval[4] = fval[4] * 0.9f;
- fval[5] = fval[5] * 0.9f;
- zsens *= 8;
- }
-
+ if (rv3d->persp == V3D_ORTHO) {
+ fval[0] = fval[0] * 0.05f;
+ fval[1] = fval[1] * 0.05f;
+ fval[2] = fval[2] * 0.05f;
+ fval[3] = fval[3] * 0.9f;
+ fval[4] = fval[4] * 0.9f;
+ fval[5] = fval[5] * 0.9f;
+ zsens *= 8;
+ }
/* set object offset */
if (ob) {
@@ -1931,7 +1930,7 @@ void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
obofs[2] = -ob->obmat[3][2];
}
else {
- VECCOPY(obofs, v3d->ofs);
+ VECCOPY(obofs, rv3d->ofs);
}
/* calc an adjustment based on distance from camera
@@ -1939,12 +1938,12 @@ void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
d = 1.0f;
/* if (ob) {
- VecSubf(diff, obofs, v3d->ofs);
+ VecSubf(diff, obofs, rv3d->ofs);
d = VecLength(diff);
}
*/
- reverse = (v3d->persmat[2][1] < 0.0f) ? -1.0f : 1.0f;
+ reverse = (rv3d->persmat[2][1] < 0.0f) ? -1.0f : 1.0f;
/*----------------------------------------------------
* ndof device pan
@@ -1952,25 +1951,25 @@ void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
psens *= 1.0f + d;
curareaX = sbadjust * psens * fval[0];
curareaY = sbadjust * psens * fval[1];
- dvec[0] = curareaX * v3d->persinv[0][0] + curareaY * v3d->persinv[1][0];
- dvec[1] = curareaX * v3d->persinv[0][1] + curareaY * v3d->persinv[1][1];
- dvec[2] = curareaX * v3d->persinv[0][2] + curareaY * v3d->persinv[1][2];
- VecAddf(v3d->ofs, v3d->ofs, dvec);
+ dvec[0] = curareaX * rv3d->persinv[0][0] + curareaY * rv3d->persinv[1][0];
+ dvec[1] = curareaX * rv3d->persinv[0][1] + curareaY * rv3d->persinv[1][1];
+ dvec[2] = curareaX * rv3d->persinv[0][2] + curareaY * rv3d->persinv[1][2];
+ VecAddf(rv3d->ofs, rv3d->ofs, dvec);
/*----------------------------------------------------
* ndof device dolly
*/
len = zsens * sbadjust * fval[2];
- if (v3d->persp==V3D_CAMOB) {
- if(v3d->persp==V3D_CAMOB) { /* This is stupid, please fix - TODO */
- v3d->camzoom+= 10.0f * -len;
+ if (rv3d->persp==V3D_CAMOB) {
+ if(rv3d->persp==V3D_CAMOB) { /* This is stupid, please fix - TODO */
+ rv3d->camzoom+= 10.0f * -len;
}
- if (v3d->camzoom < minZoom) v3d->camzoom = minZoom;
- else if (v3d->camzoom > maxZoom) v3d->camzoom = maxZoom;
+ if (rv3d->camzoom < minZoom) rv3d->camzoom = minZoom;
+ else if (rv3d->camzoom > maxZoom) rv3d->camzoom = maxZoom;
}
- else if ((v3d->dist> 0.001*v3d->grid) && (v3d->dist<10.0*v3d->far)) {
- v3d->dist*=(1.0 + len);
+ else if ((rv3d->dist> 0.001*v3d->grid) && (rv3d->dist<10.0*v3d->far)) {
+ rv3d->dist*=(1.0 + len);
}
@@ -1980,7 +1979,7 @@ void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
*/
/* Get the 3x3 matrix and its inverse from the quaternion */
- QuatToMat3(v3d->viewquat, m);
+ QuatToMat3(rv3d->viewquat, m);
Mat3Inv(m_inv,m);
/* Determine the direction of the x vector (for rotating up and down) */
@@ -1996,13 +1995,13 @@ void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
q1[1] = si * xvec[0];
q1[2] = si * xvec[1];
q1[3] = si * xvec[2];
- QuatMul(v3d->viewquat, v3d->viewquat, q1);
+ QuatMul(rv3d->viewquat, rv3d->viewquat, q1);
if (use_sel) {
QuatConj(q1); /* conj == inv for unit quat */
VecSubf(v3d->ofs, v3d->ofs, obofs);
- QuatMulVecf(q1, v3d->ofs);
- VecAddf(v3d->ofs, v3d->ofs, obofs);
+ QuatMulVecf(q1, rv3d->ofs);
+ VecAddf(rv3d->ofs, rv3d->ofs, obofs);
}
/* Perform the orbital rotation */
@@ -2021,13 +2020,13 @@ void viewmoveNDOF(Scene *scene, View3D *v3d, int mode)
q1[0] = cos(phi);
q1[1] = q1[2] = 0.0;
q1[3] = sin(phi);
- QuatMul(v3d->viewquat, v3d->viewquat, q1);
+ QuatMul(rv3d->viewquat, rv3d->viewquat, q1);
if (use_sel) {
QuatConj(q1);
- VecSubf(v3d->ofs, v3d->ofs, obofs);
- QuatMulVecf(q1, v3d->ofs);
- VecAddf(v3d->ofs, v3d->ofs, obofs);
+ VecSubf(rv3d->ofs, rv3d->ofs, obofs);
+ QuatMulVecf(q1, rv3d->ofs);
+ VecAddf(rv3d->ofs, rv3d->ofs, obofs);
}
/*----------------------------------------------------
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index fd37b5bcddd..95dd7489392 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -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);
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index f40344dd95b..fcdd2cd77f8 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -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 */
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index d6f6b0439fd..ef29e21d047 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -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;
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index f97375c767a..1f2ba4b4b96 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -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
}
}
diff --git a/source/blender/editors/space_view3d/vpaint.c b/source/blender/editors/space_view3d/vpaint.c
index b8fe979a17f..a636f8be9ee 100644
--- a/source/blender/editors/space_view3d/vpaint.c
+++ b/source/blender/editors/space_view3d/vpaint.c
@@ -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);
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 95878a35b62..cdbc45e8a4a 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -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);
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 6198a8ec145..883b5b9d484 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -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);
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 0c0c78c969d..6d4eb18c766 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -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
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 2f7a3821022..8546160cfef 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -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;
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 08c4a2ff820..6b405d13522 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -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;
}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 5312050b2d9..9308cf73af8 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -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;
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index c89ab10c2a9..7af8b48219c 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -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", ""},
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index 5fe45f2e94a..908357e8277 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -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)
{
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index f139651c608..7e27fb32044 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -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)
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 5ee620d7a19..307c116d596 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -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);
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 393a1349931..6f69a2b8a31 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -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)
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index eba1bde0b6f..6826329627b 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -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
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 5f49e0ffeee..0c561536d32 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -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
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 4f6d8989f9d..ee50854f05c 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -71,92 +71,114 @@ 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;
+
+ /* 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;
+
+ /* animated smooth view */
+ struct SmoothViewStore *sms;
+ struct wmTimer *smooth_timer;
+
+ /* 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;
- struct RenderInfo *ri;
- struct RetopoViewData *retopo_view_data;
- struct ViewDepths *depths;
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;
- int lay, layact;
- short scenelock, around, camzoom;
+ short scenelock, around, pad3;
+ short flag, flag2;
- char pivot_last, pad1; /* pivot_last is for rotating around the last edited element */
+ short pivot_last; /* 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];
+ float lens, grid, gridview, padf, near, far;
+ float ofs[3]; /* XXX depricated */
+ float cursor[3];
- short gridlines, viewbut;
+ short gridlines, pad4;
short gridflag;
- short modeselect, menunr, texnr;
+ 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;
- float twmat[4][4];
- /* user defined clipping planes */
- float clip[4][4];
-
- struct BoundBox *clipbb;
+ /* customdata flags from modes */
+ unsigned int customdata_mask;
/* 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 */
+ 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) */
- /* animated smooth view */
- struct SmoothViewStore *sms;
- struct wmTimer *smooth_timer;
-
- /* last view */
- float lviewquat[4];
- short lpersp, lview;
-
- /* customdata flags from modes */
- unsigned int customdata_mask;
} 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
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index d5eaeb34f1b..7f9165b0cfb 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -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,
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
index 46f3141be29..09cc9120e6a 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
@@ -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;
}
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp
index fc6498579ad..8be612503bc 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.cpp
+++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp
@@ -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();
diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
index 4d79febb7b4..17bb3dedd36 100644
--- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
+++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
@@ -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;