00001 /* 00002 File: GLXPane.cc 00003 00004 Function: 00005 00006 Author: Andrew Willmott 00007 00008 Notes: 00009 */ 00010 00011 #include "gcl/GCLConfig.h" 00012 00013 #ifndef GCL_NO_GL 00014 00015 #include "gcl/GLXPane.h" 00016 00017 // --- GLXPane class ---------------------------------------------------------- 00018 00019 // Attributes for a normal, 24-bit, z-buffered window 00020 00021 static Int attributeList[] = 00022 { GLX_RGBA, GLX_DEPTH_SIZE, 12, GLX_RED_SIZE, 1, None }; 00023 00024 static Int dblAttributeList[] = 00025 { GLX_RGBA, GLX_DEPTH_SIZE, 12, GLX_RED_SIZE, 1, GLX_DOUBLEBUFFER, None }; 00026 00027 XVisualInfo *GLXPane::sGLXVisualInfo = 0; 00028 XVisualInfo *GLXPane::sGLXDblVisualInfo = 0; 00029 00030 GLXPane::GLXPane(Bool db) : 00031 GLRenderer(), 00032 XEventPane() 00033 { 00034 doubleBuffered = db; 00035 } 00036 00037 GLXPane::~GLXPane() 00038 { 00039 } 00040 00041 Void GLXPane::Init() 00042 // Attach GL context to a drawing environment 00043 { 00044 XVisualInfo *theVisualInfo; 00045 00046 XPane::Init(); 00047 00048 theVisualInfo = GetVisualInfo(); 00049 00050 context = glXCreateContext(xgs->display, theVisualInfo, 0, GL_TRUE); 00051 glXMakeCurrent(xgs->display, paneXID, context); 00052 00053 glWidth = width; 00054 glHeight = height; 00055 00056 GLRenderer::Init(); 00057 } 00058 00059 XVisualInfo *GLXPane::GetVisualInfo() 00060 { 00061 if (!sGLXVisualInfo) 00062 { 00063 sGLXVisualInfo = 00064 glXChooseVisual(xgs->display, DefaultScreen(xgs->display), attributeList); 00065 00066 if (!sGLXVisualInfo) 00067 _Error("Can't obtain true-colour/z-buffered display for GL"); 00068 00069 sGLXDblVisualInfo = glXChooseVisual(xgs->display, DefaultScreen(xgs->display), 00070 dblAttributeList); 00071 00072 if (!sGLXDblVisualInfo) 00073 { 00074 _Warning("Can't get double-buffered display"); 00075 00076 // If we can't grab a double-buffered display, default to 00077 // single-buffered. 00078 sGLXDblVisualInfo = sGLXVisualInfo; 00079 } 00080 } 00081 00082 if (doubleBuffered) 00083 return(sGLXDblVisualInfo); 00084 else 00085 return(sGLXVisualInfo); 00086 } 00087 00088 Void GLXPane::MakeCurrent() 00089 { 00090 if (!xgs) 00091 _Error("Tried to manipulate a non-attached GLXPane"); 00092 00093 if (!glXMakeCurrent(xgs->display, paneXID, context)) 00094 _Error("Couldn't swap graphics context"); 00095 } 00096 00097 Void GLXPane::Show() 00098 { 00099 GLRenderer::Show(); 00100 00101 if (doubleBuffered) 00102 glXSwapBuffers(xgs->display, paneXID); 00103 } 00104 00105 00106 // --- GLXOffscreenPane class ------------------------------------------------- 00107 00108 XVisualInfo *GLXOffscreenPane::sGLXVisualInfo = 0; 00109 00110 GLXOffscreenPane::GLXOffscreenPane() : 00111 XOffscreenPane(), 00112 GLRenderer() 00113 { 00114 } 00115 00116 Void GLXOffscreenPane::Init() 00117 // Attach GL context to a drawing environment 00118 { 00119 XPane::Init(); 00120 00121 pixmap = glXCreateGLXPixmap(xgs->display, sGLXVisualInfo, paneXID); 00122 context = 00123 glXCreateContext(xgs->display, sGLXVisualInfo, 0, GL_FALSE); 00124 00125 glXMakeCurrent(xgs->display, pixmap, context); 00126 00127 glWidth = width; 00128 glHeight = height; 00129 00130 GLRenderer::Init(); 00131 } 00132 00133 Void GLXOffscreenPane::MakeCurrent() 00134 { 00135 if (!xgs) 00136 _Error("Tried to manipulate a non-attached GLXOffscreenPane"); 00137 00138 if (!glXMakeCurrent(xgs->display, pixmap, context)) 00139 _Error("Couldn't swap graphics context"); 00140 } 00141 00142 XVisualInfo *GLXOffscreenPane::GetVisualInfo() 00143 { 00144 if (!sGLXVisualInfo) 00145 { 00146 sGLXVisualInfo = 00147 glXChooseVisual(xgs->display, DefaultScreen(xgs->display), attributeList); 00148 00149 if (!sGLXVisualInfo) 00150 _Error("Can't obtain true-colour/z-buffered display for GL"); 00151 } 00152 00153 return(sGLXVisualInfo); 00154 } 00155 00156 GLXOffscreenPane::~GLXOffscreenPane() 00157 { 00158 if (xgs) 00159 glXDestroyGLXPixmap(xgs->display, pixmap); 00160 } 00161 00162 #endif