-/*******************************************************************************
-
- Copyright (c) 2009, Charles McGarvey
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*******************************************************************************/
+/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+**] All rights reserved.
+*
+* vi:ts=4 sw=4 tw=75
+*
+* Distributable under the terms and conditions of the 2-clause BSD license;
+* see the file COPYING for a complete text of the license.
+*
+**************************************************************************/
#ifndef _MOOF_OPENGL_HH_
#define _MOOF_OPENGL_HH_
#include <SDL/SDL_opengl.h>
+#include <Moof/Math.hh>
-/* Define to 1 if you want to use double precision floating-point numbers. */
-//#define USE_DOUBLE_PRECISION 1
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
-#if USE_DOUBLE_PRECISION
+// generic function arguments
-typedef GLdouble GLscalar;
-#define GL_SCALAR GL_DOUBLE
+#define ARGS_P const GLscalar* p
+#define PASS_P p
-inline void glGetScalarv(GLenum a, GLscalar* b) { glGetDoublev(a, b); }
+#define ARGS_M const Mf::Matrix4& m
+#define PASS_M m.data()
-inline void glLoadMatrix(const GLscalar* a) { glLoadMatrixd(a); }
-inline void glMultMatrix(const GLscalar* a) { glMultMatrixd(a); }
+// ordinal function arguments
-inline void glScale(GLscalar a, GLscalar b, GLscalar c) { glScaled(a, b, c); }
-inline void glRotate(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glRotated(a, b, c, d); }
-inline void glTranslate(GLscalar a, GLscalar b, GLscalar c) { glTranslated(a, b, c); }
+#define ARGS_S2 GLscalar a, GLscalar b
+#define PASS_S2 a, b
+#define ARGS_S3 GLscalar a, GLscalar b, GLscalar c
+#define PASS_S3 a, b, c
+#define ARGS_S4 GLscalar a, GLscalar b, GLscalar c, GLscalar d
+#define PASS_S4 a, b, c, d
-inline void glColor3(GLscalar a, GLscalar b, GLscalar c) { glColor3d(a, b, c); }
-inline void glColor4(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glColor4d(a, b, c, d); }
-inline void glColor3v(const GLscalar *a) { glColor3dv(a); }
-inline void glColor4v(const GLscalar *a) { glColor4dv(a); }
+#define ARGS_P2 const Mf::Vector2& p
+#define PASS_P2 p.data()
+#define ARGS_P3 const Mf::Vector3& p
+#define PASS_P3 p.data()
+#define ARGS_P4 const Mf::Vector4& p
+#define PASS_P4 p.data()
-inline void glVertex2(GLscalar a, GLscalar b) { glVertex2d(a, b); }
-inline void glVertex3(GLscalar a, GLscalar b, GLscalar c) { glVertex3d(a, b, c); }
-inline void glVertex4(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glVertex4d(a, b, c, d); }
-inline void glVertex2v(const GLscalar* a) { glVertex2dv(a); }
-inline void glVertex3v(const GLscalar* a) { glVertex3dv(a); }
-inline void glVertex4v(const GLscalar* a) { glVertex4dv(a); }
+#define ARGS_V2 const Mf::Vector2& v
+#define PASS_V2 v[0], v[1]
+#define ARGS_V3 const Mf::Vector3& v
+#define PASS_V3 v[0], v[1], v[2]
+#define ARGS_V4 const Mf::Vector4& v
+#define PASS_V4 v[0], v[1], v[2], v[3]
-inline void glTexCoord2(GLscalar a, GLscalar b) { glTexCoord2d(a, b); }
-inline void glTexCoord3(GLscalar a, GLscalar b, GLscalar c) { glTexCoord3d(a, b, c); }
-inline void glTexCoord4(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glTexCoord4d(a, b, c, d); }
-inline void glTexCoord2v(const GLscalar* a) { glTexCoord2dv(a); }
-inline void glTexCoord3v(const GLscalar* a) { glTexCoord3dv(a); }
-inline void glTexCoord4v(const GLscalar* a) { glTexCoord4dv(a); }
+
+#if USE_DOUBLE_PRECISION
+
+#define OPENGL_GENERIC_FUNC(R, N, L) \
+ inline R gl##N(ARGS_##L) { gl##N##d(PASS_##L); }//
+
+#define OPENGL_ORDINAL_FUNC(R, N, K) \
+ inline R gl##N(ARGS_##S##K) { gl##N##K##d(PASS_##S##K); } \
+ inline R gl##N(ARGS_##P##K) { gl##N##K##d##v(PASS_##P##K); }//
#else
-typedef GLfloat GLscalar;
-#define GL_SCALAR GL_FLOAT
+#define OPENGL_GENERIC_FUNC(R, N, L) \
+ inline R gl##N(ARGS_##L) { gl##N##f(PASS_##L); }//
+
+#define OPENGL_ORDINAL_FUNC(R, N, K) \
+ inline R gl##N(ARGS_##S##K) { gl##N##K##f(PASS_##S##K); } \
+ inline R gl##N(ARGS_##P##K) { gl##N##K##f##v(PASS_##P##K); }//
-inline void glGetScalarv(GLenum a, GLscalar* b) { glGetFloatv(a, b); }
+#endif
+
+
+OPENGL_GENERIC_FUNC(void, LoadMatrix, P);
+OPENGL_GENERIC_FUNC(void, LoadMatrix, M);
+OPENGL_GENERIC_FUNC(void, MultMatrix, P);
+OPENGL_GENERIC_FUNC(void, MultMatrix, M);
+
+OPENGL_GENERIC_FUNC(void, Scale, S3);
+OPENGL_GENERIC_FUNC(void, Scale, V3);
+OPENGL_GENERIC_FUNC(void, Rotate, S4);
+OPENGL_GENERIC_FUNC(void, Rotate, V4);
+OPENGL_GENERIC_FUNC(void, Translate, S3);
+OPENGL_GENERIC_FUNC(void, Translate, V3);
-inline void glLoadMatrix(const GLscalar* a) { glLoadMatrixf(a); }
-inline void glMultMatrix(const GLscalar* a) { glMultMatrixf(a); }
+OPENGL_ORDINAL_FUNC(void, Color, 3);
+OPENGL_ORDINAL_FUNC(void, Color, 4);
-inline void glScale(GLscalar a, GLscalar b, GLscalar c) { glScalef(a, b, c); }
-inline void glRotate(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glRotatef(a, b, c, d); }
-inline void glTranslate(GLscalar a, GLscalar b, GLscalar c) { glTranslatef(a, b, c); }
+OPENGL_ORDINAL_FUNC(void, Vertex, 2);
+OPENGL_ORDINAL_FUNC(void, Vertex, 3);
+OPENGL_ORDINAL_FUNC(void, Vertex, 4);
-inline void glColor3(GLscalar a, GLscalar b, GLscalar c) { glColor3f(a, b, c); }
-inline void glColor4(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glColor4f(a, b, c, d); }
-inline void glColor3v(const GLscalar *a) { glColor3fv(a); }
-inline void glColor4v(const GLscalar *a) { glColor4fv(a); }
+OPENGL_ORDINAL_FUNC(void, TexCoord, 2);
+OPENGL_ORDINAL_FUNC(void, TexCoord, 3);
+OPENGL_ORDINAL_FUNC(void, TexCoord, 4);
-inline void glVertex2(GLscalar a, GLscalar b) { glVertex2f(a, b); }
-inline void glVertex3(GLscalar a, GLscalar b, GLscalar c) { glVertex3f(a, b, c); }
-inline void glVertex4(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glVertex4f(a, b, c, d); }
-inline void glVertex2v(const GLscalar* a) { glVertex2fv(a); }
-inline void glVertex3v(const GLscalar* a) { glVertex3fv(a); }
-inline void glVertex4v(const GLscalar* a) { glVertex4fv(a); }
+OPENGL_GENERIC_FUNC(void, Rect, S4);
+OPENGL_GENERIC_FUNC(void, Rect, V4);
-inline void glTexCoord2(GLscalar a, GLscalar b) { glTexCoord2f(a, b); }
-inline void glTexCoord3(GLscalar a, GLscalar b, GLscalar c) { glTexCoord3f(a, b, c); }
-inline void glTexCoord4(GLscalar a, GLscalar b, GLscalar c, GLscalar d) { glTexCoord4f(a, b, c, d); }
-inline void glTexCoord2v(const GLscalar* a) { glTexCoord2fv(a); }
-inline void glTexCoord3v(const GLscalar* a) { glTexCoord3fv(a); }
-inline void glTexCoord4v(const GLscalar* a) { glTexCoord4fv(a); }
+#if USE_DOUBLE_PRECISION
+inline void glGetScalar(GLenum a, GLscalar* b) { glGetDoublev(a, b); }
+#else
+inline void glGetScalar(GLenum a, GLscalar* b) { glGetFloatv(a, b); }
#endif
#endif // _MOOF_OPENGL_HH_
-/** vim: set ts=4 sw=4 tw=80: *************************************************/
-