]> Dogcows Code - chaz/yoink/blobdiff - src/moof/opengl.hh
the massive refactoring effort
[chaz/yoink] / src / moof / opengl.hh
diff --git a/src/moof/opengl.hh b/src/moof/opengl.hh
new file mode 100644 (file)
index 0000000..7608cda
--- /dev/null
@@ -0,0 +1,118 @@
+
+/*]  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_
+
+/**
+ * \file opengl.hh
+ * Defines macros for OpenGL functions that operate on scalars, vectors,
+ * and matrices.
+ */
+
+#include <SDL/SDL_opengl.h>
+
+#include <moof/math.hh>
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+// generic function arguments
+
+#define ARGS_P         const GLscalar* p
+#define PASS_P         p
+
+#define ARGS_M         const moof::matrix4& m
+#define PASS_M         m.data()
+
+// ordinal function arguments
+
+#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
+
+#define ARGS_P2                const moof::vector2& p
+#define PASS_P2                p.data()
+#define ARGS_P3                const moof::vector3& p
+#define PASS_P3                p.data()
+#define ARGS_P4                const moof::vector4& p
+#define PASS_P4                p.data()
+
+#define ARGS_V2                const moof::vector2& v
+#define PASS_V2                v[0], v[1]
+#define ARGS_V3                const moof::vector3& v
+#define PASS_V3                v[0], v[1], v[2]
+#define ARGS_V4                const moof::vector4& v
+#define PASS_V4                v[0], v[1], v[2], v[3]
+
+
+#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
+
+#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); }//
+
+#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);
+
+OPENGL_ORDINAL_FUNC(void,      Color,          3);
+OPENGL_ORDINAL_FUNC(void,      Color,          4);
+
+OPENGL_ORDINAL_FUNC(void,      Vertex,         2);
+OPENGL_ORDINAL_FUNC(void,      Vertex,         3);
+OPENGL_ORDINAL_FUNC(void,      Vertex,         4);
+
+OPENGL_ORDINAL_FUNC(void,      TexCoord,       2);
+OPENGL_ORDINAL_FUNC(void,      TexCoord,       3);
+OPENGL_ORDINAL_FUNC(void,      TexCoord,       4);
+
+OPENGL_GENERIC_FUNC(void,      Rect,           S4);
+OPENGL_GENERIC_FUNC(void,      Rect,           V4);
+
+
+#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_
+
This page took 0.022084 seconds and 4 git commands to generate.