ogl3d.cpp
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:19k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1.  // ogl3d.cpp
  2. //
  3. #include "stdafx.h"
  4. #include "ogl3d.h"
  5. #include "dibbmp.h"
  6. #include <math.h>
  7. #include <vector>
  8. #include <arraycontainer.h>
  9. const int OGL3D_EARTH_LIST = 111;
  10. const int OGL3D_EARTH_LINES = 222;
  11. const int SOLAR_SYSTEM_LIST = 333;
  12. OGL3D::OGL3D(void)
  13. {
  14. InitOGL3D();
  15. }
  16. OGL3D::~OGL3D(void)
  17. {
  18. }
  19. void OGL3D::SetTexture(DIBSection& dib)
  20. {
  21. if (dib.IsCreated())
  22. {
  23. GenTexture(dib);
  24. }
  25. }
  26. void OGL3D::GenTexture(DIBSection& dib)
  27. {
  28. UINT32 width = dib.Width();
  29. UINT32 height = dib.Height();
  30. int w, h;
  31. UINT32 max_dimension = width > height ? width : height;
  32. if (width >= 512) w = 512;
  33. else if (width >= 256) w = 256;
  34. else if (width >= 128) w = 128;
  35. else if (width >= 64) w = 64;
  36. else if (width >= 32) w = 32;
  37. else w = 16;
  38. if (height >= 512) h = 512;
  39. else if (height >= 256) h = 256;
  40. else if (height >= 128) h = 128;
  41. else if (height >= 64) h = 64;
  42. else if (height >= 32) h = 32;
  43. else h = 16;
  44. dib.ResizeImage(m_texture_dib,w,h);
  45. if (m_texture_dib.IsCreated())
  46. {
  47. m_have_texture = 1;
  48. }
  49. }
  50. void OGL3D::RenderSpecialEffects(void)
  51. {
  52. double origin[] = { 0.0, 0.0, 0.0};
  53. double v1[] = { -0.25, 0.65, -0.95 };
  54. double v2[] = { 0.70, -0.60, 0.80 };
  55. double v3[3];
  56. v3[0] = (v1[1]*v2[2] - v1[2]*v2[1]);
  57. v3[1] = (v1[2]*v2[0] - v1[0]*v2[1]);
  58. v3[2] = (v1[0]*v2[1] - v1[1]*v2[0]);
  59. glBegin( GL_LINES );
  60. glColor3ub(64,64,64);
  61. glVertex3dv((GLdouble *)origin);
  62. glVertex3dv((GLdouble *)v1);
  63. glVertex3dv((GLdouble *)origin);
  64. glVertex3dv((GLdouble *)v2);
  65. glVertex3dv((GLdouble *)origin);
  66. glVertex3dv((GLdouble *)v3);
  67. glEnd();
  68. DrawCone(v1);
  69. DrawCone(v2);
  70. glColor3ub(192,192,192);
  71. DrawCone(v3);
  72. }
  73. void OGL3D::RenderPath(void)
  74. {
  75. GLdouble u[3], v[3], w[3];
  76. GLdouble R = 1.005;
  77. double lat1 = 39.0;
  78. double lon1 = 77.0;
  79. double lat2 = 0.0;
  80. double lon2 = 110.0;
  81. const double delta = 500.0;
  82. double lat, lon, phi1, phi2, theta1, theta2, lon_incr, lat_incr, d;
  83. glColor3ub(128,128,128);
  84. u[0] = 0.0; u[1] = 1.25; u[2] = 0.0;
  85. v[0] = 0.0; v[1] = -1.25; v[2] = 0.0;
  86. DrawCone(u);
  87. DrawCone(v);
  88. glBegin( GL_LINES );
  89. {
  90. phi1 = phi2 = lon1 * GEO::DE2RA;
  91. glVertex3dv(u);
  92. glVertex3dv(v);
  93. glColor3ub(32,32,32);
  94. lat_incr = (90.0 - lat1) / delta;
  95. for (lat = 90.0; lat >= (lat1+lat_incr); lat -= lat_incr){
  96. theta1 = lat * GEO::DE2RA;
  97. theta2 = (lat - lat_incr) * GEO::DE2RA;
  98. u[0] = R * cos(phi1) * cos(theta1);//x
  99. u[1] = R * sin(theta1);//y
  100. u[2] = R * sin(phi1) * cos(theta1);//z
  101. v[0] = R * cos(phi2) * cos(theta2);//x
  102. v[1] = R * sin(theta2);//y
  103. v[2] = R * sin(phi2) * cos(theta2);//z
  104. glVertex3dv(u);
  105. glVertex3dv(v);
  106. }
  107. v[0] = v[1] = v[2] = 0.0;
  108. glVertex3dv(u);
  109. glVertex3dv(v);
  110. phi1 = phi2 = lon2 * GEO::DE2RA;
  111. lat_incr = (90.0 - lat2) / delta;
  112. for (lat = 90.0; lat >= (lat2+lat_incr); lat -= lat_incr){
  113. theta1 = lat * GEO::DE2RA;
  114. theta2 = (lat - lat_incr) * GEO::DE2RA;
  115. u[0] = R * cos(phi1) * cos(theta1);//x
  116. u[1] = R * sin(theta1);//y
  117. u[2] = R * sin(phi1) * cos(theta1);//z
  118. v[0] = R * cos(phi2) * cos(theta2);//x
  119. v[1] = R * sin(theta2);//y
  120. v[2] = R * sin(phi2) * cos(theta2);//z
  121. glVertex3dv(u);
  122. glVertex3dv(v);
  123. }
  124. lat_incr = (lat2 - lat1) / delta;
  125. lon_incr = (lon2 - lon1) / delta;
  126. for (d = 0.0; d < (delta-1.0); d += 1.0000){
  127. theta1 = (lat1 + d * lat_incr) * GEO::DE2RA;
  128. theta2 = (lat1 + (d+1.00) * lat_incr) * GEO::DE2RA;
  129. phi1 = (lon1 + d * lon_incr) * GEO::DE2RA;
  130. phi2 = (lon1 + (d+1.00) * lon_incr) * GEO::DE2RA;
  131. u[0] = R * cos(phi1) * cos(theta1);//x
  132. u[1] = R * sin(theta1);//y
  133. u[2] = R * sin(phi1) * cos(theta1);//z
  134. v[0] = R * cos(phi2) * cos(theta2);//x
  135. v[1] = R * sin(theta2);//y
  136. v[2] = R * sin(phi2) * cos(theta2);//z
  137. glVertex3dv(u);
  138. glVertex3dv(v);
  139. }
  140. R = 2.0;
  141. u[0] = R * cos(phi2) * cos(theta2);//x
  142. u[1] = R * sin(theta2);//y
  143. u[2] = R * sin(phi2) * cos(theta2);//z
  144. glVertex3dv(u);
  145. glVertex3dv(v);
  146. R = 1.005;
  147. theta1 = lat1 * GEO::DE2RA;
  148. phi1 = lon1 * GEO::DE2RA;
  149. v[0] = 0.0;//R * cos(phi1) * cos(theta1);//x
  150. v[1] = 0.0;//R * sin(theta1);//y
  151. v[2] = 0.0;//R * sin(phi1) * cos(theta1);//z
  152. glVertex3dv(u);
  153. glVertex3dv(v);
  154. }
  155. glEnd();
  156. glColor3ub(200,200,255);
  157. glBegin( GL_TRIANGLES );
  158. {
  159. R = 1.005;
  160. phi1 = lon1 * GEO::DE2RA;
  161. theta1 = lat1 * GEO::DE2RA;
  162. phi2 = lon2 * GEO::DE2RA;
  163. theta2 = lat2 * GEO::DE2RA;
  164. u[0] = R * cos(phi1) * cos(theta1);//x
  165. u[1] = R * sin(theta1);//y
  166. u[2] = R * sin(phi1) * cos(theta1);//z
  167. R = 2.0;
  168. v[0] = R * cos(phi2) * cos(theta2);//x
  169. v[1] = R * sin(theta2);//y
  170. v[2] = R * sin(phi2) * cos(theta2);//z
  171. w[0] = w[1] = w[2] = 0.0;
  172. glVertex3dv(u);
  173. glVertex3dv(v);
  174. glVertex3dv(w);
  175. }
  176. glEnd();
  177. }
  178. void OGL3D::RenderPlane(void)
  179. {
  180. GLdouble u[3], v[3], w[3], n[3], uu[3], vv[3];
  181. double delta = 1.0;
  182. double theta;
  183. double R = 1.010;
  184. UINT32 count;
  185. w[0] = w[1] = w[2] = 0.0;
  186. glColor3ub(200,200,255);
  187. /*
  188. glPushMatrix();
  189. {
  190. glRotated(20.0, 0.0, 0.0, 1.0);
  191. glBegin( GL_TRIANGLES );
  192. {
  193. count = 0;
  194. for (theta=0.0;theta < 360.0; theta += delta){
  195. u[0] = R * cos(theta*GEO::DE2RA);
  196. u[1] = 0.0;
  197. u[2] = R * sin(theta*GEO::DE2RA);
  198. v[0] = R * cos((theta+delta)*GEO::DE2RA);
  199. v[1] = 0.0;
  200. v[2] = R * sin((theta+delta)*GEO::DE2RA);
  201. glVertex3dv(w);
  202. glVertex3dv(v);
  203. glVertex3dv(u);
  204. if (count == 0)
  205. {
  206. memcpy(uu,u,(size_t)(sizeof(double)*3));
  207. }
  208. if (count == 35)
  209. {
  210. memcpy(vv,u,(size_t)(sizeof(double)*3));
  211. }
  212. if (count == 12)
  213. {
  214. n[0] = 1.2 * cos(theta*GEO::DE2RA);
  215. n[1] = 0.0;
  216. n[2] = 1.2 * sin(theta*GEO::DE2RA);
  217. }
  218. count++;
  219. }
  220. }
  221. glEnd();
  222. glColor3ub(32,32,32);
  223. DrawCone(uu,false);
  224. DrawCone(vv,false);
  225. glBegin( GL_LINES );
  226. {
  227. u[0] = 0.0; u[1] = 0.75; u[2] = 0.0;
  228. glVertex3dv(w);
  229. glVertex3dv(u);
  230. //glVertex3dv(w);
  231. //glVertex3dv(n);
  232. }
  233. glEnd();
  234. DrawCone(u);
  235. //DrawCone(n);
  236. }
  237. glPopMatrix();
  238. */
  239. glColor3ub(200,200,255);
  240. glPushMatrix();
  241. {
  242. glRotated(60.0, 0.0, 1.0, 0.0);
  243. glRotated(50.0, 0.0, 0.0, 1.0);
  244. glBegin( GL_TRIANGLES );
  245. {
  246. count = 0;
  247. for (theta=0.0;theta < 360.0; theta += delta){
  248. u[0] = R * cos(theta*GEO::DE2RA);
  249. u[1] = 0.0;
  250. u[2] = R * sin(theta*GEO::DE2RA);
  251. v[0] = R * cos((theta+delta)*GEO::DE2RA);
  252. v[1] = 0.0;
  253. v[2] = R * sin((theta+delta)*GEO::DE2RA);
  254. glVertex3dv(w);
  255. glVertex3dv(v);
  256. glVertex3dv(u);
  257. if (count == 25)
  258. {
  259. memcpy(uu,u,(size_t)(sizeof(double)*3));
  260. }
  261. if (count == 75)
  262. {
  263. memcpy(vv,u,(size_t)(sizeof(double)*3));
  264. }
  265. count++;
  266. }
  267. }
  268. glEnd();
  269. glColor3ub(32,32,32);
  270. DrawCone(uu,false);
  271. DrawCone(vv,false);
  272. glBegin( GL_LINES );
  273. {
  274. u[0] = 0.0; u[1] = 0.75; u[2] = 0.0;
  275. glVertex3dv(w);
  276. glVertex3dv(u);
  277. }
  278. glEnd();
  279. DrawCone(u);
  280. }
  281. glPopMatrix();
  282. }
  283. void OGL3D::RenderPrimaryImage(void)
  284. {
  285. if ( m_draw_mode == DrawLines )
  286. {
  287. glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  288. }
  289. else
  290. {
  291. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  292. }
  293. #ifndef RENDER_FUNCTION
  294. glColor3ub(96,96,96);
  295. RenderGlobe();
  296. //RenderCylinder();
  297. RenderRectangle();
  298. //RenderCone();
  299. //GLView3D::RenderPrimaryImage();
  300. //RenderSpecialEffects();
  301. //RenderEarthImage();
  302. //RenderPath();
  303. //RenderPlane();
  304. #else
  305. //RenderFunction();
  306. #endif
  307. }
  308. namespace FXYDomain {
  309. const double xmin = 0.0;
  310. const double xmax = 8.0;
  311. const double ymin = 0.0;
  312. const double ymax = 8.0;
  313. const double xincr = 0.50;
  314. const double yincr = 0.50;
  315. };
  316. #define FXY(x,y) (2.0 * exp(-x) * exp(-2.0 * y))
  317. void OGL3D::RenderFunction(void)
  318. {
  319. //GLView3D::RenderPrimaryImage();
  320. UINT32 ndx1, ndx2;
  321. double x, y, z, zmin, zmax;
  322. double scale;
  323. GLdouble u[3], v[3], w[3], n[3];
  324. UINT32 nrows = (UINT32)(0.50 + (FXYDomain::ymax - FXYDomain::ymin)/FXYDomain::yincr);
  325. UINT32 ncols = (UINT32)(0.50 + (FXYDomain::xmax - FXYDomain::xmin)/FXYDomain::xincr);
  326. zmin = 1e10;
  327. zmax = -1e10;
  328. ArrayContainer<double> grid;
  329. grid.SetBufferSize(nrows*ncols);
  330. for (UINT32 row = 0; row < nrows; row++){
  331. y = FXYDomain::ymin + row * FXYDomain::yincr;
  332. for (UINT32 col = 0; col < ncols; col++){
  333. x = FXYDomain::xmin + col * FXYDomain::xincr;
  334. z = FXY(x,y);
  335. if (z < zmin) zmin = z;
  336. if (z > zmax) zmax = z;
  337. grid.AddElement(z);
  338. }
  339. }
  340. double xscale = 1.0 / (FXYDomain::xmax - FXYDomain::xmin);
  341. double yscale = 1.0 / (FXYDomain::ymax - FXYDomain::ymin);
  342. double zscale = 1.0 / (zmax - zmin);
  343. scale = (xscale < yscale) ? xscale : yscale;
  344. scale = (scale < zscale) ? scale : zscale;
  345. double * ptr = grid.GetData();
  346. glColor3ub(0,0,224);
  347. if ( m_draw_mode == DrawLines )
  348. {
  349. glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  350. }
  351. else
  352. {
  353. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  354. }
  355. /*
  356. glBegin( GL_TRIANGLES );
  357. {
  358. for (UINT32 row = 0; row < (nrows-1); row++){
  359. y = FXYDomain::ymin + row * FXYDomain::yincr;
  360. for (UINT32 col = 0; col < (ncols-1); col++){
  361. x = FXYDomain::xmin + col * FXYDomain::xincr;
  362. ndx1 = row * ncols + col;
  363. ndx2 = (row + 1) * ncols + col;
  364. u[0] = x*scale; u[1] = ptr[ndx1]*scale; u[2] = y*scale;
  365. v[0] = (x + FXYDomain::xincr)*scale; v[1] = ptr[ndx2+1]*scale; v[2] = (y + FXYDomain::yincr)*scale;
  366. w[0] = x*scale; w[1] = ptr[ndx2]*scale; w[2] = (y + FXYDomain::yincr)*scale;
  367. NormalVector(u,v,w,n);
  368. glNormal3dv(n);
  369. glVertex3dv(u);
  370. glVertex3dv(v);
  371. glVertex3dv(w);
  372. u[0] = x*scale; u[1] = ptr[ndx1]*scale; u[2] = y*scale;
  373. v[0] = (x + FXYDomain::xincr)*scale; v[1] = ptr[ndx1+1]*scale; v[2] = y*scale;
  374. w[0] = (x + FXYDomain::xincr)*scale; w[1] = ptr[ndx2+1]*scale; w[2] = (y + FXYDomain::yincr)*scale;
  375. NormalVector(u,w,v,n);
  376. glNormal3dv(n);
  377. glVertex3dv(u);
  378. glVertex3dv(w);
  379. glVertex3dv(v);
  380. }
  381. }
  382. }
  383. glEnd();
  384. */
  385. glColor3ub(224,0,0);
  386. glBegin(GL_LINES);
  387. {
  388. for (int i=1;i<19;i++){
  389. y = (double)i/2.0;
  390. u[0] = sqrt(y)*scale; u[1] = 0.0; u[2] = y*scale;
  391. v[0] = 8.0*scale;; v[1] = 0.0; v[2] = y*scale;
  392. glVertex3dv(u);
  393. glVertex3dv(v);
  394. }
  395. }
  396. glEnd();
  397. }
  398. void OGL3D::RenderRectangle()
  399. {
  400. glColor3ub(224,0,0);
  401. glPushMatrix();
  402. {
  403. GLdouble D = 0.50;
  404. glRotated(-45.0, 0.0, 1.0, 0.0);
  405. glRotated(-60.0, 1.0, 0.0, 0.0);
  406. glTranslated(0.0, 0.0, 1.0);
  407. glBegin(GL_LINES);
  408. {
  409. GLdouble u[3], v[3], w[3];
  410. u[0] = -D; u[1] = -D; u[2] = 0.0;
  411. v[0] = D; v[1] = -D; v[2] = 0.0;
  412. glVertex3dv(u);
  413. glVertex3dv(v);
  414. u[0] = D; u[1] = D; u[2] = 0.0;
  415. glVertex3dv(v);
  416. glVertex3dv(u);
  417. v[0] = -D; v[1] = D; v[2] = 0.0;
  418. glVertex3dv(u);
  419. glVertex3dv(v);
  420. u[0] = -D; u[1] = -D; u[2] = 0.0;
  421. glVertex3dv(v);
  422. glVertex3dv(u);
  423. }
  424. glEnd();
  425. }
  426. glPopMatrix();
  427. }
  428. void OGL3D::RenderCylinder()
  429. {
  430. glPushMatrix();
  431. {
  432. glRotated(90.0, 0.0, 1.0, 0.0);
  433. glTranslated(0.0, 0.0, -1.0);
  434. GLUquadricObj * q = gluNewQuadric();
  435. gluQuadricDrawStyle(q, GLU_LINE);
  436. gluQuadricNormals(q, GLU_SMOOTH);
  437. gluCylinder(q, 1.0, 1.0, 2.0, 36, 36);
  438. gluDeleteQuadric(q);
  439. }
  440. glPopMatrix();
  441. }
  442. void OGL3D::RenderCone()
  443. {
  444. glPushMatrix();
  445. {
  446. glTranslated(0.0, 1.414, 0.0);
  447. glRotated(90.0, 1.0, 0.0, 0.0);
  448. GLUquadricObj * q = gluNewQuadric();
  449. //gluQuadricDrawStyle(q, m_draw_mode==DrawLines ? GLU_LINE : GLU_FILL );
  450. gluQuadricDrawStyle(q, GLU_LINE);
  451. gluQuadricNormals(q, GLU_SMOOTH);
  452. gluCylinder(q, 0.00, 1.414, 1.414, 36, 36);
  453. gluDeleteQuadric(q);
  454. }
  455. glPopMatrix();
  456. }
  457. void OGL3D::RenderGlobe()
  458. {
  459. /*
  460. glPushMatrix();
  461. {
  462. glRotated(-90.0, 1.0, 0.0, 0.0);
  463. GLUquadricObj * q = gluNewQuadric();
  464. //gluQuadricDrawStyle(q, m_draw_mode==DrawLines ? GLU_LINE : GLU_FILL);
  465. gluQuadricDrawStyle(q, GLU_FILL);
  466. gluQuadricNormals(q, GLU_SMOOTH);
  467. gluSphere(q,1.0,16,16);
  468. gluDeleteQuadric(q);
  469. }
  470. glPopMatrix();
  471. */
  472. const int NumLatitudes = 18;
  473. const int NumLongitudes = 36;
  474. double start_lat, start_lon;
  475. double theta1, phi1, theta2, phi2, lat_incr, lon_incr;
  476. GLdouble u[3], v[3], w[3], n[3];
  477. GLdouble R;
  478. if (!m_model_built)
  479. {
  480. glNewList( OGL3D_EARTH_LIST, GL_COMPILE);
  481. glColor3ub(192,192,192);
  482. if (m_have_texture)
  483. {
  484. glTexImage2D(GL_TEXTURE_2D,0,3,m_texture_dib.Width(),m_texture_dib.Height(),
  485. 0,GL_BGR_EXT,GL_UNSIGNED_BYTE,(GLvoid *)m_texture_dib.GetBits());
  486. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  487. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  488. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  489. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  490. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  491. //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
  492. //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  493. glEnable( GL_TEXTURE_2D );
  494. }
  495. else
  496. {
  497. glDisable( GL_TEXTURE_2D );
  498. }
  499. m_model_built = 1;
  500. glBegin( GL_TRIANGLES );
  501. start_lat = -90;
  502. start_lon = 0.0;
  503. R = 1.0;
  504. lat_incr = 180.0 / NumLatitudes;
  505. lon_incr = 360.0 / NumLongitudes;
  506. int row, col;
  507. for (col = 0; col < NumLongitudes; col++){
  508. phi1 = (start_lon + col * lon_incr) * GEO::DE2RA;
  509. phi2 = (start_lon + (col + 1) * lon_incr) * GEO::DE2RA;
  510. for (row = 0; row < NumLatitudes; row++){
  511. theta1 = (start_lat + row * lat_incr) * GEO::DE2RA;
  512. theta2 = (start_lat + (row + 1) * lat_incr) * GEO::DE2RA;
  513. u[0] = R * cos(phi1) * cos(theta1);//x
  514. u[1] = R * sin(theta1);//y
  515. u[2] = R * sin(phi1) * cos(theta1);//z
  516. v[0] = R * cos(phi1) * cos(theta2);//x
  517. v[1] = R * sin(theta2);//y
  518. v[2] = R * sin(phi1) * cos(theta2);//z
  519. w[0] = R * cos(phi2) * cos(theta2);//x
  520. w[1] = R * sin(theta2);//y
  521. w[2] = R * sin(phi2) * cos(theta2);//z
  522. NormalVector(u,v,w,n);
  523. glNormal3dv(n);
  524. glTexCoord2d((180.0 - phi1*GEO::RA2DE)/360.0,(theta1 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  525. glVertex3dv(u);
  526. glTexCoord2d((180.0 - phi1*GEO::RA2DE)/360.0,(theta2 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  527. glVertex3dv(v);
  528. glTexCoord2d((180.0 - phi2*GEO::RA2DE)/360.0,(theta2 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  529. glVertex3dv(w);
  530. v[0] = R * cos(phi2) * cos(theta1);//x
  531. v[1] = R * sin(theta1);//y
  532. v[2] = R * sin(phi2) * cos(theta1);//z
  533. NormalVector(u,w,v,n);
  534. glNormal3dv(n);
  535. glTexCoord2d((180.0 - phi1*GEO::RA2DE)/360.0,(theta1 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  536. glVertex3dv(u);
  537. glTexCoord2d((180.0 - phi2*GEO::RA2DE)/360.0,(theta2 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  538. glVertex3dv(w);
  539. glTexCoord2d((180.0 - phi2*GEO::RA2DE)/360.0,(theta1 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  540. glVertex3dv(v);
  541. }
  542. }
  543. glEnd();
  544. if (m_have_texture)
  545. {
  546. glDisable( GL_TEXTURE_2D );
  547. }
  548. glEndList();
  549. }
  550. glCallList( OGL3D_EARTH_LIST );
  551. }
  552. void OGL3D::RenderEarthImage(void)
  553. {
  554. const int NumLatitudes = 36;
  555. const int NumLongitudes = 72;
  556. double start_lat, start_lon;
  557. double theta1, phi1, theta2, phi2, lat_incr, lon_incr;
  558. GLdouble u[3], v[3], w[3], n[3];
  559. GLdouble R;
  560. if (!m_model_built)
  561. {
  562. glNewList( OGL3D_EARTH_LIST, GL_COMPILE);
  563. glColor3ub(192,192,192);
  564. if (m_have_texture)
  565. {
  566. glTexImage2D(GL_TEXTURE_2D,0,3,m_texture_dib.Width(),m_texture_dib.Height(),
  567. 0,GL_BGR_EXT,GL_UNSIGNED_BYTE,(GLvoid *)m_texture_dib.GetBits());
  568. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  569. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  570. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  571. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  572. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  573. //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
  574. //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  575. glEnable( GL_TEXTURE_2D );
  576. }
  577. else
  578. {
  579. glDisable( GL_TEXTURE_2D );
  580. }
  581. m_model_built = 1;
  582. glBegin( GL_TRIANGLES );
  583. start_lat = -90;
  584. start_lon = 0.0;
  585. R = 1.0;
  586. lat_incr = 180.0 / NumLatitudes;
  587. lon_incr = 360.0 / NumLongitudes;
  588. int row, col;
  589. for (col = 0; col < NumLongitudes; col++){
  590. phi1 = (start_lon + col * lon_incr) * GEO::DE2RA;
  591. phi2 = (start_lon + (col + 1) * lon_incr) * GEO::DE2RA;
  592. for (row = 0; row < NumLatitudes; row++){
  593. theta1 = (start_lat + row * lat_incr) * GEO::DE2RA;
  594. theta2 = (start_lat + (row + 1) * lat_incr) * GEO::DE2RA;
  595. u[0] = R * cos(phi1) * cos(theta1);//x
  596. u[1] = R * sin(theta1);//y
  597. u[2] = R * sin(phi1) * cos(theta1);//z
  598. v[0] = R * cos(phi1) * cos(theta2);//x
  599. v[1] = R * sin(theta2);//y
  600. v[2] = R * sin(phi1) * cos(theta2);//z
  601. w[0] = R * cos(phi2) * cos(theta2);//x
  602. w[1] = R * sin(theta2);//y
  603. w[2] = R * sin(phi2) * cos(theta2);//z
  604. NormalVector(u,v,w,n);
  605. glNormal3dv(n);
  606. glTexCoord2d((180.0 - phi1*GEO::RA2DE)/360.0,(theta1 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  607. glVertex3dv(u);
  608. glTexCoord2d((180.0 - phi1*GEO::RA2DE)/360.0,(theta2 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  609. glVertex3dv(v);
  610. glTexCoord2d((180.0 - phi2*GEO::RA2DE)/360.0,(theta2 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  611. glVertex3dv(w);
  612. v[0] = R * cos(phi2) * cos(theta1);//x
  613. v[1] = R * sin(theta1);//y
  614. v[2] = R * sin(phi2) * cos(theta1);//z
  615. NormalVector(u,w,v,n);
  616. glNormal3dv(n);
  617. glTexCoord2d((180.0 - phi1*GEO::RA2DE)/360.0,(theta1 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  618. glVertex3dv(u);
  619. glTexCoord2d((180.0 - phi2*GEO::RA2DE)/360.0,(theta2 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  620. glVertex3dv(w);
  621. glTexCoord2d((180.0 - phi2*GEO::RA2DE)/360.0,(theta1 + GEO::PIOVER2)*GEO::RA2DE/180.0);
  622. glVertex3dv(v);
  623. }
  624. }
  625. glEnd();
  626. if (m_have_texture)
  627. {
  628. glDisable( GL_TEXTURE_2D );
  629. }
  630. //GLView3D::RenderPrimaryImage();
  631. glEndList();
  632. /*
  633. glNewList( OGL3D_EARTH_LINES, GL_COMPILE );
  634. start_lat = -85.0;
  635. lat_incr = 5.0000;
  636. lon_incr = 5.0 / 60.0; // 5 minutes of arc
  637. R = 1.00100;
  638. glBegin( GL_LINES );
  639. for (col = 0; col < NumLongitudes; col++){
  640. phi1 = (start_lon + col * lon_incr) * GEO::DE2RA;
  641. phi2 = (start_lon + (col + 1) * lon_incr) * GEO::DE2RA;
  642. for (row = 0; row < NumLatitudes; row++){
  643. theta1 = (start_lat + row * lat_incr) * GEO::DE2RA;
  644. theta2 = (start_lat + (row + 1) * lat_incr) * GEO::DE2RA;
  645. u[0] = R * cos(phi1) * cos(theta1);//x
  646. u[1] = R * sin(theta1);//y
  647. u[2] = R * sin(phi1) * cos(theta1);//z
  648. v[0] = R * cos(phi1) * cos(theta2);//x
  649. v[1] = R * sin(theta2);//y
  650. v[2] = R * sin(phi1) * cos(theta2);//z
  651. w[0] = R * cos(phi2) * cos(theta2);//x
  652. w[1] = R * sin(theta2);//y
  653. w[2] = R * sin(phi2) * cos(theta2);//z
  654. glVertex3dv(u);
  655. glVertex3dv(v);
  656. glVertex3dv(v);
  657. glVertex3dv(w);
  658. v[0] = R * cos(phi2) * cos(theta1);//x
  659. v[1] = R * sin(theta1);//y
  660. v[2] = R * sin(phi2) * cos(theta1);//z
  661. glVertex3dv(u);
  662. glVertex3dv(v);
  663. glVertex3dv(v);
  664. glVertex3dv(w);
  665. }
  666. }
  667. glEnd();
  668. glEndList();
  669. */
  670. }
  671. glCallList( OGL3D_EARTH_LIST );
  672. //glCallList( OGL3D_EARTH_LINES );
  673. }