GL.hh 9.85 KB
Newer Older
1 2 3 4 5
/***********************************************************************
 * Copyright 2011-2012 Computer Graphics Group RWTH Aachen University. *
 * All rights reserved.                                                *
 * Distributed under the terms of the MIT License (see LICENSE.TXT).   *
 **********************************************************************/
Robert Menzel's avatar
Robert Menzel committed
6

7 8
#ifndef ACGL_OPENGL_GL_HH
#define ACGL_OPENGL_GL_HH
Robert Menzel's avatar
Robert Menzel committed
9 10

/*
11
 * This simple OpenGL wrapper is used to include OpenGL (and if needed GLEW)
Robert Menzel's avatar
Robert Menzel committed
12 13 14 15 16 17
 * on different platforms.
 *
 * While these includes are located in a subdirectory of GL/ on most systems,
 * Apple hides them on different locations.
 *
 *
18
 * This wrapper can get configured with external defines:
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
 * ACGL_OPENGL_PROFILE_CORE      : CORE: if possible include/load only core OpenGL functions
 *                                 FULL: support for CORE and deprecated functions
 *                                 (NOTE: the OpenGL context itself is not created by ACGL!)
 * ACGL_OPENGL_VERSION_41        : (or other versions): minimal OpenGL version that can be assumed to be present.
 *                                 The app can't run on older contexts and will probably terminate at startup.
 *                                 Set this to a low version and it will run on lost machines
 *                                 Set this to a high version and less run-time checks have to be performed to
 *                                 work around missing features (like querying extensions etc).
 * ACGL_OPENGL_INCLUDE_LATEST_GL : If this is set and GL function loading is done with the internal loader, all
 *                                 functions of the latest GL version are loaded (if available) and the header
 *                                 of the latest version gets included. ACGL however will only assume the version
 *                                 set by ACGL_OPENGL_VERSION_XY to be present.
 * ACGL_PLATFORM_DESKTOP         : DESKTOP vs. MOBILE plattform = GL vs. GL ES
 *
 * ACGL_USE_GLEW                 : if this is set, GLEW gets used to load the GL functions,
 *                                 otherwise an internal GL loader based on glLoadGen gets used on desktop systems.
 *
 * Note: If nothing is defined, core 3.2 gets defined but all functions are loaded.
 *       If *just* ACGL_OPENGL_INCLUDE_LATEST_GL is defined, the latest GL version gets defined *and* loaded
 *       (full/compatibility profile).
Robert Menzel's avatar
Robert Menzel committed
39 40
 */

Robert Menzel's avatar
Robert Menzel committed
41 42 43 44 45
// Android:
#ifdef __ANDROID__
#   define ACGL_OPENGL_ES
#   define PLATFORM_ANDROID
#endif
Robert Menzel's avatar
Robert Menzel committed
46 47 48

// If we're compiling for an Apple system we need this to distinquish between Mac and iOS:
#ifdef __APPLE__
Robert Menzel's avatar
Robert Menzel committed
49
#   include <TargetConditionals.h>
Robert Menzel's avatar
Robert Menzel committed
50 51 52
#endif

#if (defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR))
53 54
#   if (TARGET_OS_IPHONE == 1)
#       define PLATFORM_IOS
55
#       define ACGL_OPENGL_ES
56
#   endif
Robert Menzel's avatar
Robert Menzel committed
57 58
#endif

Robert Menzel's avatar
Robert Menzel committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
//manually enforced ES:
#ifdef ACGL_PLATFORM_MOBILE
//  ...but mobile:
//  maybe maemo or android: first one to program for these plattforms should add
//  the correct includes here!
#   define ACGL_OPENGL_ES
#endif

// To compare the OpenGL version number we define a new ACGL_OPENGL_VERSION XY define here
// analog to ACGL_OPENGL_VERSION_XY

