2021-11-30 21:29:18 -06:00
// odplot productions is a trademarked name. Project Yugh is a copyrighted property. This code, however, is free to be copy and extended as you see fit.
# ifndef THIRDPERSONFOLLOW_H
# define THIRDPERSONFOLLOW_H
# include "transform.h"
2023-05-30 11:39:22 -05:00
# include "HandmadeMath.h"
2021-11-30 21:29:18 -06:00
struct follow {
2023-05-12 13:22:05 -05:00
float distance ;
2023-05-24 20:45:50 -05:00
HMM_Quat target_rot ;
2021-11-30 21:29:18 -06:00
} ;
2023-05-30 11:39:22 -05:00
HMM_Vec3 follow_calccenter ( ) ;
HMM_Vec3 follow_postoffset ( ) ;
HMM_Vec3 extentsoffset ( ) ;
HMM_Vec3 framebasedveclerp ( ) ;
2021-11-30 21:29:18 -06:00
int lerpparam ( float offset , float anchorwidth , float floatwidth ) ;
2023-05-30 11:39:22 -05:00
HMM_Vec3 vec3lerp ( HMM_Vec3 from , HMM_Vec3 to , HMM_Vec3 a ) ;
2021-11-30 21:29:18 -06:00
void follow_calctargets ( ) ;
2023-05-30 11:39:22 -05:00
HMM_Vec3 follow_removelockedrot ( ) ;
2021-11-30 21:29:18 -06:00
void follow_targetoffset ( struct follow * follow ) ;
2023-05-24 20:45:50 -05:00
int float_epsilon ( float a , float b , float e ) ;
2021-11-30 21:29:18 -06:00
/*
//////////////////////////////////////////////////////////////////////////
// A good camera.
//////////////////////////////////////////////////////////////////////////
class ThirdPersonFollow {
public :
enum CameraType {
2023-05-12 13:22:05 -05:00
STATIONARY ,
TRANSLATING ,
ROTATING ,
SPLINE
2021-11-30 21:29:18 -06:00
} ;
enum CameraTransition {
2023-05-12 13:22:05 -05:00
NONE ,
CROSSDISSOLVE ,
WIPE ,
DIP
2021-11-30 21:29:18 -06:00
} ;
enum FrameOfReference {
2023-05-12 13:22:05 -05:00
LOCAL ,
WORLD ,
EXTERNAL
2021-11-30 21:29:18 -06:00
} ;
ThirdPersonFollow ( ) {
2023-05-12 13:22:05 -05:00
// Rotation
RotationSpeed = 10.0f ;
LockPitch = LockYaw = LockRoll = true ;
2021-11-30 21:29:18 -06:00
2023-05-12 13:22:05 -05:00
XDirPosts = false ;
YDirPosts = false ;
ZDirPosts = false ;
2021-11-30 21:29:18 -06:00
2023-05-12 13:22:05 -05:00
// Translation
//FloatWidths = AnchorWidths = CenterVector = glm::vec3(0, 0, 0);
PositionSpeeds = glm : : vec3 ( 2.f , 2.f , 2.f ) ;
//TranslationScales = glm::vec3(1, 1, 1);
2021-11-30 21:29:18 -06:00
2023-05-12 13:22:05 -05:00
// Frame settings
Offset = glm : : vec3 ( 0.f , 0.f , 0.f ) ;
Distance = 10 ;
2021-11-30 21:29:18 -06:00
2023-05-12 13:22:05 -05:00
AnchorSpeed = 80 ;
2021-11-30 21:29:18 -06:00
} ~ ThirdPersonFollow ( ) {
}
Transform * mytransform ;
// An actor that can be given for the camera to base its movement around
// instead of itself. Makes most sense for this to be stationary
Transform * ExternalFrame = nullptr ;
void SetExternalFrame ( Transform * val ) {
2023-05-12 13:22:05 -05:00
ExternalFrame = val ;
2021-11-30 21:29:18 -06:00
}
// The target the camera "looks" at, used for calculations
Transform * Target = nullptr ;
void SetTarget ( Transform * val ) {
2023-05-12 13:22:05 -05:00
Target = val ;
2021-11-30 21:29:18 -06:00
}
// Offset from the target
glm : : vec3 Offset ;
// How far away should the camera act from the target
float Distance ;
///////////////////////////////////////////////////////////////////////////
// Translation variables. In this mode, the camera doesn't rotate to look
// at the target, it only moves around the world.
///////////////////////////////////////////////////////////////////////////
/// "Posts" for each direction in 3D space. These are items that the target
/// is allowed to move within without the camera following along.
bool XDirPosts ;
bool YDirPosts ;
bool ZDirPosts ;
/// The range in ecah direction the camera floats. While within this range,
/// the camera will smoothly glide to the desired position.
glm : : vec3 FloatWidths ;
/// The clamp range for each direction. If the camera reaches this range,
/// it will stick and not move any further.
glm : : vec3 AnchorWidths ;
/// When floating to the target, the speed to float.
glm : : vec3 PositionSpeeds ;
//////////////////////////////////////////////////////////////////////////
// Rotation variables. Used for the camera's rotation mode, where it
// follows the Target without translating.
//////////////////////////////////////////////////////////////////////////
/// Variables to lock its rotation in any of the three directions
bool LockRoll ;
bool LockPitch ;
bool LockYaw ;
glm : : vec3 RotationOffset ;
/// The speed of rotation
float RotationSpeed ;
private :
void CalculateTargetOffset ( ) ;
// Transform of frame of reference
Transform TFOR ;
/// The calculated offset based on frames of reference
glm : : vec3 TargetOffset ;
glm : : vec3 TargetPosition ;
glm : : quat TargetRotation ;
void CalculateTargets ( ) ;
// Calculates
glm : : vec3 CalculatePosition ( ) ;
glm : : vec3 CalculateCenter ( ) ;
/// Given a direction and width, find the offsets.
glm : : vec3 GetPostsOffset ( const glm : : vec3 & DirectionVector ,
2023-05-12 13:22:05 -05:00
float AnchorWidth ) ;
2021-11-30 21:29:18 -06:00
/// Given anchors, what's the anchor width?
glm : : vec3 GetExtentsOffset ( const glm : : vec3 & DirectionVector ,
2023-05-12 13:22:05 -05:00
float AnchorWidth , float TOffset ,
float Width ) ;
2021-11-30 21:29:18 -06:00
glm : : quat RemoveLockedRotation ( const glm : : quat & CurrentRotation ) ;
glm : : vec3 FrameBasedVectorLerp ( const glm : : vec3 & From ,
2023-05-12 13:22:05 -05:00
const glm : : vec3 & To ,
const glm : : vec3 & Speeds , float Tick ) ;
2021-11-30 21:29:18 -06:00
glm : : vec3 VectorLerpPiecewise ( const glm : : vec3 & From ,
2023-05-12 13:22:05 -05:00
const glm : : vec3 & To ,
const glm : : vec3 & Alpha ) ;
2021-11-30 21:29:18 -06:00
bool GetLerpParam ( const float Offst , const float AnchorWidth ,
2023-05-12 13:22:05 -05:00
const float FloatWidth ) ;
2021-11-30 21:29:18 -06:00
/// Set to a value that gives good clamping, smoothly. Activates when
/// the target is out of range.
float AnchorSpeed ;
} ;
*/
# endif