/opengles/src/ContextLight.cpp

http://ftk.googlecode.com/ · C++ · 285 lines · 185 code · 60 blank · 40 comment · 30 complexity · b49c296ab119fe7e2dded2459fbe8b4c MD5 · raw file

  1. // ==========================================================================
  2. //
  3. // ContextLight.cpp Rendering Context Class for 3D Rendering Library
  4. //
  5. // Lighting and Shading related settings
  6. //
  7. // --------------------------------------------------------------------------
  8. //
  9. // 08-02-2003 Hans-Martin Will initial version
  10. //
  11. // --------------------------------------------------------------------------
  12. //
  13. // Copyright (c) 2004, Hans-Martin Will. All rights reserved.
  14. //
  15. // Redistribution and use in source and binary forms, with or without
  16. // modification, are permitted provided that the following conditions are
  17. // met:
  18. //
  19. // * Redistributions of source code must retain the above copyright
  20. // notice, this list of conditions and the following disclaimer.
  21. // * Redistributions in binary form must reproduce the above copyright
  22. // notice, this list of conditions and the following disclaimer in the
  23. // documentation and/or other materials provided with the distribution.
  24. //
  25. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  26. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28. // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  29. // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
  30. // OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  31. // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  32. // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  33. // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  34. // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  35. // THE POSSIBILITY OF SUCH DAMAGE.
  36. //
  37. // ==========================================================================
  38. #include "stdafx.h"
  39. #include "Context.h"
  40. #include "RasterizerState.h"
  41. #include "Utils.h"
  42. using namespace EGL;
  43. // ==========================================================================
  44. // class Context
  45. // ==========================================================================
  46. void Context :: Fogx(GLenum pname, GLfixed param) {
  47. switch (pname) {
  48. case GL_FOG_MODE:
  49. switch (param) {
  50. default:
  51. RecordError(GL_INVALID_ENUM);
  52. break;
  53. case GL_LINEAR:
  54. m_FogMode = FogLinear;
  55. break;
  56. case GL_EXP:
  57. m_FogMode = FogModeExp;
  58. break;
  59. case GL_EXP2:
  60. m_FogMode = FogModeExp2;
  61. break;
  62. }
  63. break;
  64. case GL_FOG_START:
  65. m_FogStart = param;
  66. goto calculateFog;
  67. case GL_FOG_END:
  68. m_FogEnd = param;
  69. calculateFog:
  70. if (m_FogStart != m_FogEnd) {
  71. EGL_Fixed diff = m_FogEnd - m_FogStart;
  72. if ((diff >> 24) && (diff >> 24) + 1) {
  73. m_FogGradient = EGL_Inverse(diff >> 8);
  74. m_FogGradientShift = 8;
  75. } else {
  76. m_FogGradient = EGL_Inverse(diff);
  77. m_FogGradientShift = 0;
  78. }
  79. }
  80. break;
  81. case GL_FOG_DENSITY:
  82. if (param < 0) {
  83. RecordError(GL_INVALID_VALUE);
  84. } else {
  85. m_FogDensity = param;
  86. }
  87. break;
  88. default:
  89. RecordError(GL_INVALID_ENUM);
  90. }
  91. }
  92. void Context :: Fogxv(GLenum pname, const GLfixed *params) {
  93. switch (pname) {
  94. case GL_FOG_COLOR:
  95. GetRasterizerState()->SetFogColor(FractionalColor(params));
  96. break;
  97. default:
  98. Fogx(pname, *params);
  99. break;
  100. }
  101. }
  102. void Context :: LightModelx(GLenum pname, GLfixed param) {
  103. switch (pname) {
  104. case GL_LIGHT_MODEL_TWO_SIDE:
  105. m_TwoSidedLightning = (param != 0);
  106. break;
  107. default:
  108. RecordError(GL_INVALID_ENUM);
  109. }
  110. }
  111. void Context :: LightModelxv(GLenum pname, const GLfixed *params) {
  112. switch (pname) {
  113. case GL_LIGHT_MODEL_AMBIENT:
  114. m_LightModelAmbient = FractionalColor::Clamp(params);
  115. break;
  116. default:
  117. LightModelx(pname, *params);
  118. return;
  119. }
  120. }
  121. void Context :: Lightx(GLenum light, GLenum pname, GLfixed param) {
  122. if (light < GL_LIGHT0 || light > GL_LIGHT7) {
  123. RecordError(GL_INVALID_ENUM);
  124. return;
  125. }
  126. Light * pLight = m_Lights + (light - GL_LIGHT0);
  127. switch (pname) {
  128. case GL_SPOT_EXPONENT:
  129. if (param < 0 || param > EGL_FixedFromInt(128)) {
  130. RecordError(GL_INVALID_VALUE);
  131. } else {
  132. pLight->SetSpotExponent(param);
  133. }
  134. break;
  135. case GL_SPOT_CUTOFF:
  136. if (param < 0 || param > EGL_FixedFromInt(90) && param != EGL_FixedFromInt(180)) {
  137. RecordError(GL_INVALID_VALUE);
  138. } else {
  139. pLight->SetSpotCutoff(param);
  140. }
  141. break;
  142. case GL_CONSTANT_ATTENUATION:
  143. pLight->SetConstantAttenuation(param);
  144. break;
  145. case GL_LINEAR_ATTENUATION:
  146. pLight->SetLinearAttenuation(param);
  147. break;
  148. case GL_QUADRATIC_ATTENUATION:
  149. pLight->SetQuadraticAttenuation(param);
  150. break;
  151. default:
  152. RecordError(GL_INVALID_ENUM);
  153. return;
  154. }
  155. }
  156. void Context :: Lightxv(GLenum light, GLenum pname, const GLfixed *params) {
  157. if (light < GL_LIGHT0 || light > GL_LIGHT7) {
  158. RecordError(GL_INVALID_ENUM);
  159. return;
  160. }
  161. Light * pLight = m_Lights + (light - GL_LIGHT0);
  162. switch (pname) {
  163. case GL_AMBIENT:
  164. pLight->SetAmbientColor(FractionalColor::Clamp(params));
  165. break;
  166. case GL_DIFFUSE:
  167. pLight->SetDiffuseColor(FractionalColor::Clamp(params));
  168. break;
  169. case GL_SPECULAR:
  170. pLight->SetSpecularColor(FractionalColor::Clamp(params));
  171. break;
  172. case GL_POSITION:
  173. pLight->SetPosition(m_ModelViewMatrixStack.CurrentMatrix() * Vec4D(params));
  174. break;
  175. case GL_SPOT_DIRECTION:
  176. pLight->SetDirection(m_ModelViewMatrixStack.CurrentMatrix().Multiply3x3(Vec3D(params)));
  177. break;
  178. default:
  179. Lightx(light, pname, *params);
  180. return;
  181. }
  182. }
  183. bool Context :: GetLightxv(GLenum light, GLenum pname, GLfixed *params) {
  184. if (light < GL_LIGHT0 || light > GL_LIGHT7) {
  185. RecordError(GL_INVALID_ENUM);
  186. return false;
  187. }
  188. Light * pLight = m_Lights + (light - GL_LIGHT0);
  189. switch (pname) {
  190. case GL_AMBIENT:
  191. CopyColor(pLight->GetAmbientColor(), params);
  192. break;
  193. case GL_DIFFUSE:
  194. CopyColor(pLight->GetDiffuseColor(), params);
  195. break;
  196. case GL_SPECULAR:
  197. CopyColor(pLight->GetSpecularColor(), params);
  198. break;
  199. case GL_POSITION:
  200. CopyVector(pLight->GetPosition(), params);
  201. break;
  202. case GL_SPOT_DIRECTION:
  203. CopyVector(pLight->GetDirection(), params);
  204. break;
  205. case GL_SPOT_EXPONENT:
  206. params[0] = pLight->GetSpotExponent();
  207. break;
  208. case GL_SPOT_CUTOFF:
  209. params[0] = pLight->GetSpotCutoff();
  210. break;
  211. case GL_CONSTANT_ATTENUATION:
  212. params[0] = pLight->GetConstantAttenuation();
  213. break;
  214. case GL_LINEAR_ATTENUATION:
  215. params[0] = pLight->GetLinearAttenuation();
  216. break;
  217. case GL_QUADRATIC_ATTENUATION:
  218. params[0] = pLight->GetQuadraticAttenuation();
  219. break;
  220. default:
  221. RecordError(GL_INVALID_ENUM);
  222. return false;
  223. }
  224. return true;
  225. }