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