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

3D图形编程

开发平台:

Visual C++

  1. // MyLODView.cpp : implementation of the CMyLODView class
  2. //
  3. #include "stdafx.h"
  4. #include "MyLOD.h"
  5. #include "MyLODDoc.h"
  6. #include "MyLODView.h"
  7. #include <math.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. CLandTex lt;
  14. int quadtree[QUAD_MAP * QUAD_MAP];
  15. int location[3];
  16. int lod_level=8;
  17. int *y; // 保存地形的高程数组
  18. COLOUR *colour_map; // 保存地形的颜色数值
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CMyLODView
  21. IMPLEMENT_DYNCREATE(CMyLODView, CView)
  22. BEGIN_MESSAGE_MAP(CMyLODView, CView)
  23. //{{AFX_MSG_MAP(CMyLODView)
  24. ON_WM_CREATE()
  25. ON_WM_DESTROY()
  26. ON_WM_SIZE()
  27. ON_WM_TIMER()
  28. ON_WM_KEYDOWN()
  29. //}}AFX_MSG_MAP
  30. // Standard printing commands
  31. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  32. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  33. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CMyLODView construction/destruction
  37. CMyLODView::CMyLODView()
  38. {
  39. // TODO: add construction code here
  40. bilinear_filtering = 1;
  41. wireframe_mode = -1;
  42. flying_mode = 1;
  43. detail_texture_mode = -1;
  44. mapX = 128, mapZ = 128; 
  45. speed = 0.0; // 移动速度初始化
  46. timer = 0.0, wTimer = 0.0;
  47. }
  48. CMyLODView::~CMyLODView()
  49. {
  50. }
  51. BOOL CMyLODView::PreCreateWindow(CREATESTRUCT& cs)
  52. {
  53. // TODO: Modify the Window class or styles here by modifying
  54. //  the CREATESTRUCT cs
  55. ////////////////////////////////////////////////////////////////
  56. //设置窗口类型
  57. cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
  58. ////////////////////////////////////////////////////////////////
  59. return CView::PreCreateWindow(cs);
  60. }
  61. /////////////////////////////////////////////////////////////////////////////
  62. // CMyLODView drawing
  63. void CMyLODView::OnDraw(CDC* pDC)
  64. {
  65. CMyLODDoc* pDoc = GetDocument();
  66. ASSERT_VALID(pDoc);
  67. // TODO: add draw code for native data here
  68. //////////////////////////////////////////////////////////////////
  69. RenderScene(); //渲染场景
  70. //////////////////////////////////////////////////////////////////
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CMyLODView printing
  74. BOOL CMyLODView::OnPreparePrinting(CPrintInfo* pInfo)
  75. {
  76. // default preparation
  77. return DoPreparePrinting(pInfo);
  78. }
  79. void CMyLODView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  80. {
  81. // TODO: add extra initialization before printing
  82. }
  83. void CMyLODView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  84. {
  85. // TODO: add cleanup after printing
  86. }
  87. /////////////////////////////////////////////////////////////////////////////
  88. // CMyLODView diagnostics
  89. #ifdef _DEBUG
  90. void CMyLODView::AssertValid() const
  91. {
  92. CView::AssertValid();
  93. }
  94. void CMyLODView::Dump(CDumpContext& dc) const
  95. {
  96. CView::Dump(dc);
  97. }
  98. CMyLODDoc* CMyLODView::GetDocument() // non-debug version is inline
  99. {
  100. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyLODDoc)));
  101. return (CMyLODDoc*)m_pDocument;
  102. }
  103. #endif //_DEBUG
  104. /////////////////////////////////////////////////////////////////////////////
  105. // CMyLODView message handlers
  106. int CMyLODView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  107. {
  108. if (CView::OnCreate(lpCreateStruct) == -1)
  109. return -1;
  110. // TODO: Add your specialized creation code here
  111. //////////////////////////////////////////////////////////////////
  112. //初始化OpenGL和设置定时器
  113. m_pDC = new CClientDC(this);
  114. SetTimer(1, 20, NULL);
  115. InitializeOpenGL(m_pDC);
  116. //////////////////////////////////////////////////////////////////
  117. Init();
  118. return 0;
  119. }
  120. void CMyLODView::OnDestroy() 
  121. {
  122. CView::OnDestroy();
  123. // TODO: Add your message handler code here
  124. /////////////////////////////////////////////////////////////////
  125. //删除调色板和渲染上下文、定时器
  126. ::wglMakeCurrent(0,0);
  127. ::wglDeleteContext( m_hRC);
  128. if (m_hPalette)
  129.     DeleteObject(m_hPalette);
  130. if ( m_pDC )
  131. {
  132. delete m_pDC;
  133. }
  134. KillTimer(1);
  135. /////////////////////////////////////////////////////////////////
  136. delete[] y;
  137. delete[] colour_map;
  138. m_Bmpload.destroy_bmp(detail_texture);
  139. }
  140. void CMyLODView::OnSize(UINT nType, int cx, int cy) 
  141. {
  142. CView::OnSize(nType, cx, cy);
  143. // TODO: Add your message handler code here
  144. /////////////////////////////////////////////////////////////////
  145. //添加窗口缩放时的图形变换函数
  146. glViewport(0,0,cx,cy);
  147. /////////////////////////////////////////////////////////////////
  148. winWidth=cx;
  149. winHeight=cy;
  150. }
  151. void CMyLODView::OnTimer(UINT nIDEvent) 
  152. {
  153. // TODO: Add your message handler code here and/or call default
  154. /////////////////////////////////////////////////////////////////
  155. //添加定时器响应函数和场景更新函数
  156. Invalidate(FALSE);
  157. /////////////////////////////////////////////////////////////////
  158. update_world(); 
  159. CView::OnTimer(nIDEvent);
  160. }
  161. /////////////////////////////////////////////////////////////////////
  162. //                   设置逻辑调色板
  163. //////////////////////////////////////////////////////////////////////
  164. void CMyLODView::SetLogicalPalette(void)
  165. {
  166.     struct
  167.     {
  168.         WORD Version;
  169.         WORD NumberOfEntries;
  170.         PALETTEENTRY aEntries[256];
  171.     } logicalPalette = { 0x300, 256 };
  172. BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
  173. BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
  174. BYTE blues[] = {0, 85, 170, 255};
  175.     for (int colorNum=0; colorNum<256; ++colorNum)
  176.     {
  177.         logicalPalette.aEntries[colorNum].peRed =
  178.             reds[colorNum & 0x07];
  179.         logicalPalette.aEntries[colorNum].peGreen =
  180.             greens[(colorNum >> 0x03) & 0x07];
  181.         logicalPalette.aEntries[colorNum].peBlue =
  182.             blues[(colorNum >> 0x06) & 0x03];
  183.         logicalPalette.aEntries[colorNum].peFlags = 0;
  184.     }
  185.     m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
  186. }
  187. //////////////////////////////////////////////////////////
  188. // 初始化openGL场景
  189. //////////////////////////////////////////////////////////
  190. BOOL CMyLODView::InitializeOpenGL(CDC* pDC)
  191. {
  192. m_pDC = pDC;
  193. SetupPixelFormat();
  194. //生成绘制描述表
  195. m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
  196. //置当前绘制描述表
  197. ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
  198. return TRUE;
  199. }
  200. //////////////////////////////////////////////////////////
  201. // 设置像素格式
  202. //////////////////////////////////////////////////////////
  203. BOOL CMyLODView::SetupPixelFormat()
  204. {
  205. PIXELFORMATDESCRIPTOR pfd = { 
  206.     sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小 
  207.     1,                                // 版本号 
  208.     PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图 
  209.     PFD_SUPPORT_OPENGL |              // 支持 OpenGL 
  210.     PFD_DOUBLEBUFFER,                 // 双缓存模式 
  211.     PFD_TYPE_RGBA,                    // RGBA 颜色模式 
  212.     24,                               // 24 位颜色深度 
  213.     0, 0, 0, 0, 0, 0,                 // 忽略颜色位 
  214.     0,                                // 没有非透明度缓存 
  215.     0,                                // 忽略移位位 
  216.     0,                                // 无累加缓存 
  217.     0, 0, 0, 0,                       // 忽略累加位 
  218.     32,                               // 32 位深度缓存     
  219.     0,                                // 无模板缓存 
  220.     0,                                // 无辅助缓存 
  221.     PFD_MAIN_PLANE,                   // 主层 
  222.     0,                                // 保留 
  223.     0, 0, 0                           // 忽略层,可见性和损毁掩模 
  224. }; 
  225. int pixelformat;
  226. pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式
  227. ::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式
  228. if(pfd.dwFlags & PFD_NEED_PALETTE)
  229. SetLogicalPalette(); //设置逻辑调色板
  230. return TRUE;
  231. }
  232. //////////////////////////////////////////////////////////
  233. // 场景绘制与渲染
  234. //////////////////////////////////////////////////////////
  235. BOOL CMyLODView::RenderScene() 
  236. {
  237. int i;
  238. int x, z;
  239. int aX, aZ;
  240. int r;
  241. float v1[3];
  242. float location_f[3];
  243. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  244. glViewport(0, 0, (GLsizei) winWidth, (GLsizei) winHeight);
  245. glMatrixMode(GL_PROJECTION);
  246. glLoadIdentity();
  247. gluPerspective(60.0, (GLfloat) winWidth/(GLfloat) winHeight, 1.0, ((M_SIZE + 4) * 2) << SHIFT);
  248. // 设置摄像机位置和观看的矢量
  249. glMatrixMode(GL_MODELVIEW);
  250. glLoadIdentity();
  251. gluLookAt (xpos, ypos, zpos, xpos+lookx, ypos+looky, zpos+lookz, 0.0, 1.0, 0.0);
  252. m_Lod.reset_quad_tree();
  253. m_Lod.setup_quadtree(128, 128, 128);
  254. if(wireframe_mode < 0) {
  255. glEnable(GL_TEXTURE_2D);
  256. }
  257. else {
  258. glColor3f(0.0, 0.0, 0.0);
  259. }
  260. m_Lod.draw(128, 128, 128, 0);  // 地形的绘制
  261. if((wireframe_mode < 0) && (flying_mode < 0) && (detail_texture_mode > 0)) 
  262. {
  263. glBindTexture(GL_TEXTURE_2D, texName[20]);
  264. glColor4f(1.0, 1.0, 1.0, 1.0);
  265. glEnable(GL_BLEND);
  266. glDisable(GL_DEPTH_TEST);
  267. glBegin(GL_QUADS);
  268. location_f[0] = xpos / COMP;
  269. location_f[2] = zpos / COMP;
  270. aX = mapX - mapX%2;
  271. aZ = mapZ - mapZ%2;
  272. for(x=aX-16; x<aX+16; x+=2) {
  273. for(z=aZ-16; z<aZ+16; z+=2) {
  274. v1[0] = x;
  275. v1[2] = z;
  276. glColor4f(1.0, 1.0, 1.0, 0.5 - DISTANCE(v1, location_f)/20.0f);
  277. glTexCoord2f(0.0, 0.0);
  278. m_Lod.setVertex(x, z); 
  279. v1[0] = x;
  280. v1[2] = z+2;
  281. glColor4f(1.0, 1.0, 1.0, 0.5 - DISTANCE(v1, location_f)/20.0f);
  282. glTexCoord2f(0.0, 1.0);
  283. m_Lod.setVertex(x, z+2); 
  284. v1[0] = x+2;
  285. v1[2] = z+2;
  286. glColor4f(1.0, 1.0, 1.0, 0.5 - DISTANCE(v1, location_f)/20.0f);
  287. glTexCoord2f(1.0, 1.0);
  288. m_Lod.setVertex(x+2, z+2); 
  289. v1[0] = x+2;
  290. v1[2] = z;
  291. glColor4f(1.0, 1.0, 1.0, 0.5 - DISTANCE(v1, location_f)/20.0f);
  292. glTexCoord2f(1.0, 0.0);
  293. m_Lod.setVertex(x+2, z); 
  294. }
  295. }
  296. glEnd();
  297. glEnable(GL_DEPTH_TEST);
  298. glDisable(GL_BLEND); 
  299. }
  300. r = M_SIZE << SHIFT;
  301. glDisable(GL_TEXTURE_2D);
  302. glBegin(GL_QUADS);
  303. for(i=0; i<256; i+=16) {
  304. glColor3f(0.12, 0.27, 0.7);
  305. glVertex3f(xpos + sin_t[(i + 16)&255] * r, (64 << SHIFT), zpos + cos_t[(i + 16)&255] * r);
  306. glColor3f(0.42, 0.57, 1.0);
  307. glVertex3f(xpos + sin_t[(i + 16)&255] * r, 0, zpos + cos_t[(i + 16)&255] * r);
  308. glColor3f(0.42, 0.57, 1.0);
  309. glVertex3f(xpos + sin_t[i] * r, 0, zpos + cos_t[i] * r);
  310. glColor3f(0.12, 0.27, 0.7);
  311. glVertex3f(xpos + sin_t[i] * r, (64 << SHIFT), zpos + cos_t[i] * r);
  312. }
  313. for(i=0; i<256; i+=16) {
  314. glColor3f(0.42, 0.57, 1.0);
  315. glVertex3f(xpos + sin_t[(i + 16)&255] * r, 0, zpos + cos_t[(i + 16)&255] * r);
  316. glColor3f(0.12, 0.27, 0.7);
  317. glVertex3f(xpos + sin_t[(i + 16)&255] * r, -(16 << SHIFT), zpos + cos_t[(i + 16)&255] * r);
  318. glColor3f(0.12, 0.27, 0.7);
  319. glVertex3f(xpos + sin_t[i] * r, -(16 << SHIFT), zpos + cos_t[i] * r);
  320. glColor3f(0.42, 0.57, 1.0);
  321. glVertex3f(xpos + sin_t[i] * r, 0, zpos + cos_t[i] * r);
  322. }
  323. glEnd();
  324. glFlush();
  325. ::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区
  326. return TRUE;
  327. }
  328. void CMyLODView::Init(void) 
  329. {
  330. GLfloat fogColor[] = {0.12, 0.27, 0.7, 1.0};
  331. GLfloat lightDiffuse[] = {1.0, 0.75, 0.5, 1.0};
  332. glClearColor(0.12, 0.27, 0.7, 1.0);
  333. for(int i=0; i<256; i++) {
  334. sin_t[i] = sin((i/128.0) * PI);
  335. cos_t[i] = cos((i/128.0) * PI);
  336. }
  337. initTerrain();  // 初始化地形数据
  338. xpos = (118) * COMP;
  339. ypos = 10.0;
  340. zpos = (125) * COMP;
  341. lookx = (120.0) * COMP;
  342. looky = (0.0) * COMP;
  343. lookz = (120.0) * COMP;
  344. speed = 0;
  345. update_world();
  346. glFogi(GL_FOG_MODE, GL_LINEAR);
  347. glFogfv(GL_FOG_COLOR, fogColor);
  348. glFogf(GL_FOG_DENSITY, 1);
  349. glFogf(GL_FOG_START, (M_SIZE/2)*0.1*COMP);
  350. glFogf(GL_FOG_END, (M_SIZE/2)*0.5*COMP);
  351. glGenTextures(100, texName);
  352. srand(1111111);
  353. randomTerrain();
  354. srand((unsigned)time(NULL));
  355. detail_texture = m_Bmpload.load_bitmap("DETAIL.BMP");
  356. glBindTexture(GL_TEXTURE_2D, texName[20]);
  357. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  358. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  359. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  360. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  361. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, detail_texture->w, detail_texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, detail_texture->data);
  362. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
  363. glLightfv(GL_LIGHT0, GL_AMBIENT, lightDiffuse);
  364. glEnable(GL_NORMALIZE);
  365. glEnable(GL_LIGHT0);
  366. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  367. glShadeModel(GL_SMOOTH);
  368. glDisable(GL_ALPHA_TEST);
  369. glDisable(GL_BLEND);
  370. glDisable(GL_CULL_FACE);
  371. glEnable(GL_DEPTH_TEST);
  372. glFrontFace(GL_CCW);
  373. glCullFace(GL_BACK);
  374. glEnable(GL_CULL_FACE);
  375. glEnable(GL_TEXTURE_2D);
  376. glEnable(GL_DITHER);
  377. m_Lod.m_bFlag=true;
  378. move(ROTATE, 2.6, 0);
  379. move(LOOKUP, -0.2, 0);
  380. }
  381. void CMyLODView::initTerrain(void) 
  382. {
  383. y = new int[M_SIZE*M_SIZE];
  384. if(!y) 
  385. {
  386. MessageBox("Unable to allocate memory for height map.","Error",MB_OK);
  387. }
  388. else 
  389. {
  390. MessageBox("Succesfully allocated memory for height map.","OK",MB_OK);
  391. }
  392. colour_map = new COLOUR[M_SIZE*M_SIZE];
  393. if(!colour_map) 
  394. {
  395. MessageBox("Unable to allocate memory for shadow map.","Error",MB_OK);
  396. }
  397. else 
  398. {
  399. MessageBox("Succesfully allocated memory for shadow map.","OK",MB_OK);
  400. }
  401. }
  402. void CMyLODView::randomTerrain(void) 
  403. {
  404. int x, z;
  405. int i, j;
  406. int bsize, csize;
  407. int rnd;
  408. for(i=0; i<(M_SIZE*M_SIZE); i++) {
  409. y[i] = 0;
  410. }
  411. bsize = M_SIZE;
  412. csize = M_SIZE/2;
  413. rnd = 256;
  414. while(csize > 0) {
  415. for(x=0; x<M_SIZE; x+=bsize) {
  416. for(z=0; z<M_SIZE; z+=bsize) {
  417. y[IX(x+csize, z+csize)] =   f4(y[IX(x, z)], y[IX(x+bsize, z)], y[IX(x+bsize, z+bsize)], y[IX(x, z+bsize)]) + rand()%(rnd+1) - (rnd/2);
  418. }
  419. }
  420. for(x=0; x<M_SIZE; x+=bsize) {
  421. for(z=0; z<M_SIZE; z+=bsize) {
  422. y[IX(x+csize, z)] = f4(y[IX(x, z)],
  423. y[IX(x+bsize, z)],
  424. y[IX(x+csize, z+csize)],
  425. y[IX(x+csize, z-csize)]) + (rand()%(rnd+1) - (rnd/2));
  426. }
  427. }
  428. for(x=0; x<M_SIZE; x+=bsize) {
  429. for(z=0; z<M_SIZE; z+=bsize) {
  430. y[IX(x, z+csize)] = f4(y[IX(x, z)],
  431. y[IX(x, z+bsize)],
  432. y[IX(x-csize, z+csize)],
  433. y[IX(x+csize, z+csize)]) + (rand()%(rnd+1) - (rnd/2));
  434. }
  435. bsize /= 2;
  436. csize /= 2;
  437. if(csize < 16)
  438. rnd /= 2;
  439. }
  440. for(i=0; i<M_SIZE*M_SIZE; i++) {
  441. if(y[i] < 0) {
  442. y[i] = 0;
  443. }
  444. for(j=0; j<4; j++) {
  445. x = rand()%M_SIZE;
  446. z = rand()%M_SIZE;
  447. for(i=0; i<100; i++) {
  448. x += rand()%17 - 8;
  449. z += rand()%17 - 8;
  450. y[IX(x, z)] = 1000; 
  451. }
  452. }
  453. // 高程数据的平滑处理
  454. for(j=0; j<8; j++) {
  455. for(x=0; x<M_SIZE; x++) {
  456. for(z=0; z<M_SIZE; z++) {
  457. i = y[IX(x-1, z-1)] +
  458. y[IX(x,   z-1)] +
  459. y[IX(x+1, z-1)] +
  460. y[IX(x-1, z)] + 
  461. y[IX(x,   z)] +
  462. y[IX(x+1, z)] +
  463. y[IX(x-1, z+1)] +
  464. y[IX(x,   z+1)] + 
  465. y[IX(x+1, z+1)];
  466. y[IX(x, z)] = i / 9;
  467. }
  468. }
  469. colorTerrain();
  470. }
  471. void CMyLODView::update_world(void)
  472. {
  473. timer += 0.05;
  474. wTimer += 0.0005;
  475. if(wTimer>1.0) {
  476. wTimer = 0.0;
  477. }
  478. move(FORWARD, speed, 1);
  479. }
  480. void CMyLODView::move(int type, GLfloat amount, int update)
  481. {
  482. GLfloat lightPosition[] = {-1.0, 0.0, 0.2, 0.0};
  483. GLfloat a;
  484. switch(type)
  485. {
  486. case FORWARD:
  487. xpos += lookx * amount;
  488. zpos += lookz * amount;
  489. break;
  490. case ROTATE:
  491. lookx = lookx*cos(amount) + lookz*sin(amount);
  492. lookz = lookz*cos(amount) - lookx*sin(amount);
  493. a = 1/sqrt(lookx*lookx + lookz*lookz);
  494. lookx *= a;
  495. lookz *= a;
  496. break;
  497. case LOOKUP:
  498. looky += amount;
  499. break;
  500. }
  501. if (update)
  502. {
  503. check_height();
  504. glMatrixMode(GL_MODELVIEW); 
  505. glLoadIdentity();
  506. glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
  507. }
  508. }
  509. void CMyLODView::check_height(void) 
  510. {
  511. float x0, x1, lx, lz, x, z, midpoint;
  512. int fx, fz;
  513. x = xpos/(COMP*1.0);
  514. z = zpos/(COMP*1.0);
  515. fx = (int)(x);
  516. fz = (int)(z);
  517. lx = x - fx;
  518. lz = z - fz;
  519. x0 = y[IX(fx,fz)] + (y[IX(fx,fz+1)] - y[IX(fx,fz)])*lz;
  520. x1 = y[IX(fx+1,fz)] + (y[IX(fx+1,fz+1)] - y[IX(fx+1,fz)])*lz;
  521. midpoint = x0 + (x1 - x0)*lx;
  522. if(flying_mode > 0) {
  523. ypos = (midpoint * 8) + 1024.0f;
  524. }
  525. else {
  526. ypos = (midpoint * 8) + 16.0f;
  527. }
  528. if(x<0)
  529. xpos = 0;
  530. else if(x>(M_SIZE))
  531. xpos = ((M_SIZE) << SHIFT);
  532. if(z<0)
  533. zpos = 0;
  534. else if(z>(M_SIZE))
  535. zpos = ((M_SIZE) << SHIFT);
  536. }
  537. void CMyLODView::colorTerrain(void) 
  538. {
  539. int x, z;
  540. int h;
  541. for(x=0; x<M_SIZE; x++) {
  542. for(z=0; z<M_SIZE; z++) {
  543. h = 200 + (y[IX(x, z)] - y[IX(x+1, z)]) * 8;
  544. if(h>255) 
  545. h = 255;
  546. else if(h<0)
  547. h = 0; 
  548. colour_map[IX(x, z)].r = h;
  549. colour_map[IX(x, z)].g = h;
  550. colour_map[IX(x, z)].b = h;
  551. }
  552. }
  553. lt.NEW_BITMAP(texName, y);
  554. }
  555. void CMyLODView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  556. {
  557. // TODO: Add your message handler code here and/or call default
  558. if(nChar==0x57) //VK_W
  559. {
  560. if(flying_mode > 0) 
  561. {
  562. if(speed < 128) 
  563. {
  564. speed += 8;
  565. }
  566. }
  567. else 
  568. {
  569. if(speed < 8) 
  570. {
  571. speed += 2;
  572. }
  573. }
  574. }
  575. else 
  576. {
  577. if(flying_mode > 0) 
  578. {
  579. if(speed > 0) 
  580. {
  581. speed -= 4;
  582. }
  583. }
  584. else 
  585. {
  586. if(speed > 0) 
  587. {
  588. speed -= 1;
  589. }
  590. }
  591. }
  592. if(nChar==0x53) //VK_S
  593. {
  594. speed = 0;
  595. }
  596. if(nChar==0x31) //VK_1
  597. {
  598. lod_level = 8;
  599. }
  600. if(nChar==0x32) //VK_2
  601. {
  602. lod_level = 16;
  603. }
  604. if(nChar==0x33) //VK_3
  605. {
  606. lod_level = 32;
  607. }
  608. if(nChar==0x34) //VK_4
  609. {
  610. lod_level = 64;
  611. }
  612. if(nChar==0x54) //VK_T
  613. {
  614. detail_texture_mode = -detail_texture_mode;
  615. Sleep(100);
  616. }
  617. if(nChar==0x46) //VK_F
  618. {
  619. flying_mode = -flying_mode;  //视点运动模式开关
  620. speed = 0;
  621. Sleep(100);
  622. }
  623. if(nChar==0x42) //VK_B
  624. {
  625. for(int i=0; i<100; i++) 
  626. {
  627. glBindTexture(GL_TEXTURE_2D, texName[i]);
  628. if(bilinear_filtering > 0) 
  629. {
  630. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  631. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  632. }
  633. else 
  634. {
  635. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  636. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  637. }
  638. }
  639. bilinear_filtering = -bilinear_filtering;
  640. Sleep(100);
  641. }
  642. if(nChar==0x4D) //VK_M
  643. {
  644. if(wireframe_mode > 0) 
  645. {
  646. m_Lod.m_bFlag = true;  //线框模式
  647. }
  648. else 
  649. {
  650. m_Lod.m_bFlag = false;   //纹理模式
  651. }
  652. wireframe_mode = -wireframe_mode;
  653. Sleep(100);
  654. }
  655. if(nChar==VK_SPACE) 
  656. {
  657. randomTerrain();  // 生成随机地形
  658. }
  659. CView::OnKeyDown(nChar, nRepCnt, nFlags);
  660. }