| 2010 | #define rigged_object_RotateBoneToMatchVec(A, B, C) (RotateBoneToMatchVec(&rigged_object, A, B, C)) |
| 2011 | |
| 2012 | static void CDisplayMatrixUpdateImpl( |
| 2013 | MovementObject* mo, |
| 2014 | float breath_amount, |
| 2015 | const CScriptArrayWrapper<int>& ik_chain_start_index, |
| 2016 | const CScriptArrayWrapper<int>& ik_chain_elements, |
| 2017 | const CScriptArrayWrapper<BoneTransform>& skeleton_bind_transforms, |
| 2018 | const CScriptArrayWrapper<BoneTransform>& inv_skeleton_bind_transforms) { |
| 2019 | MovementObject& this_mo = *mo; |
| 2020 | RiggedObject& rigged_object = *this_mo.rigged_object(); |
| 2021 | |
| 2022 | float scale = rigged_object.GetCharScale(); |
| 2023 | int chest_bone = ik_chain_elements[ik_chain_start_index[kTorsoIK]]; |
| 2024 | BoneTransform world_chest = BoneTransform(rigged_object.display_bone_matrices[chest_bone]) * inv_skeleton_bind_transforms[chest_bone]; |
| 2025 | vec3 breathe_dir = world_chest.rotation * normalize(vec3(0, 0, 1)); |
| 2026 | vec3 breathe_front = world_chest.rotation * normalize(vec3(0, 1, 0)); |
| 2027 | vec3 breathe_side = world_chest.rotation * normalize(vec3(1, 0, 0)); |
| 2028 | |
| 2029 | for (int i = 0; i < 2; ++i) { |
| 2030 | int collar_bone = ik_chain_elements[ik_chain_start_index[kLeftArmIK + i] + 5]; |
| 2031 | BoneTransform collar = BoneTransform(rigged_object.display_bone_matrices[collar_bone]) * inv_skeleton_bind_transforms[collar_bone]; |
| 2032 | collar.origin += breathe_dir * breath_amount * 0.01f * scale; |
| 2033 | collar.origin += breathe_front * breath_amount * 0.01f * scale; |
| 2034 | collar = collar * skeleton_bind_transforms[collar_bone]; |
| 2035 | rigged_object.display_bone_matrices[collar_bone] = collar.GetMat4(); |
| 2036 | |
| 2037 | int shoulder_bone = ik_chain_elements[ik_chain_start_index[kLeftArmIK + i] + 4]; |
| 2038 | BoneTransform shoulder = BoneTransform(rigged_object.display_bone_matrices[shoulder_bone]) * inv_skeleton_bind_transforms[shoulder_bone]; |
| 2039 | shoulder.origin += breathe_dir * breath_amount * 0.002f * scale; |
| 2040 | shoulder = shoulder * skeleton_bind_transforms[shoulder_bone]; |
| 2041 | rigged_object.display_bone_matrices[shoulder_bone] = shoulder.GetMat4(); |
| 2042 | } |
| 2043 | |
| 2044 | world_chest.origin += breathe_dir * breath_amount * 0.01f * scale; |
| 2045 | world_chest.origin += breathe_front * breath_amount * 0.01f * scale; |
| 2046 | world_chest.rotation = quaternion(vec4(breathe_side.x(), breathe_side.y(), breathe_side.z(), breath_amount * 0.05f)) * world_chest.rotation; |
| 2047 | world_chest = world_chest * skeleton_bind_transforms[chest_bone]; |
| 2048 | rigged_object.display_bone_matrices[chest_bone] = world_chest.GetMat4(); |
| 2049 | |
| 2050 | int abdomen_bone = ik_chain_elements[ik_chain_start_index[kTorsoIK] + 1]; |
| 2051 | BoneTransform abdomen = BoneTransform(rigged_object.display_bone_matrices[abdomen_bone]) * inv_skeleton_bind_transforms[abdomen_bone]; |
| 2052 | abdomen.origin += breathe_dir * breath_amount * 0.008f * scale; |
| 2053 | abdomen.origin += breathe_front * breath_amount * 0.005f * scale; |
| 2054 | abdomen.rotation = quaternion(vec4(breathe_side.x(), breathe_side.y(), breathe_side.z(), breath_amount * -0.02f)) * abdomen.rotation; |
| 2055 | abdomen = abdomen * skeleton_bind_transforms[abdomen_bone]; |
| 2056 | rigged_object.display_bone_matrices[abdomen_bone] = abdomen.GetMat4(); |
| 2057 | |
| 2058 | int neck_bone = ik_chain_elements[ik_chain_start_index[kHeadIK] + 1]; |
| 2059 | BoneTransform neck = BoneTransform(rigged_object.display_bone_matrices[neck_bone]) * inv_skeleton_bind_transforms[neck_bone]; |
| 2060 | neck.origin += breathe_dir * breath_amount * 0.005f * scale; |
| 2061 | neck = neck * skeleton_bind_transforms[neck_bone]; |
| 2062 | rigged_object.display_bone_matrices[neck_bone] = neck.GetMat4(); |
| 2063 | } |
| 2064 | |
| 2065 | static void CDisplayMatrixUpdate(MovementObject* mo) { |
| 2066 | PROFILER_ZONE(g_profiler_ctx, "C++ Display Matrix Update") |
no test coverage detected