Skip to content

Commit

Permalink
Complete H2 lightmap parser/writer
Browse files Browse the repository at this point in the history
  • Loading branch information
Steven Garcia committed Oct 21, 2024
1 parent 6684ea1 commit 143968b
Show file tree
Hide file tree
Showing 3 changed files with 221 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,198 @@ def write_lightmap_groups(output_stream, LIGHTMAP, TAG):
for section_offset in scenery_object_bucket_ref.section_offsets:
output_stream.write(struct.pack('<h', section_offset))

def write_errors(output_stream, SCENARIO, TAG):
print("TODO")
def write_errors(output_stream, LIGHTMAP, TAG):
if len(LIGHTMAP.errors) > 0:
LIGHTMAP.errors_header.write(output_stream, TAG, True)
for error in LIGHTMAP.errors:
output_stream.write(struct.pack('<255sx', tag_format.string_to_bytes(error.name, False)))
output_stream.write(struct.pack('<H', error.report_type))
output_stream.write(struct.pack('<H', error.flags))
output_stream.write(struct.pack('<408x'))
error.reports_tag_block.write(output_stream, False)

for error in LIGHTMAP.errors:
if len(error.reports) > 0:
error.reports_header.write(output_stream, TAG, True)
for report in error.reports:
output_stream.write(struct.pack('<H', report.type))
output_stream.write(struct.pack('<H', report.flags))
output_stream.write(struct.pack('<h', report.report_length))
output_stream.write(struct.pack('<18x'))
output_stream.write(struct.pack('<31sx', tag_format.string_to_bytes(report.source_filename, False)))
output_stream.write(struct.pack('<i', report.source_line_number))
report.vertices_tag_block.write(output_stream, False)
report.vectors_tag_block.write(output_stream, False)
report.lines_tag_block.write(output_stream, False)
report.triangles_tag_block.write(output_stream, False)
report.quads_tag_block.write(output_stream, False)
report.comments_tag_block.write(output_stream, False)
output_stream.write(struct.pack('<380x'))
output_stream.write(struct.pack('<i', report.report_key))
output_stream.write(struct.pack('<i', report.node_index))
output_stream.write(struct.pack('<ff', *report.bounds_x))
output_stream.write(struct.pack('<ff', *report.bounds_y))
output_stream.write(struct.pack('<ff', *report.bounds_z))
R, G, B, A = report.color
output_stream.write(struct.pack('<ffff', A, R, G, B))
output_stream.write(struct.pack('<84x'))

for report in error.reports:
if report.report_length > 0:
output_stream.write(struct.pack('<%ssx' % (len(report.text)), tag_format.string_to_bytes(report.text, False)))

if len(report.vertices) > 0:
report.vertices_header.write(output_stream, TAG, True)
for vertex in report.vertices:
output_stream.write(struct.pack('<fff', *vertex.position))
output_stream.write(struct.pack('<b', vertex.node_index_0))
output_stream.write(struct.pack('<b', vertex.node_index_1))
output_stream.write(struct.pack('<b', vertex.node_index_2))
output_stream.write(struct.pack('<b', vertex.node_index_3))
output_stream.write(struct.pack('<f', vertex.node_weight_0))
output_stream.write(struct.pack('<f', vertex.node_weight_1))
output_stream.write(struct.pack('<f', vertex.node_weight_2))
output_stream.write(struct.pack('<f', vertex.node_weight_3))
R, G, B, A = vertex.color
output_stream.write(struct.pack('<ffff', A, R, G, B))
output_stream.write(struct.pack('<f', vertex.screen_size))

if len(report.vectors) > 0:
report.vectors_header.write(output_stream, TAG, True)
for vector in report.vectors:
output_stream.write(struct.pack('<fff', *vector.position))
output_stream.write(struct.pack('<b', vector.node_index_0))
output_stream.write(struct.pack('<b', vector.node_index_1))
output_stream.write(struct.pack('<b', vector.node_index_2))
output_stream.write(struct.pack('<b', vector.node_index_3))
output_stream.write(struct.pack('<f', vector.node_weight_0))
output_stream.write(struct.pack('<f', vector.node_weight_1))
output_stream.write(struct.pack('<f', vector.node_weight_2))
output_stream.write(struct.pack('<f', vector.node_weight_3))
R, G, B, A = vector.color
output_stream.write(struct.pack('<ffff', A, R, G, B))
output_stream.write(struct.pack('<fff', *vector.normal))
output_stream.write(struct.pack('<f', vector.screen_length))

