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

天行健 君子當自強而不息

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 閱讀(291) 評論(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>
            国产精品福利影院| 欧美日韩国产色视频| 国产一区自拍视频| 久久国内精品视频| 亚洲欧美日韩国产一区二区| 国产精品国产一区二区| 午夜在线精品偷拍| 校园春色综合网| 国模精品一区二区三区色天香| 久久爱www.| 久久精品视频免费播放| 亚洲国产精品一区二区三区| 亚洲风情亚aⅴ在线发布| 免费观看欧美在线视频的网站| 亚洲缚视频在线观看| 91久久午夜| 国产精品毛片在线| 久久久亚洲高清| 欧美a级大片| 亚洲一区二区在线看| 亚洲欧美精品中文字幕在线| 尤物在线观看一区| 日韩午夜在线电影| 国产主播一区二区三区四区| 欧美成人有码| 国产精品成人v| 久久露脸国产精品| 欧美精品三区| 久久嫩草精品久久久精品一| 欧美国产精品v| 久久成人精品| 欧美激情1区| 久久精品一区中文字幕| 欧美精品aa| 久久高清国产| 欧美日韩精品免费看| 久久偷看各类wc女厕嘘嘘偷窃| 欧美va天堂| 久久精品在线免费观看| 欧美日韩mp4| 欧美多人爱爱视频网站| 国产精品拍天天在线| 最新国产成人在线观看| 好吊视频一区二区三区四区| 亚洲视频一二区| 亚洲免费精彩视频| 久久久噜噜噜| 久久久久久久久久久久久9999 | 久久久999成人| 欧美性大战xxxxx久久久| 欧美大秀在线观看| 韩国一区二区在线观看| 亚洲免费在线| 亚洲欧美精品在线观看| 欧美日韩亚洲高清一区二区| 欧美高清在线观看| 悠悠资源网亚洲青| 久久精品日韩欧美| 久久婷婷综合激情| 韩国av一区二区三区四区| 亚洲欧美自拍偷拍| 新狼窝色av性久久久久久| 欧美午夜电影网| 日韩亚洲精品电影| 在线视频一区二区| 欧美日韩国产精品自在自线| 亚洲高清一二三区| 一本色道88久久加勒比精品| 欧美福利视频在线| 亚洲精品美女久久7777777| 亚洲毛片在线观看| 欧美日韩成人一区二区三区| 91久久精品网| 中日韩高清电影网| 欧美午夜精品理论片a级大开眼界| 亚洲精品中文字幕有码专区| 艳妇臀荡乳欲伦亚洲一区| 欧美日韩ab| 亚洲一区三区在线观看| 欧美在线资源| 一区二区三区无毛| 欧美国产1区2区| 一本色道久久综合亚洲二区三区| 亚洲综合二区| 国产日韩一区欧美| 狼狼综合久久久久综合网 | 欧美一区二区三区四区在线观看地址| 欧美天堂在线观看| 午夜免费日韩视频| 美女精品视频一区| 日韩午夜在线观看视频| 欧美色精品天天在线观看视频 | 久久久久久久一区二区| 欧美大尺度在线| 国产精品99久久久久久人| 国产精品一区二区男女羞羞无遮挡| 亚洲欧美在线播放| 亚洲国产免费| 欧美一区二区三区啪啪| 在线观看日韩国产| 国产精品扒开腿爽爽爽视频| 欧美在线观看www| 亚洲欧洲综合另类在线| 午夜免费在线观看精品视频| 影音先锋久久精品| 欧美日韩综合视频网址| 久久大综合网| 日韩一级网站| 免费视频一区二区三区在线观看| 制服诱惑一区二区| 亚洲电影在线播放| 国产伦精品一区二区三区| 欧美不卡一区| 欧美一区二区视频97| 亚洲免费黄色| 欧美黄色一区二区| 久久久91精品国产一区二区精品| 99成人精品| 亚洲国产另类精品专区| 蜜桃久久av一区| 欧美激情中文字幕乱码免费| 亚洲最黄网站| 激情综合亚洲| 国产精品视频免费一区| 欧美人成网站| 免费永久网站黄欧美| 亚洲免费一级电影| 亚洲免费观看高清完整版在线观看熊 | 亚洲欧美中文在线视频| 亚洲精品综合| 亚洲日本中文字幕免费在线不卡| 国产专区一区| 国产一区二区日韩| 国产精品自拍三区| 国产精品高潮呻吟| 欧美日韩不卡| 欧美日韩美女| 欧美护士18xxxxhd| 欧美激情精品久久久久久久变态| 久久亚洲精品欧美| 狂野欧美激情性xxxx欧美| 久久久国产视频91| 欧美在线www| 久久久国产午夜精品| 久久精品日产第一区二区三区| 欧美一区二区三区在线看| 欧美在线免费观看视频| 欧美有码视频| 欧美在线资源| 久久天天狠狠| 美女久久网站| 欧美精品激情| 欧美视频在线一区| 国产精品伊人日日| 国际精品欧美精品| 亚洲国产精品v| 亚洲美女视频在线观看| 一卡二卡3卡四卡高清精品视频| 一本色道久久综合亚洲精品婷婷| 夜夜嗨av色综合久久久综合网 | 亚洲国产中文字幕在线观看| 亚洲电影在线观看| 日韩视频一区二区三区| 国产精品99久久久久久久女警| 亚洲综合精品四区| 久久精品国产亚洲高清剧情介绍| 久久婷婷国产综合国色天香| 欧美激情小视频| 一本一本久久a久久精品综合麻豆| 中文一区二区| 久久精品系列| 欧美日韩精品一本二本三本| 欧美日韩亚洲精品内裤| 国产精品亚洲视频| 在线成人激情| 一区二区三区四区五区精品视频| 亚洲一区中文| 麻豆精品精品国产自在97香蕉| 免费h精品视频在线播放| 亚洲欧洲精品一区二区| 在线亚洲高清视频| 久久国产夜色精品鲁鲁99| 欧美aⅴ一区二区三区视频| 欧美性猛交xxxx乱大交退制版 | 很黄很黄激情成人| 亚洲欧洲日产国码二区| 欧美亚洲在线视频| 免费亚洲婷婷| 亚洲欧美成人一区二区在线电影 | 99综合在线| 久久久亚洲午夜电影| 欧美偷拍一区二区| 亚洲国产黄色| 久久久久久久久岛国免费| 亚洲免费观看高清完整版在线观看熊| 欧美专区第一页| 欧美四级剧情无删版影片| 亚洲国产精品v| 久久综合久久综合久久综合| 中文一区二区|