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

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

Working with Maps and Levels(14)

cAutomap::cAutomap and cAutomap::~cAutomap

The constructor and destructor of the cAutomap class ensure that all data is placed
within a known state and that all used resources are released. The constructor does
nothing more than clear some variables and orient a camera to point downward.
You later use that camera to render the map. The destructor calls on the Free
function to release all used resources.

 

cAutomap::create and cAutoMap::free

All right, take a deep breath for this part. The create function is the biggest of the
bunch. It loads an .X file and converts each mesh within into a separate vertex
buffer. Starting with its variable declarations, examine the variable in pieces to
better understand what’s going on:

bool cAutoMap::create(pcstr filename, long color)
{
    free();

    cMesh mesh;
    
if(! mesh.load(filename, ".\\"))
        
return false;

    
// get number of map section, create section visible flag array, vertex buffer array.

    m_num_sections = mesh.get_num_meshes();
    
if(m_num_sections == 0)
    {
        mesh.free();
        
return false;
    }

    m_visible = 
new bool[m_num_sections];
    ZeroMemory(m_visible, m_num_sections);

    m_map_vb = 
new DIRECT3DVERTEXBUFFER9_PTR[m_num_sections];
    
long num  = m_num_sections - 1;

    
// get a bounding radius to scale by
    float radius;
    mesh.get_bounds(NULL, NULL, NULL, NULL, NULL, NULL, &radius);
    m_scale = 128.0f / radius;

    
// go through each mesh in the cMesh object and construct a matching vertex buffer.
    // make sure to start with last section in map to compensate for linked list ordering of mesh in cMesh.
    for(sMeshInfo* mesh_info = mesh.get_root_mesh(); mesh_info != NULL; mesh_info = mesh_info->m_next)
    {
        
static long per_vertex_size = D3DXGetFVFVertexSize(mesh_info->m_d3d_mesh->GetFVF());

        ID3DXMesh* d3d_mesh = mesh_info->m_d3d_mesh;
        
ushort* index_ptr;
        
char*   vert_ptr;

        d3d_mesh->LockIndexBuffer(D3DLOCK_READONLY,  (
void**) &index_ptr);
        d3d_mesh->LockVertexBuffer(D3DLOCK_READONLY, (
void**) &vert_ptr);

        
long num_faces = d3d_mesh->GetNumFaces();
        create_vertex_buffer(&m_map_vb[num], num_faces * 3, 
sizeof(sMapVertex), AUTO_MAP_FVF);

        sMapVertex* map_vb_ptr;
        m_map_vb[num]->Lock(0, 0, (
void**) &map_vb_ptr, 0);

        
// pull out vertices and construct map vertex list, then fill into map vertex buffer.
        for(long i = 0; i < num_faces; i++)
        {
            
for(long j = 0; j < 3; j++)
            {
                
ushort vert_index = *index_ptr;
                index_ptr++;

                sVertex* vert = (sVertex*) &vert_ptr[per_vertex_size * vert_index];

                sMapVertex map_vert;

                map_vert.x = vert->x * m_scale;
                map_vert.y = 0.0f;
                map_vert.z = vert->z * m_scale;
                map_vert.diffuse = color;

                memcpy(map_vb_ptr, &map_vert, 
sizeof(sMapVertex));
                map_vb_ptr++;
            }
        }

        m_map_vb[num]->Unlock();
        d3d_mesh->UnlockVertexBuffer();
        d3d_mesh->UnlockIndexBuffer();

        num--;
    }

    mesh.free();

    
// create a character arrow vertex buffer and fill in it

    sMapVertex arrow_verts[3] = 
    {
        {  0.0f, 0.0f,  10.0f, D3DCOLOR_RGBA(128, 64, 0, 255) },
        {  5.0f, 0.0f, -10.0f, D3DCOLOR_RGBA(128, 64, 0, 255) },
        { -5.0f, 0.0f, -10.0f, D3DCOLOR_RGBA(128, 64, 0, 255) }
    };

    create_vertex_buffer(&m_arrow_vb, 3, 
sizeof(sMapVertex), AUTO_MAP_FVF);
    fill_in_vertex_buffer(m_arrow_vb, 0, 3, arrow_verts);

    
return true;
}

At this point, some variables are declared, a prior auto map is freed (via a call to
free), and some error checking is being performed. Notice that the variable declarations
include the vertex definitions for the pointer vertex buffer.

