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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // EditMaterialDlg.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 "EditNameDlg.h"
  24. #include "EditMaterialDlg.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CEditMaterialDlg dialog
  32. CEditMaterialDlg::CEditMaterialDlg(C3dMaterialList* pMatlList, C3dColorList* pColorList, CWnd* pParent /*=NULL*/)
  33. : CDialog(CEditMaterialDlg::IDD, pParent)
  34. {
  35. m_pMatlList = pMatlList;
  36. m_pColorList = pColorList;
  37. m_pLastMatl = NULL;
  38. //{{AFX_DATA_INIT(CEditMaterialDlg)
  39. m_fIndexOfRefraction = 0.0f;
  40. m_fSpecularPower = 0.0f;
  41. m_fTranslucency = 0.0f;
  42. m_szName = _T("");
  43. //}}AFX_DATA_INIT
  44. }
  45. void CEditMaterialDlg::DoDataExchange(CDataExchange* pDX)
  46. {
  47. CDialog::DoDataExchange(pDX);
  48. //{{AFX_DATA_MAP(CEditMaterialDlg)
  49. DDX_Control(pDX, IDC_COMBO_EMM_COLOR, m_ComboEmm);
  50. DDX_Control(pDX, IDC_COMBO_SPC_COLOR, m_ComboSpc);
  51. DDX_Control(pDX, IDC_COMBO_DIF_COLOR, m_ComboDif);
  52. DDX_Control(pDX, IDC_COMBO_AMB_COLOR, m_ComboAmb);
  53. DDX_Control(pDX, IDC_MATERIAL_LIST, m_ListBox);
  54. DDX_Text(pDX, IDC_INDEX_OF_REFRACTION, m_fIndexOfRefraction);
  55. DDV_MinMaxFloat(pDX, m_fIndexOfRefraction, 0.f, 10.f);
  56. DDX_Text(pDX, IDC_SPC_POWER, m_fSpecularPower);
  57. DDV_MinMaxFloat(pDX, m_fSpecularPower, 0.f, 128.f);
  58. DDX_Text(pDX, IDC_TRANSLUCENCY, m_fTranslucency);
  59. DDV_MinMaxFloat(pDX, m_fTranslucency, 0.f, 1.f);
  60. DDX_Text(pDX, IDC_MATERIAL_NAME, m_szName);
  61. //}}AFX_DATA_MAP
  62. }
  63. BEGIN_MESSAGE_MAP(CEditMaterialDlg, CDialog)
  64. //{{AFX_MSG_MAP(CEditMaterialDlg)
  65. ON_LBN_SELCHANGE(IDC_MATERIAL_LIST, OnSelchangeMaterialList)
  66. ON_WM_SHOWWINDOW()
  67. ON_EN_KILLFOCUS(IDC_SPC_POWER, OnKillfocusSpcPower)
  68. ON_EN_KILLFOCUS(IDC_INDEX_OF_REFRACTION, OnKillfocusIndexOfRefraction)
  69. ON_EN_KILLFOCUS(IDC_TRANSLUCENCY, OnKillfocusTranslucency)
  70. ON_BN_CLICKED(ID_NEW, OnNew)
  71. ON_BN_CLICKED(ID_DELETE, OnDelete)
  72. ON_WM_DRAWITEM()
  73. ON_BN_CLICKED(IDC_BUTTON_AMB_COLOR_WND, OnButtonAmbColor)
  74. ON_BN_CLICKED(IDC_BUTTON_DIF_COLOR_WND, OnButtonDifColor)
  75. ON_BN_CLICKED(IDC_BUTTON_SPC_COLOR_WND, OnButtonSpcColor)
  76. ON_BN_CLICKED(IDC_BUTTON_EMM_COLOR_WND, OnButtonEmmColor)
  77. ON_CBN_SELCHANGE(IDC_COMBO_AMB_COLOR, OnSelchangeComboAmbColor)
  78. ON_CBN_SELCHANGE(IDC_COMBO_DIF_COLOR, OnSelchangeComboDifColor)
  79. ON_CBN_SELCHANGE(IDC_COMBO_SPC_COLOR, OnSelchangeComboSpcColor)
  80. ON_CBN_SELCHANGE(IDC_COMBO_EMM_COLOR, OnSelchangeComboEmmColor)
  81. //}}AFX_MSG_MAP
  82. END_MESSAGE_MAP()
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CEditMaterialDlg message handlers
  85. BOOL CEditMaterialDlg::OnInitDialog() 
  86. {
  87. // let the base class do the default work
  88. CDialog::OnInitDialog();
  89. // Create the button color windows
  90. CRect rect;
  91. GetDlgItem(IDC_BUTTON_AMB_COLOR_WND)->GetWindowRect(&rect);
  92. ScreenToClient(&rect);
  93. m_wndAmbButtonColor.Create(NULL, // lpszClassName
  94. NULL, // lpszWindowName
  95. WS_CHILD | WS_VISIBLE | // dwStyle
  96. WS_DLGFRAME,
  97. rect, // rect
  98. this, // CWnd* pParentWnd
  99. IDC_BUTTON_AMB_COLOR_WND,// UINT  nID
  100. 0); // pContext
  101. GetDlgItem(IDC_BUTTON_DIF_COLOR_WND)->GetWindowRect(&rect);
  102. ScreenToClient(&rect);
  103. m_wndDifButtonColor.Create(NULL, // lpszClassName
  104. NULL, // lpszWindowName
  105. WS_CHILD | WS_VISIBLE | // dwStyle
  106. WS_DLGFRAME,
  107. rect, // rect
  108. this, // CWnd* pParentWnd
  109. IDC_BUTTON_DIF_COLOR_WND,// UINT  nID
  110. 0); // pContext
  111. GetDlgItem(IDC_BUTTON_SPC_COLOR_WND)->GetWindowRect(&rect);
  112. ScreenToClient(&rect);
  113. m_wndSpcButtonColor.Create(NULL, // lpszClassName
  114. NULL, // lpszWindowName
  115. WS_CHILD | WS_VISIBLE | // dwStyle
  116. WS_DLGFRAME,
  117. rect, // rect
  118. this, // CWnd* pParentWnd
  119. IDC_BUTTON_SPC_COLOR_WND,// UINT  nID
  120. 0); // pContext
  121. GetDlgItem(IDC_BUTTON_EMM_COLOR_WND)->GetWindowRect(&rect);
  122. ScreenToClient(&rect);
  123. m_wndEmmButtonColor.Create(NULL, // lpszClassName
  124. NULL, // lpszWindowName
  125. WS_CHILD | WS_VISIBLE | // dwStyle
  126. WS_DLGFRAME,
  127. rect, // rect
  128. this, // CWnd* pParentWnd
  129. IDC_BUTTON_EMM_COLOR_WND,// UINT  nID
  130. 0); // pContext
  131. GetDlgItem(IDC_MATERIAL_PREVIEW_WND)->GetWindowRect(&rect);
  132. ScreenToClient(&rect);
  133. m_wndMaterialPreview.Create(NULL, // dwExtStyle
  134. NULL, // lpszClassName
  135. NULL, // lpszWindowName
  136. WS_CHILD | WS_VISIBLE | // dwStyle
  137. WS_DLGFRAME,
  138. rect, // rect
  139. this, // CWnd* pParentWnd
  140. IDC_MATERIAL_PREVIEW_WND,// UINT  nID
  141. 0); // pContext
  142. // Load the material list box with the supplied
  143. // material list
  144. C3dMaterial* pMatl = NULL;
  145. if(m_pMatlList)
  146. {
  147. pMatl = m_pMatlList->LoadListBox(&m_ListBox);
  148. if(pMatl)
  149. // Display the materials values
  150. LoadDialogData(pMatl);
  151. }
  152. // Load the color combo boxes with the supplied
  153. // color list
  154. if(m_pColorList)
  155. {
  156. if(pMatl)
  157. {
  158. m_pColorList->LoadComboBox(&m_ComboAmb, &pMatl->m_ColorAmbient);
  159. m_pColorList->LoadComboBox(&m_ComboDif, &pMatl->m_ColorDiffuse);
  160. m_pColorList->LoadComboBox(&m_ComboSpc, &pMatl->m_ColorSpecular);
  161. m_pColorList->LoadComboBox(&m_ComboEmm, &pMatl->m_ColorEmmissive);
  162. }
  163. else
  164. {
  165. m_pColorList->LoadComboBox(&m_ComboAmb, NULL);
  166. m_pColorList->LoadComboBox(&m_ComboDif, NULL);
  167. m_pColorList->LoadComboBox(&m_ComboSpc, NULL);
  168. m_pColorList->LoadComboBox(&m_ComboEmm, NULL);
  169. }
  170. }
  171. return TRUE;  // return TRUE unless you set the focus to a control
  172.               // EXCEPTION: OCX Property Pages should return FALSE
  173. }
  174. void CEditMaterialDlg::OnSelchangeMaterialList() 
  175. {
  176. C3dMaterial* pMatl;
  177. // Get the zero-based index of the item selected
  178. int index = m_ListBox.GetCurSel();
  179. // Save the last selected material and reload the list
  180. // box.  (The user may have changed the name of the
  181. // material..)
  182. if(m_pLastMatl)
  183. {
  184. SaveDialogData(m_pLastMatl);
  185. // pMatl = LoadListBox();
  186. }
  187. // Cast the user selected list box items' lParam to
  188. // a C3dMaterial pointer..
  189. pMatl = (C3dMaterial*)m_ListBox.GetItemData(index);
  190. if(pMatl)
  191. {
  192. // Display the materials values
  193. LoadDialogData(pMatl);
  194. // Repaint our material's color buttons
  195. PaintButtonWnd(&m_wndAmbButtonColor, &m_pLastMatl->m_ColorAmbient);
  196. PaintButtonWnd(&m_wndDifButtonColor, &m_pLastMatl->m_ColorDiffuse);
  197. PaintButtonWnd(&m_wndSpcButtonColor, &m_pLastMatl->m_ColorSpecular);
  198. PaintButtonWnd(&m_wndEmmButtonColor, &m_pLastMatl->m_ColorEmmissive);
  199. }
  200. }
  201. void CEditMaterialDlg::OnOK() 
  202. {
  203. if(m_pLastMatl) {
  204. // Save the dialog data to the material
  205. SaveDialogData(m_pLastMatl);
  206. }
  207. CDialog::OnOK();
  208. }
  209. void CEditMaterialDlg::LoadDialogData(C3dMaterial* pMatl)
  210. {
  211. // Set our local values to the materials' values
  212. m_szName = pMatl->m_szName;
  213. m_fSpecularPower = pMatl->m_fSpecularPower;
  214. m_fIndexOfRefraction = pMatl->m_fIOR;
  215. m_fTranslucency = pMatl->m_fTranslucency;
  216. // Set our material preview windows material to 
  217. // the currently selected material and repaint
  218. // the window
  219. m_wndMaterialPreview.m_pMaterial = pMatl;
  220. m_wndMaterialPreview.InvalidateRect(NULL, FALSE);
  221. // Dialog box is being initialized (FALSE)
  222. // or data is being retrieved (TRUE).
  223. UpdateData(FALSE);
  224. // Save the pointer
  225. m_pLastMatl = pMatl;
  226. }
  227. void CEditMaterialDlg::SaveDialogData(C3dMaterial* pMatl)
  228. {
  229. // Dialog box is being initialized (FALSE)
  230. // or data is being retrieved (TRUE).
  231. UpdateData(TRUE);
  232. // Set our materials values to the local values
  233. pMatl->m_szName = m_szName;
  234. pMatl->m_fSpecularPower = m_fSpecularPower;
  235. pMatl->m_fIOR = m_fIndexOfRefraction;
  236. pMatl->m_fTranslucency = m_fTranslucency;
  237. }
  238. void CEditMaterialDlg::OnShowWindow(BOOL bShow, UINT nStatus) 
  239. {
  240. CDialog::OnShowWindow(bShow, nStatus);
  241. if(bShow) // Reload list box
  242. {
  243. // Load the material list box with the supplied
  244. // material list
  245. C3dMaterial* pMatl = NULL;
  246. if(m_pMatlList)
  247. {
  248. pMatl = m_pMatlList->LoadListBox(&m_ListBox);
  249. if(pMatl)
  250. // Display the materials values
  251. LoadDialogData(pMatl);
  252. }
  253. // Load the color combo boxes with the supplied
  254. // color list
  255. if(m_pColorList)
  256. {
  257. if(pMatl)
  258. {
  259. m_pColorList->LoadComboBox(&m_ComboAmb, &pMatl->m_ColorAmbient);
  260. m_pColorList->LoadComboBox(&m_ComboDif, &pMatl->m_ColorDiffuse);
  261. m_pColorList->LoadComboBox(&m_ComboSpc, &pMatl->m_ColorSpecular);
  262. m_pColorList->LoadComboBox(&m_ComboEmm, &pMatl->m_ColorEmmissive);
  263. }
  264. else
  265. {
  266. m_pColorList->LoadComboBox(&m_ComboAmb, NULL);
  267. m_pColorList->LoadComboBox(&m_ComboDif, NULL);
  268. m_pColorList->LoadComboBox(&m_ComboSpc, NULL);
  269. m_pColorList->LoadComboBox(&m_ComboEmm, NULL);
  270. }
  271. }
  272. }
  273. }
  274. void CEditMaterialDlg::ResetDlg(C3dMaterialList* pMatlList, C3dColorList* pColorList) 
  275. {
  276. m_pMatlList  = pMatlList;
  277. m_pColorList = pColorList;
  278. m_pLastMatl = NULL;
  279. }
  280. void CEditMaterialDlg::OnKillfocusSpcPower() 
  281. {
  282. if(m_pLastMatl)
  283. SaveDialogData(m_pLastMatl);
  284. }
  285. void CEditMaterialDlg::OnKillfocusIndexOfRefraction() 
  286. {
  287. if(m_pLastMatl)
  288. SaveDialogData(m_pLastMatl);
  289. }
  290. void CEditMaterialDlg::OnKillfocusTranslucency() 
  291. {
  292. if(m_pLastMatl)
  293. SaveDialogData(m_pLastMatl);
  294. }
  295. void CEditMaterialDlg::OnNew() 
  296. {
  297. // Get the name of the new color
  298. CEditNameDlg newNameDlg(this);
  299. if(newNameDlg.DoModal() == IDOK)
  300. {
  301. if(m_pLastMatl)
  302. {
  303. C3dMaterial* pMatl = NULL;
  304. pMatl = C3dMaterial::Create();
  305. pMatl->m_szName = newNameDlg.m_szName;
  306. if(!m_pMatlList->Find(pMatl))
  307. {
  308. // pMatl is not in the list, so add to to list,
  309. // reload the list box, select the material, reload
  310. // the dialog data.
  311. m_pMatlList->Append(pMatl);
  312. m_pMatlList->LoadListBox(&m_ListBox);
  313. // Display the materials values
  314. LoadDialogData(pMatl);
  315. }
  316. else
  317. C3dMaterial::Delete(pMatl);
  318. }
  319. }
  320. }
  321. void CEditMaterialDlg::OnDelete() 
  322. {
  323. // TODO: Add your control notification handler code here
  324. }
  325. void CEditMaterialDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
  326. {
  327. // Let the base class draw the control item first
  328. CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
  329. if(!m_pLastMatl)
  330. return;
  331. if(nIDCtl == IDC_BUTTON_AMB_COLOR_WND)
  332. PaintButtonWnd(&m_wndAmbButtonColor, &m_pLastMatl->m_ColorAmbient);
  333. if(nIDCtl == IDC_BUTTON_DIF_COLOR_WND)
  334. PaintButtonWnd(&m_wndDifButtonColor, &m_pLastMatl->m_ColorDiffuse);
  335. if(nIDCtl == IDC_BUTTON_SPC_COLOR_WND)
  336. PaintButtonWnd(&m_wndSpcButtonColor, &m_pLastMatl->m_ColorSpecular);
  337. if(nIDCtl == IDC_BUTTON_EMM_COLOR_WND)
  338. PaintButtonWnd(&m_wndEmmButtonColor, &m_pLastMatl->m_ColorEmmissive);
  339. }
  340. void CEditMaterialDlg::PaintButtonWnd(CWnd* pWnd, C3dColor* pColor) 
  341. {
  342. CRect rect; // window rect
  343. CDC* pDC; // pointer to a device context
  344. // Get the size of the gradient window
  345. pWnd->GetWindowRect(&rect);
  346. // Get a pointer to the windows device context
  347. pDC = pWnd->GetDC();
  348. if(pDC)
  349. pDC->FillSolidRect(0,
  350.    0,
  351.    rect.right-rect.left,
  352.    rect.bottom-rect.top,
  353.    COLORREF RGB(pColor->m_fColor[0]*255,
  354. pColor->m_fColor[1]*255,
  355. pColor->m_fColor[2]*255));
  356. ReleaseDC(pDC);
  357. }
  358. void CEditMaterialDlg::OnButtonAmbColor() 
  359. {
  360. if(m_pLastMatl) 
  361. {
  362. // Create the dialog
  363. CEditColorDlg colorDlg(m_pColorList, &m_pLastMatl->m_ColorAmbient, this);
  364. // Invoke the modal dialog box and return the
  365. // dialog-box result when done.
  366. if(colorDlg.DoModal() == IDOK)
  367. {
  368. // Save any changes the user may have made
  369. m_pLastMatl->m_ColorAmbient.SetColor4fv(&colorDlg.m_Color);
  370. PaintButtonWnd(&m_wndAmbButtonColor, &m_pLastMatl->m_ColorAmbient);
  371. }
  372. }
  373. else
  374. AfxMessageBox("A Material has not been selected.  Create a new material or select one from the list.", MB_OK); 
  375. }
  376. void CEditMaterialDlg::OnButtonDifColor() 
  377. {
  378. if(m_pLastMatl) 
  379. {
  380. // Create the dialog
  381. CEditColorDlg colorDlg(m_pColorList, &m_pLastMatl->m_ColorDiffuse, this);
  382. // Invoke the modal dialog box and return the
  383. // dialog-box result when done.
  384. if(colorDlg.DoModal() == IDOK)
  385. {
  386. // Save any changes the user may have made
  387. m_pLastMatl->m_ColorDiffuse.SetColor4fv(&colorDlg.m_Color);
  388. PaintButtonWnd(&m_wndDifButtonColor, &m_pLastMatl->m_ColorDiffuse);
  389. }
  390. }
  391. else
  392. AfxMessageBox("A Material has not been selected.  Create a new material or select one from the list.", MB_OK); 
  393. }
  394. void CEditMaterialDlg::OnButtonSpcColor() 
  395. {
  396. if(m_pLastMatl) 
  397. {
  398. // Create the dialog
  399. CEditColorDlg colorDlg(m_pColorList, &m_pLastMatl->m_ColorSpecular, this);
  400. // Invoke the modal dialog box and return the
  401. // dialog-box result when done.
  402. if(colorDlg.DoModal() == IDOK)
  403. {
  404. // Save any changes the user may have made
  405. m_pLastMatl->m_ColorSpecular.SetColor4fv(&colorDlg.m_Color);
  406. PaintButtonWnd(&m_wndSpcButtonColor, &m_pLastMatl->m_ColorSpecular);
  407. }
  408. }
  409. else
  410. AfxMessageBox("A Material has not been selected.  Create a new material or select one from the list.", MB_OK); 
  411. }
  412. void CEditMaterialDlg::OnButtonEmmColor() 
  413. {
  414. if(m_pLastMatl) 
  415. {
  416. // Create the dialog
  417. CEditColorDlg colorDlg(m_pColorList, &m_pLastMatl->m_ColorEmmissive, this);
  418. // Invoke the modal dialog box and return the
  419. // dialog-box result when done.
  420. if(colorDlg.DoModal() == IDOK)
  421. {
  422. // Save any changes the user may have made
  423. m_pLastMatl->m_ColorEmmissive.SetColor4fv(&colorDlg.m_Color);
  424. PaintButtonWnd(&m_wndEmmButtonColor, &m_pLastMatl->m_ColorEmmissive);
  425. }
  426. }
  427. else
  428. AfxMessageBox("A Material has not been selected.  Create a new material or select one from the list.", MB_OK); 
  429. }
  430. void CEditMaterialDlg::OnSelchangeComboAmbColor() 
  431. {
  432. C3dColor* pColor;
  433. // Get the zero-based index of the item selected
  434. int index = m_ComboAmb.GetCurSel();
  435. // Cast the user selected list box items' lParam to
  436. // a C3dColor pointer..
  437. pColor = (C3dColor*)m_ComboAmb.GetItemData(index);
  438. if(pColor)
  439. {
  440. // Set the material's color value and paint the color
  441. // button window
  442. if(m_pLastMatl)
  443. m_pLastMatl->m_ColorAmbient.SetColor4fv(pColor);
  444. PaintButtonWnd(&m_wndAmbButtonColor, pColor);
  445. }
  446. }
  447. void CEditMaterialDlg::OnSelchangeComboDifColor() 
  448. {
  449. C3dColor* pColor;
  450. // Get the zero-based index of the item selected
  451. int index = m_ComboDif.GetCurSel();
  452. // Cast the user selected list box items' lParam to
  453. // a C3dColor pointer..
  454. pColor = (C3dColor*)m_ComboDif.GetItemData(index);
  455. if(pColor)
  456. {
  457. // Set the material's color value and paint the color
  458. // button window
  459. if(m_pLastMatl)
  460. m_pLastMatl->m_ColorDiffuse.SetColor4fv(pColor);
  461. PaintButtonWnd(&m_wndDifButtonColor, pColor);
  462. }
  463. }
  464. void CEditMaterialDlg::OnSelchangeComboSpcColor() 
  465. {
  466. C3dColor* pColor;
  467. // Get the zero-based index of the item selected
  468. int index = m_ComboSpc.GetCurSel();
  469. // Cast the user selected list box items' lParam to
  470. // a C3dColor pointer..
  471. pColor = (C3dColor*)m_ComboSpc.GetItemData(index);
  472. if(pColor)
  473. {
  474. // Set the material's color value and paint the color
  475. // button window
  476. if(m_pLastMatl)
  477. m_pLastMatl->m_ColorSpecular.SetColor4fv(pColor);
  478. PaintButtonWnd(&m_wndSpcButtonColor, pColor);
  479. }
  480. }
  481. void CEditMaterialDlg::OnSelchangeComboEmmColor() 
  482. {
  483. C3dColor* pColor;
  484. // Get the zero-based index of the item selected
  485. int index = m_ComboEmm.GetCurSel();
  486. // Cast the user selected list box items' lParam to
  487. // a C3dColor pointer..
  488. pColor = (C3dColor*)m_ComboEmm.GetItemData(index);
  489. if(pColor)
  490. {
  491. // Set the material's color value and paint the color
  492. // button window
  493. if(m_pLastMatl)
  494. m_pLastMatl->m_ColorEmmissive.SetColor4fv(pColor);
  495. PaintButtonWnd(&m_wndEmmButtonColor, pColor);
  496. }
  497. }