in Networked Physics/Assets/Scripts/PacketSerializer.cs [205:347]
public void ReadStateUpdatePacket( Network.ReadStream stream, out Network.PacketHeader header, out int numAvatarStates, AvatarStateQuantized[] avatarState, out int numStateUpdates, int[] cubeIds, bool[] notChanged, bool[] hasDelta, bool[] perfectPrediction, bool[] hasPredictionDelta, ushort[] baselineSequence, CubeState[] cubeState, CubeDelta[] cubeDelta, CubeDelta[] predictionDelta )
{
byte packetType = 0;
read_bits( stream, out packetType, 8 );
Debug.Assert( packetType == (byte) PacketType.StateUpdate );
read_bits( stream, out header.sequence, 16 );
read_bits( stream, out header.ack, 16 );
read_bits( stream, out header.ack_bits, 32 );
read_bits( stream, out header.frameNumber, 32 );
read_bits( stream, out header.resetSequence, 16 );
read_float( stream, out header.avatarSampleTimeOffset );
read_int( stream, out numAvatarStates, 0, Constants.MaxClients );
for ( int i = 0; i < numAvatarStates; ++i )
{
read_avatar_state( stream, out avatarState[i] );
}
read_int( stream, out numStateUpdates, 0, Constants.MaxStateUpdates );
for ( int i = 0; i < numStateUpdates; ++i )
{
hasDelta[i] = false;
perfectPrediction[i] = false;
hasPredictionDelta[i] = false;
read_int( stream, out cubeIds[i], 0, Constants.NumCubes - 1 );
#if DEBUG_DELTA_COMPRESSION
read_int( stream, out cubeDelta[i].absolute_position_x, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
read_int( stream, out cubeDelta[i].absolute_position_y, Constants.PositionMinimumY, Constants.PositionMaximumY );
read_int( stream, out cubeDelta[i].absolute_position_z, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
#endif // #if DEBUG_DELTA_COMPRESSION
read_int( stream, out cubeState[i].authorityIndex, 0, Constants.MaxAuthority - 1 );
read_bits( stream, out cubeState[i].authoritySequence, 16 );
read_bits( stream, out cubeState[i].ownershipSequence, 16 );
read_bool( stream, out notChanged[i] );
if ( notChanged[i] )
{
read_bits( stream, out baselineSequence[i], 16 );
}
else
{
read_bool( stream, out perfectPrediction[i] );
if ( perfectPrediction[i] )
{
read_bits( stream, out baselineSequence[i], 16 );
read_bits( stream, out cubeState[i].rotation_largest, 2 );
read_bits( stream, out cubeState[i].rotation_a, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_b, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_c, Constants.RotationBits );
cubeState[i].active = true;
}
else
{
read_bool( stream, out hasPredictionDelta[i] );
if ( hasPredictionDelta[i] )
{
read_bits( stream, out baselineSequence[i], 16 );
read_bool( stream, out cubeState[i].active );
read_linear_velocity_delta( stream, out predictionDelta[i].linear_velocity_delta_x, out predictionDelta[i].linear_velocity_delta_y, out predictionDelta[i].linear_velocity_delta_z );
read_angular_velocity_delta( stream, out predictionDelta[i].angular_velocity_delta_x, out predictionDelta[i].angular_velocity_delta_y, out predictionDelta[i].angular_velocity_delta_z );
read_position_delta( stream, out predictionDelta[i].position_delta_x, out predictionDelta[i].position_delta_y, out predictionDelta[i].position_delta_z );
read_bits( stream, out cubeState[i].rotation_largest, 2 );
read_bits( stream, out cubeState[i].rotation_a, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_b, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_c, Constants.RotationBits );
}
else
{
read_bool( stream, out hasDelta[i] );
if ( hasDelta[i] )
{
read_bits( stream, out baselineSequence[i], 16 );
read_bool( stream, out cubeState[i].active );
read_linear_velocity_delta( stream, out cubeDelta[i].linear_velocity_delta_x, out cubeDelta[i].linear_velocity_delta_y, out cubeDelta[i].linear_velocity_delta_z );
read_angular_velocity_delta( stream, out cubeDelta[i].angular_velocity_delta_x, out cubeDelta[i].angular_velocity_delta_y, out cubeDelta[i].angular_velocity_delta_z );
read_position_delta( stream, out cubeDelta[i].position_delta_x, out cubeDelta[i].position_delta_y, out cubeDelta[i].position_delta_z );
read_bits( stream, out cubeState[i].rotation_largest, 2 );
read_bits( stream, out cubeState[i].rotation_a, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_b, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_c, Constants.RotationBits );
}
else
{
read_bool( stream, out cubeState[i].active );
read_int( stream, out cubeState[i].position_x, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
read_int( stream, out cubeState[i].position_y, Constants.PositionMinimumY, Constants.PositionMaximumY );
read_int( stream, out cubeState[i].position_z, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
read_bits( stream, out cubeState[i].rotation_largest, 2 );
read_bits( stream, out cubeState[i].rotation_a, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_b, Constants.RotationBits );
read_bits( stream, out cubeState[i].rotation_c, Constants.RotationBits );
if ( cubeState[i].active )
{
read_int( stream, out cubeState[i].linear_velocity_x, Constants.LinearVelocityMinimum, Constants.LinearVelocityMaximum );
read_int( stream, out cubeState[i].linear_velocity_y, Constants.LinearVelocityMinimum, Constants.LinearVelocityMaximum );
read_int( stream, out cubeState[i].linear_velocity_z, Constants.LinearVelocityMinimum, Constants.LinearVelocityMaximum );
read_int( stream, out cubeState[i].angular_velocity_x, Constants.AngularVelocityMinimum, Constants.AngularVelocityMaximum );
read_int( stream, out cubeState[i].angular_velocity_y, Constants.AngularVelocityMinimum, Constants.AngularVelocityMaximum );
read_int( stream, out cubeState[i].angular_velocity_z, Constants.AngularVelocityMinimum, Constants.AngularVelocityMaximum );
}
else
{
cubeState[i].linear_velocity_x = 0;
cubeState[i].linear_velocity_y = 0;
cubeState[i].linear_velocity_z = 0;
cubeState[i].angular_velocity_x = 0;
cubeState[i].angular_velocity_y = 0;
cubeState[i].angular_velocity_z = 0;
}
}
}
}
}
}
}