BulletSim: first attempt at reporting top colliders
parent
dd08e1fba6
commit
ddef8f16e5
|
@ -597,8 +597,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// Moderate angular movement introduced by Bullet.
|
// Moderate angular movement introduced by Bullet.
|
||||||
// TODO: possibly set AngularFactor and LinearFactor for the type of vehicle.
|
// TODO: possibly set AngularFactor and LinearFactor for the type of vehicle.
|
||||||
// Maybe compute linear and angular factor and damping from params.
|
// Maybe compute linear and angular factor and damping from params.
|
||||||
float angularDamping = BSParam.VehicleAngularDamping;
|
PhysicsScene.PE.SetAngularDamping(Prim.PhysBody, BSParam.VehicleAngularDamping);
|
||||||
PhysicsScene.PE.SetAngularDamping(Prim.PhysBody, angularDamping);
|
|
||||||
PhysicsScene.PE.SetLinearFactor(Prim.PhysBody, BSParam.VehicleLinearFactorV);
|
PhysicsScene.PE.SetLinearFactor(Prim.PhysBody, BSParam.VehicleLinearFactorV);
|
||||||
PhysicsScene.PE.SetAngularFactorV(Prim.PhysBody, BSParam.VehicleAngularFactorV);
|
PhysicsScene.PE.SetAngularFactorV(Prim.PhysBody, BSParam.VehicleAngularFactorV);
|
||||||
|
|
||||||
|
@ -615,8 +614,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// The actual vehicle gravity is set to zero in Bullet so we can do all the application of same.
|
// The actual vehicle gravity is set to zero in Bullet so we can do all the application of same.
|
||||||
PhysicsScene.PE.SetGravity(Prim.PhysBody, Vector3.Zero);
|
PhysicsScene.PE.SetGravity(Prim.PhysBody, Vector3.Zero);
|
||||||
|
|
||||||
VDetailLog("{0},BSDynamics.Refresh,mass={1},frict={2},inert={3},aDamp={4},grav={5}",
|
VDetailLog("{0},BSDynamics.Refresh,mass={1},inert={2},grav={3},aDamp={4},frict={5},rest={6},lFact={7},aFact={8}",
|
||||||
Prim.LocalID, m_vehicleMass, Prim.Inertia, angularDamping, m_VehicleGravity);
|
Prim.LocalID, m_vehicleMass, Prim.Inertia, m_VehicleGravity,
|
||||||
|
BSParam.VehicleAngularDamping, BSParam.VehicleFriction, BSParam.VehicleRestitution,
|
||||||
|
BSParam.VehicleLinearFactor, BSParam.VehicleAngularFactor
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -95,6 +95,8 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
SubscribedEventsMs = 0;
|
SubscribedEventsMs = 0;
|
||||||
CollidingStep = 0;
|
CollidingStep = 0;
|
||||||
CollidingGroundStep = 0;
|
CollidingGroundStep = 0;
|
||||||
|
CollisionAccumulation = 0;
|
||||||
|
CollisionScore = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell the object to clean up.
|
// Tell the object to clean up.
|
||||||
|
@ -239,6 +241,9 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
// The collision flags we think are set in Bullet
|
// The collision flags we think are set in Bullet
|
||||||
protected CollisionFlags CurrentCollisionFlags { get; set; }
|
protected CollisionFlags CurrentCollisionFlags { get; set; }
|
||||||
|
|
||||||
|
// Count of collisions for this object
|
||||||
|
protected long CollisionAccumulation { get; set; }
|
||||||
|
|
||||||
public override bool IsColliding {
|
public override bool IsColliding {
|
||||||
get { return (CollidingStep == PhysicsScene.SimulationStep); }
|
get { return (CollidingStep == PhysicsScene.SimulationStep); }
|
||||||
set {
|
set {
|
||||||
|
@ -300,6 +305,8 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CollisionAccumulation++;
|
||||||
|
|
||||||
// if someone has subscribed for collision events....
|
// if someone has subscribed for collision events....
|
||||||
if (SubscribedEvents()) {
|
if (SubscribedEvents()) {
|
||||||
CollisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth));
|
CollisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth));
|
||||||
|
@ -386,6 +393,16 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
public override bool SubscribedEvents() {
|
public override bool SubscribedEvents() {
|
||||||
return (SubscribedEventsMs > 0);
|
return (SubscribedEventsMs > 0);
|
||||||
}
|
}
|
||||||
|
// Because 'CollisionScore' is calls many times while sorting it should not be recomputed
|
||||||
|
// each time called. So this is built to be light weight for each collision and to do
|
||||||
|
// all the processing when the user asks for the info.
|
||||||
|
public void ComputeCollisionScore()
|
||||||
|
{
|
||||||
|
// Scale the collision count by the time since the last collision
|
||||||
|
long timeAgo = PhysicsScene.SimulationStep - CollidingStep + 1;
|
||||||
|
CollisionScore = CollisionAccumulation / timeAgo;
|
||||||
|
}
|
||||||
|
public override float CollisionScore { get; set; }
|
||||||
|
|
||||||
#endregion // Collisions
|
#endregion // Collisions
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,6 @@ public sealed class BSPrim : BSPhysObject
|
||||||
private OMV.Vector3 _force;
|
private OMV.Vector3 _force;
|
||||||
private OMV.Vector3 _velocity;
|
private OMV.Vector3 _velocity;
|
||||||
private OMV.Vector3 _torque;
|
private OMV.Vector3 _torque;
|
||||||
private float _collisionScore;
|
|
||||||
private OMV.Vector3 _acceleration;
|
private OMV.Vector3 _acceleration;
|
||||||
private OMV.Quaternion _orientation;
|
private OMV.Quaternion _orientation;
|
||||||
private int _physicsActorType;
|
private int _physicsActorType;
|
||||||
|
@ -644,11 +643,6 @@ public sealed class BSPrim : BSPhysObject
|
||||||
// DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, _torque);
|
// DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, _torque);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public override float CollisionScore {
|
|
||||||
get { return _collisionScore; }
|
|
||||||
set { _collisionScore = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public override OMV.Vector3 Acceleration {
|
public override OMV.Vector3 Acceleration {
|
||||||
get { return _acceleration; }
|
get { return _acceleration; }
|
||||||
set { _acceleration = value; }
|
set { _acceleration = value; }
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
@ -697,7 +698,21 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
|
|
||||||
public override Dictionary<uint, float> GetTopColliders()
|
public override Dictionary<uint, float> GetTopColliders()
|
||||||
{
|
{
|
||||||
return new Dictionary<uint, float>();
|
Dictionary<uint, float> topColliders;
|
||||||
|
|
||||||
|
lock (PhysObjects)
|
||||||
|
{
|
||||||
|
foreach (KeyValuePair<uint, BSPhysObject> kvp in PhysObjects)
|
||||||
|
{
|
||||||
|
kvp.Value.ComputeCollisionScore();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<BSPhysObject> orderedPrims = new List<BSPhysObject>(PhysObjects.Values);
|
||||||
|
orderedPrims.OrderByDescending(p => p.CollisionScore).Take(25);
|
||||||
|
topColliders = orderedPrims.ToDictionary(p => p.LocalID, p => p.CollisionScore);
|
||||||
|
}
|
||||||
|
|
||||||
|
return topColliders;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IsThreaded { get { return false; } }
|
public override bool IsThreaded { get { return false; } }
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
CURRENT PRIORITIES
|
CURRENT PRIORITIES
|
||||||
=================================================
|
=================================================
|
||||||
|
One sided meshes? Should terrain be built into a closed shape?
|
||||||
|
When meshes get partially wedged into the terrain, they cannot push themselves out.
|
||||||
|
It is possible that Bullet processes collisions whether entering or leaving a mesh.
|
||||||
|
Ref: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4869
|
||||||
Deleting a linkset while standing on the root will leave the physical shape of the root behind.
|
Deleting a linkset while standing on the root will leave the physical shape of the root behind.
|
||||||
Not sure if it is because standing on it. Done with large prim linksets.
|
Not sure if it is because standing on it. Done with large prim linksets.
|
||||||
Vehicle angular vertical attraction
|
Vehicle angular vertical attraction
|
||||||
|
|
Loading…
Reference in New Issue