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

天行健 君子當自強而不息

Working with Maps and Levels(10)

Continue now with the cBarrier class declaration:

When you need to assign a mesh to a barrier, use the set_mesh function, passing the
barrier’s identification number to set, as well as cMesh objects to use.
For setting an animation for a barrier, you pass the barrier’s
identification number, cAnimation object, the name of the animation to use, and the
time the animation is set (using a timer function such as timeGetTime).

You need to assign meshes and animations.
Each barrier has a dedicated cObject to use for orientation, but first a mesh must be
assigned via the set_mesh function. Animations are sure to follow using the set_anim
function. Take a look at each of the functions responsible for setting those meshes
and animations.

After you've loaded or created barriers, assign the meshes by their respective barrier
identification numbers. Notice that the set_anim function is just like the
cObject::set_anim_set function—you have the name of the animation and the starting
time of the animation.

Both functions simply scan through the linked list of barriers looking for a matching
identification number.

    void set_mesh(long id, cMesh* mesh)
    {
        
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
        {
            
if(bar->id == id)            
                bar->
object.create(mesh);
        }
    }

    
void set_anim(long id, cAnimation* anim, pcstr name, long start_time)
    {
        
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
        {
            
if(bar->id == id)            
                bar->
object.set_anim_set(anim, name, start_time);            
        }
    }

After you assign a mesh and animation, you can render a barrier to the display using
the following render function. The render function takes as arguments the current
time to update the animations (again using timeGetTime) and the viewing frustum to
use for clipping out the barriers that are out of the viewpoint.

The only other exclusive function in cBarrier (as opposed to cTrigger) is Render,
which takes a time value that is used to update the barriers’ animations and a viewing
frustum that is used to clip out unseen barrier objects. Take a look at the render
function code:

void cBarrier::render(ulong time_now, cFrustum* frustum)
{
    
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
    {
        cObject* 
object = &bar->object;

        
float radius;
        
object->get_bounds(NULL, NULL, NULL, NULL, NULL, NULL, &radius);

        
if(frustum->is_sphere_in(bar->x_pos, bar->y_pos, bar->z_pos, radius))
        {
            
object->move(bar->x_pos, bar->y_pos, bar->z_pos);
            
object->rotate(bar->x_rot, bar->y_rot, bar->z_rot);

            
object->update_anim(time_now, true);
            
object->render();
        }
    }
}

In the preceding render function, the linked list of barriers is scanned, and for each
barrier, a frustum check is performed. If a barrier is in the view, its respective animation
is updated and the mesh is rendered.

When it comes time to start adding barriers to the linked list, the cBarrier class
comes packed with as many functions to do so as cTrigger.
 

public:

    
void add_sphere(long id, bool enabled,
                    
float x_pos,  float y_pos,  float z_pos,
                    
float x_rot,  float y_rot,  float z_rot,
                    
float cx_pos, float cy_pos, float cz_pos,
                    
float radius)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        bar->x1     = cx_pos;
        bar->y1     = cy_pos;
        bar->z1     = cz_pos;
        bar->radius = radius * radius;
    }

    
void add_box(long id, bool enabled,
                 
float x_pos,  float y_pos,  float z_pos,
                 
float x_rot,  float y_rot,  float z_rot,
                 
float x_min,  float y_min,  float z_min,
                 
float x_max,  float y_max,  float z_max)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        
// setup barrier data (fix for min/max values)
        bar->x1 = min(x_min, x_max);
        bar->y1 = min(y_min, y_max);
        bar->z1 = min(z_min, z_max);
        bar->x2 = max(x_min, x_max);
        bar->y2 = max(y_min, y_max);
        bar->z2 = max(z_min, z_max);
    }

    
void add_cylinder(long id, bool enabled,
                      
float x_pos,  float y_pos,  float z_pos,
                      
float x_rot,  float y_rot,  float z_rot,
                      
float cx_pos, float cy_pos, float cz_pos,
                      
float radius, float height)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        bar->x1     = cx_pos;
        bar->y1     = cy_pos;
        bar->z1     = cz_pos;
        bar->radius = radius * radius;
        bar->y2     = height;
    }

    
