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

天行健 君子當自強而不息

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)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美三级在线视频| 国内外成人免费激情在线视频| 亚洲国产精品t66y| 男女精品网站| 久久综合九色欧美综合狠狠| 亚洲电影免费观看高清完整版在线观看 | 久久久99久久精品女同性| 欧美一区二区大片| 精品二区久久| 欧美激情二区三区| 欧美日韩播放| 欧美一区三区二区在线观看| 久久成人一区| 日韩视频永久免费| 亚洲视频碰碰| 狠狠色丁香婷婷综合久久片| 亚洲国产日韩一级| 欧美日韩一区综合| 久久久久久久999| 欧美国产欧美综合| 欧美在线免费播放| 牛牛影视久久网| 午夜免费在线观看精品视频| 久久本道综合色狠狠五月| 亚洲精品少妇| 欧美综合国产| 在线视频欧美日韩精品| 欧美在线91| 99成人在线| 久久丁香综合五月国产三级网站| 日韩一级视频免费观看在线| 亚洲欧美视频在线| 夜久久久久久| 久久久久国产精品一区三寸| 亚洲性夜色噜噜噜7777| 久久精品九九| 欧美一区二区视频在线| 欧美精品免费视频| 玖玖玖国产精品| 国产精品久久波多野结衣| 美女在线一区二区| 国产精品日本一区二区| 亚洲欧洲一区二区三区久久| 国产一区二区av| 91久久精品久久国产性色也91| 国产欧美日韩视频一区二区三区 | 免费亚洲一区| 国产欧美日韩三级| 99re66热这里只有精品3直播| 在线播放豆国产99亚洲| 亚洲欧美影院| 亚洲欧美日韩精品一区二区| 欧美大片网址| 欧美高清视频一区| 国产自产v一区二区三区c| 在线视频中文亚洲| 中国成人黄色视屏| 欧美日韩精品免费观看| 亚洲国产色一区| 亚洲精品乱码久久久久久按摩观| 久久久久久久激情视频| 久久久精品2019中文字幕神马| 国产精品你懂的| 亚洲尤物精选| 久久黄色小说| 国产日韩专区| 欧美一级欧美一级在线播放| 久久riav二区三区| 国产日韩欧美在线看| 校园激情久久| 麻豆精品一区二区综合av| 精品成人a区在线观看| 久久婷婷麻豆| 欧美激情亚洲另类| 99综合视频| 国产精品高潮视频| 午夜伦理片一区| 老**午夜毛片一区二区三区| 影音先锋久久精品| 蜜桃av一区二区三区| 亚洲黄色免费| 亚洲一级高清| 国产情人综合久久777777| 欧美一区日韩一区| 欧美成年人网| 亚洲视频axxx| 国产一区二区久久| 美女免费视频一区| 日韩视频在线你懂得| 欧美一区二区高清| 玉米视频成人免费看| 欧美激情一区二区三区全黄| 亚洲免费av电影| 久久电影一区| 日韩一级不卡| 国产日韩欧美在线播放| 欧美成人dvd在线视频| 一区二区三区黄色| 久久尤物视频| 一区二区三区波多野结衣在线观看| 国产精品亚洲片夜色在线| 久久这里只精品最新地址| 99这里只有精品| 麻豆精品传媒视频| 亚洲一区二区三区欧美| 黑丝一区二区| 国产精品国产三级国产专区53| 欧美在线黄色| 夜夜精品视频| 欧美国产丝袜视频| 性欧美在线看片a免费观看| 亚洲国产美女| 国产亚洲一本大道中文在线| 欧美日韩国产一区二区三区| 欧美在线高清视频| 正在播放日韩| 亚洲欧洲另类国产综合| 久久久亚洲影院你懂的| 亚洲欧美日韩国产中文 | 国产精品人人爽人人做我的可爱| 久久久久久自在自线| 亚洲深夜福利在线| 亚洲国产成人av| 美女日韩欧美| 久久久噜噜噜久噜久久 | 一区二区三区视频在线看| 国产精品一香蕉国产线看观看| 欧美激情亚洲国产| 久久久久久97三级| 欧美在线视频在线播放完整版免费观看| 91久久久国产精品| 欧美xx视频| 免费成人av在线| 久久一二三国产| 久久久亚洲影院你懂的| 欧美在线综合| 羞羞色国产精品| 性色av香蕉一区二区| 亚洲免费一区二区| 亚洲影院在线观看| 99热在线精品观看| 在线精品国产成人综合| 国产综合久久久久久鬼色| 国产视频丨精品|在线观看| 国产精品久久午夜| 国产精品久久久久三级| 国产精品系列在线| 国产日韩欧美日韩| 国产视频一区二区三区在线观看| 国产欧美在线看| 国模一区二区三区| 伊大人香蕉综合8在线视| 在线观看国产精品淫| 在线观看日韩欧美| 亚洲欧洲在线一区| 一区二区欧美日韩| 国产精品99久久久久久久vr| 一本色道综合亚洲| 欧美一级播放| 美女福利精品视频| 亚洲黄色一区| 在线亚洲欧美视频| 欧美一级久久久| 麻豆国产精品va在线观看不卡 | 亚洲曰本av电影| 欧美在线观看一区| 麻豆国产精品va在线观看不卡| 欧美激情第8页| 国产精品区二区三区日本| 国内成人精品视频| 亚洲精品一二| 亚洲综合好骚| 免费成人性网站| 99精品国产高清一区二区| 欧美一区亚洲一区| 欧美高清不卡在线| 国产精品女人网站| 亚洲电影在线看| 亚洲综合色激情五月| 久久综合给合| 日韩午夜激情av| 久久久久久高潮国产精品视| 欧美日韩成人| 黄色在线一区| 亚洲男人的天堂在线aⅴ视频| 久久亚洲精品视频| 一本大道av伊人久久综合| 久久久久久999| 国产精品欧美一区喷水| 亚洲高清视频的网址| 午夜视频在线观看一区| 欧美成人免费小视频| 亚洲免费一级电影| 欧美理论大片| 亚洲第一二三四五区| 欧美在线www| 9i看片成人免费高清| 欧美jjzz| 亚洲成人在线观看视频| 先锋影音国产精品|