亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? preprocess_world.cpp

?? 國外游戲開發者雜志2003年第七期配套代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
#include "framework.h"
#include "make_world.h"

#include <stdio.h>
#include <stdlib.h>

#include "seam_database.h"
#include "mesh.h"
#include "mesh_chopper.h"
#include "mesh_seam.h"
#include "tangent_frames.h"
#include <float.h>  // For FLT_MAX and FLT_MIN

#include "mesh_reducer.h"
#include "mesh_topology_handler.h"
#include "mesh_builder.h"
#include "error_quadric.h"
#include "covariance.h"

#include <math.h>  // For sqrtf

const int TRIANGLE_MAXIMUM = 6000;
    
void find_bounding_box(Triangle_List_Mesh *mesh, Vector3 *bbox_min, Vector3 *bbox_extents);


struct World_Processor {
    World_Processor();
    ~World_Processor();

    int next_block_id;
    Seam_Database *construction_database;
    World_Block *root;

    World_Block *chop_mesh(Triangle_List_Mesh *mesh,
                           Plane3 *planes, int num_planes);
    void finish_subdivide_phase();
    void do_merges();
    void recompute_leaf_distances(World_Block *block);

  protected:
    void block_init_for_subdivide_step(World_Block *block, Triangle_List_Mesh *mesh);
    void localize_block(World_Block *block);
    void chop_leaves(World_Block *root);
    void cleanup_non_root_blocks(World_Block *block);

    void do_single_rewrite(World_Block *root,
                           Mesh_Seam *seam, 
                           World_Block *block_a,
                           World_Block *block_b,
                           Chopped_Result *result_a,
                           Chopped_Result *result_b);
    void do_rewrite_rules(World_Block *root,
                          World_Block *block_a,
                          World_Block *block_b,
                          Chopped_Result *result_a,
                          Chopped_Result *result_b);

    void do_recursive_merge(World_Block *root);
    void unmark_blocks(World_Block *block);
};

void sanity_check(Mesh_Seam *seam) {
    int i;
    for (i = 0; i < seam->num_faces * 3; i++) {
        Seam_Index *index = &seam->indices[i];
        World_Block *block = seam->block_membership[index->which_mesh];
        assert(index->vertex_index < block->mesh->num_vertices);
    }
}

void scale_mesh(Triangle_List_Mesh *mesh, float factor) {
    int i;
    for (i = 0; i < mesh->num_vertices; i++) {
        mesh->vertices[i] *= factor;
    }
}

#include "quake3_bsp.h"

int get_num_triangles(BSP_BIQUADRATIC_PATCH *patch) {
    int t = patch->tesselation;
    return t*t*2;
}

void do_patch(Triangle_List_Mesh *mesh, int triangle_index, BSP_PATCH *patch) {

}