if len(report.lines) > 0:
report.lines_header.write(output_stream, TAG, True)
for line in report.lines:
output_stream.write(struct.pack('<fff', *line.position_a))
output_stream.write(struct.pack('<b', line.node_index_a_0))
output_stream.write(struct.pack('<b', line.node_index_a_1))
output_stream.write(struct.pack('<b', line.node_index_a_2))
output_stream.write(struct.pack('<b', line.node_index_a_3))
output_stream.write(struct.pack('<f', line.node_weight_a_0))
output_stream.write(struct.pack('<f', line.node_weight_a_1))
output_stream.write(struct.pack('<f', line.node_weight_a_2))
output_stream.write(struct.pack('<f', line.node_weight_a_3))
output_stream.write(struct.pack('<fff', *line.position_b))
output_stream.write(struct.pack('<b', line.node_index_b_0))
output_stream.write(struct.pack('<b', line.node_index_b_1))
output_stream.write(struct.pack('<b', line.node_index_b_2))
output_stream.write(struct.pack('<b', line.node_index_b_3))
output_stream.write(struct.pack('<f', line.node_weight_b_0))
output_stream.write(struct.pack('<f', line.node_weight_b_1))
output_stream.write(struct.pack('<f', line.node_weight_b_2))
output_stream.write(struct.pack('<f', line.node_weight_b_3))
R, G, B, A = line.color
output_stream.write(struct.pack('<ffff', A, R, G, B))

if len(report.triangles) > 0:
report.triangles_header.write(output_stream, TAG, True)
for triangle in report.triangles:
output_stream.write(struct.pack('<fff', *triangle.position_a))
output_stream.write(struct.pack('<b', triangle.node_index_a_0))
output_stream.write(struct.pack('<b', triangle.node_index_a_1))
output_stream.write(struct.pack('<b', triangle.node_index_a_2))
output_stream.write(struct.pack('<b', triangle.node_index_a_3))
output_stream.write(struct.pack('<f', triangle.node_weight_a_0))
output_stream.write(struct.pack('<f', triangle.node_weight_a_1))
output_stream.write(struct.pack('<f', triangle.node_weight_a_2))
output_stream.write(struct.pack('<f', triangle.node_weight_a_3))
output_stream.write(struct.pack('<fff', *triangle.position_b))
output_stream.write(struct.pack('<b', triangle.node_index_b_0))
output_stream.write(struct.pack('<b', triangle.node_index_b_1))
output_stream.write(struct.pack('<b', triangle.node_index_b_2))
output_stream.write(struct.pack('<b', triangle.node_index_b_3))
output_stream.write(struct.pack('<f', triangle.node_weight_b_0))
output_stream.write(struct.pack('<f', triangle.node_weight_b_1))
output_stream.write(struct.pack('<f', triangle.node_weight_b_2))
output_stream.write(struct.pack('<f', triangle.node_weight_b_3))
output_stream.write(struct.pack('<fff', *triangle.position_c))
output_stream.write(struct.pack('<b', triangle.node_index_c_0))
output_stream.write(struct.pack('<b', triangle.node_index_c_1))
output_stream.write(struct.pack('<b', triangle.node_index_c_2))
output_stream.write(struct.pack('<b', triangle.node_index_c_3))
output_stream.write(struct.pack('<f', triangle.node_weight_c_0))
output_stream.write(struct.pack('<f', triangle.node_weight_c_1))
output_stream.write(struct.pack('<f', triangle.node_weight_c_2))
output_stream.write(struct.pack('<f', triangle.node_weight_c_3))
R, G, B, A = triangle.color
output_stream.write(struct.pack('<ffff', A, R, G, B))

if len(report.quads) > 0:
report.quads_header.write(output_stream, TAG, True)
for quad in report.quads:
output_stream.write(struct.pack('<fff', *quad.position_a))
output_stream.write(struct.pack('<b', quad.node_index_a_0))
output_stream.write(struct.pack('<b', quad.node_index_a_1))
output_stream.write(struct.pack('<b', quad.node_index_a_2))
output_stream.write(struct.pack('<b', quad.node_index_a_3))
output_stream.write(struct.pack('<f', quad.node_weight_a_0))
output_stream.write(struct.pack('<f', quad.node_weight_a_1))
output_stream.write(struct.pack('<f', quad.node_weight_a_2))
output_stream.write(struct.pack('<f', quad.node_weight_a_3))
output_stream.write(struct.pack('<fff', *quad.position_b))
output_stream.write(struct.pack('<b', quad.node_index_b_0))
output_stream.write(struct.pack('<b', quad.node_index_b_1))
output_stream.write(struct.pack('<b', quad.node_index_b_2))
output_stream.write(struct.pack('<b', quad.node_index_b_3))
output_stream.write(struct.pack('<f', quad.node_weight_b_0))
output_stream.write(struct.pack('<f', quad.node_weight_b_1))
output_stream.write(struct.pack('<f', quad.node_weight_b_2))
output_stream.write(struct.pack('<f', quad.node_weight_b_3))
output_stream.write(struct.pack('<fff', *quad.position_c))
output_stream.write(struct.pack('<b', quad.node_index_c_0))
output_stream.write(struct.pack('<b', quad.node_index_c_1))
output_stream.write(struct.pack('<b', quad.node_index_c_2))
output_stream.write(struct.pack('<b', quad.node_index_c_3))
output_stream.write(struct.pack('<f', quad.node_weight_c_0))
output_stream.write(struct.pack('<f', quad.node_weight_c_1))
output_stream.write(struct.pack('<f', quad.node_weight_c_2))
output_stream.write(struct.pack('<f', quad.node_weight_c_3))
output_stream.write(struct.pack('<fff', *quad.position_d))
output_stream.write(struct.pack('<b', quad.node_index_d_0))
output_stream.write(struct.pack('<b', quad.node_index_d_1))
output_stream.write(struct.pack('<b', quad.node_index_d_2))
output_stream.write(struct.pack('<b', quad.node_index_d_3))
output_stream.write(struct.pack('<f', quad.node_weight_d_0))
output_stream.write(struct.pack('<f', quad.node_weight_d_1))
output_stream.write(struct.pack('<f', quad.node_weight_d_2))
output_stream.write(struct.pack('<f', quad.node_weight_d_3))
R, G, B, A = quad.color
output_stream.write(struct.pack('<ffff', A, R, G, B))

