Initial commit

This commit is contained in:
aNNiMON 2024-02-22 19:38:30 +02:00
commit ec41d3430e
8 changed files with 805 additions and 0 deletions

292
main.cpp Normal file
View File

@ -0,0 +1,292 @@
#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; // Ðåæèì ðàáîòû
memset(&dmScreenSettings, 0, sizeof(DEVMODE)); // Î÷èñòêà äëÿ õðàíåíèÿ óñòàíîâîê
dmScreenSettings.dmSize = sizeof(DEVMODE); // Ðàçìåð ñòðóêòóðû Devmode
dmScreenSettings.dmPelsWidth = w; // Øèðèíà ýêðàíà
dmScreenSettings.dmPelsHeight = h; // Âûñîòà ýêðàíà
dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; // Ðåæèì Ïèêñåëà
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
SetFocus(hWnd);
while (1)
{
// Îáðàáîòêà âñåõ ñîîáùåíèé
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
return TRUE;
}
}
DrawGLScene(); // Íàðèñîâàòü ñöåíó
SwapBuffers(hDC); // Ïåðåêëþ÷èòü áóôåð ýêðàíà
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); // Åñëè ESC - âûéòè
if(keys['w']||keys['W']||keys['ö']||keys['Ö'])
{
pos.x=pos.x+cos(-camy* 0.01745329F+90);
pos.z=pos.z+sin(-camy* 0.01745329F+90);
}
if(keys['s']||keys['S']||keys['û']||keys['Û'])
{
pos.x=pos.x-cos(-camy* 0.01745329F+90);
pos.z=pos.z-sin(-camy* 0.01745329F+90);
}
if(keys['a']||keys['A']||keys['ô']||keys['Ô'])
{
pos.x=pos.x+sin(-camy* 0.01745329F+90);
pos.z=pos.z-cos(-camy* 0.01745329F+90);
}
if(keys['d']||keys['D']||keys['â']||keys['Â'])
{
pos.x=pos.x-sin(-camy* 0.01745329F+90);
pos.z=pos.z+cos(-camy* 0.01745329F+90);
}
}
}

2
prim.cpp Normal file
View File

@ -0,0 +1,2 @@
#include "prim.h"

94
prim.h Normal file
View File

@ -0,0 +1,94 @@
#pragma once
#include <string.h>
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
class Prim
{
public:
float lx,ly,lz;
float rx,ry,rz;
float sx,sy,sz;
float cx,cy,cz;
int type;
GLUquadricObj *quadObj;
Prim() {}
Prim(char* ttype)
{
if(strstr(ttype,"box")!=NULL) type=1;
else type=2;
quadObj = gluNewQuadric();
}
void draw()
{
GLfloat*c = new GLfloat[3];
c[0]=cx;
c[1]=cy;
c[2]=cz;
glMaterialfv(GL_FRONT, GL_DIFFUSE, c);
glPushMatrix();
//glLoadIdentity();
glTranslatef(lx, ly, lz);
glRotatef(rx, 1.0, 0.0, 0.0);
glRotatef(ry, 0.0, 1.0, 0.0);
glRotatef(rz, 0.0, 0.0, 1.0);
glScalef(sx,sy,sz);
if(type==1)
{
glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, 2.0);
glVertex3f(2.0, 2.0, 2.0);
glVertex3f(-2.0, 2.0, 2.0);
glVertex3f(-2.0, -2.0, 2.0);
glVertex3f(2.0, -2.0, 2.0);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, -2.0);
glVertex3f(2.0, 2.0, -2.0);
glVertex3f(2.0, -2.0, -2.0);
glVertex3f(-2.0, -2.0, -2.0);
glVertex3f(-2.0, 2.0, -2.0);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(-2.0, 0.0, 0.0);
glVertex3f(-2.0, 2.0, 2.0);
glVertex3f(-2.0, 2.0, -2.0);
glVertex3f(-2.0, -2.0, -2.0);
glVertex3f(-2.0, -2.0, 2.0);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(2.0, 0.0, 0.0);
glVertex3f(2.0, 2.0, 2.0);
glVertex3f(2.0, -2.0, 2.0);
glVertex3f(2.0, -2.0, -2.0);
glVertex3f(2.0, 2.0, -2.0);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0.0, 2.0, 0.0);
glVertex3f(-2.0, 2.0, -2.0);
glVertex3f(-2.0, 2.0, 2.0);
glVertex3f(2.0, 2.0, 2.0);
glVertex3f(2.0, 2.0, -2.0);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0.0, -2.0, 0.0);
glVertex3f(-2.0, -2.0, -2.0);
glVertex3f(2.0, -2.0, -2.0);
glVertex3f(2.0, -2.0, 2.0);
glVertex3f(-2.0, -2.0, 2.0);
glEnd();
}
else
{
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluCylinder(quadObj, 2, 2, 2, 20, 20);
}
glPopMatrix();
delete c;
}
};

