Skip to content

Commit 4189f2c

Browse files
committed
Basic support for EffectManagers
1 parent 8fc59ac commit 4189f2c

File tree

4 files changed

+62
-17
lines changed

4 files changed

+62
-17
lines changed

demosys/conf/default_settings.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44

55
# What attributes should be used when generating a settings file
6-
__ORDER__ = ('DEBUG', 'SCREENSHOT_PATH', 'OPENGL', 'WINDOW', 'EFFECTS', 'MUSIC',
6+
__ORDER__ = ('DEBUG', 'SCREENSHOT_PATH', 'OPENGL', 'WINDOW', 'EFFECTS', 'EFFECT_MANAGER', 'MUSIC',
77
'SHADER_DIRS', 'SHADER_FINDERS', 'TEXTURE_DIRS', 'TEXTURE_FINDERS')
88

99
DEBUG = False
@@ -33,6 +33,8 @@
3333
# Empty effects tuple
3434
EFFECTS = ()
3535

36+
EFFECT_MANAGER = 'demosys.effects.managers.single.SingleEffectManager'
37+
3638
MUSIC = None
3739

3840
# Additional directories shaders can be found

demosys/core/management/commands/runeffect.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44
import demosys
55
from demosys.core.management.base import CreateCommand
6+
from demosys.effects.managers import SingleEffectManager
67

78

89
class Command(CreateCommand):
@@ -13,4 +14,5 @@ def add_arguments(self, parser):
1314

1415
def handle(self, *args, **options):
1516
demosys.setup()
16-
demosys.run(runeffect=options['name'])
17+
manager = SingleEffectManager(effect_module=options['name'])
18+
demosys.run(manager=manager)

demosys/effects/managers.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from demosys.effects.registry import effects
2+
3+
4+
class ManagerError(Exception):
5+
pass
6+
7+
8+
class BaseEffectManger:
9+
"""Base effect manager"""
10+
def __init__(self, *args, **kwargs):
11+
pass
12+
13+
def init_effects(self):
14+
"""Init after context creations"""
15+
pass
16+
17+
def draw(self, time, target):
18+
"""Draw efffect(s)"""
19+
pass
20+
21+
22+
class SingleEffectManager(BaseEffectManger):
23+
"""Run a single effect"""
24+
def __init__(self, effect_module=None):
25+
self.active_effect = None
26+
self.effect_module = effect_module
27+
super().__init__()
28+
29+
def init_effects(self):
30+
"""Init after context creations"""
31+
effect_list = [cls for cls in effects.get_effects()]
32+
for effect in effect_list:
33+
effect.init()
34+
if effect.name == self.effect_module:
35+
self.active_effect = effect
36+
37+
if not self.active_effect:
38+
print("Cannot find effect '{}'".format(self.active_effect))
39+
print("Available effects:")
40+
print("\n".join(e.name for e in effect_list))
41+
return False
42+
return True
43+
44+
def draw(self, time, target):
45+
self.active_effect.draw(time, target)
46+
47+
48+
class TrackerEffectManager(BaseEffectManger):
49+
"""Effect manager handling tracker data"""
50+
pass

demosys/view/controller.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from OpenGL import GL
66
import glfw
77
from demosys.view.window import Window
8-
from demosys.effects.registry import effects, Effect
8+
from demosys.effects.registry import Effect
99
from demosys.opengl import fbo
1010
from demosys.opengl.fbo import WINDOW_FBO
1111
from demosys import resources
@@ -19,13 +19,14 @@
1919
CAMERA = None
2020

2121

22-
def run(runeffect=None):
22+
def run(manager=None):
2323
"""Initialize, load and run"""
2424
global WINDOW
2525
WINDOW = Window()
2626
fbo.WINDOW = WINDOW
2727

2828
print("Loader started at", glfw.get_time())
29+
2930
# Inject attributes into the base Effect class
3031
Effect.window_width = WINDOW.buffer_width
3132
Effect.window_height = WINDOW.buffer_height
@@ -36,18 +37,8 @@ def run(runeffect=None):
3637
CAMERA = camera.Camera(aspect=Effect.window_aspect, fov=60.0, near=1, far=1000)
3738
Effect.sys_camera = CAMERA
3839

39-
# Initialize effects first so resources are registered
40-
effect_list = [cls for cls in effects.get_effects()]
41-
active_effect = None
42-
for effect in effect_list:
43-
effect.init()
44-
if effect.name == runeffect:
45-
active_effect = effect
46-
47-
if not active_effect:
48-
print(f"Cannot find effect '{runeffect}'")
49-
print("Available effects:")
50-
print("\n".join(e.name for e in effect_list))
40+
# Tell EffectManager to initialize effects
41+
if not manager.init_effects():
5142
return
5243

5344
# Load resources
@@ -74,7 +65,7 @@ def run(runeffect=None):
7465
GL.glClearColor(0.0, 0.0, 0.0, 0.0)
7566
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT)
7667

77-
active_effect.draw(t, WINDOW_FBO)
68+
manager.draw(t, WINDOW_FBO)
7869

7970
WINDOW.swap_buffers()
8071
WINDOW.poll_events()

0 commit comments

Comments
 (0)