From 6f2c1cf16822cb03548338be7208b91be0b8c8cf Mon Sep 17 00:00:00 2001 From: Will Snyder Date: Thu, 7 Jan 2021 01:25:09 -0500 Subject: [PATCH] CRC rewrite --- addons/io_scene_swbf_msh/crc.py | 85 ++++----------------- addons/io_scene_swbf_msh/msh_anim_gather.py | 10 +-- addons/io_scene_swbf_msh/msh_scene_read.py | 2 +- addons/io_scene_swbf_msh/msh_to_blend.py | 12 +-- addons/io_scene_swbf_msh/zaa_to_blend.py | 4 +- 5 files changed, 30 insertions(+), 83 deletions(-) diff --git a/addons/io_scene_swbf_msh/crc.py b/addons/io_scene_swbf_msh/crc.py index 8b59617..daa69a8 100644 --- a/addons/io_scene_swbf_msh/crc.py +++ b/addons/io_scene_swbf_msh/crc.py @@ -1,15 +1,10 @@ -from struct import pack +''' +Based on code by Benedikt Schatz from https://github.com/Schlechtwetterfront/xsizetools/blob/master/Application/Modules/msh2_crc.py +''' -class CRCError(Exception): - def __init__(self, val): - self.val = val - - def __str__(self): - return '{0}'.format(self.val) - # CRC lookup table. -TABLE_32 = ( +table32_lookup = ( 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, @@ -76,67 +71,19 @@ TABLE_32 = ( 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4 ) -# Used to calculate the lowercase CRC. -TOLOWER = ( - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff -) +def to_lower(charcode): + if charcode <= 64 or charcode > 90: + return charcode + else: + return charcode + 32 -def return_lowest_bits(n): - '''Simulate unsigned behavior.''' - return n & 0xFFFFFFFF - - -def crc(string): - '''Calculate the Zero CRC from string and return it as number.''' - crc_ = 0 - crc_ = return_lowest_bits(~crc_) +# Not sure what Schlechtwetterfront means by "Simulate unsigned behavior.", +# kept it anyways just without the extra functions +def to_crc(string): + crc_ = ~0 & 0xFFFFFFFF if string: for char in string: - ind = (crc_ >> 24) - ind = ind ^ TOLOWER[ord(char)] - crc_ = return_lowest_bits(crc_ << 8) ^ TABLE_32[ind] - return return_lowest_bits(~crc_) - - -def strcrc(string): - '''Calculate the Zero CRC and return it in a structure - usable in .msh files.''' - return pack('> 24) ^ to_lower(ord(char)) + crc_ = ((crc_ << 8) & 0xFFFFFFFF) ^ table32_lookup[ind] + return ~crc_ & 0xFFFFFFFF \ No newline at end of file diff --git a/addons/io_scene_swbf_msh/msh_anim_gather.py b/addons/io_scene_swbf_msh/msh_anim_gather.py index 100285d..52fc6c4 100644 --- a/addons/io_scene_swbf_msh/msh_anim_gather.py +++ b/addons/io_scene_swbf_msh/msh_anim_gather.py @@ -11,7 +11,7 @@ from .msh_model_utilities import * from .msh_utilities import * from .msh_model_gather import * -from .crc import crc +from .crc import to_crc def extract_anim(armature: bpy.types.Armature, root_name: str) -> Animation: @@ -19,7 +19,7 @@ def extract_anim(armature: bpy.types.Armature, root_name: str) -> Animation: action = armature.animation_data.action anim = Animation(); - root_crc = crc(root_name) + root_crc = to_crc(root_name) if not action: framerange = Vector((0.0,1.0)) @@ -33,7 +33,7 @@ def extract_anim(armature: bpy.types.Armature, root_name: str) -> Animation: anim.bone_frames[root_crc] = ([], []) for bone in armature.data.bones: - anim.bone_frames[crc(bone.name)] = ([], []) + anim.bone_frames[to_crc(bone.name)] = ([], []) for frame in range(num_frames): @@ -60,8 +60,8 @@ def extract_anim(armature: bpy.types.Armature, root_name: str) -> Animation: rframe = RotationFrame(frame, convert_rotation_space(rot)) tframe = TranslationFrame(frame, convert_vector_space(loc)) - anim.bone_frames[crc(bone.name)][0].append(tframe) - anim.bone_frames[crc(bone.name)][1].append(rframe) + anim.bone_frames[to_crc(bone.name)][0].append(tframe) + anim.bone_frames[to_crc(bone.name)][1].append(rframe) return anim diff --git a/addons/io_scene_swbf_msh/msh_scene_read.py b/addons/io_scene_swbf_msh/msh_scene_read.py index ba68a10..622b050 100644 --- a/addons/io_scene_swbf_msh/msh_scene_read.py +++ b/addons/io_scene_swbf_msh/msh_scene_read.py @@ -78,7 +78,7 @@ def read_scene(input_file, anim_only=False) -> Scene: print("Skeleton models: ") for model in scene.models: for i in range(len(scene.skeleton)): - if crc(model.name) == scene.skeleton[i]: + if to_crc(model.name) == scene.skeleton[i]: print("\t" + model.name) if model.model_type == ModelType.SKIN: scene.skeleton.pop(i) diff --git a/addons/io_scene_swbf_msh/msh_to_blend.py b/addons/io_scene_swbf_msh/msh_to_blend.py index f6132d7..d5b6e50 100644 --- a/addons/io_scene_swbf_msh/msh_to_blend.py +++ b/addons/io_scene_swbf_msh/msh_to_blend.py @@ -60,12 +60,12 @@ def extract_and_apply_anim(filename, scene): for bone in arma.pose.bones: - if crc(bone.name) in scene.animation.bone_frames: + if to_crc(bone.name) in scene.animation.bone_frames: #print("Inserting anim data for bone: {}".format(bone.name)) bind_mat = bone_bind_poses[bone.name] - translation_frames, rotation_frames = scene.animation.bone_frames[crc(bone.name)] + translation_frames, rotation_frames = scene.animation.bone_frames[to_crc(bone.name)] loc_data_path = "pose.bones[\"{}\"].location".format(bone.name) rot_data_path = "pose.bones[\"{}\"].rotation_quaternion".format(bone.name) @@ -194,11 +194,11 @@ def extract_refined_skeleton(scene: Scene): for weight in weight_set: model_weighted_to = scene.models[weight.bone] - if crc(model_weighted_to.name) not in scene.skeleton: - scene.skeleton.append(crc(model_weighted_to.name)) + if to_crc(model_weighted_to.name) not in scene.skeleton: + scene.skeleton.append(to_crc(model_weighted_to.name)) for model in scene.models: - if crc(model.name) in scene.skeleton: + if to_crc(model.name) in scene.skeleton: skeleton_models.append(model) @@ -213,7 +213,7 @@ def extract_refined_skeleton(scene: Scene): while True: - if crc(curr_ancestor.name) in scene.skeleton or curr_ancestor.name == scene.models[0].name: + if to_crc(curr_ancestor.name) in scene.skeleton or curr_ancestor.name == scene.models[0].name: new_model = Model() new_model.name = bone.name new_model.parent = curr_ancestor.name if curr_ancestor.name != scene.models[0].name else "" diff --git a/addons/io_scene_swbf_msh/zaa_to_blend.py b/addons/io_scene_swbf_msh/zaa_to_blend.py index 02da5f9..e59859a 100644 --- a/addons/io_scene_swbf_msh/zaa_to_blend.py +++ b/addons/io_scene_swbf_msh/zaa_to_blend.py @@ -248,7 +248,7 @@ def extract_and_apply_munged_anim(input_file_path): for anim_crc in animation_set: - found_anim = [anim_name for anim_name in anim_names if crc(anim_name) == anim_crc] + found_anim = [anim_name for anim_name in anim_names if to_crc(anim_name) == anim_crc] if found_anim: anim_str = found_anim[0] else: @@ -266,7 +266,7 @@ def extract_and_apply_munged_anim(input_file_path): animation = animation_set[anim_crc] for bone in arma.pose.bones: - bone_crc = crc(bone.name) + bone_crc = to_crc(bone.name) #print("\tGetting curves for bone: " + bone.name)