private void AgentCachedTextureHandler(Packet packet, LLAgent agent) { AgentCachedTexturePacket cached = (AgentCachedTexturePacket)packet; AgentCachedTextureResponsePacket response = new AgentCachedTextureResponsePacket(); response.Header.Zerocoded = true; response.AgentData.AgentID = agent.ID; response.AgentData.SerialNum = cached.AgentData.SerialNum; response.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[cached.WearableData.Length]; // TODO: Respond back with actual cache entries if we have them for (int i = 0; i < cached.WearableData.Length; i++) { response.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); response.WearableData[i].TextureIndex = cached.WearableData[i].TextureIndex; response.WearableData[i].TextureID = UUID.Zero; response.WearableData[i].HostName = Utils.EmptyBytes; } m_log.DebugFormat("Sending a cached texture response with {0}/{1} cache hits, SerialNum={2}", 0, cached.WearableData.Length, cached.AgentData.SerialNum); m_udp.SendPacket(agent, response, ThrottleCategory.Task, false); }
protected bool AgentTextureCached(SimClient simclient, Packet packet) { // Console.WriteLine(packet.ToString()); AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet; AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket(); cachedresp.AgentData.AgentID = this.AgentID; cachedresp.AgentData.SessionID = this.SessionID; cachedresp.AgentData.SerialNum = this.cachedtextureserial; this.cachedtextureserial++; cachedresp.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[chechedtex.WearableData.Length]; for (int i = 0; i < chechedtex.WearableData.Length; i++) { cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); cachedresp.WearableData[i].TextureIndex = chechedtex.WearableData[i].TextureIndex; cachedresp.WearableData[i].TextureID = LLUUID.Zero; cachedresp.WearableData[i].HostName = new byte[0]; } this.OutPacket(cachedresp); return(true); }
void AgentCachedTextureHandler(Packet packet, Agent agent) { AgentCachedTexturePacket cached = (AgentCachedTexturePacket)packet; AgentCachedTextureResponsePacket response = new AgentCachedTextureResponsePacket(); response.AgentData.AgentID = agent.AgentID; response.AgentData.SerialNum = cached.AgentData.SerialNum; response.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[cached.WearableData.Length]; // TODO: Respond back with actual cache entries if we have them for (int i = 0; i < cached.WearableData.Length; i++) { response.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); response.WearableData[i].TextureIndex = cached.WearableData[i].TextureIndex; response.WearableData[i].TextureID = UUID.Zero; response.WearableData[i].HostName = new byte[0]; } response.Header.Zerocoded = true; server.UDP.SendPacket(agent.AgentID, response, PacketCategory.Transaction); }
/// <summary> /// Build hashes out of the texture assetIDs for each baking layer to /// ask the simulator whether it has cached copies of each baked texture /// </summary> public void RequestCachedBakes() { List<AgentCachedTexturePacket.WearableDataBlock> hashes = new List<AgentCachedTexturePacket.WearableDataBlock>(); // Build hashes for each of the bake layers from the individual components lock (Wearables) { for (int bakedIndex = 0; bakedIndex < BAKED_TEXTURE_COUNT; bakedIndex++) { // Don't do a cache request for a skirt bake if we're not wearing a skirt if (bakedIndex == (int)BakeType.Skirt && !Wearables.ContainsKey(WearableType.Skirt)) continue; // Build a hash of all the texture asset IDs in this baking layer UUID hash = UUID.Zero; for (int wearableIndex = 0; wearableIndex < WEARABLES_PER_LAYER; wearableIndex++) { WearableType type = WEARABLE_BAKE_MAP[bakedIndex][wearableIndex]; WearableData wearable; if (type != WearableType.Invalid && Wearables.TryGetValue(type, out wearable)) hash ^= wearable.AssetID; } if (hash != UUID.Zero) { // Hash with our secret value for this baked layer hash ^= BAKED_TEXTURE_HASH[bakedIndex]; // Add this to the list of hashes to send out AgentCachedTexturePacket.WearableDataBlock block = new AgentCachedTexturePacket.WearableDataBlock(); block.ID = hash; block.TextureIndex = (byte)bakedIndex; hashes.Add(block); Logger.DebugLog("Checking cache for " + (BakeType)block.TextureIndex + ", hash=" + block.ID, Client); } } } // Only send the packet out if there's something to check if (hashes.Count > 0) { AgentCachedTexturePacket cache = new AgentCachedTexturePacket(); cache.AgentData.AgentID = Client.Self.AgentID; cache.AgentData.SessionID = Client.Self.SessionID; cache.AgentData.SerialNum = Interlocked.Increment(ref CacheCheckSerialNum); cache.WearableData = hashes.ToArray(); Client.Network.SendPacket(cache); } }
/// <summary> /// Build hashes out of the texture assetIDs for each baking layer to /// ask the simulator whether it has cached copies of each baked texture /// </summary> public void RequestCachedBakes() { Log.DebugLog("RequestCachedBakes()"); List<KeyValuePair<int, UUID>> hashes = new List<KeyValuePair<int,UUID>>(); AgentCachedTexturePacket cache = new AgentCachedTexturePacket(); cache.AgentData.AgentID = Network.AgentID; cache.AgentData.SessionID = Network.SessionID; cache.AgentData.SerialNum = CacheCheckSerialNum; // Build hashes for each of the bake layers from the individual components for (int bakedIndex = 0; bakedIndex < BAKED_TEXTURE_COUNT; bakedIndex++) { // Don't do a cache request for a skirt bake if we're not wearing a skirt if (bakedIndex == (int)BakeType.Skirt && (!Wearables.ContainsKey(WearableType.Skirt) || Wearables.Dictionary[WearableType.Skirt].Asset.AssetID == UUID.Zero)) continue; UUID hash = new UUID(); for (int wearableIndex = 0; wearableIndex < WEARABLES_PER_LAYER; wearableIndex++) { WearableType type = WEARABLE_BAKE_MAP[bakedIndex][wearableIndex]; UUID assetID = GetWearableAsset(type); // Build a hash of all the texture asset IDs in this baking layer if (assetID != UUID.Zero) hash ^= assetID; } if (hash != UUID.Zero) { // Hash with our secret value for this baked layer hash ^= BAKED_TEXTURE_HASH[bakedIndex]; // Add this to the list of hashes to send out hashes.Add(new KeyValuePair<int, UUID>(bakedIndex, hash)); } } // Only send the packet out if there's something to check if (hashes.Count > 0) { cache.WearableData = new AgentCachedTexturePacket.WearableDataBlock[hashes.Count]; for (int i = 0; i < hashes.Count; i++) { cache.WearableData[i] = new AgentCachedTexturePacket.WearableDataBlock(); cache.WearableData[i].TextureIndex = (byte)hashes[i].Key; cache.WearableData[i].ID = hashes[i].Value; Log.DebugLog("Checking cache for index " + cache.WearableData[i].TextureIndex + ", ID: " + cache.WearableData[i].ID); } // Increment our serial number for this packet CacheCheckSerialNum++; // Send it out Network.SendPacket(cache); } }