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/space.c')
-rw-r--r--source/blender/src/space.c2974
1 files changed, 2974 insertions, 0 deletions
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
new file mode 100644
index 00000000000..1ee6cf013ae
--- /dev/null
+++ b/source/blender/src/space.c
@@ -0,0 +1,2974 @@
+/**
+ * $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 *****
+ * - hier het initialiseren en vrijgeven van SPACE data
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_linklist.h"
+
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_image_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_object_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_userdef_types.h"
+#include "DNA_view2d_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BKE_blender.h"
+#include "BKE_curve.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_ipo.h"
+#include "BKE_main.h"
+#include "BKE_scene.h"
+#include "BKE_utildefines.h"
+
+#include "BIF_buttons.h"
+#include "BIF_drawimage.h"
+#include "BIF_drawseq.h"
+#include "BIF_drawtext.h"
+#include "BIF_editarmature.h"
+#include "BIF_editfont.h"
+#include "BIF_editika.h"
+#include "BIF_editkey.h"
+#include "BIF_editlattice.h"
+#include "BIF_editmesh.h"
+#include "BIF_editoops.h"
+#include "BIF_editseq.h"
+#include "BIF_editsima.h"
+#include "BIF_editsound.h"
+#include "BIF_editview.h"
+#include "BIF_gl.h"
+#include "BIF_imasel.h"
+#include "BIF_interface.h"
+#include "BIF_mywindow.h"
+#include "BIF_oops.h"
+#include "BIF_resources.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+#include "BIF_spacetypes.h"
+#include "BIF_toets.h"
+#include "BIF_toolbox.h"
+#include "BIF_usiblender.h"
+#include "BIF_previewrender.h"
+
+#include "BSE_edit.h"
+#include "BSE_view.h"
+#include "BSE_editipo.h"
+#include "BSE_drawipo.h"
+#include "BSE_drawview.h"
+#include "BSE_drawnla.h"
+#include "BSE_filesel.h"
+#include "BSE_headerbuttons.h"
+#include "BSE_editnla_types.h"
+
+#include "BDR_vpaint.h"
+#include "BDR_editmball.h"
+#include "BDR_editobject.h"
+#include "BDR_editcurve.h"
+#include "BDR_editface.h"
+#include "BDR_drawmesh.h"
+
+#include "BLO_readfile.h" /* for BLO_blendhandle_close */
+
+#include "interface.h"
+#include "mydevice.h"
+#include "blendef.h"
+#include "datatoc.h"
+
+#include "BPY_extern.h" // Blender Python library
+
+#include "TPT_DependKludge.h"
+#ifdef NAN_TPT
+#include "BSE_trans_types.h"
+#include "../img/IMG_Api.h"
+#endif /* NAN_TPT */
+
+#include "SYS_System.h" /* for the user def menu ... should move elsewhere. */
+
+extern void StartKetsjiShell(ScrArea *area, char* startscenename, struct Main* maggie, int always_use_expand_framing);
+
+/**
+ * When the mipmap setting changes, we want to redraw the view right
+ * away to reflect this setting.
+ */
+void space_mipmap_button_function(int event);
+
+
+unsigned short convert_for_nonumpad(unsigned short event);
+void free_soundspace(SpaceSound *ssound);
+
+/* ************* SPACE: VIEW3D ************* */
+
+/* extern void drawview3d(); BSE_drawview.h */
+
+
+void copy_view3d_lock(short val)
+{
+ bScreen *sc;
+ int bit;
+
+ /* van G.scene naar andere views kopieeren */
+ sc= G.main->screen.first;
+
+ while(sc) {
+ if(sc->scene==G.scene) {
+ ScrArea *sa= sc->areabase.first;
+ while(sa) {
+ SpaceLink *sl= sa->spacedata.first;
+ while(sl) {
+ if(sl->spacetype==SPACE_OOPS && val==REDRAW) {
+ if(sa->win) scrarea_queue_winredraw(sa);
+ }
+ else if(sl->spacetype==SPACE_VIEW3D) {
+ View3D *vd= (View3D*) sl;
+ if(vd->scenelock && vd->localview==0) {
+ vd->lay= G.scene->lay;
+ vd->camera= G.scene->camera;
+
+ if(vd->camera==0 && vd->persp>1) vd->persp= 1;
+
+ if( (vd->lay & vd->layact) == 0) {
+ bit= 0;
+ while(bit<32) {
+ if(vd->lay & (1<<bit)) {
+ vd->layact= 1<<bit;
+ break;
+ }
+ bit++;
+ }
+ }
+
+ if(val==REDRAW && vd==sa->spacedata.first) {
+ scrarea_queue_redraw(sa);
+ }
+ }
+ }
+ sl= sl->next;
+ }
+ sa= sa->next;
+ }
+ }
+ sc= sc->id.next;
+ }
+}
+
+void handle_view3d_lock()
+{
+ if (G.vd != NULL) {
+ if(G.vd->localview==0 && G.vd->scenelock && curarea->spacetype==SPACE_VIEW3D) {
+
+ /* naar scene kopieeren */
+ G.scene->lay= G.vd->lay;
+ G.scene->camera= G.vd->camera;
+
+ copy_view3d_lock(REDRAW);
+ }
+ }
+}
+
+void space_set_commmandline_options(void) {
+ SYS_SystemHandle syshandle;
+ int a;
+
+ if ( (syshandle = SYS_GetSystem()) ) {
+ /* User defined settings */
+ a= (U.gameflags & USERDEF_VERTEX_ARRAYS);
+ SYS_WriteCommandLineInt(syshandle, "vertexarrays", a);
+
+ a= (U.gameflags & USERDEF_DISABLE_SOUND);
+ SYS_WriteCommandLineInt(syshandle, "noaudio", a);
+
+ a= (U.gameflags & USERDEF_DISABLE_MIPMAP);
+ set_mipmap(!a);
+ SYS_WriteCommandLineInt(syshandle, "nomipmap", a);
+
+ /* File specific settings: */
+ /* Only test the first one. These two are switched
+ * simultaneously. */
+ a= (G.fileflags & G_FILE_SHOW_FRAMERATE);
+ SYS_WriteCommandLineInt(syshandle, "show_framerate", a);
+ SYS_WriteCommandLineInt(syshandle, "show_profile", a);
+
+ /* When in wireframe mode, always draw debug props. */
+ if (G.vd) {
+ a = ( (G.fileflags & G_FILE_SHOW_DEBUG_PROPS)
+ || (G.vd->drawtype == OB_WIRE)
+ || (G.vd->drawtype == OB_SOLID) );
+ SYS_WriteCommandLineInt(syshandle, "show_properties", a);
+ }
+
+ a= (G.fileflags & G_FILE_ENABLE_ALL_FRAMES);
+ SYS_WriteCommandLineInt(syshandle, "fixedtime", a);
+ }
+}
+
+ /**
+ * These two routines imported from the gameengine,
+ * I suspect a lot of the resetting stuff is cruft
+ * and can be removed, but it should be checked.
+ */
+static void SaveState(void)
+{
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+
+ init_realtime_GL();
+ init_gl_stuff();
+
+ if(G.scene->camera==0 || G.scene->camera->type!=OB_CAMERA)
+ error("no (correct) camera");
+
+ waitcursor(1);
+}
+
+static void RestoreState(void)
+{
+ curarea->win_swap = 0;
+ curarea->head_swap=0;
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSALL, 0);
+ reset_slowparents();
+ waitcursor(0);
+ G.qual= 0;
+ glPopAttrib();
+}
+
+static LinkNode *save_and_reset_all_scene_cfra(void)
+{
+ LinkNode *storelist= NULL;
+ Scene *sc;
+
+ for (sc= G.main->scene.first; sc; sc= sc->id.next) {
+ BLI_linklist_prepend(&storelist, (void*) sc->r.cfra);
+ sc->r.cfra= 1;
+
+ set_scene_bg(sc);
+ }
+
+ BLI_linklist_reverse(&storelist);
+
+ return storelist;
+}
+
+static void restore_all_scene_cfra(LinkNode *storelist) {
+ LinkNode *sc_store= storelist;
+ Scene *sc;
+
+ for (sc= G.main->scene.first; sc; sc= sc->id.next) {
+ int stored_cfra= (int) sc_store->link;
+
+ sc->r.cfra= stored_cfra;
+ set_scene_bg(sc);
+
+ sc_store= sc_store->next;
+ }
+
+ BLI_linklist_free(storelist, NULL);
+}
+
+void start_game(void)
+{
+ Scene *sc, *startscene = G.scene;
+ LinkNode *scene_cfra_store;
+
+ /* XXX, silly code - the game engine can
+ * access any scene through logic, so we try
+ * to make sure each scene has a valid camera,
+ * just in case the game engine tries to use it.
+ *
+ * Better would be to make a better routine
+ * in the game engine for finding the camera.
+ * - zr
+ */
+ for (sc= G.main->scene.first; sc; sc= sc->id.next) {
+ if (!sc->camera) {
+ Base *base;
+
+ for (base= sc->base.first; base; base= base->next)
+ if (base->object->type==OB_CAMERA)
+ break;
+
+ sc->camera= base?base->object:NULL;
+ }
+ }
+
+ /* these two lines make sure front and backbuffer are equal. for swapbuffers */
+ markdirty_all();
+ screen_swapbuffers();
+
+ /* can start from header */
+ mywinset(curarea->win);
+
+ scene_cfra_store= save_and_reset_all_scene_cfra();
+
+ BPY_end_python();
+
+ sound_stop_all_sounds();
+
+ /* Before jumping into Ketsji, we configure some settings. */
+ space_set_commmandline_options();
+
+ SaveState();
+ StartKetsjiShell(curarea, startscene->id.name+2, G.main, 1);
+ RestoreState();
+
+ BPY_start_python();
+
+ restore_all_scene_cfra(scene_cfra_store);
+ set_scene_bg(startscene);
+
+ if (G.flags & G_FLAGS_AUTOPLAY)
+ exit_usiblender();
+
+ /* groups could have changed ipo */
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWACTION, 0);
+ allspace(REMAKEIPO, 0);
+ allqueue(REDRAWIPO, 0);
+}
+
+void changeview3d()
+{
+
+ setwinmatrixview3d(0); /* 0= geen pick rect */
+
+}
+
+ /* Callable from editmode and faceselect mode from the
+ * moment, would be nice (and is easy) to generalize
+ * to any mode.
+ */
+static void align_view_to_selected(View3D *v3d)
+{
+ int nr= pupmenu("Align view%t|To selection (top)%x2|To selection (front)%x1|To selection (side)%x0");
+
+ if (nr!=-1) {
+ int axis= nr;
+
+ if (G.obedit && (G.obedit->type == OB_MESH)) {
+ editmesh_align_view_to_selected(v3d, axis);
+ addqueue(v3d->area->win, REDRAW, 1);
+ } else if (G.f & G_FACESELECT) {
+ Object *obact= OBACT;
+ if (obact && obact->type==OB_MESH) {
+ Mesh *me= obact->data;
+
+ if (me->tface) {
+ faceselect_align_view_to_selected(v3d, me, axis);
+ addqueue(v3d->area->win, REDRAW, 1);
+ }
+ }
+ }
+ }
+}
+
+void winqread3d(unsigned short event, short val, char ascii)
+{
+ View3D *v3d= curarea->spacedata.first;
+ Object *ob;
+ float *curs;
+ int doredraw= 0, pupval;
+
+ if(curarea->win==0) return; /* hier komtie vanuit sa->headqread() */
+ if(event==MOUSEY) return;
+
+ if(val) {
+
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ /* TEXTEDITING?? */
+ if(G.obedit && G.obedit->type==OB_FONT) {
+ switch(event) {
+
+ case LEFTMOUSE:
+ mouse_cursor();
+ break;
+ case MIDDLEMOUSE:
+ if(U.flag & VIEWMOVE) {
+ if(G.qual & LR_SHIFTKEY) viewmove(0);
+ else if(G.qual & LR_CTRLKEY) viewmove(2);
+ else viewmove(1);
+ }
+ else {
+ if(G.qual & LR_SHIFTKEY) viewmove(1);
+ else if(G.qual & LR_CTRLKEY) viewmove(2);
+ else viewmove(0);
+ }
+ case UKEY:
+ if(G.qual & LR_ALTKEY) {
+ remake_editText();
+ doredraw= 1;
+ } else {
+ do_textedit(event, val, ascii);
+ }
+ break;
+ case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
+ case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
+ case PADENTER:
+ persptoetsen(event);
+ doredraw= 1;
+ break;
+
+ default:
+ do_textedit(event, val, ascii);
+ break;
+ }
+ }
+ else {
+ switch(event) {
+
+ case BACKBUFDRAW:
+ backdrawview3d(1);
+ break;
+
+ case LEFTMOUSE:
+ if (G.obedit || !(G.f&(G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT))) {
+ mouse_cursor();
+ }
+ else if (G.f & G_VERTEXPAINT) {
+ vertex_paint();
+ }
+ else if (G.f & G_WEIGHTPAINT){
+ weight_paint();
+ }
+ else if (G.f & G_TEXTUREPAINT) {
+ face_draw();
+ }
+ break;
+ case MIDDLEMOUSE:
+ if(U.flag & VIEWMOVE) {
+ if(G.qual & LR_SHIFTKEY) viewmove(0);
+ else if(G.qual & LR_CTRLKEY) viewmove(2);
+ else viewmove(1);
+ }
+ else {
+ if(G.qual & LR_SHIFTKEY) viewmove(1);
+ else if(G.qual & LR_CTRLKEY) viewmove(2);
+ else viewmove(0);
+ }
+ break;
+ case RIGHTMOUSE:
+ if(G.obedit && (G.qual & LR_CTRLKEY)==0) {
+ if(G.obedit->type==OB_MESH) mouse_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) mouse_nurb();
+ else if(G.obedit->type==OB_MBALL) mouse_mball();
+ else if(G.obedit->type==OB_LATTICE) mouse_lattice();
+ else if(G.obedit->type==OB_ARMATURE) mouse_armature();
+ }
+ else if(G.obpose) {
+ if (G.obpose->type==OB_ARMATURE) mousepose_armature();
+ }
+ else if( G.qual & LR_CTRLKEY ) mouse_select();
+ else if(G.f & G_FACESELECT) face_select();
+ else if( G.f & (G_VERTEXPAINT|G_TEXTUREPAINT)) sample_vpaint();
+ else
+ mouse_select();
+ break;
+
+ case ONEKEY:
+ do_layer_buttons(0); break;
+ case TWOKEY:
+ do_layer_buttons(1); break;
+ case THREEKEY:
+ do_layer_buttons(2); break;
+ case FOURKEY:
+ do_layer_buttons(3); break;
+ case FIVEKEY:
+ do_layer_buttons(4); break;
+ case SIXKEY:
+ do_layer_buttons(5); break;
+ case SEVENKEY:
+ do_layer_buttons(6); break;
+ case EIGHTKEY:
+ do_layer_buttons(7); break;
+ case NINEKEY:
+ do_layer_buttons(8); break;
+ case ZEROKEY:
+ do_layer_buttons(9); break;
+ case MINUSKEY:
+ do_layer_buttons(10); break;
+ case EQUALKEY:
+ do_layer_buttons(11); break;
+ case ACCENTGRAVEKEY:
+ do_layer_buttons(-1); break;
+
+ case AKEY:
+ if(G.qual & LR_CTRLKEY) apply_object();
+ else if(G.qual & LR_SHIFTKEY) {
+ tbox_setmain(0);
+ toolbox();
+ }
+ else {
+ if(G.obedit) {
+ 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();
+ else if(G.obedit->type==OB_ARMATURE) deselectall_armature();
+ }
+ else if (G.obpose){
+ switch (G.obpose->type){
+ case OB_ARMATURE:
+ deselectall_posearmature(1);
+ break;
+ }
+ }
+ else {
+ if(G.f & G_FACESELECT) deselectall_tface();
+ else deselectall();
+ }
+ }
+ break;
+ case BKEY:
+ if(G.qual & LR_SHIFTKEY) set_render_border();
+ else borderselect();
+ break;
+ case CKEY:
+ if(G.qual & LR_CTRLKEY) {
+ copymenu();
+ }
+ else if(G.qual & LR_ALTKEY) {
+ convertmenu(); /* editobject.c */
+ }
+ else if(G.qual & LR_SHIFTKEY) {
+ view3d_home(1);
+ curs= give_cursor();
+ curs[0]=curs[1]=curs[2]= 0.0;
+ scrarea_queue_winredraw(curarea);
+ }
+ else if(G.obedit!=0 && ELEM(G.obedit->type, OB_CURVE, OB_SURF) ) {
+ makecyclicNurb();
+ makeDispList(G.obedit);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ else {
+ curs= give_cursor();
+ G.vd->ofs[0]= -curs[0];
+ G.vd->ofs[1]= -curs[1];
+ G.vd->ofs[2]= -curs[2];
+ scrarea_queue_winredraw(curarea);
+ }
+
+ break;
+ case DKEY:
+ if(G.qual & LR_SHIFTKEY) {
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) adduplicate_mesh();
+ else if(G.obedit->type==OB_ARMATURE) adduplicate_armature();
+ else if(G.obedit->type==OB_MBALL) adduplicate_mball();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) adduplicate_nurb();
+ }
+ else if(G.obpose){
+ error ("Duplicate not possible in posemode.");
+ }
+ else adduplicate(0);
+ }
+ else if(G.qual & LR_ALTKEY) {
+ if(G.obpose) error ("Duplicate not possible in posemode.");
+ else
+ if(G.obedit==0) adduplicate(0);
+ }
+ else if(G.qual & LR_CTRLKEY) {
+ imagestodisplist();
+ }
+ else {
+ pupval= pupmenu("Draw mode%t|BoundBox %x1|Wire %x2|OpenGL Solid %x3|Shaded Solid %x4");
+ if(pupval>0) {
+ G.vd->drawtype= pupval;
+ doredraw= 1;
+
+ }
+ }
+
+ break;
+ case EKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) extrude_mesh();
+ else if(G.obedit->type==OB_CURVE) addvert_Nurb('e');
+ else if(G.obedit->type==OB_SURF) extrude_nurb();
+ else if(G.obedit->type==OB_ARMATURE) extrude_armature();
+ }
+ else {
+ ob= OBACT;
+ if(ob && ob->type==OB_IKA) if(okee("extrude IKA")) extrude_ika(ob, 1);
+ }
+ break;
+ case FKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) {
+ if(G.qual & LR_SHIFTKEY) fill_mesh();
+ else if(G.qual & LR_ALTKEY) beauty_fill();
+ else if(G.qual & LR_CTRLKEY) edge_flip();
+ else addedgevlak_mesh();
+ }
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) addsegment_nurb();
+ }
+ else if(G.qual & LR_CTRLKEY) sort_faces();
+ else if(G.qual & LR_SHIFTKEY) fly();
+ else {
+ set_faceselect();
+ }
+
+ break;
+ case GKEY:
+ /* RMGRP if(G.qual & LR_CTRLKEY) add_selected_to_group();
+ else if(G.qual & LR_ALTKEY) rem_selected_from_group();
+ else if(G.qual & LR_SHIFTKEY) group_menu();
+ else */
+ if(G.qual & LR_ALTKEY) clear_object('g');
+ else
+ transform('g');
+ break;
+ case HKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) {
+ if(G.qual & LR_ALTKEY) reveal_mesh();
+ else hide_mesh(G.qual & LR_SHIFTKEY);
+ }
+ else if(G.obedit->type== OB_SURF) {
+ if(G.qual & LR_ALTKEY) revealNurb();
+ else hideNurb(G.qual & LR_SHIFTKEY);
+ }
+ else if(G.obedit->type==OB_CURVE) {
+
+ if(G.qual & LR_CTRLKEY) autocalchandlesNurb_all(1); /* flag=1, selected */
+ else if(G.qual & LR_SHIFTKEY) sethandlesNurb(1);
+ else sethandlesNurb(3);
+
+ makeDispList(G.obedit);
+
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ else if(G.f & G_FACESELECT) hide_tface();
+
+ break;
+ case IKEY:
+ break;
+
+ case JKEY:
+ if(G.qual & LR_CTRLKEY) {
+ if( (ob= OBACT) ) {
+ if(ob->type == OB_MESH) join_mesh();
+ else if(ob->type == OB_CURVE) join_curve(OB_CURVE);
+ else if(ob->type == OB_SURF) join_curve(OB_SURF);
+ else if(ob->type == OB_ARMATURE) join_armature ();
+ }
+ else if (G.obedit && ELEM(G.obedit->type, OB_CURVE, OB_SURF)) addsegment_nurb();
+ } else if(G.obedit) {
+ if(G.obedit->type==OB_MESH) {
+ join_triangles();
+ }
+ }
+
+ break;
+ case KKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_SURF) printknots();
+ }
+ else {
+ if(G.qual & LR_SHIFTKEY) {
+ if(G.f & G_FACESELECT) clear_vpaint_selectedfaces();
+ else if(G.f & G_VERTEXPAINT) clear_vpaint();
+ else select_select_keys();
+ }
+ else if(G.qual & LR_CTRLKEY) make_skeleton();
+/* else if(G.qual & LR_ALTKEY) delete_skeleton(); */
+ else set_ob_ipoflags();
+ }
+
+ break;
+ case LKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) selectconnected_mesh();
+ if(G.obedit->type==OB_ARMATURE) selectconnected_armature();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) selectconnected_nurb();
+ }
+ else if(G.obpose) {
+ if(G.obpose->type==OB_ARMATURE) selectconnected_posearmature();
+ }
+ else {
+
+ if(G.qual & LR_SHIFTKEY) selectlinks();
+ else if(G.qual & LR_CTRLKEY) linkmenu();
+ else if(G.f & G_FACESELECT) select_linked_tfaces();
+ else make_local();
+ }
+ break;
+ case MKEY:
+ movetolayer();
+ break;
+ case NKEY:
+ if(G.obedit) {
+ switch (G.obedit->type){
+ case OB_ARMATURE:
+ if (okee("Recalc bone roll angles")) auto_align_armature();
+ break;
+ case OB_MESH:
+ if(G.qual & LR_SHIFTKEY) {
+ if(okee("Recalc normals inside")) righthandfaces(2);
+ }
+ else {
+ if(okee("Recalc normals outside")) righthandfaces(1);
+ }
+ break;
+ }
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ break;
+ case OKEY:
+ if(G.qual & LR_ALTKEY) clear_object('o');
+ else if(G.obedit) {
+ extern int prop_mode;
+
+ if (G.qual & LR_SHIFTKEY) prop_mode= !prop_mode;
+ else G.f ^= G_PROPORTIONAL;
+
+ allqueue(REDRAWHEADERS, 0);
+ }
+ break;
+ case PKEY:
+
+ if(G.obedit) {
+ if(G.qual) {
+ if(G.qual & LR_CTRLKEY) make_parent();
+ }
+ else if(G.obedit->type==OB_MESH) separate_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) separate_nurb();
+ }
+ else if(G.qual & LR_CTRLKEY) make_parent();
+ else if(G.qual & LR_ALTKEY) clear_parent();
+ else {
+ start_game();
+ }
+ break;
+ case RKEY:
+ if(G.obedit==0 && (G.f & G_FACESELECT)) rotate_uv_tface();
+ else if(G.qual & LR_ALTKEY) clear_object('r');
+ else if(G.qual & LR_SHIFTKEY) selectrow_nurb();
+ else transform('r');
+ break;
+ case SKEY:
+ if(G.qual & LR_ALTKEY) {
+ if(G.obedit) transform('N'); /* scale by vertex normal */
+ else clear_object('s');
+ }
+ else if(G.qual & LR_SHIFTKEY) snapmenu();
+ else if(G.qual & LR_CTRLKEY) {
+ if(G.obedit) transform('S');
+ }
+ else transform('s');
+ break;
+ case TKEY:
+ if(G.qual & LR_CTRLKEY) {
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) {
+ convert_to_triface(0);
+ allqueue(REDRAWVIEW3D, 0);
+ countall();
+ makeDispList(G.obedit);
+ }
+ }
+ else make_track();
+ }
+ else if(G.qual & LR_ALTKEY) {
+ if(G.obedit && G.obedit->type==OB_CURVE) clear_tilt();
+ else clear_track();
+ }
+ else {
+ if(G.obedit) transform('t');
+ else texspace_edit();
+ }
+
+ break;
+ case UKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) remake_editMesh();
+ else if(G.obedit->type==OB_ARMATURE) remake_editArmature();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) remake_editNurb();
+ else if(G.obedit->type==OB_LATTICE) remake_editLatt();
+ }
+ else if(G.f & G_FACESELECT) uv_autocalc_tface();
+ else if(G.f & G_WEIGHTPAINT) wpaint_undo();
+ else if(G.f & G_VERTEXPAINT) vpaint_undo();
+ else single_user();
+
+ break;
+ case VKEY:
+ if(G.qual==LR_SHIFTKEY) {
+ if (G.obedit && G.obedit->type==OB_MESH) {
+ align_view_to_selected(v3d);
+ } else if (G.f & G_FACESELECT) {
+ align_view_to_selected(v3d);
+ }
+ } else {
+ if(G.obedit) {
+ if(G.obedit->type==OB_CURVE) {
+ sethandlesNurb(2);
+ makeDispList(G.obedit);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ else if(G.qual & LR_ALTKEY) image_aspect();
+ else set_vpaint();
+ }
+ break;
+ case WKEY:
+ if(G.qual & LR_SHIFTKEY) {
+ transform('w');
+ }
+ else if(G.qual & LR_ALTKEY) {
+ /* if(G.obedit && G.obedit->type==OB_MESH) write_videoscape(); */
+ }
+ else if(G.qual & LR_CTRLKEY) {
+ if(G.obedit) {
+ if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
+ switchdirectionNurb2();
+ }
+ }
+ }
+ else special_editmenu();
+
+ break;
+ case XKEY:
+ case DELKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) delete_mesh();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) delNurb();
+ else if(G.obedit->type==OB_MBALL) delete_mball();
+ else if (G.obedit->type==OB_ARMATURE) delete_armature();
+ }
+ else delete_obj(0);
+ break;
+ case YKEY:
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH) split_mesh();
+ }
+ break;
+ case ZKEY:
+ if(G.qual & LR_CTRLKEY) {
+ reshadeall_displist();
+ G.vd->drawtype= OB_SHADED;
+ }
+ else if(G.qual & LR_SHIFTKEY) {
+ if(G.vd->drawtype== OB_SHADED) G.vd->drawtype= OB_WIRE;
+ else G.vd->drawtype= OB_SHADED;
+ }
+ else if(G.qual & LR_ALTKEY) {
+ if(G.vd->drawtype== OB_TEXTURE) G.vd->drawtype= OB_SOLID;
+ else G.vd->drawtype= OB_TEXTURE;
+ }
+ else {
+ if(G.vd->drawtype==OB_SOLID || G.vd->drawtype==OB_SHADED) G.vd->drawtype= OB_WIRE;
+ else G.vd->drawtype= OB_SOLID;
+ }
+
+
+ scrarea_queue_headredraw(curarea);
+ scrarea_queue_winredraw(curarea);
+ break;
+
+
+ case HOMEKEY:
+ view3d_home(0);
+ break;
+ case COMMAKEY:
+ G.vd->around= V3D_CENTRE;
+ scrarea_queue_headredraw(curarea);
+ break;
+
+ case PERIODKEY:
+ G.vd->around= V3D_CURSOR;
+ scrarea_queue_headredraw(curarea);
+ break;
+
+ case PADSLASHKEY:
+ if(G.vd->localview) {
+ G.vd->localview= 0;
+ endlocalview(curarea);
+ }
+ else {
+ G.vd->localview= 1;
+ initlocalview();
+ }
+ scrarea_queue_headredraw(curarea);
+ break;
+ case PADASTERKEY: /* '*' */
+ ob= OBACT;
+ if(ob) {
+ obmat_to_viewmat(ob);
+ if(G.vd->persp==2) G.vd->persp= 1;
+ scrarea_queue_winredraw(curarea);
+ }
+ break;
+ case PADPERIOD: /* '.' */
+ centreview();
+ break;
+
+ case PAGEUPKEY:
+ if(G.qual & LR_CTRLKEY) movekey_obipo(1);
+ else nextkey_obipo(1); /* in editipo.c */
+ break;
+
+ case PAGEDOWNKEY:
+ if(G.qual & LR_CTRLKEY) movekey_obipo(-1);
+ else nextkey_obipo(-1);
+ break;
+
+ case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
+ case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
+ case PADMINUS: case PADPLUSKEY: case PADENTER:
+ persptoetsen(event);
+ doredraw= 1;
+ break;
+
+ case ESCKEY:
+ if (G.vd->flag & V3D_DISPIMAGE) {
+ G.vd->flag &= ~V3D_DISPIMAGE;
+ doredraw= 1;
+ }
+ break;
+ }
+ }
+ }
+
+ if(doredraw) {
+ scrarea_queue_winredraw(curarea);
+ scrarea_queue_headredraw(curarea);
+ }
+}
+
+void initview3d(ScrArea *sa)
+{
+ View3D *vd;
+
+ vd= MEM_callocN(sizeof(View3D), "initview3d");
+ BLI_addhead(&sa->spacedata, vd); /* addhead! niet addtail */
+
+ vd->spacetype= SPACE_VIEW3D;
+ vd->viewquat[0]= 1.0;
+ vd->viewquat[1]= vd->viewquat[2]= vd->viewquat[3]= 0.0;
+ vd->persp= 1;
+ vd->drawtype= OB_WIRE;
+ vd->view= 7;
+ vd->dist= 10.0;
+ vd->lens= 35.0;
+ vd->near= 0.01;
+ vd->far= 500.0;
+ vd->grid= 1.0;
+ vd->gridlines= 16;
+ vd->lay= vd->layact= 1;
+ if(G.scene) {
+ vd->lay= vd->layact= G.scene->lay;
+ vd->camera= G.scene->camera;
+ }
+ vd->scenelock= 1;
+}
+
+
+/* ******************** SPACE: IPO ********************** */
+
+void changeview2d()
+{
+ if(G.v2d==0) return;
+
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
+}
+
+void winqreadipo(unsigned short event, short val, char ascii)
+{
+ SpaceIpo *sipo= curarea->spacedata.first;
+ View2D *v2d= &sipo->v2d;
+ float dx, dy;
+ int cfra, doredraw= 0;
+ short mval[2];
+
+ if(curarea->win==0) return;
+
+ if(val) {
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ switch(event) {
+ case UI_BUT_EVENT:
+ if(val>0) do_ipowin_buts(val-1);
+ break;
+ case LEFTMOUSE:
+ if( in_ipo_buttons() ) {
+ do_ipo_selectbuttons();
+ doredraw= 1;
+ }
+ else if(G.qual & LR_CTRLKEY) add_vert_ipo();
+ else {
+ do {
+ getmouseco_areawin(mval);
+ areamouseco_to_ipoco(v2d, mval, &dx, &dy);
+
+ cfra= (int)dx;
+ if(cfra< 1) cfra= 1;
+
+ if( cfra!=CFRA ) {
+ CFRA= cfra;
+ update_for_newframe();
+ force_draw_plus(SPACE_VIEW3D);
+ force_draw_plus(SPACE_ACTION);
+ force_draw_plus(SPACE_BUTS); /* To make constraint sliders redraw */
+ }
+
+ } while(get_mbut()&L_MOUSE);
+ }
+
+ break;
+ case MIDDLEMOUSE:
+ if(in_ipo_buttons()) {
+ scroll_ipobuts();
+ }
+ else view2dmove(); /* in drawipo.c */
+ break;
+ case RIGHTMOUSE:
+ mouse_select_ipo();
+ allqueue (REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+ break;
+ case PADPLUSKEY:
+
+ dx= 0.1154*(v2d->cur.xmax-v2d->cur.xmin);
+ dy= 0.1154*(v2d->cur.ymax-v2d->cur.ymin);
+ if(val==SPACE_BUTS) {
+ dx/=2.0; dy/= 2.0;
+ }
+ v2d->cur.xmin+= dx;
+ v2d->cur.xmax-= dx;
+ v2d->cur.ymin+= dy;
+ v2d->cur.ymax-= dy;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ doredraw= 1;
+ break;
+ case PADMINUS:
+ dx= 0.15*(v2d->cur.xmax-v2d->cur.xmin);
+ dy= 0.15*(v2d->cur.ymax-v2d->cur.ymin);
+ if(val==SPACE_BUTS) {
+ dx/=2.0; dy/= 2.0;
+ }
+ v2d->cur.xmin-= dx;
+ v2d->cur.xmax+= dx;
+ v2d->cur.ymin-= dy;
+ v2d->cur.ymax+= dy;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ doredraw= 1;
+ break;
+ case PAGEUPKEY:
+ if(G.qual & LR_CTRLKEY) movekey_ipo(1);
+ else nextkey_ipo(1);
+ break;
+ case PAGEDOWNKEY:
+ if(G.qual & LR_CTRLKEY) movekey_ipo(-1);
+ else nextkey_ipo(-1);
+ break;
+ case HOMEKEY:
+ do_ipo_buttons(B_IPOHOME);
+ break;
+
+ case AKEY:
+ if(in_ipo_buttons()) {
+ swap_visible_editipo();
+ }
+ else swap_selectall_editipo();
+ allspace (REMAKEIPO, 0);
+ allqueue (REDRAWNLA, 0);
+ allqueue (REDRAWACTION, 0);
+ break;
+ case BKEY:
+ borderselect_ipo();
+ break;
+ case CKEY:
+ move_to_frame();
+ break;
+ case DKEY:
+ if(G.qual & LR_SHIFTKEY) add_duplicate_editipo();
+ break;
+ case GKEY:
+ transform_ipo('g');
+ break;
+ case HKEY:
+ if(G.qual & LR_SHIFTKEY) sethandles_ipo(HD_AUTO);
+ else sethandles_ipo(HD_ALIGN);
+ break;
+ case JKEY:
+ join_ipo();
+ break;
+ case KKEY:
+ if(G.sipo->showkey) {
+ G.sipo->showkey= 0;
+ swap_selectall_editipo(); /* sel all */
+ }
+ else G.sipo->showkey= 1;
+ free_ipokey(&G.sipo->ipokey);
+ if(G.sipo->ipo) G.sipo->ipo->showkey= G.sipo->showkey;
+
+ scrarea_queue_headredraw(curarea);
+ allqueue(REDRAWVIEW3D, 0);
+ doredraw= 1;
+ break;
+ case RKEY:
+ ipo_record();
+ break;
+ case SKEY:
+ if(G.qual & LR_SHIFTKEY) ipo_snapmenu();
+ else transform_ipo('s');
+ break;
+ case TKEY:
+ set_ipotype();
+ break;
+ case VKEY:
+ sethandles_ipo(HD_VECT);
+ break;
+ case XKEY:
+ case DELKEY:
+ if(G.qual & LR_SHIFTKEY) delete_key();
+ else del_ipo();
+ break;
+ }
+ }
+
+ if(doredraw) scrarea_queue_winredraw(curarea);
+}
+
+void initipo(ScrArea *sa)
+{
+ SpaceIpo *sipo;
+
+ sipo= MEM_callocN(sizeof(SpaceIpo), "initipo");
+ BLI_addhead(&sa->spacedata, sipo);
+
+ sipo->spacetype= SPACE_IPO;
+ /* sipo space loopt van (0,-?) tot (??,?) */
+ sipo->v2d.tot.xmin= 0.0;
+ sipo->v2d.tot.ymin= -10.0;
+ sipo->v2d.tot.xmax= G.scene->r.efra;
+ sipo->v2d.tot.ymax= 10.0;
+
+ sipo->v2d.cur= sipo->v2d.tot;
+
+ sipo->v2d.min[0]= 0.01;
+ sipo->v2d.min[1]= 0.01;
+
+ sipo->v2d.max[0]= 15000.0;
+ sipo->v2d.max[1]= 10000.0;
+
+ sipo->v2d.scroll= L_SCROLL+B_SCROLL;
+ sipo->v2d.keeptot= 0;
+
+ sipo->blocktype= ID_OB;
+}
+
+/* ******************** SPACE: INFO ********************** */
+
+void space_mipmap_button_function(int event) {
+ set_mipmap(!(U.gameflags & USERDEF_DISABLE_MIPMAP));
+
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+void space_sound_button_function(int event)
+{
+ int a;
+ SYS_SystemHandle syshandle;
+
+ if ((syshandle = SYS_GetSystem()))
+ {
+ a = (U.gameflags & USERDEF_DISABLE_SOUND);
+ SYS_WriteCommandLineInt(syshandle, "noaudio", a);
+ }
+}
+
+void drawinfospace(void)
+{
+ uiBlock *block;
+ float fac;
+ int dx;
+ char naam[32];
+
+ if(curarea->win==0) return;
+
+ glClearColor(0.5, 0.5, 0.5, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ fac= ((float)curarea->winx)/1280.0;
+ myortho2(0.0, 1280.0, 0.0, curarea->winy/fac);
+
+ sprintf(naam, "infowin %d", curarea->win);
+ block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->win);
+
+ uiBlockSetCol(block, BUTBLUE);
+ uiDefButS(block, TOG|BIT|0, B_RESETAUTOSAVE, "Auto Temp Save", 45,32,126,20, &(U.flag), 0, 0, 0, 0, "Enables/Disables the automatic temp. file saving");
+ uiBlockSetCol(block, BUTGREY);
+ uiDefBut(block, TEX, 0, "Dir:", 45,10,127,20, U.tempdir, 1.0, 63.0, 0, 0, "The directory for temp. files");
+ uiDefButI(block, NUM, B_RESETAUTOSAVE, "Time:", 174,32,91,20, &(U.savetime), 1.0, 60.0, 0, 0, "The time in minutes to wait between temp. saves");
+ uiBlockSetCol(block, BUTSALMON);
+ uiDefBut(block, BUT, B_LOADTEMP, "Load Temp", 174,10,90,20, 0, 0, 0, 0, 0, "Loads the most recently saved temp file");
+
+ uiBlockSetCol(block, BUTGREY);
+ uiDefButS(block, NUM, 0, "Versions:", 281,10,86,42, &U.versions, 0.0, 32.0, 0, 0, "The number of old versions to maintain when saving");
+
+ uiBlockSetCol(block, BUTYELLOW);
+ uiDefButI(block, TOG|BIT|USERDEF_VERTEX_ARRAYS_BIT, 0, "Vertex arrays",
+ 389,54,86,20, &(U.gameflags), 0, 0, 0, 0,
+ "Toggle between vertex arrays on (less reliable) and off (more reliable)");
+ uiDefButI(block, TOG|BIT|USERDEF_DISABLE_SOUND_BIT, B_SOUNDTOGGLE, "No sound",
+ 478,54,86,20, &(U.gameflags), 0, 0, 0, 0,
+ "Toggle between sound on and sound off");
+
+ uiDefButI(block, TOG|BIT|USERDEF_DISABLE_MIPMAP_BIT, B_MIPMAPCHANGED, "No Mipmaps",
+ 569,54,78,20, &(U.gameflags), 0, 0, 0, 0,
+ "Toggle between Mipmap textures on (beautiful) and off (fast)");
+
+ uiBlockSetCol(block, BUTGREEN);
+ uiDefButS(block, TOG|BIT|4, 0, "Scene Global",
+ 389,32,86,20, &(U.flag), 0, 0, 0, 0,
+ "Forces the current Scene to be displayed in all Screens");
+ uiDefButS(block, TOG|BIT|5, 0, "TrackBall",
+ 389,10,86,20, &(U.flag), 0, 0, 0, 0,
+ "Switches between trackball and turntable view rotation methods (MiddleMouse)");
+ uiDefButS(block, TOG|BIT|12, 0, "2-Mouse",
+ 478,10,86,20, &(U.flag), 0, 0, 0, 0,
+ "Maps ALT+LeftMouse to MiddleMouse button");
+ uiDefButS(block, TOG|BIT|8, 0, "Mat on Obj",
+ 569,9,78,20, &(U.flag), 0, 0, 0, 0,
+ "Sets whether Material data is linked to Obj or ObjData");
+ uiDefButS(block, TOG|BIT|9, B_U_CAPSLOCK, "NoCapsLock",
+ 478,32,86,20, &(U.flag), 0, 0, 0, 0,
+ "Deactives the CapsLock button (only applies to text input)");
+ uiDefButS(block, TOG|BIT|10, 0, "Viewmove",
+ 569,32,78,20, &(U.flag), 0, 0, 0, 0,
+ "Sets the default action for the middle mouse button");
+
+ uiDefButS(block, TOG|BIT|13, 0, "noNumpad",
+ 653,10,76,20, &(U.flag), 0, 0, 0, 0,
+ "For laptops: keys 1 to 0 become numpad keys");
+ uiDefButS(block, TOG|BIT|11, 0, "ToolTips",
+ 653,32,76,20, &(U.flag), 0, 0, 0, 0,
+ "Enables/Disables tooltips");
+
+// uiDefButS(block, ICONTOG|BIT|14, 0, ICON(), 733,10,50,42, &(U.flag), 0, 0, 0, 0, "Automatic keyframe insertion");
+ uiDefButS(block, TOG|BIT|14, 0, "KeyAC", 733,32,50,20, &(U.flag), 0, 0, 0, 0, "Automatic keyframe insertion for actions");
+ uiDefButS(block, TOG|BIT|15, 0, "KeyOB", 733,10,50,20, &(U.flag), 0, 0, 0, 0, "Automatic keyframe insertion for objects");
+
+ uiDefButS(block, TOG|BIT|1, 0, "Grab Grid", 788,32,106,20, &(U.flag), 0, 0, 0, 0, "Changes default step mode for grabbing");
+ uiDefButS(block, TOG|BIT|2, 0, "Rot", 842,10,52,20, &(U.flag), 0, 0, 0, 0, "Changes default step mode for rotation");
+ uiDefButS(block, TOG|BIT|3, 0, "Size", 788,10,52,20, &(U.flag), 0, 0, 0, 0, "Changes default step mode for scaling");
+
+ uiDefButS(block, TOG|BIT|0, 0, "Dupli Mesh", 902,32,90,20, &(U.dupflag), 0, 0, 0, 0, "Causes Mesh data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|9, 0, "Armature", 902,10,90,20, &(U.dupflag), 0, 0, 0, 0, "Causes Armature data to be duplicated with Shift+D");
+
+ uiDefButS(block, TOG|BIT|1, 0, "Curve", 995,32,50,20, &(U.dupflag), 0, 0, 0, 0, "Causes Curve data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|2, 0, "Surf", 995,10,50,20, &(U.dupflag), 0, 0, 0, 0, "Causes Surface data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|3, 0, "Text", 1048,32,50,20, &(U.dupflag), 0, 0, 0, 0, "Causes Text data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|4, 0, "MBall", 1048,10,50,20, &(U.dupflag), 0, 0, 0, 0, "Causes Metaball data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|5, 0, "Lamp", 1101,32,50,20, &(U.dupflag), 0, 0, 0, 0, "Causes Lamp data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|6, 0, "Ipo", 1101,10,50,20, &(U.dupflag), 0, 0, 0, 0, "Causes Ipo data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|7, 0, "Material", 1153,32,70,20, &(U.dupflag), 0, 0, 0, 0, "Causes Material data to be duplicated with Shift+D");
+ uiDefButS(block, TOG|BIT|8, 0, "Texture", 1153,10,70,20, &(U.dupflag), 0, 0, 0, 0, "Causes Texture data to be duplicated with Shift+D");
+
+
+
+ uiBlockSetCol(block, BUTGREY);
+ dx= (1280-90)/6;
+
+
+#define _XPOS_ 45
+#define _YPOS_ 80
+#define _BUTH_ 20
+#define _RULESPACE_ 2
+ uiDefBut(block, TEX, 0, "Python:",
+ _XPOS_,_YPOS_-_BUTH_-_RULESPACE_,(short)dx,_BUTH_, U.pythondir, 1.0, 63.0, 0, 0,
+ "The default directory for Python scripts");
+ uiDefBut(block, TEX, 0, "Fonts:",
+ _XPOS_,_YPOS_,(short)dx,_BUTH_, U.fontdir, 1.0, 63.0, 0, 0,
+ "The default directory to search when loading fonts");
+ uiDefBut(block, TEX, 0, "Render:",
+ (short)(_XPOS_+dx),_YPOS_,(short)dx,_BUTH_, U.renderdir, 1.0, 63.0, 0, 0,
+ "The default directory to choose for rendering");
+ uiDefBut(block, TEX, 0, "Textures:",
+ (short)(_XPOS_+2*dx),_YPOS_,(short)dx,_BUTH_, U.textudir, 1.0, 63.0, 0, 0,
+ "The default directory to search when loading textures");
+ uiDefBut(block, TEX, 0, "TexPlugin:",
+ (short)(_XPOS_+3*dx),_YPOS_,(short)dx,_BUTH_, U.plugtexdir, 1.0, 63.0, 0, 0,
+ "The default directory to search when loading texture plugins");
+ uiDefBut(block, TEX, 0, "SeqPlugin:",
+ (short)(_XPOS_+4*dx),_YPOS_,(short)dx,_BUTH_, U.plugseqdir, 1.0, 63.0, 0, 0,
+ "The default directory to search when loading sequence plugins");
+ uiDefBut(block, TEX, 0, "Sounds:",
+ (short)(_XPOS_+5*dx),_YPOS_,(short)dx,_BUTH_, U.sounddir, 1.0, 63.0, 0, 0,
+ "The default directory to search when loading sounds");
+#undef _XPOS_
+#undef _YPOS_
+#undef _BUTH_
+#undef _RULESPACE_
+ uiDrawBlock(block);
+}
+
+void winqreadinfospace(unsigned short event, short val, char ascii)
+{
+ if(val) {
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ switch(event) {
+ case UI_BUT_EVENT:
+ do_global_buttons(val);
+
+ break;
+ }
+ }
+}
+
+void init_infospace(ScrArea *sa)
+{
+ SpaceInfo *sinfo;
+
+ sinfo= MEM_callocN(sizeof(SpaceInfo), "initinfo");
+ BLI_addhead(&sa->spacedata, sinfo);
+}
+
+/* ******************** SPACE: BUTS ********************** */
+
+extern void drawbutspace(void); /* buttons.c */
+
+void changebutspace(void)
+{
+ if(G.v2d==0) return;
+
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
+}
+
+void winqreadbutspace(unsigned short event, short val, char ascii)
+{
+ SpaceButs *sbuts= curarea->spacedata.first;
+ ScrArea *sa, *sa3d;
+ int doredraw= 0;
+
+ if(val) {
+
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ switch(event) {
+ case UI_BUT_EVENT:
+ do_blenderbuttons(val);
+ break;
+
+ case MIDDLEMOUSE:
+ view2dmove(); /* in drawipo.c */
+ break;
+ case PADPLUSKEY:
+ case PADMINUS:
+ val= SPACE_BUTS;
+ winqreadipo(event, val, 0);
+ break;
+ case RENDERPREVIEW:
+ BIF_previewrender(sbuts);
+ break;
+
+ case HOMEKEY:
+ do_buts_buttons(B_BUTSHOME);
+ break;
+
+
+ /* if only 1 view, also de persp, excluding arrowkeys */
+ case PAD0: case PAD1: case PAD3:
+ case PAD5: case PAD7: case PAD9:
+ case PADENTER: case ZKEY: case PKEY:
+ sa3d= 0;
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(sa->spacetype==SPACE_VIEW3D) {
+ if(sa3d) return;
+ sa3d= sa;
+ }
+ sa= sa->next;
+ }
+ if(sa3d) {
+ sa= curarea;
+ areawinset(sa3d->win);
+
+ if(event==PKEY) start_game();
+ else if(event==ZKEY) winqread3d(event, val, 0);
+ else persptoetsen(event);
+
+ scrarea_queue_winredraw(sa3d);
+ scrarea_queue_headredraw(sa3d);
+ areawinset(sa->win);
+ }
+ }
+ }
+
+ if(doredraw) scrarea_queue_winredraw(curarea);
+}
+
+void set_rects_butspace(SpaceButs *buts)
+{
+ /* buts space loopt van (0,0) tot (1280, 228) */
+
+ buts->v2d.tot.xmin= 0.0;
+ buts->v2d.tot.ymin= 0.0;
+ buts->v2d.tot.xmax= 1279.0;
+ buts->v2d.tot.ymax= 228.0;
+
+ buts->v2d.min[0]= 256.0;
+ buts->v2d.min[1]= 42.0;
+
+ buts->v2d.max[0]= 1600.0;
+ buts->v2d.max[1]= 450.0;
+
+ buts->v2d.minzoom= 0.5;
+ buts->v2d.maxzoom= 1.41;
+
+ buts->v2d.scroll= 0;
+ buts->v2d.keepaspect= 1;
+ buts->v2d.keepzoom= 1;
+ buts->v2d.keeptot= 1;
+
+}
+
+void test_butspace(void)
+{
+ ScrArea *area= curarea;
+ int blocksmin= uiBlocksGetYMin(&area->uiblocks)-10.0;
+
+ G.buts->v2d.tot.ymin= MIN2(0.0, blocksmin-10.0);
+}
+
+void init_butspace(ScrArea *sa)
+{
+ SpaceButs *buts;
+
+ buts= MEM_callocN(sizeof(SpaceButs), "initbuts");
+ BLI_addhead(&sa->spacedata, buts);
+
+ buts->spacetype= SPACE_BUTS;
+ buts->scaflag= BUTS_SENS_LINK|BUTS_SENS_ACT|BUTS_CONT_ACT|BUTS_ACT_ACT|BUTS_ACT_LINK;
+
+ /* set_rects doet alleen defaults, zodat na het filezen de cur niet verandert */
+ set_rects_butspace(buts);
+ buts->v2d.cur= buts->v2d.tot;
+}
+
+void extern_set_butspace(int fkey)
+{
+ ScrArea *sa;
+ SpaceButs *sbuts;
+
+ /* als een ftoets ingedrukt: de dichtsbijzijnde buttonwindow wordt gezet */
+ if(curarea->spacetype==SPACE_BUTS) sa= curarea;
+ else {
+ /* area vinden */
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(sa->spacetype==SPACE_BUTS) break;
+ sa= sa->next;
+ }
+ }
+
+ if(sa==0) return;
+
+ if(sa!=curarea) areawinset(sa->win);
+
+ sbuts= sa->spacedata.first;
+
+ if(fkey==F4KEY) sbuts->mainb= BUTS_LAMP;
+ else if(fkey==F5KEY) sbuts->mainb= BUTS_MAT;
+ else if(fkey==F6KEY) sbuts->mainb= BUTS_TEX;
+ else if(fkey==F7KEY) sbuts->mainb= BUTS_ANIM;
+ else if(fkey==F8KEY) sbuts->mainb= BUTS_GAME;
+ else if(fkey==F9KEY) sbuts->mainb= BUTS_EDIT;
+ else if(fkey==F10KEY) sbuts->mainb= BUTS_RENDER;
+
+ scrarea_queue_headredraw(sa);
+ scrarea_queue_winredraw(sa);
+ BIF_preview_changed(sbuts);
+}
+
+/* ******************** SPACE: SEQUENCE ********************** */
+
+/* extern void drawseqspace(); BIF_drawseq.h */
+
+void winqreadsequence(unsigned short event, short val, char ascii)
+{
+ SpaceSeq *sseq= curarea->spacedata.first;
+ View2D *v2d= &sseq->v2d;
+ extern Sequence *last_seq;
+ float dx, dy;
+ int doredraw= 0, cfra, first;
+ short mval[2];
+
+ if(curarea->win==0) return;
+
+ if(val) {
+
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ switch(event) {
+ case LEFTMOUSE:
+ if(sseq->mainb || view2dmove()==0) {
+
+ first= 1;
+ set_special_seq_update(1);
+
+ do {
+ getmouseco_areawin(mval);
+ areamouseco_to_ipoco(v2d, mval, &dx, &dy);
+
+ cfra= (int)dx;
+ if(cfra< 1) cfra= 1;
+ /* else if(cfra> EFRA) cfra= EFRA; */
+
+ if( cfra!=CFRA || first ) {
+ first= 0;
+
+ CFRA= cfra;
+ force_draw();
+ }
+
+ } while(get_mbut()&L_MOUSE);
+
+ set_special_seq_update(0);
+
+ update_for_newframe();
+ }
+ break;
+ case MIDDLEMOUSE:
+ if(sseq->mainb) break;
+ view2dmove(); /* in drawipo.c */
+ break;
+ case RIGHTMOUSE:
+ if(sseq->mainb) break;
+ mouse_select_seq();
+ break;
+ case PADPLUSKEY:
+ if(sseq->mainb) {
+ sseq->zoom++;
+ if(sseq->zoom>8) sseq->zoom= 8;
+ }
+ else {
+ if(G.qual) {
+ if(G.qual & LR_SHIFTKEY) insert_gap(25, CFRA);
+ else if(G.qual & LR_ALTKEY) insert_gap(250, CFRA);
+ allqueue(REDRAWSEQ, 0);
+ }
+ else {
+ dx= 0.1154*(v2d->cur.xmax-v2d->cur.xmin);
+ v2d->cur.xmin+= dx;
+ v2d->cur.xmax-= dx;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ }
+ }
+ doredraw= 1;
+ break;
+ case PADMINUS:
+ if(sseq->mainb) {
+ sseq->zoom--;
+ if(sseq->zoom<1) sseq->zoom= 1;
+ }
+ else {
+ if(G.qual) {
+ if(G.qual & LR_SHIFTKEY) no_gaps();
+ }
+ else {
+ dx= 0.15*(v2d->cur.xmax-v2d->cur.xmin);
+ v2d->cur.xmin-= dx;
+ v2d->cur.xmax+= dx;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ }
+ }
+ doredraw= 1;
+ break;
+ case HOMEKEY:
+ do_seq_buttons(B_SEQHOME);
+ break;
+ case PADPERIOD:
+ if(last_seq) {
+ CFRA= last_seq->startdisp;
+ v2d->cur.xmin= last_seq->startdisp- (last_seq->len/20);
+ v2d->cur.xmax= last_seq->enddisp+ (last_seq->len/20);
+ update_for_newframe();
+ }
+ break;
+
+ case AKEY:
+ if(sseq->mainb) break;
+ if(G.qual & LR_SHIFTKEY) {
+ add_sequence(0);
+ }
+ else swap_select_seq();
+ break;
+ case BKEY:
+ if(sseq->mainb) break;
+ borderselect_seq();
+ break;
+ case CKEY:
+ if(last_seq && (last_seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))) {
+ if(last_seq->flag & SEQ_LEFTSEL) CFRA= last_seq->startdisp;
+ else CFRA= last_seq->enddisp-1;
+
+ dx= CFRA-(v2d->cur.xmax+v2d->cur.xmin)/2;
+ v2d->cur.xmax+= dx;
+ v2d->cur.xmin+= dx;
+ update_for_newframe();
+ }
+ else change_sequence();
+ break;
+ case DKEY:
+ if(sseq->mainb) break;
+ if(G.qual & LR_SHIFTKEY) add_duplicate_seq();
+ break;
+ case EKEY:
+ break;
+ case FKEY:
+ set_filter_seq();
+ break;
+ case GKEY:
+ if(sseq->mainb) break;
+ transform_seq('g');
+ break;
+ case MKEY:
+ if(G.qual & LR_ALTKEY) un_meta();
+ else make_meta();
+ break;
+ case SKEY:
+ if(G.qual & LR_SHIFTKEY) seq_snapmenu();
+ break;
+ case TKEY:
+ touch_seq_files();
+ break;
+ case XKEY:
+ case DELKEY:
+ if(sseq->mainb) break;
+ del_seq();
+ break;
+ }
+ }
+
+ if(doredraw) scrarea_queue_winredraw(curarea);
+}
+
+
+void init_seqspace(ScrArea *sa)
+{
+ SpaceSeq *sseq;
+
+ sseq= MEM_callocN(sizeof(SpaceSeq), "initseqspace");
+ BLI_addhead(&sa->spacedata, sseq);
+
+ sseq->spacetype= SPACE_SEQ;
+ sseq->zoom= 1;
+
+ /* seq space loopt van (0,8) tot (250, 0) */
+
+ sseq->v2d.tot.xmin= 0.0;
+ sseq->v2d.tot.ymin= 0.0;
+ sseq->v2d.tot.xmax= 250.0;
+ sseq->v2d.tot.ymax= 8.0;
+
+ sseq->v2d.cur= sseq->v2d.tot;
+
+ sseq->v2d.min[0]= 10.0;
+ sseq->v2d.min[1]= 4.0;
+
+ sseq->v2d.max[0]= 32000.0;
+ sseq->v2d.max[1]= MAXSEQ;
+
+ sseq->v2d.minzoom= 0.1;
+ sseq->v2d.maxzoom= 10.0;
+
+ sseq->v2d.scroll= L_SCROLL+B_SCROLL;
+ sseq->v2d.keepaspect= 0;
+ sseq->v2d.keepzoom= 0;
+ sseq->v2d.keeptot= 0;
+}
+
+/* ******************** SPACE: ACTION ********************** */
+extern void drawactionspace(void);
+extern void winqreadactionspace(unsigned short, short, char ascii);
+
+void init_actionspace(ScrArea *sa)
+{
+ SpaceAction *saction;
+
+ saction= MEM_callocN(sizeof(SpaceAction), "initactionspace");
+ BLI_addhead(&sa->spacedata, saction);
+
+ saction->spacetype= SPACE_ACTION;
+
+ saction->v2d.tot.xmin= 1.0;
+ saction->v2d.tot.ymin= 0.0;
+ saction->v2d.tot.xmax= 1000.0;
+ saction->v2d.tot.ymax= 1000.0;
+
+ saction->v2d.cur.xmin= -5.0;
+ saction->v2d.cur.ymin= 0.0;
+ saction->v2d.cur.xmax= 65.0;
+ saction->v2d.cur.ymax= 1000.0;
+
+
+ saction->v2d.min[0]= 0.0;
+ saction->v2d.min[1]= 0.0;
+
+ saction->v2d.max[0]= 1000.0;
+ saction->v2d.max[1]= 1000.0;
+
+ saction->v2d.minzoom= 0.1;
+ saction->v2d.maxzoom= 10;
+
+ saction->v2d.scroll= R_SCROLL+B_SCROLL;
+ saction->v2d.keepaspect= 0;
+ saction->v2d.keepzoom= V2D_LOCKZOOM_Y;
+ saction->v2d.keeptot= 0;
+
+}
+
+void free_actionspace(SpaceAction *saction)
+{
+ /* don't free saction itself */
+
+ /* __PINFAKE */
+/* if (saction->flag & SACTION_PIN)
+ if (saction->action)
+ saction->action->id.us --;
+
+*/ /* end PINFAKE */
+}
+
+
+/* ******************** SPACE: FILE ********************** */
+
+void init_filespace(ScrArea *sa)
+{
+ SpaceFile *sfile;
+
+ sfile= MEM_callocN(sizeof(SpaceFile), "initfilespace");
+ BLI_addhead(&sa->spacedata, sfile);
+
+ sfile->dir[0]= '/';
+ sfile->type= FILE_UNIX;
+
+ sfile->spacetype= SPACE_FILE;
+}
+
+void init_textspace(ScrArea *sa)
+{
+ SpaceText *st;
+
+ st= MEM_callocN(sizeof(SpaceText), "inittextspace");
+ BLI_addhead(&sa->spacedata, st);
+
+ st->spacetype= SPACE_TEXT;
+
+ st->text= NULL;
+ st->flags= 0;
+
+ st->font_id= 5;
+ st->lheight= 12;
+
+ st->top= 0;
+}
+
+void init_imaselspace(ScrArea *sa)
+{
+ SpaceImaSel *simasel;
+
+ simasel= MEM_callocN(sizeof(SpaceImaSel), "initimaselspace");
+ BLI_addhead(&sa->spacedata, simasel);
+
+ simasel->spacetype= SPACE_IMASEL;
+
+ simasel->mode = 7;
+ strcpy (simasel->dir, U.textudir); /* TON */
+ strcpy (simasel->file, "");
+ strcpy(simasel->fole, simasel->file);
+ strcpy(simasel->dor, simasel->dir);
+
+ simasel->first_sel_ima = 0;
+ simasel->hilite_ima = 0;
+ simasel->firstdir = 0;
+ simasel->firstfile = 0;
+ simasel->cmap = 0;
+ simasel->returnfunc = 0;
+
+ simasel->title[0] = 0;
+
+ clear_ima_dir(simasel);
+
+ // simasel->cmap= IMB_loadiffmem((int*)datatoc_cmap_tga, IB_rect|IB_cmap);
+ simasel->cmap= IMB_ibImageFromMemory((int *)datatoc_cmap_tga, datatoc_cmap_tga_size, IB_rect|IB_cmap);
+ if (!simasel->cmap) {
+ error("in console");
+ printf("Image select cmap file not found \n");
+ }
+}
+
+/* ******************** SPACE: SOUND ********************** */
+
+extern void drawsoundspace(void);
+extern void winqreadsoundspace(unsigned short, short, char ascii);
+
+void init_soundspace(ScrArea *sa)
+{
+ SpaceSound *ssound;
+
+ ssound= MEM_callocN(sizeof(SpaceSound), "initsoundspace");
+ BLI_addhead(&sa->spacedata, ssound);
+
+ ssound->spacetype= SPACE_SOUND;
+
+ /* sound space loopt van (0,8) tot (250, 0) */
+
+ ssound->v2d.tot.xmin= -4.0;
+ ssound->v2d.tot.ymin= -4.0;
+ ssound->v2d.tot.xmax= 250.0;
+ ssound->v2d.tot.ymax= 255.0;
+
+ ssound->v2d.cur.xmin= -4.0;
+ ssound->v2d.cur.ymin= -4.0;
+ ssound->v2d.cur.xmax= 50.0;
+ ssound->v2d.cur.ymax= 255.0;
+
+ ssound->v2d.min[0]= 1.0;
+ ssound->v2d.min[1]= 259.0;
+
+ ssound->v2d.max[0]= 32000.0;
+ ssound->v2d.max[1]= 259;
+
+ ssound->v2d.minzoom= 0.1;
+ ssound->v2d.maxzoom= 10.0;
+
+ ssound->v2d.scroll= B_SCROLL;
+ ssound->v2d.keepaspect= 0;
+ ssound->v2d.keepzoom= 0;
+ ssound->v2d.keeptot= 0;
+
+}
+
+void free_soundspace(SpaceSound *ssound)
+{
+ /* don't free ssound itself */
+
+
+}
+
+/* ******************** SPACE: IMAGE ********************** */
+
+/* extern void drawimagespace(); BIF_drawimage.h */
+
+void winqreadimagespace(unsigned short event, short val, char ascii)
+{
+ SpaceImage *sima= curarea->spacedata.first;
+ View2D *v2d= &sima->v2d;
+ int width, height;
+#ifdef NAN_TPT
+ IMG_BrushPtr brush;
+ IMG_CanvasPtr canvas;
+ int rowBytes;
+ short xy_prev[2], xy_curr[2];
+ float uv_prev[2], uv_curr[2];
+ extern VPaint Gvp;
+#endif /* NAN_TPT */
+ if(val==0) return;
+
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ if (sima->flag & SI_DRAWTOOL) {
+#ifdef NAN_TPT
+ /* Draw tool is active */
+ switch(event) {
+ case LEFTMOUSE:
+ /* Paranoia checks */
+ if (!sima) break;
+ if (!sima->image) break;
+ if (!sima->image->ibuf) break;
+ if (sima->image->packedfile) {
+ error("Painting in packed images not supported");
+ break;
+ }
+
+ brush = IMG_BrushCreate(Gvp.size, Gvp.size, Gvp.r, Gvp.g, Gvp.b, Gvp.a);
+ /* MAART: skipx is not set most of the times. Make a guess. */
+ rowBytes = sima->image->ibuf->skipx ? sima->image->ibuf->skipx : sima->image->ibuf->x * 4;
+ canvas = IMG_CanvasCreateFromPtr(sima->image->ibuf->rect, sima->image->ibuf->x, sima->image->ibuf->y, rowBytes);
+
+ getmouseco_areawin(xy_prev);
+ while (get_mbut() & L_MOUSE) {
+ getmouseco_areawin(xy_curr);
+ /* Check if mouse position changed */
+ if ((xy_prev[0] != xy_curr[0]) || (xy_prev[1] != xy_curr[1])) {
+ /* Convert mouse coordinates to u,v and draw */
+ areamouseco_to_ipoco(v2d, xy_prev, &uv_prev[0], &uv_prev[1]);
+ areamouseco_to_ipoco(v2d, xy_curr, &uv_curr[0], &uv_curr[1]);
+ IMG_CanvasDrawLineUV(canvas, brush, uv_prev[0], uv_prev[1], uv_curr[0], uv_curr[1]);
+ if (G.sima->lock) {
+ /* Make OpenGL aware of a changed texture */
+ free_realtime_image(sima->image);
+ /* Redraw this view and the 3D view */
+ force_draw_plus(SPACE_VIEW3D);
+ }
+ else {
+ /* Redraw only this view */
+ force_draw();
+ }
+ xy_prev[0] = xy_curr[0];
+ xy_prev[1] = xy_curr[1];
+ }
+ }
+ /* Set the dirty bit in the image so that it is clear that it has been modified. */
+ sima->image->ibuf->userflags |= IB_BITMAPDIRTY;
+ if (!G.sima->lock) {
+ /* Make OpenGL aware of a changed texture */
+ free_realtime_image(sima->image);
+ /* Redraw this view and the 3D view */
+ force_draw_plus(SPACE_VIEW3D);
+ }
+ IMG_BrushDispose(brush);
+ IMG_CanvasDispose(canvas);
+ allqueue(REDRAWHEADERS, 0);
+ break;
+ }
+#endif /* NAN_TPT */
+ }
+ else {
+ /* Draw tool is inactive */
+ switch(event) {
+ case LEFTMOUSE:
+ if(G.qual & LR_SHIFTKEY) mouseco_to_curtile();
+ else gesture();
+ break;
+ case MIDDLEMOUSE:
+ image_viewmove();
+ break;
+ case RIGHTMOUSE:
+ mouse_select_sima();
+ break;
+ case AKEY:
+ select_swap_tface_uv();
+ break;
+ case BKEY:
+ borderselect_sima();
+ break;
+ case GKEY:
+ transform_tface_uv('g');
+ break;
+ case NKEY:
+ if(G.qual & LR_CTRLKEY) replace_names_but();
+ break;
+ case RKEY:
+ transform_tface_uv('r');
+ break;
+ case SKEY:
+ transform_tface_uv('s');
+ break;
+ }
+ }
+
+ /* Events handled always (whether the draw tool is active or not) */
+ switch (event) {
+ case MIDDLEMOUSE:
+ image_viewmove();
+ break;
+ case PADPLUSKEY:
+ sima->zoom *= 2;
+ scrarea_queue_winredraw(curarea);
+ break;
+ case HOMEKEY:
+ image_home();
+ break;
+ case PADMINUS:
+ sima->zoom /= 2;
+ /* Check if the image will still be visible after zooming out */
+ if (sima->zoom < 1) {
+ calc_image_view(G.sima, 'p');
+ if (sima->image) {
+ if (sima->image->ibuf) {
+ width = sima->image->ibuf->x * sima->zoom;
+ height = sima->image->ibuf->y * sima->zoom;
+ if ((width < 4) && (height < 4)) {
+ /* Image will become too small, reset value */
+ sima->zoom *= 2;
+ }
+ }
+ }
+ }
+ scrarea_queue_winredraw(curarea);
+ break;
+ }
+}
+
+
+void init_imagespace(ScrArea *sa)
+{
+ SpaceImage *sima;
+
+ sima= MEM_callocN(sizeof(SpaceImage), "initimaspace");
+ BLI_addhead(&sa->spacedata, sima);
+
+ sima->spacetype= SPACE_IMAGE;
+ sima->zoom= 1;
+}
+
+
+/* ******************** SPACE: IMASEL ********************** */
+
+extern void drawimasel(void);
+extern void winqreadimasel(unsigned short, short, char ascii);
+
+
+/* alles naar imasel.c */
+
+
+/* ******************** SPACE: OOPS ********************** */
+
+extern void drawoopsspace(void);
+
+void winqreadoopsspace(unsigned short event, short val, char ascii)
+{
+ SpaceOops *soops= curarea->spacedata.first;
+ View2D *v2d= &soops->v2d;
+ float dx, dy;
+
+ if(val==0) return;
+
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ switch(event) {
+ case LEFTMOUSE:
+ gesture();
+ break;
+ case MIDDLEMOUSE:
+ view2dmove(); /* in drawipo.c */
+ break;
+ case RIGHTMOUSE:
+ mouse_select_oops();
+ break;
+ case PADPLUSKEY:
+
+ dx= 0.1154*(v2d->cur.xmax-v2d->cur.xmin);
+ dy= 0.1154*(v2d->cur.ymax-v2d->cur.ymin);
+ v2d->cur.xmin+= dx;
+ v2d->cur.xmax-= dx;
+ v2d->cur.ymin+= dy;
+ v2d->cur.ymax-= dy;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ break;
+
+ case PADMINUS:
+
+ dx= 0.15*(v2d->cur.xmax-v2d->cur.xmin);
+ dy= 0.15*(v2d->cur.ymax-v2d->cur.ymin);
+ v2d->cur.xmin-= dx;
+ v2d->cur.xmax+= dx;
+ v2d->cur.ymin-= dy;
+ v2d->cur.ymax+= dy;
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ scrarea_queue_winredraw(curarea);
+ break;
+
+ case HOMEKEY:
+ do_oops_buttons(B_OOPSHOME);
+ break;
+
+ case AKEY:
+ swap_select_all_oops();
+ scrarea_queue_winredraw(curarea);
+ break;
+ case BKEY:
+ borderselect_oops();
+ break;
+ case GKEY:
+ transform_oops('g');
+ break;
+ case LKEY:
+ if(G.qual & LR_SHIFTKEY) select_backlinked_oops();
+ else select_linked_oops();
+ break;
+ case SKEY:
+
+ if(G.qual & LR_ALTKEY) shrink_oops();
+ else if(G.qual & LR_SHIFTKEY) shuffle_oops();
+ else transform_oops('s');
+ break;
+
+ case ONEKEY:
+ do_layer_buttons(0); break;
+ case TWOKEY:
+ do_layer_buttons(1); break;
+ case THREEKEY:
+ do_layer_buttons(2); break;
+ case FOURKEY:
+ do_layer_buttons(3); break;
+ case FIVEKEY:
+ do_layer_buttons(4); break;
+ case SIXKEY:
+ do_layer_buttons(5); break;
+ case SEVENKEY:
+ do_layer_buttons(6); break;
+ case EIGHTKEY:
+ do_layer_buttons(7); break;
+ case NINEKEY:
+ do_layer_buttons(8); break;
+ case ZEROKEY:
+ do_layer_buttons(9); break;
+ case MINUSKEY:
+ do_layer_buttons(10); break;
+ case EQUALKEY:
+ do_layer_buttons(11); break;
+ case ACCENTGRAVEKEY:
+ do_layer_buttons(-1); break;
+
+ }
+}
+
+void init_v2d_oops(View2D *v2d)
+{
+ v2d->tot.xmin= -28.0;
+ v2d->tot.xmax= 28.0;
+ v2d->tot.ymin= -28.0;
+ v2d->tot.ymax= 28.0;
+
+ v2d->cur= v2d->tot;
+
+ v2d->min[0]= 10.0;
+ v2d->min[1]= 4.0;
+
+ v2d->max[0]= 320.0;
+ v2d->max[1]= 320.0;
+
+ v2d->minzoom= 0.01;
+ v2d->maxzoom= 2.0;
+
+ /* v2d->scroll= L_SCROLL+B_SCROLL; */
+ v2d->scroll= 0;
+ v2d->keepaspect= 1;
+ v2d->keepzoom= 0;
+ v2d->keeptot= 0;
+
+}
+
+void init_oopsspace(ScrArea *sa)
+{
+ SpaceOops *soops;
+
+ soops= MEM_callocN(sizeof(SpaceOops), "initoopsspace");
+ BLI_addhead(&sa->spacedata, soops);
+
+ soops->visiflag= OOPS_OB+OOPS_MA+OOPS_ME+OOPS_TE+OOPS_CU+OOPS_IP;
+
+ soops->spacetype= SPACE_OOPS;
+ init_v2d_oops(&soops->v2d);
+}
+
+/* ******************** SPACE: PAINT ********************** */
+
+
+/* ******************** SPACE: Text ********************** */
+
+extern void drawtextspace(void);
+extern void winqreadtextspace(unsigned short, short, char ascii);
+
+/* ******************** SPACE: ALGEMEEN ********************** */
+
+void newspace(ScrArea *sa, int type)
+{
+ if(type>=0) {
+ if(sa->spacetype != type) {
+ SpaceLink *sl;
+
+ sa->spacetype= type;
+ sa->headbutofs= 0;
+
+ uiFreeBlocks(&sa->uiblocks);
+ wich_cursor(sa);
+
+ if (sa->headwin) addqueue(sa->headwin, CHANGED, 1);
+ scrarea_queue_headredraw(sa);
+
+ addqueue(sa->win, CHANGED, 1);
+ scrarea_queue_winredraw(sa);
+
+ areawinset(sa->win);
+
+ bwin_clear_viewmat(sa->win);
+
+ for (sl= sa->spacedata.first; sl; sl= sl->next)
+ if(sl->spacetype==type)
+ break;
+
+ if (sl) {
+ BLI_remlink(&sa->spacedata, sl);
+ BLI_addhead(&sa->spacedata, sl);
+ } else {
+ if(type==SPACE_VIEW3D)
+ initview3d(sa);
+ else if(type==SPACE_IPO)
+ initipo(sa);
+ else if(type==SPACE_INFO)
+ init_infospace(sa);
+ else if(type==SPACE_BUTS)
+ init_butspace(sa);
+ else if(type==SPACE_FILE)
+ init_filespace(sa);
+ else if(type==SPACE_SEQ)
+ init_seqspace(sa);
+ else if(type==SPACE_IMAGE)
+ init_imagespace(sa);
+ else if(type==SPACE_IMASEL)
+ init_imaselspace(sa);
+ else if(type==SPACE_OOPS)
+ init_oopsspace(sa);
+ else if(type==SPACE_ACTION)
+ init_actionspace(sa);
+ else if(type==SPACE_TEXT)
+ init_textspace(sa);
+ else if(type==SPACE_SOUND)
+ init_soundspace(sa);
+ else if(type==SPACE_NLA)
+ init_nlaspace(sa);
+
+ sl= sa->spacedata.first;
+ sl->area= sa;
+ }
+ }
+ }
+
+
+ /* uitzondering: filespace */
+ if(curarea->spacetype==SPACE_FILE) {
+ SpaceFile *sfile= curarea->spacedata.first;
+
+ if(sfile->type==FILE_MAIN) {
+ freefilelist(sfile);
+ } else {
+ sfile->type= FILE_UNIX;
+ }
+
+ sfile->returnfunc= 0;
+ sfile->title[0]= 0;
+ if(sfile->filelist) test_flags_file(sfile);
+ }
+ /* uitzondering: imasel space */
+ else if(curarea->spacetype==SPACE_IMASEL) {
+ SpaceImaSel *simasel= curarea->spacedata.first;
+ simasel->returnfunc= 0;
+ simasel->title[0]= 0;
+ }
+}
+
+void freespacelist(ListBase *lb)
+{
+ SpaceLink *sl;
+
+ for (sl= lb->first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_FILE) {
+ SpaceFile *sfile= (SpaceFile*) sl;
+ if(sfile->libfiledata)
+ BLO_blendhandle_close(sfile->libfiledata);
+ }
+ else if(sl->spacetype==SPACE_BUTS) {
+ SpaceButs *buts= (SpaceButs*) sl;
+ if(buts->rect) MEM_freeN(buts->rect);
+ if(G.buts==buts) G.buts= 0;
+ }
+ else if(sl->spacetype==SPACE_IPO) {
+ SpaceIpo *si= (SpaceIpo*) sl;
+ if(si->editipo) MEM_freeN(si->editipo);
+ free_ipokey(&si->ipokey);
+ if(G.sipo==si) G.sipo= 0;
+ }
+ else if(sl->spacetype==SPACE_VIEW3D) {
+ View3D *vd= (View3D*) sl;
+ if(vd->bgpic) {
+ if(vd->bgpic->rect) MEM_freeN(vd->bgpic->rect);
+ if(vd->bgpic->ima) vd->bgpic->ima->id.us--;
+ MEM_freeN(vd->bgpic);
+ }
+ if(vd->localvd) MEM_freeN(vd->localvd);
+ if(G.vd==vd) G.vd= 0;
+ }
+ else if(sl->spacetype==SPACE_OOPS) {
+ free_oopspace((SpaceOops *)sl);
+ }
+ else if(sl->spacetype==SPACE_IMASEL) {
+ free_imasel((SpaceImaSel *)sl);
+ }
+ else if(sl->spacetype==SPACE_ACTION) {
+ free_actionspace((SpaceAction*)sl);
+ }
+ else if(sl->spacetype==SPACE_NLA){
+/* free_nlaspace((SpaceNla*)sl); */
+ }
+ else if(sl->spacetype==SPACE_TEXT) {
+ free_textspace((SpaceText *)sl);
+ }
+ else if(sl->spacetype==SPACE_SOUND) {
+ free_soundspace((SpaceSound *)sl);
+ }
+ }
+
+ BLI_freelistN(lb);
+}
+
+void duplicatespacelist(ScrArea *newarea, ListBase *lb1, ListBase *lb2)
+{
+ SpaceLink *sl;
+
+ duplicatelist(lb1, lb2);
+
+ /* lb1 is kopie van lb2, van lb2 geven we de filelist vrij */
+
+ sl= lb2->first;
+ while(sl) {
+ if(sl->spacetype==SPACE_FILE) {
+ SpaceFile *sfile= (SpaceFile*) sl;
+ sfile->libfiledata= 0;
+ sfile->filelist= 0;
+ }
+ else if(sl->spacetype==SPACE_OOPS) {
+ SpaceOops *so= (SpaceOops *)sl;
+ so->oops.first= so->oops.last= 0;
+ }
+ else if(sl->spacetype==SPACE_IMASEL) {
+ check_imasel_copy((SpaceImaSel *) sl);
+ }
+ else if(sl->spacetype==SPACE_TEXT) {
+ }
+ /* __PINFAKE */
+/* else if(sfile->spacetype==SPACE_ACTION) {
+ SpaceAction *sa= (SpaceAction *)sfile;
+ if (sa->flag & SACTION_PIN)
+ if (sa->action)
+ sa->action->id.us++;
+
+ }
+*/ /* end PINFAKE */
+
+ sl= sl->next;
+ }
+
+ sl= lb1->first;
+ while(sl) {
+ sl->area= newarea;
+
+ if(sl->spacetype==SPACE_BUTS) {
+ SpaceButs *buts= (SpaceButs *)sl;
+ buts->rect= 0;
+ }
+ else if(sl->spacetype==SPACE_IPO) {
+ SpaceIpo *si= (SpaceIpo *)sl;
+ si->editipo= 0;
+ si->ipokey.first= si->ipokey.last= 0;
+ }
+ else if(sl->spacetype==SPACE_VIEW3D) {
+ View3D *vd= (View3D *)sl;
+ if(vd->bgpic) {
+ vd->bgpic= MEM_dupallocN(vd->bgpic);
+ vd->bgpic->rect= 0;
+ if(vd->bgpic->ima) vd->bgpic->ima->id.us++;
+ }
+ }
+ sl= sl->next;
+ }
+
+ /* nog een keer: van oude View3D de localview restoren (ivm full) */
+ sl= lb2->first;
+ while(sl) {
+ if(sl->spacetype==SPACE_VIEW3D) {
+ View3D *v3d= (View3D*) sl;
+ if(v3d->localvd) {
+ restore_localviewdata(v3d);
+ v3d->localvd= 0;
+ v3d->localview= 0;
+ v3d->lay &= 0xFFFFFF;
+ }
+ }
+ sl= sl->next;
+ }
+}
+
+/* wordt overal aangeroepen */
+void allqueue(unsigned short event, short val)
+{
+ ScrArea *sa;
+ View3D *v3d;
+ SpaceButs *buts;
+ SpaceFile *sfile;
+
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(event==REDRAWALL) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ else if(sa->win != val) {
+ switch(event) {
+
+ case REDRAWHEADERS:
+ scrarea_queue_headredraw(sa);
+ break;
+ case REDRAWVIEW3D:
+ if(sa->spacetype==SPACE_VIEW3D) {
+ scrarea_queue_winredraw(sa);
+ if(val) scrarea_queue_headredraw(sa);
+ }
+ break;
+ case REDRAWVIEW3D_Z:
+ if(sa->spacetype==SPACE_VIEW3D) {
+ v3d= sa->spacedata.first;
+ if(v3d->drawtype==OB_SOLID) {
+ scrarea_queue_winredraw(sa);
+ if(val) scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWVIEWCAM:
+ if(sa->spacetype==SPACE_VIEW3D) {
+ v3d= sa->spacedata.first;
+ if(v3d->persp>1) scrarea_queue_winredraw(sa);
+ }
+ break;
+ case REDRAWINFO:
+ if(sa->spacetype==SPACE_INFO) {
+ scrarea_queue_headredraw(sa);
+ }
+ break;
+ case REDRAWIMAGE:
+ if(sa->spacetype==SPACE_IMAGE) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ break;
+ case REDRAWIPO:
+ if(sa->spacetype==SPACE_IPO) {
+ SpaceIpo *si;
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ if(val) {
+ si= sa->spacedata.first;
+ if (!G.sipo->pin)
+ si->blocktype= val;
+ }
+ }
+ else if(sa->spacetype==SPACE_OOPS) {
+ scrarea_queue_winredraw(sa);
+ }
+
+ break;
+
+ case REDRAWBUTSALL:
+ if(sa->spacetype==SPACE_BUTS) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ break;
+ case REDRAWBUTSHEAD:
+ if(sa->spacetype==SPACE_BUTS) {
+ scrarea_queue_headredraw(sa);
+ }
+ break;
+ case REDRAWBUTSVIEW:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_VIEW) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSLAMP:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_LAMP) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSMAT:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_MAT) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSTEX:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_TEX) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSANIM:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_ANIM) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSWORLD:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_WORLD) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSRENDER:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_RENDER) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSEDIT:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_EDIT) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSGAME:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if ELEM(buts->mainb, BUTS_GAME, BUTS_FPAINT) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSRADIO:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_RADIO) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSSCRIPT:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_SCRIPT) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSSOUND:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_SOUND) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWBUTSCONSTRAINT:
+ if(sa->spacetype==SPACE_BUTS) {
+ buts= sa->spacedata.first;
+ if(buts->mainb==BUTS_CONSTRAINT) {
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ }
+ break;
+ case REDRAWDATASELECT:
+ if(sa->spacetype==SPACE_FILE) {
+ sfile= sa->spacedata.first;
+ if(sfile->type==FILE_MAIN) {
+ freefilelist(sfile);
+ scrarea_queue_winredraw(sa);
+ }
+ }
+ else if(sa->spacetype==SPACE_OOPS) {
+ scrarea_queue_winredraw(sa);
+ }
+ break;
+ case REDRAWSEQ:
+ if(sa->spacetype==SPACE_SEQ) {
+ addqueue(sa->win, CHANGED, 1);
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ break;
+ case REDRAWOOPS:
+ if(sa->spacetype==SPACE_OOPS) {
+ scrarea_queue_winredraw(sa);
+ }
+ break;
+ case REDRAWNLA:
+ if(sa->spacetype==SPACE_NLA) {
+ scrarea_queue_headredraw(sa);
+ scrarea_queue_winredraw(sa);
+ }
+ case REDRAWACTION:
+ if(sa->spacetype==SPACE_ACTION) {
+ scrarea_queue_headredraw(sa);
+ scrarea_queue_winredraw(sa);
+ }
+ break;
+ case REDRAWTEXT:
+ if(sa->spacetype==SPACE_TEXT) {
+ scrarea_queue_winredraw(sa);
+ }
+ break;
+ case REDRAWSOUND:
+ if(sa->spacetype==SPACE_SOUND) {
+ scrarea_queue_headredraw(sa);
+ scrarea_queue_winredraw(sa);
+ }
+ break;
+ }
+ }
+ sa= sa->next;
+ }
+}
+
+void allspace(unsigned short event, short val)
+{
+ bScreen *sc;
+
+ sc= G.main->screen.first;
+ while(sc) {
+ ScrArea *sa= sc->areabase.first;
+ while(sa) {
+ SpaceLink *sl= sa->spacedata.first;
+ while(sl) {
+ switch(event) {
+ case REMAKEALLIPO:
+ {
+ Ipo *ipo;
+ IpoCurve *icu;
+
+ /* Go to each ipo */
+ for (ipo=G.main->ipo.first; ipo; ipo=ipo->id.next){
+ for (icu = ipo->curve.first; icu; icu=icu->next){
+ sort_time_ipocurve(icu);
+ testhandles_ipocurve(icu);
+ }
+ }
+ }
+ break;
+ case REMAKEIPO:
+ if(sl->spacetype==SPACE_IPO) {
+ SpaceIpo *si= (SpaceIpo *)sl;
+ {
+ if(si->editipo) MEM_freeN(si->editipo);
+ si->editipo= 0;
+ free_ipokey(&si->ipokey);
+ }
+ }
+ break;
+
+ case OOPS_TEST:
+ if(sl->spacetype==SPACE_OOPS) {
+ SpaceOops *so= (SpaceOops *)sl;
+ so->flag |= SO_TESTBLOCKS;
+ }
+ break;
+ }
+
+ sl= sl->next;
+ }
+ sa= sa->next;
+ }
+ sc= sc->id.next;
+ }
+}
+
+
+void force_draw()
+{
+ /* alle area's die (ongeveer) zelfde laten zien als curarea */
+ ScrArea *tempsa, *sa;
+
+ scrarea_do_windraw(curarea);
+
+ tempsa= curarea;
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(sa!=tempsa && sa->spacetype==tempsa->spacetype) {
+ if(sa->spacetype==SPACE_VIEW3D) {
+ if( ((View3D *)sa->spacedata.first)->lay & ((View3D *)tempsa->spacedata.first)->lay) {
+ areawinset(sa->win);
+ scrarea_do_windraw(sa);
+ }
+ }
+ else if(sa->spacetype==SPACE_IPO) {
+ areawinset(sa->win);
+ scrarea_do_windraw(sa);
+ }
+ else if(sa->spacetype==SPACE_SEQ) {
+ areawinset(sa->win);
+ scrarea_do_windraw(sa);
+ }
+ else if(sa->spacetype==SPACE_ACTION) {
+ areawinset(sa->win);
+ scrarea_do_windraw(sa);
+ }
+ }
+ sa= sa->next;
+ }
+ if(curarea!=tempsa) areawinset(tempsa->win);
+
+ screen_swapbuffers();
+
+}
+
+void force_draw_plus(int type)
+{
+ /* alle area's die (ongeveer) zelfde laten zien als curarea EN areas van 'type' */
+ ScrArea *tempsa, *sa;
+
+ scrarea_do_windraw(curarea);
+
+ tempsa= curarea;
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(sa!=tempsa && (sa->spacetype==tempsa->spacetype || sa->spacetype==type)) {
+ if(ELEM5(sa->spacetype, SPACE_VIEW3D, SPACE_IPO, SPACE_SEQ, SPACE_BUTS, SPACE_ACTION)) {
+ areawinset(sa->win);
+ scrarea_do_windraw(sa);
+ }
+ }
+ sa= sa->next;
+ }
+ if(curarea!=tempsa) areawinset(tempsa->win);
+
+ screen_swapbuffers();
+}
+
+void force_draw_all(void)
+{
+ /* alle area's die (ongeveer) zelfde laten zien als curarea EN areas van 'type' */
+ ScrArea *tempsa, *sa;
+
+ drawscreen();
+
+ tempsa= curarea;
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(sa->headwin) {
+ scrarea_do_headdraw(sa);
+ scrarea_do_headchange(sa);
+ }
+ if(sa->win) {
+ scrarea_do_windraw(sa);
+ }
+ sa= sa->next;
+ }
+ if(curarea!=tempsa) areawinset(tempsa->win);
+
+ screen_swapbuffers();
+}
+
+/***/
+
+SpaceType *spaceaction_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Action");
+ spacetype_set_winfuncs(st, drawactionspace, changeview2d, winqreadactionspace);
+ }
+
+ return st;
+}
+SpaceType *spacebuts_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Buts");
+ spacetype_set_winfuncs(st, drawbutspace, changebutspace, winqreadbutspace);
+ }
+
+ return st;
+}
+SpaceType *spacefile_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("File");
+ spacetype_set_winfuncs(st, drawfilespace, NULL, winqreadfilespace);
+ }
+
+ return st;
+}
+SpaceType *spaceimage_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Image");
+ spacetype_set_winfuncs(st, drawimagespace, NULL, winqreadimagespace);
+ }
+
+ return st;
+}
+SpaceType *spaceimasel_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Imasel");
+ spacetype_set_winfuncs(st, drawimasel, NULL, winqreadimasel);
+ }
+
+ return st;
+}
+SpaceType *spaceinfo_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Info");
+ spacetype_set_winfuncs(st, drawinfospace, NULL, winqreadinfospace);
+ }
+
+ return st;
+}
+SpaceType *spaceipo_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Ipo");
+ spacetype_set_winfuncs(st, drawipo, changeview2d, winqreadipo);
+ }
+
+ return st;
+}
+SpaceType *spacenla_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Nla");
+ spacetype_set_winfuncs(st, drawnlaspace, changeview2d, winqreadnlaspace);
+ }
+
+ return st;
+}
+SpaceType *spaceoops_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Oops");
+ spacetype_set_winfuncs(st, drawoopsspace, changeview2d, winqreadoopsspace);
+ }
+
+ return st;
+}
+SpaceType *spaceseq_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Sequence");
+ spacetype_set_winfuncs(st, drawseqspace, changeview2d, winqreadsequence);
+ }
+
+ return st;
+}
+SpaceType *spacesound_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Sound");
+ spacetype_set_winfuncs(st, drawsoundspace, NULL, winqreadsoundspace);
+ }
+
+ return st;
+}
+SpaceType *spacetext_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("Text");
+ spacetype_set_winfuncs(st, drawtextspace, NULL, winqreadtextspace);
+ }
+
+ return st;
+}
+SpaceType *spaceview3d_get_type(void)
+{
+ static SpaceType *st= NULL;
+
+ if (!st) {
+ st= spacetype_new("View3D");
+ spacetype_set_winfuncs(st, drawview3d, changeview3d, winqread3d);
+ }
+
+ return st;
+}