void add_triangle(long id, bool enabled,
                      
float x_pos,  float y_pos,  float z_pos,
                      
float x_rot,  float y_rot,  float z_rot,
                      
float x1, float z1,
                      
float x2, float z2,
                      
float x3, float z3,
                      
float cy_pos, float height)
    {
        sBarrier* bar = add_barrier(BARRIER_SPHERE, id, enabled, x_pos, y_pos, z_pos, x_rot, y_rot, z_rot);

        bar->x1 = x1;
        bar->z1 = z1;
        bar->x2 = x2;
        bar->z2 = z2;
        bar->x3 = x3;
        bar->z3 = z3;
        bar->y1 = cy_pos;
        bar->y2 = height;
    }   

    
void remove(long id)
    {
        sBarrier* bar = m_root_barrier;

        
while(bar != NULL)
        {
            sBarrier* next_bar = bar->next;

            
if(bar->id == id)
            {
                
// remove from list

                
if(bar->prev)
                    bar->prev->next = bar->next;
                
else
                    m_root_barrier = bar->next;

                
if(bar->next)
                    bar->next->prev = bar->prev;

                bar->next = NULL;
                delete bar;

                m_num_barriers--;
            }

            bar = next_bar;
        }
    }

    
bool get_enable_state(long id)
    {
        
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
        {
            
if(bar->id == id)
                
return bar->enabled;
        }

        
return false;
    }

    
void enable(long id)
    {
        set_enable_state(id, 
true);
    }

    
void disable(long id)
    {
        set_enable_state(id, 
false);
    }

    
//////////////////////////////////////////////////////////////////////

public:
    
bool load(const char* filename);
    
bool save(const char* filename);

    
void render(ulong time_now, cFrustum* frustum);
    
long get_barrier(float x_pos, float y_pos, float z_pos);    
} *cBarrierPtr;


Other function:

bool cBarrier::load(const char* filename)
{
    free();     
// remove all current barriers

    FILE* fp = fopen(filename, "rb");
    
if(fp == NULL)
        
return false;

    
// start looping, reading in until EOF reached.
    for(;;)
    {
        
long id = get_next_long_2(fp);
        
if(id == -1)
            
break;

        
long type    = get_next_long_2(fp);
        
bool enabled = get_next_long_2(fp) ? true : false;   

        
// get coordinate and rotation
        float x_pos = get_next_float_2(fp);
        
float y_pos = get_next_float_2(fp);
        
float z_pos = get_next_float_2(fp);
        
float x_rot = get_next_float_2(fp);
        
float y_rot = get_next_float_2(fp);
        
float z_rot = get_next_float_2(fp);

        
float x1, y1, z1, x2, y2, z2, x3, z3, radius;

        
// read in rest depending on type
        switch(type)
        {
        
case BARRIER_SPHERE:
            x1     = get_next_float_2(fp);
            y1     = get_next_float_2(fp);
            z1     = get_next_float_2(fp);
            radius = get_next_float_2(fp);

            add_sphere(id, enabled, 
                       x_pos, y_pos, z_pos, x_rot, y_rot, z_rot, 
                       x1, y1, z1, radius);
            
break;

        
case BARRIER_BOX:
            x1 = get_next_float_2(fp);
            y1 = get_next_float_2(fp);
            z1 = get_next_float_2(fp);
            x2 = get_next_float_2(fp);
            y2 = get_next_float_2(fp);
            z2 = get_next_float_2(fp);

            add_box(id, enabled, 
                    x_pos, y_pos, z_pos, x_rot, y_rot, z_rot,
                    x1, y1, z1, x2, y2, z2);

            
break;

        
case BARRIER_CYLINDER:
            x1     = get_next_float_2(fp);
            y1     = get_next_float_2(fp);
            z1     = get_next_float_2(fp);
            radius = get_next_float_2(fp);
            y2     = get_next_float_2(fp);

            add_cylinder(id, enabled, 
                         x_pos, y_pos, z_pos, x_rot, y_rot, z_rot,
                         x1, y1, z1, radius, y2);

            
break;

        
case BARRIER_TRIANGLE:
            x1 = get_next_float_2(fp);
            z1 = get_next_float_2(fp);
            x2 = get_next_float_2(fp);
            z2 = get_next_float_2(fp);
            x3 = get_next_float_2(fp);
            z3 = get_next_float_2(fp);
            y1 = get_next_float_2(fp);
            y2 = get_next_float_2(fp);

            add_triangle(id, enabled, 
                         x_pos, y_pos, z_pos, x_rot, y_rot, z_rot,
                         x1, z1, x2, z2, x3, z3, y1, y2);

            
break;
    
        
default:    // some error occurred
            fclose(fp);
            free();
            
return false;
        }
    }

    fclose(fp);
    
return true;
}

