From 8b00d67febf133e89f6a0bfabc41feed555dc4a9 Mon Sep 17 00:00:00 2001 From: chai Date: Sat, 12 Jan 2019 21:48:33 +0800 Subject: =?UTF-8?q?*=E5=8E=BB=E6=8E=89=E6=96=87=E4=BB=B6=E5=89=8D=E7=BC=80?= =?UTF-8?q?je=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libjin/graphics/window.cpp | 122 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/libjin/graphics/window.cpp (limited to 'src/libjin/graphics/window.cpp') diff --git a/src/libjin/graphics/window.cpp b/src/libjin/graphics/window.cpp new file mode 100644 index 0000000..5701772 --- /dev/null +++ b/src/libjin/graphics/window.cpp @@ -0,0 +1,122 @@ +#include "../core/configuration.h" +#if defined(jin_graphics) + +#include + +#include "../common/exception.h" +#include "../utils/utils.h" +#include "../audio/sdl/sdl_audio.h" +#include "../utils/log.h" + +#include "shaders/shader.h" +#include "window.h" +#include "gl.h" +#include "canvas.h" + +using namespace JinEngine::Graphics::Shaders; + +namespace JinEngine +{ + namespace Graphics + { + + bool Window::startSystem(const SettingBase* s) + { + jin_log_info("Initialize window system."); + + if (SDL_Init(SDL_INIT_VIDEO) < 0) + return false; + + const Setting* setting = (Setting*)s; + mSize.w() = setting->width; + mSize.h() = setting->height; + mFps = setting->fps; + bool vsync = setting->vsync; + const char* title = setting->title; + const char* icon = setting->icon; + + if (mWnd) + { + SDL_DestroyWindow(mWnd); + SDL_FlushEvent(SDL_WINDOWEVENT); + } + + SDL_GLContext ctx = NULL; + + if (ctx) + { + SDL_GL_DeleteContext(ctx); + } + + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 0); + + int wx = SDL_WINDOWPOS_UNDEFINED, + wy = SDL_WINDOWPOS_UNDEFINED; + + int flag = SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL; + if (setting->fullscreen) flag |= SDL_WINDOW_FULLSCREEN; + if (setting->resizable) flag |= SDL_WINDOW_RESIZABLE; + + mWnd = SDL_CreateWindow(title, wx, wy, mSize.w(), mSize.h(), flag); + if (mWnd == NULL) + return false; + + // Set window icon. + //try + //{ + // Bitmap* bitmap = new Bitmap(icon); + // SDL_Surface *surface; + // Color* pixels = const_cast(bitmap->getPixels()); + // uint w = bitmap->getWidth(), h = bitmap->getHeight(); + // surface = SDL_CreateRGBSurfaceFrom( + // pixels, w, h, 32, w * 4, Color::RMASK, Color::GMASK, Color::BMASK, Color::AMASK); + // SDL_SetWindowIcon(mWnd, surface); + // SDL_FreeSurface(surface); + //} catch (...) {} + + ctx = SDL_GL_CreateContext(mWnd); + if (ctx == NULL) + return false; + + gl.initContext(); + + SDL_GL_SetSwapInterval(vsync ? 1 : 0); + SDL_GL_MakeCurrent(mWnd, ctx); + + // Default configuration. + gl.init(); + + return true; + } + + void Window::quitSystem() + { + jin_log_info("Quit window system."); + + SDL_DestroyWindow(mWnd); + } + + void Window::present() + { + if (mWnd) + SDL_GL_SwapWindow(mWnd); + gl.resetStats(); + } + + void Window::setTitle(const char* title) + { + SDL_SetWindowTitle(mWnd, title); + }; + + } // namespace Graphics +} // namespace JinEngine + +#endif // defined(jin_graphics) \ No newline at end of file -- cgit v1.1-26-g67d0