*.mo
*.pyc
*.blend1
+/hash_cache.txt
/assets/bld_version.txt
/options.ini
-/assets/gltf/
+/assets/models/gltf/
/build/
/dist/
/assets/locale/
cmd = 'blender %s --background --python lib/build/blend2gltf.py '
cmd += '-- %s.gltf'
cmd = cmd % (_fname, fname[:-6])
- pgltf = 'assets/gltf/'
- gltf_name = _fname.replace('assets/models/', pgltf)
+ pgltf = 'assets/models/gltf/'
+ gltf_name = _fname.replace('assets/models/blend/', pgltf)
gltf_name = gltf_name.replace('.blend', '.gltf')
if not to_be_built(gltf_name, [_fname]):
return False
self._cache_files += [_fname, gltf_name]
files_after = [basename(gname) for gname in glob('./*')]
new_files = [nnm for nnm in files_after if nnm not in files_before]
- new_dir = root.replace('assets/models/', pgltf)
+ new_dir = root.replace('assets/models/blend/', pgltf)
rmtree(new_dir, ignore_errors=True)
makedirs(new_dir)
for mname in new_files:
new_name = '%s/%s' % (new_dir, mname)
move(mname, new_name)
info('move %s %s' % (mname, new_name))
- # blender rewrites metal files: let's restore them
- metal_files = [fnm for fnm in glob(new_dir + '/*') if 'metal' in fnm]
- for metal_file in metal_files:
- src = metal_file.replace(pgltf, 'assets/models/')
- if not exists(src):
- src = metal_file.replace(pgltf, 'assets/models/prototypes/')
- src_split = src.split('/')
- src_tracks_idx = src_split.index('tracks')
- before = src_split[:src_tracks_idx]
- after = src_split[src_tracks_idx + 2:]
- src = '/'.join(before + after)
- copyfile(src, metal_file)
+ # # blender rewrites metal files: let's restore them
+ # metal_files = [fnm for fnm in glob(new_dir + '/*') if 'metal' in fnm]
+ # for metal_file in metal_files:
+ # src = metal_file.replace(pgltf, 'assets/models/')
+ # if not exists(src):
+ # src = metal_file.replace(pgltf, 'assets/models/prototypes/')
+ # src_split = src.split('/')
+ # src_tracks_idx = src_split.index('tracks')
+ # before = src_split[:src_tracks_idx]
+ # after = src_split[src_tracks_idx + 2:]
+ # src = '/'.join(before + after)
+ # copyfile(src, metal_file)
return True
def _export_bam(self, root, fname, mp_mgr):
'''Exports bam files from glTF ones.'''
_fname = '%s/%s' % (root, fname)
- gltf_name = (_fname[:-5] + 'gltf').replace('/models/', '/gltf/', 1)
- bam_name = (_fname[:-5] + 'bam').replace('/models/', '/bam/', 1)
+ gltf_name = (_fname[:-5] + 'gltf').replace('/blend/', '/gltf/', 1)
+ bam_name = (_fname[:-5] + 'bam').replace('/blend/', '/bam/', 1)
cmd_args = gltf_name, bam_name
# use dds files in place of png/jpg in gltf2bam
copyfile(gltf_name, gltf_name + '.tmp')
if ('.png' in line or '.jpg' in line) and '"uri"' in line:
rln = line[line.index('"uri"') + 9:].rstrip(',\n"')
tname = '%s/%s' % (root, rln)
- deps += [tname.replace('/models/', '/gltf/', 1)]
+ deps += [tname.replace('/models/blend/', '/models/gltf/', 1)]
for dep in deps:
tgt = dep.replace('/gltf/', '/bam/', 1)
tgt = tgt.replace('.png', '.dds').replace('.jpg', '.dds')
makedirs(dirname(tgt), exist_ok=True)
info('convert %s %s' % (dep, tgt))
system('convert %s %s' % (dep, tgt))
- rpl = lambda lin: lin.replace('.png', '.dds').replace('.jpg', '.dds')
+ rpl = lambda lin: lin.replace('.png', '.dds').replace('.jpg', '.dds').replace('/png', '/dds').replace('/jpg', '/dds')
with open(gltf_name, 'w') as fgltf:
fgltf.write(''.join([rpl(line) for line in lines]))
makedirs(dirname(bam_name), exist_ok=True)
import argparse
import simplepbr
-import gltf
+#import gltf
from glob import glob
from importlib import import_module
from inspect import isclass
props.set_icon_filename('assets/icon/pmachines.ico')
if not args.screenshot:
base.win.request_properties(props)
- gltf.patch_loader(base.loader)
+ #gltf.patch_loader(base.loader)
if self._options['development']['simplepbr']:
self._pipeline = simplepbr.init(
use_normal_maps=True,
start_size, end_size = 5, 2.5
offset = 5
for col, row in product(range(ncols), range(nrows)):
- model = loader.load_model('assets/gltf/background/background.gltf')
+ model = loader.load_model('assets/models/bam/background/background.bam')
model.set_scale(end_size / start_size)
model.reparent_to(self._root)
total_width, total_height = end_size * ncols, end_size * nrows
class Basketball(Item):
def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.92, friction=.6):
- super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/basketball/basketball.gltf', .4, mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
+ super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/models/bam/basketball/basketball.bam', .4, mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
def _set_shape(self, apply_scale=True):
self.node.add_shape(BulletSphereShape(1))
class Box(Item):
def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.8, model_scale=1):
- super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/box/box.gltf', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction, model_scale=model_scale)
+ super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/models/bam/box/box.bam', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction, model_scale=model_scale)
def _set_shape(self, apply_scale=True):
self.node.add_shape(BulletBoxShape((.5, .5, .5)))
class Domino(Item):
def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.6):
- super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/domino/domino.gltf', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
+ super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/models/bam/domino/domino.bam', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
def _set_shape(self, apply_scale=True):
self.node.add_shape(BulletBoxShape((.1, .25, .5)))
class Shelf(Item):
def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.6):
- super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/shelf/shelf.gltf', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
+ super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/models/bam/shelf/shelf.bam', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
def _set_shape(self, apply_scale=True):
self.node.add_shape(BulletBoxShape((1, .5, .05)))
class TeeterTooter(Item):
def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.5):
- super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/teeter_tooter/teeter_tooter.gltf', exp_num_contacts=2, mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction, model_scale=.5)
+ super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/models/bam/teeter_tooter/teeter_tooter.bam', exp_num_contacts=2, mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction, model_scale=.5)
def _set_shape(self, apply_scale=True):
scale = self._model_scale if apply_scale else 1
self._music = music
self._pipeline = pipeline
self._cursor = MouseCursor(
- 'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+ 'assets/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
(.01, .01))
self._font = base.loader.load_font('assets/fonts/Hanken-Book.ttf')
self._font.clear()
scenes = sorted(scenes, key=lambda elm: elm.sorting)
self.destroy()
self._cursor = MouseCursor(
- 'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+ 'assets/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
(.01, .01))
self._widgets = []
cmn = self._common_btn.copy() | {
'text_scale': .64}
left = - (dx := .8) * (min(4, len(scenes)) - 1) / 2
for i, cls in enumerate(scenes):
- print(i, cls)
top = .1 if len(scenes) < 5 else .6
row = 0 if i < 4 else 1
self._widgets += [DirectButton(
text=cls.name(), pos=(left + dx * (i % 4), 1, top - dx * row),
command=self.start, extraArgs=[cls], text_wordwrap=6,
- frameTexture='assets/images/scenes/%s.png' % cls.__name__,
+ frameTexture='assets/images/scenes/%s.dds' % cls.__name__,
**cmn)]
for j in range(4):
tnode = self._widgets[-1].component('text%s' % j).textNode
def on_options(self):
self.destroy()
self._cursor = MouseCursor(
- 'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+ 'assets/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
(.01, .01))
self._set_options()
def on_credits(self):
self.destroy()
self._cursor = MouseCursor(
- 'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+ 'assets/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
(.01, .01))
self._set_credits()
self._opt_file.store()
self.destroy()
self._cursor = MouseCursor(
- 'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+ 'assets/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
(.01, .01))
self._set_main()
self._reload_cb = reload_cb
self._set_camera()
self._cursor = MouseCursor(
- 'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+ 'assets/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
(.01, .01))
self._set_gui()
self._set_lights()
base.camera.look_at(0, 0, 0)
def __load_img_btn(self, path, col):
- img = OnscreenImage('assets/buttons/%s.png' % path)
+ img = OnscreenImage('assets/buttons/%s.dds' % path)
img.set_transparency(True)
img.set_color(col)
img.detach_node()
getattr(item, method)(pos)
img = 'move' if method == 'on_click_l' else 'rotate'
if not (img == 'rotate' and not item._instantiated):
- self._cursor.set_image('assets/buttons/%s.png' % img)
+ self._cursor.set_image('assets/buttons/%s.dds' % img)
def on_click_l(self):
self._on_click('on_click_l')
self.__next_btn['frameColor'] = fcols[1]
self._item_active = None
[item.on_release() for item in self.items]
- self._cursor.set_image('assets/buttons/arrowUpLeft.png')
+ self._cursor.set_image('assets/buttons/arrowUpLeft.dds')
def repos(self):
for item in self.items:
self.__store_state()
mgr = TextPropertiesManager.get_global_ptr()
for name in ['mouse_l', 'mouse_r']:
- graphic = OnscreenImage('assets/buttons/%s.png' % name)
+ graphic = OnscreenImage('assets/buttons/%s.dds' % name)
graphic.set_scale(.5)
graphic.get_texture().set_minfilter(Texture.FTLinearMipmapLinear)
graphic.get_texture().set_anisotropic_degree(2)
* issues
* todo
-** use dds files in place of png/jpg
-** use bam files
+** assets/buttons/ -> assets/images/buttons/
+** assets/icon/ -> assets/images/icon/
+** assets/po/ assets/locale/po/
+** create models (python setup.py models) with multiprocessing pool
** refactoring
** build pipeline
** version 0.0.yymmdd
'exclude_patterns': [
'build/*', 'built/*', 'setup.py', 'requirements.txt',
'venv/*', '.git*', '*.pyc', 'options.ini', '__pycache__',
- 'assets/gltf/*', 'assets/models/**/*.blend',
+ 'assets/models/gltf/*', 'assets/models/**/*.blend',
'assets/models/**/models/*.png',
'assets/models/**/models/*.jpg'],
'log_filename_strftime': True,