Skip to content

Commit 93cdfd3

Browse files
committed
Clean up default fbo handling
1 parent 9c2abda commit 93cdfd3

File tree

4 files changed

+35
-55
lines changed

4 files changed

+35
-55
lines changed

demosys/context/base.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
import moderngl
55
from demosys.conf import settings
6-
from demosys.opengl.fbo import WindowFBO
7-
from demosys import context
86

97
GLVersion = namedtuple('GLVersion', ['major', 'minor'])
108

@@ -38,39 +36,41 @@ def __init__(self):
3836
self.vsync = settings.WINDOW.get('vsync')
3937
self.cursor = settings.WINDOW.get('cursor')
4038

41-
self._calc_viewport()
39+
self.clear_color = (0.0, 0.0, 0.0, 0.0)
40+
self.clear_depth = (1.0)
4241

4342
# ModernGL context
4443
self.ctx = None
4544

46-
WindowFBO.window = self
47-
self.fbo = WindowFBO
48-
context.WINDOW = self
49-
5045
def draw(self, current_time, frame_time):
51-
self.manager.draw(current_time, frame_time, WindowFBO)
46+
self.set_default_viewport()
47+
self.manager.draw(current_time, frame_time, self.fbo)
5248

5349
def clear(self):
5450
"""Clear the scren"""
55-
self.ctx.clear(
56-
red=0.0, blue=0.0, green=0.0, alpha=0.0, depth=1.0,
57-
viewport=self._viewport,
51+
self.ctx.screen.clear(
52+
red=self.clear_color[0],
53+
green=self.clear_color[1],
54+
blue=self.clear_color[2],
55+
alpha=self.clear_color[3],
56+
depth=self.clear_depth,
5857
)
5958

59+
def clear_values(self, red=0.0, green=0.0, blue=0.0, alpha=0.0, depth=1.0):
60+
self.clear_color = (red, green, blue, alpha)
61+
self.clear_depth = depth
62+
6063
def use(self):
6164
"""Render to this window"""
6265
raise NotImplementedError()
6366

64-
def viewport(self):
65-
self.ctx.viewport = self._viewport
66-
6767
def swap_buffers(self):
6868
"""Swap frame buffer"""
6969
raise NotImplementedError()
7070

7171
def resize(self, width, height):
7272
"""Resize window"""
73-
self._calc_viewport()
73+
self.set_default_viewport()
7474

7575
def close(self):
7676
"""Set the close state"""
@@ -85,8 +85,7 @@ def terminate(self):
8585
raise NotImplementedError()
8686

8787
def mgl_fbo(self):
88-
"""Returns the ModernGL fbo used by this window"""
89-
raise NotImplementedError()
88+
return self.ctx.screen
9089

9190
def print_context_info(self):
9291
"""Prints out context info"""
@@ -99,11 +98,11 @@ def print_context_info(self):
9998
print('platform:', sys.platform)
10099
print('code:', self.ctx.version_code)
101100

102-
def _calc_viewport(self):
101+
def set_default_viewport(self):
103102
"""Calculate viewport with correct aspect ratio"""
104103
# The expected height with the current viewport width
105104
expected_height = int(self.buffer_width / self.aspect_ratio)
106105

107106
# How much positive or negative y padding
108107
blank_space = self.buffer_height - expected_height
109-
self._viewport = (0, blank_space // 2, self.buffer_width, expected_height)
108+
self.ctx.screen.viewport = (0, blank_space // 2, self.buffer_width, expected_height)

demosys/context/glfw.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import moderngl
44
from demosys.scene import camera
55
from demosys.view import screenshot
6-
6+
from demosys.opengl import FBO
7+
from demosys import context
78
from .base import Window
89

910

@@ -50,7 +51,6 @@ def __init__(self):
5051
self.buffer_width, self.buffer_height = glfw.get_framebuffer_size(self.window)
5152
print("Frame buffer size:", self.buffer_width, self.buffer_height)
5253
print("Actual window size:", glfw.get_window_size(self.window))
53-
self._calc_viewport()
5454

5555
glfw.make_context_current(self.window)
5656

@@ -65,6 +65,11 @@ def __init__(self):
6565

6666
# Create mederngl context from existing context
6767
self.ctx = moderngl.create_context()
68+
self.fbo = FBO()
69+
self.fbo.fbo = self.ctx.screen
70+
self.fbo.default_framebuffer = True
71+
context.WINDOW = self
72+
self.set_default_viewport()
6873

6974
def use(self):
7075
self.ctx.screen.use()
@@ -90,9 +95,6 @@ def resize(self, width, height):
9095
def terminate(self):
9196
glfw.terminate()
9297

93-
def mgl_fbo(self):
94-
return self.ctx.screen
95-
9698
def poll_events(self):
9799
"""Poll events from glfw"""
98100
glfw.poll_events()
@@ -106,7 +108,7 @@ def check_glfw_version(self):
106108
def key_event_callback(self, window, key, scancode, action, mods):
107109
"""
108110
Key event callback for glfw
109-
s
111+
110112
:param window: Window event origin
111113
:param key: The keyboard key that was pressed or released.
112114
:param scancode: The system-specific scancode of the key.

demosys/opengl/fbo.py

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,16 @@
44
from demosys.opengl import DepthTexture, Texture2D
55

66

7-
class WindowFBO:
8-
window = None
9-
10-
@classmethod
11-
def use(cls):
12-
"""Sets the viewport back to the buffer size of the screen/window"""
13-
cls.window.use()
14-
cls.window.viewport()
15-
16-
@classmethod
17-
def release(cls):
18-
"""Dummy release method"""
19-
pass
20-
21-
@classmethod
22-
def clear(cls, red=0.0, green=0.0, blue=0.0, depth=1.0, viewport=None):
23-
"""Dummy clear method"""
24-
cls.window.clear()
25-
26-
@property
27-
@classmethod
28-
def mglo(cls):
29-
"""Internal ModernGL fbo"""
30-
return cls.window.mgl_fbo()
31-
32-
337
class FBO:
348
"""Frame buffer object"""
359
_stack = []
3610

3711
def __init__(self):
12+
self._window = context.window()
3813
self.color_buffers = []
3914
self.depth_buffer = None
4015
self.fbo = None
16+
self.default_framebuffer = False
4117

4218
@staticmethod
4319
def create_from_textures(color_buffers: List[Texture2D], depth_buffer: DepthTexture = None) -> 'FBO':
@@ -157,7 +133,8 @@ def use(self, stack=True):
157133
if not stack:
158134
return
159135

160-
FBO._stack.append(self)
136+
if not self.default_framebuffer:
137+
FBO._stack.append(self)
161138

162139
if len(FBO._stack) > 8:
163140
raise FBOError("FBO stack overflow. You probably forgot to release a bind somewhere.")
@@ -168,8 +145,11 @@ def release(self, stack=True):
168145
169146
:param stack: (bool) If the bind should be popped form the FBO stack.
170147
"""
148+
if self.default_framebuffer:
149+
return
150+
171151
if not stack:
172-
WindowFBO.use()
152+
self._window.fbo.use()
173153
return
174154

175155
# Are we trying to release an FBO that is not bound?
@@ -186,7 +166,7 @@ def release(self, stack=True):
186166
if FBO._stack:
187167
parent = FBO._stack[-1]
188168
else:
189-
parent = WindowFBO
169+
parent = self._window.fbo
190170

191171
# Bind the parent FBO
192172
if parent:

demosys/view/controller.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ def run(manager=None):
7474
current_time = window.timer.get_time()
7575

7676
window.use()
77-
window.viewport()
7877
window.clear()
7978
window.draw(current_time, frame_time)
8079
window.swap_buffers()

0 commit comments

Comments
 (0)