1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- from weakref import WeakSet
- import bge
-
- __all__ = ['MaterialManager']
-
- class MaterialManager(object):
- Scenes = WeakSet()
- Registry = []
-
- def __init__(self):
- raise NotImplemented()
-
- @classmethod
- def RegisterEvents(cls):
- scenes = bge.logic.getSceneList()
- for scene in scenes:
- if scene not in cls.Scenes:
- scene.pre_draw_setup.append(cls.pre_draw_setup)
- scene.pre_draw.append(cls.pre_draw)
- scene.post_draw.append(cls.post_draw)
- cls.Scenes.add(scene)
-
- @classmethod
- def Register(cls, process):
- cls.Registry.append(process)
- return process
-
- @classmethod
- def RunDispatchers(cls, dispatch):
- for process in list(cls.Registry):
- if process.invalid:
- cls.Registry.remove(process)
- else:
- try: dispatch(process)
- except Exception as e:
- cls.Registry.remove(process)
- process.error(e)
-
- @classmethod
- def pre_draw_setup(cls):
- cls.RegisterEvents()
- cls.RunDispatchers(lambda process: process.pre_draw_setup_dispatch())
-
- @classmethod
- def pre_draw(cls):
- cls.RunDispatchers(lambda process: process.pre_draw_dispatch())
-
- @classmethod
- def post_draw(cls):
- cls.RunDispatchers(lambda process: process.post_draw_dispatch())
|