Skip to content

Commit 9e02d88

Browse files
committed
Resource callbacks
1 parent edac967 commit 9e02d88

File tree

8 files changed

+107
-4
lines changed

8 files changed

+107
-4
lines changed

demosys/effects/effect.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ class Effect:
7676
_ctx = None # type: moderngl.Context
7777
_sys_camera = None # type: camera.SystemCamera
7878

79+
def __init__(self, *args, **kwargs):
80+
self.on_resouces_loaded(self.post_load)
81+
82+
def post_load(self):
83+
"""
84+
Called when all resources are loaded before effects start running.
85+
This assumes you have called Effect.__init__()
86+
"""
87+
pass
88+
7989
@property
8090
def name(self) -> str:
8191
"""Full python path to the effect"""
@@ -205,6 +215,28 @@ def get_data(self, path, local=False, **kwargs) -> Data:
205215
"""
206216
return resources.data.get(path, create=True, **kwargs)
207217

218+
# Register callbacks
219+
220+
def on_resouces_loaded(self, func):
221+
"""Register callback function when all resources are loaded"""
222+
resources.on_loaded(func)
223+
224+
def on_shaders_loaded(self, func):
225+
"""Register callback function when shaders are loaded"""
226+
resources.shaders.on_loaded(func)
227+
228+
def on_textures_loaded(self, func):
229+
"""Register callback function when textures are loaded"""
230+
resources.textures.on_loaded(func)
231+
232+
def on_scenes_loaded(self, func):
233+
"""Register callback function when scenes are loaded"""
234+
resources.scenes.on_loaded(func)
235+
236+
def on_data_loaded(self, func):
237+
"""Register callback function when data files are loaded"""
238+
resources.data.on_loaded(func)
239+
208240
# Utility methods for matrices
209241

210242
def create_projection(self, fov=75.0, near=1.0, far=100.0, ratio=None):

demosys/resources/__init__.py

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

8+
ON_LOAD_FUNCS = []
9+
10+
__all__ = [
11+
'shaders',
12+
'textures',
13+
'tracks',
14+
'scenes',
15+
'data',
16+
'Data',
17+
'load',
18+
'count',
19+
'on_loaded',
20+
]
21+
822

923
def load():
1024
scenes.load()
@@ -13,6 +27,13 @@ def load():
1327
tracks.load()
1428
data.load()
1529

30+
for func in ON_LOAD_FUNCS:
31+
func()
32+
1633

1734
def count():
1835
return shaders.count + textures.count
36+
37+
38+
def on_loaded(func):
39+
ON_LOAD_FUNCS.append(func)

demosys/resources/base.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""
2+
Base registry class
3+
"""
4+
5+
6+
class BaseRegistry:
7+
"""
8+
Base registry class providing callback functionality
9+
for each registry type.
10+
"""
11+
12+
def __init__(self):
13+
self._on_loaded_funcs = []
14+
15+
def on_loaded(self, func):
16+
"""Register functions to call when all data is loaded"""
17+
self._on_loaded_funcs.append(func)
18+
19+
def _on_loaded(self):
20+
for func in self._on_loaded_funcs:
21+
func()

demosys/resources/data.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44
from demosys.core.exceptions import ImproperlyConfigured
55
from demosys.core.datafiles.finders import get_finders
6+
from .base import BaseRegistry
67

78

89
class Data:
@@ -45,9 +46,10 @@ def _get_load_funcs(self):
4546
if attr.startswith("load_")}
4647

4748

48-
class DataFiles:
49+
class DataFiles(BaseRegistry):
4950
"""Registry for requested data files"""
5051
def __init__(self):
52+
super().__init__()
5153
self.files = []
5254
self.file_map = {}
5355

@@ -89,5 +91,7 @@ def load(self):
8991
else:
9092
raise ImproperlyConfigured("Cannot find data file {}".format(name))
9193

94+
self._on_loaded()
95+
9296

9397
data = DataFiles()

demosys/resources/scenes.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
from demosys.scene import Scene
66
from demosys.utils.module_loading import import_string
77

8+
from .base import BaseRegistry
89

9-
class Scenes:
10+
11+
class Scenes(BaseRegistry):
1012
"""
1113
A registry for scense requested by effects.
1214
Once all effects are initialized, we ask this class to load the scenes.
1315
"""
1416
def __init__(self):
17+
super().__init__()
1518
self.scenes = {}
1619

1720
@property
@@ -54,5 +57,7 @@ def load(self):
5457
else:
5558
raise ImproperlyConfigured("Cannot find scene {}".format(name))
5659

60+
self._on_loaded()
61+
5762

5863
scenes = Scenes()

demosys/resources/shaders.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
from demosys.core.shaderfiles.finders import get_finders
55
from demosys.opengl import ShaderError, ShaderProgram
66

7+
from .base import BaseRegistry
78

8-
class Shaders:
9+
10+
class Shaders(BaseRegistry):
911
"""
1012
A registry for shaders requested by effects.
1113
Once all effects are initialized, we ask this class to load the shaders.
1214
"""
1315
def __init__(self):
16+
super().__init__()
1417
self.shaders = {}
1518

1619
@property
@@ -46,6 +49,8 @@ def load(self, reload=False):
4649
for name, shader in self.shaders.items():
4750
self.load_shader(shader, name=name, reload=reload)
4851

52+
self._on_loaded()
53+
4954
def load_shader(self, shader, name=None, reload=False):
5055
"""
5156
Loads a single shader adding it to the shader registry

demosys/resources/textures.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
from demosys.core.texturefiles.finders import get_finders
77
from demosys.opengl import Texture2D, TextureArray
88

9+
from .base import BaseRegistry
910

10-
class Textures:
11+
12+
class Textures(BaseRegistry):
1113
"""
1214
A registry for textures requested by effects.
1315
Once all effects are initialized, we ask this class to load the textures.
1416
"""
1517
def __init__(self):
18+
super().__init__()
1619
self.textures = {}
1720

1821
@property
@@ -56,5 +59,7 @@ def load(self):
5659
else:
5760
raise ImproperlyConfigured("Cannot find texture {}".format(name))
5861

62+
self._on_loaded()
63+
5964

6065
textures = Textures()

docs/source/reference/effect.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ Resource Methods
2121
.. automethod:: Effect.get_scene(path, local=False, **kwargs) -> Scene
2222
.. automethod:: Effect.get_data(path, local=False, **kwargs) -> Data
2323

24+
Callbacks
25+
---------
26+
27+
.. automethod:: Effect.post_load()
28+
.. automethod:: Effect.on_resouces_loaded(func)
29+
.. automethod:: Effect.on_textures_loaded(func)
30+
.. automethod:: Effect.on_data_loaded(func)
31+
.. automethod:: Effect.on_shaders_loaded(func)
32+
.. automethod:: Effect.on_scenes_loaded(func)
33+
2434
Utility Methods
2535
---------------
2636

0 commit comments

Comments
 (0)