3dPageTerrain.cpp
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:9k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dPageTerrain.cpp : implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "glOOP.h"
  21. #include "3dObjectDialog.h"
  22. #include <math.h>
  23. #ifdef _DEBUG
  24. #undef THIS_FILE
  25. static char BASED_CODE THIS_FILE[] = __FILE__;
  26. #endif
  27. //////////////////////////////////////////////////////////////////
  28. // C3dPageTerrain
  29. IMPLEMENT_DYNCREATE(C3dPageTerrain, CPropertyPage)
  30. /////////////////////////////////////////////////////////////////////////////
  31. // C3dPageTerrain dialog construction
  32. C3dPageTerrain::C3dPageTerrain()
  33. : CPropertyPage(C3dPageTerrain::IDD)
  34. {
  35. m_bInitVertices = FALSE;
  36. //{{AFX_DATA_INIT(C3dPageTerrain)
  37. m_fDepth = 0.0f;
  38. m_fWidth = 0.0f;
  39. m_szName = _T("");
  40. m_iTile = 0;
  41. m_iHeightSeed = 0;
  42. m_bRandomSeed = FALSE;
  43. //}}AFX_DATA_INIT
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // C3dPageTerrain Destructor
  47. C3dPageTerrain::~C3dPageTerrain()
  48. {
  49. }
  50. void C3dPageTerrain::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CPropertyPage::DoDataExchange(pDX);
  53. //{{AFX_DATA_MAP(C3dPageTerrain)
  54. DDX_Control(pDX, IDC_SLIDER_SEALEVEL, m_SliderSeaLevel);
  55. DDX_Control(pDX, IDC_SLIDER_HEIGHT, m_SliderHeight);
  56. DDX_Control(pDX, IDC_COMBO_GRIDSIZE, m_ComboGridSize);
  57. DDX_Text(pDX, IDC_DEPTH, m_fDepth);
  58. DDX_Text(pDX, IDC_WIDTH, m_fWidth);
  59. DDX_Text(pDX, IDC_NAME, m_szName);
  60. DDV_MaxChars(pDX, m_szName, 40);
  61. DDX_Text(pDX, IDC_TILE, m_iTile);
  62. DDV_MinMaxInt(pDX, m_iTile, 1, 10000);
  63. DDX_Text(pDX, IDC_HEIGHT_SEED, m_iHeightSeed);
  64. DDX_Check(pDX, IDC_RANDOM_SEED, m_bRandomSeed);
  65. //}}AFX_DATA_MAP
  66. }
  67. BEGIN_MESSAGE_MAP(C3dPageTerrain, CPropertyPage)
  68. //{{AFX_MSG_MAP(C3dPageTerrain)
  69. ON_EN_CHANGE(IDC_DEPTH, OnChangeDepth)
  70. ON_EN_CHANGE(IDC_WIDTH, OnChangeWidth)
  71. ON_CBN_SELCHANGE(IDC_COMBO_GRIDSIZE, OnSelchangeComboGridsize)
  72. ON_WM_VSCROLL()
  73. ON_EN_CHANGE(IDC_HEIGHT_SEED, OnChangeHeightSeed)
  74. ON_BN_CLICKED(IDC_RANDOM_SEED, OnRandomHeight)
  75. //}}AFX_MSG_MAP
  76. END_MESSAGE_MAP()
  77. /////////////////////////////////////////////////////////////////////////////
  78. // C3dPageTerrain message handlers
  79. BOOL C3dPageTerrain::OnInitDialog() 
  80. {
  81. // let the base class do the default work
  82. CPropertyPage::OnInitDialog();
  83. // Set our local values to the Objects' values
  84. m_szName = m_pObject->m_szName;
  85. m_fDepth = m_pObject->m_fDepth;
  86. m_fWidth = m_pObject->m_fWidth;
  87. m_fHeight = m_pObject->m_fHeight;
  88. m_iHeightSeed = m_pObject->m_iHeightSeed;
  89. m_fSeaLevel = m_pObject->m_fSeaLevel;
  90. m_iTile = m_pObject->m_iTile;
  91. // Fill our combo boxes and set the default selections:
  92. // Reset or clear the contents of the light Type combo box
  93. m_ComboGridSize.ResetContent();
  94. // Load the light type selections
  95. m_ComboGridSize.AddString("2 x 2 Grid");
  96. m_ComboGridSize.AddString("4 x 4 Grid");
  97. m_ComboGridSize.AddString("8 x 8 Grid");
  98. m_ComboGridSize.AddString("16 x 16 Grid");
  99. m_ComboGridSize.AddString("32 x 32 Grid");
  100. m_ComboGridSize.AddString("64 x 64 Grid");
  101. m_ComboGridSize.AddString("128 x 128 Grid");
  102. m_ComboGridSize.AddString("256 x 256 Grid");
  103. // Set a default selection  (brute force method..)
  104. // (I'm sure there is some algorthium, but I'm 
  105. //  anxious..)
  106. if(m_pObject->m_iSize == 2)
  107. m_ComboGridSize.SetCurSel(0);
  108. if(m_pObject->m_iSize == 4)
  109. m_ComboGridSize.SetCurSel(1);
  110. if(m_pObject->m_iSize == 8)
  111. m_ComboGridSize.SetCurSel(2);
  112. if(m_pObject->m_iSize == 16)
  113. m_ComboGridSize.SetCurSel(3);
  114. if(m_pObject->m_iSize == 32)
  115. m_ComboGridSize.SetCurSel(4);
  116. if(m_pObject->m_iSize == 64)
  117. m_ComboGridSize.SetCurSel(5);
  118. if(m_pObject->m_iSize == 128)
  119. m_ComboGridSize.SetCurSel(6);
  120. if(m_pObject->m_iSize == 256)
  121. m_ComboGridSize.SetCurSel(7);
  122. // Set our Terrain Height slider. Scaled by 10.
  123. m_SliderHeight.SetRange(0, 50, TRUE);
  124. m_SliderHeight.SetPos((int)(m_fHeight*10));
  125. // Set our Sea Level slider
  126. m_SliderSeaLevel.SetRange(0, 100, TRUE);
  127. m_SliderSeaLevel.SetPos((int)((1-m_fSeaLevel)*100));
  128. // Dialog box is being initialized (FALSE)
  129. // or data is being retrieved (TRUE).
  130. UpdateData(FALSE);
  131. return TRUE;  // return TRUE unless you set the focus to a control
  132.               // EXCEPTION: OCX Property Pages should return FALSE
  133. }
  134. void C3dPageTerrain::OnOK() 
  135. {
  136. // Dialog box is being initialized (FALSE)
  137. // or data is being retrieved (TRUE).
  138. UpdateData(TRUE);
  139. if(m_bRandomSeed)
  140. m_pObject->m_iHeightSeed = -1;
  141. else
  142. m_pObject->m_iHeightSeed = m_iHeightSeed; 
  143. // Set the Objects Origin..
  144. m_pObject->m_szName = m_szName; 
  145. m_pObject->m_fDepth = m_fDepth;
  146. m_pObject->m_fWidth = m_fWidth;
  147. m_pObject->m_fHeight = m_fHeight;
  148. m_pObject->m_fSeaLevel = m_fSeaLevel;
  149. m_pObject->m_iTile = m_iTile;
  150. // Force the object to rebuild its' display list
  151. m_pObject->m_bBuildLists = TRUE;
  152. // Rebuild our objects vertices?
  153. if(m_bInitVertices)
  154. m_pObject->InitTerrain();
  155. CPropertyPage::OnOK();
  156. }
  157. void C3dPageTerrain::OnChangeDepth() 
  158. {
  159. // User has modified the planes depth, so set our vertice
  160. // initialization flag
  161. m_bInitVertices = TRUE;
  162. }
  163. void C3dPageTerrain::OnChangeWidth() 
  164. {
  165. // User has modified the planes width depth, so set our vertice
  166. // initialization flag
  167. m_bInitVertices = TRUE;
  168. }
  169. void C3dPageTerrain::OnChangeHeightSeed() 
  170. {
  171. // User has modified the planes width depth, so set our vertice
  172. // initialization flag
  173. m_bInitVertices = TRUE;
  174. }
  175. void C3dPageTerrain::OnSelchangeComboGridsize() 
  176. {
  177. int count;
  178. // User has modified the planes width depth, so set our vertice
  179. // initialization flag
  180. m_bInitVertices = TRUE;
  181. // Get the zero-based index of the item selected
  182. count = m_ComboGridSize.GetCurSel();
  183. if(count == 0)
  184. m_pObject->m_iSize = 2;
  185. if(count == 1)
  186. m_pObject->m_iSize = 4;
  187. if(count == 2)
  188. m_pObject->m_iSize = 8;
  189. if(count == 3)
  190. m_pObject->m_iSize = 16;
  191. if(count == 4)
  192. m_pObject->m_iSize = 32;
  193. if(count == 5)
  194. m_pObject->m_iSize = 64;
  195. if(count == 6)
  196. m_pObject->m_iSize = 128;
  197. if(count == 7)
  198. m_pObject->m_iSize = 256;
  199. }
  200. void C3dPageTerrain::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  201. {
  202. // Note:  MFC maps vertically oriented CSliderCtrl to WM_VSCROLL
  203. //   and horizontally oriented CSliderCtrl to WM_HSCROLL
  204. int posn;
  205. if((CSliderCtrl*)pScrollBar == &m_SliderHeight)
  206. {
  207. // Get the position of our slider since it's position
  208. // is not returned when paging up/down/left/right
  209. posn = m_SliderHeight.GetPos();
  210. if(nSBCode == SB_LINELEFT) // nSBCode = 0
  211. {
  212. }
  213. if(nSBCode == SB_LINERIGHT) // nSBCode = 1
  214. {
  215. }
  216. if(nSBCode == SB_PAGELEFT) // nSBCode = 2
  217. {
  218. m_fHeight = posn/10.0f; // Scale by 10
  219. }
  220. if(nSBCode == SB_PAGERIGHT) // nSBCode = 3
  221. {
  222. m_fHeight = posn/10.0f; // Scale by 10
  223. }
  224. if(nSBCode == SB_THUMBPOSITION) // nSBCode = 4
  225. {
  226. m_fHeight = posn/10.0f; // Scale by 10
  227. }
  228. if(nSBCode == SB_THUMBTRACK) // nSBCode = 5
  229. {
  230. }
  231. // User has modified the planes depth, so set our vertice
  232. // initialization flag
  233. m_bInitVertices = TRUE;
  234. }
  235. else if((CSliderCtrl*)pScrollBar == &m_SliderSeaLevel)
  236. {
  237. // Get the position of our slider since it's position
  238. // is not returned when paging up/down/left/right
  239. posn = m_SliderSeaLevel.GetPos();
  240. if(nSBCode == SB_LINELEFT) // nSBCode = 0
  241. {
  242. }
  243. if(nSBCode == SB_LINERIGHT) // nSBCode = 1
  244. {
  245. }
  246. if(nSBCode == SB_PAGELEFT) // nSBCode = 2
  247. {
  248. m_fSeaLevel = 1-(posn/100.0f);// Scale by 100
  249. }
  250. if(nSBCode == SB_PAGERIGHT) // nSBCode = 3
  251. {
  252. m_fSeaLevel = 1-(posn/100.0f);// Scale by 100
  253. }
  254. if(nSBCode == SB_THUMBPOSITION) // nSBCode = 4
  255. {
  256. m_fSeaLevel = 1-(posn/100.0f);// Scale by 100
  257. }
  258. if(nSBCode == SB_THUMBTRACK) // nSBCode = 5
  259. {
  260. }
  261. // User has modified the planes depth, so set our vertice
  262. // initialization flag
  263. m_bInitVertices = TRUE;
  264. }
  265. CPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar);
  266. }
  267. void C3dPageTerrain::OnRandomHeight() 
  268. {
  269. // User has modified the planes depth, so set our vertice
  270. // initialization flag
  271. m_bInitVertices = TRUE;
  272. }