/* NIGHTFALL OpenGL Interface */ /* Copyright (C) 2001 Rainer Wichmann & Markus Kuster */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify */ /* it under the terms of the GNU General Public License as */ /* published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ANSI C forbids an empty source file, so put this outside */ /* do nothing here if we don't have OpenGL */ #include #include #include #include #include "Light.h" #ifdef _WITH_OPENGL #include "LightGLPrefs.h" /****************************************************************** @package nightfall @author Markus Kuster (kuster@astro.uni-tuebingen.de) @version 1.0 @short Keyboard event handling @param (GtkWidget) *widget pointer to the GL area widget (GdkEventKey) *event the key event @return (void) @heading Open GL Animation *******************************************************************/ gint GLKeyboard(GtkWidget *widget, GdkEventKey *event) { DispInfo *DispInfoPtr; DispInfoPtr = (DispInfo*)gtk_object_get_data(GTK_OBJECT(widget), "DispInfo"); if (gtk_gl_area_make_current(GTK_GL_AREA(glArea))) { switch (event->keyval) { case GDK_space: /* reset viewing angles */ /* reset orientation to real observer default position; resets trackball quads, xpos and zoom */ DispInfoPtr->xpos = 0; DispInfoPtr->zoom = 1.; DispInfoPtr->quat[0] =0.; DispInfoPtr->quat[1] =0.; DispInfoPtr->quat[2] =0.; DispInfoPtr->quat[3] =1.; /* Don't know why we need two upates of the viewport TBD !!*/ GLDisplayAll(); GLDisplayAll(); break; case GDK_a: /* toggle axes ON/OFF */ if (Flags.axes == OFF) { Flags.axes = ON; } else { Flags.axes = OFF; } GLDisplayAll(); break; case GDK_f: /* toggle to rendered mode */ Flags.wireframe = OFF; Flags.points = ON; /* check for points on/off TBD */ if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonPoints), TRUE); GLUpdateAll(); GLDisplayAll(); break; case GDK_l: /* toggle to wire frame mode */ Flags.wireframe = ON; Flags.points = OFF; /* check for points on/off needed TBD */ if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonWire), TRUE); GLUpdateAll(); GLDisplayAll(); break; case GDK_o: /* toggle to opaque mode */ Flags.wireframe = OFF; Flags.points = OFF; /* check for points on/off needed TBD */ if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonOpaque), TRUE); GLUpdateAll(); GLDisplayAll(); break; case GDK_m: /* toggle movie mode ON/OFF */ if (Flags.movie == OFF) { Flags.movie = ON; } else { Flags.movie = OFF; } break; case GDK_t: /* toggle texturing ON/OFF */ if (Flags.texture == OFF) { Flags.texture = ON; if (GLPrefWinOpened == TRUE) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonTexture), TRUE); gtk_widget_set_sensitive(ButtonPrimTxt,TRUE); gtk_widget_set_sensitive(ButtonSecTxt,TRUE); gtk_widget_set_sensitive(PrimTxtLabel,TRUE); gtk_widget_set_sensitive(SecTxtLabel,TRUE); #ifdef HAVE_DISK gtk_widget_set_sensitive(ButtonDiskTxt,TRUE); gtk_widget_set_sensitive(DiskTxtLabel,TRUE); #endif } } else { Flags.texture = OFF; if (GLPrefWinOpened == TRUE) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonTexture), FALSE); gtk_widget_set_sensitive(ButtonPrimTxt,FALSE); gtk_widget_set_sensitive(ButtonSecTxt,FALSE); gtk_widget_set_sensitive(PrimTxtLabel,FALSE); gtk_widget_set_sensitive(SecTxtLabel,FALSE); #ifdef HAVE_DISK gtk_widget_set_sensitive(ButtonDiskTxt,FALSE); gtk_widget_set_sensitive(DiskTxtLabel,FALSE); #endif } } GLDisplayAll(); break; case GDK_p: /* toggle texture for primary ON/OFF */ if (Texture[Primary].IsOn == ON) { Texture[Primary].IsOn = OFF; if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonPrimTxt), FALSE); } else { Texture[Primary].IsOn = ON; if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonPrimTxt), TRUE); } GLDisplayAll(); break; case GDK_s: /* toggle texture for secondary ON/OFF */ if (Texture[Secondary].IsOn == ON) { Texture[Secondary].IsOn = OFF; if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonSecTxt), FALSE); } else { Texture[Secondary].IsOn = ON; if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonSecTxt), TRUE); } GLDisplayAll(); break; #ifdef HAVE_DISK case GDK_d: /* toggle texture for disk ON/OFF */ if (Texture[Disk].IsOn == ON) { Texture[Disk].IsOn = OFF; if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonDiskTxt), FALSE); } else { Texture[Disk].IsOn = ON; if (GLPrefWinOpened == TRUE) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ButtonDiskTxt), TRUE); } GLDisplayAll(); break; #endif case GDK_w: /* toggle texturing type */ /* cycle thru texturing types R.W. 23.12.2002 */ if (Flags.textype == IMAGE) { Flags.textype = TEMP; } else if (Flags.textype == TEMP) { Flags.textype = GRAV; } else if (Flags.textype == GRAV) { Flags.textype = FLUX; } else if (Flags.textype == FLUX) { Flags.textype = VELOCITY; } else { Flags.textype = IMAGE; } GLInitTexture(Primary, Flags.textype); GLInitTexture(Secondary, Flags.textype); #ifdef HAVE_DISK GLInitTexture(Disk, Flags.textype); #endif GLDisplayAll(); break; case GDK_Left: /* decrease observers x-position */ Flags.GLdistancex-=0.02; GLDisplayAll(); break; case GDK_Right: /* increase observers x-position */ Flags.GLdistancex+=0.02; GLDisplayAll(); break; default: break; } /* prevent the default handler from being run */ gtk_signal_emit_stop_by_name(GTK_OBJECT(glArea),"key_press_event"); } return TRUE; } #endif /* OpenGL end */