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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dColorList.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. // C3dColorList
  30. IMPLEMENT_DYNAMIC(C3dColorList, CObList)
  31. //IMPLEMENT_SERIAL(C3dColorList, CObList, 0)
  32. /////////////////////////////////////////////////////////////////////////////
  33. // C3dColorList construction
  34. C3dColorList::C3dColorList()
  35. {
  36. // TODO: add construction code here,
  37. // Place all significant initialization in InitInstance
  38. }
  39. /////////////////////////////////////////////////////////////////////////////
  40. // C3dColorList Destructor
  41. C3dColorList::~C3dColorList()
  42. {
  43. DeleteAll();
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // C3dColorList commands
  47. void C3dColorList::Remove(C3dColor* pColor)
  48. {
  49. if (!pColor) return;
  50. POSITION pos = CObList::Find(pColor);
  51. if (pos) {
  52. RemoveAt(pos);
  53. }
  54. }
  55. void C3dColorList::Delete(C3dColor* pColor)
  56. {
  57. if (!pColor) return;
  58. Remove(pColor);
  59. delete pColor;
  60. }
  61. void C3dColorList::DeleteAll()
  62. {
  63. while (!IsEmpty()) {
  64. C3dColor* pColor = (C3dColor*) RemoveHead();
  65. delete pColor;
  66. }
  67. }
  68. void C3dColorList::LoadColors(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, "C3dColorList::LoadColors - Color file read error.  Could not open file: '%s'. ", szFileName);
  82. AfxMessageBox(buf, MB_OK, NULL);
  83. #ifdef _DEBUG
  84. afxDump << "Unable to open material file" << "n";
  85. #endif
  86. return;
  87. }
  88. }
  89. CArchive ar( &f, CArchive::load );
  90.  
  91. try
  92. {
  93. CString szBuffer;
  94. // Read the version number
  95. ar.ReadString(szBuffer);
  96. sscanf(szBuffer, "// Version: %fn", &fVersion);
  97. iVersion = Roundf(fVersion*100);
  98. if(iVersion < 101)
  99. iVersion  = 101; // File had no version number, so assign default
  100. // Save the color file data..
  101. Serialize(ar, iFileVersion);
  102. }
  103. catch (CFileException exception) {
  104. // Catch any exceptions that may be thrown and
  105. // display for the user...
  106. DisplayFileIOException(&exception);
  107. }
  108. }
  109. void C3dColorList::SaveColors(CString szFileName) 
  110. {
  111. CFile f;
  112. CFileException fe;
  113. if( !f.Open( szFileName, CFile::modeCreate | CFile::modeReadWrite, &fe)) {
  114. // Error!  Display message to the user..
  115. CString buffer;
  116. buffer.Format("Could not open color file '%s'!n", szFileName);
  117. AfxMessageBox(buffer, MB_OK, 0);
  118. #ifdef _DEBUG
  119. afxDump << "Unable to open file" << "n";
  120. #endif
  121. }
  122. CArchive ar( &f, CArchive::store );
  123.  
  124. try
  125. {
  126. CString szBuffer;
  127. // Save the file version information
  128. ar.WriteString(szFileVersion);
  129. // Save the file header information
  130. ar.WriteString(szColorFileHeader);
  131. ar.WriteString(szIWDFileHeader);
  132. // Save the color file data..
  133. Serialize(ar, iFileVersion);
  134. }
  135. catch (CFileException exception) {
  136. // Catch any exceptions that may be thrown and
  137. // display for the user...
  138. DisplayFileIOException(&exception);
  139. }
  140. }
  141. void C3dColorList::Serialize(CArchive& ar, int iVersion)
  142. {
  143. CString szBuffer;
  144. if (ar.IsStoring())
  145. {
  146. C3dColor* pColor = NULL;
  147. // walk the list
  148. POSITION Pos = GetHeadPosition();
  149. while (Pos)
  150. {
  151. pColor = GetAt(Pos);
  152. pColor->Serialize(ar, iVersion);
  153. pColor = GetNext(Pos);
  154. }
  155. }
  156. else
  157. {
  158. // Load or Read the Color member variables
  159. while(ar.ReadString(szBuffer))
  160. {
  161. // Look for the Color header...
  162. if(szBuffer.Compare("Color {") == 0)
  163. {
  164. C3dColor* pColor = NULL;
  165. pColor = C3dColor::Create();
  166. pColor->Serialize(ar, iVersion);
  167. if(!Find(pColor))
  168. Append(pColor);
  169. else
  170. C3dColor::Delete(pColor);
  171. }
  172. }
  173. }
  174. }
  175. C3dColor* C3dColorList::Find(C3dColor* pColor)
  176. {
  177. if (!pColor) return NULL;
  178. C3dColor* pListEntry = NULL;
  179. // walk the list
  180. POSITION Pos = GetHeadPosition();
  181. while (Pos) {
  182. pListEntry = GetAt(Pos);
  183. if(!pColor->m_szName.Compare(pListEntry->m_szName))
  184. // A material with the same name has been found
  185. // in the material list.  
  186. return pListEntry;
  187. pListEntry = GetNext(Pos);
  188. }
  189. return NULL;
  190. }
  191. C3dColor* C3dColorList::Find(CString szName)
  192. {
  193. C3dColor* pListEntry = NULL;
  194. // walk the list
  195. POSITION Pos = GetHeadPosition();
  196. while (Pos) {
  197. pListEntry = GetAt(Pos);
  198. if(!szName.Compare(pListEntry->m_szName))
  199. // A material with the same name has been found
  200. // in the material list.  
  201. return pListEntry;
  202. pListEntry = GetNext(Pos);
  203. }
  204. return NULL;
  205. }
  206. C3dColor* C3dColorList::LoadComboBox(CComboBox* pCombo, C3dColor* pColorSel)
  207. {
  208. if(!pCombo)
  209. return NULL; // Nothing to load into
  210. // Reset or clear the contents of the combo box
  211. pCombo->ResetContent();
  212. // Set the first color to NULL
  213. pCombo->AddString("<None>");
  214. int count = pCombo->GetCount() - 1; // zero based
  215. pCombo->SetItemData(count, NULL);
  216. // Fill the combo box with all Colors in the list
  217. C3dColor* pColor = NULL;
  218. // walk the list
  219. POSITION Pos = GetHeadPosition();
  220. while (Pos)
  221. {
  222. pColor = GetAt(Pos);
  223. pCombo->AddString(pColor->m_szName);
  224. int count = pCombo->GetCount() - 1; // zero based
  225. pCombo->SetItemData(count, (unsigned long)pColor);
  226. pColor = GetNext(Pos);
  227. }
  228. // Select the color from our list
  229. pCombo->SetCurSel(0); // Set to default <None>
  230. if(pColorSel)
  231. int index = pCombo->SelectString(-1, pColorSel->m_szName);
  232. // int index = pCombo->FindString(-1, pColorSel->m_szName);
  233. // if(index == CB_ERR)
  234. // pCombo->SetCurSel(0);
  235. // else
  236. // pCombo->SetCurSel(index);
  237. // }
  238. // else
  239. // pCombo->SetCurSel(0);
  240. return pColor;
  241. }
  242. C3dColor* C3dColorList::LoadListBox(CListBox* pList)
  243. {
  244. if(!pList)
  245. return NULL; // Nothing to load into
  246. // Reset or clear the contents of the combo box
  247. pList->ResetContent();
  248. // Fill the combo box with all Colors in the list
  249. C3dColor* pColor = NULL;
  250. // walk the list
  251. POSITION Pos = GetHeadPosition();
  252. while (Pos)
  253. {
  254. pColor = GetAt(Pos);
  255. pList->AddString(pColor->m_szName);
  256. int count = pList->GetCount() - 1; // zero based
  257. pList->SetItemData(count, (unsigned long)pColor);
  258. pColor = GetNext(Pos);
  259. }
  260. return pColor;
  261. }