collada: add main frontend

This commit is contained in:
Zack Buhman 2026-01-25 23:31:14 -06:00
parent fec67091a1
commit 67820fce2b
3 changed files with 51 additions and 10 deletions

View File

@ -1,5 +1,7 @@
import io import io
line_ending = "\r\n"
def should_autonewline(line): def should_autonewline(line):
return ( return (
"static_assert" not in line "static_assert" not in line
@ -20,9 +22,9 @@ def _render(out, lines):
level = 0 level = 0
if len(l) == 0: if len(l) == 0:
out.write("\n") out.write(line_ending)
else: else:
out.write(indent * level + l + "\n") out.write(indent * level + l + line_ending)
if l and (l[-1] == "{" or l[-1] == "("): if l and (l[-1] == "{" or l[-1] == "("):
if l.startswith("namespace"): if l.startswith("namespace"):
@ -32,7 +34,7 @@ def _render(out, lines):
if level == 0 and l and l[-1] == ";": if level == 0 and l and l[-1] == ";":
if should_autonewline(l): if should_autonewline(l):
out.write("\n") out.write(line_ending)
return out return out
def renderer(): def renderer():

View File

@ -424,6 +424,16 @@ def render_library_materials(state, collada):
yield f".effect = &effect_{effect_name}," yield f".effect = &effect_{effect_name},"
yield "};" yield "};"
def render_all(collada):
state = State()
render, out = renderer()
render(render_header())
render(render_library_effects(state, collada))
render(render_library_materials(state, collada))
render(render_library_geometries(state, collada))
render(render_library_visual_scenes(state, collada))
return state, out
if __name__ == "__main__": if __name__ == "__main__":
import sys import sys
collada = parse.parse_collada_file(sys.argv[1]) collada = parse.parse_collada_file(sys.argv[1])
@ -432,11 +442,5 @@ if __name__ == "__main__":
#assert type(skin) is types.Skin #assert type(skin) is types.Skin
#foo = render_inverse_bind_matrix(collada, skin) #foo = render_inverse_bind_matrix(collada, skin)
state = State() state, out = render_all(collada)
render, out = renderer()
render(render_header())
render(render_library_effects(state, collada))
render(render_library_materials(state, collada))
render(render_library_geometries(state, collada))
render(render_library_visual_scenes(state, collada))
print(out.getvalue()) print(out.getvalue())

35
collada/main.py Normal file
View File

@ -0,0 +1,35 @@
import sys
from collada import parse
from collada import header
def usage():
name = sys.argv[0]
print("usage:")
print(f" {name} [input_collada.dae] [output_header.hpp] [output_binary.bin]")
sys.exit(1)
def main():
try:
input_collada = sys.argv[1]
output_header = sys.argv[2]
output_binary = sys.argv[3]
assert input_collada.lower().endswith(".dae")
assert output_header.lower().endswith(".hpp")
assert output_binary.lower().endswith(".bin")
except:
usage()
collada = parse.parse_collada_file(input_collada)
state, out = header.render_all(collada)
with open(output_header, 'wb') as f:
header_buf = out.getvalue()
assert "\r\n" in header_buf
f.write(header_buf.encode('utf-8'))
with open(output_binary, 'wb') as f:
f.write(state.buf.getvalue())
if __name__ == "__main__":
main()