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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dObjectGrid.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 "3dObjectDialog.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. //////////////////////////////////////////////////////////////////
  28. // C3dObjectGrid
  29. IMPLEMENT_DYNAMIC(C3dObjectGrid, C3dObject)
  30. /////////////////////////////////////////////////////////////////////////////
  31. // C3dShape construction
  32. C3dObjectGrid::C3dObjectGrid()
  33. {
  34. // Set the attributes to default values..
  35.   m_iType = SHAPE_OBJECT;
  36.    m_szName.Format("Grid %u", nGridObjects++);
  37. // Set the grid alternate color to black
  38. m_AltColor.SetColor4f(0.0f, 0.0f, 0.0f, 1.0f); // Black
  39. m_fDepth = 11.0f;
  40. m_fWidth = 11.0f;
  41. m_iDivisionsX = 11; // odd number for checkerboard pattern
  42. m_iDivisionsY = 11;
  43. }
  44. /////////////////////////////////////////////////////////////////////////////
  45. // C3DWorld Destructor
  46. C3dObjectGrid::~C3dObjectGrid()
  47. {
  48. // TODO: add destruction code here,
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // C3dObjectGrid Methods or virtual function implimentation
  52. void C3dObjectGrid::AddAttributePage(C3dWorld* pWorld, LPVOID pSht)
  53. {
  54. C3dObjectPropSheet* pSheet = (C3dObjectPropSheet*)pSht;
  55. ASSERT(pSheet);
  56. // Add the page to the property sheet
  57. pSheet->AddPage(&pSheet->m_GridPage);
  58. // Save the address of this object in the page
  59. pSheet->m_GridPage.m_pObject = this;
  60. // Save the address of the global Color List in the page
  61. pSheet->m_GridPage.m_pColorList = &pWorld->m_ColorList;
  62. }
  63. void C3dObjectGrid::GetShapeBounds(C3dBoundingBox* pBox)
  64. {
  65. // Calculate the bounds of the shape
  66. pBox->m_fMax[X] = m_fWidth/2;
  67. pBox->m_fMax[Y] = m_fDepth/2;
  68. pBox->m_fMax[Z] = 0.0f;
  69. pBox->m_fMin[X] = -m_fWidth/2;
  70. pBox->m_fMin[Y] = -m_fDepth/2;
  71. pBox->m_fMin[Z] = 0.0f;
  72. }
  73. int C3dObjectGrid::LoadBitMapImage(CImageList* pList)
  74. {
  75. CBitmap bitmap;
  76. // If the image index has been stored in this object,
  77. // return the index.
  78. if(m_iBMImage > -1)
  79. return m_iBMImage;
  80. // If the image index for this object type has been
  81. // created, store the index for this object and
  82. // return the index.
  83. if( iObjectGridBMImage > -1) {
  84. m_iBMImage = iObjectGridBMImage;
  85. return m_iBMImage;
  86. }
  87. // The image index for this object type has not been
  88. // loaded and the object image index has not been
  89. // stored.
  90. //
  91. // Load the bitmap for the non-selected light
  92. bitmap.LoadBitmap(IDB_OBJECT_GRID);
  93. m_iBMImage = pList->Add(&bitmap, (COLORREF)0xFFFFFF);
  94. bitmap.DeleteObject();
  95. // Load the bitmap for the non-selected light
  96. bitmap.LoadBitmap(IDB_OBJECT_GRID_SELECTED);
  97. pList->Add(&bitmap, (COLORREF)0xFFFFFF);
  98. bitmap.DeleteObject();
  99. iObjectGridBMImage = m_iBMImage;
  100. return m_iBMImage;
  101. }
  102. void C3dObjectGrid::Serialize(CArchive& ar, int iVersion)
  103. {
  104. CString szBuffer;
  105. if (ar.IsStoring())
  106. {
  107. // Save the Object Class header...
  108. szBuffer.Format("n%sC3dObjectGrid {n", szIndent);
  109. ar.WriteString(szBuffer);
  110. // Save the this objects' specific data...
  111. szBuffer.Format("%stDepth         < %f >n", szIndent, m_fDepth);
  112. ar.WriteString(szBuffer);
  113. szBuffer.Format("%stWidth         < %f >n", szIndent, m_fDepth);
  114. ar.WriteString(szBuffer);
  115. szBuffer.Format("%stDivisions 'X' < %d >n", szIndent, m_iDivisionsX);
  116. ar.WriteString(szBuffer);
  117. szBuffer.Format("%stDivisions 'Y' < %d >n", szIndent, m_iDivisionsY);
  118. ar.WriteString(szBuffer);
  119. // Save the base class object data...
  120. C3dObject::Serialize(ar, iVersion);
  121. szBuffer.Format("%s}n", szIndent); // end of object def
  122. ar.WriteString(szBuffer);
  123. }
  124. else
  125. {
  126. if(iVersion < 102)
  127. // Read the base class object data...
  128. C3dObject::Serialize(ar, iVersion);
  129. // Read the derived class data..
  130. ar.ReadString(szBuffer);
  131. szBuffer.TrimLeft(); // Remove leading white spaces
  132. sscanf(szBuffer, "Depth          < %f >n", &m_fDepth);
  133. ar.ReadString(szBuffer);
  134. szBuffer.TrimLeft();
  135. sscanf(szBuffer, "Width          < %f >n", &m_fWidth);
  136. ar.ReadString(szBuffer);
  137. szBuffer.TrimLeft();
  138. sscanf(szBuffer, "Divisions 'X'  < %d >n", &m_iDivisionsX);
  139. ar.ReadString(szBuffer);
  140. szBuffer.TrimLeft();
  141. sscanf(szBuffer, "Divisions 'Y'  < %d >n", &m_iDivisionsY);
  142. if(iVersion < 102)
  143. // Read all child objects...
  144. LoadChildObjects(ar, iVersion);
  145. else
  146. // Read the base class object data...
  147. C3dObject::Serialize(ar, iVersion);
  148. }
  149. }
  150. void C3dObjectGrid::Build(C3dWorld* pWorld, C3dCamera* pCamera)
  151. {
  152.    GLfloat x, y, z = 0.0f;
  153. float fStepX, fStepY;
  154. BOOL bToggle = FALSE;
  155. // Compile and build the list
  156. glNewList(m_iDisplayLists, GL_COMPILE_AND_EXECUTE);
  157. // Calculate the number of steps in the x-axis
  158. if(m_iDivisionsX)
  159. fStepX = m_fWidth/m_iDivisionsX;
  160. else
  161. fStepX = 1.0f;
  162. // Calculate the number of steps in the x-axis
  163. if(m_iDivisionsY)
  164. fStepY = m_fDepth/m_iDivisionsY;
  165. else
  166. fStepY = 1.0f;
  167. for(x=-m_fWidth/2.0f; x<m_fWidth/2; x+=fStepX)
  168. {
  169. for(y=-m_fDepth/2.0f; y<m_fDepth/2; y+=fStepY)
  170. {
  171. if(bToggle)
  172. {
  173. // Reset color parameters to default values
  174. glDisable(GL_TEXTURE_2D);
  175. glColor4fv(m_AltColor.m_fColor);
  176. bToggle = FALSE;
  177. }
  178. else
  179. {
  180. // Setup this objects polygon color material
  181. // or texture attributes
  182. SetAttributes(pWorld, NULL);
  183. bToggle = TRUE;
  184. }
  185. glBegin(GL_POLYGON);
  186. glNormal3d(0.0, 0.0, 1.0);
  187. glTexCoord2d(0.0, 0.0);
  188. glVertex3d(x, y, z);
  189. glTexCoord2d(1, 0.0);
  190. glVertex3d(x+fStepX, y, z);
  191. glTexCoord2d(1, 1);
  192. glVertex3d(x+fStepX, y+fStepY, z);
  193. glTexCoord2d(0.0, 1);
  194. glVertex3d(x, y+fStepY, z);
  195. glEnd();
  196. }
  197. }
  198. glEndList();
  199. }
  200. /////////////////////////////////////////////////////////////////////////////
  201. // C3dObjectGrid function implimentation