// OpenGL ES 2.0 is the default for embedded:
#ifdef ACGL_OPENGL_ES
#  if   defined (ACGL_OPENGLES_VERSION_30)
#       define   ACGL_OPENGLES_VERSION 30
#  else 
#       define ACGL_OPENGLES_VERSION_20
#       define ACGL_OPENGLES_VERSION 20
#  endif
#else
    // Desktop:
    #if   defined (ACGL_OPENGL_VERSION_21)
    #     define   ACGL_OPENGL_VERSION 21
    #elif defined (ACGL_OPENGL_VERSION_30)
    #     define   ACGL_OPENGL_VERSION 30
    #elif defined (ACGL_OPENGL_VERSION_31)
    #     define   ACGL_OPENGL_VERSION 31
    #elif defined (ACGL_OPENGL_VERSION_32)
    #     define   ACGL_OPENGL_VERSION 32
    #elif defined (ACGL_OPENGL_VERSION_33)
    #     define   ACGL_OPENGL_VERSION 33
    #elif defined (ACGL_OPENGL_VERSION_40)
    #     define   ACGL_OPENGL_VERSION 40
    #elif defined (ACGL_OPENGL_VERSION_41)
    #     define   ACGL_OPENGL_VERSION 41
    #elif defined (ACGL_OPENGL_VERSION_42)
    #     define   ACGL_OPENGL_VERSION 42
    #elif defined (ACGL_OPENGL_VERSION_43)
    #     define   ACGL_OPENGL_VERSION 43
    #else
	#if defined (ACGL_OPENGL_INCLUDE_LATEST_GL)
	    #define ACGL_OPENGL_VERSION_43
	    #define ACGL_OPENGL_VERSION 43
	    #define ACGL_OPENGL_PROFILE_FULL
	#else
	    // fallback:
	    #warning "NO ACGL_OPENGL_VERSION_XY SET! Default to 3.2 core (but load all available functions)"
	    // *we* only assume OpenGL 3.2 core...
	    #define ACGL_OPENGL_VERSION_32
	    #define ACGL_OPENGL_VERSION 32
	    #define ACGL_OPENGL_PROFILE_CORE
	    // ... but include the latest header and try to load all function in case the app needs more:
	    // (only if the internal loader gets used, but GLEW will also try to load everything)
	    #define ACGL_OPENGL_INCLUDE_LATEST_GL
	#endif // latest GL
    #endif // version checks
#endif // OpenGL ES

117 118 119 120 121 122

#if (ACGL_OPENGL_VERSION < 32) && defined(ACGL_OPENGL_PROFILE_CORE)
    #warning "OpenGL prior to 3.2 did not have core or compatibility profiles"
    #undef ACGL_OPENGL_PROFILE_CORE
#endif

123 124 125 126 127 128 129 130 131
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//  Include the right headers with the OpenGL functions and defines:
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef ACGL_OPENGL_ES
132 133 134 135
  // ES does not know 64bit ints but we need them for the Buffer class:
  #include <stdint.h>
  typedef int64_t GLint64;
  
Robert Menzel's avatar
Robert Menzel committed
136
    #if (PLATFORM_IOS)
137
        //iOS:
Robert Menzel's avatar
Robert Menzel committed
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
        #if defined (ACGL_OPENGLES_VERSION_20)
            #import <OpenGLES/ES1/gl.h>
            #import <OpenGLES/ES1/glext.h>
            #import <OpenGLES/ES2/gl.h>
            #import <OpenGLES/ES2/glext.h>
        #else
            #error "location of ES 3 headers not known"
        #endif
    #elif defined (PLATFORM_ANDROID)
        // Android:
        #if defined (ACGL_OPENGLES_VERSION_20)
            //#include <GLES/gl.h>
            //#include <GLES/glext.h>
            #include <GLES2/gl2.h>
            #include <GLES2/gl2ext.h>
        #else
            #include <GLES3/gl3.h>
            #include <GLES3/gl3ext.h>
        #endif
Robert Menzel's avatar
Robert Menzel committed
157
    #else
158 159 160 161 162 163 164 165 166
        #error "UNKNOWN mobile plattform! Don't know what to include!"
    #endif
