青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

創(chuàng)建游戲內(nèi)核(13)【接口與實(shí)現(xiàn)分離版】

 

本篇是創(chuàng)建游戲內(nèi)核(12)【接口與實(shí)現(xiàn)分離版】的續(xù)篇,關(guān)于該內(nèi)核的細(xì)節(jié)說(shuō)明請(qǐng)參考創(chuàng)建游戲內(nèi)核(13),這個(gè)版本主要是按照功能劃分模塊的思想,并嚴(yán)格按照接口與實(shí)現(xiàn)相分離的原則來(lái)寫的,沒(méi)有用面向?qū)ο蟮乃枷雭?lái)寫,沒(méi)有繼承沒(méi)有多態(tài)。大家可以對(duì)比兩個(gè)版本,比較優(yōu)劣。


接口:

/*************************************************************************
PURPOSE:
    Interface for D3D mesh and animation fucnton.
*************************************************************************/


#ifndef _CORE_MESH_ANIMATION_H_
#define _CORE_MESH_ANIMATION_H_

#include "core_common.h"
#include "core_graphics.h"

typedef 
void* MESH;
typedef MESH* MESH_PTR;

MESH create_mesh();
void destroy_mesh(MESH mesh);
BOOL load_mesh(MESH mesh, 
const char* filename, const char* texture_path);
BOOL draw_mesh(MESH mesh);

BOOL is_mesh_loaded(MESH mesh);
long get_num_frames(MESH mesh);

void get_mesh_bounds(MESH mesh,
                     
float* min_x, float* min_y, float* min_z, 
                     
float* max_x, float* max_y, float* max_z, 
                     
float* radius);

#endif
 

實(shí)現(xiàn):

/***********************************************************************************
PURPOSE:
    Implement for D3D mesh and animation fucnton.
***********************************************************************************/


#include "core_common.h"
#include "core_mesh_animation.h"
#include "RmxfTmpl.h"
#include "RmxfGuid.h"

/////////////////////////////////// defines for mesh information ///////////////////////////////////

typedef 
struct _MESH_INFO
{
    
char*               name;               // name of mesh

    ID3DXMesh*          d3d_mesh;           
// D3D mesh object
    ID3DXMesh*          d3d_skin_mesh;      // D3D skin mesh object
    ID3DXSkinInfo*      d3d_skin_info;      // D3D skin mesh information

    DWORD               num_materials;      
// number of materials in mesh
    D3DMATERIAL9*       materials;          // array of materials
    LPDIRECT3DTEXTURE9* textures;           // array of texture pointers

    D3DXVECTOR3         min, max;           
// bounding box
    float               radius;             // bounding sphere radius

    _MESH_INFO*         next;               
// pointer to next mesh information
} *_MESH_INFO_PTR;

//------------------------------------------------------------------------------------
// Create a new mesh informatio object.
//------------------------------------------------------------------------------------
static _MESH_INFO_PTR _create_mesh_info()
{
    _MESH_INFO_PTR _mesh_info = (_MESH_INFO_PTR) malloc(
sizeof(_MESH_INFO));

    memset(_mesh_info, 0, 
sizeof(_MESH_INFO));

    
return _mesh_info;
}

//------------------------------------------------------------------------------------
// Destroy all mesh information object, recursively call.
//------------------------------------------------------------------------------------
static void _destroy_mesh_info(_MESH_INFO_PTR _mesh_info)
{
    
if(_mesh_info == NULL || _mesh_info->next == NULL)
        
return;

    release_com(_mesh_info->d3d_mesh);
    release_com(_mesh_info->d3d_skin_mesh);
    release_com(_mesh_info->d3d_skin_info);

    free(_mesh_info->name);
    free(_mesh_info->materials);

    
if(_mesh_info->textures)
    {
        
for(DWORD i = 0; i < _mesh_info->num_materials; i++)
            release_com(_mesh_info->textures[i]);

        free(_mesh_info->textures);
    }

    _destroy_mesh_info(_mesh_info->next);
}

