Commit | Line | Data |
---|---|---|
8ee66edd | 1 | import argparse |
4894bb48 FC |
2 | import simplepbr |
3 | import gltf | |
8ee66edd FC |
4 | from sys import platform, argv |
5 | from logging import info | |
6 | from os.path import exists | |
7 | from os import makedirs | |
1be87278 FC |
8 | from panda3d.core import Filename, load_prc_file_data, AntialiasAttrib |
9 | from panda3d.bullet import BulletWorld, BulletDebugNode | |
8ee66edd | 10 | from direct.showbase.ShowBase import ShowBase |
1be87278 | 11 | from pmachines.scene import Scene |
54a1397e | 12 | from pmachines.music import MusicMgr |
9ba5488b FC |
13 | from lib.dictfile import DctFile |
14 | from lib.lib.p3d.p3d import LibP3d | |
2aaa10d3 | 15 | from lib.engine.lang import LangMgr |
8ee66edd FC |
16 | |
17 | ||
18 | class Pmachines: | |
19 | ||
20 | def __init__(self): | |
21 | self._configure() | |
22 | self.base = ShowBase() | |
23 | info('platform: %s' % platform) | |
24 | info('exists main.py: %s' % exists('main.py')) | |
8ee66edd | 25 | args = self._parse_args() |
9ba5488b | 26 | self._prepare_window(args) |
8ee66edd FC |
27 | self.updating = args.update |
28 | self.version = args.version | |
29 | if args.update: | |
30 | return | |
9ba5488b | 31 | MusicMgr(self._options['settings']['volume']) |
2aaa10d3 FC |
32 | self.lang_mgr = LangMgr('en', |
33 | 'pmachines', | |
34 | 'assets/locale/') | |
1be87278 | 35 | self._set_physics() |
651713a9 | 36 | self._scene = Scene(self.world) |
8ee66edd FC |
37 | |
38 | def _configure(self): | |
39 | load_prc_file_data('', 'window-title pmachines') | |
4894bb48 FC |
40 | load_prc_file_data('', 'framebuffer-multisample 1') |
41 | load_prc_file_data('', 'multisamples 4') | |
42 | load_prc_file_data('', 'framebuffer-srgb true') | |
8ee66edd FC |
43 | |
44 | def _parse_args(self): | |
45 | parser = argparse.ArgumentParser() | |
46 | parser.add_argument('--update', action='store_true') | |
47 | parser.add_argument('--version', action='store_true') | |
9ba5488b | 48 | parser.add_argument('--optfile') |
8ee66edd FC |
49 | cmd_line = [arg for arg in iter(argv[1:]) if not arg.startswith('-psn_')] |
50 | args = parser.parse_args(cmd_line) | |
51 | return args | |
52 | ||
9ba5488b | 53 | def _prepare_window(self, args): |
8ee66edd FC |
54 | data_path = '' |
55 | if (platform.startswith('win') or platform.startswith('linux')) and ( | |
56 | not exists('main.py') or __file__.startswith('/app/bin/')): | |
57 | # it is the deployed version for windows | |
58 | data_path = str(Filename.get_user_appdata_directory()) + '/pmachines' | |
59 | home = '/home/flavio' # we must force this for wine | |
60 | if data_path.startswith('/c/users/') and exists(home + '/.wine/'): | |
61 | data_path = home + '/.wine/drive_' + data_path[1:] | |
62 | info('creating dirs: %s' % data_path) | |
63 | makedirs(data_path, exist_ok=True) | |
9ba5488b FC |
64 | optfile = args.optfile if args.optfile else 'options.ini' |
65 | info('data path: %s' % data_path) | |
66 | info('option file: %s' % optfile) | |
67 | info('fixed path: %s' % LibP3d.fixpath(data_path + '/' + optfile)) | |
68 | default_opt = { | |
69 | 'settings': { | |
70 | 'volume': 1}, | |
71 | 'development': { | |
a5dc83f4 | 72 | 'simplepbr': 1, |
9ba5488b FC |
73 | 'verbose_log': 0, |
74 | 'physics_debug': 0}} | |
75 | opt_path = LibP3d.fixpath(data_path + '/' + optfile) if data_path else optfile | |
76 | opt_exists = exists(opt_path) | |
77 | self._options = DctFile( | |
78 | LibP3d.fixpath(data_path + '/' + optfile) if data_path else optfile, | |
79 | default_opt) | |
80 | if not opt_exists: | |
81 | self._options.store() | |
4894bb48 | 82 | gltf.patch_loader(base.loader) |
a5dc83f4 FC |
83 | if self._options['development']['simplepbr']: |
84 | pipeline = simplepbr.init( | |
85 | use_normal_maps=True, | |
86 | use_emission_maps=False, | |
87 | use_occlusion_maps=True | |
88 | ) | |
4894bb48 | 89 | render.setAntialias(AntialiasAttrib.MAuto) |
1be87278 FC |
90 | self.base.set_background_color(0, 0, 0, 1) |
91 | self.base.disable_mouse() | |
651713a9 FC |
92 | #self.base.accept('window-event', self._on_win_evt) |
93 | self.base.accept('aspectRatioChanged', self._on_aspect_ratio_changed) | |
1be87278 FC |
94 | |
95 | def _set_physics(self): | |
9ba5488b FC |
96 | if self._options['development']['physics_debug']: |
97 | debug_node = BulletDebugNode('Debug') | |
98 | debug_node.show_wireframe(True) | |
99 | debug_node.show_constraints(True) | |
100 | debug_node.show_bounding_boxes(True) | |
101 | debug_node.show_normals(True) | |
102 | debug_np = render.attach_new_node(debug_node) | |
103 | debug_np.show() | |
1be87278 FC |
104 | self.world = BulletWorld() |
105 | self.world.set_gravity((0, 0, -9.81)) | |
9ba5488b FC |
106 | if self._options['development']['physics_debug']: |
107 | self.world.set_debug_node(debug_np.node()) | |
1be87278 FC |
108 | def update(task): |
109 | dt = globalClock.get_dt() | |
110 | self.world.do_physics(dt) | |
111 | return task.cont | |
112 | taskMgr.add(update, 'update') | |
651713a9 FC |
113 | |
114 | def _on_aspect_ratio_changed(self): | |
115 | self._scene.on_aspect_ratio_changed() |