From 92cd5a08f8aca53a093d81cc3b73fb1a9db5c539 Mon Sep 17 00:00:00 2001 From: Five-Damned-Dollarz <79036198+Five-Damned-Dollarz@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:10:33 +1000 Subject: [PATCH] Fixed shape keys bleeding if not explicitly reset by next animation Added slightly more updated vertex animation export documentation (Hopefully) cleaned up some of Shogo documentation --- doc/abc-v6-shogo-anim-engine-links.md | 1311 ++++++++--------- doc/abc-v6-vert-anim-basics.md | 16 +- .../shape_key_keyframes.png | Bin 0 -> 24944 bytes src/builder.py | 9 +- 4 files changed, 651 insertions(+), 685 deletions(-) create mode 100644 doc/abc-v6-vert-anim-basics/shape_key_keyframes.png diff --git a/doc/abc-v6-shogo-anim-engine-links.md b/doc/abc-v6-shogo-anim-engine-links.md index dac1656..7b1a036 100644 --- a/doc/abc-v6-shogo-anim-engine-links.md +++ b/doc/abc-v6-shogo-anim-engine-links.md @@ -2,683 +2,630 @@ ## ABCv6 Node Names -static char* s_AVCModelNodes[] = -{ - "torso_bars", - "torso", - "right_armu_torso", - "right_armu_shoulder", - "right_armu", - "right_arml", - "right_arml_hand", - "pelvis_3", - "pelvis_2", - "pelvis", - "right_legu", - "right_legl", - "right_legl_1", - "right_legl_2", - "right_legl_foot", - "left_legu", - "left_legl", - "left_legl_2", - "left_legl_1", - "left_legl_foot", - "left_armu_torso", - "left_armu_shoulder", - "left_armu", - "left_arml", - "left_arml_hand", - "head" -}; - -static char* s_AkumaModelNodes[] = -{ - "pelvis", - "torso_1", - "torso_2", - "right_armu_1", - "right_armu_2", - "right_arml_1", - "right_arml_2", - "right_armu_3", - "torso_3", - "torso_4", - "head_1", - "head_2", - "head_3", - "head_4", - "head_5", - "head_6", - "head_7", - "head_8", - "head_9", - "torso_5", - "torso_7", - "left_armu_1", - "left_armu_2", - "left_arml_1", - "left_arml_2", - "left_armu_3", - "torso_6", - "torso_8", - "torso_9", - "torso_10", - "torso_11", - "torso_12", - "torso_13", - "torso_14", - "right_legu_1", - "right_legu_2", - "right_legl_1", - "right_legl_2", - "right_legl_3", - "right_legl_4", - "right_legl_5", - "right_legl_6", - "right_legl_7", - "left_legu_1", - "left_legu_2", - "left_legl_1", - "left_legl_2", - "left_legl_3", - "left_legl_4", - "left_legl_5", - "left_legl_6", - "left_legl_7" -}; - -static char* s_Andra5ModelNodes[] = -{ - "pelvis_1", - "torso", - "torso_2", - "left_armu_1", - "left_armu_2", - "left_arml", - "left_arml_hand", - "torso_1", - "right_armu_1", - "right_armu_2", - "right_arml", - "right_arml_hand", - "pelvis", - "left_legu_1", - "left_legu_2", - "left_legl_1", - "left_legl_foot", - "right_legu_1", - "right_legu_2", - "right_legl_1", - "right_legl_foot", - "head" -}; - -static char* s_Andra10ModelNodes[] = -{ - "torso", - "pelvis", - "left_legu", - "left_legu_1", - "left_legl", - "left_legl_heel", - "left_legl_foot", - "right_legu", - "right_legu_1", - "right_legl", - "right_legl_heel", - "right_legl_foot", - "torso_2", - "right_armu_shoulder", - "right_armu", - "right_arml", - "right_arml_hand", - "head", - "torso_1", - "left_armu_shoulder", - "left_armu", - "left_arml", - "left_arml_shield", - "left_arml_hand" -}; - -static char* s_AssassinModelNodes[] = -{ - "head", - "pelvis", - "left_legu", - "left_legl", - "left_legl_foot", - "right_legu", - "right_legl", - "right_legl_foot", - "left_armu_missle", - "left_armu_wing", - "left_armu_shoulder", - "left_armu", - "left_arml", - "left_arml_hand", - "left_arml_armshield", - "left_armu_shldrjnt", - "left_armu_shoulderwing", - "left_armu_antannae", - "right_armu_missle1", - "right_armu_wing", - "right_armu_shoulder", - "right_armu", - "right_arml", - "right_arml_hand", - "right_arml_shield", - "right_armu_shldjnt", - "right_armu_shouldershld", - "right_armu_antennae" -}; - -static char* s_EnforcerModelNodes[] = -{ - "torso_1", - "torso_2", - "pelvis_1", - "pelvis_2", - "left_legu_1", - "left_legu_2", - "left_legl_1", - "left_legl_2", - "left_legl_3", - "left_legl_shoe", - "left_legl_4", - "left_legl_5", - "left_legl_6", - "left_legl_7", - "left_legl_8", - "right_legu_1", - "right_legu_2", - "right_legl_1", - "right_legl_2", - "right_legl_3", - "right_legl_shoe", - "right_legl_4", - "right_legl_5", - "right_legl_6", - "right_legl_7", - "right_legl_8", - "head_2", - "head_3", - "head_1", - "head_4", - "head_5", - "head_6", - "head_7", - "head_8", - "left_armu_4", - "left_armu_5", - "left_armu_1", - "left_armu_2", - "left_armu_3", - "left_arml_1", - "left_arml_2", - "left_arml_3", - "left_arml_hand", - "right_armu_1", - "right_armu_2", - "right_armu_3", - "right_armu_4", - "right_armu_5", - "right_arml_1", - "right_arml_2", - "right_arml_3", - "right_arml_hand" -}; - -static char* s_OrdogModelNodes[] = -{ - "torso", - "right_armu_spike", - "left_armu_spike_lower", - "right_armu_shoulder", - "right_armu", - "right_arml", - "right_arml_hand", - "head", - "left_armu_shoulder", - "left_armu", - "left_arml", - "left_arml_hand", - "left_armu_spike", - "left_armu_spike_lower", - "torso_lower", - "torso_lower_2", - "pelvis", - "right_legu", - "right_legl", - "right_legl_foot", - "right_legu_crotchjoint", - "left_legu_crotchjoint", - "left_legu_2", - "left_legl", - "left_legl_foot" -}; - -static char* s_PredatorModelNodes[] = -{ - "torso_upper", - "torso_lower", - "pelvis_upper", - "right_legu_thigh", - "right_legu_hippack", - "right_legu_knee", - "right_legl_shin", - "right_legl_knee", - "right_legl_foot1", - "right_legl_toe", - "right_legl_heel", - "pelvis_lower", - "left_legu_thigh", - "left_legu_hippack", - "left_legu_knee", - "left_legl_shin", - "left_legl_knee", - "left_legl_foot", - "left_legl_toe", - "left_legl_heel", - "Torso_rightplate", - "right_armu_chestlight1", - "right_armu_chestlight2", - "Torso_R_thruster_box", - "torso_R_thruster_box_lid", - "torso_R_thruster", - "right_armu_1", - "right_armu_elbospike", - "right_arml", - "right_arml_1", - "right_arml_wrist", - "Right_arml_hand", - "right_armu_3", - "right_armu_2", - "head_back", - "head_right_earbase", - "head_rightear", - "head_leftearbase", - "head_leftear", - "head_lowervisor", - "head_neck", - "head_visor", - "head_top", - "head_topvisor", - "left_armu_chestlight1", - "left_armu_chestlight2", - "torso_leftplate", - "torso_L_thruster_box", - "torso_L_thruster_panel", - "torso_L_thruster", - "left_armu_1", - "left_armu_elbowspike", - "left_arml_elbow", - "left_arml_1", - "left_arml_wrist", - "left_arml_hand", - "left_armu_2", - "left_armu_3" -}; - -static char* s_LittleBoyModelNodes[] = -{ - "pelvis_1", - "torso_1", - "head_1", - "head_2", - "head_3", - "left_armu_1", - "left_arml_1", - "left_arml_2", - "right_armu_1", - "right_arml_1", - "right_arml_2", - "torso_2", - "torso_3", - "torso_4", - "torso_5", - "torso_6", - "left_legu_1", - "left_legl_1", - "left_legl_2", - "right_legu_1", - "right_legl_1", - "right_legl_2" -}; - -static char* s_LittleGirlModelNodes[] = -{ - "torso", - "head_neck", - "head", - "head_hair", - "left_armu", - "left_arml", - "left_arml_hand", - "right_armu", - "right_arml", - "right_arml_hand", - "torso_backpack", - "torso_backpack1", - "torso_backpack2", - "left_armu_strap", - "right_armu_strap", - "right_legu_skirt", - "right_legu", - "right_legl", - "right_legl_foot", - "left_legu_skirt", - "left_legu", - "left_legl", - "left_legl_foot" -}; - -static char* s_Civilian1ModelNodes[] = -{ - "pelvis_1", - "torso_1", - "head_1", - "head_2", - "head_3", - "left_armu_1", - "left_arml_1", - "left_arml_2", - "right_armu_1", - "right_arml_1", - "right_arml_2", - "right_legu_1", - "right_legl_1", - "right_legl_2", - "left_legu", - "left_legl_1", - "left_legl_2" -}; - -static char* s_Civilian1bModelNodes[] = -{ - "pelvis_1", - "torso_1", - "left_armu_1", - "left_arml_1", - "left_arml_2", - "torso_2", - "head_2", - "head_1", - "right_armu_1", - "right_arml_1", - "right_arml_2", - "right_legu_1", - "right_legl_1", - "right_legl_2", - "left_legu_1", - "left_legl_1", - "left_legl_2" -}; - -static char* s_Civilian2ModelNodes[] = -{ - "pelvis_1", - "torso_1", - "head_1", - "head_2", - "head_3", - "right_armu_1", - "right_arml_1", - "right_arml_2", - "left_armu_1", - "left_arml_1", - "left_arml_2", - "right_legu_1", - "right_legl_1", - "right_legl_2", - "left_legu_1", - "left_legl_1", - "left_legl_2" -}; - -static char* s_RakshaModelNodes[] = -{ - "torso", - "pelvis", - "left_legu", - "left_legl", - "left_legl_foot", - "right_legu", - "right_legl", - "right_legl_foot", - "left_armu", - "left_arml", - "left_arml_hand", - "head", - "right_armu", - "right_arml", - "right_arml_hand" -}; - -static char* s_OfficerModelNodes[] = -{ - "pelvis", - "left_legu", - "left_legl", - "left_legl_foot", - "pelvis_belt", - "right_legu1", - "right_legl1", - "right_legl_foot", - "torso", - "torso_neck", - "head", - "head_hair", - "left_armu", - "left_arml", - "left_arml_hand", - "torso_armor", - "right_armu1", - "right_arml1", - "right_arml_hand" -}; - -static char* s_TrooperModelNodes[] = -{ - "torso", - "left_armu_1", - "left_arml_1", - "left_arml_hand", - "head_1", - "head_2", - "pelvis", - "left_legu_3", - "left_legl_1", - "left_legl_shoe", - "right_legu_3", - "right_legl_1", - "right_legl_shoe", - "right_legu_1", - "right_legu_2", - "left_legu_1", - "left_legu_2", - "pelvis_3", - "pelvis_2", - "pelvis_4", - "right_armu_1", - "right_arml_1", - "right_arml_hand" -}; - -static char* s_EliteTrooperModelNodes[] = -{ - "torso", - "pelvis", - "right_legu_1", - "right_legl_1", - "right_legl_foot", - "left_legu", - "left_legl_shin", - "left_legl_foot", - "head_neck1", - "head", - "head_visor", - "left_armu_shoulder", - "left_armu", - "left_arml", - "right_armu_shoulder", - "right_armu", - "right_arml" -}; - -static char* s_ShockTrooperModelNodes[] = -{ - "torso", - "pelvis", - "left_legu", - "left_legl", - "left_legl_foot", - "right_legu", - "right_legl", - "right_legl_foot", - "head", - "torso_1", - "left_armu", - "left_arml", - "left_arml_hand", - "right_armu", - "right_arml", - "right_arml_hand" -}; - -static char* s_EliteShockTrooperModelNodes[] = -{ - "torso_1", - "pelvis", - "left_legu", - "left_legl_shin", - "left_legl_foot", - "right_legu", - "right_legl_shin", - "right_legl_foot", - "head", - "torso_2", - "left_armu_shoulder", - "left_arml_forearm", - "left_arml_hand", - "left_armu_bigspike", - "left_armu_smallspike", - "right_armu_shoulder", - "right_arml_forearm", - "right_arml_hand", - "right_armu_bigspike", - "right_armu_smallspike" -}; - -static char* s_TenmaModelNodes[] = -{ - "torso", - "pelvis", - "right_legu", - "right_legl_shin", - "right_legl_foot", - "left_legu", - "left_legl_shin", - "left_legl_foot", - "head", - "right_armu_chest", - "right_armu", - "right_armu_elbow", - "right_arml_forearm", - "right_arml_hand", - "left_armu_chest", - "left_armu", - "left_armu_elbow", - "left_arml_forearm", - "left_arml_hand" -}; +### AVC Model Nodes +- torso_bars +- torso +- right_armu_torso +- right_armu_shoulder +- right_armu +- right_arml +- right_arml_hand +- pelvis_3 +- pelvis_2 +- pelvis +- right_legu +- right_legl +- right_legl_1 +- right_legl_2 +- right_legl_foot +- left_legu +- left_legl +- left_legl_2 +- left_legl_1 +- left_legl_foot +- left_armu_torso +- left_armu_shoulder +- left_armu +- left_arml +- left_arml_hand +- head + +### Akuma Model Nodes +- pelvis +- torso_1 +- torso_2 +- right_armu_1 +- right_armu_2 +- right_arml_1 +- right_arml_2 +- right_armu_3 +- torso_3 +- torso_4 +- head_1 +- head_2 +- head_3 +- head_4 +- head_5 +- head_6 +- head_7 +- head_8 +- head_9 +- torso_5 +- torso_7 +- left_armu_1 +- left_armu_2 +- left_arml_1 +- left_arml_2 +- left_armu_3 +- torso_6 +- torso_8 +- torso_9 +- torso_10 +- torso_11 +- torso_12 +- torso_13 +- torso_14 +- right_legu_1 +- right_legu_2 +- right_legl_1 +- right_legl_2 +- right_legl_3 +- right_legl_4 +- right_legl_5 +- right_legl_6 +- right_legl_7 +- left_legu_1 +- left_legu_2 +- left_legl_1 +- left_legl_2 +- left_legl_3 +- left_legl_4 +- left_legl_5 +- left_legl_6 +- left_legl_7 + +### Andra 5 Model Nodes +- pelvis_1 +- torso +- torso_2 +- left_armu_1 +- left_armu_2 +- left_arml +- left_arml_hand +- torso_1 +- right_armu_1 +- right_armu_2 +- right_arml +- right_arml_hand +- pelvis +- left_legu_1 +- left_legu_2 +- left_legl_1 +- left_legl_foot +- right_legu_1 +- right_legu_2 +- right_legl_1 +- right_legl_foot +- head + +### Andra 10 Model Nodes +- torso +- pelvis +- left_legu +- left_legu_1 +- left_legl +- left_legl_heel +- left_legl_foot +- right_legu +- right_legu_1 +- right_legl +- right_legl_heel +- right_legl_foot +- torso_2 +- right_armu_shoulder +- right_armu +- right_arml +- right_arml_hand +- head +- torso_1 +- left_armu_shoulder +- left_armu +- left_arml +- left_arml_shield +- left_arml_hand + +### Assassin Model Nodes +- head +- pelvis +- left_legu +- left_legl +- left_legl_foot +- right_legu +- right_legl +- right_legl_foot +- left_armu_missle +- left_armu_wing +- left_armu_shoulder +- left_armu +- left_arml +- left_arml_hand +- left_arml_armshield +- left_armu_shldrjnt +- left_armu_shoulderwing +- left_armu_antannae +- right_armu_missle1 +- right_armu_wing +- right_armu_shoulder +- right_armu +- right_arml +- right_arml_hand +- right_arml_shield +- right_armu_shldjnt +- right_armu_shouldershld +- right_armu_antennae + +### Enforcer Model Nodes +- torso_1 +- torso_2 +- pelvis_1 +- pelvis_2 +- left_legu_1 +- left_legu_2 +- left_legl_1 +- left_legl_2 +- left_legl_3 +- left_legl_shoe +- left_legl_4 +- left_legl_5 +- left_legl_6 +- left_legl_7 +- left_legl_8 +- right_legu_1 +- right_legu_2 +- right_legl_1 +- right_legl_2 +- right_legl_3 +- right_legl_shoe +- right_legl_4 +- right_legl_5 +- right_legl_6 +- right_legl_7 +- right_legl_8 +- head_2 +- head_3 +- head_1 +- head_4 +- head_5 +- head_6 +- head_7 +- head_8 +- left_armu_4 +- left_armu_5 +- left_armu_1 +- left_armu_2 +- left_armu_3 +- left_arml_1 +- left_arml_2 +- left_arml_3 +- left_arml_hand +- right_armu_1 +- right_armu_2 +- right_armu_3 +- right_armu_4 +- right_armu_5 +- right_arml_1 +- right_arml_2 +- right_arml_3 +- right_arml_hand + +### Ordog Model Nodes +- torso +- right_armu_spike +- left_armu_spike_lower +- right_armu_shoulder +- right_armu +- right_arml +- right_arml_hand +- head +- left_armu_shoulder +- left_armu +- left_arml +- left_arml_hand +- left_armu_spike +- left_armu_spike_lower +- torso_lower +- torso_lower_2 +- pelvis +- right_legu +- right_legl +- right_legl_foot +- right_legu_crotchjoint +- left_legu_crotchjoint +- left_legu_2 +- left_legl +- left_legl_foot + +### Predator Model Nodes +- torso_upper +- torso_lower +- pelvis_upper +- right_legu_thigh +- right_legu_hippack +- right_legu_knee +- right_legl_shin +- right_legl_knee +- right_legl_foot1 +- right_legl_toe +- right_legl_heel +- pelvis_lower +- left_legu_thigh +- left_legu_hippack +- left_legu_knee +- left_legl_shin +- left_legl_knee +- left_legl_foot +- left_legl_toe +- left_legl_heel +- Torso_rightplate +- right_armu_chestlight1 +- right_armu_chestlight2 +- Torso_R_thruster_box +- torso_R_thruster_box_lid +- torso_R_thruster +- right_armu_1 +- right_armu_elbospike +- right_arml +- right_arml_1 +- right_arml_wrist +- Right_arml_hand +- right_armu_3 +- right_armu_2 +- head_back +- head_right_earbase +- head_rightear +- head_leftearbase +- head_leftear +- head_lowervisor +- head_neck +- head_visor +- head_top +- head_topvisor +- left_armu_chestlight1 +- left_armu_chestlight2 +- torso_leftplate +- torso_L_thruster_box +- torso_L_thruster_panel +- torso_L_thruster +- left_armu_1 +- left_armu_elbowspike +- left_arml_elbow +- left_arml_1 +- left_arml_wrist +- left_arml_hand +- left_armu_2 +- left_armu_3 + +### Little Boy Model Nodes +- pelvis_1 +- torso_1 +- head_1 +- head_2 +- head_3 +- left_armu_1 +- left_arml_1 +- left_arml_2 +- right_armu_1 +- right_arml_1 +- right_arml_2 +- torso_2 +- torso_3 +- torso_4 +- torso_5 +- torso_6 +- left_legu_1 +- left_legl_1 +- left_legl_2 +- right_legu_1 +- right_legl_1 +- right_legl_2 + +### Little Girl Model Nodes +- torso +- head_neck +- head +- head_hair +- left_armu +- left_arml +- left_arml_hand +- right_armu +- right_arml +- right_arml_hand +- torso_backpack +- torso_backpack1 +- torso_backpack2 +- left_armu_strap +- right_armu_strap +- right_legu_skirt +- right_legu +- right_legl +- right_legl_foot +- left_legu_skirt +- left_legu +- left_legl +- left_legl_foo + +### Civilian 1 Model Nodes +- pelvis_1 +- torso_1 +- head_1 +- head_2 +- head_3 +- left_armu_1 +- left_arml_1 +- left_arml_2 +- right_armu_1 +- right_arml_1 +- right_arml_2 +- right_legu_1 +- right_legl_1 +- right_legl_2 +- left_legu +- left_legl_1 +- left_legl_2 + +### Civilian 1b Model Nodes +- pelvis_1 +- torso_1 +- left_armu_1 +- left_arml_1 +- left_arml_2 +- torso_2 +- head_2 +- head_1 +- right_armu_1 +- right_arml_1 +- right_arml_2 +- right_legu_1 +- right_legl_1 +- right_legl_2 +- left_legu_1 +- left_legl_1 +- left_legl_2 + +### Civilian 2 Model Nodes +- pelvis_1 +- torso_1 +- head_1 +- head_2 +- head_3 +- right_armu_1 +- right_arml_1 +- right_arml_2 +- left_armu_1 +- left_arml_1 +- left_arml_2 +- right_legu_1 +- right_legl_1 +- right_legl_2 +- left_legu_1 +- left_legl_1 +- left_legl_2 + +### Raksha Model Nodes +- torso +- pelvis +- left_legu +- left_legl +- left_legl_foot +- right_legu +- right_legl +- right_legl_foot +- left_armu +- left_arml +- left_arml_hand +- head +- right_armu +- right_arml +- right_arml_hand + +### Officer Model Nodes +- pelvis +- left_legu +- left_legl +- left_legl_foot +- pelvis_belt +- right_legu1 +- right_legl1 +- right_legl_foot +- torso +- torso_neck +- head +- head_hair +- left_armu +- left_arml +- left_arml_hand +- torso_armor +- right_armu1 +- right_arml1 +- right_arml_hand + +### Trooper Model Nodes +- torso +- left_armu_1 +- left_arml_1 +- left_arml_hand +- head_1 +- head_2 +- pelvis +- left_legu_3 +- left_legl_1 +- left_legl_shoe +- right_legu_3 +- right_legl_1 +- right_legl_shoe +- right_legu_1 +- right_legu_2 +- left_legu_1 +- left_legu_2 +- pelvis_3 +- pelvis_2 +- pelvis_4 +- right_armu_1 +- right_arml_1 +- right_arml_hand + +### Elite Trooper Model Nodes +- torso +- pelvis +- right_legu_1 +- right_legl_1 +- right_legl_foot +- left_legu +- left_legl_shin +- left_legl_foot +- head_neck1 +- head +- head_visor +- left_armu_shoulder +- left_armu +- left_arml +- right_armu_shoulder +- right_armu +- right_arml + +### Shock Trooper Model Nodes +- torso +- pelvis +- left_legu +- left_legl +- left_legl_foot +- right_legu +- right_legl +- right_legl_foot +- head +- torso_1 +- left_armu +- left_arml +- left_arml_hand +- right_armu +- right_arml +- right_arml_hand + +### Elite Shock Trooper Model Nodes +- torso_1 +- pelvis +- left_legu +- left_legl_shin +- left_legl_foot +- right_legu +- right_legl_shin +- right_legl_foot +- head +- torso_2 +- left_armu_shoulder +- left_arml_forearm +- left_arml_hand +- left_armu_bigspike +- left_armu_smallspike +- right_armu_shoulder +- right_arml_forearm +- right_arml_hand +- right_armu_bigspike +- right_armu_smallspike + +### Tenma Model Nodes +- torso +- pelvis +- right_legu +- right_legl_shin +- right_legl_foot +- left_legu +- left_legl_shin +- left_legl_foot +- head +- right_armu_chest +- right_armu +- right_armu_elbow +- right_arml_forearm +- right_arml_hand +- left_armu_chest +- left_armu +- left_armu_elbow +- left_arml_forearm +- left_arml_hand ## ABCv6 Animation Names -#define ANIM_WALK_KNIFE "WK" -#define ANIM_WALK_KNIFE_ATTACK "WAK" -#define ANIM_WALK_BKNIFE "WKB" -#define ANIM_WALK_BKNIFE_ATTACK "WAKB" -#define ANIM_WALK_STRAFEL_KNIFE "WSLK" -#define ANIM_WALK_STRAFER_KNIFE "WSRK" -#define ANIM_WALK_STRAFEL_KNIFE_ATTACK "WSLAK" -#define ANIM_WALK_STRAFER_KNIFE_ATTACK "WSRAK" - -#define ANIM_RUN_KNIFE "RK" -#define ANIM_RUN_KNIFE_ATTACK "RAK" -#define ANIM_RUN_BKNIFE "RKB" -#define ANIM_RUN_BKNIFE_ATTACK "RAKB" -#define ANIM_RUN_STRAFEL_KNIFE "RSLK" -#define ANIM_RUN_STRAFER_KNIFE "RSRK" -#define ANIM_RUN_STRAFEL_KNIFE_ATTACK "RSLAK" -#define ANIM_RUN_STRAFER_KNIFE_ATTACK "RSRAK" - -#define ANIM_CROUCH_KNIFE "CK" -#define ANIM_CROUCH_KNIFE_ATTACK "CAK" -#define ANIM_CROUCH_WALK_KNIFE "CWK" -#define ANIM_CROUCH_WALK_KNIFE_ATTACK "CWAK" -#define ANIM_CROUCH_WALK_BKNIFE "CWKB" -#define ANIM_CROUCH_WALK_BKNIFE_ATTACK "CWAKB" -#define ANIM_CROUCH_STRAFEL_KNIFE "CSLK" -#define ANIM_CROUCH_STRAFER_KNIFE "CSRK" -#define ANIM_CROUCH_STRAFEL_KNIFE_ATTACK "CSLAK" -#define ANIM_CROUCH_STRAFER_KNIFE_ATTACK "CSRAK" - -#define ANIM_STAND_RIFLE_ATTACK "SR" -#define ANIM_STAND_KNIFE_ATTACK "SK" - -#define ANIM_WALK_RIFLE "WR" -#define ANIM_WALK_RIFLE_ATTACK "WR" -#define ANIM_WALK_BRIFLE "WRB" -#define ANIM_WALK_BRIFLE_ATTACK "WRB" -#define ANIM_WALK_STRAFEL_RIFLE "WSLR" -#define ANIM_WALK_STRAFER_RIFLE "WSRR" -#define ANIM_WALK_STRAFEL_RIFLE_ATTACK "WSLR" -#define ANIM_WALK_STRAFER_RIFLE_ATTACK "WSRR" - -#define ANIM_RUN_RIFLE "RR" -#define ANIM_RUN_RIFLE_ATTACK "RR" -#define ANIM_RUN_BRIFLE "RRB" -#define ANIM_RUN_BRIFLE_ATTACK "RRB" -#define ANIM_RUN_STRAFEL_RIFLE "RSLR" -#define ANIM_RUN_STRAFER_RIFLE "RSRR" -#define ANIM_RUN_STRAFEL_RIFLE_ATTACK "RSLR" -#define ANIM_RUN_STRAFER_RIFLE_ATTACK "RSRR" - - -#define ANIM_CROUCH_RIFLE "CR" -#define ANIM_CROUCH_RIFLE_ATTACK "CR" -#define ANIM_CROUCH_WALK_RIFLE "CWR" -#define ANIM_CROUCH_WALK_RIFLE_ATTACK "CWR" -#define ANIM_CROUCH_WALK_BRIFLE "CWRB" -#define ANIM_CROUCH_WALK_BRIFLE_ATTACK "CWRB" -#define ANIM_CROUCH_STRAFEL_RIFLE "CSLR" -#define ANIM_CROUCH_STRAFER_RIFLE "CSRR" -#define ANIM_CROUCH_STRAFEL_RIFLE_ATTACK "CSLR" -#define ANIM_CROUCH_STRAFER_RIFLE_ATTACK "CSRR" - -#define ANIM_POSE1 "POSE1" -#define ANIM_POSE2 "POSE2" - -#define ANIM_IDLE_RIFLE1 "IR1" -#define ANIM_IDLE_RIFLE2 "IR2" -#define ANIM_IDLE_RIFLE3 "IR3" -#define ANIM_IDLE_RIFLE4 "IR4" -#define ANIM_IDLE_RIFLE5 "IR5" - -#define ANIM_IDLE_KNIFE1 "IK1" -#define ANIM_IDLE_KNIFE2 "IK2" - -#define ANIM_JUMP_UP "JUMP_UP" -#define ANIM_JUMP_DOWN "JUMP_DOWN" -#define ANIM_LANDING "LANDING" - -#define ANIM_TRANSFORM "TRANSFORM" -#define ANIM_INVERSE_TRANSFORM "INVERSE_TRANSFORM" -#define ANIM_VEHICLE "VEHICLE" - -#define ANIM_SWIM "SWIM" +- WK (walk knife) +- WAK (walk knife attack) +- WKB (walk back knife) +- WAKB (walk back knife attack) +- WSLK (walk strafe left knife) +- WSRK (walk strafe right knife) +- WSLAK (walk strafe left knife attack) +- WSRAK (walk strafe right knife attack) +- RK (run knife) +- RAK (run knife attack) +- RKB (run back knife) +- RAKB (run back knife attack) +- RSLK (run strafe left knife) +- RSRK (run strafe right knife) +- RSLAK (run strafe left knife attack) +- RSRAK (run strafe right knife attack) +- CK (crouch knife) +- CAK (crouch knife attack) +- CWK (crouch walk knife) +- CWAK (crouch walk knife attack) +- CWKB (crouch walk back knife) +- CWAKB (crouch walk back knife attack) +- CSLK (crouch strafe left knife) +- CSRK (crouch strafe right knife) +- CSLAK (crouch strafe left knife attack) +- CSRAK (crouch strafe right knife attack) +- SR (stand rifle attack) +- SK (stand knife attack) +- WR (walk rifle) +- WR (walk rifle attack) +- WRB (walk back rifle) +- WRB (walk back rifle attack) +- WSLR (walk strafe left rifle) +- WSRR (walk strafe right rifle) +- WSLR (walk strafe left rifle attack) +- WSRR (walk strafe right rifle attack) +- RR (run rifle) +- RR (run rifle attack) +- RRB (run back rifle) +- RRB (run back rifle attack) +- RSLR (run strafe left rifle) +- RSRR (run strafe right rifle) +- RSLR (run strafe left rifle attack) +- RSRR (run strafe right rifle attack) +- CR (crouch rifle) +- CR (crouch rifle attack) +- CWR (crouch walk rifle) +- CWR (crouch walk rifle attack) +- CWRB (crouch walk back rifle) +- CWRB (crouch walk back rifle attack) +- CSLR (crouch strafe left rifle) +- CSRR (crouch strafe right rifle) +- CSLR (crouch strafe left rifle attack) +- CSRR (crouch strafe right rifle attack) +- POSE1 (pose 1) +- POSE2 (pose 2) +- IR1 (idle rifle 1) +- IR2 (idle rifle 2) +- IR3 (idle rifle 3) +- IR4 (idle rifle 4) +- IR5 (idle rifle 5) +- IK1 (idle knife 1) +- IK2 (idle knife 2) +- JUMP_UP +- JUMP_DOWN +- LANDING +- TRANSFORM (robot to vehicle) +- INVERSE_TRANSFORM (vehicle to robot) +- VEHICLE +- SWIM Animation names for PV weapon models: - Select @@ -694,12 +641,20 @@ Animation names for PV weapon models: ## ABCv6 Frame String Commands +Shogo's frame strings seem to be simpler than Blood 2's, using space as a separator, and not allowing more than one command per keyframe + For characters/enemies: - FOOTSTEP_KEY -- SETDIMS:optional float x, optional float y, optional float z (note: you cannot specify y without specifying x, and you cannot specify z without specifying y) -- MOVE:optional float x, optional float y, optional float z (note: you cannot specify y without specifying x, and you cannot specify z without specifying y) -- PLAYSOUND:string sound_file, optional int radius +- SETDIMS optional float x, optional float y, optional float z (note: you cannot specify y without specifying x, and you cannot specify z without specifying y) +- MOVE optional float x, optional float y, optional float z (note: you cannot specify y without specifying x, and you cannot specify z without specifying y) +- PLAYSOUND string sound_file, optional int radius For PV weapons: - FIRE_KEY -- SOUND_KEY:string sound_file \ No newline at end of file +- SOUND_KEY string sound_file + +## Examples: + +- For a PV weapon to actually fire: fire_key +- To play a sound on a PV weapon: SOUND_KEY juggernaut\reload1 +- To play a sound on a character model: PlaySound Sounds\Player\Mech\transform.wav \ No newline at end of file diff --git a/doc/abc-v6-vert-anim-basics.md b/doc/abc-v6-vert-anim-basics.md index 078d826..999bd57 100644 --- a/doc/abc-v6-vert-anim-basics.md +++ b/doc/abc-v6-vert-anim-basics.md @@ -3,12 +3,18 @@ Vertex animations utilize the shape key feature of Blender. An example .blend can be found [here](./abc-v6-export-basics/minimal_abc-v6_vert_anim.blend) ## Basics -The exporter will ignore vertex animations entirely if you have less than 2 shape keys. -The exporter will ignore any "d_" prefixed actions, they're expected to contain animation of shape keys themselves, or bones that drive shape keys, etc. + +Select the mesh (not the armature!), and go to the Dope Sheet's Shape Key Editor, create new action with the same name as the animation the vertex animation will be applied to, prefixed with "d_", eg. test_anim and d_test_anim + +![](./abc-v6-vert-anim-basics/action_list.png) + +Create the shape keys, use mesh edit mode to manipulate them to whatever shape you like. ![](./abc-v6-vert-anim-basics/shape_keys.png) -## Misc. Tips -- Nothing here yet +Now you can animate the values of each shape key in the Shape Key Editor. + +![](./abc-v6-vert-anim-basics/shape_key_keyframes.png) -![](./abc-v6-vert-anim-basics/action_list.png) \ No newline at end of file +## Misc. Tips +- Vertex animations will be skipped entirely if you have less than 2 shape keys \ No newline at end of file diff --git a/doc/abc-v6-vert-anim-basics/shape_key_keyframes.png b/doc/abc-v6-vert-anim-basics/shape_key_keyframes.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcb60829dc0cce51246d9baa8b6dcf78f06237d GIT binary patch literal 24944 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