4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 * The Original Code is Copyright (C) 2008 Blender Foundation.
21 * All rights reserved.
24 * Contributor(s): Blender Foundation
26 * ***** END GPL LICENSE BLOCK *****
32 #include "DNA_object_types.h"
33 #include "DNA_space_types.h"
34 #include "DNA_scene_types.h"
35 #include "DNA_screen_types.h"
36 #include "DNA_view3d_types.h"
38 #include "MEM_guardedalloc.h"
40 #include "BLI_blenlib.h"
41 #include "BLI_arithb.h"
44 #include "BKE_context.h"
45 #include "BKE_global.h"
46 #include "BKE_screen.h"
47 #include "BKE_utildefines.h"
49 #include "ED_space_api.h"
50 #include "ED_screen.h"
57 #include "UI_interface.h"
58 #include "UI_resources.h"
59 #include "UI_view2d.h"
61 #include "view3d_intern.h" // own include
63 /* ******************** default callbacks for view3d space ***************** */
65 static SpaceLink *view3d_new(const bContext *C)
67 Scene *scene= CTX_data_scene(C);
71 vd= MEM_callocN(sizeof(View3D), "initview3d");
72 vd->spacetype= SPACE_VIEW3D;
74 vd->lay= vd->layact= 1;
76 vd->lay= vd->layact= scene->lay;
77 vd->camera= scene->camera;
83 vd->drawtype= OB_WIRE;
85 vd->gridflag |= V3D_SHOW_X;
86 vd->gridflag |= V3D_SHOW_Y;
87 vd->gridflag |= V3D_SHOW_FLOOR;
88 vd->gridflag &= ~V3D_SHOW_Z;
92 /* XXX move view data to region? */
93 vd->viewquat[0]= 1.0f;
94 vd->viewquat[1]= vd->viewquat[2]= vd->viewquat[3]= 0.0f;
103 ar= MEM_callocN(sizeof(ARegion), "header for view3d");
105 BLI_addtail(&vd->regionbase, ar);
106 ar->regiontype= RGN_TYPE_HEADER;
107 ar->alignment= RGN_ALIGN_BOTTOM;
110 ar= MEM_callocN(sizeof(ARegion), "main area for view3d");
112 BLI_addtail(&vd->regionbase, ar);
113 ar->regiontype= RGN_TYPE_WINDOW;
115 return (SpaceLink *)vd;
118 /* not spacelink itself */
119 static void view3d_free(SpaceLink *sl)
121 View3D *vd= (View3D *) sl;
124 if(vd->bgpic->ima) vd->bgpic->ima->id.us--;
125 MEM_freeN(vd->bgpic);
128 if(vd->localvd) MEM_freeN(vd->localvd);
129 if(vd->clipbb) MEM_freeN(vd->clipbb);
131 if(vd->depths->depths) MEM_freeN(vd->depths->depths);
132 MEM_freeN(vd->depths);
136 // XXX retopo_free_view_data(vd);
138 if(vd->properties_storage) MEM_freeN(vd->properties_storage);
140 // XXX BIF_view3d_previewrender_free(vd);
146 /* spacetype; init callback */
147 static void view3d_init(struct wmWindowManager *wm, ScrArea *sa)
152 static SpaceLink *view3d_duplicate(SpaceLink *sl)
154 View3D *v3do= (View3D *)sl;
155 View3D *v3dn= MEM_dupallocN(sl);
157 /* clear or remove stuff from old */
159 // XXX BIF_view3d_previewrender_free(v3do);
161 v3do->retopo_view_data= NULL;
164 // XXX restore_localviewdata(v3do);
166 v3do->properties_storage= NULL;
168 v3do->lay &= 0xFFFFFF;
171 /* copy or clear inside new stuff */
174 v3dn->bgpic= MEM_dupallocN(v3dn->bgpic);
175 if(v3dn->bgpic->ima) v3dn->bgpic->ima->id.us++;
177 v3dn->clipbb= MEM_dupallocN(v3dn->clipbb);
179 v3dn->properties_storage= NULL;
181 return (SpaceLink *)v3dn;
184 static void view3d_main_area_draw(const bContext *C, ARegion *ar)
186 /* draw entirely, view changes should be handled here */
187 ScrArea *sa= CTX_wm_area(C);
188 View3D *v3d= sa->spacedata.first; /* XXX get from region */
190 drawview3dspace(CTX_data_scene(C), ar, v3d);
193 /* add handlers, stuff you only do once or on area/region changes */
194 static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
199 keymap= WM_keymap_listbase(wm, "View3D", SPACE_VIEW3D, 0);
200 WM_event_add_keymap_handler(&ar->handlers, keymap);
203 keymap= WM_keymap_listbase(wm, "Object Non-modal", 0, 0);
204 WM_event_add_keymap_handler(&ar->handlers, keymap);
206 /* object modal ops default */
207 keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
208 WM_event_add_keymap_handler(&ar->handlers, keymap);
212 static void view3d_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype)
216 keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
217 if(stype==NS_MODE_OBJECT)
218 WM_event_add_keymap_handler(&ar->handlers, keymap);
220 WM_event_remove_keymap_handler(&ar->handlers, keymap);
223 keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0);
224 if(stype==NS_EDITMODE_MESH)
225 WM_event_add_keymap_handler(&ar->handlers, keymap);
227 WM_event_remove_keymap_handler(&ar->handlers, keymap);
231 static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
233 /* context changes */
234 switch(wmn->category) {
240 ED_region_tag_redraw(ar);
243 view3d_modal_keymaps(wmn->wm, ar, wmn->subtype);
244 ED_region_tag_redraw(ar);
255 ED_region_tag_redraw(ar);
260 case ND_SHADING_DRAW:
261 ED_region_tag_redraw(ar);
266 case ND_LIGHTING_DRAW:
267 ED_region_tag_redraw(ar);
273 /* add handlers, stuff you only do once or on area/region changes */
274 static void view3d_header_area_init(wmWindowManager *wm, ARegion *ar)
276 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
279 static void view3d_header_area_draw(const bContext *C, ARegion *ar)
284 if(ED_screen_area_active(C))
285 UI_GetThemeColor3fv(TH_HEADER, col);
287 UI_GetThemeColor3fv(TH_HEADERDESEL, col);
289 glClearColor(col[0], col[1], col[2], 0.0);
290 glClear(GL_COLOR_BUFFER_BIT);
292 /* set view2d view matrix for scrolling (without scrollers) */
293 UI_view2d_view_ortho(C, &ar->v2d);
295 view3d_header_buttons(C, ar);
297 /* restore view matrix? */
298 UI_view2d_view_restore(C);
301 static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
303 /* context changes */
304 switch(wmn->category) {
311 ED_region_tag_redraw(ar);
319 static int view3d_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
321 View3D *v3d= (View3D*)CTX_wm_space_data(C);
322 Scene *scene= CTX_data_scene(C);
325 if(ELEM(member, CTX_data_selected_objects, CTX_data_selected_bases)) {
326 for(base=scene->base.first; base; base=base->next) {
327 if((base->flag & SELECT) && (base->lay & v3d->lay)) {
328 if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
329 if(member == CTX_data_selected_objects)
330 CTX_data_list_add(result, base->object);
332 CTX_data_list_add(result, base);
339 else if(ELEM(member, CTX_data_visible_objects, CTX_data_visible_bases)) {
340 for(base=scene->base.first; base; base=base->next) {
341 if(base->lay & v3d->lay) {
342 if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
343 if(member == CTX_data_selected_objects)
344 CTX_data_list_add(result, base->object);
346 CTX_data_list_add(result, base);
353 else if(member == CTX_data_active_base) {
354 if(scene->basact && (scene->basact->lay & v3d->lay))
355 if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
356 CTX_data_pointer_set(result, scene->basact);
360 else if(member == CTX_data_active_object) {
361 if(scene->basact && (scene->basact->lay & v3d->lay))
362 if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
363 CTX_data_pointer_set(result, scene->basact->object);
371 /* only called once, from space/spacetypes.c */
372 void ED_spacetype_view3d(void)
374 SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype view3d");
377 st->spaceid= SPACE_VIEW3D;
380 st->free= view3d_free;
381 st->init= view3d_init;
382 st->duplicate= view3d_duplicate;
383 st->operatortypes= view3d_operatortypes;
384 st->keymap= view3d_keymap;
385 st->context= view3d_context;
387 /* regions: main window */
388 art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
389 art->regionid = RGN_TYPE_WINDOW;
390 art->draw= view3d_main_area_draw;
391 art->init= view3d_main_area_init;
392 art->listener= view3d_main_area_listener;
393 BLI_addhead(&st->regiontypes, art);
395 /* regions: header */
396 art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
397 art->regionid = RGN_TYPE_HEADER;
398 art->minsizey= HEADERY;
399 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
400 art->listener= view3d_header_area_listener;
402 art->init= view3d_header_area_init;
403 art->draw= view3d_header_area_draw;
405 BLI_addhead(&st->regiontypes, art);
407 BKE_spacetype_register(st);