From: curt Date: Wed, 21 May 1997 15:57:49 +0000 (+0000) Subject: Renamed due to added GLUT support. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=a104d9c820b3520e47ebd3b28fd9a7c89da129b2;p=flightgear.git Renamed due to added GLUT support. --- diff --git a/Main/GLTKkey.c b/Main/GLTKkey.c new file mode 100644 index 000000000..917756581 --- /dev/null +++ b/Main/GLTKkey.c @@ -0,0 +1,70 @@ +/************************************************************************** + * tkglkey.c -- handle tkgl keyboard events + * + * Written by Curtis Olson, started May 1997. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#include + +/* assumes -I/usr/include/mesa in compile command */ +#include "gltk.h" + +#include "GLTKkey.h" +#include "../aircraft/aircraft.h" + + +/* Handle keyboard events */ +GLenum GLTKkey(int k, GLenum mask) { + struct control_params *c; + + c = ¤t_aircraft.controls; + + switch (k) { + case TK_UP: + c->elev -= 0.1; + return GL_TRUE; + case TK_DOWN: + c->elev += 0.1; + return GL_TRUE; + case TK_LEFT: + c->aileron += 0.01; + return GL_TRUE; + case TK_RIGHT: + c->aileron -= 0.01; + return GL_TRUE; + case 1 /* TK_END */: + c->rudder -= 0.01; + return GL_TRUE; + case 2 /* TK_PGDWN */: + c->rudder += 0.01; + return GL_TRUE; + case TK_a: + c->throttle[0] -= 0.05; + return GL_TRUE; + case TK_s: + c->throttle[0] += 0.05; + case TK_ESCAPE: + tkQuit(); + } + + printf("Key hit = %d\n", k); + + return GL_FALSE; +} + + +/* $Log$ +/* Revision 1.1 1997/05/21 15:57:49 curt +/* Renamed due to added GLUT support. +/* + * Revision 1.2 1997/05/19 18:22:41 curt + * Parameter tweaking ... starting to stub in fog support. + * + * Revision 1.1 1997/05/16 16:05:51 curt + * Initial revision. + * + */ diff --git a/Main/GLTKkey.h b/Main/GLTKkey.h new file mode 100644 index 000000000..4795385a0 --- /dev/null +++ b/Main/GLTKkey.h @@ -0,0 +1,35 @@ +/************************************************************************** + * tkglkey.h -- handle tkgl keyboard events + * + * Written by Curtis Olson, started May 1997. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#ifndef GLTKKEY_H +#define GLTKKEY_H + + +/* assumes -I/usr/include/mesa in compile command */ +#include "gltk.h" + +/* Handle keyboard events */ +GLenum GLTKkey(int k, GLenum mask); + + +#endif GLTKKEY_H + + +/* $Log$ +/* Revision 1.1 1997/05/21 15:57:49 curt +/* Renamed due to added GLUT support. +/* + * Revision 1.2 1997/05/17 00:17:34 curt + * Trying to stub in support for standard OpenGL. + * + * Revision 1.1 1997/05/16 16:05:53 curt + * Initial revision. + * + */ diff --git a/Main/GLUTkey.c b/Main/GLUTkey.c new file mode 100644 index 000000000..b02fe88d0 --- /dev/null +++ b/Main/GLUTkey.c @@ -0,0 +1,68 @@ +/************************************************************************** + * tkglkey.c -- handle tkgl keyboard events + * + * Written by Curtis Olson, started May 1997. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#include + +#include + +#include "GLUTkey.h" +#include "../aircraft/aircraft.h" + + +/* Handle keyboard events */ +void GLUTkey(unsigned char k, int x, int y) { + struct control_params *c; + + c = ¤t_aircraft.controls; + + printf("Key hit = %d\n", k); + + switch (k) { + case GLUT_KEY_UP: + c->elev -= 0.1; + return; + case GLUT_KEY_DOWN: + c->elev += 0.1; + return; + case GLUT_KEY_LEFT: + c->aileron += 0.01; + return; + case GLUT_KEY_RIGHT: + c->aileron -= 0.01; + return; + case 1 /* TK_END */: + c->rudder -= 0.01; + return; + case 2 /* TK_PGDWN */: + c->rudder += 0.01; + return; + case 3: + c->throttle[0] -= 0.05; + return; + case 4: + c->throttle[0] += 0.05; + case 27: /* ESC */ + exit(0); + } + +} + + +/* $Log$ +/* Revision 1.1 1997/05/21 15:57:50 curt +/* Renamed due to added GLUT support. +/* + * Revision 1.2 1997/05/19 18:22:41 curt + * Parameter tweaking ... starting to stub in fog support. + * + * Revision 1.1 1997/05/16 16:05:51 curt + * Initial revision. + * + */ diff --git a/Main/GLUTkey.h b/Main/GLUTkey.h new file mode 100644 index 000000000..66982b9b3 --- /dev/null +++ b/Main/GLUTkey.h @@ -0,0 +1,39 @@ +/************************************************************************** + * GLUTkey.h -- handle GLUT keyboard events + * + * Written by Curtis Olson, started May 1997. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#ifndef GLUTKEY_H +#define GLUTKEY_H + + +#ifdef GLUT + #include +#elif TIGER + /* assumes -I/usr/include/mesa in compile command */ + #include "gltk.h" +#endif + +/* Handle keyboard events */ +void GLUTkey(unsigned char k, int x, int y); + + +#endif GLUTKEY_H + + +/* $Log$ +/* Revision 1.1 1997/05/21 15:57:51 curt +/* Renamed due to added GLUT support. +/* + * Revision 1.2 1997/05/17 00:17:34 curt + * Trying to stub in support for standard OpenGL. + * + * Revision 1.1 1997/05/16 16:05:53 curt + * Initial revision. + * + */ diff --git a/Main/GLmain.c b/Main/GLmain.c new file mode 100644 index 000000000..48c085c77 --- /dev/null +++ b/Main/GLmain.c @@ -0,0 +1,312 @@ +/************************************************************************** + * GLmain.c -- top level sim routines + * + * Written by Curtis Olson for OpenGL, started May 1997. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#include +#include +#include +#include + +#ifdef GLUT + #include + #include "GLUTkey.h" +#elif MESA_TK + /* assumes -I/usr/include/mesa in compile command */ + #include "gltk.h" + #include "GLTKkey.h" +#endif + +#include "../aircraft/aircraft.h" +#include "../scenery/scenery.h" + + +/* This is a record containing all the info for the aircraft currently + being operated */ +struct aircraft_params current_aircraft; + +/* temporary hack */ +extern struct mesh *mesh_ptr; + +/* Function prototypes */ +GLint make_mesh(); +static void draw_mesh(); + + +/* view parameters */ +static GLfloat win_ratio = 1.0; + +/* pointer to terrain mesh structure */ +static GLint mesh; + +/* init_view() -- Setup view parameters */ +static void init_view() { + /* if the 4th field is 0.0, this specifies a direction ... */ + static GLfloat pos[4] = {-3.0, 1.0, 3.0, 0.0 }; + static GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1.0}; + + glLightfv( GL_LIGHT0, GL_POSITION, pos ); + glEnable( GL_CULL_FACE ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_DEPTH_TEST ); + + glEnable( GL_FOG ); + glFogi (GL_FOG_MODE, GL_LINEAR); + /* glFogf (GL_FOG_START, 1.0); */ + glFogf (GL_FOG_END, 1000.0); + glFogfv (GL_FOG_COLOR, fogColor); + glFogf (GL_FOG_DENSITY, 0.04); + glHint(GL_FOG_HINT, GL_FASTEST); + + glClearColor(0.6, 0.6, 0.9, 1.0); +} + + +/* init_scene() -- build all objects */ +static void init_scene() { + + /* make terrain mesh */ + mesh = make_mesh(); + + /* If enabled, normal vectors specified with glNormal are scaled + to unit length after transformation. See glNormal. */ + glEnable( GL_NORMALIZE ); +} + + +/* create the terrain mesh */ +GLint make_mesh() { + GLint mesh; + + mesh = mesh_to_ogl(mesh_ptr); + + return(mesh); +} + + +/* create the terrain mesh */ +GLint make_mesh_old() { + GLint mesh; + static GLfloat color[4] = { 0.3, 0.7, 0.2, 1.0 }; + + mesh = glGenLists(1); + glNewList(mesh, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color ); + glShadeModel( GL_FLAT ); /* glShadeModel( GL_SMOOTH ); */ + + glBegin(GL_POLYGON); + glVertex3f(-10.0, -10.0, 0.0); + glVertex3f(0.0, -10.0, 0.0); + glVertex3f(0.0, 0.0, 1.0); + glVertex3f(-10.0, 0.0, 1.0); + glEnd(); + + glBegin(GL_POLYGON); + glVertex3f(-10.0, 0.0, 1.0); + glVertex3f(0.0, 0.0, 1.0); + glVertex3f(0.0, 10.0, 0.0); + glVertex3f(-10.0, 10.0, 0.0); + glEnd(); + + glBegin(GL_POLYGON); + glVertex3f(0.0, 0.0, 0.0); + glVertex3f(10.0, 0.0, 2.0); + glVertex3f(10.0, 10.0, 2.0); + glVertex3f(0.0, 10.0, 0.0); + glEnd(); + + glBegin(GL_POLYGON); + glVertex3f(0.0, -10.0, -1.0); + glVertex3f(10.0, -10.0, 0.0); + glVertex3f(10.0, 0.0, -1.0); + glVertex3f(0.0, 0.0, 0.0); + glEnd(); + + glEndList(); + + return(mesh); +} + + +/* update the view volume */ +static void update_view() { + struct flight_params *f; + + f = ¤t_aircraft.flight; + + /* Tell GL we are about to modify the projection parameters */ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + gluPerspective(45.0, 1.0/win_ratio, 1.0, 6000.0); + gluLookAt(f->pos_x, f->pos_y, f->pos_z, + f->pos_x + cos(f->Psi), f->pos_y + sin(f->Psi), f->pos_z, + 0.0, 0.0, 1.0); +} + + +/* draw the scene */ +static void draw_scene( void ) { + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + /* update view volume parameters */ + update_view(); + + /* Tell GL we are switching to model view parameters */ + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + /* glTranslatef(0.0, 0.0, -5.0); */ + + glPushMatrix(); + + /* draw terrain mesh */ + draw_mesh(); + + glPopMatrix(); + + #ifdef GLUT + glutSwapBuffers(); + #elif MESA_TK + tkSwapBuffers(); + #endif +} + + +/* draw the terrain mesh */ +static void draw_mesh() { + glCallList(mesh); +} + + +/* What should we do when we have nothing else to do? How about get + * ready for the next move?*/ +static void idle( void ) +{ + slew_update(); + aircraft_debug(1); + + draw_scene(); +} + + +/* new window size or exposure */ +static void reshape( int width, int height ) { + /* Do this so we can call reshape(0,0) ourselves without having to know + * what the values of width & height are. */ + if ( (height > 0) && (width > 0) ) { + win_ratio = (GLfloat) height / (GLfloat) width; + } + + /* Inform gl of our view window size */ + glViewport(0, 0, (GLint)width, (GLint)height); + + update_view(); + + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); +} + + +/************************************************************************** + * Main ... + **************************************************************************/ + +int main( int argc, char *argv[] ) { + /* parse the scenery file */ + parse_scenery(argv[1]); + + #ifdef GLUT + /* initialize GLUT */ + glutInit(&argc, argv); + + /* Define initial window size */ + glutInitWindowSize(640, 400); + + /* Define Display Parameters */ + glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE ); + + /* Initialize the main window */ + glutCreateWindow("Terrain Demo"); + #elif MESA_TK + /* Define initial window size */ + tkInitPosition(0, 0, 640, 400); + + /* Define Display Parameters */ + tkInitDisplayMode( TK_RGB | TK_DEPTH | TK_DOUBLE | TK_DIRECT ); + + /* Initialize the main window */ + if (tkInitWindow("Terrain Demo") == GL_FALSE) { + tkQuit(); + } + #endif + + /* setup view parameters, only makes GL calls */ + init_view(); + + /* build all objects */ + init_scene(); + + /* Set initial position and slew parameters */ + /* slew_init(-398391.3, 120070.4, 244, 3.1415); */ /* GLOBE Airport */ + slew_init(-398673.28,120625.64, 53, 4.38); + + #ifdef GLUT + /* call reshape() on window resizes */ + glutReshapeFunc( reshape ); + + /* call key() on keyboard event */ + glutKeyboardFunc( GLUTkey ); + glutSpecialFunc( GLUTkey ); + + /* call idle() whenever there is nothing else to do */ + glutIdleFunc( idle ); + + /* draw the scene */ + glutDisplayFunc( draw_scene ); + + /* pass control off to the GLUT event handler */ + glutMainLoop(); + #elif MESA_TK + /* call reshape() on expose events */ + tkExposeFunc( reshape ); + + /* call reshape() on window resizes */ + tkReshapeFunc( reshape ); + + /* call key() on keyboard event */ + tkKeyDownFunc( GLTKkey ); + + /* call idle() whenever there is nothing else to do */ + tkIdleFunc( idle ); + + /* draw the scene */ + tkDisplayFunc( draw_scene ); + + /* pass control off to the tk event handler */ + tkExec(); + #endif + + return(0); +} + + +/* $Log$ +/* Revision 1.1 1997/05/21 15:57:51 curt +/* Renamed due to added GLUT support. +/* + * Revision 1.3 1997/05/19 18:22:42 curt + * Parameter tweaking ... starting to stub in fog support. + * + * Revision 1.2 1997/05/17 00:17:34 curt + * Trying to stub in support for standard OpenGL. + * + * Revision 1.1 1997/05/16 16:05:52 curt + * Initial revision. + * + */ diff --git a/Main/Makefile b/Main/Makefile index c0108b8ab..fccfe3c6b 100644 --- a/Main/Makefile +++ b/Main/Makefile @@ -10,19 +10,47 @@ TARGET=viewer -CFILES = gltkmain.c gltkkey.c mesh2ogl.c -OFILES = $(CFILES:.c=.o) -AFILES = ../flight/libflight.a ../aircraft/libaircraft.a ../scenery/libscenery.a - CC = gcc -CFLAGS = -g -Wall -# CFLAGS = -O2 -Wall -INCLUDES = -I/usr/include/mesa +# STD_FLAGS = -O2 -Wall +STD_CFLAGS = -g -Wall -MESA_LIBS = -L/usr/lib/mesa -lMesaaux -lMesatk -lMesaGLU -lMesaGL -X11_LIBS = -L/usr/X11R6/lib -lX11 -lXext -LIBS = $(MESA_LIBS) $(X11_LIBS) -lm -lfl + +#--------------------------------------------------------------------------- +# Define the high level GL interface library +#--------------------------------------------------------------------------- + +# For GLUT +INTERFACE_FLAGS = -DGLUT +INTERFACE_LIBS = -lglut +INTERFACE_FILES = GLUTkey.c + +# For MESA_TK (Tk interface to Mesa) +# INCLUDES = -I/usr/include/mesa +# INTERFACE_FLAGS = -DMESA_TK +# INTERFACE_LIBS = -L/usr/lib/mesa -lMesatk +# INTERFACE_FILES = GLTKkey.c + + +#--------------------------------------------------------------------------- +# Define main GL libraries +#--------------------------------------------------------------------------- + +# For OpenGL +GRAPHICS_LIBS = -lGLU -lGL -lXmu -lX11 + +# For Mesa +# MESA_LIBS = -L/usr/lib/mesa -lMesaaux -lMesatk -lMesaGLU -lMesaGL +# X11_LIBS = -L/usr/X11R6/lib -lXext -lXmu -lXi -lX11 +# GRAPHICS_LIBS = $(MESA_LIBS) $(X11_LIBS) + + +CFLAGS = $(STD_CFLAGS) $(INTERFACE_FLAGS) +LIBS = $(INTERFACE_LIBS) $(GRAPHICS_LIBS) -lm -lfl + +CFILES = GLmain.c $(INTERFACE_FILES) mesh2GL.c +OFILES = $(CFILES:.c=.o) +AFILES = ../flight/libflight.a ../aircraft/libaircraft.a ../scenery/libscenery.a @@ -43,18 +71,24 @@ clean: # Secondary Targets #--------------------------------------------------------------------------- -gltkmain.o: gltkmain.c gltkkey.h ../aircraft/aircraft.h ../scenery/scenery.h - $(CC) $(CFLAGS) $(INCLUDES) -c gltkmain.c +GLmain.o: GLmain.c GLUTkey.h ../aircraft/aircraft.h ../scenery/scenery.h + $(CC) $(CFLAGS) $(INCLUDES) -c GLmain.c -gltkkey.o: gltkkey.c gltkkey.h ../aircraft/aircraft.h - $(CC) $(CFLAGS) $(INCLUDES) -c gltkkey.c +GLUTkey.o: GLUTkey.c GLUTkey.h ../aircraft/aircraft.h + $(CC) $(CFLAGS) $(INCLUDES) -c GLUTkey.c -mesh2ogl.o: mesh2ogl.c ../scenery/mesh.h - $(CC) $(CFLAGS) $(INCLUDES) -c mesh2ogl.c +GLTKkey.o: GLTKkey.c GLTKkey.h ../aircraft/aircraft.h + $(CC) $(CFLAGS) $(INCLUDES) -c GLTKkey.c + +mesh2GL.o: mesh2GL.c ../scenery/mesh.h + $(CC) $(CFLAGS) $(INCLUDES) -c mesh2GL.c #--------------------------------------------------------------------------- # $Log$ +# Revision 1.2 1997/05/21 15:57:52 curt +# Renamed due to added GLUT support. +# # Revision 1.1 1997/05/16 16:05:51 curt # Initial revision. # diff --git a/Main/mesh2GL.c b/Main/mesh2GL.c new file mode 100644 index 000000000..7ddf19a75 --- /dev/null +++ b/Main/mesh2GL.c @@ -0,0 +1,128 @@ +/************************************************************************** + * mesh2ogl.c -- walk through a mesh data structure and make ogl calls + * + * Written by Curtis Olson, started May 1997. + * + * $Id$ + * (Log is kept at end of this file) + **************************************************************************/ + + +#ifdef GLUT + #include +#elif TIGER + /* assumes -I/usr/include/mesa in compile command */ + #include "gltk.h" +#endif + +#include "../scenery/mesh.h" +#include "mat3.h" + + +/* Sets the first vector to be the cross-product of the last two + vectors. */ +static void mat3_cross_product(float result_vec[3], register float vec1[3], + register float vec2[3]) { + float tempvec[3]; + register float *temp = tempvec; + + temp[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1]; + temp[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2]; + temp[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0]; + + MAT3_COPY_VEC(result_vec, temp); +} + + +/* walk through mesh and make ogl calls */ +GLint mesh_to_ogl(struct mesh *m) { + GLint mesh; + static GLfloat color[4] = { 0.3, 0.7, 0.2, 1.0 }; + + float x1, y1, x2, y2, z11, z12, z21, z22; + float v1[3], v2[3], normal[3]; + int i, j, istep, jstep, iend, jend; + float temp; + + istep = jstep = 10; /* Detail level 1 -- 1200 ... */ + + mesh = glGenLists(1); + glNewList(mesh, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color ); + glShadeModel( GL_FLAT ); /* glShadeModel( GL_SMOOTH ); */ + + iend = m->cols - 1; + jend = m->rows - 1; + + y1 = m->originy; + y2 = y1 + (m->col_step * istep); + + for ( i = 0; i < iend; i += istep ) { + x1 = m->originx; + x2 = x1 + (m->row_step * jstep); + for ( j = 0; j < jend; j += jstep ) { + z11 = 0.03 * m->mesh_data[j * m->rows + i ]; + z12 = 0.03 * m->mesh_data[j * m->rows + (i+istep)]; + z21 = 0.03 * m->mesh_data[(j+jstep) * m->rows + i ]; + z22 = 0.03 * m->mesh_data[(j+jstep) * m->rows + (i+istep)]; + + /* printf("x1 = %f y1 = %f\n", x1, y1); + printf("x2 = %f y2 = %f\n", x2, y2); + printf("z11 = %f z12 = %f z21 = %f z22 = %f\n", + z11, z12, z21, z22); */ + + v1[0] = x2 - x1; v1[1] = 0; v1[2] = z21 - z11; + v2[0] = x2 - x1; v2[1] = y2 - y1; v2[2] = z22 - z11; + mat3_cross_product(normal, v1, v2); + MAT3_NORMALIZE_VEC(normal,temp); + glNormal3fv(normal); + glBegin(GL_POLYGON); + glVertex3f(x1, y1, z11); + glVertex3f(x2, y1, z21); + glVertex3f(x2, y2, z22); + /* printf("(%f, %f, %f)\n", x1, y1, z11); + printf("(%f, %f, %f)\n", x2, y1, z21); + printf("(%f, %f, %f)\n", x2, y2, z22); */ + glEnd(); + + v1[0] = x2 - x1; v1[1] = y2 - y1; v1[2] = z22 - z11; + v2[0] = 0; v2[1] = y2 - y1; v2[2] = z12 - z11; + mat3_cross_product(normal, v1, v2); + MAT3_NORMALIZE_VEC(normal,temp); + glNormal3fv(normal); + glBegin(GL_POLYGON); + glVertex3f(x1, y1, z11); + glVertex3f(x2, y2, z22); + glVertex3f(x1, y2, z12); + /* printf("(%f, %f, %f)\n", x1, y1, z11); + printf("(%f, %f, %f)\n", x2, y2, z22); + printf("(%f, %f, %f)\n", x1, y2, z12); */ + glEnd(); + + x1 = x2; + x2 = x1 + (m->row_step * jstep); + } + y1 = y2; + y2 = y1 + (m->col_step * istep); + } + + glEndList(); + + return(mesh); +} + + +/* $Log$ +/* Revision 1.1 1997/05/21 15:57:52 curt +/* Renamed due to added GLUT support. +/* + * Revision 1.3 1997/05/19 18:22:42 curt + * Parameter tweaking ... starting to stub in fog support. + * + * Revision 1.2 1997/05/17 00:17:35 curt + * Trying to stub in support for standard OpenGL. + * + * Revision 1.1 1997/05/16 16:05:52 curt + * Initial revision. + * + */