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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/src/headerbuttons.c')
-rw-r--r--source/blender/src/headerbuttons.c5577
1 files changed, 5577 insertions, 0 deletions
diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c
new file mode 100644
index 00000000000..71cbac51dea
--- /dev/null
+++ b/source/blender/src/headerbuttons.c
@@ -0,0 +1,5577 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * 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/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <math.h>
+
+#include <sys/types.h>
+
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "BMF_Api.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_storage_types.h"
+
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+
+#include "DNA_ID.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
+#include "DNA_image_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_key_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_object_types.h"
+#include "DNA_oops_types.h"
+#include "DNA_packedFile_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_sequence_types.h"
+#include "DNA_sound_types.h"
+#include "DNA_space_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_text_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_view2d_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_world_types.h"
+#include "DNA_constraint_types.h"
+
+#include "BKE_utildefines.h"
+
+#include "BKE_constraint.h"
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_blender.h"
+#include "BKE_curve.h"
+#include "BKE_displist.h"
+#include "BKE_exotic.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_ika.h"
+#include "BKE_ipo.h"
+#include "BKE_key.h"
+#include "BKE_lattice.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_mball.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+#include "BKE_packedFile.h"
+#include "BKE_sca.h"
+#include "BKE_scene.h"
+#include "BKE_texture.h"
+#include "BKE_text.h"
+#include "BKE_world.h"
+
+#include "BLO_readfile.h"
+#include "BLO_writefile.h"
+
+#include "BIF_drawimage.h"
+#include "BIF_drawoops.h"
+#include "BIF_drawscene.h"
+#include "BIF_drawtext.h"
+#include "BIF_editarmature.h"
+#include "BIF_editfont.h"
+#include "BIF_editlattice.h"
+#include "BIF_editconstraint.h"
+#include "BIF_editmesh.h"
+#include "BIF_editmesh.h"
+#include "BIF_editsima.h"
+#include "BIF_editsound.h"
+#include "BIF_editsound.h"
+#include "BIF_gl.h"
+#include "BIF_imasel.h"
+#include "BIF_interface.h"
+#include "BIF_mainqueue.h"
+#include "BIF_mywindow.h"
+#include "BIF_poseobject.h"
+#include "BIF_renderwin.h"
+#include "BIF_resources.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+#include "BIF_toets.h"
+#include "BIF_toets.h"
+#include "BIF_toolbox.h"
+#include "BIF_usiblender.h"
+#include "BIF_previewrender.h"
+#include "BIF_writeimage.h"
+
+#include "BSE_edit.h"
+#include "BSE_filesel.h"
+#include "BSE_headerbuttons.h"
+#include "BSE_view.h"
+#include "BSE_sequence.h"
+#include "BSE_editaction.h"
+#include "BSE_editaction_types.h"
+#include "BSE_editipo.h"
+#include "BSE_drawipo.h"
+
+#include "BDR_drawmesh.h"
+#include "BDR_vpaint.h"
+#include "BDR_editface.h"
+#include "BDR_editobject.h"
+#include "BDR_editcurve.h"
+#include "BDR_editmball.h"
+
+#include "BPY_extern.h" // Blender Python library
+
+#include "interface.h"
+#include "mydevice.h"
+#include "blendef.h"
+#include "render.h"
+#include "ipo.h"
+#include "nla.h" /* __NLA : To be removed later */
+
+#include "TPT_DependKludge.h"
+
+/* these are needed to hide functions behind function tables,
+ which are initialized by the python key code */
+#include "keyed_functions.h"
+#include "license_key.h"
+
+/* local (?) functions */
+void do_file_buttons(short event);
+void do_text_buttons(unsigned short event);
+void load_space_sound(char *str);
+void load_sound_buttons(char *str);
+void load_space_image(char *str);
+void image_replace(Image *old, Image *new);
+void replace_space_image(char *str);
+void do_image_buttons(unsigned short event);
+void do_imasel_buttons(short event);
+static void check_packAll(void);
+static void unique_bone_name(Bone *bone, bArmature *arm);
+static void validate_bonebutton(void *data1, void *data2);
+static int bonename_exists(Bone *orig, char *name, ListBase *list);
+
+static void test_idbutton_cb(void *namev, void *arg2_unused)
+{
+ char *name= namev;
+ test_idbutton(name+2);
+}
+
+#define SPACEICONMAX 13 /* See release/datafiles/blenderbuttons */
+
+#include "BIF_poseobject.h"
+
+#include "SYS_System.h"
+
+#include "license_key.h"
+static int std_libbuttons(uiBlock *block,
+ int xco, int pin, short *pinpoin,
+ int browse, ID *id, ID *parid,
+ short *menupoin, int users,
+ int lib, int del, int autobut);
+
+
+extern char versionstr[]; /* from blender.c */
+/* extern void add_text_fs(char *file); *//* from text.c, BIF_text.h*/
+
+ /* LET OP: alle headerbuttons voor zelfde window steeds zelfde naam
+ * event B_REDR is standaard redraw
+ *
+ */
+
+
+/*
+ * The next define turns the newest menu structure on.
+ * There are some loose ends here at the moment so leave this undefined for now.
+ */
+/* #define EXPERIMENTAL_MENUS */
+
+
+#define XIC 20
+#define YIC 20
+
+static int viewmovetemp=0;
+
+/* extern void info_buttons(); in BSE_headerbuttons.c */
+
+extern char videosc_dir[]; /* exotic.c */
+
+/* *********************************************************************** */
+
+void write_videoscape_fs()
+{
+ if(G.obedit) {
+ error("Can't save Videoscape. Press TAB to leave EditMode");
+ }
+ else {
+ if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
+ activate_fileselect(FILE_SPECIAL, "SAVE VIDEOSCAPE", videosc_dir, write_videoscape);
+ }
+}
+
+void write_vrml_fs()
+{
+ if(G.obedit) {
+ error("Can't save VRML. Press TAB to leave EditMode");
+ }
+ else {
+ if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
+
+ activate_fileselect(FILE_SPECIAL, "SAVE VRML1", videosc_dir, write_vrml);
+ }
+
+}
+
+void write_dxf_fs()
+{
+ if(G.obedit) {
+ error("Can't save DXF. Press TAB to leave EditMode");
+ }
+ else {
+
+ if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
+
+ activate_fileselect(FILE_SPECIAL, "SAVE DXF", videosc_dir, write_dxf);
+ }
+}
+
+/* ********************** GLOBAL ****************************** */
+
+static int std_libbuttons(uiBlock *block, int xco, int pin, short *pinpoin, int browse, ID *id, ID *parid, short *menupoin, int users, int lib, int del, int autobut)
+{
+ ListBase *lb;
+ Object *ob;
+ Ipo *ipo;
+ uiBut *but;
+ int len, idwasnul=0, idtype, oldcol;
+ char *str=NULL, str1[10];
+
+ oldcol= uiBlockGetCol(block);
+
+ if(id && pin) {
+ uiDefIconButS(block, ICONTOG, pin, ICON_PIN_DEHLT, (short)xco,0,XIC,YIC, pinpoin, 0, 0, 0, 0, "Pin this data block; no update according Object selection");
+ xco+= XIC;
+ }
+ if(browse) {
+ if(id==0) {
+ idwasnul= 1;
+ /* alleen de browse button */
+ ob= OBACT;
+ if(curarea->spacetype==SPACE_IMAGE) {
+ id= G.main->image.first;
+ }
+ else if(curarea->spacetype==SPACE_SOUND) {
+ id= G.main->sound.first;
+ }
+ else if(curarea->spacetype==SPACE_ACTION) {
+ id= G.main->action.first;
+ }
+ else if(curarea->spacetype==SPACE_NLA) {
+ id=NULL;
+ }
+ else if(curarea->spacetype==SPACE_IPO) {
+ id= G.main->ipo.first;
+ /* testen op ipotype */
+ while(id) {
+ ipo= (Ipo *)id;
+ if(G.sipo->blocktype==ipo->blocktype) break;
+ id= id->next;
+ }
+ }
+ else if(curarea->spacetype==SPACE_BUTS) {
+ if(browse==B_WORLDBROWSE) {
+ id= G.main->world.first;
+ }
+ else if(ob && ob->type && (ob->type<OB_LAMP)) {
+ if(G.buts->mainb==BUTS_MAT) id= G.main->mat.first;
+ else if(G.buts->mainb==BUTS_TEX) id= G.main->tex.first;
+ }
+ }
+ else if(curarea->spacetype==SPACE_TEXT) {
+ id= G.main->text.first;
+ }
+ }
+ if(id) {
+ char *extrastr= NULL;
+
+ idtype= GS(id->name);
+ lb= wich_libbase(G.main, GS(id->name));
+
+ if(idwasnul) id= NULL;
+ else if(id->us>1) uiBlockSetCol(block, BUTDBLUE);
+
+ if (pin && *pinpoin) {
+ uiBlockSetCol(block, BUTDPINK);
+ }
+
+ if ELEM7( idtype, ID_SCE, ID_SCR, ID_MA, ID_TE, ID_WO, ID_IP, ID_AC) extrastr= "ADD NEW %x 32767";
+ else if (idtype==ID_TXT) extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767";
+ else if (idtype==ID_SO) extrastr= "OPEN NEW %x 32766";
+
+ uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");
+ if( idtype==ID_SCE || idtype==ID_SCR ) uiClearButLock();
+
+ if(curarea->spacetype==SPACE_BUTS)
+ uiSetButLock(idtype!=ID_SCR && G.obedit!=0 && G.buts->mainb==BUTS_EDIT, NULL);
+
+ if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data");
+
+ if (lb) {
+ if( idtype==ID_IP)
+ IPOnames_to_pupstring(&str, NULL, extrastr, lb, id, menupoin, G.sipo->blocktype);
+ else
+ IDnames_to_pupstring(&str, NULL, extrastr, lb, id, menupoin);
+ }
+
+ uiDefButS(block, MENU, browse, str, (short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock or Add NEW");
+
+ uiClearButLock();
+
+ MEM_freeN(str);
+ xco+= XIC;
+ }
+ else if(curarea->spacetype==SPACE_BUTS) {
+ if ELEM3(G.buts->mainb, BUTS_MAT, BUTS_TEX, BUTS_WORLD) {
+ uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");
+ if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data");
+ uiDefButS(block, MENU, browse, "ADD NEW %x 32767",(short) xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock");
+ uiClearButLock();
+ } else if (G.buts->mainb == BUTS_SOUND) {
+ uiDefButS(block, MENU, browse, "OPEN NEW %x 32766",(short) xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock");
+ }
+ }
+ else if(curarea->spacetype==SPACE_TEXT) {
+ uiDefButS(block, MENU, browse, "OPEN NEW %x 32766 | ADD NEW %x 32767", (short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock");
+ }
+ else if(curarea->spacetype==SPACE_SOUND) {
+ uiDefButS(block, MENU, browse, "OPEN NEW %x 32766",(short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock");
+ }
+ else if(curarea->spacetype==SPACE_NLA) {
+ }
+ else if(curarea->spacetype==SPACE_ACTION) {
+ uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");
+ if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data");
+
+ uiDefButS(block, MENU, browse, "ADD NEW %x 32767", xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock");
+ uiClearButLock();
+ }
+ else if(curarea->spacetype==SPACE_IPO) {
+ uiSetButLock(G.scene->id.lib!=0, "Can't edit library data");
+ if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data");
+
+ uiDefButS(block, MENU, browse, "ADD NEW %x 32767", (short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock");
+ uiClearButLock();
+ }
+ }
+
+
+ uiBlockSetCol(block, oldcol);
+
+ if(id) {
+
+ /* name */
+ if(id->us>1) uiBlockSetCol(block, BUTDBLUE);
+ /* Pinned data ? */
+ if (pin && *pinpoin) {
+ uiBlockSetCol(block, BUTDPINK);
+ }
+ /* Redalert overrides pin color */
+ if(id->us<=0) uiBlockSetCol(block, REDALERT);
+
+ uiSetButLock(id->lib!=0, "Can't edit library data");
+
+ str1[0]= id->name[0];
+ str1[1]= id->name[1];
+ str1[2]= ':';
+ str1[3]= 0;
+ if(strcmp(str1, "SC:")==0) strcpy(str1, "SCE:");
+ else if(strcmp(str1, "SR:")==0) strcpy(str1, "SCR:");
+
+ if( GS(id->name)==ID_IP) len= 110;
+ else len= 120;
+
+ but= uiDefBut(block, TEX, B_IDNAME, str1,(short)xco, 0, (short)len, YIC, id->name+2, 0.0, 19.0, 0, 0, "Datablock name");
+ uiButSetFunc(but, test_idbutton_cb, id->name, NULL);
+
+ uiClearButLock();
+
+ xco+= len;
+
+ if(id->lib) {
+
+ if(parid && parid->lib) uiDefIconBut(block, BUT, 0, ICON_DATALIB,(short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Indirect Library Datablock");
+ else uiDefIconBut(block, BUT, lib, ICON_PARLIB, (short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Library DataBlock, press to make local");
+
+ xco+= XIC;
+ }
+
+
+ if(users && id->us>1) {
+ uiSetButLock (pin && *pinpoin, "Can't make pinned data single-user");
+
+ sprintf(str1, "%d", id->us);
+ if(id->us<100) {
+
+ uiDefBut(block, BUT, users, str1, (short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Number of users, press to make single-user");
+ xco+= XIC;
+ }
+ else {
+ uiDefBut(block, BUT, users, str1, (short)xco, 0, XIC+10, YIC, 0, 0, 0, 0, 0, "Number of users, press to make single-user");
+ xco+= XIC+10;
+ }
+
+ uiClearButLock();
+
+ }
+
+ if(del) {
+
+ uiSetButLock (pin && *pinpoin, "Can't unlink pinned data");
+ if(parid && parid->lib);
+ else {
+ uiDefIconBut(block, BUT, del, ICON_X, (short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Delete link to this Datablock");
+ xco+= XIC;
+ }
+
+ uiClearButLock();
+ }
+
+ if(autobut) {
+ if(parid && parid->lib);
+ else {
+ uiDefIconBut(block, BUT, autobut, ICON_AUTO,(short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Automatic name");
+ xco+= XIC;
+ }
+
+
+ }
+ }
+ else xco+=XIC;
+
+ uiBlockSetCol(block, oldcol);
+
+ return xco;
+}
+
+void update_for_newframe(void)
+{
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION,0);
+ allqueue(REDRAWNLA,0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWINFO, 1);
+ allqueue(REDRAWSEQ, 1);
+ allqueue(REDRAWSOUND, 1);
+ allqueue(REDRAWBUTSHEAD, 1);
+ allqueue(REDRAWBUTSMAT, 1);
+ allqueue(REDRAWBUTSLAMP, 1);
+
+ /* layers/materials, object ipos are calculted in where_is_object (too) */
+ do_all_ipos();
+ BPY_do_all_scripts(SCRIPT_FRAMECHANGED);
+ do_all_keys();
+ do_all_actions();
+ do_all_ikas();
+
+ test_all_displists();
+}
+
+static void show_splash(void)
+{
+ extern char datatoc_splash_jpg[];
+ extern int datatoc_splash_jpg_size;
+ char *string = NULL;
+
+#ifdef NAN_BUILDINFO
+ char buffer[1024];
+ extern char * build_date;
+ extern char * build_time;
+ extern char * build_platform;
+ extern char * build_type;
+
+ string = &buffer[0];
+ sprintf(string,"Built on %s %s Version %s %s", build_date, build_time, build_platform, build_type);
+#endif
+
+ splash((void *)datatoc_splash_jpg, datatoc_splash_jpg_size, string);
+}
+
+void do_global_buttons(unsigned short event)
+{
+ ListBase *lb;
+ Object *ob;
+ Material *ma;
+ MTex *mtex;
+ Ipo *ipo;
+ Lamp *la;
+ World *wrld;
+ Sequence *seq;
+ bAction *act;
+ ID *id, *idtest, *from;
+ int nr= 1;
+
+ ob= OBACT;
+
+ id= 0; /* id op nul voor texbrowse */
+
+ switch(event) {
+
+ case B_NEWFRAME:
+ scrarea_queue_winredraw(curarea);
+ scrarea_queue_headredraw(curarea);
+
+ update_for_newframe();
+ break;
+ case B_REDR:
+ scrarea_queue_winredraw(curarea);
+ scrarea_queue_headredraw(curarea);
+ break;
+ case B_EDITBROWSE:
+ if(ob==0) return;
+ if(ob->id.lib) return;
+ id= ob->data;
+ if(id==0) return;
+
+ if(G.buts->menunr== -2) {
+ activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_EDITBROWSE, &G.buts->menunr, do_global_buttons);
+ return;
+ }
+ if(G.buts->menunr < 0) return;
+
+ lb= wich_libbase(G.main, GS(id->name));
+ idtest= lb->first;
+ while(idtest) {
+ if(nr==G.buts->menunr) {
+ if(idtest!=id) {
+ id->us--;
+ id_us_plus(idtest);
+
+ ob->data= idtest;
+
+ test_object_materials(idtest);
+
+ if( GS(idtest->name)==ID_CU ) {
+ test_curve_type(ob);
+ allqueue(REDRAWBUTSEDIT, 0);
+ makeDispList(ob);
+ }
+ else if( ob->type==OB_MESH ) {
+ makeDispList(ob);
+ }
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION,0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWNLA,0);
+ }
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+
+ break;
+ case B_MESHBROWSE:
+ if(ob==0) return;
+ if(ob->id.lib) return;
+
+ id= ob->data;
+ if(id==0) id= G.main->mesh.first;
+ if(id==0) return;
+
+ if(G.buts->menunr== -2) {
+ activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_MESHBROWSE, &G.buts->menunr, do_global_buttons);
+ return;
+ }
+ if(G.buts->menunr < 0) return;
+
+
+ idtest= G.main->mesh.first;
+ while(idtest) {
+ if(nr==G.buts->menunr) {
+
+ set_mesh(ob, (Mesh *)idtest);
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION,0);
+ allqueue(REDRAWIPO, 0);
+
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+
+ break;
+ case B_MATBROWSE:
+ if(G.buts->menunr== -2) {
+ activate_databrowse((ID *)G.buts->lockpoin, ID_MA, 0, B_MATBROWSE, &G.buts->menunr, do_global_buttons);
+ return;
+ }
+
+ if(G.buts->menunr < 0) return;
+
+ if(G.buts->pin) {
+
+ }
+ else {
+
+ ma= give_current_material(ob, ob->actcol);
+ nr= 1;
+
+ id= (ID *)ma;
+
+ idtest= G.main->mat.first;
+ while(idtest) {
+ if(nr==G.buts->menunr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* new mat */
+ if(id) idtest= (ID *)copy_material((Material *)id);
+ else {
+ idtest= (ID *)add_material("Material");
+ }
+ idtest->us--;
+ }
+ if(idtest!=id) {
+ assign_material(ob, (Material *)idtest, ob->actcol);
+
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSMAT, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+
+ }
+ break;
+ case B_MATDELETE:
+ if(G.buts->pin) {
+
+ }
+ else {
+ ma= give_current_material(ob, ob->actcol);
+ if(ma) {
+ assign_material(ob, 0, ob->actcol);
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSMAT, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+ break;
+ case B_TEXDELETE:
+ if(G.buts->pin) {
+
+ }
+ else {
+ if(G.buts->texfrom==0) { /* from mat */
+ ma= give_current_material(ob, ob->actcol);
+ if(ma) {
+ mtex= ma->mtex[ ma->texact ];
+ if(mtex) {
+ if(mtex->tex) mtex->tex->id.us--;
+ MEM_freeN(mtex);
+ ma->mtex[ ma->texact ]= 0;
+ allqueue(REDRAWBUTSTEX, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+ }
+ else if(G.buts->texfrom==1) { /* from world */
+ wrld= G.scene->world;
+ if(wrld) {
+ mtex= wrld->mtex[ wrld->texact ];
+ if(mtex) {
+ if(mtex->tex) mtex->tex->id.us--;
+ MEM_freeN(mtex);
+ wrld->mtex[ wrld->texact ]= 0;
+ allqueue(REDRAWBUTSTEX, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+ }
+ else { /* from lamp */
+ la= ob->data;
+ if(la && ob->type==OB_LAMP) { /* voor zekerheid */
+ mtex= la->mtex[ la->texact ];
+ if(mtex) {
+ if(mtex->tex) mtex->tex->id.us--;
+ MEM_freeN(mtex);
+ la->mtex[ la->texact ]= 0;
+ allqueue(REDRAWBUTSTEX, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+ }
+ }
+ break;
+ case B_EXTEXBROWSE:
+ case B_TEXBROWSE:
+
+ if(G.buts->texnr== -2) {
+
+ id= G.buts->lockpoin;
+ if(event==B_EXTEXBROWSE) {
+ id= 0;
+ ma= give_current_material(ob, ob->actcol);
+ if(ma) {
+ mtex= ma->mtex[ ma->texact ];
+ if(mtex) id= (ID *)mtex->tex;
+ }
+ }
+
+ activate_databrowse(id, ID_TE, 0, B_TEXBROWSE, &G.buts->texnr, do_global_buttons);
+ return;
+ }
+ if(G.buts->texnr < 0) break;
+
+ if(G.buts->pin) {
+
+ }
+ else {
+ id= 0;
+
+ ma= give_current_material(ob, ob->actcol);
+ if(ma) {
+ mtex= ma->mtex[ ma->texact ];
+ if(mtex) id= (ID *)mtex->tex;
+ }
+
+ idtest= G.main->tex.first;
+ while(idtest) {
+ if(nr==G.buts->texnr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* new tex */
+ if(id) idtest= (ID *)copy_texture((Tex *)id);
+ else idtest= (ID *)add_texture("Tex");
+ idtest->us--;
+ }
+ if(idtest!=id && ma) {
+
+ if( ma->mtex[ma->texact]==0) ma->mtex[ma->texact]= add_mtex();
+
+ ma->mtex[ ma->texact ]->tex= (Tex *)idtest;
+ id_us_plus(idtest);
+ if(id) id->us--;
+
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSTEX, 0);
+ allqueue(REDRAWBUTSMAT, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+ break;
+ case B_ACTIONDELETE:
+ act=ob->action;
+
+ if (act)
+ act->id.us--;
+ ob->action=NULL;
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWIPO, 0);
+ break;
+ case B_ACTIONBROWSE:
+ if (!ob)
+ break;
+ act=ob->action;
+ id= (ID *)act;
+
+ if (G.saction->actnr== -2){
+ activate_databrowse((ID *)G.saction->action, ID_AC, 0, B_ACTIONBROWSE, &G.saction->actnr, do_global_buttons);
+ return;
+ }
+
+ if(G.saction->actnr < 0) break;
+
+ /* See if we have selected a valid action */
+ for (idtest= G.main->action.first; idtest; idtest= idtest->next) {
+ if(nr==G.saction->actnr) {
+ break;
+ }
+ nr++;
+
+ }
+
+ if(G.saction->pin) {
+ G.saction->action= (bAction *)idtest;
+ allqueue(REDRAWACTION, 0);
+ }
+ else {
+
+ /* Store current action */
+ if (!idtest){
+ if (act)
+ idtest= (ID *)copy_action(act);
+ else
+ idtest=(ID *)add_empty_action();
+ idtest->us--;
+ }
+
+
+ if(idtest!=id && ob) {
+ act= (bAction *)idtest;
+
+ ob->action= act;
+ ob->activecon=NULL;
+ id_us_plus(idtest);
+
+ if(id) id->us--;
+
+ // Update everything
+ do_global_buttons (B_NEWFRAME);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWHEADERS, 0);
+ }
+ }
+
+ break;
+ case B_IPOBROWSE:
+
+ ipo= get_ipo_to_edit(&from);
+ id= (ID *)ipo;
+ if(from==0) return;
+
+ if(G.sipo->menunr== -2) {
+ activate_databrowse((ID *)G.sipo->ipo, ID_IP, GS(from->name), B_IPOBROWSE, &G.sipo->menunr, do_global_buttons);
+ return;
+ }
+
+ if(G.sipo->menunr < 0) break;
+
+ idtest= G.main->ipo.first;
+ while(idtest) {
+ if( ((Ipo *)idtest)->blocktype == G.sipo->blocktype) {
+ if(nr==G.sipo->menunr) {
+ break;
+ }
+ nr++;
+ }
+ idtest= idtest->next;
+ }
+
+ if(G.sipo->pin) {
+ if(idtest) {
+ G.sipo->ipo= (Ipo *)idtest;
+ allspace(REMAKEIPO, 0); // in fact it should only do this one, but there is no function for it
+ }
+ }
+ else {
+ // assign the ipo to ...
+
+ if(idtest==0) {
+ if(ipo) idtest= (ID *)copy_ipo(ipo);
+ else {
+ nr= GS(from->name);
+ if(nr==ID_OB){
+ if (G.sipo->blocktype==IPO_CO)
+ idtest= (ID *)add_ipo("CoIpo", IPO_CO); /* BLEARGH! */
+ else
+ idtest= (ID *)add_ipo("ObIpo", nr);
+ }
+ else if(nr==ID_MA) idtest= (ID *)add_ipo("MatIpo", nr);
+ else if(nr==ID_SEQ) idtest= (ID *)add_ipo("MatSeq", nr);
+ else if(nr==ID_CU) idtest= (ID *)add_ipo("CuIpo", nr);
+ else if(nr==ID_KE) idtest= (ID *)add_ipo("KeyIpo", nr);
+ else if(nr==ID_WO) idtest= (ID *)add_ipo("WoIpo", nr);
+ else if(nr==ID_LA) idtest= (ID *)add_ipo("LaIpo", nr);
+ else if(nr==ID_CA) idtest= (ID *)add_ipo("CaIpo", nr);
+ else if(nr==ID_SO) idtest= (ID *)add_ipo("SndIpo", nr);
+ else if(nr==ID_AC) idtest= (ID *)add_ipo("ActIpo", nr);
+ else error("Warn bugs@blender.nl!");
+ }
+ idtest->us--;
+ }
+ if(idtest!=id && from) {
+ ipo= (Ipo *)idtest;
+
+ if (ipo->blocktype==IPO_CO){
+ ((Object*)from)->activecon->ipo = ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+ }
+ else if(ipo->blocktype==ID_OB) {
+ ( (Object *)from)->ipo= ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ else if(ipo->blocktype==ID_AC) {
+ bActionChannel *chan;
+ chan = get_hilighted_action_channel ((bAction*)from);
+ if (!chan){
+ error ("Create an action channel first");
+ return;
+ }
+ chan->ipo=ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWACTION, 0);
+ }
+ else if(ipo->blocktype==ID_MA) {
+ ( (Material *)from)->ipo= ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWBUTSMAT, 0);
+ }
+ else if(ipo->blocktype==ID_SEQ) {
+ seq= (Sequence *)from;
+ if(seq->type & SEQ_EFFECT) {
+ id_us_plus(idtest);
+ seq->ipo= ipo;
+ }
+ }
+ else if(ipo->blocktype==ID_CU) {
+ ( (Curve *)from)->ipo= ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ else if(ipo->blocktype==ID_KE) {
+ ( (Key *)from)->ipo= ipo;
+
+ id_us_plus(idtest);
+ allqueue(REDRAWVIEW3D, 0);
+
+ }
+ else if(ipo->blocktype==ID_WO) {
+ ( (World *)from)->ipo= ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWBUTSWORLD, 0);
+ }
+ else if(ipo->blocktype==ID_LA) {
+ ( (Lamp *)from)->ipo= ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWBUTSLAMP, 0);
+ }
+ else if(ipo->blocktype==ID_CA) {
+ ( (Camera *)from)->ipo= ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ else if(ipo->blocktype==ID_SO) {
+ ( (bSound *)from)->ipo= ipo;
+ id_us_plus(idtest);
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ else
+ printf("error in browse ipo \n");
+
+ if(id) id->us--;
+
+ scrarea_queue_winredraw(curarea);
+ scrarea_queue_headredraw(curarea);
+ allqueue(REDRAWIPO, 0);
+ }
+ }
+ break;
+ case B_IPODELETE:
+ ipo= get_ipo_to_edit(&from);
+ if(from==0) return;
+
+ ipo->id.us--;
+
+ if(ipo->blocktype==ID_OB) ( (Object *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_MA) ( (Material *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_SEQ) ( (Sequence *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_CU) ( (Curve *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_KE) ( (Key *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_LA) ( (Lamp *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_CA) ( (Camera *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_SO) ( (bSound *)from)->ipo= 0;
+ else if(ipo->blocktype==ID_AC) get_hilighted_action_channel((bAction*)from)->ipo= 0;
+ else if(ipo->blocktype==IPO_CO) ((Object *)from)->activecon->ipo= 0;
+
+ else error("Warn bugs@blender.nl!");
+
+ editipo_changed(G.sipo, 1); /* doredraw */
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWNLA, 0);
+ allqueue (REDRAWACTION, 0);
+
+ break;
+ case B_WORLDBROWSE:
+
+ if(G.buts->menunr==-2) {
+ activate_databrowse((ID *)G.scene->world, ID_WO, 0, B_WORLDBROWSE, &G.buts->menunr, do_global_buttons);
+ break;
+ }
+
+ if(G.buts->menunr < 0) break;
+ /* geen lock */
+
+ wrld= G.scene->world;
+ nr= 1;
+
+ id= (ID *)wrld;
+
+ idtest= G.main->world.first;
+ while(idtest) {
+ if(nr==G.buts->menunr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* new world */
+ if(id) idtest= (ID *)copy_world((World *)id);
+ else idtest= (ID *)add_world("World");
+ idtest->us--;
+ }
+ if(idtest!=id) {
+ G.scene->world= (World *)idtest;
+ id_us_plus(idtest);
+ if(id) id->us--;
+
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSWORLD, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ break;
+ case B_WORLDDELETE:
+ if(G.scene->world) {
+ G.scene->world->id.us--;
+ G.scene->world= 0;
+ allqueue(REDRAWBUTSWORLD, 0);
+ allqueue(REDRAWIPO, 0);
+ }
+
+ break;
+ case B_WTEXBROWSE:
+
+ if(G.buts->texnr== -2) {
+ id= 0;
+ wrld= G.scene->world;
+ if(wrld) {
+ mtex= wrld->mtex[ wrld->texact ];
+ if(mtex) id= (ID *)mtex->tex;
+ }
+
+ activate_databrowse((ID *)id, ID_TE, 0, B_WTEXBROWSE, &G.buts->texnr, do_global_buttons);
+ return;
+ }
+ if(G.buts->texnr < 0) break;
+
+ if(G.buts->pin) {
+
+ }
+ else {
+ id= 0;
+
+ wrld= G.scene->world;
+ if(wrld) {
+ mtex= wrld->mtex[ wrld->texact ];
+ if(mtex) id= (ID *)mtex->tex;
+ }
+
+ idtest= G.main->tex.first;
+ while(idtest) {
+ if(nr==G.buts->texnr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* new tex */
+ if(id) idtest= (ID *)copy_texture((Tex *)id);
+ else idtest= (ID *)add_texture("Tex");
+ idtest->us--;
+ }
+ if(idtest!=id && wrld) {
+
+ if( wrld->mtex[wrld->texact]==0) {
+ wrld->mtex[wrld->texact]= add_mtex();
+ wrld->mtex[wrld->texact]->texco= TEXCO_VIEW;
+ }
+ wrld->mtex[ wrld->texact ]->tex= (Tex *)idtest;
+ id_us_plus(idtest);
+ if(id) id->us--;
+
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSTEX, 0);
+ allqueue(REDRAWBUTSWORLD, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+ break;
+ case B_LAMPBROWSE:
+ /* geen lock */
+ if(ob==0) return;
+ if(ob->type!=OB_LAMP) return;
+
+ if(G.buts->menunr== -2) {
+ activate_databrowse((ID *)G.buts->lockpoin, ID_LA, 0, B_LAMPBROWSE, &G.buts->menunr, do_global_buttons);
+ return;
+ }
+ if(G.buts->menunr < 0) break;
+
+ la= ob->data;
+ nr= 1;
+ id= (ID *)la;
+
+ idtest= G.main->lamp.first;
+ while(idtest) {
+ if(nr==G.buts->menunr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* geen new lamp */
+ return;
+ }
+ if(idtest!=id) {
+ ob->data= (Lamp *)idtest;
+ id_us_plus(idtest);
+ if(id) id->us--;
+
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSLAMP, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ break;
+
+ case B_LTEXBROWSE:
+
+ if(ob==0) return;
+ if(ob->type!=OB_LAMP) return;
+
+ if(G.buts->texnr== -2) {
+ id= 0;
+ la= ob->data;
+ mtex= la->mtex[ la->texact ];
+ if(mtex) id= (ID *)mtex->tex;
+
+ activate_databrowse(id, ID_TE, 0, B_LTEXBROWSE, &G.buts->texnr, do_global_buttons);
+ return;
+ }
+ if(G.buts->texnr < 0) break;
+
+ if(G.buts->pin) {
+
+ }
+ else {
+ id= 0;
+
+ la= ob->data;
+ mtex= la->mtex[ la->texact ];
+ if(mtex) id= (ID *)mtex->tex;
+
+ idtest= G.main->tex.first;
+ while(idtest) {
+ if(nr==G.buts->texnr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* new tex */
+ if(id) idtest= (ID *)copy_texture((Tex *)id);
+ else idtest= (ID *)add_texture("Tex");
+ idtest->us--;
+ }
+ if(idtest!=id && la) {
+
+ if( la->mtex[la->texact]==0) {
+ la->mtex[la->texact]= add_mtex();
+ la->mtex[la->texact]->texco= TEXCO_GLOB;
+ }
+ la->mtex[ la->texact ]->tex= (Tex *)idtest;
+ id_us_plus(idtest);
+ if(id) id->us--;
+
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSTEX, 0);
+ allqueue(REDRAWBUTSLAMP, 0);
+ allqueue(REDRAWIPO, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+ break;
+
+ case B_IMAGEDELETE:
+ G.sima->image= 0;
+ image_changed(G.sima, 0);
+ allqueue(REDRAWIMAGE, 0);
+ break;
+
+ case B_AUTOMATNAME:
+ automatname(G.buts->lockpoin);
+ allqueue(REDRAWBUTSHEAD, 0);
+ break;
+ case B_AUTOTEXNAME:
+ if(G.buts->mainb==BUTS_TEX) {
+ autotexname(G.buts->lockpoin);
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWBUTSTEX, 0);
+ }
+ else if(G.buts->mainb==BUTS_MAT) {
+ ma= G.buts->lockpoin;
+ if(ma->mtex[ ma->texact]) autotexname(ma->mtex[ma->texact]->tex);
+ allqueue(REDRAWBUTSMAT, 0);
+ }
+ else if(G.buts->mainb==BUTS_WORLD) {
+ wrld= G.buts->lockpoin;
+ if(wrld->mtex[ wrld->texact]) autotexname(wrld->mtex[wrld->texact]->tex);
+ allqueue(REDRAWBUTSWORLD, 0);
+ }
+ else if(G.buts->mainb==BUTS_LAMP) {
+ la= G.buts->lockpoin;
+ if(la->mtex[ la->texact]) autotexname(la->mtex[la->texact]->tex);
+ allqueue(REDRAWBUTSLAMP, 0);
+ }
+ break;
+
+ case B_RESETAUTOSAVE:
+ reset_autosave();
+ break;
+ case B_SOUNDTOGGLE:
+ SYS_WriteCommandLineInt(SYS_GetSystem(), "noaudio", (U.gameflags & USERDEF_DISABLE_SOUND));
+ break;
+ case B_SHOWSPLASH:
+ if ((LICENSE_KEY_VALID) && ((G.qual & LR_SHIFTKEY) == 0)) {
+ SHOW_LICENSE_KEY();
+ } else {
+ show_splash();
+ }
+ break;
+ case B_MIPMAPCHANGED:
+ set_mipmap(!(U.gameflags & USERDEF_DISABLE_SOUND));
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+ case B_NEWSPACE:
+ newspace(curarea, curarea->butspacetype);
+ break;
+ case B_LOADTEMP: /* is button uit space.c */
+ BIF_read_autosavefile();
+ break;
+ case B_FULL:
+ if(curarea->spacetype!=SPACE_INFO) {
+ area_fullscreen();
+ }
+ break;
+
+ case B_IDNAME:
+ /* changing a metaballs name, sadly enough,
+ * can require it to be updated because its
+ * basis might have changed... -zr
+ */
+ if (OBACT && OBACT->type==OB_MBALL)
+ makeDispList(OBACT);
+
+ /* redraw omdat naam veranderd is: nieuwe pup */
+ scrarea_queue_headredraw(curarea);
+ allqueue(REDRAWBUTSHEAD, 0);
+ allqueue(REDRAWINFO, 1);
+ allqueue(REDRAWOOPS, 1);
+ /* naam scene ook in set PUPmenu */
+ if ELEM(curarea->spacetype, SPACE_BUTS, SPACE_INFO) allqueue(REDRAWBUTSALL, 0);
+
+ allqueue(REDRAWHEADERS, 0);
+
+ break;
+ }
+}
+
+
+void do_global_buttons2(short event)
+{
+ Base *base;
+ Object *ob;
+ Material *ma;
+ MTex *mtex;
+ Mesh *me;
+ Curve *cu;
+ MetaBall *mb;
+ Ipo *ipo;
+ Lamp *la;
+ Lattice *lt;
+ World *wrld;
+ ID *idfrom;
+ bAction *act;
+
+ /* algemeen: Single User mag als from==LOCAL
+ * Make Local mag als (from==LOCAL && id==LIB)
+ */
+
+ ob= OBACT;
+
+ switch(event) {
+
+ case B_LAMPALONE:
+ if(ob && ob->id.lib==0) {
+ la= ob->data;
+ if(la->id.us>1) {
+ if(okee("Single user")) {
+ ob->data= copy_lamp(la);
+ la->id.us--;
+ }
+ }
+ }
+ break;
+ case B_LAMPLOCAL:
+ if(ob && ob->id.lib==0) {
+ la= ob->data;
+ if(la->id.lib) {
+ if(okee("Make local")) {
+ make_local_lamp(la);
+ }
+ }
+ }
+ break;
+
+ case B_ARMLOCAL:
+ if (ob&&ob->id.lib==0){
+ bArmature *arm=ob->data;
+ if (arm->id.lib){
+ if(okee("Make local")) {
+ make_local_armature(arm);
+ }
+ }
+ }
+ break;
+ case B_ARMALONE:
+ if(ob && ob->id.lib==0) {
+ bArmature *arm=ob->data;
+ if(arm->id.us>1) {
+ if(okee("Single user")) {
+ ob->data= copy_armature(arm);
+ arm->id.us--;
+ }
+ }
+ }
+ break;
+ case B_ACTLOCAL:
+ if(ob && ob->id.lib==0) {
+ act= ob->action;
+ if(act->id.lib) {
+ if(okee("Make local")) {
+ make_local_action(act);
+ allqueue(REDRAWACTION,0);
+ }
+ }
+ }
+ break;
+ case B_ACTALONE:
+ if (ob)
+ act= ob->action;
+
+ if(ob && ob->id.lib==0) {
+ if(act->id.us>1) {
+ if(okee("Single user")) {
+ ob->action=copy_action(act);
+ ob->activecon=NULL;
+ act->id.us--;
+ allqueue(REDRAWACTION, 0);
+ }
+ }
+ }
+ break;
+
+ case B_CAMERAALONE:
+ if(ob && ob->id.lib==0) {
+ Camera *ca= ob->data;
+ if(ca->id.us>1) {
+ if(okee("Single user")) {
+ ob->data= copy_camera(ca);
+ ca->id.us--;
+ }
+ }
+ }
+ break;
+ case B_CAMERALOCAL:
+ if(ob && ob->id.lib==0) {
+ Camera *ca= ob->data;
+ if(ca->id.lib) {
+ if(okee("Make local")) {
+ make_local_camera(ca);
+ }
+ }
+ }
+ break;
+ case B_WORLDALONE:
+ wrld= G.scene->world;
+ if(wrld->id.us>1) {
+ if(okee("Single user")) {
+ G.scene->world= copy_world(wrld);
+ wrld->id.us--;
+ }
+ }
+ break;
+ case B_WORLDLOCAL:
+ wrld= G.scene->world;
+ if(wrld && wrld->id.lib) {
+ if(okee("Make local")) {
+ make_local_world(wrld);
+ }
+ }
+ break;
+
+ case B_LATTALONE:
+ if(ob && ob->id.lib==0) {
+ lt= ob->data;
+ if(lt->id.us>1) {
+ if(okee("Single user")) {
+ ob->data= copy_lattice(lt);
+ lt->id.us--;
+ }
+ }
+ }
+ break;
+ case B_LATTLOCAL:
+ if(ob && ob->id.lib==0) {
+ lt= ob->data;
+ if(lt->id.lib) {
+ if(okee("Make local")) {
+ make_local_lattice(lt);
+ }
+ }
+ }
+ break;
+
+ case B_MATALONE:
+ if(ob==0) return;
+ ma= give_current_material(ob, ob->actcol);
+ idfrom= material_from(ob, ob->actcol);
+ if(idfrom && idfrom->lib==0) {
+ if(ma->id.us>1) {
+ if(okee("Single user")) {
+ ma= copy_material(ma);
+ ma->id.us= 0;
+ assign_material(ob, ma, ob->actcol);
+ }
+ }
+ }
+ break;
+ case B_MATLOCAL:
+ if(ob==0) return;
+ idfrom= material_from(ob, ob->actcol);
+ if(idfrom->lib==0) {
+ ma= give_current_material(ob, ob->actcol);
+ if(ma && ma->id.lib) {
+ if(okee("Make local")) {
+ make_local_material(ma);
+ }
+ }
+ }
+ break;
+
+ case B_MESHLOCAL:
+ if(ob && ob->id.lib==0) {
+ me= ob->data;
+ if(me && me->id.lib) {
+ if(okee("Make local")) {
+ make_local_mesh(me);
+ make_local_key( me->key );
+ }
+ }
+ }
+ break;
+
+ case B_MBALLALONE:
+ if(ob && ob->id.lib==0) {
+ mb= ob->data;
+ if(mb->id.us>1) {
+ if(okee("Single user")) {
+ ob->data= copy_mball(mb);
+ mb->id.us--;
+ if(ob==G.obedit) allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ }
+ break;
+ case B_MBALLLOCAL:
+ if(ob && ob->id.lib==0) {
+ mb= ob->data;
+ if(mb->id.lib) {
+ if(okee("Make local")) {
+ make_local_mball(mb);
+ }
+ }
+ }
+ break;
+
+ case B_CURVEALONE:
+ if(ob && ob->id.lib==0) {
+ cu= ob->data;
+ if(cu->id.us>1) {
+ if(okee("Single user")) {
+ ob->data= copy_curve(cu);
+ cu->id.us--;
+ makeDispList(ob);
+ if(ob==G.obedit) allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ }
+ break;
+ case B_CURVELOCAL:
+ if(ob && ob->id.lib==0) {
+ cu= ob->data;
+ if(cu->id.lib) {
+ if(okee("Make local")) {
+ make_local_curve(cu);
+ make_local_key( cu->key );
+ makeDispList(ob);
+ }
+ }
+ }
+ break;
+
+ case B_TEXALONE:
+ if(G.buts->texfrom==0) { /* from mat */
+ if(ob==0) return;
+ ma= give_current_material(ob, ob->actcol);
+ if(ma && ma->id.lib==0) {
+ mtex= ma->mtex[ ma->texact ];
+ if(mtex->tex && mtex->tex->id.us>1) {
+ if(okee("Single user")) {
+ mtex->tex->id.us--;
+ mtex->tex= copy_texture(mtex->tex);
+ }
+ }
+ }
+ }
+ else if(G.buts->texfrom==1) { /* from world */
+ wrld= G.scene->world;
+ if(wrld->id.lib==0) {
+ mtex= wrld->mtex[ wrld->texact ];
+ if(mtex->tex && mtex->tex->id.us>1) {
+ if(okee("Single user")) {
+ mtex->tex->id.us--;
+ mtex->tex= copy_texture(mtex->tex);
+ }
+ }
+ }
+ }
+ else if(G.buts->texfrom==2) { /* from lamp */
+ if(ob==0 || ob->type!=OB_LAMP) return;
+ la= ob->data;
+ if(la->id.lib==0) {
+ mtex= la->mtex[ la->texact ];
+ if(mtex->tex && mtex->tex->id.us>1) {
+ if(okee("Single user")) {
+ mtex->tex->id.us--;
+ mtex->tex= copy_texture(mtex->tex);
+ }
+ }
+ }
+ }
+ break;
+ case B_TEXLOCAL:
+ if(G.buts->texfrom==0) { /* from mat */
+ if(ob==0) return;
+ ma= give_current_material(ob, ob->actcol);
+ if(ma && ma->id.lib==0) {
+ mtex= ma->mtex[ ma->texact ];
+ if(mtex->tex && mtex->tex->id.lib) {
+ if(okee("Make local")) {
+ make_local_texture(mtex->tex);
+ }
+ }
+ }
+ }
+ else if(G.buts->texfrom==1) { /* from world */
+ wrld= G.scene->world;
+ if(wrld->id.lib==0) {
+ mtex= wrld->mtex[ wrld->texact ];
+ if(mtex->tex && mtex->tex->id.lib) {
+ if(okee("Make local")) {
+ make_local_texture(mtex->tex);
+ }
+ }
+ }
+ }
+ else if(G.buts->texfrom==2) { /* from lamp */
+ if(ob==0 || ob->type!=OB_LAMP) return;
+ la= ob->data;
+ if(la->id.lib==0) {
+ mtex= la->mtex[ la->texact ];
+ if(mtex->tex && mtex->tex->id.lib) {
+ if(okee("Make local")) {
+ make_local_texture(mtex->tex);
+ }
+ }
+ }
+ }
+ break;
+
+ case B_IPOALONE:
+ ipo= get_ipo_to_edit(&idfrom);
+
+ if(idfrom && idfrom->lib==0) {
+ if(ipo->id.us>1) {
+ if(okee("Single user")) {
+ if(ipo->blocktype==ID_OB) ((Object *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_MA) ((Material *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_SEQ) ((Sequence *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_CU) ((Curve *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_KE) ((Key *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_LA) ((Lamp *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_WO) ((World *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_CA) ((Camera *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_SO) ((bSound *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==ID_AC) get_hilighted_action_channel((bAction *)idfrom)->ipo= copy_ipo(ipo);
+ else if(ipo->blocktype==IPO_CO) ((Object *)idfrom)->activecon->ipo= copy_ipo(ipo);
+ else error("Warn ton!");
+
+ ipo->id.us--;
+ allqueue(REDRAWIPO, 0);
+ }
+ }
+ }
+ break;
+ case B_IPOLOCAL:
+ ipo= get_ipo_to_edit(&idfrom);
+
+ if(idfrom && idfrom->lib==0) {
+ if(ipo->id.lib) {
+ if(okee("Make local")) {
+ make_local_ipo(ipo);
+ allqueue(REDRAWIPO, 0);
+ }
+ }
+ }
+ break;
+
+ case B_OBALONE:
+ if(G.scene->id.lib==0) {
+ if(ob->id.us>1) {
+ if(okee("Single user")) {
+ base= FIRSTBASE;
+ while(base) {
+ if(base->object==ob) {
+ base->object= copy_object(ob);
+ ob->id.us--;
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+ }
+ base= base->next;
+ }
+ }
+ }
+ }
+ break;
+ case B_OBLOCAL:
+ if(G.scene->id.lib==0) {
+ if(ob->id.lib) {
+ if(okee("Make local")) {
+ make_local_object(ob);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ }
+ break;
+ case B_MESHALONE:
+ if(ob && ob->id.lib==0) {
+
+ me= ob->data;
+
+ if(me && me->id.us>1) {
+ if(okee("Single user")) {
+ Mesh *men= copy_mesh(me);
+ men->id.us= 0;
+
+ set_mesh(ob, men);
+
+ if(ob==G.obedit) allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ }
+ break;
+ }
+
+ allqueue(REDRAWBUTSALL, 0);
+ allqueue(REDRAWOOPS, 0);
+}
+
+/* ********************** EMPTY ****************************** */
+/* ********************** INFO ****************************** */
+
+int buttons_do_unpack()
+{
+ int how;
+ char menu[2048];
+ char line[128];
+ int ret_value = RET_OK, count = 0;
+
+ count = countPackedFiles();
+
+ if (count) {
+ if (count == 1) {
+ sprintf(menu, "Unpack 1 file%%t");
+ } else {
+ sprintf(menu, "Unpack %d files%%t", count);
+ }
+
+ sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
+ strcat(menu, line);
+
+ sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
+ strcat(menu, line);
+
+ sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
+ strcat(menu, line);
+
+ sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
+ strcat(menu, line);
+
+ sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
+ strcat(menu, line);
+
+ sprintf(line, "|Ask for each file %%x%d", PF_ASK);
+ strcat(menu, line);
+
+ how = pupmenu(menu);
+
+ if(how != -1) {
+ if (how != PF_KEEP) {
+ unpackAll(how);
+ }
+ G.fileflags &= ~G_AUTOPACK;
+ } else {
+ ret_value = RET_CANCEL;
+ }
+ } else {
+ pupmenu("No packed files. Autopack disabled");
+ }
+
+ return (ret_value);
+}
+
+/* here, because of all creator stuff */
+
+Scene *copy_scene(Scene *sce, int level)
+{
+ /* level 0: alle objects shared
+ * level 1: alle objectdata shared
+ * level 2: volledige kopie
+ */
+ Scene *scen;
+ Base *base, *obase;
+
+
+ /* 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= 0;
+ scen->radio= 0;
+
+ obase= sce->base.first;
+ base= scen->base.first;
+ while(base) {
+ base->object->id.us++;
+ if(obase==sce->basact) scen->basact= base;
+
+ obase= obase->next;
+ base= base->next;
+ }
+
+ if(level==0) return scen;
+
+ /* level 1 */
+ G.scene= scen;
+ single_object_users(0);
+
+ /* camera */
+ ID_NEW(G.scene->camera);
+
+ /* level 2 */
+ if(level>=2) {
+ if(scen->world) {
+ scen->world->id.us--;
+ scen->world= copy_world(scen->world);
+ }
+ single_obdata_users(0);
+ single_mat_users_expand();
+ single_tex_users_expand();
+ }
+
+ clear_id_newpoins();
+
+ BPY_copy_scriptlink(&sce->scriptlink);
+
+
+
+ // 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);
+
+ }
+
+ 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;
+ }
+ /* laatste item: NEW SCREEN */
+ if(sc==0) {
+ duplicate_screen();
+ }
+ break;
+ case B_INFODELSCR:
+ /* dit event alleen met buttons doen, zodoende nooit vanuit full aanroepbaar */
+
+ 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")) {
+ /* vind nieuwe G.curscreen */
+
+ oldscreen= G.curscreen;
+ setscreen(sc); /* deze test of sc een full heeft */
+ unlink_screen(oldscreen);
+ free_libblock(&G.main->screen, oldscreen);
+ }
+ scrarea_queue_headredraw(curarea);
+
+ break;
+ case B_INFOSCE: /* menu select scene */
+
+ if( G.obedit) {
+ error("Unable to perform function in EditMode");
+ return;
+ }
+ 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;
+ }
+ /* laatste item: NEW SCENE */
+ if(sce==0) {
+ nr= pupmenu("Add scene%t|Empty|Link Objects|Link ObData|Full Copy");
+ if(nr<= 0) return;
+ if(nr==1) {
+ sce= add_scene(G.scene->id.name+2);
+ sce->r= G.scene->r;
+ }
+ else sce= copy_scene(G.scene, nr-2);
+
+ set_scene(sce);
+ }
+
+ 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")) {
+
+ /* alle sets aflopen */
+ sce1= G.main->scene.first;
+ while(sce1) {
+ if(sce1->set == G.scene) sce1->set= 0;
+ sce1= sce1->id.next;
+ }
+
+ /* alle sequences aflopen */
+ clear_scene_in_allseqs(G.scene);
+
+ /* alle schermen */
+ sc= G.main->screen.first;
+ while(sc) {
+ if(sc->scene == G.scene) sc->scene= sce;
+ sc= sc->id.next;
+ }
+ free_libblock(&G.main->scene, G.scene);
+ set_scene(sce);
+ }
+
+ break;
+ case B_FILEMENU:
+ tbox_setmain(9);
+ toolbox();
+ break;
+ }
+}
+
+/* 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;
+}
+
+
+static void check_packAll()
+{
+ // first check for dirty images
+ Image *ima;
+
+ ima = G.main->image.first;
+ while (ima) {
+ if (ima->ibuf && (ima->ibuf->userflags &= IB_BITMAPDIRTY)) {
+ break;
+ }
+ ima= ima->id.next;
+ }
+
+ if (ima == 0 || okee("Some images are painted on. These changes will be lost. Continue ?")) {
+ packAll();
+ G.fileflags |= G_AUTOPACK;
+ }
+}
+
+
+/* KEYED FUNCTIONS
+ --------------- */
+
+/* this function name is meaningless and only called that way for some
+ obscurity
+ It is called by a function table from the license_key;
+ see include/keyed_functions.h
+*/
+
+struct twostrings
+{
+ char *outname;
+ char *exename;
+};
+
+/** This function is called for writing runtimes.
+ * It's locked behind the key and called through a function table
+ * which is initialized properly by the Python key code (if valid)
+ */
+int make_beautiful_animation(void *vp)
+{
+ char *freestr= NULL;
+ struct twostrings *twostrings = (struct twostrings *) vp;
+ char *str = twostrings->outname;
+ 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");
+ strcpy(freestr, str);
+ strcat(freestr, ext);
+ str= freestr;
+ }
+
+ if (!BLI_exists(str) || saveover(str))
+ BLO_write_runtime(str, twostrings->exename);
+
+ if (freestr)
+ MEM_freeN(freestr);
+
+ return 0;
+}
+
+int make_nice_software(void)
+{
+ Fptr f = KEY_RETURN_TRUE;
+ if (f) return f(0);
+ else return 0;
+}
+
+static void write_runtime_check_dynamic(char *str)
+{
+ Fptr f = KEY_WRITE_RUNTIME;
+ struct twostrings twostrings;
+
+ twostrings.outname = str;
+ twostrings.exename = "blenderdynplayer.exe";
+
+ if (f) f((void *) &twostrings);
+}
+
+static void write_runtime_check(char *str)
+{
+ Fptr f = KEY_WRITE_RUNTIME;
+ struct twostrings twostrings;
+ char player[128];
+
+ twostrings.outname = str;
+ twostrings.exename = player;
+
+ strcpy(player, "blenderplayer");
+
+#ifdef _WIN32
+ strcat(player, ".exe");
+#endif
+
+#ifdef __APPLE__
+ strcat(player, ".app");
+#endif
+
+ if (f) f((void *) &twostrings);
+}
+/* end keyed functions */
+
+
+static void do_info_filemenu(void *arg, int event)
+{
+ ScrArea *sa;
+ char dir[FILE_MAXDIR];
+
+ 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())
+ error("No file ~/.B.blend");
+ }
+ break;
+ case 1:
+ activate_fileselect(FILE_BLENDER, "LOAD FILE", G.sce, BIF_read_file);
+ break;
+ case 2:
+ {
+ char *s= MEM_mallocN(strlen(G.sce) + 11 + 1, "okee_reload");
+ strcpy(s, "Open file: ");
+ strcat(s, G.sce);
+ if (okee(s))
+ BIF_read_file(G.sce);
+ MEM_freeN(s);
+ }
+ break;
+ case 3:
+ activate_fileselect(FILE_LOADLIB, "LOAD LIBRARY", G.lib, 0);
+ break;
+ case 4:
+ strcpy(dir, G.sce);
+ untitled(dir);
+ activate_fileselect(FILE_BLENDER, "SAVE FILE", dir, BIF_write_file);
+ break;
+ case 5:
+ strcpy(dir, G.sce);
+ if (untitled(dir)) {
+ activate_fileselect(FILE_BLENDER, "SAVE FILE", dir, BIF_write_file);
+ } else {
+ BIF_write_file(dir);
+ free_filesel_spec(dir);
+ }
+ break;
+ case 6:
+ mainqenter(F3KEY, 1);
+ break;
+ case 7:
+ write_vrml_fs();
+ break;
+ case 8:
+ write_dxf_fs();
+ break;
+ case 9:
+ write_videoscape_fs();
+ break;
+ case 20:
+ strcpy(dir, G.sce);
+ activate_fileselect(FILE_SPECIAL, "INSTALL LICENSE KEY", dir, loadKeyboard);
+ break;
+ case 21:
+ SHOW_LICENSE_KEY();
+ break;
+ case 22:
+ activate_fileselect(FILE_SPECIAL, "WRITE RUNTIME", "", write_runtime_check);
+ break;
+ case 23:
+ activate_fileselect(FILE_SPECIAL, "WRITE DYNAMIC RUNTIME", "", write_runtime_check_dynamic);
+ break;
+ case 30:
+ // import menu, no handling
+ break;
+
+#ifdef EXPERIMENTAL_MENUS
+ case 10:
+ check_packAll();
+ break;
+ case 11:
+ unpackAll(PF_WRITE_LOCAL);
+ G.fileflags &= ~G_AUTOPACK;
+ break;
+ case 12:
+ if (buttons_do_unpack() != RET_CANCEL) {
+ /* Clear autopack bit only if user selected one of the unpack options */
+ G.fileflags &= ~G_AUTOPACK;
+ }
+ break;
+ case 13:
+#else /* EXPERIMENTAL_MENUS */
+ case 10:
+#endif /* EXPERIMENTAL_MENUS */
+ exit_usiblender();
+ break;
+ }
+ allqueue(REDRAWINFO, 0);
+}
+
+void do_info_file_optionsmenu(void *arg, int event)
+{
+ G.fileflags ^= (1 << event);
+
+ // allqueue(REDRAWINFO, 0);
+}
+
+
+static uiBlock *info_file_optionsmenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco= 0, xco = 20;
+
+ block= uiNewBlock(&curarea->uiblocks, "runtime_options", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_info_file_optionsmenu, NULL);
+ uiBlockSetXOfs(block,-40); // offset to parent button
+
+ /* flags are case-values */
+ uiDefBut(block, BUTM, 1, "Compress File", xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_COMPRESS_BIT, "Use file compression");
+ uiDefBut(block, BUTM, 1, "Sign File", xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_SIGN_BIT, "Add signature to file");
+ uiDefBut(block, BUTM, 1, "Lock File", xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_LOCK_BIT, "Protect the file from editing by others");
+
+ /* Toggle buttons */
+
+ yco= 0;
+ xco -= 20;
+ uiBlockSetEmboss(block, UI_EMBOSSW);
+ uiBlockSetButmFunc(block, NULL, NULL);
+ /* flags are defines */
+ uiDefIconButI(block, ICONTOG|BIT|G_FILE_COMPRESS_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
+ uiDefIconButI(block, ICONTOG|BIT|G_FILE_SIGN_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
+ uiDefIconButI(block, ICONTOG|BIT|G_FILE_LOCK_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+
+ return block;
+}
+
+static uiBlock *info_runtime_optionsmenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco= 0, xco = 20;
+
+ block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetXOfs(block, -40); // offset to parent button
+
+ uiBlockSetEmboss(block, UI_EMBOSSW);
+
+ uiDefBut(block, LABEL, 0, "Size options:", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
+ uiDefButS(block, NUM, 0, "X:", xco+19, yco-=20, 95, 19, &G.scene->r.xplay, 10.0, 2000.0, 0, 0, "X screen/window resolution");
+ uiDefButS(block, NUM, 0, "Y:", xco+19, yco-=20, 95, 19, &G.scene->r.yplay, 10.0, 2000.0, 0, 0, "Y screen/window resolution");
+
+ uiDefBut(block, SEPR, 0, "", xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefBut(block, LABEL, 0, "Fullscreen options:", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
+ uiDefButS(block, TOG, 0, "Fullscreen", xco + 19, yco-=20, 95, 19, &G.scene->r.fullscreen, 0.0, 0.0, 0, 0, "Starts player in a new fullscreen display");
+ uiDefButS(block, NUM, 0, "Freq:", xco+19, yco-=20, 95, 19, &G.scene->r.freqplay, 10.0, 120.0, 0, 0, "Clock frequency of fullscreen display");
+ uiDefButS(block, NUM, 0, "Bits:", xco+19, yco-=20, 95, 19, &G.scene->r.depth, 1.0, 32.0, 0, 0, "Bit depth of full screen disply");
+
+ uiDefBut(block, SEPR, 0, "", xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");
+
+ /* stereo settings */
+ /* can't use any definition from the game engine here so hardcode it. Change it here when it changes there!
+ * RAS_IRasterizer has definitions:
+ * RAS_STEREO_NOSTEREO 1
+ * RAS_STEREO_QUADBUFFERED 2
+ * RAS_STEREO_ABOVEBELOW 3
+ * RAS_STEREO_INTERLACED 4 future
+ */
+ uiDefBut(block, LABEL, 0, "Stereo options", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
+ uiDefButS(block, ROW, 0, "no stereo", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 1.0, 0, 0, "Disables stereo");
+ uiDefButS(block, ROW, 0, "h/w pageflip", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 2.0, 0, 0, "Enables h/w pageflip stereo method");
+ uiDefButS(block, ROW, 0, "syncdoubling", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 3.0, 0, 0, "Enables syncdoubling stereo method");
+#if 0
+ // future
+ uiDefButS(block, ROW, 0, "syncdoubling", xco+19, yco, 95, 19, &(G.scene->r.stereomode), 5.0, 4.0, 0, 0, "Enables interlaced stereo method");
+#endif
+
+ uiBlockSetDirection(block, UI_RIGHT);
+
+ return block;
+}
+
+static uiBlock *info_file_importmenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco= 0, xco = 20;
+
+ block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetXOfs(block, -40); // offset to parent button
+
+ uiBlockSetEmboss(block, UI_EMBOSSW);
+
+ /* flags are defines */
+ uiDefBut(block, LABEL, 0, "VRML 2.0 options", xco, yco, 125, 19, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefButS(block, TOG|BIT|0, 0, "SepLayers", xco, yco-=20, 75, 19, &U.vrmlflag, 0.0, 0.0, 0, 0, "Separate Empties, Lamps, etc. into Layers");
+ uiDefButS(block, TOG|BIT|1, 0, "Scale 1/100", xco, yco-=20, 75, 19, &U.vrmlflag, 0.0, 0.0, 0, 0, "Scale scene by 1/100 (3DS VRML)");
+ uiDefButS(block, TOG|BIT|2, 0, "Two Sided", xco, yco-=20, 75, 19, &U.vrmlflag, 0.0, 0.0, 0, 0, "Import two sided faces");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+
+ return block;
+}
+
+static uiBlock *info_filemenu(void *arg_unused)
+{
+ uiBlock *block;
+ short xco=0;
+
+ block= uiNewBlock(&curarea->uiblocks, "filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_info_filemenu, NULL);
+
+ uiDefBut(block, BUTM, 1, "New|Ctrl X", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Start a new project (and delete the current)");
+ uiDefBut(block, BUTM, 1, "Open|F1", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Open a new file");
+ uiDefBut(block, BUTM, 1, "Reopen Last|Ctrl O", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Revert to the last version saved to file");
+ uiDefBut(block, BUTM, 1, "Append|Shift F1", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Append contents of a file to the current project");
+ uiDefBlockBut(block, info_file_importmenu, NULL, "Import Settings|>>", 0, xco-=20, 160, 19, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Save As|F2", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Save to a new file");
+ uiDefBut(block, BUTM, 1, "Save|Ctrl W", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Save to the current file");
+
+ if (LICENSE_KEY_VALID && make_nice_software()) {
+ uiDefBlockBut(block, info_file_optionsmenu, NULL, "File options|>>", 0, xco-=20, 160, 19, "Click to open the File Options menu");
+
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefBut(block, BUTM, 1, "Save Runtime", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 22, "Create a runtime executable with the current project");
+#ifdef _WIN32
+ uiDefBut(block, BUTM, 1, "Save dynamic Runtime", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 23, "Create a dynamic runtime executable with the current project (requieres extenal python20.dll)");
+#endif
+ uiDefBlockBut(block, info_runtime_optionsmenu, NULL, "Runtime options|>>", 0, xco-=20, 160, 19, "Click to open the File Options menu");
+ }
+
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Save Image|F3", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "Save the image in the render buffer to a file");
+ uiDefBut(block, BUTM, 1, "Save VRML 1.0|Ctrl F2", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "Save the current scene to a file in VRML 1.0 format");
+ uiDefBut(block, BUTM, 1, "Save DXF|Shift F2", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "Save the current scene to a file in DXF format");
+ uiDefBut(block, BUTM, 1, "Save VideoScape|Alt W", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "Save the current scene to a file in VideoScape format");
+
+
+ if (LICENSE_KEY_VALID) {
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, 1, "Show License Key", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 1, 21, "Show the personal information stored in your Blender License Key");
+ uiDefIconBut(block, BUTM, 1, ICON_PUBLISHER, 141,xco, 19, 19, NULL, 0.0, 0.0, 1, 21, "Show the personal information stored in your Blender License Key");
+ } else if (I_AM_PUBLISHER) {
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, 1, "Install License Key", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 1, 20, "Install your Blender License Key");
+ uiDefIconBut(block, BUTM, 1, ICON_PUBLISHER, 141,xco, 19, 19, NULL, 0.0, 0.0, 1, 20, "Install your Blender License Key");
+ }
+
+
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, "");
+
+#ifdef EXPERIMENTAL_MENUS
+ uiDefBut(block, BUTM, 1, "Pack Data", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
+ uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "");
+ uiDefBut(block, BUTM, 1, "Advanced Unpack", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, 1, "Quit | Q", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "Quit Blender immediately");
+#else /* EXPERIMENTAL_MENUS */
+ uiDefBut(block, BUTM, 1, "Quit | Q", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "Quit Blender immediately");
+#endif /* EXPERIMENTAL_MENUS */
+ uiBlockSetDirection(block, UI_DOWN);
+
+
+ return block;
+}
+
+static void do_info_editmenu(void *arg, int event)
+{
+ int oldqual;
+
+ switch(event) {
+
+ case 0:
+ /* (De)Select All */
+ if(select_area(SPACE_VIEW3D)) mainqenter(AKEY, 1);
+ break;
+ /* Border Select */
+ case 1:
+ if(select_area(SPACE_VIEW3D)) mainqenter(BKEY, 1);
+ break;
+ case 2:
+ /* Circle Select */
+ /*if(select_area(SPACE_VIEW3D)) {
+ winqread3d(BKEY, 1, 0);
+ winqread3d(BKEY, 1, 0);
+ }*/
+ break;
+ case 3:
+ /* Duplicate */
+ if(select_area(SPACE_VIEW3D)) {
+ oldqual = G.qual;
+ G.qual = LR_SHIFTKEY;
+ winqread3d(DKEY, 1, 0);
+ G.qual = oldqual;
+ }
+ break;
+ case 4:
+ /* Delete */
+ if(select_area(SPACE_VIEW3D)) {
+ winqread3d(XKEY, 1, 0);
+ }
+ break;
+ case 5:
+ /* Edit Mode */
+ if(select_area(SPACE_VIEW3D)) {
+ blenderqread(TABKEY, 1);
+ }
+ break;
+ case 6:
+ /* Grabber */
+ if(select_area(SPACE_VIEW3D)) {
+ transform('g');
+ }
+ break;
+ case 7:
+ /* Rotate */
+ if(select_area(SPACE_VIEW3D)) {
+ transform('r');
+ }
+ break;
+ case 8:
+ /* Scale */
+ if(select_area(SPACE_VIEW3D)) {
+ transform('s');
+ }
+ break;
+ case 9:
+ /* Shear */
+ if (!G.obedit) {
+ enter_editmode();
+ /* ### put these into a deselectall_gen() */
+ if(G.obedit->type==OB_MESH) deselectall_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) deselectall_nurb();
+ else if(G.obedit->type==OB_MBALL) deselectall_mball();
+ else if(G.obedit->type==OB_LATTICE) deselectall_Latt();
+ /* ### */
+ }
+ if(select_area(SPACE_VIEW3D)) {
+ transform('S');
+ }
+ break;
+ case 10:
+ /* Warp/Bend */
+ if (!G.obedit) {
+ enter_editmode();
+ /* ### put these into a deselectall_gen() */
+ if(G.obedit->type==OB_MESH) deselectall_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) deselectall_nurb();
+ else if(G.obedit->type==OB_MBALL) deselectall_mball();
+ else if(G.obedit->type==OB_LATTICE) deselectall_Latt();
+ /* ### */
+ }
+ if(select_area(SPACE_VIEW3D)) {
+ oldqual = G.qual;
+ G.qual = LR_SHIFTKEY;
+ winqread3d(WKEY, 1, 0);
+ G.qual = oldqual;
+ }
+ break;
+ case 11:
+ /* Snap */
+ if(select_area(SPACE_VIEW3D)) {
+ oldqual = G.qual;
+ G.qual = LR_SHIFTKEY;
+ winqread3d(SKEY, 1, 0);
+ G.qual = oldqual;
+ }
+ break;
+ }
+ allqueue(REDRAWINFO, 0);
+}
+
+
+static uiBlock *info_editmenu(void *arg_unused)
+{
+/* static short tog=0; */
+ uiBlock *block;
+ short xco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "editmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_info_editmenu, NULL);
+
+ uiDefBut(block, BUTM, 1, "(De)Select All|A", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "Select all objects in the scene or empty the selection");
+ uiDefBut(block, BUTM, 1, "Border Select|B", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "Select objects in a rectangular area (press B again to activate circle select in edit mode)");
+
+ /* uiDefBut(block, BUTM, 1, "Circle Select", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "Select objects in a circular area"); */
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Duplicate|Shift D", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "Duplicate the selected object(s)");
+ uiDefBut(block, BUTM, 1, "Delete|X", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "Delete the selected object(s)");
+ uiDefBut(block, BUTM, 1, "Edit Mode|Tab", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "Toggle between object and edit mode");
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Grabber|G", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "Move the selected object(s)");
+ uiDefBut(block, BUTM, 1, "Rotate|R", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 7, "Rotate the selected object(s)");
+ uiDefBut(block, BUTM, 1, "Scale|S", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "Scale the selected object(s)");
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Shear|Ctrl S", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "Shear the selected object(s)");
+ uiDefBut(block, BUTM, 1, "Warp/Bend|Shift W", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 10, "Warp or bend the selected objects");
+ uiDefBut(block, BUTM, 1, "Snap Menu|Shift S", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 11, "Activate the snap menu");
+
+ uiBlockSetDirection(block, UI_DOWN);
+
+ return block;
+}
+
+static void do_info_add_meshmenu(void *arg, int event)
+{
+
+ switch(event) {
+#ifdef EXPERIMENTAL_MENUS
+ /* Maarten's proposal for a new Add Mesh menu */
+ case 0:
+ /* Line */
+ //add_primitiveMesh(4);
+ break;
+ case 1:
+ /* Circle */
+ if(select_area(SPACE_VIEW3D)) {
+ add_primitiveMesh(4);
+ }
+ break;
+ case 2:
+ /* Plane */
+ add_primitiveMesh(0);
+ break;
+ case 3:
+ /* Cube */
+ add_primitiveMesh(1);
+ break;
+ case 4:
+ /* UVsphere */
+ add_primitiveMesh(11);
+ break;
+ case 5:
+ /* IcoSphere */
+ add_primitiveMesh(12);
+ break;
+ case 6:
+ /* Cylinder */
+ add_primitiveMesh(5);
+ break;
+ case 7:
+ /* Tube */
+ add_primitiveMesh(6);
+ break;
+ case 8:
+ /* Cone */
+ add_primitiveMesh(7);
+ break;
+ case 9:
+ /* Grid */
+ add_primitiveMesh(10);
+ break;
+#else /* EXPERIMENTAL_MENUS*/
+ 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 6:
+ /* Tube */
+ add_primitiveMesh(6);
+ break;
+ case 7:
+ /* Cone */
+ add_primitiveMesh(7);
+ break;
+ case 8:
+ /* Grid */
+ add_primitiveMesh(10);
+ break;
+#endif /* EXPERIMENTAL_MENUS */
+ default:
+ break;
+ }
+ allqueue(REDRAWINFO, 0);
+}
+
+static uiBlock *info_add_meshmenu(void *arg_unused)
+{
+/* static short tog=0; */
+ uiBlock *block;
+ short xco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL);
+
+#ifdef EXPERIMENTAL_MENUS
+ /* Maarten's proposal for a new Add Mesh menu */
+ uiDefBut(block, BUTM, 1, "Line|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a Mesh Line");
+ uiDefBut(block, BUTM, 1, "Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a Mesh Circle");
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a Mesh Plane");
+ uiDefBut(block, BUTM, 1, "Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a Mesh Cube");
+ uiDefBut(block, BUTM, 1, "UVsphere", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a Mesh Sphere");
+ uiDefBut(block, BUTM, 1, "IcoSphere|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Add a Mesh Isocohedron Sphere");
+ uiDefBut(block, BUTM, 1, "Cylinder With Caps|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "Add a Mesh Cylinder with caps");
+ uiDefBut(block, BUTM, 1, "Cylinder Without Caps|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "Add a Mesh Cylinder without caps");
+ uiDefBut(block, BUTM, 1, "Cone|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "Add a Mesh Cone");
+ uiDefBut(block, BUTM, 1, "Grid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "Add a Mesh Grid");
+#else /* EXPERIMENTAL_MENUS */
+ uiDefBut(block, BUTM, 1, "Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a Mesh Plane");
+ uiDefBut(block, BUTM, 1, "Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a Mesh Cube");
+ uiDefBut(block, BUTM, 1, "Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a Mesh Circle");
+ uiDefBut(block, BUTM, 1, "UVsphere", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a Mesh Sphere");
+ uiDefBut(block, BUTM, 1, "IcoSphere|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a Mesh Isocohedron Sphere");
+ uiDefBut(block, BUTM, 1, "Cylinder|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Add a Mesh Cylinder");
+ uiDefBut(block, BUTM, 1, "Tube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "Add a Mesh Tube");
+ uiDefBut(block, BUTM, 1, "Cone|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "Add a Mesh Cone");
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Grid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "Add a Mesh Grid");
+#endif /* EXPERIMENTAL_MENUS */
+
+ uiBlockSetDirection(block, UI_RIGHT);
+
+ return block;
+}
+
+static 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 xco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL);
+
+ uiDefBut(block, BUTM, 1, "Bezier Curve|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a Bezier curve");
+ uiDefBut(block, BUTM, 1, "Bezier Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a Bezier circle");
+ uiDefBut(block, BUTM, 1, "NURBS Curve|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a NURB curve");
+ uiDefBut(block, BUTM, 1, "NURBS Circle", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a NURB circle");
+ uiDefBut(block, BUTM, 1, "Path|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a path");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+
+ return block;
+}
+
+
+static 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 xco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL);
+
+ uiDefBut(block, BUTM, 1, "NURBS Curve|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a curve");
+ uiDefBut(block, BUTM, 1, "NURBS Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a circle");
+ uiDefBut(block, BUTM, 1, "NURBS Surface|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a surface");
+ uiDefBut(block, BUTM, 1, "NURBS Tube", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a tube");
+ uiDefBut(block, BUTM, 1, "NURBS Sphere|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a sphere");
+ uiDefBut(block, BUTM, 1, "NURBS Donut|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Add a donut");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+
+ return block;
+}
+
+static void do_info_addmenu(void *arg, int event)
+{
+
+ switch(event) {
+ case 0:
+ /* Mesh */
+ break;
+ case 1:
+ /* Curve */
+ break;
+ case 2:
+ /* Surface */
+ break;
+ case 3:
+ /* Text (argument is discarded) */
+ add_primitiveFont(event);
+ break;
+ case 4:
+ /* Metaball (argument is discarded) */
+ add_primitiveMball(event);
+ break;
+ case 5:
+ /* Empty */
+ add_object_draw(OB_EMPTY);
+ break;
+ case 6:
+ /* Camera */
+ add_object_draw(OB_CAMERA);
+ break;
+ case 7:
+ /* Lamp */
+ add_object_draw(OB_LAMP);
+ break;
+ case 8:
+ /* Armature */
+ add_primitiveArmature(OB_ARMATURE);
+ break;
+ case 9:
+ /* Lattice */
+ add_object_draw(OB_LATTICE);
+ break;
+ default:
+ break;
+ }
+ allqueue(REDRAWINFO, 0);
+}
+
+
+static uiBlock *info_addmenu(void *arg_unused)
+{
+/* static short tog=0; */
+ uiBlock *block;
+ short xco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_info_addmenu, NULL);
+
+ uiDefBlockBut(block, info_add_meshmenu, NULL, "Mesh|>>", 0, xco-=20, 120, 19, "Click to open the Add Mesh menu");
+ uiDefBlockBut(block, info_add_curvemenu, NULL, "Curve|>>", 0, xco-=20, 120, 19, "Click to open the Add Curve menu");
+ uiDefBlockBut(block, info_add_surfacemenu, NULL, "Surface|>>", 0, xco-=20, 120, 19, "Click to open the Add Surface menu");
+
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Text|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefBut(block, BUTM, 1, "Metaball|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefBut(block, BUTM, 1, "Empty|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "");
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Camera|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "");
+ uiDefBut(block, BUTM, 1, "Lamp|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 7, "");
+// uiDefBut(block, BUTM, 1, "Armature|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "");
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Lattice|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");
+
+ uiBlockSetDirection(block, UI_DOWN);
+
+ return block;
+}
+
+static void do_info_viewmenu(void *arg, int event)
+{
+ switch(event) {
+ case 0:
+ if(select_area(SPACE_VIEW3D)) mainqenter(PAD1, 1);
+ break;
+ case 1:
+ if(select_area(SPACE_VIEW3D)) mainqenter(PAD3, 1);
+ break;
+ case 2:
+ if(select_area(SPACE_VIEW3D)) mainqenter(PAD7, 1);
+ break;
+ case 3:
+ if(select_area(SPACE_VIEW3D)) mainqenter(PAD0, 1);
+ break;
+ case 4:
+ if(select_area(SPACE_VIEW3D)) mainqenter(PADPLUSKEY, 1);
+ break;
+ case 5:
+ if(select_area(SPACE_VIEW3D)) mainqenter(PADMINUS, 1);
+ break;
+ case 6:
+ if(select_area(SPACE_VIEW3D)) mainqenter(CKEY, 1);
+ break;
+ case 7:
+ if(select_area(SPACE_VIEW3D)) mainqenter(HOMEKEY, 1);
+ break;
+ }
+ allqueue(REDRAWINFO, 0);
+}
+
+static uiBlock *info_viewmenu(void *arg_unused)
+{
+/* static short tog=0; */
+ uiBlock *block;
+ short xco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_info_viewmenu, NULL);
+
+ // uiBlockSetCol(block, BUTBLUE);
+
+ uiDefBut(block, BUTM, 1, "Front|NumPad 1", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Right|NumPad 3", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 1, "");
+ uiDefBut(block, BUTM, 1, "Top|NumPad 7", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 2, "");
+ uiDefBut(block, BUTM, 1, "Camera|NumPad 0", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 3, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Zoom In|NumPad +", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 4, "");
+ uiDefBut(block, BUTM, 1, "Zoom Out|NumPad -", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 5, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, xco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, BUTM, 1, "Center|C", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 6, "");
+ uiDefBut(block, BUTM, 1, "View All|Home", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 7, "");
+
+ uiBlockSetDirection(block, UI_DOWN);
+
+ return block;
+}
+
+static void do_game_menu(void *arg, int event)
+{
+ switch (event) {
+ case G_FILE_ENABLE_ALL_FRAMES_BIT:
+ case G_FILE_SHOW_FRAMERATE_BIT:
+ case G_FILE_SHOW_DEBUG_PROPS_BIT:
+ case G_FILE_AUTOPLAY_BIT:
+ G.fileflags ^= (1 << event);
+ break;
+ default:
+ ; /* ignore the rest */
+ }
+}
+
+
+static uiBlock *info_gamemenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTBLUE);
+ uiBlockSetDirection(block, UI_DOWN);
+
+ uiDefBut(block, BUTM, B_STARTGAME, "Start Game|P",
+ 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 0, 0,
+ "Start the game (press the Escape key to stop)");
+ uiDefBut(block, SEPR, 0, "",
+ -20, yco-=6, 180, 6, NULL, 0.0, 0.0, 1, 0, "");
+
+ /* flags are case-values */
+ uiBlockSetButmFunc(block, do_game_menu, NULL);
+ uiDefBut(block, BUTM, 1, "Enable All Frames",
+ 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES_BIT,
+ "Toggle between draw all frames on (no frames dropped) and off (full speed)");
+ uiDefBut(block, BUTM, 1, "Show framerate and profile",
+ 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE_BIT,
+ "Toggle between showing and not showing the framerate and profile");
+ uiDefBut(block, BUTM, 1, "Show debug properties",
+ 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS_BIT,
+ "Toggle between showing and not showing debug properties");
+ uiDefBut(block, SEPR, 0, "", -20, yco-=6, 180, 6, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, 1, "Autostart",
+ 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT,
+ "Toggle between automatic game start on and off");
+
+ /* Toggle buttons */
+ yco= -26;
+ uiBlockSetEmboss(block, UI_EMBOSSW);
+ /* flags are defines */
+
+ uiBlockSetButmFunc(block, NULL, NULL); // to prevent it from calling the menu function
+ uiDefIconButI(block, ICONTOG|BIT|G_FILE_ENABLE_ALL_FRAMES_BIT,
+ 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19,
+ &G.fileflags, 0.0, 0.0, 0, 0, "");
+ uiDefIconButI(block, ICONTOG|BIT|G_FILE_SHOW_FRAMERATE_BIT,
+ 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19,
+ &G.fileflags, 0.0, 0.0, 0, 0, "");
+ uiDefIconButI(block, ICONTOG|BIT|G_FILE_SHOW_DEBUG_PROPS_BIT,
+ 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19,
+ &G.fileflags, 0.0, 0.0, 0, 0, "");
+ yco-=6;
+ uiDefIconButI(block, ICONTOG|BIT|G_FILE_AUTOPLAY_BIT,
+ 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19,
+ &G.fileflags, 0.0, 0.0, 0, 0, "");
+
+ return block;
+}
+
+#ifndef EXPERIMENTAL_MENUS
+/* In the Maarten's new menu structure proposal, the tools menu moved to the file menu */
+static void do_info_toolsmenu(void *arg, int event)
+{
+
+ switch(event) {
+ case 0:
+ check_packAll();
+ break;
+ case 1:
+ unpackAll(PF_WRITE_LOCAL);
+ G.fileflags &= ~G_AUTOPACK;
+ break;
+ case 2:
+ if (buttons_do_unpack() != RET_CANCEL) {
+ // clear autopack bit only if
+ // user selected one of the unpack options
+ G.fileflags &= ~G_AUTOPACK;
+ }
+ break;
+ }
+ allqueue(REDRAWINFO, 0);
+}
+
+static uiBlock *info_toolsmenu(void *arg_unused)
+{
+/* static short tog=0; */
+ uiBlock *block;
+ short xco= 0;
+
+ block= uiNewBlock(&curarea->uiblocks, "toolsmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_info_toolsmenu, NULL);
+ // uiBlockSetCol(block, BUTBLUE);
+
+ uiDefBut(block, BUTM, 1, "Pack Data", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefBut(block, BUTM, 1, "Advanced Unpack", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiBlockSetDirection(block, UI_DOWN);
+
+ return block;
+}
+#endif /* EXPERIMENTAL_MENUS */
+
+
+static void info_text(int x, int y)
+{
+ Object *ob;
+ extern float hashvectf[];
+ extern int mem_in_use;
+ unsigned int swatch_color;
+ float fac1, fac2, fac3;
+ char infostr[300];
+ char *headerstr;
+ int hsize;
+
+
+ if(G.obedit) {
+ sprintf(infostr,"Ve:%d-%d Fa:%d-%d Mem:%.2fM ",
+ G.totvertsel, G.totvert, G.totfacesel, G.totface,
+ (mem_in_use>>10)/1024.0);
+ }
+ else {
+ sprintf(infostr,"Ve:%d Fa:%d Ob:%d-%d La:%d Mem:%.2fM ",
+ G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp, (mem_in_use>>10)/1024.0);
+ }
+ ob= OBACT;
+ if(ob) {
+ strcat(infostr, ob->id.name+2);
+ }
+
+ if (g_progress_bar) {
+ hsize = 4 + (120.0 * g_done);
+ fac1 = 0.5 * g_done; // do some rainbow colours on progress
+ fac2 = 1.0;
+ fac3 = 0.9;
+ } else {
+ hsize = 124;
+ /* promise! Never change these lines again! */
+ fac1= fabs(hashvectf[ 2*G.version+4]);
+ fac2= 0.5+0.1*hashvectf[ G.version+3];
+ fac3= 0.7;
+ }
+
+ if (g_progress_bar && g_progress_info) {
+ headerstr= g_progress_info;
+ } else {
+ headerstr= versionstr;
+ }
+
+ swatch_color= hsv_to_cpack(fac1, fac2, fac3);
+
+ cpack( swatch_color );
+ glRecti(x-24, y-4, x-24+hsize, y+13);
+
+ glColor3ub(0, 0, 0);
+
+ glRasterPos2i(x, y);
+ BMF_DrawString(G.fonts, headerstr);
+
+ glRasterPos2i(x+120, y);
+ BMF_DrawString(G.fonts, infostr);
+}
+
+void info_buttons(void)
+{
+ uiBlock *block;
+ short xco= 32;
+ char naam[20];
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSM, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTGREY);
+
+ uiDefBlockBut(block, info_filemenu, NULL, "File", xco, 3, 40, 15, "");
+ xco+= 40;
+ uiDefBlockBut(block, info_editmenu, NULL, "Edit", xco, 3, 40, 15, "");
+ xco+= 40;
+
+ uiDefBlockBut(block, info_addmenu, NULL, "Add", xco, 3, 40, 15, "");
+ xco+= 40;
+
+ uiDefBlockBut(block, info_viewmenu, NULL, "View", xco, 3, 40, 15, "");
+ xco+= 40;
+ uiDefBlockBut(block, info_gamemenu, NULL, "Game", xco, 3, 40, 15, "");
+ xco+= 40;
+
+#ifndef EXPERIMENTAL_MENUS
+ /* In the Maarten's new menu structure proposal, the tools menu moved to the file menu */
+ uiDefBlockBut(block, info_toolsmenu, NULL, "Tools", xco, 3, 40, 15, "");
+ xco+= 40;
+#endif /* EXPERIMENTAL_MENUS */
+
+ /* 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, "This is a Packed file. See File menu.");
+ xco += 24;
+ uiBlockSetEmboss(block, UI_EMBOSSX);
+ }
+
+ uiBlockSetEmboss(block, UI_EMBOSSX);
+
+ if (curarea->full == 0) {
+ curarea->butspacetype= SPACE_INFO;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type ");
+
+ /* STD SCREEN BUTTONS */
+ xco+= XIC;
+ xco= std_libbuttons(block, xco, 0, NULL, B_INFOSCR, (ID *)G.curscreen, 0, &G.curscreen->screennr, 1, 1, B_INFODELSCR, 0);
+
+ /* STD SCENE BUTTONS */
+ xco+= 5;
+ xco= std_libbuttons(block, xco, 0, NULL, B_INFOSCE, (ID *)G.scene, 0, &G.curscreen->scenenr, 1, 1, B_INFODELSCE, 0);
+ }
+ else xco= 430;
+
+ info_text(xco+24, 6);
+
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+1, 0,XIC,YIC, 0, 0, 0, 0, 0, "");
+ uiBlockSetEmboss(block, UI_EMBOSSX);
+
+ if (LICENSE_KEY_VALID) {
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ uiDefIconBut(block, LABEL, 0, ICON_PUBLISHER, xco+125, 0,XIC,YIC, 0, 0, 0, 0, 0, "");
+ uiBlockSetEmboss(block, UI_EMBOSSX);
+ }
+
+ /* altijd als laatste doen */
+ curarea->headbutlen= xco+2*XIC;
+
+ if(curarea->headbutlen + 4*XIC < curarea->winx) {
+ uiDefIconBut(block, BUT, B_FILEMENU, ICON_HELP, (short)(curarea->winx-XIC-2), 0,XIC,YIC, 0, 0, 0, 0, 0, "Toolbox menu, hotkey: SPACE");
+ }
+
+ uiDrawBlock(block);
+}
+
+/* ********************** END INFO ****************************** */
+/* ********************** SEQUENCE ****************************** */
+
+void do_seq_buttons(short event)
+{
+ Editing *ed;
+
+ ed= G.scene->ed;
+ if(ed==0) return;
+
+ switch(event) {
+ case B_SEQHOME:
+ G.v2d->cur= G.v2d->tot;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ break;
+ case B_SEQCLEAR:
+ free_imbuf_seq();
+ allqueue(REDRAWSEQ, 1);
+ break;
+ }
+
+}
+
+void seq_buttons()
+{
+ SpaceSeq *sseq;
+ short xco;
+ char naam[20];
+ uiBlock *block;
+
+ sseq= curarea->spacedata.first;
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTPURPLE);
+
+ curarea->butspacetype= SPACE_SEQ;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type ");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+ /* HOME */
+ uiDefIconBut(block, BUT, B_SEQHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+ xco+= XIC;
+
+ /* IMAGE */
+ uiDefIconButS(block, TOG, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &sseq->mainb, 0, 0, 0, 0, "Toggles image display");
+
+ /* ZOOM en BORDER */
+ xco+= XIC;
+ uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)");
+ uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)");
+
+ /* CLEAR MEM */
+ xco+= XIC;
+ uiDefBut(block, BUT, B_SEQCLEAR, "Clear", xco+=XIC,0,2*XIC,YIC, 0, 0, 0, 0, 0, "Forces a clear of all buffered images in memory");
+
+ uiDrawBlock(block);
+}
+
+/* ********************** END SEQ ****************************** */
+/* ********************** VIEW3D ****************************** */
+
+void do_view3d_buttons(short event)
+{
+ int bit;
+
+ /* pas op: als curarea->win niet bestaat, afvangen als direkt tekenroutines worden aangeroepen */
+
+ switch(event) {
+ case B_HOME:
+ view3d_home(0);
+ break;
+ case B_SCENELOCK:
+ if(G.vd->scenelock) {
+ G.vd->lay= G.scene->lay;
+ /* layact zoeken */
+ bit= 0;
+ while(bit<32) {
+ if(G.vd->lay & (1<<bit)) {
+ G.vd->layact= 1<<bit;
+ break;
+ }
+ bit++;
+ }
+ G.vd->camera= G.scene->camera;
+ scrarea_queue_winredraw(curarea);
+ scrarea_queue_headredraw(curarea);
+ }
+ break;
+ case B_LOCALVIEW:
+ if(G.vd->localview) initlocalview();
+ else endlocalview(curarea);
+ scrarea_queue_headredraw(curarea);
+ break;
+ case B_EDITMODE:
+ if (G.f & G_VERTEXPAINT) {
+ /* Switch off vertex paint */
+ G.f &= ~G_VERTEXPAINT;
+ }
+ if (G.f & G_WEIGHTPAINT){
+ /* Switch off weight paint */
+ G.f &= ~G_WEIGHTPAINT;
+ }
+#ifdef NAN_TPT
+ if (G.f & G_TEXTUREPAINT) {
+ /* Switch off texture paint */
+ G.f &= ~G_TEXTUREPAINT;
+ }
+#endif /* NAN_VPT */
+ if(G.obedit==0) enter_editmode();
+ else exit_editmode(1);
+ scrarea_queue_headredraw(curarea);
+ break;
+ case B_POSEMODE:
+ /* if (G.obedit){
+ error("Unable to perform function in EditMode");
+ G.vd->flag &= ~V3D_POSEMODE;
+ scrarea_queue_headredraw(curarea);
+ }
+ else{
+ */
+ if (G.obpose==NULL) enter_posemode();
+ else exit_posemode(1);
+
+ allqueue(REDRAWHEADERS, 0);
+
+ break;
+ case B_WPAINT:
+ if (G.f & G_VERTEXPAINT) {
+ /* Switch off vertex paint */
+ G.f &= ~G_VERTEXPAINT;
+ }
+#ifdef NAN_TPT
+ if ((!(G.f & G_WEIGHTPAINT)) && (G.f & G_TEXTUREPAINT)) {
+ /* Switch off texture paint */
+ G.f &= ~G_TEXTUREPAINT;
+ }
+#endif /* NAN_VPT */
+ if(G.obedit) {
+ error("Unable to perform function in EditMode");
+ G.vd->flag &= ~V3D_WEIGHTPAINT;
+ scrarea_queue_headredraw(curarea);
+ }
+ else if(G.obpose) {
+ error("Unable to perform function in PoseMode");
+ G.vd->flag &= ~V3D_WEIGHTPAINT;
+ scrarea_queue_headredraw(curarea);
+ }
+ else set_wpaint();
+ break;
+ case B_VPAINT:
+ if ((!(G.f & G_VERTEXPAINT)) && (G.f & G_WEIGHTPAINT)) {
+ G.f &= ~G_WEIGHTPAINT;
+ }
+#ifdef NAN_TPT
+ if ((!(G.f & G_VERTEXPAINT)) && (G.f & G_TEXTUREPAINT)) {
+ /* Switch off texture paint */
+ G.f &= ~G_TEXTUREPAINT;
+ }
+#endif /* NAN_VPT */
+ if(G.obedit) {
+ error("Unable to perform function in EditMode");
+ G.vd->flag &= ~V3D_VERTEXPAINT;
+ scrarea_queue_headredraw(curarea);
+ }
+ else if(G.obpose) {
+ error("Unable to perform function in PoseMode");
+ G.vd->flag &= ~V3D_VERTEXPAINT;
+ scrarea_queue_headredraw(curarea);
+ }
+ else set_vpaint();
+ break;
+
+#ifdef NAN_TPT
+ case B_TEXTUREPAINT:
+ if (G.f & G_TEXTUREPAINT) {
+ G.f &= ~G_TEXTUREPAINT;
+ }
+ else {
+ if (G.obedit) {
+ error("Unable to perform function in EditMode");
+ G.vd->flag &= ~V3D_TEXTUREPAINT;
+ }
+ else {
+ if (G.f & G_WEIGHTPAINT){
+ /* Switch off weight paint */
+ G.f &= ~G_WEIGHTPAINT;
+ }
+ if (G.f & G_VERTEXPAINT) {
+ /* Switch off vertex paint */
+ G.f &= ~G_VERTEXPAINT;
+ }
+ if (G.f & G_FACESELECT) {
+ /* Switch off face select */
+ G.f &= ~G_FACESELECT;
+ }
+ G.f |= G_TEXTUREPAINT;
+ scrarea_queue_headredraw(curarea);
+ }
+ }
+ break;
+#endif /* NAN_TPT */
+
+ case B_FACESEL:
+ if(G.obedit) {
+ error("Unable to perform function in EditMode");
+ G.vd->flag &= ~V3D_FACESELECT;
+ scrarea_queue_headredraw(curarea);
+ }
+ else if(G.obpose) {
+ error("Unable to perform function in PoseMode");
+ G.vd->flag &= ~V3D_FACESELECT;
+ scrarea_queue_headredraw(curarea);
+ }
+ else set_faceselect();
+ break;
+
+ case B_VIEWBUT:
+
+ if(G.vd->viewbut==1) persptoetsen(PAD7);
+ else if(G.vd->viewbut==2) persptoetsen(PAD1);
+ else if(G.vd->viewbut==3) persptoetsen(PAD3);
+ break;
+
+ case B_PERSP:
+
+ if(G.vd->persp==2) persptoetsen(PAD0);
+ else {
+ G.vd->persp= 1-G.vd->persp;
+ persptoetsen(PAD5);
+ }
+
+ break;
+ case B_PROPTOOL:
+ allqueue(REDRAWHEADERS, 0);
+ break;
+ case B_VIEWRENDER:
+ if (curarea->spacetype==SPACE_VIEW3D) {
+ BIF_do_ogl_render(curarea->spacedata.first, G.qual!=0 );
+ }
+ break;
+ case B_STARTGAME:
+ if (select_area(SPACE_VIEW3D)) {
+ start_game();
+ }
+ break;
+ case B_VIEWZOOM:
+ viewmovetemp= 0;
+ viewmove(2);
+ scrarea_queue_headredraw(curarea);
+ break;
+ case B_VIEWTRANS:
+ viewmovetemp= 0;
+ viewmove(1);
+ scrarea_queue_headredraw(curarea);
+ break;
+
+ default:
+
+ if(event>=B_LAY && event<B_LAY+31) {
+ if(G.vd->lay!=0 && (G.qual & LR_SHIFTKEY)) {
+
+ /* wel actieve layer zoeken */
+
+ bit= event-B_LAY;
+ if( G.vd->lay & (1<<bit)) G.vd->layact= 1<<bit;
+ else {
+ if( (G.vd->lay & G.vd->layact) == 0) {
+ bit= 0;
+ while(bit<32) {
+ if(G.vd->lay & (1<<bit)) {
+ G.vd->layact= 1<<bit;
+ break;
+ }
+ bit++;
+ }
+ }
+ }
+ }
+ else {
+ bit= event-B_LAY;
+ G.vd->lay= 1<<bit;
+ G.vd->layact= G.vd->lay;
+ scrarea_queue_headredraw(curarea);
+ }
+ scrarea_queue_winredraw(curarea);
+ countall();
+
+ if(G.vd->scenelock) handle_view3d_lock();
+ allqueue(REDRAWOOPS, 0);
+ }
+ break;
+ }
+}
+
+void do_layer_buttons(short event)
+{
+ static int oldlay= 1;
+
+ if(G.vd==0) return;
+ if(G.vd->localview) return;
+
+ if(event==-1 && (G.qual & LR_CTRLKEY)) {
+ G.vd->scenelock= !G.vd->scenelock;
+ do_view3d_buttons(B_SCENELOCK);
+ } else if (event==-1) {
+ if(G.vd->lay== (2<<20)-1) {
+ if(G.qual & LR_SHIFTKEY) G.vd->lay= oldlay;
+ }
+ else {
+ oldlay= G.vd->lay;
+ G.vd->lay= (2<<20)-1;
+ }
+
+ if(G.vd->scenelock) handle_view3d_lock();
+ scrarea_queue_winredraw(curarea);
+ }
+ else {
+ if(G.qual & LR_ALTKEY) {
+ if(event<11) event+= 10;
+ }
+ if(G.qual & LR_SHIFTKEY) {
+ if(G.vd->lay & (1<<event)) G.vd->lay -= (1<<event);
+ else G.vd->lay += (1<<event);
+ }
+ do_view3d_buttons(event+B_LAY);
+ }
+ /* redraw lijkt dubbelop: wordt in queue netjes afgehandeld */
+ scrarea_queue_headredraw(curarea);
+
+ if(curarea->spacetype==SPACE_OOPS) allqueue(REDRAWVIEW3D, 1); /* 1==ook headwin */
+
+}
+
+void do_nla_buttons(unsigned short event)
+{
+ View2D *v2d;
+
+ switch(event){
+ case B_NLAHOME:
+ // Find X extents
+ v2d= &(G.snla->v2d);
+
+ v2d->cur.xmin = G.scene->r.sfra;
+ v2d->cur.ymin=-SCROLLB;
+
+// if (!G.saction->action){
+ v2d->cur.xmax=G.scene->r.efra;
+// }
+// else
+// {
+// v2d->cur.xmax=calc_action_length(G.saction->action)+1;
+// }
+
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ addqueue (curarea->win, REDRAW, 1);
+ break;
+ }
+}
+
+void nla_buttons(void)
+{
+ SpaceNla *snla;
+ short xco;
+ char naam[20];
+ uiBlock *block;
+
+ snla= curarea->spacedata.first;
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTCHOKE);
+
+ curarea->butspacetype= SPACE_NLA;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type ");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+ /* HOME */
+ uiDefIconBut(block, BUT, B_NLAHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+ xco+= XIC;
+
+ /* IMAGE */
+// uiDefIconButS(block, TOG, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &sseq->mainb, 0, 0, 0, 0, "Toggles image display");
+
+ /* ZOOM en BORDER */
+// xco+= XIC;
+// uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)");
+// uiDefIconBut(block, BUT, B_NLABORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)");
+
+ /* draw LOCK */
+ xco+= XIC/2;
+ uiDefIconButI(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.snla->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing");
+
+ uiDrawBlock(block);}
+
+void action_buttons(void)
+{
+ uiBlock *block;
+ short xco;
+ char naam[256];
+ Object *ob;
+ ID *from;
+
+ if (!G.saction)
+ return;
+
+ // copy from drawactionspace....
+ if (!G.saction->pin) {
+ if (OBACT)
+ G.saction->action = OBACT->action;
+ else
+ G.saction->action=NULL;
+ }
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTPINK);
+
+ curarea->butspacetype= SPACE_ACTION;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+ uiDefIconBut(block, BUT, B_ACTHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+
+
+ /* NAME ETC */
+ ob=OBACT;
+ from = (ID*) ob;
+
+ xco= std_libbuttons(block, xco+1.5*XIC, B_ACTPIN, &G.saction->pin, B_ACTIONBROWSE, (ID*)G.saction->action, from, &(G.saction->actnr), B_ACTALONE, B_ACTLOCAL, B_ACTIONDELETE, 0);
+
+#ifdef __NLA_BAKE
+ /* Draw action baker */
+ uiDefBut(block, BUT, B_ACTBAKE, "Bake", xco+=XIC, 0, 64, YIC, 0, 0, 0, 0, 0, "Generate an action with the constraint effects converted into ipo keys");
+ xco+=64;
+#endif
+ uiClearButLock();
+
+ /* draw LOCK */
+ xco+= XIC/2;
+ uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.saction->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing");
+
+
+ /* always as last */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+void view3d_buttons(void)
+{
+ uiBlock *block;
+ int a;
+ short xco;
+ char naam[20];
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTBLUE);
+
+ curarea->butspacetype= SPACE_VIEW3D;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type ");
+
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+ /* HOME */
+ uiDefIconBut(block, BUT, B_HOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+
+ xco+= XIC+8;
+ if(G.vd->localview==0) {
+ /* LAYERS */
+ for(a=0; a<10; a++) {
+ uiDefButI(block, TOG|BIT|(a+10), B_LAY+10+a, "",(short)(xco+a*(XIC/2)), 0, XIC/2, (YIC)/2, &(G.vd->lay), 0, 0, 0, 0, "Layers");
+ uiDefButI(block, TOG|BIT|a, B_LAY+a, "", (short)(xco+a*(XIC/2)), (short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(G.vd->lay), 0, 0, 0, 0, "Layers");
+ if(a==4) xco+= 5;
+ }
+ xco+= (a-2)*(XIC/2)+5;
+
+ /* LOCK */
+ uiDefIconButS(block, ICONTOG, B_SCENELOCK, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.vd->scenelock), 0, 0, 0, 0, "Lock layers and used Camera to Scene");
+ xco+= XIC;
+
+ }
+ else xco+= (10+2)*(XIC/2)+10;
+
+ /* LOCALVIEW */
+ uiDefIconButS(block, ICONROW, B_LOCALVIEW, ICON_LOCALVIEW, xco+=XIC,0,XIC,YIC, &(G.vd->localview), 0.0, 2.0, 0, 0, "Local View (NumPad /)");
+
+ /* PERSP */
+ xco+= XIC/2;
+ uiDefIconButS(block, ICONROW, B_PERSP, ICON_ORTHO, xco+=XIC,0,XIC,YIC, &(G.vd->persp), 0.0, 2.0, 0, 0, "Perspective mode (NumPad 5, Numpad 0)");
+
+ xco+= XIC/2;
+ /* AANZICHT */
+
+ if(G.vd->view==7) G.vd->viewbut= 1;
+ else if(G.vd->view==1) G.vd->viewbut= 2;
+ else if(G.vd->view==3) G.vd->viewbut= 3;
+ else G.vd->viewbut= 0;
+
+ uiDefIconButS(block, ICONROW, B_VIEWBUT, ICON_VIEW_AXIS_NONE, xco+=XIC,0,XIC,YIC, &G.vd->viewbut, 0.0, 3.0, 0, 0, "Top/Front or Side views (Numpad 7, 1, 3)");
+
+ /* DRAWTYPE */
+ xco+= XIC/2;
+ uiDefIconButS(block, ICONROW, B_REDR, ICON_BBOX, xco+=XIC,0,XIC,YIC, &(G.vd->drawtype), 1.0, 5.0, 0, 0, "Drawtype: boundbox/wire/solid/shaded (ZKEY, SHIFT+Z)");
+
+ /* VIEWMOVE */
+ xco+= XIC/2;
+ uiDefIconButI(block, TOG, B_VIEWTRANS, ICON_VIEWMOVE, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Translate view (SHIFT+MiddleMouse)");
+ uiDefIconButI(block, TOG, B_VIEWZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)");
+
+ /* around */
+ xco+= XIC/2;
+ uiDefIconButS(block, ROW, 1, ICON_ROTATE, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 0.0, 0, 0, "Rotation/Scaling around boundbox center (COMMAKEY)");
+ uiDefIconButS(block, ROW, 1, ICON_ROTATECENTER, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 3.0, 0, 0, "Rotation/Scaling around median point");
+ uiDefIconButS(block, ROW, 1, ICON_CURSOR, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 1.0, 0, 0, "Rotation/Scaling around cursor (DOTKEY)");
+ uiDefIconButS(block, ROW, 1, ICON_ROTATECOLLECTION, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 2.0, 0, 0, "Rotation/Scaling around individual centers");
+
+ /* mode */
+ G.vd->flag &= ~V3D_MODE;
+ if(G.obedit) G.vd->flag |= V3D_EDITMODE;
+ if(G.f & G_VERTEXPAINT) G.vd->flag |= V3D_VERTEXPAINT;
+ if(G.f & G_WEIGHTPAINT) G.vd->flag |= V3D_WEIGHTPAINT;
+#ifdef NAN_TPT
+ if (G.f & G_TEXTUREPAINT) G.vd->flag |= V3D_TEXTUREPAINT;
+#endif /* NAN_TPT */
+ if(G.f & G_FACESELECT) G.vd->flag |= V3D_FACESELECT;
+ if(G.obpose){
+ G.vd->flag |= V3D_POSEMODE;
+ }
+
+ xco+= XIC/2;
+ /* If there is a posable object hilighted & selected, display this button */
+ if (OBACT){
+ if (OBACT->type==OB_ARMATURE){
+ uiDefIconButS(block, ICONTOG|BIT|7, B_POSEMODE, ICON_POSE_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "PoseMode (CTRL+TAB)");
+ }
+ }
+ uiDefIconButS(block, ICONTOG|BIT|4, B_EDITMODE, ICON_EDITMODE_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "EditMode (TAB)");
+ if (!G.obpose && !G.obedit)
+ {
+ xco+= XIC/2;
+ /* Only if mesh is selected */
+ if (OBACT && OBACT->type == OB_MESH){
+ uiDefIconButS(block, ICONTOG|BIT|5, B_VPAINT, ICON_VPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "VertexPaint Mode (VKEY)");
+ /* Only if deformable mesh is selected */
+ if ((((Mesh*)(OBACT->data))->dvert))
+ uiDefIconButS(block, ICONTOG|BIT|9, B_WPAINT, ICON_WPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "WeightPaint Mode");
+#ifdef NAN_TPT
+ uiDefIconButS(block, ICONTOG|BIT|8, B_TEXTUREPAINT, ICON_TPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "TexturePaint Mode");
+#endif /* NAN_TPT */
+ uiDefIconButS(block, ICONTOG|BIT|6, B_FACESEL, ICON_FACESEL_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "FaceSelect Mode (FKEY)");
+ }
+ }
+ if (G.obpose){
+ /* Copy paste - WAS in action window */
+ xco+= XIC/2;
+ // xco-= XIC/2; // Used in action window
+ if(curarea->headertype==HEADERTOP) {
+ uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the current pose to the buffer");
+ uiSetButLock(G.obpose->id.lib!=0, "Can't edit library data");
+ uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the pose from the buffer");
+ uiDefIconBut(block, BUT, B_ACTPASTEFLIP, ICON_PASTEFLIPUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the flipped pose from the buffer");
+ }
+ else {
+ uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the current pose to the buffer");
+ uiSetButLock(G.obpose->id.lib!=0, "Can't edit library data");
+ uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the pose from the buffer");
+ uiDefIconBut(block, BUT, B_ACTPASTEFLIP, ICON_PASTEFLIPDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the flipped pose from the buffer");
+ }
+// xco+=XIC/2; // Used in action window
+ }
+ if(G.vd->bgpic) {
+ xco+= XIC/2;
+ uiDefIconButS(block, TOG|BIT|1, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "Display Background picture");
+ }
+ if(G.obedit) {
+ extern int prop_mode;
+ xco+= XIC/2;
+ uiDefIconButI(block, ICONTOG|BIT|14, B_PROPTOOL, ICON_GRID, xco+=XIC,0,XIC,YIC, &G.f, 0, 0, 0, 0, "Proportional vertex editing (OKEY)");
+ if(G.f & G_PROPORTIONAL) {
+ uiDefIconButI(block, ROW, 0, ICON_SHARPCURVE, xco+=XIC,0,XIC,YIC, &prop_mode, 4.0, 0.0, 0, 0, "Sharp falloff (SHIFT+OKEY)");
+ uiDefIconButI(block, ROW, 0, ICON_SMOOTHCURVE, xco+=XIC,0,XIC,YIC, &prop_mode, 4.0, 1.0, 0, 0, "Smooth falloff (SHIFT+OKEY)");
+ }
+ }
+
+ xco+=XIC;
+ uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Render this view. (Hold SHIFT for Anim render)");
+ xco+=XIC;
+ uiDefIconBut(block, BUT, B_STARTGAME, ICON_GAME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Start game (PKEY)");
+
+
+ /* Always do this last */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+/* ********************** VIEW3D ****************************** */
+/* ********************** IPO ****************************** */
+
+void do_ipo_buttons(short event)
+{
+ EditIpo *ei;
+ View2D *v2d;
+ rcti rect;
+ float xmin, ymin, dx, dy;
+ int a, val, first;
+ short mval[2];
+
+ if(curarea->win==0) return;
+
+ switch(event) {
+ case B_IPOHOME:
+
+ /* boundbox */
+
+ v2d= &(G.sipo->v2d);
+ first= 1;
+
+ ei= G.sipo->editipo;
+ if(ei==0) return;
+ for(a=0; a<G.sipo->totipo; a++, ei++) {
+ if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
+
+ boundbox_ipocurve(ei->icu);
+
+ if(first) {
+ v2d->tot= ei->icu->totrct;
+ first= 0;
+ }
+ else BLI_union_rctf(&(v2d->tot), &(ei->icu->totrct));
+ }
+ }
+
+ /* speciale home */
+ if(G.qual & LR_SHIFTKEY) {
+ v2d->tot.xmin= SFRA;
+ v2d->tot.xmax= EFRA;
+ }
+
+ /* beetje uitzoomen */
+ dx= 0.10*(v2d->tot.xmax-v2d->tot.xmin);
+ dy= 0.10*(v2d->tot.ymax-v2d->tot.ymin);
+
+ if(dx<v2d->min[0]) dx= v2d->min[0];
+ if(dy<v2d->min[1]) dy= v2d->min[1];
+
+ v2d->cur.xmin= v2d->tot.xmin- dx;
+ v2d->cur.xmax= v2d->tot.xmax+ dx;
+ v2d->cur.ymin= v2d->tot.ymin- dy;
+ v2d->cur.ymax= v2d->tot.ymax+ dy;
+
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ break;
+ case B_IPOBORDER:
+ val= get_border(&rect, 2);
+ if(val) {
+ mval[0]= rect.xmin;
+ mval[1]= rect.ymin;
+ areamouseco_to_ipoco(G.v2d, mval, &xmin, &ymin);
+ mval[0]= rect.xmax;
+ mval[1]= rect.ymax;
+ areamouseco_to_ipoco(G.v2d, mval, &(G.v2d->cur.xmax), &(G.v2d->cur.ymax));
+ G.v2d->cur.xmin= xmin;
+ G.v2d->cur.ymin= ymin;
+
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ }
+ break;
+
+ case B_IPOPIN:
+ allqueue (REDRAWIPO, 0);
+ break;
+
+ case B_IPOCOPY:
+ copy_editipo();
+ break;
+ case B_IPOPASTE:
+ paste_editipo();
+ break;
+ case B_IPOCONT:
+ set_exprap_ipo(IPO_HORIZ);
+ break;
+ case B_IPOEXTRAP:
+ set_exprap_ipo(IPO_DIR);
+ break;
+ case B_IPOCYCLIC:
+ set_exprap_ipo(IPO_CYCL);
+ break;
+ case B_IPOCYCLICX:
+ set_exprap_ipo(IPO_CYCLX);
+ break;
+ case B_IPOMAIN:
+ make_editipo();
+ scrarea_queue_winredraw(curarea);
+ scrarea_queue_headredraw(curarea);
+
+ break;
+ case B_IPOSHOWKEY:
+ /* waarde omkeren vanwege winqread */
+ G.sipo->showkey= 1-G.sipo->showkey;
+ winqreadipo(KKEY, 1, 0);
+ break;
+ case B_VIEW2DZOOM:
+ viewmovetemp= 0;
+ view2dzoom();
+ scrarea_queue_headredraw(curarea);
+ break;
+
+ }
+}
+
+void ipo_buttons(void)
+{
+ Object *ob;
+ ID *id, *from;
+ uiBlock *block;
+ short xco;
+ char naam[20];
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTSALMON);
+
+ curarea->butspacetype= SPACE_IPO;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type ");
+
+ test_editipo(); /* test of huidige editipo klopt, make_editipo zet de v2d->cur */
+
+ /* FULL WINDOW en HOME */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+ uiDefIconBut(block, BUT, B_IPOHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+ uiDefIconButS(block, ICONTOG, B_IPOSHOWKEY, ICON_KEY_DEHLT, xco+=XIC,0,XIC,YIC, &G.sipo->showkey, 0, 0, 0, 0, "Toggles curve/key display (KKEY)");
+
+ /* mainmenu, only when data is there and no pin */
+ uiSetButLock(G.sipo->pin, "Can't change because of pinned data");
+
+ ob= OBACT;
+ xco+= XIC/2;
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_OBJECT, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_OB, 0, 0, "Display Object Ipos ");
+
+ if(ob && give_current_material(ob, ob->actcol)) {
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_MATERIAL, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_MA, 0, 0, "Display Material Ipos ");
+ if(G.sipo->blocktype==ID_MA) {
+ uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, 7.0, 0, 0, "Channel Number of the active Material texture");
+ xco-= 4;
+ }
+ }
+ if(G.scene->world) {
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_WORLD, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_WO, 0, 0, "Display World Ipos");
+ if(G.sipo->blocktype==ID_WO) {
+ uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, 7.0, 0, 0, "Channel Number of the active World texture");
+ xco-= 4;
+ }
+ }
+
+ if(ob && ob->type==OB_CURVE)
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_ANIM, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_CU, 0, 0, "Display Curve Ipos");
+
+ if(ob && ob->type==OB_CAMERA)
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_CAMERA, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_CA, 0, 0, "Display Camera Ipos");
+
+ if(ob && ob->type==OB_LAMP) {
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_LAMP, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_LA, 0, 0, "Display Lamp Ipos");
+ if(G.sipo->blocktype==ID_LA) {
+ uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, 7.0, 0, 0, "Channel Number of the active Lamp texture");
+ xco-= 4;
+ }
+ }
+
+ if(ob) {
+ if ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_LATTICE)
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_EDIT, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_KE, 0, 0, "Display VertexKeys Ipos");
+ if (ob->action)
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_ACTION, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_AC, 0, 0, "Display Action Ipos");
+#ifdef __CON_IPO
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_CONSTRAINT, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)IPO_CO, 0, 0, "Display Constraint Ipos");
+#endif
+ }
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_SEQUENCE, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_SEQ, 0, 0, "Display Sequence Ipos");
+
+ if(G.buts && G.buts->mainb == BUTS_SOUND && G.buts->lockpoin)
+ uiDefIconButS(block, ROW, B_IPOMAIN, ICON_SOUND, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_SO, 0, 0, "Display Sound Ipos");
+
+
+ uiClearButLock();
+
+ /* NAME ETC */
+ id= (ID *)get_ipo_to_edit(&from);
+
+ xco= std_libbuttons(block, (short)(xco+1.5*XIC), B_IPOPIN, &G.sipo->pin, B_IPOBROWSE, (ID*)G.sipo->ipo, from, &(G.sipo->menunr), B_IPOALONE, B_IPOLOCAL, B_IPODELETE, 0);
+
+ uiSetButLock(id && id->lib, "Can't edit library data");
+
+ /* COPY PASTE */
+ xco-= XIC/2;
+ if(curarea->headertype==HEADERTOP) {
+ uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer");
+ uiSetButLock(id && id->lib, "Can't edit library data");
+ uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer");
+ }
+ else {
+ uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer");
+ uiSetButLock(id && id->lib, "Can't edit library data");
+ uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer");
+ }
+ xco+=XIC/2;
+
+ /* EXTRAP */
+ uiDefIconBut(block, BUT, B_IPOCONT, ICON_CONSTANT, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to constant");
+ uiDefIconBut(block, BUT, B_IPOEXTRAP, ICON_LINEAR, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to extrapolation");
+ uiDefIconBut(block, BUT, B_IPOCYCLIC, ICON_CYCLICLINEAR, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to cyclic");
+ uiDefIconBut(block, BUT, B_IPOCYCLICX, ICON_CYCLIC, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to cyclic extrapolation");
+ xco+= XIC/2;
+
+ uiClearButLock();
+ /* ZOOM en BORDER */
+ uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)");
+ uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)");
+
+ /* draw LOCK */
+ uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.sipo->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing");
+
+ /* altijd als laatste doen */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+/* ********************** IPO ****************************** */
+/* ********************** BUTS ****************************** */
+
+Material matcopybuf;
+
+void clear_matcopybuf(void)
+{
+ memset(&matcopybuf, 0, sizeof(Material));
+}
+
+void free_matcopybuf(void)
+{
+ extern MTex mtexcopybuf; /* buttons.c */
+ int a;
+
+ for(a=0; a<8; a++) {
+ if(matcopybuf.mtex[a]) {
+ MEM_freeN(matcopybuf.mtex[a]);
+ matcopybuf.mtex[a]= 0;
+ }
+ }
+
+ default_mtex(&mtexcopybuf);
+}
+
+void do_buts_buttons(short event)
+{
+ static short matcopied=0;
+ MTex *mtex;
+ Material *ma;
+ ID id;
+ int a;
+
+ if(curarea->win==0) return;
+
+ switch(event) {
+ case B_BUTSHOME:
+ G.v2d->cur= G.v2d->tot;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ break;
+ case B_BUTSPREVIEW:
+ BIF_preview_changed(G.buts);
+ scrarea_queue_headredraw(curarea);
+ scrarea_queue_winredraw(curarea);
+ break;
+ case B_MATCOPY:
+ if(G.buts->lockpoin) {
+
+ if(matcopied) free_matcopybuf();
+
+ memcpy(&matcopybuf, G.buts->lockpoin, sizeof(Material));
+ for(a=0; a<8; a++) {
+ mtex= matcopybuf.mtex[a];
+ if(mtex) {
+ matcopybuf.mtex[a]= MEM_dupallocN(mtex);
+ }
+ }
+ matcopied= 1;
+ }
+ break;
+ case B_MATPASTE:
+ if(matcopied && G.buts->lockpoin) {
+ ma= G.buts->lockpoin;
+ /* vrijgeven huidige mat */
+ for(a=0; a<8; a++) {
+ mtex= ma->mtex[a];
+ if(mtex && mtex->tex) mtex->tex->id.us--;
+ if(mtex) MEM_freeN(mtex);
+ }
+
+ id= (ma->id);
+ memcpy(G.buts->lockpoin, &matcopybuf, sizeof(Material));
+ (ma->id)= id;
+
+ for(a=0; a<8; a++) {
+ mtex= ma->mtex[a];
+ if(mtex) {
+ ma->mtex[a]= MEM_dupallocN(mtex);
+ if(mtex->tex) id_us_plus((ID *)mtex->tex);
+ }
+ }
+ BIF_preview_changed(G.buts);
+ scrarea_queue_winredraw(curarea);
+ }
+ break;
+ case B_MESHTYPE:
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+ }
+}
+
+void buttons_active_id(ID **id, ID **idfrom)
+{
+ Object *ob= OBACT;
+ Material *ma;
+ ID * search;
+
+ *id= NULL;
+ *idfrom= (ID *)ob;
+
+ if(G.buts->mainb==BUTS_LAMP) {
+ if(ob && ob->type==OB_LAMP) {
+ *id= ob->data;
+ }
+ }
+ else if(G.buts->mainb==BUTS_MAT) {
+ if(ob && (ob->type<OB_LAMP) && ob->type) {
+ *id= (ID *)give_current_material(ob, ob->actcol);
+ *idfrom= material_from(ob, ob->actcol);
+ }
+ }
+ else if(G.buts->mainb==BUTS_TEX) {
+ MTex *mtex;
+
+ if(G.buts->mainbo != G.buts->mainb) {
+ if(G.buts->mainbo==BUTS_LAMP) G.buts->texfrom= 2;
+ else if(G.buts->mainbo==BUTS_WORLD) G.buts->texfrom= 1;
+ else if(G.buts->mainbo==BUTS_MAT) G.buts->texfrom= 0;
+ }
+
+ if(G.buts->texfrom==0) {
+ if(ob && ob->type<OB_LAMP && ob->type) {
+ ma= give_current_material(ob, ob->actcol);
+ *idfrom= (ID *)ma;
+ if(ma) {
+ mtex= ma->mtex[ ma->texact ];
+ if(mtex) *id= (ID *)mtex->tex;
+ }
+ }
+ }
+ else if(G.buts->texfrom==1) {
+ World *wrld= G.scene->world;
+ *idfrom= (ID *)wrld;
+ if(wrld) {
+ mtex= wrld->mtex[ wrld->texact];
+ if(mtex) *id= (ID *)mtex->tex;
+ }
+ }
+ else if(G.buts->texfrom==2) {
+ Lamp *la;
+ if(ob && ob->type==OB_LAMP) {
+ la= ob->data;
+ *idfrom= (ID *)la;
+ mtex= la->mtex[ la->texact];
+ if(mtex) *id= (ID *)mtex->tex;
+ }
+ }
+ }
+ else if ELEM3(G.buts->mainb, BUTS_ANIM, BUTS_GAME, BUTS_CONSTRAINT) {
+ if(ob) {
+ *idfrom= (ID *)G.scene;
+ *id= (ID *)ob;
+ }
+ }
+ else if(G.buts->mainb==BUTS_WORLD) {
+ *id= (ID *)G.scene->world;
+ *idfrom= (ID *)G.scene;
+ }
+ else if(G.buts->mainb==BUTS_RENDER) {
+ *id= (ID *)G.scene;
+
+ }
+ else if(G.buts->mainb==BUTS_EDIT) {
+ if(ob && ob->data) {
+ *id= ob->data;
+ }
+ }
+ else if (G.buts->mainb == BUTS_SOUND) {
+ // printf("lockp: %d\n", G.buts->lockpoin);
+
+ if (G.buts->lockpoin) {
+ search = G.main->sound.first;
+ while (search) {
+ if (search == G.buts->lockpoin) {
+ break;
+ }
+ search = search->next;
+ }
+ if (search == NULL) {
+ *id = G.main->sound.first;
+ } else {
+ *id = search;
+ }
+ } else {
+ *id = G.main->sound.first;
+ }
+ // printf("id: %d\n\n", *id);
+ }
+}
+
+static void validate_bonebutton(void *bonev, void *data2_unused){
+ Bone *bone= bonev;
+ bArmature *arm;
+
+ arm = get_armature(G.obpose);
+ unique_bone_name(bone, arm);
+}
+
+
+static int bonename_exists(Bone *orig, char *name, ListBase *list)
+{
+ Bone *curbone;
+
+ for (curbone=list->first; curbone; curbone=curbone->next){
+ /* Check this bone */
+ if (orig!=curbone){
+ if (!strcmp(curbone->name, name))
+ return 1;
+ }
+
+ /* Check Children */
+ if (bonename_exists(orig, name, &curbone->childbase))
+ return 1;
+ }
+
+ return 0;
+
+}
+
+static void unique_bone_name (Bone *bone, bArmature *arm)
+{
+ char tempname[64];
+ char oldname[64];
+ int number;
+ char *dot;
+
+ if (!arm)
+ return;
+
+ strcpy(oldname, bone->name);
+
+ /* See if we even need to do this */
+ if (!bonename_exists(bone, bone->name, &arm->bonebase))
+ return;
+
+ /* Strip off the suffix */
+ dot=strchr(bone->name, '.');
+ if (dot)
+ *dot=0;
+
+ for (number = 1; number <=999; number++){
+ sprintf (tempname, "%s.%03d", bone->name, number);
+
+ if (!bonename_exists(bone, tempname, &arm->bonebase)){
+ strcpy (bone->name, tempname);
+ return;
+ }
+ }
+}
+
+void buts_buttons(void)
+{
+ ID *id, *idfrom;
+ Object *ob;
+ uiBlock *block;
+ uiBut *but;
+ short xco;
+ int alone, local, browse;
+ char naam[20];
+ short type;
+ void *data=NULL;
+ char str[256];
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTGREY);
+
+ curarea->butspacetype= SPACE_BUTS;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type ");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+ /* HOME */
+ uiDefIconBut(block, BUT, B_BUTSHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+
+ /* keuzemenu */
+ xco+= 2*XIC;
+ uiDefIconButS(block, ROW, B_REDR, ICON_EYE, xco+=XIC, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_VIEW, 0, 0, "View buttons");
+ uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_LAMP, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_LAMP, 0, 0, "Lamp buttons (F4)");
+ uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_MATERIAL, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_MAT, 0, 0, "Material buttons (F5)");
+ uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_TEX, 0, 0, "Texture buttons (F6)");
+ uiDefIconButS(block, ROW, B_REDR, ICON_ANIM, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_ANIM, 0, 0, "Animation buttons (F7)");
+ uiDefIconButS(block, ROW, B_REDR, ICON_GAME, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_GAME, 0, 0, "Realtime buttons (F8)");
+ uiDefIconButS(block, ROW, B_REDR, ICON_EDIT, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_EDIT, 0, 0, "Edit buttons (F9)");
+ uiDefIconButS(block, ROW, B_REDR, ICON_CONSTRAINT,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_CONSTRAINT, 0, 0, "Constraint buttons");
+ uiDefIconButS(block, ROW, B_REDR, ICON_SPEAKER,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_SOUND, 0, 0, "Sound buttons");
+ uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_WORLD, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_WORLD, 0, 0, "World buttons");
+ uiDefIconButS(block, ROW, B_REDR, ICON_PAINT,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_FPAINT, 0, 0, "Paint buttons");
+ uiDefIconButS(block, ROW, B_REDR, ICON_RADIO,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_RADIO, 0, 0, "Radiosity buttons");
+ uiDefIconButS(block, ROW, B_REDR, ICON_SCRIPT,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_SCRIPT, 0, 0, "Script buttons");
+ uiDefIconButS(block, ROW, B_REDR, ICON_SCENE, xco+=30, 0, 50, YIC, &(G.buts->mainb), 1.0, (float)BUTS_RENDER, 0, 0, "Display buttons (F10)");
+ xco+= 80;
+
+ ob= OBACT;
+
+ buttons_active_id(&id, &idfrom);
+
+ G.buts->lockpoin= id;
+
+ if(G.buts->mainb==BUTS_LAMP) {
+ if(id) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_LAMPBROWSE, id, (ID *)ob, &(G.buts->menunr), B_LAMPALONE, B_LAMPLOCAL, 0, 0);
+ }
+ }
+ else if(G.buts->mainb==BUTS_MAT) {
+ if(ob && (ob->type<OB_LAMP) && ob->type) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_MATBROWSE, id, idfrom, &(G.buts->menunr), B_MATALONE, B_MATLOCAL, B_MATDELETE, B_AUTOMATNAME);
+ }
+
+ /* COPY PASTE */
+ if(curarea->headertype==HEADERTOP) {
+ uiDefIconBut(block, BUT, B_MATCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copy Material to the buffer");
+ uiSetButLock(id && id->lib, "Can't edit library data");
+ uiDefIconBut(block, BUT, B_MATPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Paste Material from the buffer");
+ }
+ else {
+ uiDefIconBut(block, BUT, B_MATCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copy Material to the buffer");
+ uiSetButLock(id && id->lib, "Can't edit library data");
+ uiDefIconBut(block, BUT, B_MATPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Paste Material from the buffer");
+ }
+ xco+=XIC;
+
+ }
+ else if(G.buts->mainb==BUTS_TEX) {
+ if(G.buts->texfrom==0) {
+ if(idfrom) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_TEXBROWSE, id, idfrom, &(G.buts->texnr), B_TEXALONE, B_TEXLOCAL, B_TEXDELETE, B_AUTOTEXNAME);
+ }
+ }
+ else if(G.buts->texfrom==1) {
+ if(idfrom) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_WTEXBROWSE, id, idfrom, &(G.buts->texnr), B_TEXALONE, B_TEXLOCAL, B_TEXDELETE, B_AUTOTEXNAME);
+ }
+ }
+ else if(G.buts->texfrom==2) {
+ if(idfrom) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_LTEXBROWSE, id, idfrom, &(G.buts->texnr), B_TEXALONE, B_TEXLOCAL, B_TEXDELETE, B_AUTOTEXNAME);
+ }
+ }
+ }
+ else if(G.buts->mainb==BUTS_ANIM) {
+ if(id) {
+ xco= std_libbuttons(block, xco, 0, NULL, 0, id, idfrom, &(G.buts->menunr), B_OBALONE, B_OBLOCAL, 0, 0);
+
+ if(G.scene->group) {
+ Group *group= G.scene->group;
+ but= uiDefBut(block, TEX, B_IDNAME, "GR:", xco, 0, 135, YIC, group->id.name+2, 0.0, 19.0, 0, 0, "Active Group name");
+ uiButSetFunc(but, test_idbutton_cb, group->id.name, NULL);
+ xco+= 135;
+ }
+ }
+ }
+ else if(G.buts->mainb==BUTS_GAME) {
+ if(id) {
+ xco= std_libbuttons(block, xco, 0, NULL, 0, id, idfrom, &(G.buts->menunr), B_OBALONE, B_OBLOCAL, 0, 0);
+ }
+ }
+ else if(G.buts->mainb==BUTS_WORLD) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_WORLDBROWSE, id, idfrom, &(G.buts->menunr), B_WORLDALONE, B_WORLDLOCAL, B_WORLDDELETE, 0);
+ }
+ else if (G.buts->mainb==BUTS_SOUND) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_SOUNDBROWSE2, id, idfrom, &(G.buts->texnr), 1, 0, 0, 0);
+ }
+
+ else if(G.buts->mainb==BUTS_RENDER) {
+ xco= std_libbuttons(block, xco, 0, NULL, B_INFOSCE, (ID *)G.scene, 0, &(G.curscreen->scenenr), 1, 1, B_INFODELSCE, 0);
+ }
+ else if(G.buts->mainb==BUTS_EDIT) {
+ if(id) {
+
+ alone= 0;
+ local= 0;
+ browse= B_EDITBROWSE;
+ xco+= 10;
+
+ if(ob->type==OB_MESH) {
+ browse= B_MESHBROWSE;
+ alone= B_MESHALONE;
+ local= B_MESHLOCAL;
+ uiSetButLock(G.obedit!=0, "Unable to perform function in EditMode");
+ }
+ else if(ob->type==OB_MBALL) {
+ alone= B_MBALLALONE;
+ local= B_MBALLLOCAL;
+ }
+ else if ELEM3(ob->type, OB_CURVE, OB_FONT, OB_SURF) {
+ alone= B_CURVEALONE;
+ local= B_CURVELOCAL;
+ }
+ else if(ob->type==OB_CAMERA) {
+ alone= B_CAMERAALONE;
+ local= B_CAMERALOCAL;
+ }
+ else if(ob->type==OB_LAMP) {
+ alone= B_LAMPALONE;
+ local= B_LAMPLOCAL;
+ }
+ else if (ob->type==OB_ARMATURE){
+ alone = B_ARMALONE;
+ local = B_ARMLOCAL;
+ }
+ else if(ob->type==OB_LATTICE) {
+ alone= B_LATTALONE;
+ local= B_LATTLOCAL;
+ }
+
+ xco= std_libbuttons(block, xco, 0, NULL, browse, id, idfrom, &(G.buts->menunr), alone, local, 0, 0);
+
+ xco+= XIC;
+ }
+ if(ob) {
+ but= uiDefBut(block, TEX, B_IDNAME, "OB:", xco, 0, 135, YIC, ob->id.name+2, 0.0, 19.0, 0, 0, "Active Object name");
+ uiButSetFunc(but, test_idbutton_cb, ob->id.name, NULL);
+ xco+= 135;
+ }
+ }
+ else if(G.buts->mainb==BUTS_CONSTRAINT){
+ if(id) {
+
+
+ xco= std_libbuttons(block, xco, 0, NULL, 0, id, idfrom, &(G.buts->menunr), B_OBALONE, B_OBLOCAL, 0, 0);
+
+ get_constraint_client(NULL, &type, &data);
+ if (data && type==TARGET_BONE){
+ sprintf(str, "BO:%s", ((Bone*)data)->name);
+#if 0
+ /* XXXXX, not idname... but check redrawing */
+ but= uiDefBut(block, TEX, 1, "BO:", xco, 0, 135, YIC, ((Bone*)data)->name, 0.0, 19.0, 0, 0, "Active Bone name");
+ uiButSetFunc(but, validate_bonebutton, data, NULL);
+#else
+ but= uiDefBut(block, LABEL, 1, str, xco, 0, 135, YIC, ((Bone*)data)->name, 0.0, 19.0, 0, 0, "Active Bone name");
+#endif
+ xco+= 135;
+ }
+ }
+ }
+ else if(G.buts->mainb==BUTS_SCRIPT) {
+ if(ob)
+ uiDefIconButS(block, ROW, B_REDR, ICON_OBJECT, xco,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_OB, 0, 0, "Display Object script links");
+
+ if(ob && give_current_material(ob, ob->actcol))
+ uiDefIconButS(block, ROW, B_REDR, ICON_MATERIAL, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_MA, 0, 0, "Display Material script links ");
+
+ if(G.scene->world)
+ uiDefIconButS(block, ROW, B_REDR, ICON_WORLD, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_WO, 0, 0, "Display World script links");
+
+ if(ob && ob->type==OB_CAMERA)
+ uiDefIconButS(block, ROW, B_REDR, ICON_CAMERA, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_CA, 0, 0, "Display Camera script links");
+
+ if(ob && ob->type==OB_LAMP)
+ uiDefIconButS(block, ROW, B_REDR, ICON_LAMP, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_LA, 0, 0, "Display Lamp script links");
+
+ xco+= 20;
+ }
+
+ uiDefButS(block, NUM, B_NEWFRAME, "", (short)(xco+20),0,60,YIC, &(G.scene->r.cfra), 1.0, 18000.0, 0, 0, "Current Frame");
+ xco+= 80;
+
+ G.buts->mainbo= G.buts->mainb;
+
+ /* altijd als laatste doen */
+ uiDrawBlock(block);
+ curarea->headbutlen= xco;
+}
+
+/* ********************** BUTS ****************************** */
+/* ******************** FILE ********************** */
+
+void do_file_buttons(short event)
+{
+ SpaceFile *sfile;
+
+ if(curarea->win==0) return;
+ sfile= curarea->spacedata.first;
+
+ switch(event) {
+ case B_SORTFILELIST:
+ sort_filelist(sfile);
+ scrarea_queue_winredraw(curarea);
+ break;
+ case B_RELOADDIR:
+ freefilelist(sfile);
+ scrarea_queue_winredraw(curarea);
+ break;
+ }
+
+}
+
+void file_buttons(void)
+{
+ SpaceFile *sfile;
+ uiBlock *block;
+ float df, totlen, sellen;
+ short xco;
+ int totfile, selfile;
+ char naam[256];
+
+ sfile= curarea->spacedata.first;
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTGREY);
+
+ curarea->butspacetype= SPACE_FILE;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+ /* SORT TYPE */
+ xco+=XIC;
+ uiDefIconButS(block, ROW, B_SORTFILELIST, ICON_SORTALPHA, xco+=XIC,0,XIC,YIC, &sfile->sort, 1.0, 0.0, 0, 0, "Sort files alphabetically");
+ uiDefIconButS(block, ROW, B_SORTFILELIST, ICON_SORTTIME, xco+=XIC,0,XIC,YIC, &sfile->sort, 1.0, 1.0, 0, 0, "Sort files by time");
+ uiDefIconButS(block, ROW, B_SORTFILELIST, ICON_SORTSIZE, xco+=XIC,0,XIC,YIC, &sfile->sort, 1.0, 2.0, 0, 0, "Sort files by size");
+
+ cpack(0x0);
+ glRasterPos2i(xco+=XIC+10, 5);
+ BMF_DrawString(uiBlockGetCurFont(block), sfile->title);
+
+ xco+= BMF_GetStringWidth(G.font, sfile->title);
+
+ uiDefIconButS(block, ICONTOG|BIT|0, B_SORTFILELIST, ICON_LONGDISPLAY,xco+=XIC,0,XIC,YIC, &sfile->flag, 0, 0, 0, 0, "Toggle long info");
+ uiDefIconButS(block, TOG|BIT|3, B_RELOADDIR, ICON_GHOST,xco+=XIC,0,XIC,YIC, &sfile->flag, 0, 0, 0, 0, "Hide dot files");
+
+ xco+=XIC+10;
+
+ if(sfile->type==FILE_LOADLIB) {
+ uiDefButS(block, TOGN|BIT|2, B_REDR, "Append", xco+=XIC,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Causes selected data to be copied into current file");
+ uiDefButS(block, TOG|BIT|2, B_REDR, "Link", xco+=100,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Causes selected data to be linked by current file");
+ }
+
+ if(sfile->type==FILE_UNIX) {
+ df= BLI_diskfree(sfile->dir)/(1048576.0);
+
+ filesel_statistics(sfile, &totfile, &selfile, &totlen, &sellen);
+
+ sprintf(naam, "Free: %.3f Mb Files: (%d) %d (%.3f) %.3f Mb",
+ df, selfile,totfile, sellen, totlen);
+
+ cpack(0x0);
+ glRasterPos2i(xco, 5);
+ BMF_DrawString(uiBlockGetCurFont(block), naam);
+ }
+ /* altijd als laatste doen */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+
+/* ********************** FILE ****************************** */
+/* ******************** OOPS ********************** */
+
+void do_oops_buttons(short event)
+{
+ float dx, dy;
+
+ if(curarea->win==0) return;
+
+ switch(event) {
+ case B_OOPSHOME:
+ boundbox_oops();
+ G.v2d->cur= G.v2d->tot;
+ dx= 0.15*(G.v2d->cur.xmax-G.v2d->cur.xmin);
+ dy= 0.15*(G.v2d->cur.ymax-G.v2d->cur.ymin);
+ G.v2d->cur.xmin-= dx;
+ G.v2d->cur.xmax+= dx;
+ G.v2d->cur.ymin-= dy;
+ G.v2d->cur.ymax+= dy;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ break;
+
+ case B_NEWOOPS:
+ scrarea_queue_winredraw(curarea);
+ scrarea_queue_headredraw(curarea);
+ G.soops->lockpoin= 0;
+ break;
+ }
+
+}
+
+void oops_buttons(void)
+{
+ SpaceOops *soops;
+ Oops *oops;
+ uiBlock *block;
+ short xco;
+ char naam[256];
+
+ soops= curarea->spacedata.first;
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTGREEN);
+
+ curarea->butspacetype= SPACE_OOPS;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+ /* HOME */
+ uiDefIconBut(block, BUT, B_OOPSHOME, ICON_HOME, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+ xco+= XIC;
+
+ /* ZOOM en BORDER */
+ xco+= XIC;
+ uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, (short)(xco+=XIC),0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)");
+ uiDefIconBut(block, BUT, B_OOPSBORDER, ICON_BORDERMOVE, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)");
+
+ /* VISIBLE */
+ xco+= XIC;
+ uiDefButS(block, TOG|BIT|10,B_NEWOOPS, "lay", (short)(xco+=XIC),0,XIC+10,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Objects based on layer");
+ uiDefIconButS(block, TOG|BIT|0, B_NEWOOPS, ICON_SCENE_HLT, (short)(xco+=XIC+10),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Scene data");
+ uiDefIconButS(block, TOG|BIT|1, B_NEWOOPS, ICON_OBJECT_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Object data");
+ uiDefIconButS(block, TOG|BIT|2, B_NEWOOPS, ICON_MESH_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Mesh data");
+ uiDefIconButS(block, TOG|BIT|3, B_NEWOOPS, ICON_CURVE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Curve/Surface/Font data");
+ uiDefIconButS(block, TOG|BIT|4, B_NEWOOPS, ICON_MBALL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Metaball data");
+ uiDefIconButS(block, TOG|BIT|5, B_NEWOOPS, ICON_LATTICE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Lattice data");
+ uiDefIconButS(block, TOG|BIT|6, B_NEWOOPS, ICON_LAMP_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Lamp data");
+ uiDefIconButS(block, TOG|BIT|7, B_NEWOOPS, ICON_MATERIAL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Material data");
+ uiDefIconButS(block, TOG|BIT|8, B_NEWOOPS, ICON_TEXTURE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Texture data");
+ uiDefIconButS(block, TOG|BIT|9, B_NEWOOPS, ICON_IPO_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Ipo data");
+ uiDefIconButS(block, TOG|BIT|12, B_NEWOOPS, ICON_IMAGE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Image data");
+ uiDefIconButS(block, TOG|BIT|11, B_NEWOOPS, ICON_LIBRARY_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Library data");
+
+ /* naam */
+ if(G.soops->lockpoin) {
+ oops= G.soops->lockpoin;
+ if(oops->type==ID_LI) strcpy(naam, ((Library *)oops->id)->name);
+ else strcpy(naam, oops->id->name);
+
+ cpack(0x0);
+ glRasterPos2i(xco+=XIC+10, 5);
+ BMF_DrawString(uiBlockGetCurFont(block), naam);
+
+ }
+
+ /* altijd als laatste doen */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+
+/* ********************** OOPS ****************************** */
+/* ********************** TEXT ****************************** */
+
+void do_text_buttons(unsigned short event)
+{
+ SpaceText *st= curarea->spacedata.first;
+ ID *id, *idtest;
+ int nr= 1;
+ Text *text;
+
+ if (!st) return;
+ if (st->spacetype != SPACE_TEXT) return;
+
+ switch (event) {
+ case B_TEXTBROWSE:
+ if (st->menunr==-2) {
+ activate_databrowse((ID *)st->text, ID_TXT, 0, B_TEXTBROWSE, &st->menunr, do_text_buttons);
+ break;
+ }
+ if(st->menunr < 0) break;
+
+ text= st->text;
+
+ nr= 1;
+ id= (ID *)text;
+
+ if (st->menunr==32767) {
+ st->text= (Text *)add_empty_text();
+
+ st->top= 0;
+
+ allqueue(REDRAWTEXT, 0);
+ allqueue(REDRAWHEADERS, 0);
+ }
+ else if (st->menunr==32766) {
+ activate_fileselect(FILE_SPECIAL, "LOAD TEXT FILE", G.sce, add_text_fs);
+ return;
+ }
+ else {
+ idtest= G.main->text.first;
+ while(idtest) {
+ if(nr==st->menunr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* new text */
+ activate_fileselect(FILE_SPECIAL, "LOAD TEXT FILE", G.sce, add_text_fs);
+ return;
+ }
+ if(idtest!=id) {
+ st->text= (Text *)idtest;
+ st->top= 0;
+
+ pop_space_text(st);
+
+ allqueue(REDRAWTEXT, 0);
+ allqueue(REDRAWHEADERS, 0);
+ }
+ }
+ break;
+
+ case B_TEXTDELETE:
+ if(!okee("Really delete text?")) return;
+
+ text= st->text;
+ if (!text) return;
+
+ BPY_clear_bad_scriptlinks(text);
+ free_text_controllers(text);
+
+ unlink_text(text);
+ free_libblock(&G.main->text, text);
+
+ break;
+
+/*
+ case B_TEXTSTORE:
+ st->text->flags ^= TXT_ISEXT;
+
+ allqueue(REDRAWHEADERS, 0);
+ break;
+*/
+ case B_TEXTFONT:
+ switch(st->font_id) {
+ case 0:
+ st->lheight= 12; break;
+ case 1:
+ st->lheight= 15; break;
+ }
+
+ allqueue(REDRAWTEXT, 0);
+ allqueue(REDRAWHEADERS, 0);
+
+ break;
+ }
+}
+
+void text_buttons(void)
+{
+ uiBlock *block;
+ SpaceText *st= curarea->spacedata.first;
+ short xco;
+ char naam[256];
+
+ if (!st || st->spacetype != SPACE_TEXT) return;
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTGREY);
+
+ curarea->butspacetype= SPACE_TEXT;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+
+ /* STD TEXT BUTTONS */
+ if (!BPY_spacetext_is_pywin(st)) {
+ xco+= 2*XIC;
+ xco= std_libbuttons(block, xco, 0, NULL, B_TEXTBROWSE, (ID*)st->text, 0, &(st->menunr), 0, 0, B_TEXTDELETE, 0);
+
+ /*
+ if (st->text) {
+ if (st->text->flags & TXT_ISDIRTY && (st->text->flags & TXT_ISEXT || !(st->text->flags & TXT_ISMEM)))
+ uiDefIconBut(block, BUT,0, ICON_ERROR, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "The text has been changed");
+ if (st->text->flags & TXT_ISEXT)
+ uiDefBut(block, BUT,B_TEXTSTORE, ICON(), xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Store text in .blend file");
+ else
+ uiDefBut(block, BUT,B_TEXTSTORE, ICON(), xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Don't store text in .blend file");
+ xco+=10;
+ }
+ */
+
+ xco+=XIC;
+ if(st->font_id>1) st->font_id= 0;
+ uiDefButI(block, MENU, B_TEXTFONT, "Screen 12 %x0|Screen 15%x1", xco,0,100,YIC, &st->font_id, 0, 0, 0, 0, "Font display menu");
+ xco+=100;
+ }
+
+ /* always as last */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+
+
+/* ******************** TEXT ********************** */
+/* ******************** SOUND ********************** */
+
+void load_space_sound(char *str) /* called from fileselect */
+{
+ bSound *sound;
+
+ sound= sound_new_sound(str);
+ if (sound) {
+ if (G.ssound) {
+ G.ssound->sound= sound;
+ }
+ } else {
+ error("Not a valid sample: %s", str);
+ }
+
+ allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWBUTSGAME, 0);
+}
+
+
+void load_sound_buttons(char *str) /* called from fileselect */
+{
+ bSound *sound;
+
+ sound= sound_new_sound(str);
+ if (sound) {
+ if (curarea && curarea->spacetype==SPACE_BUTS) {
+ if (G.buts->mainb == BUTS_SOUND) {
+ G.buts->lockpoin = sound;
+ }
+ }
+ } else {
+ error("Not a valid sample: %s", str);
+ }
+
+ allqueue(REDRAWBUTSSOUND, 0);
+}
+
+void do_action_buttons(unsigned short event)
+{
+ View2D *v2d;
+
+ switch(event){
+#ifdef __NLA_BAKE
+ case B_ACTBAKE:
+ bake_action_with_client (G.saction->action, OBACT, 0.01);
+ break;
+#endif
+ case B_ACTCONT:
+ set_exprap_action(IPO_HORIZ);
+ break;
+// case B_ACTEXTRAP:
+// set_exprap_ipo(IPO_DIR);
+// break;
+ case B_ACTCYCLIC:
+ set_exprap_action(IPO_CYCL);
+ break;
+// case B_ACTCYCLICX:
+// set_exprap_ipo(IPO_CYCLX);
+// break;
+ case B_ACTHOME:
+ // Find X extents
+ v2d= &(G.saction->v2d);
+
+// v2d->cur.xmin = 0;
+ v2d->cur.ymin=-SCROLLB;
+
+ if (!G.saction->action){
+ v2d->cur.xmax=100;
+ }
+ else
+ {
+ v2d->cur.xmin=calc_action_start(G.saction->action)-1;
+ v2d->cur.xmax=calc_action_end(G.saction->action)+1;
+ }
+
+
+// G.v2d->cur= G.v2d->tot;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ addqueue (curarea->win, REDRAW, 1);
+ break;
+ case B_ACTCOPY:
+ copy_posebuf();
+ allqueue(REDRAWVIEW3D, 1);
+ break;
+ case B_ACTPASTE:
+ paste_posebuf(0);
+ allqueue(REDRAWVIEW3D, 1);
+ break;
+ case B_ACTPASTEFLIP:
+ paste_posebuf(1);
+ allqueue(REDRAWVIEW3D, 1);
+ break;
+
+ case B_ACTPIN: /* __PINFAKE */
+/* if (G.saction->flag & SACTION_PIN){
+ if (G.saction->action)
+ G.saction->action->id.us ++;
+
+ }
+ else {
+ if (G.saction->action)
+ G.saction->action->id.us --;
+ }
+*/ /* end PINFAKE */
+ allqueue(REDRAWACTION, 1);
+ break;
+
+ }
+}
+
+void do_sound_buttons(unsigned short event)
+{
+ ID *id, *idtest;
+ int nr;
+ char name[256];
+
+ switch(event) {
+
+ case B_SOUNDBROWSE:
+ if(G.ssound->sndnr== -2) {
+ activate_databrowse((ID *)G.ssound->sound, ID_SO, 0, B_SOUNDBROWSE, &G.ssound->sndnr, do_sound_buttons);
+ return;
+ }
+ if (G.ssound->sndnr < 0) break;
+ if (G.ssound->sndnr == 32766) {
+ if (G.ssound && G.ssound->sound) strcpy(name, G.ssound->sound->name);
+ else strcpy(name, U.sounddir);
+ activate_fileselect(FILE_SPECIAL, "SELECT WAV FILE", name, load_space_sound);
+ } else {
+ nr= 1;
+ id= (ID *)G.ssound->sound;
+
+ idtest= G.main->sound.first;
+ while(idtest) {
+ if(nr==G.ssound->sndnr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+
+ if(idtest==0) { /* geen new */
+ return;
+ }
+
+ if(idtest!=id) {
+ G.ssound->sound= (bSound *)idtest;
+ if(idtest->us==0) idtest->us= 1;
+ allqueue(REDRAWSOUND, 0);
+ }
+ }
+
+ break;
+ case B_SOUNDBROWSE2:
+ id = (ID *)G.buts->lockpoin;
+ if(G.buts->texnr == -2) {
+ activate_databrowse(id, ID_SO, 0, B_SOUNDBROWSE2, &G.buts->texnr, do_sound_buttons);
+ return;
+ }
+ if (G.buts->texnr < 0) break;
+ if (G.buts->texnr == 32766) {
+ if (id) strcpy(name, ((bSound *)id)->name);
+ else strcpy(name, U.sounddir);
+ activate_fileselect(FILE_SPECIAL, "SELECT WAV FILE", name, load_sound_buttons);
+ } else {
+ nr= 1;
+
+ idtest= G.main->sound.first;
+ while (idtest) {
+ if(nr == G.buts->texnr) {
+ break;
+ }
+ nr++;
+ idtest = idtest->next;
+ }
+
+ if (idtest == 0) { /* geen new */
+ return;
+ }
+
+ if (idtest != id) {
+ G.buts->lockpoin = (bSound *)idtest;
+ if(idtest->us==0) idtest->us= 1;
+ allqueue(REDRAWBUTSSOUND, 0);
+ BIF_preview_changed(G.buts);
+ }
+ }
+
+ break;
+ case B_SOUNDHOME:
+
+ G.v2d->cur= G.v2d->tot;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ break;
+ }
+}
+
+void sound_buttons(void)
+{
+ uiBlock *block;
+ short xco;
+ char naam[256];
+ char ch[20];
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTYELLOW);
+
+ curarea->butspacetype= SPACE_SOUND;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+ uiDefIconBut(block, BUT, B_SOUNDHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+
+ xco= std_libbuttons(block, xco+40, 0, NULL, B_SOUNDBROWSE, (ID *)G.ssound->sound, 0, &(G.ssound->sndnr), 1, 0, 0, 0);
+
+ if(G.ssound->sound) {
+ bSound *sound= G.ssound->sound;
+
+ if (sound->sample && sound->sample->len)
+ {
+ if (sound->sample->channels == 1)
+ strcpy(ch, "Mono");
+ else if (sound->sample->channels == 2)
+ strcpy(ch, "Stereo");
+ else
+ strcpy(ch, "Unknown");
+
+ sprintf(naam, "Sample: %s, %d bit, %d Hz, %d samples", ch, sound->sample->bits, sound->sample->rate, sound->sample->len);
+ cpack(0x0);
+ glRasterPos2i(xco+10, 5);
+ BMF_DrawString(uiBlockGetCurFont(block), naam);
+ }
+ else
+ {
+ sprintf(naam, "No sample info available.");
+ cpack(0x0);
+ glRasterPos2i(xco+10, 5);
+ BMF_DrawString(uiBlockGetCurFont(block), naam);
+ }
+
+ }
+
+ /* always as last */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+
+/* ******************** SOUND ********************** */
+/* ******************** IMAGE ********************** */
+
+void load_space_image(char *str) /* aangeroepen vanuit fileselect */
+{
+ Image *ima=0;
+
+ if(G.obedit) {
+ error("Can't perfom this in editmode");
+ return;
+ }
+
+ ima= add_image(str);
+ if(ima) {
+
+ G.sima->image= ima;
+
+ free_image_buffers(ima); /* forceer opnieuw inlezen */
+ ima->ok= 1;
+ image_changed(G.sima, 0);
+
+ }
+
+ allqueue(REDRAWIMAGE, 0);
+}
+
+void image_replace(Image *old, Image *new)
+{
+ TFace *tface;
+ Mesh *me;
+ int a, rep=0;
+
+ new->tpageflag= old->tpageflag;
+ new->twsta= old->twsta;
+ new->twend= old->twend;
+ new->xrep= old->xrep;
+ new->yrep= old->yrep;
+
+ me= G.main->mesh.first;
+ while(me) {
+
+ if(me->tface) {
+ tface= me->tface;
+ a= me->totface;
+ while(a--) {
+ if(tface->tpage==old) {
+ tface->tpage= new;
+ rep++;
+ }
+ tface++;
+ }
+ }
+ me= me->id.next;
+
+ }
+ if(rep) {
+ if(new->id.us==0) new->id.us= 1;
+ }
+ else error("Nothing replaced");
+}
+
+void replace_space_image(char *str) /* aangeroepen vanuit fileselect */
+{
+ Image *ima=0;
+
+ if(G.obedit) {
+ error("Can't perfom this in editmode");
+ return;
+ }
+
+ ima= add_image(str);
+ if(ima) {
+
+ if(G.sima->image != ima) {
+ image_replace(G.sima->image, ima);
+ }
+
+ G.sima->image= ima;
+
+ free_image_buffers(ima); /* forceer opnieuw inlezen */
+ ima->ok= 1;
+ /* replace kent ook toe: */
+ image_changed(G.sima, 0);
+
+ }
+ allqueue(REDRAWIMAGE, 0);
+}
+
+void save_paint(char *name)
+{
+ char str[FILE_MAXDIR+FILE_MAXFILE];
+ Image *ima = G.sima->image;
+ ImBuf *ibuf;
+
+ if (ima && ima->ibuf) {
+ BLI_strncpy(str, name, sizeof(str));
+
+ BLI_convertstringcode(str, G.sce, G.scene->r.cfra);
+
+ if (saveover(str)) {
+ ibuf = IMB_dupImBuf(ima->ibuf);
+
+ if (ibuf) {
+ if (BIF_write_ibuf(ibuf, str)) {
+ BLI_strncpy(ima->name, name, sizeof(ima->name));
+ ima->ibuf->userflags &= ~IB_BITMAPDIRTY;
+ allqueue(REDRAWHEADERS, 0);
+ allqueue(REDRAWBUTSTEX, 0);
+ } else {
+ error("Couldn't write image: %s", str);
+ }
+
+ IMB_freeImBuf(ibuf);
+ }
+ }
+ }
+}
+
+
+void do_image_buttons(unsigned short event)
+{
+ Image *ima;
+ ID *id, *idtest;
+ int nr;
+ char name[256], str[256];
+
+ if(curarea->win==0) return;
+
+ switch(event) {
+ case B_SIMAGEHOME:
+ image_home();
+ break;
+
+ case B_SIMABROWSE:
+ if(G.sima->imanr== -2) {
+ activate_databrowse((ID *)G.sima->image, ID_IM, 0, B_SIMABROWSE, &G.sima->imanr, do_image_buttons);
+ return;
+ }
+ if(G.sima->imanr < 0) break;
+
+ nr= 1;
+ id= (ID *)G.sima->image;
+
+ idtest= G.main->image.first;
+ while(idtest) {
+ if(nr==G.sima->imanr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* geen new */
+ return;
+ }
+
+ if(idtest!=id) {
+ G.sima->image= (Image *)idtest;
+ if(idtest->us==0) idtest->us= 1;
+ allqueue(REDRAWIMAGE, 0);
+ }
+ image_changed(G.sima, 0); /* ook als image gelijk is: assign! 0==geen tileflag */
+
+ break;
+ case B_SIMAGELOAD:
+ case B_SIMAGELOAD1:
+
+ if(G.sima->image) strcpy(name, G.sima->image->name);
+ else strcpy(name, U.textudir);
+
+ if(event==B_SIMAGELOAD)
+ activate_imageselect(FILE_SPECIAL, "SELECT IMAGE", name, load_space_image);
+ else
+ activate_fileselect(FILE_SPECIAL, "SELECT IMAGE", name, load_space_image);
+ break;
+ case B_SIMAGEREPLACE:
+ case B_SIMAGEREPLACE1:
+
+ if(G.sima->image) strcpy(name, G.sima->image->name);
+ else strcpy(name, U.textudir);
+
+ if(event==B_SIMAGEREPLACE)
+ activate_imageselect(FILE_SPECIAL, "REPLACE IMAGE", name, replace_space_image);
+ else
+ activate_fileselect(FILE_SPECIAL, "REPLACE IMAGE", name, replace_space_image);
+ break;
+ case B_SIMAGEDRAW:
+
+ if(G.f & G_FACESELECT) {
+ make_repbind(G.sima->image);
+ image_changed(G.sima, 1);
+ }
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWIMAGE, 0);
+ break;
+
+ case B_SIMAGEDRAW1:
+ image_changed(G.sima, 2); /* 2: alleen tileflag */
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWIMAGE, 0);
+ break;
+
+ case B_TWINANIM:
+ ima = G.sima->image;
+ if (ima) {
+ if(ima->flag & IMA_TWINANIM) {
+ nr= ima->xrep*ima->yrep;
+ if(ima->twsta>=nr) ima->twsta= 1;
+ if(ima->twend>=nr) ima->twend= nr-1;
+ if(ima->twsta>ima->twend) ima->twsta= 1;
+ allqueue(REDRAWIMAGE, 0);
+ }
+ }
+ break;
+
+ case B_CLIP_UV:
+ tface_do_clip();
+ allqueue(REDRAWIMAGE, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+
+ case B_SIMAGEPAINTTOOL:
+ // check for packed file here
+ allqueue(REDRAWIMAGE, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+ case B_SIMAPACKIMA:
+ ima = G.sima->image;
+ if (ima) {
+ if (ima->packedfile) {
+ if (G.fileflags & G_AUTOPACK) {
+ if (okee("Disable AutoPack ?")) {
+ G.fileflags &= ~G_AUTOPACK;
+ }
+ }
+
+ if ((G.fileflags & G_AUTOPACK) == 0) {
+ unpackImage(ima, PF_ASK);
+ }
+ } else {
+ if (ima->ibuf && (ima->ibuf->userflags & IB_BITMAPDIRTY)) {
+ error("Can't pack painted image. Save image first.");
+ } else {
+ ima->packedfile = newPackedFile(ima->name);
+ }
+ }
+ allqueue(REDRAWBUTSTEX, 0);
+ allqueue(REDRAWHEADERS, 0);
+ }
+ break;
+ case B_SIMAGESAVE:
+ ima = G.sima->image;
+ if (ima) {
+ strcpy(name, ima->name);
+ if (ima->ibuf) {
+ save_image_filesel_str(str);
+ activate_fileselect(FILE_SPECIAL, str, name, save_paint);
+ }
+ }
+ break;
+ }
+}
+
+/* This should not be a stack var! */
+static int headerbuttons_packdummy;
+void image_buttons(void)
+{
+ uiBlock *block;
+ short xco;
+ char naam[256];
+ headerbuttons_packdummy = 0;
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTBLUE);
+
+ what_image(G.sima);
+
+ curarea->butspacetype= SPACE_IMAGE;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type ");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)");
+
+ /* HOME*/
+ uiDefIconBut(block, BUT, B_SIMAGEHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)");
+ uiDefIconButS(block, TOG|BIT|0, B_BE_SQUARE, ICON_KEEPRECT, xco+=XIC,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Keep UV polygons square while editing");
+ uiDefIconButS(block, ICONTOG|BIT|2, B_CLIP_UV, ICON_CLIPUV_DEHLT,xco+=XIC,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Clip UV with image size");
+
+ xco= std_libbuttons(block, xco+40, 0, NULL, B_SIMABROWSE, (ID *)G.sima->image, 0, &(G.sima->imanr), 0, 0, B_IMAGEDELETE, 0);
+
+ if (G.sima->image) {
+ if (G.sima->image->packedfile) {
+ headerbuttons_packdummy = 1;
+ }
+ uiDefIconButI(block, TOG|BIT|0, B_SIMAPACKIMA, ICON_PACKAGE, xco,0,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this Image");
+ xco += XIC;
+ }
+
+ uiBlockSetCol(block, BUTSALMON);
+ uiDefBut(block, BUT, B_SIMAGELOAD, "Load", xco+=XIC,0,2*XIC,YIC, 0, 0, 0, 0, 0, "Load image - thumbnail view");
+
+ uiBlockSetCol(block, BUTGREY);
+ uiDefBut(block, BUT, B_SIMAGELOAD1, "", (short)(xco+=2*XIC+2),0,10,YIC, 0, 0, 0, 0, 0, "Load image - file select view");
+ xco+=XIC/2;
+
+ if (G.sima->image) {
+ uiBlockSetCol(block, BUTSALMON);
+ uiDefBut(block, BUT, B_SIMAGEREPLACE, "Replace",xco+=XIC,0,(short)(3*XIC),YIC, 0, 0, 0, 0, 0, "Replace current image - thumbnail view");
+
+ uiBlockSetCol(block, BUTGREY);
+ uiDefBut(block, BUT, B_SIMAGEREPLACE1, "", (short)(xco+=3*XIC+2),0,10,YIC, 0, 0, 0, 0, 0, "Replace current image - file select view");
+ xco+=XIC/2;
+
+ uiDefIconButS(block, TOG|BIT|4, 0, ICON_ENVMAP, xco+=XIC,0,XIC,YIC, &G.sima->image->flag, 0, 0, 0, 0, "Use this image as a reflection map (UV coordinates are ignored)");
+ xco+=XIC/2;
+
+ uiDefIconButS(block, TOG|BIT|0, B_SIMAGEDRAW1, ICON_GRID, xco+=XIC,0,XIC,YIC, &G.sima->image->flag, 0, 0, 0, 0, "");
+ uiDefButS(block, NUM, B_SIMAGEDRAW, "", xco+=XIC,0,XIC,YIC, &G.sima->image->xrep, 1.0, 16.0, 0, 0, "");
+ uiDefButS(block, NUM, B_SIMAGEDRAW, "", xco+=XIC,0,XIC,YIC, &G.sima->image->yrep, 1.0, 16.0, 0, 0, "");
+
+ uiDefButS(block, TOG|BIT|1, B_TWINANIM, "Anim", xco+=XIC,0,(short)(2*XIC),YIC, &G.sima->image->tpageflag, 0, 0, 0, 0, "");
+ uiDefButS(block, NUM, B_TWINANIM, "", (short)(xco+=2*XIC),0,XIC,YIC, &G.sima->image->twsta, 0.0, 128.0, 0, 0, "");
+ uiDefButS(block, NUM, B_TWINANIM, "", xco+=XIC,0,XIC,YIC, &G.sima->image->twend, 0.0, 128.0, 0, 0, "");
+// uiDefButS(block, TOG|BIT|2, 0, "Cycle", xco+=XIC,0,2*XIC,YIC, &G.sima->image->tpageflag, 0, 0, 0, 0, "");
+ uiDefButS(block, NUM, 0, "Speed", xco+=(2*XIC),0,4*XIC,YIC, &G.sima->image->animspeed, 1.0, 100.0, 0, 0, "Speed of the animation in frames per second");
+
+#ifdef NAN_TPT
+ xco+= 4*XIC;
+ uiDefIconButS(block, ICONTOG|BIT|3, B_SIMAGEPAINTTOOL, ICON_TPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "TexturePaint Mode");
+ if (G.sima->image && G.sima->image->ibuf && (G.sima->image->ibuf->userflags & IB_BITMAPDIRTY)) {
+ uiDefBut(block, BUT, B_SIMAGESAVE, "Save", xco+=XIC,0,2*XIC,YIC, 0, 0, 0, 0, 0, "Save image");
+ xco += XIC;
+ }
+#endif /* NAN_TPT */
+ xco+= XIC;
+ }
+
+ /* draw LOCK */
+ xco+= XIC/2;
+ uiDefIconButS(block, ICONTOG, 0, ICON_UNLOCKED, (short)(xco+=XIC),0,XIC,YIC, &(G.sima->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing");
+
+
+ /* Always do this last */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+
+/* ********************** IMAGE ****************************** */
+/* ******************** IMASEL ********************** */
+
+void do_imasel_buttons(short event)
+{
+ SpaceImaSel *simasel;
+ char name[256];
+
+ simasel= curarea->spacedata.first;
+
+ if(curarea->win==0) return;
+
+ switch(event) {
+ case B_IMASELHOME:
+ break;
+
+ case B_IMASELREMOVEBIP:
+
+ if(bitset(simasel->fase, IMS_FOUND_BIP)){
+
+ strcpy(name, simasel->dir);
+ strcat(name, ".Bpib");
+
+ remove(name);
+
+ simasel->fase &= ~ IMS_FOUND_BIP;
+ }
+ break;
+ }
+}
+
+void imasel_buttons(void)
+{
+ SpaceImaSel *simasel;
+ uiBlock *block;
+ short xco;
+ char naam[256];
+
+ simasel= curarea->spacedata.first;
+
+ sprintf(naam, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin);
+ uiBlockSetCol(block, BUTBLUE);
+
+ curarea->butspacetype= SPACE_IMASEL;
+ uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type");
+
+ /* FULL WINDOW */
+ xco= 25;
+ if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "");
+ else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "");
+
+ xco+=XIC;
+ if (simasel->title){
+ xco+=25;
+ glRasterPos2i(xco, 4);
+ BMF_DrawString(G.font, simasel->title);
+ xco+=BMF_GetStringWidth(G.fonts, simasel->title);
+ xco+=25;
+ }
+ uiDefIconBut(block, BUT, B_IMASELREMOVEBIP, ICON_BPIBFOLDER_X, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "");/* remove */
+
+ uiDefIconButS(block, TOG|BIT|0, B_REDR, ICON_BPIBFOLDERGREY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* dir */
+ uiDefIconButS(block, TOG|BIT|1, B_REDR, ICON_INFO, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* info */
+ uiDefIconButS(block, TOG|BIT|2, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* image */
+ uiDefIconButS(block, TOG|BIT|3, B_REDR, ICON_MAGNIFY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* loep */
+
+ /* altijd als laatste doen */
+ curarea->headbutlen= xco+2*XIC;
+
+ uiDrawBlock(block);
+}
+
+/* ********************** IMASEL ****************************** */
+
+/* ******************** ALGEMEEN ********************** */
+
+void do_headerbuttons(short event)
+{
+
+ if(event<=50) do_global_buttons2(event);
+ else if(event<=100) do_global_buttons(event);
+ else if(event<200) do_view3d_buttons(event);
+ else if(event<250) do_ipo_buttons(event);
+ else if(event<300) do_oops_buttons(event);
+ else if(event<350) do_info_buttons(event);
+ else if(event<400) do_image_buttons(event);
+ else if(event<450) do_buts_buttons(event);
+ else if(event<500) do_imasel_buttons(event);
+ else if(event<550) do_text_buttons(event);
+ else if(event<600) do_file_buttons(event);
+ else if(event<650) do_seq_buttons(event);
+ else if(event<700) do_sound_buttons(event);
+ else if(event<800) do_action_buttons(event);
+ else if(event<900) do_nla_buttons(event);
+}
+