/// <summary> /// Handle a texture request. This involves creating a texture sender and placing it on the /// previously passed in shared queue. /// </summary> /// <param name="e"></param> public void HandleTextureRequest(TextureRequestArgs e) { TextureSender.TextureSender textureSender; //TODO: should be working out the data size/ number of packets to be sent for each discard level if ((e.DiscardLevel >= 0) || (e.Priority != 0)) { lock (m_textureSenders) { if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) { // If we've received new non UUID information for this request and it hasn't dispatched // yet, then update the request accordingly. textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber); } else { // m_log.DebugFormat("[TEXTURE]: Received a request for texture {0}", e.RequestedAssetID); if (!foundTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) { // m_log.DebugFormat( // "[TEXTURE]: Refusing request for {0} from client {1}", // e.RequestedAssetID, m_client.AgentId); return; } else if (!missingTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) { if (missingTextureLimitStrategy.IsFirstRefusal(e.RequestedAssetID)) { if (StatsManager.SimExtraStats != null) StatsManager.SimExtraStats.AddBlockedMissingTextureRequest(); // Commenting out this message for now as it causes too much noise with other // debug messages. // m_log.DebugFormat( // "[TEXTURE]: Dropping requests for notified missing texture {0} for client {1} since we have received more than {2} requests", // e.RequestedAssetID, m_client.AgentId, MAX_ALLOWED_TEXTURE_REQUESTS); } return; } m_scene.StatsReporter.AddPendingDownloads(1); TextureSender.TextureSender requestHandler = new TextureSender.TextureSender(m_client, e.DiscardLevel, e.PacketNumber); m_textureSenders.Add(e.RequestedAssetID, requestHandler); m_scene.CommsManager.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback, AssetRequestInfo.GenericNetRequest()); } } } else { lock (m_textureSenders) { if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) { textureSender.Cancel = true; } } } }
/// <summary> /// Handle a texture request. This involves creating a texture sender and placing it on the /// previously passed in shared queue. /// </summary> /// <param name="e"></param> public void HandleTextureRequest(TextureRequestArgs e) { TextureSender.TextureSender textureSender; //TODO: should be working out the data size/ number of packets to be sent for each discard level if ((e.DiscardLevel >= 0) || (e.Priority != 0)) { lock (m_textureSenders) { if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) { // If we've received new non UUID information for this request and it hasn't dispatched // yet, then update the request accordingly. textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber); } else { // m_log.DebugFormat("[TEXTURE]: Received a request for texture {0}", e.RequestedAssetID); if (!foundTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) { // m_log.DebugFormat( // "[TEXTURE]: Refusing request for {0} from client {1}", // e.RequestedAssetID, m_client.AgentId); return; } else if (!missingTextureLimitStrategy.AllowRequest(e.RequestedAssetID)) { if (missingTextureLimitStrategy.IsFirstRefusal(e.RequestedAssetID)) { if (StatsManager.SimExtraStats != null) { StatsManager.SimExtraStats.AddBlockedMissingTextureRequest(); } // Commenting out this message for now as it causes too much noise with other // debug messages. // m_log.DebugFormat( // "[TEXTURE]: Dropping requests for notified missing texture {0} for client {1} since we have received more than {2} requests", // e.RequestedAssetID, m_client.AgentId, MAX_ALLOWED_TEXTURE_REQUESTS); } return; } m_scene.StatsReporter.AddPendingDownloads(1); TextureSender.TextureSender requestHandler = new TextureSender.TextureSender(m_client, e.DiscardLevel, e.PacketNumber); m_textureSenders.Add(e.RequestedAssetID, requestHandler); m_scene.AssetService.Get(e.RequestedAssetID.ToString(), this, TextureReceived); } } } else { lock (m_textureSenders) { if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) { textureSender.Cancel = true; } } } }