in Networked Physics/Assets/Scripts/PacketSerializer.cs [63:187]
public void WriteStateUpdatePacket( Network.WriteStream stream, ref Network.PacketHeader header, int numAvatarStates, AvatarStateQuantized[] avatarState, int numStateUpdates, int[] cubeIds, bool[] notChanged, bool[] hasDelta, bool[] perfectPrediction, bool[] hasPredictionDelta, ushort[] baselineSequence, CubeState[] cubeState, CubeDelta[] cubeDelta, CubeDelta[] predictionDelta )
{
byte packetType = (byte) PacketType.StateUpdate;
write_bits( stream, packetType, 8 );
write_bits( stream, header.sequence, 16 );
write_bits( stream, header.ack, 16 );
write_bits( stream, header.ack_bits, 32 );
write_bits( stream, header.frameNumber, 32 );
write_bits( stream, header.resetSequence, 16 );
write_float( stream, header.avatarSampleTimeOffset );
write_int( stream, numAvatarStates, 0, Constants.MaxClients );
for ( int i = 0; i < numAvatarStates; ++i )
{
write_avatar_state( stream, ref avatarState[i] );
}
write_int( stream, numStateUpdates, 0, Constants.MaxStateUpdates );
for ( int i = 0; i < numStateUpdates; ++i )
{
write_int( stream, cubeIds[i], 0, Constants.NumCubes - 1 );
#if DEBUG_DELTA_COMPRESSION
write_int( stream, cubeDelta[i].absolute_position_x, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
write_int( stream, cubeDelta[i].absolute_position_y, Constants.PositionMinimumY, Constants.PositionMaximumY );
write_int( stream, cubeDelta[i].absolute_position_z, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
#endif // #if DEBUG_DELTA_COMPRESSION
write_int( stream, cubeState[i].authorityIndex, 0, Constants.MaxAuthority - 1 );
write_bits( stream, cubeState[i].authoritySequence, 16 );
write_bits( stream, cubeState[i].ownershipSequence, 16 );
write_bool( stream, notChanged[i] );
if ( notChanged[i] )
{
write_bits( stream, baselineSequence[i], 16 );
}
else
{
write_bool( stream, perfectPrediction[i] );
if ( perfectPrediction[i] )
{
write_bits( stream, baselineSequence[i], 16 );
write_bits( stream, cubeState[i].rotation_largest, 2 );
write_bits( stream, cubeState[i].rotation_a, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_b, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_c, Constants.RotationBits );
}
else
{
write_bool( stream, hasPredictionDelta[i] );
if ( hasPredictionDelta[i] )
{
write_bits( stream, baselineSequence[i], 16 );
write_bool( stream, cubeState[i].active );
write_linear_velocity_delta( stream, predictionDelta[i].linear_velocity_delta_x, predictionDelta[i].linear_velocity_delta_y, predictionDelta[i].linear_velocity_delta_z );
write_angular_velocity_delta( stream, predictionDelta[i].angular_velocity_delta_x, predictionDelta[i].angular_velocity_delta_y, predictionDelta[i].angular_velocity_delta_z );
write_position_delta( stream, predictionDelta[i].position_delta_x, predictionDelta[i].position_delta_y, predictionDelta[i].position_delta_z );
write_bits( stream, cubeState[i].rotation_largest, 2 );
write_bits( stream, cubeState[i].rotation_a, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_b, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_c, Constants.RotationBits );
}
else
{
write_bool( stream, hasDelta[i] );
if ( hasDelta[i] )
{
write_bits( stream, baselineSequence[i], 16 );
write_bool( stream, cubeState[i].active );
write_linear_velocity_delta( stream, cubeDelta[i].linear_velocity_delta_x, cubeDelta[i].linear_velocity_delta_y, cubeDelta[i].linear_velocity_delta_z );
write_angular_velocity_delta( stream, cubeDelta[i].angular_velocity_delta_x, cubeDelta[i].angular_velocity_delta_y, cubeDelta[i].angular_velocity_delta_z );
write_position_delta( stream, cubeDelta[i].position_delta_x, cubeDelta[i].position_delta_y, cubeDelta[i].position_delta_z );
write_bits( stream, cubeState[i].rotation_largest, 2 );
write_bits( stream, cubeState[i].rotation_a, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_b, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_c, Constants.RotationBits );
}
else
{
write_bool( stream, cubeState[i].active );
write_int( stream, cubeState[i].position_x, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
write_int( stream, cubeState[i].position_y, Constants.PositionMinimumY, Constants.PositionMaximumY );
write_int( stream, cubeState[i].position_z, Constants.PositionMinimumXZ, Constants.PositionMaximumXZ );
write_bits( stream, cubeState[i].rotation_largest, 2 );
write_bits( stream, cubeState[i].rotation_a, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_b, Constants.RotationBits );
write_bits( stream, cubeState[i].rotation_c, Constants.RotationBits );
if ( cubeState[i].active )
{
write_int( stream, cubeState[i].linear_velocity_x, Constants.LinearVelocityMinimum, Constants.LinearVelocityMaximum );
write_int( stream, cubeState[i].linear_velocity_y, Constants.LinearVelocityMinimum, Constants.LinearVelocityMaximum );
write_int( stream, cubeState[i].linear_velocity_z, Constants.LinearVelocityMinimum, Constants.LinearVelocityMaximum );
write_int( stream, cubeState[i].angular_velocity_x, Constants.AngularVelocityMinimum, Constants.AngularVelocityMaximum );
write_int( stream, cubeState[i].angular_velocity_y, Constants.AngularVelocityMinimum, Constants.AngularVelocityMaximum );
write_int( stream, cubeState[i].angular_velocity_z, Constants.AngularVelocityMinimum, Constants.AngularVelocityMaximum );
}
}
}
}
}
}
}