in Networked Physics/Assets/Scripts/Prediction.cs [48:191]
public static void PredictBallistic( int numFrames,
int start_position_x, int start_position_y, int start_position_z,
int start_linear_velocity_x, int start_linear_velocity_y, int start_linear_velocity_z,
int start_angular_velocity_x, int start_angular_velocity_y, int start_angular_velocity_z,
out int predicted_position_x, out int predicted_position_y, out int predicted_position_z,
out int predicted_linear_velocity_x, out int predicted_linear_velocity_y, out int predicted_linear_velocity_z,
out int predicted_angular_velocity_x, out int predicted_angular_velocity_y, out int predicted_angular_velocity_z )
{
// convert network format values to fixed point for prediction. fixed point ensures determinism.
long position_x = ( (long) start_position_x ) << FixedPointIntermediateBits;
long position_y = ( (long) start_position_y ) << FixedPointIntermediateBits;
long position_z = ( (long) start_position_z ) << FixedPointIntermediateBits;
long linear_velocity_x = ( (long) start_linear_velocity_x ) << FixedPointIntermediateBits;
long linear_velocity_y = ( (long) start_linear_velocity_y ) << FixedPointIntermediateBits;
long linear_velocity_z = ( (long) start_linear_velocity_z ) << FixedPointIntermediateBits;
long angular_velocity_x = ( (long) start_angular_velocity_x ) << FixedPointIntermediateBits;
long angular_velocity_y = ( (long) start_angular_velocity_y ) << FixedPointIntermediateBits;
long angular_velocity_z = ( (long) start_angular_velocity_z ) << FixedPointIntermediateBits;
for ( int i = 0; i < numFrames; ++i )
{
// apply gravity
linear_velocity_y -= ( FixedPointGravity * FixedPointDeltaTime ) >> FixedPointFractionalBits;
// apply linear drag
linear_velocity_x *= FixedPointLinearDrag;
linear_velocity_y *= FixedPointLinearDrag;
linear_velocity_z *= FixedPointLinearDrag;
linear_velocity_x >>= FixedPointFractionalBits;
linear_velocity_y >>= FixedPointFractionalBits;
linear_velocity_z >>= FixedPointFractionalBits;
// apply angular drag
angular_velocity_x *= FixedPointAngularDrag;
angular_velocity_y *= FixedPointAngularDrag;
angular_velocity_z *= FixedPointAngularDrag;
angular_velocity_x >>= FixedPointFractionalBits;
angular_velocity_y >>= FixedPointFractionalBits;
angular_velocity_z >>= FixedPointFractionalBits;
// integrate position from linear velocity
position_x += ( linear_velocity_x * FixedPointDeltaTime ) >> FixedPointFractionalBits;
position_y += ( linear_velocity_y * FixedPointDeltaTime ) >> FixedPointFractionalBits;
position_z += ( linear_velocity_z * FixedPointDeltaTime ) >> FixedPointFractionalBits;
// quantize and bound position
position_x += FixedPointQuantizeRound;
position_y += FixedPointQuantizeRound;
position_z += FixedPointQuantizeRound;
position_x &= FixedPointQuantizeMask;
position_y &= FixedPointQuantizeMask;
position_z &= FixedPointQuantizeMask;
if ( position_x < FixedPointPositionMinimumXZ )
position_x = FixedPointPositionMinimumXZ;
else if ( position_x > FixedPointPositionMaximumXZ )
position_x = FixedPointPositionMaximumXZ;
if ( position_y < FixedPointPositionMinimumY )
position_y = FixedPointPositionMinimumY;
else if ( position_y > FixedPointPositionMaximumY )
position_y = FixedPointPositionMaximumY;
if ( position_z < FixedPointPositionMinimumXZ )
position_z = FixedPointPositionMinimumXZ;
else if ( position_z > FixedPointPositionMaximumXZ )
position_z = FixedPointPositionMaximumXZ;
// quantize and bound linear velocity
linear_velocity_x += FixedPointQuantizeRound;
linear_velocity_y += FixedPointQuantizeRound;
linear_velocity_z += FixedPointQuantizeRound;
linear_velocity_x &= FixedPointQuantizeMask;
linear_velocity_y &= FixedPointQuantizeMask;
linear_velocity_z &= FixedPointQuantizeMask;
if ( linear_velocity_x < FixedPointLinearVelocityMinimum )
linear_velocity_x = FixedPointLinearVelocityMinimum;
else if ( linear_velocity_x > FixedPointLinearVelocityMaximum )
linear_velocity_x = FixedPointLinearVelocityMaximum;
if ( linear_velocity_y < FixedPointLinearVelocityMinimum )
linear_velocity_y = FixedPointLinearVelocityMinimum;
else if ( linear_velocity_y > FixedPointLinearVelocityMaximum )
linear_velocity_y = FixedPointLinearVelocityMaximum;
if ( linear_velocity_z < FixedPointLinearVelocityMinimum )
linear_velocity_z = FixedPointLinearVelocityMinimum;
else if ( linear_velocity_z > FixedPointLinearVelocityMaximum )
linear_velocity_z = FixedPointLinearVelocityMaximum;
// quantize and bound angular velocity
angular_velocity_x += FixedPointQuantizeRound;
angular_velocity_y += FixedPointQuantizeRound;
angular_velocity_z += FixedPointQuantizeRound;
angular_velocity_x &= FixedPointQuantizeMask;
angular_velocity_y &= FixedPointQuantizeMask;
angular_velocity_z &= FixedPointQuantizeMask;
if ( angular_velocity_x < FixedPointAngularVelocityMinimum )
angular_velocity_x = FixedPointAngularVelocityMinimum;
else if ( angular_velocity_x > FixedPointAngularVelocityMaximum )
angular_velocity_x = FixedPointAngularVelocityMaximum;
if ( angular_velocity_y < FixedPointAngularVelocityMinimum )
angular_velocity_y = FixedPointAngularVelocityMinimum;
else if ( angular_velocity_y > FixedPointAngularVelocityMaximum )
angular_velocity_y = FixedPointAngularVelocityMaximum;
if ( angular_velocity_z < FixedPointAngularVelocityMinimum )
angular_velocity_z = FixedPointAngularVelocityMinimum;
else if ( angular_velocity_z > FixedPointAngularVelocityMaximum )
angular_velocity_z = FixedPointAngularVelocityMaximum;
}
// convert fixed point values back to network format
predicted_position_x = (int) ( position_x >> FixedPointIntermediateBits );
predicted_position_y = (int) ( position_y >> FixedPointIntermediateBits );
predicted_position_z = (int) ( position_z >> FixedPointIntermediateBits );
predicted_linear_velocity_x = (int) ( linear_velocity_x >> FixedPointIntermediateBits );
predicted_linear_velocity_y = (int) ( linear_velocity_y >> FixedPointIntermediateBits );
predicted_linear_velocity_z = (int) ( linear_velocity_z >> FixedPointIntermediateBits );
predicted_angular_velocity_x = (int) ( angular_velocity_x >> FixedPointIntermediateBits );
predicted_angular_velocity_y = (int) ( angular_velocity_y >> FixedPointIntermediateBits );
predicted_angular_velocity_z = (int) ( angular_velocity_z >> FixedPointIntermediateBits );
}