/opengles/src/ContextFloat.cpp

http://ftk.googlecode.com/ · C++ · 604 lines · 416 code · 127 blank · 61 comment · 42 complexity · c5585430a7f2a85edd0375b6b22ec5a9 MD5 · raw file

  1. // ==========================================================================
  2. //
  3. // ContextFloat.cpp Rendering Context Class for 3D Rendering Library
  4. //
  5. // Emulation of EGL Floating Point Primitives
  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. using namespace EGL;
  41. void Context :: AlphaFunc (GLenum func, GLclampf ref) {
  42. AlphaFuncx(func, EGL_FixedFromFloat(ref));
  43. }
  44. void Context :: ClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
  45. ClearColorx(EGL_FixedFromFloat(red), EGL_FixedFromFloat(green),
  46. EGL_FixedFromFloat(blue), EGL_FixedFromFloat(alpha));
  47. }
  48. void Context :: ClearDepthf (GLclampf depth) {
  49. ClearDepthx(EGL_FixedFromFloat(depth));
  50. }
  51. void Context :: Color4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
  52. Color4x(EGL_FixedFromFloat(red), EGL_FixedFromFloat(green),
  53. EGL_FixedFromFloat(blue), EGL_FixedFromFloat(alpha));
  54. }
  55. void Context :: DepthRangef (GLclampf zNear, GLclampf zFar) {
  56. DepthRangex(EGL_FixedFromFloat(zNear), EGL_FixedFromFloat(zFar));
  57. }
  58. void Context :: Fogf (GLenum pname, GLfloat param) {
  59. switch (pname) {
  60. case GL_FOG_MODE:
  61. Fogx(pname, EGL_FixedFromFloat(param));
  62. break;
  63. case GL_FOG_START:
  64. case GL_FOG_END:
  65. case GL_FOG_DENSITY:
  66. Fogx(pname, EGL_FixedFromFloat(param));
  67. break;
  68. default:
  69. RecordError(GL_INVALID_ENUM);
  70. }
  71. }
  72. void Context :: Fogfv (GLenum pname, const GLfloat *params) {
  73. GLfixed param;
  74. switch (pname) {
  75. case GL_FOG_MODE:
  76. param = static_cast<GLenum>(*params);
  77. Fogxv(pname, &param);
  78. break;
  79. case GL_FOG_DENSITY:
  80. case GL_FOG_START:
  81. case GL_FOG_END:
  82. //case GL_FOG_INDEX:
  83. param = EGL_FixedFromFloat(*params);
  84. Fogxv(pname, &param);
  85. break;
  86. case GL_FOG_COLOR:
  87. GLfixed fixed_params[4];
  88. for (int index = 0; index < 4; ++index) {
  89. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  90. }
  91. Fogxv(pname, fixed_params);
  92. break;
  93. }
  94. }
  95. void Context :: Frustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
  96. Frustumx(EGL_FixedFromFloat(left), EGL_FixedFromFloat(right),
  97. EGL_FixedFromFloat(bottom), EGL_FixedFromFloat(top),
  98. EGL_FixedFromFloat(zNear), EGL_FixedFromFloat(zFar));
  99. }
  100. void Context :: LightModelf (GLenum pname, GLfloat param) {
  101. LightModelx(pname, EGL_FixedFromFloat(param));
  102. }
  103. void Context :: LightModelfv (GLenum pname, const GLfloat *params) {
  104. int index;
  105. switch (pname) {
  106. case GL_LIGHT_MODEL_AMBIENT:
  107. GLfixed fixed_params[4];
  108. for (index = 0; index < 4; ++index) {
  109. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  110. }
  111. LightModelxv(pname, fixed_params);
  112. break;
  113. //case GL_LIGHT_MODEL_LOCAL_VIEWER:
  114. case GL_LIGHT_MODEL_TWO_SIDE:
  115. //case GL_LIGHT_MODEL_COLOR_CONTROL:
  116. GLfixed param;
  117. param = EGL_FixedFromFloat(*params);
  118. LightModelxv(pname, &param);
  119. break;
  120. }
  121. }
  122. void Context :: Lightf (GLenum light, GLenum pname, GLfloat param) {
  123. Lightx(light, pname, EGL_FixedFromFloat(param));
  124. }
  125. void Context :: Lightfv (GLenum light, GLenum pname, const GLfloat *params) {
  126. //void Context :: Lightxv (GLenum light, GLenum pname, const GLfixed *params);
  127. GLfixed fixed_params[4];
  128. int index;
  129. switch (pname) {
  130. case GL_AMBIENT:
  131. case GL_DIFFUSE:
  132. case GL_SPECULAR:
  133. // case GL_EMISSION:
  134. case GL_POSITION:
  135. for (index = 0; index < 4; ++index) {
  136. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  137. }
  138. Lightxv(light, pname, fixed_params);
  139. break;
  140. case GL_SPOT_DIRECTION:
  141. for (index = 0; index < 3; ++index) {
  142. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  143. }
  144. Lightxv(light, pname, fixed_params);
  145. break;
  146. // case GL_SHININESS:
  147. case GL_SPOT_EXPONENT:
  148. case GL_SPOT_CUTOFF:
  149. case GL_CONSTANT_ATTENUATION:
  150. case GL_LINEAR_ATTENUATION:
  151. case GL_QUADRATIC_ATTENUATION:
  152. fixed_params[0] = EGL_FixedFromFloat(params[0]);
  153. Lightxv(light, pname, fixed_params);
  154. break;
  155. /*
  156. case GL_COLOR_INDEXES:
  157. for (index = 0; index < 3; ++index) {
  158. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  159. }
  160. glLightxv(light, pname, fixed_params);
  161. break;
  162. */
  163. }
  164. }
  165. void Context :: LineWidth (GLfloat width) {
  166. LineWidthx(EGL_FixedFromFloat(width));
  167. }
  168. void Context :: LoadMatrixf (const GLfloat *m) {
  169. GLfixed mx[16];
  170. for (int index = 0; index < 16; ++index) {
  171. mx[index] = EGL_FixedFromFloat(m[index]);
  172. }
  173. LoadMatrixx(mx);
  174. }
  175. void Context :: Materialf (GLenum face, GLenum pname, GLfloat param) {
  176. Materialx(face, pname, EGL_FixedFromFloat(param));
  177. }
  178. void Context :: Materialfv (GLenum face, GLenum pname, const GLfloat *params) {
  179. GLfixed fixed_params[4];
  180. int index;
  181. switch (pname) {
  182. case GL_AMBIENT:
  183. case GL_DIFFUSE:
  184. case GL_AMBIENT_AND_DIFFUSE:
  185. case GL_SPECULAR:
  186. case GL_EMISSION:
  187. for (index = 0; index < 4; ++index) {
  188. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  189. }
  190. Materialxv(face, pname, fixed_params);
  191. break;
  192. case GL_SHININESS:
  193. fixed_params[0] = EGL_FixedFromFloat(params[0]);
  194. Materialxv(face, pname, fixed_params);
  195. break;
  196. /*
  197. case GL_COLOR_INDEXES:
  198. for (index = 0; index < 3; ++index) {
  199. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  200. }
  201. glMaterialxv(light, pname, fixed_params);
  202. break;
  203. */
  204. }
  205. }
  206. void Context :: MultMatrixf (const GLfloat *m) {
  207. GLfixed mx[16];
  208. for (int index = 0; index < 16; ++index) {
  209. mx[index] = EGL_FixedFromFloat(m[index]);
  210. }
  211. MultMatrixx(mx);
  212. }
  213. void Context :: MultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {
  214. MultiTexCoord4x(target,
  215. EGL_FixedFromFloat(s), EGL_FixedFromFloat(t),
  216. EGL_FixedFromFloat(r), EGL_FixedFromFloat(q));
  217. }
  218. void Context :: Normal3f (GLfloat nx, GLfloat ny, GLfloat nz) {
  219. Normal3x(EGL_FixedFromFloat(nx), EGL_FixedFromFloat(ny), EGL_FixedFromFloat(nz));
  220. }
  221. void Context :: Orthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
  222. Orthox(EGL_FixedFromFloat(left), EGL_FixedFromFloat(right),
  223. EGL_FixedFromFloat(bottom), EGL_FixedFromFloat(top),
  224. EGL_FixedFromFloat(zNear), EGL_FixedFromFloat(zFar));
  225. }
  226. void Context :: PointSize (GLfloat size) {
  227. PointSizex(EGL_FixedFromFloat(size));
  228. }
  229. void Context :: PolygonOffset (GLfloat factor, GLfloat units) {
  230. PolygonOffsetx(EGL_FixedFromFloat(factor), EGL_FixedFromFloat(units));
  231. }
  232. void Context :: Rotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z) {
  233. Rotatex(EGL_FixedFromFloat(angle), EGL_FixedFromFloat(x),
  234. EGL_FixedFromFloat(y), EGL_FixedFromFloat(z));
  235. }
  236. void Context :: SampleCoverage (GLclampf value, GLboolean invert) {
  237. SampleCoveragex(EGL_FixedFromFloat(value), invert);
  238. }
  239. void Context :: Scalef (GLfloat x, GLfloat y, GLfloat z) {
  240. Scalex(EGL_FixedFromFloat(x), EGL_FixedFromFloat(y), EGL_FixedFromFloat(z));
  241. }
  242. void Context :: TexEnvf (GLenum target, GLenum pname, GLfloat param) {
  243. switch (pname) {
  244. case GL_RGB_SCALE:
  245. case GL_ALPHA_SCALE:
  246. TexEnvx(target, pname, EGL_FixedFromFloat(param));
  247. break;
  248. default:
  249. TexEnvx(target, pname, (GLfixed) param);
  250. break;
  251. }
  252. }
  253. void Context :: TexEnvfv (GLenum target, GLenum pname, const GLfloat *params) {
  254. GLfixed fixed_params[4];
  255. int index;
  256. switch (pname) {
  257. case GL_TEXTURE_ENV_COLOR:
  258. for (index = 0; index < 4; ++index) {
  259. fixed_params[index] = EGL_FixedFromFloat(params[index]);
  260. }
  261. TexEnvxv(target, pname, fixed_params);
  262. break;
  263. default:
  264. TexEnvf(target, pname, *params);
  265. break;
  266. }
  267. }
  268. void Context :: TexParameterf (GLenum target, GLenum pname, GLfloat param) {
  269. switch (pname) {
  270. case GL_TEXTURE_MIN_FILTER:
  271. case GL_TEXTURE_MAG_FILTER:
  272. case GL_TEXTURE_WRAP_S:
  273. case GL_TEXTURE_WRAP_T:
  274. case GL_GENERATE_MIPMAP:
  275. TexParameterx(target, pname, (GLfixed) param);
  276. break;
  277. default:
  278. RecordError(GL_INVALID_ENUM);
  279. }
  280. }
  281. void Context :: Translatef (GLfloat x, GLfloat y, GLfloat z) {
  282. Translatex(EGL_FixedFromFloat(x), EGL_FixedFromFloat(y), EGL_FixedFromFloat(z));
  283. }
  284. void Context :: ClipPlanef(GLenum plane, const GLfloat *equation) {
  285. EGL_Fixed fixedEqn[4];
  286. for (size_t index = 0; index < 4; ++index) {
  287. fixedEqn[index] = EGL_FixedFromFloat(equation[index]);
  288. }
  289. ClipPlanex(plane, fixedEqn);
  290. }
  291. void Context :: DrawTexf(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height) {
  292. assert(0);
  293. }
  294. void Context :: DrawTexfv(GLfloat *coords) {
  295. assert(0);
  296. }
  297. void Context :: GetClipPlanef(GLenum plane, GLfloat eqn[4]) {
  298. if (plane < GL_CLIP_PLANE0 || plane >= GL_CLIP_PLANE0 + NUM_CLIP_PLANES) {
  299. RecordError(GL_INVALID_ENUM);
  300. return;
  301. }
  302. size_t index = plane - GL_CLIP_PLANE0;
  303. eqn[0] = EGL_FloatFromFixed(m_ClipPlanes[index].x());
  304. eqn[1] = EGL_FloatFromFixed(m_ClipPlanes[index].y());
  305. eqn[2] = EGL_FloatFromFixed(m_ClipPlanes[index].z());
  306. eqn[3] = EGL_FloatFromFixed(m_ClipPlanes[index].w());
  307. }
  308. namespace {
  309. void CopyFixed(const GLfixed * in, GLfloat * out, size_t size) {
  310. while (size--) {
  311. *out++ = EGL_FloatFromFixed(*in++);
  312. }
  313. }
  314. }
  315. void Context :: GetFloatv(GLenum pname, GLfloat *params) {
  316. GLfixed buffer[16];
  317. switch (pname) {
  318. case GL_FOG_DENSITY:
  319. case GL_FOG_START:
  320. case GL_FOG_END:
  321. case GL_POLYGON_OFFSET_UNITS:
  322. case GL_POLYGON_OFFSET_FACTOR:
  323. case GL_SAMPLE_COVERAGE_VALUE:
  324. case GL_POINT_SIZE:
  325. case GL_LINE_WIDTH:
  326. case GL_POINT_SIZE_MIN:
  327. case GL_POINT_SIZE_MAX:
  328. case GL_POINT_FADE_THRESHOLD_SIZE:
  329. if (GetFixedv(pname, buffer)) {
  330. CopyFixed(buffer, params, 1);
  331. }
  332. break;
  333. case GL_ALIASED_LINE_WIDTH_RANGE:
  334. case GL_ALIASED_POINT_SIZE_RANGE:
  335. case GL_SMOOTH_LINE_WIDTH_RANGE:
  336. case GL_SMOOTH_POINT_SIZE_RANGE:
  337. case GL_DEPTH_RANGE:
  338. if (GetFixedv(pname, buffer)) {
  339. CopyFixed(buffer, params, 2);
  340. }
  341. break;
  342. case GL_CURRENT_NORMAL:
  343. case GL_POINT_DISTANCE_ATTENUATION:
  344. if (GetFixedv(pname, buffer)) {
  345. CopyFixed(buffer, params, 3);
  346. }
  347. break;
  348. case GL_CURRENT_COLOR:
  349. case GL_CURRENT_TEXTURE_COORDS:
  350. case GL_FOG_COLOR:
  351. case GL_LIGHT_MODEL_AMBIENT:
  352. case GL_COLOR_CLEAR_VALUE:
  353. if (GetFixedv(pname, buffer)) {
  354. CopyFixed(buffer, params, 4);
  355. }
  356. break;
  357. case GL_MODELVIEW_MATRIX:
  358. case GL_PROJECTION_MATRIX:
  359. case GL_TEXTURE_MATRIX:
  360. if (GetFixedv(pname, buffer)) {
  361. CopyFixed(buffer, params, 16);
  362. }
  363. break;
  364. }
  365. }
  366. void Context :: GetLightfv(GLenum light, GLenum pname, GLfloat *params) {
  367. GLfixed buffer[16];
  368. switch (pname) {
  369. case GL_AMBIENT:
  370. case GL_DIFFUSE:
  371. case GL_SPECULAR:
  372. case GL_POSITION:
  373. if (GetLightxv(light, pname, buffer)) {
  374. CopyFixed(buffer, params, 4);
  375. }
  376. break;
  377. case GL_SPOT_DIRECTION:
  378. if (GetLightxv(light, pname, buffer)) {
  379. CopyFixed(buffer, params, 3);
  380. }
  381. break;
  382. case GL_SPOT_EXPONENT:
  383. case GL_SPOT_CUTOFF:
  384. case GL_CONSTANT_ATTENUATION:
  385. case GL_LINEAR_ATTENUATION:
  386. case GL_QUADRATIC_ATTENUATION:
  387. if (GetLightxv(light, pname, buffer)) {
  388. CopyFixed(buffer, params, 1);
  389. }
  390. break;
  391. default:
  392. RecordError(GL_INVALID_ENUM);
  393. return;
  394. }
  395. }
  396. void Context :: GetMaterialfv(GLenum face, GLenum pname, GLfloat *params) {
  397. GLfixed buffer[16];
  398. switch (pname) {
  399. case GL_AMBIENT:
  400. case GL_DIFFUSE:
  401. case GL_SPECULAR:
  402. case GL_EMISSION:
  403. if (GetMaterialxv(face, pname, buffer)) {
  404. CopyFixed(buffer, params, 4);
  405. }
  406. break;
  407. case GL_SHININESS:
  408. if (GetMaterialxv(face, pname, buffer)) {
  409. CopyFixed(buffer, params, 1);
  410. }
  411. break;
  412. default:
  413. RecordError(GL_INVALID_ENUM);
  414. return;
  415. }
  416. }
  417. void Context :: GetTexEnvfv(GLenum env, GLenum pname, GLfloat *params) {
  418. GLfixed buffer[16];
  419. switch (env) {
  420. case GL_TEXTURE_ENV:
  421. switch (pname) {
  422. case GL_TEXTURE_ENV_COLOR:
  423. if (GetTexEnvxv(env, pname, buffer)) {
  424. CopyFixed(buffer, params, 4);
  425. }
  426. break;
  427. case GL_RGB_SCALE:
  428. case GL_ALPHA_SCALE:
  429. if (GetTexEnvxv(env, pname, buffer)) {
  430. params[0] = EGL_FloatFromFixed(buffer[0]);
  431. }
  432. break;
  433. default:
  434. RecordError(GL_INVALID_ENUM);
  435. break;
  436. }
  437. break;
  438. default:
  439. RecordError(GL_INVALID_ENUM);
  440. break;
  441. }
  442. }
  443. void Context :: GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) {
  444. if (target != GL_TEXTURE_2D) {
  445. RecordError(GL_INVALID_ENUM);
  446. return;
  447. }
  448. #if 0
  449. switch (pname) {
  450. default:
  451. #endif
  452. RecordError(GL_INVALID_ENUM);
  453. #if 0
  454. break;
  455. }
  456. #endif
  457. }
  458. void Context :: PointParameterf(GLenum pname, GLfloat param) {
  459. PointParameterx(pname, EGL_FixedFromFloat(param));
  460. }
  461. void Context :: PointParameterfv(GLenum pname, const GLfloat *params) {
  462. switch (pname) {
  463. case GL_POINT_DISTANCE_ATTENUATION:
  464. {
  465. GLfixed fixedParams[3];
  466. for (size_t index = 0; index < 3; ++index) {
  467. fixedParams[index] = EGL_FixedFromFloat(params[index]);
  468. }
  469. PointParameterxv(pname, fixedParams);
  470. }
  471. break;
  472. default:
  473. PointParameterx(pname, EGL_FixedFromFloat(*params));
  474. }
  475. }