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
OpenSim/Region/Physics/BulletSPlugin
|
@ -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