mirror of https://github.com/AxioDL/metaforce.git
FRME cooking fixes
This commit is contained in:
parent
f36dfa3be3
commit
b949aada83
|
@ -65,12 +65,13 @@ def draw(layout, context):
|
||||||
|
|
||||||
hjustifications = None
|
hjustifications = None
|
||||||
vjustifications = None
|
vjustifications = None
|
||||||
|
model_draw_flags_e = None
|
||||||
|
|
||||||
def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
def recursive_cook(buffer, obj, version, path_hasher, parent_name):
|
||||||
fout.write(struct.pack('>4s', retro_widget_type[6:]))
|
buffer += struct.pack('>4s', obj.retro_widget_type[6:].encode())
|
||||||
fout.write(obj.name.encode())
|
buffer += obj.name.encode() + b'\0'
|
||||||
fout.write(parent_name.encode())
|
buffer += parent_name.encode() + b'\0'
|
||||||
fout.write(struct.pack('>bbbbffffI',
|
buffer += struct.pack('>bbbbffffI',
|
||||||
False,
|
False,
|
||||||
obj.retro_widget_default_visible,
|
obj.retro_widget_default_visible,
|
||||||
obj.retro_widget_default_active,
|
obj.retro_widget_default_active,
|
||||||
|
@ -79,7 +80,7 @@ def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
||||||
obj.retro_widget_color[1],
|
obj.retro_widget_color[1],
|
||||||
obj.retro_widget_color[2],
|
obj.retro_widget_color[2],
|
||||||
obj.retro_widget_color[3],
|
obj.retro_widget_color[3],
|
||||||
obj.retro_widget_model_draw_flags))
|
model_draw_flags_e[obj.retro_widget_model_draw_flags])
|
||||||
|
|
||||||
if obj.retro_widget_type == 'RETRO_CAMR':
|
if obj.retro_widget_type == 'RETRO_CAMR':
|
||||||
aspect = bpy.context.scene.render.resolution_x / bpy.context.scene.render.resolution_y
|
aspect = bpy.context.scene.render.resolution_x / bpy.context.scene.render.resolution_y
|
||||||
|
@ -89,12 +90,12 @@ def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
||||||
fov = math.degrees(math.atan(math.tan(obj.data.angle / 2.0) / aspect)) * 2.0
|
fov = math.degrees(math.atan(math.tan(obj.data.angle / 2.0) / aspect)) * 2.0
|
||||||
else:
|
else:
|
||||||
fov = math.degrees(obj.data.angle)
|
fov = math.degrees(obj.data.angle)
|
||||||
fout.write(struct.pack('>Iffff', 0, fov, aspect, obj.data.clip_start, obj.data.clip_end))
|
buffer += struct.pack('>Iffff', 0, fov, aspect, obj.data.clip_start, obj.data.clip_end)
|
||||||
|
|
||||||
elif obj.data.type == 'ORTHO':
|
elif obj.data.type == 'ORTHO':
|
||||||
ortho_half = obj.data.ortho_scale / 2.0
|
ortho_half = obj.data.ortho_scale / 2.0
|
||||||
fout.write(struct.pack('>Iffffff', 1, -ortho_half, ortho_half, -ortho_half / aspect,
|
buffer += struct.pack('>Iffffff', 1, -ortho_half, ortho_half, -ortho_half / aspect,
|
||||||
ortho_half / aspect, obj.data.clip_start, obj.data.clip_end))
|
ortho_half / aspect, obj.data.clip_start, obj.data.clip_end)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_MODL':
|
elif obj.retro_widget_type == 'RETRO_MODL':
|
||||||
if len(obj.children) == 0:
|
if len(obj.children) == 0:
|
||||||
|
@ -106,19 +107,19 @@ def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
||||||
raise RuntimeException('Model Widget must have a linked library MESH')
|
raise RuntimeException('Model Widget must have a linked library MESH')
|
||||||
path = bpy.path.abspath(model_obj.data.library.filepath)
|
path = bpy.path.abspath(model_obj.data.library.filepath)
|
||||||
path_hash = path_hasher.hashpath32(path)
|
path_hash = path_hasher.hashpath32(path)
|
||||||
fout.write(struct.pack('>III', path_hash, 0, obj.retro_model_light_mask))
|
buffer += struct.pack('>III', path_hash, 0, obj.retro_model_light_mask)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_PANE':
|
elif obj.retro_widget_type == 'RETRO_PANE':
|
||||||
fout.write(struct.pack('>fffff',
|
buffer += struct.pack('>fffff',
|
||||||
obj.retro_pane_dimensions[0],
|
obj.retro_pane_dimensions[0],
|
||||||
obj.retro_pane_dimensions[1],
|
obj.retro_pane_dimensions[1],
|
||||||
obj.retro_pane_scale_center[0],
|
obj.retro_pane_scale_center[0],
|
||||||
obj.retro_pane_scale_center[1],
|
obj.retro_pane_scale_center[1],
|
||||||
obj.retro_pane_scale_center[2]))
|
obj.retro_pane_scale_center[2])
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_TXPN':
|
elif obj.retro_widget_type == 'RETRO_TXPN':
|
||||||
path_hash = path_hasher.hashpath32(obj.retro_textpane_font_path)
|
path_hash = path_hasher.hashpath32(obj.retro_textpane_font_path)
|
||||||
fout.write(struct.pack('>fffffIbbIIffffffffff',
|
buffer += struct.pack('>fffffIbbIIffffffffff',
|
||||||
obj.retro_pane_dimensions[0],
|
obj.retro_pane_dimensions[0],
|
||||||
obj.retro_pane_dimensions[1],
|
obj.retro_pane_dimensions[1],
|
||||||
obj.retro_pane_scale_center[0],
|
obj.retro_pane_scale_center[0],
|
||||||
|
@ -138,16 +139,16 @@ def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
||||||
obj.retro_textpane_outline_color[2],
|
obj.retro_textpane_outline_color[2],
|
||||||
obj.retro_textpane_outline_color[3],
|
obj.retro_textpane_outline_color[3],
|
||||||
obj.retro_textpane_block_extent[0],
|
obj.retro_textpane_block_extent[0],
|
||||||
obj.retro_textpane_block_extent[1]))
|
obj.retro_textpane_block_extent[1])
|
||||||
if version >= 1:
|
if version >= 1:
|
||||||
path_hash = path_hasher.hashpath32(obj.retro_textpane_jp_font_path)
|
path_hash = path_hasher.hashpath32(obj.retro_textpane_jp_font_path)
|
||||||
fout.write(struct.pack('>III',
|
buffer += struct.pack('>III',
|
||||||
path_hash,
|
path_hash,
|
||||||
obj.retro_textpane_jp_font_scale[0],
|
obj.retro_textpane_jp_font_scale[0],
|
||||||
obj.retro_textpane_jp_font_scale[1]))
|
obj.retro_textpane_jp_font_scale[1])
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_TBGP':
|
elif obj.retro_widget_type == 'RETRO_TBGP':
|
||||||
fout.write(struct.pack('>HHIHHbbffbfHHHH',
|
buffer += struct.pack('>HHIHHbbffbfHHHH',
|
||||||
obj.retro_tablegroup_elem_count,
|
obj.retro_tablegroup_elem_count,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -162,30 +163,30 @@ def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0))
|
0)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_GRUP':
|
elif obj.retro_widget_type == 'RETRO_GRUP':
|
||||||
fout.write(struct.pack('>Hb',
|
buffer += struct.pack('>Hb',
|
||||||
obj.retro_group_default_worker,
|
obj.retro_group_default_worker,
|
||||||
False))
|
False)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_SLGP':
|
elif obj.retro_widget_type == 'RETRO_SLGP':
|
||||||
fout.write(struct.pack('>ffff',
|
buffer += struct.pack('>ffff',
|
||||||
obj.retro_slider_min,
|
obj.retro_slider_min,
|
||||||
obj.retro_slider_max,
|
obj.retro_slider_max,
|
||||||
obj.retro_slider_default,
|
obj.retro_slider_default,
|
||||||
obj.retro_slider_increment))
|
obj.retro_slider_increment)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_ENRG':
|
elif obj.retro_widget_type == 'RETRO_ENRG':
|
||||||
path_hash = path_hasher.hashpath32(obj.retro_energybar_texture_path)
|
path_hash = path_hasher.hashpath32(obj.retro_energybar_texture_path)
|
||||||
fout.write(struct.pack('>ffff', path_hash))
|
buffer += struct.pack('>ffff', path_hash)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_METR':
|
elif obj.retro_widget_type == 'RETRO_METR':
|
||||||
fout.write(struct.pack('>bbII',
|
buffer += struct.pack('>bbII',
|
||||||
False,
|
False,
|
||||||
obj.retro_meter_no_round_up,
|
obj.retro_meter_no_round_up,
|
||||||
obj.retro_meter_max_capacity,
|
obj.retro_meter_max_capacity,
|
||||||
obj.retro_meter_worker_count))
|
obj.retro_meter_worker_count)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_LITE':
|
elif obj.retro_widget_type == 'RETRO_LITE':
|
||||||
type_enum = 0
|
type_enum = 0
|
||||||
|
@ -206,13 +207,14 @@ def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
||||||
linear = obj.data.linear_coefficient
|
linear = obj.data.linear_coefficient
|
||||||
quadratic = obj.data.quadratic_coefficient
|
quadratic = obj.data.quadratic_coefficient
|
||||||
|
|
||||||
fout.write(struct.pack('>IffffffIf',
|
buffer += struct.pack('>IffffffI',
|
||||||
type_enum, constant, linear, quadratic,
|
type_enum, constant, linear, quadratic,
|
||||||
obj.data.retro_light_angle_constant,
|
obj.data.retro_light_angle_constant,
|
||||||
obj.data.retro_light_angle_linear,
|
obj.data.retro_light_angle_linear,
|
||||||
obj.data.retro_light_angle_quadratic,
|
obj.data.retro_light_angle_quadratic,
|
||||||
obj.data.retro_light_index,
|
obj.data.retro_light_index)
|
||||||
cutoff))
|
if obj.data.type == 'SPOT':
|
||||||
|
buffer += struct.pack('>f', cutoff)
|
||||||
|
|
||||||
elif obj.retro_widget_type == 'RETRO_IMGP':
|
elif obj.retro_widget_type == 'RETRO_IMGP':
|
||||||
if len(obj.children) == 0:
|
if len(obj.children) == 0:
|
||||||
|
@ -234,53 +236,60 @@ def recursive_cook(fout, obj, version, path_hasher, parent_name):
|
||||||
path = bpy.path.abspath(image.filepath)
|
path = bpy.path.abspath(image.filepath)
|
||||||
path_hash = path_hasher.hashpath32(path)
|
path_hash = path_hasher.hashpath32(path)
|
||||||
|
|
||||||
fout.write(struct.pack('>IIII', path_hash, 0, 0, 4))
|
buffer += struct.pack('>IIII', path_hash, 0, 0, 4)
|
||||||
for i in range(4):
|
for i in range(4):
|
||||||
vi = model_obj.data.loops[i].vertex_index
|
vi = model_obj.data.loops[i].vertex_index
|
||||||
co = model_obj.data.vertices[vi].co
|
co = model_obj.data.vertices[vi].co
|
||||||
fout.write(struct.pack('>fff', co[0], co[1], co[2]))
|
buffer += struct.pack('>fff', co[0], co[1], co[2])
|
||||||
|
|
||||||
fout.write(struct.pack('>I', 4))
|
buffer += struct.pack('>I', 4)
|
||||||
for i in range(4):
|
for i in range(4):
|
||||||
co = model_obj.data.uv_layers[0].data[i].uv
|
co = model_obj.data.uv_layers[0].data[i].uv
|
||||||
fout.write(struct.pack('>ff', co[0], co[1]))
|
buffer += struct.pack('>ff', co[0], co[1])
|
||||||
|
|
||||||
if obj.retro_widget_is_worker:
|
if obj.retro_widget_is_worker:
|
||||||
fout.write('>bH', True, obj.retro_widget_worker_id)
|
buffer += struct.pack('>bH', True, obj.retro_widget_worker_id)
|
||||||
else:
|
else:
|
||||||
fout.write('>b', False)
|
buffer += struct.pack('>b', False)
|
||||||
|
|
||||||
fout.write(struct.pack('>fffffffffffffffHHH',
|
buffer += struct.pack('>fffffffffffffffHHH',
|
||||||
obj.matrix_local[0][3],
|
obj.matrix_local[0][3],
|
||||||
obj.matrix_local[1][3],
|
obj.matrix_local[1][3],
|
||||||
obj.matrix_local[2][3],
|
obj.matrix_local[2][3],
|
||||||
obj.matrix_local[0][0], obj.matrix_local[0][1], obj.matrix_local[0][2],
|
obj.matrix_local[0][0], obj.matrix_local[0][1], obj.matrix_local[0][2],
|
||||||
obj.matrix_local[1][0], obj.matrix_local[1][1], obj.matrix_local[1][2],
|
obj.matrix_local[1][0], obj.matrix_local[1][1], obj.matrix_local[1][2],
|
||||||
obj.matrix_local[2][0], obj.matrix_local[2][1], obj.matrix_local[2][2],
|
obj.matrix_local[2][0], obj.matrix_local[2][1], obj.matrix_local[2][2],
|
||||||
0.0, 0.0, 0.0, 0, 0, 0))
|
0.0, 0.0, 0.0, 0, 0, 0)
|
||||||
|
|
||||||
for ch in obj.children:
|
for ch in obj.children:
|
||||||
if ch.retro_widget_type != 'RETRO_NONE':
|
if ch.retro_widget_type != 'RETRO_NONE':
|
||||||
recursive_cook(fout, ch, version, path_hasher, obj.name)
|
recursive_cook(buffer, ch, version, path_hasher, obj.name)
|
||||||
|
|
||||||
|
|
||||||
def cook(path_out, version, path_hasher):
|
def cook(path_out, version, path_hasher):
|
||||||
|
global hjustifications, vjustifications, model_draw_flags_e
|
||||||
hjustifications = dict((i[0], i[3]) for i in bpy.types.Object.retro_textpane_hjustification[1]['items'])
|
hjustifications = dict((i[0], i[3]) for i in bpy.types.Object.retro_textpane_hjustification[1]['items'])
|
||||||
vjustifications = dict((i[0], i[3]) for i in bpy.types.Object.retro_textpane_vjustification[1]['items'])
|
vjustifications = dict((i[0], i[3]) for i in bpy.types.Object.retro_textpane_vjustification[1]['items'])
|
||||||
|
model_draw_flags_e = dict((i[0], i[3]) for i in bpy.types.Object.retro_widget_model_draw_flags[1]['items'])
|
||||||
|
|
||||||
fout = open(path_out, 'wb')
|
buffer = bytearray()
|
||||||
fout.write(struct.pack('>IIIII', 0, 0, 0, 0))
|
buffer += struct.pack('>IIII', 0, 0, 0, 0)
|
||||||
|
|
||||||
widget_count = 0
|
widget_count = 0
|
||||||
for obj in bpy.data.objects:
|
for obj in bpy.data.objects:
|
||||||
if obj.retro_widget_type != 'RETRO_NONE':
|
if obj.retro_widget_type != 'RETRO_NONE':
|
||||||
widget_count += 1
|
widget_count += 1
|
||||||
fout.write(struct.pack('>I', widget_count))
|
buffer += struct.pack('>I', widget_count)
|
||||||
|
|
||||||
for obj in bpy.data.objects:
|
for obj in bpy.data.objects:
|
||||||
if obj.retro_widget_type != 'RETRO_NONE' and not obj.parent:
|
if obj.retro_widget_type != 'RETRO_NONE' and not obj.parent:
|
||||||
recursive_cook(fout, obj, version, path_hasher, 'kGSYS_DummyWidgetID')
|
recursive_cook(buffer, obj, version, path_hasher, 'kGSYS_DummyWidgetID')
|
||||||
|
|
||||||
|
rem_bytes = 32 - len(buffer) % 32
|
||||||
|
for i in range(rem_bytes):
|
||||||
|
buffer.append(0xff)
|
||||||
|
fout = open(path_out, 'wb')
|
||||||
|
fout.write(buffer)
|
||||||
fout.close()
|
fout.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,14 +48,14 @@ def quitblender():
|
||||||
|
|
||||||
class PathHasher:
|
class PathHasher:
|
||||||
def hashpath32(self, path):
|
def hashpath32(self, path):
|
||||||
writepipestr(path)
|
writepipestr(path.encode())
|
||||||
read_str = readpipestr()
|
read_str = readpipestr()
|
||||||
if len(read_str) >= 8:
|
if len(read_str) >= 16:
|
||||||
return int(read_str[0:8], 16)
|
return int(read_str[0:16], 16) & 0xffffffff
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def hashpath64(self, path):
|
def hashpath64(self, path):
|
||||||
writepipestr(path)
|
writepipestr(path.encode())
|
||||||
read_str = readpipestr()
|
read_str = readpipestr()
|
||||||
if len(read_str) >= 16:
|
if len(read_str) >= 16:
|
||||||
return int(read_str[0:16], 16)
|
return int(read_str[0:16], 16)
|
||||||
|
@ -245,7 +245,7 @@ def dataout_loop():
|
||||||
elif cmdargs[0] == 'FRAMECOMPILE':
|
elif cmdargs[0] == 'FRAMECOMPILE':
|
||||||
pathOut = cmdargs[1]
|
pathOut = cmdargs[1]
|
||||||
version = int(cmdargs[2])
|
version = int(cmdargs[2])
|
||||||
if version != 1:
|
if version != 0 and version != 1:
|
||||||
writepipestr(b'bad version')
|
writepipestr(b'bad version')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue