3DEDITORDOC.CPP
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 23k
Category:

OpenCV

Development Platform:

Visual C++

  1. // 3DEditorDoc.cpp : implementation of the CMy3DEditorDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "3DEditor.h"
  5. #include "3DEditorDoc.h"
  6. #include "DlgImport.h"
  7. #include "ImportProgress.h"
  8. #include "3DEditorView.h"
  9. #include "DlgMaterial.h"
  10. #include "DlgMapping.h"
  11. #include "DlgProperties.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. extern CStatusBar *statbar;
  18. char str[256]="",docpath[256]="";
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CMy3DEditorDoc
  21. IMPLEMENT_DYNCREATE(CMy3DEditorDoc, CDocument)
  22. BEGIN_MESSAGE_MAP(CMy3DEditorDoc, CDocument)
  23. //{{AFX_MSG_MAP(CMy3DEditorDoc)
  24. ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
  25. ON_COMMAND(ID_PROPERTIES, OnProperties)
  26. ON_UPDATE_COMMAND_UI(ID_PROPERTIES, OnUpdateProperties)
  27. ON_COMMAND(ID_MAPPING, OnMapping)
  28. ON_UPDATE_COMMAND_UI(ID_MAPPING, OnUpdateMapping)
  29. ON_COMMAND(ID_EDIT_BACKGROUND_BLACK, OnEditBackgroundBlack)
  30. ON_UPDATE_COMMAND_UI(ID_EDIT_BACKGROUND_BLACK, OnUpdateEditBackgroundBlack)
  31. ON_COMMAND(ID_EDIT_BACKGROUND_CUSTOM, OnEditBackgroundCustom)
  32. ON_UPDATE_COMMAND_UI(ID_EDIT_BACKGROUND_CUSTOM, OnUpdateEditBackgroundCustom)
  33. ON_COMMAND(ID_EDIT_BACKGROUND_WHITE, OnEditBackgroundWhite)
  34. ON_UPDATE_COMMAND_UI(ID_EDIT_BACKGROUND_WHITE, OnUpdateEditBackgroundWhite)
  35. ON_COMMAND(ID_EDIT_LIGHTS_CONSTANT, OnEditLightsConstant)
  36. ON_UPDATE_COMMAND_UI(ID_EDIT_LIGHTS_CONSTANT, OnUpdateEditLightsConstant)
  37. ON_COMMAND(ID_EDIT_LIGHTS_HEADLIGHT, OnEditLightsHeadlight)
  38. ON_UPDATE_COMMAND_UI(ID_EDIT_LIGHTS_HEADLIGHT, OnUpdateEditLightsHeadlight)
  39. ON_COMMAND(ID_EDIT_LIGHTS_SCENE, OnEditLightsScene)
  40. ON_UPDATE_COMMAND_UI(ID_EDIT_LIGHTS_SCENE, OnUpdateEditLightsScene)
  41. ON_COMMAND(ID_EDIT_AMBIENTLIGHT, OnEditAmbientlight)
  42. ON_COMMAND(ID_TEXTINTERP, OnTextinterp)
  43. ON_UPDATE_COMMAND_UI(ID_TEXTINTERP, OnUpdateTextinterp)
  44. ON_COMMAND(IDM_BACKCULL, OnBackcull)
  45. ON_UPDATE_COMMAND_UI(IDM_BACKCULL, OnUpdateBackcull)
  46. ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
  47. ON_COMMAND(ID_INVERTNORMALS, OnInvertnormals)
  48. ON_UPDATE_COMMAND_UI(ID_INVERTNORMALS, OnUpdateInvertnormals)
  49. ON_COMMAND(ID_MATERIALS, OnMaterials)
  50. ON_UPDATE_COMMAND_UI(ID_MATERIALS, OnUpdateMaterials)
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CMy3DEditorDoc construction/destruction
  55. CMy3DEditorDoc::CMy3DEditorDoc()
  56. {
  57. // TODO: add one-time construction code here
  58. bboxC.Vec(0,0,0);
  59. bbox1.Vec(-1,-1,-1);
  60. bbox2.Vec(1,1,1);
  61. bboxdiag=2.0;
  62. dlgprop=0;
  63. dlgmat=0;
  64. dlgmap=0;
  65. selobj=0;
  66. selface=-1;
  67. }
  68. CMy3DEditorDoc::~CMy3DEditorDoc()
  69. {
  70. }
  71. BOOL CMy3DEditorDoc::OnNewDocument()
  72. {
  73. if (!CDocument::OnNewDocument())
  74. return FALSE;
  75. // TODO: add reinitialization code here
  76. // (SDI documents will reuse this document)
  77. return TRUE;
  78. }
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CMy3DEditorDoc serialization
  81. void CMy3DEditorDoc::Serialize(CArchive& ar)
  82. {
  83. int i,j,k;
  84. char c;
  85. unsigned short s;
  86. ChunkFile cf(ar.GetFile());
  87. if (ar.IsStoring())
  88. {
  89. cf.Open(MAGIC_NUMBER);
  90. cf.Open(1);
  91. cf.Write(&bbox1, sizeof(vector));
  92. cf.Write(&bbox2, sizeof(vector));
  93. c=headlight;
  94. cf.Write(&c,1);
  95. c=backface;
  96. cf.Write(&c,1);
  97. c=textinterp;
  98. cf.Write(&c,1);
  99. cf.Write(&amblight,sizeof(vector));
  100. cf.Write(&background,sizeof(vector));
  101. cf.Open(2);
  102. cf.Write(&ncamlib, sizeof(int));
  103. for( i=0;i<ncamlib;i++ )
  104. {
  105. cf.Write(camlib[i].name,strlen(camlib[i].name)+1);
  106. cf.Write(&camlib[i].Vp, sizeof(vector));
  107. cf.Write(&camlib[i].Lp, sizeof(vector));
  108. cf.Write(&camlib[i].theta, sizeof(float));
  109. }
  110. cf.Close();
  111. cf.Open(3);
  112. cf.Write(&nlights, sizeof(int));
  113. for( i=0;i<nlights;i++ )
  114. {
  115. cf.Write(lightlib[i].name,strlen(lightlib[i].name)+1);
  116. c=lightlib[i].type;
  117. cf.Write(&c,sizeof(char));
  118. cf.Write(&lightlib[i].color, sizeof(vector));
  119. cf.Write(&lightlib[i].pos, sizeof(vector));
  120. if (c)
  121. {
  122. cf.Write(&lightlib[i].target, sizeof(vector));
  123. cf.Write(&lightlib[i].hotspot, sizeof(float));
  124. cf.Write(&lightlib[i].falloff, sizeof(float));
  125. }
  126. }
  127. cf.Close();
  128. cf.Open(4);
  129. cf.Write(&nmatlib, sizeof(int));
  130. for( i=0;i<nmatlib;i++ )
  131. {
  132. cf.Write(matlib[i].name,strlen(matlib[i].name)+1);
  133. cf.Write(&matlib[i], sizeof(material)-sizeof(struct mapping)*8-256);
  134. for( j=0;j<8;j++ )
  135. if ((&matlib[i].map_texture1)[j].filename[0])
  136. cf.Write(&(&matlib[i].map_texture1)[j],sizeof(struct mapping));
  137. else cf.Write(&(&matlib[i].map_texture1)[j].filename[0],1);
  138. }
  139. cf.Close();
  140. cf.Open(5);
  141. cf.Write(&nobj, sizeof(int));
  142. object *o=obj0;
  143. ncoef=0;
  144. while (o)
  145. {
  146. o->Serialize(cf,true);
  147. ncoef+=o->ncoef;
  148. o=o->next;
  149. }
  150. cf.Close();
  151. cf.Close();
  152. cf.Open(6);
  153. cf.Write(&ncoef, sizeof(int));
  154. float d,dm;
  155. object *om;
  156. int e,em;
  157. int im;
  158. do
  159. {
  160. i=0;
  161. om=0;
  162. dm=0;
  163. o=obj0;
  164. while(o)
  165. {
  166. for( e=0;e<o->nelem;e++ )
  167. {
  168. d=0;
  169. if (o->elem[e].ncoef)
  170. if (o->elem[e].cur_coef==0)
  171. d=o->elem[e].coef->weight;
  172. else if (o->elem[e].cur_coef->next)
  173. d=o->elem[e].cur_coef->next->weight;
  174. if (d>dm)
  175. {
  176. dm=d;
  177. om=o;
  178. em=e;
  179. im=i;
  180. }
  181. }
  182. o=o->next;
  183. i++;
  184. }
  185. if(om!=0)
  186. {
  187. cf.Write(&im, sizeof(int));
  188. cf.Write(&em, sizeof(int));
  189. if(om->elem[em].cur_coef==0)
  190. om->elem[em].cur_coef=om->elem[em].coef;
  191. else
  192. om->elem[em].cur_coef=om->elem[em].cur_coef->next;
  193. if(om->nv>65535 || om->nf>65535)
  194. {
  195. cf.Write(om->elem[em].cur_coef,sizeof(ctlist)-sizeof(int *)-2*sizeof(ctlist *));
  196. cf.Write(om->elem[em].cur_coef->fv,sizeof(int)*om->elem[em].cur_coef->nfv);
  197. }
  198. else
  199. {
  200. cf.Write(om->elem[em].cur_coef,sizeof(ctlist)-sizeof(int *)-2*sizeof(ctlist *)-10*sizeof(int));
  201. s=om->elem[em].cur_coef->vert1;
  202. cf.Write(&s,sizeof(unsigned short));
  203. s=om->elem[em].cur_coef->vert2;
  204. cf.Write(&s,sizeof(unsigned short));
  205. s=om->elem[em].cur_coef->vert3;
  206. cf.Write(&s,sizeof(unsigned short));
  207. s=om->elem[em].cur_coef->vert4;
  208. cf.Write(&s,sizeof(unsigned short));
  209. s=om->elem[em].cur_coef->face1;
  210. cf.Write(&s,sizeof(unsigned short));
  211. s=om->elem[em].cur_coef->face2;
  212. cf.Write(&s,sizeof(unsigned short));
  213. s=om->elem[em].cur_coef->face3;
  214. cf.Write(&s,sizeof(unsigned short));
  215. s=om->elem[em].cur_coef->face4;
  216. cf.Write(&s,sizeof(unsigned short));
  217. s=om->elem[em].cur_coef->face5;
  218. cf.Write(&s,sizeof(unsigned short));
  219. s=om->elem[em].cur_coef->face6;
  220. cf.Write(&s,sizeof(unsigned short));
  221. for( i=0;i<om->elem[em].cur_coef->nfv;i++ )
  222. {
  223. s=om->elem[em].cur_coef->fv[i];
  224. cf.Write(&s,sizeof(unsigned short));
  225. }
  226. }
  227. }
  228. } while(om!=0);
  229. cf.Close();
  230. o=obj0;
  231. while(o)
  232. {
  233. for( e=0;e<o->nelem;e++ )
  234. {
  235. o->elem[e].cur_coef=0;
  236. i=o->elem[e].cur_ncoef;
  237. o->elem[e].cur_ncoef=-1;
  238. while( o->elem[e].cur_ncoef<i )
  239. o->AddCoef(e);
  240. }
  241. o=o->next;
  242. }
  243. cf.Close();
  244. }
  245. else
  246. {
  247. cf.ReadHeader();
  248. if(cf.Id!=MAGIC_NUMBER)
  249. return;
  250. while(!cf.End())
  251. {
  252. cf.ReadHeader();
  253. switch(cf.Id)
  254. {
  255. case 1:
  256. cf.Read(&bbox1,sizeof(vector));
  257. cf.Read(&bbox2,sizeof(vector));
  258. cf.Read(&c,1);
  259. headlight=c;
  260. cf.Read(&c,1);
  261. backface=c;
  262. cf.Read(&c,1);
  263. textinterp=c;
  264. cf.Read(&amblight,sizeof(vector));
  265. cf.Read(&background,sizeof(vector));
  266. while(!cf.End())
  267. {
  268. cf.ReadHeader();
  269. switch(cf.Id)
  270. {
  271. case 2:
  272. cf.Read(&ncamlib, sizeof(int));
  273. if(ncamlib)
  274. {
  275. camlib=new camera[ncamlib];
  276. for( i=0;i<ncamlib;i++ )
  277. {
  278. k=0;
  279. do cf.Read(&camlib[i].name[k],sizeof(char));
  280. while(camlib[i].name[k++]!=0);
  281. cf.Read(&camlib[i].Vp, sizeof(vector));
  282. cf.Read(&camlib[i].Lp, sizeof(vector));
  283. cf.Read(&camlib[i].theta, sizeof(float));
  284. }
  285. }
  286. break;
  287. case 3:
  288. cf.Read(&nlights, sizeof(int));
  289. if (nlights)
  290. {
  291. lightlib=new light[nlights];
  292. for( i=0;i<nlights;i++ )
  293. {
  294. k=0;
  295. do cf.Read(&lightlib[i].name[k],sizeof(char));
  296. while(lightlib[i].name[k++]!=0);
  297. cf.Read(&c,sizeof(char));
  298. lightlib[i].type=c;
  299. cf.Read(&lightlib[i].color, sizeof(vector));
  300. cf.Read(&lightlib[i].pos, sizeof(vector));
  301. if (lightlib[i].type)
  302. {
  303. cf.Read(&lightlib[i].target, sizeof(vector));
  304. cf.Read(&lightlib[i].hotspot, sizeof(float));
  305. cf.Read(&lightlib[i].falloff, sizeof(float));
  306. lightlib[i].dir=lightlib[i].target-lightlib[i].pos;
  307. lightlib[i].dir.Normalize();
  308. }
  309. }
  310. }
  311. break;
  312. case 4:
  313. delete matlib;
  314. cf.Read(&nmatlib, sizeof(int));
  315. if(nmatlib)
  316. {
  317. matlib=new material[nmatlib];
  318. for( i=0;i<nmatlib;i++ )
  319. {
  320. k=0;
  321. do cf.Read(&matlib[i].name[k],sizeof(char));
  322. while(matlib[i].name[k++]!=0);
  323. cf.Read(&matlib[i], sizeof(material)-sizeof(struct mapping)*8-256);
  324. for(j=0;j<8;j++)
  325. {
  326. cf.Read(&(&matlib[i].map_texture1)[j].filename[0],1);
  327. if ((&matlib[i].map_texture1)[j].filename[0])
  328. cf.Read(&(&matlib[i].map_texture1)[j].filename[1],sizeof(struct mapping)-1);
  329. }
  330. }
  331. }
  332. break;
  333. case 5:
  334. cf.Read(&nobj, sizeof(int));
  335. for(i=0; i<nobj; i++)
  336. {
  337. object *o=new object;
  338. o->next=obj0;
  339. obj0=o;
  340. o->Serialize(cf, false);
  341. o->cur_ncoef=-1;
  342. o->ncoef=0;
  343. for( j=0;j<o->nelem;j++ )
  344. {
  345. o->cur_ncoef=-1;
  346. o->ncoef+=o->elem[j].ncoef;
  347. o->elem[j].cur_coef=0;
  348. }
  349. }
  350. break;
  351. }
  352. cf.Next();
  353. }
  354. break;
  355. case 6:
  356. {
  357. cf.Read(&ncoef, sizeof(int));
  358. int im, em;
  359. object **io=new object *[nobj];
  360. int n_ele=0;
  361. object *o=obj0;
  362. for(i=nobj-1;i>=0;i--)
  363. {
  364. io[i]=o;
  365. n_ele+=o->nelem;
  366. o=o->next;
  367. }
  368. int j,p=0;
  369. int *n_iant=new int[n_ele];
  370. for(i=0;i<nobj;i++)
  371. for(j=0;j<io[i]->nelem;j++)
  372. {
  373. n_iant[p++]=io[i]->elem[j].cur_ncoef;
  374. io[i]->elem[j].cur_ncoef=-1;
  375. io[i]->elem[j].ncoef=0;
  376. }
  377. for(i=0; i<ncoef; i++)
  378. {
  379. cf.Read(&im, sizeof(int));
  380. cf.Read(&em, sizeof(int));
  381. ctlist *c=new ctlist;
  382. if(io[im]->nv>65535 || io[im]->nf>65535)
  383. {
  384. cf.Read(c,sizeof(ctlist)-sizeof(int *)-2*sizeof(ctlist *));
  385. c->fv=new int[c->nfv];
  386. cf.Read(c->fv,sizeof(int)*c->nfv);
  387. }
  388. else
  389. {
  390. cf.Read(c,sizeof(ctlist)-sizeof(int *)-2*sizeof(ctlist *)-10*sizeof(int));
  391. cf.Read(&s,sizeof(unsigned short));
  392. c->vert1=s;
  393. cf.Read(&s,sizeof(unsigned short));
  394. c->vert2=s;
  395. cf.Read(&s,sizeof(unsigned short));
  396. c->vert3=s;
  397. cf.Read(&s,sizeof(unsigned short));
  398. c->vert4=s;
  399. cf.Read(&s,sizeof(unsigned short));
  400. c->face1=s;
  401. cf.Read(&s,sizeof(unsigned short));
  402. c->face2=s;
  403. cf.Read(&s,sizeof(unsigned short));
  404. c->face3=s;
  405. cf.Read(&s,sizeof(unsigned short));
  406. c->face4=s;
  407. cf.Read(&s,sizeof(unsigned short));
  408. c->face5=s;
  409. cf.Read(&s,sizeof(unsigned short));
  410. c->face6=s;
  411. c->fv=new int[c->nfv];
  412. for( k=0;k<c->nfv;k++ )
  413. {
  414. cf.Read(&s,sizeof(unsigned short));
  415. c->fv[k]=s;
  416. }
  417. }
  418. c->prev=io[im]->elem[em].cur_coef;
  419. if (io[im]->elem[em].cur_coef)
  420. io[im]->elem[em].cur_coef->next=c;
  421. else io[im]->elem[em].coef=c;
  422. io[im]->elem[em].ncoef++;
  423. io[im]->AddCoef(em);
  424. }
  425. p=0;
  426. for(i=0;i<nobj;i++)
  427. for(j=0;j<io[i]->nelem;j++)
  428. {
  429. while(io[i]->elem[j].cur_ncoef!=n_iant[p])
  430. io[i]->DelCoef(j);
  431. p++;
  432. }
  433. delete io;
  434. delete n_iant;
  435. }
  436. break;
  437. }
  438. cf.Next();
  439. }
  440. ComputeBBoxes();
  441. CFile* fp = ar.GetFile();
  442. strcpy(docpath,(char *)(LPCSTR)fp->GetFilePath());
  443. if (strrchr(docpath,'\'))
  444. *strrchr(docpath,'\')=0;
  445. else docpath[0]=0;
  446. load_images();
  447. }
  448. }
  449. /////////////////////////////////////////////////////////////////////////////
  450. // CMy3DEditorDoc diagnostics
  451. #ifdef _DEBUG
  452. void CMy3DEditorDoc::AssertValid() const
  453. {
  454. CDocument::AssertValid();
  455. }
  456. void CMy3DEditorDoc::Dump(CDumpContext& dc) const
  457. {
  458. CDocument::Dump(dc);
  459. }
  460. #endif //_DEBUG
  461. /////////////////////////////////////////////////////////////////////////////
  462. // CMy3DEditorDoc commands
  463. void CMy3DEditorDoc::OnFileImport() 
  464. {
  465. // TODO: Add your command handler code here
  466. CString s;
  467. s.LoadString(IDS_FD_3DS3D);
  468. CFileDialog fd(TRUE,0,0,OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
  469. if (fd.DoModal()==IDOK)
  470. {
  471. DlgImport di;
  472. di.doc=this;
  473. strcpy(di.filename,(char *)(LPCSTR)fd.GetPathName());
  474. char *c=strrchr(di.filename,'.');
  475. if (c==0 || stricmp(c+1,"3d"))
  476. if (di.DoModal()==IDOK)
  477. {
  478. ComputeBBoxes();
  479. SetModifiedFlag();
  480. ImportProgress ip;
  481. ip.doc=this;
  482. ip.DoModal();
  483. BeginWaitCursor();
  484. CString s;
  485. s.LoadString(IDS_LOADTEXT);
  486. statbar->SetPaneText(0,s);
  487. statbar->UpdateWindow();
  488. docpath[0]=0;
  489. load_images();
  490. POSITION pos = GetFirstViewPosition();
  491. while (pos != NULL)
  492. {
  493. CView* pView = GetNextView(pos);
  494. if (((CMy3DEditorView *)pView)->cur_cam==-1)
  495. if (ncamlib)
  496. {
  497. ((CMy3DEditorView *)pView)->LookAt(camlib[0].Vp,camlib[0].Lp);
  498. ((CMy3DEditorView *)pView)->cur_cam=0;
  499. }
  500. else ((CMy3DEditorView *)pView)->OnViewViewall();
  501. }
  502. EndWaitCursor();
  503. statbar->SetPaneText(0,"");
  504. }
  505. else ;
  506. else 
  507. {
  508. FILE *fp=fopen(di.filename,"rt");
  509. if (fp)
  510. {
  511. BeginWaitCursor();
  512. int a,i,j,k,t;
  513. object *o=new object;
  514. nobj++;
  515. o->next=obj0;
  516. obj0=o;
  517. o->textcoord=0;
  518. strcpy(o->name,(char *)(LPCSTR)fd.GetFileName());
  519. fscanf(fp,"%i",&o->nv);
  520. o->vt=new vtlist *[o->nv];
  521. memset(o->vt,0,sizeof(vtlist *)*o->nv);
  522. for( a=0;a<o->nv;a++ )
  523. {
  524. o->vt[a]=new vtlist;
  525. fscanf(fp,"%f %f %f",&o->vt[a]->pos.x,&o->vt[a]->pos.y,&o->vt[a]->pos.z);
  526. }
  527. fscanf(fp,"%i",&o->nf);
  528. o->ft=new ftlist *[o->nf];
  529. memset(o->ft,0,sizeof(ftlist *)*o->nf);
  530. for( a=0;a<o->nf;a++ )
  531. {
  532. o->ft[a]=new ftlist;
  533. fscanf(fp,"%i %i %i %i",&t,&i,&j,&k);
  534. o->ft[a]->lv[0]=o->vt[i];
  535. o->ft[a]->lv[1]=o->vt[j];
  536. o->ft[a]->lv[2]=o->vt[k];
  537. o->ft[a]->material=0;
  538. }
  539. ComputeBBoxes();
  540. SetModifiedFlag();
  541. ImportProgress ip;
  542. ip.doc=this;
  543. ip.DoModal();
  544. if (obj0->next==0)
  545. {
  546. POSITION pos = GetFirstViewPosition();
  547. while (pos != NULL)
  548. {
  549. CView* pView = GetNextView(pos);
  550. ((CMy3DEditorView *)pView)->OnViewViewall();
  551. }
  552. }
  553. EndWaitCursor();
  554. }
  555. }
  556. }
  557. }
  558. void CMy3DEditorDoc::OnProperties() 
  559. {
  560. // TODO: Add your command handler code here
  561. if (dlgprop)
  562. ((DlgProperties *)dlgprop)->Close();
  563. else
  564. {
  565. dlgprop=new DlgProperties;
  566. ((DlgProperties *)dlgprop)->doc=this;
  567. dlgprop->Create(IDD_PROPERTIES);
  568. CString s;
  569. s.LoadString(IDS_DETAIL);
  570. sprintf(str,s,GetTitle());
  571. dlgprop->SetWindowText(str);
  572. dlgprop->ShowWindow(SW_SHOW);
  573. }
  574. }
  575. void CMy3DEditorDoc::OnUpdateProperties(CCmdUI* pCmdUI) 
  576. {
  577. // TODO: Add your command update UI handler code here
  578. pCmdUI->Enable(obj0!=0);
  579. pCmdUI->SetCheck(dlgprop!=0);
  580. }
  581. void CMy3DEditorDoc::OnMapping() 
  582. {
  583. // TODO: Add your command handler code here
  584. if (dlgmap)
  585. ((DlgMapping *)dlgmap)->Close();
  586. else
  587. {
  588. if (CheckMapping()==0)
  589. return;
  590. dlgmap=new DlgMapping;
  591. ((DlgMapping *)dlgmap)->doc=this;
  592. dlgmap->Create(IDD_MAPPING);
  593. CString s;
  594. s.LoadString(IDS_MAPPING);
  595. sprintf(str,s,GetTitle());
  596. dlgmap->SetWindowText(str);
  597. dlgmap->ShowWindow(SW_SHOW);
  598. }
  599. }
  600. void CMy3DEditorDoc::OnUpdateMapping(CCmdUI* pCmdUI) 
  601. {
  602. // TODO: Add your command update UI handler code here
  603. pCmdUI->Enable(nmatlib!=0 && obj0!=0);
  604. pCmdUI->SetCheck(dlgmap!=0);
  605. }
  606. int CMy3DEditorDoc::CheckMapping()
  607. {
  608. object *o=obj0;
  609. while(o)
  610. {
  611. int i;
  612. for( i=0;i<o->nv;i++ )
  613. if (fabs(o->vt[i]->tx[0])>1.0f || fabs(o->vt[i]->tx[1])>1.0f)
  614. break;
  615. if (i<o->nv)
  616. break;
  617. o=o->next;
  618. }
  619. if (o)
  620. {
  621. CString s;
  622. s.LoadString(IDS_MAPPINGTILE);
  623. if (IDNO==AfxMessageBox(s,MB_YESNO))
  624. return 0;
  625. o=obj0;
  626. while(o)
  627. {
  628. int i;
  629. for( i=0;i<o->nv;i++ )
  630. {
  631. o->vt[i]->tx[0]=(float)fmod(fabs(o->vt[i]->tx[0]),1.0);
  632. o->vt[i]->tx[1]=-(float)fmod(fabs(o->vt[i]->tx[1]),1.0);
  633. }
  634. o=o->next;
  635. }
  636. UpdateAllViews(0);
  637. }
  638. return 1;
  639. }
  640. void CMy3DEditorDoc::OnEditBackgroundBlack() 
  641. {
  642. // TODO: Add your command handler code here
  643. background.Vec(0,0,0);
  644. UpdateAllViews(0);
  645. SetModifiedFlag();
  646. }
  647. void CMy3DEditorDoc::OnUpdateEditBackgroundBlack(CCmdUI* pCmdUI) 
  648. {
  649. // TODO: Add your command update UI handler code here
  650. pCmdUI->SetRadio(background.x==0 && background.y==0 && background.z==0);
  651. }
  652. void CMy3DEditorDoc::OnEditBackgroundCustom() 
  653. {
  654. // TODO: Add your command handler code here
  655. COLORREF c=RGB((int)(background.x*255),(int)(background.y*255),(int)(background.z*255));
  656. CColorDialog cd(c);
  657. if (cd.DoModal()==IDOK)
  658. {
  659. c=cd.GetColor();
  660. background.x=(float)GetRValue(c)/255;
  661. background.y=(float)GetGValue(c)/255;
  662. background.z=(float)GetBValue(c)/255;
  663. UpdateAllViews(0);
  664. SetModifiedFlag();
  665. }
  666. }
  667. void CMy3DEditorDoc::OnUpdateEditBackgroundCustom(CCmdUI* pCmdUI) 
  668. {
  669. // TODO: Add your command update UI handler code here
  670. pCmdUI->SetRadio( (background.x>0 && background.x<1) ||
  671. (background.y>0 && background.y<1) ||
  672. (background.z>0 && background.z<1) );
  673. }
  674. void CMy3DEditorDoc::OnEditBackgroundWhite() 
  675. {
  676. // TODO: Add your command handler code here
  677. background.Vec(1,1,1);
  678. UpdateAllViews(0);
  679. SetModifiedFlag();
  680. }
  681. void CMy3DEditorDoc::OnUpdateEditBackgroundWhite(CCmdUI* pCmdUI) 
  682. {
  683. // TODO: Add your command update UI handler code here
  684. pCmdUI->SetRadio(background.x==1 && background.y==1 && background.z==1);
  685. }
  686. void CMy3DEditorDoc::OnEditLightsConstant() 
  687. {
  688. // TODO: Add your command handler code here
  689. headlight=-1;
  690. UpdateAllViews(0);
  691. SetModifiedFlag();
  692. }
  693. void CMy3DEditorDoc::OnUpdateEditLightsConstant(CCmdUI* pCmdUI) 
  694. {
  695. // TODO: Add your command update UI handler code here
  696. pCmdUI->SetRadio(headlight==-1);
  697. }
  698. void CMy3DEditorDoc::OnEditLightsHeadlight() 
  699. {
  700. // TODO: Add your command handler code here
  701. headlight=1;
  702. UpdateAllViews(0);
  703. SetModifiedFlag();
  704. }
  705. void CMy3DEditorDoc::OnUpdateEditLightsHeadlight(CCmdUI* pCmdUI) 
  706. {
  707. // TODO: Add your command update UI handler code here
  708. pCmdUI->SetRadio(headlight==1);
  709. }
  710. void CMy3DEditorDoc::OnEditLightsScene() 
  711. {
  712. // TODO: Add your command handler code here
  713. headlight=0;
  714. UpdateAllViews(0);
  715. SetModifiedFlag();
  716. }
  717. void CMy3DEditorDoc::OnUpdateEditLightsScene(CCmdUI* pCmdUI) 
  718. {
  719. // TODO: Add your command update UI handler code here
  720. pCmdUI->SetRadio(headlight==0);
  721. }
  722. void CMy3DEditorDoc::OnEditAmbientlight() 
  723. {
  724. // TODO: Add your command handler code here
  725. COLORREF c=RGB((int)(amblight.x*255),(int)(amblight.y*255),(int)(amblight.z*255));
  726. CColorDialog cd(c);
  727. if (cd.DoModal()==IDOK)
  728. {
  729. c=cd.GetColor();
  730. amblight.x=(float)GetRValue(c)/255;
  731. amblight.y=(float)GetGValue(c)/255;
  732. amblight.z=(float)GetBValue(c)/255;
  733. UpdateAllViews(0);
  734. SetModifiedFlag();
  735. }
  736. }
  737. void CMy3DEditorDoc::OnTextinterp() 
  738. {
  739. // TODO: Add your command handler code here
  740. textinterp=!textinterp;
  741. UpdateAllViews(0);
  742. SetModifiedFlag();
  743. }
  744. void CMy3DEditorDoc::OnUpdateTextinterp(CCmdUI* pCmdUI) 
  745. {
  746. // TODO: Add your command update UI handler code here
  747. pCmdUI->SetCheck(textinterp);
  748. }
  749. void CMy3DEditorDoc::OnBackcull() 
  750. {
  751. // TODO: Add your command handler code here
  752. backface=!backface;
  753. UpdateAllViews(0);
  754. SetModifiedFlag();
  755. }
  756. void CMy3DEditorDoc::OnUpdateBackcull(CCmdUI* pCmdUI) 
  757. {
  758. // TODO: Add your command update UI handler code here
  759. pCmdUI->SetCheck(backface);
  760. }
  761. void CMy3DEditorDoc::OnCloseDocument() 
  762. {
  763. // TODO: Add your specialized code here and/or call the base class
  764. if (dlgprop)
  765. ((DlgProperties *)dlgprop)->Close();
  766. if (dlgmat)
  767. ((DlgMaterial *)dlgmat)->Close();
  768. if (dlgmap)
  769. ((DlgMapping *)dlgmap)->Close();
  770. CDocument::OnCloseDocument();
  771. }
  772. void CMy3DEditorDoc::OnFileExport() 
  773. {
  774. // TODO: Add your command handler code here
  775. CString s;
  776. s.LoadString(IDS_FD_3DS);
  777. CFileDialog fd(FALSE,"3ds",0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
  778. if(fd.DoModal()==IDOK)
  779. {
  780. BeginWaitCursor();
  781. if (export((char *)(LPCSTR)fd.GetPathName())==0)
  782. AfxMessageBox(IDS_ERRORSAVING,MB_OK|MB_ICONEXCLAMATION);
  783. EndWaitCursor();
  784. }
  785. }
  786. void CMy3DEditorDoc::OnInvertnormals() 
  787. {
  788. // TODO: Add your command handler code here
  789. BeginWaitCursor();
  790. selobj->invert_normal(selobj->ft[selobj->elem[selface].elem]);
  791. UpdateAllViews(0);
  792. EndWaitCursor();
  793. }
  794. void CMy3DEditorDoc::OnUpdateInvertnormals(CCmdUI* pCmdUI) 
  795. {
  796. // TODO: Add your command update UI handler code here
  797. pCmdUI->Enable(selobj!=0 && selface!=-1);
  798. }
  799. BOOL CMy3DEditorDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  800. {
  801. if (!CDocument::OnOpenDocument(lpszPathName))
  802. return FALSE;
  803. // TODO: Add your specialized creation code here
  804. if (!CDocument::OnOpenDocument(lpszPathName))
  805. return FALSE;
  806. POSITION pos = GetFirstViewPosition();
  807. while (pos != NULL)
  808. {
  809. CView* pView = GetNextView(pos);
  810. if (ncamlib)
  811. {
  812. ((CMy3DEditorView *)pView)->LookAt(camlib[0].Vp,camlib[0].Lp);
  813. ((CMy3DEditorView *)pView)->cur_cam=0;
  814. }
  815. else ((CMy3DEditorView *)pView)->OnViewViewall();
  816. }
  817. CString s;
  818. s.LoadString(IDS_DETAIL);
  819. sprintf(str,s,GetTitle());
  820. if (dlgprop)
  821. dlgprop->SetWindowText(str);
  822. s.LoadString(IDS_MATERIAL);
  823. sprintf(str,s,GetTitle());
  824. if (dlgmat)
  825. dlgmat->SetWindowText(str);
  826. s.LoadString(IDS_MAPPING);
  827. sprintf(str,s,GetTitle());
  828. if (dlgmap)
  829. dlgmap->SetWindowText(str);
  830. return TRUE;
  831. }
  832. BOOL CMy3DEditorDoc::OnSaveDocument(LPCTSTR lpszPathName) 
  833. {
  834. // TODO: Add your specialized code here and/or call the base class
  835. BOOL ret=CDocument::OnSaveDocument(lpszPathName);
  836. CString s;
  837. s.LoadString(IDS_DETAIL);
  838. sprintf(str,s,GetTitle());
  839. if (dlgprop)
  840. dlgprop->SetWindowText(str);
  841. s.LoadString(IDS_MATERIAL);
  842. sprintf(str,s,GetTitle());
  843. if (dlgmat)
  844. dlgmat->SetWindowText(str);
  845. s.LoadString(IDS_MAPPING);
  846. sprintf(str,s,GetTitle());
  847. if (dlgmap)
  848. dlgmap->SetWindowText(str);
  849. return ret;
  850. }
  851. void CMy3DEditorDoc::OnMaterials() 
  852. {
  853. // TODO: Add your command handler code here
  854. if (dlgmat)
  855. ((DlgMaterial *)dlgmat)->Close();
  856. else
  857. {
  858. dlgmat=new DlgMaterial;
  859. ((DlgMaterial *)dlgmat)->doc=this;
  860. dlgmat->Create(IDD_MATERIAL);
  861. CString s;
  862. s.LoadString(IDS_MATERIAL);
  863. sprintf(str,s,GetTitle());
  864. dlgmat->SetWindowText(str);
  865. dlgmat->ShowWindow(SW_SHOW);
  866. }
  867. }
  868. void CMy3DEditorDoc::OnUpdateMaterials(CCmdUI* pCmdUI) 
  869. {
  870. // TODO: Add your command update UI handler code here
  871. pCmdUI->Enable(nmatlib!=0);
  872. pCmdUI->SetCheck(dlgmat!=0);
  873. }