#else // ACGL_OPENGL_ES
    // desktop:
    #if (defined(__APPLE__) || defined(MACOSX)) && defined(ACGL_OPENGL_PROFILE_FULL)
        #if ACGL_OPENGL_VERSION > 21
            #warning "On MacOS X only core profile is supported for OpenGL >= 3.2"
            #undef ACGL_OPENGL_PROFILE_FULL
            #define ACGL_OPENGL_PROFILE_CORE
Robert Menzel's avatar
Robert Menzel committed
167
        #endif
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
    #endif
    #ifdef ACGL_USE_GLEW
        // if GLEW_STATIC is defined, GLEW gets linked statically. GLEW itself needs this define
        // but for us its the sign that a local version of GLEW gets used, so we find it on
        // GL/glew.h on every system.
        #ifdef GLEW_STATIC
            #include "GL/glew.h"
        #else
            #if defined(__APPLE__) || defined(MACOSX)
                #include <OpenGL/glew.h>
            #else
                #include <GL/glew.h>
            #endif
        #endif // !GLEW_LOCAL_PATH
    #else
        // use the internal loader:
        #define ACGL_EXTENSION_LOADER_GLLOADGEN
185 186
        // prevent other GL headers from getting included and redefine GL:
        #define __gl3_h_
Robert Menzel's avatar
Robert Menzel committed
187

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
        //
        // Include the right header which has just what is needed to catch compatibility problems at compiletime.
        // The selection could also be done with some preprocessor magic but it confuses most IDEs.
        //
        #ifdef ACGL_OPENGL_PROFILE_CORE
            #if defined (ACGL_OPENGL_INCLUDE_LATEST_GL) || defined (ACGL_OPENGL_VERSION_43)
                #include <ACGL/OpenGL/glloaders/gl_core_43.hh>
            #elif defined (ACGL_OPENGL_VERSION_32)
                #include <ACGL/OpenGL/glloaders/gl_core_32.hh>
            #elif defined (ACGL_OPENGL_VERSION_33)
                #include <ACGL/OpenGL/glloaders/gl_core_33.hh>
            #elif defined (ACGL_OPENGL_VERSION_40)
                #include <ACGL/OpenGL/glloaders/gl_core_40.hh>
            #elif defined (ACGL_OPENGL_VERSION_41)
                #include <ACGL/OpenGL/glloaders/gl_core_41.hh>
            #elif defined (ACGL_OPENGL_VERSION_42)
                #include <ACGL/OpenGL/glloaders/gl_core_42.hh>
            #endif
        #else
            // compatibility profile:
            #if defined (ACGL_OPENGL_INCLUDE_LATEST_GL) || defined (ACGL_OPENGL_VERSION_43)
                #include <ACGL/OpenGL/glloaders/gl_compatibility_43.hh>
            #elif defined (ACGL_OPENGL_VERSION_21)
                #include <ACGL/OpenGL/glloaders/gl_21.hh>
            #elif defined (ACGL_OPENGL_VERSION_30)
                #include <ACGL/OpenGL/glloaders/gl_30.hh>
            #elif defined (ACGL_OPENGL_VERSION_31)
                #include <ACGL/OpenGL/glloaders/gl_31.hh>
            #elif defined (ACGL_OPENGL_VERSION_32)
                #include <ACGL/OpenGL/glloaders/gl_compatibility_32.hh>
            #elif defined (ACGL_OPENGL_VERSION_33)
                #include <ACGL/OpenGL/glloaders/gl_compatibility_33.hh>
            #elif defined (ACGL_OPENGL_VERSION_40)
                #include <ACGL/OpenGL/glloaders/gl_compatibility_40.hh>
            #elif defined (ACGL_OPENGL_VERSION_41)
                #include <ACGL/OpenGL/glloaders/gl_compatibility_41.hh>
            #elif defined (ACGL_OPENGL_VERSION_42)
                #include <ACGL/OpenGL/glloaders/gl_compatibility_42.hh>
            #endif
        #endif // ACGL_OPENGL_PROFILE_CORE
    #endif // ACGL_USE_GLEW
#endif // ACGL_OPENGL_ES
230

231
#endif // ACGL_OPENGL_GL_HH