//------------------------------------------------------------------------------------
// Find mesh information with specified name, call recusively.
//------------------------------------------------------------------------------------
static _MESH_INFO_PTR _find_mesh_info(const _MESH_INFO_PTR mesh_info, const char* name)
{
    
// return current mesh information if name is NULL
    if(mesh_info == NULL || name == NULL)
        
return mesh_info;

    
// compare names and return if exact match
    if(mesh_info->name && STREQ(mesh_info->name, name))
        
return mesh_info;

    
// search next in list
    if(mesh_info->next)
    {
        _MESH_INFO_PTR _mesh_info;

        
// recursively call
        if((_mesh_info = _find_mesh_info(mesh_info, name)) != NULL)
            
return _mesh_info;
    }

    
return NULL;
}

/////////////////////////////////// defines for frame information ///////////////////////////////////

typedef 
struct _FRAME
{
    
char*           name;               // frame name
    _MESH_INFO_PTR  mesh_info;          // list of mesh information attached to this frame

    D3DXMATRIX      mat_combined;       
// combined transformation matrix
    D3DXMATRIX      mat_transformed;    // currently transformed matrix
    D3DXMATRIX      mat_original;       // original .x file matrix

    _FRAME*         parent;             
// pointer to parent frame
    _FRAME*         child;              // pointer to child frame
    _FRAME*         sibling;            // pointer to silbing frame
} *_FRAME_PTR;

//------------------------------------------------------------------------------------
// Create a new frame.
//------------------------------------------------------------------------------------
static _FRAME_PTR _create_frame()
{
    _FRAME_PTR _frame = (_FRAME_PTR) malloc(
sizeof(_FRAME));
    
    memset(_frame, 0, 
sizeof(_FRAME));

    
return _frame;
}

//------------------------------------------------------------------------------------
// Destroy frame object.
//------------------------------------------------------------------------------------
static void _destroy_frame(_FRAME_PTR frame)
{
    free(frame->name);
    free(frame->child);
    free(frame->sibling);
}

//------------------------------------------------------------------------------------
// Find frame with specified name, call recursively.
//------------------------------------------------------------------------------------
static _FRAME_PTR _find_frame(const _FRAME_PTR frame, const char* name)
{
    
// return current frame if name is NULL
    if(frame == NULL || name == NULL)
        
return frame;

    
// compare names and return if exact match
    if(frame->name && STREQ(frame->name, name))
        
return frame;

    _FRAME_PTR _frame;

    
// search child list, recursively call.
    if(frame->child)
    {
        
if((_frame = _find_frame(frame->child, name)) != NULL)
            
return _frame;
    }

    
// search sibling list, recursively call.
    if(frame->sibling)
    {
        
if((_frame = _find_frame(frame->sibling, name)) != NULL)
            
return _frame;
    }

    
return NULL;
}

//------------------------------------------------------------------------------------
// Reset frame transformed matrices to original matrices, recursively call.
//------------------------------------------------------------------------------------
static void _reset_frame_matrices(const _FRAME_PTR frame)
{
    frame->mat_transformed = frame->mat_original;

    
if(frame->child)
        _reset_frame_matrices(frame->child);

    
if(frame->sibling)
        _reset_frame_matrices(frame->sibling);
}

//------------------------------------------------------------------------------------
// Add mesh to frame.
//------------------------------------------------------------------------------------
static void _add_mesh_info_to_frame(_FRAME_PTR frame, const _MESH_INFO_PTR mesh_info)
{    
    mesh_info->next  = frame->mesh_info;
    frame->mesh_info = mesh_info;
}

/////////////////////////////////// defines for mesh ////////////////////////////////

typedef 
struct _MESH
{
    
long            num_mesh_info;  // number of mesh information
    _MESH_INFO_PTR  mesh_info;      // mesh information list

    
long            num_frame;      // number of frames
    _FRAME_PTR      frame;          // frame list

    D3DXVECTOR3     min;            
// the lower-left corner of the bounding box
    D3DXVECTOR3     max;            // the upper-right corner of the bounding box
    float           radius;         // bounding box radius
} *_MESH_PTR;

//-------------------------------------------------------------------
// Return root mesh information.
//-------------------------------------------------------------------
static _MESH_INFO_PTR _get_root_mesh_info(_MESH_PTR mesh)
{
    
return mesh->mesh_info;
}

//-------------------------------------------------------------------
// Return mesh whih spefied name.
//-------------------------------------------------------------------
static _MESH_INFO_PTR _get_mesh_info(_MESH_PTR mesh, const char* name)
{
    
if(mesh->mesh_info == NULL)
        
return NULL;

    
return _find_mesh_info(mesh->mesh_info, name);
}