Triangle_List_Mesh *load_quake() {
    const int CURVE_TESSELATION = 8;

    BSP *bsp = new BSP();
//    bool success = bsp->load("data\\test1.bsp", CURVE_TESSELATION);
    bool success = bsp->load("hal9000_b_ta.bsp", CURVE_TESSELATION);
    if (!success) {
        printf("File load error.  Aborting!\n");
        exit(1);
    }

    assert(success);

    int num_faces = bsp->numPolygonFaces;
    int num_polyface_triangles = 0;
    int num_patch_triangles = 0;
    int num_mesh_face_triangles = 0;

    int i;
    for (i = 0; i < bsp->numPolygonFaces; i++) {
        int nvertices = bsp->polygonFaces[i].numVertices;
        assert(nvertices >= 3);
        num_polyface_triangles += nvertices - 2;
    }

    for (i = 0; i < bsp->numMeshFaces; i++) {
        BSP_MESH_FACE *face = &bsp->meshFaces[i];
        num_mesh_face_triangles += face->numMeshIndices / 3;
    }


    int j;
    for (i = 0; i < bsp->numPatches; i++) {
        BSP_PATCH *patch = &bsp->patches[i];

        for (j = 0; j < patch->numQuadraticPatches; j++) {
            num_patch_triangles += get_num_triangles(&patch->quadraticPatches[j]);
        }
    }

    int num_triangles = num_polyface_triangles + num_patch_triangles + num_mesh_face_triangles;

    Mesh_Builder builder(num_triangles * 3, num_triangles);
    for (i = 0; i < bsp->numTextures; i++) {
        Mesh_Material_Info *info = new Mesh_Material_Info;
        info->name = strdup(bsp->loadTextures[i].name);
        builder.add_material(info);
    }


    for (i = 0; i < bsp->numVertices; i++) {
        Vector3 position = bsp->vertices[i].position;
        float u = bsp->vertices[i].decalS;
        float v = bsp->vertices[i].decalT;
        
        builder.add_vertex(position, Vector2(u, v), Quaternion(0, 0, 0, 1));
    }

    for (i = 0; i < bsp->numPolygonFaces; i++) {
        int nvertices = bsp->polygonFaces[i].numVertices;
        int first_index = bsp->polygonFaces[i].firstVertexIndex;
        int material = bsp->polygonFaces[i].textureIndex;

        int j;
        for (j = 2; j < nvertices; j++) {
            int n0 = 0;
            int n1 = j-1;
            int n2 = j;

            // Flip the triangle's clockwiseness...

            builder.add_triangle(first_index + n0, first_index + n2,
                                 first_index + n1, material);
        }
    }


    for (i = 0; i < bsp->numPatches; i++) {
        BSP_PATCH *patch = &bsp->patches[i];
        int material = patch->textureIndex;

        for (j = 0; j < patch->numQuadraticPatches; j++) {
            BSP_BIQUADRATIC_PATCH *quadratic = &patch->quadraticPatches[j];
            
            int t = quadratic->tesselation;
            int num_vertices = (t+1)*(t+1);
            
            int vertex_offset = builder.num_vertices;

            int k;
            for (k = 0; k < num_vertices; k++) {
                BSP_VERTEX *vertex = &quadratic->vertices[k];
                builder.add_vertex(vertex->position,
                                   Vector2(vertex->decalS, vertex->decalT), Quaternion(0, 0, 0, 1));
            }


            int num_triangles_each_row = 2*t;

            int row;
            for (row = 0; row < t; row++) {
                int point;
                for (point = 0; point < t; point++) {
                    int n0 = row*(t+1)+point;
                    int n1 = (row+1)*(t+1)+point;
                    int n2 = n1 + 1;
                    int n3 = n0 + 1;

                    n0 += vertex_offset;
                    n1 += vertex_offset;
                    n2 += vertex_offset;
                    n3 += vertex_offset;

                    builder.add_triangle(n0, n1, n2, material);
                    builder.add_triangle(n0, n2, n3, material);
                }
            }
        }
    }



    for (i = 0; i < bsp->numMeshFaces; i++) {
        BSP_MESH_FACE *face = &bsp->meshFaces[i];
        int material = face->textureIndex;

        int k;
        for (k = 0; k < face->numMeshIndices; k += 3) {
            int n0 = bsp->meshIndices[face->firstMeshIndex + k];
            int n1 = bsp->meshIndices[face->firstMeshIndex + k + 1];
            int n2 = bsp->meshIndices[face->firstMeshIndex + k + 2];
            
            n0 += face->firstVertexIndex;
            n1 += face->firstVertexIndex;
            n2 += face->firstVertexIndex;

            builder.add_triangle(n0, n2, n1, material);
        }
    }


    printf("\nBuild mesh\n");

    Triangle_List_Mesh *mesh = builder.build_mesh();
    scale_mesh(mesh, 1.0f / 12.0f);

       
    Tangent_Frame_Maker maker;
    maker.compute_tangent_frames(mesh);
    delete [] mesh->tangent_frames;
    mesh->tangent_frames = maker.tangent_frames;
    maker.tangent_frames = NULL;

    return mesh;
}

void World_Processor::block_init_for_subdivide_step(World_Block *block, Triangle_List_Mesh *mesh) {
    find_bounding_box(mesh,
                      &block->bounding_box_corner,
                      &block->bounding_box_extents);

    block->position = Vector3(0, 0, 0);

    block->mesh = mesh;
    block->block_id = (Block_Identifier)(next_block_id++);
}


void World_Processor::localize_block(World_Block *block) {
    Vector3 position = block->bounding_box_corner + block->bounding_box_extents * 0.5f;

    block->bounding_box_corner -= position;
    block->position = position;

    int i;
    for (i = 0; i < block->mesh->num_vertices; i++) {
        block->mesh->vertices[i] -= position;
    }
}


