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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dPageLight.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. #ifdef _DEBUG
  25. #undef THIS_FILE
  26. static char BASED_CODE THIS_FILE[] = __FILE__;
  27. #endif
  28. //////////////////////////////////////////////////////////////////
  29. // C3dPageLight
  30. IMPLEMENT_DYNCREATE(C3dPageLight, CPropertyPage)
  31. /////////////////////////////////////////////////////////////////////////////
  32. // C3dPageLight dialog construction
  33. C3dPageLight::C3dPageLight()
  34. :CPropertyPage(C3dPageLight::IDD)
  35. {
  36. m_pWorld = NULL;
  37. m_pLight = NULL;
  38. //{{AFX_DATA_INIT(C3dPageLight)
  39. m_szName = _T("");
  40. m_fSpotAngle = 0.0f;
  41. m_fRadius = 0.0f;
  42. m_iAttnConstant = -1;
  43. m_fAttnFactor = 0.0f;
  44. m_iDirectional = -1;
  45. //}}AFX_DATA_INIT
  46. }
  47. /////////////////////////////////////////////////////////////////////////////
  48. // C3dPageLight Destructor
  49. C3dPageLight::~C3dPageLight()
  50. {
  51. }
  52. void C3dPageLight::DoDataExchange(CDataExchange* pDX)
  53. {
  54. CPropertyPage::DoDataExchange(pDX);
  55. //{{AFX_DATA_MAP(C3dPageLight)
  56. DDX_Control(pDX, IDC_LIGHT_TYPE_COMBO, m_ComboType);
  57. DDX_Control(pDX, IDC_LIGHT_DISPLAY_COMBO, m_ComboDisplayAs);
  58. DDX_Control(pDX, IDC_SLIDER_ATTN_FACTOR, m_SliderAttnFactor);
  59. DDX_Text(pDX, IDC_NAME, m_szName);
  60. DDV_MaxChars(pDX, m_szName, 40);
  61. DDX_Text(pDX, IDC_CUTOFF, m_fSpotAngle);
  62. DDX_Text(pDX, IDC_RADIUS, m_fRadius);
  63. DDX_Radio(pDX, IDC_ATTN_CONSTANT, m_iAttnConstant);
  64. DDX_Text(pDX, IDC_ATTN_FACTOR, m_fAttnFactor);
  65. DDX_Radio(pDX, IDC_W_DIRECTIONAL, m_iDirectional);
  66. //}}AFX_DATA_MAP
  67. }
  68. BEGIN_MESSAGE_MAP(C3dPageLight, CPropertyPage)
  69. //{{AFX_MSG_MAP(C3dPageLight)
  70. ON_CBN_SELCHANGE(IDC_LIGHT_TYPE_COMBO, OnSelchangeTypeCombo)
  71. ON_CBN_SELCHANGE(IDC_LIGHT_DISPLAY_COMBO, OnSelchangeDisplayCombo)
  72. ON_BN_CLICKED(IDC_ATTN_CONSTANT, OnAttnConstant)
  73. ON_BN_CLICKED(IDC_ATTN_LINEAR, OnAttnLinear)
  74. ON_BN_CLICKED(IDC_ATTN_QUADRATIC, OnAttnQuadratic)
  75. ON_EN_KILLFOCUS(IDC_ATTN_FACTOR, OnKillfocusAttnFactor)
  76. ON_BN_CLICKED(IDC_W_DIRECTIONAL, OnWDirectional)
  77. ON_BN_CLICKED(IDC_W_POSITIONAL, OnWPositional)
  78. ON_NOTIFY(NM_SETFOCUS, IDC_SLIDER_ATTN_FACTOR, OnSetfocusSliderAttnFactor)
  79. ON_NOTIFY(NM_RETURN, IDC_SLIDER_ATTN_FACTOR, OnReturnSliderAttnFactor)
  80. ON_WM_HSCROLL()
  81. //}}AFX_MSG_MAP
  82. END_MESSAGE_MAP()
  83. /////////////////////////////////////////////////////////////////////////////
  84. // C3dPageLight Methods / Implementation
  85. void C3dPageLight::SetWindowsState() 
  86. {
  87. switch(m_pLight->m_iLightType)
  88. {
  89. case LIGHT_AMBIENT:
  90. // Disable all windows except Name and Type
  91. GetDlgItem(IDC_LIGHT_DISPLAY_COMBO)->EnableWindow(FALSE);
  92. GetDlgItem(IDC_CUTOFF)->EnableWindow(FALSE);
  93. GetDlgItem(IDC_RADIUS)->EnableWindow(FALSE);
  94. GetDlgItem(IDC_W_DIRECTIONAL)->EnableWindow(FALSE);
  95. GetDlgItem(IDC_W_POSITIONAL)->EnableWindow(FALSE);
  96. break;
  97. case LIGHT_POINT:
  98. // Disable all windows except Name and Type
  99. GetDlgItem(IDC_LIGHT_DISPLAY_COMBO)->EnableWindow(TRUE);
  100. GetDlgItem(IDC_RADIUS)->EnableWindow(TRUE);
  101. GetDlgItem(IDC_W_DIRECTIONAL)->EnableWindow(TRUE);
  102. GetDlgItem(IDC_W_POSITIONAL)->EnableWindow(TRUE);
  103. GetDlgItem(IDC_CUTOFF)->EnableWindow(FALSE);
  104. break;
  105. case LIGHT_SPOT:
  106. // Disable all windows except Name and Type
  107. GetDlgItem(IDC_LIGHT_DISPLAY_COMBO)->EnableWindow(TRUE);
  108. GetDlgItem(IDC_RADIUS)->EnableWindow(TRUE);
  109. GetDlgItem(IDC_W_DIRECTIONAL)->EnableWindow(TRUE);
  110. GetDlgItem(IDC_W_POSITIONAL)->EnableWindow(TRUE);
  111. GetDlgItem(IDC_CUTOFF)->EnableWindow(TRUE);
  112. break;
  113. }
  114. // Set light Positional/Directional radio buttons
  115. if(m_iDirectional == 0 || m_pLight->m_iLightType == LIGHT_AMBIENT)
  116. {
  117. // Disable the radio button and data windows
  118. GetDlgItem(IDC_ATTN_CONSTANT)->EnableWindow(FALSE);
  119. GetDlgItem(IDC_ATTN_LINEAR)->EnableWindow(FALSE);
  120. GetDlgItem(IDC_ATTN_QUADRATIC)->EnableWindow(FALSE);
  121. GetDlgItem(IDC_ATTN_FACTOR)->EnableWindow(FALSE);
  122. GetDlgItem(IDC_SLIDER_ATTN_FACTOR)->EnableWindow(FALSE);
  123. }
  124. else
  125. {
  126. // Disable the radio button and data windows
  127. GetDlgItem(IDC_ATTN_CONSTANT)->EnableWindow(TRUE);
  128. GetDlgItem(IDC_ATTN_LINEAR)->EnableWindow(TRUE);
  129. GetDlgItem(IDC_ATTN_QUADRATIC)->EnableWindow(TRUE);
  130. GetDlgItem(IDC_ATTN_FACTOR)->EnableWindow(TRUE);
  131. GetDlgItem(IDC_SLIDER_ATTN_FACTOR)->EnableWindow(TRUE);
  132. }
  133. }
  134. /////////////////////////////////////////////////////////////////////////////
  135. // C3dPageLight message handlers
  136. BOOL C3dPageLight::OnInitDialog() 
  137. {
  138. float k, l, q;
  139. int count;
  140. // let the base class do the default work
  141. CPropertyPage::OnInitDialog();
  142. // Ensure that we have valid pointers
  143. if(!m_pWorld || !m_pLight)
  144. return FALSE;
  145. // Get the Directional lights' properties and set the dialog data
  146. m_szName.Format("%s", m_pLight->m_szName);
  147. m_pLight->GetSpotAngle(&m_fSpotAngle);
  148. m_pLight->GetRadius(&m_fRadius);
  149. // Fill our combo boxes and set the default selections:
  150. // Reset or clear the contents of the light Type combo box
  151. m_ComboType.ResetContent();
  152. // Load the light type selections
  153. m_ComboType.AddString("Ambient background");
  154. count = m_ComboType.GetCount() - 1; // zero based
  155. m_ComboType.SetItemData(count, NULL);
  156. m_ComboType.AddString("Point Light");
  157. count = m_ComboType.GetCount() - 1; // zero based
  158. m_ComboType.SetItemData(count, NULL);
  159. m_ComboType.AddString("Spot Light");
  160. count = m_ComboType.GetCount() - 1; // zero based
  161. m_ComboType.SetItemData(count, NULL);
  162. // Set a default selection
  163. m_ComboType.SetCurSel(m_pLight->m_iLightType);
  164. // Reset or clear the contents of the Display As combo box
  165. m_ComboDisplayAs.ResetContent();
  166. // Load the light type selections
  167. m_ComboDisplayAs.AddString("None");
  168. count = m_ComboDisplayAs.GetCount() - 1; // zero based
  169. m_ComboDisplayAs.SetItemData(count, NULL);
  170. m_ComboDisplayAs.AddString("Sphere");
  171. count = m_ComboDisplayAs.GetCount() - 1; // zero based
  172. m_ComboDisplayAs.SetItemData(count, NULL);
  173. m_ComboDisplayAs.AddString("Cylinder");
  174. count = m_ComboDisplayAs.GetCount() - 1; // zero based
  175. m_ComboDisplayAs.SetItemData(count, NULL);
  176. m_ComboDisplayAs.AddString("Rectangle");
  177. count = m_ComboDisplayAs.GetCount() - 1; // zero based
  178. m_ComboDisplayAs.SetItemData(count, NULL);
  179. // Set a default selection
  180. m_ComboDisplayAs.SetCurSel(m_pLight->m_iDisplayAs);
  181. // Set light Positional/Directional radio buttons
  182. if(m_pLight->m_fOrigin[3] == 0.0f)
  183. m_iDirectional = 0;
  184. else
  185. m_iDirectional = 1;
  186. // Get the lights' attenuation factor
  187. m_pLight->GetAttenuation(&k, &l, &q);
  188. // Get a pointer to our attenuation slider
  189. CSliderCtrl* pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_ATTN_FACTOR);
  190. pSlider->SetRange(0, 100, TRUE);
  191. // Set the dialog's radio buttons, the value in the 
  192. // attenuation data box and the initial position of
  193. // the attenuation slider control
  194. if(k > 0.0f)
  195. {
  196. m_iAttnConstant = 0;
  197. m_fAttnFactor = k;
  198. pSlider->SetPos((int)(k*100));
  199. }
  200. if(l > 0.0f)
  201. {
  202. m_iAttnConstant = 1;
  203. m_fAttnFactor = l;
  204. pSlider->SetPos((int)(l*100));
  205. }
  206. if(q > 0.0f)
  207. {
  208. m_iAttnConstant = 2;
  209. m_fAttnFactor = q;
  210. pSlider->SetPos((int)(q*100));
  211. }
  212. // Enable or Disable selected windows
  213. SetWindowsState();
  214. // Dialog box is being initialized (FALSE)
  215. // or data is being retrieved (TRUE).
  216. UpdateData(FALSE);
  217. return TRUE;  // return TRUE unless you set the focus to a control
  218.               // EXCEPTION: OCX Property Pages should return FALSE
  219. }
  220. void C3dPageLight::OnOK() 
  221. {
  222. // Dialog box is being initialized (FALSE)
  223. // or data is being retrieved (TRUE).
  224. UpdateData(TRUE);
  225. // Get the dialog data and set the Directional lights' properties
  226. m_pLight->m_szName = m_szName;
  227. m_pLight->SetSpotAngle(m_fSpotAngle);
  228. m_pLight->SetRadius(m_fRadius);
  229. if(m_iAttnConstant == 0)
  230. m_pLight->SetAttenuation(m_fAttnFactor, 0.0f, 0.0f);
  231. if(m_iAttnConstant == 1)
  232. m_pLight->SetAttenuation(0.0f, m_fAttnFactor, 0.0f);
  233. if(m_iAttnConstant == 2)
  234. m_pLight->SetAttenuation(0.0f, 0.0f, m_fAttnFactor);
  235. // Force the light to rebuild its' display list
  236. m_pLight->m_bBuildLists = TRUE;
  237. CPropertyPage::OnOK();
  238. }
  239. void C3dPageLight::OnSelchangeTypeCombo() 
  240. {
  241. // Get the zero-based index of the item selected
  242. m_pLight->m_iLightType = m_ComboType.GetCurSel();
  243. // Enable or Disable selected windows
  244. SetWindowsState();
  245. // Dialog box is being initialized (FALSE)
  246. // or data is being retrieved (TRUE).
  247. UpdateData(FALSE);
  248. }
  249. void C3dPageLight::OnSelchangeDisplayCombo() 
  250. {
  251. // Get the zero-based index of the item selected
  252. m_pLight->m_iDisplayAs = m_ComboDisplayAs.GetCurSel();
  253. // Enable or Disable selected windows
  254. SetWindowsState();
  255. // Dialog box is being initialized (FALSE)
  256. // or data is being retrieved (TRUE).
  257. UpdateData(FALSE);
  258. }
  259. void C3dPageLight::OnWDirectional() 
  260. {
  261. // Set the radio button
  262. m_iDirectional = 0;
  263. // Set the light's 'W' component
  264. m_pLight->m_fOrigin[W] = 0.0f;
  265. // Enable or Disable selected windows
  266. SetWindowsState();
  267. // Dialog box is being initialized (FALSE)
  268. // or data is being retrieved (TRUE).
  269. UpdateData(FALSE);
  270. }
  271. void C3dPageLight::OnWPositional() 
  272. {
  273. // Set the radio button
  274. m_iDirectional = 1;
  275. // Set the light's 'W' component
  276. m_pLight->m_fOrigin[W] = 1.0f;
  277. // Enable or Disable selected windows
  278. SetWindowsState();
  279. // Dialog box is being initialized (FALSE)
  280. // or data is being retrieved (TRUE).
  281. UpdateData(FALSE);
  282. }
  283. void C3dPageLight::OnAttnConstant() 
  284. {
  285. // Set the radio button
  286. m_iAttnConstant = 0;
  287. // Dialog box is being initialized (FALSE)
  288. // or data is being retrieved (TRUE).
  289. UpdateData(FALSE);
  290. }
  291. void C3dPageLight::OnAttnLinear() 
  292. {
  293. // Set the radio button
  294. m_iAttnConstant = 1;
  295. // Dialog box is being initialized (FALSE)
  296. // or data is being retrieved (TRUE).
  297. UpdateData(FALSE);
  298. }
  299. void C3dPageLight::OnAttnQuadratic() 
  300. {
  301. // Set the radio button
  302. m_iAttnConstant = 2;
  303. // Dialog box is being initialized (FALSE)
  304. // or data is being retrieved (TRUE).
  305. UpdateData(FALSE);
  306. }
  307. void C3dPageLight::OnKillfocusAttnFactor() 
  308. {
  309. // Dialog box is being initialized (FALSE)
  310. // or data is being retrieved (TRUE).
  311. UpdateData(TRUE);
  312. }
  313. void C3dPageLight::OnSetfocusSliderAttnFactor(NMHDR* pNMHDR, LRESULT* pResult) 
  314. {
  315. // TODO: Add your control notification handler code here
  316. *pResult = 0;
  317. }
  318. void C3dPageLight::OnReturnSliderAttnFactor(NMHDR* pNMHDR, LRESULT* pResult) 
  319. {
  320. // TODO: Add your control notification handler code here
  321. *pResult = 0;
  322. }
  323. void C3dPageLight::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  324. {
  325. // Note:  MFC maps vertically oriented CSliderCtrl to WM_VSCROLL
  326. //   and horizontally oriented CSliderCtrl to WM_HSCROLL
  327. // Get the position of our color slider and calculate the 
  328. // difference in position to our initial position
  329. int posn = m_SliderAttnFactor.GetPos();
  330. if(nSBCode == SB_LINELEFT) // nSBCode = 0
  331. {
  332. }
  333. if(nSBCode == SB_LINERIGHT) // nSBCode = 1
  334. {
  335. }
  336. if(nSBCode == SB_PAGELEFT) // nSBCode = 2
  337. {
  338. }
  339. if(nSBCode == SB_PAGERIGHT) // nSBCode = 3
  340. {
  341. }
  342. if(nSBCode == SB_THUMBPOSITION) // nSBCode = 4
  343. {
  344. m_fAttnFactor = posn/100.0f;
  345. // Dialog box is being initialized (FALSE)
  346. // or data is being retrieved (TRUE).
  347. UpdateData(FALSE);
  348. }
  349. if(nSBCode == SB_THUMBTRACK) // nSBCode = 5
  350. {
  351. m_fAttnFactor = posn/100.0f;
  352. // Dialog box is being initialized (FALSE)
  353. // or data is being retrieved (TRUE).
  354. UpdateData(FALSE);
  355. }
  356. CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
  357. }