rott/kf_sources/Engine/Classes/KHinge.uc
2026-07-14 20:27:09 +07:00

170 lines
4.4 KiB
Ucode

//=============================================================================
// The Hinge joint class.
//=============================================================================
#exec Texture Import File=Textures\S_KHinge.pcx Name=S_KHinge Mips=Off MASKED=1
class KHinge extends KConstraint
native
placeable;
cpptext
{
#ifdef WITH_KARMA
virtual void KUpdateConstraintParams();
virtual void preKarmaStep(FLOAT DeltaTime);
#endif
}
// Spatial light effect to use.
var(KarmaConstraint) enum EHingeType
{
HT_Normal,
HT_Springy,
HT_Motor,
HT_Controlled
} KHingeType;
// SPRINGY - around hinge axis, default position being KDesiredAngle (below)
var(KarmaConstraint) float KStiffness;
var(KarmaConstraint) float KDamping;
// MOTOR - tries to achieve angular velocity
var(KarmaConstraint) float KDesiredAngVel; // 65535 = 1 rotation per second
var(KarmaConstraint) float KMaxTorque;
// CONTROLLED - achieve a certain angle
// Uses AngularVelocity and MaxForce from above.
// Within 'ProportionalGap' of DesiredAngle,
var(KarmaConstraint) float KDesiredAngle; // 65535 = 360 degrees
var(KarmaConstraint) float KProportionalGap; // 65535 = 360 degrees
// This is the alternative 'desired' angle, and the bool that indicates whether to use it.
// See ToggleDesired and ControlDesired below.
var(KarmaConstraint) float KAltDesiredAngle; // 65535 = 360 degrees
var bool KUseAltDesired;
// output - current angular position of joint // 65535 = 360 degrees
var const float KCurrentAngle;
// In this state nothing will happen if this hinge is triggered or untriggered.
auto state Default
{
ignores Trigger, Untrigger;
}
// In this state, Trigger will cause the hinge type to change to HT_Motor.
// Another trigger will toggle it to HT_Controlled, and it will try and maintain its current angle.
state() ToggleMotor
{
ignores Untrigger;
function Trigger( actor Other, pawn EventInstigator )
{
//Log("ToggleMotor - Trigger");
if(KHingeType == HT_Motor)
{
KDesiredAngle = KCurrentAngle;
KUseAltDesired = False;
KHingeType = HT_Controlled;
}
else
KHingeType = HT_Motor;
KUpdateConstraintParams();
KConstraintActor1.KWake(); // force re-enable of simulation on this actor.
}
Begin:
KHingeType = HT_Controlled;
KUseAltDesired = False;
KUpdateConstraintParams();
}
// In this state, Trigger will turn motor on.
// Untrigger will turn toggle it to HT_Controlled, and it will try and maintain its current angle.
state() ControlMotor
{
function Trigger( actor Other, pawn EventInstigator )
{
//Log("ControlMotor - Trigger");
if(KHingeType != HT_Motor)
{
KHingeType = HT_Motor;
KUpdateConstraintParams();
KConstraintActor1.KWake();
}
}
function Untrigger( actor Other, pawn EventInstigator )
{
//Log("ControlMotor - Untrigger");
if(KHingeType == HT_Motor)
{
KDesiredAngle = KCurrentAngle;
KUseAltDesired = False;
KHingeType = HT_Controlled;
KUpdateConstraintParams();
KConstraintActor1.KWake();
}
}
Begin:
KHingeType = HT_Controlled;
KUseAltDesired = False;
KUpdateConstraintParams();
}
// In this state a trigger will toggle the hinge between using KDesiredAngle and KAltDesiredAngle.
// It will use whatever the current KHingeType is to achieve this, so this is only useful with HT_Controlled and HT_Springy.
state() ToggleDesired
{
ignores Untrigger;
function Trigger( actor Other, pawn EventInstigator )
{
//Log("ToggleDesired - Trigger");
if(KUseAltDesired)
KUseAltDesired = False;
else
KUseAltDesired = True;
//Log("UseAlt"$KUseAltDesired);
KUpdateConstraintParams();
KConstraintActor1.KWake();
}
}
// In this state, trigger will cause the hinge to use KAltDesiredAngle, untrigger will caus it to use KAltDesiredAngle
state() ControlDesired
{
function Trigger( actor Other, pawn EventInstigator )
{
//Log("ControlDesired - Trigger");
KUseAltDesired = True;
//Log("UseAlt"$KUseAltDesired);
KUpdateConstraintParams();
KConstraintActor1.KWake();
}
function Untrigger( actor Other, pawn EventInstigator )
{
//Log("ControlDesired - Untrigger");
KUseAltDesired = False;
//Log("UseAlt"$KUseAltDesired);
KUpdateConstraintParams();
KConstraintActor1.KWake();
}
}
defaultproperties
{
KHingeType=HT_Normal
KStiffness=50
KProportionalGap=8200
KUseAltDesired=False
bDirectional=True
Texture=S_KHinge
}