/////////////////////////////////////////////////////////////////////////////////////////

bool cBarrier::save(const char* filename)
{
    
if(m_num_barriers == 0)
        
return false;

    FILE* fp = fopen(filename, "wb");
    
if(fp == NULL)
        
return false;

    
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
    {
        
int enabled = bar->enabled ? 1 : 0;

        
char buf[1024];

        sprintf(buf, "%lu %lu %lu %lf %lf %lf %lf %lf %lf",
                bar->id, bar->type, enabled,
                bar->x_pos, bar->y_pos, bar->z_pos,
                bar->x_rot, bar->y_rot, bar->z_rot);

        
// write out remaining data depending on type
        switch(bar->type)
        {
        
case BARRIER_SPHERE:
            fprintf(fp, "%s %lf %lf %lf %lf\r\n",
                    buf, bar->x1, bar->y1, bar->z1, bar->radius);

            
break;

        
case BARRIER_BOX:
            fprintf(fp, "%s %lf %lf %lf %lf %lf %lf\r\n",
                    buf, bar->x1, bar->y1, bar->z1, bar->x2, bar->y2, bar->z2);

            
break;

        
case BARRIER_CYLINDER:
            fprintf(fp, "%s %lf %lf %lf %lf %lf\r\n",
                    buf, bar->x1, bar->y1, bar->z1, bar->radius, bar->y2);

            
break;

        
case BARRIER_TRIANGLE:
            fprintf(fp, "%s %lf %lf %lf %lf %lf %lf %lf %lf\r\n",
                    buf,
                    bar->x1, bar->z1, bar->x2, bar->z2, bar->x3, bar->z3,
                    bar->y1, bar->y2);

            
break;
        }
    }

    fclose(fp);
    
return true;
}

/////////////////////////////////////////////////////////////////////////////////////////

