www.pudn.com > LodFiled.rar > LOD.CPP
#include#include #include #include #include "bmp_load.h" #include "lod.h" void draw_point(int , int , int , int); int quadtree[QUAD_MAP * QUAD_MAP]; int location[3]; int lod_level = 8; extern LAND_TEX lt; void reset_quad_tree(void) { int i; for(i=0; i<(QUAD_MAP * QUAD_MAP); i++) { quadtree[i] = UNKNOWN; } } void setup_quadtree(int x, int z, int width) { int width2; int v1[3]; v1[0] = x; v1[2] = z; width2 = width / 2; if((width > 1) && DISTANCE(v1, location) < width * lod_level) { quadtree[IX_QT(x, z)] = NODE_POINT; quadtree[IX_QT(x - width2, z - width2)] = EDGE_POINT; quadtree[IX_QT(x + width2, z - width2)] = EDGE_POINT; quadtree[IX_QT(x - width2, z + width2)] = EDGE_POINT; quadtree[IX_QT(x + width2, z + width2)] = EDGE_POINT; setup_quadtree(x - width2, z - width2, width2); setup_quadtree(x + width2, z - width2, width2); setup_quadtree(x - width2, z + width2, width2); setup_quadtree(x + width2, z + width2, width2); } else { quadtree[IX_QT(x, z)] = EDGE_POINT; } } void draw(int x, int z, int width, int direction) { int width2; if(width > 1) { if(width > 16) { glBindTexture(GL_TEXTURE_2D, lt.texture_name[(int)((x) / 64)][(int)((z) / 64)]); } width2 = width / 2; if(quadtree[IX_QT(x, z)] == NODE_POINT) { // NORTH if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT && quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT) { if(quadtree[IX_QT(x, z - width*2)] == NODE_POINT || (z-width)%MAP==0) { draw_point(x, z, width, NORTH_L); draw_point(x, z, width, NORTH_R); } else { draw_point(x, z, width, NORTH); } } else if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT) { draw_point(x, z, width, NORTH_L); } else if(quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT) { draw_point(x, z, width, NORTH_R); } // SOUTH if(quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT && quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) { if(quadtree[IX_QT(x, z + width*2)] == NODE_POINT || (z+width)%MAP==0) { draw_point(x, z, width, SOUTH_L); draw_point(x, z, width, SOUTH_R); } else { draw_point(x, z, width, SOUTH); } } else if(quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT) { draw_point(x, z, width, SOUTH_L); } else if(quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) { draw_point(x, z, width, SOUTH_R); } // EAST if(quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT && quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) { if(quadtree[IX_QT(x + width*2, z)] == NODE_POINT || (x+width)%MAP==0) { draw_point(x, z, width, EAST_T); draw_point(x, z, width, EAST_B); } else { draw_point(x, z, width, EAST); } } else if(quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT) { draw_point(x, z, width, EAST_T); } else if(quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) { draw_point(x, z, width, EAST_B); } // WEST if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT && quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT) { if(quadtree[IX_QT(x - width*2, z)] == NODE_POINT || (x-width)%MAP==0) { draw_point(x, z, width, WEST_T); draw_point(x, z, width, WEST_B); } else { draw_point(x, z, width, WEST); } } else if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT) { draw_point(x, z, width, WEST_T); } else if(quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT) { draw_point(x, z, width, WEST_B); } } else { return; } draw(x - width2, z - width2, width2, NW); draw(x + width2, z - width2, width2, NE); draw(x - width2, z + width2, width2, SW); draw(x + width2, z + width2, width2, SE); } }