📄 showcanvas.cpp
字号:
//#define USE_PALETTIZED_TEXTURE
// disable the conversion from 'double ' to 'long ', possible loss of data
// disable the conversion from 'double ' to 'float', possible loss of data
#pragma warning( disable : 4244 )
//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_
#include "header.h"
//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_
#define ANGLEROTATION 512
#define LEFTSHIFTBIT 1
#define RIGHTSHIFTBIT 2
#define SHIFTBIT 3
#define SCREENWIDTH 640 //320 //640
#define SCREENHEIGHT 480 //200 //480
#define SCREENDEPTH 16
//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_
#include "..\..\..\Canvas\canvas.h"
GLvertex canvasVertex[] = {
{ -25.000001f, -88.888894f, -25.000001f },
{ -25.000001f, 0.0f, -25.000001f },
{ 25.000001f, 0.0f, -25.000001f }
};
float canvaspoly[] = {
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
Canvas myCanvas;
GLAnimation *myAnimData;
ContextMPR *myContext;
GLGraphics myGraphics;
GLViewport myViewport;
CObject3D myObject;
GLmatrix myObjectMatrix, myCameraMatrix;
GLmatrix myBillboardMatrix, myBillboard1Matrix;
GLint TimerStart, ProgramIsActive;
GLint perspectiveflag, smoothmode, filtermode, colormode;
GLint cameraheading, cameraclimb, camerabank, cameraangle;
GLint objectheading, objectclimb, objectbank;
GLint camhflag, camcflag, cambflag;
GLint objhflag, objcflag, objbflag;
GLint bgcolor, keypressed, doneflag, shadowflag;
GLint currentstate, currentflag;
GLvertex cameraPosition;
GLfloat cameraRange, cameraStartRange;
GLvertex lightdir, objcoord;
GLfloat TotalFrameRate=(GLfloat) 0.0;
GLfloat CurrentFrameRate=(GLfloat) 10.0;
HINSTANCE myInst;
PSTR ShowProgramName = "Canvas";
GLbyte ShowTitle[256], CurrentTextureDirectory[256], CurrentObjectName[256];
GLint ProgramIsTerminated, WaitAWhile;
GLint filterindex;
GLint textureset;
GLint lightOn;
char sizeString[32];
//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_
void SetCameraAngle ();
void SetCamera ();
void glCopyMessage (GLchar *buffer, GLchar *format, GLchar *message);
void glCopyMessage (GLchar *buffer, GLchar *format, GLfloat value);
void glCopyMessage (GLchar *buffer, GLchar *format, GLint value);
void glDisplayMessageEnd ();
void glDisplayMessageStart ();
void glDisplayMessage (GLbyte *message);
void glDisplayMessage1 (GLbyte *message);
GLint LoadObjectFile ();
void DisplayFramerate (HWND hWnd);
void StartTimer ();
void CheckKeyReleased (WPARAM wParam);
GLint ProcessKeyboard ();
GLint InitializeProgram (HWND hWnd);
void ProgramLoop (HWND hWnd);
GLint ProcessInput (WPARAM wParam, HWND hWnd);
LONG APIENTRY WndProc (HWND, UINT, WPARAM, LPARAM);
BOOL APIENTRY Load3DObjectData(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
void UpdateCameraRange();
//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_
int APIENTRY WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wndclass;
RECT rect;
DWORD style;
if (!hPrevInstance) {
wndclass.style = 0;
wndclass.lpfnWndProc = (WNDPROC) WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.lpszMenuName = NULL;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
wndclass.lpszClassName = ShowProgramName;
RegisterClass (&wndclass);
}
#ifdef USE_FULLSCREEN
style = WS_VISIBLE | WS_POPUP;
hWnd = CreateWindowEx ( 0, ShowProgramName, ShowProgramName,
style,
0, 0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL, NULL, hInstance, NULL);
#else
style = WS_VISIBLE | WS_OVERLAPPEDWINDOW;
rect.top = rect.left = 0;
rect.right = SCREENWIDTH;
rect.bottom = SCREENHEIGHT;
AdjustWindowRect(&rect, style, FALSE);
hWnd = CreateWindowEx ( 0, ShowProgramName, ShowProgramName,
style,
CW_USEDEFAULT, CW_USEDEFAULT,
rect.right-rect.left, /* init. x size */
rect.bottom-rect.top, /* init. y size */
NULL, NULL, hInstance, NULL);
#endif
myInst = hInstance;
ProgramIsTerminated = ProgramIsActive = WaitAWhile = 0;
myCanvas.Setup (canvasVertex);
myCanvas.SetColor (1.0f,0.0f,0.0f,1.0f);
TheLoader.Setup ();
if (InitializeProgram (hWnd)) {
TheLoader.Cleanup ();
DestroyWindow (hWnd);
return FALSE;
}
UpdateWindow (hWnd);
StartTimer();
while( 1 ) {
if( !ProgramIsActive && PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) {
if( !GetMessage( &msg, NULL, 0, 0 ) ) return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
ProgramLoop(hWnd);
DisplayFramerate(hWnd);
}
}
TheLoader.Cleanup ();
}
BOOL APIENTRY Load3DObjectData(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
OPENFILENAME ofn;
char szPath[256], szTitle[256];
GLint flag;
flag = 0;
switch (message) {
case WM_INITDIALOG:
SetDlgItemText (hwndDlg, IDC_TEXTURE_DIR, (const char *) CurrentTextureDirectory);
break;
case WM_ACTIVATEAPP:
ProgramIsActive = wParam;
break;
case WM_COMMAND:
switch (wParam) {
case IDC_TEXTURE_DIR:
GetDlgItemText (hwndDlg, IDC_TEXTURE_DIR, (char *) CurrentTextureDirectory, 256);
break;
case IDC_LOAD_3D_OBJECT:
szPath[0] = '\0';
memset (&ofn, 0, sizeof(OPENFILENAME));
ofn.nFilterIndex = filterindex;
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwndDlg;
//#ifdef SUPPORT_HOT_FORMAT
// ofn.lpstrFilter = "HOB files\0*.HOB\0HOT files\0*.HOT\0\0";
//#else
ofn.lpstrFilter = "HOB files\0*.HOB\0\0";
//#endif
ofn.lpstrFile = szPath;
ofn.nMaxFile = 256;
ofn.lpstrFileTitle = szTitle;
ofn.nMaxFileTitle = 256;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (!GetOpenFileName (&ofn)) break;
strcpy ((char *) CurrentObjectName, szPath);
GetDlgItemText (hwndDlg, IDC_TEXTURE_DIR, (char *) CurrentTextureDirectory, 256);
glSetTextureDirectory ((char *)CurrentTextureDirectory);
filterindex = ofn.nFilterIndex;
flag = 1;
case IDC_CANCEL:
EndDialog (hwndDlg, flag);
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
LONG APIENTRY WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_MOVE:
myGraphics.WindowMove (hWnd);
break;
case WM_DESTROY:
ProgramIsTerminated = 1;
glReset3D ();
myGraphics.Cleanup ();
PostQuitMessage (0);
break;
case WM_KEYUP:
CheckKeyReleased (wParam);
break;
case WM_KEYDOWN:
if (WaitAWhile) break;
if (ProcessInput (wParam, hWnd)) {
ProgramIsTerminated = 1;
glReset3D ();
myGraphics.Cleanup ();
PostQuitMessage (0);
}
break;
default:
return (DefWindowProc (hWnd, msg, wParam, lParam));
}
return 0;
}
void DisplayFramerate (HWND hWnd)
{
GLint endtime;
if (ProgramIsTerminated) return;
if (WaitAWhile) return;
TotalFrameRate += 1.0;
endtime = timeGetTime () - TimerStart;
if (endtime > 1000) {
CurrentFrameRate = (TotalFrameRate * 1000.0) / (GLdouble) endtime;
sprintf ((char *) ShowTitle, "%.2f fps, %s, camera is %.0fft from the origin", CurrentFrameRate, sizeString, cameraRange);
SetWindowText (hWnd, (const char *) ShowTitle);
TotalFrameRate = 0.0;
StartTimer ();
}
}
void StartTimer ()
{
TimerStart = timeGetTime ();
}
void SetCameraAngle ()
{
GLfloat hScale, vScale;
glCalculateViewScale (&hScale, &vScale, cameraangle, SCREENWIDTH, SCREENHEIGHT);
myViewport.glSetViewport (myContext, 0, 0, SCREENWIDTH, SCREENHEIGHT, hScale, vScale);//, SCREENWIDTH/2, SCREENHEIGHT/2);
SetCamera ();
}
void SetCamera ()
{
glCreateInverseTransformation ( cameraheading, cameraclimb, camerabank,
&myCameraMatrix,cameraangle,SCREENWIDTH,SCREENHEIGHT);
glCreateInverseTransformation ( 0, 0, camerabank,
&myBillboardMatrix,cameraangle,SCREENWIDTH,SCREENHEIGHT);
glCreateInverseTransformation ( 0, cameraclimb, camerabank,
&myBillboard1Matrix,cameraangle,SCREENWIDTH,SCREENHEIGHT);
myViewport.glSetCameraMatrix ( &myCameraMatrix,
&myBillboardMatrix, &myBillboard1Matrix);
}
GLint InitializeProgram (HWND hWnd)
{
GLint i;
i = myGraphics.Setup (hWnd, SCREENWIDTH, SCREENHEIGHT, SCREENDEPTH);
if (i) {
glDisplayMessage1 ((signed char *) "Can not initialize graphic! Program is aborted...\n");
ProgramIsTerminated = 1;
return 1;
}
myContext = &myGraphics.context;
strcpy ((char *) CurrentObjectName, "test");
strcpy ((char *) CurrentTextureDirectory, "texture\\");
filterindex = 0;
i = DialogBox (myInst, "IDD_LOAD3DOBJECT", hWnd, (FARPROC) Load3DObjectData);
#ifdef USE_PALETTIZED_TEXTURE
currentstate = ENABLE_PALETTIZED_TEXTURE_STATE;
glInitialize3D (myContext -> rc, "texture.lst", "palette.lst");
#else
currentstate = 0;
glInitialize3D (myContext -> rc, "texture.lst");
#endif
if (glInitializeColorTable ("color.lst")) {
glDisplayMessage1 ((signed char *) "Can not Load color list file! Program is aborted...\n");
ProgramIsTerminated = 1;
return 1;
}
cameraheading = cameraclimb = camerabank = 0;
cameraangle = 2730; // 59.98... degree viewing angle
SetCameraAngle ();
if (LoadObjectFile ()) {
glDisplayMessage1 ((signed char *) "Can not Load object file! Program is aborted...\n");
ProgramIsTerminated = 1;
return 1;
}
objectheading = 0;
objectclimb = 0;
objectbank = 0;
// Put a default light source into the environment
lightdir.x = 0.0f;
lightdir.y = 1.0f;
lightdir.z = 0.0f;
myViewport.glSetLightDirection( &lightdir );
myViewport.glSetAmbientIntensity ( 0.3f );
myViewport.glSetDiffuseIntensity ( 0.7f );
lightOn = 1;
bgcolor = 0xffffffff;
myContext -> SetState (MPR_STA_BG_COLOR, bgcolor);
myContext -> SetState (MPR_STA_FOG_COLOR, bgcolor);
// myViewport.glSetDepthCueDistance ((GLfloat) 20.0, (GLfloat) 50.0);
myViewport.glSetDepthCueColor ( (GLfloat) (bgcolor & 0xff) / 255.0,
(GLfloat) ((bgcolor >> 8) & 0xff) / 255.0,
(GLfloat) ((bgcolor >> 16) & 0xff) / 255.0);
camhflag = camcflag = cambflag = objhflag = objcflag = objbflag = 0;
doneflag = keypressed = perspectiveflag = smoothmode = filtermode = 0;
shadowflag = 0;
colormode = 0;
currentflag = 0;
textureset = 0;
return 0;
}
GLint LoadObjectFile ()
{
myObject.DeleteObject ();
if (!myObject.LoadObject (myContext -> rc,CurrentObjectName)) return (1);
while (!myObject.Object.objectDetail[0].objectData) {
Sleep (10);
};
objcoord.x = objcoord.y = objcoord.z = 0;
myObject.Object.objectCoordinate = &objcoord;
myObject.Object.objectMatrix = &myObjectMatrix;
cameraStartRange = 2.0f * myObject.GetObjectRadius();
sprintf( sizeString, "%.0fx%.0fx%.0f ft", myObject.objectSize.x,
myObject.objectSize.y,
myObject.objectSize.z );
// Setup the camera looking at the origin from twice the object radius away
cameraPosition.x = 0.0f;
cameraPosition.y = 0.0f;
cameraPosition.z = -cameraStartRange;
myViewport.glSetCameraPosition (&cameraPosition);
UpdateCameraRange();
myAnimData = myObject.GetObjectAnimation();
myContext -> InvalidateState ();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -