|
From: Brenda L. <asp...@us...> - 2003-05-13 22:27:14
|
Update of /cvsroot/squeak/squeak/platforms/unix/plugins/B3DAcceleratorPlugin
In directory sc8-pr-cvs1:/tmp/cvs-serv21322/B3DAcceleratorPlugin
Modified Files:
acinclude.m4 sqUnixOpenGL.c sqUnixOpenGL.h
Added Files:
Makefile.inc
Log Message:
Ian Piumarta's release 3.5-1devel
--- NEW FILE: Makefile.inc ---
XCFLAGS=$(WFLAGS) $(X_CFLAGS) $(X_INCLUDES)
Index: acinclude.m4
===================================================================
RCS file: /cvsroot/squeak/squeak/platforms/unix/plugins/B3DAcceleratorPlugin/acinclude.m4,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** acinclude.m4 12 May 2003 07:26:18 -0000 1.1
--- acinclude.m4 13 May 2003 22:27:09 -0000 1.2
***************
*** 1,14 ****
! # Require OpenGL
! # (Note: some broken distribs [mandrake] require explicit -lpthread)
!
! AC_CHECK_LIB(GL,glIsEnabled,
! [AC_PLUGIN_USE_LIB(GL)],
! [unset ac_cv_lib_GL_glIsEnabled # stupid moronic pathetic autoconf
! AC_CHECK_LIB(GL,glIsEnabled,
! [AC_PLUGIN_USE_LIB(GL)],
! [unset ac_cv_lib_GL_glIsEnabled # stupid moronic pathetic autoconf
! AC_CHECK_LIB(GL,glIsEnabled,
! [AC_PLUGIN_USE_LIB(GL)
! AC_PLUGIN_USE_LIB(pthread)],
! [AC_PLUGIN_DISABLE],
! [-lpthread])])])
--- 1,3 ----
! if test "${have_gl}" != "yes"; then
! AC_PLUGIN_DISABLE
! fi
Index: sqUnixOpenGL.c
===================================================================
RCS file: /cvsroot/squeak/squeak/platforms/unix/plugins/B3DAcceleratorPlugin/sqUnixOpenGL.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** sqUnixOpenGL.c 12 May 2003 07:39:02 -0000 1.2
--- sqUnixOpenGL.c 13 May 2003 22:27:09 -0000 1.3
***************
*** 1,81 ****
/* sqUnixOpenGL.c -- support for accelerated 3D rendering
! *
* Author: Bert Freudenberg <be...@is...>
*
! * Based on Andreas Raab's sqWin32OpenGL.c
*
! * Last edited: Mon 11 Nov 2002 15:43:31 by bert on balloon
! *
! * History
! * Nov 02: added TGraphicsTest conformant log support
! * Oct 02: added Tea initialization support w/ stencil
! * May 01: initial revision
*/
! #include <sys/types.h>
! #include "sqVirtualMachine.h"
! #include "sqConfig.h"
! #include "sqPlatformSpecific.h"
#include "B3DAcceleratorPlugin.h"
- #if defined (B3DX_GL)
-
- #include <GL/gl.h>
- #include <GL/glx.h>
- #include <X11/X.h>
#include <stdio.h>
- #include "sqOpenGLRenderer.h"
-
- /* Plugin refs */
extern struct VirtualMachine *interpreterProxy;
! static void printVisual(XVisualInfo* visinfo);
! static void listVisuals();
! static Display *stDisplay= NULL; /* Squeak's display */
! static Window stWindow= 0; /* Squeak's main window */
! static glRenderer *current= NULL;
! static glRenderer allRenderer[MAX_RENDERER];
! static int visualAttributes[]= {
! GLX_STENCIL_SIZE, 0, /* filled in later - must be first item! */
! GLX_ALPHA_SIZE, 1, /* filled in later - must be second item! */
! GLX_RGBA, /* no indexed colors */
! GLX_DOUBLEBUFFER, /* will swap */
! GLX_LEVEL, 0, /* frame buffer, not overlay */
! GLX_DEPTH_SIZE, 16, /* decent depth */
! GLX_AUX_BUFFERS, 0, /* no aux buffers */
! GLX_ACCUM_RED_SIZE, 0, /* no accumulation */
! GLX_ACCUM_GREEN_SIZE, 0,
! GLX_ACCUM_BLUE_SIZE, 0,
! GLX_ACCUM_ALPHA_SIZE, 0,
! None
! };
- static float blackLight[4]= { 0.0f, 0.0f, 0.0f, 0.0f };
! /* Verbose level for debugging purposes:
! 0 - print NO information ever
! 1 - print critical debug errors
! 2 - print debug warnings
! 3 - print extra information
! 4 - print extra warnings
! 5 - print information about primitive execution
! 10 - print information about each vertex and face
! */
! int verboseLevel= 1;
- /*** create / destroy a renderer ***/
int glCreateRendererFlags(int x, int y, int w, int h, int flags)
{
! glRenderer *renderer;
! XVisualInfo* visinfo= 0;
! int index= -1;
if (flags & ~(B3D_HARDWARE_RENDERER | B3D_SOFTWARE_RENDERER | B3D_STENCIL_BUFFER))
--- 1,115 ----
/* sqUnixOpenGL.c -- support for accelerated 3D rendering
! *
* Author: Bert Freudenberg <be...@is...>
+ *
+ * Modified to work with both GLX and Quartz by: Ian...@IN...
*
! * Copyright (C) 1996-2002 Ian Piumarta and other authors/contributors
! * as listed elsewhere in this file.
! * All rights reserved.
! *
! * You are NOT ALLOWED to distribute modified versions of this file
! * under its original name. If you want to modify it and then make
! * your modifications available publicly, rename the file first.
*
! * This file is part of Unix Squeak.
! *
! * This file 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.
! *
! * You may use and/or distribute this file ONLY as part of Squeak, under
! * the terms of the Squeak License as described in `LICENSE' in the base of
! * this distribution, subject to the following additional restrictions:
! *
! * 1. The origin of this software must not be misrepresented; you must not
! * claim that you wrote the original software. If you use this software
! * in a product, an acknowledgment to the original author(s) (and any
! * other contributors mentioned herein) in the product documentation
! * would be appreciated but is not required.
! *
! * 2. You must not distribute (or make publicly available by any
! * means) a modified copy of this file unless you first rename it.
! *
! * 3. This notice must not be removed or altered in any source distribution.
! *
! * Using (or modifying this file for use) in any context other than Squeak
! * changes these copyright conditions. Read the file `COPYING' in the
! * directory `platforms/unix/doc' before proceeding with any such use.
! *
! * Last edited: 2003-02-03 18:52:50 by piumarta on emilia.local.
! *
! * Note: the os-specific parts (ioGL* functions) are defined in
! * sqUnixX11.c (for X11/GLX on Unix) and
! * sqUnixQuartz.m (for Quartz/CoreGL on MacOSX).
*/
! #include "sq.h"
#include "B3DAcceleratorPlugin.h"
+ #include "sqOpenGLRenderer.h"
+ #include "SqDisplay.h"
#include <stdio.h>
+ #include <sys/types.h>
extern struct VirtualMachine *interpreterProxy;
+ static struct SqDisplay *dpy= 0;
! static glRenderer *current= 0;
! static glRenderer renderers[MAX_RENDERER];
! static float blackLight[4]= { 0.0f, 0.0f, 0.0f, 0.0f };
!
! int glInitialize(void)
! {
! int i;
! for (i= 0; i < MAX_RENDERER; ++i)
! renderers[i].used= 0;
! if (!(dpy= ioGetDisplayModule()))
! return 0;
! dpy->ioGLinitialise();
! return 1;
! }
! int glShutdown(void)
! {
! int i;
! for (i= 0; i < MAX_RENDERER; ++i)
! if (renderers[i].used)
! glDestroyRenderer(i);
! dpy= 0;
! return 1;
! }
! int glMakeCurrentRenderer(glRenderer *renderer)
! {
! if (current == renderer)
! return 1;
! if (renderer)
! {
! if (!renderer->used)
! return 0;
! if (!dpy->ioGLmakeCurrentRenderer(renderer))
! {
! DPRINTF(1, (fp, "glMakeCurrentRenderer failed\n"));
! return 0;
! }
! }
! else
! dpy->ioGLmakeCurrentRenderer(0);
+ current= renderer;
+ return 1;
+ }
int glCreateRendererFlags(int x, int y, int w, int h, int flags)
{
! glRenderer *renderer= 0;
! int index;
if (flags & ~(B3D_HARDWARE_RENDERER | B3D_SOFTWARE_RENDERER | B3D_STENCIL_BUFFER))
***************
*** 85,327 ****
}
! if (flags & B3D_STENCIL_BUFFER)
! visualAttributes[1]= 1;
! else
! visualAttributes[1]= 0;
!
! /* find unused renderer */
! {
! int i;
! for (i= 0; i < MAX_RENDERER; i++)
! {
! if (!allRenderer[i].used)
! {
! index= i;
! break;
! }
! }
! }
! if (index == -1)
{
DPRINTF(1, (fp, "ERROR: Maximum number of renderers (%d) exceeded\r", MAX_RENDERER));
! return 0;
}
!
! renderer= &allRenderer[index];
! renderer->used= True;
! renderer->window= 0;
! renderer->context= NULL;
!
DPRINTF(3, (fp, "---- Creating new renderer ----\r\r"));
! /* sanity checks */
!
! if (w < 0 || h < 0)
{
DPRINTF(1, (fp, "Negative extent (%i@%i)!\r", w, h));
! goto FAILED;
}
!
! /* choose visual and create context */
!
! if (verboseLevel >= 3)
! listVisuals();
!
! {
! visinfo= glXChooseVisual(stDisplay,
! DefaultScreen(stDisplay),
! visualAttributes);
!
! if (!visinfo)
! {
! /* retry without alpha */
! visualAttributes[3]= 0;
! visinfo= glXChooseVisual(stDisplay,
! DefaultScreen(stDisplay),
! visualAttributes);
! }
!
! if (!visinfo)
{
! DPRINTF(1, (fp, "No OpenGL visual found!\r"));
! goto FAILED;
! }
!
! DPRINTF(3, (fp, "\r#### Selected GLX visual ID 0x%lx ####\r",
! visinfo->visualid));
! if (verboseLevel >= 3)
! printVisual(visinfo);
!
! renderer->context= glXCreateContext(stDisplay, visinfo, 0, GL_TRUE);
! if (!renderer->context)
! {
! DPRINTF(1, (fp, "Creating GLX context failed!\r"));
! goto FAILED;
}
! DPRINTF(3, (fp, "\r#### Created GLX context ####\r" ));
!
! /* create window */
! {
! XSetWindowAttributes attributes;
! unsigned long valuemask= 0;
!
! attributes.colormap= XCreateColormap(stDisplay,
! DefaultRootWindow(stDisplay),
! visinfo->visual,
! AllocNone);
! valuemask|= CWColormap;
!
! attributes.background_pixel= BlackPixel(stDisplay, DefaultScreen(stDisplay));
! valuemask|= CWBackPixel;
!
! renderer->window= XCreateWindow(stDisplay, stWindow, x, y, w, h, 0,
! visinfo->depth, InputOutput, visinfo->visual,
! valuemask, &attributes);
! if (!renderer->window)
! {
! DPRINTF(1, (fp, "Failed to create client window\r"));
! goto FAILED;
! }
!
! XMapWindow(stDisplay, renderer->window);
!
! }
!
! DPRINTF(3, (fp, "\r#### Created window ####\r" ));
!
! XFree(visinfo);
! visinfo= 0;
! }
!
! /* Make the context current */
! if (!glXMakeCurrent(stDisplay, renderer->window, renderer->context))
! {
! DPRINTF(1, (fp, "Failed to make context current\r"));
! goto FAILED;
! }
!
! renderer->bufferRect[0]= x;
! renderer->bufferRect[1]= y;
! renderer->bufferRect[2]= w;
! renderer->bufferRect[3]= h;
!
! DPRINTF(3, (fp, "\r### Renderer created! ###\r"));
!
! /* setup user context */
! glDisable(GL_LIGHTING);
! glDisable(GL_COLOR_MATERIAL);
! glDisable(GL_BLEND);
! glDisable(GL_ALPHA_TEST);
! glEnable(GL_DITHER);
! glEnable(GL_DEPTH_TEST);
! glEnable(GL_NORMALIZE);
! glDepthFunc(GL_LEQUAL);
! glClearDepth(1.0);
! glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
! glShadeModel(GL_SMOOTH);
! glLightModelfv(GL_LIGHT_MODEL_AMBIENT, blackLight);
! ERROR_CHECK;
! return index;
!
! FAILED:
! /* do necessary cleanup */
DPRINTF(1, (fp, "OpenGL initialization failed\r"));
-
- if (visinfo)
- XFree(visinfo);
- if (renderer->context)
- glXDestroyContext(stDisplay, renderer->context);
- if (renderer->window)
- XDestroyWindow(stDisplay, renderer->window);
-
return -1;
}
- int glDestroyRenderer(int handle)
- {
- glRenderer *renderer= glRendererFromHandle(handle);
-
- DPRINTF(3, (fp, "\r--- Destroying renderer ---\r"));
-
- if (!renderer)
- return 1; /* already destroyed */
-
- if (!glMakeCurrentRenderer(NULL))
- return 0;
-
- glXDestroyContext(stDisplay, renderer->context);
- XDestroyWindow(stDisplay, renderer->window);
-
- renderer->window= 0;
- renderer->context= NULL;
- renderer->used= False;
-
- return 1;
- }
-
-
-
- /*** helpers ***/
-
-
glRenderer *glRendererFromHandle(int handle)
{
DPRINTF(7, (fp, "Looking for renderer id: %i\r", handle));
!
! if (handle < 0 || handle >= MAX_RENDERER)
! return NULL;
!
! if (allRenderer[handle].used)
! return allRenderer+handle;
!
! return NULL;
}
! int glIsOverlayRenderer(int handle)
{
! /* we always use overlay renderers */
return 1;
}
! int glSwapBuffers(glRenderer *renderer)
{
- if (!renderer || !renderer->used)
- return 0;
-
- glXSwapBuffers(stDisplay, renderer->window);
-
return 1;
}
! int glMakeCurrentRenderer(glRenderer *renderer)
{
! if (current == renderer)
! return 1;
!
! if (renderer && !renderer->used)
! return 0;
!
! if (renderer)
! {
! if (!glXMakeCurrent(stDisplay, renderer->window, renderer->context))
! {
! DPRINTF(1, (fp, "Failed to make context current\r"));
! return 0;
! }
! }
! else
! {
! glXMakeCurrent(stDisplay, 0, NULL);
! }
!
! current= renderer;
return 1;
}
--- 119,217 ----
}
! for (index= 0; index < MAX_RENDERER; ++index)
! if (!renderers[index].used)
! break;
! if (index == MAX_RENDERER)
{
DPRINTF(1, (fp, "ERROR: Maximum number of renderers (%d) exceeded\r", MAX_RENDERER));
! return -1;
}
! renderer= renderers + index;
! renderer->drawable= 0;
! renderer->context= 0;
!
DPRINTF(3, (fp, "---- Creating new renderer ----\r\r"));
! if ((w < 0) || (h < 0))
{
DPRINTF(1, (fp, "Negative extent (%i@%i)!\r", w, h));
! goto fail;
}
! else
! if (dpy->ioGLcreateRenderer(renderer, x, y, w, h, flags))
{
! renderer->used = 1;
! renderer->bufferRect[0] = x;
! renderer->bufferRect[1] = y;
! renderer->bufferRect[2] = w;
! renderer->bufferRect[3] = h;
! if (!glMakeCurrentRenderer(renderer))
! {
! DPRINTF(1, (fp, "Failed to make context current\r"));
! glDestroyRenderer(index);
! return -1;
! }
! DPRINTF(3, (fp, "\r### Renderer created! ###\r"));
! glDisable(GL_LIGHTING);
! glDisable(GL_COLOR_MATERIAL);
! glDisable(GL_BLEND);
! glDisable(GL_ALPHA_TEST);
! glEnable(GL_DITHER);
! glEnable(GL_DEPTH_TEST);
! glEnable(GL_NORMALIZE);
! glDepthFunc(GL_LEQUAL);
! glClearDepth(1.0);
! glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
! glShadeModel(GL_SMOOTH);
! glLightModelfv(GL_LIGHT_MODEL_AMBIENT, blackLight);
! glErrorCheck();
! return index;
}
! fail:
DPRINTF(1, (fp, "OpenGL initialization failed\r"));
return -1;
}
glRenderer *glRendererFromHandle(int handle)
{
DPRINTF(7, (fp, "Looking for renderer id: %i\r", handle));
! if ((handle >= 0) && (handle < MAX_RENDERER) && renderers[handle].used)
! return renderers + handle;
! return 0;
}
! int glDestroyRenderer(int handle)
{
! glRenderer *renderer= glRendererFromHandle(handle);
! DPRINTF(3, (fp, "\r--- Destroying renderer ---\r"));
! if (renderer)
! {
! if (!glMakeCurrentRenderer(0))
! return 0;
! dpy->ioGLdestroyRenderer(renderer);
! renderer->drawable = 0;
! renderer->context = 0;
! renderer->used = 0;
! }
return 1;
}
! int glIsOverlayRenderer(int handle)
{
return 1;
}
! int glSwapBuffers(glRenderer *renderer)
{
! if (renderer && renderer->used)
! dpy->ioGLswapBuffers(renderer);
return 1;
}
***************
*** 332,354 ****
glRenderer *renderer= glRendererFromHandle(handle);
! if (!renderer || !glMakeCurrentRenderer(renderer))
! return 0;
!
! if (w < 1 || h < 1)
! return 0;
!
!
! XMoveResizeWindow(stDisplay, renderer->window,
! x, y, w, h);
!
! renderer->bufferRect[0]= x;
! renderer->bufferRect[1]= y;
! renderer->bufferRect[2]= w;
! renderer->bufferRect[3]= h;
!
! return 1;
}
int glSetVerboseLevel(int level)
{
--- 222,248 ----
glRenderer *renderer= glRendererFromHandle(handle);
! if (renderer && glMakeCurrentRenderer(renderer) && (w > 0) && (h > 0))
! {
! renderer->bufferRect[0]= x;
! renderer->bufferRect[1]= y;
! renderer->bufferRect[2]= w;
! renderer->bufferRect[3]= h;
! dpy->ioGLsetBufferRect(renderer, x, y, w, h);
! return 1;
! }
! return 0;
}
+ /* Verbose level for debugging purposes:
+ 0 - print NO information ever
+ 1 - print critical debug errors
+ 2 - print debug warnings
+ 3 - print extra information
+ 4 - print extra warnings
+ 5 - print information about primitive execution
+ ...
+ 10 - print information about each vertex and face
+ */
int glSetVerboseLevel(int level)
{
***************
*** 362,527 ****
GLint v;
glRenderer *renderer= glRendererFromHandle(handle);
- if (!renderer || !glMakeCurrentRenderer(renderer))
- return 0;
! switch(prop) {
! case 1: /* backface culling */
! if (!glIsEnabled(GL_CULL_FACE)) return 0;
! glGetIntegerv(GL_FRONT_FACE, &v);
! if (v == GL_CW) return 1;
! if (v == GL_CCW) return -1;
! return 0;
! case 2: /* polygon mode */
! glGetIntegerv(GL_POLYGON_MODE, &v);
! ERROR_CHECK;
! return v;
! case 3: /* point size */
! glGetIntegerv(GL_POINT_SIZE, &v);
! ERROR_CHECK;
! return v;
! case 4: /* line width */
! glGetIntegerv(GL_LINE_WIDTH, &v);
! ERROR_CHECK;
! return v;
! }
! return 0;
! }
! int glSetIntPropertyOS(int handle, int prop, int value)
! {
! glRenderer *renderer= glRendererFromHandle(handle);
! if (!renderer || !glMakeCurrentRenderer(renderer))
! return 0;
! switch(prop) {
! case 1: /* backface culling */
! if (!value) {
! glDisable(GL_CULL_FACE);
! ERROR_CHECK;
! return 1;
! }
! glEnable(GL_CULL_FACE);
! glFrontFace(value == 1 ? GL_CCW : GL_CW);
! ERROR_CHECK;
! return 1;
! case 2: /* polygon mode */
! if (value == 0) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
! else if (value == 1) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
! else if (value == 2) glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
! else return 0;
! ERROR_CHECK;
! return 1;
! case 3: /* point size */
! glPointSize(value);
! ERROR_CHECK;
! return 1;
! case 4: /* line width */
! glLineWidth(value);
! ERROR_CHECK;
! return 1;
! }
return 0;
}
! /* GLX_CONFIG_CAVEAT might not be supported */
! /* but the test below is worded so it does not matter */
! #ifndef GLX_CONFIG_CAVEAT
! # define GLX_CONFIG_CAVEAT 0x20
! # define GLX_SLOW_CONFIG 0x8001
! #endif
!
! static void printVisual(XVisualInfo* visinfo)
! {
! int isOpenGL;
! glXGetConfig(stDisplay, visinfo, GLX_USE_GL, &isOpenGL);
! if (isOpenGL)
! {
! int slow= 0;
! int red, green, blue, alpha, stencil, depth;
! glXGetConfig(stDisplay, visinfo, GLX_CONFIG_CAVEAT, &slow);
! glXGetConfig(stDisplay, visinfo, GLX_RED_SIZE, &red);
! glXGetConfig(stDisplay, visinfo, GLX_GREEN_SIZE, &green);
! glXGetConfig(stDisplay, visinfo, GLX_BLUE_SIZE, &blue);
! glXGetConfig(stDisplay, visinfo, GLX_ALPHA_SIZE, &alpha);
! glXGetConfig(stDisplay, visinfo, GLX_STENCIL_SIZE, &stencil);
! glXGetConfig(stDisplay, visinfo, GLX_DEPTH_SIZE, &depth);
!
! if (slow != GLX_SLOW_CONFIG)
! DPRINTF(3, (fp,"===> OpenGL visual\r"))
! else
! DPRINTF(3, (fp,"---> slow OpenGL visual\r"));
!
! DPRINTF(3, (fp,"rgbaBits = %i+%i+%i+%i\r", red, green, blue, alpha));
! DPRINTF(3, (fp,"stencilBits = %i\r", stencil));
! DPRINTF(3, (fp,"depthBits = %i\r", depth));
! }
! }
!
! static void listVisuals()
! {
! XVisualInfo* visinfo;
! int nvisuals, i;
!
! visinfo= XGetVisualInfo(stDisplay, VisualNoMask, NULL, &nvisuals);
!
! for (i= 0; i < nvisuals; i++)
! {
! DPRINTF(3, (fp,"#### Checking pixel format (visual ID 0x%lx)\r", visinfo[i].visualid));
! printVisual(&visinfo[i]);
! }
! XFree(visinfo);
! }
!
!
! /*** Module initializers ***/
!
!
!
! int glInitialize(void)
{
! int i, p;
! int fn;
!
! fn= interpreterProxy->ioLoadFunctionFrom("ioGetDisplay", NULL);
! stDisplay= (fn ? ((Display *(*)(void))fn)() : 0);
! if (!stDisplay)
! {
! DPRINTF(1,(fp,"ERROR: Failed to look up stDisplay\r"));
! return 0;
! }
!
! fn= interpreterProxy->ioLoadFunctionFrom("ioGetWindow", NULL);
! stWindow= (fn ? ((Window (*)(void))fn)() : 0);
! if (!stWindow)
! {
! DPRINTF(1,(fp,"ERROR: Failed to look up stWindow\r"));
! return 0;
! }
!
! for (i= 0; i < MAX_RENDERER; i++)
! {
! allRenderer[i].used= False;
! }
!
! return 1;
! }
! int glShutdown(void)
! {
! int i;
! for (i=0; i< MAX_RENDERER; i++)
! {
! if (allRenderer[i].used)
! {
! glDestroyRenderer(i);
! }
! }
! return 1;
}
-
- #endif /* defined(B3DX_GL) */
--- 256,332 ----
GLint v;
glRenderer *renderer= glRendererFromHandle(handle);
! if (renderer && glMakeCurrentRenderer(renderer))
! switch (prop)
! {
! case 1: /* backface culling */
! if (!glIsEnabled(GL_CULL_FACE))
! return 0;
! glGetIntegerv(GL_FRONT_FACE, &v);
! switch (v)
! {
! case GL_CW: return 1;
! case GL_CCW: return -1;
! }
! break;
+ case 2: /* polygon mode */
+ glGetIntegerv(GL_POLYGON_MODE, &v);
+ glErrorCheck();
+ return v;
! case 3: /* point size */
! glGetIntegerv(GL_POINT_SIZE, &v);
! glErrorCheck();
! return v;
! case 4: /* line width */
! glGetIntegerv(GL_LINE_WIDTH, &v);
! glErrorCheck();
! return v;
! }
return 0;
}
! int glSetIntPropertyOS(int handle, int prop, int value)
{
! glRenderer *renderer= glRendererFromHandle(handle);
+ if (renderer && glMakeCurrentRenderer(renderer))
+ switch (prop)
+ {
+ case 1: /* backface culling */
+ if (!value)
+ glDisable(GL_CULL_FACE);
+ else
+ {
+ glEnable(GL_CULL_FACE);
+ glFrontFace((value == 1) ? GL_CCW : GL_CW);
+ }
+ glErrorCheck();
+ return 1;
! case 2: /* polygon mode */
! switch (value)
! {
! case 0: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break;
! case 1: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); break;
! case 2: glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); break;
! default: return 0;
! }
! glErrorCheck();
! return 1;
! case 3: /* point size */
! glPointSize(value);
! glErrorCheck();
! return 1;
! case 4: /* line width */
! glLineWidth(value);
! glErrorCheck();
! return 1;
! }
! return 0;
}
Index: sqUnixOpenGL.h
===================================================================
RCS file: /cvsroot/squeak/squeak/platforms/unix/plugins/B3DAcceleratorPlugin/sqUnixOpenGL.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** sqUnixOpenGL.h 28 May 2002 20:16:54 -0000 1.1
--- sqUnixOpenGL.h 13 May 2003 22:27:09 -0000 1.2
***************
*** 1,17 ****
! #ifndef SQ_UNIX_OPENGL_H
! #define SQ_UNIX_OPENGL_H
!
! #define MAX_RENDERER 16
! typedef struct glRenderer {
! GLint bufferRect[4];
! GLint viewport[4];
! Bool used;
! Window window;
! GLXContext context;
} glRenderer;
! #define GL_RENDERER_DEFINED 1
! #endif /* SQ_UNIX_OPENGL_H */
--- 1,38 ----
! #ifndef __sqUnixOpenGL_h
! #define __sqUnixOpenGL_h
! #include "config.h"
! typedef struct glRenderer
! {
! int bufferRect[4];
! int viewport[4];
! int used;
! void *drawable;
! void *context;
} glRenderer;
! #define GL_RENDERER_DEFINED 1
! #define MAX_RENDERER 16
! #if defined(HAVE_GL_GL_H)
! # include <GL/gl.h>
! #else
! # if defined(HAVE_OPENGL_GL_H)
! # include <OpenGL/gl.h>
! # else
! # error *** cannot find gl.h
! # endif
! #endif
!
! extern int ioGLinitialise(void);
! extern int ioGLcreateRenderer(glRenderer *r, int x, int y, int w, int h, int flags);
! extern void ioGLdestroyRenderer(glRenderer *r);
! extern int ioGLmakeCurrentRenderer(glRenderer *r);
! extern void ioGLswapBuffers(glRenderer *r);
! extern void ioGLsetBufferRect(glRenderer *r, int x, int y, int w, int h);
!
! #define glErrorCheck() ERROR_CHECK
!
!
! #endif /* __sqUnixOpenGL_h */
|