29#include <system_threads.h>
33#include <libFreeWRL.h>
35#include "vrml_parser/Structs.h"
36#include "opengl/RasterFont.h"
37#include "opengl/OpenGL_Utils.h"
38#include "opengl/Textures.h"
43#if defined(FREEWRL_PLUGIN) && (defined(TARGET_X11) || defined(TARGET_MOTIF))
44#include "plugin/pluginUtils.h"
67ivec4 ivec4_init(
int x,
int y,
int w,
int h){
69 ret.X = x, ret.Y = y; ret.W = w; ret.H = h;
73ivec2 ivec2_init(
int x,
int y){
81 freewrl_params_t params;
83 char myMenuStatus[MAXSTAT];
84 int multi_window_capable;
86void *display_constructor(){
87 void *v = MALLOCV(
sizeof(
struct pdisplay));
91void display_init(
struct tdisplay* t)
96 t->display_initialized = FALSE;
100 t->window_title = NULL;
102 t->shutterGlasses = 0;
103 t->prv = display_constructor();
105 ppdisplay p = (ppdisplay)t->prv;
107 t->rdr_caps = &p->rdr_caps;
118#if defined(ANGLEPROJECT) || defined(_ANDROID) || defined(QNX)
119 p->multi_window_capable = 0;
121 p->multi_window_capable = 1;
123 t->params = (
void*)&p->params;
133int fv_display_initialize()
135 struct tdisplay* d = &gglobal()->display;
137 struct tOpenCL_Utils *cl = &gglobal()->OpenCL_Utils;
142 if (d->display_initialized) {
147 if (!fwl_initialize_GL()) {
152 d->display_initialized = TRUE;
156 if (!cl->OpenCL_Initialized) {
157 printf (
"doing fwl_OpenCL_startup here in fv_display_inintialize\n");
158 fwl_OpenCL_startup(cl);
163 PRINT_GL_ERROR_IF_ANY (
"end of fv_display_initialize");
170void fv_swapbuffers(freewrl_params_t *d){
181#if defined(WINRT) || defined(_ANDROID) || defined(ANDROIDNDK) || defined(IOS)
182void fv_change_GLcontext(freewrl_params_t* d){
198void fv_change_GLcontext(freewrl_params_t* d){
203#if !defined(_ANDROID) && !defined(ANDROIDNDK) && !defined(WINRT)
204int fv_create_window_and_context(freewrl_params_t *params, freewrl_params_t *share);
232int fv_create_window_and_context(freewrl_params_t *params, freewrl_params_t *share){
233 if (!fv_create_main_window2(params,share)){
240int fv_create_window_and_context(freewrl_params_t *params, freewrl_params_t *share){
241 if (!fv_create_main_window(params)){
270void targetwindow_set_params(
int itargetwindow, freewrl_params_t* params);
271freewrl_params_t* targetwindow_get_params(
int itargetwindow);
279int fv_display_initialize_desktop(){
282 freewrl_params_t *dp;
284 ttglobal tg = gglobal();
286 p = (ppdisplay)tg->display.prv;
288 dp = (freewrl_params_t*)d->params;
289 if(dp->frontend_handles_display_thread){
295 return fv_display_initialize();
299 if(!p->multi_window_capable) nwindows = 1;
301 if(!fv_create_window_and_context(dp, NULL)){
304 d->display_initialized = fwl_initialize_GL();
305 targetwindow_set_params(0,dp);
308 freewrl_params_t *p0;
309 dp->winToEmbedInto = (
void*) - 1;
310 p0 = targetwindow_get_params(0);
311 if(!fv_create_window_and_context(dp,p0)){
314 targetwindow_set_params(1,dp);
318 freewrl_params_t *p1;
319 dp->winToEmbedInto = (
void *) - 1;
320 p1 = targetwindow_get_params(1);
321 if(!fv_create_window_and_context(dp, p1)){
324 targetwindow_set_params(2,dp);
330#if defined(TARGET_X11) || defined(TARGET_MOTIF)
334 gglobal()->display.display_initialized = d->display_initialized;
336 DEBUG_MSG(
"FreeWRL: running as a plugin: %s\n", BOOL_STR(isBrowserPlugin));
338 PRINT_GL_ERROR_IF_ANY (
"end of fv_display_initialize");
341#if !(defined(TARGET_AQUA) || defined(_MSC_VER) || defined(_ANDROID))
343 if (RUNNINGASPLUGIN) {
344#if defined(FREEWRL_PLUGIN) && (defined(TARGET_X11) || defined(TARGET_MOTIF))
348 XMapWindow(Xdpy, Xwin);
360int fwl_parse_geometry_string(
const char *geometry,
int *out_width,
int *out_height,
361 int *out_xpos,
int *out_ypos,
int *out_wnum)
363 int width, height, xpos, ypos, wnum;
366 width = height = 0; xpos = ypos = wnum = -1;
368 c = sscanf(geometry,
"%dx%d+%d+%d_%d",
369 &width, &height, &xpos, &ypos, &wnum);
371 if (out_width) *out_width = width;
372 if (out_height) *out_height = height;
373 if (out_xpos) *out_xpos = xpos;
374 if (out_ypos) *out_ypos = ypos;
375 if (out_wnum) *out_wnum = wnum;
382void fv_setScreenDim(
int wi,
int he) { fwl_setScreenDim(wi,he); }
384void fwl_setScreenDim1(
int wi,
int he,
int windex);
385void fwl_setScreenDim0(
int wi,
int he)
389 ttglobal tg = gglobal();
391 tg->display.screenWidth = wi;
392 tg->display.screenHeight = he;
397void fwl_setScreenDim(
int wi,
int he)
402 fwl_setScreenDim0(wi,he);
403 fwl_setScreenDim1(wi,he,0);
405double display_screenRatio(){
406 ttglobal tg = gglobal();
408 if (tg->display.screenHeight != 0) ratio = (double) tg->display.screenWidth/(
double) tg->display.screenHeight;
411void fwl_setClipPlane(
int height)
415 gglobal()->Mainloop.clipPlane = height;
420GLvoid resize_GL(GLsizei width, GLsizei height)
422 FW_GL_VIEWPORT( 0, 0, width, height );
423 printf(
"resize_GL\n");
426void fwl_updateScreenDim(
int wi,
int he)
428 fwl_setScreenDim(wi, he);
439 int get_GLSL_max_version();
440bool initialize_rdr_caps()
445 ppdisplay p = (ppdisplay)gglobal()->display.prv;
447#if defined(HAVE_GLEW_H) && !defined(ANGLEPROJECT)
452 if (GLEW_OK != err) {
454 ERROR_MSG(
"GLEW initialization error: %s\n", glewGetErrorString(err));
457 TRACE_MSG(
"GLEW initialization: version %s\n", glewGetString(GLEW_VERSION));
463 p->rdr_caps.renderer = (
char *) FW_GL_GETSTRING(GL_RENDERER);
464 p->rdr_caps.version = (
char *) FW_GL_GETSTRING(GL_VERSION);
465 p->rdr_caps.vendor = (
char *) FW_GL_GETSTRING(GL_VENDOR);
466 p->rdr_caps.extensions = (
char *) FW_GL_GETSTRING(GL_EXTENSIONS);
467 FW_GL_GETBOOLEANV(GL_STEREO,&(p->rdr_caps.quadBuffer));
469 ConsoleMessage(
"openGL version %s\n",p->rdr_caps.version);
470 get_GLSL_max_version();
472 if (p->rdr_caps.version)
473 p->rdr_caps.versionf = (float) atof(p->rdr_caps.version);
474 if (p->rdr_caps.versionf == 0)
476 const char *openGLPrefix =
"OpenGL ES ";
477 if (NULL != p->rdr_caps.version && strstr(p->rdr_caps.version, openGLPrefix))
479 char version[256], *versionPTR;
480 sprintf(version,
"%s", p->rdr_caps.version);
481 versionPTR = version + strlen(openGLPrefix);
482 p->rdr_caps.versionf = (float) atof(versionPTR);
485#if defined(GL_ES_VERSION_2_0) && !defined(ANGLEPROJECT)
486 if (0 == p->rdr_caps.version)
489 GLint major = 0, minor = 0;
490 #if defined(GL_MAJOR_VERSION) && defined(GL_MINOR_VERSION)
491 FW_GL_GETINTEGERV(GL_MAJOR_VERSION, &major);
492 FW_GL_GETINTEGERV(GL_MINOR_VERSION, &minor);
498 asprintf(&version,
"%d.%d", major, minor);
499 p->rdr_caps.version = version;
500 p->rdr_caps.versionf = (float) atof(p->rdr_caps.version);
506 p->rdr_caps.have_GL_VERSION_1_1 = p->rdr_caps.versionf >= 1.1f;
507 p->rdr_caps.have_GL_VERSION_1_2 = p->rdr_caps.versionf >= 1.2f;
508 p->rdr_caps.have_GL_VERSION_1_3 = p->rdr_caps.versionf >= 1.3f;
509 p->rdr_caps.have_GL_VERSION_1_4 = p->rdr_caps.versionf >= 1.4f;
510 p->rdr_caps.have_GL_VERSION_1_5 = p->rdr_caps.versionf >= 1.5f;
511 p->rdr_caps.have_GL_VERSION_2_0 = p->rdr_caps.versionf >= 2.0f;
512 p->rdr_caps.have_GL_VERSION_2_1 = p->rdr_caps.versionf >= 2.1f;
513 p->rdr_caps.have_GL_VERSION_3_0 = p->rdr_caps.versionf >= 3.0f;
519 if (p->rdr_caps.extensions){
520 p->rdr_caps.av_multitexture = (strstr(p->rdr_caps.extensions,
"GL_ARB_multitexture") != 0);
523 p->rdr_caps.av_occlusion_q = ((strstr(p->rdr_caps.extensions,
"GL_ARB_occlusion_query") != 0) ||
524 (strstr(p->rdr_caps.extensions,
"GL_EXT_occlusion_query_boolean") != 0) ||
525 p->rdr_caps.have_GL_VERSION_3_0);
529 p->rdr_caps.av_npot_texture = (strstr(p->rdr_caps.extensions,
"GL_ARB_texture_non_power_of_two") != 0);
532 p->rdr_caps.av_texture_rect = (strstr(p->rdr_caps.extensions,
"GL_ARB_texture_rectangle") != 0);
535 p->rdr_caps.av_npot_texture=FALSE;
538 p->rdr_caps.av_multitexture = 1;
540 FW_GL_GETINTEGERV(GL_MAX_TEXTURE_SIZE, &tmp);
541 p->rdr_caps.system_max_texture_size = (int) tmp;
542 ConsoleMessage(
"maximum texture size system/gpu: %d ",p->rdr_caps.system_max_texture_size);
546 if(tmp > 8192) tmp = tmp/2;
548 p->rdr_caps.runtime_max_texture_size = (int) tmp;
549 ConsoleMessage(
"runtime/freewrl: %d\n",tmp);
550 ConsoleMessage(
"processor architecture %s\n",
sizeof(
void*)>4?
"x64":
"x86");
555 #if defined (GL_MAX_TEXTURE_IMAGE_UNITS)
556 FW_GL_GETINTEGERV(GL_MAX_TEXTURE_IMAGE_UNITS, &tmp);
558 FW_GL_GETINTEGERV(GL_MAX_TEXTURE_UNITS, &tmp);
561 p->rdr_caps.texture_units = (int) tmp;
562 ConsoleMessage(
"maxiumum image texture units %d \n",p->rdr_caps.texture_units);
565#ifdef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
566 FW_GL_GETFLOATV (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &p->rdr_caps.anisotropicDegree);
571 if (gglobal()->internalc.user_request_texture_size > 0) {
572 DEBUG_MSG(
"Environment set texture size: %d", gglobal()->internalc.user_request_texture_size);
573 p->rdr_caps.runtime_max_texture_size = gglobal()->internalc.user_request_texture_size;
577 if (p->rdr_caps.renderer)
579 strstr(p->rdr_caps.renderer,
"Intel GMA 9") != NULL ||
580 strstr(p->rdr_caps.renderer,
"Intel(R) 9") != NULL ||
581 strstr(p->rdr_caps.renderer,
"i915") != NULL ||
582 strstr(p->rdr_caps.renderer,
"NVIDIA GeForce2") != NULL
584 if (p->rdr_caps.runtime_max_texture_size > 1024) p->rdr_caps.runtime_max_texture_size = 1024;
588 glGetIntegerv(GL_DEPTH_BITS, &actualbits);
589 ConsoleMessage(
"depth bits %d\n",actualbits);
592 rdr_caps_dump(&p->rdr_caps);
599void initialize_rdr_functions()
620 p = pp = STRDUP(rdr_caps->extensions);
621 while (*pp !=
'\0') {
622 if (*pp ==
' ') *pp =
'\n';
625 DEBUG_MSG (
"OpenGL extensions : %s\n", p);
630 DEBUG_MSG (
"Multitexture support: %s\n", BOOL_STR(rdr_caps->av_multitexture));
631 DEBUG_MSG (
"Occlusion support: %s\n", BOOL_STR(rdr_caps->av_occlusion_q));
632 DEBUG_MSG (
"Max texture size %d\n", rdr_caps->runtime_max_texture_size);
633 DEBUG_MSG (
"Max texture size %d\n", rdr_caps->system_max_texture_size);
634 DEBUG_MSG (
"Texture units %d\n", rdr_caps->texture_units);