/** * header_info.c oct-2003 * * Functions to draw the "User Preferences" window header * and handle user events sent to it. * * * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. * * The Original Code is: all of this file. * * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** */ #include #include #include #ifdef HAVE_CONFIG_H #include #endif #include "DNA_group_types.h" #include "DNA_ID.h" #include "DNA_image_types.h" #include "DNA_lamp_types.h" #include "DNA_object_types.h" #include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" #include "DNA_userdef_types.h" #include "DNA_world_types.h" #include "BDR_editcurve.h" #include "BDR_editmball.h" #include "BDR_editobject.h" #include "BDR_editface.h" #include "BDR_vpaint.h" #include "BIF_editarmature.h" #include "BIF_editfont.h" #include "BIF_editmesh.h" #include "BIF_gl.h" #include "BIF_interface.h" #include "BIF_language.h" #include "BIF_mainqueue.h" #include "BIF_meshtools.h" #include "BIF_previewrender.h" #include "BIF_renderwin.h" #include "BIF_resources.h" #include "BIF_screen.h" #include "BIF_space.h" #include "BIF_toets.h" #include "BIF_toolbox.h" #include "BIF_usiblender.h" #include "BIF_writeimage.h" #include "BIF_drawscene.h" #ifdef WITH_VERSE #include "BIF_verse.h" #endif #include "BKE_blender.h" #include "BKE_colortools.h" #include "BKE_depsgraph.h" #include "BKE_exotic.h" #include "BKE_global.h" #include "BKE_image.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_node.h" #include "BKE_packedFile.h" #include "BKE_scene.h" #include "BKE_world.h" #ifdef WITH_VERSE #include "BKE_verse.h" #endif #include "BLI_arithb.h" #include "BLI_blenlib.h" #include "BLI_bpath.h" #include "BLO_writefile.h" #include "BSE_editipo.h" #include "BSE_filesel.h" #include "BIF_imasel.h" #include "BSE_headerbuttons.h" #include "BSE_node.h" #include "BSE_sequence.h" #include "BSE_edit.h" #include "BSE_time.h" #include "IMB_imbuf_types.h" #include "MEM_guardedalloc.h" #ifndef DISABLE_PYTHON #include "BPY_extern.h" #include "BPY_menus.h" #endif #include "GPU_extensions.h" #include "GPU_material.h" #include "blendef.h" #include "interface.h" #include "mydevice.h" extern char versionstr[]; /* from blender.c */ /*----------------------------------*/ /* Progress bar vars and functions: */ /* strubi shamelessly abused the status line as a progress bar... * feel free to kill him after release */ static int g_progress_bar = 0; static char *g_progress_info = 0; static float g_done; int start_progress_bar(void) { g_progress_bar = 1; return 1; // we never fail (yet) } void end_progress_bar(void) { g_progress_bar = 0; } static void update_progress_bar(float done, char *info) { g_done = done; g_progress_info = info; } /** Progress bar 'done': a value between 0.0 and 1.0, showing progress 'info': a info text what is currently being done Make sure that the progress bar is always called with: done = 0.0 first and done = 1.0 last -- or alternatively use: start_progressbar(); do_stuff_and_callback_progress_bar(); end_progressbar(); */ int progress_bar(float done, char *busy_info) { ScrArea *sa; short val; /* User break (ESC) */ while (qtest()) { if (extern_qread(&val) == ESCKEY) return 0; } if (done == 0.0) { start_progress_bar(); } else if (done > 0.99) { end_progress_bar(); } sa= G.curscreen->areabase.first; while(sa) { if (sa->spacetype == SPACE_INFO) { update_progress_bar(done, busy_info); curarea = sa; scrarea_do_headdraw(curarea); areawinset(curarea->win); sa->head_swap= WIN_BACK_OK; screen_swapbuffers(); } sa = sa->next; } return 1; } /* -- End of progress bar definitions ------- */ extern char temp_dir[]; /* XXXXX BAD BAD BAD from exotic.c */ void write_vrml_fs() { if(G.obedit) { error("Can't save VRML. Press TAB to leave EditMode"); } else { if(temp_dir[0]==0) strcpy(temp_dir, G.sce); activate_fileselect(FILE_SPECIAL, "Export VRML 1.0", temp_dir, write_vrml); } } void write_dxf_fs() { if(G.obedit) { error("Can't save DXF. Press TAB to leave EditMode"); } else { if(temp_dir[0]==0) strcpy(temp_dir, G.sce); activate_fileselect(FILE_SPECIAL, "Export DXF", temp_dir, write_dxf); } } void write_stl_fs() { if(G.obedit) { error("Can't save STL. Press TAB to leave EditMode"); } else { if(temp_dir[0]==0) strcpy(temp_dir, G.sce); activate_fileselect(FILE_SPECIAL, "Export STL", temp_dir, write_stl); } } /* ------------ */ int buttons_do_unpack() { int how; char menu[2048]; char *line = menu; int ret_value = RET_OK, count = 0; count = countPackedFiles(); if(!count) { pupmenu("No packed files. Autopack disabled"); return ret_value; } if (count == 1) line += sprintf(line, "Unpack 1 file%%t"); else line += sprintf(line, "Unpack %d files%%t", count); line += sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL); line += sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL); line += sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL); line += sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL); line += sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP); line += sprintf(line, "|Ask for each file %%x%d", PF_ASK); how = pupmenu(menu); if(how == -1) ret_value = RET_CANCEL; else { if (how != PF_KEEP) unpackAll(how); G.fileflags &= ~G_AUTOPACK; } return ret_value; } /* here, because of all creator stuff */ Scene *copy_scene(Scene *sce, int level) { /* * level 0: empty, only copy minimal stuff * level 1: all objects shared * level 2: all object-data shared * level 3: full copy */ Scene *scen; Base *base, *obase; if (level==0) { /* Add Empty, minimal copy */ ListBase lb; scen= add_scene(sce->id.name+2); lb= scen->r.layers; scen->r= sce->r; scen->r.layers= lb; } else { /* level 1+, but not level 0 */ scen= copy_libblock(sce); duplicatelist(&(scen->base), &(sce->base)); clear_id_newpoins(); id_us_plus((ID *)scen->world); id_us_plus((ID *)scen->set); scen->ed= NULL; scen->radio= NULL; scen->theDag= NULL; scen->toolsettings= MEM_dupallocN(sce->toolsettings); duplicatelist(&(scen->markers), &(sce->markers)); duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces)); duplicatelist(&(scen->r.layers), &(sce->r.layers)); scen->nodetree= ntreeCopyTree(sce->nodetree, 0); obase= sce->base.first; base= scen->base.first; while(base) { id_us_plus(&base->object->id); if(obase==sce->basact) scen->basact= base; obase= obase->next; base= base->next; } #ifndef DISABLE_PYTHON BPY_copy_scriptlink(&sce->scriptlink); #endif /* sculpt data */ sce->sculptdata.session = NULL; if (sce->sculptdata.cumap) { int a; scen->sculptdata.cumap = curvemapping_copy(sce->sculptdata.cumap); scen->sculptdata.session = NULL; /* this is only for temp data storage anyway */ for(a=0; asculptdata.mtex[a]) { scen->sculptdata.mtex[a]= MEM_dupallocN(sce->sculptdata.mtex[a]); } } } } // make a private copy of the avicodecdata if (sce->r.avicodecdata) { scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata); scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat); scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms); } // make a private copy of the qtcodecdata if (sce->r.qtcodecdata) { scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata); scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms); } if(level==0 || level==1) return scen; /* level 2 */ G.scene= scen; single_object_users(0); /* camera */ ID_NEW(G.scene->camera); /* level 3 */ if(level>=3) { if(scen->world) { id_us_plus(&scen->world->id); scen->world= copy_world(scen->world); } single_obdata_users(0); single_mat_users_expand(); single_tex_users_expand(); scen->radio= MEM_dupallocN(sce->radio); } clear_id_newpoins(); return scen; } void do_info_buttons(unsigned short event) { bScreen *sc, *oldscreen; Scene *sce, *sce1; ScrArea *sa; int nr; switch(event) { case B_INFOSCR: /* menu select screen */ if( G.curscreen->screennr== -2) { if(curarea->winy <50) { sa= closest_bigger_area(); areawinset(sa->win); } activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR, &G.curscreen->screennr, do_info_buttons); return; } if( G.curscreen->screennr < 0) return; sc= G.main->screen.first; nr= 1; while(sc) { if(nr==G.curscreen->screennr) { if(is_allowed_to_change_screen(sc)) setscreen(sc); else error("Unable to perform function in EditMode"); break; } nr++; sc= sc->id.next; } /* last item: NEW SCREEN */ if(sc==0) { nr= pupmenu("New Screen%t|Empty%x1|Duplicate%x2"); if(nr==1) default_twosplit(); if(nr==2) duplicate_screen(); } break; case B_INFODELSCR: /*do this event only with buttons, so it can never be called with full-window*/ if(G.curscreen->id.prev) sc= G.curscreen->id.prev; else if(G.curscreen->id.next) sc= G.curscreen->id.next; else return; if(okee("Delete current screen")) { /* find new G.curscreen */ oldscreen= G.curscreen; setscreen(sc); /* this test if sc has a full */ unlink_screen(oldscreen); free_libblock(&G.main->screen, oldscreen); } scrarea_queue_headredraw(curarea); break; case B_INFOSCE: /* menu select scene */ if( G.curscreen->scenenr== -2) { if(curarea->winy <50) { sa= closest_bigger_area(); areawinset(sa->win); } activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE, &G.curscreen->scenenr, do_info_buttons); return; } if( G.curscreen->scenenr < 0) return; sce= G.main->scene.first; nr= 1; while(sce) { if(nr==G.curscreen->scenenr) { if(sce!=G.scene) set_scene(sce); break; } nr++; sce= sce->id.next; } /* last item: NEW SCENE */ if(sce==0) { nr= pupmenu("Add scene%t|Empty%x0|Link Objects%x1|Link ObData%x2|Full Copy%x3"); if(nr<0) return; sce= copy_scene(G.scene, nr); set_scene(sce); } countall(); BIF_preview_changed(ID_TE); break; case B_INFODELSCE: if(G.scene->id.prev) sce= G.scene->id.prev; else if(G.scene->id.next) sce= G.scene->id.next; else return; if(okee("Delete current scene")) { /* Note, anything besides free_libblock needs to be added in * Python Scene.c for Blender.Scene.Unlink() */ /* exit modes... could become single call once */ exit_editmode(EM_FREEDATA|EM_WAITCURSOR); exit_paint_modes(); /* check all sets */ for (sce1= G.main->scene.first; sce1; sce1= sce1->id.next) { if(sce1->set == G.scene) sce1->set= 0; } /* check all sequences */ clear_scene_in_allseqs(G.scene); /* check render layer nodes in other scenes */ clear_scene_in_nodes(G.scene); /* al screens */ for (sc= G.main->screen.first; sc; sc= sc->id.next ) { if(sc->scene == G.scene) sc->scene= sce; } free_libblock(&G.main->scene, G.scene); set_scene(sce); countall(); } break; } } static void check_packAll() { // first check for dirty images Image *ima; for(ima = G.main->image.first; ima; ima= ima->id.next) { if (ima->ibufs.first) { /* XXX FIX */ ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); if (ibuf && (ibuf->userflags &= IB_BITMAPDIRTY)) break; } } if (ima == NULL || okee("Some images are painted on. These changes will be lost. Continue ?")) { packAll(); G.fileflags |= G_AUTOPACK; } } #ifdef _WIN32 static void copy_game_dll(char *dll_filename, char *source_dir, char *dest_dir) { char source_filename[FILE_MAX]; char dest_filename[FILE_MAX]; strcpy( source_filename, source_dir ); strcat( source_filename, dll_filename ); strcpy( dest_filename, dest_dir ); strcat( dest_filename, dll_filename ); if(!BLI_exists(dest_filename)) { BLI_copy_fileops( source_filename, dest_filename ); } } static void copy_all_game_dlls(char *str) { #define GAME_DLL_COUNT 7 char *game_dll_list[GAME_DLL_COUNT]={"gnu_gettext.dll", "libpng.dll", "libtiff.dll", "pthreadVC2.dll", "python25.dll", "SDL.dll", "zlib.dll"}; char dest_dir[FILE_MAX]; char source_dir[FILE_MAX]; int i; strcpy(source_dir, get_install_dir()); strcat(source_dir, "\\"); BLI_split_dirfile_basic(str, dest_dir, NULL); for (i= 0; i< GAME_DLL_COUNT; i++) { copy_game_dll(game_dll_list[i], source_dir, dest_dir ); }; } #endif static int write_runtime(char *str, char *exename) { char *freestr= NULL; char *ext = 0; #ifdef _WIN32 ext = ".exe"; #endif #ifdef __APPLE__ ext = ".app"; #endif if (ext && (!BLI_testextensie(str, ext))) { freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check"); sprintf(freestr,"%s%s", str, ext); str= freestr; } if (!BLI_exists(str) || saveover(str)) BLO_write_runtime(str, exename); if (freestr) MEM_freeN(freestr); return 0; } static void write_runtime_check_dynamic(char *str) { write_runtime(str, "blenderdynplayer.exe"); } static void write_runtime_check(char *str) { char player[128]; strcpy(player, "blenderplayer"); #ifdef _WIN32 strcat(player, ".exe"); #endif #ifdef __APPLE__ strcat(player, ".app"); #endif write_runtime(str, player); #ifdef _WIN32 // get a list of the .DLLs in the Blender folder and copy all of these to the destination folder if they don't exist copy_all_game_dlls(str); #endif } /* end keyed functions */ /************************** MAIN MENU *****************************/ /************************** FILE *****************************/ static void do_info_file_importmenu(void *arg, int event) { ScrArea *sa; if(curarea->spacetype==SPACE_INFO) { sa= find_biggest_area_of_type(SPACE_SCRIPT); if (!sa) sa= closest_bigger_area(); areawinset(sa->win); } #ifndef DISABLE_PYTHON /* events >=3 are registered bpython scripts */ if (event >= 3) { BPY_menu_do_python(PYMENU_IMPORT, event - 3); BIF_undo_push("Import file"); } else #endif { switch(event) { case 0: /* DXF */ activate_fileselect(FILE_BLENDER, "Import DXF", G.sce, BIF_read_file); break; case 1: /* VRML 1.0 */ activate_fileselect(FILE_BLENDER, "Import VRML 1.0", G.sce, BIF_read_file); break; case 2: /* STL */ activate_fileselect(FILE_BLENDER, "Import STL", G.sce, BIF_read_file); break; } } allqueue(REDRAWINFO, 0); } static uiBlock *info_file_importmenu(void *arg_unused) { uiBlock *block; short yco = 20, menuwidth = 120; #ifndef DISABLE_PYTHON BPyMenu *pym; #endif int i = 0; block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_file_importmenu, NULL); //uiBlockSetXOfs(block, -50); // offset to parent button uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, ""); #ifndef DISABLE_PYTHON uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); for (pym = BPyMenuTable[PYMENU_IMPORT]; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+3, pym->tooltip?pym->tooltip:pym->filename); } #endif uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; } static void do_info_file_exportmenu(void *arg, int event) { ScrArea *sa; if(curarea->spacetype==SPACE_INFO) { sa= find_biggest_area_of_type(SPACE_SCRIPT); if (!sa) sa= closest_bigger_area(); areawinset(sa->win); } #ifndef DISABLE_PYTHON /* events >=3 are registered bpython scripts */ if (event >= 3) BPY_menu_do_python(PYMENU_EXPORT, event - 3); else #endif switch(event) { case 0: write_vrml_fs(); break; case 1: write_dxf_fs(); break; case 2: write_stl_fs(); break; } allqueue(REDRAWINFO, 0); } static uiBlock *info_file_exportmenu(void *arg_unused) { uiBlock *block; short yco = 20, menuwidth = 120; #ifndef DISABLE_PYTHON BPyMenu *pym; #endif int i = 0; block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_file_exportmenu, NULL); //uiBlockSetXOfs(block, -50); // offset to parent button uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, ""); #ifndef DISABLE_PYTHON uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); /* note that we acount for the 3 previous entries with i+3: */ for (pym = BPyMenuTable[PYMENU_EXPORT]; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+3, pym->tooltip?pym->tooltip:pym->filename); } #endif uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; } #ifdef WITH_VERSE extern ListBase session_list; static void do_verse_filemenu(void *arg, int event) { char address[64]; /* lenght of domain name is 63 characters or less */ VerseSession *session = NULL; ScrArea *sa; if(curarea->spacetype==SPACE_INFO) { sa= closest_bigger_area(); areawinset(sa->win); } switch(event) { case 0: waitcursor(1); printf("Connecting to localhost!\n"); b_verse_connect("localhost"); waitcursor(0); break; case 1: address[0] = '\0'; if(sbutton(address, 0, 63, "Server:")) { waitcursor(1); printf("Connecting to %s\n", address); b_verse_connect(address); waitcursor(0); } break; case 2: session = session_menu(); if(session) { printf("Disconnecting session: %s!\n", session->address); end_verse_session(session); } break; case 3: printf("Disconnecting all sessions!\n"); end_all_verse_sessions(); break; case 4: printf("sending get to master server\n"); b_verse_ms_get(); break; } } static uiBlock *verse_filemenu(void *unusedargs) { uiBlock *block; short yco = 20, menuwidth = 120; block= uiNewBlock(&curarea->uiblocks, "verse_filemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_verse_filemenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect to localhost", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect ...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); if(session_list.first != NULL) { if(session_list.first != session_list.last) { uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect ...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect all", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); } } uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Get Servers", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; } #endif static void do_info_filemenu(void *arg, int event) { ScrArea *sa; char dir[FILE_MAX]; if(curarea->spacetype==SPACE_INFO) { sa= closest_bigger_area(); areawinset(sa->win); } /* these are no defines, easier this way, the codes are in the function below */ switch(event) { case 0: if (okee("Erase All")) { if (!BIF_read_homefile(0)) error("No file ~/.B.blend"); } break; case 1: /* open */ activate_fileselect(FILE_BLENDER, "Open", G.sce, BIF_read_file); break; case 3: /* append */ activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0); break; case 4: /* save */ BLI_strncpy(dir, G.sce, FILE_MAX); untitled(dir); activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file); break; case 5: BLI_strncpy(dir, G.sce, FILE_MAX); if (untitled(dir)) { activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file); } else { BIF_write_file(dir); free_filesel_spec(dir); } break; case 6: /* save image */ BIF_save_rendered_image_fs(); break; case 7: activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0); break; case 22: /* save runtime */ activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check); break; case 23: /* save dynamic runtime */ activate_fileselect(FILE_SPECIAL, "Save Dynamic Runtime", "", write_runtime_check_dynamic); break; case 24: BIF_screendump(0); break; case 25: BIF_screendump(1); break; case 13: exit_usiblender(); break; case 15: /* recover previous session */ { extern short winqueue_break; /* editscreen.c */ int save_over, retval = 0; char str[FILE_MAX]; char scestr[FILE_MAX]; BLI_strncpy(scestr, G.sce, FILE_MAX); /* temporal store */ save_over = G.save_over; BLI_make_file_string("/", str, btempdir, "quit.blend"); retval = BKE_read_file(str, NULL); /*we successfully loaded a blend file, get sure that pointcache works */ if (retval!=0) G.relbase_valid = 1; G.save_over = save_over; strcpy(G.sce, scestr); winqueue_break= 1; /* leave queues everywhere */ BKE_reset_undo(); BKE_write_undo("Original"); /* save current state */ refresh_interface_font(); } break; case 31: /* save default settings */ BIF_write_homefile(); break; case 32: if (okee("Erase All")) { if (!BIF_read_homefile(1)) error("Can't read data from memory!"); } break; case 35: /* compress toggle */ U.flag ^= (USER_FILECOMPRESS); break; } allqueue(REDRAWINFO, 0); } static void do_info_operecentmenu(void *arg, int event) { struct RecentFile *recent; if(event==0 && G.sce[0]) { BIF_read_file(G.sce); } else { /* Global */ recent = BLI_findlink(&(G.recent_files), event-1); BIF_read_file(recent->filename); } } static uiBlock *info_openrecentmenu(void *arg_unused) { uiBlock *block; short yco = 20, menuwidth = 120, i; struct RecentFile *recent; block= uiNewBlock(&curarea->uiblocks, "info_openrecentmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_operecentmenu, NULL); if (G.sce[0]) { uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, G.sce, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); } for (recent = G.recent_files.first, i=0; inext, i++) { if (strcmp(recent->filename, G.sce)!=0) { uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, recent->filename, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+1, ""); } } uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; } static void do_info_externalfiles(void *arg, int event) { switch (event) { case 1: /* pack data */ check_packAll(); break; #if 0 case 2: /* unpack to current dir */ unpackAll(PF_WRITE_LOCAL); G.fileflags &= ~G_AUTOPACK; break; #endif case 3: /* unpack data */ if (buttons_do_unpack() != RET_CANCEL) { /* Clear autopack bit only if user selected one of the unpack options */ G.fileflags &= ~G_AUTOPACK; } break; case 10: /* make all paths relative */ if (G.relbase_valid) { int tot,changed,failed,linked; char str[512]; char txtname[24]; /* text block name */ txtname[0] = '\0'; makeFilesRelative(txtname, &tot, &changed, &failed, &linked); if (failed) sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked); else sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked); pupmenu(str); } else { pupmenu("Can't set relative paths with an unsaved blend file"); } break; case 11: /* make all paths absolute */ { int tot,changed,failed,linked; char str[512]; char txtname[24]; /* text block name */ txtname[0] = '\0'; makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked); sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked); if (failed) sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked); else sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked); pupmenu(str); } break; case 12: /* check images exist */ { char txtname[24]; /* text block name */ txtname[0] = '\0'; /* run the missing file check */ checkMissingFiles( txtname ); if (txtname[0] == '\0') { okee("No external files missing"); } else { char str[128]; sprintf(str, "Missing files listed in Text \"%s\"", txtname ); error(str); } } break; case 13: /* search for referenced files that are not available */ if(curarea->spacetype==SPACE_INFO) { ScrArea *sa; sa= closest_bigger_area(); areawinset(sa->win); } activate_fileselect(FILE_SPECIAL, "Find Missing Files", "", findMissingFiles); break; } allqueue(REDRAWINFO, 0); } static uiBlock *info_externalfiles(void *arg_unused) { uiBlock *block; short yco = 20, menuwidth = 120; block= uiNewBlock(&curarea->uiblocks, "info_externalfiles", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_externalfiles, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack into .blend file", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, ""); #if 0 uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Removes all packed files from the project and saves them to the current directory"); #endif uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack into Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Relative", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Absolute", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Report Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Find Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; } static uiBlock *info_filemenu(void *arg_unused) { uiBlock *block; short yco=0; short menuwidth=120; block= uiNewBlock(&curarea->uiblocks, "info_filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin); uiBlockSetButmFunc(block, do_info_filemenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Ctrl X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); #ifdef WITH_VERSE uiDefIconTextBlockBut(block, verse_filemenu, NULL, ICON_RIGHTARROW_THIN, "Verse", 0, yco-=20, menuwidth, 19, ""); #endif uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Ctrl W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...|F2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); if(U.flag & USER_FILECOMPRESS) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression"); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression"); } uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, ""); #if GAMEBLENDER == 1 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, ""); #ifdef _WIN32 // uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Dynamic Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, ""); #endif #endif uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link (Image Browser)|Ctrl F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, ""); uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); uiBlockSetDirection(block, UI_DOWN); uiTextBoundsBlock(block, 80); return block; } /**************************** ADD ******************************/ void do_info_add_meshmenu(void *arg, int event) { #ifndef DISABLE_PYTHON if (event>=20) { BPY_menu_do_python(PYMENU_ADDMESH, event - 20); } else #endif { switch(event) { case 0: /* Plane */ add_primitiveMesh(0); break; case 1: /* Cube */ add_primitiveMesh(1); break; case 2: /* Circle */ add_primitiveMesh(4); break; case 3: /* UVsphere */ add_primitiveMesh(11); break; case 4: /* IcoSphere */ add_primitiveMesh(12); break; case 5: /* Cylinder */ add_primitiveMesh(5); break; case 7: /* Cone */ add_primitiveMesh(7); break; case 8: /* Grid */ add_primitiveMesh(10); break; case 9: /* Monkey */ add_primitiveMesh(13); break; default: break; } } allqueue(REDRAWINFO, 0); } static uiBlock *info_add_meshmenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; short yco= 0; /* Python Menu */ #ifndef DISABLE_PYTHON BPyMenu *pym; #endif int i=0; block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plane|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cube|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UVsphere", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "IcoSphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cylinder|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cone|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, ""); uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Monkey|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, ""); #ifndef DISABLE_PYTHON pym = BPyMenuTable[PYMENU_ADDMESH]; if (pym) { uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, ""); for (; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, i+20, pym->tooltip?pym->tooltip:pym->filename); } } #endif uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } void do_info_add_curvemenu(void *arg, int event) { switch(event) { case 0: /* Bezier Curve */ add_primitiveCurve(10); break; case 1: /* Bezier Circle */ add_primitiveCurve(11); break; case 2: /* NURB Curve */ add_primitiveCurve(40); break; case 3: /* NURB Circle */ add_primitiveCurve(41); break; case 4: /* Path */ add_primitiveCurve(46); break; default: break; } allqueue(REDRAWINFO, 0); } static uiBlock *info_add_curvemenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; short yco= 0; block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Path|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } void do_info_add_surfacemenu(void *arg, int event) { switch(event) { case 0: /* Curve */ add_primitiveNurb(0); break; case 1: /* Circle */ add_primitiveNurb(1); break; case 2: /* Surface */ add_primitiveNurb(2); break; case 3: /* Tube */ add_primitiveNurb(3); break; case 4: /* Sphere */ add_primitiveNurb(4); break; case 5: /* Donut */ add_primitiveNurb(5); break; default: break; } allqueue(REDRAWINFO, 0); } static uiBlock *info_add_surfacemenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; short yco= 0; block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Surface|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Tube", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Sphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Donut|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } void do_info_add_metamenu(void *arg, int event) { switch(event) { case 0: /* Ball */ add_primitiveMball(1); break; case 1: /* Tube */ add_primitiveMball(2); break; case 2: /* Plane */ add_primitiveMball(3); break; case 3: /* Elipsoid */ add_primitiveMball(4); break; case 4: /* Cube */ add_primitiveMball(5); break; default: break; } allqueue(REDRAWINFO, 0); } static uiBlock *info_add_metamenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; short xco= 0; block= uiNewBlock(&curarea->uiblocks, "add_metamenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_add_metamenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,"Meta Ball|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Tube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Ellipsoid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } void do_info_add_lampmenu(void *arg, int event) { switch(event) { case 0: /* lamp */ add_objectLamp(LA_LOCAL); break; case 1: /* sun */ add_objectLamp(LA_SUN); break; case 2: /* spot */ add_objectLamp(LA_SPOT); break; case 3: /* hemi */ add_objectLamp(LA_HEMI); break; case 4: /* area */ add_objectLamp(LA_AREA); break; case 5: /* YafRay photon lamp */ if (G.scene->r.renderer==R_YAFRAY) add_objectLamp(LA_YF_PHOTON); break; default: break; } allqueue(REDRAWINFO, 0); } static uiBlock *info_add_lampmenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; short yco= 0; block= uiNewBlock(&curarea->uiblocks, "add_lampmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_add_lampmenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Sun|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Spot|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hemi|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Area|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, ""); if (G.scene->r.renderer==R_YAFRAY) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Photon|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } static void do_info_add_groupmenu(void *arg, int event) { Object *ob; add_object_draw(OB_EMPTY); ob= OBACT; ob->dup_group= BLI_findlink(&G.main->group, event); if(ob->dup_group) { id_us_plus((ID *)ob->dup_group); ob->transflag |= OB_DUPLIGROUP; DAG_scene_sort(G.scene); } } static uiBlock *info_add_groupmenu(void *arg_unused) { Group *group; uiBlock *block; short yco= 0; int a; block= uiNewBlock(&curarea->uiblocks, "add_groupmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_add_groupmenu, NULL); for(a=0, group= G.main->group.first; group; group= group->id.next, a++) { uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, group->id.name+2, 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, a, ""); } uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } void do_info_addmenu(void *arg, int event) { #ifndef DISABLE_PYTHON if (event>=20) { BPY_menu_do_python(PYMENU_ADD, event - 20); } else #endif { switch(event) { case 0: /* Mesh */ break; case 1: /* Curve */ break; case 2: /* Surface */ break; case 3: /* Metaball */ break; case 4: /* Text (argument is discarded) */ add_primitiveFont(event); break; case 5: /* Empty */ add_object_draw(OB_EMPTY); break; case 6: /* Camera */ add_object_draw(OB_CAMERA); break; case 8: /* Armature */ add_primitiveArmature(OB_ARMATURE); break; case 9: /* Lattice */ add_object_draw(OB_LATTICE); break; case 10: /* group instance not yet */ break; default: break; } } allqueue(REDRAWINFO, 0); } static uiBlock *info_addmenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; #ifndef DISABLE_PYTHON BPyMenu *pym; #endif int i=0; short yco= 0; block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); uiBlockSetButmFunc(block, do_info_addmenu, NULL); uiDefIconTextBlockBut(block, info_add_meshmenu, NULL, ICON_RIGHTARROW_THIN, "Mesh", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, info_add_curvemenu, NULL, ICON_RIGHTARROW_THIN, "Curve", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, info_add_surfacemenu, NULL, ICON_RIGHTARROW_THIN, "Surface", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, info_add_metamenu, NULL, ICON_RIGHTARROW_THIN, "Meta", 0, yco-=20, 120, 19, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBlockBut(block, info_add_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, ""); uiDefIconTextBlockBut(block, info_add_lampmenu, NULL, ICON_RIGHTARROW_THIN, "Lamp", 0, yco-=20, 120, 19, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, ""); #ifndef DISABLE_PYTHON pym = BPyMenuTable[PYMENU_ADD]; if (pym) { uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 1620, 6, NULL, 0.0, 0.0, 0, 0, ""); for (; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, i+20, pym->tooltip?pym->tooltip:pym->filename); } } #endif uiBlockSetDirection(block, UI_DOWN); uiTextBoundsBlock(block, 80); return block; } /************************** GAME *****************************/ void do_info_game_glslmenu(void *arg, int event) { switch (event) { case G_FILE_GLSL_NO_LIGHTS: case G_FILE_GLSL_NO_SHADERS: case G_FILE_GLSL_NO_SHADOWS: case G_FILE_GLSL_NO_RAMPS: case G_FILE_GLSL_NO_NODES: case G_FILE_GLSL_NO_EXTRA_TEX: G.fileflags ^= event; GPU_materials_free(); allqueue(REDRAWINFO, 0); allqueue(REDRAWVIEW3D, 0); break; default: break; } } static uiBlock *info_game_glslmenu(void *arg_unused) { uiBlock *block; short yco= 0, menuwidth=160; int check; block= uiNewBlock(&curarea->uiblocks, "game_glslmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_game_glslmenu, NULL); check = (G.fileflags & G_FILE_GLSL_NO_LIGHTS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT; uiDefIconTextBut(block, BUTM, 1, check, "Enable Lights", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_LIGHTS, "Enable using lights in GLSL materials."); check = (G.fileflags & G_FILE_GLSL_NO_SHADERS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT; uiDefIconTextBut(block, BUTM, 1, check, "Enable Shaders", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_SHADERS, "Enable using shaders other than Lambert in GLSL materials"); check = (G.fileflags & G_FILE_GLSL_NO_SHADOWS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT; uiDefIconTextBut(block, BUTM, 1, check, "Enable Shadows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_SHADOWS, "Enable using shadows in GLSL materials"); check = (G.fileflags & G_FILE_GLSL_NO_RAMPS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT; uiDefIconTextBut(block, BUTM, 1, check, "Enable Ramps", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_RAMPS, "Enable using ramps in GLSL materials"); check = (G.fileflags & G_FILE_GLSL_NO_NODES)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT; uiDefIconTextBut(block, BUTM, 1, check, "Enable Nodes", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_NODES, "Enable using nodes in GLSL materials."); check = (G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT; uiDefIconTextBut(block, BUTM, 1, check, "Enable Extra Textures", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_EXTRA_TEX, "Enable using texture channels other than Col and Alpha in GLSL materials."); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } static void do_info_gamemenu(void *arg, int event) { switch (event) { case G_FILE_ENABLE_ALL_FRAMES: case G_FILE_DISPLAY_LISTS: case G_FILE_SHOW_FRAMERATE: case G_FILE_SHOW_DEBUG_PROPS: case G_FILE_AUTOPLAY: case G_FILE_GAME_TO_IPO: case G_FILE_SHOW_PHYSICS: G.fileflags ^= event; break; case G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL: G.fileflags &= ~(G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL); break; case G_FILE_GAME_MAT: G.fileflags |= G_FILE_GAME_MAT; G.fileflags &= ~G_FILE_GAME_MAT_GLSL; break; case G_FILE_GAME_MAT_GLSL: if(!GPU_extensions_minimum_support()) error("GLSL not supported with this graphics card or driver."); G.fileflags |= (G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL); break; default: ; /* ignore the rest */ } } static uiBlock *info_gamemenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; short yco= 0; short menuwidth=120; block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin); uiBlockSetButmFunc(block, do_info_gamemenu, NULL); uiDefIconTextBut(block, BUTM, B_STARTGAME, ICON_BLANK1, "Start Game|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, ""); if(G.fileflags & G_FILE_ENABLE_ALL_FRAMES) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Enable All Frames", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Enable All Frames", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES, ""); } if(G.fileflags & G_FILE_GAME_TO_IPO) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Record Game Physics to IPO", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_TO_IPO, ""); } else { if(G.fileflags & G_FILE_DISPLAY_LISTS) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Generate Display Lists", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_DISPLAY_LISTS, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Generate Display Lists", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_DISPLAY_LISTS, ""); } uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Record Game Physics to IPO", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_TO_IPO, ""); } if(G.fileflags & G_FILE_SHOW_FRAMERATE) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Framerate and Profile", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Framerate and Profile", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE, ""); } if(G.fileflags & G_FILE_SHOW_PHYSICS) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Physics Visualization", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_PHYSICS, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Physics Visualization", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_PHYSICS, ""); } if(G.fileflags & G_FILE_SHOW_DEBUG_PROPS) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Debug Properties", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Debug Properties", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS, ""); } uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, ""); if(!(G.fileflags & G_FILE_GAME_MAT)) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Texture Face Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Texture Face Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL, ""); } if((G.fileflags & G_FILE_GAME_MAT) && !(G.fileflags & G_FILE_GAME_MAT_GLSL)) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Blender Multitexture Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Blender Multitexture Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT, ""); } if((G.fileflags & G_FILE_GAME_MAT) && (G.fileflags & G_FILE_GAME_MAT_GLSL)) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Blender GLSL Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Blender GLSL Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT_GLSL, ""); } uiDefIconTextBlockBut(block, info_game_glslmenu, NULL, ICON_RIGHTARROW_THIN, "GLSL Material Settings", 0, yco-=20, menuwidth, 19, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, ""); if(G.fileflags & G_FILE_AUTOPLAY) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, ""); } uiBlockSetDirection(block, UI_DOWN); uiTextBoundsBlock(block, 70); return block; } /************************** TIMELINE *****************************/ static void do_info_timelinemenu(void *arg, int event) { /* needed to check for valid selected objects */ Base *base=NULL; Object *ob=NULL; //char file[FILE_MAXDIR+FILE_MAXFILE]; base= BASACT; if (base) ob= base->object; switch(event) { case 1: /* Show Keyframes */ if (!ob) error("Select an object before showing its keyframes"); else set_ob_ipoflags(); break; case 2: /* Show and select Keyframes */ if (!ob) error("Select an object before showing and selecting its keyframes"); else select_select_keys(); break; case 3: /* select next keyframe */ if (!ob) error("Select an object before selecting its next keyframe"); else nextkey_obipo(1); break; case 4: /* select previous keyframe */ if (!ob) error("Select an object before selecting its previous keyframe"); else nextkey_obipo(-1); break; case 5: /* next keyframe */ if (!ob) error("Select an object before going to its next keyframe"); else movekey_obipo(1); break; case 6: /* previous keyframe */ if (!ob) error("Select an object before going to its previous keyframe"); else movekey_obipo(-1); break; case 7: /* next frame */ CFRA++; update_for_newframe(); break; case 8: /* previous frame */ CFRA--; if(CFRA<1) CFRA=1; update_for_newframe(); break; case 9: /* forward 10 frames */ CFRA+= 10; update_for_newframe(); break; case 10: /* back 10 frames */ CFRA-= 10; if(CFRA<1) CFRA=1; update_for_newframe(); break; case 11: /* end frame */ CFRA= EFRA; update_for_newframe(); break; case 12: /* start frame */ CFRA= SFRA; update_for_newframe(); break; case 13: /* previous keyframe */ nextprev_timeline_key(-1); break; case 14: /* next keyframe */ nextprev_timeline_key(1); break; } allqueue(REDRAWINFO, 0); } static uiBlock *info_timelinemenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; char str[26]; short yco= 0; short menuwidth=120; block= uiNewBlock(&curarea->uiblocks, "timelinemenu", UI_EMBOSSP, UI_HELV, curarea->headwin); uiBlockSetButmFunc(block, do_info_timelinemenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Keyframes|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show and Select Keyframes|Shift K",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next Keyframe|PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous Keyframe|PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Ob-Keyframe|Shift PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Ob-Keyframe|Shift PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Keyframe|Ctrl PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Keyframe|Ctrl PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Frame|RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Frame|LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); sprintf(str, "Forward %d Frames|UpArrow", G.scene->jumpframe); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); sprintf(str, "Back %d Frames|DownArrow", G.scene->jumpframe); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "End Frame|Shift RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Start Frame|Shift LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); uiBlockSetDirection(block, UI_DOWN); uiTextBoundsBlock(block, 80); return block; } /************************** RENDER *****************************/ void do_info_render_bakemenu(void *arg, int event) { switch (event) { case 6: G.scene->r.bake_flag ^= event; break; default: objects_bake_render_ui(event); } allqueue(REDRAWINFO, 0); } static uiBlock *info_render_bakemenu(void *arg_unused) { uiBlock *block; short yco= 0, menuwidth=160; block= uiNewBlock(&curarea->uiblocks, "render_bakemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_render_bakemenu, NULL); if(G.scene->r.bake_flag & R_BAKE_TO_ACTIVE) { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); } else { uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); } uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Full Render|Ctrl Alt B, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ambient Occlusion|Ctrl Alt B, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Normals|Ctrl Alt B, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Only|Ctrl Alt B, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Displacement|Ctrl Alt B, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); return block; } static void do_info_rendermenu(void *arg, int event) { ScrArea *sa; extern void playback_anim(); /* events >=10 are registered bpython scripts */ if (event >= 10) { if(curarea->spacetype==SPACE_INFO) { sa= find_biggest_area_of_type(SPACE_SCRIPT); if (!sa) sa= closest_bigger_area(); areawinset(sa->win); } #ifndef DISABLE_PYTHON BPY_menu_do_python(PYMENU_RENDER, event - 10); BIF_undo_push("Rendering Script"); #endif } else { switch(event) { case 0: BIF_do_render(0); break; case 1: BIF_do_render(1); break; /* note: dont use select_area() for setting active areas for opengl render */ /* its hackish and instable... code here was removed */ case 4: BIF_toggle_render_display(); break; case 5: playback_anim(); break; case 6: /* dodgy hack turning on SHIFT key to do a proper render border select set_render_border(); only works when 3d window active This code copied from toolbox.c, only works when 3d window is cameraview */ if(select_area(SPACE_VIEW3D)) { mainqenter(LEFTSHIFTKEY, 1); mainqenter(BKEY, 1); mainqenter(BKEY, 0); mainqenter(EXECUTE, 1); mainqenter(LEFTSHIFTKEY, 0); } break; case 7: extern_set_butspace(F10KEY, 0); break; } } allqueue(REDRAWINFO, 0); } static uiBlock *info_rendermenu(void *arg_unused) { uiBlock *block; #ifndef DISABLE_PYTHON BPyMenu *pym; #endif short yco= 0; short menuwidth=120; int i=0; block= uiNewBlock(&curarea->uiblocks, "rendermenu", UI_EMBOSSP, UI_HELV, curarea->headwin); uiBlockSetButmFunc(block, do_info_rendermenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Current Frame|F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Animation|Ctrl F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBlockBut(block, info_render_bakemenu, NULL, ICON_RIGHTARROW_THIN, "Bake Render Meshes", 0, yco-=20, 120, 19, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Render Buffer|F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Rendered Animation|Ctrl F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Render Border|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); #ifndef DISABLE_PYTHON uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); for (pym = BPyMenuTable[PYMENU_RENDER]; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename); } #endif uiBlockSetDirection(block, UI_DOWN); uiTextBoundsBlock(block, 80); return block; } /************************** HELP *****************************/ static void do_info_help_websitesmenu(void *arg, int event) { #ifndef DISABLE_PYTHON BPY_menu_do_python(PYMENU_HELPWEBSITES, event); #endif allqueue(REDRAWVIEW3D, 0); } static uiBlock *info_help_websitesmenu(void *arg_unused) { uiBlock *block; #ifndef DISABLE_PYTHON BPyMenu *pym; #endif short yco = 20, menuwidth = 120; int i = 0; block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL); #ifndef DISABLE_PYTHON for (pym = BPyMenuTable[PYMENU_HELPWEBSITES]; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename); } #endif uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; } static void do_info_help_systemmenu(void *arg, int event) { /* events >=10 are registered bpython scripts */ #ifndef DISABLE_PYTHON if (event >= 10) BPY_menu_do_python(PYMENU_HELPSYSTEM, event - 10); else #endif { switch(event) { case 1: /* Benchmark */ /* dodgy hack turning on CTRL ALT SHIFT key to do a benchmark * rather than copying lines and lines of code from toets.c :( */ if(select_area(SPACE_VIEW3D)) { mainqenter(LEFTSHIFTKEY, 1); mainqenter(LEFTCTRLKEY, 1); mainqenter(LEFTALTKEY, 1); mainqenter(TKEY, 1); mainqenter(TKEY, 0); mainqenter(EXECUTE, 1); mainqenter(LEFTSHIFTKEY, 0); mainqenter(LEFTCTRLKEY, 0); mainqenter(LEFTALTKEY, 0); } break; } } allqueue(REDRAWVIEW3D, 0); } static uiBlock *info_help_systemmenu(void *arg_unused) { uiBlock *block; #ifndef DISABLE_PYTHON BPyMenu *pym; #endif short yco = 20, menuwidth = 120; int i = 0; block= uiNewBlock(&curarea->uiblocks, "info_help_systemmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); uiBlockSetButmFunc(block, do_info_help_systemmenu, NULL); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); #ifndef DISABLE_PYTHON for (pym = BPyMenuTable[PYMENU_HELPSYSTEM]; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename); } #endif uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; } static void do_info_helpmenu(void *arg, int event) { ScrArea *sa; if(curarea->spacetype==SPACE_INFO) { sa= find_biggest_area_of_type(SPACE_SCRIPT); if (!sa) sa= closest_bigger_area(); areawinset(sa->win); } /* events >=10 are registered bpython scripts */ #ifndef DISABLE_PYTHON if (event >= 10) BPY_menu_do_python(PYMENU_HELP, event - 10); else #endif { switch(event) { case 0: /* About Blender */ break; } } allqueue(REDRAWINFO, 0); } static uiBlock *info_helpmenu(void *arg_unused) { /* static short tog=0; */ uiBlock *block; short yco= 0; short menuwidth=120; #ifndef DISABLE_PYTHON BPyMenu *pym; #endif int i = 0; block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); uiBlockSetButmFunc(block, do_info_helpmenu, NULL); uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); #ifndef DISABLE_PYTHON uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); for (pym = BPyMenuTable[PYMENU_HELP]; pym; pym = pym->next, i++) { uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename); } #endif uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefIconTextBlockBut(block, info_help_systemmenu, NULL, ICON_RIGHTARROW_THIN, "System", 0, yco-=20, 120, 19, ""); uiBlockSetDirection(block, UI_DOWN); uiTextBoundsBlock(block, 80); return block; } /************************** END MAIN MENU *****************************/ /* ugly global yes, for renderwin.c to write to */ char info_time_str[32]=""; static void info_text(int x, int y) { Object *ob= OBACT; extern float hashvectf[]; uintptr_t mem_in_use, mmap_in_use; unsigned int swatch_color; float fac1, fac2, fac3; char infostr[300], memstr[64]; char *headerstr, *s; int hsize; mem_in_use= MEM_get_memory_in_use(); mmap_in_use= MEM_get_mapped_memory_in_use(); s= memstr + sprintf(memstr," | Mem:%.2fM ", ((mem_in_use-mmap_in_use)>>10)/1024.0); if(mmap_in_use) sprintf(s,"(%.2fM) ", ((mmap_in_use)>>10)/1024.0); if(G.obedit) { s = infostr; s+= sprintf(s, "%s", G.editModeTitleExtra); if(G.obedit->type==OB_MESH) { if(G.scene->selectmode & SCE_SELECT_VERTEX) s+= sprintf(s,"Ve:%d-%d | Ed:%d-%d | Fa:%d-%d", G.totvertsel, G.totvert, G.totedgesel, G.totedge, G.totfacesel, G.totface); else if(G.scene->selectmode & SCE_SELECT_EDGE) s+= sprintf(s,"Ed:%d-%d | Fa:%d-%d", G.totedgesel, G.totedge, G.totfacesel, G.totface); else s+= sprintf(s,"Fa:%d-%d", G.totfacesel, G.totface); } else if(G.obedit->type==OB_ARMATURE) { s+= sprintf(s,"Ve:%d-%d | Bo:%d-%d", G.totvertsel, G.totvert, G.totbonesel, G.totbone); } else { s+= sprintf(s,"Ve:%d-%d", G.totvertsel, G.totvert); } strcat(s, memstr); } else if(ob && (ob->flag & OB_POSEMODE)) { sprintf(infostr,"Bo:%d-%d %s", G.totbonesel, G.totbone, memstr); } else { sprintf(infostr,"Ve:%d | Fa:%d | Ob:%d-%d | La:%d %s | Time:%s | ", G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp, memstr, info_time_str); } if(ob) { strcat(infostr, ob->id.name+2); } if (g_progress_bar && g_progress_info) { headerstr= g_progress_info; } else { headerstr= versionstr; } if (g_progress_bar) { hsize = 4 + (138.0 * g_done); fac1 = 0.5 * g_done; /* do some rainbow colors on progress */ fac2 = 1.0; fac3 = 0.9; } else { hsize= 30+BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS)); /* promise! Never change these lines again! (zr & ton did!) */ fac1= fabs(hashvectf[ 2*G.version+4]); fac2= 0.5+0.1*hashvectf[ G.version+3]; fac3= 0.7; } swatch_color= hsv_to_cpack(fac1, fac2, fac3); cpack( swatch_color ); glRecti(x-24, y-6, x-30+hsize, y+14); glColor3ub(0, 0, 0); /* makes text black colored rect */ glRasterPos2i(x, y); BIF_RasterPos(x, y); BIF_DrawString(G.font, headerstr, (U.transopts & USER_TR_MENUS)); hsize= BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS)); BIF_ThemeColor(TH_MENU_TEXT); /* makes text readable on dark theme */ glRasterPos2i(x+hsize+10, y); BIF_RasterPos(x+hsize+10, y); BIF_DrawString(G.font, infostr, (U.transopts & USER_TR_MENUS)); } void info_buttons(void) { uiBlock *block; short xco= 42; int xmax; block= uiNewBlock(&curarea->uiblocks, "header info", UI_EMBOSSN, UI_HELV, curarea->headwin); if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER); else uiBlockSetCol(block, TH_HEADERDESEL); if(curarea->flag & HEADER_NO_PULLDOWN) { uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT, xco,2,XIC,YIC-2, &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus"); } else { uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN, xco,2,XIC,YIC-2, &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus"); } xco+=XIC; if((curarea->flag & HEADER_NO_PULLDOWN)==0) { uiBlockSetEmboss(block, UI_EMBOSSP); /* 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 -1 is to make it properly fill the * height of the header */ xmax= GetButStringLength("File"); uiDefPulldownBut(block, info_filemenu, NULL, "File", xco, -1, xmax-3, 22, ""); xco+= xmax; xmax= GetButStringLength("Add"); uiDefPulldownBut(block, info_addmenu, NULL, "Add", xco, -1, xmax-3, 22, ""); xco+= xmax; xmax= GetButStringLength("Timeline"); uiDefPulldownBut(block, info_timelinemenu, NULL, "Timeline", xco, -1, xmax-3, 22, ""); xco+= xmax; xmax= GetButStringLength("Game"); uiDefPulldownBut(block, info_gamemenu, NULL, "Game", xco, -1, xmax-3, 22, ""); xco+= xmax; xmax= GetButStringLength("Render"); uiDefPulldownBut(block, info_rendermenu, NULL, "Render", xco, -1, xmax-3, 22, ""); xco+= xmax; xmax= GetButStringLength("Help"); uiDefPulldownBut(block, info_helpmenu, NULL, "Help", xco, -1, xmax-3, 22, ""); xco+= xmax; } /* pack icon indicates a packed file */ if (G.fileflags & G_AUTOPACK) { uiBlockSetEmboss(block, UI_EMBOSSN); uiDefIconBut(block, LABEL, 0, ICON_PACKAGE, xco, 0, XIC, YIC, &G.fileflags, 0.0, 0.0, 0, 0, "Indicates this is a Packed file. See File menu."); xco += XIC; } if (curarea->full == 0) { curarea->butspacetype= SPACE_INFO; uiBlockSetEmboss(block, UI_EMBOSS); uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), 8,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types."); /* STD SCREEN BUTTONS */ xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCR, ID_SCR, 0, (ID *)G.curscreen, 0, &G.curscreen->screennr, 1, 1, B_INFODELSCR, 0, 0); xco +=8; /* STD SCENE BUTTONS */ xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCE, ID_SCE, 0, (ID *)G.scene, 0, &G.curscreen->scenenr, 1, 1, B_INFODELSCE, 0, 0); } else xco= 430; BIF_SetScale(block->aspect); info_text(xco+24, 6); uiBlockSetEmboss(block, UI_EMBOSSN); uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+2, 0,XIC,YIC, 0, 0, 0, 0, 0, "Click to display Splash Screen"); /* always do as last */ curarea->headbutlen= xco+2*XIC; #if 0 // #ifdef _WIN32 // FULLSCREEN if(U.uiflag & USER_FLIPFULLSCREEN) { uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_WINDOW, (short)(curarea->winx-XIC-5), 0,XIC,YIC, 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */ } else { uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_FULLSCREEN, (short)(curarea->winx-XIC-5), 0,XIC,YIC, 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */ } #endif uiDrawBlock(block); }