//-------------------------------------------------------------------
// Parse specified xfile data, recursive function.
//-------------------------------------------------------------------
static void _parse_xfile_data(_MESH_PTR mesh, ID3DXFileData* xfile_data, 
                              _FRAME_PTR parent_frame, 
const char* texture_path)
{
    
// get the template type

    GUID _type;

    
// retrieve the globally unique identifier (GUID) of the object's template
    if(FAILED(xfile_data->GetType(&_type)))
        
return;

    
// get the template name (if any)

    DWORD _size;

    
if(FAILED(xfile_data->GetName(NULL, &_size)))
        
return;

    
char* _name = NULL;

    
if(_size != 0)
    {
        
if((_name = (char*) malloc(_size)) != NULL)
            xfile_data->GetName(_name, &_size);
    }

    
// give template a default name if none found
    if(_name == NULL)
    {
        
if((_name = (char*) malloc(9)) == NULL)
            
return;

        strcpy(_name, "$NoName$");
    }

    
// set current frame
    _FRAME_PTR _current_frame = parent_frame;

    
// process the templates

    
if(_type == TID_D3DRMFrame)     // it is a frame
    {
        
// create a new frame
        _FRAME_PTR _frame = _create_frame();

        
// store the name
        _frame->name = _name;
        _name = NULL;

        
// link to parent frame
        _frame->parent      = parent_frame;
        _frame->sibling     = parent_frame->child;
        parent_frame->child = _frame;

        
// increase frame count
        mesh->num_frame++;

        
// set current frame with new frame
        _current_frame = _frame;
    }
    
else if(_type == TID_D3DRMFrameTransformMatrix)  // it is a frame transformation matrix
    {
        D3DXMATRIX* _frame_matrix = NULL;

        
// get frame transformation matrix
        if(FAILED(xfile_data->Lock(&_size, (LPCVOID*) &_frame_matrix)))
            
return;

        
// set original matrix
        parent_frame->mat_original = *_frame_matrix;

        xfile_data->Unlock();
    }
    
else if(_type == TID_D3DRMMesh)     // it is a mesh
    {
        ID3DXBuffer*    _material_buffer = NULL;
        ID3DXBuffer*    _adjacency = NULL;
        _MESH_INFO_PTR  _mesh_info = NULL;

        
// see if mesh already loaded
        if(mesh->mesh_info == NULL || _find_mesh_info(mesh->mesh_info, _name) == NULL)
        {
            
// create a new mesh structure
            _mesh_info = _create_mesh_info();

            
// store the name
            _mesh_info->name = _name;
            _name = NULL;

            
// load mesh data
            if(FAILED(D3DXLoadSkinMeshFromXof(xfile_data, 0, g_d3d_device, &_adjacency, &_material_buffer, NULL,
                &_mesh_info->num_materials, &_mesh_info->d3d_skin_info, &_mesh_info->d3d_mesh)))
            {
                free(_name);
                free(_mesh_info);
                
return;
            }

            BYTE* _ptr;

            
// calcualte the bounding box and sphere
            if(SUCCEEDED(_mesh_info->d3d_mesh->LockVertexBuffer(D3DLOCK_READONLY, (void**) &_ptr)))
            {
                DWORD _num_vertices = _mesh_info->d3d_mesh->GetNumVertices();
                DWORD _num_bytes_per_vertex = _mesh_info->d3d_mesh->GetNumBytesPerVertex();

                
// computes a coordinate-axis oriented bouding box
                D3DXComputeBoundingBox((D3DXVECTOR3*) _ptr, _num_vertices, _num_bytes_per_vertex, 
                    &_mesh_info->min, &_mesh_info->max);

                
// computes a bounding sphere for the mesh
                D3DXComputeBoundingSphere((D3DXVECTOR3*) _ptr, _num_vertices, _num_bytes_per_vertex, 
                    &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &_mesh_info->radius);

                _mesh_info->d3d_mesh->UnlockVertexBuffer();
            }

             
// create a matching skinned mesh if bone exist
            if(_mesh_info->d3d_skin_info && _mesh_info->d3d_skin_info->GetNumBones() != 0)
            {
                
// clone a mesh using a flexible vertex format (FVF) code
                if(FAILED(_mesh_info->d3d_mesh->CloneMeshFVF(0, _mesh_info->d3d_mesh->GetFVF(), g_d3d_device,
                    &_mesh_info->d3d_skin_mesh)))
                {
                    release_com(_mesh_info->d3d_skin_info);
                }
            }

            
// load materials or create a default one if none
            if(_mesh_info->num_materials == 0)
            {
                
// create a default one
                _mesh_info->materials = (D3DMATERIAL9*) malloc(sizeof(D3DMATERIAL9));
                _mesh_info->textures  = (LPDIRECT3DTEXTURE9*) malloc(
sizeof(LPDIRECT3DTEXTURE9));

                memset(_mesh_info->materials, 0, 
sizeof(D3DMATERIAL9));

                _mesh_info->materials[0].Diffuse.r = 1.0f;
                _mesh_info->materials[0].Diffuse.g = 1.0f;
                _mesh_info->materials[0].Diffuse.b = 1.0f;
                _mesh_info->materials[0].Diffuse.a = 1.0f;
                _mesh_info->materials[0].Ambient   = _mesh_info->materials[0].Diffuse;
                _mesh_info->materials[0].Specular  = _mesh_info->materials[0].Diffuse;

                _mesh_info->textures[0] = NULL;

                _mesh_info->num_materials = 1;
            }
            
else
            {
                
// load the materials
                D3DXMATERIAL* _x_materials = (D3DXMATERIAL*) _material_buffer->GetBufferPointer();

                _mesh_info->materials = (D3DMATERIAL9*) malloc(
sizeof(D3DMATERIAL9) * _mesh_info->num_materials);

                _mesh_info->textures  = (LPDIRECT3DTEXTURE9*) 
                                        malloc(
sizeof(LPDIRECT3DTEXTURE9) * _mesh_info->num_materials);

                
char _path[MAX_PATH];

                
for(DWORD i = 0; i < _mesh_info->num_materials; i++)
                {
                    _mesh_info->materials[i] = _x_materials[i].MatD3D;
                    _mesh_info->materials[i].Ambient = _mesh_info->materials[i].Diffuse;

                    
// build a texture path and load it
                    sprintf(_path, "%s%s", texture_path, _x_materials[i].pTextureFilename);

                    
// create texture from file
                    if(FAILED(D3DXCreateTextureFromFile(g_d3d_device, _path, &_mesh_info->textures[i])))
                        _mesh_info->textures[i] = NULL;
                }
            }

            release_com(_material_buffer);
            release_com(_adjacency);

            
// link to mesh information list
            _mesh_info->next = mesh->mesh_info;
            mesh->mesh_info  = _mesh_info;
            mesh->num_mesh_info++;
        }
        
else
            
// find mesh information in list
            _mesh_info = _find_mesh_info(mesh->mesh_info, _name);

        
// add mesh information to current frame
        if(_mesh_info)
            _add_mesh_info_to_frame(_current_frame, _mesh_info);
    }   
// end if(_type == TID_D3DRMMesh)
    else if(_type == TID_D3DRMAnimationSet || _type == TID_D3DRMAnimation || _type == TID_D3DRMAnimationKey)
    {
        
// skip animation sets and animations
        free(_name);
        
return;
    }

    free(_name);

    ID3DXFileData* _child_xfile_data = NULL;
    SIZE_T _num_child;

    xfile_data->GetChildren(&_num_child);

    
// scan for embedded templates
    for(SIZE_T i = 0; i < _num_child; i++)
    {
        xfile_data->GetChild(i, &_child_xfile_data);

        
// parse child xfile data object
        _parse_xfile_data(mesh, _child_xfile_data, _current_frame, texture_path);

        release_com(_child_xfile_data);
    }
}

