62 lines
2.2 KiB
Python
62 lines
2.2 KiB
Python
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()
|