X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FOpenGL.hh;h=1e37b5e1f86d3be952826fab83e514ebe858ad53;hp=657f05f68fb22eb53ab7992e619604b6d69f085e;hb=71bd9dbaf1c1e3c55a9f63392a73865d8aeee7d4;hpb=29e3d45f7bbbf31eadf793c41ff2b3d9c47b7539 diff --git a/src/Moof/OpenGL.hh b/src/Moof/OpenGL.hh index 657f05f..1e37b5e 100644 --- a/src/Moof/OpenGL.hh +++ b/src/Moof/OpenGL.hh @@ -31,44 +31,95 @@ #include +#include -/* 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 + + +// generic function arguments + +#define ARGS_P const GLscalar* p +#define PASS_P p + +#define ARGS_M const Mf::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 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() + +#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] #if USE_DOUBLE_PRECISION -typedef GLdouble GLscalar; -#define GL_SCALAR GL_DOUBLE +#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); }// #endif -extern void (*glGetScalarv)(GLenum, GLscalar*); +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); -extern void (*glLoadMatrix)(const GLscalar*); -extern void (*glMultMatrix)(const GLscalar*); +OPENGL_ORDINAL_FUNC(void, Color, 3); +OPENGL_ORDINAL_FUNC(void, Color, 4); -extern void (*glScale)(GLscalar, GLscalar, GLscalar); -extern void (*glRotate)(GLscalar, GLscalar, GLscalar, GLscalar); -extern void (*glTranslate)(GLscalar, GLscalar, GLscalar); +OPENGL_ORDINAL_FUNC(void, Vertex, 2); +OPENGL_ORDINAL_FUNC(void, Vertex, 3); +OPENGL_ORDINAL_FUNC(void, Vertex, 4); -extern void (*glColor3)(GLscalar, GLscalar, GLscalar); -extern void (*glColor4)(GLscalar, GLscalar, GLscalar, GLscalar); -extern void (*glColor3v)(const GLscalar*); -extern void (*glColor4v)(const GLscalar*); +OPENGL_ORDINAL_FUNC(void, TexCoord, 2); +OPENGL_ORDINAL_FUNC(void, TexCoord, 3); +OPENGL_ORDINAL_FUNC(void, TexCoord, 4); -extern void (*glVertex2)(GLscalar, GLscalar); -extern void (*glVertex3)(GLscalar, GLscalar, GLscalar); -extern void (*glVertex4)(GLscalar, GLscalar, GLscalar, GLscalar); -extern void (*glVertex2v)(const GLscalar*); -extern void (*glVertex3v)(const GLscalar*); -extern void (*glVertex4v)(const GLscalar*); + +#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_