//-------------------------------------------------------------------
// Draw frame, recursively call.
//-------------------------------------------------------------------
static BOOL _draw_frame(_FRAME_PTR frame)
{
    D3DXMATRIX*     _matrices = NULL;
    ID3DXMesh*      _d3d_mesh_to_draw;
    _MESH_INFO_PTR  _mesh_info;

    
// return if no frame
    if(frame == NULL)
        
return FALSE;

    
if(frame->mesh_info)
    {
        
// draw mesh if any in frame
        if((_mesh_info = frame->mesh_info) != NULL)
        {
            
// setup pointer to mesh to draw
            _d3d_mesh_to_draw = _mesh_info->d3d_mesh;

            
// generate mesh from skinned mesh to draw with
            if(_mesh_info->d3d_skin_mesh && _mesh_info->d3d_skin_info)
            {
                DWORD _num_bones = _mesh_info->d3d_skin_info->GetNumBones();

                
// allocate an array of matrices to orient bones
                _matrices = (D3DXMATRIX *) malloc(sizeof(D3DXMATRIX) * _num_bones);

                
// set all bones to orientation to identity
                for(DWORD i = 0; i < _num_bones; i++)
                    D3DXMatrixIdentity(&_matrices[i]);

                
// lock source and destination vertex buffers

                
void* _source = NULL;
                
void* _dest = NULL;

                
// locks a vertex buffer and obtains a pointer to the vertex buffer memory
                _mesh_info->d3d_mesh->LockVertexBuffer(0, &_source);
                _mesh_info->d3d_skin_mesh->LockVertexBuffer(0, &_dest);

                
// update skinned mesh, applies software skinning to the target vertices based on the current matrices.
                _mesh_info->d3d_skin_info->UpdateSkinnedMesh(_matrices, NULL, _source, _dest);

                
// unlock buffers
                _mesh_info->d3d_mesh->UnlockVertexBuffer();
                _mesh_info->d3d_skin_mesh->UnlockVertexBuffer();

                
// pointer to skin mesh to draw
                _d3d_mesh_to_draw = _mesh_info->d3d_skin_mesh;
            }

            
// render the mesh
            for(DWORD i = 0; i < _mesh_info->num_materials; i++)
            {
                
// set the materials properties for the device
                g_d3d_device->SetMaterial(&_mesh_info->materials[i]);

                
// assign a texture to a stage for a device
                g_d3d_device->SetTexture(0, _mesh_info->textures[i]);

                
// draw a subset of a mesh
                _d3d_mesh_to_draw->DrawSubset(i);
            }

            
// free array of matrices
            free(_matrices);
            _matrices = NULL;
        }
    }

    
// draw child frames, recursively call.
    _draw_frame(frame->child);

    
return TRUE;
}