long cBarrier::get_barrier(float x_pos, float y_pos, float z_pos)
{
    D3DXVECTOR2 norm_vec;

    
for(sBarrier* bar = m_root_barrier; bar != NULL; bar = bar->next)
    {
        
// only bother if enabled
        if(! bar->enabled)
            
continue;

        
float x_diff, y_diff, z_diff, dist;

        
switch(bar->type)
        {
        
case BARRIER_SPHERE:
            
// check distance from sphere
            x_diff = fabs(bar->x1 - x_pos);
            y_diff = fabs(bar->y1 - y_pos);
            z_diff = fabs(bar->z1 - z_pos);

            dist = x_diff * x_diff + y_diff * y_diff + z_diff * z_diff;

            
if(dist <= bar->radius)
                
return bar->id;
            
            
break;

        
case BARRIER_BOX:
            
// check if inside box
            if((x_pos >= bar->x1 && x_pos <= bar->x2) &&
               (y_pos >= bar->y1 && y_pos <= bar->y2) &&
               (z_pos >= bar->z1 && z_pos <= bar->z2))
            {
                
return bar->id;
            }

            
break;

        
case BARRIER_CYLINDER:
            
// first make sure within height bounds
            if(y_pos >= bar->y1 && y_pos <= bar->y1 + bar->y2)
            {
                
// check distance from cylinder
                x_diff = fabs(bar->x1 - x_pos);
                y_diff = fabs(bar->y1 - y_pos);
                z_diff = fabs(bar->z1 - z_pos);

                dist = x_diff * x_diff + y_diff * y_diff + z_diff * z_diff;

                
if(dist <= bar->radius)
                    
return bar->id;
            }

            
break;

        
case BARRIER_TRIANGLE:
            
// first make sure within height bounds
            if(y_pos >= bar->y1 && y_pos <= bar->y1 + bar->y2)
            {
                
// check if point in front of all lines

                // x1,z1 to x2,z2
                D3DXVec2Normalize(&norm_vec, &D3DXVECTOR2(bar->z2 - bar->z1, bar->x1 - bar->x2));

                
if(D3DXVec2Dot(&D3DXVECTOR2(x_pos - bar->x1, z_pos - bar->z1), &norm_vec) < 0)
                    
break;

                
// x2,z2 to x3,z3
                D3DXVec2Normalize(&norm_vec, &D3DXVECTOR2(bar->z3 - bar->z2, bar->x2 - bar->x3));

                
if(D3DXVec2Dot(&D3DXVECTOR2(x_pos - bar->x2, z_pos - bar->z2), &norm_vec) < 0)
                    
break;

                
// x3,z3 to x1,z1
                D3DXVec2Normalize(&norm_vec, &D3DXVECTOR2(bar->z1 - bar->z3, bar->x3 - bar->x1));

                
if(D3DXVec2Dot(&D3DXVECTOR2(x_pos - bar->x3, z_pos - bar->z3), &norm_vec) < 0)
                    
break;

                
return bar->id;
            }   

            
break;
        }
    }

    
return 0;   // means no barrier found
}