50
wax.cbp Normal file
View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="wax" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin\Debug\wax" prefix_auto="1" extension_auto="1" />
<Option object_output="obj\Debug\" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin\Release\wax" prefix_auto="1" extension_auto="1" />
<Option object_output="obj\Release\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
</Compiler>
<Linker>
<Add library="opengl32" />
<Add library="glu32" />
<Add library="gdi32" />
</Linker>
<Unit filename="main.cpp" />
<Unit filename="prim.h" />
<Unit filename="waxloader.cpp" />
<Unit filename="waxloader.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>

27
wax.depend Normal file
View File

@ -0,0 +1,27 @@
# depslib dependency file v1.0
1296658495 source:c:\users\kostia\documents\codeblocks_projects\wax\prim.cpp
"prim.h"
1296660979 source:c:\users\kostia\documents\codeblocks_projects\wax\waxloader.cpp
"waxloader.h"
1296653771 c:\users\kostia\documents\codeblocks_projects\wax\waxloader.h
<stdio.h>
<stdlib.h>
<string.h>
"prim.h"
1296664967 c:\users\kostia\documents\codeblocks_projects\wax\prim.h
<string.h>
<windows.h>
<gl\gl.h>
<gl\glu.h>
1296673218 source:c:\users\kostia\documents\codeblocks_projects\wax\main.cpp
<windows.h>
<gl\gl.h>
<gl\glu.h>
"prim.h"
"waxloader.h"
<math.h>

16
wax.layout Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_layout_file>
<ActiveTarget name="Release" />
<File name="main.cpp" open="1" top="1" tabpos="1">
<Cursor position="6572" topLine="257" />
</File>
<File name="prim.h" open="1" top="0" tabpos="2">
<Cursor position="436" topLine="63" />
</File>
<File name="waxloader.cpp" open="0" top="0" tabpos="4">
<Cursor position="2038" topLine="249" />
</File>
<File name="waxloader.h" open="0" top="0" tabpos="3">
<Cursor position="109" topLine="0" />
</File>
</CodeBlocks_layout_file>

305
waxloader.cpp Normal file
View File

@ -0,0 +1,305 @@
#include "waxloader.h"
void Wax::loadconfig(char*s)
{
char *s2;
int i;
char *buf;
s=strstr(s,"root");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
bcx=atof(buf);
bcx/=255.0f;
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
bcy=atof(buf);
bcy/=255.0f;
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
bcz=atof(buf);
bcz/=255.0f;
delete buf;
s=strstr(s,"angle");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
anglex=atof(buf);
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
angley=atof(buf);
delete buf;
s=strstr(s,"radius");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
radius=atof(buf);
delete buf;
}
void Wax::loadprim(char*&s,Prim& p)
{
char *s2;
int i;
char *buf;
s=strstr(s,"object");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p=*new Prim(buf);
delete buf;
s+=i;
s=strstr(s,"location");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.lx=atof(buf);
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.ly=atof(buf);
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.lz=atof(buf);
delete buf;
s+=i;
s=strstr(s,"rotation");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.rx=atof(buf);
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.ry=atof(buf);
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.rz=atof(buf);
delete buf;
s+=i;
s=strstr(s,"scale");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.sx=atof(buf);
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.sy=atof(buf);
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.sz=atof(buf);
delete buf;
s+=i;
s=strstr(s,"color");
s=strstr(s,"\"");
s+=1;
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.cx=atof(buf);
p.cx/=255.0f;
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,","));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.cy=atof(buf);
p.cy/=255.0f;
delete buf;
s+=(i+1);
s2=s;
s2=(strstr(s2,"\""));
i=s2-s;
buf = new char[i];
for(int c=0; c<i; c++)
{
buf[c]=*(s+c);
}
p.cz=atof(buf);
p.cz/=255.0f;
delete buf;
s+=i;
}
Wax::Wax(char* path)
{
FILE* f = fopen( path, "rb" );
long len=0;
char* string;
fseek(f,0,SEEK_END);
len = ftell(f);
fclose(f);
f = fopen( path, "rb" );
string = new char[len];
fread(string,1,len,f);
fclose(f);
count=0;
char *s=string;
loadconfig(s);
while((s=strstr(s,(char*)"<object"))!=NULL)
{
count++;
*s+=strlen((char*)"<object");
}
s=string;
p=new Prim[count];
for(int i=0; i<count; i++)
{
loadprim(s,p[i]);
}
}

19
waxloader.h Normal file
View File

@ -0,0 +1,19 @@
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "prim.h"
class Wax
{
public:
Prim* p;
float bcx,bcy,bcz;
float anglex,angley;
float radius;
int count;
Wax() {}
Wax(char*path);
void loadconfig(char*s);
void loadprim(char*&s, Prim& p);
};