BulletSim: add check in avatar stair step code to verify the collision
is not with a volume detect object. This fixes a problem of avatars trying to step over a volume detect object that they collide with. This appeared as the avatar popping up as it started to step up but then continuing on since the object wasn't physically interacting.0.7.6-extended
parent
377fe63c60
commit
2c31fe4614
|
@ -311,21 +311,28 @@ public class BSActorAvatarMove : BSActor
|
||||||
// Don't care about collisions with the terrain
|
// Don't care about collisions with the terrain
|
||||||
if (kvp.Key > m_physicsScene.TerrainManager.HighestTerrainID)
|
if (kvp.Key > m_physicsScene.TerrainManager.HighestTerrainID)
|
||||||
{
|
{
|
||||||
OMV.Vector3 touchPosition = kvp.Value.Position;
|
BSPhysObject collisionObject;
|
||||||
m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,min={1},max={2},touch={3}",
|
if (m_physicsScene.PhysObjects.TryGetValue(kvp.Key, out collisionObject))
|
||||||
m_controllingPrim.LocalID, nearFeetHeightMin, nearFeetHeightMax, touchPosition);
|
|
||||||
if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax)
|
|
||||||
{
|
{
|
||||||
// This contact is within the 'near the feet' range.
|
if (!collisionObject.IsVolumeDetect)
|
||||||
// The normal should be our contact point to the object so it is pointing away
|
|
||||||
// thus the difference between our facing orientation and the normal should be small.
|
|
||||||
OMV.Vector3 directionFacing = OMV.Vector3.UnitX * m_controllingPrim.RawOrientation;
|
|
||||||
OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal);
|
|
||||||
float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal));
|
|
||||||
if (diff < BSParam.AvatarStepApproachFactor)
|
|
||||||
{
|
{
|
||||||
if (highestTouchPosition.Z < touchPosition.Z)
|
OMV.Vector3 touchPosition = kvp.Value.Position;
|
||||||
highestTouchPosition = touchPosition;
|
m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,min={1},max={2},touch={3}",
|
||||||
|
m_controllingPrim.LocalID, nearFeetHeightMin, nearFeetHeightMax, touchPosition);
|
||||||
|
if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax)
|
||||||
|
{
|
||||||
|
// This contact is within the 'near the feet' range.
|
||||||
|
// The normal should be our contact point to the object so it is pointing away
|
||||||
|
// thus the difference between our facing orientation and the normal should be small.
|
||||||
|
OMV.Vector3 directionFacing = OMV.Vector3.UnitX * m_controllingPrim.RawOrientation;
|
||||||
|
OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal);
|
||||||
|
float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal));
|
||||||
|
if (diff < BSParam.AvatarStepApproachFactor)
|
||||||
|
{
|
||||||
|
if (highestTouchPosition.Z < touchPosition.Z)
|
||||||
|
highestTouchPosition = touchPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -404,6 +404,7 @@ public sealed class BSCharacter : BSPhysObject
|
||||||
|
|
||||||
// Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
|
// Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
|
||||||
public override void SetVolumeDetect(int param) { return; }
|
public override void SetVolumeDetect(int param) { return; }
|
||||||
|
public override bool IsVolumeDetect { get { return false; } }
|
||||||
|
|
||||||
public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } }
|
public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } }
|
||||||
public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } }
|
public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } }
|
||||||
|
|
|
@ -175,6 +175,7 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
public abstract bool IsSolid { get; }
|
public abstract bool IsSolid { get; }
|
||||||
public abstract bool IsStatic { get; }
|
public abstract bool IsStatic { get; }
|
||||||
public abstract bool IsSelected { get; }
|
public abstract bool IsSelected { get; }
|
||||||
|
public abstract bool IsVolumeDetect { get; }
|
||||||
|
|
||||||
// Materialness
|
// Materialness
|
||||||
public MaterialAttributes.Material Material { get; private set; }
|
public MaterialAttributes.Material Material { get; private set; }
|
||||||
|
|
|
@ -617,6 +617,10 @@ public class BSPrim : BSPhysObject
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
public override bool IsVolumeDetect
|
||||||
|
{
|
||||||
|
get { return _isVolumeDetect; }
|
||||||
|
}
|
||||||
public override void SetMaterial(int material)
|
public override void SetMaterial(int material)
|
||||||
{
|
{
|
||||||
base.SetMaterial(material);
|
base.SetMaterial(material);
|
||||||
|
|
Loading…
Reference in New Issue