diff options
author | Robert Adams | 2012-07-06 10:01:47 -0700 |
---|---|---|
committer | Robert Adams | 2012-07-06 15:09:19 -0700 |
commit | e4a6611865848ffcfa6adedd813534e0a0e4abf3 (patch) | |
tree | c01ee1f828f276d45b09fbebea08b4e730e721ef /OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |
parent | Add assert to attachment regression tests to check that number of objects in ... (diff) | |
download | opensim-SC-e4a6611865848ffcfa6adedd813534e0a0e4abf3.zip opensim-SC-e4a6611865848ffcfa6adedd813534e0a0e4abf3.tar.gz opensim-SC-e4a6611865848ffcfa6adedd813534e0a0e4abf3.tar.bz2 opensim-SC-e4a6611865848ffcfa6adedd813534e0a0e4abf3.tar.xz |
Clean up collision reporting code so they are properly passed to
the simulator in batches.
More comments.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 94a0ccf..417cb5f 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -52,6 +52,7 @@ using OpenSim.Region.Framework; | |||
52 | // Should prim.link() and prim.delink() membership checking happen at taint time? | 52 | // Should prim.link() and prim.delink() membership checking happen at taint time? |
53 | // Mesh sharing. Use meshHash to tell if we already have a hull of that shape and only create once | 53 | // Mesh sharing. Use meshHash to tell if we already have a hull of that shape and only create once |
54 | // Do attachments need to be handled separately? Need collision events. Do not collide with VolumeDetect | 54 | // Do attachments need to be handled separately? Need collision events. Do not collide with VolumeDetect |
55 | // Use collision masks for collision with terrain and phantom objects | ||
55 | // Implement the genCollisions feature in BulletSim::SetObjectProperties (don't pass up unneeded collisions) | 56 | // Implement the genCollisions feature in BulletSim::SetObjectProperties (don't pass up unneeded collisions) |
56 | // Implement LockAngularMotion | 57 | // Implement LockAngularMotion |
57 | // Decide if clearing forces is the right thing to do when setting position (BulletSim::SetObjectTranslation) | 58 | // Decide if clearing forces is the right thing to do when setting position (BulletSim::SetObjectTranslation) |
@@ -62,9 +63,6 @@ using OpenSim.Region.Framework; | |||
62 | // Multiple contact points on collision? | 63 | // Multiple contact points on collision? |
63 | // See code in ode::near... calls to collision_accounting_events() | 64 | // See code in ode::near... calls to collision_accounting_events() |
64 | // (This might not be a problem. ODE collects all the collisions with one object in one tick.) | 65 | // (This might not be a problem. ODE collects all the collisions with one object in one tick.) |
65 | // Use collision masks for collision with terrain and phantom objects | ||
66 | // Figure out how to not allocate a new Dictionary and List for every collision | ||
67 | // in BSPrim.Collide() and BSCharacter.Collide(). Can the same ones be reused? | ||
68 | // Raycast | 66 | // Raycast |
69 | // | 67 | // |
70 | namespace OpenSim.Region.Physics.BulletSPlugin | 68 | namespace OpenSim.Region.Physics.BulletSPlugin |
@@ -405,6 +403,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
405 | // prevent simulation until we've been initialized | 403 | // prevent simulation until we've been initialized |
406 | if (!m_initialized) return 10.0f; | 404 | if (!m_initialized) return 10.0f; |
407 | 405 | ||
406 | long simulateStartTime = Util.EnvironmentTickCount(); | ||
407 | |||
408 | // update the prim states while we know the physics engine is not busy | 408 | // update the prim states while we know the physics engine is not busy |
409 | ProcessTaints(); | 409 | ProcessTaints(); |
410 | 410 | ||
@@ -437,13 +437,18 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
437 | } | 437 | } |
438 | } | 438 | } |
439 | 439 | ||
440 | // The SendCollision's batch up the collisions on the objects. Now push the collisions into the simulator. | 440 | // The above SendCollision's batch up the collisions on the objects. |
441 | // Now push the collisions into the simulator. | ||
441 | foreach (BSPrim bsp in m_primsWithCollisions) | 442 | foreach (BSPrim bsp in m_primsWithCollisions) |
442 | bsp.SendCollisions(); | 443 | bsp.SendCollisions(); |
443 | m_primsWithCollisions.Clear(); | 444 | m_primsWithCollisions.Clear(); |
445 | |||
446 | // This is a kludge to get avatar movement updated. | ||
447 | // Don't send collisions only if there were collisions -- send everytime. | ||
448 | // ODE sends collisions even if there are none and this is used to update | ||
449 | // avatar animations and stuff. | ||
444 | // foreach (BSCharacter bsc in m_avatarsWithCollisions) | 450 | // foreach (BSCharacter bsc in m_avatarsWithCollisions) |
445 | // bsc.SendCollisions(); | 451 | // bsc.SendCollisions(); |
446 | // This is a kludge to get avatar movement updated. ODE sends collisions even if there isn't any | ||
447 | foreach (KeyValuePair<uint, BSCharacter> kvp in m_avatars) | 452 | foreach (KeyValuePair<uint, BSCharacter> kvp in m_avatars) |
448 | kvp.Value.SendCollisions(); | 453 | kvp.Value.SendCollisions(); |
449 | m_avatarsWithCollisions.Clear(); | 454 | m_avatarsWithCollisions.Clear(); |
@@ -465,10 +470,12 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
465 | if (m_avatars.TryGetValue(entprop.ID, out actor)) | 470 | if (m_avatars.TryGetValue(entprop.ID, out actor)) |
466 | { | 471 | { |
467 | actor.UpdateProperties(entprop); | 472 | actor.UpdateProperties(entprop); |
473 | continue; | ||
468 | } | 474 | } |
469 | } | 475 | } |
470 | } | 476 | } |
471 | 477 | ||
478 | // If enabled, call into the physics engine to dump statistics | ||
472 | if (m_detailedStatsStep > 0) | 479 | if (m_detailedStatsStep > 0) |
473 | { | 480 | { |
474 | if ((m_simulationStep % m_detailedStatsStep) == 0) | 481 | if ((m_simulationStep % m_detailedStatsStep) == 0) |
@@ -477,6 +484,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
477 | } | 484 | } |
478 | } | 485 | } |
479 | 486 | ||
487 | // this is a waste since the outside routine also calcuates the physics simulation | ||
488 | // period. TODO: There should be a way of computing physics frames from simulator computation. | ||
489 | // long simulateTotalTime = Util.EnvironmentTickCountSubtract(simulateStartTime); | ||
490 | // return (timeStep * (float)simulateTotalTime); | ||
491 | |||
480 | // TODO: FIX THIS: fps calculation wrong. This calculation always returns about 1 in normal operation. | 492 | // TODO: FIX THIS: fps calculation wrong. This calculation always returns about 1 in normal operation. |
481 | return timeStep / (numSubSteps * m_fixedTimeStep) * 1000f; | 493 | return timeStep / (numSubSteps * m_fixedTimeStep) * 1000f; |
482 | } | 494 | } |
@@ -528,6 +540,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
528 | public override void SetWaterLevel(float baseheight) | 540 | public override void SetWaterLevel(float baseheight) |
529 | { | 541 | { |
530 | m_waterLevel = baseheight; | 542 | m_waterLevel = baseheight; |
543 | // TODO: pass to physics engine so things will float? | ||
531 | } | 544 | } |
532 | public float GetWaterLevel() | 545 | public float GetWaterLevel() |
533 | { | 546 | { |