//-------------------------------------------------------------------
// Create mesh object.
//-------------------------------------------------------------------
MESH create_mesh()
{
    _MESH_PTR _mesh = (_MESH_PTR) malloc(
sizeof(_MESH));

    memset(_mesh, 0, 
sizeof(_MESH));

    
return (MESH) _mesh;
}

//-------------------------------------------------------------------
// Destroy all meshes and frames.
//-------------------------------------------------------------------
void destroy_mesh(MESH mesh)
{
    _MESH_PTR _mesh = (_MESH_PTR) mesh;

    _destroy_mesh_info(_mesh->mesh_info);
    _destroy_frame(_mesh->frame);
}

//-------------------------------------------------------------------
// load .x file from specified filename.
//-------------------------------------------------------------------
BOOL load_mesh(MESH mesh, const char* filename, const char* texture_path)
{
    
// check condition
    if(g_d3d_device == NULL || filename == NULL)
        
return FALSE;

    _MESH_PTR _mesh = (_MESH_PTR) mesh;

    ID3DXFile* _xfile = NULL;

    
// create the file object
    if(FAILED(D3DXFileCreate(&_xfile)))
        
return FALSE;

    
// register the templates
    if(FAILED(_xfile->RegisterTemplates((LPVOID) D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES)))
    {
        _xfile->Release();
        
return FALSE;
    }
    
    ID3DXFileEnumObject* _xfile_enum = NULL;

    
// create an enumeration object
    if(FAILED(_xfile->CreateEnumObject((LPVOID) filename, DXFILELOAD_FROMFILE, &_xfile_enum)))
    {
        _xfile->Release();
        
return FALSE;
    }

    
// create a frame
    _FRAME_PTR _frame = _create_frame();

    ID3DXFileData* _xfile_data = NULL;
    SIZE_T _num_child;

    
// retrieve the number of children in this file data object
    _xfile_enum->GetChildren(&_num_child);

    
// loop through all objects looking for the frames and meshes
    for(SIZE_T i = 0; i < _num_child; i++)
    {
        
if(FAILED(_xfile_enum->GetChild(i, &_xfile_data)))
            
return FALSE;

        
// parse xfile data
        _parse_xfile_data(_mesh, _xfile_data, _frame, texture_path);

        release_com(_xfile_data);
    }
    
    release_com(_xfile_enum);
    release_com(_xfile);

    
// see if we should keep the frame as root
    if(_frame->mesh_info)
    {
        _mesh->frame = _frame;

        _mesh->frame->name = (
char*) malloc(7);
        strcpy(_mesh->frame->name, "%ROOT%");
    }
    
else
    {
        
// Ok, now there is no any mesh in this frame, assign child frame as the root frame and release this frame.

        _mesh->frame = _frame->child;
        _FRAME_PTR _frame_ptr = _mesh->frame;

        
// reset all child frames of this frame, only under one level.
        while(_frame_ptr)
        {
            _frame_ptr->parent = NULL;
            _frame_ptr = _frame_ptr->sibling;
        }

        _frame->child = NULL;
        free(_frame);
    }

    _MESH_INFO* _mesh_info;

    
// calculate bounding box and sphere
    if((_mesh_info = _mesh->mesh_info) != NULL)
    {
        
while(_mesh_info)
        {
            
// set the lower-left corner of the bounding box as the most lower-left corner 
            // of all meshes's bounding box
            _mesh->min.x = min(_mesh->min.x, _mesh_info->min.x);
            _mesh->min.y = min(_mesh->min.y, _mesh_info->min.y);
            _mesh->min.z = min(_mesh->min.z, _mesh_info->min.z);

            
// set the upper-right corner of the bounding box as the most upper-right corner 
            // of all meshes's bounding box
            _mesh->max.x = min(_mesh->max.x, _mesh_info->max.x);
            _mesh->max.y = min(_mesh->max.y, _mesh_info->max.y);
            _mesh->max.z = min(_mesh->max.z, _mesh_info->max.z);
            
            
// set bounding box radius as max radius of all meshes
            _mesh->radius = max(_mesh->radius, _mesh_info->radius);

            _mesh_info = _mesh_info->next;
        }
    }

    
return TRUE;
}

