From BlenderWiki
version 1 wiki version 2 wiki
// 2.65.10 bex ED_spacetypes_init - draw // // # = no sub functions // * = duplicate // no tab = no check /* * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * The Original Code is Copyright (C) 2009 Blender Foundation * All rights reserved. * * The Original Code is: all of this file. * * ***** END GPL LICENSE BLOCK ***** */ ---------------------------------------------------------------- -------------------------------- // locate: the function that allocates the SpaceType.ARegionType->draw callbacks // : source/blender/editors/space_api/spacetypes.c: ED_spacetypes_init(void) // : ED_spacetypes_init(void) executes the sub functions -------------------------------- -------------------------------- // locate: ED_spacetypes_init(void) // : source/blender/windowmanager/intern/wm_init_exit.c: WM_init(bContext *C, int argc, const char **argv) -------------------------------- -------------------------------- // locate: the function that executes the allocated SpaceType.ARegionType->draw callbacks // : source/blender/windowmanager/intern/wm_draw.c: wm_method_draw_full(C, win); // : source/blender/editors/screen/screen_edit.c: ED_region_do_draw(C, ar); // : executes draw(C,ar); from ARegionType -------------------------------- -------------------------------- main(int argc, const char **argv) // source/creator/creator.c WM_init(C, argc, (const char **)argv); // source/blender/windowmanager/intern/wm_init_exit.c ED_spacetypes_init(); // source/blender/editors/space_api/spacetypes.c ED_spacetype_outliner(); ED_spacetype_time(); ED_spacetype_view3d(); // example: spacetypes->regiontypes->draw = view3d_main_area_draw; WM_main(C); wm_draw_update(C); // source/blender/windowmanager/intern/wm_draw.c wm_method_draw_overlap_all(C, win, 0); // source/blender/windowmanager/intern/wm_draw.c ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); // example: spacetypes->regiontypes->view3d_main_area_draw(C,ar); ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); wm_method_draw_full(C, win); // source/blender/windowmanager/intern/wm_draw.c ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); wm_method_draw_triple(C, win); // source/blender/windowmanager/intern/wm_draw.c ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c draw(C, ar); -------------------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- int main(int argc, const char **argv) // source/creator/creator.c { /* -------------------------------- */ skipped some of the condition init macro functions, e.g. python module. WM_main wm_window_process_events mouse keyboard (OS to blender) wm_event_do_handlers view handlers to notiiers (view) and operators (data) wm_event_do_notifiers notiiers to listeners to view (view update) wm_draw_update draw view the draw methods are: wm_method_draw_overlap_all wm_method_draw_full wm_method_draw_triple screen -> area -> space screen -> area -> region -> panel event keyboard mouse input view view handler a handler handleds the the GUI events (mouse over, mouse click) the results are sent to operators and notifiers notifier a notifier updates the view via listeners if a mouse is over a button the button should be highlighted the results are sent to listeners operator operators executes tools rotate armature, scale mesh, pad view, add shapekey they also update the view the results are sent to operator_storage, data and listeners listener listeners update the view with with the results from the notifiers data this is the memory, context, project operator_storage dont know, operator data /* -------------------------------- */ CTX_create(); CommandLineToArgvW(GetCommandLineW(), &argc); MEM_mallocN(argc * sizeof(char *), "argv array"); alloc_utf_8_from_16(argv_16[argci], 0); LocalFree(argv_16); BLI_init_program_path(argv[0]); BLI_threadapi_init(); initglobals(); IMB_init(); BKE_images_init(); IMB_ffmpeg_init(); BLI_callback_global_init(); SYS_GetSystem(); RNA_init(); RE_engines_init(); init_nodesystem(); BKE_vfont_builtin_register(datatoc_bfont_pfb, datatoc_bfont_pfb_size); sound_init_once(); init_def_material(); WM_init(C, argc, (const char **)argv); // source/blender/windowmanager/intern/wm_init_exit.c wm_ghost_init(C); wm_init_cursor_data(); GHOST_CreateSystemPaths(); BKE_addon_pref_type_init(); wm_operatortype_init(); WM_menutype_init(); WM_uilisttype_init(); set_free_windowmanager_cb(wm_close_and_free); set_blender_test_break_cb(wm_window_testbreak); DAG_editors_update_cb(ED_render_id_flush_update, ED_render_scene_update); ED_spacetypes_init(); // source/blender/editors/space_api/spacetypes.c ED_spacetype_outliner(); ED_spacetype_time(); ED_spacetype_view3d(); // source/blender/editors/space_view3d/space_view3d.c ... ED_operatortypes_screen(); ED_operatortypes_anim(); ED_operatortypes_animchannels(); ... UI_view2d_operatortypes(); UI_buttons_operatortypes(); BKE_spacetypes_list(); operatortypes(); ED_operatormacros_armature(); ED_operatormacros_mesh(); ED_operatormacros_node(); ... BKE_spacetypes_list(); dropboxes(); ED_file_init(); ED_node_init_butfuncs(); BLF_init(11, U.dpi); BLF_lang_init(); wm_homefile_read(C, NULL, G.factory_startup); BLF_lang_set(NULL); BPY_context_set(C); BPY_python_start(argc, argv); BPY_driver_reset(); BPY_app_handlers_reset(FALSE); BPY_modules_load_user(C); GHOST_toggleConsole(3); wm_init_reports(C); GPU_extensions_init(); GPU_set_mipmap(!(U.gameflags & USER_DISABLE_MIPMAP)); GPU_set_anisotropic(U.anisotropic_filter); GPU_set_gpu_mipmapping(U.use_gpu_mipmap); UI_init(); clear_matcopybuf(); ED_render_clear_mtex_copybuf(); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); ED_preview_init_dbase(); wm_read_history(); BLI_make_file_string("/", G.main->name, BLI_getDefaultDocumentFolder(), "untitled.blend"); BLI_strncpy(G.lib, G.main->name, FILE_MAX); wm_recover_last_session(C, NULL); BLI_init_temporary_dir(U.tempdir); BLI_setenv("SDL_VIDEODRIVER", "dummy"); WM_init(C, argc, (const char **)argv); BLI_init_temporary_dir(NULL); CTX_py_init_set(C, 1); WM_keymap_init(C); // source/blender/windowmanager/intern/wm.c CTX_wm_manager(C); WM_keyconfig_new(wm, "Blender"); WM_keyconfig_new(wm, "Blender Addon"); WM_keyconfig_new(wm, "Blender User"); CTX_py_init_get(C) wm_window_keymap(wm->defaultconf); ED_spacetypes_keymap(wm->defaultconf); WM_keyconfig_update_tag(NULL, NULL); WM_keyconfig_update(wm); free(argv[--argci]); MEM_freeN(argv); WM_exit(C); WM_init_game(C)) WM_init_splash(C); WM_main(C); // source/blender/windowmanager/intern/wm.c wm_window_process_events(C); wm_event_do_handlers(C); wm_event_do_notifiers(C); // source/blender/windowmanager/intern/wm_event_system.c CTX_wm_manager(C); CTX_wm_window_set(C, win); ELEM(note->data, ND_FILEREAD, ND_FILESAVE) wm_window_title(wm, win); wm_window_title(wm, win); ED_screen_set(C, note->reference); printf("%s: screen set %p\n", __func__, note->reference); ED_screen_delete(C, note->reference); printf("%s: screen delete %p\n", __func__, note->reference); CTX_data_scene(C) ELEM5(note->category, NC_SCENE, NC_OBJECT, NC_GEOM, NC_SCENE, NC_WM) ED_info_stats_clear(CTX_data_scene(C)); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_INFO, NULL); ED_update_for_newframe(CTX_data_main(C), win->screen->scene, 1); CTX_wm_window_set(C, win); ED_screen_do_listen(C, note); // source/blender/editors/screen/screen_edit.c CTX_wm_window(C); uiFreeActiveButtons(C, win->screen); region_cursor_set(win, note->swinid, TRUE); ED_region_do_listen(ar, note); // source/blender/editors/screen/area.c ED_region_tag_redraw(ar); ED_region_tag_redraw(ar); ar->type->listener(ar, note); ED_area_do_listen(sa, note); // source/blender/editors/screen/area.c sa->type->listener(sa, note); ED_region_do_listen(ar, note); * MEM_freeN(note); ED_view3d_screen_datamask(win->screen); CTX_wm_window_set(C, win); CTX_wm_area_set(C, sa); ED_area_do_refresh(C, sa); CTX_data_main(C); BKE_scene_update_tagged(bmain, win->screen->scene); CTX_wm_window_set(C, NULL); wm_draw_update(C); // source/blender/windowmanager/intern/wm_draw.c CTX_wm_manager(C); // source/blender/windowmanager/intern/wm_draw.c GPU_free_unused_buffers(); GHOST_GetWindowState(win->ghostwin); wm_draw_window_clear(win); CTX_wm_window_set(C, win); wm_window_make_drawable(C, win); ED_screen_refresh(wm, win); // source/blender/editors/screen/screen_edit.c WM_window_pixels_x(win) WM_window_pixels_y(win) screen_refresh_headersizes(); screen_test_scale(win->screen, WM_window_pixels_x(win), WM_window_pixels_y(win)); wm_subwindow_open(win, &winrct); wm_subwindow_position(win, win->screen->mainwin, &winrct); ED_area_initialize(wm, win, sa); // source/blender/editors/screen/area.c BKE_spacetype_from_id(sa->spacetype); BKE_spacetype_from_id(sa->spacetype); BKE_regiontype_from_id(sa->type, ar->regiontype); area_calc_totrct(sa, WM_window_pixels_x(win), WM_window_pixels_y(win)); area_azone_initialize(win->screen, sa); region_rect_recursive(win, sa, sa->regionbase.first, &rect, 0); ed_default_handlers(wm, sa, &sa->handlers, sa->type->keymapflag); init(wm, sa); // spacetype callback region_subwindow(win, ar); ed_default_handlers(wm, sa, &ar->handlers, ar->type->keymapflag); init(wm, ar); uiFreeBlocks(NULL, &ar->uiblocks); WM_event_timer_sleep(wm, win, win->screen->animtimer, 0); printf("%s: set screen\n", __func__); wm_automatic_draw_method(win); wm_method_draw_overlap_all(C, win, 0); // source/blender/windowmanager/intern/wm_draw.c CTX_wm_manager(C); ED_region_tag_redraw(ar); // source/blender/editors/screen/screen_edit.c memset(&ar->drawrct, 0, sizeof(ar->drawrct)); wm_flush_regions_up(screen, &ar->winrct); wm_flush_regions_up(screen, &ar->winrct); wm_flush_regions_down(screen, &ar->winrct); wm_flush_regions_down(screen, &rect); wm_drags_draw(C, win, &rect); CTX_wm_area_set(C, sa); CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); * wm_paintcursor_draw(C, ar); ED_area_overdraw_flush(sa, ar); CTX_wm_region_set(C, NULL); CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); * wm_paintcursor_draw(C, ar); ED_area_overdraw_flush(sa, ar); CTX_wm_region_set(C, NULL); wm_area_mark_invalid_backbuf(sa); CTX_wm_area_set(C, NULL); ED_screen_draw(win); ED_screen_draw(win); ED_area_overdraw(C); CTX_wm_menu_set(C, ar); ED_region_do_draw(C, ar); * CTX_wm_menu_set(C, NULL); wm_gesture_draw(win); wm_drags_draw(C, win, NULL); wm_method_draw_full(C, win); // source/blender/windowmanager/intern/wm_draw.c CTX_wm_area_set(C, sa); CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); // source/blender/editors/screen/screen_edit.c CTX_wm_window(C); CTX_wm_area(C); max_ii(ar->winrct.xmin, ar->drawrct.xmin); max_ii(ar->winrct.ymin, ar->drawrct.ymin); min_ii(ar->winrct.xmax, ar->drawrct.xmax); min_ii(ar->winrct.ymax, ar->drawrct.ymax); wmSubWindowScissorSet(win, ar->swinid, &ar->drawrct); // source/blender/windowmanager/intern/wm_subwindow.c swin_from_swinid(win, swinid); printf("%s %d: doesn't exist\n", __func__, swinid); BLI_rcti_size_x(&_curswin->winrct) BLI_rcti_size_y(&_curswin->winrct) glViewport(_curswin->winrct.xmin, _curswin->winrct.ymin, width, height); BLI_rcti_size_x(srct) BLI_rcti_size_y(srct) glScissor(srct->xmin, srct->ymin, width, height); glScissor(_curswin->winrct.xmin, _curswin->winrct.ymin, width, height); wmOrtho2(-GLA_PIXEL_OFS, (float)width - GLA_PIXEL_OFS, -GLA_PIXEL_OFS, (float)height - GLA_PIXEL_OFS); glLoadIdentity(); glFlush(); UI_SetTheme(sa ? sa->spacetype : 0, ar->type ? ar->type->regionid : 0); UI_ThemeClearColor(TH_HEADER); glClear(GL_COLOR_BUFFER_BIT); UI_ThemeColor(TH_TEXT); BLF_draw_default(UI_UNIT_X, 0.4f*UI_UNIT_Y, 0.0f, ar->headerstr, BLF_DRAW_STR_DUMMY_MAX); draw(C, ar); ED_region_pixelspace(ar); ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_PIXEL); memset(&ar->drawrct, 0, sizeof(ar->drawrct)); uiFreeInactiveBlocks(C, &ar->uiblocks); region_draw_emboss(ar, &ar->winrct); // source/blender/editors/screen/area.c glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4ub(0, 0, 0, 30); sdrawline(rect.xmax, rect.ymin, rect.xmax, rect.ymax); glColor4ub(0, 0, 0, 30); sdrawline(rect.xmin, rect.ymin, rect.xmax, rect.ymin); glColor4ub(255, 255, 255, 30); sdrawline(rect.xmin, rect.ymax, rect.xmax, rect.ymax); glColor4ub(255, 255, 255, 30); sdrawline(rect.xmin, rect.ymin, rect.xmin, rect.ymax); glDisable(GL_BLEND); wm_paintcursor_draw(C, ar); // source/blender/windowmanager/intern/wm_draw.c CTX_wm_manager(C); CTX_wm_window(C); poll(C) ELEM(win->grabcursor, GHOST_kGrabWrap, GHOST_kGrabHide) wm_get_cursor_position(win, &x, &y); pc->draw(C,x - ar_other->winrct.xmin, y - ar_other->winrct.ymin, pc->customdata); pc->draw(C,win->eventstate->x - ar_other->winrct.xmin,win->eventstate->y - ar_other->winrct.ymin,pc->customdata); ED_area_overdraw_flush(sa, ar); // source/blender/editors/screen/area.c BLI_rcti_isect_pt(&ar->winrct, xs, ys) CTX_wm_region_set(C, NULL); wm_area_mark_invalid_backbuf(sa); CTX_wm_area_set(C, NULL); ED_screen_draw(win); // source/blender/editors/screen/screen_edit.c wmSubWindowSet(win, win->screen->mainwin); drawscredge_area(sa, WM_window_pixels_x(win), WM_window_pixels_y(win), 0); drawscredge_area(sa, WM_window_pixels_x(win), WM_window_pixels_y(win), 1); area_getorientation(sa1, sa2); scrarea_draw_shape_dark(sa2, dir); scrarea_draw_shape_light(sa1, dira); glEnable(GL_BLEND); glColor4ub(255, 255, 255, 100); sdrawline(sa3->totrct.xmin, win->eventstate->y, sa3->totrct.xmax, win->eventstate->y); glColor4ub(0, 0, 0, 100); sdrawline(sa3->totrct.xmin, win->eventstate->y + 1, sa3->totrct.xmax, win->eventstate->y + 1); sdrawline(win->eventstate->x, sa3->totrct.ymin, win->eventstate->x, sa3->totrct.ymax); glColor4ub(0, 0, 0, 100); sdrawline(win->eventstate->x + 1, sa3->totrct.ymin, win->eventstate->x + 1, sa3->totrct.ymax); glDisable(GL_BLEND); ED_area_overdraw(C); // source/blender/editors/screen/area.c CTX_wm_window(C); CTX_wm_screen(C); wmSubWindowSet(win, screen->mainwin); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); area_draw_azone(az->x1, az->y1, az->x2, az->y2); region_draw_azone_icon(az); region_draw_azone_tria(az); region_draw_azone_tab(az); region_draw_azone_tab_plus(az); glDisable(GL_BLEND); CTX_wm_menu_set(C, ar); ED_region_do_draw(C, ar); * CTX_wm_menu_set(C, NULL); wm_gesture_draw(win); wm_method_draw_overlap_all(C, win, 0); // source/blender/windowmanager/intern/wm_draw.c * wm_method_draw_overlap_all(C, win, 1); // source/blender/windowmanager/intern/wm_draw.c * wm_method_draw_triple(C, win); // source/blender/windowmanager/intern/wm_draw.c CTX_wm_manager(C); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); wmSubWindowSet(win, screen->mainwin); wm_triple_draw_textures(win, win->drawdata, 1.0f); MEM_callocN(sizeof(wmDrawTriple), "wmDrawTriple"); wm_triple_gen_textures(win, win->drawdata) wm_draw_triple_fail(C, win); CTX_wm_area_set(C, sa); CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); * ED_area_overdraw_flush(sa, ar); CTX_wm_region_set(C, NULL); wm_area_mark_invalid_backbuf(sa); CTX_wm_area_set(C, NULL); wmSubWindowSet(win, screen->mainwin); ED_area_overdraw(C); wm_triple_copy_textures(win, triple); CTX_wm_area_set(C, sa); CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); * CTX_wm_region_set(C, NULL); wm_draw_region_blend(win, ar); CTX_wm_area_set(C, NULL); ED_screen_draw(win); CTX_wm_menu_set(C, ar); ED_region_do_draw(C, ar); * CTX_wm_menu_set(C, NULL); wm_gesture_draw(win); CTX_wm_area_set(C, sa); CTX_wm_region_set(C, ar); ED_region_set(C, ar); wm_paintcursor_draw(C, ar); CTX_wm_region_set(C, NULL); CTX_wm_area_set(C, NULL); wmSubWindowSet(win, screen->mainwin); wm_drags_draw(C, win, NULL); wm_window_swap_buffers(win); CTX_wm_window_set(C, NULL); } ----------------------------------------------------------------