diff options
author | chai <chaifix@163.com> | 2018-10-19 08:36:44 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-10-19 08:36:44 +0800 |
commit | 7d5f055547e70fa93ee9ac944e62f8d657b9dc55 (patch) | |
tree | 081782a1541854db4b8eb69c4b43081f52711286 /src/libjin/Graphics/je_window.cpp | |
parent | 02dd1f38008594048f0e28bad01e7c6d18844198 (diff) |
*修改文件名
Diffstat (limited to 'src/libjin/Graphics/je_window.cpp')
-rw-r--r-- | src/libjin/Graphics/je_window.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/libjin/Graphics/je_window.cpp b/src/libjin/Graphics/je_window.cpp new file mode 100644 index 0000000..680dd0e --- /dev/null +++ b/src/libjin/Graphics/je_window.cpp @@ -0,0 +1,111 @@ +#include "../core/je_configuration.h" +#if LIBJIN_MODULES_RENDER + +#include <iostream> + +#include "../utils/je_utils.h" +#include "../audio/sdl/je_sdl_audio.h" +#include "../utils/je_log.h" + +#include "shader/je_shader.h" +#include "je_window.h" +#include "je_gl.h" +#include "je_canvas.h" + +namespace jin +{ + namespace graphics + { + + bool Window::initSystem(const SettingBase* s) + { + #if LIBJIN_DEBUG + Loghelper::log(Loglevel::LV_INFO, "Init window system"); + #endif + + if (SDL_Init(SDL_INIT_VIDEO) < 0) + return false; + + const Setting* setting = (Setting*)s; + size.w = setting->width; + size.h = setting->height; + fps = setting->fps; + bool vsync = setting->vsync; + const char* title = setting->title; + + if (wnd) + { + SDL_DestroyWindow(wnd); + 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); + + int wx = SDL_WINDOWPOS_UNDEFINED, + wy = SDL_WINDOWPOS_UNDEFINED; + + int flag = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL; + if (setting->fullscreen) flag |= SDL_WINDOW_FULLSCREEN; + if (setting->resizable) flag |= SDL_WINDOW_RESIZABLE; + + wnd = SDL_CreateWindow(title, wx, wy, size.w, size.h, flag); + if (wnd == NULL) + return false; + ctx = SDL_GL_CreateContext(wnd); + if (ctx == NULL) + return false; + SDL_GL_SetSwapInterval(vsync ? 1 : 0); + SDL_GL_MakeCurrent(wnd, ctx); + /* default configuration */ + gl.setClearColor(0, 0, 0, 0xff); + gl.pushColor(0xff, 0xff, 0xff, 0xff); + gl.enable(GL_BLEND); + gl.enable(GL_TEXTURE_2D); + gl.setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + /* avoid white screen blink on windows */ + swapBuffers(); + /* bind to default canvas */ + Canvas::unbind(); + Shader::unuse(); + return true; + } + + void Window::quitSystem() + { + /* disable opengl */ + gl.disable(GL_BLEND); + gl.disable(GL_TEXTURE_2D); + /* close window */ + SDL_DestroyWindow(wnd); + SDL_Quit(); + } + + void Window::swapBuffers() + { + if (wnd) + SDL_GL_SwapWindow(wnd); + } + + void Window::setTitle(const char* title) + { + SDL_SetWindowTitle(wnd, title); + }; + + } // namespace graphics +} // namespace jin + +#endif // LIBJIN_MODULES_RENDER
\ No newline at end of file |