#pragma once
#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