ya2 · news · projects · code · about

optimization: creation of images
[pmachines.git] / pmachines / app.py
index 95c004e88c6a87a04791bb782e154dbd2c03e1bf..73d43a172beea857fed336e0ff1dd2d94cf5f2cd 100755 (executable)
@@ -44,11 +44,11 @@ class MainFsm(FSM):
 class PmachinesApp:
 
     def __init__(self):
-        self._configure()
-        self.base = ShowBase()
         info('platform: %s' % platform)
         info('exists main.py: %s' % exists('main.py'))
         args = self._parse_args()
+        self._configure(args)
+        self.base = ShowBase()
         self._prepare_window(args)
         self.updating = args.update
         self.version = args.version
@@ -59,7 +59,7 @@ class PmachinesApp:
                                 'pmachines',
                                 'assets/locale/')
         self._fsm = MainFsm(self)
-        if args.screenshots:
+        if args.screenshot:
             scene_classes = []
             for _file in glob('pmachines/scenes/*.py'):
                 _fn = _file.replace('.py', '').replace('/', '.')
@@ -67,10 +67,10 @@ class PmachinesApp:
                     if isclass(member) and issubclass(member, Scene) and \
                             member != Scene:
                         scene_classes += [member]
-            for cls in scene_classes:
-                scene = cls(BulletWorld(), None, True, False)
-                scene.screenshot()
-                scene.destroy()
+            cls = [cls for cls in scene_classes if cls.__name__ == args.screenshot][0]
+            scene = cls(BulletWorld(), None, True, False, lambda: None)
+            scene.screenshot()
+            scene.destroy()
             exit()
         elif self._options['development']['auto_start']:
             mod_name = 'pmachines.scenes.scene_' + self._options['development']['auto_start']
@@ -100,24 +100,32 @@ class PmachinesApp:
         self._scene = cls(
             self.world, self.on_home,
             self._options['development']['auto_close_instructions'],
-            self._options['development']['debug_items'])
+            self._options['development']['debug_items'],
+            self.reload)
 
     def on_scene_exit(self):
         self._unset_physics()
         self._scene.destroy()
 
-    def _configure(self):
+    def reload(self, cls):
+        self._fsm.demand('Scene', cls)
+
+    def _configure(self, args):
         load_prc_file_data('', 'window-title pmachines')
         load_prc_file_data('', 'framebuffer-srgb true')
         load_prc_file_data('', 'sync-video true')
-        load_prc_file_data('', 'threading-model Cull/Draw')
+        # load_prc_file_data('', 'threading-model Cull/Draw')
+        # it freezes when you go to the next scene
+        if args.screenshot:
+            load_prc_file_data('', 'window-type offscreen')
+            load_prc_file_data('', 'audio-library-name null')
 
     def _parse_args(self):
         parser = argparse.ArgumentParser()
         parser.add_argument('--update', action='store_true')
         parser.add_argument('--version', action='store_true')
         parser.add_argument('--optfile')
-        parser.add_argument('--screenshots', action='store_true')
+        parser.add_argument('--screenshot')
         cmd_line = [arg for arg in iter(argv[1:]) if not arg.startswith('-psn_')]
         args = parser.parse_args(cmd_line)
         return args
@@ -176,7 +184,8 @@ class PmachinesApp:
         props.set_size(res)
         props.set_fullscreen(self._options['settings']['fullscreen'])
         props.set_icon_filename('assets/icon/pmachines.ico')
-        base.win.request_properties(props)
+        if not args.screenshot:
+            base.win.request_properties(props)
         gltf.patch_loader(base.loader)
         if self._options['development']['simplepbr']:
             self._pipeline = simplepbr.init(
@@ -212,7 +221,7 @@ class PmachinesApp:
             self.world.set_debug_node(self._debug_np.node())
         def update(task):
             dt = globalClock.get_dt()
-            self.world.do_physics(dt)
+            self.world.do_physics(dt, 10, 1/180)
             return task.cont
         self._phys_tsk = taskMgr.add(update, 'update')