Hollow prims (box only), thanks Gerard! Enjoy

afrisby
dan miller 2007-09-29 03:56:36 +00:00
parent e4b276a63b
commit a0265300aa
10 changed files with 264 additions and 35 deletions

View File

@ -429,7 +429,11 @@ namespace OpenSim.Region.Environment.Scenes
group.AbsolutePosition = pos; group.AbsolutePosition = pos;
SceneObjectPart rootPart = group.GetChildPart(group.UUID); SceneObjectPart rootPart = group.GetChildPart(group.UUID);
if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
rootPart.PhysActor = phyScene.AddPrim( {
PrimitiveBaseShape pbs = rootPart.Shape;
rootPart.PhysActor = phyScene.AddPrimShape(
rootPart.Name,
pbs,
new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y,
rootPart.AbsolutePosition.Z), rootPart.AbsolutePosition.Z),
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
@ -438,3 +442,4 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
} }
}

View File

@ -531,7 +531,9 @@ namespace OpenSim.Region.Environment.Scenes
AddEntityFromStorage(prim); AddEntityFromStorage(prim);
SceneObjectPart rootPart = prim.GetChildPart(prim.UUID); SceneObjectPart rootPart = prim.GetChildPart(prim.UUID);
if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
rootPart.PhysActor = phyScene.AddPrim( rootPart.PhysActor = phyScene.AddPrimShape(
rootPart.Name,
rootPart.Shape,
new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y,
rootPart.AbsolutePosition.Z), rootPart.AbsolutePosition.Z),
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
@ -579,7 +581,10 @@ namespace OpenSim.Region.Environment.Scenes
// if not phantom, add to physics // if not phantom, add to physics
if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
rootPart.PhysActor = rootPart.PhysActor =
phyScene.AddPrim(new PhysicsVector(pos.X, pos.Y, pos.Z), phyScene.AddPrimShape(
rootPart.Name,
rootPart.Shape,
new PhysicsVector(pos.X, pos.Y, pos.Z),
new PhysicsVector(shape.Scale.X, shape.Scale.Y, shape.Scale.Z), new PhysicsVector(shape.Scale.X, shape.Scale.Y, shape.Scale.Z),
new Quaternion()); new Quaternion());
} }
@ -662,7 +667,9 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); SceneObjectPart rootPart = obj.GetChildPart(obj.UUID);
if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
rootPart.PhysActor = phyScene.AddPrim( rootPart.PhysActor = phyScene.AddPrimShape(
rootPart.Name,
rootPart.Shape,
new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y,
rootPart.AbsolutePosition.Z), rootPart.AbsolutePosition.Z),
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),

View File

@ -314,12 +314,16 @@ namespace OpenSim.Region.Environment.Scenes
/// may need to create a new Physics actor. /// may need to create a new Physics actor.
if (dupe.RootPart.PhysActor != null) if (dupe.RootPart.PhysActor != null)
{ {
dupe.RootPart.PhysActor = m_scene.PhysScene.AddPrim( PrimitiveBaseShape pbs = dupe.RootPart.Shape;
new PhysicsVector(dupe.RootPart.AbsolutePosition.X, dupe.RootPart.AbsolutePosition.Y,
dupe.RootPart.AbsolutePosition.Z), dupe.RootPart.PhysActor = m_scene.PhysScene.AddPrimShape(
dupe.RootPart.Name,
pbs,
new PhysicsVector(dupe.RootPart.AbsolutePosition.X, dupe.RootPart.AbsolutePosition.Y, dupe.RootPart.AbsolutePosition.Z),
new PhysicsVector(dupe.RootPart.Scale.X, dupe.RootPart.Scale.Y, dupe.RootPart.Scale.Z), new PhysicsVector(dupe.RootPart.Scale.X, dupe.RootPart.Scale.Y, dupe.RootPart.Scale.Z),
new Quaternion(dupe.RootPart.RotationOffset.W, dupe.RootPart.RotationOffset.X, new Axiom.Math.Quaternion(dupe.RootPart.RotationOffset.W, dupe.RootPart.RotationOffset.X,
dupe.RootPart.RotationOffset.Y, dupe.RootPart.RotationOffset.Z)); dupe.RootPart.RotationOffset.Y, dupe.RootPart.RotationOffset.Z));
} }
List<SceneObjectPart> partList = new List<SceneObjectPart>(m_parts.Values); List<SceneObjectPart> partList = new List<SceneObjectPart>(m_parts.Values);
@ -838,6 +842,17 @@ namespace OpenSim.Region.Environment.Scenes
{ {
part.UpdateShape(shapeBlock); part.UpdateShape(shapeBlock);
} }
if (m_rootPart.PhysActor != null)
{
this.m_scene.PhysScene.RemovePrim(m_rootPart.PhysActor);
m_rootPart.PhysActor = m_scene.PhysScene.AddPrimShape(
m_rootPart.Name,
m_rootPart.Shape,
new PhysicsVector(m_rootPart.AbsolutePosition.X, m_rootPart.AbsolutePosition.Y, m_rootPart.AbsolutePosition.Z),
new PhysicsVector(m_rootPart.Scale.X, m_rootPart.Scale.Y, m_rootPart.Scale.Z),
new Axiom.Math.Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X,
m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z));
}
} }
#endregion #endregion

