| 3567 | } |
| 3568 | |
| 3569 | static void CUpdateShadowImpl( |
| 3570 | MovementObject* mo, |
| 3571 | int& shadow_id, |
| 3572 | int& lf_shadow_id, |
| 3573 | int& rf_shadow_id, |
| 3574 | const CScriptArrayWrapper<BoneTransform>& skeleton_bind_transforms) { |
| 3575 | MovementObject& this_mo = *mo; |
| 3576 | RiggedObject& rigged_object = *this_mo.rigged_object(); |
| 3577 | Skeleton& skeleton = rigged_object.skeleton(); |
| 3578 | |
| 3579 | int bone = ASIKBoneStart(&skeleton, "torso"); |
| 3580 | BoneTransform transform = rigged_object.display_bone_matrices[bone]; |
| 3581 | BoneTransform bind_matrix = invert(skeleton_bind_transforms[bone]); |
| 3582 | transform = transform; |
| 3583 | vec3 torso = transform * skeleton.points[skeleton.bones[bone].points[0]]; |
| 3584 | |
| 3585 | bone = ASIKBoneStart(&skeleton, "head"); |
| 3586 | transform = rigged_object.display_bone_matrices[bone]; |
| 3587 | bind_matrix = invert(skeleton_bind_transforms[bone]); |
| 3588 | transform = transform; |
| 3589 | vec3 head = transform * skeleton.points[skeleton.bones[bone].points[0]]; |
| 3590 | |
| 3591 | bone = ASIKBoneStart(&skeleton, "left_leg"); |
| 3592 | transform = rigged_object.display_bone_matrices[bone]; |
| 3593 | bind_matrix = invert(skeleton_bind_transforms[bone]); |
| 3594 | transform = transform; |
| 3595 | vec3 left_foot = transform * skeleton.points[skeleton.bones[bone].points[0]]; |
| 3596 | |
| 3597 | bone = ASIKBoneStart(&skeleton, "right_leg"); |
| 3598 | transform = rigged_object.display_bone_matrices[bone]; |
| 3599 | bind_matrix = invert(skeleton_bind_transforms[bone]); |
| 3600 | transform = transform; |
| 3601 | vec3 right_foot = transform * skeleton.points[skeleton.bones[bone].points[0]]; |
| 3602 | |
| 3603 | { |
| 3604 | if (shadow_id == -1) { |
| 3605 | shadow_id = ASCreateObject("Data/Objects/Decals/blob_shadow.xml", true); |
| 3606 | } |
| 3607 | |
| 3608 | Object* shadow_obj = ReadObjectFromID(shadow_id); |
| 3609 | vec3 scale = vec3(1.5f, max(1.5f, distance((left_foot + right_foot) * 0.5f, head) * 2.0f), 1.5f); |
| 3610 | shadow_obj->SetScale(scale); |
| 3611 | |
| 3612 | shadow_obj->SetTranslation(torso + vec3(0.0f, -0.3f, 0.0f)); |
| 3613 | } |
| 3614 | |
| 3615 | { |
| 3616 | if (lf_shadow_id == -1) { |
| 3617 | lf_shadow_id = ASCreateObject("Data/Objects/Decals/blob_shadow.xml", true); |
| 3618 | } |
| 3619 | |
| 3620 | Object* shadow_obj = ReadObjectFromID(lf_shadow_id); |
| 3621 | |
| 3622 | shadow_obj->SetTranslation(left_foot + vec3(0.0f)); |
| 3623 | shadow_obj->SetScale(vec3(0.4f)); |
| 3624 | } |
| 3625 | |
| 3626 | { |
no test coverage detected