//-----------------------------------------------------------------------------
// Draw mesh, call recursively.
//-----------------------------------------------------------------------------
BOOL draw_mesh(MESH mesh)
{
    
return _draw_frame(((_MESH_PTR) mesh)->frame);
}

//-------------------------------------------------------------------
// Judge whether the mesh has been loaded successfully.
//-------------------------------------------------------------------
BOOL is_mesh_loaded(MESH mesh)
{
    _MESH_PTR _mesh = (_MESH_PTR) mesh;

    
return (_mesh->mesh_info && _mesh->frame);
}

//-------------------------------------------------------------------
// Get number of frame.
//-------------------------------------------------------------------
long get_num_frames(MESH mesh)
{
    
return ((_MESH_PTR) mesh)->num_frame;
}

//-------------------------------------------------------------------
// Get bound box coordiante and radius.
//-------------------------------------------------------------------
void get_mesh_bounds(MESH mesh,
                     
float* min_x, float* min_y, float* min_z, 
                     
float* max_x, float* max_y, float* max_z, 
                     
float* radius)
{
    _MESH_PTR _mesh = (_MESH_PTR) mesh;

    
if(min_x != NULL)   *min_x = _mesh->min.x;
    
if(min_y != NULL)   *min_y = _mesh->min.y;
    
if(min_z != NULL)   *min_z = _mesh->min.z;

    
if(max_x != NULL)   *max_x = _mesh->max.x;
    
if(max_y != NULL)   *max_y = _mesh->max.z;
    
if(max_z != NULL)   *max_z = _mesh->max.z;

    
if(radius != NULL)  *radius = _mesh->radius;
}
 

測(cè)試代碼:

/***********************************************************************************
PURPOSE:
    Test for mesh function.
***********************************************************************************/


#include <windows.h>
#include "core_framework.h"
#include "core_graphics.h"
#include "core_tool.h"
#include "core_mesh_animation.h"

MESH g_mesh;

