From 86a2169d7343825c74ae271f637002377b92b438 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 16 Apr 2012 16:16:55 +0100
Subject: ubitODE + physmanager: - Revised use of ODE collisions categories and
bits(flags) for better use as filters together with top spaces (for example
physical prims are on topactivespace and not physical are on topstaticspace)
- Added new world raycast with filters. This blocks calling thread with a
timeout of 500ms waiting for heartbeat ode thread signal job done. - Don't
let ode bodies being disabled for 2 long except for vehicles. This is
necessary to detect when the object is at rest at top of other and that is
removed. Assume that vehicles can be enabled by used action.
---
OpenSim/Region/Physics/Manager/PhysicsActor.cs | 6 ++++
OpenSim/Region/Physics/Manager/PhysicsScene.cs | 40 ++++++++++++++++++++++++++
2 files changed, 46 insertions(+)
(limited to 'OpenSim/Region/Physics/Manager')
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index be67204..b66d7f1 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -172,6 +172,12 @@ namespace OpenSim.Region.Physics.Manager
public virtual bool Phantom { get; set; }
+ public virtual bool IsVolumeDtc
+ {
+ get { return false; }
+ set { return; }
+ }
+
public virtual byte PhysicsShapeType { get; set; }
public abstract PrimitiveBaseShape Shape { set; }
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
index f2c0c28..d10a2aa 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
@@ -43,6 +43,34 @@ namespace OpenSim.Region.Physics.Manager
public delegate void JointDeactivated(PhysicsJoint joint);
public delegate void JointErrorMessage(PhysicsJoint joint, string message); // this refers to an "error message due to a problem", not "amount of joint constraint violation"
+ public enum RayFilterFlags:ushort
+ {
+ // the flags
+ water = 0x01,
+ land = 0x02,
+ agent = 0x04,
+ nonphysical = 0x08,
+ physical = 0x10,
+ phantom = 0x20,
+ volumedtc = 0x40,
+
+ // ray cast colision control (may only work for meshs)
+ BackFaceCull = 0x4000,
+ ClosestHit = 0x8000,
+
+ // some combinations
+ LSLPhanton = phantom | volumedtc,
+ PrimsNonPhantom = nonphysical | physical,
+ PrimsNonPhantomAgents = nonphysical | physical | agent,
+
+ AllPrims = nonphysical | phantom | volumedtc | physical,
+ AllButLand = agent | nonphysical | physical | phantom | volumedtc,
+
+ ClosestAndBackCull = ClosestHit | BackFaceCull,
+
+ All = 0x3f
+ }
+
///
/// Contact result from a raycast.
///
@@ -54,6 +82,8 @@ namespace OpenSim.Region.Physics.Manager
public Vector3 Normal;
}
+
+
public abstract class PhysicsScene
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -280,6 +310,16 @@ namespace OpenSim.Region.Physics.Manager
return new List();
}
+ public virtual object RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
+ {
+ return null;
+ }
+
+ public virtual bool SuportsRaycastWorldFiltered()
+ {
+ return false;
+ }
+
public virtual void RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, RaycastCallback retMethod){}
public virtual void RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayCallback retMethod) { }
public virtual List RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count)
--
cgit v1.1