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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dMaterial.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 <windows.h>
  20. #include "stdafx.h"
  21. #include "glOOP.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. //////////////////////////////////////////////////////////////////
  28. // C3dMaterial
  29. IMPLEMENT_DYNAMIC(C3dMaterial, CObject)
  30. //IMPLEMENT_SERIAL(C3dMaterial, CObject, 0)
  31. /////////////////////////////////////////////////////////////////////////////
  32. // C3dMaterial construction
  33. C3dMaterial::C3dMaterial()
  34. {
  35. // Assign default values to member attributes..
  36. m_szName.GetBuffer(128); // allocate 128 bytes min.
  37.    m_szName.Format("Shiny");
  38. m_ColorAmbient.SetColor4f(0.3f, 0.3f, 0.3f, 1.0f);
  39. m_ColorDiffuse.SetColor4f(0.8f, 0.8f, 0.8f, 1.0f);
  40. m_ColorSpecular.SetColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  41. m_ColorEmmissive.SetColor4f(0.0f, 0.0f, 0.0f, 1.0f);
  42. m_fSpecularPower = 20.0f;
  43. m_fIOR = 0.0f;
  44. m_fReflection = 0.0f;
  45. m_fTranslucency = 0.0f;
  46. }
  47. /////////////////////////////////////////////////////////////////////////////
  48. // C3dMaterial Destructor
  49. C3dMaterial::~C3dMaterial()
  50. {
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. // C3dMaterial Implimentation
  54. C3dMaterial* C3dMaterial::Create()
  55. {
  56. C3dMaterial* pMaterial = new C3dMaterial;
  57. ASSERT(pMaterial);
  58. return pMaterial;
  59. }
  60. C3dMaterial* C3dMaterial::Create(CString szName,
  61. GLfloat ar, GLfloat ag, GLfloat ab, GLfloat aa,
  62. GLfloat dr, GLfloat dg, GLfloat db, GLfloat da,
  63. GLfloat sr, GLfloat sg, GLfloat sb, GLfloat sa,
  64. GLfloat er, GLfloat eg, GLfloat eb, GLfloat ea,
  65. GLfloat power,
  66. GLfloat IOR,
  67. GLfloat reflection,
  68. GLfloat translucency)
  69. {
  70. C3dMaterial* pMaterial = new C3dMaterial;
  71. ASSERT(pMaterial);
  72. pMaterial->m_szName = szName;
  73. pMaterial->m_ColorAmbient.SetColor4f(ar, ag, ab, aa);
  74. pMaterial->m_ColorDiffuse.SetColor4f(dr, dg, db, da);
  75. pMaterial->m_ColorSpecular.SetColor4f(sr, sg, sb, sa);
  76. pMaterial->m_ColorEmmissive.SetColor4f(er, eg, eb, ea);
  77. pMaterial->m_fSpecularPower = power;
  78. pMaterial->m_fIOR = IOR;
  79. pMaterial->m_fReflection = reflection;
  80. pMaterial->m_fTranslucency = translucency;
  81. return pMaterial;
  82. }
  83. void C3dMaterial::Delete(C3dMaterial* pMaterial)
  84. {
  85. if(pMaterial) {
  86. delete pMaterial;
  87. }
  88. }
  89. void C3dMaterial::SetMaterialAttrib()
  90. {
  91. // Set the objects material properties
  92. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, m_ColorAmbient.m_fColor);
  93. glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, m_ColorDiffuse.m_fColor);
  94. glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, m_ColorSpecular.m_fColor);
  95. glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, m_ColorEmmissive.m_fColor);
  96. glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, m_fSpecularPower);
  97. }
  98. void C3dMaterial::ResetMaterialAttrib()
  99. {
  100. GLfloat ambColor[] = {0.2f, 0.2f, 0.2f, 1.0f};
  101. GLfloat difColor[] = {0.8f, 0.8f, 0.8f, 1.0f};
  102. GLfloat spcColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
  103. GLfloat emmColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
  104. // Set material properties to default values
  105. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  ambColor);
  106. glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,  difColor);
  107. glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spcColor);
  108. glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emmColor);
  109. glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f);
  110. }
  111. void C3dMaterial::Serialize(CArchive& ar, int iVersion)
  112. {
  113. CString szBuffer;
  114. if (ar.IsStoring())
  115. {
  116. // Save the Material header
  117. szBuffer.Format("Material {n");
  118. ar.WriteString(szBuffer);
  119. // Save the Material Data...
  120. szBuffer.Format("tName          < %s >n", m_szName);
  121. ar.WriteString(szBuffer);
  122. szBuffer.Format("tAmbientColor  < %f %f %f %f >n", m_ColorAmbient.m_fColor[0], m_ColorAmbient.m_fColor[1], m_ColorAmbient.m_fColor[2], m_ColorAmbient.m_fColor[3]);
  123. ar.WriteString(szBuffer);
  124. szBuffer.Format("tDiffuseColor  < %f %f %f %f >n", m_ColorDiffuse.m_fColor[0], m_ColorDiffuse.m_fColor[1], m_ColorDiffuse.m_fColor[2], m_ColorDiffuse.m_fColor[3]);
  125. ar.WriteString(szBuffer);
  126. szBuffer.Format("tSpecularColor < %f %f %f %f >n", m_ColorSpecular.m_fColor[0], m_ColorSpecular.m_fColor[1], m_ColorSpecular.m_fColor[2], m_ColorSpecular.m_fColor[3]);
  127. ar.WriteString(szBuffer);
  128. szBuffer.Format("tSpecularPower < %f >n", m_fSpecularPower);
  129. ar.WriteString(szBuffer);
  130. szBuffer.Format("tReflection    < %f >n", m_fReflection);
  131. ar.WriteString(szBuffer);
  132. szBuffer.Format("tTranslucency  < %f >n", m_fTranslucency);
  133. ar.WriteString(szBuffer);
  134. szBuffer.Format("tIndexOfRefraction < %f >n", m_fIOR);
  135. ar.WriteString(szBuffer);
  136. szBuffer.Format("}nn"); // end of material def
  137. ar.WriteString(szBuffer);
  138. }
  139. else
  140. {
  141. // Read the Material data...
  142. ar.ReadString(szBuffer);
  143. szBuffer.TrimLeft(); // Remove leading white spaces
  144. sscanf(szBuffer, "Name          < %s >n", m_szName);
  145. ar.ReadString(szBuffer);
  146. szBuffer.TrimLeft();
  147. sscanf(szBuffer, "AmbientColor  < %f %f %f %f >n", &m_ColorAmbient.m_fColor[0], &m_ColorAmbient.m_fColor[1], &m_ColorAmbient.m_fColor[2], &m_ColorAmbient.m_fColor[3]);
  148. ar.ReadString(szBuffer);
  149. szBuffer.TrimLeft();
  150. sscanf(szBuffer, "DiffuseColor  < %f %f %f %f >n", &m_ColorDiffuse.m_fColor[0], &m_ColorDiffuse.m_fColor[1], &m_ColorDiffuse.m_fColor[2], &m_ColorDiffuse.m_fColor[3]);
  151. ar.ReadString(szBuffer);
  152. szBuffer.TrimLeft();
  153. sscanf(szBuffer, "SpecularColor < %f %f %f %f >n", &m_ColorSpecular.m_fColor[0], &m_ColorSpecular.m_fColor[1], &m_ColorSpecular.m_fColor[2], &m_ColorSpecular.m_fColor[3]);
  154. ar.ReadString(szBuffer);
  155. szBuffer.TrimLeft();
  156. sscanf(szBuffer, "SpecularPower < %f >n", &m_fSpecularPower);
  157. ar.ReadString(szBuffer);
  158. szBuffer.TrimLeft();
  159. sscanf(szBuffer, "Reflection    < %f >n", &m_fReflection);
  160. ar.ReadString(szBuffer);
  161. szBuffer.TrimLeft();
  162. sscanf(szBuffer, "Translucency  < %f >n", &m_fTranslucency);
  163. ar.ReadString(szBuffer);
  164. szBuffer.TrimLeft();
  165. sscanf(szBuffer, "IndexOfRefraction < %f >n", &m_fIOR);
  166. }
  167. }