summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPiotr Dziwinski <piotrdz@gmail.com>2012-07-28 23:36:12 +0200
committerPiotr Dziwinski <piotrdz@gmail.com>2012-07-28 23:36:12 +0200
commit72c0188ec37c3783133baf6960d72cb3c9d12a6c (patch)
tree0aa06fe40a3721238c9bc82090f9478a088ca9b6
parentda63248bb9127cc64b6f174e0de254d6c01b7809 (diff)
downloadcolobot-72c0188ec37c3783133baf6960d72cb3c9d12a6c.tar.gz
colobot-72c0188ec37c3783133baf6960d72cb3c9d12a6c.tar.bz2
colobot-72c0188ec37c3783133baf6960d72cb3c9d12a6c.zip
GLEW
Added GLEW for loading OpenGL extensions
-rw-r--r--CMakeLists.txt20
-rw-r--r--HOWTO.txt26
-rw-r--r--cmake/FindGLEW.cmake51
-rw-r--r--src/CMakeLists.txt24
-rw-r--r--src/common/config.h.cmake2
-rw-r--r--src/graphics/opengl/gldevice.cpp36
6 files changed, 144 insertions, 15 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 82a6e80..092a812 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,12 +5,19 @@ cmake_minimum_required(VERSION 2.8)
project(colobot C CXX)
# Required packages
-find_package(OpenGL REQUIRED)
-find_package(SDL REQUIRED)
-find_package(SDL_image REQUIRED)
-find_package(PNG REQUIRED)
+find_package(OpenGL 1.4 REQUIRED)
+find_package(SDL 1.2.10 REQUIRED)
+find_package(SDL_image 1.2 REQUIRED)
+find_package(PNG 1.2 REQUIRED)
-# TODO: check for SDL version. Should be >= 1.2.10
+# GLEW requirement depends on platform
+# By default it is auto detected
+# This setting may be used to override
+# Possible values:
+# - auto -> determine automatically
+# - 1 -> always enable
+# - 0 -> always disable
+set(USE_GLEW auto)
# Build with debugging symbols
set(CMAKE_BUILD_TYPE debug)
@@ -19,5 +26,8 @@ set(CMAKE_BUILD_TYPE debug)
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wall -std=gnu++0x")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -std=gnu++0x")
+# Include cmake directory
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${colobot_SOURCE_DIR}/cmake")
+
# Subdirectory with sources
add_subdirectory(src bin)
diff --git a/HOWTO.txt b/HOWTO.txt
index f93bb0e..4c17234 100644
--- a/HOWTO.txt
+++ b/HOWTO.txt
@@ -13,16 +13,19 @@ How to...
http://www.cmake.org/cmake/resources/software.html (the Windows zip file)
Unpack the contents of the archive to where MinGW is installed (files from bin/ should go into bin/, etc.)
3. Download the following libraries, installing them in your MinGW directory like with CMake:
- SDL, SDL_imgage, SDL_ttf, libpng
+ SDL >=1.2.10, SDL_imgage >= 1.2, SDL_ttf >= 2.0, libpng >= 1.2, GLEW >= 1.8.0
+ Note #1: For most libraries, you can download binary packages with compiled files.
+ However, you must ensure that they work with MinGW as some are built with MSVC
+ and may be incompatible. If that is the case, you should compile the libraries from sources
+ using MinGW.
+ Note #2: For GLEW, you need to compile from source under MinGW. Since there is no automated
+ make script for that, follow the instructions here: http://stackoverflow.com/questions/6005076/
4. Run MinGW console from the shortcut in menu start.
5. Change to the directory where you have the Colobot sources by typing "cd /c/where/the/sources/are"
6. Type "cmake -G 'MSYS Makefiles' ."
7. Type "make"
8. Everything should compile without errors.
- Note: you might experience some troubles with OpenGL headers, as Windows (used to?) ship with outdated header files.
- Download the newest ones from SDK of your graphics card vendor.
-
1.2 Linux:
Since you're running Linux, you probably know how to do this anyway ;)
@@ -32,6 +35,9 @@ How to...
$ cmake .
$ make
+ Note: If you experience problems with OpenGL's extensions, install GLEW library and enable
+ it in compilation by setting USE_GLEW to 1 in CMakeLists.txt
+
1.3 Other platforms, compilers, etc.
We haven't checked other platforms yet but the code isn't particularly tied to any compiler or platform, so in theory it should work.
@@ -60,7 +66,14 @@ Jak...
http://www.cmake.org/cmake/resources/software.html (plik zip dla Windowsa)
Zip rozpakowujemy do katalogu, gdzie zainstalowany jest MinGW (pliki z bin/ mają trafić do bin/ itd.).
3. Ścągamy następujące biblioteki i instalujemy je tam, gdzie MinGW, podobnie jak z CMake:
- SDL, SDL_image, SDL_ttf, libpng
+ SDL >= 1.2.10, SDL_image >= 1.2, SDL_ttf >= 2.0, libpng >= 1.2
+ Uwaga #1: W większości wymienionych bibliotek można ściągnąć paczki binarne ze skompilowanymi plikami.
+ Jednak musisz się upewnić, że pliki te będą współpracowały z MinGW, bo część z nich
+ jest kompilowana MSVC i może być niezgodna. W takim wypadku, musisz skompilować bibliotekę
+ ze źródeł pod MinGW.
+
+ Uwaga #2: W przypadku GLEW, musisz skompilować bibiotekę ze źródeł pod MinGW. Ponieważ nie ma skryptu
+ make do tego, użyj poleceń opisanych tutaj: http://stackoverflow.com/questions/6005076/
4. Uruchamiamy MinGW console ze skrótu w menu start.
5. Przechodzimy do katalogu, gdzie są źródła wpisując "cd /c/tam/gdzie/sa/zrodla"
6. Wpisujemy "cmake -G 'MSYS Makefiles' ."
@@ -76,6 +89,9 @@ Jak...
$ cmake .
$ make
+ Uwaga: Jeśli natrafisz na problemy z rozszerzeniami OpenGL, zainstaluj bibliotekę GLEW i włącz ją
+ przy kompilacji, ustawiając USE_GLEW na 1 w CMakeLists.txt
+
1.3 Inne platformy, kompilatory, etc.
Nie sprawdzaliśmy jeszcze innych platform, ale kod nie jest jakoś specjalnie związany z danym kompilatorem czy platformą, więc w teorii powinien zadziałać.
diff --git a/cmake/FindGLEW.cmake b/cmake/FindGLEW.cmake
new file mode 100644
index 0000000..94c9b32
--- /dev/null
+++ b/cmake/FindGLEW.cmake
@@ -0,0 +1,51 @@
+# CMake module to find GLEW
+# Borrowed from http://code.google.com/p/nvidia-texture-tools/
+# MIT license Copyright (c) 2007 NVIDIA Corporation
+
+# Try to find GLEW library and include path.
+# Once done this will define
+#
+# GLEW_FOUND
+# GLEW_INCLUDE_PATH
+# GLEW_LIBRARY
+#
+
+IF (WIN32)
+ FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
+ $ENV{PROGRAMFILES}/GLEW/include
+ ${PROJECT_SOURCE_DIR}/src/nvgl/glew/include
+ DOC "The directory where GL/glew.h resides")
+ FIND_LIBRARY( GLEW_LIBRARY
+ NAMES glew GLEW glew32 glew32s
+ PATHS
+ /mingw/bin # for MinGW's MSYS
+ /mingw/lib
+ ${PROJECT_SOURCE_DIR}/glew/bin # or in local directory
+ ${PROJECT_SOURCE_DIR}/glew/lib
+ DOC "The GLEW library")
+ELSE (WIN32)
+ FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
+ /usr/include
+ /usr/local/include
+ /sw/include
+ /opt/local/include
+ DOC "The directory where GL/glew.h resides")
+ FIND_LIBRARY( GLEW_LIBRARY
+ NAMES GLEW glew
+ PATHS
+ /usr/lib64
+ /usr/lib
+ /usr/local/lib64
+ /usr/local/lib
+ /sw/lib
+ /opt/local/lib
+ DOC "The GLEW library")
+ENDIF (WIN32)
+
+IF (GLEW_INCLUDE_PATH)
+ SET( GLEW_FOUND 1 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
+ELSE (GLEW_INCLUDE_PATH)
+ SET( GLEW_FOUND 0 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
+ENDIF (GLEW_INCLUDE_PATH)
+
+MARK_AS_ADVANCED( GLEW_FOUND )
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index da8463b..3896e40 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -11,18 +11,40 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(PLATFORM_WINDOWS 1)
set(PLATFORM_LINUX 0)
set(PLATFORM_OTHER 0)
+ # On Windows, GLEW is required
+ if (${USE_GLEW} MATCHES "auto")
+ set(USE_GLEW 1)
+ endif()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(PLATFORM_WINDOWS 0)
set(PLATFORM_LINUX 1)
set(PLATFORM_OTHER 0)
+ # On Linux, we should be fine without GLEW
+ if (${USE_GLEW} MATCHES "auto")
+ set(USE_GLEW 0)
+ endif()
# for clock_gettime
set(PLATFORM_LIBS "-lrt")
else()
set(PLATFORM_WINDOWS 0)
set(PLATFORM_LINUX 0)
set(PLATFORM_OTHER 1)
+ # Use GLEW to be safe
+ if (${USE_GLEW} MATCHES "auto")
+ set(USE_GLEW 1)
+ endif()
endif()
+set(OPTIONAL_LIBS "")
+set(OPTIONAL_INCLUDE_DIRS "")
+
+if(${USE_GLEW} EQUAL 1)
+ find_package(GLEW REQUIRED)
+ set(OPTIONAL_LIBS ${OPTIONAL_LIBS} ${GLEW_LIBRARY})
+ set(OPTIONAL_INCLUDE_DIRS ${OPTIONAL_INCLUDE_DIRS} ${GLEW_INCLUDE_PATH})
+endif()
+
+
# Configure file
configure_file(common/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/common/config.h)
@@ -156,6 +178,7 @@ ${SDL_LIBRARY}
${SDLIMAGE_LIBRARY}
${OPENGL_LIBRARY}
${PNG_LIBRARIES}
+${OPTIONAL_LIBS}
${PLATFORM_LIBS}
CBot
)
@@ -165,6 +188,7 @@ ${SDL_INCLUDE_DIR}
${SDL_IMAGE_INCLUDE_DIR}
${SDLTTF_INCLUDE_DIR}
${PNG_INCLUDE_DIRS}
+${OPTIONAL_INCLUDE_DIRS}
)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/CBot)
diff --git a/src/common/config.h.cmake b/src/common/config.h.cmake
index d8bff91..f496db0 100644
--- a/src/common/config.h.cmake
+++ b/src/common/config.h.cmake
@@ -2,7 +2,9 @@
// Macros set by CMake
#cmakedefine DEBUG
+
#cmakedefine PLATFORM_WINDOWS @PLATFORM_WINDOWS@
#cmakedefine PLATFORM_LINUX @PLATFORM_LINUX@
#cmakedefine PLATFORM_OTHER @PLATFORM_OTHER@
+#cmakedefine USE_GLEW @USE_GLEW@
diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp
index d31d007..bfe7fd7 100644
--- a/src/graphics/opengl/gldevice.cpp
+++ b/src/graphics/opengl/gldevice.cpp
@@ -16,10 +16,20 @@
// gldevice.cpp
-#include "common/image.h"
#include "graphics/opengl/gldevice.h"
+
+#include "common/config.h"
+#include "common/image.h"
#include "math/geometry.h"
+
+#if defined(USE_GLEW)
+
+// When using GLEW, only glew.h is needed
+#include <GL/glew.h>
+
+#else
+
// Should define prototypes of used extensions as OpenGL functions
#define GL_GLEXT_PROTOTYPES
@@ -27,9 +37,11 @@
#include <GL/glu.h>
#include <GL/glext.h>
+#endif // if defined(GLEW)
+
#include <SDL/SDL.h>
-#include <assert.h>
+#include <cassert>
@@ -73,9 +85,23 @@ std::string Gfx::CGLDevice::GetError()
bool Gfx::CGLDevice::Create()
{
- /* NOTE: extension testing is not done here as the assumed version of OpenGL to be used (1.4+)
- must already have the required extensions. The used extensions are listed here for reference:
- GL_ARB_multitexture, GL_EXT_texture_env_combine, GL_EXT_secondary_color */
+#if defined(USE_GLEW)
+ if (glewInit() != GLEW_OK)
+ {
+ m_error = "GLEW initialization failed";
+ return false;
+ }
+
+ if ( (! GLEW_ARB_multitexture) || (! GLEW_EXT_texture_env_combine) || (! GLEW_EXT_secondary_color) )
+ {
+ m_error = "GLEW reports required extensions not supported";
+ return false;
+ }
+
+#endif
+
+ /* NOTE: when not using GLEW, extension testing is not performed, as it is assumed that
+ glext.h is up-to-date and the OpenGL shared library has the required functions present. */
m_wasInit = true;