namespace Sandbox;
///
[Expose]
[Title( "Control Joint" )]
[Category( "Physics" )]
[Icon( "joystick" )]
[EditorHandle( "materials/gizmo/tracked_object.png" )]
public sealed class ControlJoint : Joint
{
///
[Property]
public Vector3 LinearVelocity
{
get;
set
{
if ( value == field )
return;
field = value;
if ( joint.IsValid() )
{
joint.LinearVelocity = field;
joint.WakeBodies();
}
}
}
///
[Property]
public Vector3 AngularVelocity
{
get;
set
{
if ( value == field )
return;
field = value;
if ( joint.IsValid() )
{
joint.AngularVelocity = field;
joint.WakeBodies();
}
}
}
///
[Property]
public float MaxVelocityForce
{
get;
set
{
if ( value == field )
return;
field = value;
if ( joint.IsValid() )
{
joint.MaxVelocityForce = field;
joint.WakeBodies();
}
}
}
///
[Property]
public float MaxVelocityTorque
{
get;
set
{
if ( value == field )
return;
field = value;
if ( joint.IsValid() )
{
joint.MaxVelocityTorque = field;
joint.WakeBodies();
}
}
}
///
[Property]
public PhysicsSpring LinearSpring
{
get;
set
{
if ( value == field )
return;
field = value;
if ( joint.IsValid() )
{
joint.LinearSpring = field;
joint.WakeBodies();
}
}
}
///
[Property]
public PhysicsSpring AngularSpring
{
get;
set
{
if ( value == field )
return;
field = value;
if ( joint.IsValid() )
{
joint.AngularSpring = field;
joint.WakeBodies();
}
}
}
private Physics.ControlJoint joint;
protected override PhysicsJoint CreateJoint( PhysicsPoint point1, PhysicsPoint point2 )
{
var localFrame1 = LocalFrame1;
var localFrame2 = LocalFrame2;
if ( Attachment == AttachmentMode.Auto )
{
localFrame1 = point1.LocalTransform;
localFrame2 = point2.LocalTransform;
}
if ( !Scene.IsEditor )
{
LocalFrame1 = localFrame1;
LocalFrame2 = localFrame2;
Attachment = AttachmentMode.LocalFrames;
}
point1.LocalTransform = localFrame1;
point2.LocalTransform = localFrame2;
joint = PhysicsJoint.CreateControl( point1, point2 );
UpdateProperties();
return joint;
}
private void UpdateProperties()
{
if ( !joint.IsValid() )
return;
joint.LinearVelocity = LinearVelocity;
joint.AngularVelocity = AngularVelocity;
joint.MaxVelocityForce = MaxVelocityForce;
joint.MaxVelocityTorque = MaxVelocityTorque;
joint.LinearSpring = LinearSpring;
joint.AngularSpring = AngularSpring;
joint.WakeBodies();
}
}