|
@@ -0,0 +1,129 @@
|
|
|
+import os
|
|
|
+import json
|
|
|
+import stat
|
|
|
+import shutil
|
|
|
+import argparse
|
|
|
+
|
|
|
+
|
|
|
+os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
|
|
+os.chdir('..')
|
|
|
+review = os.path.join(os.getcwd(), 'review')
|
|
|
+
|
|
|
+MASK = stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH
|
|
|
+
|
|
|
+HTML = '''<!doctype html>
|
|
|
+<html>
|
|
|
+ <head>
|
|
|
+ <title>%(title)s</title>
|
|
|
+ <meta charset='utf-8'>
|
|
|
+ <meta name='review' content='width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0'>
|
|
|
+ <script src='../scripts/three.js'></script>
|
|
|
+ <script src='../scripts/OrbitControls.js'></script>
|
|
|
+ <script src='../../../js/threeio.js'></script>
|
|
|
+ <script src='../scripts/review.js'></script>
|
|
|
+ <link href='../scripts/style.css' rel='stylesheet' />
|
|
|
+ </head>
|
|
|
+ <body>
|
|
|
+ <script>
|
|
|
+ init('%(filename)s');
|
|
|
+ </script>
|
|
|
+ </body>
|
|
|
+</html>
|
|
|
+'''
|
|
|
+
|
|
|
+def parse_args():
|
|
|
+ parser = argparse.ArgumentParser()
|
|
|
+ parser.add_argument('json')
|
|
|
+ parser.add_argument('-t', '--tag', required=True)
|
|
|
+ return vars(parser.parse_args())
|
|
|
+
|
|
|
+
|
|
|
+def copy_for_review(tmp_json, tag):
|
|
|
+ tag_dir = os.path.join(review, tag)
|
|
|
+ if not os.path.exists(tag_dir):
|
|
|
+ print('making %s' % tag_dir)
|
|
|
+ os.makedirs(tag_dir)
|
|
|
+ dst_json = os.path.join(tag_dir, '%s.json' % tag)
|
|
|
+ print('moving %s > %s' % (tmp_json, dst_json))
|
|
|
+ shutil.move(tmp_json, dst_json)
|
|
|
+ create_template(tag_dir, os.path.basename(dst_json))
|
|
|
+
|
|
|
+ print('looking for maps...')
|
|
|
+ with open(dst_json) as stream:
|
|
|
+ data = json.load(stream)
|
|
|
+
|
|
|
+ textures = []
|
|
|
+ materials = data.get('materials')
|
|
|
+ if data['metadata']['type'] == 'Geometry' and materials:
|
|
|
+ textures.extend(_parse_geometry_materials(materials))
|
|
|
+
|
|
|
+ images = data.get('images')
|
|
|
+ if data['metadata']['type'] == 'Object' and images:
|
|
|
+ for each in images:
|
|
|
+ textures.append(each['url'])
|
|
|
+
|
|
|
+ textures = list(set(textures))
|
|
|
+ print('found %d maps' % len(textures))
|
|
|
+ dir_tmp = os.path.dirname(tmp_json)
|
|
|
+ for texture in textures:
|
|
|
+ texture = os.path.join(dir_tmp, texture)
|
|
|
+ dst = os.path.join(tag_dir, os.path.basename(texture))
|
|
|
+ shutil.move(texture, dst)
|
|
|
+ print('moving %s > %s' % (texture, dst))
|
|
|
+
|
|
|
+ if data['metadata']['type'] == 'Object':
|
|
|
+ print('looking for non-embedded geometry')
|
|
|
+ for geometry in data['geometries']:
|
|
|
+ url = geometry.get('url')
|
|
|
+ if not url: continue
|
|
|
+ src = os.path.join(dir_tmp, url)
|
|
|
+ dst = os.path.join(tag_dir, url)
|
|
|
+ print('moving %s > %s' % (src, dst))
|
|
|
+ shutil.move(src, dst)
|
|
|
+ elif data['metadata']['type'] == 'Geometry':
|
|
|
+ print('looking for external animation files')
|
|
|
+ for key in ('animation', 'morphTargets'):
|
|
|
+ try:
|
|
|
+ value = data[key]
|
|
|
+ except KeyError:
|
|
|
+ continue
|
|
|
+
|
|
|
+ if not isinstance(value, str):
|
|
|
+ continue
|
|
|
+
|
|
|
+ src = os.path.join(dir_tmp, value)
|
|
|
+ dst = os.path.join(tag_dir, value)
|
|
|
+ print('moving %s > %s' % (src, dst))
|
|
|
+ shutil.move(src, dst)
|
|
|
+
|
|
|
+
|
|
|
+def _parse_geometry_materials(materials):
|
|
|
+ maps = ('mapDiffuse', 'mapSpecular', 'mapBump',
|
|
|
+ 'mapLight', 'mapNormal')
|
|
|
+ textures = []
|
|
|
+ for material in materials:
|
|
|
+ for key in material.keys():
|
|
|
+ if key in maps:
|
|
|
+ textures.append(material[key])
|
|
|
+ return textures
|
|
|
+
|
|
|
+
|
|
|
+def create_template(tag_dir, filename):
|
|
|
+ html = HTML % {
|
|
|
+ 'title': filename[:-5].title(),
|
|
|
+ 'filename': filename
|
|
|
+ }
|
|
|
+
|
|
|
+ html_path = os.path.join(tag_dir, 'index.html')
|
|
|
+ with open(html_path, 'w') as stream:
|
|
|
+ stream.write(html)
|
|
|
+ os.chmod(html_path, MASK)
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ args = parse_args()
|
|
|
+ copy_for_review(args['json'], args['tag'])
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|