Add game source, converter pipeline, and web port
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Convert Ogre3D .mesh.xml to Three.js geometry modules."""
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
def parse_mesh_xml(filepath):
|
||||
tree = ET.parse(filepath)
|
||||
root = tree.getroot()
|
||||
|
||||
sharedgeom = root.find('sharedgeometry')
|
||||
vertices = []
|
||||
if sharedgeom is not None:
|
||||
for vb in sharedgeom.findall('vertexbuffer'):
|
||||
for vertex in vb.findall('vertex'):
|
||||
pos = vertex.find('position')
|
||||
normal = vertex.find('normal')
|
||||
v = {}
|
||||
if pos is not None:
|
||||
v['x'] = float(pos.get('x', 0))
|
||||
v['y'] = float(pos.get('y', 0))
|
||||
v['z'] = float(pos.get('z', 0))
|
||||
if normal is not None:
|
||||
v['nx'] = float(normal.get('x', 0))
|
||||
v['ny'] = float(normal.get('y', 0))
|
||||
v['nz'] = float(normal.get('z', 0))
|
||||
vertices.append(v)
|
||||
|
||||
faces = []
|
||||
for submeshes in root.findall('submeshes'):
|
||||
for submesh in submeshes.findall('submesh'):
|
||||
for faces_elem in submesh.findall('faces'):
|
||||
for face in faces_elem.findall('face'):
|
||||
v1 = int(face.get('v1', 0))
|
||||
v2 = int(face.get('v2', 0))
|
||||
v3 = int(face.get('v3', 0))
|
||||
faces.append((v1, v2, v3))
|
||||
|
||||
return vertices, faces
|
||||
|
||||
|
||||
def main():
|
||||
base_dir = '/var/home/nico/Gamedev/Wackelpeter/extracted/Models'
|
||||
output_dir = '/var/home/nico/Gamedev/Wackelpeter/web/public/models'
|
||||
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
for model_name in ['blob/Blob', 'sword/sword', 'shield/shield']:
|
||||
filepath = os.path.join(base_dir, f'{model_name}.mesh.xml')
|
||||
if not os.path.exists(filepath):
|
||||
print(f'Skipping {filepath} - not found')
|
||||
continue
|
||||
|
||||
print(f'Converting {model_name}...')
|
||||
vertices, faces = parse_mesh_xml(filepath)
|
||||
|
||||
positions = []
|
||||
normals = []
|
||||
indices = []
|
||||
|
||||
for v in vertices:
|
||||
positions.extend([v.get('x', 0), v.get('y', 0), v.get('z', 0)])
|
||||
normals.extend([v.get('nx', 0), v.get('ny', 0), v.get('nz', 0)])
|
||||
|
||||
for f in faces:
|
||||
indices.extend(list(f))
|
||||
|
||||
model_data = {
|
||||
'positions': positions,
|
||||
'normals': normals,
|
||||
'indices': indices,
|
||||
'vertexCount': len(vertices),
|
||||
'faceCount': len(faces),
|
||||
}
|
||||
|
||||
name = os.path.basename(model_name).lower()
|
||||
outpath = os.path.join(output_dir, f'{name}.json')
|
||||
with open(outpath, 'w') as f:
|
||||
json.dump(model_data, f)
|
||||
|
||||
print(f' -> {outpath} ({len(vertices)} vertices, {len(faces)} faces)')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user