Merge branch 'avination-current'

Conflicts:
	OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
avinationmerge
Melanie Thielker 2014-07-19 22:32:07 +02:00
commit e1b2ecdfdc
18 changed files with 709 additions and 1525 deletions

View File

@ -1626,7 +1626,12 @@ namespace OpenSim.Framework
BREAST_PHYSICS_LEFTRIGHT_MAX_EFFECT = 247,
BREAST_PHYSICS_LEFTRIGHT_SPRING= 248,
BREAST_PHYSICS_LEFTRIGHT_GAIN = 249,
BREAST_PHYSICS_LEFTRIGHT_DAMPING = 250
BREAST_PHYSICS_LEFTRIGHT_DAMPING = 250,
// Ubit: 07/96/2013 new parameters
_APPEARANCEMESSAGE_VERSION = 251, //ID 11000
SHAPE_HOVER = 252, //ID 11001
}
#endregion
}

View File

@ -358,14 +358,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
bool asAttachment)
{
CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
// Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
// this possible is not needed if keyframes are saved
Dictionary<UUID, KeyframeMotion> originalKeyframes = new Dictionary<UUID, KeyframeMotion>();
foreach (SceneObjectGroup objectGroup in objlist)
{
if (objectGroup.RootPart.KeyframeMotion != null)
objectGroup.RootPart.KeyframeMotion.Stop();
{
objectGroup.RootPart.KeyframeMotion.Suspend();
}
objectGroup.RootPart.SetForce(Vector3.Zero);
objectGroup.RootPart.SetAngularImpulse(Vector3.Zero, false);
originalKeyframes[objectGroup.UUID] = objectGroup.RootPart.KeyframeMotion;
objectGroup.RootPart.KeyframeMotion = null;
Vector3 inventoryStoredPosition = new Vector3
@ -427,9 +433,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
else
itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment);
// // Restore the position of each group now that it has been stored to inventory.
// foreach (SceneObjectGroup objectGroup in objlist)
// objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
// Restore the position of each group now that it has been stored to inventory.
foreach (SceneObjectGroup objectGroup in objlist)
{
objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
objectGroup.RootPart.KeyframeMotion = originalKeyframes[objectGroup.UUID];
if (objectGroup.RootPart.KeyframeMotion != null)
objectGroup.RootPart.KeyframeMotion.Resume();
}
InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID);

View File

@ -264,15 +264,18 @@ namespace OpenSim.Region.Framework.Scenes
}
private void StartTimer()
{
lock (m_frames)
{
KeyframeTimer.Add(this);
m_timerStopped = false;
}
}
private void StopTimer()
{
lock (m_frames)
m_timerStopped = true;
KeyframeTimer.Remove(this);
}
public static KeyframeMotion FromData(SceneObjectGroup grp, Byte[] data)
@ -427,19 +430,18 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
m_running = false;
StopTimer();
m_running = false;
}
}
public void Stop()
{
StopTimer();
m_running = false;
m_isCrossing = false;
m_waitingCrossing = false;
StopTimer();
m_basePosition = m_group.AbsolutePosition;
m_baseRotation = m_group.GroupRotation;
@ -452,14 +454,34 @@ namespace OpenSim.Region.Framework.Scenes
public void Pause()
{
m_running = false;
StopTimer();
m_running = false;
m_group.RootPart.Velocity = Vector3.Zero;
m_group.RootPart.AngularVelocity = Vector3.Zero;
m_group.SendGroupRootTerseUpdate();
// m_group.RootPart.ScheduleTerseUpdate();
}
public void Suspend()
{
lock (m_frames)
{
if (m_timerStopped)
return;
m_timerStopped = true;
}
}
public void Resume()
{
lock (m_frames)
{
if (!m_timerStopped)
return;
if (m_running && !m_waitingCrossing)
StartTimer();
}
}
private void GetNextList()
@ -550,6 +572,7 @@ namespace OpenSim.Region.Framework.Scenes
pos = (Vector3)k.Position;
rot = (Quaternion)k.Rotation;
}
m_basePosition = pos;
@ -560,6 +583,35 @@ namespace OpenSim.Region.Framework.Scenes
}
public void OnTimer(double tickDuration)
{
if (!Monitor.TryEnter(m_frames))
return;
if (m_timerStopped)
KeyframeTimer.Remove(this);
else
DoOnTimer(tickDuration);
Monitor.Exit(m_frames);
}
private void Done()
{
KeyframeTimer.Remove(this);
m_timerStopped = true;
m_running = false;
m_isCrossing = false;
m_waitingCrossing = false;
m_basePosition = m_group.AbsolutePosition;
m_baseRotation = m_group.GroupRotation;
m_group.RootPart.Velocity = Vector3.Zero;
m_group.RootPart.AngularVelocity = Vector3.Zero;
m_group.SendGroupRootTerseUpdate();
// m_group.RootPart.ScheduleTerseUpdate();
m_frames.Clear();
}
private void DoOnTimer(double tickDuration)
{
if (m_skipLoops > 0)
{
@ -567,8 +619,6 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
if (m_timerStopped) // trap events still in air even after a timer.stop
return;
if (m_group == null)
return;
@ -608,7 +658,7 @@ namespace OpenSim.Region.Framework.Scenes
if (m_frames.Count == 0)
{
Stop();
Done();
Scene scene = m_group.Scene;
IScriptModule[] scriptModules = scene.RequestModuleInterfaces<IScriptModule>();
@ -711,7 +761,6 @@ namespace OpenSim.Region.Framework.Scenes
|| Math.Abs(step.Y - current.Y) > 0.001f
|| Math.Abs(step.Z - current.Z) > 0.001f)
// assuming w is a dependente var
{
// m_group.UpdateGroupRotationR(step);
m_group.RootPart.RotationOffset = step;

View File

@ -37,6 +37,7 @@ namespace OpenSim.Region.Physics.Manager
{
IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod);
IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical);
IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool convex, bool forOde);
IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool shouldCache, bool convex, bool forOde);
IMesh GetMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool convex);
void ReleaseMesh(IMesh mesh);

View File

@ -64,7 +64,7 @@ namespace OpenSim.Region.Physics.Manager
{
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
{
return CreateMesh(primName, primShape, size, lod, false, false);
return CreateMesh(primName, primShape, size, lod, false);
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool shouldCache, bool convex, bool forOde)
@ -72,12 +72,12 @@ namespace OpenSim.Region.Physics.Manager
return CreateMesh(primName, primShape, size, lod, false);
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical)
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool convex,bool forOde)
{
return CreateMesh(primName, primShape, size, lod, false, false);
return CreateMesh(primName, primShape, size, lod, false);
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool shouldCache)
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical)
{
// Remove the reference to the encoded JPEG2000 data so it can be GCed
primShape.SculptData = OpenMetaverse.Utils.EmptyBytes;

View File

@ -918,6 +918,11 @@ namespace OpenSim.Region.Physics.Meshing
return CreateMesh(primName, primShape, size, lod, isPhysical, true);
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool convex, bool forOde)
{
return CreateMesh(primName, primShape, size, lod, isPhysical, true);
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool shouldCache)
{
#if SPAM

View File

@ -500,7 +500,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
m_pidControllerActive = true;
m_tainted_CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
m_tainted_CAPSULE_LENGTH = (size.Z) - CAPSULE_RADIUS * 2.0f;
// m_log.Info("[ODE CHARACTER]: " + CAPSULE_LENGTH);
}
else

