This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/src/space.c
Campbell Barton 960eaed6cd added an option to adjust the alpha clipping value in the oprnGL preferenes. in some cases you might
want to use 0.5 to see through more of the texture. (less halo's with clipmaps), defailt is 0.0 so it 
will only clip 0 alpha.
2007-10-20 18:01:57 +00:00

6546 lines
171 KiB
C

/**
* $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 *****
*
*
* - here initialize and free and handling SPACE data
*/
#include <string.h>
#include <stdio.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "MEM_guardedalloc.h"
#include "MEM_CacheLimiterC-Api.h"
#ifdef INTERNATIONAL
#include "BIF_language.h"
#endif
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_gsqueue.h"
#include "BLI_linklist.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
#include "DNA_group_types.h" /* used for select_same_group */
#include "DNA_image_types.h"
#include "DNA_ipo_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h" /* used for select grouped hooks */
#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_colortools.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_ipo.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
#include "BKE_scene.h"
#include "BKE_utildefines.h"
#include "BKE_image.h" /* for IMA_TYPE_COMPOSITE and IMA_TYPE_R_RESULT */
#include "BIF_spacetypes.h" /* first, nasty dependency with typedef */
#include "BIF_butspace.h"
#include "BIF_drawimage.h"
#include "BIF_drawseq.h"
#include "BIF_drawtext.h"
#include "BIF_drawscript.h"
#include "BIF_editarmature.h"
#include "BIF_editconstraint.h"
#include "BIF_editdeform.h"
#include "BIF_editfont.h"
#include "BIF_editgroup.h"
#include "BIF_editkey.h"
#include "BIF_editlattice.h"
#include "BIF_editmesh.h"
#include "BIF_editmode_undo.h"
#include "BIF_editnla.h"
#include "BIF_editoops.h"
#include "BIF_editseq.h"
#include "BIF_editsima.h"
#include "BIF_editsound.h"
#include "BIF_editview.h"
#include "BIF_filelist.h"
#include "BIF_gl.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_interface_icons.h"
#include "BIF_meshtools.h"
#include "BIF_mywindow.h"
#include "BIF_oops.h"
#include "BIF_poseobject.h"
#include "BIF_outliner.h"
#include "BIF_resources.h"
#include "BIF_retopo.h"
#include "BIF_screen.h"
#include "BIF_space.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 "BSE_time.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 "BDR_drawobject.h"
#include "BDR_imagepaint.h"
#include "BDR_sculptmode.h"
#include "BDR_unwrapper.h"
#include "BLO_readfile.h" /* for BLO_blendhandle_close */
#include "PIL_time.h"
#include "BPY_extern.h"
#include "butspace.h"
#include "mydevice.h"
#include "blendef.h"
#include "datatoc.h"
#include "multires.h"
#include "BIF_transform.h"
#include "BKE_depsgraph.h"
#include "BSE_trans_types.h"
#include "SYS_System.h" /* for the user def menu ... should move elsewhere. */
/* maybe we need this defined somewhere else */
extern void StartKetsjiShell(ScrArea *area, char* startscenename, struct Main* maggie, struct SpaceIpo* sipo,int always_use_expand_framing);
extern void StartKetsjiShellSimulation(ScrArea *area, char* startscenename, struct Main* maggie, struct SpaceIpo* sipo,int always_use_expand_framing);/*rcruiz*/
/**
* When the mipmap setting changes, we want to redraw the view right
* away to reflect this setting.
*/
void space_mipmap_button_function(int event);
void free_soundspace(SpaceSound *ssound);
/* *************************************** */
/* don't know yet how the handlers will evolve, for simplicity
i choose for an array with eventcodes, this saves in a file!
*/
void add_blockhandler(ScrArea *sa, short eventcode, short val)
{
SpaceLink *sl= sa->spacedata.first;
short a;
/* find empty spot */
for(a=0; a<SPACE_MAXHANDLER; a+=2) {
if( sl->blockhandler[a]==eventcode ) {
sl->blockhandler[a+1]= val;
break;
}
else if( sl->blockhandler[a]==0) {
sl->blockhandler[a]= eventcode;
sl->blockhandler[a+1]= val;
break;
}
}
if(a==SPACE_MAXHANDLER) printf("error; max (4) blockhandlers reached!\n");
}
void rem_blockhandler(ScrArea *sa, short eventcode)
{
SpaceLink *sl= sa->spacedata.first;
short a;
for(a=0; a<SPACE_MAXHANDLER; a+=2) {
if( sl->blockhandler[a]==eventcode) {
sl->blockhandler[a]= 0;
/* specific free calls */
if(eventcode==IMAGE_HANDLER_PREVIEW)
image_preview_event(0);
break;
}
}
}
void toggle_blockhandler(ScrArea *sa, short eventcode, short val)
{
SpaceLink *sl= sa->spacedata.first;
short a, addnew=1;
/* find if it exists */
for(a=0; a<SPACE_MAXHANDLER; a+=2) {
if( sl->blockhandler[a]==eventcode ) {
sl->blockhandler[a]= 0;
/* specific free calls */
if(eventcode==VIEW3D_HANDLER_PREVIEW)
BIF_view3d_previewrender_free(sa->spacedata.first);
else if(eventcode==IMAGE_HANDLER_PREVIEW)
image_preview_event(0);
addnew= 0;
}
}
if(addnew) {
add_blockhandler(sa, eventcode, val);
/* specific add new calls */
if(eventcode==IMAGE_HANDLER_PREVIEW)
image_preview_event(1);
}
}
/* ************* SPACE: VIEW3D ************* */
/* extern void drawview3dspace(ScrArea *sa, void *spacedata); BSE_drawview.h */
void copy_view3d_lock(short val)
{
bScreen *sc;
int bit;
/* from G.scene copy to the other views */
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) {
if(sa->win) scrarea_queue_redraw(sa);
}
}
}
sl= sl->next;
}
sa= sa->next;
}
}
sc= sc->id.next;
}
}
void handle_view3d_around()
{
bScreen *sc;
if ((U.uiflag & USER_LOCKAROUND)==0) return;
/* copies from G.vd->around to other view3ds */
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_VIEW3D) {
View3D *vd= (View3D*) sl;
if (vd != G.vd) {
vd->around= G.vd->around;
if (G.vd->flag & V3D_ALIGN)
vd->flag |= V3D_ALIGN;
else
vd->flag &= ~V3D_ALIGN;
scrarea_queue_headredraw(sa);
}
}
sl= sl->next;
}
sa= sa->next;
}
}
sc= sc->id.next;
}
}
void handle_view3d_lock()
{
if (G.vd != NULL && curarea != NULL ) {
if(G.vd->localview==0 && G.vd->scenelock && curarea->spacetype==SPACE_VIEW3D) {
/* copy to scene */
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 & USER_VERTEX_ARRAYS);
SYS_WriteCommandLineInt(syshandle, "vertexarrays", a);
a= (U.gameflags & USER_DISABLE_SOUND);
SYS_WriteCommandLineInt(syshandle, "noaudio", a);
a= (U.gameflags & USER_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_SHOW_PHYSICS);
SYS_WriteCommandLineInt(syshandle, "show_physics", a);
a= (G.fileflags & G_FILE_ENABLE_ALL_FRAMES);
SYS_WriteCommandLineInt(syshandle, "fixedtime", a);
a= (G.fileflags & G_FILE_GAME_TO_IPO);
SYS_WriteCommandLineInt(syshandle, "game2ipo", a);
a=(G.fileflags & G_FILE_GAME_MAT);
SYS_WriteCommandLineInt(syshandle, "blender_material", a);
a=(G.fileflags & G_FILE_DIAPLAY_LISTS);
SYS_WriteCommandLineInt(syshandle, "displaylists", a);
}
}
#if GAMEBLENDER == 1
/**
* 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.f & G_TEXTUREPAINT)
texpaint_enable_mipmap();
if(G.scene->camera==0 || G.scene->camera->type!=OB_CAMERA)
error("no (correct) camera");
waitcursor(1);
}
static void RestoreState(void)
{
if(G.f & G_TEXTUREPAINT)
texpaint_disable_mipmap();
curarea->win_swap = 0;
curarea->head_swap=0;
allqueue(REDRAWVIEW3D, 1);
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*) (long) sc->r.cfra);
/* why is this reset to 1 ?*/
/* 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= (long) sc_store->link;
sc->r.cfra= stored_cfra;
set_scene_bg(sc);
sc_store= sc_store->next;
}
BLI_linklist_free(storelist, NULL);
}
#endif
void start_game(void)
{
#if GAMEBLENDER == 1
#ifndef NO_KETSJI
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
* Note: yes, this is all very badly hacked! (ton)
*/
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();
/* game engine will do its own sounds. */
sound_stop_all_sounds();
sound_exit_audio();
/* Before jumping into Ketsji, we configure some settings. */
space_set_commmandline_options();
SaveState();
StartKetsjiShell(curarea, startscene->id.name+2, G.main,G.sipo, 1);
RestoreState();
/* Restart BPY - unload the game engine modules. */
BPY_end_python();
BPY_start_python(0, NULL); /* argc, argv stored there already */
BPY_post_start_python(); /* userpref path and menus init */
restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(startscene);
scene_update_for_newframe(G.scene, G.scene->lay);
if (G.flags & G_FILE_AUTOPLAY)
exit_usiblender();
/* groups could have changed ipo */
allqueue(REDRAWNLA, 0);
allqueue(REDRAWACTION, 0);
allspace(REMAKEIPO, 0);
allqueue(REDRAWIPO, 0);
#endif
#else
notice("Game engine is disabled in this release!");
#endif
}
void start_RBSimulation(void)
{
#if GAMEBLENDER == 1
#ifndef NO_KETSJI
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
* Note: yes, this is all very badly hacked! (ton)
*/
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();
/* game engine will do its own sounds. */
sound_stop_all_sounds();
sound_exit_audio();
/* Before jumping into Ketsji, we configure some settings. */
space_set_commmandline_options();
SaveState();
StartKetsjiShellSimulation(curarea, startscene->id.name+2, G.main,G.sipo, 1);
RestoreState();
/* Restart BPY - unload the game engine modules. */
BPY_end_python();
BPY_start_python(0, NULL); /* argc, argv stored there already */
BPY_post_start_python(); /* userpref path and menus init */
restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(startscene);
scene_update_for_newframe(G.scene, G.scene->lay);
if (G.flags & G_FILE_AUTOPLAY)
exit_usiblender();
/* groups could have changed ipo */
allqueue(REDRAWNLA, 0);
allqueue(REDRAWACTION, 0);
allspace(REMAKEIPO, 0);
allqueue(REDRAWIPO, 0);
#endif
#else
notice("YOU NEED GAME ENGIEN TO RUN THE SIMULATION!");
#endif
}
static void changeview3dspace(ScrArea *sa, void *spacedata)
{
setwinmatrixview3d(sa->winx, sa->winy, NULL); /* 0= no 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 (Ctrl flips)%t|To Selected (top)%x3|To Selected (front)%x2|To Selected (side)%x1");
if (nr!=-1) {
int axis= nr;
/* opposite axis in case ctrl is pressed */
if(G.qual==LR_CTRLKEY) axis= -axis;
if ((G.obedit) && (G.obedit->type == OB_MESH)) {
editmesh_align_view_to_selected(v3d, axis);
addqueue(v3d->area->win, REDRAW, 1);
} else if (FACESEL_PAINT_TEST) {
Object *obact= OBACT;
if (obact && obact->type==OB_MESH) {
Mesh *me= obact->data;
faceselect_align_view_to_selected(v3d, me, axis);
addqueue(v3d->area->win, REDRAW, 1);
}
}
}
}
static short select_children(Object *ob, int recursive)
{
short changed = 0;
Base *base;
for (base= FIRSTBASE; base; base= base->next) {
if (ob == base->object->parent) {
if (BASE_SELECTABLE(base) && !(base->flag & SELECT)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
if (recursive)
changed |= select_children(base->object, 1);
}
}
return changed;
}
static short select_parent(void) /* Makes parent active and de-selected OBACT */
{
short changed = 0;
Base *base, *startbase, *basact=NULL, *oldbasact;
if (!(OBACT) || !(OBACT->parent)) return 0;
BASACT->flag &= (~SELECT);
BASACT->object->flag &= (~SELECT);
startbase= FIRSTBASE;
if(BASACT && BASACT->next) startbase= BASACT->next;
base = startbase;
while(base) {
if(base->object==BASACT->object->parent) { basact=base; break; }
base=base->next;
if(base==NULL) base= FIRSTBASE;
if(base==startbase) break;
}
/* can be NULL if parent in other scene */
if(basact && BASE_SELECTABLE(basact)) {
oldbasact = BASACT;
BASACT = basact;
basact->flag |= SELECT;
basact->object->flag= basact->flag;
set_active_base(basact);
changed = 1;
}
return changed;
}
#define GROUP_MENU_MAX 24
static short select_same_group(Object *ob) /* Select objects in the same group as the active */
{
short changed = 0;
Base *base;
Group *group, *ob_groups[GROUP_MENU_MAX];
char str[10 + (24*GROUP_MENU_MAX)];
char *p = str;
int group_count=0, menu, i;
if (!ob)
return 0;
for ( group=G.main->group.first;
group && group_count < GROUP_MENU_MAX;
group=group->id.next
) {
if (object_in_group (ob, group)) {
ob_groups[group_count] = group;
group_count++;
}
}
if (!group_count)
return 0;
else if (group_count == 1) {
group = ob_groups[0];
for (base= FIRSTBASE; base; base= base->next) {
if (BASE_SELECTABLE(base) && !(base->flag & SELECT) && object_in_group(base->object, group)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
}
return changed;
}
/* build the menu. */
p += sprintf(str, "Groups%%t");
for (i=0; i<group_count; i++) {
group = ob_groups[i];
p += sprintf (p, "|%s%%x%i", group->id.name+2, i);
}
menu = pupmenu (str);
if (menu == -1)
return 0;
group = ob_groups[menu];
for (base= FIRSTBASE; base; base= base->next) {
if (!(base->flag & SELECT) && object_in_group(base->object, group)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
}
return changed;
}
static short select_object_hooks(Object *ob)
{
short changed = 0;
Base *base;
ModifierData *md;
HookModifierData *hmd;
if (!ob)
return 0;
for (md = ob->modifiers.first; md; md=md->next) {
if (md->type==eModifierType_Hook) {
hmd= (HookModifierData*) md;
if (hmd->object && !(hmd->object->flag & SELECT)) {
base= object_in_scene(hmd->object, G.scene);
if (base && BASE_SELECTABLE(base)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
}
}
}
return changed;
}
/* Select objects woth the same parent as the active (siblings),
* parent can be NULL also */
static short select_same_parent(Object *ob)
{
short changed = 0;
Base *base;
if (!ob)
return 0;
for (base= FIRSTBASE; base; base= base->next) {
if (BASE_SELECTABLE(base) && (base->object->parent==ob->parent) && !(base->flag & SELECT)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
}
return changed;
}
static short select_same_type(Object *ob)
{
short changed = 0;
Base *base;
if (!ob)
return 0;
for (base= FIRSTBASE; base; base= base->next) {
if (BASE_SELECTABLE(base) && (base->object->type == ob->type) && !(base->flag & SELECT)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
}
return changed;
}
static short select_same_layer(Object *ob)
{
char changed = 0;
Base *base = FIRSTBASE;
if (!ob)
return 0;
while(base) {
if (BASE_SELECTABLE(base) && (base->lay & ob->lay) && !(base->flag & SELECT)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
base= base->next;
}
return changed;
}
static short select_same_index_object(Object *ob)
{
char changed = 0;
Base *base = FIRSTBASE;
if (!ob)
return 0;
while(base) {
if (BASE_SELECTABLE(base) && (base->object->index == ob->index) && !(base->flag & SELECT)) {
base->flag |= SELECT;
base->object->flag |= SELECT;
changed = 1;
}
base= base->next;
}
return changed;
}
void select_object_grouped(short nr)
{
short changed = 0;
if(nr==1) changed = select_children(OBACT, 1);
else if(nr==2) changed = select_children(OBACT, 0);
else if(nr==3) changed = select_parent();
else if(nr==4) changed = select_same_parent(OBACT);
else if(nr==5) changed = select_same_type(OBACT);
else if(nr==6) changed = select_same_layer(OBACT);
else if(nr==7) changed = select_same_group(OBACT);
else if(nr==8) changed = select_object_hooks(OBACT);
else if(nr==9) changed = select_same_index_object(OBACT);
if (changed) {
countall();
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSOBJECT, 0);
allspace(REMAKEIPO, 0);
allqueue(REDRAWIPO, 0);
BIF_undo_push("Select Grouped");
}
}
static void select_object_grouped_menu(void)
{
char *str;
short nr;
/* make menu string */
str= MEM_mallocN(512, "groupmenu");
strcpy(str, "Select Grouped%t|Children%x1|"
"Immediate Children%x2|Parent%x3|"
"Siblings (Shared Parent)%x4|"
"Objects of Same Type%x5|"
"Objects on Shared Layers%x6|"
"Objects in Same Group%x7|"
"Object Hooks%x8|Object PassIndex%x9");
/* here we go */
nr= pupmenu(str);
MEM_freeN(str);
select_object_grouped(nr);
}
void join_menu(void)
{
Object *ob= OBACT;
if (G.obedit) {
error("This data does not support joining in editmode");
return;
}
if (!ob) {
error("Can't join unless there is an active object");
return;
}
if(ob->type == OB_MESH) {
if(okee("Join selected meshes")==0) return;
join_mesh();
} else if(ob->type == OB_CURVE) {
if(okee("Join selected curves")==0) return;
join_curve(OB_CURVE);
} else if(ob->type == OB_SURF) {
if(okee("Join selected NURBS")==0) return;
join_curve(OB_SURF);
} else if(ob->type == OB_ARMATURE) {
/* Make sure the user wants to continue*/
if(okee("Join selected armatures")==0) return;
join_armature ();
} else {
error("This object type doesn't support joining");
}
}
static unsigned short convert_for_nonumpad(unsigned short event)
{
if (event>=ZEROKEY && event<=NINEKEY) {
return event - ZEROKEY + PAD0;
} else if (event==MINUSKEY) {
return PADMINUS;
} else if (event==EQUALKEY) {
return PADPLUSKEY;
} else if (event==BACKSLASHKEY) {
return PADSLASHKEY;
} else {
return event;
}
}
/* *************** */
void BIF_undo_push(char *str)
{
if(G.obedit) {
if (U.undosteps == 0) return;
if(G.obedit->type==OB_MESH)
undo_push_mesh(str);
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
undo_push_curve(str);
else if (G.obedit->type==OB_FONT)
undo_push_font(str);
else if (G.obedit->type==OB_MBALL)
undo_push_mball(str);
else if (G.obedit->type==OB_LATTICE)
undo_push_lattice(str);
else if (G.obedit->type==OB_ARMATURE)
undo_push_armature(str);
}
else {
if(U.uiflag & USER_GLOBALUNDO)
BKE_write_undo(str);
}
}
void BIF_undo(void)
{
if(G.obedit) {
if ELEM7(G.obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE)
undo_editmode_step(1);
}
else {
if(G.f & G_TEXTUREPAINT)
imagepaint_undo();
else if(curarea->spacetype==SPACE_IMAGE && (G.sima->flag & SI_DRAWTOOL))
imagepaint_undo();
else {
/* now also in faceselect mode */
if(U.uiflag & USER_GLOBALUNDO) {
BKE_undo_step(1);
sound_initialize_sounds();
}
}
}
}
void BIF_redo(void)
{
if(G.obedit) {
if ELEM7(G.obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE)
undo_editmode_step(-1);
}
else {
if(G.f & G_TEXTUREPAINT)
imagepaint_undo();
else if(curarea->spacetype==SPACE_IMAGE && (G.sima->flag & SI_DRAWTOOL))
imagepaint_undo();
else {
/* includes faceselect now */
if(U.uiflag & USER_GLOBALUNDO) {
BKE_undo_step(-1);
sound_initialize_sounds();
}
}
}
}
void BIF_undo_menu(void)
{
if(G.obedit) {
if ELEM7(G.obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE)
undo_editmode_menu();
allqueue(REDRAWALL, 0);
}
else {
if(U.uiflag & USER_GLOBALUNDO) {
char *menu= BKE_undo_menu_string();
if(menu) {
short event= pupmenu_col(menu, 20);
MEM_freeN(menu);
if(event>0) BKE_undo_number(event);
}
}
}
}
/* *************** */
void handle_view_middlemouse() {
/* use '&' here, because of alt+leftmouse which emulates middlemouse */
if(U.flag & USER_VIEWMOVE) {
if((G.qual==LR_SHIFTKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_SHIFTKEY))))
viewmove(0);
else if((G.qual==LR_CTRLKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_CTRLKEY))))
viewmove(2);
else if((G.qual==0) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==LR_ALTKEY)))
viewmove(1);
}
else {
if((G.qual==LR_SHIFTKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_SHIFTKEY))))
viewmove(1);
else if((G.qual==LR_CTRLKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_CTRLKEY))))
viewmove(2);
else if((G.qual==0) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==LR_ALTKEY)))
viewmove(0);
}
}
void handle_view_wheelup()
{
/* Regular: Zoom in */
/* Shift: Scroll up */
/* Ctrl: Scroll right */
/* Alt-Shift: Rotate up */
/* Alt-Ctrl: Rotate right */
if( G.qual & LR_SHIFTKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_SHIFTKEY;
persptoetsen(PAD2);
G.qual |= LR_SHIFTKEY;
} else {
persptoetsen(PAD2);
}
} else if( G.qual & LR_CTRLKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_CTRLKEY;
persptoetsen(PAD4);
G.qual |= LR_CTRLKEY;
} else {
persptoetsen(PAD4);
}
} else if(U.uiflag & USER_WHEELZOOMDIR)
persptoetsen(PADMINUS);
else
persptoetsen(PADPLUSKEY);
}
void handle_view_wheeldown()
{
/* Regular: Zoom out */
/* Shift: Scroll down */
/* Ctrl: Scroll left */
/* Alt-Shift: Rotate down */
/* Alt-Ctrl: Rotate left */
if( G.qual & LR_SHIFTKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_SHIFTKEY;
persptoetsen(PAD8);
G.qual |= LR_SHIFTKEY;
} else {
persptoetsen(PAD8);
}
} else if( G.qual & LR_CTRLKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_CTRLKEY;
persptoetsen(PAD6);
G.qual |= LR_CTRLKEY;
} else {
persptoetsen(PAD6);
}
} else if(U.uiflag & USER_WHEELZOOMDIR)
persptoetsen(PADPLUSKEY);
else
persptoetsen(PADMINUS);
}
int mouse_in_header(ScrArea *sa)
{
short mouse[2];
getmouseco_sc(mouse);
return mouse[0] >= sa->headrct.xmin &&
mouse[0] <= sa->headrct.xmax &&
mouse[1] >= sa->headrct.ymin &&
mouse[1] <= sa->headrct.ymax;
}
static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
View3D *v3d= sa->spacedata.first;
Object *ob= OBACT; /* do not change! */
float *curs;
int doredraw= 0, pupval;
unsigned short event= evt->event;
short val= evt->val;
char ascii= evt->ascii;
if(curarea->win==0) return; /* when it comes from sa->headqread() */
if(val) {
if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
if(event==UI_BUT_EVENT) do_butspace(val); /* temporal, view3d deserves own queue? */
/* we consider manipulator a button, defaulting to leftmouse */
if(event==LEFTMOUSE) if(BIF_do_manipulator(sa)) return;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
/* only swap mouse button for selection, in modes where it is relevant.
* painting/sculpting stays on LEFTMOUSE */
if ( !((G.f & G_SCULPTMODE) || (G.f & G_WEIGHTPAINT) ||
(G.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT)) ||
(G.obedit) )
{
if (event==LEFTMOUSE) event = RIGHTMOUSE;
else if (event==RIGHTMOUSE) event = LEFTMOUSE;
}
}
if(!mouse_in_header(sa)) {
if(!G.obedit && (G.f & G_SCULPTMODE)) {
SculptSession *ss= sculpt_session();
if(ss && ss->propset) {
sculptmode_propset(event);
return;
}
else if(event!=LEFTMOUSE && event!=MIDDLEMOUSE && (event==MOUSEY || event==MOUSEX)) {
if(!bwin_qtest(sa->win))
allqueue(REDRAWVIEW3D, 0);
}
}
/* Handle retopo painting */
if(retopo_mesh_paint_check()) {
if(!retopo_paint(event))
return;
}
}
/* run any view3d event handler script links */
if (event && sa->scriptlink.totscript)
if (BPY_do_spacehandlers(sa, event, SPACEHANDLER_VIEW3D_EVENT))
return; /* return if event was processed (swallowed) by handler(s) */
/* TEXTEDITING?? */
if((G.obedit) && G.obedit->type==OB_FONT) {
switch(event) {
case LEFTMOUSE:
mouse_cursor();
break;
case MIDDLEMOUSE:
/* use '&' here, because of alt+leftmouse which emulates middlemouse */
if(U.flag & USER_VIEWMOVE) {
if((G.qual==LR_SHIFTKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_SHIFTKEY))))
viewmove(0);
else if((G.qual==LR_CTRLKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_CTRLKEY))))
viewmove(2);
else if((G.qual==0) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==LR_ALTKEY)))
viewmove(1);
}
else {
if((G.qual==LR_SHIFTKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_SHIFTKEY))))
viewmove(1);
else if((G.qual==LR_CTRLKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_CTRLKEY))))
viewmove(2);
else
viewmove(0);
}
break;
case WHEELUPMOUSE:
/* Regular: Zoom in */
/* Shift: Scroll up */
/* Ctrl: Scroll right */
/* Alt-Shift: Rotate up */
/* Alt-Ctrl: Rotate right */
if( G.qual & LR_SHIFTKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_SHIFTKEY;
persptoetsen(PAD2);
G.qual |= LR_SHIFTKEY;
} else {
persptoetsen(PAD2);
}
} else if( G.qual & LR_CTRLKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_CTRLKEY;
persptoetsen(PAD4);
G.qual |= LR_CTRLKEY;
} else {
persptoetsen(PAD4);
}
} else if(U.uiflag & USER_WHEELZOOMDIR)
persptoetsen(PADMINUS);
else
persptoetsen(PADPLUSKEY);
doredraw= 1;
break;
case WHEELDOWNMOUSE:
/* Regular: Zoom out */
/* Shift: Scroll down */
/* Ctrl: Scroll left */
/* Alt-Shift: Rotate down */
/* Alt-Ctrl: Rotate left */
if( G.qual & LR_SHIFTKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_SHIFTKEY;
persptoetsen(PAD8);
G.qual |= LR_SHIFTKEY;
} else {
persptoetsen(PAD8);
}
} else if( G.qual & LR_CTRLKEY ) {
if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_CTRLKEY;
persptoetsen(PAD6);
G.qual |= LR_CTRLKEY;
} else {
persptoetsen(PAD6);
}
} else if(U.uiflag & USER_WHEELZOOMDIR)
persptoetsen(PADPLUSKEY);
else
persptoetsen(PADMINUS);
doredraw= 1;
break;
case UKEY:
if(G.qual==LR_ALTKEY) {
remake_editText();
doredraw= 1;
}
else {
do_textedit(event, val, ascii);
}
break;
case VKEY:
if(G.qual==LR_ALTKEY) {
paste_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 if(!G.obedit && (G.f & G_SCULPTMODE)) {
SculptData *sd= sculpt_data();
SculptSession *ss= sculpt_session();
BrushData *br= sculptmode_brush();
Mesh *me= get_mesh(OBACT);
char update_prop= 0;
if(U.flag & USER_NONUMPAD) {
event= convert_for_nonumpad(event);
}
switch(event) {
case LEFTMOUSE:
if(G.qual==LR_SHIFTKEY+LR_CTRLKEY)
sculptmode_pmv(0);
else if(!(ss && ss->propset))
sculpt();
break;
/* View */
case MIDDLEMOUSE:
handle_view_middlemouse();
break;
case WHEELUPMOUSE:
handle_view_wheelup();
doredraw= 1;
break;
case WHEELDOWNMOUSE:
handle_view_wheeldown();
doredraw= 1;
break;
case RIGHTMOUSE:
if(G.qual==LR_SHIFTKEY+LR_CTRLKEY)
sculptmode_pmv(1);
break;
case CKEY:
if(G.qual==LR_SHIFTKEY) {
view3d_home(1);
curs= give_cursor();
curs[0]=curs[1]=curs[2]= 0.0;
allqueue(REDRAWVIEW3D, 0);
}
else if(G.qual==0) {
if (G.vd->persp==2)
/* center the camera offset */
G.vd->camdx= G.vd->camdy= 0.0;
else {
/*non camera center*/
float new_ofs[3];
curs= give_cursor();
new_ofs[0]= -curs[0];
new_ofs[1]= -curs[1];
new_ofs[2]= -curs[2];
smooth_view(G.vd, new_ofs, NULL, NULL, NULL);
}
}
doredraw= 1;
break;
case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
case PADPLUSKEY:
case PADMINUS:
case PADENTER:
persptoetsen(event);
doredraw= 1;
break;
case BKEY:
if(G.qual==LR_ALTKEY)
view3d_edit_clipping(v3d);
else if(G.qual==LR_SHIFTKEY) {
if(G.vd->persp==2)
set_render_border();
else
view3d_border_zoom();
}
break;
case PADSLASHKEY:
if(!G.qual) {
if(G.vd->localview) {
G.vd->localview= 0;
endlocalview(curarea);
}
else {
G.vd->localview= 1;
initlocalview();
}
allqueue(REDRAWVIEW3D, 1);
}
break;
/* Brush properties */
case AKEY:
br->airbrush= !br->airbrush;
update_prop= 1; break;
case FKEY:
if(G.qual==0)
sculptmode_propset_init(PropsetSize);
if(G.qual==LR_SHIFTKEY)
sculptmode_propset_init(PropsetStrength);
if(G.qual==LR_CTRLKEY)
sculptmode_propset_init(PropsetTexRot);
break;
case VKEY:
br->dir= br->dir==1 ? 2 : 1;
update_prop= 1; break;
/* Set brush */
case DKEY:
sd->brush_type= DRAW_BRUSH;
update_prop= 1; break;
case SKEY:
sd->brush_type= SMOOTH_BRUSH;
update_prop= 1; break;
case PKEY:
sd->brush_type= PINCH_BRUSH;
update_prop= 1; break;
case IKEY:
sd->brush_type= INFLATE_BRUSH;
update_prop= 1; break;
case GKEY:
sd->brush_type= GRAB_BRUSH;
update_prop= 1; break;
case LKEY:
sd->brush_type= LAYER_BRUSH;
update_prop= 1; break;
case TKEY:
sd->brush_type= FLATTEN_BRUSH;
update_prop= 1; break;
/* Symmetry */
case XKEY:
sd->symm^= SYMM_X;
update_prop= 1; break;
case YKEY:
sd->symm^= SYMM_Y;
update_prop= 1; break;
case ZKEY:
sd->symm^= SYMM_Z;
update_prop= 1; break;
/* Interface */
case NKEY:
if(G.qual==0) {
toggle_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_TO_MOUSE);
allqueue(REDRAWVIEW3D, 0);
}
break;
/* Multires */
case PAGEUPKEY:
if(me && me->mr) {
me->mr->newlvl= ((Mesh*)ob->data)->mr->current+1;
multires_set_level(ob, ob->data, 0);
}
break;
case PAGEDOWNKEY:
if(me && me->mr) {
me->mr->newlvl= ((Mesh*)ob->data)->mr->current-1;
multires_set_level(ob, ob->data, 0);
}
break;
/* Partial Visibility */
case HKEY:
if(G.qual==LR_ALTKEY) {
waitcursor(1);
sculptmode_pmv_off(get_mesh(ob));
BIF_undo_push("Partial mesh hide");
allqueue(REDRAWVIEW3D,0);
waitcursor(0);
}
break;
/* Layers */
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;
}
/* Redraw buttons window as well as view 3d (for floating panel) */
if(update_prop) {
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
}
} else {
if (U.flag & USER_NONUMPAD) {
event= convert_for_nonumpad(event);
}
switch(event) {
/* Afterqueue events */
case BACKBUFDRAW:
backdrawview3d(1);
break;
case RENDERPREVIEW:
BIF_view3d_previewrender(sa);
break;
case TABKEY:
/* Shift-Tabe handling (other cases are in toets) */
if (G.qual == LR_SHIFTKEY)
{
/* Snap toggle (only edit mesh right now) */
if (G.obedit && G.obedit->type==OB_MESH)
{
G.scene->snap_flag ^= SCE_SNAP;
allqueue(REDRAWHEADERS, 0);
}
}
break;
/* LEFTMOUSE and RIGHTMOUSE event codes can be swapped above,
* based on user preference USER_LMOUSESELECT
*/
case LEFTMOUSE:
if ((G.obedit) || !(G.f&(G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT))) {
mouse_cursor();
}
else if (G.f & G_WEIGHTPAINT) {
weight_paint();
}
else if (G.f & G_VERTEXPAINT) {
vertex_paint();
}
else if (G.f & G_TEXTUREPAINT) {
imagepaint_paint(L_MOUSE, 1);
}
break;
case MIDDLEMOUSE:
handle_view_middlemouse();
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.obedit && G.obedit->type==OB_MESH) && (G.qual == (LR_CTRLKEY|LR_ALTKEY)))
mouse_mesh(); /* loop select for 1 mousebutton dudes */
else if((G.obedit && G.obedit->type==OB_MESH) && (G.qual == (LR_CTRLKEY|LR_ALTKEY|LR_SHIFTKEY)))
mouse_mesh(); /* loop select for 1 mousebutton dudes */
else if(G.qual==LR_CTRLKEY)
mouse_select(); /* also allow in editmode, for vertex parenting */
else if(FACESEL_PAINT_TEST)
face_select();
else if( G.f & (G_VERTEXPAINT|G_TEXTUREPAINT))
sample_vpaint();
else
mouse_select(); /* does poses too */
break;
case WHEELUPMOUSE:
handle_view_wheelup();
doredraw= 1;
break;
case WHEELDOWNMOUSE:
handle_view_wheeldown();
doredraw= 1;
break;
case ONEKEY:
if(G.qual==LR_CTRLKEY) {
flip_subdivison(1);
}
else do_layer_buttons(0);
break;
case TWOKEY:
if(G.qual==LR_CTRLKEY) {
flip_subdivison(2);
}
else do_layer_buttons(1);
break;
case THREEKEY:
if(G.qual==LR_CTRLKEY) {
flip_subdivison(3);
}
else if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
if ( (G.obedit) && (G.obedit->type==OB_MESH) )
select_faces_by_numverts(3);
}
else do_layer_buttons(2);
break;
case FOURKEY:
if(G.qual==LR_CTRLKEY) {
flip_subdivison(4);
}
else if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
if ( (G.obedit) && (G.obedit->type==OB_MESH) )
select_faces_by_numverts(4);
}
else do_layer_buttons(3);
break;
case FIVEKEY:
if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
if ( (G.obedit) && (G.obedit->type==OB_MESH) )
select_faces_by_numverts(5);
}
else 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 SPACEKEY:
if(G.qual == LR_CTRLKEY) {
val= pupmenu("Manipulator%t|Enable/Disable|Translate|Rotate|Scale|Combo");
if(val>0) {
if(val==1) v3d->twflag ^= V3D_USE_MANIPULATOR;
else {
if(val==2) v3d->twtype= V3D_MANIP_TRANSLATE;
else if(val==3) v3d->twtype= V3D_MANIP_ROTATE;
else if(val==4) v3d->twtype= V3D_MANIP_SCALE;
else if(val==5) v3d->twtype= V3D_MANIP_TRANSLATE|V3D_MANIP_ROTATE|V3D_MANIP_SCALE;
v3d->twflag |= V3D_USE_MANIPULATOR;
}
doredraw= 1;
}
}
else if(G.qual == LR_ALTKEY) {
BIF_selectOrientation();
doredraw= 1;
}
break;
case AKEY:
if(G.qual & LR_CTRLKEY) apply_object(); /* also with shift! */
else if((G.qual==LR_SHIFTKEY)) {
toolbox_n_add();
}
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(1, 1); /* 1 == toggle */
}
else if (ob && (ob->flag & OB_POSEMODE)){
deselectall_posearmature(ob, 1, 1);
}
else {
if(FACESEL_PAINT_TEST) deselectall_tface();
else {
/* by design, the center of the active object
* (which need not necessarily by selected) will
* still be drawn as if it were selected.
*/
deselectall();
}
}
}
break;
case BKEY:
if(G.qual==LR_ALTKEY)
view3d_edit_clipping(v3d);
else if(G.qual==LR_SHIFTKEY)
{
if(G.vd->persp==2)
set_render_border();
else
view3d_border_zoom();
}
else if(G.qual==LR_CTRLKEY) {
if(okee("Bake all selected")) {
extern void softbody_bake(Object *ob);
extern void fluidsimBake(Object *ob);
softbody_bake(NULL);
/* also bake first domain of selected objects... */
fluidsimBake(NULL);
}
}
else if(G.qual== (LR_ALTKEY|LR_CTRLKEY))
objects_bake_render_menu();
else if(G.qual==0)
borderselect();
break;
case CKEY:
if(G.qual==LR_CTRLKEY) {
if(ob && (ob->flag & OB_POSEMODE))
pose_copy_menu(); /* poseobject.c */
else
copy_attr_menu();
}
else if(G.qual==LR_ALTKEY) {
if(ob && (ob->flag & OB_POSEMODE))
pose_clear_constraints(); /* poseobject.c */
else
convertmenu(); /* editobject.c */
}
else if(G.qual==(LR_ALTKEY|LR_CTRLKEY))
add_constraint(0); /* editconstraint.c, generic for objects and posemode */
else if((G.qual==LR_SHIFTKEY)) {
view3d_home(1);
curs= give_cursor();
curs[0]=curs[1]=curs[2]= 0.0;
allqueue(REDRAWVIEW3D, 0);
}
else if((G.obedit) && ELEM(G.obedit->type, OB_CURVE, OB_SURF) ) {
makecyclicNurb();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
}
else if((G.qual==0)){
if (G.vd->persp==2)
/* center the camera offset */
G.vd->camdx= G.vd->camdy= 0.0;
else {
/*non camera center*/
float new_ofs[3];
curs= give_cursor();
new_ofs[0]= -curs[0];
new_ofs[1]= -curs[1];
new_ofs[2]= -curs[2];
smooth_view(G.vd, new_ofs, NULL, NULL, NULL);
}
scrarea_queue_winredraw(curarea);
}
break;
case DKEY:
if((G.qual==LR_SHIFTKEY)) {
duplicate_context_selected();
}
else if(G.qual==LR_ALTKEY) {
if(ob && (ob->flag & OB_POSEMODE))
error ("Duplicate not possible in posemode.");
else if((G.obedit==NULL))
adduplicate(0, 0);
}
else if(G.qual==LR_CTRLKEY) {
imagestodisplist();
}
else if((G.qual==0)){
pupval= pupmenu("Draw mode%t|BoundBox %x1|Wire %x2|OpenGL Solid %x3|Shaded Solid %x4|Textured Solid %x5");
if(pupval>0) {
G.vd->drawtype= pupval;
doredraw= 1;
}
}
break;
case EKEY:
if (G.qual==0){
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(0);
}
}
else if (G.qual==LR_CTRLKEY) {
if(G.obedit && G.obedit->type==OB_MESH)
Edge_Menu();
else if (FACESEL_PAINT_TEST)
seam_mark_clear_tface(0);
}
else if (G.qual==LR_SHIFTKEY) {
if (G.obedit && G.obedit->type==OB_MESH &&
!multires_level1_test()) {
initTransform(TFM_CREASE, CTX_EDGE);
Transform();
}
else if (G.obedit && G.obedit->type==OB_ARMATURE) {
extrude_armature(1);
}
}
break;
case FKEY:
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
if(G.qual == LR_CTRLKEY)
Face_Menu();
else if((G.qual==LR_SHIFTKEY))
fill_mesh();
else if(G.qual==LR_ALTKEY)
beauty_fill();
else if(G.qual & (LR_CTRLKEY|LR_SHIFTKEY))
edge_flip();
else if (G.qual==0)
addedgeface_mesh();
else if ( G.qual ==
(LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
select_linked_flat_faces();
}
}
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)) {
if(ob && (ob->flag & OB_POSEMODE))
pose_activate_flipped_bone();
else if(G.f & G_WEIGHTPAINT)
pose_activate_flipped_bone();
else
fly();
}
else {
if (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT)){
G.f ^= G_FACESELECT;
allqueue(REDRAWVIEW3D, 1);
}
}
break;
case GKEY:
if((G.qual == LR_CTRLKEY)) {
if(G.obedit) {
if(ELEM(G.obedit->type, OB_MESH, OB_LATTICE))
vgroup_assign_with_menu();
}
else
group_operation_with_menu();
}
else if((G.qual == (LR_CTRLKEY|LR_SHIFTKEY))) {
if(G.obedit) {
if(ELEM(G.obedit->type, OB_MESH, OB_LATTICE))
vgroup_operation_with_menu();
}
}
else if((G.qual==LR_SHIFTKEY))
if(G.obedit) {
if(G.obedit->type==OB_MESH)
select_mesh_group_menu();
} else
select_object_grouped_menu();
else if((G.obedit==0) && G.qual==LR_ALTKEY) {
if(okee("Clear location")) {
clear_object('g');
}
}
else if(G.qual== (LR_CTRLKEY|LR_ALTKEY)) {
v3d->twtype= V3D_MANIP_TRANSLATE;
doredraw= 1;
}
else if((G.qual==0)) {
initTransform(TFM_TRANSLATION, CTX_NONE);
Transform();
}
break;
case HKEY:
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
if(G.qual==LR_CTRLKEY)
add_hook();
else if(G.qual==LR_ALTKEY)
reveal_mesh();
else if((G.qual==LR_SHIFTKEY))
hide_mesh(1);
else if((G.qual==0))
hide_mesh(0);
}
else if(G.obedit->type== OB_SURF) {
if(G.qual==LR_CTRLKEY)
add_hook();
else if(G.qual==LR_ALTKEY)
revealNurb();
else if((G.qual==LR_SHIFTKEY))
hideNurb(1);
else if((G.qual==0))
hideNurb(0);
}
else if(G.obedit->type==OB_CURVE) {
if(G.qual==LR_CTRLKEY)
add_hook();
else if(G.qual==LR_ALTKEY)
revealNurb();
/* should be G.qual==LR_SHIFTKEY, but that is taken fro handles already */
else if((G.qual==(LR_ALTKEY|LR_SHIFTKEY)))
hideNurb(1);
/* should be G.qual==0, but that is taken for handles already */
else if((G.qual==(LR_ALTKEY|LR_CTRLKEY)))
hideNurb(0);
else {
if(G.qual==LR_CTRLKEY) /* conflict */
autocalchandlesNurb_all(1); /* flag=1, selected */
else if((G.qual==LR_SHIFTKEY))
sethandlesNurb(1);
else if((G.qual==0))
sethandlesNurb(3);
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
BIF_undo_push("Handle change");
allqueue(REDRAWVIEW3D, 0);
}
}
else if(G.obedit->type==OB_LATTICE) {
if(G.qual==LR_CTRLKEY) add_hook();
}
else if(G.obedit->type==OB_MBALL) {
if(G.qual==LR_ALTKEY)
reveal_mball();
else if((G.qual==LR_SHIFTKEY))
hide_mball(1);
else if((G.qual==0))
hide_mball(0);
}
else if(G.obedit->type==OB_ARMATURE) {
if (G.qual==0)
hide_selected_armature_bones();
else if (G.qual==LR_SHIFTKEY)
hide_unselected_armature_bones();
else if (G.qual==LR_ALTKEY)
show_all_armature_bones();
}
}
else if(FACESEL_PAINT_TEST)
hide_tface();
else if(ob && (ob->flag & OB_POSEMODE)) {
if (G.qual==0)
hide_selected_pose_bones();
else if (G.qual==LR_SHIFTKEY)
hide_unselected_pose_bones();
else if (G.qual==LR_ALTKEY)
show_all_pose_bones();
}
/* Object mode only, other modes are accounted for above */
else if ((G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))==0) {
if(G.qual==LR_CTRLKEY)hookmenu();
else if(G.qual==LR_ALTKEY) show_objects();
else if(G.qual==LR_SHIFTKEY) hide_objects(0);
else hide_objects(1);
}
break;
case IKEY:
if(G.obedit) {
if(G.qual==LR_CTRLKEY)
selectswap_mesh();
} else if(G.qual==LR_CTRLKEY) {
if(ob && ob->type==OB_ARMATURE)
if(ob->flag & OB_POSEMODE)
pose_add_IK();
}
else if(G.qual==LR_ALTKEY) {
if(ob && ob->type==OB_ARMATURE)
if(ob->flag & OB_POSEMODE)
pose_clear_IK();
}
break;
case JKEY:
if(G.qual==LR_CTRLKEY) {
if( ob ) {
join_menu();
}
else if ((G.obedit) && ELEM(G.obedit->type, OB_CURVE, OB_SURF)) {
addsegment_nurb();
} else {
error("Can't join unless there is an active object");
}
}
else if(G.obedit) {
if(G.obedit->type==OB_MESH) {
join_triangles();
}
}
break;
case KKEY:
if(G.obedit) {
if (G.obedit->type==OB_MESH) {
if (G.qual==LR_SHIFTKEY)
KnifeSubdivide(KNIFE_PROMPT);
else if (G.qual==0)
LoopMenu();
}
else if(G.obedit->type==OB_SURF)
printknots();
}
else {
if((G.qual==LR_SHIFTKEY)) {
if(FACESEL_PAINT_TEST)
if (G.f & G_WEIGHTPAINT)
clear_wpaint_selectedfaces();
else
clear_vpaint_selectedfaces();
else if(G.f & G_VERTEXPAINT)
clear_vpaint();
else
select_select_keys();
}
else if (G.qual==0)
set_ob_ipoflags();
}
break;
case LKEY:
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
if (G.qual & LR_CTRLKEY) {
if ((G.scene->selectmode & SCE_SELECT_FACE) == 0) {
selectconnected_mesh_all(); /* normal select linked */
} else {
selectconnected_delimit_mesh_all(); /* select linked with edge crease delimiting */
}
} else {
if ((G.scene->selectmode & SCE_SELECT_FACE) == 0) {
selectconnected_mesh();
} else {
selectconnected_delimit_mesh();
}
}
}
if(G.obedit->type==OB_ARMATURE)
selectconnected_armature();
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
selectconnected_nurb();
}
else if(ob && (ob->flag & OB_POSEMODE)) {
selectconnected_posearmature();
}
else {
if(FACESEL_PAINT_TEST) {
if((G.qual==0))
select_linked_tfaces(0);
else if((G.qual==LR_SHIFTKEY))
select_linked_tfaces(1);
else if(G.qual==LR_CTRLKEY)
select_linked_tfaces(2);
}
else {
if((G.qual==0))
make_local_menu();
else if((G.qual==LR_SHIFTKEY))
selectlinks_menu();
else if(G.qual==LR_CTRLKEY)
make_links_menu();
}
}
break;
case MKEY:
if(G.obedit){
if (ELEM(G.qual, 0, LR_SHIFTKEY) && (G.obedit->type==OB_ARMATURE)) {
pose_movetolayer();
}
else if (G.qual==LR_ALTKEY) {
if(G.obedit->type==OB_MESH) {
mergemenu();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
}
}
else if ((G.qual==0) || (G.qual==LR_CTRLKEY)) {
mirrormenu();
}
else if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
if(G.obedit->type==OB_MESH) select_non_manifold();
}
}
else if(G.qual & LR_CTRLKEY) {
mirrormenu();
}
else if(G.qual==0 || G.qual==LR_SHIFTKEY) {
if(ob && (ob->flag & OB_POSEMODE))
pose_movetolayer();
else
movetolayer();
}
break;
case NKEY:
if((G.qual==0)) {
toggle_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_TO_MOUSE);
allqueue(REDRAWVIEW3D, 0);
}
else if(G.obedit) {
switch (G.obedit->type){
case OB_ARMATURE:
if(G.qual==LR_CTRLKEY) {
pupval= pupmenu("Recalculate Bone Roll Angles%t|Clear Roll (Z-Axis Up) %x1|Align Z-Axis to 3D-Cursor %x2");
if (pupval > 0) {
auto_align_armature(pupval - 1);
allqueue(REDRAWVIEW3D, 0);
}
}
break;
case OB_MESH:
if(G.qual==(LR_SHIFTKEY|LR_CTRLKEY)) {
if(okee("Recalculate normals inside")) {
righthandfaces(2);
allqueue(REDRAWVIEW3D, 0);
BIF_undo_push("Recalculate normals inside");
}
}
else if(G.qual==LR_CTRLKEY){
if(okee("Recalculate normals outside")) {
righthandfaces(1);
allqueue(REDRAWVIEW3D, 0);
BIF_undo_push("Recalculate normals outside");
}
}
break;
}
}
break;
case OKEY:
if (G.obedit) {
if (G.qual==LR_SHIFTKEY) {
G.scene->prop_mode = (G.scene->prop_mode+1)%7;
allqueue(REDRAWHEADERS, 0);
}
else if((G.qual==LR_ALTKEY)) {
if(G.scene->proportional==2) G.scene->proportional= 1;
else G.scene->proportional= 2;
allqueue(REDRAWHEADERS, 0);
}
else if((G.qual==0)) {
G.scene->proportional= !G.scene->proportional;
allqueue(REDRAWHEADERS, 0);
}
}
else if((G.qual==LR_SHIFTKEY || G.qual==(LR_ALTKEY|LR_SHIFTKEY))) {
flip_subdivison(-1);
}
else if(G.qual==LR_ALTKEY) {
if(okee("Clear origin")) {
clear_object('o');
}
}
break;
case PKEY:
if(G.obedit) {
if(G.qual==LR_CTRLKEY || G.qual==(LR_SHIFTKEY|LR_CTRLKEY)) {
if(G.obedit->type==OB_ARMATURE)
make_bone_parent();
else
make_parent();
}
else if(G.qual==LR_ALTKEY && G.obedit->type==OB_ARMATURE)
clear_bone_parent();
else if((G.qual==0) && (G.obedit->type==OB_ARMATURE))
select_bone_parent();
else if((G.qual==0) && G.obedit->type==OB_MESH)
separatemenu();
else if ((G.qual==0) && ELEM(G.obedit->type, OB_CURVE, OB_SURF))
separate_nurb();
else if (G.qual==LR_SHIFTKEY) {
initTransform(TFM_PUSHPULL, CTX_NONE);
Transform();
}
}
else if(G.qual==LR_CTRLKEY || G.qual==(LR_SHIFTKEY|LR_CTRLKEY))
make_parent();
else if(G.qual==LR_SHIFTKEY) {
toggle_blockhandler(curarea, VIEW3D_HANDLER_PREVIEW, 0);
doredraw= 1;
}
else if(G.qual==(LR_ALTKEY|LR_SHIFTKEY)) {
initTransform(TFM_PUSHPULL, CTX_NONE);
Transform();
}
else if(G.qual==LR_ALTKEY)
clear_parent();
else if(G.qual==(LR_ALTKEY|LR_CTRLKEY))
make_proxy();
else if(G.qual==(LR_ALTKEY|LR_CTRLKEY|LR_SHIFTKEY)) {
start_RBSimulation();
}
else if((G.qual==0) && (OBACT) && (OBACT->type==OB_ARMATURE) && (OBACT->flag & OB_POSEMODE))
select_bone_parent();
else if((G.qual==0)) {
start_game();
}
break;
case RKEY:
if((G.obedit==0) && G.qual==LR_ALTKEY) {
if(okee("Clear rotation")) {
clear_object('r');
}
}
else if(G.qual== (LR_CTRLKEY|LR_ALTKEY)) {
v3d->twtype= V3D_MANIP_ROTATE;
doredraw= 1;
}
else if (G.obedit) {
if((G.qual==LR_SHIFTKEY)) {
if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
selectrow_nurb();
}
else if(G.qual==LR_CTRLKEY) {
if (G.obedit->type==OB_MESH) {
CutEdgeloop(1);
BIF_undo_push("Cut Edgeloop");
}
else if (G.obedit->type==OB_ARMATURE) {
initTransform(TFM_BONE_ROLL, CTX_NONE);
Transform();
}
}
else if((G.qual==0)) {
initTransform(TFM_ROTATION, CTX_NONE);
Transform();
}
}
else if((G.qual==0)) {
initTransform(TFM_ROTATION, CTX_NONE);
Transform();
}
break;
case SKEY:
if(G.qual== (LR_CTRLKEY|LR_ALTKEY)) {
v3d->twtype= V3D_MANIP_SCALE;
doredraw= 1;
}
else if(G.obedit) {
if(G.qual==LR_ALTKEY) {
if(G.obedit->type==OB_ARMATURE) {
initTransform(TFM_BONESIZE, CTX_NONE);
}
else if (G.obedit->type==OB_CURVE) {
initTransform(TFM_CURVE_SHRINKFATTEN, CTX_NONE);
} else {
initTransform(TFM_SHRINKFATTEN, CTX_NONE);
}
Transform();
}
else if(G.qual==LR_CTRLKEY) {
initTransform(TFM_SHEAR, CTX_NONE);
Transform();
}
else if(G.qual==LR_SHIFTKEY)
snapmenu();
else if(G.qual==0) {
if(G.obedit->type==OB_ARMATURE) {
bArmature *arm= G.obedit->data;
if(arm->drawtype==ARM_ENVELOPE)
initTransform(TFM_BONE_ENVELOPE, CTX_NONE);
else
initTransform(TFM_RESIZE, CTX_NONE);
}
else
initTransform(TFM_RESIZE, CTX_NONE);
Transform();
}
else if(G.qual==(LR_SHIFTKEY|LR_CTRLKEY)){
initTransform(TFM_TOSPHERE, CTX_NONE);
Transform();
}
if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
if(G.obedit->type==OB_MESH) select_sharp_edges();
}
}
else if(G.qual==LR_ALTKEY) {
if(G.f & G_WEIGHTPAINT)
ob= ob->parent;
if(ob && (ob->flag & OB_POSEMODE)) {
bArmature *arm= ob->data;
if( ELEM(arm->drawtype, ARM_B_BONE, ARM_ENVELOPE)) {
initTransform(TFM_BONESIZE, CTX_NONE);
Transform();
break;
}
}
if(okee("Clear scale")) {
clear_object('s');
}
}
else if(G.qual==LR_SHIFTKEY) {
snapmenu();
}
else if((G.qual==0)) {
initTransform(TFM_RESIZE, CTX_NONE);
Transform();
}
else if(G.qual==(LR_SHIFTKEY|LR_CTRLKEY)) {
initTransform(TFM_TOSPHERE, CTX_NONE);
Transform();
}
else if(G.qual==(LR_CTRLKEY|LR_ALTKEY|LR_SHIFTKEY)) {
initTransform(TFM_SHEAR, CTX_NONE);
Transform();
}
break;
case TKEY:
if(G.qual == LR_SHIFTKEY) { /* toggle texture in solid draw mode */
G.vd->flag2 ^= V3D_SOLID_TEX;
allqueue(REDRAWVIEW3D, 0);
} else if(G.obedit){
if((G.qual & LR_CTRLKEY) && G.obedit->type==OB_MESH) {
convert_to_triface(G.qual & LR_SHIFTKEY);
allqueue(REDRAWVIEW3D, 0);
if (EM_texFaceCheck())
allqueue(REDRAWIMAGE, 0);
countall();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
}
if (G.obedit->type==OB_CURVE) {
if (G.qual==LR_ALTKEY) {
clear_tilt();
}
else if (G.qual==0) {
initTransform(TFM_TILT, CTX_NONE);
Transform();
}
}
}
else if(G.qual==LR_CTRLKEY) {
if(ob && (ob->flag & OB_POSEMODE));
else make_track();
}
else if(G.qual==LR_ALTKEY) {
if(ob && (ob->flag & OB_POSEMODE));
else clear_track();
}
else if((G.qual==0)){
texspace_edit();
}
break;
case UKEY:
/*// Use Ctrl Z like everybody else
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
if(G.qual==0) BIF_undo(); else BIF_redo();
}
else if ELEM5(G.obedit->type, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) {
if(G.qual==0) BIF_undo(); else BIF_redo();
}
}*/
if(G.obedit) {
if(G.qual==0) {
uv_autocalc_tface();
}
}
else if((G.qual==0)) {
if(G.f & G_WEIGHTPAINT)
BIF_undo();
else if(G.f & G_VERTEXPAINT)
BIF_undo();
else if(G.f & G_TEXTUREPAINT)
imagepaint_undo();
else {
single_user();
}
}
break;
case VKEY:
if ((G.qual==LR_CTRLKEY)) {
if ((G.obedit) && G.obedit->type==OB_MESH) {
Vertex_Menu();
}
} else if((G.qual==LR_SHIFTKEY)) {
if ((G.obedit) && G.obedit->type==OB_MESH) {
align_view_to_selected(v3d);
}
else if (FACESEL_PAINT_TEST) {
align_view_to_selected(v3d);
}
}
else if(G.qual==LR_ALTKEY)
image_aspect();
else if (G.qual==0){
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
mesh_rip();
}
else if(G.obedit->type==OB_CURVE) {
sethandlesNurb(2);
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
BIF_undo_push("Handle change");
}
}
else if(ob && ob->type == OB_MESH)
set_vpaint();
}
break;
case WKEY:
if((G.qual==LR_SHIFTKEY)) {
initTransform(TFM_WARP, CTX_NONE);
Transform();
}
/*else if(G.qual==LR_ALTKEY) {}*/
else if(G.qual==LR_CTRLKEY) {
if(G.obedit) {
if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
switchdirectionNurb2();
}
}
}
else if((G.qual==0))
special_editmenu();
break;
case XKEY:
case DELKEY:
if(G.qual==0 || G.qual==LR_SHIFTKEY)
delete_context_selected();
break;
case YKEY:
if((G.qual==0) && (G.obedit)) {
if(G.obedit->type==OB_MESH) split_mesh();
}
break;
case ZKEY:
toggle_shading();
scrarea_queue_headredraw(curarea);
scrarea_queue_winredraw(curarea);
break;
case HOMEKEY:
if(G.qual==0)
view3d_home(0);
break;
case COMMAKEY:
if(G.qual==LR_CTRLKEY) {
G.vd->around= V3D_CENTROID;
} else if(G.qual==LR_SHIFTKEY) {
G.vd->around= V3D_CENTROID;
} else if(G.qual==0) {
G.vd->around= V3D_CENTER;
}
handle_view3d_around();
scrarea_queue_headredraw(curarea);
scrarea_queue_winredraw(curarea);
break;
case PERIODKEY:
if(G.qual==LR_CTRLKEY) {
G.vd->around= V3D_LOCAL;
} else if(G.qual==LR_ALTKEY) {
G.vd->around= V3D_ACTIVE;
} else if(G.qual==0) {
G.vd->around= V3D_CURSOR;
}
handle_view3d_around();
scrarea_queue_headredraw(curarea);
scrarea_queue_winredraw(curarea);
break;
case PADSLASHKEY:
if(G.qual==0) {
if(G.vd->localview) {
G.vd->localview= 0;
endlocalview(curarea);
}
else {
G.vd->localview= 1;
initlocalview();
}
scrarea_queue_headredraw(curarea);
}
break;
case PADASTERKEY: /* '*' */
if(G.qual==0) {
if(ob) {
if ((G.obedit) && (G.obedit->type == OB_MESH)) {
editmesh_align_view_to_selected(G.vd, 3);
}
else if (FACESEL_PAINT_TEST) {
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
faceselect_align_view_to_selected(G.vd, me, 3);
}
}
else
obmat_to_viewmat(ob, 1);
if(G.vd->persp==2) G.vd->persp= 1;
scrarea_queue_winredraw(curarea);
}
}
break;
case PADPERIOD: /* '.' */
if(G.qual==0)
centerview();
break;
case PAGEUPKEY:
if(G.qual==LR_CTRLKEY)
movekey_obipo(1);
else if((G.qual==0))
nextkey_obipo(1); /* in editipo.c */
break;
case PAGEDOWNKEY:
if(G.qual==LR_CTRLKEY)
movekey_obipo(-1);
else if((G.qual==0))
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 PADENTER:
persptoetsen(event);
doredraw= 1;
break;
case PADMINUS:
if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_MESH) )
select_less();
else if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_CURVE) )
select_less_nurb();
else if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_SURF) )
select_less_nurb();
else {
persptoetsen(event);
doredraw= 1;
}
break;
case PADPLUSKEY:
if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_MESH) )
select_more();
else if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_CURVE) )
select_more_nurb();
else if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_SURF) )
select_more_nurb();
else {
persptoetsen(event);
doredraw= 1;
}
break;
case ESCKEY:
if(G.qual==0) {
if (G.vd->flag & V3D_DISPIMAGE) {
G.vd->flag &= ~V3D_DISPIMAGE;
doredraw= 1;
}
}
break;
}
}
}
if(doredraw) {
scrarea_queue_winredraw(curarea);
scrarea_queue_headredraw(curarea);
}
}
static void initview3d(ScrArea *sa)
{
View3D *vd;
vd= MEM_callocN(sizeof(View3D), "initview3d");
BLI_addhead(&sa->spacedata, vd); /* addhead! not addtail */
vd->spacetype= SPACE_VIEW3D;
vd->blockscale= 0.7f;
vd->viewquat[0]= 1.0f;
vd->viewquat[1]= vd->viewquat[2]= vd->viewquat[3]= 0.0f;
vd->persp= 1;
vd->drawtype= OB_WIRE;
vd->view= 7;
vd->dist= 10.0;
vd->lens= 35.0f;
vd->near= 0.01f;
vd->far= 500.0f;
vd->grid= 1.0f;
vd->gridlines= 16;
vd->gridsubdiv = 10;
vd->lay= vd->layact= 1;
if(G.scene) {
vd->lay= vd->layact= G.scene->lay;
vd->camera= G.scene->camera;
}
vd->scenelock= 1;
vd->gridflag |= V3D_SHOW_X;
vd->gridflag |= V3D_SHOW_Y;
vd->gridflag |= V3D_SHOW_FLOOR;
vd->gridflag &= ~V3D_SHOW_Z;
vd->depths= NULL;
}
/* ******************** SPACE: IPO ********************** */
static void changeview2dspace(ScrArea *sa, void *spacedata)
{
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);
}
static int get_cfra_from_dx(SpaceIpo * sipo, int dx)
{
if (sipo->blocktype == ID_SEQ) {
Sequence * seq = (Sequence*) sipo->from;
if (!seq) {
return dx;
}
if ((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
return dx;
} else {
float m= (seq->enddisp - seq->startdisp)/100.0f;
float cfra = dx * m + seq->startdisp;
return (int) cfra;
}
} else {
return dx;
}
}
static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
extern void do_ipobuts(unsigned short event); /* drawipo.c */
unsigned short event= evt->event;
short val= evt->val;
SpaceIpo *sipo= curarea->spacedata.first;
View2D *v2d= &sipo->v2d;
float dx, dy;
int cfra, doredraw= 0;
short mval[2];
short mousebut = L_MOUSE;
if(sa->win==0) return;
if(val) {
if( uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
if (event == LEFTMOUSE) {
event = RIGHTMOUSE;
mousebut = L_MOUSE;
} else if (event == RIGHTMOUSE) {
event = LEFTMOUSE;
mousebut = R_MOUSE;
}
}
switch(event) {
case UI_BUT_EVENT:
/* note: bad bad code, will be cleaned! is because event queues are all shattered */
if(val>0 && val < 256) do_ipowin_buts(val-1);
else do_ipobuts(val);
break;
case LEFTMOUSE:
if( in_ipo_buttons() ) {
do_ipo_selectbuttons();
doredraw= 1;
}
else if(view2dmove(LEFTMOUSE)); /* only checks for sliders */
else if((G.qual & LR_CTRLKEY) && (sipo->showkey==0)) add_vert_ipo();
else {
do {
getmouseco_areawin(mval);
areamouseco_to_ipoco(v2d, mval, &dx, &dy);
cfra = get_cfra_from_dx(sipo, (int)dx);
if(cfra< 1) cfra= 1;
if( cfra!=CFRA ) {
CFRA= cfra;
update_for_newframe_nodraw(0); /* 1 = nosound */
force_draw_all(0); /* To make constraint sliders redraw */
}
else PIL_sleep_ms(30);
} while(get_mbut() & mousebut);
}
break;
case RIGHTMOUSE:
mouse_select_ipo();
allqueue(REDRAWMARKER, 0);
break;
case MIDDLEMOUSE:
if(in_ipo_buttons()) {
scroll_ipobuts();
}
else view2dmove(event); /* in drawipo.c */
break;
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
view2dmove(event); /* in drawipo.c */
break;
case PADPLUSKEY:
view2d_zoom(v2d, 0.1154f, sa->winx, sa->winy);
doredraw= 1;
break;
case PADMINUS:
view2d_zoom(v2d, -0.15f, sa->winx, sa->winy);
doredraw= 1;
break;
case PAGEUPKEY:
if(G.qual & LR_CTRLKEY)
movekey_ipo(1);
else if(G.qual & LR_SHIFTKEY)
nextkey_ipo(1);
else
nextprev_marker(1);
break;
case PAGEDOWNKEY:
if(G.qual & LR_CTRLKEY)
movekey_ipo(-1);
else if(G.qual & LR_SHIFTKEY)
nextkey_ipo(-1);
else
nextprev_marker(-1);
break;
case HOMEKEY:
if((G.qual==0))
do_ipo_buttons(B_IPOHOME);
break;
case PADPERIOD:
if((G.qual==0))
do_ipo_buttons(B_IPOVIEWCENTER);
break;
case AKEY:
if (G.qual & LR_CTRLKEY) {
deselect_markers(1, 0);
allqueue(REDRAWMARKER, 0);
}
else if (G.qual==0) {
if(in_ipo_buttons()) {
swap_visible_editipo();
}
else {
swap_selectall_editipo();
}
allspace (REMAKEIPO, 0);
allqueue (REDRAWNLA, 0);
allqueue (REDRAWACTION, 0);
}
break;
case BKEY:
if (G.qual==0)
borderselect_ipo();
else if (G.qual==LR_CTRLKEY) {
borderselect_markers();
}
break;
case CKEY:
if (G.qual == LR_SHIFTKEY)
center_currframe();
else
move_to_frame();
break;
case DKEY:
if (G.qual==LR_SHIFTKEY) {
add_duplicate_editipo();
} else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY)) {
duplicate_marker();
allqueue(REDRAWMARKER, 0);
}
break;
case GKEY:
if (G.qual & LR_CTRLKEY) {
transform_markers('g', 0);
allqueue(REDRAWMARKER, 0);
} else if (G.qual==0)
transform_ipo('g');
break;
case HKEY:
if (G.qual==LR_ALTKEY)
sethandles_ipo(HD_AUTO_ANIM);
if (G.qual==LR_SHIFTKEY)
sethandles_ipo(HD_AUTO);
else if (G.qual==0)
sethandles_ipo(HD_ALIGN);
break;
case JKEY:
if (G.qual==LR_CTRLKEY)
join_ipo_menu();
break;
case KKEY:
if (G.qual==0) {
ipo_toggle_showkey();
scrarea_queue_headredraw(curarea);
allqueue(REDRAWVIEW3D, 0);
doredraw= 1;
}
break;
case MKEY:
if (G.qual==0) {
add_marker(CFRA);
} else if (G.qual==LR_SHIFTKEY) {
ipo_mirror_menu();
break;
} else if (G.qual == LR_CTRLKEY) {
rename_marker();
} else {
break;
}
allqueue(REDRAWMARKER, 0);
break;
case NKEY:
toggle_blockhandler(sa, IPO_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
doredraw= 1;
break;
case OKEY:
if (G.qual==LR_SHIFTKEY)
smooth_ipo();
else
clean_ipo();
break;
case PKEY:
if (G.qual & LR_CTRLKEY) /* set preview range */
anim_previewrange_set();
else if (G.qual & LR_ALTKEY) /* clear preview range */
anim_previewrange_clear();
allqueue(REDRAWTIME, 0);
allqueue(REDRAWBUTSALL, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
allqueue(REDRAWIPO, 0);
break;
case RKEY:
if (G.qual==LR_CTRLKEY)
ipo_record();
else
transform_ipo('r');
break;
case SKEY:
if (G.qual==LR_SHIFTKEY) {
ipo_snap_menu();
}
else if (G.qual==0)
transform_ipo('s');
break;
case TKEY:
if (G.qual==0)
set_ipotype();
break;
case VKEY:
if (G.qual==0)
sethandles_ipo(HD_VECT);
break;
case XKEY:
case DELKEY:
if (okee("Erase selected")) {
remove_marker();
del_ipo(0);
/* note: don't update the other spaces (in particular ipo)
* or else curves disappear.
*/
allqueue(REDRAWTIME, 0);
allqueue(REDRAWSOUND, 0);
}
break;
case ACCENTGRAVEKEY:
if((G.qual==0)) {
do_ipo_buttons(B_IPOVIEWALL);
allqueue(REDRAWIPO, 0);
}
break;
}
}
if(doredraw) scrarea_queue_winredraw(sa);
}
void initipo(ScrArea *sa)
{
SpaceIpo *sipo;
sipo= MEM_callocN(sizeof(SpaceIpo), "initipo");
BLI_addhead(&sa->spacedata, sipo);
sipo->spacetype= SPACE_IPO;
sipo->blockscale= 0.7f;
/* 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.01f;
sipo->v2d.min[1]= 0.01f;
sipo->v2d.max[0]= 15000.0f;
sipo->v2d.max[1]= 10000.0f;
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 & USER_DISABLE_MIPMAP));
allqueue(REDRAWVIEW3D, 0);
}
#if 0
static void space_sound_button_function(int event)
{
int a;
SYS_SystemHandle syshandle;
if ((syshandle = SYS_GetSystem()))
{
a = (U.gameflags & USER_DISABLE_SOUND);
SYS_WriteCommandLineInt(syshandle, "noaudio", a);
}
}
#endif
static char *iconfile_menu(void)
{
static char string[512];
char *str = string;
IconFile *ifile;
ListBase *iconfilelist = BIF_iconfile_list();
str += sprintf(str, "Built-in %%x0|%%l|");
for(ifile=iconfilelist->first; ifile; ifile=ifile->next) {
str += sprintf(str, "%s %%x%d|", ifile->filename, ifile->index);
}
return string;
}
static void set_userdef_iconfile_cb(void *menuindex, void *unused2)
{
bTheme *btheme= U.themes.first;
IconFile *ifile;
ListBase *iconfilelist = BIF_iconfile_list();
int index = *((int *)menuindex);
if (index==0) {
BLI_strncpy(btheme->tui.iconfile, "", sizeof(btheme->tui.iconfile));
return;
}
for(ifile=iconfilelist->first; ifile; ifile=ifile->next) {
if (index == ifile->index) {
BLI_strncpy(btheme->tui.iconfile, ifile->filename, sizeof(btheme->tui.iconfile));
}
}
}
/* needed for event; choose new 'curmain' resets it... */
static short th_curcol= TH_BACK;
static char *th_curcol_ptr= NULL;
static char th_curcol_arr[4]={0, 0, 0, 255};
static void info_user_themebuts(uiBlock *block, short y1, short y2, short y3)
{
bTheme *btheme, *bt;
int spacetype= 0;
static short cur=1, curmain=2;
short a, tot=0, isbuiltin= 0;
char string[21*32], *strp, *col;
/* for choosing an icon image based on index in the cached list */
static int iconfileindex=0;
y3= y2+23; /* exception! */
/* count total, max 16! */
for(bt= U.themes.first; bt; bt= bt->next) tot++;
/* if cur not is 1; move that to front of list */
if(cur!=1) {
a= 1;
for(bt= U.themes.first; bt; bt= bt->next, a++) {
if(a==cur) {
BLI_remlink(&U.themes, bt);
BLI_addhead(&U.themes, bt);
allqueue(REDRAWALL, 0);
cur= 1;
break;
}
}
}
/* the current theme */
btheme= U.themes.first;
if(strcmp(btheme->name, "Default")==0) isbuiltin= 1;
/* construct popup script */
string[0]= 0;
for(bt= U.themes.first; bt; bt= bt->next) {
strcat(string, bt->name);
if(btheme->next) strcat(string, " |");
}
uiDefButS(block, MENU, B_UPDATE_THEME_ICONS, string, 45,y3,200,20, &cur, 0, 0, 0, 0, "Current theme");
/* add / delete / name */
if(tot<16)
uiDefBut(block, BUT, B_ADD_THEME, "Add", 45,y2,200,20, NULL, 0, 0, 0, 0, "Makes new copy of this theme");
if(tot>1 && isbuiltin==0)
uiDefBut(block, BUT, B_DEL_THEME, "Delete", 45,y1,200,20, NULL, 0, 0, 0, 0, "Delete theme");
if(isbuiltin) return;
/* name */
uiDefBut(block, TEX, B_NAME_THEME, "", 255,y3,200,20, btheme->name, 1.0, 30.0, 0, 0, "Rename theme");
/* main choices pup: note, it uses collums, and the seperators (%l) then have to fill both halves equally for the menu to work */
uiDefButS(block, MENU, B_CHANGE_THEME, "UI and Buttons %x1|%l|3D View %x2|%l|Ipo Curve Editor %x3|Action Editor %x4|"
"NLA Editor %x5|%l|UV/Image Editor %x6|Video Sequence Editor %x7|Node Editor %x16|Timeline %x15|%l|Audio Window %x8|Text Editor %x9|%l|User Preferences %x10|"
"Outliner %x11|Buttons Window %x12|%l|File Browser %x13|Image Browser %x14",
255,y2,200,20, &curmain, 0, 0, 0, 0, "Specify theme for...");
if(curmain==1) spacetype= 0;
else if(curmain==2) spacetype= SPACE_VIEW3D;
else if(curmain==3) spacetype= SPACE_IPO;
else if(curmain==4) spacetype= SPACE_ACTION;
else if(curmain==5) spacetype= SPACE_NLA;
else if(curmain==6) spacetype= SPACE_IMAGE;
else if(curmain==7) spacetype= SPACE_SEQ;
else if(curmain==8) spacetype= SPACE_SOUND;
else if(curmain==9) spacetype= SPACE_TEXT;
else if(curmain==10) spacetype= SPACE_INFO;
else if(curmain==11) spacetype= SPACE_OOPS;
else if(curmain==12) spacetype= SPACE_BUTS;
else if(curmain==13) spacetype= SPACE_FILE;
else if(curmain==14) spacetype= SPACE_IMASEL;
else if(curmain==15) spacetype= SPACE_TIME;
else if(curmain==16) spacetype= SPACE_NODE;
else return; /* only needed while coding... when adding themes for more windows */
/* color choices pup */
if(curmain==1) {
strp= BIF_ThemeColorsPup(0);
if(th_curcol==TH_BACK) th_curcol= TH_BUT_OUTLINE; /* switching main choices... */
}
else strp= BIF_ThemeColorsPup(spacetype);
uiDefButS(block, MENU, B_REDR, strp, 255,y1,200,20, &th_curcol, 0, 0, 0, 0, "Current color");
MEM_freeN(strp);
th_curcol_ptr= col= BIF_ThemeGetColorPtr(btheme, spacetype, th_curcol);
if(col==NULL) return;
/* first handle exceptions, special single values, row selection, etc */
if(th_curcol==TH_VERTEX_SIZE) {
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"Vertex size ", 465,y3,200,20, col, 1.0, 10.0, 0, 0, "");
}
else if(th_curcol==TH_FACEDOT_SIZE) {
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"Face dot size ", 465,y3,200,20, col, 1.0, 10.0, 0, 0, "");
}
else if(th_curcol==TH_BUT_DRAWTYPE) {
uiBlockBeginAlign(block);
uiDefButC(block, ROW, B_UPDATE_THEME, "Shaded", 465,y2,80,20, col, 2.0, (float) TH_SHADED, 0, 0, "");
uiDefButC(block, ROW, B_UPDATE_THEME, "Rounded", 545,y2,80,20, col, 2.0, (float) TH_ROUNDED, 0, 0, "");
uiDefButC(block, ROW, B_UPDATE_THEME, "Minimal", 625,y2,80,20, col, 2.0, (float) TH_MINIMAL, 0, 0, "");
uiDefButC(block, ROW, B_UPDATE_THEME, "OldSkool", 705,y2,80,20, col, 2.0, (float) TH_OLDSKOOL, 0, 0, "");
uiBlockEndAlign(block);
}
else if(th_curcol==TH_ICONFILE) {
uiBut *but;
/* set the icon file menu to the correct icon file index for what's stored in the theme values */
iconfileindex= BIF_iconfile_get_index(btheme->tui.iconfile);
but = uiDefButI(block, MENU, B_UPDATE_THEME_ICONS, iconfile_menu(),
465,y2,200,20, &iconfileindex, 0, 0, 0, 0, "The icon PNG file to use, searching in .blender/icons");
uiButSetFunc(but, set_userdef_iconfile_cb, &iconfileindex, NULL);
}
else {
uiBlockBeginAlign(block);
if ELEM9(th_curcol, TH_PANEL, TH_LAMP, TH_FACE, TH_FACE_SELECT, TH_EDITMESH_ACTIVE, TH_MENU_BACK, TH_MENU_HILITE, TH_MENU_ITEM, TH_NODE) {
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"A ", 465,y3+25,200,20, col+3, 0.0, 255.0, B_THEMECOL, 0, "");
}
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"R ", 465,y3,200,20, col, 0.0, 255.0, B_THEMECOL, 0, "");
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"G ", 465,y2,200,20, col+1, 0.0, 255.0, B_THEMECOL, 0, "");
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"B ", 465,y1,200,20, col+2, 0.0, 255.0, B_THEMECOL, 0, "");
uiBlockEndAlign(block);
uiDefButC(block, COL, B_UPDATE_THEME, "", 675,y1,50,y3-y1+20, col, 0, 0, 0, 0, "");
/* copy paste */
uiBlockBeginAlign(block);
uiDefBut(block, BUT, B_THEME_COPY, "Copy Color", 755,y2,120,20, NULL, 0, 0, 0, 0, "Stores current color in buffer");
uiDefBut(block, BUT, B_THEME_PASTE, "Paste Color", 755,y1,120,20, NULL, 0, 0, 0, 0, "Pastes buffer color");
uiBlockEndAlign(block);
uiDefButC(block, COL, 0, "", 885,y1,50,y2-y1+20, th_curcol_arr, 0, 0, 0, 0, "");
}
}
void drawinfospace(ScrArea *sa, void *spacedata)
{
uiBlock *block;
static short cur_light=0;
float fac, col[3];
short xpos, ypos, ypostab, buth, rspace, dx, y1, y2, y3, y4, y5, y6, y7;
short y2label, y3label, y4label, y5label, y6label, y7label;
short spref, mpref, lpref, smfileselbut;
short edgsp, midsp;
char naam[32];
if(curarea->win==0 || curarea->winy<2) return;
BIF_GetThemeColor3fv(TH_BACK, col);
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
/* smaller buttons make no sense */
if(curarea->winx<320) return;
if(curarea->winx<=1280.0) {
fac= ((float)curarea->winx)/1280.0f;
myortho2(0.375f, 1280.375f, 0.375f, curarea->winy/fac + 0.375f);
}
else {
myortho2(0.375f, (float)curarea->winx + 0.375f, 0.375f, (float)curarea->winy + 0.375f);
}
sprintf(naam, "infowin %d", curarea->win);
block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->win);
/* Vars for nice grid alignment */
dx= (1280-90)/7; /* spacing for use in equally dividing 'tab' row */
xpos = 45; /* left padding */
ypos = 50; /* bottom padding for buttons */
ypostab = 10; /* bottom padding for 'tab' row */
buth = 20; /* standard button height */
spref = 90; /* standard size for small preferences button */
mpref = 189; /* standard size for medium preferences button */
lpref = 288; /* standard size for large preferences button */
smfileselbut = buth; /* standard size for fileselect button (square) */
edgsp = 3; /* space from edge of end 'tab' to edge of end button */
midsp = 9; /* horizontal space between buttons */
rspace = 3; /* default space between rows */
y1 = ypos; /* grid alignment for each row of buttons */
y2 = ypos+buth+rspace;
y3 = ypos+2*(buth+rspace);
y4 = ypos+3*(buth+rspace);
y5 = ypos+4*(buth+rspace);
y6 = ypos+5*(buth+rspace);
y7 = ypos+6*(buth+rspace);
y2label = y2-2; /* adjustments to offset the labels down to align better */
y3label = y3-2;
y4label = y4-2;
y5label = y5-2;
y6label = y6-2;
y7label = y7-2;
/* set the color to blue and draw the main 'tab' controls */
uiBlockSetCol(block, TH_BUT_SETTING1);
uiBlockBeginAlign(block);
uiDefButS(block, ROW,B_USERPREF,"View & Controls",
xpos,ypostab,(short)dx,buth,
&U.userpref,1.0,0.0, 0, 0,"");
uiDefButS(block, ROW,B_USERPREF,"Edit Methods",
(short)(xpos+dx),ypostab,(short)dx,buth,
&U.userpref,1.0,1.0, 0, 0,"");
uiDefButS(block, ROW,B_USERPREF,"Language & Font",
(short)(xpos+2*dx),ypostab,(short)dx,buth,
&U.userpref,1.0,2.0, 0, 0,"");
uiDefButS(block, ROW,B_USERPREF,"Themes",
(short)(xpos+3*dx),ypostab,(short)dx,buth,
&U.userpref,1.0,6.0, 0, 0,"");
uiDefButS(block, ROW,B_USERPREF,"Auto Save",
(short)(xpos+4*dx),ypostab,(short)dx,buth,
&U.userpref,1.0,3.0, 0, 0,"");
uiDefButS(block, ROW,B_USERPREF,"System & OpenGL",
(short)(xpos+5*dx),ypostab,(short)dx,buth,
&U.userpref,1.0,4.0, 0, 0,"");
uiDefButS(block, ROW,B_USERPREF,"File Paths",
(short)(xpos+6*dx),ypostab,(short)dx,buth,
&U.userpref,1.0,5.0, 0, 0,"");
uiBlockSetCol(block, TH_AUTO);
uiBlockEndAlign(block);
/* end 'tab' controls */
/* line 2: left x co-ord, top y co-ord, width, height */
if(U.userpref == 6) {
info_user_themebuts(block, y1, y2, y3);
}
else if (U.userpref == 0) { /* view & controls */
uiDefBut(block, LABEL,0,"Display:",
xpos,y6label,spref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_TOOLTIPS, 0, "Tool Tips",
(xpos+edgsp),y5,spref,buth,
&(U.flag), 0, 0, 0, 0,
"Display tooltips (help tags) over buttons");
uiDefButBitI(block, TOG, USER_DRAWVIEWINFO, B_DRAWINFO, "Object Info",
(xpos+edgsp),y4,spref,buth,
&(U.uiflag), 0, 0, 0, 0,
"Display active object name and frame number in the 3D View");
uiDefButBitI(block, TOG, USER_SCENEGLOBAL, 0, "Global Scene",
(xpos+edgsp),y3,spref,buth,
&(U.flag), 0, 0, 0, 0,
"Forces the current Scene to be displayed in all Screens");
#ifndef __APPLE__
uiDefButBitS(block, TOG, 1, 0, "Large Cursors",
(xpos+edgsp),y2,spref,buth,
&(U.curssize), 0, 0, 0, 0,
"Use large mouse cursors when available");
#else
U.curssize=0; /*Small Cursor always for OS X for now */
#endif
uiDefButBitI(block, TOG, USER_SHOW_VIEWPORTNAME, B_DRAWINFO, "View Name",
(xpos+edgsp),y1,spref,buth,
&(U.uiflag), 0, 0, 0, 0,
"Show the name of the view's direction in each 3D View");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Menus:",
(xpos+(2*edgsp)+spref),y6label,spref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_MENUOPENAUTO, 0, "Open on Mouse Over",
(xpos+edgsp+spref+midsp),y5,mpref,buth,
&(U.uiflag), 0, 0, 0, 0,
"Open menu buttons and pulldowns automatically when the mouse is hovering");
uiDefButS(block, NUM, 0, "Top Level:",
(xpos+edgsp+spref+midsp),y4,spref+edgsp,buth,
&(U.menuthreshold1), 1, 40, 0, 0,
"Time delay in 1/10 seconds before automatically opening top level menus");
uiDefButS(block, NUM, 0, "Sublevels:",
(xpos+edgsp+(2*spref)+(2*midsp)-edgsp),y4,spref+edgsp,buth,
&(U.menuthreshold2), 1, 40, 0, 0,
"Time delay in 1/10 seconds before automatically opening menu sublevels");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Toolbox click-hold delay:",
(xpos+(2*edgsp)+spref),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButS(block, NUM, 0, "LMB:",
(xpos+edgsp+spref+midsp),y2,spref+edgsp,buth,
&(U.tb_leftmouse), 2, 40, 0, 0,
"Time in 1/10 seconds to hold the Left Mouse Button before opening the toolbox");
uiDefButS(block, NUM, 0, "RMB:",
(xpos+edgsp+(2*spref)+(2*midsp)-edgsp),y2,spref+edgsp,buth,
&(U.tb_rightmouse), 2, 40, 0, 0,
"Time in 1/10 seconds to hold the Right Mouse Button before opening the toolbox");
uiBlockEndAlign(block);
uiDefButBitI(block, TOG, USER_PANELPINNED, 0, "Pin Floating Panels",
(xpos+edgsp+spref+midsp),y1,(mpref/2),buth,
&(U.uiflag), 0, 0, 0, 0,
"Make floating panels invoked by a hotkey (eg. N Key) open at the previous location");
uiDefButBitI(block, TOG, USER_PLAINMENUS, B_PLAINMENUS, "Plain Menus",
(xpos+edgsp+(2*spref)+(2*midsp)),y1,spref,buth,
&(U.uiflag), 0, 0, 0, 0,
"Use a column layout for toolbox and do not flip the contents of any menu");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Snap to grid:",
(xpos+(2*edgsp)+spref+midsp+mpref),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_AUTOGRABGRID, 0, "Grab/Move",
(xpos+edgsp+mpref+spref+(2*midsp)),y5,spref,buth,
&(U.flag), 0, 0, 0, 0,
"Snap objects and sub-objects to grid units when moving");
uiDefButBitI(block, TOG, USER_AUTOROTGRID, 0, "Rotate",
(xpos+edgsp+mpref+spref+(2*midsp)),y4,spref,buth,
&(U.flag), 0, 0, 0, 0,
"Snap objects and sub-objects to grid units when rotating");
uiDefButBitI(block, TOG, USER_AUTOSIZEGRID, 0, "Scale",
(xpos+edgsp+mpref+spref+(2*midsp)),y3,spref,buth,
&(U.flag), 0, 0, 0, 0,
"Snap objects and sub-objects to grid units when scaling");
uiBlockEndAlign(block);
uiDefButBitI(block, TOG, USER_LOCKAROUND, B_DRAWINFO, "Global Pivot",
(xpos+edgsp+mpref+spref+(2*midsp)),y1,spref,buth,
&(U.uiflag), 0, 0, 0, 0,
"Lock the same rotation/scaling pivot in all 3D Views");
uiDefBut(block, LABEL,0,"View zoom:",
(xpos+(2*edgsp)+mpref+(2*spref)+(2*midsp)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1); /* mutually exclusive toggles, start color */
uiDefButS(block, ROW, 0, "Continue",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)),y5,(mpref/3),buth,
&(U.viewzoom), 40, USER_ZOOM_CONT, 0, 0,
"Old style zoom, continues while moving mouse up or down");
uiDefButS(block, ROW, 0, "Dolly",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/3)),y5,(mpref/3),buth,
&(U.viewzoom), 40, USER_ZOOM_DOLLY, 0, 0,
"Zooms in and out based on vertical mouse movement.");
uiDefButS(block, ROW, 0, "Scale",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)+(2*mpref/3)),y5,(mpref/3),buth,
&(U.viewzoom), 40, USER_ZOOM_SCALE, 0, 0,
"Zooms in and out like scaling the view, mouse movements relative to center.");
uiBlockSetCol(block, TH_AUTO); /* end color */
uiBlockEndAlign(block);
uiDefButBitI(block, TOG, USER_ZOOM_TO_MOUSEPOS, B_DRAWINFO, "Zoom to Mouse Position",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)),y4,mpref,buth,
&(U.uiflag), 0, 0, 0, 0,
"Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center");
uiDefBut(block, LABEL,0,"View rotation:",
(xpos+(2*edgsp)+mpref+(2*spref)+(2*midsp)),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1); /* mutually exclusive toggles, start color */
uiDefButBitI(block, TOG, USER_TRACKBALL, B_DRAWINFO, "Trackball",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)),y2,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0,
"Allow the view to tumble freely when orbiting with the Middle Mouse Button");
uiDefButBitI(block, TOGN, USER_TRACKBALL, B_DRAWINFO, "Turntable",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y2,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0,
"Use fixed up axis for orbiting with Middle Mouse Button");
uiBlockSetCol(block, TH_AUTO); /* end color */
uiDefButBitI(block, TOG, USER_AUTOPERSP, B_DRAWINFO, "Auto Perspective",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)),y1,(mpref/2),buth,
&(U.uiflag), 0, 0, 0, 0,
"Automatically switch between orthographic and perspective when changing from top/front/side views");
uiDefButBitI(block, TOG, USER_ORBIT_SELECTION, B_DRAWINFO, "Around Selection",
(xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y1,(mpref/2),buth,
&(U.uiflag), 0, 0, 0, 0,
"Use selection as the orbiting center");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Select with:",
(xpos+(2*edgsp)+(3*mpref)+(3*midsp)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1); /* mutually exclusive toggles, start color */
uiDefButBitI(block, TOG, USER_LMOUSESELECT, B_DRAWINFO, "Left Mouse",
(xpos+edgsp+(3*mpref)+(4*midsp)),y5,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Use the Left Mouse Button for selection");
uiDefButBitI(block, TOGN, USER_LMOUSESELECT, B_DRAWINFO, "Right Mouse",
(xpos+edgsp+(3*mpref)+(4*midsp)+(mpref/2)),y5,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Use the Right Mouse Button for selection");
uiBlockSetCol(block, TH_AUTO); /* end color */
uiBlockEndAlign(block);
if(U.flag & USER_LMOUSESELECT) {
uiDefBut(block, LABEL,0,"Cursor with: Right Mouse",
(xpos+(2*edgsp)+(3*mpref)+(3*midsp)),y4label+5,mpref,buth,
0, 0, 0, 0, 0, "");
} else {
uiDefBut(block, LABEL,0,"Cursor with: Left Mouse",
(xpos+(2*edgsp)+(3*mpref)+(3*midsp)),y4label+5,mpref,buth,
0, 0, 0, 0, 0, "");
}
/* illegal combo... */
if (U.flag & USER_LMOUSESELECT)
U.flag &= ~USER_TWOBUTTONMOUSE;
uiDefButBitI(block, TOG, USER_TWOBUTTONMOUSE, B_DRAWINFO, "Emulate 3 Button Mouse",
(xpos+edgsp+(3*mpref)+(4*midsp)),y3,mpref,buth,
&(U.flag), 0, 0, 0, 0,
"Emulates Middle Mouse with Alt+LeftMouse (doesnt work with Left Mouse Select option)");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_SHOW_ROTVIEWICON, B_DRAWINFO, "Mini Axis",
(xpos+edgsp+(3*mpref)+(4*midsp)),y1,(mpref/3),buth,
&(U.uiflag), 0, 0, 0, 0,
"Show a small rotating 3D axis in the bottom left corner of the 3D View");
uiDefButS(block, NUM, B_DRAWINFO, "Size:",
(xpos+edgsp+(3*mpref)+(4*midsp)+(mpref/3)),y1,(mpref/3),buth,
&U.rvisize, 10, 64, 0, 0,
"The axis icon's size");
uiDefButS(block, NUM, B_DRAWINFO, "Bright:",
(xpos+edgsp+(3*mpref)+(4*midsp)+2*(mpref/3)),y1,(mpref/3),buth,
&U.rvibright, 0, 10, 0, 0,
"The brightness of the icon");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Middle Mouse Button:",
(xpos+(2*edgsp)+(4*mpref)+(4*midsp)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1); /* mutually exclusive toggles, start color */
uiDefButBitI(block, TOGN, USER_VIEWMOVE, B_DRAWINFO, "Rotate View",
(xpos+edgsp+(4*mpref)+(5*midsp)),y5,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Default action for the Middle Mouse Button");
uiDefButBitI(block, TOG, USER_VIEWMOVE, B_DRAWINFO, "Pan View",
(xpos+edgsp+(4*mpref)+(5*midsp)+(mpref/2)),y5,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Default action for the Middle Mouse Button");
uiBlockSetCol(block, TH_AUTO); /* end color */
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Mouse Wheel:",
(xpos+(2*edgsp)+(4*mpref)+(4*midsp)),y4label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_WHEELZOOMDIR, 0, "Invert Zoom",
(xpos+edgsp+(4*mpref)+(5*midsp)),y3,spref,buth,
&(U.uiflag), 0, 0, 0, 0,
"Swap the Mouse Wheel zoom direction");
uiDefButI(block, NUM, 0, "Scroll Lines:",
(xpos+edgsp+(4*mpref)+(6*midsp)+spref-edgsp),y3,spref+edgsp,buth,
&U.wheellinescroll, 0.0, 32.0, 0, 0,
"The number of lines scrolled at a time with the mouse wheel");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButS(block, NUM, B_DRAWINFO, "Smooth View:",
(xpos+edgsp+(4*mpref)+(5*midsp)),y2,(mpref),buth,
&U.smooth_viewtx, 0, 1000, 0, 0,
"The time to animate the view in miliseconds, zero to disable");
uiDefButS(block, NUM, B_DRAWINFO, "Rotation Angle:",
(xpos+edgsp+(4*mpref)+(5*midsp)),y1,(mpref),buth,
&U.pad_rot_angle, 0, 90, 0, 0,
"The rotation step for numerical pad keys (2 4 6 8)");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"3D Transform Widget:",
(xpos+(2*edgsp)+(5*mpref)+(5*midsp)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButS(block, NUM, B_REDRCURW3D, "Size:",
(xpos+edgsp+(5*mpref)+(6*midsp)),y5,(mpref/2),buth,
&(U.tw_size), 2, 40, 0, 0, "Diameter of widget, in 10 pixel units");
uiDefButS(block, NUM, B_REDRCURW3D, "Handle:",
(xpos+edgsp+(5*mpref)+(6*midsp)+(mpref/2)),y5,(mpref/2),buth,
&(U.tw_handlesize), 2, 40, 0, 0, "Size of widget handles as percentage of widget radius");
uiDefButS(block, NUM, B_REDRCURW3D, "Hotspot:",
(xpos+edgsp+(5*mpref)+(6*midsp)),y4,(mpref),buth,
&(U.tw_hotspot), 4, 40, 0, 0, "Hotspot in pixels for clicking widget handles");
uiBlockEndAlign(block);
uiDefButS(block, NUM, B_REDRCURW3D, "Object Center Size: ",
(xpos+edgsp+(5*mpref)+(6*midsp)),y3,mpref,buth,
&(U.obcenter_dia), 4, 10, 0, 0,
"Diameter in Pixels for Object/Lamp center display");
} else if (U.userpref == 1) { /* edit methods */
uiDefBut(block, LABEL,0,"Material linked to:",
xpos,y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOGN, USER_MAT_ON_OB, B_DRAWINFO, "ObData",
(xpos+edgsp),y2,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Link new objects' material to the obData block");
uiDefButBitI(block, TOG, USER_MAT_ON_OB, B_DRAWINFO, "Object",
(xpos+edgsp+(mpref/2)),y2,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Link new objects' material to the object block");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Undo:",
(xpos+(2*edgsp)+mpref),y3label, mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButS(block, NUMSLI, B_DRAWINFO, "Steps: ",
(xpos+edgsp+mpref+midsp),y2,mpref,buth,
&(U.undosteps), 0, 64, 0, 0, "Number of undo steps available (smaller values conserve memory)");
uiDefButBitI(block, TOG, USER_GLOBALUNDO, B_DRAWINFO, "Global Undo",
(xpos+edgsp+mpref+midsp),y1,mpref,buth,
&(U.uiflag), 2, 64, 0, 0, "Global undo works by keeping a full copy of the file itself in memory, so takes extra memory");
uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Auto keyframe",
(xpos+(2*edgsp)+(2*mpref)+midsp),y5label,mpref,buth,
0, 0, 0, 0, 0, "");
uiDefButBitI(block, TOG, G_RECORDKEYS, REDRAWTIME, "Action and Object",
(xpos+edgsp+(2*mpref)+(2*midsp)),y4,mpref, buth,
&(G.flags), 0, 0, 0, 0, "Automatic keyframe insertion in Object and Action Ipo curves");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_KEYINSERTAVAI, REDRAWTIME, "Available",
(xpos+edgsp+(2*mpref)+(2*midsp)),y3,mpref, buth,
&(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion in available curves");
uiDefButBitI(block, TOG, USER_KEYINSERTNEED, REDRAWTIME, "Needed",
(xpos+edgsp+(2*mpref)+(2*midsp)),y2,mpref, buth,
&(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion only when keyframe needed");
uiDefButBitI(block, TOG, G_AUTOMATKEYS, REDRAWTIME, "Use Visual Keying",
(xpos+edgsp+(2*mpref)+(2*midsp)),y1,mpref, buth,
&(G.flags), 0, 0, 0, 0, "Use Visual keying automatically for constrained objects");
uiBlockEndAlign(block);
/* uiDefButBitS(block, TOG, USER_KEYINSERTACT, 0, "Action",
(xpos+edgsp+(2*mpref)+(2*midsp)),y2,(spref+edgsp),buth,
&(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion in Action Ipo curve");
uiDefButBitS(block, TOG, USER_KEYINSERTOBJ, 0, "Object",
(xpos+edgsp+(2*mpref)+(3*midsp)+spref-edgsp),y2,(spref+edgsp),buth,
&(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion in Object Ipo curve"); */
uiDefBut(block, LABEL,0,"Duplicate with object:",
(xpos+(2*edgsp)+(3*midsp)+(3*mpref)+spref),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_DUP_MESH, 0, "Mesh",
(xpos+edgsp+(4*midsp)+(3*mpref)+spref),y2,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes mesh data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_SURF, 0, "Surface",
(xpos+edgsp+(5*midsp)+(3*mpref)+(2*spref)),y2,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes surface data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_CURVE, 0, "Curve",
(xpos+edgsp+(6*midsp)+(3*mpref)+(3*spref)),y2,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes curve data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_FONT, 0, "Text",
(xpos+edgsp+(7*midsp)+(3*mpref)+(4*spref)),y2,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes text data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_MBALL, 0, "Metaball",
(xpos+edgsp+(8*midsp)+(3*mpref)+(5*spref)),y2,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes metaball data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_ARM, 0, "Armature",
(xpos+edgsp+(4*midsp)+(3*mpref)+spref),y1,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes armature data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_LAMP, 0, "Lamp",
(xpos+edgsp+(5*midsp)+(3*mpref)+(2*spref)),y1,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes lamp data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_MAT, 0, "Material",
(xpos+edgsp+(6*midsp)+(3*mpref)+(3*spref)),y1,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes material data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_TEX, 0, "Texture",
(xpos+edgsp+(7*midsp)+(3*mpref)+(4*spref)),y1,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes texture data to be duplicated with Shift+D");
uiDefButBitI(block, TOG, USER_DUP_IPO, 0, "Ipo",
(xpos+edgsp+(8*midsp)+(3*mpref)+(5*spref)),y1,(spref+edgsp),buth,
&(U.dupflag), 0, 0, 0, 0, "Causes ipo data to be duplicated with Shift+D");
uiBlockEndAlign(block);
} else if(U.userpref == 2) { /* language & colors */
#ifdef INTERNATIONAL
uiDefButBitS(block, TOG, USER_DOTRANSLATE, B_DOLANGUIFONT, "International Fonts",
xpos,y2,mpref,buth,
&(U.transopts), 0, 0, 0, 0, "Activate international interface");
if(U.transopts & USER_DOTRANSLATE) {
char curfont[320];
sprintf(curfont, "Interface Font: ");
if(U.fontname[0]) strcat(curfont, U.fontname);
else strcat(curfont, "Built-in");
uiDefBut(block, LABEL,0,curfont,
(xpos),y3,4*mpref,buth,
0, 0, 0, 0, 0, "");
uiDefBut(block, BUT, B_LOADUIFONT, "Select Font",
xpos,y1,mpref,buth,
0, 0, 0, 0, 0, "Select a new font for the interface");
uiDefButI(block, BUT, B_RESTOREFONT, "Restore to default",
(xpos+edgsp+mpref+midsp),y2,mpref,buth,
&U.fontsize, 0, 0, 0, 0, "Restores to using the default included antialised font");
uiDefButI(block, MENU, B_SETFONTSIZE, fontsize_pup(),
(xpos+edgsp+mpref+midsp),y1,mpref,buth,
&U.fontsize, 0, 0, 0, 0, "Current interface font size (points)");
/*
uiDefButS(block, MENU, B_SETENCODING, encoding_pup(),
(xpos+edgsp+mpref+midsp),y1,mpref,buth,
&U.encoding, 0, 0, 0, 0, "Current interface font encoding");
uiDefBut(block, LABEL,0,"Translate:",
(xpos+edgsp+(2.1*mpref)+(2*midsp)),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
*/
uiDefButBitS(block, TOG, USER_TR_TOOLTIPS, B_SETTRANSBUTS, "Tooltips",
(xpos+edgsp+(2.2*mpref)+(3*midsp)),y1,spref,buth,
&(U.transopts), 0, 0, 0, 0, "Translate tooltips");
uiDefButBitS(block, TOG, USER_TR_BUTTONS, B_SETTRANSBUTS, "Buttons",
(xpos+edgsp+(2.2*mpref)+(4*midsp)+spref),y1,spref,buth,
&(U.transopts), 0, 0, 0, 0, "Translate button labels");
uiDefButBitS(block, TOG, USER_TR_MENUS, B_SETTRANSBUTS, "Toolbox",
(xpos+edgsp+(2.2*mpref)+(5*midsp)+(2*spref)),y1,spref,buth,
&(U.transopts), 0, 0, 0, 0, "Translate toolbox menu");
uiDefButI(block, MENU, B_SETLANGUAGE, language_pup(),
(xpos+edgsp+(2.2*mpref)+(3*midsp)),y2,mpref+(0.5*mpref)+3,buth,
&U.language, 0, 0, 0, 0, "Select interface language");
uiDefButBitS(block, TOG, USER_USETEXTUREFONT, B_USETEXTUREFONT, "Use Textured Fonts",
(xpos+edgsp+(4*mpref)+(4*midsp)),y2,mpref,buth,
&(U.transopts), 0, 0, 0, 0,
"Use Textured Fonts");
}
/* end of INTERNATIONAL */
#endif
} else if(U.userpref == 3) { /* auto save */
uiDefButS(block, NUM, 0, "Save Versions:",
(xpos+edgsp),y3,mpref,buth,
&U.versions, 0.0, 32.0, 0, 0,
"The number of old versions to maintain in the current directory, when manually saving");
uiDefButBitI(block, TOG, USER_AUTOSAVE, B_RESETAUTOSAVE, "Auto Save Temp Files",
(xpos+edgsp+mpref+midsp),y3,mpref,buth,
&(U.flag), 0, 0, 0, 0,
"Enables automatic saving of temporary files");
if(U.flag & USER_AUTOSAVE) {
uiDefButI(block, NUM, B_RESETAUTOSAVE, "Minutes:",
(xpos+edgsp+mpref+midsp),y2,mpref,buth,
&(U.savetime), 1.0, 60.0, 0, 0,
"The time (in minutes) to wait between automatic temporary saves");
uiDefBut(block, BUT, B_LOADTEMP, "Open Recent",
(xpos+edgsp+mpref+midsp),y1,mpref,buth,
0, 0, 0, 0, 0,"Open the most recently saved temporary file");
}
uiDefButS(block, NUM, B_DRAWINFO, "Recent Files:",
(xpos+edgsp+(2*mpref)+(3*midsp)),y3,(mpref),buth,
&U.recent_files, 0, 30, 0, 0,
"Maximum number of recently opened files to remember");
uiDefButBitI(block, TOG, USER_SAVE_PREVIEWS, 0, "Save Preview Images",
(xpos+edgsp+(3*mpref)+(4*midsp)),y3,mpref,buth,
&(U.flag), 0, 0, 0, 0,
"Enables automatic saving of preview images in the .blend file");
} else if (U.userpref == 4) { /* system & opengl */
uiDefBut(block, LABEL,0,"Solid OpenGL lights:",
xpos+edgsp, y6label, mpref, buth,
0, 0, 0, 0, 0, "");
for (cur_light=0; cur_light<3; cur_light++) {
char lightname[12];
int lightbutw=buth*2;
int offs=cur_light*(midsp+lightbutw);
sprintf(lightname, "Light %d", cur_light+1);
uiDefButBitI(block, TOG, 1, B_RECALCLIGHT, lightname,
xpos+edgsp+offs, y5, lightbutw, buth,
&U.light[cur_light].flag, 0.0, 0.0, 0, 0, "Enable this OpenGL light in Solid draw mode");
uiDefButF(block, BUT_NORMAL, B_RECALCLIGHT, "",
xpos+edgsp+offs, y3, lightbutw, buth*2+rspace,
U.light[cur_light].vec, 0.0f, 1.0f, 0, 0, "The direction that the OpenGL light is shining");
uiDefButF(block, COL, B_RECALCLIGHT, "",
xpos+edgsp+offs, y2, lightbutw, buth,
U.light[cur_light].col, 0.0, 0.0, 0, 0, "");
uiDefButF(block, COL, B_RECALCLIGHT, "",
xpos+edgsp+offs, y1, lightbutw, buth,
U.light[cur_light].spec, 0.0, 0.0, 0, 0, "");
}
uiDefBut(block, LABEL,0,"Color",
xpos+edgsp+140, y2, mpref/4, buth,
0, 0, 0, 0, 0, "");
uiDefBut(block, LABEL,0,"Spec",
xpos+edgsp+140, y1, mpref/4, buth,
0, 0, 0, 0, 0, "");
#ifdef WITH_VERSE
uiDefBut(block, TEX, 0, "Verse Master: ",
(xpos+edgsp)+mpref*2+2*midsp,y5,mpref*2+midsp,buth,
U.versemaster, 1.0, 63.0, 0, 0,
"The Verse Master-server IP");
uiDefBut(block, TEX, 0, "Verse Username: ",
(xpos+edgsp)+mpref*2+2*midsp,y4,mpref*2+midsp,buth,
U.verseuser, 1.0, 63.0, 0, 0,
"The Verse user name");
#endif
/*
uiDefButBitS(block, TOG, USER_EVTTOCONSOLE, 0, "Log Events to Console",
(xpos+edgsp),y2,lpref,buth,
&(U.uiflag), 0, 0, 0, 0, "Display a list of input events in the console");
uiDefButS(block, MENU, B_CONSOLEOUT, consolemethod_pup(),
(xpos+edgsp), y1, lpref,buth,
&U.console_out, 0, 0, 0, 0, "Select console output method");
uiDefButS(block, NUM, B_CONSOLENUMLINES, "Lines:",
(xpos+edgsp+lpref+midsp),y1,spref,buth,
&U.console_buffer, 1.0, 4000.0, 0, 0, "Maximum number of internal console lines");
*/
#ifdef _WIN32
uiDefBut(block, LABEL,0,"Win Codecs:",
(xpos+edgsp+(1*midsp)+(1*mpref)),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiDefButBitI(block, TOG, USER_ALLWINCODECS, 0, "Enable all codecs",
(xpos+edgsp+(1*mpref)+(1*midsp)),y2,mpref,buth,
&(U.uiflag), 0, 0, 0, 0, "Allows all codecs for rendering (not guaranteed)");
#endif
uiDefBut(block, LABEL,0,"Auto Run Python Scripts",
(xpos+edgsp+(1*midsp)+(1*mpref)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
uiDefButBitI(block, TOG, G_DOSCRIPTLINKS, REDRAWBUTSSCRIPT, "Enabled by Default",
(xpos+edgsp+(1*mpref)+(1*midsp)),y5,mpref,buth,
&(G.f), 0, 0, 0, 0, "Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source)");
uiDefBut(block, LABEL,0,"Keyboard:",
(xpos+edgsp+(3*midsp)+(3*mpref)),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiDefButBitI(block, TOG, USER_NO_CAPSLOCK, B_U_CAPSLOCK, "Disable Caps Lock",
(xpos+edgsp+(3*midsp)+(3*mpref)),y1,mpref,buth,
&(U.flag), 0, 0, 0, 0,
"Disables the Caps Lock key when entering text");
uiDefButBitI(block, TOG, USER_NONUMPAD, 0, "Emulate Numpad",
(xpos+edgsp+(3*midsp)+(3*mpref)),y2,mpref,buth,
&(U.flag), 0, 0, 0, 0,
"Causes the 1 to 0 keys to act as the numpad (useful for laptops)");
uiDefBut(block, LABEL,0,"System:",
(xpos+edgsp+(4*midsp)+(4*mpref)),y7label,mpref,buth,
0, 0, 0, 0, 0, "");
uiDefButI(block, NUM, B_REDR, "Prefetch frames ",
(xpos+edgsp+(4*mpref)+(4*midsp)), y6, mpref, buth,
&U.prefetchframes, 0.0, 500.0, 20, 2,
"Number of frames to render ahead during playback.");
uiDefButI(block, NUM, B_MEMCACHELIMIT, "MEM Cache Limit ",
(xpos+edgsp+(4*mpref)+(4*midsp)), y5, mpref, buth,
&U.memcachelimit, 0.0, 1024.0, 30, 2,
"Memory cache limit in sequencer");
uiDefButS(block, NUM, B_REDR, "Frameserver Port ",
(xpos+edgsp+(4*mpref)+(4*midsp)), y4, mpref, buth,
&U.frameserverport, 0.0, 32727.0, 30, 2,
"Frameserver Port for Framserver-Rendering");
uiDefButBitI(block, TOG, USER_DISABLE_SOUND, B_SOUNDTOGGLE, "Disable Game Sound",
(xpos+edgsp+(4*mpref)+(4*midsp)),y3,mpref,buth,
&(U.gameflags), 0, 0, 0, 0, "Disables sounds from being played in games");
uiDefButBitI(block, TOG, USER_FILTERFILEEXTS, 0, "Filter File Extensions",
(xpos+edgsp+(4*mpref)+(4*midsp)),y2,mpref,buth,
&(U.uiflag), 0, 0, 0, 0, "Display only files with extensions in the image select window");
uiDefButBitI(block, TOG, USER_HIDE_DOT, 0, "Hide dot file/datablock",
(xpos+edgsp+(4*mpref)+(4*midsp)),y1,mpref,buth,
&(U.uiflag), 0, 0, 0, 0, "Hide files/datablocks that start with a dot(.*)");
uiDefBut(block, LABEL,0,"OpenGL:",
(xpos+edgsp+(5*midsp)+(5*mpref)),y7label,mpref,buth,
0, 0, 0, 0, 0, "");
uiDefButF(block, NUMSLI, B_DRAWINFO, "Clip Alpha: ",
(xpos+edgsp+(5*mpref)+(5*midsp)),y6,mpref,buth,
&(U.glalphaclip), 0.0, 1.0, 0, 0, "Clip alpha below this threshold in the 3d textured view");
uiDefButBitI(block, TOGN, USER_DISABLE_MIPMAP, B_MIPMAPCHANGED, "Mipmaps",
(xpos+edgsp+(5*mpref)+(5*midsp)),y5,mpref,buth,
&(U.gameflags), 0, 0, 0, 0, "Toggles between mipmap textures on (beautiful) and off (fast)");
/* main choices pup: note, it uses collums, and the seperators (%l) then have to fill both halves equally for the menu to work */
uiDefButS(block, MENU, B_GLRESLIMITCHANGED, "GL Texture Clamp Off%x0|%l|GL Texture Clamp 8192%x8192|GL Texture Clamp 4096%x4096|GL Texture Clamp 2048%x2048|GL Texture Clamp 1024%x1024|GL Texture Clamp 512%x512|GL Texture Clamp 256%x256|GL Texture Clamp 128%x128",
(xpos+edgsp+(5*mpref)+(5*midsp)),y4,mpref,buth, &(U.glreslimit), 0, 0, 0, 0, "Limit the texture size to save graphics memory");
uiDefButBitI(block, TOG, USER_VERTEX_ARRAYS, 0, "Vertex Arrays",
(xpos+edgsp+(5*mpref)+(5*midsp)),y3,mpref,buth,
&(U.gameflags), 0, 0, 0, 0, "Toggles between vertex arrays on (less reliable) and off (more reliable)");
uiDefButI(block, NUM, 0, "Time Out ",
(xpos+edgsp+(5*mpref)+(5*midsp)), y2, mpref, buth,
&U.textimeout, 0.0, 3600.0, 30, 2, "Time since last access of a GL texture in seconds after which it is freed. (Set to 0 to keep textures allocated)");
uiDefButI(block, NUM, 0, "Collect Rate ",
(xpos+edgsp+(5*mpref)+(5*midsp)), y1, mpref, buth,
&U.texcollectrate, 1.0, 3600.0, 30, 2, "Number of seconds between each run of the GL texture garbage collector.");
uiDefBut(block, LABEL,0,"Audio mixing buffer:",
(xpos+edgsp+(2*midsp)+(2*mpref)),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButI(block, ROW, 0, "256",
(xpos+edgsp+(2*midsp)+(2*mpref)),y2,(mpref/4),buth,
&U.mixbufsize, 2.0, 256.0, 0, 0, "Set audio mixing buffer size to 256 samples");
uiDefButI(block, ROW, 0, "512",
(xpos+edgsp+(2*midsp)+(2*mpref)+(mpref/4)),y2,(mpref/4),buth,
&U.mixbufsize, 2.0, 512.0, 0, 0, "Set audio mixing buffer size to 512 samples");
uiDefButI(block, ROW, 0, "1024",
(xpos+edgsp+(2*midsp)+(2*mpref)+(2*mpref/4)),y2,(mpref/4),buth,
&U.mixbufsize, 2.0, 1024.0, 0, 0, "Set audio mixing buffer size to 1024 samples");
uiDefButI(block, ROW, 0, "2048",
(xpos+edgsp+(2*midsp)+(2*mpref)+(3*mpref/4)),y2,(mpref/4),buth,
&U.mixbufsize, 2.0, 2048.0, 0, 0, "Set audio mixing buffer size to 2048 samples");
uiBlockEndAlign(block);
} else if(U.userpref == 5) { /* file paths */
/* yafray: (temporary) path button for yafray xml export, now with fileselect */
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "YFexport: ",
(xpos+edgsp), y2+buth+rspace, lpref-smfileselbut, buth,
U.yfexportdir, 1.0, 63.0, 0, 0,
"The default directory for yafray xml export (must exist!)");
uiDefIconBut(block, BUT, B_YAFRAYDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+lpref-smfileselbut), y2+buth+rspace, smfileselbut, buth,
0, 0, 0, 0, 0, "Select the default yafray export directory");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Fonts: ",
(xpos+edgsp),y2,(lpref-smfileselbut),buth,
U.fontdir, 1.0, 63.0, 0, 0,
"The default directory to search for loading fonts");
uiDefIconBut(block, BUT, B_FONTDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+lpref-smfileselbut),y2,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default font directory");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Textures: ",
(xpos+edgsp+lpref+midsp),y2,(lpref-smfileselbut),buth,
U.textudir, 1.0, 63.0, 0, 0, "The default directory to search for textures");
uiDefIconBut(block, BUT, B_TEXTUDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+(2*lpref)+midsp-smfileselbut),y2,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default texture location");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Tex Plugins: ",
(xpos+edgsp+(2*lpref)+(2*midsp)),y2,(lpref-smfileselbut),buth,
U.plugtexdir, 1.0, 63.0, 0, 0, "The default directory to search for texture plugins");
uiDefIconBut(block, BUT, B_PLUGTEXDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+(3*lpref)+(2*midsp)-smfileselbut),y2,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default texture plugin location");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Seq Plugins: ",
(xpos+edgsp+(3*lpref)+(3*midsp)),y2,(lpref-smfileselbut),buth,
U.plugseqdir, 1.0, 63.0, 0, 0, "The default directory to search for sequence plugins");
uiDefIconBut(block, BUT, B_PLUGSEQDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+(4*lpref)+(3*midsp)-smfileselbut),y2,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default sequence plugin location");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Render: ",
(xpos+edgsp),y1,(lpref-smfileselbut),buth,
U.renderdir, 1.0, 63.0, 0, 0, "The default directory for rendering output");
uiDefIconBut(block, BUT, B_RENDERDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+lpref-smfileselbut),y1,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default render output location");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Python: ",
(xpos+edgsp+lpref+midsp),y1,(lpref-2*smfileselbut),buth,
U.pythondir, 1.0, 63.0, 0, 0, "The default directory to search for Python scripts");
uiDefIconBut(block, BUT, B_PYMENUEVAL, ICON_SCRIPT,
(xpos+edgsp+(2*lpref)+midsp-2*smfileselbut),y1,smfileselbut,buth,
0, 0, 0, 0, 0, "Re-evaluate scripts registration in menus");
uiDefIconBut(block, BUT, B_PYTHONDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+(2*lpref)+midsp-smfileselbut),y1,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default Python script location");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Sounds: ",
(xpos+edgsp+(2*lpref)+(2*midsp)),y1,(lpref-smfileselbut),buth,
U.sounddir, 1.0, 63.0, 0, 0, "The default directory to search for sounds");
uiDefIconBut(block, BUT, B_SOUNDDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+(3*lpref)+(2*midsp)-smfileselbut),y1,smfileselbut,buth,
0, 0, 0, 0, 0, "Selet the default sound location");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Temp: ",
(xpos+edgsp+(3*lpref)+(3*midsp)),y1,(lpref-smfileselbut),buth,
U.tempdir, 1.0, 63.0, 0, 0, "The directory for storing temporary save files");
uiDefIconBut(block, BUT, B_TEMPDIRFILESEL, ICON_FILESEL,
(xpos+edgsp+(4*lpref)+(3*midsp)-smfileselbut),y1,smfileselbut,buth,
0, 0, 0, 0, 0, "Select the default temporary save file location");
uiBlockEndAlign(block);
}
uiDrawBlock(block);
myortho2(-0.375, (float)(sa->winx)-0.375, -0.375, (float)(sa->winy)-0.375);
draw_area_emboss(sa);
/* restore buttons transform */
if(curarea->winx<=1280.0) {
fac= ((float)curarea->winx)/1280.0f;
myortho2(0.0, 1280.0, 0.0, curarea->winy/fac);
}
else {
myortho2(0.0, (float)curarea->winx, 0.0, (float)curarea->winy);
}
sa->win_swap= WIN_BACK_OK;
}
static void winqreadinfospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
if(val) {
if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
switch(event) {
case UI_BUT_EVENT:
if(val==REDRAWTIME) allqueue(REDRAWTIME, 0);
else if(val==B_ADD_THEME) {
bTheme *btheme, *new;
btheme= U.themes.first;
new= MEM_callocN(sizeof(bTheme), "theme");
memcpy(new, btheme, sizeof(bTheme));
BLI_addhead(&U.themes, new);
strcpy(new->name, "New User Theme");
addqueue(sa->win, REDRAW, 1);
}
else if(val==B_DEL_THEME) {
bTheme *btheme= U.themes.first;
BLI_remlink(&U.themes, btheme);
MEM_freeN(btheme);
BIF_SetTheme(sa); /* prevent usage of old theme in calls */
addqueue(sa->win, REDRAW, 1);
}
else if(val==B_NAME_THEME) {
bTheme *btheme= U.themes.first;
if(strcmp(btheme->name, "Default")==0) {
strcpy(btheme->name, "New User Theme");
addqueue(sa->win, REDRAW, 1);
}
}
else if(val==B_UPDATE_THEME) {
allqueue(REDRAWALL, 0);
}
else if(val==B_UPDATE_THEME_ICONS) {
BIF_icons_free();
BIF_icons_init(BIFICONID_LAST+1);
allqueue(REDRAWALL, 0);
}
else if(val==B_CHANGE_THEME) {
th_curcol= TH_BACK; /* backdrop color is always there... */
addqueue(sa->win, REDRAW, 1);
}
else if(val==B_THEME_COPY) {
if(th_curcol_ptr) {
th_curcol_arr[0]= th_curcol_ptr[0];
th_curcol_arr[1]= th_curcol_ptr[1];
th_curcol_arr[2]= th_curcol_ptr[2];
th_curcol_arr[3]= th_curcol_ptr[3];
addqueue(sa->win, REDRAW, 1);
}
}
else if(val==B_THEME_PASTE) {
if(th_curcol_ptr) {
th_curcol_ptr[0]= th_curcol_arr[0];
th_curcol_ptr[1]= th_curcol_arr[1];
th_curcol_ptr[2]= th_curcol_arr[2];
th_curcol_ptr[3]= th_curcol_arr[3];
allqueue(REDRAWALL, 0);
}
}
else if(val==B_RECALCLIGHT) {
if(U.light[0].flag==0 && U.light[1].flag==0 && U.light[2].flag==0)
U.light[0].flag= 1;
default_gl_light();
addqueue(sa->win, REDRAW, 1);
allqueue(REDRAWVIEW3D, 0);
}
else if (val==B_MEMCACHELIMIT) {
printf("Setting memcache limit to %d\n",
U.memcachelimit);
MEM_CacheLimiter_set_maximum(
U.memcachelimit * 1024 * 1024);
}
else do_global_buttons(val);
break;
}
}
}
static void init_infospace(ScrArea *sa)
{
SpaceInfo *sinfo;
sinfo= MEM_callocN(sizeof(SpaceInfo), "initinfo");
BLI_addhead(&sa->spacedata, sinfo);
sinfo->spacetype=SPACE_INFO;
}
/* ******************** SPACE: BUTS ********************** */
extern void drawbutspace(ScrArea *sa, void *spacedata); /* buttons.c */
static void changebutspace(ScrArea *sa, void *spacedata)
{
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);
}
static void winqreadbutspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
SpaceButs *sbuts= curarea->spacedata.first;
ScrArea *sa2, *sa3d;
int nr;
if(val) {
if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
switch(event) {
case UI_BUT_EVENT:
do_butspace(val);
break;
case MIDDLEMOUSE:
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
view2dmove(event); /* in drawipo.c */
break;
case PAGEUPKEY:
event= WHEELUPMOUSE;
view2dmove(event); /* in drawipo.c */
break;
case PAGEDOWNKEY:
event= WHEELDOWNMOUSE;
view2dmove(event); /* in drawipo.c */
break;
case RIGHTMOUSE:
nr= pupmenu("Panel Alignment%t|Horizontal%x1|Vertical%x2|Free %x0");
if (nr>=0) {
sbuts->align= nr;
if(nr) {
uiAlignPanelStep(sa, 1.0);
do_buts_buttons(B_BUTSHOME);
}
}
break;
case PADPLUSKEY:
view2d_zoom(&sbuts->v2d, 0.06f, curarea->winx, curarea->winy);
scrarea_queue_winredraw(curarea);
break;
case PADMINUS:
view2d_zoom(&sbuts->v2d, -0.075f, curarea->winx, curarea->winy);
scrarea_queue_winredraw(curarea);
break;
case RENDERPREVIEW:
BIF_previewrender_buts(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;
sa2= G.curscreen->areabase.first;
while(sa2) {
if(sa2->spacetype==SPACE_VIEW3D) {
if(sa3d) return;
sa3d= sa2;
}
sa2= sa2->next;
}
if(sa3d) {
sa= curarea;
areawinset(sa3d->win);
if(event==PKEY && G.qual==0) start_game();
else if(event==ZKEY) toggle_shading();
else persptoetsen(event);
scrarea_queue_winredraw(sa3d);
scrarea_queue_headredraw(sa3d);
areawinset(sa->win);
}
}
}
}
void set_rects_butspace(SpaceButs *buts)
{
/* buts space goes from (0,0) to (1280, 228) */
buts->v2d.tot.xmin= 0.0f;
buts->v2d.tot.ymin= 0.0f;
buts->v2d.tot.xmax= 1279.0f;
buts->v2d.tot.ymax= 228.0f;
buts->v2d.min[0]= 256.0f;
buts->v2d.min[1]= 42.0f;
buts->v2d.max[0]= 2048.0f;
buts->v2d.max[1]= 450.0f;
buts->v2d.minzoom= 0.5f;
buts->v2d.maxzoom= 1.21f;
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.0f;
G.buts->v2d.tot.ymin= MIN2(0.0f, blocksmin-10.0f);
}
static 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 only does defaults, so after reading a file the cur has not changed */
set_rects_butspace(buts);
buts->v2d.cur= buts->v2d.tot;
buts->ri = NULL;
}
void extern_set_butspace(int fkey, int do_cycle)
{
ScrArea *sa;
SpaceButs *sbuts;
Object *ob= OBACT;
/* when a f-key pressed: 'closest' button window is initialized */
if(curarea->spacetype==SPACE_BUTS) sa= curarea;
else {
/* find area */
sa= G.curscreen->areabase.first;
while(sa) {
if(sa->spacetype==SPACE_BUTS) break;
sa= sa->next;
}
}
if(sa==NULL) return;
if(sa!=curarea) areawinset(sa->win);
sbuts= sa->spacedata.first;
if(!do_cycle) sbuts->oldkeypress= 0;
if(fkey==F4KEY) {
sbuts->mainb= CONTEXT_LOGIC;
}
else if(fkey==F5KEY) {
/* if it's already in shading context, cycle between tabs with the same key */
if (sbuts->oldkeypress == F5KEY) {
if (sbuts->tab[CONTEXT_SHADING]==TAB_SHADING_LAMP)
sbuts->tab[CONTEXT_SHADING]=TAB_SHADING_MAT;
else if (sbuts->tab[CONTEXT_SHADING]==TAB_SHADING_MAT)
sbuts->tab[CONTEXT_SHADING]=TAB_SHADING_TEX;
else if (sbuts->tab[CONTEXT_SHADING]==1) {
sbuts->tab[CONTEXT_SHADING]=TAB_SHADING_RAD;
}
else if (sbuts->tab[CONTEXT_SHADING]==TAB_SHADING_RAD)
sbuts->tab[CONTEXT_SHADING]=TAB_SHADING_WORLD;
else if (sbuts->tab[CONTEXT_SHADING]==TAB_SHADING_WORLD)
sbuts->tab[CONTEXT_SHADING]=TAB_SHADING_LAMP;
}
/* if we're coming in from texture buttons,
or from outside the shading context, just go to the 'default' */
else if (ob) {
sbuts->mainb= CONTEXT_SHADING;
if(ob->type==OB_CAMERA)
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_WORLD;
else if(ob->type==OB_LAMP)
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
else
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
}
else {
sbuts->mainb= CONTEXT_SHADING;
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
}
BIF_preview_changed(ID_TE);
}
else if(fkey==F6KEY) {
sbuts->mainb= CONTEXT_SHADING;
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_TEX;
BIF_preview_changed(ID_TE);
}
else if(fkey==F7KEY) {
/* if it's already in object context, cycle between tabs with the same key */
if (sbuts->oldkeypress == F7KEY) {
if (sbuts->tab[CONTEXT_OBJECT]==TAB_OBJECT_OBJECT)
sbuts->tab[CONTEXT_OBJECT]=TAB_OBJECT_PHYSICS;
else if (sbuts->tab[CONTEXT_OBJECT]==TAB_OBJECT_PHYSICS)
sbuts->tab[CONTEXT_OBJECT]=TAB_OBJECT_OBJECT;
}
else sbuts->mainb= CONTEXT_OBJECT;
}
else if(fkey==F8KEY) {
sbuts->mainb= CONTEXT_SHADING;
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_WORLD;
BIF_preview_changed(ID_TE);
}
else if(fkey==F9KEY) sbuts->mainb= CONTEXT_EDITING;
else if(fkey==F10KEY) {
/* if it's already in scene context, cycle between tabs with the same key */
if (sbuts->oldkeypress == F10KEY) {
if (sbuts->tab[CONTEXT_SCENE]==TAB_SCENE_RENDER)
sbuts->tab[CONTEXT_SCENE]=TAB_SCENE_ANIM;
else if (sbuts->tab[CONTEXT_SCENE]==TAB_SCENE_ANIM)
sbuts->tab[CONTEXT_SCENE]=TAB_SCENE_SOUND;
else if (sbuts->tab[CONTEXT_SCENE]==TAB_SCENE_SOUND)
sbuts->tab[CONTEXT_SCENE]=TAB_SCENE_RENDER;
}
else sbuts->mainb= CONTEXT_SCENE;
}
sbuts->oldkeypress = fkey;
scrarea_queue_headredraw(sa);
scrarea_queue_winredraw(sa);
}
/* ******************** SPACE: SEQUENCE ********************** */
/* extern void drawseqspace(ScrArea *sa, void *spacedata); BIF_drawseq.h */
static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
SpaceSeq *sseq= curarea->spacedata.first;
View2D *v2d= &sseq->v2d;
Sequence *last_seq = get_last_seq();
float dx, dy;
int doredraw= 0, cfra=0, first;
short mval[2];
short nr;
short mousebut = L_MOUSE;
if(curarea->win==0) return;
if(val) {
if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
if (event == LEFTMOUSE) {
event = RIGHTMOUSE;
mousebut = L_MOUSE;
} else if (event == RIGHTMOUSE) {
event = LEFTMOUSE;
mousebut = R_MOUSE;
}
}
switch(event) {
case UI_BUT_EVENT:
do_seqbuttons(val);
break;
case LEFTMOUSE:
if(sseq->mainb || view2dmove(event)==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(0);
update_for_newframe(); /* for audio scrubbing */
}
else PIL_sleep_ms(30);
} while(get_mbut() & mousebut);
set_special_seq_update(0);
if (cfra == 0)
update_for_newframe();
}
break;
case MIDDLEMOUSE:
if(sseq->mainb) seq_viewmove(sseq);
else view2dmove(event); /* in drawipo.c */
break;
case RIGHTMOUSE:
if(sseq->mainb) break;
mouse_select_seq();
break;
case PADPLUSKEY:
if (G.qual==LR_CTRLKEY) {
select_more_seq();
break;
}
case WHEELUPMOUSE:
if(sseq->mainb) {
sseq->zoom++;
if(sseq->zoom==-1) sseq->zoom= 1;
if(sseq->zoom>8) sseq->zoom= 8;
}
else {
if((G.qual==0)) {
dx= 0.1154f*(v2d->cur.xmax-v2d->cur.xmin);
v2d->cur.xmin+= dx;
v2d->cur.xmax-= dx;
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(sa, V2D_LOCK_COPY);
}
else if((G.qual==LR_SHIFTKEY)) {
insert_gap(25, CFRA);
BIF_undo_push("Insert gaps Sequencer");
allqueue(REDRAWSEQ, 0);
}
else if(G.qual==LR_ALTKEY) {
insert_gap(250, CFRA);
BIF_undo_push("Insert gaps Sequencer");
allqueue(REDRAWSEQ, 0);
}
}
doredraw= 1;
break;
case PADMINUS:
if (G.qual==LR_CTRLKEY) {
select_less_seq();
break;
}
case WHEELDOWNMOUSE:
if(sseq->mainb) {
sseq->zoom--;
if(sseq->zoom==0) sseq->zoom= -2;
if(sseq->zoom<-8) sseq->zoom= -8;
}
else {
if((G.qual==LR_SHIFTKEY))
no_gaps();
else if((G.qual==0)) {
dx= 0.15f*(v2d->cur.xmax-v2d->cur.xmin);
v2d->cur.xmin-= dx;
v2d->cur.xmax+= dx;
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(sa, V2D_LOCK_COPY);
}
}
doredraw= 1;
break;
case HOMEKEY:
if((G.qual==0))
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 (G.qual == LR_CTRLKEY) {
deselect_markers(1, 0);
allqueue(REDRAWMARKER, 0);
} else {
if(sseq->mainb) break;
if((G.qual==LR_SHIFTKEY)) {
add_sequence(-1);
} else if((G.qual==0)) {
swap_select_seq();
}
}
break;
case SPACEKEY:
if (G.qual==0) {
if (sseq->mainb) {
play_anim(1);
} else {
add_sequence(-1);
}
}
break;
case BKEY:
if(sseq->mainb) break;
if((G.qual==0))
borderselect_seq();
break;
case CKEY:
if((G.qual==0)) {
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 (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
duplicate_marker();
else if ((G.qual==LR_SHIFTKEY)) {
if(sseq->mainb) break;
add_duplicate_seq();
}
break;
case EKEY:
if(sseq->mainb) break;
if((G.qual==0))
transform_seq('e', 0);
break;
case FKEY:
if((G.qual==0))
set_filter_seq();
break;
case GKEY:
if (G.qual & LR_CTRLKEY)
transform_markers('g', 0);
else if (G.qual==0) {
if(sseq->mainb) break;
transform_seq('g', 0);
}
break;
case KKEY:
if((G.qual==0)) { /* Cut at current frame */
if(okee("Cut strips")) seq_cut(CFRA);
}
break;
case LKEY:
if((G.qual==0)) { /* Cut at current frame */
select_linked_seq( 0 );
} else if((G.qual==LR_CTRLKEY)) { /* Cut at current frame */
select_linked_seq( 2 );
}
break;
case YKEY:
if((G.qual==0)) { /* Cut at current frame */
seq_separate_images();
}
break;
case MKEY:
if(G.qual==LR_ALTKEY) {
un_meta();
break; /*dont redraw timeline etc */
} else if((G.qual==0)){
if ((last_seq) &&
(last_seq->type == SEQ_RAM_SOUND
|| last_seq->type == SEQ_HD_SOUND))
{
last_seq->flag ^= SEQ_MUTE;
doredraw = 1;
} else {
make_meta();
}
break; /*dont redraw timeline etc */
} else if ((G.qual==(LR_CTRLKEY|LR_ALTKEY) )) {
add_marker(CFRA);
} else if ((G.qual==LR_CTRLKEY)) {
rename_marker();
} else {
break; /* do nothing */
}
allqueue(REDRAWMARKER, 0);
break;
case NKEY:
if(G.qual==0) {
toggle_blockhandler(curarea, SEQ_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
scrarea_queue_winredraw(curarea);
}
break;
case RKEY:
if((G.qual==LR_SHIFTKEY))
seq_remap_paths();
else
reassign_inputs_seq_effect();
break;
case SKEY:
if((G.qual==LR_SHIFTKEY))
seq_snap_menu();
break;
case PKEY:
if((G.qual==0))
touch_seq_files();
break;
case TKEY: /* popup menu */
nr= pupmenu("Time value%t|Frames %x1|Seconds%x2");
if (nr>0) {
if(nr==1) sseq->flag |= SEQ_DRAWFRAMES;
else sseq->flag &= ~SEQ_DRAWFRAMES;
doredraw= 1;
}
break;
case XKEY:
case DELKEY:
if(G.qual==0) {
if(sseq->mainb) break;
if((G.qual==0))
del_seq();
}
break;
}
}
if(doredraw) scrarea_queue_winredraw(curarea);
}
static void init_seqspace(ScrArea *sa)
{
SpaceSeq *sseq;
sseq= MEM_callocN(sizeof(SpaceSeq), "initseqspace");
BLI_addhead(&sa->spacedata, sseq);
sseq->spacetype= SPACE_SEQ;
sseq->zoom= 4;
sseq->blockscale= 0.7;
sseq->chanshown = 0;
/* seq space goes from (0,8) to (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.1f;
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(ScrArea *sa, void *spacedata);
extern void winqreadactionspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void changeactionspace(ScrArea *sa, void *spacedata)
{
if(G.v2d==0) return;
/* this sets the sub-areas correct, for scrollbars */
test_view2d(G.v2d, sa->winx, sa->winy);
/* action space uses weird matrices... local calculated in a function */
/* myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax); */
}
static void init_actionspace(ScrArea *sa)
{
SpaceAction *saction;
saction= MEM_callocN(sizeof(SpaceAction), "initactionspace");
BLI_addhead(&sa->spacedata, saction);
saction->spacetype= SPACE_ACTION;
saction->blockscale= 0.7;
saction->v2d.tot.xmin= 1.0;
saction->v2d.tot.ymin= -1000.0;
saction->v2d.tot.xmax= 1000.0;
saction->v2d.tot.ymax= 0.0;
saction->v2d.cur.xmin= -5.0;
saction->v2d.cur.ymin= -75.0;
saction->v2d.cur.xmax= 65.0;
saction->v2d.cur.ymax= 5.0;
saction->v2d.min[0]= 0.0;
saction->v2d.min[1]= 0.0;
saction->v2d.max[0]= 32000.0;
saction->v2d.max[1]= 1000.0;
saction->v2d.minzoom= 0.01;
saction->v2d.maxzoom= 50;
saction->v2d.scroll= R_SCROLL+B_SCROLL;
saction->v2d.keepaspect= 0;
saction->v2d.keepzoom= V2D_LOCKZOOM_Y;
saction->v2d.keeptot= 0;
}
static 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 ********************** */
static 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->blockscale= 0.7;
sfile->spacetype= SPACE_FILE;
}
/* ******************** SPACE: SOUND ********************** */
extern void drawsoundspace(ScrArea *sa, void *spacedata);
extern void winqreadsoundspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void init_soundspace(ScrArea *sa)
{
SpaceSound *ssound;
ssound= MEM_callocN(sizeof(SpaceSound), "initsoundspace");
BLI_addhead(&sa->spacedata, ssound);
ssound->spacetype= SPACE_SOUND;
ssound->blockscale= 0.7;
/* sound space goes from (0,8) to (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.1f;
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 ********************** */
static void changeimagepace(ScrArea *sa, void *spacedata)
{
image_preview_event(2);
}
static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
SpaceImage *sima= spacedata;
unsigned short event= evt->event;
short val= evt->val;
if(val==0) return;
if(uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0;
if (U.flag & USER_LMOUSESELECT) {
if (event == LEFTMOUSE) {
event = RIGHTMOUSE;
} else if (event == RIGHTMOUSE) {
event = LEFTMOUSE;
}
}
if (sima->image && (sima->flag & SI_DRAWTOOL)) {
switch(event) {
case CKEY:
toggle_blockhandler(sa, IMAGE_HANDLER_PAINT, UI_PNL_UNSTOW);
scrarea_queue_winredraw(sa);
break;
case LEFTMOUSE:
imagepaint_paint(L_MOUSE, 0);
break;
case RIGHTMOUSE:
imagepaint_pick(R_MOUSE);
break;
}
}
else if (G.obedit) {
/* Draw tool is inactive, editmode is enabled and the image is not a render or composite */
if (EM_texFaceCheck() && (G.sima->image==0 || (G.sima->image->type != IMA_TYPE_R_RESULT && G.sima->image->type != IMA_TYPE_COMPOSITE))) {
switch(event) {
case LEFTMOUSE:
if(G.qual == LR_SHIFTKEY) {
if(G.sima->image && G.sima->image->tpageflag & IMA_TILES) {
mouseco_to_curtile();
}
} else if (!gesture()) {
mouseco_to_cursor_sima();
}
break;
case RIGHTMOUSE:
mouse_select_sima();
break;
case AKEY:
select_swap_tface_uv();
break;
case BKEY:
if(G.qual==LR_SHIFTKEY)
borderselect_sima(UV_SELECT_PINNED);
else if((G.qual==0))
borderselect_sima(UV_SELECT_ALL);
break;
case CKEY:
if (G.sima->flag & SI_SYNC_UVSEL) {
/* operate on the editmesh */
if (G.qual==0) {
if (G.scene->selectmode != SCE_SELECT_FACE) {
G.sima->flag ^= SI_SELACTFACE;
scrarea_queue_winredraw(curarea);
}
} else {
error("Sync selection to Edit Mesh disables UV select options");
}
} else {
/* normal operaton */
if(G.qual==LR_CTRLKEY) {
G.sima->sticky = SI_STICKY_VERTEX;
scrarea_do_headdraw(curarea);
} else if(G.qual==LR_SHIFTKEY) {
G.sima->sticky = SI_STICKY_DISABLE;
scrarea_do_headdraw(curarea);
} else if(G.qual==LR_ALTKEY) {
G.sima->sticky = SI_STICKY_LOC;
scrarea_do_headdraw(curarea);
} else {
G.sima->flag ^= SI_SELACTFACE;
scrarea_queue_winredraw(curarea);
}
}
break;
case EKEY :
if(okee("Unwrap"))
unwrap_lscm(0);
break;
case HKEY:
if(G.qual==LR_ALTKEY)
reveal_tface_uv();
else if((G.qual==LR_SHIFTKEY))
hide_tface_uv(1);
else if((G.qual==0))
hide_tface_uv(0);
break;
case LKEY:
if(G.qual==0)
select_linked_tface_uv(0);
else if(G.qual==LR_SHIFTKEY)
select_linked_tface_uv(1);
else if(G.qual==LR_CTRLKEY)
select_linked_tface_uv(2);
else if(G.qual==LR_ALTKEY)
unlink_selection();
break;
case PKEY:
if(G.qual==LR_CTRLKEY)
pack_charts_tface_uv();
else if(G.qual==LR_SHIFTKEY)
select_pinned_tface_uv();
else if(G.qual==LR_ALTKEY)
pin_tface_uv(0);
else
pin_tface_uv(1);
break;
case GKEY:
if((G.qual==0) && is_uv_tface_editing_allowed()) {
initTransform(TFM_TRANSLATION, CTX_NONE);
Transform();
}
break;
case RKEY:
if((G.qual==0) && is_uv_tface_editing_allowed()) {
initTransform(TFM_ROTATION, CTX_NONE);
Transform();
}
break;
case SKEY:
if (is_uv_tface_editing_allowed()) {
if ( G.qual==LR_SHIFTKEY) {
/* Snap */
snap_menu_sima();
} else if (G.qual==0) {
initTransform(TFM_RESIZE, CTX_NONE);
Transform();
}
}
break;
case VKEY:
if(G.qual == 0)
stitch_vert_uv_tface();
else if(G.qual==LR_SHIFTKEY)
stitch_limit_uv_tface();
else if(G.qual==LR_CTRLKEY)
minimize_stretch_tface_uv();
break;
case WKEY:
weld_align_menu_tface_uv();
break;
case MKEY:
if((G.qual==0))
mirrormenu_tface_uv();
break;
case COMMAKEY:
if(G.qual==LR_SHIFTKEY) {
G.v2d->around= V3D_CENTROID;
} else if(G.qual==0) {
G.v2d->around= V3D_CENTER;
}
scrarea_queue_headredraw(curarea);
scrarea_queue_winredraw(curarea);
break;
case PERIODKEY:
if(G.qual==LR_CTRLKEY) {
G.v2d->around= V3D_LOCAL;
} else if(G.qual==0) {
G.v2d->around= V3D_CURSOR;
}
scrarea_queue_headredraw(curarea);
scrarea_queue_winredraw(curarea);
break;
case PADPERIOD:
if(G.qual==0)
image_viewcenter();
break;
case OKEY:
if(G.qual==0) {
G.scene->proportional= !G.scene->proportional;
allqueue(REDRAWHEADERS, 0);
} else if (G.qual==LR_SHIFTKEY) {
G.scene->prop_mode = (G.scene->prop_mode+1)%7;
allqueue(REDRAWHEADERS, 0);
}
break;
case PADSLASHKEY:
if(G.qual==0)
G.sima->flag ^= SI_LOCAL_UV;
scrarea_queue_winredraw(curarea);
break;
case TABKEY:
if (G.qual == LR_SHIFTKEY) {
G.scene->snap_flag ^= SCE_SNAP;
allqueue(REDRAWHEADERS, 0);
}
break;
}
}
} else {
/* Draw and editmode are inactive */
switch(event) {
case LEFTMOUSE:
sima_sample_color();
break;
case RIGHTMOUSE:
if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT))
sample_vpaint();
break;
case NKEY:
if(G.qual==LR_CTRLKEY)
replace_names_but();
break;
case PKEY:
if(G.qual==LR_SHIFTKEY) {
toggle_blockhandler(sa, IMAGE_HANDLER_PREVIEW, 0);
scrarea_queue_winredraw(sa);
}
break;
}
}
/* least intrusive nonumpad hack, only for plus/minus */
if (U.flag & USER_NONUMPAD) {
event= convert_for_nonumpad(event);
}
/* Events handled always (whether the draw tool is active or not) */
switch (event) {
case UI_BUT_EVENT:
do_image_buttons(val); /* header_image.c */
break;
case MIDDLEMOUSE:
if((G.qual==LR_CTRLKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_CTRLKEY))))
image_viewmove(1);
else
image_viewmove(0);
break;
case WHEELUPMOUSE: case WHEELDOWNMOUSE: case PADPLUSKEY: case PADMINUS:
case PAD1: case PAD2: case PAD4: case PAD8:
image_viewzoom(event, (G.qual & LR_SHIFTKEY)==0);
scrarea_queue_winredraw(sa);
break;
case HOMEKEY:
if((G.qual==0))
image_home();
break;
case NKEY:
if(G.qual==LR_ALTKEY) {
new_image_sima();
} else if(G.qual==0) {
/*if (EM_texFaceCheck()) {
toggle_blockhandler(sa, IMAGE_HANDLER_TRANSFORM_PROPERTIES, UI_PNL_TO_MOUSE);
} else {
toggle_blockhandler(sa, IMAGE_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
}*/
toggle_blockhandler(sa, IMAGE_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
scrarea_queue_winredraw(sa);
}
break;
case OKEY:
if (G.qual & LR_ALTKEY)
open_image_sima(G.qual & LR_CTRLKEY);
break;
case RKEY:
if(G.qual==LR_ALTKEY)
reload_image_sima();
break;
case SKEY:
if(G.qual & LR_ALTKEY)
save_image_sima();
break;
case ESCKEY:
if(sima->flag & SI_PREVSPACE) {
/* only allow ESC once */
sima->flag &= ~SI_PREVSPACE;
sima= sa->spacedata.first;
if(sima->next) {
SpaceLink *sl;
BLI_remlink(&sa->spacedata, sima);
BLI_addtail(&sa->spacedata, sima);
sl= sa->spacedata.first;
newspace(sa, sl->spacetype);
}
}
if(sima->flag & SI_FULLWINDOW) {
sima->flag &= ~SI_FULLWINDOW;
if(sa->full)
area_fullscreen();
}
}
}
static 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;
sima->blockscale= 0.7;
sima->iuser.ok= 1;
sima->iuser.fie_ima= 2;
sima->iuser.frames= 100;
}
/* ******************** SPACE: IMASEL ********************** */
extern void drawimaselspace(ScrArea *sa, void *spacedata);
extern void winqreadimaselspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void changeimaselspace(ScrArea *sa, void *spacedata)
{
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);
}
static void init_imaselspace(ScrArea *sa)
{
SpaceImaSel *simasel;
simasel= MEM_callocN(sizeof(SpaceImaSel), "init imaselspace");
BLI_addhead(&sa->spacedata, simasel);
simasel->spacetype= SPACE_IMASEL;
simasel->blockscale= 0.7;
/* view 2D */
simasel->v2d.tot.xmin= -10.0;
simasel->v2d.tot.ymin= -10.0;
simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
simasel->v2d.cur.xmin= 0.0;
simasel->v2d.cur.ymin= 0.0;
simasel->v2d.cur.xmax= (float)sa->winx;
simasel->v2d.cur.ymax= (float)sa->winy;
simasel->v2d.min[0]= 1.0;
simasel->v2d.min[1]= 1.0;
simasel->v2d.max[0]= 32000.0f;
simasel->v2d.max[1]= 32000.0f;
simasel->v2d.minzoom= 0.5f;
simasel->v2d.maxzoom= 1.21f;
simasel->v2d.scroll= 0;
simasel->v2d.keepaspect= 1;
simasel->v2d.keepzoom= 1;
simasel->v2d.keeptot= 0;
simasel->prv_h = 96;
simasel->prv_w = 96;
simasel->flag = 7; /* ??? elubie */
strcpy (simasel->dir, U.textudir); /* TON */
strcpy (simasel->file, "");
simasel->returnfunc = 0;
simasel->title[0] = 0;
simasel->type = FILE_UNIX;
simasel->files = BIF_filelist_new();
}
/* ******************** SPACE: OOPS ********************** */
extern void drawoopsspace(ScrArea *sa, void *spacedata);
static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
SpaceOops *soops= curarea->spacedata.first;
View2D *v2d= &soops->v2d;
float dx, dy;
if(val==0) return;
if( uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0;
if (U.flag & USER_NONUMPAD) {
event= convert_for_nonumpad(event);
}
/* keep leftmouse select for outliner, regardless of user pref */
if(soops->type==SO_OUTLINER) {
switch(event) {
case LEFTMOUSE:
case RIGHTMOUSE:
outliner_mouse_event(sa, event);
break;
case MIDDLEMOUSE:
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
view2dmove(event); /* in drawipo.c */
soops->storeflag |= SO_TREESTORE_REDRAW;
break;
case AKEY:
if(G.qual==LR_SHIFTKEY)
outliner_toggle_selected(sa);
else
outliner_toggle_visible(sa);
break;
case FKEY:
{
/* search */
int search_flags=0, again=0;
/* CTRL=case sensitive, SHIFT=find again, ALT=complete */
if (G.qual & LR_CTRLKEY) search_flags |= 1;
if (G.qual & LR_ALTKEY) search_flags |= 8;
if (G.qual & LR_SHIFTKEY) again = 1;
outliner_find_panel(sa, again, search_flags);
}
break;
case XKEY:
case DELKEY:
outliner_del(sa);
break;
case WKEY:
outliner_operation_menu(sa);
break;
case HOMEKEY:
outliner_show_hierarchy(sa);
break;
case PAGEUPKEY:
outliner_page_up_down(sa, 1);
break;
case PAGEDOWNKEY:
outliner_page_up_down(sa, -1);
break;
case RETKEY:
case PADENTER:
outliner_mouse_event(sa, event);
break;
case PERIODKEY:
case PADPERIOD:
outliner_show_active(sa);
break;
case PADPLUSKEY:
outliner_one_level(sa, 1);
break;
case PADMINUS:
outliner_one_level(sa, -1);
break;
}
}
else {
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
if (event==LEFTMOUSE) event = RIGHTMOUSE;
else if (event==RIGHTMOUSE) event = LEFTMOUSE;
}
switch(event) {
case LEFTMOUSE:
gesture();
break;
case MIDDLEMOUSE:
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
view2dmove(event); /* 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:
if((G.qual==0))
do_oops_buttons(B_OOPSHOME);
break;
case PADPERIOD:
if((G.qual==0))
do_oops_buttons(B_OOPSVIEWSEL);
break;
case AKEY:
if((G.qual==0)) {
swap_select_all_oops();
scrarea_queue_winredraw(curarea);
}
break;
case BKEY:
if((G.qual==0))
borderselect_oops();
break;
case GKEY:
if((G.qual==0))
transform_oops('g', 0);
break;
case LKEY:
if((G.qual==LR_SHIFTKEY))
select_backlinked_oops();
else if((G.qual==0))
select_linked_oops();
break;
case SKEY:
if((G.qual==LR_ALTKEY)) {
if (okee("Shrink blocks")) {
shrink_oops();
}
} else if((G.qual==LR_SHIFTKEY)) {
if (okee("Shuffle blocks")) {
shuffle_oops();
}
} else if((G.qual==0)) {
transform_oops('s', 0);
}
break;
case PKEY:
if((G.qual==LR_CTRLKEY)) {
make_parent();
} else if((G.qual==LR_ALTKEY)) {
clear_parent();
}
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(ScrArea *sa, SpaceOops *soops)
{
View2D *v2d= &soops->v2d;
if(soops->type==SO_OUTLINER) {
/* outliner space is window size */
calc_scrollrcts(sa, v2d, sa->winx, sa->winy);
v2d->tot.xmax= (v2d->mask.xmax-v2d->mask.xmin);
v2d->tot.ymax= (v2d->mask.ymax-v2d->mask.ymin);
v2d->tot.xmin= 0.0;
v2d->tot.ymin= 0.0;
v2d->cur= v2d->tot;
v2d->min[0]= v2d->tot.xmin;
v2d->min[1]= v2d->tot.ymin;
v2d->max[0]= v2d->tot.xmax;
v2d->max[1]= v2d->tot.ymax;
v2d->minzoom= 1.0;
v2d->maxzoom= 1.0;
/* B_SCROLLO used here instead of B_SCROLL, to stop old blender's hanging on
* loading a file from a version with horizontal scrolling due to an old bug
*/
v2d->scroll= L_SCROLL+B_SCROLLO;
v2d->keepaspect= 1;
v2d->keepzoom= 1;
/* NOTE: keeptot is 2, as keeptot!=0 makes sure it does get
* too freely scrolled on x-axis, but keeptot=1 will result
* in a snap-back when clicking on elements
*/
v2d->keeptot= 2;
}
else {
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.01f;
v2d->maxzoom= 2.0;
/* v2d->scroll= L_SCROLL+B_SCROLL; */
v2d->scroll= 0;
v2d->keepaspect= 1;
v2d->keepzoom= 0;
v2d->keeptot= 0;
}
}
static 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;
/* new oops is default an outliner */
soops->type= SO_OUTLINER;
soops->spacetype= SPACE_OOPS;
soops->blockscale= 0.7;
init_v2d_oops(sa, soops);
}
/* ******************** SPACE: NLA ********************** */
static void init_nlaspace(ScrArea *sa)
{
SpaceNla *snla;
snla= MEM_callocN(sizeof(SpaceNla), "initnlaspace");
BLI_addhead(&sa->spacedata, snla);
snla->spacetype= SPACE_NLA;
snla->blockscale= 0.7;
snla->v2d.tot.xmin= 1.0;
snla->v2d.tot.ymin= 0.0;
snla->v2d.tot.xmax= 1000.0;
snla->v2d.tot.ymax= 1000.0;
snla->v2d.cur.xmin= -5.0;
snla->v2d.cur.ymin= 0.0;
snla->v2d.cur.xmax= 65.0;
snla->v2d.cur.ymax= 1000.0;
snla->v2d.min[0]= 0.0;
snla->v2d.min[1]= 0.0;
snla->v2d.max[0]= 1000.0;
snla->v2d.max[1]= 1000.0;
snla->v2d.minzoom= 0.1F;
snla->v2d.maxzoom= 50;
snla->v2d.scroll= R_SCROLL+B_SCROLL;
snla->v2d.keepaspect= 0;
snla->v2d.keepzoom= V2D_LOCKZOOM_Y;
snla->v2d.keeptot= 0;
snla->lock = 0;
}
/* ******************** SPACE: Text ********************** */
extern void drawtextspace(ScrArea *sa, void *spacedata);
extern void winqreadtextspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void init_textspace(ScrArea *sa)
{
SpaceText *st;
st= MEM_callocN(sizeof(SpaceText), "inittextspace");
BLI_addhead(&sa->spacedata, st);
st->spacetype= SPACE_TEXT;
st->blockscale= 0.7;
st->text= NULL;
st->flags= 0;
st->font_id= 5;
st->lheight= 12;
st->showlinenrs= 0;
st->tabnumber = 4;
st->currtab_set = 0;
st->top= 0;
}
/* ******************** SPACE: Script ********************** */
extern void drawscriptspace(ScrArea *sa, void *spacedata);
extern void winqreadscriptspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void init_scriptspace(ScrArea *sa)
{
SpaceScript *sc;
sc = MEM_callocN(sizeof(SpaceScript), "initscriptspace");
BLI_addhead(&sa->spacedata, sc);
sc->spacetype = SPACE_SCRIPT;
sc->blockscale= 0.7;
sc->script = NULL;
sc->flags = 0;
}
/* ******************** SPACE: Time ********************** */
extern void drawtimespace(ScrArea *sa, void *spacedata);
extern void winqreadtimespace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void init_timespace(ScrArea *sa)
{
SpaceTime *stime;
stime= MEM_callocN(sizeof(SpaceTime), "init timespace");
BLI_addhead(&sa->spacedata, stime);
stime->spacetype= SPACE_TIME;
stime->blockscale= 0.7;
stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
stime->v2d.tot.xmin= -4.0;
stime->v2d.tot.ymin= 0.0;
stime->v2d.tot.xmax= (float)EFRA + 4.0;
stime->v2d.tot.ymax= (float)sa->winy;
stime->v2d.cur= stime->v2d.tot;
stime->v2d.min[0]= 1.0;
stime->v2d.min[1]= (float)sa->winy;
stime->v2d.max[0]= 32000.0;
stime->v2d.max[1]= (float)sa->winy;
stime->v2d.minzoom= 0.1f;
stime->v2d.maxzoom= 10.0;
stime->v2d.scroll= 0;
stime->v2d.keepaspect= 0;
stime->v2d.keepzoom= 0;
stime->v2d.keeptot= 0;
stime->flag |= TIME_DRAWFRAMES;
}
/* ******************** SPACE: Nodes ********************** */
extern void drawnodespace(ScrArea *sa, void *spacedata);
extern void winqreadnodespace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void init_nodespace(ScrArea *sa)
{
SpaceNode *snode;
snode= MEM_callocN(sizeof(SpaceNode), "init nodespace");
BLI_addhead(&sa->spacedata, snode);
snode->spacetype= SPACE_NODE;
snode->blockscale= 0.7;
snode->v2d.tot.xmin= -10.0;
snode->v2d.tot.ymin= -10.0;
snode->v2d.tot.xmax= (float)sa->winx + 10.0f;
snode->v2d.tot.ymax= (float)sa->winy + 10.0f;
snode->v2d.cur.xmin= 0.0;
snode->v2d.cur.ymin= 0.0;
snode->v2d.cur.xmax= (float)sa->winx;
snode->v2d.cur.ymax= (float)sa->winy;
snode->v2d.min[0]= 1.0;
snode->v2d.min[1]= 1.0;
snode->v2d.max[0]= 32000.0f;
snode->v2d.max[1]= 32000.0f;
snode->v2d.minzoom= 0.5f;
snode->v2d.maxzoom= 1.21f;
snode->v2d.scroll= 0;
snode->v2d.keepaspect= 1;
snode->v2d.keepzoom= 1;
snode->v2d.keeptot= 0;
}
/* ******************** SPACE: GENERAL ********************** */
void newspace(ScrArea *sa, int type)
{
int xtra= type & 256; /* hack to enforce outliner with hotkey from toets.c */
type &= ~256;
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);
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_SCRIPT)
init_scriptspace(sa);
else if(type==SPACE_SOUND)
init_soundspace(sa);
else if(type==SPACE_NLA)
init_nlaspace(sa);
else if(type==SPACE_TIME)
init_timespace(sa);
else if(type==SPACE_NODE)
init_nodespace(sa);
sl= sa->spacedata.first;
sl->area= sa;
}
areawinset(sa->win);
bwin_clear_viewmat(sa->win);
}
}
/* exception: filespace */
if(sa->spacetype==SPACE_FILE) {
SpaceFile *sfile= sa->spacedata.first;
if(sfile->type==FILE_MAIN) {
freefilelist(sfile);
} else {
sfile->type= FILE_UNIX;
}
sfile->returnfunc= NULL;
sfile->title[0]= 0;
if(sfile->filelist) test_flags_file(sfile);
}
/* exception: imasel space */
else if(sa->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= sa->spacedata.first;
if(simasel->type==FILE_MAIN) {
if (simasel->files) {
BIF_filelist_free(simasel->files);
BIF_filelist_settype(simasel->files, FILE_MAIN);
}
} else {
if (simasel->files) {
simasel->type= FILE_UNIX;
BIF_filelist_settype(simasel->files, simasel->type);
}
}
simasel->returnfunc= NULL;
simasel->title[0]= 0;
}
else if(sa->spacetype==SPACE_OOPS) {
SpaceOops *so= sa->spacedata.first;
if(xtra && so->type!=SO_OUTLINER) {
so->type= SO_OUTLINER;
init_v2d_oops(sa, so);
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
}
}
void freespacelist(ScrArea *sa)
{
SpaceLink *sl;
for (sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_FILE) {
SpaceFile *sfile= (SpaceFile*) sl;
if(sfile->libfiledata)
BLO_blendhandle_close(sfile->libfiledata);
if(sfile->filelist)
freefilelist(sfile);
if(sfile->pupmenu)
MEM_freeN(sfile->pupmenu);
}
else if(sl->spacetype==SPACE_BUTS) {
SpaceButs *buts= (SpaceButs*) sl;
if(buts->ri) {
if (buts->ri->rect) MEM_freeN(buts->ri->rect);
MEM_freeN(buts->ri);
}
if(G.buts==buts) G.buts= NULL;
}
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= NULL;
}
else if(sl->spacetype==SPACE_VIEW3D) {
View3D *vd= (View3D*) sl;
if(vd->bgpic) {
if(vd->bgpic->ima) vd->bgpic->ima->id.us--;
MEM_freeN(vd->bgpic);
}
if(vd->localvd) MEM_freeN(vd->localvd);
if(vd->clipbb) MEM_freeN(vd->clipbb);
if(vd->depths) {
if(vd->depths->depths) MEM_freeN(vd->depths->depths);
MEM_freeN(vd->depths);
vd->depths= NULL;
}
retopo_free_view_data(vd);
if(vd->properties_storage) MEM_freeN(vd->properties_storage);
if(G.vd==vd) G.vd= NULL;
if(vd->ri) {
BIF_view3d_previewrender_free(vd);
}
}
else if(sl->spacetype==SPACE_OOPS) {
SpaceOops *so= (SpaceOops *) sl;
free_oopspace(so);
}
else if(sl->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= (SpaceImaSel*) sl;
free_imasel(simasel);
}
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_SCRIPT) {
free_scriptspace((SpaceScript *)sl);
}
else if(sl->spacetype==SPACE_SOUND) {
free_soundspace((SpaceSound *)sl);
}
else if(sl->spacetype==SPACE_IMAGE) {
SpaceImage *sima= (SpaceImage *)sl;
if(sima->cumap)
curvemapping_free(sima->cumap);
if(sima->info_str)
MEM_freeN(sima->info_str);
if(sima->info_spare)
MEM_freeN(sima->info_spare);
if(sima->spare)
IMB_freeImBuf(sima->spare);
}
else if(sl->spacetype==SPACE_NODE) {
/* SpaceNode *snode= (SpaceNode *)sl; */
}
}
BLI_freelistN(&sa->spacedata);
}
/* can be called for area-full, so it should keep interesting stuff */
void duplicatespacelist(ScrArea *newarea, ListBase *lb1, ListBase *lb2)
{
SpaceLink *sl;
duplicatelist(lb1, lb2);
/* lb1 is copy from lb2, from lb2 we free stuff, rely on event system to properly re-alloc */
sl= lb2->first;
while(sl) {
if(sl->spacetype==SPACE_FILE) {
SpaceFile *sfile= (SpaceFile*) sl;
sfile->libfiledata= NULL;
sfile->filelist= NULL;
sfile->pupmenu= NULL;
sfile->menup= NULL;
}
else if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*)sl;
BIF_view3d_previewrender_free(v3d);
v3d->depths= NULL;
v3d->retopo_view_data= NULL;
}
else if(sl->spacetype==SPACE_OOPS) {
SpaceOops *so= (SpaceOops *)sl;
so->oops.first= so->oops.last= NULL;
so->tree.first= so->tree.last= NULL;
so->treestore= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= (SpaceImaSel*) sl;
simasel->pupmenu= NULL;
simasel->menup= NULL;
simasel->files = BIF_filelist_new();
BIF_filelist_setdir(simasel->files, simasel->dir);
BIF_filelist_settype(simasel->files, simasel->type);
/* see SPACE_FILE - elubie */
}
else if(sl->spacetype==SPACE_NODE) {
SpaceNode *snode= (SpaceNode *)sl;
snode->nodetree= NULL;
}
sl= sl->next;
}
/* but some things we copy */
sl= lb1->first;
while(sl) {
sl->area= newarea;
if(sl->spacetype==SPACE_BUTS) {
SpaceButs *buts= (SpaceButs *)sl;
buts->ri= NULL;
}
else if(sl->spacetype==SPACE_FILE) {
SpaceFile *sfile= (SpaceFile*) sl;
sfile->menup= NULL;
}
else if(sl->spacetype==SPACE_IPO) {
SpaceIpo *si= (SpaceIpo *)sl;
si->editipo= NULL;
si->ipokey.first= si->ipokey.last= NULL;
}
else if(sl->spacetype==SPACE_VIEW3D) {
View3D *vd= (View3D *)sl;
if(vd->bgpic) {
vd->bgpic= MEM_dupallocN(vd->bgpic);
if(vd->bgpic->ima) vd->bgpic->ima->id.us++;
}
vd->clipbb= MEM_dupallocN(vd->clipbb);
vd->ri= NULL;
vd->properties_storage= NULL;
}
else if(sl->spacetype==SPACE_IMAGE) {
SpaceImage *sima= (SpaceImage *)sl;
if(sima->cumap)
sima->cumap= curvemapping_copy(sima->cumap);
if(sima->info_str)
sima->info_str= MEM_dupallocN(sima->info_str);
if(sima->info_spare)
sima->info_spare= MEM_dupallocN(sima->info_spare);
}
sl= sl->next;
}
/* again: from old View3D restore localview (because full) */
sl= lb2->first;
while(sl) {
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*) sl;
if(v3d->localvd) {
restore_localviewdata(v3d);
v3d->localvd= NULL;
v3d->properties_storage= NULL;
v3d->localview= 0;
v3d->lay &= 0xFFFFFF;
}
}
sl= sl->next;
}
}
/* is called everywhere in blender */
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_winredraw(sa);
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 (si->pin==0)
si->blocktype= val;
}
}
else if(sa->spacetype==SPACE_OOPS) {
scrarea_queue_winredraw(sa);
}
break;
case REDRAWBUTSALL:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
buts->re_align= 1;
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
break;
case REDRAWBUTSHEAD:
if(sa->spacetype==SPACE_BUTS) {
scrarea_queue_headredraw(sa);
}
break;
case REDRAWBUTSSCENE:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
if(buts->mainb==CONTEXT_SCENE) {
buts->re_align= 1;
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
}
break;
case REDRAWBUTSOBJECT:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
if(buts->mainb==CONTEXT_OBJECT) {
buts->re_align= 1;
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
}
break;
case REDRAWBUTSSHADING:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
if(buts->mainb==CONTEXT_SHADING) {
buts->re_align= 1;
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
}
break;
case REDRAWBUTSEDIT:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
if(buts->mainb==CONTEXT_EDITING) {
buts->re_align= 1;
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
}
break;
case REDRAWBUTSSCRIPT:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
if(buts->mainb==CONTEXT_SCRIPT) {
buts->re_align= 1;
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
}
break;
case REDRAWBUTSLOGIC:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
if(buts->mainb==CONTEXT_LOGIC) {
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 REDRAWSCRIPT:
if (sa->spacetype==SPACE_SCRIPT) {
scrarea_queue_winredraw(sa);
}
break;
case REDRAWSOUND:
if(sa->spacetype==SPACE_SOUND) {
scrarea_queue_headredraw(sa);
scrarea_queue_winredraw(sa);
}
break;
case REDRAWTIME:
if(sa->spacetype==SPACE_TIME) {
scrarea_queue_headredraw(sa);
scrarea_queue_winredraw(sa);
}
break;
case REDRAWNODE:
if(sa->spacetype==SPACE_NODE) {
scrarea_queue_headredraw(sa);
scrarea_queue_winredraw(sa);
}
break;
case RECALC_COMPOSITE:
if(sa->spacetype==SPACE_NODE) {
addqueue(sa->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
}
break;
case REDRAWANIM:
if ELEM6(sa->spacetype, SPACE_IPO, SPACE_SOUND, SPACE_TIME, SPACE_NLA, SPACE_ACTION, SPACE_SEQ) {
scrarea_queue_winredraw(sa);
if(val) scrarea_queue_headredraw(sa);
}
case REDRAWMARKER: /* markers may not always match animation */
if ELEM6(sa->spacetype, SPACE_TIME, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_SOUND, SPACE_SEQ) {
scrarea_queue_winredraw(sa);
if(val) scrarea_queue_headredraw(sa);
}
}
}
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 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;
}
}
/* if header==1, then draw header for curarea too. Excepption for headerprint()... */
void force_draw(int header)
{
/* draws all areas that show something identical to curarea */
extern int afterqtest(short win, unsigned short evt); /*editscreen.c*/
ScrArea *tempsa, *sa;
scrarea_do_windraw(curarea);
if(header) scrarea_do_headdraw(curarea);
tempsa= curarea;
sa= G.curscreen->areabase.first;
while(sa) {
if(sa!=tempsa && sa->spacetype==tempsa->spacetype) {
areawinset(sa->win);
scrarea_do_windraw(sa);
scrarea_do_headdraw(sa);
}
sa= sa->next;
}
screen_swapbuffers();
#ifndef __APPLE__
if(tempsa->spacetype==SPACE_VIEW3D) {
/* de the afterqueuetest for backbuf draw */
sa= G.curscreen->areabase.first;
while(sa) {
if(sa->spacetype==SPACE_VIEW3D) {
if(afterqtest(sa->win, BACKBUFDRAW)) {
areawinset(sa->win);
backdrawview3d(0);
}
}
sa= sa->next;
}
}
#endif
if(curarea!=tempsa) areawinset(tempsa->win);
}
/* if header==1, then draw header for curarea too. Exception for headerprint()... */
void force_draw_plus(int type, int header)
{
/* draws all areas that show something like curarea AND areas of 'type' */
ScrArea *tempsa, *sa;
scrarea_do_windraw(curarea);
if(header) scrarea_do_headdraw(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);
scrarea_do_headdraw(sa);
}
}
sa= sa->next;
}
if(curarea!=tempsa) areawinset(tempsa->win);
screen_swapbuffers();
}
/* if header==1, then draw header for curarea too. Excepption for headerprint()... */
void force_draw_all(int header)
{
/* redraws all */
ScrArea *tempsa, *sa;
tempsa= curarea;
sa= G.curscreen->areabase.first;
while(sa) {
if(sa->headwin) {
scrarea_do_headdraw(sa);
if(sa!=curarea || header) 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, NULL, drawactionspace, changeactionspace, winqreadactionspace);
}
return st;
}
SpaceType *spacebuts_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Buts");
spacetype_set_winfuncs(st, NULL, drawbutspace, changebutspace, winqreadbutspace);
}
return st;
}
SpaceType *spacefile_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("File");
spacetype_set_winfuncs(st, NULL, drawfilespace, NULL, winqreadfilespace);
}
return st;
}
SpaceType *spaceimage_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Image");
spacetype_set_winfuncs(st, NULL, drawimagespace, changeimagepace, winqreadimagespace);
}
return st;
}
SpaceType *spaceimasel_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Imasel");
spacetype_set_winfuncs(st, NULL, drawimaselspace, changeimaselspace, winqreadimaselspace);
}
return st;
}
SpaceType *spaceinfo_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Info");
spacetype_set_winfuncs(st, NULL, drawinfospace, NULL, winqreadinfospace);
}
return st;
}
SpaceType *spaceipo_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Ipo");
spacetype_set_winfuncs(st, NULL, drawipospace, changeview2dspace, winqreadipospace);
}
return st;
}
SpaceType *spacenla_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Nla");
spacetype_set_winfuncs(st, NULL, drawnlaspace, changeview2dspace, winqreadnlaspace);
}
return st;
}
SpaceType *spaceoops_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Oops");
spacetype_set_winfuncs(st, NULL, drawoopsspace, changeview2dspace, winqreadoopsspace);
}
return st;
}
SpaceType *spaceseq_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Sequence");
spacetype_set_winfuncs(st, drawprefetchseqspace, drawseqspace, changeview2dspace, winqreadseqspace);
}
return st;
}
SpaceType *spacesound_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Sound");
spacetype_set_winfuncs(st, NULL, drawsoundspace, changeview2dspace, winqreadsoundspace);
}
return st;
}
SpaceType *spacetext_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Text");
spacetype_set_winfuncs(st, NULL, drawtextspace, NULL, winqreadtextspace);
}
return st;
}
static void spacescript_change(ScrArea *sa, void *spacedata)
{
SpaceScript *sc = (SpaceScript*) spacedata;
/*clear all temp button references*/
if (sc->but_refs) {
BPy_Set_DrawButtonsList(sc->but_refs);
BPy_Free_DrawButtonsList();
sc->but_refs = NULL;
}
}
SpaceType *spacescript_get_type(void)
{
static SpaceType *st = NULL;
if (!st) {
st = spacetype_new("Script");
spacetype_set_winfuncs(st, NULL, drawscriptspace, spacescript_change, winqreadscriptspace);
}
return st;
}
SpaceType *spaceview3d_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("View3D");
spacetype_set_winfuncs(st, NULL, drawview3dspace, changeview3dspace, winqreadview3dspace);
}
return st;
}
SpaceType *spacetime_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Time");
spacetype_set_winfuncs(st, NULL, drawtimespace, NULL, winqreadtimespace);
}
return st;
}
SpaceType *spacenode_get_type(void)
{
static SpaceType *st= NULL;
if (!st) {
st= spacetype_new("Node");
spacetype_set_winfuncs(st, NULL, drawnodespace, changeview2dspace, winqreadnodespace);
}
return st;
}