public void FixedUpdate()

in MREUnityRuntimeLib/Core/PhysicsBridge.cs [188:344]


		public void FixedUpdate(UnityEngine.Transform rootTransform)
		{
			// - physics rigid body management
			// -set transforms/velocities for key framed bodies

			// get all the prediction time infos in this struct
			PredictionTimeParameters timeInfo = new PredictionTimeParameters(UnityEngine.Time.fixedDeltaTime);

			// start the predictor
			_predictor.StartBodyPredicitonForNextFrame();

			int index = 0;
			MultiSourceCombinedSnapshot snapshot;
			_snapshotManager.Step(timeInfo.DT, out snapshot);
			_snapshotManager.UpdateDebugDisplay(rootTransform); // guarded by ifdef internally

			foreach (var rb in _rigidBodies.Values)
			{
				// if the body is owned then we only set the kinematic flag for the physics
				if (rb.Ownership)
				{
					if (rb.IsKeyframed)
					{
						rb.RigidBody.isKinematic = true;
					}
					else
					{
						rb.RigidBody.isKinematic = false;
					}
					continue;
				}

				// Find corresponding rigid body info.
				// since both are sorted list this should hit without index=0 at the beginning
				while (index < snapshot.RigidBodies.Count && rb.Id.CompareTo(snapshot.RigidBodies.Values[index].Id) > 0)
				{
					index++;
				}

				if (index < snapshot.RigidBodies.Count && rb.Id == snapshot.RigidBodies.Values[index].Id)
				{
					// todo: kick-in prediction if we are missing an update for this rigid body
					//if (!snapshot.RigidBodies.Values[index].HasUpdate)
					//{
					//	rb.RigidBody.isKinematic = false;
					//	continue;
					//}

					RigidBodyTransform transform = snapshot.RigidBodies.Values[index].Transform;
					float timeOfSnapshot = snapshot.RigidBodies.Values[index].LocalTime;

					// get the key framed stream, and compute implicit velocities
					UnityEngine.Vector3 keyFramedPos = rootTransform.TransformPoint(transform.Position);
					UnityEngine.Quaternion keyFramedOrientation = rootTransform.rotation * transform.Rotation;
					UnityEngine.Vector3 JBLinearVelocity =
						rootTransform.rotation * snapshot.RigidBodies.Values[index].LinearVelocity;
					UnityEngine.Vector3 JBAngularVelocity =
						rootTransform.rotation * snapshot.RigidBodies.Values[index].AngularVelocity;
					// if there is a really new update then also store the implicit velocity
					if (rb.lastTimeKeyFramedUpdate < timeOfSnapshot)
					{
						// we moved the velocity estimation into the jitter buffer 
						rb.lastValidLinerVelocityOrPos = JBLinearVelocity;
						rb.lastValidAngularVelocityorAng = JBAngularVelocity;

#if MRE_PHYSICS_DEBUG
						// test the source of large velocities
						if (rb.lastValidLinerVelocityOrPos.sqrMagnitude > _maxEstimatedLinearVelocity * _maxEstimatedLinearVelocity)
						{
							// limited debug version
							Debug.Log(" ACTIVE SPEED LIMIT TRAP RB: " //+ rb.Id.ToString() + " got update lin vel:"
								+ rb.lastValidLinerVelocityOrPos + " ang vel:" + rb.lastValidAngularVelocityorAng
								+ " time:" + timeOfSnapshot
								+ " newR:" + rb.lastTimeKeyFramedUpdate
								+ " hasupdate:" + snapshot.RigidBodies.Values[index].HasUpdate
								+  " DangE:" + eulerAngles + " DangR:" + radianAngles );
						}
#endif

						// cap the velocities
						rb.lastValidLinerVelocityOrPos = UnityEngine.Vector3.ClampMagnitude(
							rb.lastValidLinerVelocityOrPos, _maxEstimatedLinearVelocity);
						rb.lastValidAngularVelocityorAng = UnityEngine.Vector3.ClampMagnitude(
							rb.lastValidAngularVelocityorAng, _maxEstimatedAngularVelocity);
						// if body is sleeping then all velocities are zero
						if (snapshot.RigidBodies.Values[index].motionType == Patching.Types.MotionType.Sleeping)
						{
							rb.lastValidLinerVelocityOrPos.Set(0.0F, 0.0F, 0.0F);
							rb.lastValidAngularVelocityorAng.Set(0.0F, 0.0F, 0.0F);
						}
#if MRE_PHYSICS_DEBUG
						if (true)
						{
						    // limited debug version
							Debug.Log(" Remote body: " + rb.Id.ToString() + " got update lin vel:"
								+ rb.lastValidLinerVelocityOrPos + " ang vel:" + rb.lastValidAngularVelocityorAng
								+ " time:" + timeOfSnapshot + " newR:" + rb.lastTimeKeyFramedUpdate);						    
						}
						else
						{
							Debug.Log(" Remote body: " + rb.Id.ToString() + " got update lin vel:"
								+ rb.lastValidLinerVelocityOrPos + " ang vel:" + rb.lastValidAngularVelocityorAng
								//+ " DangE:" + eulerAngles + " DangR:" + radianAngles
								+ " time:" + timeOfSnapshot + " newp:" + keyFramedPos
								+ " newR:" + keyFramedOrientation
								+ " oldP:" + rb.RigidBody.transform.position
								+ " oldR:" + rb.RigidBody.transform.rotation
								+ " OriginalRot:" + transform.Rotation
								+ " keyF:" + rb.RigidBody.isKinematic
								+ " KF:" + rb.IsKeyframed);
						}
#endif
						// cap the velocities
						rb.lastValidLinerVelocityOrPos = UnityEngine.Vector3.ClampMagnitude(
							rb.lastValidLinerVelocityOrPos, _maxEstimatedLinearVelocity);
						rb.lastValidAngularVelocityorAng = UnityEngine.Vector3.ClampMagnitude(
							rb.lastValidAngularVelocityorAng, _maxEstimatedAngularVelocity);
						// if body is sleeping then all velocities are zero
						if (snapshot.RigidBodies.Values[index].motionType == Patching.Types.MotionType.Sleeping)
						{
							rb.lastValidLinerVelocityOrPos.Set(0.0F, 0.0F, 0.0F);
							rb.lastValidAngularVelocityorAng.Set(0.0F, 0.0F, 0.0F);
						}
#if MRE_PHYSICS_DEBUG
						Debug.Log(" Remote body: " + rb.Id.ToString() + " got update lin vel:"
							+ rb.lastValidLinerVelocityOrPos + " ang vel:" + rb.lastValidAngularVelocityorAng
							//+ " DangE:" + eulerAngles + " DangR:" + radianAngles
							+ " time:" + timeOfSnapshot + " newp:" + keyFramedPos
							+ " newR:" + keyFramedOrientation
							+ " incUpdateDt:" + invUpdateDT
							+ " oldP:" + rb.RigidBody.transform.position
							+ " oldR:" + rb.RigidBody.transform.rotation
							+ " OriginalRot:" + transform.Rotation
							+ " keyF:" + rb.RigidBody.isKinematic
							+ " KF:" + rb.IsKeyframed);
#endif
					}

					rb.lastTimeKeyFramedUpdate = timeOfSnapshot;
					rb.IsKeyframed = (snapshot.RigidBodies.Values[index].motionType == Patching.Types.MotionType.Keyframed);

					// code to disable prediction and to use just key framing (and comment out the prediction)
					//rb.RigidBody.isKinematic = true;
					//rb.RigidBody.transform.position = keyFramedPos;
					//rb.RigidBody.transform.rotation = keyFramedOrientation;
					//rb.RigidBody.velocity.Set(0.0f, 0.0f, 0.0f);
					//rb.RigidBody.angularVelocity.Set(0.0f, 0.0f, 0.0f);

					// call the predictor with this remotely owned body
					_predictor.AddAndProcessRemoteBodyForPrediction(rb, transform,
						keyFramedPos, keyFramedOrientation, timeOfSnapshot, timeInfo);
				}
			}

			// call the predictor
			_predictor.PredictAllRemoteBodiesWithOwnedBodies(ref _rigidBodies, timeInfo);
		}