Now move on, starting with the code that loads the map mesh that is used to create
the vertex buffers.

The first order of business is to load the actual .X file from disc. The first sMesh
structure is grabbed from the cMesh object (remember from the Graphics Core that
the cMesh class stores meshes in a linked list of sMeshInfo structures).

Next, you calculate the size of the vertex structure used by the .X file and calculate
the scaling factor to alter the meshes being loaded. Finally, you store the number
of map sections in a class variable. Notice that the number of map sections happens
to be the number of meshes in the .X file.

Moving on, you allocate an array of bool variables, with each element in the array
representing whether a map section is visible. Each map section has a matching
element in the array. You also create an array of vertex buffers.
These vertex buffers will be used to store the map sections.

Remember that the meshes are contained with a linked list of structures. Now is
the time to iterate through each structure in the linked list and query each structure
for the pointer to the actual Direct3D ID3DXMesh object that contains the mesh
information for a single map section.

Next, you lock the index and vertex buffers and start pulling out the vertex data.

A vertex buffer is being created to match the number of polygon faces in the source
mesh. The vertex buffer is being locked and a pointer is being retrieved to start storing
the vertices.

Two loops now go through every polygon face in the source mesh, and three vertices
for each face are copied over to the map vertex buffers. Notice that you use only the
X- and Z-coordinates, although the Y-coordinate is set to 0 (again to flatten the map).
Last, you set the diffuse color to the color value provided (used to render the map).

You wrap up the process by unlocking the index and vertex buffers of the source
mesh and then proceeding to the next map section mesh in the linked list of
meshes loaded from the .X file. Notice that the num variable is tracking the vertex
buffer that is being created, and the preceding code decrements it with each mesh
being processed.

You decrement rather than increment the num variable because the meshes in the
cMesh object are stored in reverse order (to make loading faster), so you must compensate
to make sure that each map section is numbered sequentially to match the
order those meshes are stored in the .X file.

The create function finishes up by creating the pointer vertex buffer and copying
over the vertex definition data defined earlier. The source mesh is freed and control
returns to the caller.

In order to free the map sections from memory, you provide a free function that
releases all the allocated resources and prepares the class to load another map class.

