171 lines
4.5 KiB
Ucode
171 lines
4.5 KiB
Ucode
|
//=============================================================================
|
||
|
// The Basic constraint actor class.
|
||
|
// Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
|
||
|
//=============================================================================
|
||
|
|
||
|
class RB_ConstraintActor extends RigidBodyBase
|
||
|
abstract
|
||
|
placeable
|
||
|
native(Physics);
|
||
|
|
||
|
cpptext
|
||
|
{
|
||
|
virtual void physRigidBody(FLOAT DeltaTime) {};
|
||
|
virtual void PostEditMove(UBOOL bFinished);
|
||
|
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
|
||
|
|
||
|
/** Used for checking that this constraint is valid buring map build
|
||
|
*/
|
||
|
#if WITH_EDITOR
|
||
|
virtual void CheckForErrors();
|
||
|
#endif
|
||
|
virtual void InitRBPhys();
|
||
|
virtual void TermRBPhys(FRBPhysScene* Scene);
|
||
|
|
||
|
void UpdateConstraintFramesFromActor();
|
||
|
}
|
||
|
|
||
|
// Actors joined effected by this constraint (could be NULL for 'World')
|
||
|
var() Actor ConstraintActor1;
|
||
|
|
||
|
var() Actor ConstraintActor2;
|
||
|
|
||
|
var() editinline export noclear RB_ConstraintSetup ConstraintSetup;
|
||
|
var() editinline export noclear RB_ConstraintInstance ConstraintInstance;
|
||
|
|
||
|
// Disable collision between actors joined by this constraint.
|
||
|
var() const bool bDisableCollision;
|
||
|
|
||
|
var() bool bUpdateActor1RefFrame;
|
||
|
var() bool bUpdateActor2RefFrame;
|
||
|
|
||
|
// Used if joint is a pulley to define pivot locations using actors in the level.
|
||
|
var(Pulley) Actor PulleyPivotActor1;
|
||
|
var(Pulley) Actor PulleyPivotActor2;
|
||
|
|
||
|
native final function SetDisableCollision(bool NewDisableCollision);
|
||
|
native final function InitConstraint(Actor Actor1, Actor Actor2, optional name Actor1Bone, optional name Actor2Bone, optional float BreakThreshold);
|
||
|
native final function TermConstraint();
|
||
|
|
||
|
/**
|
||
|
* When destroyed using Kismet, break the constraint.
|
||
|
*/
|
||
|
simulated function OnDestroy(SeqAct_Destroy Action)
|
||
|
{
|
||
|
TermConstraint();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* When destroyed using Kismet, break the constraint.
|
||
|
*/
|
||
|
simulated function OnToggle(SeqAct_Toggle Action)
|
||
|
{
|
||
|
// Turn ON
|
||
|
if (action.InputLinks[0].bHasImpulse)
|
||
|
{
|
||
|
if( Physics != PHYS_RigidBody )
|
||
|
{
|
||
|
SetPhysics(PHYS_RigidBody);
|
||
|
InitConstraint(ConstraintActor1, ConstraintActor2, ConstraintSetup.ConstraintBone1, ConstraintSetup.ConstraintBone2);
|
||
|
}
|
||
|
}
|
||
|
// Turn OFF
|
||
|
else if (action.InputLinks[1].bHasImpulse)
|
||
|
{
|
||
|
if( Physics != PHYS_None )
|
||
|
{
|
||
|
SetPhysics(PHYS_None);
|
||
|
TermConstraint();
|
||
|
}
|
||
|
}
|
||
|
// Toggle
|
||
|
else if (action.InputLinks[2].bHasImpulse)
|
||
|
{
|
||
|
if( Physics != PHYS_None )
|
||
|
{
|
||
|
SetPhysics(PHYS_None);
|
||
|
TermConstraint();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetPhysics(PHYS_RigidBody);
|
||
|
InitConstraint(ConstraintActor1, ConstraintActor2, ConstraintSetup.ConstraintBone1, ConstraintSetup.ConstraintBone2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Handle 'Toggle Constraint Drive' kismet action */
|
||
|
simulated function OnToggleConstraintDrive(SeqAct_ToggleConstraintDrive Action)
|
||
|
{
|
||
|
// Turn specific drive(s) on
|
||
|
if(Action.InputLinks[0].bHasImpulse)
|
||
|
{
|
||
|
if(Action.bEnableLinearPositionDrive)
|
||
|
{
|
||
|
ConstraintInstance.SetLinearPositionDrive(TRUE, TRUE, TRUE);
|
||
|
}
|
||
|
|
||
|
if(Action.bEnableLinearvelocityDrive)
|
||
|
{
|
||
|
ConstraintInstance.SetLinearVelocityDrive(TRUE, TRUE, TRUE);
|
||
|
}
|
||
|
|
||
|
if(Action.bEnableAngularPositionDrive)
|
||
|
{
|
||
|
ConstraintInstance.SetAngularPositionDrive(TRUE, TRUE);
|
||
|
}
|
||
|
|
||
|
if(Action.bEnableAngularVelocityDrive)
|
||
|
{
|
||
|
ConstraintInstance.SetAngularVelocityDrive(TRUE, TRUE);
|
||
|
}
|
||
|
}
|
||
|
// Turn all drive off
|
||
|
else if(Action.InputLinks[1].bHasImpulse)
|
||
|
{
|
||
|
ConstraintInstance.SetLinearPositionDrive(FALSE, FALSE, FALSE);
|
||
|
ConstraintInstance.SetLinearVelocityDrive(FALSE, FALSE, FALSE);
|
||
|
|
||
|
ConstraintInstance.SetAngularPositionDrive(FALSE, FALSE);
|
||
|
ConstraintInstance.SetAngularVelocityDrive(FALSE, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
TickGroup=TG_PostAsyncWork
|
||
|
|
||
|
Begin Object Class=SpriteComponent Name=Sprite
|
||
|
Sprite=Texture2D'EditorResources.S_Actor'
|
||
|
HiddenGame=True
|
||
|
AlwaysLoadOnClient=False
|
||
|
AlwaysLoadOnServer=False
|
||
|
SpriteCategoryName="Physics"
|
||
|
End Object
|
||
|
Components.Add(Sprite)
|
||
|
|
||
|
Begin Object Class=RB_ConstraintInstance Name=MyConstraintInstance
|
||
|
End Object
|
||
|
ConstraintInstance=MyConstraintInstance
|
||
|
|
||
|
Begin Object Class=RB_ConstraintDrawComponent Name=MyConDrawComponent
|
||
|
End Object
|
||
|
Components.Add(MyConDrawComponent)
|
||
|
|
||
|
bDisableCollision=false
|
||
|
|
||
|
SupportedEvents.Add(class'SeqEvent_ConstraintBroken')
|
||
|
|
||
|
bUpdateActor1RefFrame=true
|
||
|
bUpdateActor2RefFrame=true
|
||
|
|
||
|
bCollideActors=false
|
||
|
bHidden=True
|
||
|
DrawScale=0.5
|
||
|
bEdShouldSnap=true
|
||
|
|
||
|
Physics=PHYS_RigidBody
|
||
|
bStatic=false
|
||
|
bNoDelete=true
|
||
|
}
|