Skip to content

Commit dfc8bb4

Browse files
committed
Callback hack
Before we figure out how to defer loading resources properly
1 parent f11b09c commit dfc8bb4

File tree

6 files changed

+62
-18
lines changed

6 files changed

+62
-18
lines changed

demosys/resources/__init__.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
from .data import data
66
from .data import Data # noqa
77

8-
ON_LOAD_FUNCS = []
9-
108
__all__ = [
119
'shaders',
1210
'textures',
@@ -16,24 +14,55 @@
1614
'Data',
1715
'load',
1816
'count',
17+
'on_load',
1918
'on_loaded',
19+
'loading_complete',
2020
]
2121

2222

23+
class States:
24+
on_loaded_funcs = []
25+
on_load_funcs = []
26+
loaded = False
27+
28+
@classmethod
29+
def sort_callbacks(cls):
30+
cls.on_load_funcs = sorted(cls.on_load_funcs, key=lambda x: x[0])
31+
cls.on_loaded_funcs = sorted(cls.on_loaded_funcs, key=lambda x: x[0])
32+
33+
2334
def load():
35+
States.sort_callbacks()
36+
37+
for func in reversed(States.on_load_funcs):
38+
func[1]()
39+
2440
scenes.load()
2541
shaders.load()
2642
textures.load()
2743
tracks.load()
2844
data.load()
2945

30-
for func in ON_LOAD_FUNCS:
31-
func()
46+
States.loaded = True
47+
for func in reversed(States.on_loaded_funcs):
48+
func[1]()
3249

3350

3451
def count():
3552
return shaders.count + textures.count
3653

3754

38-
def on_loaded(func):
39-
ON_LOAD_FUNCS.append(func)
55+
def loading_complete():
56+
return States.loaded
57+
58+
59+
def on_load(func, priority=0):
60+
States.on_load_funcs.append((priority, func))
61+
62+
63+
def on_loaded(func, priority=0):
64+
if loading_complete():
65+
func()
66+
return
67+
68+
States.on_loaded_funcs.append((priority, func))

demosys/resources/data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def get(self, name, create=False, cls=Data) -> Data:
6868
key = name.lower()
6969

7070
data_file = self.file_map.get(key)
71-
if not data_file:
71+
if not data_file and create:
7272
data_file = cls(name)
7373
self.files.append(data_file)
7474
self.file_map[key] = data_file

demosys/text/renderer2d.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@
22

33
import moderngl
44
from demosys.opengl import FBO, VAO
5-
from demosys.resources import shaders
5+
from demosys import resources
66

77
from .writer2d import TextWriter2D
88

99

10+
def on_load():
11+
resources.shaders.get('demosys/text/view_renderer_texture.glsl', create=True)
12+
13+
14+
resources.on_load(on_load, priority=100)
15+
16+
1017
class TextRenderer2D(TextWriter2D):
1118

1219
def __init__(self, area, text_lines=None, texture_height=64):
@@ -15,16 +22,16 @@ def __init__(self, area, text_lines=None, texture_height=64):
1522
:param size: Text size
1623
:param text: Initial text
1724
"""
18-
super().__init__(area, text_lines=text_lines)
1925
self._texture_height = texture_height
2026
self._texture_width = 0
2127

2228
self._quad = self._create_vao()
23-
# self._quad = geometry.quad_fs()
24-
self._quad_shader = shaders.get('demosys/text/view_renderer_texture.glsl', create=True)
29+
self._quad_shader = resources.shaders.get('demosys/text/view_renderer_texture.glsl', create=True)
2530
self._fbo = None
31+
super().__init__(area, text_lines=text_lines)
2632

2733
def _post_load(self):
34+
print("TextRenderer2D._post_load")
2835
super()._post_load()
2936
self._texture_width = int(
3037
round(self._meta.char_aspect_wh * self._texture_height * self.area[0] / self.area[1], 0)

demosys/text/writer2d.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@
22

33
import moderngl
44
from demosys.opengl import VAO, TextureArray
5-
from demosys.resources import data, shaders, textures
5+
from demosys import resources
66
from pyrr import matrix44
77

88
from .base import BaseText, Meta
99

10+
def on_load():
11+
resources.textures.get('demosys/text/VeraMono.png', cls=TextureArray, layers=190, create=True)
12+
resources.shaders.get('demosys/text/textwriter2d.glsl', create=True)
13+
resources.data.get('demosys/text/meta.json', create=True)
14+
15+
16+
resources.on_load(on_load, priority=100)
17+
1018

1119
class TextWriter2D(BaseText):
1220

@@ -25,13 +33,13 @@ def __init__(self, area, text_lines=None, aspect_ratio=1.0):
2533
self.aspect_ratio = aspect_ratio
2634

2735
self._vao = None
28-
self._texture = textures.get('demosys/text/VeraMono.png', cls=TextureArray, layers=190, create=True)
29-
self._shader = shaders.get('demosys/text/textwriter2d.glsl', create=True)
30-
self._config = data.get('demosys/text/meta.json', create=True)
36+
self._texture = resources.textures.get('demosys/text/VeraMono.png', cls=TextureArray, layers=190, create=True)
37+
self._shader = resources.shaders.get('demosys/text/textwriter2d.glsl', create=True)
38+
self._config = resources.data.get('demosys/text/meta.json', create=True)
3139

3240
self._string_buffer = None
3341

34-
data.on_loaded(self._post_load)
42+
resources.on_loaded(self._post_load, priority=99)
3543

3644
def _post_load(self):
3745
"""Parse font metadata after resources are loaded"""

examples/textrenderer/effect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from demosys.text import TextRenderer2D
66

77

8-
class TextEffect(effect.Effect):
8+
class TextRendererEffect(effect.Effect):
99

1010
def __init__(self):
1111
super().__init__()

examples/textwriter/effect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from demosys.text import TextWriter2D
66

77

8-
class TextEffect(effect.Effect):
8+
class TextWriterEffect(effect.Effect):
99

1010
def __init__(self):
1111
super().__init__()

0 commit comments

Comments
 (0)