posted on 2007-12-10 16:00 lovedday 閱讀(293) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲日本欧美日韩高观看| 伊人婷婷久久| 亚洲一区国产视频| 一区二区三区精品在线| 欧美日韩国产不卡在线看| 一本一道久久综合狠狠老精东影业| 亚洲福利在线视频| 久久一区二区三区国产精品| 在线播放一区| 亚洲精品国产精品国产自| 欧美三区在线| 久久九九电影| 蜜月aⅴ免费一区二区三区| 亚洲美女av电影| 亚洲一区区二区| 黄色在线成人| 亚洲毛片在线免费观看| 国产精品视频专区| 久久综合九色综合欧美狠狠| 欧美精品免费在线观看| 欧美一区在线视频| 蜜臀av国产精品久久久久| 亚洲视频一区二区| 欧美一区二区三区久久精品茉莉花| 在线成人中文字幕| 一本色道久久精品| 黄色成人在线免费| 一二三四社区欧美黄| 国产一区二区日韩精品欧美精品 | 欧美日韩一区二区三区| 性做久久久久久免费观看欧美| 久久精品一区二区三区不卡牛牛 | 亚洲欧美亚洲| 欧美jizz19性欧美| 久久精精品视频| 欧美日韩亚洲高清| 美女国产精品| 亚洲国产经典视频| 国产精品专区h在线观看| 亚洲一区二区视频在线| 亚洲免费观看在线视频| 国产一区二区三区黄| 亚洲美女少妇无套啪啪呻吟| 一区二区三区自拍| 亚洲女同在线| 在线视频精品一区| 欧美大片国产精品| 免费在线看一区| 国内精品视频在线播放| 一本色道久久88综合日韩精品| 黄色成人精品网站| 午夜精品久久| 欧美一区二区国产| 国产精品欧美日韩| 在线亚洲高清视频| 亚洲一区二区三区久久| 久久蜜臀精品av| 久久久久免费视频| 国产欧美日韩一级| 欧美国产日韩视频| 黄色成人片子| 久久久久久久久蜜桃| 欧美在线日韩在线| 国产精品日韩一区| 亚洲一区久久久| 欧美一区高清| 国产欧美日韩亚洲| 欧美在线观看视频一区二区| 欧美一区不卡| 国产午夜久久久久| 久久精品人人爽| 美女主播精品视频一二三四| 国产精品盗摄一区二区三区| 日韩一级黄色av| 亚洲欧美国产视频| 国产一区二区三区丝袜| 久久精品人人做人人爽| 欧美aⅴ99久久黑人专区| 亚洲国产精品美女| 麻豆av一区二区三区| 亚洲成色777777女色窝| 欧美日韩国产三区| 一本大道av伊人久久综合| 亚洲图片你懂的| 国产九色精品成人porny| 欧美一区二区三区四区视频| 欧美v国产在线一区二区三区| 亚洲福利专区| 欧美精品在线视频| 亚洲性视频h| 久久蜜桃精品| 亚洲人成7777| 国产精品高潮呻吟久久| 欧美一级播放| 亚洲三级国产| 久久黄色级2电影| 最近中文字幕日韩精品| 欧美性片在线观看| 久久gogo国模裸体人体| 亚洲欧洲一区二区天堂久久| 小辣椒精品导航| 亚洲电影免费观看高清完整版 | 在线视频你懂得一区| 久久久久久亚洲精品中文字幕| 亚洲激情在线视频| 国产精品久久久久免费a∨| 欧美一区二区三区四区在线观看地址 | 国产精品sm| 久久视频精品在线| 亚洲中无吗在线| 91久久国产精品91久久性色| 久久国产视频网| 一区二区三区精密机械公司| 韩日视频一区| 国产精品日日摸夜夜添夜夜av | 亚洲视频一区二区在线观看 | 亚洲国产欧美日韩| 国产视频观看一区| 欧美三级网址| 欧美高清视频| 久久亚洲电影| 羞羞视频在线观看欧美| 一二三四社区欧美黄| 91久久精品美女高潮| 久久免费黄色| 欧美亚洲三级| 亚洲一区二区精品视频| 亚洲人体偷拍| 在线日韩视频| 激情婷婷欧美| 伊人成人在线| 激情偷拍久久| 一区二区三区在线视频播放| 国产丝袜美腿一区二区三区| 国产精品你懂得| 国产精品久久久久久久app| 欧美精品国产精品| 欧美激情一区二区| 欧美成人精品三级在线观看| 免费欧美在线| 欧美.日韩.国产.一区.二区| 久久视频在线看| 久久久久成人网| 久久精品国产精品亚洲综合| 欧美一区二区三区免费大片| 午夜免费电影一区在线观看| 亚洲欧美999| 欧美一区=区| 久久米奇亚洲| 噜噜爱69成人精品| 欧美成va人片在线观看| 欧美 日韩 国产在线 | 欧美自拍偷拍午夜视频| 久久国产主播| 久久综合五月天婷婷伊人| 久久久欧美一区二区| 女同一区二区| 国产精品福利在线观看| 国产乱码精品1区2区3区| 国产一区二区精品久久99| 国产在线麻豆精品观看| 亚洲国产高清在线观看视频| 亚洲日韩欧美视频一区| 一区二区av| 欧美一级大片在线免费观看| 久久亚洲美女| 91久久在线视频| 亚洲欧美成aⅴ人在线观看| 久久精品免费观看| 欧美黄色成人网| 国产精品一级久久久| 在线观看av不卡| 中国成人在线视频| 久久精品毛片| 亚洲黄色在线观看| 亚洲在线成人精品| 老**午夜毛片一区二区三区| 欧美日韩一区二区在线观看视频 | 欧美不卡高清| 国产精品视频xxxx| 亚洲第一搞黄网站| 亚洲一区二区三区精品在线观看| 久久精品国产欧美亚洲人人爽| 欧美成黄导航| 亚洲视频中文| 麻豆91精品91久久久的内涵| 国产精品第三页| 亚洲高清二区| 欧美综合国产| 亚洲理论在线| 久久亚洲国产精品日日av夜夜| 欧美日韩精品二区第二页| 国产一区二区日韩| 亚洲天天影视| 亚洲经典自拍| 久久偷窥视频| 国产一区二区久久| 午夜久久久久| 亚洲免费观看在线视频| 裸体歌舞表演一区二区|