Skip to content

Commit e481b3e

Browse files
committed
Scene files rewrite
1 parent 28d5799 commit e481b3e

File tree

3 files changed

+123
-32
lines changed

3 files changed

+123
-32
lines changed

demosys/opengl/vao.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,17 @@ def _create_vao_instance(self, shader):
239239

240240
return vao
241241

242+
def release(self):
243+
"""Destroy the vao object and its buffers"""
244+
for key, vao in self.vaos:
245+
vao.release()
246+
247+
for buff in self.buffers:
248+
buff.buffer.release()
249+
250+
if self._index_buffer:
251+
self._index_buffer.release()
252+
242253

243254
class VAOError(Exception):
244255
pass

demosys/resources/scenes.py

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,26 @@
1111
from .base import BaseRegistry
1212

1313

14+
class SceneMeta:
15+
16+
def __init__(self, path, loader_cls, **kwargs):
17+
self.path = path
18+
self.loader_cls = loader_cls
19+
self.kwargs = kwargs
20+
21+
1422
class Scenes(BaseRegistry):
1523
"""
1624
A registry for scense requested by effects.
1725
Once all effects are initialized, we ask this class to load the scenes.
1826
"""
1927
def __init__(self):
2028
super().__init__()
21-
self.scenes = {}
22-
23-
@property
24-
def count(self):
25-
return len(self.scenes)
29+
self.scene_loaders = [
30+
import_string(loader) for loader in settings.SCENE_LOADERS
31+
]
2632

27-
def get(self, path: Union[str, Path], **kwargs) -> Scene:
33+
def load(self, path: Union[str, Path], **kwargs) -> Scene:
2834
"""
2935
Get or create a scene object.
3036
This may return an empty object that will be filled during load
@@ -36,33 +42,46 @@ def get(self, path: Union[str, Path], **kwargs) -> Scene:
3642
"""
3743
path = Path(path)
3844

45+
scene = self.file_map.get(path)
46+
if scene:
47+
return scene
48+
49+
meta = self.load_deferred(path, **kwargs)
50+
scene = self._load(meta)
51+
52+
return scene
53+
54+
def load_deferred(self, path: Union[str, Path], **kwargs) -> SceneMeta:
3955
# Figure out what scene loader class should be used
40-
for loader_name in settings.SCENE_LOADERS:
41-
loader_cls = import_string(loader_name)
56+
for loader_cls in self.scene_loaders:
4257
if loader_cls.supports_file(path):
43-
if path not in self.scenes:
44-
loader_cls = import_string(loader_name)
45-
self.scenes[path] = Scene(path, loader=loader_cls(path), **kwargs)
4658
break
4759
else:
48-
raise ImproperlyConfigured("Scene {} has no loader class registered. Check settings.SCENE_LOADERS")
49-
50-
return self.scenes[path]
51-
52-
def load(self):
53-
finders = list(get_finders())
54-
print("Loading scenes:")
55-
for name, scene in self.scenes.items():
56-
for finder in finders:
57-
path = finder.find(name)
58-
if path:
59-
print(" - {}".format(path))
60-
scene.load(path)
61-
break
62-
else:
63-
raise ImproperlyConfigured("Cannot find scene {}".format(name))
64-
65-
self._on_loaded()
60+
raise ImproperlyConfigured(
61+
"Scene {} has no loader class registered. Check settings.SCENE_LOADERS".format(path))
62+
63+
meta = SceneMeta(path, loader_cls, **kwargs)
64+
65+
self.file_meta[path] = meta
66+
self.file_map[path] = None
67+
68+
return meta
69+
70+
def _load(self, meta) -> Scene:
71+
found_path = self._find_last_of(meta.path, list(get_finders()))
72+
73+
if not found_path:
74+
raise ImproperlyConfigured("Cannot find scene file {}".format(meta.path))
75+
76+
print("Loading: {}".format(meta.path))
77+
scene = Scene(meta.path, loader=meta.loader_cls(meta.path), **meta.kwargs)
78+
scene.load(found_path)
79+
80+
self.file_map[meta.path] = scene
81+
return scene
82+
83+
def _destroy(self, obj):
84+
obj.destroy()
6685

6786

6887
scenes = Scenes()

tests/test_resources.py

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,70 @@
11
from demosys.test import DemosysTestCase
22
from demosys import resources
3+
from demosys.core.exceptions import ImproperlyConfigured
34

45

56
class ResourceTestCase(DemosysTestCase):
67

7-
def test_stuff(self):
8-
result = resources.shaders.get('vf_pos.glsl', create=True)
9-
resources.shaders.load()
8+
def test_datafiles(self):
9+
"""Loading data files"""
10+
# string and binary data file
11+
data_str = resources.data.load('data.txt', mode="text")
12+
data_bin = resources.data.load('data.bin', mode="binary")
13+
self.assertEqual(data_str.data, '1234')
14+
self.assertEqual(data_bin.data, b'\x01\x02\x03\x04')
15+
16+
# Ensure requesting the same file returns the existing one
17+
data = resources.data.load('data.txt', mode="text")
18+
self.assertEqual(data, data_str)
19+
data = resources.data.load('data.bin', mode="binary")
20+
self.assertEqual(data, data_bin)
21+
self.assertEqual(resources.data.count, 2)
22+
23+
# Delete and destroy
24+
resources.data.delete(data_str, destroy=True)
25+
self.assertIsNone(data_str.data)
26+
self.assertEqual(resources.data.count, 1)
27+
resources.data.flush(destroy=True)
28+
self.assertEqual(resources.data.count, 0)
29+
30+
with self.assertRaises(ImproperlyConfigured):
31+
resources.data.load('notfound.bin')
32+
33+
def test_scene(self):
34+
scene_obj = resources.scenes.load('cube.obj')
35+
self.assertEqual(len(scene_obj.nodes), 0)
36+
self.assertEqual(len(scene_obj.root_nodes), 1)
37+
38+
scene_gltf = resources.scenes.load('BoxTextured/glTF/BoxTextured.gltf')
39+
self.assertEqual(len(scene_gltf.nodes), 2)
40+
self.assertEqual(len(scene_gltf.root_nodes), 1)
41+
42+
# Ensure requesting the same file returns the existing one
43+
scene = resources.scenes.load('cube.obj')
44+
self.assertEqual(scene, scene_obj)
45+
scene = resources.scenes.load('BoxTextured/glTF/BoxTextured.gltf')
46+
self.assertEqual(scene, scene_gltf)
47+
48+
self.assertEqual(resources.scenes.count, 2)
49+
50+
# Delete and destroy
51+
resources.scenes.delete(scene_obj, destroy=True)
52+
self.assertEqual(resources.scenes.count, 1)
53+
resources.scenes.flush(destroy=True)
54+
self.assertEqual(resources.scenes.count, 0)
55+
56+
with self.assertRaises(ImproperlyConfigured):
57+
resources.scenes.load('notfound.gltf')
58+
59+
# def test_shaders(self):
60+
# result = resources.shaders.get('vf_pos.glsl')
61+
# resources.shaders.load()
62+
# self.assertNotEqual(result.mglo, None)
63+
64+
# def test_textures(self):
65+
# result = resources.textures.get('wood.jpg')
66+
# resources.textures.load()
67+
# self.assertNotEqual(result.mglo, None)
68+
69+
# def test_resource_override(self):
70+
# pass

0 commit comments

Comments
 (0)