173 lines
5.7 KiB
Python
173 lines
5.7 KiB
Python
from lib.skn_anm import *
|
|
from lib.gbs import *
|
|
import struct
|
|
import os
|
|
import shutil
|
|
|
|
|
|
def read_skn(filepath) -> AnmSkin:
|
|
with open(filepath, "rb") as fp:
|
|
init_filetrack(os.fstat(fp.fileno()).st_size)
|
|
r = AnmFile.parse(fp, AnmSkin)
|
|
print("Read %s%% of file" % stat_track())
|
|
return r
|
|
|
|
|
|
def test():
|
|
f = ["/home/tasty/Projects/gck-map-extract-objects/anm_skn/Verm_l0.skn"]
|
|
my_vertex = Vec3(-0.927200, 0.099500, 3.108000)
|
|
mini_dist_v = Vec3(0, 0, 0)
|
|
for p in f:
|
|
skn = read_skn(p)
|
|
pprint(skn.default_obj_dictionnary)
|
|
pprint(skn.node_dictionnary)
|
|
for obj_name, obj in skn.default_obj_dictionnary.items():
|
|
for cluster in obj.clusters:
|
|
for vertex in cluster.vertices:
|
|
if vertex.distance(my_vertex) < mini_dist_v.distance(my_vertex):
|
|
mini_dist_v = vertex
|
|
|
|
print("%s: dist=%s" % (mini_dist_v, mini_dist_v.distance(my_vertex)))
|
|
|
|
|
|
def print_vertices(file):
|
|
skn = read_skn(file)
|
|
pprint(skn)
|
|
for obj_name in skn.default_obj_dictionnary:
|
|
obj = skn.default_obj_dictionnary[obj_name]
|
|
for cluster in obj.clusters:
|
|
for vertex in cluster.vertices:
|
|
print("v %s %s %s" % (vertex.x, vertex.y, vertex.z))
|
|
|
|
|
|
def link_gbs_skn():
|
|
basepath = "/home/tasty/Projects/gck-map-extract-objects/test/rp_l0.apatch.gzp"
|
|
skn = read_skn(basepath+".skn")
|
|
gbs = GbsData()
|
|
gbs.read(basepath+".gbs")
|
|
|
|
vbase = 0
|
|
with open("test.obj", "w") as fp:
|
|
for obj_name, obj in skn.default_obj_dictionnary.items():
|
|
for cluster in obj.clusters:
|
|
for vertex in cluster.vertices:
|
|
base_vertex_i = vertex.index + vbase
|
|
base_vertex = gbs.vertices[base_vertex_i]
|
|
new_vertex = Vec3(base_vertex.x + vertex.x, base_vertex.y + vertex.y, base_vertex.z + vertex.z)
|
|
fp.write("v %s %s %s\n" % (new_vertex.x, new_vertex.y, new_vertex.z))
|
|
vbase += obj.total_number_vertices
|
|
|
|
|
|
def main(file):
|
|
skn = read_skn(file)
|
|
pprint(skn)
|
|
vbase = 0
|
|
for tree in skn.tree_dictionnary:
|
|
for obj_name in skn.tree_dictionnary[tree]:
|
|
obj = skn.tree_dictionnary[tree][obj_name]
|
|
for cluster in obj.clusters:
|
|
if cluster.num_vertices <= 0:
|
|
print("NO VERTICES")
|
|
for vertex in cluster.vertices:
|
|
pass
|
|
# print("vertex %s -> %s" % (vertex.index, vertex.index + vbase))
|
|
vbase += obj.total_number_vertices
|
|
|
|
with open("test.obj", "w") as fp:
|
|
vbase = 0
|
|
for obj_name, obj in skn.default_obj_dictionnary.items():
|
|
for cluster in obj.clusters:
|
|
## 81: part of hair
|
|
## 12: left eye
|
|
## 9/13: leg or arm
|
|
## 15/17 is a boob
|
|
if cluster.handle == 15:
|
|
# fp.write("name %s %s %s %s %s %s %s\n" % (cluster.bone_name.strip().replace(" ", ""), cluster.bounding_box[0].x, cluster.bounding_box[0].y, cluster.bounding_box[0].z, cluster.bounding_box[1].x, cluster.bounding_box[1].y, cluster.bounding_box[1].z))
|
|
for vertex in cluster.vertices:
|
|
# fp.write("index %s\n" % (vertex.index + vbase))
|
|
fp.write("%s %s %s 0 0 0\n" % (vertex.x, vertex.y, vertex.z))
|
|
vbase += obj.total_number_vertices
|
|
|
|
|
|
def replace_vertex(x1, y1, z1, x2, y2, z2, skn_file):
|
|
final = skn_file+".repl"
|
|
if not os.path.exists(final):
|
|
shutil.copy(skn_file, final)
|
|
|
|
with open(final, "rb") as fp:
|
|
fp.seek(0)
|
|
bytesarr = bytearray(fp.read())
|
|
|
|
bfind = x1+y1+z1
|
|
brepl = x2+y2+z2
|
|
bytesarr_new = bytesarr.replace(bfind, brepl)
|
|
assert(bytesarr_new != bytesarr)
|
|
with open(final, "ab+") as fp:
|
|
fp.seek(0)
|
|
fp.write(bytesarr_new)
|
|
|
|
|
|
def replace_vertices(file_input, skn_file):
|
|
with open(skn_file, "rb") as fp:
|
|
orig_bytes = bytearray(fp.read())
|
|
|
|
with open(file_input, "r") as fp:
|
|
lines = fp.readlines()
|
|
to_search = []
|
|
for line in lines:
|
|
line = line.strip()
|
|
if not line or line.startswith("#"):
|
|
continue
|
|
a = line.split(" ")
|
|
print(line)
|
|
assert(len(a) == 6)
|
|
x1 = struct.pack("<f", float(a[0]))
|
|
y1 = struct.pack("<f", float(a[1]))
|
|
z1 = struct.pack("<f", float(a[2]))
|
|
|
|
if (x1, y1, z1) in to_search:
|
|
continue
|
|
else:
|
|
to_search.append((x1, y1, z1,))
|
|
|
|
x2 = struct.pack("<f", float(a[3]))
|
|
y2 = struct.pack("<f", float(a[4]))
|
|
z2 = struct.pack("<f", float(a[5]))
|
|
|
|
bfind = x1 + y1 + z1
|
|
brepl = x2 + y2 + z2
|
|
new_bytes = orig_bytes.replace(bfind, brepl)
|
|
assert(new_bytes != orig_bytes)
|
|
orig_bytes = new_bytes
|
|
|
|
final = skn_file+".repl"
|
|
if not os.path.exists(final):
|
|
shutil.copy(skn_file, final)
|
|
|
|
with open(final, "wb") as fp:
|
|
print("writing final file %s..." % final)
|
|
fp.write(orig_bytes)
|
|
|
|
|
|
def combine_files(input, newfile):
|
|
with open(input, "r") as in_fp:
|
|
in_lines = in_fp.readlines()
|
|
|
|
with open(newfile, "r") as out_fp:
|
|
out_lines = out_fp.readlines()
|
|
|
|
assert(len(in_lines) == len(out_lines))
|
|
|
|
for i in range(len(in_lines)):
|
|
out_lines[i] = out_lines[i].replace("\n", "") + " " + in_lines[i]
|
|
|
|
with open(newfile+".combined", "w") as o_fp:
|
|
o_fp.writelines(out_lines)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
file = "/home/tasty/Projects/gck-map-extract-objects/test/MC_shotgun_L0.xx_mecc_flick.gzp.skn"
|
|
s = read_skn(file)
|
|
pprint(s)
|
|
|