View File

@ -914,7 +914,7 @@ namespace OpenSim.Region.Environment.Scenes
new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y,
AbsolutePosition.Z); AbsolutePosition.Z);
m_physicsActor = scene.AddAvatar(pVec); m_physicsActor = scene.AddAvatar(this.Firstname+"."+this.Lastname, pVec);
} }
internal void Close() internal void Close()

View File

@ -27,6 +27,7 @@
*/ */
using System.Collections.Generic; using System.Collections.Generic;
using Axiom.Math; using Axiom.Math;
using OpenSim.Framework.Types;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
namespace OpenSim.Region.Physics.BasicPhysicsPlugin namespace OpenSim.Region.Physics.BasicPhysicsPlugin
@ -72,7 +73,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
} }
public override PhysicsActor AddAvatar(PhysicsVector position) public override PhysicsActor AddAvatar(string avName, PhysicsVector position)
{ {
BasicActor act = new BasicActor(); BasicActor act = new BasicActor();
act.Position = position; act.Position = position;
@ -95,10 +96,17 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
} }
/*
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation)
{ {
return null; return null;
} }
*/
public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation)
{
return null;
}
public override void Simulate(float timeStep) public override void Simulate(float timeStep)
{ {

View File

@ -30,6 +30,7 @@
#region References #region References
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using OpenSim.Framework.Types;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
using Axiom.Math; using Axiom.Math;
using AxiomQuaternion = Axiom.Math.Quaternion; using AxiomQuaternion = Axiom.Math.Quaternion;
@ -252,7 +253,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin
this._heightmap = new float[65536]; this._heightmap = new float[65536];
} }
public override PhysicsActor AddAvatar(PhysicsVector position) public override PhysicsActor AddAvatar(string avName, PhysicsVector position)
{ {
PhysicsVector pos = new PhysicsVector(); PhysicsVector pos = new PhysicsVector();
pos.X = position.X; pos.X = position.X;
@ -276,7 +277,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin
} }
} }
} }
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, AxiomQuaternion rotation) PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, AxiomQuaternion rotation)
{ {
BulletXPrim newPrim = null; BulletXPrim newPrim = null;
lock (BulletXLock) lock (BulletXLock)
@ -286,6 +287,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin
} }
return newPrim; return newPrim;
} }
public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, AxiomQuaternion rotation)
{
return AddPrim(position, size, rotation);
}
public override void RemovePrim(PhysicsActor prim) public override void RemovePrim(PhysicsActor prim)
{ {
if (prim is BulletXPrim) if (prim is BulletXPrim)
@ -709,7 +715,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin
{ {
_startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos);
//For now all prims are boxes //For now all prims are boxes
CollisionShape _collisionShape = new BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(_size) / 2.0f); CollisionShape _collisionShape = new XnaDevRu.BulletX.BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(_size) / 2.0f);
DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset);
MonoXnaCompactMaths.Vector3 _localInertia = new MonoXnaCompactMaths.Vector3(); MonoXnaCompactMaths.Vector3 _localInertia = new MonoXnaCompactMaths.Vector3();
_collisionShape.CalculateLocalInertia(Mass, out _localInertia); //Always when mass > 0 _collisionShape.CalculateLocalInertia(Mass, out _localInertia); //Always when mass > 0
@ -912,7 +918,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin
MonoXnaCompactMaths.Vector3 _newsize; MonoXnaCompactMaths.Vector3 _newsize;
_newsize = BulletXMaths.PhysicsVectorToXnaVector3(_newSize); _newsize = BulletXMaths.PhysicsVectorToXnaVector3(_newSize);
//For now all prims are Boxes //For now all prims are Boxes
rigidBody.CollisionShape = new BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(_newSize) / 2.0f); rigidBody.CollisionShape = new XnaDevRu.BulletX.BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(_newSize) / 2.0f);
} }
private void ReOrient() private void ReOrient()
{ {

View File

@ -25,6 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
using OpenSim.Framework.Types;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using Axiom.Math; using Axiom.Math;
@ -40,13 +41,13 @@ namespace OpenSim.Region.Physics.Manager
} }
} }
public abstract PhysicsActor AddAvatar(PhysicsVector position); public abstract PhysicsActor AddAvatar(string avName, PhysicsVector position);
public abstract void RemoveAvatar(PhysicsActor actor); public abstract void RemoveAvatar(PhysicsActor actor);
public abstract void RemovePrim(PhysicsActor prim); public abstract void RemovePrim(PhysicsActor prim);
public abstract PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation); public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation);
public abstract void Simulate(float timeStep); public abstract void Simulate(float timeStep);
@ -65,7 +66,7 @@ namespace OpenSim.Region.Physics.Manager
{ {
private static int m_workIndicator; private static int m_workIndicator;
public override PhysicsActor AddAvatar(PhysicsVector position) public override PhysicsActor AddAvatar(string avName, PhysicsVector position)
{ {
MainLog.Instance.Verbose("NullPhysicsScene : AddAvatar({0})", position); MainLog.Instance.Verbose("NullPhysicsScene : AddAvatar({0})", position);
return PhysicsActor.Null; return PhysicsActor.Null;
@ -81,11 +82,18 @@ namespace OpenSim.Region.Physics.Manager
} }
/*
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation)
{ {
MainLog.Instance.Verbose("NullPhysicsScene : AddPrim({0},{1})", position, size); MainLog.Instance.Verbose("NullPhysicsScene : AddPrim({0},{1})", position, size);
return PhysicsActor.Null; return PhysicsActor.Null;
} }
*/
public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation)
{
MainLog.Instance.Verbose("NullPhysicsScene : AddPrim({0},{1})", position, size);
return PhysicsActor.Null;
}
public override void Simulate(float timeStep) public override void Simulate(float timeStep)
{ {

View File

@ -28,10 +28,17 @@
using System; using System;
using System.Threading; using System.Threading;
using System.Collections.Generic; using System.Collections.Generic;
using libsecondlife;
using libsecondlife.Utilities;
using Axiom.Math; using Axiom.Math;
using Ode.NET; using Ode.NET;
using OpenSim.Framework.Types;
using OpenSim.Framework.Console;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
namespace OpenSim.Region.Physics.OdePlugin namespace OpenSim.Region.Physics.OdePlugin
{ {
/// <summary> /// <summary>
@ -77,8 +84,11 @@ namespace OpenSim.Region.Physics.OdePlugin
private IntPtr LandGeom; private IntPtr LandGeom;
private double[] _heightmap; private double[] _heightmap;
private d.NearCallback nearCallback; private d.NearCallback nearCallback;
public d.TriCallback triCallback;
public d.TriArrayCallback triArrayCallback;
private List<OdeCharacter> _characters = new List<OdeCharacter>(); private List<OdeCharacter> _characters = new List<OdeCharacter>();
private List<OdePrim> _prims = new List<OdePrim>(); private List<OdePrim> _prims = new List<OdePrim>();
public Dictionary<IntPtr, String> geom_name_map=new Dictionary<IntPtr, String>();
private d.ContactGeom[] contacts = new d.ContactGeom[30]; private d.ContactGeom[] contacts = new d.ContactGeom[30];
private d.Contact contact; private d.Contact contact;
@ -89,6 +99,8 @@ namespace OpenSim.Region.Physics.OdePlugin
public OdeScene() public OdeScene()
{ {
nearCallback = near; nearCallback = near;
triCallback = TriCallback;
triArrayCallback = TriArrayCallback;
contact.surface.mode |= d.ContactFlags.Approx1 | d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP; contact.surface.mode |= d.ContactFlags.Approx1 | d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP;
contact.surface.mu = 10.0f; contact.surface.mu = 10.0f;
contact.surface.bounce = 0.9f; contact.surface.bounce = 0.9f;
@ -112,12 +124,33 @@ namespace OpenSim.Region.Physics.OdePlugin
private void near(IntPtr space, IntPtr g1, IntPtr g2) private void near(IntPtr space, IntPtr g1, IntPtr g2)
{ {
// no lock here! It's invoked from within Simulate(), which is thread-locked // no lock here! It's invoked from within Simulate(), which is thread-locked
if (g1 == g2)
return; // Can't collide with yourself
IntPtr b1 = d.GeomGetBody(g1); IntPtr b1 = d.GeomGetBody(g1);
IntPtr b2 = d.GeomGetBody(g2); IntPtr b2 = d.GeomGetBody(g2);
if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
return; return;
int count = d.Collide(g1, g2, 500, contacts, d.ContactGeom.SizeOf); d.GeomClassID id = d.GeomGetClass(g1);
if (id==d.GeomClassID.TriMeshClass)
{
String name1 = null;
String name2 = null;
if (!geom_name_map.TryGetValue(g1, out name1))
{
name1 = "null";
}
if (!geom_name_map.TryGetValue(g2, out name2))
{
name2 = "null";
}
// MainLog.Instance.Verbose("near: A collision was detected between {1} and {2}", 0, name1, name2);
}
int count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
contact.geom = contacts[i]; contact.geom = contacts[i];
@ -139,22 +172,25 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
} }
public override PhysicsActor AddAvatar(PhysicsVector position) public override PhysicsActor AddAvatar(string avName, PhysicsVector position)
{ {
PhysicsVector pos = new PhysicsVector(); PhysicsVector pos = new PhysicsVector();
pos.X = position.X; pos.X = position.X;
pos.Y = position.Y; pos.Y = position.Y;
pos.Z = position.Z; pos.Z = position.Z;
OdeCharacter newAv = new OdeCharacter(this, pos); OdeCharacter newAv = new OdeCharacter(avName, this, pos);
_characters.Add(newAv); _characters.Add(newAv);
return newAv; return newAv;
} }
public override void RemoveAvatar(PhysicsActor actor) public override void RemoveAvatar(PhysicsActor actor)
{
lock (OdeLock)
{ {
((OdeCharacter)actor).Destroy(); ((OdeCharacter)actor).Destroy();
_characters.Remove((OdeCharacter)actor); _characters.Remove((OdeCharacter)actor);
} }
}
public override void RemovePrim(PhysicsActor prim) public override void RemovePrim(PhysicsActor prim)
{ {
@ -168,7 +204,7 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
} }
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation, Mesh mesh, PrimitiveBaseShape pbs)
{ {
PhysicsVector pos = new PhysicsVector(); PhysicsVector pos = new PhysicsVector();
pos.X = position.X; pos.X = position.X;
@ -186,12 +222,91 @@ namespace OpenSim.Region.Physics.OdePlugin
OdePrim newPrim; OdePrim newPrim;
lock (OdeLock) lock (OdeLock)
{ {
newPrim = new OdePrim(this, pos, siz, rot); newPrim = new OdePrim(name, this, pos, siz, rot, mesh, pbs);
} }
_prims.Add(newPrim); _prims.Add(newPrim);
return newPrim; return newPrim;
} }
public int TriArrayCallback(System.IntPtr trimesh, System.IntPtr refObject, int[] triangleIndex, int triCount)
{
/* String name1 = null;
String name2 = null;
if (!geom_name_map.TryGetValue(trimesh, out name1))
{
name1 = "null";
}
if (!geom_name_map.TryGetValue(refObject, out name2))
{
name2 = "null";
}
MainLog.Instance.Verbose("TriArrayCallback: A collision was detected between {1} and {2}", 0, name1, name2);
*/
return 1;
}
public int TriCallback(System.IntPtr trimesh, System.IntPtr refObject, int triangleIndex)
{
String name1 = null;
String name2 = null;
if (!geom_name_map.TryGetValue(trimesh, out name1))
{
Console.WriteLine("+++ nulling " + name1);
name1 = "null";
}
if (!geom_name_map.TryGetValue(refObject, out name2))
{
Console.WriteLine("+++ nulling " + name2);
name2 = "null";
}
// MainLog.Instance.Verbose("TriCallback: A collision was detected between {1} and {2}. Index was {3}", 0, name1, name2, triangleIndex);
d.Vector3 v0 = new d.Vector3();
d.Vector3 v1 = new d.Vector3();
d.Vector3 v2 = new d.Vector3();
d.GeomTriMeshGetTriangle(trimesh, 0, ref v0, ref v1, ref v2);
MainLog.Instance.Debug("Triangle {0} is <{1},{2},{3}>, <{4},{5},{6}>, <{7},{8},{9}>", triangleIndex, v0.X, v0.Y, v0.Z, v1.X, v1.Y, v1.Z, v2.X, v2.Y, v2.Z);
return 1;
}
public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation)
{
PhysicsActor result;
switch(pbs.ProfileShape)
{
case ProfileShape.Square:
/// support simple box & hollow box now; later, more shapes
if (pbs.ProfileHollow == 0)
{
result = AddPrim(primName, position, size, rotation, null, null);
}
else
{
Mesh mesh = Meshmerizer.CreateMesh(pbs, size);
result = AddPrim(primName, position, size, rotation, mesh, pbs);
}
break;
default:
result = AddPrim(primName, position, size, rotation, null, null);
break;
}
return result;
}
public override void Simulate(float timeStep) public override void Simulate(float timeStep)
{ {
lock (OdeLock) lock (OdeLock)
@ -247,6 +362,8 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomHeightfieldDataBuildDouble(HeightmapData, _heightmap, 0, 256, 256, 256, 256, 1.0f, 0.0f, 2.0f, 0); d.GeomHeightfieldDataBuildDouble(HeightmapData, _heightmap, 0, 256, 256, 256, 256, 1.0f, 0.0f, 2.0f, 0);
d.GeomHeightfieldDataSetBounds(HeightmapData, 256, 256); d.GeomHeightfieldDataSetBounds(HeightmapData, 256, 256);
LandGeom = d.CreateHeightfield(space, HeightmapData, 1); LandGeom = d.CreateHeightfield(space, HeightmapData, 1);
this.geom_name_map[LandGeom]="Terrain";
d.Matrix3 R = new d.Matrix3(); d.Matrix3 R = new d.Matrix3();
Quaternion q1 = Quaternion.FromAngleAxis(1.5707f, new Vector3(1, 0, 0)); Quaternion q1 = Quaternion.FromAngleAxis(1.5707f, new Vector3(1, 0, 0));
@ -285,7 +402,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public IntPtr capsule_geom; public IntPtr capsule_geom;
public d.Mass capsule_mass; public d.Mass capsule_mass;
public OdeCharacter(OdeScene parent_scene, PhysicsVector pos) public OdeCharacter(String avName, OdeScene parent_scene, PhysicsVector pos)
{ {
_velocity = new PhysicsVector(); _velocity = new PhysicsVector();
_position = pos; _position = pos;
@ -300,6 +417,8 @@ namespace OpenSim.Region.Physics.OdePlugin
d.BodySetPosition(BoundingCapsule, pos.X, pos.Y, pos.Z); d.BodySetPosition(BoundingCapsule, pos.X, pos.Y, pos.Z);
d.GeomSetBody(capsule_geom, BoundingCapsule); d.GeomSetBody(capsule_geom, BoundingCapsule);
} }
parent_scene.geom_name_map[capsule_geom]=avName;
} }
public override bool Flying public override bool Flying
@ -454,6 +573,8 @@ namespace OpenSim.Region.Physics.OdePlugin
lock (OdeScene.OdeLock) lock (OdeScene.OdeLock)
{ {
d.GeomDestroy(this.capsule_geom); d.GeomDestroy(this.capsule_geom);
Console.WriteLine("+++ removing geom");
this._parent_scene.geom_name_map.Remove(this.capsule_geom);
d.BodyDestroy(this.BoundingCapsule); d.BodyDestroy(this.BoundingCapsule);
} }
} }
@ -466,18 +587,35 @@ namespace OpenSim.Region.Physics.OdePlugin
private PhysicsVector _size; private PhysicsVector _size;
private PhysicsVector _acceleration; private PhysicsVector _acceleration;
private Quaternion _orientation; private Quaternion _orientation;
private Mesh _mesh;
private PrimitiveBaseShape _pbs;
private OdeScene _parent_scene;
public IntPtr prim_geom; public IntPtr prim_geom;
public IntPtr _triMeshData;
public OdePrim(OdeScene parent_scene, PhysicsVector pos, PhysicsVector size, Quaternion rotation) public OdePrim(String primName, OdeScene parent_scene, PhysicsVector pos, PhysicsVector size,
Quaternion rotation, Mesh mesh, PrimitiveBaseShape pbs)
{ {
_velocity = new PhysicsVector(); _velocity = new PhysicsVector();
_position = pos; _position = pos;
_size = size; _size = size;
_acceleration = new PhysicsVector(); _acceleration = new PhysicsVector();
_orientation = rotation; _orientation = rotation;
_mesh = mesh;
_pbs = pbs;
_parent_scene = parent_scene;
lock (OdeScene.OdeLock) lock (OdeScene.OdeLock)
{
if (mesh!=null)
{
setMesh(parent_scene, mesh);
}
else
{ {
prim_geom = d.CreateBox(parent_scene.space, _size.X, _size.Y, _size.Z); prim_geom = d.CreateBox(parent_scene.space, _size.X, _size.Y, _size.Z);
}
d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
d.Quaternion myrot = new d.Quaternion(); d.Quaternion myrot = new d.Quaternion();
myrot.W = rotation.w; myrot.W = rotation.w;
@ -485,9 +623,25 @@ namespace OpenSim.Region.Physics.OdePlugin
myrot.Y = rotation.y; myrot.Y = rotation.y;
myrot.Z = rotation.z; myrot.Z = rotation.z;
d.GeomSetQuaternion(prim_geom, ref myrot); d.GeomSetQuaternion(prim_geom, ref myrot);
parent_scene.geom_name_map[prim_geom] = primName; // don't do .add() here; old geoms get recycled with the same hash
} }
} }
public void setMesh(OdeScene parent_scene, Mesh mesh)
{
float[] vertexList = mesh.getVertexListAsFloat(); // Note, that vertextList is pinned in memory
int[] indexList = mesh.getIndexListAsInt(); // Also pinned, needs release after usage
int VertexCount = vertexList.GetLength(0) / 3;
int IndexCount = indexList.GetLength(0);
_triMeshData = d.GeomTriMeshDataCreate();
d.GeomTriMeshDataBuildSimple(_triMeshData, vertexList, 3 * sizeof(float), VertexCount, indexList, IndexCount, 3 * sizeof(int));
d.GeomTriMeshDataPreprocess(_triMeshData);
prim_geom = d.CreateTriMesh(parent_scene.space, _triMeshData, parent_scene.triCallback, parent_scene.triArrayCallback, null);
}
public override bool Flying public override bool Flying
{ {
get get
@ -525,11 +679,22 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
_size = value; _size = value;
lock (OdeScene.OdeLock) lock (OdeScene.OdeLock)
{
if (_mesh != null) // We deal with a mesh here
{
string oldname = _parent_scene.geom_name_map[prim_geom];
d.GeomDestroy(prim_geom);
Mesh mesh = Meshmerizer.CreateMesh(_pbs, _size);
setMesh(_parent_scene, mesh);
_parent_scene.geom_name_map[prim_geom] = oldname;
}
else
{ {
d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z);
} }
} }
} }
}
public override PhysicsVector Velocity public override PhysicsVector Velocity
{ {

View File

@ -27,6 +27,7 @@
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using OpenSim.Framework.Types;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
using PhysXWrapper; using PhysXWrapper;
using Quaternion=Axiom.Math.Quaternion; using Quaternion=Axiom.Math.Quaternion;
@ -86,7 +87,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
} }
public override PhysicsActor AddAvatar(PhysicsVector position) public override PhysicsActor AddAvatar(string avName, PhysicsVector position)
{ {
Vec3 pos = new Vec3(); Vec3 pos = new Vec3();
pos.X = position.X; pos.X = position.X;
@ -108,7 +109,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
} }
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation)
{ {
Vec3 pos = new Vec3(); Vec3 pos = new Vec3();
pos.X = position.X; pos.X = position.X;
@ -122,6 +123,11 @@ namespace OpenSim.Region.Physics.PhysXPlugin
_prims.Add(act); _prims.Add(act);
return act; return act;
} }
public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation)
{
return AddPrim(position, size, rotation);
}
public override void Simulate(float timeStep) public override void Simulate(float timeStep)
{ {
try try

View File

@ -199,6 +199,7 @@
<ReferencePath>../../../../bin/</ReferencePath> <ReferencePath>../../../../bin/</ReferencePath>
<Reference name="System" localCopy="false"/> <Reference name="System" localCopy="false"/>
<Reference name="System.Xml" localCopy="false" /> <Reference name="System.Xml" localCopy="false" />
<Reference name="libsecondlife.dll"/>
<Reference name="Axiom.MathLib.dll" localCopy="false"/> <Reference name="Axiom.MathLib.dll" localCopy="false"/>
<Reference name="OpenSim.Framework" localCopy="false"/> <Reference name="OpenSim.Framework" localCopy="false"/>
<Reference name="OpenSim.Framework.Console" localCopy="false"/> <Reference name="OpenSim.Framework.Console" localCopy="false"/>
@ -224,6 +225,7 @@
<ReferencePath>../../../../bin/</ReferencePath> <ReferencePath>../../../../bin/</ReferencePath>
<Reference name="System" localCopy="false"/> <Reference name="System" localCopy="false"/>
<Reference name="Axiom.MathLib.dll" localCopy="false"/> <Reference name="Axiom.MathLib.dll" localCopy="false"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/> <Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/>
<Files> <Files>
<Match pattern="*.cs" recurse="true"/> <Match pattern="*.cs" recurse="true"/>
@ -244,8 +246,10 @@
<ReferencePath>../../../../bin/</ReferencePath> <ReferencePath>../../../../bin/</ReferencePath>
<Reference name="System" localCopy="false"/> <Reference name="System" localCopy="false"/>
<Reference name="libsecondlife.dll"/>
<Reference name="Axiom.MathLib.dll" localCopy="false"/> <Reference name="Axiom.MathLib.dll" localCopy="false"/>
<Reference name="PhysX_Wrapper_Dotnet.dll" localCopy="false"/> <Reference name="PhysX_Wrapper_Dotnet.dll" localCopy="false"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/> <Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/>
<Files> <Files>
<Match pattern="*.cs" recurse="true"/> <Match pattern="*.cs" recurse="true"/>
@ -267,6 +271,9 @@
<ReferencePath>../../../../bin/</ReferencePath> <ReferencePath>../../../../bin/</ReferencePath>
<Reference name="System" localCopy="false"/> <Reference name="System" localCopy="false"/>
<Reference name="Axiom.MathLib.dll" localCopy="false"/> <Reference name="Axiom.MathLib.dll" localCopy="false"/>
<Reference name="libsecondlife.dll"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Framework.Console"/>
<Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/> <Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/>
<Reference name="Ode.NET.dll" localCopy="false" /> <Reference name="Ode.NET.dll" localCopy="false" />
@ -289,7 +296,9 @@
<ReferencePath>../../../../bin/</ReferencePath> <ReferencePath>../../../../bin/</ReferencePath>
<Reference name="System" localCopy="false"/> <Reference name="System" localCopy="false"/>
<Reference name="libsecondlife.dll"/>
<Reference name="Axiom.MathLib.dll" localCopy="false"/> <Reference name="Axiom.MathLib.dll" localCopy="false"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/> <Reference name="OpenSim.Region.Physics.Manager" localCopy="false"/>
<Reference name="Modified.XnaDevRu.BulletX.dll" localCopy="false" /> <Reference name="Modified.XnaDevRu.BulletX.dll" localCopy="false" />
<Reference name="MonoXnaCompactMaths.dll" localCopy="false" /> <Reference name="MonoXnaCompactMaths.dll" localCopy="false" />