in Networked Physics/Assets/Scripts/JitterBuffer.cs [326:440]
bool DecodePrediction( DeltaBuffer deltaBuffer, ushort currentSequence, ushort resetSequence, int numCubes, ref int[] cubeIds, ref bool[] perfectPrediction, ref bool[] hasPredictionDelta, ref ushort[] baselineSequence, ref CubeState[] cubeState, ref CubeDelta[] predictionDelta )
{
Profiler.BeginSample( "DecodePrediction" );
CubeState baselineCubeState = CubeState.defaults;
bool result = true;
#if !DISABLE_DELTA_ENCODING
for ( int i = 0; i < numCubes; ++i )
{
if ( perfectPrediction[i] || hasPredictionDelta[i] )
{
if ( deltaBuffer.GetCubeState( baselineSequence[i], resetSequence, cubeIds[i], ref baselineCubeState ) )
{
int baseline_sequence = baselineSequence[i];
int current_sequence = currentSequence;
if ( current_sequence < baseline_sequence )
current_sequence += 65536;
int baseline_position_x = baselineCubeState.position_x;
int baseline_position_y = baselineCubeState.position_y;
int baseline_position_z = baselineCubeState.position_z;
int baseline_linear_velocity_x = baselineCubeState.linear_velocity_x;
int baseline_linear_velocity_y = baselineCubeState.linear_velocity_y;
int baseline_linear_velocity_z = baselineCubeState.linear_velocity_z;
int baseline_angular_velocity_x = baselineCubeState.angular_velocity_x;
int baseline_angular_velocity_y = baselineCubeState.angular_velocity_y;
int baseline_angular_velocity_z = baselineCubeState.angular_velocity_z;
if ( current_sequence < baseline_sequence )
current_sequence += 65536;
int numFrames = current_sequence - baseline_sequence;
int predicted_position_x;
int predicted_position_y;
int predicted_position_z;
int predicted_linear_velocity_x;
int predicted_linear_velocity_y;
int predicted_linear_velocity_z;
int predicted_angular_velocity_x;
int predicted_angular_velocity_y;
int predicted_angular_velocity_z;
Prediction.PredictBallistic( numFrames,
baseline_position_x, baseline_position_y, baseline_position_z,
baseline_linear_velocity_x, baseline_linear_velocity_y, baseline_linear_velocity_z,
baseline_angular_velocity_x, baseline_angular_velocity_y, baseline_angular_velocity_z,
out predicted_position_x, out predicted_position_y, out predicted_position_z,
out predicted_linear_velocity_x, out predicted_linear_velocity_y, out predicted_linear_velocity_z,
out predicted_angular_velocity_x, out predicted_angular_velocity_y, out predicted_angular_velocity_z );
if ( perfectPrediction[i] )
{
#if DEBUG_DELTA_COMPRESSION
Assert.IsTrue( predicted_position_x == cubeDelta[i].absolute_position_x );
Assert.IsTrue( predicted_position_y == cubeDelta[i].absolute_position_y );
Assert.IsTrue( predicted_position_z == cubeDelta[i].absolute_position_z );
#endif // #if DEBUG_DELTA_COMPRESSION
cubeState[i].position_x = predicted_position_x;
cubeState[i].position_y = predicted_position_y;
cubeState[i].position_z = predicted_position_z;
cubeState[i].linear_velocity_x = predicted_linear_velocity_x;
cubeState[i].linear_velocity_y = predicted_linear_velocity_y;
cubeState[i].linear_velocity_z = predicted_linear_velocity_z;
cubeState[i].angular_velocity_x = predicted_angular_velocity_x;
cubeState[i].angular_velocity_y = predicted_angular_velocity_y;
cubeState[i].angular_velocity_z = predicted_angular_velocity_z;
}
else
{
cubeState[i].position_x = predicted_position_x + predictionDelta[i].position_delta_x;
cubeState[i].position_y = predicted_position_y + predictionDelta[i].position_delta_y;
cubeState[i].position_z = predicted_position_z + predictionDelta[i].position_delta_z;
#if DEBUG_DELTA_COMPRESSION
Assert.IsTrue( cubeState[i].position_x == cubeDelta[i].absolute_position_x );
Assert.IsTrue( cubeState[i].position_y == cubeDelta[i].absolute_position_y );
Assert.IsTrue( cubeState[i].position_z == cubeDelta[i].absolute_position_z );
#endif // #if DEBUG_DELTA_COMPRESSION
cubeState[i].linear_velocity_x = predicted_linear_velocity_x + predictionDelta[i].linear_velocity_delta_x;
cubeState[i].linear_velocity_y = predicted_linear_velocity_y + predictionDelta[i].linear_velocity_delta_y;
cubeState[i].linear_velocity_z = predicted_linear_velocity_z + predictionDelta[i].linear_velocity_delta_z;
cubeState[i].angular_velocity_x = predicted_angular_velocity_x + predictionDelta[i].angular_velocity_delta_x;
cubeState[i].angular_velocity_y = predicted_angular_velocity_y + predictionDelta[i].angular_velocity_delta_y;
cubeState[i].angular_velocity_z = predicted_angular_velocity_z + predictionDelta[i].angular_velocity_delta_z;
}
}
else
{
Debug.Log( "error: missing baseline for cube " + cubeIds[i] + " at sequence " + baselineSequence[i] + " (perfect prediction and prediction delta)" );
result = false;
break;
}
}
}
#endif // #if !DISABLE_DELTA_COMPRESSION
Profiler.EndSample();
return result;
}