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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dObjectTorus.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. #include <math.h>
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. //////////////////////////////////////////////////////////////////
  29. // C3dObjectTorus
  30. IMPLEMENT_DYNAMIC(C3dObjectTorus, C3dObject)
  31. /////////////////////////////////////////////////////////////////////////////
  32. // C3dObjectTorus construction
  33. C3dObjectTorus::C3dObjectTorus()
  34. {
  35. // Set the attributes to default values..
  36.   m_iType = SHAPE_OBJECT;
  37.    m_szName.Format("Torus %u", nTorusObjects++);
  38. m_iNumMajor = 40;
  39. m_iNumMinor = 40;
  40. m_fMajorRadius = 2.0f;
  41. m_fMinorRadius = 0.5f;
  42. }
  43. /////////////////////////////////////////////////////////////////////////////
  44. // C3dObjectTorus Destructor
  45. C3dObjectTorus::~C3dObjectTorus()
  46. {
  47. // TODO: add destruction code here,
  48. }
  49. /////////////////////////////////////////////////////////////////////////////
  50. // C3dObjectTorus Methods or virtual function implimentation
  51. void C3dObjectTorus::AddAttributePage(C3dWorld* pWorld, LPVOID pSht)
  52. {
  53. C3dObjectPropSheet* pSheet = (C3dObjectPropSheet*)pSht;
  54. ASSERT(pSheet);
  55. // Add the page to the property sheet
  56. pSheet->AddPage(&pSheet->m_TorusPage);
  57. // Save the address of this object in the page
  58. pSheet->m_TorusPage.m_pObject = this;
  59. }
  60. void C3dObjectTorus::GetShapeBounds(C3dBoundingBox* pBox)
  61. {
  62. // Calculate the bounds of the shape
  63. pBox->m_fMax[X] = m_fMajorRadius + m_fMinorRadius;
  64. pBox->m_fMax[Y] = m_fMajorRadius + m_fMinorRadius;
  65. pBox->m_fMax[Z] = m_fMinorRadius;
  66. pBox->m_fMin[X] = -(m_fMajorRadius + m_fMinorRadius);
  67. pBox->m_fMin[Y] = -(m_fMajorRadius + m_fMinorRadius);
  68. pBox->m_fMin[Z] = -m_fMinorRadius;
  69. }
  70. int C3dObjectTorus::LoadBitMapImage(CImageList* pList)
  71. {
  72. CBitmap bitmap;
  73. // If the image index has been stored in this object,
  74. // return the index.
  75. if(m_iBMImage > -1)
  76. return m_iBMImage;
  77. // If the image index for this object type has been
  78. // created, store the index for this object and
  79. // return the index.
  80. if( iObjectTorusBMImage > -1) {
  81. m_iBMImage = iObjectTorusBMImage;
  82. return m_iBMImage;
  83. }
  84. // The image index for this object type has not been
  85. // loaded and the object image index has not been
  86. // stored.
  87. //
  88. // Load the bitmap for the non-selected light
  89. bitmap.LoadBitmap(IDB_OBJECT_TORUS);
  90. m_iBMImage = pList->Add(&bitmap, (COLORREF)0xFFFFFF);
  91. bitmap.DeleteObject();
  92. // Load the bitmap for the non-selected light
  93. bitmap.LoadBitmap(IDB_OBJECT_TORUS_SELECTED);
  94. pList->Add(&bitmap, (COLORREF)0xFFFFFF);
  95. bitmap.DeleteObject();
  96. iObjectTorusBMImage = m_iBMImage;
  97. return m_iBMImage;
  98. }
  99. void C3dObjectTorus::Serialize(CArchive& ar, int iVersion)
  100. {
  101. CString szBuffer;
  102. if (ar.IsStoring())
  103. {
  104. // Save the Object Class header...
  105. szBuffer.Format("n%sC3dObjectTorus {n", szIndent);
  106. ar.WriteString(szBuffer);
  107. // Save the this objects' specific data...
  108. szBuffer.Format("%stMajorRadius   < %f >n", szIndent, m_fMajorRadius);
  109. ar.WriteString(szBuffer);
  110. szBuffer.Format("%stMinorRadius   < %f >n", szIndent, m_fMinorRadius);
  111. ar.WriteString(szBuffer);
  112. szBuffer.Format("%stMajorSlices   < %d >n", szIndent, m_iNumMajor);
  113. ar.WriteString(szBuffer);
  114. szBuffer.Format("%stMinorSlices   < %d >n", szIndent, m_iNumMinor);
  115. ar.WriteString(szBuffer);
  116. // Save the base class object data...
  117. C3dObject::Serialize(ar, iVersion);
  118. szBuffer.Format("%s}n", szIndent); // end of object def
  119. ar.WriteString(szBuffer);
  120. }
  121. else
  122. {
  123. if(iVersion < 102)
  124. // Read the base class object data...
  125. C3dObject::Serialize(ar, iVersion);
  126. // Read the derived class data..
  127. ar.ReadString(szBuffer);
  128. szBuffer.TrimLeft(); // Remove leading white spaces
  129. sscanf(szBuffer, "MajorRadius   < %f >n", &m_fMajorRadius);
  130. ar.ReadString(szBuffer);
  131. szBuffer.TrimLeft();
  132. sscanf(szBuffer, "MinorRadius   < %f >n", &m_fMinorRadius);
  133. ar.ReadString(szBuffer);
  134. szBuffer.TrimLeft();
  135. sscanf(szBuffer, "MajorSlices   < %d >n", &m_iNumMajor);
  136. ar.ReadString(szBuffer);
  137. szBuffer.TrimLeft();
  138. sscanf(szBuffer, "MinorSlices   < %d >n", &m_iNumMinor);
  139. if(iVersion < 102)
  140. // Read all child objects...
  141. LoadChildObjects(ar, iVersion);
  142. else
  143. // Read the base class object data...
  144. C3dObject::Serialize(ar, iVersion);
  145. }
  146. }
  147. void C3dObjectTorus::Build(C3dWorld* pWorld, C3dCamera* pCamera)
  148. {
  149. double majorStep = 2.0F*Pi / m_iNumMajor;
  150. double minorStep = 2.0F*Pi / m_iNumMinor;
  151. int i, j;
  152. glNewList(m_iDisplayLists, GL_COMPILE_AND_EXECUTE);
  153. for (i=0; i<m_iNumMajor; ++i)
  154. {
  155. double a0 = i * majorStep;
  156. double a1 = a0 + majorStep;
  157. GLfloat x0 = (GLfloat)cos(a0);
  158. GLfloat y0 = (GLfloat)sin(a0);
  159. GLfloat x1 = (GLfloat)cos(a1);
  160. GLfloat y1 = (GLfloat)sin(a1);
  161. glBegin(GL_TRIANGLE_STRIP);
  162. for (j=0; j<=m_iNumMinor; ++j)
  163. {
  164. double b = j * minorStep;
  165. GLfloat c = (GLfloat)cos(b);
  166. GLfloat r = m_fMinorRadius * c + m_fMajorRadius;
  167. GLfloat z = m_fMinorRadius * (GLfloat)sin(b);
  168. glNormal3f(x0*c, y0*c, z/m_fMinorRadius);
  169. glTexCoord2f(i/(GLfloat) m_iNumMajor, j/(GLfloat) m_iNumMinor);
  170. glVertex3f(x0*r, y0*r, z);
  171. glNormal3f(x1*c, y1*c, z/m_fMinorRadius);
  172. glTexCoord2f((i+1)/(GLfloat) m_iNumMajor, j/(GLfloat) m_iNumMinor);
  173. glVertex3f(x1*r, y1*r, z);
  174. }
  175. glEnd();
  176.     }
  177. glEndList();
  178. }
  179. /////////////////////////////////////////////////////////////////////////////
  180. // C3dObjectTorus function implimentation