/* NIGHTFALL OpenGL Interface */
/* Copyright (C) 2001 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. */
#ifdef _WITH_OPENGL
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include <gtkgl/gtkglarea.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <jpeglib.h>
#include "LightGLTrackball.h"
/* Maximum number of lights allowed in OpenGL */
#define MAX_LIGHT_NUM 8
#define MAX_STR_LEN 256
/* Definitions for light spots used in visualisation */
#define SCENE_LIGHT GL_LIGHT0
#define DISK_SPOT GL_LIGHT1
/* User defined spots */
#define PRIMARY_ONE GL_LIGHT2
#define PRIMARY_TWO GL_LIGHT3
#define SECONDARY_ONE GL_LIGHT4
#define SECONDARY_TWO GL_LIGHT5
#define GLWGAP 10
#define GLHGAP 50
#define GLWIN_WIDTH 800+GLWGAP
#define GLWIN_HEIGHT 500+GLHGAP
#define GLAREA_WIDTH 800
#define GLAREA_HEIGHT 500
/* 3D viewport */
#define VP_3D_X0 0
#define VP_3D_Y0 50
#define VP_3D_WIDTH 500
#define VP_3D_HEIGHT 450
/* light curve viewport */
#define VP_LC_X0 500
#define VP_LC_Y0 250
#define VP_LC_WIDTH 300
#define VP_LC_HEIGHT 250
/* radial velocity viewport */
#define VP_RV_X0 500
#define VP_RV_Y0 0
#define VP_RV_WIDTH 300
#define VP_RV_HEIGHT 250
float texture_minval[NUM_COMP];
float texture_maxval[NUM_COMP];
/* wedge primary */
#define VP_WP_X0 0
#define VP_WP_Y0 5
#define VP_WP_WIDTH 500
#define VP_WP_HEIGHT 20
/* wedge secondary */
#define VP_WS_X0 0
#define VP_WS_Y0 30
#define VP_WS_WIDTH 500
#define VP_WS_HEIGHT 20
/* wedge disk */
#define VP_WD_X0 0
#define VP_WD_Y0 55
#define VP_WD_WIDTH 500
#define VP_WD_HEIGHT 20
/* Definition of fonts */
#define HELVETICA 0
#define TIMESROMAN 1
/* Plot types */
#define LIGHTCURVE 0
#define RADVELOCITY 1
/* Texturing types */
#define NONE 0
#define IMAGE 1
#define TEMP 2
#define GRAV 3
#define FLUX 4
#define BBCOLOR 5
#define VELOCITY 6
#define TEXTURE_WIDTH 256
#define TEXTURE_HEIGHT 256
#define TEXTURE_COMPONENTS 3
/* Definition of white points for black body color model */
#define D65 0.3127, 0.3291
#define CWP 0.3101, 0.3162
typedef struct AxisStruct {
char label[256];
float min_value;
float max_value;
float length;
float numticks;
} AxisType;
typedef struct CoordFrame {
char title[256];
float titlepos;
AxisType xaxis;
AxisType yaxis;
float xborder_size;
float yborder_size;
} CoordType;
typedef struct LightStruct {
GLenum Light; /* Which light */
GLfloat Pos[4]; /* position of the light source */
GLfloat Direction[3]; /* direction vector of the spot */
GLfloat Diffuse;
GLfloat Specular;
GLfloat Const_Att;
GLfloat Lin_Att;
GLfloat Quad_Att;
} LightType;
/* texture information */
typedef struct TextureStruct {
int IsOn; /* we want texturing (ON/OFF) */
int Type; /* What kind of texture */
char TextFile[1024+MAX_CFG_INLINE+1]; /* texture image file */
GLint Width; /* width of the image */
GLint Height; /* height of the image */
GLint Components; /* depth of image */
GLuint TexName; /* texture name */
} TextureType;
extern struct GLColorSystem {
/* We give only X and Y values here, because the Z values are implicitly */
/* given by the relations Zn = 1.0 - (Xn + Yn), where n = r,g,b */
double xr,yr,
xg,yg,
xb,yb,
xw,yw;
} Temp;
/* display information */
typedef struct {
float mousex,mousey; /* position of mouse */
float quat[4]; /* orientation of object */
float zoom; /* field of view in degrees */
float xpos; /* x position of the observer */
} DispInfo;
/* 3D animation */
void AnimateGL( int j );
/* Init 3D model */
gint GLInit3d( GtkWidget *widget );
gint GLLightPlot(GtkWidget *widget );
/* Init lighting */
void GLInitLighting( GtkWidget *widget );
/* color stuff for GL */
void GLBBtoXYZ(double temperature, double *X, double *Y,double *Z);
void GLXYZtoRGB(double *X, double *Y,double *Z, double *R, double *G, double *B);
/* Init spots on components */
void GLMakeSpots( int Comp, float xpos );
/* Update all graphic viewports */
void GLUpdateAll( void );
/* Update the primary/secondary geometry */
void GLUpdate3d( GtkWidget *widget );
/* Update plot viewport */
void GLUpdatePlot( int viewport, int type );
/* Button event */
gint GLButtonPress(GtkWidget *widget, GdkEventButton *event);
/* Motion event */
gint GLMotionNotify(GtkWidget *widget, GdkEventMotion *event);
/* Reshape for GL code */
gint GLReshape( GtkWidget *widget, GdkEventConfigure *event );
/* Display function for GL mode */
void GLDisplayAll( void );
void GLDisplay3d( GtkWidget *widget );
void GLDisplayPlot( GtkWidget *widget, int type);
void GLDisplayWedge( int Comp );
void GLMakeLCPlot( void );
void GLMakeRVPlot( void );
/* Display list for the components */
void GLMakeVolumeEclipsed( int Comp );
/* Keybord related function for GL mode */
gint GLKeyboard(GtkWidget *widget, GdkEventKey *event);
/* Set default values for coordinate system */
CoordType SetupCoords(float ymin, float ymax,char *xlabel, char *ylabel, char *title);
/* Draw x-, y-, z-Axes */
void GLDrawAxes(GLfloat length, GtkWidget *widget);
/* Draw x- and y-Axes for plotting light curve */
void GLMake2DAxes(CoordType CoordPara, GtkWidget *widget);
/* Draw some labels */
void GLDrawLabels(GtkWidget *widget);
/* GL sting plotting functions */
void GLSetFont(int style, int size);
void GLDrawStr(GLfloat x, GLfloat y, GLfloat z, char* format, ...);
/* Texturing stuff */
int GLInitTextureParams(int Comp);
int GLInitTexture(int Comp, int type);
double GLbbflux(double lambda, double temp);
void GLBBtoxyz(double temperature, double *x, double *y,double *z);
void GLxyztoRGB(struct GLColorSystem *csyst, double x, double y,double z,
double *R, double *G, double *B);
/* libjpeg suff */
GLubyte *ReadJPEGFile(char *filename, int *width, int *height, int *components);
int WriteJPEGFile(JSAMPLE *imgbuff, char *filename, int imgwidth, int imgheight, int components, int quality);
int GLGrabScreen(char *filename, int x0, int y0, int width, int height, int quality);
/* Gtk Menu for GL window */
void GLMakeMenu(GtkWidget *glmenu_bar);
void GLAnimationEvent (GtkWidget *widget, gpointer *data);
/* Preferences window */
extern GtkWidget *glPrefsWindow;
extern GtkWidget *glArea,*glWindow;
/* OpenGL window opened */
extern int GLWindowOpened;
/* OpenGL window hidden */
extern int GLWindowHidden;
/* OpenGL preferences window opened */
extern int GLPrefWinOpened;
extern GLdouble a;
/* Display lists */
extern GLint thePrimary, theSecondary, theDisk;
/* Display contexts */
extern GtkWidget *glArea,*glPlot,*glVelo,*glWindow;
/* Color definitions for primary component */
extern GLfloat primary_colour[4];
extern GLfloat primary_mat_specular[4];
extern GLfloat primary_mat_diffuse[4];
extern GLfloat primary_mat_shininess[1];
/* Color definitions for secondary component */
extern GLfloat secondary_colour[4];
extern GLfloat secondary_mat_specular[4];
extern GLfloat secondary_mat_diffuse[4];
extern GLfloat secondary_mat_shininess[4];
/* color and emission properties of the disk */
/* disk */
extern GLfloat disk_colour[4];
extern GLfloat disk_mat_specular[4];
extern GLfloat disk_mat_diffuse[4];
extern GLfloat disk_mat_shininess[1];
extern GLfloat bulge_light[4];
extern GLfloat bgd_colour[4];
/* Display lists */
extern GLint PrimaryList, SecondaryList, DiskList, PlotList[2];
/* Texture definitions */
extern TextureType Texture[3];
extern LightType Lights[MAX_LIGHT_NUM];
extern int phaseind;
/* Paramters for the coordinate systems */
extern CoordType CoordSys[2];
extern double RtoL2,RtoL3;
#endif
syntax highlighted by Code2HTML, v. 0.9.1