from lib.gbs import * from lib.skn_anm import * import os def read_anm(filepath) -> AnmAnim: with open(filepath, "rb") as fp: init_filetrack(os.fstat(fp.fileno()).st_size) r = AnmFile.parse(fp, AnmAnim) return r 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 rotate_vec3_by_quaternion(vec: Vec3, quat: Quat): u = Vec3(quat.x, quat.y, quat.z) s = quat.w return 2 * Vec3.dot(u, vec) * u + (s*s - Vec3.dot(u, u)) * vec + 2.0 * s * cross(u, vec) def main(): skin = read_skn("/home/tasty/Projects/gck-map-extract-objects/anm_skn/rp_l0.skn") anm = read_anm("/home/tasty/Projects/gck-map-extract-objects/anm_skn/rp_run_scan1.anm") #anm = read_anm("/home/tasty/Projects/gck-map-extract-objects/anm_skn/kb_roar2.anm") #pprint(skin) print("----------------------------------------------------------------") print("----------------------------------------------------------------") print("----------------------------------------------------------------") print("----------------------------------------------------------------") print("----------------------------------------------------------------") # pprint(anm) animation = AnmAnimation.create(skin, anm) gbs = GbsData() gbs.read("/home/tasty/Projects/gck-map-extract-objects/all_gbs/rp_l0.gbs") animation.eval(1000, gbs.vertices, 0x4c, 0) vbase = 0 for binder in animation.binders: for bindings in binder.bindings: cluster = bindings.cluster node = bindings.node for cluster_vertex_i in range(len(cluster.vertices)): cluster_vertex = cluster.vertices[cluster_vertex_i] cluster_vertex += node.transform.affine.translation cluster_vertex = rotate_vec3_by_quaternion(cluster_vertex, node.transform.affine.quat) gbs.vertices[vbase] = cluster_vertex vbase += 1 print(vbase) gbs.save_obj("/home/tasty/Projects/gck-map-extract-objects/mc_eval_0.obj") if __name__ == "__main__": main()