DLGMATERIAL.CPP
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 11k
Category:

OpenCV

Development Platform:

Visual C++

  1. // DlgMaterial.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "3DEditor.h"
  5. #include "3DEditorDoc.h"
  6. #include "3DEditorView.h"
  7. #include "DlgMaterial.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // DlgMaterial dialog
  15. DlgMaterial::DlgMaterial(CWnd* pParent /*=NULL*/)
  16. : CDialog(DlgMaterial::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(DlgMaterial)
  19. // NOTE: the ClassWizard will add member initialization here
  20. //}}AFX_DATA_INIT
  21. curmat=0;
  22. }
  23. void DlgMaterial::DoDataExchange(CDataExchange* pDX)
  24. {
  25. CDialog::DoDataExchange(pDX);
  26. //{{AFX_DATA_MAP(DlgMaterial)
  27. DDX_Control(pDX, IDC_NAME, m_names);
  28. //}}AFX_DATA_MAP
  29. }
  30. BEGIN_MESSAGE_MAP(DlgMaterial, CDialog)
  31. //{{AFX_MSG_MAP(DlgMaterial)
  32. ON_WM_CLOSE()
  33. ON_WM_LBUTTONDOWN()
  34. ON_CBN_SELCHANGE(IDC_NAME, OnSelchangeName)
  35. ON_WM_PAINT()
  36. ON_EN_KILLFOCUS(IDC_OPACITY, OnKillfocusOpacity)
  37. ON_EN_KILLFOCUS(IDC_SELFILLUM, OnKillfocusSelfillum)
  38. ON_EN_KILLFOCUS(IDC_SHININESS, OnKillfocusShininess)
  39. ON_EN_KILLFOCUS(IDC_STRENGTH, OnKillfocusStrength)
  40. ON_BN_CLICKED(IDC_BUT_OPACITY, OnButOpacity)
  41. ON_BN_CLICKED(IDC_BUT_SELFILLUM, OnButSelfillum)
  42. ON_BN_CLICKED(IDC_BUT_BUMP, OnButBump)
  43. ON_BN_CLICKED(IDC_BUT_TEXT1, OnButText1)
  44. ON_EN_KILLFOCUS(IDC_REFLECTION, OnKillfocusReflection)
  45. ON_EN_KILLFOCUS(IDC_REFRACTION, OnKillfocusRefraction)
  46. ON_EN_KILLFOCUS(IDC_AM_BUMP, OnKillfocusAmBump)
  47. ON_EN_KILLFOCUS(IDC_AM_OPACITY, OnKillfocusAmOpacity)
  48. ON_EN_KILLFOCUS(IDC_AM_SELFILLUM, OnKillfocusAmSelfillum)
  49. //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. // DlgMaterial message handlers
  53. BOOL DlgMaterial::OnInitDialog() 
  54. {
  55. CDialog::OnInitDialog();
  56. winpos2.left=-1;
  57. winpos2.top=-1;
  58. int i,j;
  59. for( i=0;i<doc->nmatlib;i++ )
  60. {
  61. j=m_names.AddString(doc->matlib[i].name);
  62. m_names.SetItemData(j,i);
  63. }
  64. if (winpos2.left!=-1)
  65. SetWindowPos(0,winpos2.left,winpos2.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
  66. m_names.SetCurSel(0);
  67. curmat=&doc->matlib[m_names.GetItemData(0)];
  68. FillDlg();
  69. FillColors();
  70. return TRUE;  
  71. }
  72. void DlgMaterial::OnOK() 
  73. {
  74. }
  75. void DlgMaterial::OnCancel() 
  76. {
  77. }
  78. void DlgMaterial::Close()
  79. {
  80. OnClose();
  81. }
  82. void DlgMaterial::OnClose() 
  83. {
  84. GetWindowRect(&winpos2);
  85. CDialog **d=&doc->dlgmat;
  86. delete doc->dlgmat;
  87. *d=0;
  88. }
  89. void DlgMaterial::OnLButtonDown(UINT nFlags, CPoint point) 
  90. {
  91. CRect rect;
  92. CPoint p;
  93. float *v=0;
  94. GetDlgItem(IDC_AMBIENT)->GetClientRect(&rect);
  95. GetDlgItem(IDC_AMBIENT)->MapWindowPoints( this, &rect);
  96. if (rect.left<=point.x && rect.right>=point.x && rect.top<=point.y && rect.bottom>=point.y)
  97. v=&curmat->ambient[0];
  98. GetDlgItem(IDC_DIFFUSE)->GetClientRect(&rect);
  99. GetDlgItem(IDC_DIFFUSE)->MapWindowPoints( this, &rect);
  100. if (rect.left<=point.x && rect.right>=point.x && rect.top<=point.y && rect.bottom>=point.y)
  101. v=&curmat->diffuse[0];
  102. GetDlgItem(IDC_SPECULAR)->GetClientRect(&rect);
  103. GetDlgItem(IDC_SPECULAR)->MapWindowPoints( this, &rect);
  104. if (rect.left<=point.x && rect.right>=point.x && rect.top<=point.y && rect.bottom>=point.y)
  105. v=&curmat->specular[0];
  106. if (v)
  107. {
  108. COLORREF cr=RGB(v[0]*255,v[1]*255,v[2]*255);
  109. CColorDialog c(cr);
  110. if (c.DoModal()==IDOK)
  111. {
  112. cr=c.GetColor();
  113. v[0]=GetRValue(cr)/(float)255;
  114. v[1]=GetGValue(cr)/(float)255;
  115. v[2]=GetBValue(cr)/(float)255;
  116. FillColors();
  117. doc->UpdateAllViews(0);
  118. }
  119. }
  120. CDialog::OnLButtonDown(nFlags, point);
  121. }
  122. void DlgMaterial::FillDlg()
  123. {
  124. SetDlgItemInt(IDC_AM_OPACITY,curmat->map_opacity.amount);
  125. SetDlgItemInt(IDC_AM_BUMP,curmat->map_bump.amount);
  126. SetDlgItemInt(IDC_AM_SELFILLUM,curmat->map_selfillum.amount);
  127. SetDlgItemText(IDC_TEXT1_MAP,curmat->map_texture1.filename);
  128. SetDlgItemText(IDC_OPACITY_MAP,curmat->map_opacity.filename);
  129. SetDlgItemText(IDC_BUMP_MAP,curmat->map_bump.filename);
  130. SetDlgItemText(IDC_SELFILLUM_MAP,curmat->map_selfillum.filename);
  131. GetDlgItem(IDC_AM_OPACITY)->EnableWindow(curmat->map_opacity.filename[0]!=0);
  132. GetDlgItem(IDC_OPACITY)->EnableWindow(curmat->map_opacity.filename[0]==0);
  133. GetDlgItem(IDC_AM_BUMP)->EnableWindow(curmat->map_bump.filename[0]!=0);
  134. GetDlgItem(IDC_AM_SELFILLUM)->EnableWindow(curmat->map_selfillum.filename[0]!=0);
  135. GetDlgItem(IDC_SELFILLUM)->EnableWindow(curmat->map_selfillum.filename[0]==0);
  136. char str[256];
  137. sprintf(str,"%4.2f",1-curmat->transparency);
  138. SetDlgItemText(IDC_OPACITY,str);
  139. sprintf(str,"%4.2f",curmat->shininess);
  140. SetDlgItemText(IDC_SHININESS,str);
  141. sprintf(str,"%4.2f",curmat->shininess_strength);
  142. SetDlgItemText(IDC_STRENGTH,str);
  143. sprintf(str,"%4.2f",curmat->self_illum);
  144. SetDlgItemText(IDC_SELFILLUM,str);
  145. sprintf(str,"%4.2f",curmat->reflection);
  146. SetDlgItemText(IDC_REFLECTION,str);
  147. sprintf(str,"%4.2f",curmat->refraction);
  148. SetDlgItemText(IDC_REFRACTION,str);
  149. FillColors();
  150. }
  151. void DlgMaterial::FillColors()
  152. {
  153. CBrush *b;
  154. CRect rect;
  155. CDC *dc;
  156. COLORREF c;
  157. c=RGB((int)(curmat->ambient[0]*255),(int)(curmat->ambient[1]*255),(int)(curmat->ambient[2]*255));
  158. b=new CBrush(c);
  159. GetDlgItem(IDC_AMBIENT)->GetClientRect(&rect);
  160. rect.DeflateRect(3,3);
  161. dc=GetDlgItem(IDC_AMBIENT)->GetDC();
  162. dc->FillRect(rect,b);
  163. GetDlgItem(IDC_AMBIENT)->ReleaseDC(dc);
  164. delete b;
  165. c=RGB(curmat->diffuse[0]*255,curmat->diffuse[1]*255,curmat->diffuse[2]*255);
  166. b=new CBrush(c);
  167. GetDlgItem(IDC_DIFFUSE)->GetClientRect(&rect);
  168. rect.DeflateRect(3,3);
  169. dc=GetDlgItem(IDC_DIFFUSE)->GetDC();
  170. dc->FillRect(rect,b);
  171. GetDlgItem(IDC_DIFFUSE)->ReleaseDC(dc);
  172. delete b;
  173. c=RGB(curmat->specular[0]*255,curmat->specular[1]*255,curmat->specular[2]*255);
  174. b=new CBrush(c);
  175. GetDlgItem(IDC_SPECULAR)->GetClientRect(&rect);
  176. rect.DeflateRect(3,3);
  177. dc=GetDlgItem(IDC_SPECULAR)->GetDC();
  178. dc->FillRect(rect,b);
  179. GetDlgItem(IDC_SPECULAR)->ReleaseDC(dc);
  180. delete b;
  181. }
  182. void DlgMaterial::OnSelchangeName() 
  183. {
  184. curmat=&doc->matlib[m_names.GetItemData(m_names.GetCurSel())];
  185. FillDlg();
  186. }
  187. void DlgMaterial::OnPaint() 
  188. {
  189. CPaintDC dc(this);
  190. if (curmat) FillColors();
  191. }
  192. void DlgMaterial::OnKillfocusOpacity() 
  193. {
  194. float f;
  195. char str[256];
  196. GetDlgItemText(IDC_OPACITY,str,255);
  197. if (sscanf(str,"%f",&f))
  198. {
  199. if (fabs(f-(1-curmat->transparency))>0.0001)
  200. doc->SetModifiedFlag();
  201. curmat->transparency=1-f;
  202. }
  203. sprintf(str,"%4.2f",1-curmat->transparency);
  204. SetDlgItemText(IDC_OPACITY,str);
  205. }
  206. void DlgMaterial::OnKillfocusSelfillum() 
  207. {
  208. float f;
  209. char str[256];
  210. GetDlgItemText(IDC_SELFILLUM,str,255);
  211. if (sscanf(str,"%f",&f))
  212. {
  213. if (f!=curmat->self_illum)
  214. {
  215. doc->SetModifiedFlag();
  216. doc->UpdateAllViews(0);
  217. }
  218. curmat->self_illum=f;
  219. }
  220. sprintf(str,"%4.2f",curmat->self_illum);
  221. SetDlgItemText(IDC_SELFILLUM,str);
  222. }
  223. void DlgMaterial::OnKillfocusShininess() 
  224. {
  225. float f;
  226. char str[256];
  227. GetDlgItemText(IDC_SHININESS,str,255);
  228. if (sscanf(str,"%f",&f))
  229. {
  230. if (f!=curmat->shininess)
  231. {
  232. doc->SetModifiedFlag();
  233. doc->UpdateAllViews(0);
  234. }
  235. curmat->shininess=f;
  236. }
  237. sprintf(str,"%4.2f",curmat->shininess);
  238. SetDlgItemText(IDC_SHININESS,str);
  239. }
  240. void DlgMaterial::OnKillfocusStrength() 
  241. {
  242. float f;
  243. char str[256];
  244. GetDlgItemText(IDC_STRENGTH,str,255);
  245. if (sscanf(str,"%f",&f))
  246. {
  247. if (f!=curmat->shininess_strength)
  248. {
  249. doc->SetModifiedFlag();
  250. doc->UpdateAllViews(0);
  251. }
  252. curmat->shininess_strength=f;
  253. }
  254. sprintf(str,"%4.2f",curmat->shininess_strength);
  255. SetDlgItemText(IDC_STRENGTH,str);
  256. }
  257. void DlgMaterial::LoadMap(struct mapping *mapp)
  258. {
  259. CString s;
  260. s.LoadString(IDS_FD_TGAJPGBMP);
  261. CFileDialog fd(TRUE,0,mapp->filename,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
  262. if(fd.DoModal()==IDOK)
  263. strcpy(mapp->filename,(char *)(LPCSTR)fd.GetFileName());
  264. else strcpy(mapp->filename,"");
  265. if (mapp->filename[0])
  266. {
  267. BeginWaitCursor();
  268. mapp->piclibindx=doc->find_image(mapp->filename);
  269. EndWaitCursor();
  270. }
  271. else 
  272. {
  273. mapp->piclibindx=-1;
  274. strcpy(mapp->filename,"");
  275. }
  276. }
  277. void DlgMaterial::OnButOpacity() 
  278. {
  279. LoadMap(&curmat->map_opacity);
  280. GetDlgItem(IDC_OPACITY_MAP)->SetWindowText(curmat->map_opacity.filename);
  281. GetDlgItem(IDC_AM_OPACITY)->EnableWindow(curmat->map_opacity.piclibindx!=-1);
  282. GetDlgItem(IDC_OPACITY)->EnableWindow(curmat->map_opacity.piclibindx==-1);
  283. doc->SetModifiedFlag();
  284. doc->UpdateAllViews(0);
  285. }
  286. void DlgMaterial::OnButSelfillum() 
  287. {
  288. LoadMap(&curmat->map_selfillum);
  289. GetDlgItem(IDC_SELFILLUM_MAP)->SetWindowText(curmat->map_selfillum.filename);
  290. GetDlgItem(IDC_AM_SELFILLUM)->EnableWindow(curmat->map_selfillum.piclibindx!=-1);
  291. GetDlgItem(IDC_SELFILLUM)->EnableWindow(curmat->map_selfillum.piclibindx==-1);
  292. doc->SetModifiedFlag();
  293. doc->UpdateAllViews(0);
  294. }
  295. void DlgMaterial::OnButBump() 
  296. {
  297. LoadMap(&curmat->map_bump);
  298. GetDlgItem(IDC_BUMP_MAP)->SetWindowText(curmat->map_bump.filename);
  299. GetDlgItem(IDC_AM_BUMP)->EnableWindow(curmat->map_bump.piclibindx!=-1);
  300. doc->SetModifiedFlag();
  301. doc->UpdateAllViews(0);
  302. }
  303. void DlgMaterial::OnButText1() 
  304. {
  305. LoadMap(&curmat->map_texture1);
  306. GetDlgItem(IDC_TEXT1_MAP)->SetWindowText(curmat->map_texture1.filename);
  307. doc->SetModifiedFlag();
  308. doc->UpdateAllViews(0);
  309. }
  310. void DlgMaterial::OnKillfocusReflection() 
  311. {
  312. float f;
  313. char str[256];
  314. GetDlgItemText(IDC_REFLECTION,str,255);
  315. if (sscanf(str,"%f",&f))
  316. {
  317. if (f!=curmat->reflection)
  318. doc->SetModifiedFlag();
  319. curmat->reflection=f;
  320. }
  321. sprintf(str,"%4.2f",curmat->reflection);
  322. SetDlgItemText(IDC_REFLECTION,str);
  323. }
  324. void DlgMaterial::OnKillfocusRefraction() 
  325. {
  326. float f;
  327. char str[256];
  328. GetDlgItemText(IDC_REFRACTION,str,255);
  329. if (sscanf(str,"%f",&f))
  330. {
  331. if (f!=curmat->refraction)
  332. doc->SetModifiedFlag();
  333. curmat->refraction=f;
  334. }
  335. sprintf(str,"%4.2f",curmat->refraction);
  336. SetDlgItemText(IDC_REFRACTION,str);
  337. }
  338. void DlgMaterial::OnKillfocusAmBump() 
  339. {
  340. int i;
  341. char str[256];
  342. GetDlgItemText(IDC_AM_BUMP,str,255);
  343. if (sscanf(str,"%i",&i))
  344. {
  345. if (i!=curmat->map_bump.amount)
  346. doc->SetModifiedFlag();
  347. curmat->map_bump.amount=i;
  348. }
  349. sprintf(str,"%i",curmat->map_bump.amount);
  350. SetDlgItemText(IDC_AM_BUMP,str);
  351. }
  352. void DlgMaterial::OnKillfocusAmOpacity() 
  353. {
  354. int i;
  355. char str[256];
  356. GetDlgItemText(IDC_AM_OPACITY,str,255);
  357. if (sscanf(str,"%i",&i))
  358. {
  359. if (i!=curmat->map_opacity.amount)
  360. doc->SetModifiedFlag();
  361. curmat->map_opacity.amount=i;
  362. }
  363. sprintf(str,"%i",curmat->map_opacity.amount);
  364. SetDlgItemText(IDC_AM_OPACITY,str);
  365. }
  366. void DlgMaterial::OnKillfocusAmSelfillum() 
  367. {
  368. int i;
  369. char str[256];
  370. GetDlgItemText(IDC_AM_SELFILLUM,str,255);
  371. if (sscanf(str,"%i",&i))
  372. {
  373. if (i!=curmat->map_selfillum.amount)
  374. doc->SetModifiedFlag();
  375. curmat->map_selfillum.amount=i;
  376. }
  377. sprintf(str,"%i",curmat->map_selfillum.amount);
  378. SetDlgItemText(IDC_AM_SELFILLUM,str);
  379. }