diff options
author | MW | 2007-03-10 20:30:25 +0000 |
---|---|---|
committer | MW | 2007-03-10 20:30:25 +0000 |
commit | 76569ff4fba09f22ed4a06b8073deaed7f64a2e3 (patch) | |
tree | f83430652d8874f299733f505b6b7ded13910bb8 /src/world/Avatar.cs | |
parent | Another attempt to fix the project files (diff) | |
download | opensim-SC-76569ff4fba09f22ed4a06b8073deaed7f64a2e3.zip opensim-SC-76569ff4fba09f22ed4a06b8073deaed7f64a2e3.tar.gz opensim-SC-76569ff4fba09f22ed4a06b8073deaed7f64a2e3.tar.bz2 opensim-SC-76569ff4fba09f22ed4a06b8073deaed7f64a2e3.tar.xz |
A PhysX physics plugin (that actually uses physX now but currently only works on windows)
Can now change direction when walking without stopping
Flying works when using the Physx dll
Diffstat (limited to '')
-rw-r--r-- | src/world/Avatar.cs | 103 |
1 files changed, 90 insertions, 13 deletions
diff --git a/src/world/Avatar.cs b/src/world/Avatar.cs index c09c008..facfeee 100644 --- a/src/world/Avatar.cs +++ b/src/world/Avatar.cs | |||
@@ -11,15 +11,17 @@ namespace OpenSim.world | |||
11 | { | 11 | { |
12 | public class Avatar : Entity | 12 | public class Avatar : Entity |
13 | { | 13 | { |
14 | public static bool PhysicsEngineFlying; | ||
14 | public string firstname; | 15 | public string firstname; |
15 | public string lastname; | 16 | public string lastname; |
16 | public OpenSimClient ControllingClient; | 17 | public OpenSimClient ControllingClient; |
17 | private PhysicsActor _physActor; | 18 | private PhysicsActor _physActor; |
18 | private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; | 19 | private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; |
19 | private bool updateflag; | 20 | private bool updateflag; |
20 | private bool walking; | 21 | private byte movementflag; |
21 | private List<NewForce> forcesList = new List<NewForce>(); | 22 | private List<NewForce> forcesList = new List<NewForce>(); |
22 | private short _updateCount; | 23 | private short _updateCount; |
24 | private Axiom.MathLib.Quaternion bodyRot; | ||
23 | 25 | ||
24 | public Avatar(OpenSimClient TheClient) { | 26 | public Avatar(OpenSimClient TheClient) { |
25 | ServerConsole.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)"); | 27 | ServerConsole.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)"); |
@@ -77,14 +79,14 @@ namespace OpenSim.world | |||
77 | } | 79 | } |
78 | 80 | ||
79 | updateflag =false; | 81 | updateflag =false; |
80 | this._updateCount = 0; | 82 | //this._updateCount = 0; |
81 | } | 83 | } |
82 | else | 84 | else |
83 | { | 85 | { |
84 | if(walking) | 86 | //if((movementflag & 1) !=0) |
85 | { | 87 | //{ |
86 | _updateCount++; | 88 | _updateCount++; |
87 | if(_updateCount>3) | 89 | if(( (!PhysicsEngineFlying) && (_updateCount>3)) || (_updateCount>0)) |
88 | { | 90 | { |
89 | //It has been a while since last update was sent so lets send one. | 91 | //It has been a while since last update was sent so lets send one. |
90 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); | 92 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); |
@@ -98,7 +100,7 @@ namespace OpenSim.world | |||
98 | } | 100 | } |
99 | _updateCount = 0; | 101 | _updateCount = 0; |
100 | } | 102 | } |
101 | } | 103 | //} |
102 | } | 104 | } |
103 | } | 105 | } |
104 | 106 | ||
@@ -249,36 +251,111 @@ namespace OpenSim.world | |||
249 | } | 251 | } |
250 | 252 | ||
251 | public void HandleUpdate(AgentUpdatePacket pack) { | 253 | public void HandleUpdate(AgentUpdatePacket pack) { |
252 | if(((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS) !=0) { | 254 | if(((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY) !=0) |
253 | if(!walking) | 255 | { |
256 | this._physActor.Flying = true; | ||
257 | } | ||
258 | else | ||
259 | { | ||
260 | this._physActor.Flying = false; | ||
261 | } | ||
262 | if(((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS) !=0) { | ||
263 | Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); | ||
264 | if(((movementflag & 1) ==0) || (q!= this.bodyRot)) | ||
254 | { | 265 | { |
255 | //we should add a new force to the list | 266 | //we should add a new force to the list |
256 | // but for now we will deal with velocities | 267 | // but for now we will deal with velocities |
257 | NewForce newVelocity = new NewForce(); | 268 | NewForce newVelocity = new NewForce(); |
258 | Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0); | 269 | Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0); |
259 | Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); | ||
260 | Axiom.MathLib.Vector3 direc = q * v3; | 270 | Axiom.MathLib.Vector3 direc = q * v3; |
261 | direc.Normalize(); | 271 | direc.Normalize(); |
262 | 272 | ||
263 | //work out velocity for sim physics system | 273 | //work out velocity for sim physics system |
264 | direc = direc * ((0.03f) * 128f); | 274 | direc = direc * ((0.03f) * 128f); |
275 | if(this._physActor.Flying) | ||
276 | direc *=2; | ||
277 | |||
278 | newVelocity.X = direc.x; | ||
279 | newVelocity.Y = direc.y; | ||
280 | newVelocity.Z = direc.z; | ||
281 | this.forcesList.Add(newVelocity); | ||
282 | movementflag = 1; | ||
283 | this.bodyRot = q; | ||
284 | } | ||
285 | } | ||
286 | else if((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS) !=0) &&(PhysicsEngineFlying)) { | ||
287 | if(((movementflag & 2) ==0) && this._physActor.Flying) | ||
288 | { | ||
289 | //we should add a new force to the list | ||
290 | // but for now we will deal with velocities | ||
291 | NewForce newVelocity = new NewForce(); | ||
292 | Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(0, 0, 1); | ||
293 | Axiom.MathLib.Vector3 direc = v3; | ||
294 | direc.Normalize(); | ||
295 | |||
296 | //work out velocity for sim physics system | ||
297 | direc = direc * ((0.03f) * 128f *2); | ||
298 | newVelocity.X = direc.x; | ||
299 | newVelocity.Y = direc.y; | ||
300 | newVelocity.Z = direc.z; | ||
301 | this.forcesList.Add(newVelocity); | ||
302 | movementflag = 2; | ||
303 | } | ||
304 | } | ||
305 | else if((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG) !=0) && (PhysicsEngineFlying)) { | ||
306 | if(((movementflag & 4) ==0) && this._physActor.Flying) | ||
307 | { | ||
308 | //we should add a new force to the list | ||
309 | // but for now we will deal with velocities | ||
310 | NewForce newVelocity = new NewForce(); | ||
311 | Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(0, 0, -1); | ||
312 | //Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); | ||
313 | Axiom.MathLib.Vector3 direc = v3; | ||
314 | direc.Normalize(); | ||
315 | |||
316 | //work out velocity for sim physics system | ||
317 | direc = direc * ((0.03f) * 128f *2); | ||
318 | newVelocity.X = direc.x; | ||
319 | newVelocity.Y = direc.y; | ||
320 | newVelocity.Z = direc.z; | ||
321 | this.forcesList.Add(newVelocity); | ||
322 | movementflag = 4; | ||
323 | } | ||
324 | } | ||
325 | else if(((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG) !=0) { | ||
326 | Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); | ||
327 | if(((movementflag & 8) ==0) || (q!= this.bodyRot)) | ||
328 | { | ||
329 | //we should add a new force to the list | ||
330 | // but for now we will deal with velocities | ||
331 | NewForce newVelocity = new NewForce(); | ||
332 | Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(-1, 0, 0); | ||
333 | Axiom.MathLib.Vector3 direc = q * v3; | ||
334 | direc.Normalize(); | ||
335 | |||
336 | //work out velocity for sim physics system | ||
337 | direc = direc * ((0.03f) * 128f); | ||
338 | if(this._physActor.Flying) | ||
339 | direc *=2; | ||
340 | |||
265 | newVelocity.X = direc.x; | 341 | newVelocity.X = direc.x; |
266 | newVelocity.Y = direc.y; | 342 | newVelocity.Y = direc.y; |
267 | newVelocity.Z = direc.z; | 343 | newVelocity.Z = direc.z; |
268 | this.forcesList.Add(newVelocity); | 344 | this.forcesList.Add(newVelocity); |
269 | walking=true; | 345 | movementflag = 8; |
346 | this.bodyRot = q; | ||
270 | } | 347 | } |
271 | } | 348 | } |
272 | else | 349 | else |
273 | { | 350 | { |
274 | if(walking) | 351 | if((movementflag) !=0) |
275 | { | 352 | { |
276 | NewForce newVelocity = new NewForce(); | 353 | NewForce newVelocity = new NewForce(); |
277 | newVelocity.X = 0; | 354 | newVelocity.X = 0; |
278 | newVelocity.Y = 0; | 355 | newVelocity.Y = 0; |
279 | newVelocity.Z = 0; | 356 | newVelocity.Z = 0; |
280 | this.forcesList.Add(newVelocity); | 357 | this.forcesList.Add(newVelocity); |
281 | walking = false; | 358 | movementflag = 0; |
282 | } | 359 | } |
283 | } | 360 | } |
284 | } | 361 | } |