mirror of https://github.com/mosra/magnum.git
5 changed files with 230 additions and 0 deletions
@ -0,0 +1,23 @@
|
||||
# - Find SDL2 |
||||
# |
||||
# This module defines: |
||||
# |
||||
# SDL2_FOUND - True if SDL2 library is found |
||||
# SDL2_LIBRARY - SDL2 dynamic library |
||||
# SDL2_INCLUDE_DIR - Include dir |
||||
# |
||||
|
||||
# Library |
||||
find_library(SDL2_LIBRARY SDL2) |
||||
|
||||
# Include dir |
||||
find_path(SDL2_INCLUDE_DIR |
||||
NAMES SDL.h SDL_scancode.h |
||||
PATH_SUFFIXES SDL2 |
||||
) |
||||
|
||||
include(FindPackageHandleStandardArgs) |
||||
find_package_handle_standard_args("SDL2" DEFAULT_MSG |
||||
SDL2_LIBRARY |
||||
SDL2_INCLUDE_DIR |
||||
) |
||||
@ -0,0 +1,101 @@
|
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
#include "Sdl2Context.h" |
||||
|
||||
using namespace Corrade::Utility; |
||||
|
||||
namespace Magnum { namespace Contexts { |
||||
|
||||
Sdl2Context::Sdl2Context(int argc, char** argv, const std::string& name, const Math::Vector2<GLsizei>& size): _redraw(true) { |
||||
if(SDL_Init(SDL_INIT_VIDEO) < 0) { |
||||
Error() << "Cannot initialize SDL."; |
||||
exit(1); |
||||
} |
||||
|
||||
/* Request OpenGL 3.3 */ |
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); |
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); |
||||
|
||||
/* Enable double buffering and 24bt depth buffer */ |
||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); |
||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); |
||||
|
||||
window = SDL_CreateWindow(name.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, |
||||
size.x(), size.y(), SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); |
||||
if(!window) { |
||||
Error() << "Cannot create window."; |
||||
exit(2); |
||||
} |
||||
|
||||
context = SDL_GL_CreateContext(window); |
||||
|
||||
/* This must be enabled, otherwise (on my NVidia) it crashes when creating
|
||||
VAO. WTF. */ |
||||
glewExperimental = true; |
||||
|
||||
/* Init GLEW */ |
||||
GLenum err = glewInit(); |
||||
if(err != GLEW_OK) { |
||||
Error() << "Sdl2Context: cannot initialize GLEW:" << glewGetErrorString(err); |
||||
exit(1); |
||||
} |
||||
|
||||
/* Push resize event, so viewportEvent() is called at startup */ |
||||
SDL_Event* sizeEvent = new SDL_Event; |
||||
sizeEvent->type = SDL_WINDOWEVENT; |
||||
sizeEvent->window.event = SDL_WINDOWEVENT_RESIZED; |
||||
sizeEvent->window.data1 = size.x(); |
||||
sizeEvent->window.data2 = size.y(); |
||||
SDL_PushEvent(sizeEvent); |
||||
} |
||||
|
||||
Sdl2Context::~Sdl2Context() { |
||||
SDL_GL_DeleteContext(context); |
||||
SDL_DestroyWindow(window); |
||||
SDL_Quit(); |
||||
} |
||||
|
||||
int Sdl2Context::exec() { |
||||
for(;;) { |
||||
SDL_Event event; |
||||
|
||||
while(SDL_PollEvent(&event)) { |
||||
switch(event.type) { |
||||
case SDL_WINDOWEVENT: |
||||
switch(event.window.event) { |
||||
case SDL_WINDOWEVENT_RESIZED: |
||||
viewportEvent({event.window.data1, event.window.data2}); |
||||
_redraw = true; |
||||
break; |
||||
case SDL_WINDOWEVENT_EXPOSED: |
||||
_redraw = true; |
||||
break; |
||||
} break; |
||||
case SDL_QUIT: |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
if(_redraw) { |
||||
drawEvent(); |
||||
_redraw = false; |
||||
} else Corrade::Utility::sleep(5); |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
}} |
||||
@ -0,0 +1,87 @@
|
||||
#ifndef Magnum_Contexts_Sdl2Context_h |
||||
#define Magnum_Contexts_Sdl2Context_h |
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
/** @file
|
||||
* @brief Class Magnum::Contexts::Sdl2Context |
||||
*/ |
||||
|
||||
#include "Magnum.h" |
||||
#include <SDL.h> |
||||
|
||||
#include "AbstractContext.h" |
||||
#include <SDL2/SDL_scancode.h> |
||||
|
||||
namespace Magnum { namespace Contexts { |
||||
|
||||
/** @nosubgrouping
|
||||
@brief SDL2 context |
||||
|
||||
Currently doesn't have any mouse/keyboard handling. |
||||
|
||||
You need to implement at least drawEvent() and viewportEvent() to be able to |
||||
draw on the screen. |
||||
*/ |
||||
class Sdl2Context: public AbstractContext { |
||||
public: |
||||
/**
|
||||
* @brief Constructor |
||||
* @param argc Count of arguments of `main()` function |
||||
* @param argv Arguments of `main()` function |
||||
* @param title Window title |
||||
* @param size Window size |
||||
* |
||||
* Creates centered non-resizable window with double-buffered |
||||
* OpenGL 3.3 context with 24bit depth buffer. |
||||
*/ |
||||
Sdl2Context(int argc, char** argv, const std::string& title = "Magnum SDL2 context", const Math::Vector2<GLsizei>& size = Math::Vector2<GLsizei>(800, 600)); |
||||
|
||||
/**
|
||||
* @brief Destructors |
||||
* |
||||
* Deletes context and destroys the window. |
||||
*/ |
||||
~Sdl2Context(); |
||||
|
||||
int exec(); |
||||
|
||||
/** @{ @name Drawing functions */ |
||||
|
||||
protected: |
||||
/** @copydoc GlutContext::viewportEvent() */ |
||||
virtual void viewportEvent(const Math::Vector2<GLsizei>& size) = 0; |
||||
|
||||
/** @copydoc GlutContext::drawEvent() */ |
||||
virtual void drawEvent() = 0; |
||||
|
||||
/** @copydoc GlutContext::swapBuffers() */ |
||||
inline void swapBuffers() { SDL_GL_SwapWindow(window); } |
||||
|
||||
/** @copydoc GlutContext::redraw() */ |
||||
inline void redraw() { _redraw = true; } |
||||
|
||||
/*@}*/ |
||||
|
||||
private: |
||||
SDL_Window* window; |
||||
SDL_GLContext context; |
||||
|
||||
bool _redraw; |
||||
}; |
||||
|
||||
}} |
||||
|
||||
#endif |
||||
Loading…
Reference in new issue