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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dObjectSphere.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. // C3dObjectSphere
  29. IMPLEMENT_DYNAMIC(C3dObjectSphere, C3dObject)
  30. /////////////////////////////////////////////////////////////////////////////
  31. // C3dObjectSphere construction
  32. C3dObjectSphere::C3dObjectSphere()
  33. {
  34. // Set the attributes to default values..
  35.   m_iType = SHAPE_OBJECT;
  36.    m_szName.Format("Sphere %u", nSphereObjects++);
  37. m_fRadius   = 1.0f;
  38. m_iNumMajor = 20;
  39. m_iNumMinor = 20;
  40. // Create a quadratic object used to draw our object
  41. m_pQuad = gluNewQuadric();
  42. ASSERT(m_pQuad);
  43. }
  44. /////////////////////////////////////////////////////////////////////////////
  45. // C3dObjectSphere Destructor
  46. C3dObjectSphere::~C3dObjectSphere()
  47. {
  48. if(m_pQuad)
  49. gluDeleteQuadric(m_pQuad);
  50. }
  51. /////////////////////////////////////////////////////////////////////////////
  52. // C3dObjectSphere Methods or virtual function implimentation
  53. void C3dObjectSphere::AddAttributePage(C3dWorld* pWorld, LPVOID pSht)
  54. {
  55. C3dObjectPropSheet* pSheet = (C3dObjectPropSheet*)pSht;
  56. ASSERT(pSheet);
  57. // Add the page to the property sheet
  58. pSheet->AddPage(&pSheet->m_SpherePage);
  59. // Save the address of this object in the page
  60. pSheet->m_SpherePage.m_pObject = this;
  61. }
  62. void C3dObjectSphere::GetShapeBounds(C3dBoundingBox* pBox)
  63. {
  64. // Calculate the bounds of the shape
  65. pBox->m_fMax[X] = m_fRadius;
  66. pBox->m_fMax[Y] = m_fRadius;
  67. pBox->m_fMax[Z] = m_fRadius;
  68. pBox->m_fMin[X] = -m_fRadius;
  69. pBox->m_fMin[Y] = -m_fRadius;
  70. pBox->m_fMin[Z] = -m_fRadius;
  71. }
  72. int C3dObjectSphere::LoadBitMapImage(CImageList* pList)
  73. {
  74. CBitmap bitmap;
  75. // If the image index has been stored in this object,
  76. // return the index.
  77. if(m_iBMImage > -1)
  78. return m_iBMImage;
  79. // If the image index for this object type has been
  80. // created, store the index for this object and
  81. // return the index.
  82. if( iObjectSphereBMImage > -1) {
  83. m_iBMImage = iObjectSphereBMImage;
  84. return m_iBMImage;
  85. }
  86. // The image index for this object type has not been
  87. // loaded and the object image index has not been
  88. // stored.
  89. //
  90. // Load the bitmap for the non-selected light
  91. bitmap.LoadBitmap(IDB_OBJECT_SPHERE);
  92. m_iBMImage = pList->Add(&bitmap, (COLORREF)0xFFFFFF);
  93. bitmap.DeleteObject();
  94. // Load the bitmap for the non-selected light
  95. bitmap.LoadBitmap(IDB_OBJECT_SPHERE_SELECTED);
  96. pList->Add(&bitmap, (COLORREF)0xFFFFFF);
  97. bitmap.DeleteObject();
  98. iObjectSphereBMImage = m_iBMImage;
  99. return m_iBMImage;
  100. }
  101. void C3dObjectSphere::Serialize(CArchive& ar, int iVersion)
  102. {
  103. CString szBuffer;
  104. if (ar.IsStoring())
  105. {
  106. // Save the Object Class header...
  107. szBuffer.Format("n%sC3dObjectSphere {n", szIndent);
  108. ar.WriteString(szBuffer);
  109. // Save the this objects' specific data...
  110. szBuffer.Format("%stRadius        < %f >n", szIndent, m_fRadius);
  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, "Radius        < %f >n", &m_fRadius);
  130. ar.ReadString(szBuffer);
  131. szBuffer.TrimLeft();
  132. sscanf(szBuffer, "MajorSlices   < %d >n", &m_iNumMajor);
  133. ar.ReadString(szBuffer);
  134. szBuffer.TrimLeft();
  135. sscanf(szBuffer, "MinorSlices   < %d >n", &m_iNumMinor);
  136. if(iVersion < 102)
  137. // Read all child objects...
  138. LoadChildObjects(ar, iVersion);
  139. else
  140. // Read the base class object data...
  141. C3dObject::Serialize(ar, iVersion);
  142. }
  143. }
  144. void C3dObjectSphere::Build(C3dWorld* pWorld, C3dCamera* pCamera)
  145. {
  146. // Compile and build the list
  147. glNewList(m_iDisplayLists, GL_COMPILE_AND_EXECUTE);
  148. // Display the quadric object.
  149. gluSphere(m_pQuad, (GLdouble)m_fRadius, m_iNumMajor, m_iNumMinor);
  150. glEndList();
  151. }
  152. /////////////////////////////////////////////////////////////////////////////
  153. // C3dObjectSphere function implimentation