posted on 2007-12-10 14:11 lovedday 閱讀(257) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(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>
            伊人男人综合视频网| 99视频有精品| 久久久99久久精品女同性| 午夜视频在线观看一区二区三区| 国产日韩一区欧美| 欧美sm极限捆绑bd| 欧美国产先锋| 校园激情久久| 久久久久国产精品午夜一区| 亚洲精品欧美极品| 在线一区二区三区四区| 韩日精品视频一区| 亚洲韩国一区二区三区| 国产精品第三页| 久久婷婷国产综合精品青草| 欧美激情久久久久| 久久精品91| 欧美破处大片在线视频| 久久国产日本精品| 欧美精品在线视频观看| 久久精品中文字幕一区| 欧美久久久久久久久| 久久精品欧美日韩| 欧美日韩一区二区高清| 麻豆精品精品国产自在97香蕉| 欧美精品色网| 麻豆精品视频在线| 国产精品视频久久一区| 欧美韩国在线| 国产亚洲午夜高清国产拍精品| 亚洲激情视频网站| 在线观看福利一区| 亚洲欧美日韩在线| 中文一区二区| 欧美激情麻豆| 免费在线成人av| 国产婷婷色一区二区三区四区 | 国产欧美精品一区| 亚洲国产精品尤物yw在线观看| 国产亚洲欧美色| 亚洲视频电影在线| 一本大道久久精品懂色aⅴ| 久久久久国产精品一区| 久久精品国产免费| 国产精品hd| 一本大道久久精品懂色aⅴ| 91久久精品日日躁夜夜躁国产| 久久精品国产免费| 久久精品免费电影| 国产欧美日韩精品丝袜高跟鞋| 99热在线精品观看| 一区二区三区波多野结衣在线观看| 久久亚洲国产精品日日av夜夜| 久久高清免费观看| 国产一区二区毛片| 午夜视频在线观看一区二区| 欧美一级成年大片在线观看| 国产精品久久久久国产精品日日| 亚洲乱码国产乱码精品精| 亚洲精品一区二区三区在线观看| 久久综合国产精品台湾中文娱乐网| 久久久水蜜桃| 狠狠综合久久| 老司机午夜精品| 亚洲电影在线观看| 日韩一级黄色大片| 欧美日韩亚洲一区| 亚洲午夜国产一区99re久久 | 一区在线免费观看| 久久夜色精品国产噜噜av| 男人的天堂亚洲| 亚洲日本中文| 欧美日韩一区二区在线播放| 一区二区国产在线观看| 欧美在线视频全部完| 怡红院精品视频在线观看极品| 久久综合激情| 9i看片成人免费高清| 欧美在线日韩精品| 亚洲国产精品99久久久久久久久| 欧美精品一区二区精品网| 国产精品99久久99久久久二8| 午夜在线精品| 在线看视频不卡| 欧美精品一区在线| 亚洲欧洲av一区二区三区久久| 久久男人av资源网站| 亚洲免费大片| 国产性色一区二区| 蜜桃av久久久亚洲精品| 一区二区三区蜜桃网| 久久综合国产精品台湾中文娱乐网| 亚洲激情亚洲| 国产欧美综合一区二区三区| 久久资源在线| 亚洲在线播放电影| 亚洲国产1区| 欧美自拍偷拍午夜视频| 亚洲精品一区二区三区在线观看 | 久久久精彩视频| 亚洲精选成人| 久久一区视频| 亚洲资源在线观看| 亚洲国产精品精华液网站| 国产精品免费aⅴ片在线观看| 久久久久久久综合色一本| 99热这里只有精品8| 美女脱光内衣内裤视频久久网站| 亚洲自拍电影| 日韩视频免费观看高清完整版| 国产欧美日韩一区二区三区| 欧美日韩八区| 毛片一区二区三区| 欧美在线三区| 亚洲欧美自拍偷拍| 亚洲视频导航| 99视频精品全部免费在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩免费高清| 欧美a级大片| 久久久另类综合| 午夜精品亚洲| 亚洲午夜国产一区99re久久| 日韩午夜激情电影| 亚洲精品乱码久久久久久久久| 免费成人av在线看| 久久亚洲精品一区二区| 久久激情一区| 久久精品青青大伊人av| 亚洲欧美综合精品久久成人| 亚洲一区日本| 亚洲亚洲精品在线观看| 一区二区高清| 一区二区免费看| 一本色道久久综合亚洲91| 亚洲理论电影网| 日韩视频在线观看| 99视频国产精品免费观看| 亚洲精品社区| 亚洲另类自拍| 夜夜嗨av一区二区三区| 一区二区三区高清不卡| 一本色道久久88亚洲综合88| 一区二区日本视频| 亚洲一区二区三区在线| 亚洲男人影院| 欧美专区日韩视频| 久久久免费精品| 欧美v日韩v国产v| 亚洲国产日韩欧美在线99 | 久久黄金**| 美国十次了思思久久精品导航| 欧美成人精品不卡视频在线观看| 欧美成人视屏| 99亚洲一区二区| 亚洲欧美日韩精品久久| 久久午夜激情| 欧美日本久久| 国产欧美日韩亚洲一区二区三区| 黄色在线一区| 日韩亚洲综合在线| 性欧美videos另类喷潮| 免费短视频成人日韩| 亚洲国产欧美国产综合一区| 一本久久精品一区二区| 欧美一区二区三区在线看| 蜜臀a∨国产成人精品| 欧美日韩一区二区在线播放| 国产亚洲精品久久久久婷婷瑜伽| 尹人成人综合网| 亚洲一区免费看| 美日韩丰满少妇在线观看| 亚洲日本理论电影| 欧美一区免费视频| 欧美精选在线| 极品尤物久久久av免费看| 夜夜嗨av一区二区三区中文字幕 | 91久久精品久久国产性色也91| 在线中文字幕一区| 久久伊人一区二区| 欧美三日本三级三级在线播放| 韩国精品在线观看| 亚洲午夜精品久久| 免费在线看成人av| 亚洲午夜久久久久久尤物 | 免费成人av在线看| 国产伦精品一区二区三| 亚洲美女av网站| 久久婷婷成人综合色| 亚洲一区二区三区在线看| 蜜桃av综合| 极品尤物一区二区三区| 欧美一区二区三区精品电影| 亚洲欧洲精品一区二区三区波多野1战4| 午夜视黄欧洲亚洲| 国产精品日韩欧美一区| 99视频精品| 亚洲精品国产精品久久清纯直播| 久久精品国产一区二区三| 国产伦一区二区三区色一情|