mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-14 17:18:08 -05:00
90 lines
2.0 KiB
Python
Executable File
90 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import sys
|
|
|
|
class Obj:
|
|
|
|
def __init__(self, name):
|
|
self.name = name
|
|
self.v = []
|
|
self.f = []
|
|
|
|
def push_vert(self, args):
|
|
assert len(args) == 3
|
|
(x, y, z) = [float(v) for v in args]
|
|
assert y == 0
|
|
vert = (x, z)
|
|
self.v.append(vert)
|
|
|
|
def push_face(self, args):
|
|
idxs = [arg.split("/")[0] for arg in args]
|
|
assert len(idxs) == 3
|
|
idxs = [int(idx) - 1 for idx in idxs]
|
|
for idx in idxs:
|
|
assert idx < len(self.v)
|
|
self.f.extend(idxs)
|
|
|
|
def parse_obj(fname):
|
|
objs = []
|
|
obj = None
|
|
|
|
for line in open(fname):
|
|
line = line.rstrip("\n")
|
|
if line[0] == '#':
|
|
continue
|
|
|
|
line = line.split(" ")
|
|
cmd = line[0]
|
|
args = line[1:]
|
|
|
|
match cmd:
|
|
case 'o':
|
|
if obj is not None:
|
|
objs.append(obj)
|
|
name = args[0]
|
|
#print(f"New object {name}")
|
|
obj = Obj(name)
|
|
continue
|
|
case 'v':
|
|
obj.push_vert(args)
|
|
case 'f':
|
|
obj.push_face(args)
|
|
|
|
case _:
|
|
#print(f"Skipping {cmd}: {args}")
|
|
pass
|
|
|
|
if obj is not None:
|
|
objs.append(obj)
|
|
return objs
|
|
|
|
def output(obj):
|
|
name = obj.name
|
|
print("use crate::{mesh::Color, ui::{VectorShape, ShapeVertex}};")
|
|
print(f"pub fn create_{name}(color: Color) -> VectorShape {{")
|
|
print(" VectorShape {")
|
|
print(" verts: vec![")
|
|
for (x, y) in obj.v:
|
|
print(f" ShapeVertex::from_xy({x}, {y}, color),")
|
|
print(" ],")
|
|
indices = ", ".join([str(f) for f in obj.f])
|
|
print(f" indices: vec![{indices}]")
|
|
print(" }")
|
|
print("}")
|
|
|
|
def main(argv):
|
|
if len(argv) != 2:
|
|
print("obj_to_rust OBJFILE", file=sys.stderr)
|
|
return -1
|
|
|
|
objs = parse_obj(argv[1])
|
|
|
|
for obj in objs:
|
|
output(obj)
|
|
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main(sys.argv))
|
|
|