00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OPENGLRENDERER_H
00029 #define OPENGLRENDERER_H
00030
00031 #include "DisplayDevice.h"
00032 #include "Scene.h"
00033 #include "OpenGLExtensions.h"
00034 #include "OpenGLCache.h"
00035
00036 #if defined(VMDUSEOPENGLSHADER)
00037 #include "OpenGLShader.h"
00038 #endif
00039
00040 #if defined(_MSC_VER)
00041 #include <windows.h>
00042 #endif
00043
00044
00045
00046
00047
00048 #define GL_GLEXT_PROTOTYPES 1
00049
00050 #if defined(__APPLE__) && !defined (VMDMESA)
00051 #include <OpenGL/gl.h>
00052 #include <OpenGL/glu.h>
00053 #else
00054 #include <GL/gl.h>
00055 #include <GL/glu.h>
00056 #endif
00057
00058
00059
00060
00061 #if (defined(__linux) || defined(_MSC_VER)) && !defined(VMDMESA)
00062 #include <GL/glext.h>
00063 #endif
00064 #if defined(__APPLE__) && !defined (VMDMESA)
00065 #include <OpenGL/glext.h>
00066 #endif
00067
00068
00069 #ifndef APIENTRY
00070 #define APIENTRY
00071 #endif
00072 #ifndef GLAPI
00073 #define GLAPI extern
00074 #endif
00075
00076
00077 #define OPENGL_STEREO_OFF 0
00078 #define OPENGL_STEREO_QUADBUFFER 1
00079 #define OPENGL_STEREO_DTISIDE 2
00080 #define OPENGL_STEREO_STENCIL_CHECKERBOARD 3
00081 #define OPENGL_STEREO_STENCIL_COLUMNS 4
00082 #define OPENGL_STEREO_STENCIL_ROWS 5
00083 #define OPENGL_STEREO_ANAGLYPH 6
00084 #define OPENGL_STEREO_SIDE 7
00085 #define OPENGL_STEREO_ABOVEBELOW 8
00086 #define OPENGL_STEREO_LEFT 9
00087 #define OPENGL_STEREO_RIGHT 10
00088 #define OPENGL_STEREO_MODES 11
00089
00090
00091 #define OPENGL_RENDER_NORMAL 0
00092 #define OPENGL_RENDER_GLSL 1
00093 #define OPENGL_RENDER_ACROBAT3D 2
00094 #define OPENGL_RENDER_MODES 3
00095
00096
00097 #define OPENGL_CACHE_OFF 0
00098 #define OPENGL_CACHE_ON 1
00099 #define OPENGL_CACHE_MODES 2
00100
00101 class OpenGLRenderer;
00102 class VMDDisplayList;
00103
00104
00109 class OpenGLRenderer : public DisplayDevice {
00110 public:
00111 void setup_initial_opengl_state(void);
00112
00113 protected:
00115
00116 GLUquadricObj *pointsQuadric;
00117 GLUquadricObj *objQuadric;
00118
00120 ResizeArray<GLuint> solidSphereLists;
00121 ResizeArray<GLuint> pointSphereLists;
00122
00124 GLuint SphereList;
00126
00127
00129
00130
00131 OpenGLCache displaylistcache;
00132 OpenGLCache texturecache;
00133 int oglmaterialindex;
00134 float oglopacity;
00135 float oglambient;
00136 float oglspecular;
00137 float ogldiffuse;
00138 float oglshininess;
00139 float ogloutline;
00140 float ogloutlinewidth;
00141 int ogltransmode;
00142 GLfloat ogl_pmatrix[16];
00143 GLfloat ogl_mvmatrix[16];
00144 Matrix4 ogl_textMat;
00145 GLint ogl_viewport[4];
00146 GLint ogl_fogmode;
00147 int ogl_lightingenabled;
00148 int ogl_useblendedtrans;
00149 int ogl_useglslshader;
00150 int ogl_glslserial;
00151 int ogl_glsltoggle;
00152 int ogl_glslmaterialindex;
00153 int ogl_glslprojectionmode;
00154 int ogl_glsltexturemode;
00155 int ogl_transpass;
00156 int ogl_rendstateserial;
00157 int ogl_clipmode[VMD_MAX_CLIP_PLANE];
00158 int ogl_lightstate[DISP_LIGHTS];
00159 GLfloat ogl_lightcolor[DISP_LIGHTS][4];
00160 GLfloat ogl_lightpos[DISP_LIGHTS][4];
00161 GLfloat ogl_backgradient[2][4];
00162 int ogl_acrobat3dcapture;
00164
00166
00167 int ogl_cachedebug;
00168 GLint ogl_cachelistbase;
00169
00170 int dpl_initialized;
00171
00172 protected:
00174 GLuint font1pxListBase;
00175 GLuint fontNpxListBase;
00176
00177 OpenGLExtensions *ext;
00178
00179 #if defined(VMDUSEOPENGLSHADER)
00180 OpenGLShader *mainshader;
00181 OpenGLShader *sphereshader;
00182 OpenGLShader *spherespriteshader;
00183 #endif
00184
00185 int simplegraphics;
00186 int wiregl;
00187 int immersadeskflip;
00188 int shearstereo;
00189
00191
00192 int hastex2d;
00193 GLint max2DtexX;
00194 GLint max2DtexY;
00195 GLint max2DtexSize;
00197
00199
00200 int hastex3d;
00201 GLint max3DtexX;
00202 GLint max3DtexY;
00203 GLint max3DtexZ;
00204 GLint max3DtexSize;
00206
00207
00208
00209
00211
00212 void update_shader_uniforms(void *, int forceupdate);
00213
00215
00216 void set_line_width(int);
00217 void set_line_style(int);
00218 void set_sphere_res(int);
00219 void set_sphere_mode(int);
00220 void cylinder(float *, float *, int, float, float);
00221 void require_volume_texture(unsigned long ID,
00222 unsigned xsize, unsigned ysize, unsigned zsize, unsigned char *texmap);
00223 int build3Dmipmaps(int, int, int, unsigned char *tx);
00224 void draw_background_gradient(void);
00226
00227
00229
00230 virtual int do_define_light(int n, float *color, float *position);
00231 virtual int do_activate_light(int n, int turnon);
00233
00234 public:
00236 OpenGLRenderer(const char *);
00237 virtual ~OpenGLRenderer(void);
00238
00239
00240 virtual int supports_gui() { return TRUE; }
00241
00243
00244 virtual void loadmatrix(const Matrix4&);
00245 virtual void multmatrix(const Matrix4&);
00247
00248
00249
00250
00251
00252
00254
00255 virtual void abs_screen_loc_3D(float *, float *);
00257 virtual void abs_screen_loc_2D(float *, float *);
00259
00260
00261
00262
00263 virtual void find_3D_from_2D(const float *A3D, const float *B2D, float *B3D);
00264
00266
00267 virtual void aa_on(void);
00268 virtual void aa_off(void);
00269 virtual void cueing_on(void);
00270 virtual void cueing_off(void);
00271 virtual void culling_on(void);
00272 virtual void culling_off(void);
00274
00275
00276 virtual void set_background(const float *);
00277 virtual void set_backgradient(const float *, const float *);
00278
00279
00280 virtual void enable_stencil_stereo(int newMode);
00281 virtual void disable_stencil_stereo(void);
00282 virtual void left(void);
00283 virtual void right(void);
00284 virtual void normal(void);
00285 virtual void set_persp(DisplayEye = NOSTEREO);
00286 virtual int prepare3D(int do_clear = TRUE);
00287 virtual int prepareOpaque();
00288 virtual int prepareTrans();
00289 virtual void clear(void);
00290 virtual void render(const VMDDisplayList *);
00291 virtual void render_done();
00292 void free_opengl_ctx();
00293
00295 virtual int forced_stereo_draws(void) { return ext->stereodrawforced; }
00296
00297 virtual void set_stereo_mode(int = 0);
00298 virtual void set_cache_mode(int);
00299 virtual void set_render_mode(int);
00300 };
00301
00302 #endif
00303