📄 main.cpp
字号:
//***********************************************************************//
// //
// - "Talk to me like I'm a 3 year old!" Programming Lessons - //
// //
// $Author: DigiBen digiben@gametutorials.com //
// //
// $Program: MD2 Loader //
// //
// $Description: Demonstrates how to load a Quake2 MD2 Model //
// //
// $Date: 2/6/02 //
// //
//***********************************************************************//
// This is a compiler directive that includes libraries (For Visual Studio)
// You can manually include the libraries in the "Project->settings" menu under
// the "Link" tab. You need these libraries to compile this program.
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
#include "main.h" // This includes our header file
#include "Md2.h" // Include the MD2 header file.
bool g_bFullScreen = true; // Set full screen as default
HWND g_hWnd; // This is the handle for the window
RECT g_rRect; // This holds the window dimensions
HDC g_hDC; // General HDC - (handle to device context)
HGLRC g_hRC; // General OpenGL_DC - Our Rendering Context for OpenGL
HINSTANCE g_hInstance; // This holds the global hInstance for UnregisterClass() in DeInit()
//////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
// This tutorial will demonstrate how to load a .Md2 file. This 3D file format
// was created for Quake2 character models with key frame animation.
// If you have any desire to create your own file, I suggest finding MilkShape 3D.
// This program allows you to import and export almost every popular 3D format,
// along with the ability to use it as a modeler. It's a $20 shareware program,
// you can't beat that! I chose the .Md2 format after viewing the internet and
// see the countless characters already on the internet for free download.
// This is good news for programmers that don't have art programs or can't
// do any art. All the animations and weapons are done for you! This is a
// great start to learning animation as well, since the Quake formats are so
// simple it makes me shed a tear of joy. This tutorial only loads the model,
// where as the next tutorial will show how to do key frame animation using
// interpolation. Next, we will tackle skeletal animation with the famous
// Quake3 .Md3 format. This makes learning animation easy because it isn't
// complicated by a $3000 modeler. Plus, there are hundreds of models out
// there on the internet to test and put in your own games (with permission of course).
// The best place to find models is at www.planetquake.com. Usually there are
// featured models weekly to download.
//
// Since there is no animation for the model, we just have it spinning in the
// center of the screen. The controls are:
//
// Left Mouse Button - Changes the Render mode from normal to wireframe.
// Right Mouse Button - Turns lighting On/Off
// Left Arrow Key - Spins the model to the left
// Right Arrow Key - Spins the model to the right
// Escape - Quits
//
// If you decide to go find models you might find them in a format like .pk3.
// This is just a .zip format, so rename it to .zip and unzip it. There should
// be .Md2 and texture files. I think the textures are normally in .pcx, so you
// will have to save them as BMP's to run in here.
//
//
//
//
#define FILE_NAME "tris.md2" // This is the 3D file we will load.
#define TEXTURE_NAME "hobgoblin.bmp"
UINT g_Texture[MAX_TEXTURES] = {0}; // This holds the texture info, referenced by an ID
CLoadMD2 g_LoadMd2; // This is MD2 class. This should go in a good model class.
t3DModel g_3DModel; // This holds the 3D Model info that we load in
int g_ViewMode = GL_TRIANGLES; // We want the default drawing mode to be normal
bool g_bLighting = true; // Turn lighting on initially
float g_RotateX = 0.0f; // This is the current value at which the model is rotated
float g_RotationSpeed = 0.5f; // This is the speed that our model rotates. (-speed rotates left)
//////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
///////////////////////////////// INIT GAME WINDOW \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
/////
///// This function initializes the game window.
/////
///////////////////////////////// INIT GAME WINDOW \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
void Init(HWND hWnd)
{
g_hWnd = hWnd; // Assign the window handle to a global window handle
GetClientRect(g_hWnd, &g_rRect); // Assign the windows rectangle to a global RECT
InitializeOpenGL(g_rRect.right, g_rRect.bottom); // Init OpenGL with the global rect
//////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
// First we need to actually load the .MD2 file. We just pass in an address to
// our t3DModel structure and the file name string we want to load ("tris.md2").
// We also need to give the texture name we will be using. This is because there
// are usually a lot of textures with each character. You choose the best one.
// It seems that all of the Quake2 characters .md2 files are called: "tris.md2"
g_LoadMd2.ImportMD2(&g_3DModel, FILE_NAME, TEXTURE_NAME);
// There is no color information for these models, as well as only one
// texture. If everything goes well, it should load the TEXTURE_NAME file.
// Go through all the materials
for(int i = 0; i < g_3DModel.numOfMaterials; i++)
{
// Check to see if there is a file name to load in this material
if(strlen(g_3DModel.pMaterials[i].strFile) > 0)
{
// Use the name of the texture file to load the bitmap, with a texture ID (i).
// We pass in our global texture array, the name of the texture, and an ID to reference it.
CreateTexture(g_Texture, g_3DModel.pMaterials[i].strFile, i);
}
// Set the texture ID for this material
g_3DModel.pMaterials[i].texureId = i;
}
// Here, we turn on a lighting and enable lighting. We don't need to
// set anything else for lighting because we will just take the defaults.
// We also want color, so we turn that on
glEnable(GL_LIGHT0); // Turn on a light with defaults set
glEnable(GL_LIGHTING); // Turn on lighting
glEnable(GL_COLOR_MATERIAL); // Allow color
// To make our model render somewhat faster, we do some front back culling.
// It seems that Quake2 orders their polygons clock-wise.
glEnable(GL_CULL_FACE); // Turn culling on
glCullFace(GL_FRONT); // Quake2 uses front face culling apparently
//////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
}
///////////////////////////////// MAIN GAME LOOP \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
/////
///// This function Handles the main game loop
/////
///////////////////////////////// MAIN GAME LOOP \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
WPARAM MainLoop()
{
MSG msg;
while(1) // Do our infinate loop
{ // Check if there was a message
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT) // If the message wasnt to quit
break;
TranslateMessage(&msg); // Find out what the message does
DispatchMessage(&msg); // Execute the message
}
else // if there wasn't a message
{
RenderScene(); // Update the screen
}
}
//////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
// When we are done, we need to free all the model data
// We do this by walking through all the objects and freeing their information
// Go through all the objects in the scene
for(int i = 0; i < g_3DModel.numOfObjects; i++)
{
// Free the faces, normals, vertices, and texture coordinates.
if(g_3DModel.pObject[i].pFaces) delete [] g_3DModel.pObject[i].pFaces;
if(g_3DModel.pObject[i].pNormals) delete [] g_3DModel.pObject[i].pNormals;
if(g_3DModel.pObject[i].pVerts) delete [] g_3DModel.pObject[i].pVerts;
if(g_3DModel.pObject[i].pTexVerts) delete [] g_3DModel.pObject[i].pTexVerts;
}
//////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
DeInit(); // Clean up and free all allocated memory
return(msg.wParam); // Return from the program
}
///////////////////////////////// RENDER SCENE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
/////
///// This function renders the entire scene.
/////
///////////////////////////////// RENDER SCENE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
void RenderScene()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -