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("