293 lines
6.7 KiB
C++
293 lines
6.7 KiB
C++
#include <windows.h>
|
||
#include <gl\gl.h>
|
||
#include <gl\glu.h>
|
||
#include "prim.h"
|
||
#include "waxloader.h"
|
||
#include <math.h>
|
||
|
||
class Pos
|
||
{
|
||
public:
|
||
float x,y,z;
|
||
Pos()
|
||
{
|
||
x=0;
|
||
y=0;
|
||
z=0;
|
||
}
|
||
};
|
||
|
||
|
||
|
||
static HGLRC hRC;
|
||
static HDC hDC;
|
||
|
||
BOOL keys[256];
|
||
GLsizei w,h;
|
||
Wax * wax;
|
||
GLfloat X, Z;
|
||
GLfloat HeadMovement, HeadMovAngle;
|
||
POINT mpos;
|
||
POINT ompos;
|
||
GLfloat camy,camx;
|
||
Pos pos;
|
||
|
||
GLvoid InitGL(GLsizei Width, GLsizei Height)
|
||
{
|
||
glClearColor(0, 0, 0, 0.0f);
|
||
glClearDepth(1.0);
|
||
glDepthFunc(GL_LESS);
|
||
glEnable(GL_DEPTH_TEST);
|
||
glShadeModel(GL_SMOOTH);
|
||
glMatrixMode(GL_PROJECTION);
|
||
glEnable(GL_LIGHTING);
|
||
glEnable(GL_LIGHT0);
|
||
glEnable(GL_NORMALIZE);
|
||
glLoadIdentity();
|
||
gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,1000.0f);
|
||
|
||
glMatrixMode(GL_MODELVIEW);
|
||
}
|
||
|
||
GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
|
||
{
|
||
if (Height==0)
|
||
Height=1;
|
||
|
||
glViewport(0, 0, Width, Height);
|
||
|
||
glMatrixMode(GL_PROJECTION);
|
||
glLoadIdentity();
|
||
|
||
gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,1000.0f);
|
||
glMatrixMode(GL_MODELVIEW);
|
||
}
|
||
|
||
GLvoid DrawGLScene()
|
||
{
|
||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||
glLoadIdentity();
|
||
glRotatef(-camx, 1, 0, 0);
|
||
glRotatef(-camy, 0, 1, 0);
|
||
glTranslatef(pos.x,pos.y,pos.z);
|
||
|
||
for(int i=0; i<wax->count; i++)
|
||
{
|
||
wax->p[i].draw();
|
||
}
|
||
|
||
}
|
||
|
||
LRESULT CALLBACK WndProc(
|
||
HWND hWnd,
|
||
UINT message,
|
||
WPARAM wParam,
|
||
LPARAM lParam)
|
||
{
|
||
GLuint PixelFormat;
|
||
static PIXELFORMATDESCRIPTOR pfd=
|
||
{
|
||
sizeof(PIXELFORMATDESCRIPTOR),
|
||
1,
|
||
PFD_DRAW_TO_WINDOW |
|
||
PFD_SUPPORT_OPENGL |
|
||
PFD_DOUBLEBUFFER,
|
||
PFD_TYPE_RGBA,
|
||
24,
|
||
0, 0, 0, 0, 0, 0,
|
||
0,
|
||
0,
|
||
0,
|
||
0, 0, 0, 0,
|
||
16,
|
||
0,
|
||
0,
|
||
PFD_MAIN_PLANE,
|
||
0,
|
||
0, 0, 0
|
||
};
|
||
switch (message)
|
||
{
|
||
case WM_CREATE:
|
||
ShowCursor(false);
|
||
wax=new Wax((char*)"room.wax");
|
||
hDC = GetDC(hWnd);
|
||
PixelFormat = ChoosePixelFormat(hDC, &pfd);
|
||
if (!PixelFormat)
|
||
{
|
||
MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
|
||
PostQuitMessage(0);
|
||
break;
|
||
}
|
||
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
|
||
{
|
||
MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
|
||
PostQuitMessage(0);
|
||
break;
|
||
}
|
||
hRC = wglCreateContext(hDC);
|
||
if(!hRC)
|
||
{
|
||
MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
|
||
PostQuitMessage(0);
|
||
break;
|
||
}
|
||
if(!wglMakeCurrent(hDC, hRC))
|
||
{
|
||
MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
|
||
PostQuitMessage(0);
|
||
break;
|
||
}
|
||
InitGL(w, h);
|
||
break;
|
||
|
||
case WM_DESTROY:
|
||
case WM_CLOSE:
|
||
ChangeDisplaySettings(NULL, 0);
|
||
|
||
wglMakeCurrent(hDC,NULL);
|
||
wglDeleteContext(hRC);
|
||
ReleaseDC(hWnd,hDC);
|
||
|
||
PostQuitMessage(0);
|
||
break;
|
||
|
||
case WM_KEYDOWN:
|
||
keys[wParam] = TRUE;
|
||
break;
|
||
|
||
case WM_KEYUP:
|
||
keys[wParam] = FALSE;
|
||
break;
|
||
|
||
case WM_SIZE:
|
||
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
|
||
break;
|
||
|
||
default:
|
||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||
}
|
||
return (0);
|
||
}
|
||
|
||
int WINAPI WinMain(
|
||
HINSTANCE hInstance,
|
||
HINSTANCE hPrevInstance,
|
||
LPSTR lpCmdLine,
|
||
int nCmdShow)
|
||
{
|
||
MSG msg;
|
||
WNDCLASS wc;
|
||
HWND hWnd;
|
||
|
||
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
||
wc.lpfnWndProc = (WNDPROC) WndProc;
|
||
wc.cbClsExtra = 0;
|
||
wc.cbWndExtra = 0;
|
||
wc.hInstance = hInstance;
|
||
wc.hIcon = NULL;
|
||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||
wc.hbrBackground = NULL;
|
||
wc.lpszMenuName = NULL;
|
||
wc.lpszClassName = "OpenGL WinClass";
|
||
|
||
if(!RegisterClass(&wc))
|
||
{
|
||
MessageBox(0,"Failed To Register The Window Class.","Error",MB_OK|MB_ICONERROR);
|
||
return FALSE;
|
||
}
|
||
w=GetSystemMetrics(SM_CXSCREEN);
|
||
h=GetSystemMetrics(SM_CYSCREEN);
|
||
hWnd = CreateWindow(
|
||
"OpenGL WinClass",
|
||
"Wax",
|
||
|
||
WS_POPUP |
|
||
WS_CLIPCHILDREN |
|
||
WS_CLIPSIBLINGS,
|
||
|
||
0, 0,
|
||
w, h,
|
||
|
||
NULL,
|
||
NULL,
|
||
hInstance,
|
||
NULL);
|
||
|
||
if(!hWnd)
|
||
{
|
||
MessageBox(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR);
|
||
return FALSE;
|
||
}
|
||
|
||
DEVMODE dmScreenSettings; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
memset(&dmScreenSettings, 0, sizeof(DEVMODE)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
dmScreenSettings.dmSize = sizeof(DEVMODE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Devmode
|
||
dmScreenSettings.dmPelsWidth = w; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
dmScreenSettings.dmPelsHeight = h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
|
||
|
||
ShowWindow(hWnd, SW_SHOW);
|
||
UpdateWindow(hWnd);
|
||
SetFocus(hWnd);
|
||
|
||
while (1)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
|
||
{
|
||
if (GetMessage(&msg, NULL, 0, 0))
|
||
{
|
||
TranslateMessage(&msg);
|
||
DispatchMessage(&msg);
|
||
}
|
||
else
|
||
{
|
||
return TRUE;
|
||
}
|
||
}
|
||
DrawGLScene(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||
SwapBuffers(hDC); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
GetCursorPos(&mpos);
|
||
camy=camy-(mpos.x-ompos.x)/2;
|
||
camx=camx-(mpos.y-ompos.y)/2;
|
||
if(camx>90) camx=90;
|
||
if(camx<-90) camx=-90;
|
||
ompos=mpos;
|
||
|
||
if(mpos.x>w-20)
|
||
{
|
||
ompos.x=20;
|
||
SetCursorPos(20,mpos.y);
|
||
}
|
||
if(mpos.x<20)
|
||
{
|
||
ompos.x=w-20;
|
||
SetCursorPos(w-20,mpos.y);
|
||
}
|
||
if (keys[VK_ESCAPE]) SendMessage(hWnd,WM_CLOSE,0,0); // <20><><EFBFBD><EFBFBD> ESC - <20><><EFBFBD><EFBFBD><EFBFBD>
|
||
if(keys['w']||keys['W']||keys['<EFBFBD>']||keys['<EFBFBD>'])
|
||
{
|
||
pos.x=pos.x+cos(-camy* 0.01745329F+90);
|
||
pos.z=pos.z+sin(-camy* 0.01745329F+90);
|
||
}
|
||
if(keys['s']||keys['S']||keys['<EFBFBD>']||keys['<EFBFBD>'])
|
||
{
|
||
pos.x=pos.x-cos(-camy* 0.01745329F+90);
|
||
pos.z=pos.z-sin(-camy* 0.01745329F+90);
|
||
}
|
||
if(keys['a']||keys['A']||keys['<EFBFBD>']||keys['<EFBFBD>'])
|
||
{
|
||
pos.x=pos.x+sin(-camy* 0.01745329F+90);
|
||
pos.z=pos.z-cos(-camy* 0.01745329F+90);
|
||
}
|
||
if(keys['d']||keys['D']||keys['<EFBFBD>']||keys['<EFBFBD>'])
|
||
{
|
||
pos.x=pos.x-sin(-camy* 0.01745329F+90);
|
||
pos.z=pos.z+cos(-camy* 0.01745329F+90);
|
||
}
|
||
}
|
||
}
|