//============ Copyright (c) Valve Corporation, All rights reserved. ============ // // Generic constraint functions to compute bone constraints // Used by studio/engine, SFM & Maya // // Studio interface functions to the generic constraint functions // //=============================================================================== #ifndef BONE_CONSTRAINTS_H #define BONE_CONSTRAINTS_H #ifdef _WIN32 #pragma once #endif //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- struct mstudiobone_t; class CBoneAccessor; class CStudioHdr; struct mstudioconstrainttarget_t; struct mstudioconstraintslave_t; //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- class CConstraintBones { public: enum AimConstraintUpType_t { AC_UP_TYPE_OBJECT_ROTATION, // Use supplied vector rotated by the specified object as up vector (Maya: Object Rotation Up), if no dag is supplied, reverts to Vector AC_UP_TYPE_VECTOR, // Use supplied vector as up vector (Maya: Vector) AC_UP_TYPE_OBJECT, // Use vector from slave to specified object in world space as up vector( Maya: Object Up), if no dag is supplied, reverts to Vector AC_UP_TYPE_PARENT_ROTATION, // Use supplied vector rotated by the parent object as up vector (Maya: None) AC_UP_TYPE_FIRST = AC_UP_TYPE_OBJECT_ROTATION, // The smallest possible value AC_UP_TYPE_LAST = AC_UP_TYPE_PARENT_ROTATION, // The largest possible value }; // Compute the aggregate target position and orientation from the weighted target list and return // the resulting position and orientation in addition to updating the target dag. // All passed arrays must be nTargetCount in length static float ComputeTargetPosition( Vector &vTargetPosition, int nTargetCount, float *flTargetWeights, Vector *vTargetPositions, Vector *vTargetOffsets ); // Compute the aggregate target orientation from the weighted target list and // return the total weight // All passed arrays must be nTargetCount in length static float ComputeTargetOrientation( Quaternion &qTargetOrientation, int nTargetCount, float *pflTargetWeights, Quaternion *pqTargetOrientations, Quaternion *pqTargetOffsets ); // Compute the aggregate target position and orientation from the weighted // target list and return the total weight // All passed arrays must be nTargetCount in length static float ComputeTargetPositionOrientation( Vector &vTargetPosition, Quaternion &qTargetOrientation, int nTargetCount, float *pflTargetWeights, Vector *vTargetPositions, Vector *vTargetOffsets, Quaternion *pqTargetOrientations, Quaternion *pqTargetOffsets ); // Compute the aggregate target position and orientation from the weighted // target list and return the total weight // All passed arrays must be nTargetCount in length static float ComputeTargetPositionOrientation( Vector &vTargetPosition, Quaternion &qTargetOrientation, int nTargetCount, float *pflTargetWeights, matrix3x4a_t *pmTargets, matrix3x4a_t *pmOffsets ); static void ComputeAimConstraintOffset( Quaternion &qAimOffset, bool bPreserveOffset, const Vector &vTargetWorldPos, const matrix3x4_t &mSlaveParentToWorld, const Vector &vUp, const Vector &vSlaveLocalPos, const Quaternion &qSlaveLocal, matrix3x4_t *pmUpToWorld, AimConstraintUpType_t eUpType ); // Calculate the orientation needed to make a transform where the y // vector of the transform matches the forward vector and the z vector matches // the up reference vector as closely as possible. The x vector will be in the // plane defined by using the forward vector as the normal. static void ComputeAimConstraintAimAt( Quaternion &qAim, const Vector &vForward, const Vector &vReferenceUp ); // Given the various parameters, computes the local vForward & vReferenceUp // and calls ComputeAimConstraintAimAt static void ComputeAimConstraint( Quaternion &qAim, const Vector &vTargetWorldPos, const matrix3x4_t &mParentToWorld, const Vector &vUp, const Vector &vSlaveLocalPos, const matrix3x4_t *pmUpToWorld, AimConstraintUpType_t eUpType ); //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- static void ComputeWorldUpVector( Vector *pvWorldUp, const matrix3x4_t & mParentToWorld, const Vector &vUp, const Vector &vSlaveLocalPos, const matrix3x4_t *pmUpToWorld, AimConstraintUpType_t eUpType ); }; //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- class CStudioConstraintBones : public CConstraintBones { public: // Utilities static float ComputeTargetPosition( Vector &vTargetPosition, mstudioconstrainttarget_t *pTargets, int nTargetCount, CBoneAccessor &boneToWorld ); static float ComputeTargetOrientation( Quaternion &qTargetOrientation, mstudioconstrainttarget_t *pTargets, int nTargetCount, CBoneAccessor &boneToWorld ); static float ComputeTargetPositionOrientation( Vector &vTargetPosition, Quaternion &qTargetOrientation, mstudioconstrainttarget_t *pTargets, int nTargetCount, CBoneAccessor &boneToWorld ); static void ComputeBaseWorldMatrix( matrix3x4a_t &mBaseWorldMatrix, mstudioconstraintslave_t *pSlave, CBoneAccessor &boneToWorld, const CStudioHdr *pStudioHdr, const matrix3x4_t *pmViewTransform = NULL ); // constraints static void ComputePointConstraint( const mstudiobone_t *pBones, int nBone, CBoneAccessor &boneToWorld, const CStudioHdr *pStudioHdr ); static void ComputeOrientConstraint( const mstudiobone_t *pBones, int nBone, CBoneAccessor &boneToWorld, const CStudioHdr *pStudioHdr, const matrix3x4_t *pmViewTransform ); static void ComputeAimConstraint( const mstudiobone_t *pBones, int nBone, CBoneAccessor &boneToWorld, const CStudioHdr *pStudioHdr, const matrix3x4_t *pmViewTransform, AimConstraintUpType_t eType ); static void ComputeParentConstraint( const mstudiobone_t *pBones, int nBone, CBoneAccessor &boneToWorld, const CStudioHdr *pStudioHdr ); }; #endif // BONE_CONSTRAINTS_H