aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim.Physics/OdePlugin/OdePlugin.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim.Physics/OdePlugin/OdePlugin.cs')
-rw-r--r--OpenSim.Physics/OdePlugin/OdePlugin.cs70
1 files changed, 50 insertions, 20 deletions
diff --git a/OpenSim.Physics/OdePlugin/OdePlugin.cs b/OpenSim.Physics/OdePlugin/OdePlugin.cs
index 352084c..01eaf77 100644
--- a/OpenSim.Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim.Physics/OdePlugin/OdePlugin.cs
@@ -70,31 +70,54 @@ namespace OpenSim.Physics.OdePlugin
70 70
71 public class OdeScene :PhysicsScene 71 public class OdeScene :PhysicsScene
72 { 72 {
73 public IntPtr world; 73 static public IntPtr world;
74 public IntPtr space; 74 static public IntPtr space;
75 private IntPtr contactgroup; 75 static private IntPtr contactgroup;
76 static private IntPtr LandGeom;
77 static private IntPtr Land;
76 private double[] _heightmap; 78 private double[] _heightmap;
79 static private d.NearCallback nearCallback = near;
80 private List<OdeCharacter> _characters = new List<OdeCharacter>();
81 private static d.ContactGeom[] contacts = new d.ContactGeom[500];
82 private static d.Contact contact;
77 83
78 public OdeScene() 84 public OdeScene() {
79 {
80 world = d.WorldCreate(); 85 world = d.WorldCreate();
81 space = d.HashSpaceCreate(IntPtr.Zero); 86 space = d.HashSpaceCreate(IntPtr.Zero);
82 contactgroup = d.JointGroupCreate(0); 87 contactgroup = d.JointGroupCreate(0);
83 d.WorldSetGravity(world, 0.0f, 0.0f, -0.5f); 88 d.WorldSetGravity(world, 0.0f, 0.0f, -0.5f);
84 d.WorldSetCFM(world, 1e-5f); 89 d.WorldSetCFM(world, 1e-5f);
85 d.WorldSetAutoDisableFlag(world, true); 90 d.WorldSetAutoDisableFlag(world, false);
86 d.WorldSetContactMaxCorrectingVel(world, 0.1f);
87 d.WorldSetContactSurfaceLayer(world, 0.001f);
88 this._heightmap=new double[65536]; 91 this._heightmap=new double[65536];
89 } 92 }
90 93
94 // This function blatantly ripped off from BoxStack.cs
95 static private void near(IntPtr space, IntPtr g1, IntPtr g2)
96 {
97 IntPtr b1 = d.GeomGetBody(g1);
98 IntPtr b2 = d.GeomGetBody(g2);
99 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
100 return;
101
102 int count = d.Collide(g1, g2, 500, contacts, d.ContactGeom.SizeOf);
103 for (int i = 0; i < count; ++i)
104 {
105 contact.geom = contacts[i];
106 IntPtr joint = d.JointCreateContact(world, contactgroup, ref contact);
107 d.JointAttach(joint, b1, b2);
108 }
109
110 }
111
91 public override PhysicsActor AddAvatar(PhysicsVector position) 112 public override PhysicsActor AddAvatar(PhysicsVector position)
92 { 113 {
93 PhysicsVector pos = new PhysicsVector(); 114 PhysicsVector pos = new PhysicsVector();
94 pos.X = position.X; 115 pos.X = position.X;
95 pos.Y = position.Y; 116 pos.Y = position.Y;
96 pos.Z = position.Z; 117 pos.Z = position.Z;
97 return new OdeCharacter(this,pos); 118 OdeCharacter newAv= new OdeCharacter(this,pos);
119 this._characters.Add(newAv);
120 return newAv;
98 } 121 }
99 122
100 public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size) 123 public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
@@ -112,7 +135,16 @@ namespace OpenSim.Physics.OdePlugin
112 135
113 public override void Simulate(float timeStep) 136 public override void Simulate(float timeStep)
114 { 137 {
115 138 foreach (OdeCharacter actor in _characters) {
139 actor.Move(timeStep*5f);
140 }
141 d.SpaceCollide(space, IntPtr.Zero, nearCallback);
142 d.WorldQuickStep(world, timeStep*5f);
143 foreach (OdeCharacter actor in _characters)
144 {
145 actor.UpdatePosition();
146 }
147
116 } 148 }
117 149
118 public override void GetResults() 150 public override void GetResults()
@@ -135,7 +167,8 @@ namespace OpenSim.Physics.OdePlugin
135 } 167 }
136 IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); 168 IntPtr HeightmapData = d.GeomHeightfieldDataCreate();
137 d.GeomHeightfieldDataBuildDouble(HeightmapData,_heightmap,1,256,256,256,256,1.0f,0.0f,2.0f,0); 169 d.GeomHeightfieldDataBuildDouble(HeightmapData,_heightmap,1,256,256,256,256,1.0f,0.0f,2.0f,0);
138 d.CreateHeightfield(space, HeightmapData, 0); 170 LandGeom=d.CreateHeightfield(space, HeightmapData, 1);
171 d.GeomSetPosition(LandGeom,0,0,0);
139 } 172 }
140 } 173 }
141 174
@@ -156,7 +189,10 @@ namespace OpenSim.Physics.OdePlugin
156 _position = pos; 189 _position = pos;
157 _acceleration = new PhysicsVector(); 190 _acceleration = new PhysicsVector();
158 d.MassSetCapsule(out capsule_mass, 5.0f, 3, 0.5f, 2f); 191 d.MassSetCapsule(out capsule_mass, 5.0f, 3, 0.5f, 2f);
159 capsule_geom = d.CreateCapsule(parent_scene.space, 0.5f, 2f); 192 capsule_geom = d.CreateCapsule(OdeScene.space, 0.5f, 2f);
193 this.BoundingCapsule=d.BodyCreate(OdeScene.world);
194 d.BodySetMass(BoundingCapsule, ref capsule_mass);
195 d.BodySetPosition(BoundingCapsule,pos.X,pos.Y,pos.Z);
160 } 196 }
161 197
162 public override bool Flying 198 public override bool Flying
@@ -249,12 +285,7 @@ namespace OpenSim.Physics.OdePlugin
249 vec.Y = this._velocity.Y * timeStep; 285 vec.Y = this._velocity.Y * timeStep;
250 if(flying) 286 if(flying)
251 { 287 {
252 vec.Z = ( this._velocity.Z) * timeStep; 288 vec.Z = ( this._velocity.Z+0.5f) * timeStep;
253 }
254 else
255 {
256 gravityAccel+= -9.8f;
257 vec.Z = (gravityAccel + this._velocity.Z) * timeStep;
258 } 289 }
259 d.BodySetLinearVel(this.BoundingCapsule, vec.X, vec.Y, vec.Z); 290 d.BodySetLinearVel(this.BoundingCapsule, vec.X, vec.Y, vec.Z);
260 } 291 }
@@ -265,7 +296,6 @@ namespace OpenSim.Physics.OdePlugin
265 this._position.X = vec.X; 296 this._position.X = vec.X;
266 this._position.Y = vec.Y; 297 this._position.Y = vec.Y;
267 this._position.Z = vec.Z; 298 this._position.Z = vec.Z;
268
269 } 299 }
270 } 300 }
271 301
@@ -297,7 +327,7 @@ namespace OpenSim.Physics.OdePlugin
297 get 327 get
298 { 328 {
299 PhysicsVector pos = new PhysicsVector(); 329 PhysicsVector pos = new PhysicsVector();
300 //PhysicsVector vec = this._prim.Position; 330 // PhysicsVector vec = this._prim.Position;
301 //pos.X = vec.X; 331 //pos.X = vec.X;
302 //pos.Y = vec.Y; 332 //pos.Y = vec.Y;
303 //pos.Z = vec.Z; 333 //pos.Z = vec.Z;