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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dPageLightColor.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. // C3dPageLightColor
  30. IMPLEMENT_DYNCREATE(C3dPageLightColor, CPropertyPage)
  31. /////////////////////////////////////////////////////////////////////////////
  32. // C3dPageLightColor dialog construction
  33. C3dPageLightColor::C3dPageLightColor()
  34. :CPropertyPage(C3dPageLightColor::IDD)
  35. {
  36. m_pWorld = NULL;
  37. m_pLight = NULL;
  38. //{{AFX_DATA_INIT(C3dPageLightColor)
  39. m_fSpotExp = 0.0f;
  40. //}}AFX_DATA_INIT
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. // C3dPageLightColor Destructor
  44. C3dPageLightColor::~C3dPageLightColor()
  45. {
  46. }
  47. void C3dPageLightColor::DoDataExchange(CDataExchange* pDX)
  48. {
  49. CPropertyPage::DoDataExchange(pDX);
  50. //{{AFX_DATA_MAP(C3dPageLightColor)
  51. DDX_Control(pDX, IDC_SLIDER_SPEC_HIGHLIGHT, m_SliderSpecHighlight);
  52. DDX_Control(pDX, IDC_COLOR_SPC_COMBO, m_ComboSpc);
  53. DDX_Control(pDX, IDC_COLOR_DIF_COMBO, m_ComboDif);
  54. DDX_Control(pDX, IDC_COLOR_AMB_COMBO, m_ComboAmb);
  55. DDX_Text(pDX, IDC_SPC_POWER, m_fSpotExp);
  56. //}}AFX_DATA_MAP
  57. }
  58. BEGIN_MESSAGE_MAP(C3dPageLightColor, CPropertyPage)
  59. //{{AFX_MSG_MAP(C3dPageLightColor)
  60. ON_BN_CLICKED(IDC_BUTTON_AMB_COLOR_WND, OnButtonAmbColorWnd)
  61. ON_BN_CLICKED(IDC_BUTTON_DIF_COLOR_WND, OnButtonDifColorWnd)
  62. ON_BN_CLICKED(IDC_BUTTON_SPC_COLOR_WND, OnButtonSpcColorWnd)
  63. ON_CBN_SELCHANGE(IDC_COLOR_AMB_COMBO, OnSelchangeColorAmbCombo)
  64. ON_CBN_SELCHANGE(IDC_COLOR_DIF_COMBO, OnSelchangeColorDifCombo)
  65. ON_CBN_SELCHANGE(IDC_COLOR_SPC_COMBO, OnSelchangeColorSpcCombo)
  66. ON_WM_DRAWITEM()
  67. ON_WM_HSCROLL()
  68. //}}AFX_MSG_MAP
  69. END_MESSAGE_MAP()
  70. /////////////////////////////////////////////////////////////////////////////
  71. // C3dPageLightColor operations
  72. void C3dPageLightColor::PaintButtonWnd(CWnd* pWnd, C3dColor* pColor) 
  73. {
  74. CRect rect; // window rect
  75. CDC* pDC; // pointer to a device context
  76. // Get the size of the gradient window
  77. pWnd->GetWindowRect(&rect);
  78. // Get a pointer to the windows device context
  79. pDC = pWnd->GetDC();
  80. if(pDC)
  81. pDC->FillSolidRect(0,
  82.    0,
  83.    rect.right-rect.left,
  84.    rect.bottom-rect.top,
  85.    COLORREF RGB(pColor->m_fColor[0]*255,
  86. pColor->m_fColor[1]*255,
  87. pColor->m_fColor[2]*255));
  88. ReleaseDC(pDC);
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // C3dPageLightColor message handlers
  92. BOOL C3dPageLightColor::OnInitDialog() 
  93. {
  94. // let the base class do the default work
  95. CPropertyPage::OnInitDialog();
  96. if(!m_pWorld)
  97. return FALSE;
  98. // Create the owner drawn button color window
  99. CRect rect;
  100. GetDlgItem(IDC_BUTTON_AMB_COLOR_WND)->GetWindowRect(&rect);
  101. ScreenToClient(&rect);
  102. m_wndAmbButtonColor.Create(NULL, // lpszClassName
  103.    NULL, // lpszWindowName
  104.    WS_CHILD | WS_VISIBLE | // dwStyle
  105.    WS_DLGFRAME,
  106.    rect, // rect
  107.    this, // CWnd* pParentWnd
  108.    IDC_BUTTON_AMB_COLOR_WND,// UINT  nID
  109.    0); // pContext
  110. GetDlgItem(IDC_BUTTON_DIF_COLOR_WND)->GetWindowRect(&rect);
  111. ScreenToClient(&rect);
  112. m_wndDifButtonColor.Create(NULL, // lpszClassName
  113.    NULL, // lpszWindowName
  114.    WS_CHILD | WS_VISIBLE | // dwStyle
  115.    WS_DLGFRAME,
  116.    rect, // rect
  117.    this, // CWnd* pParentWnd
  118.    IDC_BUTTON_DIF_COLOR_WND,// UINT  nID
  119.    0); // pContext
  120. GetDlgItem(IDC_BUTTON_SPC_COLOR_WND)->GetWindowRect(&rect);
  121. ScreenToClient(&rect);
  122. m_wndSpcButtonColor.Create(NULL, // lpszClassName
  123.    NULL, // lpszWindowName
  124.    WS_CHILD | WS_VISIBLE | // dwStyle
  125.    WS_DLGFRAME,
  126.    rect, // rect
  127.    this, // CWnd* pParentWnd
  128.    IDC_BUTTON_SPC_COLOR_WND,// UINT  nID
  129.    0); // pContext
  130. // Load the Color Combo boxes
  131. if(m_pWorld)
  132. {
  133. m_pWorld->m_ColorList.LoadComboBox(&m_ComboAmb, &m_pLight->m_ColorAmbient);
  134. m_pWorld->m_ColorList.LoadComboBox(&m_ComboDif, &m_pLight->m_ColorDiffuse);
  135. m_pWorld->m_ColorList.LoadComboBox(&m_ComboSpc, &m_pLight->m_ColorSpecular);
  136. }
  137. // Initialize the dialog data
  138. m_pLight->GetSpecularPwr(&m_fSpotExp);
  139. // Get a pointer to our attenuation slider, set its range and position.
  140. CSliderCtrl* pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_SPEC_HIGHLIGHT);
  141. // Note that OpenGL defines the spot exponent from 0 to 128
  142. pSlider->SetRange(0, 128, TRUE);
  143. pSlider->SetPos((int)(m_fSpotExp));
  144. // Dialog box is being initialized (FALSE)
  145. // or data is being retrieved (TRUE).
  146. UpdateData(FALSE);
  147. return TRUE;  // return TRUE unless you set the focus to a control
  148.               // EXCEPTION: OCX Property Pages should return FALSE
  149. }
  150. void C3dPageLightColor::OnOK() 
  151. {
  152. // Dialog box is being initialized (FALSE)
  153. // or data is being retrieved (TRUE).
  154. UpdateData(TRUE);
  155. // Get the dialog data and set the Directional lights' properties
  156. m_pLight->SetSpecularPwr(m_fSpotExp);
  157. // Force the light to rebuild its' display list
  158. m_pLight->m_bBuildLists = TRUE;
  159. CPropertyPage::OnOK();
  160. }
  161. void C3dPageLightColor::OnButtonAmbColorWnd() 
  162. {
  163. if(m_pWorld && m_pLight) 
  164. {
  165. // Create the dialog
  166. CEditColorDlg colorDlg(&m_pWorld->m_ColorList, &m_pLight->m_ColorAmbient, this);
  167. // Invoke the modal dialog box and return the
  168. // dialog-box result when done.
  169. if(colorDlg.DoModal() == IDOK)
  170. {
  171. // Save any changes the user may have made
  172. m_pLight->m_ColorAmbient.SetColor4fv(&colorDlg.m_Color);
  173. PaintButtonWnd(&m_wndAmbButtonColor, &m_pLight->m_ColorAmbient);
  174. }
  175. }
  176. }
  177. void C3dPageLightColor::OnButtonDifColorWnd() 
  178. {
  179. if(m_pWorld && m_pLight) 
  180. {
  181. // Create the dialog
  182. CEditColorDlg colorDlg(&m_pWorld->m_ColorList, &m_pLight->m_ColorDiffuse, this);
  183. // Invoke the modal dialog box and return the
  184. // dialog-box result when done.
  185. if(colorDlg.DoModal() == IDOK)
  186. {
  187. // Save any changes the user may have made
  188. m_pLight->m_ColorDiffuse.SetColor4fv(&colorDlg.m_Color);
  189. PaintButtonWnd(&m_wndDifButtonColor, &m_pLight->m_ColorDiffuse);
  190. }
  191. }
  192. }
  193. void C3dPageLightColor::OnButtonSpcColorWnd() 
  194. {
  195. if(m_pWorld && m_pLight) 
  196. {
  197. // Create the dialog
  198. CEditColorDlg colorDlg(&m_pWorld->m_ColorList, &m_pLight->m_ColorSpecular, this);
  199. // Invoke the modal dialog box and return the
  200. // dialog-box result when done.
  201. if(colorDlg.DoModal() == IDOK)
  202. {
  203. // Save any changes the user may have made
  204. m_pLight->m_ColorSpecular.SetColor4fv(&colorDlg.m_Color);
  205. PaintButtonWnd(&m_wndSpcButtonColor, &m_pLight->m_ColorSpecular);
  206. }
  207. }
  208. }
  209. void C3dPageLightColor::OnSelchangeColorAmbCombo() 
  210. {
  211. C3dColor* pColor;
  212. // Get the zero-based index of the item selected
  213. int index = m_ComboAmb.GetCurSel();
  214. // Cast the user selected list box items' lParam to
  215. // a C3dColor pointer..
  216. pColor = (C3dColor*)m_ComboAmb.GetItemData(index);
  217. if(pColor)
  218. {
  219. // Set the light ambient color and paint button
  220. // window
  221. m_pLight->m_ColorAmbient.SetColor4fv(pColor);
  222. PaintButtonWnd(&m_wndAmbButtonColor, pColor);
  223. }
  224. }
  225. void C3dPageLightColor::OnSelchangeColorDifCombo() 
  226. {
  227. C3dColor* pColor;
  228. // Get the zero-based index of the item selected
  229. int index = m_ComboDif.GetCurSel();
  230. // Cast the user selected list box items' lParam to
  231. // a C3dColor pointer..
  232. pColor = (C3dColor*)m_ComboDif.GetItemData(index);
  233. if(pColor)
  234. {
  235. // Set the light ambient color and paint button
  236. // window
  237. m_pLight->m_ColorDiffuse.SetColor4fv(pColor);
  238. PaintButtonWnd(&m_wndDifButtonColor, pColor);
  239. }
  240. }
  241. void C3dPageLightColor::OnSelchangeColorSpcCombo() 
  242. {
  243. C3dColor* pColor;
  244. // Get the zero-based index of the item selected
  245. int index = m_ComboSpc.GetCurSel();
  246. // Cast the user selected list box items' lParam to
  247. // a C3dColor pointer..
  248. pColor = (C3dColor*)m_ComboSpc.GetItemData(index);
  249. if(pColor)
  250. {
  251. // Set the light ambient color and paint button
  252. // window
  253. m_pLight->m_ColorSpecular.SetColor4fv(pColor);
  254. PaintButtonWnd(&m_wndSpcButtonColor, pColor);
  255. }
  256. }
  257. void C3dPageLightColor::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
  258. {
  259. CPropertyPage::OnDrawItem(nIDCtl, lpDrawItemStruct);
  260. if(nIDCtl == IDC_BUTTON_AMB_COLOR_WND && m_wndAmbButtonColor.m_hWnd)
  261. PaintButtonWnd(&m_wndAmbButtonColor, &m_pLight->m_ColorAmbient);
  262. if(nIDCtl == IDC_BUTTON_DIF_COLOR_WND && m_wndDifButtonColor.m_hWnd)
  263. PaintButtonWnd(&m_wndDifButtonColor, &m_pLight->m_ColorDiffuse);
  264. if(nIDCtl == IDC_BUTTON_SPC_COLOR_WND && m_wndSpcButtonColor.m_hWnd)
  265. PaintButtonWnd(&m_wndSpcButtonColor, &m_pLight->m_ColorSpecular);
  266. }
  267. void C3dPageLightColor::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  268. {
  269. // Note:  MFC maps vertically oriented CSliderCtrl to WM_VSCROLL
  270. //   and horizontally oriented CSliderCtrl to WM_HSCROLL
  271. // Get the position of our color slider and calculate the 
  272. // difference in position to our initial position
  273. int posn = m_SliderSpecHighlight.GetPos();
  274. if(nSBCode == SB_LINELEFT) // nSBCode = 0
  275. {
  276. }
  277. if(nSBCode == SB_LINERIGHT) // nSBCode = 1
  278. {
  279. }
  280. if(nSBCode == SB_PAGELEFT) // nSBCode = 2
  281. {
  282. }
  283. if(nSBCode == SB_PAGERIGHT) // nSBCode = 3
  284. {
  285. }
  286. if(nSBCode == SB_THUMBPOSITION) // nSBCode = 4
  287. {
  288. m_fSpotExp = (float)posn;
  289. // Dialog box is being initialized (FALSE)
  290. // or data is being retrieved (TRUE).
  291. UpdateData(FALSE);
  292. }
  293. if(nSBCode == SB_THUMBTRACK) // nSBCode = 5
  294. {
  295. m_fSpotExp = (float)posn;
  296. // Dialog box is being initialized (FALSE)
  297. // or data is being retrieved (TRUE).
  298. UpdateData(FALSE);
  299. }
  300. CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
  301. }