Added GLEW for loading OpenGL extensions
dev-ui
Piotr Dziwinski 2012-07-28 23:36:12 +02:00
parent da63248bb9
commit 72c0188ec3
6 changed files with 144 additions and 15 deletions

View File

@ -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)

View File

@ -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ć.

51
cmake/FindGLEW.cmake Normal file
View File

@ -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 )

View File

@ -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)

View File

@ -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@

View File

@ -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;