Browse Source

Allow to resize the SDL window and propagate changes to the scene.

legacy
Sam Hocevar 5 years ago
parent
commit
4c9c63894d
7 changed files with 57 additions and 19 deletions
  1. +1
    -1
      doc/tutorial/02_cube.cpp
  2. +2
    -2
      src/platform/sdl/sdlapp.cpp
  3. +4
    -1
      src/platform/sdl/sdlinput.cpp
  4. +32
    -9
      src/scene.cpp
  5. +4
    -0
      src/scene.h
  6. +5
    -0
      src/video.cpp
  7. +9
    -6
      src/video.h

+ 1
- 1
doc/tutorial/02_cube.cpp View File

@@ -45,7 +45,7 @@ public:
m_ready(false) m_ready(false)
{ {
m_camera = new Camera(); m_camera = new Camera();
m_camera->SetProjection(mat4::perspective(radians(30.f), 960.f, 600.f, .1f, 1000.f));
m_camera->SetProjection(mat4::perspective(radians(30.f), 640.f, 480.f, .1f, 1000.f));
m_camera->SetView(mat4::lookat(vec3(-15.f, 5.f, 0.f), m_camera->SetView(mat4::lookat(vec3(-15.f, 5.f, 0.f),
vec3(0.f, -1.f, 0.f), vec3(0.f, -1.f, 0.f),
vec3(0.f, 1.f, 0.f))); vec3(0.f, 1.f, 0.f)));


+ 2
- 2
src/platform/sdl/sdlapp.cpp View File

@@ -1,7 +1,7 @@
// //
// Lol Engine // Lol Engine
// //
// Copyright © 2010—2016 Sam Hocevar <sam@hocevar.net>
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net>
// //
// Lol Engine is free software. It comes without any warranty, to // Lol Engine is free software. It comes without any warranty, to
// the extent permitted by applicable law. You can redistribute it // the extent permitted by applicable law. You can redistribute it
@@ -69,7 +69,7 @@ SdlAppDisplay::SdlAppDisplay(char const *title, ivec2 res)
* However, perfs warning have been may occur. */ * However, perfs warning have been may occur. */
SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1); SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);


int flags = SDL_WINDOW_OPENGL;
int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
if (window_size == ivec2(0)) if (window_size == ivec2(0))
flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
data->m_window = SDL_CreateWindow(title, data->m_window = SDL_CreateWindow(title,


+ 4
- 1
src/platform/sdl/sdlinput.cpp View File

@@ -1,7 +1,7 @@
// //
// Lol Engine // Lol Engine
// //
// Copyright © 2010—2017 Sam Hocevar <sam@hocevar.net>
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net>
// //
// Lol Engine is free software. It comes without any warranty, to // Lol Engine is free software. It comes without any warranty, to
// the extent permitted by applicable law. You can redistribute it // the extent permitted by applicable law. You can redistribute it
@@ -332,6 +332,9 @@ void SdlInputData::Tick(float seconds)
case SDL_WINDOWEVENT_FOCUS_LOST: case SDL_WINDOWEVENT_FOCUS_LOST:
m_mouse->SetKey(3, false); m_mouse->SetKey(3, false);
break; break;
case SDL_WINDOWEVENT_RESIZED:
Video::Resize(ivec2(event.window.data1, event.window.data2));
break;
} }
break; break;
} }


+ 32
- 9
src/scene.cpp View File

