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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dMaterialList.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 "MyFileIO.h"
  22. #include <stdio.h>
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. //////////////////////////////////////////////////////////////////
  29. // C3dMaterialList
  30. IMPLEMENT_DYNAMIC(C3dMaterialList, CObList)
  31. //IMPLEMENT_SERIAL(C3dMaterialList, CObList, 0)
  32. /////////////////////////////////////////////////////////////////////////////
  33. // C3dMaterialList construction
  34. C3dMaterialList::C3dMaterialList()
  35. {
  36. // TODO: add construction code here,
  37. // Place all significant initialization in InitInstance
  38. }
  39. /////////////////////////////////////////////////////////////////////////////
  40. // C3dMaterialList Destructor
  41. C3dMaterialList::~C3dMaterialList()
  42. {
  43. DeleteAll();
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // C3dMaterialList commands
  47. void C3dMaterialList::Remove(C3dMaterial* pMaterial)
  48. {
  49. if (!pMaterial) return;
  50. POSITION pos = CObList::Find(pMaterial);
  51. if (pos) {
  52. RemoveAt(pos);
  53. }
  54. }
  55. void C3dMaterialList::Delete(C3dMaterial* pMaterial)
  56. {
  57. if (!pMaterial) return;
  58. Remove(pMaterial);
  59. delete pMaterial;
  60. }
  61. void C3dMaterialList::DeleteAll()
  62. {
  63. while (!IsEmpty()) {
  64. C3dMaterial* pMaterial = (C3dMaterial*) RemoveHead();
  65. delete pMaterial;
  66. }
  67. }
  68. void C3dMaterialList::LoadMaterials(CString szFileName) 
  69. {
  70. CFile f;
  71. CFileException fe;
  72. float fVersion;
  73. int iVersion;
  74. if(!szFileName.GetLength())
  75. return;
  76. if( !f.Open( szFileName, CFile::modeRead, &fe ) )
  77. {
  78. if(the3dEngine.m_bDisplayErrorMessages)
  79. {
  80. char buf[256];
  81. sprintf(buf, "C3dMaterialList::LoadMaterials - Material file read error.  Could not open file: '%s'. ", szFileName);
  82. AfxMessageBox(buf, MB_OK, NULL);
  83. }
  84. #ifdef _DEBUG
  85. afxDump << "Unable to open material file" << "n";
  86. #endif
  87. return;
  88. }
  89. CArchive ar( &f, CArchive::load );
  90. try
  91. {
  92. CString szBuffer;
  93. // Read the version number
  94. ar.ReadString(szBuffer);
  95. sscanf(szBuffer, "// Version: %fn", &fVersion);
  96. iVersion = Roundf(fVersion*100);
  97. if(iVersion < 101)
  98. iVersion  = 101; // File had no version number, so assign default
  99. // Load the material file data..
  100. Serialize(ar, iVersion);
  101. }
  102. catch (CFileException exception) {
  103. // Catch any exceptions that may be thrown and
  104. // display for the user...
  105. DisplayFileIOException(&exception);
  106. }
  107. }
  108. void C3dMaterialList::SaveMaterials(CString szFileName) 
  109. {
  110. CFile f;
  111. CFileException fe;
  112. if( !f.Open( szFileName, CFile::modeCreate | CFile::modeReadWrite, &fe))
  113. {
  114. // Error!  Display message to the user..
  115. CString buffer;
  116. buffer.Format("Could not open material file '%s'!n", szFileName);
  117. AfxMessageBox(buffer, MB_OK, 0);
  118. #ifdef _DEBUG
  119. afxDump << "Unable to open file" << "n";
  120. #endif
  121. }
  122. // Construct a CArchive object and specify whether it will be used for
  123. // loading or storing objects.
  124. CArchive ar( &f, CArchive::store );
  125.  
  126. try
  127. {
  128. CString szBuffer;
  129. // Save the file version information
  130. ar.WriteString(szFileVersion);
  131. // Save the file header information
  132. ar.WriteString(szMatlFileHeader);
  133. ar.WriteString(szIWDFileHeader);
  134. // Save the material file data..
  135. Serialize(ar, iFileVersion);
  136. }
  137. catch (CFileException exception)
  138. {
  139. // Catch any exceptions that may be thrown and
  140. // display for the user...
  141. DisplayFileIOException(&exception);
  142. }
  143. }
  144. void C3dMaterialList::Serialize(CArchive& ar, int iVersion)
  145. {
  146. CString szBuffer;
  147. if (ar.IsStoring())
  148. {
  149. C3dMaterial* pMatl = NULL;
  150. // walk the list
  151. POSITION Pos = GetHeadPosition();
  152. while (Pos) {
  153. pMatl = GetAt(Pos);
  154. pMatl->Serialize(ar, iVersion);
  155. pMatl = GetNext(Pos);
  156. }
  157. }
  158. else
  159. {
  160. while(ar.ReadString(szBuffer))
  161. {
  162. // Look for the Material header...
  163. if(szBuffer.Compare("Material {") == 0)
  164. {
  165. C3dMaterial* pMatl = NULL;
  166. pMatl = C3dMaterial::Create();
  167. pMatl->Serialize(ar, iVersion);
  168. if(!Find(pMatl))
  169. Append(pMatl);
  170. else
  171. C3dMaterial::Delete(pMatl);
  172. }
  173. }
  174. }
  175. }
  176. C3dMaterial* C3dMaterialList::Find(C3dMaterial* pMatl)
  177. {
  178. if (!pMatl) return NULL;
  179. C3dMaterial* pListEntry = NULL;
  180. // walk the list
  181. POSITION Pos = GetHeadPosition();
  182. while (Pos) {
  183. pListEntry = GetAt(Pos);
  184. if(!pMatl->m_szName.Compare(pListEntry->m_szName))
  185. // A material with the same name has been found
  186. // in the material list.  
  187. return pListEntry;
  188. pListEntry = GetNext(Pos);
  189. }
  190. return NULL;
  191. }
  192. C3dMaterial* C3dMaterialList::Find(CString szName)
  193. {
  194. C3dMaterial* pListEntry = NULL;
  195. // walk the list
  196. POSITION Pos = GetHeadPosition();
  197. while (Pos) {
  198. pListEntry = GetAt(Pos);
  199. if(!szName.Compare(pListEntry->m_szName))
  200. // A material with the same name has been found
  201. // in the material list.  
  202. return pListEntry;
  203. pListEntry = GetNext(Pos);
  204. }
  205. return NULL;
  206. }
  207. C3dMaterial* C3dMaterialList::LoadComboBox(CComboBox* pCombo)
  208. {
  209. if(!pCombo)
  210. return NULL; // Nothing to load into
  211. // Reset or clear the contents of the combo box
  212. pCombo->ResetContent();
  213. // Fill the combo box with materials from this list
  214. C3dMaterial* pMatl = NULL;
  215. // walk the list
  216. POSITION Pos = GetHeadPosition();
  217. while (Pos)
  218. {
  219. pMatl = GetAt(Pos);
  220. pCombo->AddString(pMatl->m_szName);
  221. int count = pCombo->GetCount() - 1; // zero based
  222. pCombo->SetItemData(count, (unsigned long)pMatl);
  223. pMatl = GetNext(Pos);
  224. }
  225. return pMatl;
  226. }
  227. C3dMaterial* C3dMaterialList::LoadListBox(CListBox* pList)
  228. {
  229. if(!pList)
  230. return NULL; // Nothing to load into
  231. // Reset or clear the contents of the combo box
  232. pList->ResetContent();
  233. // Fill the combo box with materials from this list
  234. C3dMaterial* pMatl = NULL;
  235. // walk the list
  236. POSITION Pos = GetHeadPosition();
  237. while (Pos)
  238. {
  239. pMatl = GetAt(Pos);
  240. pList->AddString(pMatl->m_szName);
  241. int count = pList->GetCount() - 1; // zero based
  242. pList->SetItemData(count, (unsigned long)pMatl);
  243. pMatl = GetNext(Pos);
  244. }
  245. return pMatl;
  246. }