BulletSim: Add logic to linksets to change physical properties for
whole linkset. Override physical property setting for BSLinksetCompound as there are not children to the compound spape.TeleportWork
parent
d0d654e218
commit
b44f0e1a00
|
@ -69,7 +69,7 @@ public class BSActorCollection
|
||||||
{
|
{
|
||||||
lock (m_actors)
|
lock (m_actors)
|
||||||
{
|
{
|
||||||
Release();
|
ForEachActor(a => a.Dispose());
|
||||||
m_actors.Clear();
|
m_actors.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,10 +98,6 @@ public class BSActorCollection
|
||||||
{
|
{
|
||||||
ForEachActor(a => a.SetEnabled(enabl));
|
ForEachActor(a => a.SetEnabled(enabl));
|
||||||
}
|
}
|
||||||
public void Release()
|
|
||||||
{
|
|
||||||
ForEachActor(a => a.Dispose());
|
|
||||||
}
|
|
||||||
public void Refresh()
|
public void Refresh()
|
||||||
{
|
{
|
||||||
ForEachActor(a => a.Refresh());
|
ForEachActor(a => a.Refresh());
|
||||||
|
|
|
@ -309,14 +309,14 @@ public abstract class BSLinkset
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
public virtual void ComputeLocalInertia()
|
public virtual void ComputeLocalInertia(OMV.Vector3 inertiaFactor)
|
||||||
{
|
{
|
||||||
ForEachMember((member) =>
|
ForEachMember((member) =>
|
||||||
{
|
{
|
||||||
if (member.PhysBody.HasPhysicalBody)
|
if (member.PhysBody.HasPhysicalBody)
|
||||||
{
|
{
|
||||||
OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, member.Mass);
|
OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, member.Mass);
|
||||||
member.Inertia = inertia * BSParam.VehicleInertiaFactor;
|
member.Inertia = inertia * inertiaFactor;
|
||||||
m_physicsScene.PE.SetMassProps(member.PhysBody, member.Mass, member.Inertia);
|
m_physicsScene.PE.SetMassProps(member.PhysBody, member.Mass, member.Inertia);
|
||||||
m_physicsScene.PE.UpdateInertiaTensor(member.PhysBody);
|
m_physicsScene.PE.UpdateInertiaTensor(member.PhysBody);
|
||||||
}
|
}
|
||||||
|
@ -324,6 +324,26 @@ public abstract class BSLinkset
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
public virtual void SetPhysicalCollisionFlags(CollisionFlags collFlags)
|
||||||
|
{
|
||||||
|
ForEachMember((member) =>
|
||||||
|
{
|
||||||
|
if (member.PhysBody.HasPhysicalBody)
|
||||||
|
m_physicsScene.PE.SetCollisionFlags(member.PhysBody, collFlags);
|
||||||
|
return false; // 'false' says to continue looping
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
public virtual void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
|
||||||
|
{
|
||||||
|
ForEachMember((member) =>
|
||||||
|
{
|
||||||
|
if (member.PhysBody.HasPhysicalBody)
|
||||||
|
m_physicsScene.PE.RemoveFromCollisionFlags(member.PhysBody, collFlags);
|
||||||
|
return false; // 'false' says to continue looping
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
// ================================================================
|
// ================================================================
|
||||||
protected virtual float ComputeLinksetMass()
|
protected virtual float ComputeLinksetMass()
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,6 +44,42 @@ public sealed class BSLinksetCompound : BSLinkset
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ================================================================
|
||||||
|
// Changing the physical property of the linkset only needs to change the root
|
||||||
|
public override void SetPhysicalFriction(float friction)
|
||||||
|
{
|
||||||
|
if (LinksetRoot.PhysBody.HasPhysicalBody)
|
||||||
|
m_physicsScene.PE.SetFriction(LinksetRoot.PhysBody, friction);
|
||||||
|
}
|
||||||
|
public override void SetPhysicalRestitution(float restitution)
|
||||||
|
{
|
||||||
|
if (LinksetRoot.PhysBody.HasPhysicalBody)
|
||||||
|
m_physicsScene.PE.SetRestitution(LinksetRoot.PhysBody, restitution);
|
||||||
|
}
|
||||||
|
public override void SetPhysicalGravity(OMV.Vector3 gravity)
|
||||||
|
{
|
||||||
|
if (LinksetRoot.PhysBody.HasPhysicalBody)
|
||||||
|
m_physicsScene.PE.SetGravity(LinksetRoot.PhysBody, gravity);
|
||||||
|
}
|
||||||
|
public override void ComputeLocalInertia(OMV.Vector3 inertiaFactor)
|
||||||
|
{
|
||||||
|
OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(LinksetRoot.PhysShape.physShapeInfo, LinksetRoot.Mass);
|
||||||
|
LinksetRoot.Inertia = inertia * inertiaFactor;
|
||||||
|
m_physicsScene.PE.SetMassProps(LinksetRoot.PhysBody, LinksetRoot.Mass, LinksetRoot.Inertia);
|
||||||
|
m_physicsScene.PE.UpdateInertiaTensor(LinksetRoot.PhysBody);
|
||||||
|
}
|
||||||
|
public override void SetPhysicalCollisionFlags(CollisionFlags collFlags)
|
||||||
|
{
|
||||||
|
if (LinksetRoot.PhysBody.HasPhysicalBody)
|
||||||
|
m_physicsScene.PE.SetCollisionFlags(LinksetRoot.PhysBody, collFlags);
|
||||||
|
}
|
||||||
|
public override void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
|
||||||
|
{
|
||||||
|
if (LinksetRoot.PhysBody.HasPhysicalBody)
|
||||||
|
m_physicsScene.PE.RemoveFromCollisionFlags(LinksetRoot.PhysBody, collFlags);
|
||||||
|
}
|
||||||
|
// ================================================================
|
||||||
|
|
||||||
// When physical properties are changed the linkset needs to recalculate
|
// When physical properties are changed the linkset needs to recalculate
|
||||||
// its internal properties.
|
// its internal properties.
|
||||||
public override void Refresh(BSPrimLinkable requestor)
|
public override void Refresh(BSPrimLinkable requestor)
|
||||||
|
|
Loading…
Reference in New Issue