| 949 | } |
| 950 | |
| 951 | U32 River::packUpdate(NetConnection * con, U32 mask, BitStream * stream) |
| 952 | { |
| 953 | // Pack Parent. |
| 954 | U32 retMask = Parent::packUpdate(con, mask, stream); |
| 955 | |
| 956 | if ( stream->writeFlag( mask & RiverMask ) ) |
| 957 | { |
| 958 | // Write Object Transform. |
| 959 | stream->writeAffineTransform(mObjToWorld); |
| 960 | |
| 961 | stream->write( mMetersPerSegment ); |
| 962 | stream->write( mSegmentsPerBatch ); |
| 963 | stream->write( mDepthScale ); |
| 964 | stream->write( mMaxDivisionSize ); |
| 965 | stream->write( mColumnCount ); |
| 966 | |
| 967 | stream->write( mFlowMagnitude ); |
| 968 | stream->write( mLodDistance ); |
| 969 | } |
| 970 | |
| 971 | if ( stream->writeFlag( mask & NodeMask ) ) |
| 972 | { |
| 973 | const U32 nodeByteSize = 32; // Based on sending all of a node's parameters |
| 974 | |
| 975 | // Test if we can fit all of our nodes within the current stream. |
| 976 | // We make sure we leave 100 bytes still free in the stream for whatever |
| 977 | // may follow us. |
| 978 | S32 allowedBytes = stream->getWriteByteSize() - 100; |
| 979 | if ( stream->writeFlag( (nodeByteSize * mNodes.size()) < allowedBytes ) ) |
| 980 | { |
| 981 | // All nodes should fit, so send them out now. |
| 982 | stream->writeInt( mNodes.size(), 16 ); |
| 983 | |
| 984 | for ( U32 i = 0; i < mNodes.size(); i++ ) |
| 985 | { |
| 986 | mathWrite( *stream, mNodes[i].point ); |
| 987 | stream->write( mNodes[i].width ); |
| 988 | stream->write( mNodes[i].depth ); |
| 989 | mathWrite( *stream, mNodes[i].normal ); |
| 990 | } |
| 991 | } |
| 992 | else |
| 993 | { |
| 994 | // There isn't enough space left in the stream for all of the |
| 995 | // nodes. Batch them up into NetEvents. |
| 996 | U32 id = gServerNodeListManager->nextListId(); |
| 997 | U32 count = 0; |
| 998 | U32 index = 0; |
| 999 | while (count < mNodes.size()) |
| 1000 | { |
| 1001 | count += NodeListManager::smMaximumNodesPerEvent; |
| 1002 | if (count > mNodes.size()) |
| 1003 | { |
| 1004 | count = mNodes.size(); |
| 1005 | } |
| 1006 | |
| 1007 | RiverNodeEvent* event = new RiverNodeEvent(); |
| 1008 | event->mId = id; |
nothing calls this directly
no test coverage detected