void get_bounding_points(World_Block *root, Vector3 results[8]) {
    Vector3 p0 = root->position + root->bounding_box_corner;
    Vector3 p1 = p0 + root->bounding_box_extents;

    results[0] = Vector3(p0.x, p0.y, p0.z);
    results[1] = Vector3(p1.x, p0.y, p0.z);
    results[2] = Vector3(p1.x, p1.y, p0.z);
    results[3] = Vector3(p0.x, p1.y, p0.z);
    results[4] = Vector3(p0.x, p0.y, p1.z);
    results[5] = Vector3(p1.x, p0.y, p1.z);
    results[6] = Vector3(p1.x, p1.y, p1.z);
    results[7] = Vector3(p0.x, p1.y, p1.z);
}

bool block_crosses_plane(World_Block *root, Plane3 *plane) {
    Vector3 bounding_points[8];
    get_bounding_points(root, bounding_points);

    float dot_min = FLT_MAX;
    float dot_max = FLT_MIN;

    int i;
    for (i = 0; i < 8; i++) {
        float dot = plane_dot(plane, &bounding_points[i]);
        if (dot < dot_min) dot_min = dot;
        if (dot > dot_max) dot_max = dot;
    }

    if ((dot_min < 0) && (dot_max > 0)) return true;
    return false;
}

void World_Processor::cleanup_non_root_blocks(World_Block *block) {
    if (block->num_children) {
        block->block_search_marker = 1;
        delete block->mesh;
        block->mesh = NULL;
        
        int i;
        for (i = 0; i < block->num_children; i++) {
            cleanup_non_root_blocks(block->children[i]);
        }
    } else {
        block->block_search_marker = 0;
        localize_block(block);
    }
}

void World_Processor::unmark_blocks(World_Block *block) {
    block->block_search_marker = 0;
    int i;
    for (i = 0; i < block->num_children; i++) unmark_blocks(block->children[i]);
}

