//public static Quaternion ExtrapolateQuaternion (Quaternion a, Quaternion b, float t) //{ // Quaternion rot = b * Quaternion.Inverse(a); // float ang = 0.0f; // Vector3 axis = Vector3.zero; // rot.ToAngleAxis(out ang, out axis); // if (ang > 180) // ang -= 360; // ang = ang * t % 360; // return Quaternion.AngleAxis(ang, axis) * a; //} public static void ApplyRewindToElements(NetworkSyncTransform nst, FrameElements rewind) { nst.rewindGO.transform.position = rewind.rootPosition; for (int i = 0; i < nst.positionElements.Count; i++) { nst.positionElements[i].ApplyPosition(rewind.positionsElements[i], nst.positionElements[i].rewindGO); } for (int i = 0; i < nst.rotationElements.Count; i++) { nst.rotationElements[i].ApplyRotation(rewind.rotationElements[i], nst.rotationElements[i].rewindGO); } }
/// <summary> /// Apply this when the end of an interpolation has happened, or when the local object sends out its regular frame update. /// </summary> public void SnapshotToRewind(int index) { FrameElements frame = rewind[index]; frame.endTime = Time.time; //frame.endTime = currentFrame.endTime; // Time.time; frame.rootPosition = nst.transform.position; for (int i = 0; i < frame.positionsElements.Count; i++) { frame.positionsElements[i] = nst.positionElements[i].Localized; } for (int i = 0; i < frame.rotationElements.Count; i++) { frame.rotationElements[i] = nst.rotationElements[i].Localized; } latestRewindFrame = frame; }
// Construct public FrameBuffer(NetworkSyncTransform _nst, int _size, Vector3 _pos) { nst = _nst; bufferSize = _size; halfBufferSize = (bufferSize - 1) / 2; quaterBufferSize = bufferSize / 3; frames = new Frame[bufferSize]; rewind = new FrameElements[bufferSize]; for (int i = 0; i < bufferSize; i++) { frames[i] = new Frame(i, _pos, nst.positionElements, nst.rotationElements); rewind[i] = new FrameElements(i, _pos, nst.positionElements, nst.rotationElements); // currently unused } currentFrame = frames[0]; prevAppliedFrame = frames[0]; latestRewindFrame = rewind[0]; }