LOD.CPP
上传用户:hjbgzhh
上传日期:2013-03-07
资源大小:295k
文件大小:7k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Lod.cpp: implementation of the CLod class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MyLOD.h"
  6. #include "Lod.h"
  7. #include "LandTex.h"
  8. #include <math.h>
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. extern int quadtree[];
  18. extern int location[];
  19. extern int lod_level;
  20. extern CLandTex lt;
  21. extern COLOUR *colour_map; 
  22. extern int *y;
  23. CLod::CLod()
  24. {
  25. }
  26. CLod::~CLod()
  27. {
  28. }
  29. void CLod::reset_quad_tree(void) 
  30. {
  31. int i;
  32.    for(i=0; i<(QUAD_MAP * QUAD_MAP); i++) 
  33.    {
  34.       quadtree[i] = UNKNOWN;
  35.    }
  36. }
  37. void CLod::setup_quadtree(int x, int z, int width) 
  38. {
  39.    int width2;
  40.    int v1[3];
  41.    v1[0] = x;
  42.    v1[2] = z;
  43.    width2 = width / 2;
  44.    if((width > 1) && DISTANCE(v1, location) < width * lod_level) 
  45.    {
  46.       quadtree[IX_QT(x, z)] = NODE_POINT;
  47.       quadtree[IX_QT(x - width2, z - width2)] = EDGE_POINT;
  48.       quadtree[IX_QT(x + width2, z - width2)] = EDGE_POINT;
  49.       quadtree[IX_QT(x - width2, z + width2)] = EDGE_POINT;
  50.       quadtree[IX_QT(x + width2, z + width2)] = EDGE_POINT;
  51.       setup_quadtree(x - width2, z - width2, width2);
  52.       setup_quadtree(x + width2, z - width2, width2);
  53.       setup_quadtree(x - width2, z + width2, width2);
  54.       setup_quadtree(x + width2, z + width2, width2);
  55.    }
  56.    else 
  57.    {
  58.       quadtree[IX_QT(x, z)] = EDGE_POINT;
  59.    }
  60. }
  61. void CLod::draw(int x, int z, int width, int direction) 
  62. {
  63. int width2;
  64. if(width > 1) 
  65. {
  66. if(width > 16) {
  67. glBindTexture(GL_TEXTURE_2D, lt.texture_name[(int)((x) / 64)][(int)((z) / 64)]);
  68. }
  69.     width2 = width / 2;
  70.     if(quadtree[IX_QT(x, z)] == NODE_POINT) {
  71. // NORTH
  72. if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT &&
  73. quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT) 
  74. {
  75. if(quadtree[IX_QT(x, z - width*2)] == NODE_POINT || (z-width)%MAP==0)
  76. {
  77. draw_point(x, z, width, NORTH_L);
  78. draw_point(x, z, width, NORTH_R);
  79. }
  80. else
  81. {
  82. draw_point(x, z, width, NORTH);
  83. }
  84. }
  85. else if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT) 
  86. {
  87. draw_point(x, z, width, NORTH_L);
  88. }
  89. else if(quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT) 
  90. {
  91. draw_point(x, z, width, NORTH_R);
  92. }
  93. // SOUTH
  94. if(quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT &&
  95. quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) 
  96. {
  97. if(quadtree[IX_QT(x, z + width*2)] == NODE_POINT || (z+width)%MAP==0)
  98. {
  99. draw_point(x, z, width, SOUTH_L);
  100. draw_point(x, z, width, SOUTH_R);
  101. }
  102. else
  103. {
  104. draw_point(x, z, width, SOUTH);
  105. }
  106. }
  107. else if(quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT) 
  108. {
  109. draw_point(x, z, width, SOUTH_L);
  110. }
  111. else if(quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) 
  112. {
  113. draw_point(x, z, width, SOUTH_R);
  114. }
  115. // EAST
  116. if(quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT &&
  117. quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) {
  118. if(quadtree[IX_QT(x + width*2, z)] == NODE_POINT || (x+width)%MAP==0) {
  119. draw_point(x, z, width, EAST_T);
  120. draw_point(x, z, width, EAST_B);
  121. }
  122.             else {
  123. draw_point(x, z, width, EAST);
  124.             }
  125.          }
  126.          else if(quadtree[IX_QT(x + width2, z - width2)] == EDGE_POINT) {
  127. draw_point(x, z, width, EAST_T);
  128.          }
  129.          else if(quadtree[IX_QT(x + width2, z + width2)] == EDGE_POINT) {
  130. draw_point(x, z, width, EAST_B);
  131.          }
  132.          // WEST
  133. if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT &&
  134. quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT) {
  135. if(quadtree[IX_QT(x - width*2, z)] == NODE_POINT || (x-width)%MAP==0) {
  136. draw_point(x, z, width, WEST_T);
  137. draw_point(x, z, width, WEST_B);
  138. }
  139.             else {
  140. draw_point(x, z, width, WEST);
  141.             }
  142.          }
  143.          else if(quadtree[IX_QT(x - width2, z - width2)] == EDGE_POINT) {
  144. draw_point(x, z, width, WEST_T);
  145.          }
  146.          else if(quadtree[IX_QT(x - width2, z + width2)] == EDGE_POINT) {
  147. draw_point(x, z, width, WEST_B);
  148.          }
  149.       }
  150.       else {
  151. return;
  152.       }
  153.       draw(x - width2, z - width2, width2, NW);
  154.       draw(x + width2, z - width2, width2, NE);
  155.       draw(x - width2, z + width2, width2, SW);
  156.       draw(x + width2, z + width2, width2, SE);
  157.    }
  158. }
  159. // 纹理形式的三角形绘制函数
  160. void CLod::triangle1(int x1, int z1, int x2, int z2, int x3, int z3) 
  161. {
  162. glBegin(GL_TRIANGLES);
  163. glTexCoord2f(x1/(texScale), z1/(texScale));
  164. setColor(x1, z1);
  165. setVertex(x1, z1);
  166. glTexCoord2f(x2/(texScale), z2/(texScale));
  167. setColor(x2, z2);
  168. setVertex(x2, z2);
  169. glTexCoord2f(x3/(texScale), z3/(texScale));
  170. setColor(x3, z3);
  171. setVertex(x3, z3);
  172. glEnd();
  173. }
  174. // 线框形式的三角形绘制函数
  175. void CLod::triangle2(int x1, int z1, int x2, int z2, int x3, int z3) 
  176. {
  177. glBegin(GL_LINE_LOOP);
  178. setVertex(x1, z1);
  179. setVertex(x2, z2);
  180. setVertex(x3, z3);
  181. glEnd();
  182. }
  183. void CLod::draw_point(int x, int z, int width, int direction) 
  184. {
  185. switch(direction) {
  186. case NORTH:
  187. if(m_bFlag)
  188. triangle1(x, z, x + width, z - width, x - width, z - width);
  189. else
  190. triangle2(x, z, x + width, z - width, x - width, z - width);
  191. return;
  192. case SOUTH:
  193. if(m_bFlag)
  194. triangle1(x, z, x - width, z + width, x + width, z + width);
  195. else
  196. triangle2(x, z, x - width, z + width, x + width, z + width);
  197. return;
  198. case EAST:
  199. if(m_bFlag)
  200. triangle1(x, z, x + width, z + width, x + width, z - width);
  201. else
  202. triangle2(x, z, x + width, z + width, x + width, z - width);
  203. return;
  204. case WEST:
  205. if(m_bFlag)
  206. triangle1(x, z, x - width, z - width, x - width, z + width);
  207. else
  208. triangle2(x, z, x - width, z - width, x - width, z + width);
  209. return; 
  210. case NORTH_L:
  211. if(m_bFlag)
  212. triangle1(x, z, x, z - width, x - width, z - width);
  213. else
  214. triangle2(x, z, x, z - width, x - width, z - width);
  215. return;
  216. case NORTH_R:
  217. if(m_bFlag)
  218. triangle1(x, z, x + width, z - width, x, z - width);
  219. else
  220. triangle2(x, z, x + width, z - width, x, z - width);
  221. return;
  222. case SOUTH_L:
  223. if(m_bFlag)
  224. triangle1(x, z, x - width, z + width, x, z + width);
  225. else
  226. triangle2(x, z, x - width, z + width, x, z + width);
  227. return;
  228. case SOUTH_R:
  229. if(m_bFlag)
  230. triangle1(x, z, x, z + width, x + width, z + width);
  231. else
  232. triangle2(x, z, x, z + width, x + width, z + width);
  233. return;
  234. case EAST_T:
  235. if(m_bFlag)
  236. triangle1(x, z, x + width, z, x + width, z - width);
  237. else
  238. triangle2(x, z, x + width, z, x + width, z - width);
  239. return;
  240. case EAST_B:
  241. if(m_bFlag)
  242. triangle1(x, z, x + width, z + width, x + width, z);
  243. else
  244. triangle2(x, z, x + width, z + width, x + width, z);
  245. return;
  246. case WEST_T:
  247. if(m_bFlag)
  248. triangle1(x, z, x - width, z - width, x - width, z);
  249. else
  250. triangle2(x, z, x - width, z - width, x - width, z);
  251. return;
  252. case WEST_B:
  253. if(m_bFlag)
  254. triangle1(x, z, x - width, z, x - width, z + width);
  255. else
  256. triangle2(x, z, x - width, z, x - width, z + width);
  257. return;
  258. default:
  259. break;
  260. };
  261. }
  262. void CLod::setColor(int x, int z) 
  263. {
  264. glColor3ub(colour_map[IX(x, z)].r, colour_map[IX(x, z)].g, colour_map[IX(x, z)].b);
  265. }
  266. void CLod::setVertex(int x, int z) 
  267. {
  268. glVertex3f((x << SHIFT), y[IX(x, z)] * 8, (z << SHIFT));
  269. }