wax-viewer/main.cpp
2024-02-22 19:38:30 +02:00

293 lines
6.7 KiB
C++
Raw Permalink Blame History

#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);
}
}
}