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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // C3dPageBackgroundFog.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 "MyColorPaletteWnd.h"
  22. #include "EditColorDlg.h"
  23. #include "3dObjectDialog.h"
  24. #include "3dBackgroundDialog.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char BASED_CODE THIS_FILE[] = __FILE__;
  28. #endif
  29. //////////////////////////////////////////////////////////////////
  30. // C3dPageBackgroundFog
  31. IMPLEMENT_DYNCREATE(C3dPageBackgroundFog, CPropertyPage)
  32. /////////////////////////////////////////////////////////////////////////////
  33. // C3dPageBackgroundFog dialog construction
  34. C3dPageBackgroundFog::C3dPageBackgroundFog()
  35. : CPropertyPage(C3dPageBackgroundFog::IDD)
  36. {
  37. m_pWorld = NULL;
  38. //{{AFX_DATA_INIT(C3dPageBackgroundFog)
  39. m_fDensity = 0.0f;
  40. m_fEnd = 0.0f;
  41. m_fStart = 0.0f;
  42. m_iFogEnable = -1;
  43. m_iHint = -1;
  44. m_iMode = -1;
  45. m_fAlpha = 0.0f;
  46. //}}AFX_DATA_INIT
  47. }
  48. /////////////////////////////////////////////////////////////////////////////
  49. // C3dPageBackgroundFog Destructor
  50. C3dPageBackgroundFog::~C3dPageBackgroundFog()
  51. {
  52. }
  53. void C3dPageBackgroundFog::DoDataExchange(CDataExchange* pDX)
  54. {
  55. CPropertyPage::DoDataExchange(pDX);
  56. //{{AFX_DATA_MAP(C3dPageBackgroundFog)
  57. DDX_Control(pDX, IDC_COLOR_COMBO, m_ColorCombo);
  58. DDX_Text(pDX, IDC_DENSITY, m_fDensity);
  59. DDV_MinMaxFloat(pDX, m_fDensity, 0.f, 1.f);
  60. DDX_Text(pDX, IDC_END, m_fEnd);
  61. DDX_Text(pDX, IDC_START, m_fStart);
  62. DDX_Radio(pDX, IDC_FOG_ENABLE, m_iFogEnable);
  63. DDX_Radio(pDX, IDC_HINT_FASTEST, m_iHint);
  64. DDX_Radio(pDX, IDC_MODE_LINEAR, m_iMode);
  65. DDX_Text(pDX, IDC_ALPHA, m_fAlpha);
  66. DDV_MinMaxFloat(pDX, m_fAlpha, 0.f, 1.f);
  67. //}}AFX_DATA_MAP
  68. }
  69. BEGIN_MESSAGE_MAP(C3dPageBackgroundFog, CPropertyPage)
  70. //{{AFX_MSG_MAP(C3dPageBackgroundFog)
  71. ON_BN_CLICKED(IDC_BUTTON_COLOR_WND, OnButtonColorWnd)
  72. ON_WM_DRAWITEM()
  73. ON_CBN_SELCHANGE(IDC_COLOR_COMBO, OnSelchangeColorCombo)
  74. ON_BN_CLICKED(IDC_FOG_ENABLE, OnFogEnable)
  75. ON_BN_CLICKED(IDC_HINT_FASTEST, OnHintFastest)
  76. ON_BN_CLICKED(IDC_HINT_NICEST, OnHintNicest)
  77. ON_BN_CLICKED(IDC_MODE_LINEAR, OnModeLinear)
  78. ON_BN_CLICKED(IDC_MODE_EXPOTENTIAL, OnModeExpotential)
  79. ON_BN_CLICKED(IDC_MODE_EXPOTENTIAL2, OnModeExpotential2)
  80. //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82. /////////////////////////////////////////////////////////////////////////////
  83. // C3dPageBackgroundFog message handlers
  84. BOOL C3dPageBackgroundFog::OnInitDialog() 
  85. {
  86. // let the base class do the default work
  87. CPropertyPage::OnInitDialog();
  88. if(!m_pWorld)
  89. return FALSE;
  90. // Is fog enabled?
  91. if(m_pWorld->m_bFogEnable)
  92. m_iFogEnable = 0;
  93. else
  94. m_iFogEnable = 1;
  95. // Set the Environment Mode
  96. if(m_pWorld->m_Fog.m_enumMode == GL_LINEAR)
  97. {
  98. m_iMode = 0;
  99. GetDlgItem(IDC_DENSITY)->EnableWindow(FALSE);
  100. }
  101. if(m_pWorld->m_Fog.m_enumMode == GL_EXP)
  102. {
  103. m_iMode = 1;
  104. // GetDlgItem(IDC_START)->EnableWindow(FALSE);
  105. // GetDlgItem(IDC_END)->EnableWindow(FALSE);
  106. }
  107. if(m_pWorld->m_Fog.m_enumMode == GL_EXP2)
  108. {
  109. m_iMode = 2;
  110. // GetDlgItem(IDC_START)->EnableWindow(FALSE);
  111. // GetDlgItem(IDC_END)->EnableWindow(FALSE);
  112. }
  113. // Set the display Hint
  114. if(m_pWorld->m_Fog.m_enumHint == GL_FASTEST)
  115. m_iHint = 0;
  116. if(m_pWorld->m_Fog.m_enumHint == GL_NICEST)
  117. m_iHint = 1;
  118. // Initialize our dialog data
  119. m_fStart   = m_pWorld->m_Fog.m_fStart;
  120. m_fEnd     = m_pWorld->m_Fog.m_fEnd;
  121. m_fDensity = m_pWorld->m_Fog.m_fDensity;
  122. m_fAlpha   = m_pWorld->m_Fog.m_Color.m_fColor[3];
  123. // Create the owner drawn button color window
  124. CRect rect;
  125. GetDlgItem(IDC_BUTTON_COLOR_WND)->GetWindowRect(&rect);
  126. ScreenToClient(&rect);
  127. // Create the 'Selected Color' window
  128. m_wndSelColor.Create(NULL, // lpszClassName
  129.  NULL, // lpszWindowName
  130.  WS_CHILD | WS_VISIBLE |// dwStyle
  131.  WS_DLGFRAME,
  132.  rect, // rect
  133.  this, // CWnd* pParentWnd
  134.  IDC_BUTTON_COLOR_WND, // UINT  nID
  135.  0); // pContext
  136. // Load the Color Combo box
  137. if(m_pWorld)
  138. m_pWorld->m_ColorList.LoadComboBox(&m_ColorCombo, &m_pWorld->m_BackgroundColor);
  139. // Dialog box is being initialized (FALSE)
  140. // or data is being retrieved (TRUE).
  141. UpdateData(FALSE);
  142. return TRUE;  // return TRUE unless you set the focus to a control
  143.               // EXCEPTION: OCX Property Pages should return FALSE
  144. }
  145. void C3dPageBackgroundFog::OnOK() 
  146. {
  147. GetDialogData();
  148. CPropertyPage::OnOK();
  149. }
  150. void C3dPageBackgroundFog::OnButtonColorWnd() 
  151. {
  152. if(m_pWorld) 
  153. {
  154. // Create the dialog
  155. CEditColorDlg colorDlg(&m_pWorld->m_ColorList, &m_pWorld->m_Fog.m_Color, this);
  156. // Invoke the modal dialog box and return the
  157. // dialog-box result when done.
  158. if(colorDlg.DoModal() == IDOK)
  159. {
  160. // Save any changes the user may have made
  161. m_pWorld->m_Fog.m_Color.SetColor3fv(&colorDlg.m_Color);
  162. PaintButtonWnd();
  163. }
  164. }
  165. }
  166. void C3dPageBackgroundFog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
  167. {
  168. // TODO: Add your message handler code here and/or call default
  169. CPropertyPage::OnDrawItem(nIDCtl, lpDrawItemStruct);
  170. if(nIDCtl == IDC_BUTTON_COLOR_WND)
  171. PaintButtonWnd();
  172. }
  173. void C3dPageBackgroundFog::PaintButtonWnd()
  174. {
  175. CRect rect; // window rect
  176. CDC* pDC; // pointer to a device context
  177. // Get the size of the gradient window
  178. m_wndSelColor.GetWindowRect(&rect);
  179. // Get a pointer to the windows device context
  180. pDC = m_wndSelColor.GetDC();
  181. if(pDC && m_pWorld)
  182. {
  183. // Draw the box color
  184. pDC->FillSolidRect(0,
  185.    0,
  186.    rect.right-rect.left,
  187.    rect.bottom-rect.top,
  188.    COLORREF RGB(m_pWorld->m_Fog.m_Color.m_fColor[0]*255,
  189. m_pWorld->m_Fog.m_Color.m_fColor[1]*255,
  190. m_pWorld->m_Fog.m_Color.m_fColor[2]*255));
  191. }
  192. ReleaseDC(pDC);
  193. }
  194. void C3dPageBackgroundFog::OnSelchangeColorCombo() 
  195. {
  196. C3dColor* pColor;
  197. // Get the zero-based index of the item selected
  198. int index = m_ColorCombo.GetCurSel();
  199. // Cast the user selected list box items' lParam to
  200. // a C3dColor pointer..
  201. pColor = (C3dColor*)m_ColorCombo.GetItemData(index);
  202. if(pColor)
  203. {
  204. // Set the fog color and paint the color
  205. // button window
  206. m_pWorld->m_Fog.m_Color.SetColor3fv(pColor);
  207. PaintButtonWnd();
  208. }
  209. }
  210. void C3dPageBackgroundFog::OnFogEnable() 
  211. {
  212. GetDialogData();
  213. // Toggle the radio selection
  214. if(m_pWorld->m_bFogEnable) {
  215. m_pWorld->m_bFogEnable = FALSE;
  216. m_iFogEnable = -1;
  217. }
  218. else {
  219. m_pWorld->m_bFogEnable = TRUE;
  220. m_iFogEnable = 0;
  221. }
  222. SetDialogData();
  223. }
  224. void C3dPageBackgroundFog::OnModeLinear() 
  225. {
  226. // Set the Environment Mode
  227. m_pWorld->m_Fog.m_enumMode = GL_LINEAR;
  228. m_iMode = 0;
  229. // Set the data window enable/disable states
  230. GetDlgItem(IDC_DENSITY)->EnableWindow(FALSE);
  231. // GetDlgItem(IDC_START)->EnableWindow(TRUE);
  232. // GetDlgItem(IDC_END)->EnableWindow(TRUE);
  233. SetDialogData();
  234. }
  235. void C3dPageBackgroundFog::OnModeExpotential() 
  236. {
  237. GetDialogData();
  238. // Set the Environment Mode
  239. m_pWorld->m_Fog.m_enumMode = GL_EXP;
  240. m_iMode = 1;
  241. // Set the data window enable/disable states
  242. GetDlgItem(IDC_DENSITY)->EnableWindow(TRUE);
  243. // GetDlgItem(IDC_START)->EnableWindow(FALSE);
  244. // GetDlgItem(IDC_END)->EnableWindow(FALSE);
  245. SetDialogData();
  246. }
  247. void C3dPageBackgroundFog::OnModeExpotential2() 
  248. {
  249. GetDialogData();
  250. // Set the Environment Mode
  251. m_pWorld->m_Fog.m_enumMode = GL_EXP2;
  252. m_iMode = 2;
  253. // Set the data window enable/disable states
  254. GetDlgItem(IDC_DENSITY)->EnableWindow(TRUE);
  255. // GetDlgItem(IDC_START)->EnableWindow(FALSE);
  256. // GetDlgItem(IDC_END)->EnableWindow(FALSE);
  257. SetDialogData();
  258. }
  259. void C3dPageBackgroundFog::OnHintFastest() 
  260. {
  261. GetDialogData();
  262. // Set the display Hint
  263. m_pWorld->m_Fog.m_enumHint = GL_FASTEST;
  264. m_iHint = 0;
  265. SetDialogData();
  266. }
  267. void C3dPageBackgroundFog::OnHintNicest() 
  268. {
  269. GetDialogData();
  270. // Set the display Hint
  271. m_pWorld->m_Fog.m_enumHint = GL_NICEST;
  272. m_iHint = 1;
  273. SetDialogData();
  274. }
  275. void C3dPageBackgroundFog::GetDialogData()
  276. {
  277. // Dialog box is being initialized (FALSE)
  278. // or data is being retrieved (TRUE).
  279. UpdateData(TRUE);
  280. // Set the world's fog attributes
  281. m_pWorld->m_Fog.m_fStart   = m_fStart;
  282. m_pWorld->m_Fog.m_fEnd     = m_fEnd;
  283. m_pWorld->m_Fog.m_fDensity = m_fDensity;
  284. m_pWorld->m_Fog.m_Color.m_fColor[3]= m_fAlpha;
  285. }
  286. void C3dPageBackgroundFog::SetDialogData()
  287. {
  288. // Set the world's fog attributes
  289. m_fStart = m_pWorld->m_Fog.m_fStart;
  290. m_fEnd   = m_pWorld->m_Fog.m_fEnd;
  291. m_fDensity = m_pWorld->m_Fog.m_fDensity;
  292. m_fAlpha   = m_pWorld->m_Fog.m_Color.m_fColor[3];
  293. // Dialog box is being initialized (FALSE)
  294. // or data is being retrieved (TRUE).
  295. UpdateData(FALSE);
  296. }