//============================================================================= // KFSkelControl_FootPlacement //============================================================================= // Based SkelControlFootPlacement, but with a few improvements (see vars) //============================================================================= // Killing Floor 2 // Copyright (C) 2015 Tripwire Interactive LLC // -- Andrew "Strago" Ladenberger //============================================================================= class KFSkelControl_FootPlacement extends SkelControlFootPlacement native(Anim); /** Project foot onto floor. Avoids breaking the animation and allows for IK during walk */ var(KFFootPlacement) bool bProjectOntoPlane; /** Interpolation speed when IK adjusted changes */ var(KFFootPlacement) float InterpUpSpeed, InterpDownSpeed; /** Floor Normal, to do the traces for the feet. */ var(KFFootPlacement) Vector FloorNormal; /** When LegAdjust is small ignore IK. Ideally, this should always trigger on flat surfaces */ var(Performance) float MinAdjustment; /** If leg adjust from last frame is small, apply skip rate for traces */ var(Performance) float MaxLegAdjustForSkipRate; /** <2 means no skip, 2 means every other frame, 3 means 1 out of three frames, etc */ var const transient int SkipRateForLineTrace; /** How many times this component was ticked. */ var const transient int UpdateTransformsCount; /** Most recent hit normal */ var const transient vector HitNormal; /** Target Effector Location to interpolate to smoothly */ var const transient float LegAdjust, LegAdjustInterp; /** Internal cached pointer to Owner */ var const transient KFPawn PawnOwner; // debug var transient editoronly vector DebugStartLoc, DebugEndLoc, DebugIKLoc; cpptext { // USkelControlBase interface virtual void TickSkelControl(FLOAT DeltaSeconds, USkeletalMeshComponent* SkelComp); virtual void CalculateNewBoneTransforms(INT BoneIndex, USkeletalMeshComponent* SkelComp, TArray& OutBoneTransforms); virtual void DrawSkelControl3D(const FSceneView* View, FPrimitiveDrawInterface* PDI, USkeletalMeshComponent* SkelComp, INT BoneIndex); virtual UBOOL LegLineCheckFast(const FVector& Start, const FVector& End, FVector& HitLocation, FVector& HitNormal, AActor* SourceActor); } defaultproperties { bProjectOntoPlane=true InterpUpSpeed=128.f InterpDownSpeed=128.f FloorNormal=(Z=1.f) EffectorLocationSpace=BCS_WorldSpace JointTargetLocationSpace=BCS_ParentBoneSpace JointAxis=AXIS_X MaxDownAdjustment=60.0 // Lift the foot off the ground a bit (<= MAXFLOORDIST) to reduce clipping. // If set properly, UpdateFloorConform will choose not to pull down the mesh on even floor. // aka: the LegAdjust will be ~= 0 (erroring on neg) FootOffset=1.9f // performance MinAdjustment=1.8f MaxLegAdjustForSkipRate=100.f SkipRateForLineTrace=2 // This is the value that GOW3 uses for its stretch limits StretchLimits=(X=0.95f,Y=1.33f) }