Compare commits

..

No commits in common. "70b46b0dd882f44309354a64a4dd19deacaca7de" and "6c0bb1fe12cc7dec9b37a2ecf50d2bca7ce691e1" have entirely different histories.

3 changed files with 44 additions and 61 deletions

View File

@ -1,5 +1,4 @@
from itertools import islice
import os.path
from collada import types
@ -244,9 +243,9 @@ def render_descriptor(namespace):
yield ".images = images,"
yield ".images_count = (sizeof (images)) / (sizeof (images[0])),"
yield ""
yield f'.position_normal_texture_buffer = "data/scenes/{namespace}/scene.vtx",'
yield f'.joint_weight_buffer = "data/scenes/{namespace}/scene.vjw",'
yield f'.index_buffer = "data/scenes/{namespace}/scene.idx",'
yield f'.position_normal_texture_buffer = "data/scenes/{namespace}/{namespace}.vtx",'
yield f'.joint_weight_buffer = "data/scenes/{namespace}/{namespace}.vjw",'
yield f'.index_buffer = "data/scenes/{namespace}/{namespace}.idx",'
yield "};"
def render_prelude(namespace):
@ -306,19 +305,10 @@ def render_light(light_name, light_type, color):
yield f".color = {render_float_tuple(color)},"
yield "};"
def render_image(namespace, image_id, image_name, resource_name, uri):
def render_image(image_id, image_name, resource_name, uri):
yield f"// {image_id}"
yield f"image const image_{image_name} = {{"
# hacky
if uri.startswith("./"):
uri = uri.removeprefix("./")
if uri.endswith(".png"):
uri = uri.removesuffix(".png")
uri = uri + ".dds"
else:
assert False, uri
uri = os.path.join('data', 'scenes', namespace, uri)
yield f'.uri = "{uri}"'
yield f'.uri = "{uri}",'
yield "};"
def render_library_images(image_names):

View File