//--------------------------------------------------------------------------------
// Initialize data for game.
//--------------------------------------------------------------------------------
BOOL game_init()
{
    
// Create Direct3D and Direct3DDevice object
    if(! create_display(g_hwnd, get_client_width(g_hwnd), get_client_height(g_hwnd), 16, TRUE, FALSE))
        
return FALSE;    

    
// set perspective projection transform matrix
    set_perspective(D3DX_PI/4.0f, 1.33333f, 1.0f, 1000.0f);

    D3DXMATRIX _mat_view;

    
// create and set the view matrix
    D3DXMatrixLookAtLH(&_mat_view,
                       &D3DXVECTOR3(0.0, 50.0, -150.0),
                       &D3DXVECTOR3(0.0, 50.0,  0.0), 
                       &D3DXVECTOR3(0.0, 1.0,   0.0));

    g_d3d_device->SetTransform(D3DTS_VIEW, &_mat_view);

    g_mesh = create_mesh();

    
if(! load_mesh(g_mesh, "warrior.x", ".\\"))
        
return FALSE;

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Render every game frame.
//--------------------------------------------------------------------------------
BOOL game_frame()
{
    clear_display_buffer(D3DCOLOR_RGBA(0, 0, 0, 255));

    
if(SUCCEEDED(g_d3d_device->BeginScene()))
    {
        D3DXMATRIX _mat_world;

        
// create and set the world transformation matrix
        // rotate object along z-axis
        D3DXMatrixRotationY(&_mat_world, (float) (timeGetTime() / 1000.0));

        g_d3d_device->SetTransform(D3DTS_WORLD, &_mat_world);

        
// draw mesh
        draw_mesh(g_mesh);        

        g_d3d_device->EndScene();
    }

    present_display();

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Release all game resources.
//--------------------------------------------------------------------------------
BOOL game_shutdown()
{
    destroy_mesh(g_mesh);

    release_com(g_d3d_device);
    release_com(g_d3d);

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE pre_inst, LPSTR cmd_line, int cmd_show)
{    
    
if(! build_window(inst, "MainClass", "MainWindow", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480))
        
return FALSE;

    run_game(game_init, game_frame, game_shutdown);
    
    
return 0;
}
 

點(diǎn)擊下載源碼和工程

程序截圖:


posted on 2007-10-05 01:14 lovedday 閱讀(397) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清在线一区二区| 亚洲欧洲一区二区天堂久久| 国产精品免费在线| 亚洲美女黄网| 欧美国产极速在线| 久久久久久久一区| 国产精品综合av一区二区国产馆| 99国产精品久久久| 亚洲国产婷婷综合在线精品| 午夜精品久久久久久久99热浪潮| 欧美日韩一区二区在线观看视频 | 国产精品久久波多野结衣| 亚洲啪啪91| 亚洲国产精品一区二区第一页 | 欧美一区二区啪啪| 国产欧美日韩亚洲一区二区三区| 亚洲午夜精品国产| 99视频国产精品免费观看| 另类综合日韩欧美亚洲| 亚洲网站视频福利| 欧美激情国产日韩精品一区18| 久久精品国产99| 国内成人自拍视频| 美女被久久久| 欧美不卡高清| 一区二区三区四区五区在线 | 亚洲影视综合| 国产日韩欧美一二三区| 久久精品91| 久久久亚洲国产美女国产盗摄| 亚洲动漫精品| 亚洲精品在线观看视频| 欧美午夜电影在线| 欧美亚洲一区二区在线| 欧美专区18| 国产最新精品精品你懂的| 欧美影院午夜播放| 久久精品欧美| 亚洲欧洲精品一区二区| 日韩视频免费在线观看| 国产日本亚洲高清| 男同欧美伦乱| 欧美午夜宅男影院在线观看| 亚洲综合另类| 久久久久久电影| 99精品欧美一区| 午夜综合激情| 日韩视频一区二区三区在线播放| 亚洲一区二区三区免费在线观看| 激情综合视频| 一区二区av在线| 一区二区三区在线看| 日韩亚洲欧美高清| 黄色成人在线网址| 亚洲免费播放| 亚洲电影免费观看高清| 一区二区三区鲁丝不卡| 亚洲成人中文| 午夜精品亚洲| avtt综合网| 久久婷婷成人综合色| 午夜精品久久久久久久久久久| 免费看av成人| 久久免费黄色| 国产精品影视天天线| 亚洲人成毛片在线播放| 国产一区二区主播在线| 一区二区三区日韩精品视频| 亚洲高清精品中出| 欧美伊人久久久久久午夜久久久久 | 久久精品国产综合精品| 亚洲综合视频一区| 欧美激情视频给我| 牛牛国产精品| 一区二区三区在线高清| 一区二区三区不卡视频在线观看| 久久影院午夜论| 国产精品九九久久久久久久| 亚洲电影免费在线观看| 激情成人亚洲| 欧美影视一区| 久久精品视频免费播放| 国产精品美女主播在线观看纯欲| 亚洲精品一区二区三| 亚洲日本黄色| 免费不卡中文字幕视频| 久久综合福利| 狠狠色综合网站久久久久久久| 亚洲欧美日韩人成在线播放| 亚洲影院在线| 国产精品久久久| 在线视频欧美一区| 亚洲综合99| 国产精品国产三级国产专播精品人 | 亚洲欧洲三级| 日韩一区二区免费高清| 麻豆精品一区二区综合av| 免费观看久久久4p| 136国产福利精品导航| 久久久综合激的五月天| 欧美成人性网| 亚洲人午夜精品免费| 欧美精品日本| 中文精品99久久国产香蕉| 午夜欧美精品| 国产亚洲精品bt天堂精选| 亚洲免费黄色| 亚洲高清视频一区二区| 美女91精品| 欧美激情精品久久久久久黑人 | 亚洲一区二区三区精品在线| 国产精品v片在线观看不卡| 一区二区三区国产精华| 午夜欧美大尺度福利影院在线看| 国产欧美日韩在线| 久久精品亚洲国产奇米99| 欧美大片在线看| 日韩亚洲欧美综合| 国产精品一国产精品k频道56| 午夜一级在线看亚洲| 欧美肥婆在线| 亚洲欧美日韩视频二区| 国内久久视频| 欧美激情中文不卡| 亚洲欧美成人一区二区在线电影| 久久亚洲私人国产精品va媚药| 亚洲全部视频| 国产日韩精品在线播放| 欧美~级网站不卡| 亚洲一区激情| 欧美福利视频在线| 午夜精品免费视频| 亚洲国产小视频| 国产精品日韩精品欧美精品| 免费在线观看一区二区| 亚洲欧美在线x视频| 久久人人九九| 中日韩在线视频| 欧美成人免费全部观看天天性色| 一区二区三区免费看| 黄色综合网站| 国产精品黄色| 欧美理论片在线观看| 久久精品噜噜噜成人av农村| aa级大片欧美三级| 欧美黑人在线观看| 久久精品水蜜桃av综合天堂| 亚洲视频在线播放| 亚洲国产精品久久久久秋霞蜜臀| 国产精品三级久久久久久电影| 欧美jjzz| 久久午夜色播影院免费高清| 亚洲综合色婷婷| 夜夜狂射影院欧美极品| 亚洲国内自拍| 欧美成人精品在线| 久久嫩草精品久久久精品| 亚洲欧美精品在线观看| 99精品视频免费在线观看| 在线看片欧美| 国产一区二区毛片| 国产精品永久在线| 国产精品国产馆在线真实露脸| 欧美久久电影| 欧美激情视频在线播放| 久久综合色影院| 久久国产精品99久久久久久老狼| 亚洲性人人天天夜夜摸| 亚洲免费福利视频| 亚洲经典视频在线观看| 欧美激情女人20p| 欧美成人免费va影院高清| 免费欧美日韩| 欧美va亚洲va日韩∨a综合色| 久久一二三国产| 欧美在线视频一区二区| 新片速递亚洲合集欧美合集| 午夜精品福利电影| 欧美中在线观看| 久热精品视频| 亚洲电影第1页| 亚洲人成网站精品片在线观看| 欧美大香线蕉线伊人久久国产精品| 欧美大胆人体视频| 亚洲国产婷婷香蕉久久久久久| 亚洲国产精品久久91精品| 亚洲国内精品| 宅男噜噜噜66国产日韩在线观看| 亚洲免费精彩视频| 亚洲欧美精品suv| 久久超碰97中文字幕| 久久久水蜜桃| 欧美精品日韩精品| 国产精品久久中文| 国产一区二区0| **性色生活片久久毛片| 亚洲精品永久免费| 亚洲午夜在线观看| 久久国产精品一区二区三区四区 | 亚洲老司机av|