@@ -204,14 +204,15 @@ mutex SceneData::m_prim_mutex;
* Public Scene class * Public Scene class
*/ */
Scene::Scene(ivec2 size) Scene::Scene(ivec2 size)
: data(new SceneData())
{
m_renderer = new Renderer(size);

data->m_renderbuffer[0] = new Framebuffer(size);
data->m_renderbuffer[1] = new Framebuffer(size);
data->m_renderbuffer[2] = new Framebuffer(size);
data->m_renderbuffer[3] = new Framebuffer(size);
: m_size(size),
m_wanted_size(size),
data(new SceneData()),
m_renderer(new Renderer(size))
{
data->m_renderbuffer[0] = new Framebuffer(m_size);
data->m_renderbuffer[1] = new Framebuffer(m_size);
data->m_renderbuffer[2] = new Framebuffer(m_size);
data->m_renderbuffer[3] = new Framebuffer(m_size);
data->m_pp.m_shader[0] = Shader::Create(LOLFX_RESOURCE_NAME(gpu_blit)); data->m_pp.m_shader[0] = Shader::Create(LOLFX_RESOURCE_NAME(gpu_blit));
data->m_pp.m_shader[1] = Shader::Create(LOLFX_RESOURCE_NAME(gpu_postprocess)); data->m_pp.m_shader[1] = Shader::Create(LOLFX_RESOURCE_NAME(gpu_postprocess));
data->m_pp.m_coord[0] = data->m_pp.m_shader[0]->GetAttribLocation(VertexUsage::Position, 0); data->m_pp.m_coord[0] = data->m_pp.m_shader[0]->GetAttribLocation(VertexUsage::Position, 0);
@@ -232,7 +233,7 @@ Scene::Scene(ivec2 size)


/* Create a default orthographic camera, in case the user doesn’t. */ /* Create a default orthographic camera, in case the user doesn’t. */
data->m_default_cam = new Camera(); data->m_default_cam = new Camera();
mat4 proj = mat4::ortho(0.f, (float)size.x, 0.f, (float)size.y, -1000.f, 1000.f);
mat4 proj = mat4::ortho(0.f, (float)m_size.x, 0.f, (float)m_size.y, -1000.f, 1000.f);
data->m_default_cam->SetProjection(proj); data->m_default_cam->SetProjection(proj);
PushCamera(data->m_default_cam); PushCamera(data->m_default_cam);


@@ -248,6 +249,11 @@ Scene::Scene(ivec2 size)
data->m_line_api.m_debug_mask = 1; data->m_line_api.m_debug_mask = 1;
} }


void Scene::resize(ivec2 size)
{
m_wanted_size = size;
}

//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Scene::~Scene() Scene::~Scene()
{ {
@@ -591,6 +597,23 @@ void Scene::pre_render(float)
{ {
gpu_marker("Pre Render"); gpu_marker("Pre Render");


// Handle resize event
if (m_size != m_wanted_size)
{
m_size = m_wanted_size;
delete data->m_renderbuffer[0];
delete data->m_renderbuffer[1];
delete data->m_renderbuffer[2];
delete data->m_renderbuffer[3];
data->m_renderbuffer[0] = new Framebuffer(m_size);
data->m_renderbuffer[1] = new Framebuffer(m_size);
data->m_renderbuffer[2] = new Framebuffer(m_size);
data->m_renderbuffer[3] = new Framebuffer(m_size);

mat4 proj = mat4::ortho(0.f, (float)m_size.x, 0.f, (float)m_size.y, -1000.f, 1000.f);
data->m_default_cam->SetProjection(proj);
}

/* First render into the offline buffer */ /* First render into the offline buffer */
if (do_pp) if (do_pp)
{ {


+ 4
- 0
src/scene.h View File

@@ -250,6 +250,8 @@ public:
void EnableDisplay(); void EnableDisplay();
void DisableDisplay(); void DisableDisplay();


void resize(ivec2 size);

void pre_render(float seconds); void pre_render(float seconds);
void render(float seconds); void render(float seconds);
void post_render(float seconds); void post_render(float seconds);
@@ -259,6 +261,8 @@ private:
void render_tiles(); void render_tiles();
void render_lines(float seconds); void render_lines(float seconds);


ivec2 m_size, m_wanted_size;

SceneData *data; SceneData *data;
Renderer *m_renderer; Renderer *m_renderer;
}; };


+ 5
- 0
src/video.cpp View File

@@ -120,6 +120,11 @@ void Video::Capture(uint32_t *buffer)
#endif #endif
} }


void Video::Resize(ivec2 size)
{
Scene::GetScene(0).resize(size);
}

ivec2 Video::GetSize() ivec2 Video::GetSize()
{ {
return Scene::GetScene(0).get_renderer()->GetViewport().extent(); return Scene::GetScene(0).get_renderer()->GetViewport().extent();


+ 9
- 6
src/video.h View File

@@ -1,11 +1,13 @@
// //
// Lol Engine
// Lol Engine
// //
// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the Do What The Fuck You Want To
// Public License, Version 2, as published by Sam Hocevar. See
// http://www.wtfpl.net/ for more details.
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net>
//
// Lol Engine is free software. It comes without any warranty, to
// the extent permitted by applicable law. You can redistribute it
// and/or modify it under the terms of the Do What the Fuck You Want
// to Public License, Version 2, as published by the WTFPL Task Force.
// See http://www.wtfpl.net/ for more details.
// //


#pragma once #pragma once
@@ -49,6 +51,7 @@ public:
static void Setup(ivec2 size); static void Setup(ivec2 size);
static void Destroy(); static void Destroy();


static void Resize(ivec2 size);
static ivec2 GetSize(); static ivec2 GetSize();


static void SetDebugRenderMode(DebugRenderMode d); static void SetDebugRenderMode(DebugRenderMode d);


Loading…
Cancel
Save