View File

@ -256,9 +256,9 @@ public class Vertex : IComparable<Vertex>
// settings your machine works with. Unusable for a machine readable file format :-(
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";
nfi.NumberDecimalDigits = 3;
nfi.NumberDecimalDigits = 6;
String s1 = X.ToString("N2", nfi) + " " + Y.ToString("N2", nfi) + " " + Z.ToString("N2", nfi);
String s1 = X.ToString(nfi) + " " + Y.ToString(nfi) + " " + Z.ToString(nfi);
return s1;
}

View File

@ -205,34 +205,21 @@ namespace OpenSim.Region.Physics.Meshing
}
private float fRound(float f)
{
int i;
if (f == 0f)
return f;
else if (f > 0f)
i = (int)(1e5f * f + 0.5f);
else
i = (int)(1e5f * f - 0.5f);
return ((float)i * 1e-5f);
}
public void Add(Triangle triangle)
{
if (m_indicesPtr != IntPtr.Zero || m_verticesPtr != IntPtr.Zero)
throw new NotSupportedException("Attempt to Add to a pinned Mesh");
// round down
triangle.v1.X = fRound(triangle.v1.X);
triangle.v1.Y = fRound(triangle.v1.Y);
triangle.v1.Z = fRound(triangle.v1.Z);
triangle.v2.X = fRound(triangle.v2.X);
triangle.v2.Y = fRound(triangle.v2.Y);
triangle.v2.Z = fRound(triangle.v2.Z);
triangle.v3.X = fRound(triangle.v3.X);
triangle.v3.Y = fRound(triangle.v3.Y);
triangle.v3.Z = fRound(triangle.v3.Z);
triangle.v1.X = (float)Math.Round(triangle.v1.X, 6);
triangle.v1.Y = (float)Math.Round(triangle.v1.Y, 6);
triangle.v1.Z = (float)Math.Round(triangle.v1.Z, 6);
triangle.v2.X = (float)Math.Round(triangle.v2.X, 6);
triangle.v2.Y = (float)Math.Round(triangle.v2.Y, 6);
triangle.v2.Z = (float)Math.Round(triangle.v2.Z, 6);
triangle.v3.X = (float)Math.Round(triangle.v3.X, 6);
triangle.v3.Y = (float)Math.Round(triangle.v3.Y, 6);
triangle.v3.Z = (float)Math.Round(triangle.v3.Z, 6);
if ((triangle.v1.X == triangle.v2.X && triangle.v1.Y == triangle.v2.Y && triangle.v1.Z == triangle.v2.Z)
|| (triangle.v1.X == triangle.v3.X && triangle.v1.Y == triangle.v3.Y && triangle.v1.Z == triangle.v3.Z)

View File

@ -816,15 +816,31 @@ namespace OpenSim.Region.Physics.Meshing
float profileBegin = (float)primShape.ProfileBegin * 2.0e-5f;
float profileEnd = 1.0f - (float)primShape.ProfileEnd * 2.0e-5f;
if (profileBegin < 0.0f)
profileBegin = 0.0f;
if (profileEnd < 0.02f)
profileEnd = 0.02f;
else if (profileEnd > 1.0f)
profileEnd = 1.0f;
if (profileBegin >= profileEnd)
profileBegin = profileEnd - 0.02f;
float profileHollow = (float)primShape.ProfileHollow * 2.0e-5f;
if (profileHollow > 0.95f)
profileHollow = 0.95f;
int sides = 4;
LevelOfDetail iLOD = (LevelOfDetail)lod;
if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
byte profshape = (byte)(primShape.ProfileCurve & 0x07);
if (profshape == (byte)ProfileShape.EquilateralTriangle
|| profshape == (byte)ProfileShape.IsometricTriangle
|| profshape == (byte)ProfileShape.RightTriangle)
sides = 3;
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
else if (profshape == (byte)ProfileShape.Circle)
{
switch (iLOD)
{
@ -835,7 +851,7 @@ namespace OpenSim.Region.Physics.Meshing
default: sides = 24; break;
}
}
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
else if (profshape == (byte)ProfileShape.HalfCircle)
{ // half circle, prim is a sphere
switch (iLOD)
{
@ -865,7 +881,12 @@ namespace OpenSim.Region.Physics.Meshing
else if (primShape.HollowShape == HollowShape.Square)
hollowSides = 4;
else if (primShape.HollowShape == HollowShape.Triangle)
{
if (profshape == (byte)ProfileShape.HalfCircle)
hollowSides = 6;
else
hollowSides = 3;
}
primMesh = new PrimMesh(sides, profileBegin, profileEnd, profileHollow, hollowSides);
@ -880,17 +901,11 @@ namespace OpenSim.Region.Physics.Meshing
if (primShape.PathCurve == (byte)Extrusion.Straight || primShape.PathCurve == (byte) Extrusion.Flexible)
{
primMesh.twistBegin = primShape.PathTwistBegin * 18 / 10;
primMesh.twistEnd = primShape.PathTwist * 18 / 10;
primMesh.twistBegin = (primShape.PathTwistBegin * 18) / 10;
primMesh.twistEnd = (primShape.PathTwist * 18) / 10;
primMesh.taperX = pathScaleX;
primMesh.taperY = pathScaleY;
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
{
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
if (profileBegin < 0.0f) profileBegin = 0.0f;
if (profileEnd > 1.0f) profileEnd = 1.0f;
}
#if SPAM
m_log.Debug("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
#endif
@ -911,17 +926,11 @@ namespace OpenSim.Region.Physics.Meshing
primMesh.radius = 0.01f * primShape.PathRadiusOffset;
primMesh.revolutions = 1.0f + 0.015f * primShape.PathRevolutions;
primMesh.skew = 0.01f * primShape.PathSkew;
primMesh.twistBegin = primShape.PathTwistBegin * 36 / 10;
primMesh.twistEnd = primShape.PathTwist * 36 / 10;
primMesh.twistBegin = (primShape.PathTwistBegin * 36) / 10;
primMesh.twistEnd = (primShape.PathTwist * 36) / 10;
primMesh.taperX = primShape.PathTaperX * 0.01f;
primMesh.taperY = primShape.PathTaperY * 0.01f;
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
{
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
if (profileBegin < 0.0f) profileBegin = 0.0f;
if (profileEnd > 1.0f) profileEnd = 1.0f;
}
#if SPAM
m_log.Debug("****** PrimMesh Parameters (Circular) ******\n" + primMesh.ParamsToDisplayString());
#endif
@ -1031,12 +1040,17 @@ namespace OpenSim.Region.Physics.Meshing
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
{
return CreateMesh(primName, primShape, size, lod, false,false,false,false);
return CreateMesh(primName, primShape, size, lod, false,false,false);
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical)
{
return CreateMesh(primName, primShape, size, lod, false,false,false,false);
return CreateMesh(primName, primShape, size, lod, false,false,false);
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool shouldCache, bool convex, bool forOde)
{
return CreateMesh(primName, primShape, size, lod, false, false, false);
}
public IMesh GetMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool convex)
@ -1080,7 +1094,7 @@ namespace OpenSim.Region.Physics.Meshing
private static Vector3 m_MeshUnitSize = new Vector3(1.0f, 1.0f, 1.0f);
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool shouldCache, bool convex, bool forOde)
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical, bool convex, bool forOde)
{
#if SPAM
m_log.DebugFormat("[MESH]: Creating mesh for {0}", primName);

File diff suppressed because it is too large Load Diff

View File

@ -95,10 +95,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private float m_feetOffset = 0;
private float feetOff = 0;
private float feetSZ = 0.5f;
const float feetScale = 0.8f;
private float boneOff = 0;
private float m_lastVelocitySqr = 0;
public float walkDivisor = 1.3f;
public float runDivisor = 0.8f;
@ -110,7 +107,6 @@ namespace OpenSim.Region.Physics.OdePlugin
private bool _zeroFlag = false;
private int m_requestedUpdateFrequency = 0;
private uint m_localID = 0;
public bool m_returnCollisions = false;
// taints and their non-tainted counterparts
@ -127,7 +123,6 @@ namespace OpenSim.Region.Physics.OdePlugin
int m_colliderfilter = 0;
int m_colliderGroundfilter = 0;
int m_colliderObjectfilter = 0;
bool m_collisionException = false;
// Default we're a Character
private CollisionCategories m_collisionCategories = (CollisionCategories.Character);
@ -140,9 +135,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// we do land collisions not ode | CollisionCategories.Land);
public IntPtr Body = IntPtr.Zero;
private OdeScene _parent_scene;
private IntPtr topbox = IntPtr.Zero;
private IntPtr midbox = IntPtr.Zero;
private IntPtr feetbox = IntPtr.Zero;
private IntPtr capsule = IntPtr.Zero;
private IntPtr bbox = IntPtr.Zero;
public IntPtr collider = IntPtr.Zero;
@ -150,9 +143,6 @@ namespace OpenSim.Region.Physics.OdePlugin
public d.Mass ShellMass;
public int m_eventsubscription = 0;
private int m_cureventsubscription = 0;
private CollisionEventUpdate CollisionEventsThisFrame = null;
@ -214,8 +204,6 @@ namespace OpenSim.Region.Physics.OdePlugin
// force lower density for testing
m_density = 3.0f;
m_density *= 1.4f; // scale to have mass similar to capsule
mu = parent_scene.AvatarFriction;
walkDivisor = walk_divisor;
@ -704,58 +692,6 @@ namespace OpenSim.Region.Physics.OdePlugin
AddChange(changes.Momentum, momentum);
}
private void ajustCollider()
{
float vq = _velocity.LengthSquared();
if (m_lastVelocitySqr != vq)
{
m_lastVelocitySqr = vq;
if (vq > 100.0f)
{
Vector3 off = _velocity;
float t = 0.5f * timeStep;
off = off * t;
d.Quaternion qtmp;
d.GeomCopyQuaternion(bbox, out qtmp);
Quaternion q;
q.X = qtmp.X;
q.Y = qtmp.Y;
q.Z = qtmp.Z;
q.W = qtmp.W;
off *= Quaternion.Conjugate(q);
d.GeomSetOffsetPosition(bbox, off.X, off.Y, off.Z);
off.X = 2.0f * (m_size.X + Math.Abs(off.X));
off.Y = 2.0f * (m_size.Y + Math.Abs(off.Y));
off.Z = m_size.Z + 2.0f * Math.Abs(off.Z);
d.GeomBoxSetLengths(bbox, off.X, off.Y, off.Z);
d.GeomSetCategoryBits(bbox, (uint)m_collisionCategories);
d.GeomSetCollideBits(bbox, (uint)m_collisionFlags);
d.GeomSetCategoryBits(topbox, 0);
d.GeomSetCollideBits(topbox, 0);
d.GeomSetCategoryBits(midbox, 0);
d.GeomSetCollideBits(midbox, 0);
d.GeomSetCategoryBits(feetbox, 0);
d.GeomSetCollideBits(feetbox, 0);
}
else
{
d.GeomSetCategoryBits(bbox, 0);
d.GeomSetCollideBits(bbox, 0);
d.GeomSetCategoryBits(topbox, (uint)m_collisionCategories);
d.GeomSetCollideBits(topbox, (uint)m_collisionFlags);
d.GeomSetCategoryBits(midbox, (uint)m_collisionCategories);
d.GeomSetCollideBits(midbox, (uint)m_collisionFlags);
d.GeomSetCategoryBits(feetbox, (uint)m_collisionCategories);
d.GeomSetCollideBits(feetbox, (uint)m_collisionFlags);
}
uint cat1 = d.GeomGetCategoryBits(bbox);
uint col1 = d.GeomGetCollideBits(bbox);
}
}
private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ)
{
@ -764,37 +700,14 @@ namespace OpenSim.Region.Physics.OdePlugin
float sy = m_size.Y;
float sz = m_size.Z;
float topsx = sx * 0.9f;
float midsx = sx;
float feetsx = sx * feetScale;
float bonesx = sx * 0.2f;
float bot = -sz * 0.5f + m_feetOffset;
boneOff = bot + 0.3f;
float topsy = sy * 0.4f;
float midsy = sy;
float feetsy = sy * feetScale * 0.8f;
float bonesy = feetsy * 0.2f;
float topsz = sz * 0.15f;
float feetsz = sz * 0.45f;
if (feetsz > 0.6f)
feetsz = 0.6f;
float midsz = sz - topsz - feetsz;
float bonesz = sz;
float bot = -sz * 0.5f + m_feetOffset;
boneOff = bot + 0.3f;
float feetz = bot + feetsz * 0.5f;
bot += feetsz;
feetOff = bot;
feetSZ = feetsz;
float midz = bot + midsz * 0.5f;
bot += midsz;
float topz = bot + topsz * 0.5f;
feetOff = bot + feetsz;
_parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace);
@ -805,9 +718,13 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(collider, (uint)m_collisionCategories);
d.GeomSetCollideBits(collider, (uint)m_collisionFlags);
feetbox = d.CreateBox(collider, feetsx, feetsy, feetsz);
midbox = d.CreateBox(collider, midsx, midsy, midsz);
topbox = d.CreateBox(collider, topsx, topsy, topsz);
float r = m_size.X;
if (m_size.Y > r)
r = m_size.Y;
float l = m_size.Z - r;
r *= 0.5f;
capsule = d.CreateCapsule(collider, r, l);
bbox = d.CreateBox(collider, m_size.X, m_size.Y, m_size.Z);
m_mass = m_density * m_size.X * m_size.Y * m_size.Z; // update mass
@ -820,12 +737,10 @@ namespace OpenSim.Region.Physics.OdePlugin
Body = d.BodyCreate(_parent_scene.world);
_zeroFlag = false;
m_collisionException = false;
m_pidControllerActive = true;
m_freemove = false;
_velocity = Vector3.Zero;
m_lastVelocitySqr = 0;
d.BodySetAutoDisableFlag(Body, false);
d.BodySetPosition(Body, npositionX, npositionY, npositionZ);
@ -835,17 +750,9 @@ namespace OpenSim.Region.Physics.OdePlugin
_position.Z = npositionZ;
d.BodySetMass(Body, ref ShellMass);
d.GeomSetBody(feetbox, Body);
d.GeomSetBody(midbox, Body);
d.GeomSetBody(topbox, Body);
d.GeomSetBody(bbox, Body);
d.GeomSetOffsetPosition(feetbox, 0, 0, feetz);
d.GeomSetOffsetPosition(midbox, 0, 0, midz);
d.GeomSetOffsetPosition(topbox, 0, 0, topz);
ajustCollider();
d.GeomSetBody(capsule, Body);
// The purpose of the AMotor here is to keep the avatar's physical
// surrogate from rotating while moving
@ -906,26 +813,12 @@ namespace OpenSim.Region.Physics.OdePlugin
}
//kill the Geoms
if (topbox != IntPtr.Zero)
if (capsule != IntPtr.Zero)
{
_parent_scene.actor_name_map.Remove(topbox);
_parent_scene.actor_name_map.Remove(capsule);
_parent_scene.waitForSpaceUnlock(collider);
d.GeomDestroy(topbox);
topbox = IntPtr.Zero;
}
if (midbox != IntPtr.Zero)
{
_parent_scene.actor_name_map.Remove(midbox);
_parent_scene.waitForSpaceUnlock(collider);
d.GeomDestroy(midbox);
midbox = IntPtr.Zero;
}
if (feetbox != IntPtr.Zero)
{
_parent_scene.actor_name_map.Remove(feetbox);
_parent_scene.waitForSpaceUnlock(collider);
d.GeomDestroy(feetbox);
feetbox = IntPtr.Zero;
d.GeomDestroy(capsule);
capsule = IntPtr.Zero;
}
if (bbox != IntPtr.Zero)
@ -981,163 +874,21 @@ namespace OpenSim.Region.Physics.OdePlugin
public bool Collide(IntPtr me, bool reverse, ref d.ContactGeom contact, ref bool feetcollision)
{
feetcollision = false;
if (m_collisionException)
return false;
Vector3 offset;
if (me == bbox) // if moving fast
{
// force a full inelastic collision
m_collisionException = true;
offset = m_size * m_orientation2D;
offset.X = (float)Math.Abs(offset.X) * 0.5f + contact.depth;
offset.Y = (float)Math.Abs(offset.Y) * 0.5f + contact.depth;
offset.Z = (float)Math.Abs(offset.Z) * 0.5f + contact.depth;
if (reverse)
{
offset.X *= -contact.normal.X;
offset.Y *= -contact.normal.Y;
offset.Z *= -contact.normal.Z;
}
else
{
offset.X *= contact.normal.X;
offset.Y *= contact.normal.Y;
offset.Z *= contact.normal.Z;
}
offset.X += contact.pos.X;
offset.Y += contact.pos.Y;
offset.Z += contact.pos.Z;
//_position = offset;
//return false;
}
offset.X = contact.pos.X - _position.X;
offset.Y = contact.pos.Y - _position.Y;
if (me == topbox)
{
offset.Z = contact.pos.Z - _position.Z;
offset.Normalize();
if (reverse)
{
contact.normal.X = offset.X;
contact.normal.Y = offset.Y;
contact.normal.Z = offset.Z;
}
else
{
contact.normal.X = -offset.X;
contact.normal.Y = -offset.Y;
contact.normal.Z = -offset.Z;
}
return true;
}
if (me == midbox)
{
if (Math.Abs(contact.normal.Z) > 0.95f)
{
offset.Z = contact.pos.Z - _position.Z;
offset.X = (float)Math.Abs(offset.X) * 0.5f + contact.depth;
offset.Y = (float)Math.Abs(offset.Y) * 0.5f + contact.depth;
offset.Z = (float)Math.Abs(offset.Z) * 0.5f + contact.depth;
if (reverse)
{
offset.X *= -contact.normal.X;
offset.Y *= -contact.normal.Y;
offset.Z *= -contact.normal.Z;
}
else
{
offset.X *= contact.normal.X;
offset.Y *= contact.normal.Y;
offset.Z *= contact.normal.Z;
}
offset.X += contact.pos.X;
offset.Y += contact.pos.Y;
offset.Z += contact.pos.Z;
_position = offset;
return true;
}
else
offset.Z = contact.normal.Z;
offset.Normalize();
/*
if (reverse)
{
contact.normal.X = offset.X;
contact.normal.Y = offset.Y;
contact.normal.Z = offset.Z;
}
else
{
contact.normal.X = -offset.X;
contact.normal.Y = -offset.Y;
contact.normal.Z = -offset.Z;
}
*/
//_position.Z = offset.Z;
return true;
}
else if (me == feetbox)
if (me == capsule)
{
float h = contact.pos.Z - _position.Z;
// Only do this if the normal is sufficiently pointing in the 'up' direction
if (Math.Abs(contact.normal.Z) > 0.95f)
{
// We Only want to do this if we're sunk into the object a bit and we're stuck and we're trying to move and feetcollision is false
if ((contact.depth > 0.0010f && _velocity.X == 0f && _velocity.Y == 0 && _velocity.Z == 0)
&& (_target_velocity.X > 0 || _target_velocity.Y > 0 || _target_velocity.Z > 0)
&& (!feetcollision) )
{
m_collisionException = true; // Stop looping, do this only once not X times Contacts
_position.Z += contact.depth + 0.01f; // Move us Up the amount that we sank in, and add 0.01 meters to gently lift avatar up.
return true;
}
if (contact.normal.Z > 0)
contact.normal.Z = 1.0f;
else
contact.normal.Z = -1.0f;
contact.normal.X = 0.0f;
contact.normal.Y = 0.0f;
feetcollision = true;
if (h < boneOff)
IsColliding = true;
return true;
}
offset.Z = h - feetOff; // distance from top of feetbox
offset.Z = h - feetOff;
if (offset.Z > 0)
return false;
return true;
if (offset.Z > -0.01)
{
offset.X = 0;
offset.Y = 0;
offset.Z = -1.0f;
}
else
{
offset.Normalize();
}
if (reverse)
{
@ -1171,23 +922,6 @@ namespace OpenSim.Region.Physics.OdePlugin
if (Body == IntPtr.Zero)
return;
if (m_collisionException)
{
d.BodySetPosition(Body,_position.X, _position.Y, _position.Z);
d.BodySetLinearVel(Body, 0, 0, 0);
float v = _velocity.Length();
if (v != 0)
{
v = 5.0f / v;
_velocity = _velocity * v;
d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z);
}
ajustCollider();
m_collisionException = false;
return;
}
d.Vector3 dtmp = d.BodyGetPosition(Body);
Vector3 localpos = new Vector3(dtmp.X, dtmp.Y, dtmp.Z);
@ -1263,7 +997,8 @@ namespace OpenSim.Region.Physics.OdePlugin
// colide with land
d.AABB aabb;
d.GeomGetAABB(feetbox, out aabb);
// d.GeomGetAABB(feetbox, out aabb);
d.GeomGetAABB(capsule, out aabb);
float chrminZ = aabb.MinZ; ; // move up a bit
Vector3 posch = localpos;
@ -1489,7 +1224,6 @@ namespace OpenSim.Region.Physics.OdePlugin
m_rotationalVelocity.Z = dtmp.Z;
Math.Round(m_rotationalVelocity.Z,3);
}
ajustCollider();
}
public void round(ref Vector3 v, int digits)
@ -1655,10 +1389,11 @@ namespace OpenSim.Region.Physics.OdePlugin
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z);
_parent_scene.actor_name_map[collider] = (PhysicsActor)this;
_parent_scene.actor_name_map[feetbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[midbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[topbox] = (PhysicsActor)this;
// _parent_scene.actor_name_map[feetbox] = (PhysicsActor)this;
// _parent_scene.actor_name_map[midbox] = (PhysicsActor)this;
// _parent_scene.actor_name_map[topbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[bbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[capsule] = (PhysicsActor)this;
_parent_scene.AddCharacter(this);
}
else
@ -1714,13 +1449,10 @@ namespace OpenSim.Region.Physics.OdePlugin
_parent_scene.actor_name_map[collider] = (PhysicsActor)this;
_parent_scene.actor_name_map[feetbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[midbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[topbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[bbox] = (PhysicsActor)this;
_parent_scene.actor_name_map[capsule] = (PhysicsActor)this;
}
m_freemove = false;
m_collisionException = false;
m_pidControllerActive = true;
}
else
@ -1851,7 +1583,6 @@ namespace OpenSim.Region.Physics.OdePlugin
if (Body != IntPtr.Zero)
d.BodySetLinearVel(Body, newmomentum.X, newmomentum.Y, newmomentum.Z);
ajustCollider();
}
private void donullchange()

View File

@ -137,6 +137,7 @@ namespace OpenSim.Region.Physics.OdePlugin
float m_amdampY;
float m_amdampZ;
float m_gravmod;
public float FrictionFactor
{
@ -146,6 +147,14 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
public float GravMod
{
set
{
m_gravmod = value;
}
}
public ODEDynamics(OdePrim rootp)
{
@ -153,6 +162,7 @@ namespace OpenSim.Region.Physics.OdePlugin
_pParentScene = rootPrim._parent_scene;
m_timestep = _pParentScene.ODE_STEPSIZE;
m_invtimestep = 1.0f / m_timestep;
m_gravmod = rootPrim.GravModifier;
}
public void DoSetVehicle(VehicleData vd)
@ -862,7 +872,7 @@ namespace OpenSim.Region.Physics.OdePlugin
force.Z += perr;
ldampZ *= -curVel.Z;
force.Z += _pParentScene.gravityz * (1f - m_VehicleBuoyancy);
force.Z += _pParentScene.gravityz * m_gravmod * (1f - m_VehicleBuoyancy);
}
else // no buoyancy
force.Z += _pParentScene.gravityz;
@ -870,7 +880,7 @@ namespace OpenSim.Region.Physics.OdePlugin
else
{
// default gravity and Buoyancy
force.Z += _pParentScene.gravityz * (1f - m_VehicleBuoyancy);
force.Z += _pParentScene.gravityz * m_gravmod * (1f - m_VehicleBuoyancy);
}
// linear deflection
@ -1065,7 +1075,6 @@ namespace OpenSim.Region.Physics.OdePlugin
}
if (force.X != 0 || force.Y != 0 || force.Z != 0)
{
force *= dmass.mass;

View File

@ -448,7 +448,7 @@ namespace OpenSim.Region.Physics.OdePlugin
else
{
repData.meshState = MeshState.needMesh;
mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, false, convex, true);
mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, convex, true);
if (mesh == null)
{
repData.meshState = MeshState.MeshFailed;
@ -513,7 +513,7 @@ namespace OpenSim.Region.Physics.OdePlugin
clod = (int)LevelOfDetail.Low;
}
mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, false, convex, true);
mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, convex, true);
if (mesh == null)
{

View File

@ -25,7 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* Revision 2011/12 by Ubit Umarov
/* Revision 2011/12/13 by Ubit Umarov
*
*
*/
@ -115,7 +115,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private int body_autodisable_frames;
public int bodydisablecontrol;
private float m_gravmod = 1.0f;
// Default we're a Geometry
private CollisionCategories m_collisionCategories = (CollisionCategories.Geom);
@ -914,6 +914,55 @@ namespace OpenSim.Region.Physics.OdePlugin
bounce = _parent_scene.m_materialContactsData[pMaterial].bounce;
}
public override float Density
{
get
{
return m_density * 100f;
}
set
{
m_density = value / 100f;
// for not prim mass is not updated since this implies full rebuild of body inertia TODO
}
}
public override float GravModifier
{
get
{
return m_gravmod;
}
set
{
m_gravmod = value;
if (m_vehicle != null)
m_vehicle.GravMod = m_gravmod;
}
}
public override float Friction
{
get
{
return mu;
}
set
{
mu = value;
}
}
public override float Restitution
{
get
{
return bounce;
}
set
{
bounce = value;
}
}
public void setPrimForRemoval()
{
AddChange(changes.Remove, null);
@ -1736,7 +1785,9 @@ namespace OpenSim.Region.Physics.OdePlugin
d.BodySetAutoDisableFlag(Body, true);
d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
d.BodySetDamping(Body, .005f, .005f);
d.BodySetAutoDisableAngularThreshold(Body, 0.01f);
d.BodySetAutoDisableLinearThreshold(Body, 0.01f);
d.BodySetDamping(Body, .005f, .001f);
if (m_targetSpace != IntPtr.Zero)
{
@ -2144,7 +2195,7 @@ namespace OpenSim.Region.Physics.OdePlugin
_mass = primMass; // just in case
d.MassSetBoxTotal(out primdMass, primMass, m_OBB.X, m_OBB.Y, m_OBB.Z);
d.MassSetBoxTotal(out primdMass, primMass, 2.0f * m_OBB.X, 2.0f * m_OBB.Y, 2.0f * m_OBB.Z);
d.MassTranslate(ref primdMass,
m_OBBOffset.X,
@ -2362,6 +2413,7 @@ namespace OpenSim.Region.Physics.OdePlugin
MakeBody();
}
#region changes
private void changeadd()
@ -3214,7 +3266,6 @@ namespace OpenSim.Region.Physics.OdePlugin
if (++bodydisablecontrol < 20)
return;
d.BodyEnable(Body);
}
@ -3334,7 +3385,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
else
{
float b = (1.0f - m_buoyancy);
float b = (1.0f - m_buoyancy) * m_gravmod;
fx = _parent_scene.gravityx * b;
fy = _parent_scene.gravityy * b;
fz = _parent_scene.gravityz * b;
@ -3381,11 +3432,12 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
public void UpdatePositionAndVelocity()
public void UpdatePositionAndVelocity(int frame)
{
if (_parent == null && !m_disabled && !m_building && !m_outbounds && Body != IntPtr.Zero)
{
if (d.BodyIsEnabled(Body) || !_zeroFlag)
bool bodyenabled = d.BodyIsEnabled(Body);
if (bodyenabled || !_zeroFlag)
{
bool lastZeroFlag = _zeroFlag;
@ -3478,13 +3530,13 @@ namespace OpenSim.Region.Physics.OdePlugin
// tolerance values depende a lot on simulation noise...
// use simple math.abs since we dont need to be exact
if (
(Math.Abs(_position.X - lpos.X) < 0.001f)
&& (Math.Abs(_position.Y - lpos.Y) < 0.001f)
&& (Math.Abs(_position.Z - lpos.Z) < 0.001f)
&& (Math.Abs(_orientation.X - ori.X) < 0.0001f)
&& (Math.Abs(_orientation.Y - ori.Y) < 0.0001f)
&& (Math.Abs(_orientation.Z - ori.Z) < 0.0001f) // ignore W
if (!bodyenabled ||
(Math.Abs(_position.X - lpos.X) < 0.005f)
&& (Math.Abs(_position.Y - lpos.Y) < 0.005f)
&& (Math.Abs(_position.Z - lpos.Z) < 0.005f)
&& (Math.Abs(_orientation.X - ori.X) < 0.0005f)
&& (Math.Abs(_orientation.Y - ori.Y) < 0.0005f)
&& (Math.Abs(_orientation.Z - ori.Z) < 0.0005f) // ignore W
)
{
_zeroFlag = true;
@ -3499,9 +3551,9 @@ namespace OpenSim.Region.Physics.OdePlugin
_acceleration = _velocity;
if ((Math.Abs(vel.X) < 0.001f) &&
(Math.Abs(vel.Y) < 0.001f) &&
(Math.Abs(vel.Z) < 0.001f))
if ((Math.Abs(vel.X) < 0.005f) &&
(Math.Abs(vel.Y) < 0.005f) &&
(Math.Abs(vel.Z) < 0.005f))
{
_velocity = Vector3.Zero;
float t = -m_invTimeStep;
@ -3538,6 +3590,15 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
_position.X = lpos.X;
_position.Y = lpos.Y;
_position.Z = lpos.Z;
_orientation.X = ori.X;
_orientation.Y = ori.Y;
_orientation.Z = ori.Z;
_orientation.W = ori.W;
if (_zeroFlag)
{
if (lastZeroFlag)
@ -3556,14 +3617,6 @@ namespace OpenSim.Region.Physics.OdePlugin
return;
}
_position.X = lpos.X;
_position.Y = lpos.Y;
_position.Z = lpos.Z;
_orientation.X = ori.X;
_orientation.Y = ori.Y;
_orientation.Z = ori.Z;
_orientation.W = ori.W;
base.RequestPhysicsterseUpdate();
m_lastUpdateSent = false;
}

View File

@ -25,6 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// Revision 2011/12/13 by Ubit Umarov
//#define SPAM
using System;
@ -43,24 +44,6 @@ using OpenMetaverse;
namespace OpenSim.Region.Physics.OdePlugin
{
public enum StatusIndicators : int
{
Generic = 0,
Start = 1,
End = 2
}
public struct sCollisionData
{
public uint ColliderLocalId;
public uint CollidedWithLocalId;
public int NumberOfCollisions;
public int CollisionType;
public int StatusIndicator;
public int lastframe;
}
// colision flags of things others can colide with
// rays, sensors, probes removed since can't be colided with
// The top space where things are placed provided further selection
@ -188,12 +171,14 @@ namespace OpenSim.Region.Physics.OdePlugin
public bool OdeUbitLib = false;
// private int threadid = 0;
private Random fluidRandomizer = new Random(Environment.TickCount);
// private Random fluidRandomizer = new Random(Environment.TickCount);
const d.ContactFlags comumContactFlags = d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM |d.ContactFlags.Approx1 | d.ContactFlags.Bounce;
const float MaxERP = 0.8f;
const float minERP = 0.1f;
// const d.ContactFlags comumContactFlags = d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM |d.ContactFlags.Approx1 | d.ContactFlags.Bounce;
const d.ContactFlags comumContactFlags = d.ContactFlags.Bounce | d.ContactFlags.Approx1 | d.ContactFlags.Slip1 | d.ContactFlags.Slip2;
const float comumContactERP = 0.7f;
const float comumContactCFM = 0.0001f;
const float comumContactSLIP = 0f;
float frictionMovementMult = 0.8f;
@ -236,8 +221,8 @@ namespace OpenSim.Region.Physics.OdePlugin
public float geomDefaultDensity = 10.000006836f;
public int geomContactPointsStartthrottle = 3;
public int geomUpdatesPerThrottledUpdate = 15;
// public int geomContactPointsStartthrottle = 3;
// public int geomUpdatesPerThrottledUpdate = 15;
public float bodyPIDD = 35f;
public float bodyPIDG = 25;
@ -246,7 +231,6 @@ namespace OpenSim.Region.Physics.OdePlugin
public int bodyFramesAutoDisable = 5;
private d.NearCallback nearCallback;
private HashSet<OdeCharacter> _characters = new HashSet<OdeCharacter>();
@ -266,11 +250,12 @@ namespace OpenSim.Region.Physics.OdePlugin
// public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>();
private float contactsurfacelayer = 0.002f;
private float contactsurfacelayer = 0.001f;
private int contactsPerCollision = 80;
internal IntPtr ContactgeomsArray = IntPtr.Zero;
private IntPtr GlobalContactsArray = IntPtr.Zero;
private d.Contact SharedTmpcontact = new d.Contact();
const int maxContactsbeforedeath = 4000;
private volatile int m_global_contactcount = 0;
@ -283,7 +268,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private Dictionary<IntPtr, float[]> TerrainHeightFieldHeights = new Dictionary<IntPtr, float[]>();
private Dictionary<IntPtr, GCHandle> TerrainHeightFieldHeightsHandlers = new Dictionary<IntPtr, GCHandle>();
private int m_physicsiterations = 10;
private int m_physicsiterations = 15;
private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag
// private PhysicsActor PANull = new NullPhysicsActor();
private float step_time = 0.0f;
@ -303,8 +288,6 @@ namespace OpenSim.Region.Physics.OdePlugin
public IntPtr StaticSpace; // space for the static things around
public IntPtr GroundSpace; // space for ground
public IntPtr SharedRay;
// some speedup variables
private int spaceGridMaxX;
private int spaceGridMaxY;
@ -428,11 +411,9 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(GroundSpace, (uint)(CollisionCategories.Land));
d.GeomSetCollideBits(GroundSpace, 0);
contactgroup = d.JointGroupCreate(0);
contactgroup = d.JointGroupCreate(maxContactsbeforedeath + 1);
//contactgroup
SharedRay = d.CreateRay(TopSpace, 1.0f);
d.WorldSetAutoDisableFlag(world, false);
}
}
@ -481,10 +462,10 @@ namespace OpenSim.Region.Physics.OdePlugin
metersInSpace = physicsconfig.GetFloat("meters_in_small_space", metersInSpace);
contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer);
// contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer);
ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE);
m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", m_physicsiterations);
// m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", m_physicsiterations);
avDensity = physicsconfig.GetFloat("av_density", avDensity);
avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk);
@ -492,8 +473,8 @@ namespace OpenSim.Region.Physics.OdePlugin
contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision);
geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
// geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
// geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
// geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity);
@ -508,6 +489,23 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
d.WorldSetCFM(world, comumContactCFM);
d.WorldSetERP(world, comumContactERP);
d.WorldSetGravity(world, gravityx, gravityy, gravityz);
d.WorldSetLinearDamping(world, 0.002f);
d.WorldSetAngularDamping(world, 0.002f);
d.WorldSetAngularDampingThreshold(world, 0f);
d.WorldSetLinearDampingThreshold(world, 0f);
d.WorldSetMaxAngularSpeed(world, 100f);
d.WorldSetQuickStepNumIterations(world, m_physicsiterations);
d.WorldSetContactSurfaceLayer(world, contactsurfacelayer);
d.WorldSetContactMaxCorrectingVel(world, 60.0f);
m_meshWorker = new ODEMeshWorker(this, m_log, meshmerizer, physicsconfig);
HalfOdeStep = ODE_STEPSIZE * 0.5f;
@ -516,6 +514,20 @@ namespace OpenSim.Region.Physics.OdePlugin
ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf);
GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf);
SharedTmpcontact.geom.g1 = IntPtr.Zero;
SharedTmpcontact.geom.g2 = IntPtr.Zero;
SharedTmpcontact.geom.side1 = -1;
SharedTmpcontact.geom.side2 = -1;
SharedTmpcontact.surface.mode = comumContactFlags;
SharedTmpcontact.surface.mu = 0;
SharedTmpcontact.surface.bounce = 0;
SharedTmpcontact.surface.soft_cfm = comumContactCFM;
SharedTmpcontact.surface.soft_erp = comumContactERP;
SharedTmpcontact.surface.slip1 = comumContactSLIP;
SharedTmpcontact.surface.slip2 = comumContactSLIP;
m_materialContactsData[(int)Material.Stone].mu = 0.8f;
m_materialContactsData[(int)Material.Stone].bounce = 0.4f;
@ -540,27 +552,6 @@ namespace OpenSim.Region.Physics.OdePlugin
m_materialContactsData[(int)Material.light].mu = 0.0f;
m_materialContactsData[(int)Material.light].bounce = 0.0f;
// Set the gravity,, don't disable things automatically (we set it explicitly on some things)
d.WorldSetGravity(world, gravityx, gravityy, gravityz);
d.WorldSetContactSurfaceLayer(world, contactsurfacelayer);
d.WorldSetLinearDamping(world, 0.002f);
d.WorldSetAngularDamping(world, 0.002f);
d.WorldSetAngularDampingThreshold(world, 0f);
d.WorldSetLinearDampingThreshold(world, 0f);
d.WorldSetMaxAngularSpeed(world, 100f);
d.WorldSetCFM(world,1e-6f); // a bit harder than default
//d.WorldSetCFM(world, 1e-4f); // a bit harder than default
d.WorldSetERP(world, 0.6f); // higher than original
// Set how many steps we go without running collision testing
// This is in addition to the step size.
// Essentially Steps * m_physicsiterations
d.WorldSetQuickStepNumIterations(world, m_physicsiterations);
d.WorldSetContactMaxCorrectingVel(world, 60.0f);
spacesPerMeter = 1 / metersInSpace;
spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter);
@ -631,40 +622,21 @@ namespace OpenSim.Region.Physics.OdePlugin
// sets a global contact for a joint for contactgeom , and base contact description)
private IntPtr CreateContacJoint(ref d.ContactGeom contactGeom, float mu, float bounce, float cfm, float erpscale, float dscale)
private IntPtr CreateContacJoint(ref d.ContactGeom contactGeom)
{
if (GlobalContactsArray == IntPtr.Zero || m_global_contactcount >= maxContactsbeforedeath)
if (m_global_contactcount >= maxContactsbeforedeath)
return IntPtr.Zero;
float erp = contactGeom.depth;
erp *= erpscale;
if (erp < minERP)
erp = minERP;
else if (erp > MaxERP)
erp = MaxERP;
m_global_contactcount++;
float depth = contactGeom.depth * dscale;
if (depth > 0.5f)
depth = 0.5f;
d.Contact newcontact = new d.Contact();
newcontact.geom.depth = depth;
newcontact.geom.g1 = contactGeom.g1;
newcontact.geom.g2 = contactGeom.g2;
newcontact.geom.pos = contactGeom.pos;
newcontact.geom.normal = contactGeom.normal;
newcontact.geom.side1 = contactGeom.side1;
newcontact.geom.side2 = contactGeom.side2;
// this needs bounce also
newcontact.surface.mode = comumContactFlags;
newcontact.surface.mu = mu;
newcontact.surface.bounce = bounce;
newcontact.surface.soft_cfm = cfm;
newcontact.surface.soft_erp = erp;
SharedTmpcontact.geom.depth = contactGeom.depth;
SharedTmpcontact.geom.pos = contactGeom.pos;
SharedTmpcontact.geom.normal = contactGeom.normal;
IntPtr contact = new IntPtr(GlobalContactsArray.ToInt64() + (Int64)(m_global_contactcount * d.Contact.unmanagedSizeOf));
Marshal.StructureToPtr(newcontact, contact, true);
Marshal.StructureToPtr(SharedTmpcontact, contact, true);
return d.JointCreateContactPtr(world, contactgroup, contact);
}
@ -825,10 +797,12 @@ namespace OpenSim.Region.Physics.OdePlugin
if (!GetCurContactGeom(0, ref curContact))
return;
ContactPoint maxDepthContact = new ContactPoint();
// do volume detection case
if ((p1.IsVolumeDtc || p2.IsVolumeDtc))
{
ContactPoint maxDepthContact = new ContactPoint(
maxDepthContact = new ContactPoint(
new Vector3(curContact.pos.X, curContact.pos.Y, curContact.pos.Z),
new Vector3(curContact.normal.X, curContact.normal.Y, curContact.normal.Z),
curContact.depth, false
@ -842,10 +816,7 @@ namespace OpenSim.Region.Physics.OdePlugin
float mu = 0;
float bounce = 0;
float cfm = 0.0001f;
float erpscale = 1.0f;
float dscale = 1.0f;
bool IgnoreNegSides = false;
// bool IgnoreNegSides = false;
ContactData contactdata1 = new ContactData(0, 0, false);
ContactData contactdata2 = new ContactData(0, 0, false);
@ -890,7 +861,9 @@ namespace OpenSim.Region.Physics.OdePlugin
break;
case (int)ActorTypes.Prim:
if ((p1.Velocity - p2.Velocity).LengthSquared() > 0.0f)
Vector3 relV = p1.Velocity - p2.Velocity;
float relVlenSQ = relV.LengthSquared();
if (relVlenSQ > 0.0001f)
{
p1.CollidingObj = true;
p2.CollidingObj = true;
@ -900,21 +873,7 @@ namespace OpenSim.Region.Physics.OdePlugin
bounce = contactdata1.bounce * contactdata2.bounce;
mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
cfm = p1.Mass;
if (cfm > p2.Mass)
cfm = p2.Mass;
dscale = 10 / cfm;
dscale = (float)Math.Sqrt(dscale);
if (dscale > 1.0f)
dscale = 1.0f;
erpscale = cfm * 0.01f;
cfm = 0.0001f / cfm;
if (cfm > 0.01f)
cfm = 0.01f;
else if (cfm < 0.00001f)
cfm = 0.00001f;
if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f))
if (relVlenSQ > 0.01f)
mu *= frictionMovementMult;
break;
@ -923,27 +882,17 @@ namespace OpenSim.Region.Physics.OdePlugin
p1.getContactData(ref contactdata1);
bounce = contactdata1.bounce * TerrainBounce;
mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction);
if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f)
mu *= frictionMovementMult;
p1.CollidingGround = true;
cfm = p1.Mass;
dscale = 10 / cfm;
dscale = (float)Math.Sqrt(dscale);
if (dscale > 1.0f)
dscale = 1.0f;
erpscale = cfm * 0.01f;
cfm = 0.0001f / cfm;
if (cfm > 0.01f)
cfm = 0.01f;
else if (cfm < 0.00001f)
cfm = 0.00001f;
/*
if (d.GeomGetClass(g1) == d.GeomClassID.TriMeshClass)
{
if (curContact.side1 > 0)
IgnoreNegSides = true;
}
*/
break;
case (int)ActorTypes.Water:
@ -961,22 +910,8 @@ namespace OpenSim.Region.Physics.OdePlugin
bounce = contactdata2.bounce * TerrainBounce;
mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction);
cfm = p2.Mass;
dscale = 10 / cfm;
dscale = (float)Math.Sqrt(dscale);
if (dscale > 1.0f)
dscale = 1.0f;
erpscale = cfm * 0.01f;
cfm = 0.0001f / cfm;
if (cfm > 0.01f)
cfm = 0.01f;
else if (cfm < 0.00001f)
cfm = 0.00001f;
if (curContact.side1 > 0) // should be 2 ?
IgnoreNegSides = true;
// if (curContact.side1 > 0) // should be 2 ?
// IgnoreNegSides = true;
if (Math.Abs(p2.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y) > 0.1f)
mu *= frictionMovementMult;
@ -993,25 +928,23 @@ namespace OpenSim.Region.Physics.OdePlugin
if (ignore)
return;
d.ContactGeom maxContact = curContact;
// if (IgnoreNegSides && curContact.side1 < 0)
// maxContact.depth = float.MinValue;
d.ContactGeom minContact = curContact;
// if (IgnoreNegSides && curContact.side1 < 0)
// minContact.depth = float.MaxValue;
IntPtr Joint;
bool FeetCollision = false;
int ncontacts = 0;
int i = 0;
maxDepthContact = new ContactPoint();
maxDepthContact.PenetrationDepth = float.MinValue;
ContactPoint minDepthContact = new ContactPoint();
minDepthContact.PenetrationDepth = float.MaxValue;
SharedTmpcontact.geom.depth = 0;
SharedTmpcontact.surface.mu = mu;
SharedTmpcontact.surface.bounce = bounce;
while (true)
{
// if (!(IgnoreNegSides && curContact.side1 < 0))
{
bool noskip = true;
@ -1029,26 +962,32 @@ namespace OpenSim.Region.Physics.OdePlugin
if (noskip)
{
m_global_contactcount++;
if (m_global_contactcount >= maxContactsbeforedeath)
break;
ncontacts++;
Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
Joint = CreateContacJoint(ref curContact);
if (Joint == IntPtr.Zero)
break;
d.JointAttach(Joint, b1, b2);
if (curContact.depth > maxContact.depth)
maxContact = curContact;
ncontacts++;
if (curContact.depth < minContact.depth)
minContact = curContact;
}
if (curContact.depth > maxDepthContact.PenetrationDepth)
{
maxDepthContact.Position.X = curContact.pos.X;
maxDepthContact.Position.Y = curContact.pos.Y;
maxDepthContact.Position.Z = curContact.pos.Z;
maxDepthContact.PenetrationDepth = curContact.depth;
maxDepthContact.CharacterFeet = FeetCollision;
}
if (curContact.depth < minDepthContact.PenetrationDepth)
{
minDepthContact.PenetrationDepth = curContact.depth;
minDepthContact.SurfaceNormal.X = curContact.normal.X;
minDepthContact.SurfaceNormal.Y = curContact.normal.Y;
minDepthContact.SurfaceNormal.Z = curContact.normal.Z;
}
}
}
if (++i >= count)
break;
@ -1058,11 +997,10 @@ namespace OpenSim.Region.Physics.OdePlugin
if (ncontacts > 0)
{
ContactPoint maxDepthContact = new ContactPoint(
new Vector3(maxContact.pos.X, maxContact.pos.Y, maxContact.pos.Z),
new Vector3(minContact.normal.X, minContact.normal.Y, minContact.normal.Z),
maxContact.depth, FeetCollision
);
maxDepthContact.SurfaceNormal.X = minDepthContact.SurfaceNormal.X;
maxDepthContact.SurfaceNormal.Y = minDepthContact.SurfaceNormal.Y;
maxDepthContact.SurfaceNormal.Z = minDepthContact.SurfaceNormal.Z;
collision_accounting_events(p1, p2, maxDepthContact);
}
}
@ -1629,16 +1567,15 @@ namespace OpenSim.Region.Physics.OdePlugin
if (framecount < 0)
framecount = 0;
framecount++;
int curphysiteractions;
// int curphysiteractions;
// if in trouble reduce step resolution
if (step_time >= m_SkipFramesAtms)
curphysiteractions = m_physicsiterations / 2;
else
curphysiteractions = m_physicsiterations;
// if (step_time >= m_SkipFramesAtms)
// curphysiteractions = m_physicsiterations / 2;
// else
// curphysiteractions = m_physicsiterations;
// checkThread();
int nodeframes = 0;
@ -1654,9 +1591,7 @@ namespace OpenSim.Region.Physics.OdePlugin
ODEchangeitem item;
d.WorldSetQuickStepNumIterations(world, curphysiteractions);
// d.WorldSetQuickStepNumIterations(world, curphysiteractions);
int loopstartMS = Util.EnvironmentTickCount();
int looptimeMS = 0;
@ -1763,6 +1698,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// do a ode simulation step
d.WorldQuickStep(world, ODE_STEPSIZE);
// d.WorldStep(world, ODE_STEPSIZE);
d.JointGroupEmpty(contactgroup);
// update managed ideia of physical data and do updates to core
@ -1789,7 +1725,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
if (actor.IsPhysical)
{
actor.UpdatePositionAndVelocity();
actor.UpdatePositionAndVelocity(framecount);
}
}
}

View File

@ -1330,8 +1330,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
startParam, postOnRez,
m_MaxScriptQueue);
if (part.ParentGroup.IsAttachment)
appDomain = part.ParentGroup.RootPart.UUID;
@ -1392,8 +1390,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
sandbox = AppDomain.CurrentDomain;
}
if (!instance.Load(m_AppDomains[appDomain], assembly, stateSource))
return false;
// if (!instance.Load(m_AppDomains[appDomain], assembly, stateSource))
// return false;
m_AppDomains[appDomain] = sandbox;
@ -1413,7 +1411,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
instance.Load(m_AppDomains[appDomain], assembly, stateSource);
if (!instance.Load(m_AppDomains[appDomain], assembly, stateSource))
return false;
// m_log.DebugFormat(
// "[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}.{5}",
// part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID,