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

天行健 君子當(dāng)自強(qiá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 閱讀(284) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   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国产精品久久久久| 久久er精品视频| 亚洲人妖在线| 在线视频欧美日韩精品| 国产欧美一区二区三区另类精品| 久久天堂精品| 欧美日韩成人在线观看| 久久er精品视频| 欧美黄色免费网站| 久久精品二区| 欧美日本亚洲| 老鸭窝毛片一区二区三区| 欧美日韩国产综合一区二区| 久久久水蜜桃| 国产精品激情电影| 欧美+亚洲+精品+三区| 欧美色欧美亚洲另类二区| 久久野战av| 国产精品午夜电影| 久久久综合网| 国产一区二区三区不卡在线观看| 久久精品欧洲| 欧美日韩亚洲一区二区三区在线观看 | 性久久久久久久久| 一区二区不卡在线视频 午夜欧美不卡'| 中文国产一区| 日韩视频免费| 久久影院亚洲| 久久久久一区二区| 国产精品大片wwwwww| 亚洲国产精品va在线观看黑人| 国产精品狠色婷| 亚洲精品视频免费观看| 亚洲国产日韩一区| 亚洲天堂久久| 国产精品亚洲一区二区三区在线| 国产在线乱码一区二区三区| 亚洲影院免费| 欧美国产亚洲视频| 麻豆九一精品爱看视频在线观看免费| 国产精品地址| 一本久道综合久久精品| 999亚洲国产精| 欧美成人午夜视频| 欧美国产大片| 一区二区在线观看视频在线观看| 亚洲欧美www| 亚洲欧美日本视频在线观看| 欧美日韩综合视频网址| 亚洲精品综合久久中文字幕| 亚洲精品在线观看免费| 男人插女人欧美| 欧美激情一区二区三区全黄| 在线免费不卡视频| 黄色一区三区| 国产日韩在线一区二区三区| 亚洲免费综合| 欧美电影在线观看| 亚洲高清在线视频| 日韩视频一区二区在线观看| 欧美高清视频www夜色资源网| 免费在线观看精品| 亚洲精品网站在线播放gif| 欧美激情va永久在线播放| 91久久精品一区| 亚洲视频电影在线| 国产精品亚洲综合一区在线观看| 亚洲综合社区| 麻豆久久精品| 亚洲精品日产精品乱码不卡| 欧美日韩国产美女| 一本色道久久加勒比精品| 久久成人精品无人区| 一区二区三区在线免费观看| 欧美成人精品高清在线播放| 亚洲日产国产精品| 韩国v欧美v日本v亚洲v| 欧美顶级大胆免费视频| 亚洲国产一区二区三区青草影视 | 免费久久久一本精品久久区| 亚洲福利在线视频| 欧美日韩成人综合在线一区二区 | 亚洲欧美日本另类| 欧美成年人视频网站| 亚洲香蕉网站| 狠狠色综合网站久久久久久久| 免费观看日韩| 亚洲午夜国产一区99re久久| 久久一本综合频道| 正在播放亚洲| 亚洲承认在线| 国产精品久久久久免费a∨| 久久精品国产清高在天天线| 蜜臀久久99精品久久久画质超高清| 中文一区二区| 亚洲日本激情| 国产精品v欧美精品v日韩精品| 亚洲淫性视频| 亚洲成人资源网| 你懂的视频一区二区| 日韩五码在线| 激情小说亚洲一区| 国产精品日日做人人爱| 欧美精品电影| 久久午夜精品| 久久er99精品| 亚洲欧美日韩网| 亚洲美女黄色片| 免费在线欧美黄色| 欧美在线观看一区二区三区| av成人激情| 最新中文字幕一区二区三区| 国产主播一区二区| 国产老肥熟一区二区三区| 欧美日韩成人一区| 欧美精品成人在线| 伊人婷婷欧美激情| 久久午夜影视| 亚洲深夜av| 制服诱惑一区二区| 91久久精品国产91久久| 国产一区二区三区自拍| 国产精品视频网站| 国产精品任我爽爆在线播放 | 亚洲精品少妇网址| 欧美激情一二三区| 欧美激情一区二区三区在线视频观看 | 国产精品二区在线观看| 欧美日韩国产成人精品| 欧美精品videossex性护士| 免费亚洲一区二区| 欧美风情在线观看| 欧美激情一区在线观看| 欧美日韩国产在线一区| 欧美日本在线| 香蕉久久夜色| 久久狠狠婷婷| 国产精品高潮在线| 亚洲欧美电影院| 一本色道久久88综合日韩精品| 亚洲人成网站精品片在线观看| 欧美激情小视频| 亚洲人体1000| 亚洲一本视频| 欧美中文字幕不卡| 麻豆视频一区二区| 欧美日韩国产一区精品一区| 国产精品福利在线观看网址| 国产精品国产自产拍高清av王其 | 欧美屁股在线| 国产精品qvod| 国产三区二区一区久久| 国内伊人久久久久久网站视频| 亚洲电影观看| 日韩视频在线观看国产| 亚洲欧美国产高清va在线播| 久久激情五月丁香伊人| 亚洲欧美在线看| 狠狠色狠色综合曰曰| 亚洲摸下面视频| 亚洲天天影视| 亚洲自拍都市欧美小说| 久久精品国产99| 亚洲国产精品视频一区| 亚洲无吗在线| 免费永久网站黄欧美| 国产精品成人一区二区| 国产一区二区三区视频在线观看| 91久久国产精品91久久性色| 亚洲一区制服诱惑| 欧美.www| 午夜精品影院| 欧美韩国日本综合| 国产一区二区三区最好精华液| 夜夜嗨一区二区| 久久伊人一区二区| 在线一区视频| 欧美激情aⅴ一区二区三区| 国产精品资源| 一区二区三区精品| 久久久久久久久久久一区| 亚洲人成网站色ww在线| 久久精品伊人| 国产伦精品一区| 99国产精品久久久久久久| 欧美激情精品久久久久久黑人| 国产精品资源| 亚洲一区免费看| 欧美激情国产日韩精品一区18|