From b53fac4f766f02becc29381446f26992cb979230 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Tue, 11 Apr 2017 10:12:34 -0400 Subject: [PATCH] gamnit: resize in dynamic resolution MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- lib/gamnit/dynamic_resolution.nit | 76 +++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/lib/gamnit/dynamic_resolution.nit b/lib/gamnit/dynamic_resolution.nit index 40ea221..5af305c 100644 --- a/lib/gamnit/dynamic_resolution.nit +++ b/lib/gamnit/dynamic_resolution.nit @@ -64,6 +64,12 @@ redef class App assert error == null else print_error error end + redef fun on_resize(display) + do + dynamic_context.resize(display, max_dynamic_resolution_ratio) + super + end + # Prepare to draw to the dynamic screen if `dynamic_resolution_ratio != 1.0` protected fun frame_core_dynamic_resolution_before(display: GamnitDisplay) do @@ -176,9 +182,6 @@ private class DynamicContext do # TODO enable antialiasing. - var width = (display.width.to_f * max_dynamic_resolution_ratio).to_i - var height = (display.height.to_f * max_dynamic_resolution_ratio).to_i - # Set aside the real screen framebuffer name var screen_framebuffer = glGetIntegerv(gl_FRAMEBUFFER_BINDING, 0) self.screen_framebuffer = screen_framebuffer @@ -188,34 +191,19 @@ private class DynamicContext glBindFramebuffer(gl_FRAMEBUFFER, framebuffer) assert glIsFramebuffer(framebuffer) self.dynamic_framebuffer = framebuffer + var gl_error = glGetError + assert gl_error == gl_NO_ERROR else print_error gl_error - # Depth + # Depth & texture/color var depthbuffer = glGenRenderbuffers(1).first - glBindRenderbuffer(gl_RENDERBUFFER, depthbuffer) - assert glIsRenderbuffer(depthbuffer) - glRenderbufferStorage(gl_RENDERBUFFER, gl_DEPTH_COMPNENT16, width, height) - glFramebufferRenderbuffer(gl_FRAMEBUFFER, gl_DEPTH_ATTACHMENT, gl_RENDERBUFFER, depthbuffer) self.depth_renderbuffer = depthbuffer - - # Texture var texture = glGenTextures(1).first - glBindTexture(gl_TEXTURE_2D, texture) - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_LINEAR) - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, gl_LINEAR) - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE) - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_T, gl_CLAMP_TO_EDGE) - glTexImage2D(gl_TEXTURE_2D, 0, gl_RGB, width, height, - 0, gl_RGB, gl_UNSIGNED_BYTE, new Pointer.nul) - glFramebufferTexture2D(gl_FRAMEBUFFER, gl_COLOR_ATTACHMENT0, gl_TEXTURE_2D, texture, 0) self.texture = texture - - var gl_error = glGetError + gl_error = glGetError assert gl_error == gl_NO_ERROR else print_error gl_error - assert glCheckFramebufferStatus(gl_FRAMEBUFFER) == gl_FRAMEBUFFER_COMPLETE - # Take down - glBindRenderbuffer(gl_RENDERBUFFER, 0) - glBindFramebuffer(gl_FRAMEBUFFER, 0) + resize(display, max_dynamic_resolution_ratio) + assert glCheckFramebufferStatus(gl_FRAMEBUFFER) == gl_FRAMEBUFFER_COMPLETE # Array buffer buffer_array = glGenBuffers(1).first @@ -244,6 +232,46 @@ private class DynamicContext assert gl_error == gl_NO_ERROR else print_error gl_error end + # Init size or resize `depth_renderbuffer` and `texture` + fun resize(display: GamnitDisplay, max_dynamic_resolution_ratio: Float) + do + var width = (display.width.to_f * max_dynamic_resolution_ratio).to_i + var height = (display.height.to_f * max_dynamic_resolution_ratio).to_i + + glBindFramebuffer(gl_FRAMEBUFFER, dynamic_framebuffer) + + var depthbuffer = self.depth_renderbuffer + var texture = self.texture + + # Depth + glBindRenderbuffer(gl_RENDERBUFFER, depthbuffer) + assert glIsRenderbuffer(depthbuffer) + glRenderbufferStorage(gl_RENDERBUFFER, gl_DEPTH_COMPNENT16, width, height) + glFramebufferRenderbuffer(gl_FRAMEBUFFER, gl_DEPTH_ATTACHMENT, gl_RENDERBUFFER, depthbuffer) + var gl_error = glGetError + assert gl_error == gl_NO_ERROR else print_error gl_error + + # Texture + glBindTexture(gl_TEXTURE_2D, texture) + glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_LINEAR) + glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, gl_LINEAR) + glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE) + glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_T, gl_CLAMP_TO_EDGE) + glTexImage2D(gl_TEXTURE_2D, 0, gl_RGB, width, height, + 0, gl_RGB, gl_UNSIGNED_BYTE, new Pointer.nul) + glFramebufferTexture2D(gl_FRAMEBUFFER, gl_COLOR_ATTACHMENT0, gl_TEXTURE_2D, texture, 0) + + gl_error = glGetError + assert gl_error == gl_NO_ERROR else print_error gl_error + + # Take down + glBindRenderbuffer(gl_RENDERBUFFER, 0) + glBindFramebuffer(gl_FRAMEBUFFER, 0) + + gl_error = glGetError + assert gl_error == gl_NO_ERROR else print_error gl_error + end + var destroyed = false fun destroy do -- 1.7.9.5