134 lines
3.8 KiB
C++
134 lines
3.8 KiB
C++
|
|
|
|
#ifndef OFFSCREENGL_H
|
|
#define OFFSCREENGL_H
|
|
#if defined(LINUX) || defined(MACOSX)
|
|
#include "tofflinegl.h"
|
|
#endif
|
|
|
|
class OffScreenGL
|
|
{
|
|
public:
|
|
OffScreenGL(int width, int height, int bpp, int stencilBpp = 0)
|
|
{
|
|
// ----------------------------------------------------------------------------------- //
|
|
// creo il contesto openGL //
|
|
// ----------------------------------------------------------------------------------- //
|
|
#ifdef _WIN32
|
|
initBITMAPINFO(m_info, width, height, bpp);
|
|
|
|
m_offData = 0; // a pointer to buffer
|
|
m_offHdc = // open an offscreen device
|
|
GetDC(NULL);
|
|
|
|
m_offDIB = // and a bitmap image
|
|
CreateDIBSection(m_offHdc, &m_info, DIB_RGB_COLORS, &m_offData, NULL, 0);
|
|
|
|
assert(m_offDIB);
|
|
assert(m_offData);
|
|
|
|
m_offDC = CreateCompatibleDC(m_offHdc);
|
|
|
|
m_oldobj = // select BIB to write
|
|
SelectObject(m_offDC, m_offDIB);
|
|
|
|
static PIXELFORMATDESCRIPTOR pfd =
|
|
{
|
|
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
|
|
1, // version number
|
|
0 | (false ? (0) : (PFD_DRAW_TO_BITMAP | PFD_SUPPORT_GDI)) | PFD_SUPPORT_OPENGL, // support OpenGL
|
|
PFD_TYPE_RGBA, // RGBA type
|
|
bpp, // 32-bit color depth
|
|
0, 0, 0, 0, 0, 0, // color bits ignored
|
|
bpp >> 2, // alpha buffer
|
|
0, // shift bit ignored
|
|
0, // no accumulation buffer
|
|
0, 0, 0, 0, // accum bits ignored
|
|
0, // 32-bit z-buffer
|
|
stencilBpp, // no stencil buffer
|
|
0, // no auxiliary buffer
|
|
PFD_MAIN_PLANE, // main layer
|
|
0, // reserved
|
|
0, 0, 0 // layer masks ignored
|
|
};
|
|
//std::cout << "bit depth = " << v << std::endl;
|
|
// get the best available match of pixel format for the device context
|
|
int iPixelFormat = ChoosePixelFormat(m_offDC, &pfd);
|
|
assert(iPixelFormat != 0);
|
|
|
|
// make that the pixel format of the device context
|
|
int ret = SetPixelFormat(m_offDC, iPixelFormat, &pfd);
|
|
DWORD dw = GetLastError();
|
|
assert(ret == TRUE);
|
|
|
|
// make a valid context for OpenGL rendering
|
|
m_hglRC = wglCreateContext(m_offDC);
|
|
assert(m_hglRC);
|
|
/*
|
|
ret = wglMakeCurrent( m_offDC, m_hglRC );
|
|
assert(ret == TRUE);
|
|
*/
|
|
#else
|
|
#if defined(LINUX) || defined(MACOSX)
|
|
m_offlineGL = new TOfflineGL(TDimension(width, height));
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
~OffScreenGL()
|
|
{
|
|
// ----------------------------------------------------------------------------------- //
|
|
// cancello il contesto openGL //
|
|
// ----------------------------------------------------------------------------------- //
|
|
#ifdef _WIN32
|
|
wglDeleteContext(m_hglRC);
|
|
|
|
// release object
|
|
SelectObject(m_offDC, m_oldobj);
|
|
|
|
DeleteObject(m_offDC);
|
|
DeleteObject(m_offDIB);
|
|
DeleteObject(m_offHdc);
|
|
#else
|
|
#if defined(LINUX) || defined(MACOSX)
|
|
|
|
delete m_offlineGL;
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
public:
|
|
// init a BITMAPINFO structure
|
|
#ifdef _WIN32
|
|
void initBITMAPINFO(BITMAPINFO &info, int width, int height, int bpp)
|
|
{
|
|
memset(&info, 0, sizeof(BITMAPINFOHEADER));
|
|
|
|
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
|
info.bmiHeader.biWidth = width;
|
|
info.bmiHeader.biHeight = height;
|
|
info.bmiHeader.biPlanes = 1;
|
|
info.bmiHeader.biBitCount = bpp;
|
|
info.bmiHeader.biCompression = BI_RGB;
|
|
info.bmiHeader.biSizeImage = 0;
|
|
info.bmiHeader.biXPelsPerMeter = 1000;
|
|
info.bmiHeader.biYPelsPerMeter = 1000;
|
|
info.bmiHeader.biClrUsed = 0;
|
|
info.bmiHeader.biClrImportant = 0;
|
|
}
|
|
|
|
void *m_offData;
|
|
HDC m_offHdc;
|
|
HBITMAP m_offDIB;
|
|
HDC m_offDC;
|
|
HGDIOBJ m_oldobj;
|
|
HGLRC m_hglRC;
|
|
BITMAPINFO m_info;
|
|
#else
|
|
#if defined(LINUX) || defined(MACOSX)
|
|
TOfflineGL *m_offlineGL;
|
|
#endif
|
|
#endif
|
|
};
|
|
|
|
#endif
|