void World_Processor::finish_subdivide_phase() {
    printf("Cleanup non_root\n");
    cleanup_non_root_blocks(root);

    printf("Delete seams\n");
    construction_database->delete_seams_that_touch_marked_blocks();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99精品国产91久久来源| 国产一区二区三区四| 美女精品一区二区| a美女胸又www黄视频久久| 制服丝袜中文字幕一区| 国产欧美精品一区| 美女网站色91| 欧美日韩亚洲综合在线| 国产精品女主播av| 国产精品资源网站| 精品对白一区国产伦| 亚洲大片在线观看| 97精品视频在线观看自产线路二 | 粉嫩aⅴ一区二区三区四区五区| 在线精品视频免费播放| 国产精品久久久久久久裸模| 久久精品免费观看| 欧美一区二区三区四区五区| 亚洲综合区在线| 91小视频免费观看| 亚洲欧美自拍偷拍色图| 国产成人精品免费在线| 精品入口麻豆88视频| 日本亚洲三级在线| 制服丝袜一区二区三区| 亚洲国产毛片aaaaa无费看| 91在线视频播放| 自拍av一区二区三区| 国产成a人无v码亚洲福利| 久久久久国产精品厨房| 国产在线不卡一区| 久久久精品黄色| 国产高清久久久| 国产人妖乱国产精品人妖| 国产一区二区主播在线| 久久嫩草精品久久久久| 国产一区二区网址| 中文字幕欧美日本乱码一线二线| 国产永久精品大片wwwapp| 久久久久久亚洲综合| 粉嫩av一区二区三区粉嫩| 中文字幕免费不卡| jlzzjlzz亚洲女人18| 亚洲精品欧美激情| 欧美日韩精品一区二区三区四区| 亚洲国产精品欧美一二99| 欧美久久久久久久久中文字幕| 亚洲aⅴ怡春院| 91精品久久久久久久91蜜桃| 免费在线观看精品| 久久久精品国产免费观看同学| 国产一区二区视频在线| 中文字幕在线一区免费| 欧美在线免费观看视频| 久久精品国内一区二区三区| 精品国产sm最大网站免费看| 国产成人精品一区二| 亚洲视频在线观看一区| 欧美午夜视频网站| 免费高清在线一区| 中文字幕不卡在线观看| 91激情五月电影| 日韩av电影免费观看高清完整版在线观看 | 日韩电影在线一区| 久久先锋影音av| 99精品在线观看视频| 亚洲成av人片一区二区梦乃| 精品人在线二区三区| 99久久99久久综合| 免费在线观看一区| 亚洲丝袜精品丝袜在线| 日韩一卡二卡三卡国产欧美| 成人性生交大合| 日韩精品欧美精品| 国产精品狼人久久影院观看方式| 欧洲在线/亚洲| 国产精品一卡二| 亚洲在线观看免费| 国产欧美精品国产国产专区| 欧美午夜电影一区| 高清不卡一二三区| 麻豆精品久久精品色综合| 日韩美女啊v在线免费观看| 欧美一区二区三级| 91麻豆国产福利在线观看| 久久国产人妖系列| 亚洲综合久久av| 国产精品青草久久| 久久蜜桃香蕉精品一区二区三区| 在线观看av不卡| 91小视频在线免费看| 国产成人在线色| 蜜臀av一区二区在线免费观看| 亚洲欧美日韩一区二区三区在线观看 | 国产午夜精品久久| 欧美精品九九99久久| 色综合久久久网| 成人黄色国产精品网站大全在线免费观看 | 激情综合色播激情啊| 亚洲一区在线观看免费观看电影高清| 久久久精品免费观看| 91精品国产综合久久久久久久久久| 色呦呦一区二区三区| 国产成人在线视频播放| 国产老妇另类xxxxx| 美女爽到高潮91| 日日骚欧美日韩| 亚洲国产精品久久久久秋霞影院 | 日韩亚洲国产中文字幕欧美| 在线观看欧美日本| 色婷婷精品大在线视频| 99久久伊人网影院| 欧美亚洲国产一区二区三区| 日本黄色一区二区| 色乱码一区二区三区88| 91欧美激情一区二区三区成人| 丁香五精品蜜臀久久久久99网站| 激情丁香综合五月| 国产乱码精品一区二区三 | wwwwww.欧美系列| 精品国产一区二区亚洲人成毛片| 日韩视频一区二区三区 | 欧美日韩一区二区三区免费看| 色狠狠一区二区| 欧美三级午夜理伦三级中视频| 色婷婷激情综合| 欧美另类z0zxhd电影| 在线播放91灌醉迷j高跟美女| 欧美麻豆精品久久久久久| 欧美精品在线一区二区| 91精品中文字幕一区二区三区| 欧美一级免费观看| 26uuu欧美日本| 欧美经典一区二区三区| 中文字幕欧美一| 亚洲国产婷婷综合在线精品| 日日摸夜夜添夜夜添精品视频 | 国产精品久久久久久一区二区三区| 欧美国产日韩在线观看| 亚洲日穴在线视频| 午夜精品久久久久久久99水蜜桃| 美国av一区二区| 成人av免费网站| 欧美高清视频在线高清观看mv色露露十八 | 久久美女艺术照精彩视频福利播放| 久久这里只有精品视频网| 国产精品视频yy9299一区| 亚洲视频1区2区| 日本在线不卡视频| 高清在线成人网| 欧美日韩一区久久| 欧美韩国日本不卡| 五月婷婷久久丁香| 成人一区二区三区视频| 欧美性大战久久久| 国产清纯美女被跳蛋高潮一区二区久久w| 一区精品在线播放| 久久99久久久久久久久久久| 91丝袜美女网| 久久中文字幕电影| 亚洲福利视频一区| 成人福利在线看| 日韩欧美一级二级| 亚洲美女屁股眼交3| 韩国一区二区三区| 91行情网站电视在线观看高清版| 精品久久久久久亚洲综合网| 一区二区三区中文在线观看| 国产一区二区三区香蕉| 欧美视频一区二区三区在线观看| 久久精品无码一区二区三区| 亚洲福利电影网| 91亚洲大成网污www| 久久精品亚洲一区二区三区浴池| 亚洲国产aⅴ成人精品无吗| caoporm超碰国产精品| 久久久久久9999| 国产主播一区二区三区| 欧美一级午夜免费电影| 亚洲大片精品永久免费| 99在线精品观看| 中文字幕不卡在线播放| 国产成人av一区二区| 欧美tickle裸体挠脚心vk| 石原莉奈在线亚洲二区| 在线视频一区二区免费| 成人免费在线视频观看| 国产suv精品一区二区883| 欧美mv日韩mv亚洲| 美脚の诱脚舐め脚责91 | 亚洲人一二三区| eeuss鲁一区二区三区| 久久久噜噜噜久噜久久综合| 老司机一区二区| 日韩一区二区三区视频| 成人激情av网| 国产精品久久久久一区二区三区 | 99re这里都是精品| 国产精品久久网站| 99久久精品免费|