@ -9,7 +9,7 @@ from io import BytesIO
import os.path
import struct
from collada.util import find_semantics
from collada.util import matrix_transpose, find_semantics
from collada import parse
from collada import types
from collada.generate import renderer
@ -106,7 +106,7 @@ def sanitize_name(state, name, value, *, allow_slash=False):
if not allow_slash:
assert '/' not in name, name
c_id = _sanitize(name).lower()
assert c_id not in state.symbol_names or state.symbol_names[c_id] is value, c_id
assert c_id not in state.symbol_names or state.symbol_names[c_id] is value
state.symbol_names[c_id] = value
return c_id
@ -132,14 +132,13 @@ def input_elements_key_name(key):
return "_".join(map(str, chain.from_iterable(key))).lower()
def render_input_elements(state, collada, geometry_name, offset_tables):
for offset_table in offset_tables:
for i, offset_table in enumerate(offset_tables):
key = tuple(offset_table_key(offset_table))
key_name = input_elements_key_name(key)
if key_name in state.emitted_input_elements_arrays:
assert state.emitted_input_elements_arrays[key_name][1] == key
continue
index = len(state.emitted_input_elements_arrays)
state.emitted_input_elements_arrays[key_name] = (index, key)
state.emitted_input_elements_arrays[key_name] = (i, key)
yield from lang_header.render_input_elements(key_name, key)
@ -209,7 +208,7 @@ def render_node_transforms(state, collada, node_name, transformation_elements):
if type(transform) is types.Lookat:
yield from lang_header.render_transform_lookat(transform.eye, transform.at, transform.up)
elif type(transform) is types.Matrix:
yield from lang_header.render_transform_matrix(transform.values)
yield from lang_header.render_transform_matrix(matrix_transpose(transform.values))
elif type(transform) is types.Rotate:
yield from lang_header.render_transform_rotate(transform.rotate)
elif type(transform) is types.Scale:
@ -307,16 +306,10 @@ def render_node_instance_geometries(state, collada, node_name, instance_geometri
yield from lang_header.render_node_instance_geometries(node_name, items())
def get_node_name_id(state, node, node_index, use_id=True, name_prefix="node-"):
if use_id and node.id is not None:
return node.id
elif node.name is not None:
return f"{name_prefix}{node.name}"
else:
parent_index = state.node_parents[node_index]
parent = state.linearized_nodes[parent_index]
parent_name = get_node_name_id(state, parent, parent_index)
return f"{parent_name}-{node_index}"
def get_node_name_id(node):
name = node.id if node.id is not None else f"node-{node.name}"
assert name is not None, node
return name
#def render_node_children(state, collada, node_name, nodes):
# yield f"node const * const node_children_{node_name}[] = {{"
@ -378,7 +371,7 @@ def render_joint_node_indices(state, collada, skin, node_name, controller_name,
assert joint_node is not None, (node_sid, skeleton_node.sid_lookup)
joint_node_index = find_node_index(state, joint_node)
joint_node_name_id = get_node_name_id(state, joint_node, joint_node_index)
joint_node_name_id = get_node_name_id(joint_node)
joint_node_name = sanitize_name(state, joint_node_name_id, joint_node)
yield joint_node_index, node_sid, joint_node_name
@ -417,7 +410,7 @@ def render_node_instance_controllers(state, collada, node_name, instance_control
yield from lang_header.render_node_instance_controllers(node_name, items())
def render_node(state, collada, node, node_index):
node_name_id = get_node_name_id(state, node, node_index)
node_name_id = get_node_name_id(node)
node_name = sanitize_name(state, node_name_id, node)
#yield from render_node_children(state, collada, node_name, node.nodes)
yield from render_node_transforms(state, collada, node_name, node.transformation_elements)
@ -438,10 +431,8 @@ def render_node(state, collada, node, node_index):
instance_lights_count = len(node.instance_lights)
channels_count = len(state.node_animation_channels[node.id])
name = get_node_name_id(state, node, node_index, use_id=False, name_prefix="")
yield from lang_header.render_node(node_name,
name,
node.name,
parent_index, type,
transforms_count,
instance_geometries_count,
@ -472,7 +463,7 @@ def render_library_visual_scenes(state, collada):
def items():
for node_index, node in enumerate(state.linearized_nodes):
node_name_id = get_node_name_id(state, node, node_index)
node_name_id = get_node_name_id(node)
node_name = sanitize_name(state, node_name_id, node)
yield node_name, node_index
@ -596,7 +587,7 @@ def render_library_materials(state, collada):
def render_input_elements_list(state):
def items():
for key_name, (index, key) in sorted(state.emitted_input_elements_arrays.items(), key=lambda k_v: k_v[1][0]):
for key_name, (index, key) in state.emitted_input_elements_arrays.items():
elements_count = len(key)
yield key_name, elements_count
yield from lang_header.render_input_elements_list(items())
@ -716,8 +707,7 @@ def render_channel(state, collada, channel):
assert target_attribute in target_attributes
node = collada.lookup(f"#{node_id}", types.Node)
node_index = find_node_index(state, node)
node_name_id = get_node_name_id(state, node, node_index)
node_name_id = get_node_name_id(node)
node_name = sanitize_name(state, node_name_id, node)
transform = transform_sid_lookup(node, node_transform_sid)
@ -800,7 +790,7 @@ def image_resource_name(state, uri):
state.image_paths[filename] = path
return sanitize_resource_name(state, filename, path)
def render_image(namespace, state, collada, image, image_index):
def render_image(state, collada, image, image_index):
assert image.id is not None
assert image.id not in state.image_indices
state.image_indices[image.id] = image_index
@ -809,13 +799,13 @@ def render_image(namespace, state, collada, image, image_index):
resource_name = image_resource_name(state, image.image_source.uri)
image_name = sanitize_name(state, image.id, image)
yield from lang_header.render_image(namespace, image.id, image_name, resource_name, image.image_source.uri)
yield from lang_header.render_image(image.id, image_name, resource_name, image.image_source.uri)
def render_library_images(namespace, state, collada):
def render_library_images(state, collada):
image_index = 0
for library_images in collada.library_images:
for image in library_images.images:
yield from render_image(namespace, state, collada, image, image_index)
yield from render_image(state, collada, image, image_index)
image_index += 1
def image_names():
@ -839,7 +829,7 @@ def render_inverse_bind_matrices(collada, skin, controller_name):
def matrices():
for i in range(count):
offset = stride * i
matrix = array.floats[offset:offset+stride]
matrix = matrix_transpose(array.floats[offset:offset+stride])
yield matrix
yield from lang_header.render_inverse_bind_matrices(controller_name, matrices())
@ -870,7 +860,7 @@ def render_controller(state, collada, controller):
vertex_buffer_size = state.joint_weight_vertex_buffer.tell() - vertex_buffer_offset
yield from render_inverse_bind_matrices(collada, skin, controller_name)
bind_shape_matrix = skin.bind_shape_matrix.values
bind_shape_matrix = matrix_transpose(skin.bind_shape_matrix.values)
yield from lang_header.render_controller(controller_name, geometry_name, bind_shape_matrix, vertex_buffer_offset, vertex_buffer_size)
def render_library_controllers(state, collada):
@ -907,7 +897,7 @@ def render_all(collada, namespace, input_filename):
render(render_library_cameras(state, collada))
render(render_library_lights(state, collada))
render(render_library_animations(state, collada))
render(render_library_images(namespace, state, collada))
render(render_library_images(state, collada))
render(render_library_effects(state, collada))
render(render_library_materials(state, collada))
render(render_library_geometries(state, collada))

View File

@ -9,12 +9,15 @@ from collada import lua_header
def usage():
name = sys.argv[0]
print("usage (source):")
print(f" {name} [namespace] [input_collada.dae] [output_source.cpp] [output_position_normal_texture.vtx] [output_joint_weight.vjw] [output_index.idx]") # [output_resource.rc] [output_makefile.mk]
print()
print(f" {name} [input_collada.dae] [output_source.cpp] [output_position_normal_texture.vtx] [output_joint_weight.vjw] [output_index.idx]") # [output_resource.rc] [output_makefile.mk]
print("usage (header):")
print(f" {name} [namespace] [output_header.h]")
print(f" {name} [output_header.h]")
sys.exit(1)
def parse_namespace(filename):
namespace = os.path.splitext(os.path.split(filename)[1])[0]
return namespace.replace("-", "_")
def render_resource_file(state, namespace, output_vtx, output_vjw, output_idx, f):
f.write(f'RES_SCENES_{namespace.upper()}_VTX RCDATA "{output_vtx}"\n'.encode('ascii'))
f.write(f'RES_SCENES_{namespace.upper()}_VJW RCDATA "{output_vjw}"\n'.encode('ascii'))
@ -51,14 +54,13 @@ def render_makefile(state, f):
def main():
try:
namespace = sys.argv[1]
input_collada = sys.argv[2]
output_source = sys.argv[3]
output_position_normal_texture = sys.argv[4]
output_joint_weight = sys.argv[5]
output_index = sys.argv[6]
#output_resource = sys.argv[7]
#output_makefile = sys.argv[8]
input_collada = sys.argv[1]
output_source = sys.argv[2]
output_position_normal_texture = sys.argv[3]
output_joint_weight = sys.argv[4]
output_index = sys.argv[5]
#output_resource = sys.argv[6]
#output_makefile = sys.argv[7]
assert input_collada.lower().endswith(".dae")
assert output_source.lower().endswith(".cpp") or output_source.lower().endswith(".lua")
assert output_position_normal_texture.lower().endswith(".vtx")
@ -70,6 +72,7 @@ def main():
usage()
collada = parse.parse_collada_file(input_collada)
namespace = parse_namespace(input_collada)
if output_source.lower().endswith(".cpp"):
header.lang_header = cpp_header
@ -101,14 +104,14 @@ def main():
def main_header():
try:
namespace = sys.argv[1]
output_header = sys.argv[2]
output_header = sys.argv[1]
assert output_header.lower().endswith(".h")
except Exception as e:
usage()
header.lang_header = cpp_header
namespace = parse_namespace(output_header)
out_header = header.render_all_hpp(namespace)
with open(output_header, 'wb') as f:
@ -117,7 +120,7 @@ def main_header():
f.write(header_buf.encode('utf-8'))
if __name__ == "__main__":
if len(sys.argv) == 3:
if len(sys.argv) == 2:
main_header()
else:
main()