FreeWRL / FreeX3D 4.3.0
display.h
1/*
2
3 FreeWRL support library.
4
5Purpose:
6 Handle platform specific includes about windowing systems and OpenGL.
7 Try to present a generic interface to the rest of FreeWRL library.
8
9Data:
10
11Functions:
12
13*/
14
15/****************************************************************************
16 This file is part of the FreeWRL/FreeX3D Distribution.
17
18 Copyright 2009 CRC Canada. (http://www.crc.gc.ca)
19
20 FreeWRL/FreeX3D is free software: you can redistribute it and/or modify
21 it under the terms of the GNU Lesser Public License as published by
22 the Free Software Foundation, either version 3 of the License, or
23 (at your option) any later version.
24
25 FreeWRL/FreeX3D is distributed in the hope that it will be useful,
26 but WITHOUT ANY WARRANTY; without even the implied warranty of
27 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 GNU General Public License for more details.
29
30 You should have received a copy of the GNU General Public License
31 along with FreeWRL/FreeX3D. If not, see <http://www.gnu.org/licenses/>.
32****************************************************************************/
33
34#if 1 || defined(HAVE_FV_INLIB)
35#define KEEP_FV_INLIB 1
36#define KEEP_X11_INLIB 1
37#else
38#define KEEP_FV_INLIB 0
39#define KEEP_X11_INLIB 0
40#endif
41
42#ifndef __LIBFREEWRL_DISPLAY_H__
43#define __LIBFREEWRL_DISPLAY_H__
44
45/* this is platform-dependent but there is no default so set one here */
46#ifndef MAX_MULTITEXTURE
47#define MAX_MULTITEXTURE 4
48#endif
49
50#ifdef GL_ES_VERSION_2_0
51#define MAX_LIGHTS 6
52#define STR_MAX_LIGHTS "\n#define MAX_LIGHTS 6\n "
53#define MAX_LIGHT_STACK 8 //making this larger than MAX_LIGHTS means we can visit all the local lights and use the last one on the stack/most local (or 2 if headlight off)
54#define HEADLIGHT_LIGHT (MAX_LIGHT_STACK-1)
55#else
56#define MAX_LIGHTS 8 //8 lights is 1152bytes transfered to GPU shader per shape draw - 11% of mainloop load on pentium class PC with card in old-style 32bit PCI expansion slot
57#define STR_MAX_LIGHTS "\n#define MAX_LIGHTS 8\n "
58#define MAX_LIGHT_STACK 8 //going down the transform stack, up to 7 local lights, with most-local as last
59#define HEADLIGHT_LIGHT (MAX_LIGHT_STACK-1)
60#endif
61
62#ifdef AQUA // OLD_IPHONE_AQUA
66
67 #ifdef IPHONE
68 #include <OpenGLES/ES2/gl.h>
69 #include <OpenGLES/ES2/glext.h>
70 #include <OpenGLES/ES3/gl.h>
71 #include <OpenGLES/ES3/glext.h>
72 #else
73
74 #include <OpenGL/OpenGL.h>
75 #include <OpenGL/CGLTypes.h>
76
77 #include <AGL/AGL.h>
78 #endif /* defined IPHONE */
79#endif /* defined TARGET_AQUA */
80
81#include <libFreeWRL.h>
82
83/* Some Windows-specific stuff */
84#if defined(_MSC_VER) && defined(HAVE_GLEW_H) && !defined(ANGLEPROJECT)
85#define GLEW_NO_GLU 1
86#include <GL/glew.h>
87#ifdef GLEW_MX
88GLEWContext * glewGetContext();
89#endif
90#define ERROR 0
91#endif /* TARGET_WIN32 */
92
93#if defined(__linux__) && !defined(_ANDROID) && !defined(ANDROIDNDK)
94# define GL_GLEXT_PROTOTYPES 1
95# include <GL/gl.h>
96//JAS # include <GL/glu.h>
97//JAS # include <GL/glext.h>
98#include <../libtess/libtess2.h>
99
100# include <GL/glx.h>
101/* original bits that were here; the above was moved from linux-specific section below
102 define GL_GLEXT_PROTOTYPES 1
103 include <GL/gl.h>
104 include <GL/glext.h>
105 include <GL/glx.h> */
106#endif
107
108#if defined (_ANDROID) || defined(ANDROIDNDK) || defined (QNX) || defined(ANGLEPROJECT)
109 #include <GLES2/gl2.h>
110 #include <GLES2/gl2ext.h>
111// #include <GLES3/gl3.h>
112// #include <GLES3/gl3ext.h>
113#endif
114
115
116
117
118/* generic - OpenGL ES 2.0 does not have doubles */
119#ifdef GL_ES_VERSION_2_0
120 #define GLDOUBLE double
121 #define DOUBLE_MAX fmax
122 #define DOUBLE_MIN fmin
123#else
124 #define GLDOUBLE GLdouble
125 #define DOUBLE_MAX max
126 #define DOUBLE_MIN min
127#endif
128
129
130/* face culling */
131#define CULL_FACE(v) /* printf ("nodeSolid %d getAppearanceProperties()->cullFace %d GL_FALSE %d FALSE %d\n",v,getAppearanceProperties()->cullFace,GL_FALSE,FALSE); */ \
132 if (v != getAppearanceProperties()->cullFace) { \
133 getAppearanceProperties()->cullFace = v; \
134 if (getAppearanceProperties()->cullFace == TRUE) {glEnable(GL_CULL_FACE);}\
135 else { glDisable(GL_CULL_FACE);} \
136 }
137 #define CULL_FACE_INITIALIZE getAppearanceProperties()->cullFace=FALSE; glDisable(GL_CULL_FACE);
138
139#define DISABLE_CULL_FACE CULL_FACE(FALSE)
140#define ENABLE_CULL_FACE CULL_FACE(TRUE)
141
142#define GL_LIGHT_RADIUS 0xBEEF /* smile - my definition */
143#define GL_SPOT_BEAMWIDTH 0xF00D /* smile - my definition */
144#ifdef GL_ES_VERSION_2_0
145#if !defined(PATH_MAX)
146 #define PATH_MAX 5000
147#endif
148
149 /* as we now do our own matrix manipulation, we can change these; note that OpenGL-ES 2.0 does not
150 have these by default */
151 #define GL_MODELVIEW 0x1700
152 #define GL_MODELVIEW_MATRIX 0x0BA6
153 #define GL_PROJECTION 0x1701
154 #define GL_PROJECTION_MATRIX 0x0BA7
155 #define GL_TEXTURE_MATRIX 0x0BA8
156
157 /* same with material properties - we do our own, but need some constants, so... */
158 #define GL_SHININESS 0x1601
159 #define GL_DIFFUSE 0x1201
160 #define GL_AMBIENT 0x1200
161 #define GL_SPECULAR 0x1202
162 #define GL_EMISSION 0x1600
163 #define GL_ENABLE_BIT 0x00002000
164
165 #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
166 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA
167 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
168 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
169 #define GL_LIGHT_MODEL_AMBIENT 0x0B53
170 #define GL_LIGHT0 0x4000
171
172 /* and, one buffer only, not stereo viewing */
173 #define GL_BACK_LEFT GL_BACK
174 #define GL_BACK_RIGHT GL_BACK
175 #define GL_STEREO 0x0C33
176
177 /* we do not do occlusion queries yet; have to figure this one out */
178 #define GL_QUERY_RESULT 0x8866
179 #define GL_QUERY_RESULT_AVAILABLE 0x8867
180 #define GL_SAMPLES_PASSED 0x8914
181
182 /* and, we have shaders, but not OpenGL 2.0, so we just put these here */
183 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
184 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
185 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
186 #define GL_RGBA8 0x8058
187 #define GL_RGB8 0x8051
188 #define GL_BGR 0x80E0
189 #define GL_RGB5 0x8050
190
191#define GL_EDGE_FLAG_ARRAY 0x8079
192#define GL_INDEX_ARRAY 0x8077
193#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY
194#define GL_SECONDARY_COLOR_ARRAY 0x845E
195 #define GL_LINE_STIPPLE 0x0B24
196 #define GL_VERTEX_ARRAY 0x8074
197 #define GL_NORMAL_ARRAY 0x8075
198 #define GL_TEXTURE_COORD_ARRAY 0x8078
199 #define GL_COLOR_ARRAY 0x8076
200 #define GL_OBJECT_LINEAR 0x2401
201 #define GL_EYE_LINEAR 0x2400
202 #define GL_REFLECTION_MAP 0x8512
203 #define GL_SPHERE_MAP 0x2402
204 #define GL_NORMAL_MAP 0x8511
205 #define GL_S 0x2000
206 #define GL_TEXTURE_GEN_MODE 0x2500
207 #define GL_T 0x2001
208 #define GL_TEXTURE_GEN_S 0x0C60
209 #define GL_TEXTURE_GEN_T 0x0C61
210 #define GL_TEXTURE_ENV 0x2300
211 #define GL_TEXTURE_ENV_MODE 0x2200
212 #define GL_MODULATE 0x2100
213 #define GL_COMBINE 0x8570
214 #define GL_COMBINE_RGB 0x8571
215 #define GL_SOURCE0_RGB 0x8580
216 #define GL_OPERAND0_RGB 0x8590
217 #define GL_SOURCE1_RGB 0x8581
218 #define GL_OPERAND1_RGB 0x8591
219 #define GL_COMBINE_ALPHA 0x8572
220 #define GL_SOURCE0_ALPHA 0x8588
221 #define GL_OPERAND0_ALPHA 0x8598
222 #define GL_RGB_SCALE 0x8573
223 #define GL_ALPHA_SCALE 0x0D1C
224 #define GL_SOURCE1_ALPHA 0x8589
225 #define GL_OPERAND1_ALPHA 0x8599
226 #define GL_TEXTURE_GEN_S 0x0C60
227 #define GL_TEXTURE_GEN_T 0x0C61
228 #define GL_PREVIOUS 0x8578
229 #define GL_ADD 0x0104
230 #define GL_SUBTRACT 0x84E7
231 #define GL_DOT3_RGB 0x86AE
232 #define GL_ADD_SIGNED 0x8574
233 #define GL_CLAMP 0x2900
234 #define GL_CLAMP_TO_BORDER 0x812D
235 #define GL_TEXTURE_WRAP_R 0x8072
236 #define GL_R 0x2002
237 #define GL_TEXTURE_GEN_R 0x0C62
238 #define GL_GENERATE_MIPMAP 0x8191
239 #define GL_TEXTURE_PRIORITY 0x8066
240 #define GL_TEXTURE_BORDER_COLOR 0x1004
241 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003
242 #define GL_COMPRESSED_RGBA 0x84EE
243 #define GL_TEXTURE_COMPRESSION_HINT 0x84EF
244 #define GL_PROXY_TEXTURE_2D 0x8064
245 #define GL_TEXTURE_WIDTH 0x1000
246 #define GL_TEXTURE_HEIGHT 0x1001
247 #define GL_POSITION 0x1203
248 #define GL_SPOT_DIRECTION 0x1204
249
250 #define GL_CONSTANT_ATTENUATION 0x1207
251 #define GL_LINEAR_ATTENUATION 0x1208
252 #define GL_QUADRATIC_ATTENUATION 0x1209
253 #define GL_SPOT_CUTOFF 0x1206
254 #define GL_COMPILE 0x1300
255 #define GL_FLAT 0x1D00
256 #define GL_SMOOTH 0x1D01
257 #define GL_LIST_BIT 0x00020000
258
259 #define VERTEX_SHADER GL_VERTEX_SHADER
260 #define FRAGMENT_SHADER GL_FRAGMENT_SHADER
261 #define SHADER_SOURCE glShaderSource
262 #define COMPILE_SHADER glCompileShader
263 #define CREATE_PROGRAM glCreateProgram();
264 #define CREATE_SHADER glCreateShader
265 #define ATTACH_SHADER glAttachShader
266 #define LINK_SHADER glLinkProgram
267 #define DELETE_SHADER glDeleteShader
268 #define DELETE_PROGRAM glDeleteProgram
269 #define USE_SHADER(aaa) glUseProgram(aaa)
270 #define GET_SHADER_INFO glGetShaderiv
271 #define LINK_STATUS GL_LINK_STATUS
272 #define COMPILE_STATUS GL_COMPILE_STATUS
273 #define GET_UNIFORM(aaa,bbb) glGetUniformLocation(aaa,bbb)
274 #define GET_ATTRIB(aaa,bbb) glGetAttribLocation(aaa,bbb)
275 #define GLUNIFORM1I glUniform1i
276 #define GLUNIFORM1F glUniform1f
277 #define GLUNIFORM2F glUniform2f
278 #define GLUNIFORM3F glUniform3f
279 #define GLUNIFORM4F glUniform4f
280 #define GLUNIFORM1IV glUniform1iv
281 #define GLUNIFORM1FV glUniform1fv
282 #define GLUNIFORM2FV glUniform2fv
283 #define GLUNIFORM3FV glUniform3fv
284 #define GLUNIFORM4FV glUniform4fv
285 #define GLUNIFORMMATRIX4FV glUniformMatrix4fv
286 #define GLUNIFORMMATRIX3FV glUniformMatrix3fv
287#endif
288
289/* OLD_IPHONE_AQUA
290 OLD_IPHONE_AQUA #if defined (_MSC_VER) || defined (TARGET_AQUA) || defined(IPHONE) || defined(_ANDROID) || defined(ANDROIDNDK) || defined(QNX) */
291#if defined (TARGET_AQUA) || defined (_MSC_VER) || defined(_ANDROID) || defined(ANDROIDNDK) || defined(QNX) /* not win32, ie linux */
292 #include <libtess2.h>
293#endif // linux spefcific for now
294
295/* Main initialization function */
296/* int display_initialize(); */
297#define IS_DISPLAY_INITIALIZED (gglobal()->display.display_initialized==TRUE)
298
306
307/* are we doing Vertex Buffer Objects? (VBOs) for OpenGL? */
308//#define VERTEX_VBO 0
309//#define NORMAL_VBO 1
310//#define TEXTURE_VBO 2
311//#define INDEX_VBO 3
312//#define COLOR_VBO 4
313//#define FOG_VBO 5
314//#define VBO_COUNT 6
315#define VERTEX_VBO 0
316#define NORMAL_VBO 1
317#define INDEX_VBO 2
318#define COLOR_VBO 3
319#define FOG_VBO 4
320#define TEXTURE_VBO0 5
321#define TEXTURE_VBO1 6
322#define TEXTURE_VBO2 7
323#define TEXTURE_VBO3 8
324#define CINDEX_VBO 9
325#define VBO_COUNT 10
326
327
328void fv_setScreenDim(int wi, int he);
329
330int fv_open_display();
331int fv_display_initialize(void);
332int fv_display_initialize_desktop(void);
333int fv_create_main_window(freewrl_params_t *d); //int argc, char *argv[]);
334int fv_create_main_window2(freewrl_params_t *d, freewrl_params_t *share);
335bool fv_create_GLcontext();
336bool fv_bind_GLcontext();
337void fv_swapbuffers(freewrl_params_t *d);
338int fv_create_window_and_context(freewrl_params_t *params, freewrl_params_t *share);
339void fv_change_GLcontext(freewrl_params_t* d);
340/* end of "virtual" functions */
341
342/* OpenGL renderer capabilities */
343
344
345/* Location Information of Shader Valuation */
347 GLint compiledOK;
348 GLuint myShaderProgram;
349
350 GLint myMaterialDiffuse;
351 GLint myMaterialEmissive;
352 GLint myMaterialSpecular;
353 GLint myMaterialAmbient;
354 GLint myMaterialShininess;
355 GLint myMaterialOcclusion;
356 GLint myMaterialNormalScale;
357 GLint myMaterialTransparency;
358 GLint myMaterialBaseColor;
359 GLint myMaterialMetallic;
360 GLint myMaterialRoughness;
361 GLint myMaterialType;
362 GLint myMaterialTransdex;
363 GLint myMaterialNt;
364 GLint myMaterialTindex[10];
365 GLint myMaterialMode[10];
366 GLint myMaterialSource[10];
367 GLint myMaterialFunc[10];
368 GLint myMaterialCmap[10];
369 GLint myMaterialSampler[7];
370 GLint myMaterialTcount[7];
371 GLint myMaterialTstart[7];
372 //GLint myMaterialCindex[7];
373
374 GLint myMaterialBackDiffuse;
375 GLint myMaterialBackEmissive;
376 GLint myMaterialBackSpecular;
377 GLint myMaterialBackAmbient;
378 GLint myMaterialBackShininess;
379 GLint myMaterialBackOcclusion;
380 GLint myMaterialBackNormalScale;
381 GLint myMaterialBackTransparency;
382 GLint myMaterialBackBaseColor;
383 GLint myMaterialBackMetallic;
384 GLint myMaterialBackRoughness;
385 GLint myMaterialBackType;
386 GLint myMaterialBackTransdex;
387 GLint myMaterialBackNt;
388 GLint myMaterialBackTindex[10];
389 GLint myMaterialBackMode[10];
390 GLint myMaterialBackSource[10];
391 GLint myMaterialBackFunc[10];
392 GLint myMaterialBackCmap[10];
393 GLint myMaterialBackSampler[7];
394 GLint myMaterialBackTcount[7];
395 GLint myMaterialBackTstart[7];
396 //GLint myMaterialBackCindex[7];
397
398 GLint myPointSize;
399
400 // do we need to send down light information?
401 bool haveLightInShader;
402
403 GLint lightcount;
404 //GLint lightType;
405 GLint lightType[MAX_LIGHTS];
406 GLint lightAmbientIntensity[MAX_LIGHTS];
407 GLint lightColor[MAX_LIGHTS];
408 GLint lightIntensity[MAX_LIGHTS];
409 GLint lightLocation[MAX_LIGHTS];
410 GLint lightDirection[MAX_LIGHTS];
411 GLint lightAtten[MAX_LIGHTS];
412 //GLint lightConstAtten[MAX_LIGHTS];
413 //GLint lightLinAtten[MAX_LIGHTS];
414 //GLint lightQuadAtten[MAX_LIGHTS];
415 GLint lightSpotCutoffAngle[MAX_LIGHTS];
416 GLint lightSpotBeamWidth[MAX_LIGHTS];
417 //GLint lightRadius;
418 GLint lightRadius[MAX_LIGHTS];
419 GLint lightshadows[MAX_LIGHTS];
420 GLint lightshadowIntensity[MAX_LIGHTS];
421 GLint lightdepthmap[MAX_LIGHTS];
422 GLint lightMat[MAX_LIGHTS];
423
424 GLint ModelViewMatrix;
425 GLint ProjectionMatrix;
426 GLint NormalMatrix;
427 GLint ModelViewInverseMatrix;
428 GLint TextureMatrix[MAX_MULTITEXTURE];
429
430 GLint nTexMatrix;
431 GLint tmap[MAX_MULTITEXTURE+2];
432 GLint cmap[MAX_MULTITEXTURE + 2];
433 GLint tgen[MAX_MULTITEXTURE + 2];
434 GLint parameter_n;
435 GLint parameter[7];
436
437
438 GLint ntexcombo;
439 GLint Vertices;
440 GLint Normals;
441 GLint Colours;
442 GLint TexCoords[MAX_MULTITEXTURE];
443 GLint nTexCoordChannels;
444 GLint Cindex;
445 GLint flipuv;
446 GLint FogCoords; //Aug 2016
447 GLint prevVertex; //for dashed lines
448 GLint nextVertex;
449 GLint linetype;
450 GLint lineperiod;
451 GLint linewidth;
452 GLint linestrip_start_style;
453 GLint linestrip_end_style;
454 GLint screenresolution;
455 GLint linetype_uv;
456 GLint linetype_tse;
457 GLint pointSize;
458 GLint pointAttenuation;
459 GLint pointRange;
460 GLint pointColorMode;
461 GLint pointPosition;
462 GLint pointMethod;
463 GLint pointCPV;
464 GLint pointFogCoord;
465
466 //shared PTM and PBR
467 GLint textureUnit[16]; //its an array of shader addresses to sampler2D textureUnit[16]
468 GLint textureUnitCube[8]; //shared light shadow maps, anything else that needs cube texture
469
470 /* PTM Projective Texture */
471 GLint ptmCount;
472 GLint ptmGenMatCam[8];
473 GLint ptmcolor[8];
474 GLint ptmintensity[8];
475 GLint ptmbackCull[8];
476 GLint ptmshadows[8];
477 GLint ptmshadowIntensity[8];
478 GLint ptmdepthmap[8];
479 //GLint ntdesc[8];
480 GLint ptmtcount[8];
481 GLint ptmtstart[8];
482 GLint ptmtype[8];
483 GLint ptmfarDistance[8];
484 GLint tdtindex[16];
485 GLint tdmode[16];
486 GLint tdsource[16];
487 GLint tdfunc[16];
488 GLint tdsamplr[16];
489
490
491 GLint TextureUnit[MAX_MULTITEXTURE];
492 GLint TextureMode[MAX_MULTITEXTURE];
493 GLint TextureSource[MAX_MULTITEXTURE];
494 GLint TextureFunction[MAX_MULTITEXTURE];
495 GLint textureCount;
496 GLint multitextureColor;
497
498 /* texture3D */
499 GLint tex3dTiles; //int[2] nx, ny number of tiles in x, y
500 GLint tex3dUseVertex; //bool flag when no 3D texture coords supplied, vertex shader should use vertex
501 GLint repeatSTR;
502 GLint magFilter;
503
504 /* fill properties */
505 GLint hatchColour;
506 GLint filledBool;
507 GLint hatchedBool;
508 GLint hatchAlgo;
509
510 /* TextureCoordinateGenerator type */
511 GLint texCoordGenType;
512
513 GLint fogColor; //Aug 2016
514 GLint fogvisibilityRange;
515 GLint fogScale;
516 GLint fogType;
517 GLint fogHaveCoords;
518
519 GLint clipplanes; //Sept 2016
520 GLint nclipplanes;
521
522/* attributes - reduce redundant state chage calls on GPU */
523/*
524 need to ensure that all calls to glEnableVertexAttribArray
525 are tagged for redundancy - eg, in statusbarHud.c, etc.
526 before trying to reduce the glEnableVertexAttribArray and
527 glDisableVertexAttribArray calls.
528
529 bool vertexAttribEnabled;
530 bool texCoordAttribEnabled;
531 bool colourAttribEnabled;
532 bool normalAttribEnabled;
533*/
534
535} s_shader_capabilities_t;
536
537typedef struct {
538
539 const char *renderer; /* replace GL_REN */
540 const char *version;
541 const char *vendor;
542 const char *extensions;
543 float versionf;
544 bool have_GL_VERSION_1_1;
545 bool have_GL_VERSION_1_2;
546 bool have_GL_VERSION_1_3;
547 bool have_GL_VERSION_1_4;
548 bool have_GL_VERSION_1_5;
549 bool have_GL_VERSION_2_0;
550 bool have_GL_VERSION_2_1;
551 bool have_GL_VERSION_3_0;
552
553 bool av_multitexture; /* Multi textures available ? */
554 bool av_npot_texture; /* Non power of 2 textures available ? */
555 bool av_texture_rect; /* Rectangle textures available ? */
556 bool av_occlusion_q; /* Occlusion query available ? */
557
558 int texture_units;
559 int runtime_max_texture_size;
560 int system_max_texture_size;
561 float anisotropicDegree;
562
563 GLboolean quadBuffer; /* does platform support quadbuffer? */
564
566
567// JAS extern s_renderer_capabilities_t rdr_caps;
568
569bool initialize_rdr_caps();
570void initialize_rdr_functions();
571void rdr_caps_dump(s_renderer_capabilities_t *rdr_caps);
572
573
574#ifdef TARGET_AQUA /* OLD_IPHONE_AQUA */
575/*
576OLD_IPHONE_AQUA #ifndef IPHONE
577OLD_IPHONE_AQUA
578OLD_IPHONE_AQUA extern int ccurse;
579OLD_IPHONE_AQUA extern int ocurse;
580OLD_IPHONE_AQUA
581OLD_IPHONE_AQUA //#define SCURSE 1
582OLD_IPHONE_AQUA //#define ACURSE 0
583OLD_IPHONE_AQUA
584OLD_IPHONE_AQUA // for handling Safari window changes at the top of the display event loop
585OLD_IPHONE_AQUA extern int PaneClipnpx;
586OLD_IPHONE_AQUA extern int PaneClipnpy;
587OLD_IPHONE_AQUA
588OLD_IPHONE_AQUA extern int PaneClipct;
589OLD_IPHONE_AQUA extern int PaneClipcb;
590OLD_IPHONE_AQUA extern int PaneClipcr;
591OLD_IPHONE_AQUA extern int PaneClipcl;
592OLD_IPHONE_AQUA extern int PaneClipwidth;
593OLD_IPHONE_AQUA extern int PaneClipheight;
594OLD_IPHONE_AQUA extern int PaneClipChanged;
595OLD_IPHONE_AQUA
596OLD_IPHONE_AQUA #include "OpenGL/glu.h"
597OLD_IPHONE_AQUA #endif
598 */
599#endif /* OLD_IPHONE_AQUA TARGET_AQUA */
600
604#if defined(TARGET_X11) || defined(TARGET_MOTIF)
605
609
610# include <X11/Xlib.h>
611# include <X11/Xutil.h>
612# include <X11/keysym.h>
613
614
615extern GLXContext GLcx;
616
617extern XEvent event;
618extern long event_mask;
619extern Display *Xdpy;
620extern int Xscreen;
621extern Window Xroot_window;
622extern XVisualInfo *Xvi;
623extern Colormap colormap;
624extern Window Xwin;
625extern Window GLwin;
626extern XSetWindowAttributes attr;
627extern unsigned long mask;
628extern Atom WM_DELETE_WINDOW;
629
630void handle_Xevents(XEvent event);
631
632# ifdef HAVE_XF86_VMODE
633# include <X11/extensions/xf86vmode.h>
634extern int vmode_nb_modes;
635extern XF86VidModeModeInfo **vmode_modes;
636extern int vmode_mode_selected;
637# endif /* HAVE_XF86_VMODE */
638
639# if defined(TARGET_MOTIF)
640
644# include <X11/Intrinsic.h>
645# include <Xm/Xm.h>
646
647extern XtAppContext Xtcx;
648
649void getMotifWindowedGLwin(Window *win);
650# define GET_GLWIN getMotifWindowedGLwin(&GLwin)
651
652# else /* defined(TARGET_MOTIF) */
653
657# define GET_GLWIN getBareWindowedGLwin(&GLwin)
658
659# endif /* defined(TARGET_MOTIF) */
660
661#endif /* defined(TARGET_X11) || defined(TARGET_MOTIF) */
662
666
667#if defined (FW_DEBUG_GL)
668
669 #if defined(_ANDROID)
670 #define PRINT_GL_ERROR_IF_ANY(_where) { \
671 GLenum _global_gl_err = glGetError(); \
672 while (_global_gl_err != GL_NO_ERROR) { \
673 if (_global_gl_err == GL_INVALID_ENUM) {DROIDDEBUG ("GL_INVALID_ENUM"); } \
674 else if (_global_gl_err == GL_INVALID_VALUE) {DROIDDEBUG("GL_INVALID_VALUE"); } \
675 else if (_global_gl_err == GL_INVALID_OPERATION) {DROIDDEBUG("GL_INVALID_OPERATION"); } \
676 else if (_global_gl_err == GL_OUT_OF_MEMORY) {DROIDDEBUG("GL_OUT_OF_MEMORY"); } \
677 else DROIDDEBUG("unknown error"); \
678 DROIDDEBUG(" here: %s (%s:%d)\n", _where,__FILE__,__LINE__); \
679 _global_gl_err = glGetError(); \
680 } \
681 }
682
683 #else
684 #define PRINT_GL_ERROR_IF_ANY(_where) { \
685 GLenum _global_gl_err = glGetError(); \
686 while (_global_gl_err != GL_NO_ERROR) { \
687 if (_global_gl_err == GL_INVALID_ENUM) {printf ("GL_INVALID_ENUM"); } \
688 else if (_global_gl_err == GL_INVALID_VALUE) {printf ("GL_INVALID_VALUE"); } \
689 else if (_global_gl_err == GL_INVALID_OPERATION) {printf ("GL_INVALID_OPERATION"); } \
690 else if (_global_gl_err == GL_STACK_OVERFLOW) {printf ("GL_STACK_UNDERFLOW"); } \
691 else if (_global_gl_err == GL_STACK_UNDERFLOW) {printf ("GL_STACK_UNDERFLOW"); } \
692 else if (_global_gl_err == GL_OUT_OF_MEMORY) {printf ("GL_OUT_OF_MEMORY"); } \
693 else if (_global_gl_err == GL_INVALID_FRAMEBUFFER_OPERATION) {printf ("GL_INVALID_FRAMEBUFFER_OPERATION"); } \
694 else if (_global_gl_err == GL_CONTEXT_LOST) {printf ("GL_CONTEXT_LOST"); } \
695 else if (_global_gl_err == GL_TABLE_TOO_LARGE) {printf ("GL_TABLE_TOO_LARGE"); } \
696 else printf ("unknown error %d ",_global_gl_err); \
697 char* fname = strrchr(__FILE__,'\\'); \
698 if (!fname) fname = strrchr(__FILE__, '/'); \
699 if(fname) fname++; \
700 printf(" here: %s (%s:%d)\n", _where,fname,__LINE__); \
701 _global_gl_err = glGetError(); \
702 } \
703 }
704 #endif
705
706#else // FW_DEBUG
707 #define PRINT_GL_ERROR_IF_ANY(_where) /* do nothing */
708#endif
709
710#define GL_ERROR_MSG (\
711 (glGetError() == GL_NO_ERROR)?"":\
712 (glGetError() == GL_INVALID_ENUM)?"GL_INVALID_ENUM":\
713 (glGetError() == GL_INVALID_VALUE)?"GL_INVALID_VALUE":\
714 (glGetError() == GL_INVALID_OPERATION)?"GL_INVALID_OPERATION":\
715 (glGetError() == GL_OUT_OF_MEMORY)?"GL_OUT_OF_MEMORY":\
716 "unknown GL_ERROR")
717
718void resetGeometry();
719/* void setScreenDim(int wi, int he); */
720
721/* GLSL variables */
722/* Versions 1.5 and above have shaders */
723#ifdef GL_VERSION_2_0
724 #define VERTEX_SHADER GL_VERTEX_SHADER
725 #define FRAGMENT_SHADER GL_FRAGMENT_SHADER
726 #define SHADER_SOURCE glShaderSource
727 #define COMPILE_SHADER glCompileShader
728 #define CREATE_PROGRAM glCreateProgram();
729 #define CREATE_SHADER glCreateShader
730 #define ATTACH_SHADER glAttachShader
731 #define LINK_SHADER glLinkProgram
732 #define DELETE_SHADER glDeleteShader
733 #define DELETE_PROGRAM glDeleteProgram
734 #define USE_SHADER(aaa) glUseProgram(aaa)
735 #define GET_SHADER_INFO glGetShaderiv
736 #define LINK_STATUS GL_LINK_STATUS
737 #define COMPILE_STATUS GL_COMPILE_STATUS
738 #define GET_UNIFORM(aaa,bbb) glGetUniformLocation(aaa,bbb)
739 #define GET_ATTRIB(aaa,bbb) glGetAttribLocation(aaa,bbb)
740 #define GLUNIFORM1I glUniform1i
741 #define GLUNIFORM1F glUniform1f
742 #define GLUNIFORM2F glUniform2f
743 #define GLUNIFORM3F glUniform3f
744 #define GLUNIFORM4F glUniform4f
745 #define GLUNIFORM1IV glUniform1iv
746 #define GLUNIFORM1FV glUniform1fv
747 #define GLUNIFORM2FV glUniform2fv
748 #define GLUNIFORM3FV glUniform3fv
749 #define GLUNIFORM4FV glUniform4fv
750 #define GLUNIFORMMATRIX4FV glUniformMatrix4fv
751 #define GLUNIFORMMATRIX3FV glUniformMatrix3fv
752
753#else
754#ifdef GL_VERSION_1_5
755 #define VERTEX_SHADER GL_VERTEX_SHADER_ARB
756 #define FRAGMENT_SHADER GL_FRAGMENT_SHADER_ARB
757 #define SHADER_SOURCE glShaderSourceARB
758 #define COMPILE_SHADER glCompileShaderARB
759 #define CREATE_PROGRAM glCreateProgramObjectARB();
760 #define CREATE_SHADER glCreateShaderARB
761 #define ATTACH_SHADER glAttachObjectARB
762 #define LINK_SHADER glLinkProgramARB
763 #define DELETE_SHADER glDeleteShaderARB
764 #define DELETE_PROGRAM glDeleteProgramARB
765 #define USE_SHADER(aaa) glUseProgramObjectARB(aaa)
766 #define CREATE_SHADER glCreateShaderObjectARB
767 #define GET_SHADER_INFO glGetObjectParameterivARB
768 #define LINK_STATUS GL_OBJECT_LINK_STATUS_ARB
769 #define COMPILE_STATUS GL_OBJECT_COMPILE_STATUS_ARB
770 #define GET_UNIFORM(aaa,bbb) glGetUniformLocationARB(aaa,bbb)
771 #define GET_ATTRIB(aaa,bbb) glGetAttribLocationARB(aaa,bbb)
772 #define GLUNIFORM1F glUniform1fARB
773 #define GLUNIFORM1I glUniform1iARB
774 #define GLUNIFORM2F glUniform2fARB
775 #define GLUNIFORM3F glUniform3fARB
776 #define GLUNIFORM4F glUniform4fARB
777 #define GLUNIFORM1IV glUniform1ivARB
778 #define GLUNIFORM1FV glUniform1fvARB
779 #define GLUNIFORM2FV glUniform2fvARB
780 #define GLUNIFORM3FV glUniform3fvARB
781 #define GLUNIFORM4FV glUniform4fvARB
782 #define GLUNIFORMMATRIX4FV glUniformMatrix4fvARB
783 #define GLUNIFORMMATRIX3FV glUniformMatrix3fvARB
784#endif
785#endif
786
787/* OpenGL-2.x and OpenGL-3.x "desktop" systems calls */
788 /****************************************************************/
789 /* First - any platform specifics to do? */
790 /****************************************************************/
791
792 #if defined(_MSC_VER)
793 void fwMessageLoop();
794 #define FW_GL_SWAPBUFFERS fv_swapbuffers(gglobal()->display.params); //SwapBuffers(wglGetCurrentDC());
795 #endif
796
797#if KEEP_X11_INLIB
798 #if defined (TARGET_X11) || defined (TARGET_MOTIF)
799 #define FW_GL_SWAPBUFFERS fv_swapbuffers(gglobal()->display.params);
800 #endif
801#endif
802
803#ifndef FW_GL_SWAPBUFFERS
804#define FW_GL_SWAPBUFFERS /* nothing */
805#endif
806
807
808 /****************************************************************/
809 /* Second - things that might be specific to one platform; */
810 /* this is the "catch for other OS" here */
811 /****************************************************************/
812 /* nothing here */
813
814 /****************************************************************/
815 /* Third - common across all platforms */
816 /****************************************************************/
817
818
819 /* GLU replacement - needs local matrix stacks, plus more code */
820 #define FW_GLU_PERSPECTIVE(aaa,bbb,ccc,ddd) fw_gluPerspective(aaa,bbb,ccc,ddd)
821 #define FW_GLU_UNPROJECT(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii) fw_gluUnProject(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii)
822 #define FW_GLU_PROJECT(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii) fw_gluProject(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii)
823 #define FW_GLU_PICK_MATRIX(aaa, bbb, ccc, ddd, eee) fw_gluPickMatrix(aaa, bbb, ccc, ddd, eee)
824
825 /* GLU replacement -these still need doing */
826 #define FW_GLU_DELETETESS(aaa) gluDeleteTess(aaa)
827 #define FW_GLU_NEW_TESS gluNewTess
828 #define FW_GLU_END_POLYGON(aaa) gluEndPolygon(aaa)
829 #define FW_GLU_BEGIN_POLYGON(aaa) gluBeginPolygon(aaa)
830 #define FW_GLU_TESS_VERTEX(aaa, bbb, ccc) gluTessVertex(aaa, bbb, ccc)
831 #define FW_GLU_TESS_CALLBACK(aaa, bbb, ccc) gluTessCallback(aaa,bbb,ccc);
832 #define FW_GLU_NEXT_CONTOUR(aaa, bbb) gluNextContour(aaa,bbb)
833
834
835 #define FW_GL_GETDOUBLEV(aaa,bbb) fw_glGetDoublev(aaa,bbb);
836 #define FW_GL_SETDOUBLEV(aaa,bbb) fw_glSetDoublev(aaa,bbb);
837 #define FW_GL_LOAD_IDENTITY fw_glLoadIdentity
838 #define FW_GL_LOAD_MATRIX_D(mat16) fw_glLoadMatrixd(mat16)
839 #define FW_GL_POP_MATRIX() fw_glPopMatrix()
840 #define FW_GL_PUSH_MATRIX() fw_glPushMatrix()
841
842 #define FW_GL_TRANSLATE_F(xxx,yyy,zzz) fw_glTranslatef(xxx,yyy,zzz)
843 #define FW_GL_TRANSLATE_D(xxx,yyy,zzz) fw_glTranslated(xxx,yyy,zzz)
844 #define FW_GL_TRANSFORM_D(mat16) fw_glTransformd(mat16)
845 #define FW_GL_MULTMATRIX_D(mat16) fw_glMultMatrixd(mat16)
846 #define FW_GL_ROTATE_F(aaa,xxx,yyy,zzz) fw_glRotatef(aaa,xxx,yyy,zzz)
847 #define FW_GL_ROTATE_D(aaa,xxx,yyy,zzz) fw_glRotated(aaa,xxx,yyy,zzz)
848 #define FW_GL_ROTATE_RADIANS(aaa,xxx,yyy,zzz) fw_glRotateRad(aaa,xxx,yyy,zzz)
849 #define FW_GL_SCALE_F(xxx,yyy,zzz) fw_glScalef(xxx,yyy,zzz)
850 #define FW_GL_SCALE_D(xxx,yyy,zzz) fw_glScaled(xxx,yyy,zzz)
851 #define FW_GL_PUSH_ATTRIB(aaa) glPushAttrib(aaa);
852 #define FW_GL_POP_ATTRIB() glPopAttrib();
853 #define FW_GL_MATRIX_MODE(aaa) fw_glMatrixMode(aaa)
854 #define FW_GL_ORTHO(aaa,bbb,ccc,ddd,eee,fff) fw_Ortho(aaa,bbb,ccc,ddd,eee,fff);
855
856
857 /* geometry rendering - varies on whether we are using appearance shaders, etc */
858 #define FW_VERTEX_POINTER_TYPE 44354
859 #define FW_NORMAL_POINTER_TYPE 5434
860 #define FW_FOG_POINTER_TYPE 33888 //?? how geenerate these numbers
861 #define FW_COLOR_POINTER_TYPE 12453
862 #define FW_TEXCOORD_POINTER_TYPE 67655
863 #define FW_CINDEX_POINTER_TYPE 67644
864 //void sendAttribToGPU(int myType, int dataSize, int dataType, int normalized, int stride, float *pointer, int texID, char *file, int line);
865 // datasize, dataType, stride, pointer
866 #define FW_GL_VERTEX_POINTER(dataSize, dataType, stride, pointer) {sendAttribToGPU(FW_VERTEX_POINTER_TYPE, dataSize, dataType, GL_FALSE, stride, pointer,0,__FILE__,__LINE__); }
867
868 #define FW_GL_COLOR_POINTER(dataSize, dataType, stride, pointer) {sendAttribToGPU(FW_COLOR_POINTER_TYPE, dataSize, dataType, GL_FALSE, stride, pointer,0,__FILE__,__LINE__); }
869 #define FW_GL_NORMAL_POINTER(dataType, stride, pointer) {sendAttribToGPU(FW_NORMAL_POINTER_TYPE, 0, dataType, GL_FALSE, stride, pointer,0,__FILE__,__LINE__); }
870 #define FW_GL_FOG_POINTER(dataType, stride, pointer) {sendAttribToGPU(FW_FOG_POINTER_TYPE, 0, dataType, GL_FALSE, stride, pointer,0,__FILE__,__LINE__); }
871 #define FW_GL_TEXCOORD_POINTER(dataSize, dataType, stride, pointer, texID) {sendAttribToGPU(FW_TEXCOORD_POINTER_TYPE, dataSize, dataType, GL_FALSE, stride, pointer,texID,__FILE__,__LINE__); }
872 #define FW_GL_CINDEX_POINTER(dataType, stride, pointer) {sendAttribToGPU(FW_CINDEX_POINTER_TYPE, 0, dataType, GL_FALSE, stride, pointer,0,__FILE__,__LINE__); }
873
874 #define FW_GL_BINDBUFFER(target,buffer) {sendBindBufferToGPU(target,buffer,__FILE__,__LINE__); }
875
876
877
878 #define FW_GL_VIEWPORT(aaa,bbb,ccc,ddd) glViewport(aaa,bbb,ccc,ddd);
879 #define FW_GL_CLEAR_COLOR(aaa,bbb,ccc,ddd) glClearColor(aaa,bbb,ccc,ddd);
880 #define FW_GL_DEPTHMASK(aaa) glDepthMask(aaa);
881 #define FW_GL_SCISSOR(aaa,bbb,ccc,ddd) glScissor(aaa,bbb,ccc,ddd);
882 #define FW_GL_WINDOWPOS2I(aaa,bbb) glWindowPos2i(aaa,bbb);
883 #define FW_GL_FLUSH glFlush
884 #define FW_GL_RASTERPOS2I(aaa,bbb) glRasterPos2i(aaa,bbb);
885 #define FW_GL_LIGHTMODELI(aaa,bbb) glLightModeli(aaa,bbb);
886 #define FW_GL_LIGHTMODELFV(aaa,bbb) glLightModelfv(aaa,bbb);
887 #define FW_GL_BLENDFUNC(aaa,bbb) glBlendFunc(aaa,bbb);
888 #define FW_GL_LIGHTFV(aaa,bbb,ccc) fwglLightfv(aaa,bbb,ccc);
889 #define FW_GL_LIGHTF(aaa,bbb,ccc) fwglLightf(aaa,bbb,ccc);
890 #define FW_GL_LIGHTI(aaa,bbb,ccc) fwglLighti(aaa,bbb,ccc);
891 #define FW_GL_CLEAR(zzz) glClear(zzz);
892 #define FW_GL_DEPTHFUNC(zzz) glDepthFunc(zzz);
893 #define FW_GL_SHADEMODEL(aaa) glShadeModel(aaa);
894 #define FW_GL_PIXELSTOREI(aaa,bbb) glPixelStorei(aaa,bbb);
895
896#ifndef GL_FOG
897#define GL_FOG 0x0B60
898#endif
899 #define FW_GL_FOGFV(aaa, bbb) glFogfv(aaa, bbb)
900 #define FW_GL_FOGF(aaa, bbb) glFogf(aaa, bbb)
901 #define FW_GL_FOGI(aaa, bbb) glFogi(aaa, bbb)
902 #define FW_GL_BEGIN_QUERY(aaa, bbb) glBeginQuery(aaa, bbb)
903 #define FW_GL_END_QUERY(aaa) glEndQuery(aaa)
904 #define FW_GL_LINE_STIPPLE(aaa, bbb) glLineStipple(aaa, bbb)
905 #define FW_GL_VERTEX3D(aaa, bbb, ccc) glVertex3d(aaa, bbb, ccc)
906
907
908 //#define SET_TEXTURE_UNIT(aaa) { glActiveTexture(GL_TEXTURE0+aaa); glClientActiveTexture(GL_TEXTURE0+aaa); }
909
910 #define FW_GL_GETSTRING(aaa) glGetString(aaa)
911 #define FW_GL_DELETETEXTURES(aaa,bbb) glDeleteTextures(aaa,bbb);
912 #define FW_GL_GETINTEGERV(aaa,bbb) glGetIntegerv(aaa,bbb);
913 #define FW_GL_GETFLOATV(aaa,bbb) glGetFloatv(aaa,bbb);
914
915
916 #define FW_GL_FRONTFACE(aaa) glFrontFace(aaa);
917 #define FW_GL_GENLISTS(aaa) glGenLists(aaa)
918 #define FW_GL_GENTEXTURES(aaa,bbb) glGenTextures(aaa,bbb)
919 #define FW_GL_GETBOOLEANV(aaa,bbb) glGetBooleanv(aaa,bbb)
920 #define FW_GL_NEWLIST(aaa,bbb) glNewList(aaa,bbb)
921 #define FW_GL_NORMAL3F(aaa,bbb,ccc) glNormal3f(aaa,bbb,ccc)
922
923 #define FW_GL_READPIXELS(aaa,bbb,ccc,ddd,eee,fff,ggg) glReadPixels(aaa,bbb,ccc,ddd,eee,fff,ggg)
924 #define FW_GL_TEXIMAGE2D(aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii) glTexImage2D(aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii)
925 #define FW_GL_TEXPARAMETERF(aaa,bbb,ccc) glTexParameterf(aaa,bbb,ccc)
926 #define FW_GL_TEXPARAMETERI(aaa,bbb,ccc) glTexParameteri(aaa,bbb,ccc)
927 #define FW_GL_TEXPARAMETERFV(aaa,bbb,ccc) glTexParameterfv(aaa,bbb,ccc)
928 #define FW_GL_GETQUERYOBJECTIV(aaa,bbb,ccc) glGetQueryObjectiv(aaa,bbb,ccc)
929
930 /*apr 6 2010 checkout win32 was missing the following macros */
931 #define FW_GL_DRAWBUFFER(aaa) glDrawBuffer(aaa)
932 #define FW_GL_ENDLIST() glEndList()
933 #define FW_GL_BITMAP(aaa,bbb,ccc,ddd,eee,fff,ggg) glBitmap(aaa,bbb,ccc,ddd,eee,fff,ggg)
934 #define FW_GL_CALLLISTS(aaa,bbb,ccc) glCallLists(aaa,bbb,ccc)
935 #define FW_GL_LISTBASE(aaa) glListBase(aaa)
936 #define FW_GL_DRAWPIXELS(aaa,bbb,ccc,ddd,eee) glDrawPixels(aaa,bbb,ccc,ddd,eee)
937
938#endif /* __LIBFREEWRL_DISPLAY_H__ */