#ifndef EXT_HEADER
#define EXT_HEADER
#include <windows.h>
#include <gl/gl.h>
#include <gl/glext.h>
#include <gl/wglext.h>
enum {XT_NONE = 0, XT_MULTITEX = 1, WGL_RENDERTEX = 2, WGL_PBUF = 4, WGL_PIXFORMAT = 8};
//multitex
extern PFNGLMULTITEXCOORD2DARBPROC glMultiTexCoord2d;
extern PFNGLACTIVETEXTUREARBPROC glActiveTexture;
//rendertex
extern PFNWGLBINDTEXIMAGEARBPROC wglBindTexImage;
extern PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImage;
extern PFNWGLSETPBUFFERATTRIBARBPROC wglSetPbufferAttrib;
//pbuffer
extern PFNWGLCREATEPBUFFERARBPROC wglCreatePbuffer;
extern PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDC;
extern PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDC;
extern PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbuffer;
extern PFNWGLQUERYPBUFFERARBPROC wglQueryPbuffer;
//pixel format
extern PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribiv;
extern PFNWGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfv;
extern PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormat;
struct Ext{
static GLuint rendertexture;
static HDC pbufdc;
static HGLRC pbufglrc;
static HPBUFFERARB pbuffer;
static unsigned int active;
static void InitExtensions();
static void DeInitExtensions();
private:
static void CheckRequired();
};
#endif
#include "Extensions.h"
#include "Error.h"
#include <string>
#include <windows.h>
unsigned int Ext::active;
//multitex
PFNGLMULTITEXCOORD2DARBPROC glMultiTexCoord2d;
PFNGLACTIVETEXTUREARBPROC glActiveTexture;
//rendertex
PFNWGLBINDTEXIMAGEARBPROC wglBindTexImage;
PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImage;
PFNWGLSETPBUFFERATTRIBARBPROC wglSetPbufferAttrib;
//pbuffer
PFNWGLCREATEPBUFFERARBPROC wglCreatePbuffer;
PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDC;
PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDC;
PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbuffer;
PFNWGLQUERYPBUFFERARBPROC wglQueryPbuffer;
//pixel format
PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribiv;
PFNWGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfv;
PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormat;
GLuint Ext::rendertexture;
HDC Ext::pbufdc;
HPBUFFERARB Ext::pbuffer;
HGLRC Ext::pbufglrc;
void Ext::InitExtensions(){
PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
if(wglGetExtensionsStringARB == NULL){
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringEXT");
if(wglGetExtensionsStringARB == NULL)
Error(0, "Hardware lacks wgl support.");
}
active = 0;
char* extstring = (char*)glGetString(GL_EXTENSIONS);
char* wglstring = (char*)wglGetExtensionsStringARB(wglGetCurrentDC());
//extensions
if(strstr(extstring,"ARB_multitexture ") != NULL && strstr(extstring,"GL_EXT_texture_env_combine") != NULL){ /**** not 100% accurate*/
active = active | XT_MULTITEX;
glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DARBPROC)wglGetProcAddress("glMultiTexCoord2dARB");
glActiveTexture = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB");
}//if(strstr(extstring,"ARB_multitexture ") != NULL)
//wgl extensions
if(strstr(wglstring,"WGL_ARB_render_texture ") != NULL || strstr(wglstring," WGL_ARB_render_texture") != NULL){
active = active | WGL_RENDERTEX;
wglBindTexImage = (PFNWGLBINDTEXIMAGEARBPROC)wglGetProcAddress("wglBindTexImageARB");
wglReleaseTexImage = (PFNWGLRELEASETEXIMAGEARBPROC)wglGetProcAddress("wglReleaseTexImageARB");
wglSetPbufferAttrib = (PFNWGLSETPBUFFERATTRIBARBPROC)wglGetProcAddress("wglSetPbufferAttribARB");
}
if(strstr(wglstring,"WGL_ARB_pbuffer ") != NULL || strstr(wglstring," WGL_ARB_pbuffer") != NULL){
active = active | WGL_PBUF;
wglCreatePbuffer = (PFNWGLCREATEPBUFFERARBPROC)wglGetProcAddress("wglCreatePbufferARB");
wglGetPbufferDC = (PFNWGLGETPBUFFERDCARBPROC)wglGetProcAddress("wglGetPbufferDCARB");
wglReleasePbufferDC = (PFNWGLRELEASEPBUFFERDCARBPROC)wglGetProcAddress("wglReleasePbufferDCARB");
wglDestroyPbuffer = (PFNWGLDESTROYPBUFFERARBPROC)wglGetProcAddress("wglDestroyPbufferARB");
wglQueryPbuffer = (PFNWGLQUERYPBUFFERARBPROC)wglGetProcAddress("wglQueryPbufferARB");
}
if(strstr(wglstring,"WGL_ARB_pixel_format ") != NULL || strstr(wglstring," WGL_ARB_pixel_format") != NULL){
active = active | WGL_PIXFORMAT;
wglGetPixelFormatAttribiv = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)wglGetProcAddress("wglGetPixelFormatAttribivARB");
wglGetPixelFormatAttribfv = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)wglGetProcAddress("wglGetPixelFormatAttribfvARB");
wglChoosePixelFormat = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
}
if(active & (WGL_PIXFORMAT | WGL_PBUF | WGL_RENDERTEX)){
GLuint PBufPixelFormat;
HDC hdc;
int formats[2];
UINT numforms;
glGenTextures(1, &rendertexture);
glBindTexture(GL_TEXTURE_2D, rendertexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
hdc = wglGetCurrentDC();
int attrib[] = {WGL_DRAW_TO_PBUFFER_ARB, 1, PFD_SUPPORT_OPENGL, 1, WGL_BIND_TO_TEXTURE_RGBA_ARB, 1, PFD_TYPE_RGBA, 1, 0};
if(!wglChoosePixelFormat(hdc, attrib, NULL, 2, formats, &numforms))
Error(0, "Failed to choose extended pixel format.");
PBufPixelFormat = formats[0];
int attrib2[] = {WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB, WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB, WGL_MIPMAP_TEXTURE_ARB, 1, WGL_PBUFFER_LARGEST_ARB, 1, 0};
wglCreatePbuffer(hdc, PBufPixelFormat, 640, 480, attrib2);
pbufdc = wglGetPbufferDC(pbuffer);
pbufglrc = wglCreateContext(pbufdc);
//wglQueryPbuffer(pbuffer, WGL_PBUFFER_WIDTH_ARB, width);
//wglQueryPbuffer(pbuffer, WGL_PBUFFER_HEIGHT_ARB, height);
}
delete extstring;
delete wglstring;
CheckRequired();
}//void InitExtensions()
void Ext::DeInitExtensions(){
if(active & (WGL_PIXFORMAT | WGL_PBUF | WGL_RENDERTEX)){
wglDeleteContext(pbufglrc);
wglReleasePbufferDC(pbuffer, pbufdc);
wglDestroyPbuffer(pbuffer);
}
}//void Ext::DeInitExtensions()
void Ext::CheckRequired(){
if(!(active & XT_MULTITEX))
Error(0, "Hardware lacks multitexture support.");
if(!(active & WGL_RENDERTEX))
Error(0, "Hardware lacks rendertexture support.");
if(!(active & WGL_PBUF))
Error(0, "Hardware lacks pbuffer support.");
if(!(active & WGL_PIXFORMAT))
Error(0, "Hardware lacks wgl pixel format support.");
}//void Ext::CheckRequired()
int DrawGLScene(GLvoid){
wglMakeCurrent(Ext::pbufdc, Ext::pbufglrc);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
Game::Render();
wglMakeCurrent(hDC, hRC);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D, Ext::rendertexture);
wglBindTexImage(Ext::pbuffer, WGL_FRONT_LEFT_ARB);
glColor4d(1, 1, 1, 1);
glBegin(GL_QUADS);
glTexCoord2d(0, 0);
glVertex3d(-1, -1, -1);
glTexCoord2d(0, 1);
glVertex3d(-1, 1, -1);
glTexCoord2d(1, 1);
glVertex3d(1, 1, -1);
glTexCoord2d(1, 0);
glVertex3d(1, -1, -1);
glEnd();
wglReleaseTexImage(Ext::pbuffer, WGL_FRONT_LEFT_ARB);
return TRUE;
}//int DrawGLScene(GLvoid){
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
MSG msg;
bool timertick;
/*
if(MessageBox(NULL, "Do you want to run in fullscreen mode?", "Inquiry", MB_YESNO|MB_ICONQUESTION)==IDNO)
fullscreen=FALSE;
else fullscreen=TRUE;*/
fullscreen = false;
if(!CreateGLWindow("Schmup v. 0.02", Game::width, Game::height, 16, fullscreen))
return 0;
InitProgram();
BuildFont();
while(!Game::done){
if(PeekMessage(&msg,NULL, 0, 0, PM_REMOVE)){
if(msg.message==WM_QUIT){
Game::done=TRUE;
}//if(msg.message==WM_QUIT){
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}//else{
}//if(PeekMessage(&msg,NULL, 0, 0, PM_REMOVE)){
else{
if(Game::menu.Active()){
if(lbclick){
Game::menu.Click(mpos);
}//if(leftclick[1] && !leftclick[0])
if(keys[VK_ESCAPE] && Game::gameon){
keys[VK_ESCAPE] = false;
Game::menu.Show(false);
}//if(keys[VK_ESCAPE])
DrawGLScene();
Game::menu.Render();
SwapBuffers(hDC);
}//if(Game::menuactive)
else if(Game::hangar.Active()){
if(lbclick){
Game::hangar.Click(mpos);
}//if(leftclick[1] && !leftclick[0])
if(keys[VK_ESCAPE]){
keys[VK_ESCAPE] = false;
Game::menu.Show(true);
}//if(keys[VK_ESCAPE])
DrawGLScene();
Game::hangar.Render();
SwapBuffers(hDC);
}//if(Game::menuactive)
else if(active && timertick){
Game::timer->SetTime();
timertick = false;
if(keys[VK_ESCAPE]){
keys[VK_ESCAPE] = false;
Game::menu.Show(true);
}//if(keys[VK_ESCAPE])
else{
if(keys[(int)'G']){
delete Game::world->player;
Game::world->player = new Player();
}
if(keys[(int)'A']){
Game::world->player->turnleft = true;
}
if(keys[(int)'D']){
Game::world->player->turnright = true;
}
if(keys[(int)'W']){
Game::world->player->accelerate = true;
}
if(keys[(int)'S']){
Game::world->player->decelerate = true;
}
if(keys[(int)'Q']){
Game::world->player->strafeleft = true;
}
if(keys[(int)'E']){
Game::world->player->straferight = true;
}
if(keys[VK_SPACE]){
Game::world->player->do_fire = true;
}
if(keys[VK_UP]){
Game::ZoomIn();
}
if(keys[VK_DOWN]){
Game::ZoomOut();
}
}//else{
Game::world->Tick();
DrawGLScene();
SwapBuffers(hDC);
}//if(active){
else if(Game::timer->GetTime() > 60000)
timertick = true;
lbclick = false;
}//else{
}//while(!done){
Game::DeInitGame();
KillGLWindow();
KillFont();
Ext::DeInitExtensions();
return (msg.wParam);
}//int WinAPI WinMain(...){