if len(report.comments) > 0:
report.comments_header.write(output_stream, TAG, True)
for comment in report.comments:
output_stream.write(struct.pack('<h', comment.text_length))
output_stream.write(struct.pack('<18x'))
output_stream.write(struct.pack('<fff', *comment.position))
output_stream.write(struct.pack('<b', comment.node_index_0))
output_stream.write(struct.pack('<b', comment.node_index_1))
output_stream.write(struct.pack('<b', comment.node_index_2))
output_stream.write(struct.pack('<b', comment.node_index_3))
output_stream.write(struct.pack('<f', comment.node_weight_0))
output_stream.write(struct.pack('<f', comment.node_weight_1))
output_stream.write(struct.pack('<f', comment.node_weight_2))
output_stream.write(struct.pack('<f', comment.node_weight_3))
R, G, B, A = comment.color
output_stream.write(struct.pack('<ffff', A, R, G, B))

for comment in report.comments:
if comment.text_length > 0:
output_stream.write(struct.pack('<%ssx' % (len(comment.text)), tag_format.string_to_bytes(comment.text, False)))

def build_asset(output_stream, LIGHTMAP, report):
TAG = tag_format.TagAsset()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -438,22 +438,27 @@ def __init__(self, unique_id=0, origin_bsp_index=0, object_type=0, source=0, ren
self.render_model_checksum = render_model_checksum

class Error:
def __init__(self, name="", report_type=0, flags=0, reports_tag_block=None, reports=None):
def __init__(self, name="", report_type=0, flags=0, reports_header=None, reports_tag_block=None, reports=None):
self.name = name
self.report_type = report_type
self.flags = flags
self.reports_header = reports_header
self.reports_tag_block = reports_tag_block
self.reports = reports

class Report:
def __init__(self, type=0, flags=0, text="", source_filename="", source_line_number=0, vertices_tag_block=None, vectors_tag_block=None,
lines_tag_block=None, triangles_tag_block=None, quads_tag_block=None, comments_tag_block=None, vertices=None, vectors=None, lines=None, triangles=None,
quads=None, comments=None, report_key=0, node_index=0, bounds_x=(0.0, 0.0), bounds_y=(0.0, 0.0), bounds_z=(0.0, 0.0), color=(0.0, 0.0, 0.0, 0.0)):
def __init__(self, type=0, flags=0, text="", source_filename="", source_line_number=0, vertices_header=None, vectors_header=None, lines_header=None, triangles_header=None, quads_header=None, comments_header=None, vertices_tag_block=None, vectors_tag_block=None, lines_tag_block=None, triangles_tag_block=None, quads_tag_block=None, comments_tag_block=None, vertices=None, vectors=None, lines=None, triangles=None, quads=None, comments=None, report_key=0, node_index=0, bounds_x=(0.0, 0.0), bounds_y=(0.0, 0.0), bounds_z=(0.0, 0.0), color=(0.0, 0.0, 0.0, 0.0)):
self.type = type
self.flags = flags
self.text = text
self.source_filename = source_filename
self.source_line_number = source_line_number
self.vertices_header = vertices_header
self.vectors_header = vectors_header
self.lines_header = lines_header
self.triangles_header = triangles_header
self.quads_header = quads_header
self.comments_header = comments_header
self.vertices_tag_block = vertices_tag_block
self.vectors_tag_block = vectors_tag_block
self.lines_tag_block = lines_tag_block
Expand Down Expand Up @@ -607,9 +612,10 @@ def __init__(self, position_a=Vector(), node_index_a_0=0, node_index_a_1=0, node
self.color = color

class ReportComment:
def __init__(self, text="", position=Vector(), node_index_0=0, node_index_1=0, node_index_2=0, node_index_3=0, node_weight_0=0.0, node_weight_1=0.0,
def __init__(self, text="", text_length=0, position=Vector(), node_index_0=0, node_index_1=0, node_index_2=0, node_index_3=0, node_weight_0=0.0, node_weight_1=0.0,
node_weight_2=0.0, node_weight_3=0.0, color=(0.0, 0.0, 0.0, 0.0)):
self.text = text
self.text_length = text_length
self.position = position
self.node_index_0 = node_index_0
self.node_index_1 = node_index_1
Expand Down
Loading

0 comments on commit 143968b

Please sign in to comment.