diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/UuidGatherer.cs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 42a1977..75a51b5 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs | |||
@@ -218,6 +218,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
218 | // inventory transfer. There needs to be a way for a module to register a method without assuming a | 218 | // inventory transfer. There needs to be a way for a module to register a method without assuming a |
219 | // Scene.EventManager is present. | 219 | // Scene.EventManager is present. |
220 | // part.ParentGroup.Scene.EventManager.TriggerGatherUuids(part, assetUuids); | 220 | // part.ParentGroup.Scene.EventManager.TriggerGatherUuids(part, assetUuids); |
221 | |||
222 | |||
223 | // still needed to retrieve textures used as materials for any parts containing legacy materials stored in DynAttrs | ||
224 | GatherMaterialsUuids(part, assetUuids); | ||
221 | } | 225 | } |
222 | catch (Exception e) | 226 | catch (Exception e) |
223 | { | 227 | { |
@@ -241,6 +245,75 @@ namespace OpenSim.Region.Framework.Scenes | |||
241 | // Monitor.Pulse(this); | 245 | // Monitor.Pulse(this); |
242 | // } | 246 | // } |
243 | // } | 247 | // } |
248 | |||
249 | /// <summary> | ||
250 | /// Gather all of the texture asset UUIDs used to reference "Materials" such as normal and specular maps | ||
251 | /// stored in legacy format in part.DynAttrs | ||
252 | /// </summary> | ||
253 | /// <param name="part"></param> | ||
254 | /// <param name="assetUuids"></param> | ||
255 | //public void GatherMaterialsUuids(SceneObjectPart part, IDictionary<UUID, AssetType> assetUuids) | ||
256 | public void GatherMaterialsUuids(SceneObjectPart part, IDictionary<UUID, sbyte> assetUuids) | ||
257 | { | ||
258 | // scan thru the dynAttrs map of this part for any textures used as materials | ||
259 | OSD osdMaterials = null; | ||
260 | |||
261 | lock (part.DynAttrs) | ||
262 | { | ||
263 | if (part.DynAttrs.ContainsStore("OpenSim", "Materials")) | ||
264 | { | ||
265 | OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials"); | ||
266 | |||
267 | if (materialsStore == null) | ||
268 | return; | ||
269 | |||
270 | materialsStore.TryGetValue("Materials", out osdMaterials); | ||
271 | } | ||
272 | |||
273 | if (osdMaterials != null) | ||
274 | { | ||
275 | //m_log.Info("[UUID Gatherer]: found Materials: " + OSDParser.SerializeJsonString(osd)); | ||
276 | |||
277 | if (osdMaterials is OSDArray) | ||
278 | { | ||
279 | OSDArray matsArr = osdMaterials as OSDArray; | ||
280 | foreach (OSDMap matMap in matsArr) | ||
281 | { | ||
282 | try | ||
283 | { | ||
284 | if (matMap.ContainsKey("Material")) | ||
285 | { | ||
286 | OSDMap mat = matMap["Material"] as OSDMap; | ||
287 | if (mat.ContainsKey("NormMap")) | ||
288 | { | ||
289 | UUID normalMapId = mat["NormMap"].AsUUID(); | ||
290 | if (normalMapId != UUID.Zero) | ||
291 | { | ||
292 | assetUuids[normalMapId] = (sbyte)AssetType.Texture; | ||
293 | //m_log.Info("[UUID Gatherer]: found normal map ID: " + normalMapId.ToString()); | ||
294 | } | ||
295 | } | ||
296 | if (mat.ContainsKey("SpecMap")) | ||
297 | { | ||
298 | UUID specularMapId = mat["SpecMap"].AsUUID(); | ||
299 | if (specularMapId != UUID.Zero) | ||
300 | { | ||
301 | assetUuids[specularMapId] = (sbyte)AssetType.Texture; | ||
302 | //m_log.Info("[UUID Gatherer]: found specular map ID: " + specularMapId.ToString()); | ||
303 | } | ||
304 | } | ||
305 | } | ||
306 | |||
307 | } | ||
308 | catch (Exception e) | ||
309 | { | ||
310 | m_log.Warn("[UUID Gatherer]: exception getting materials: " + e.Message); | ||
311 | } | ||
312 | } | ||
313 | } | ||
314 | } | ||
315 | } | ||
316 | } | ||
244 | 317 | ||
245 | /// <summary> | 318 | /// <summary> |
246 | /// Get an asset synchronously, potentially using an asynchronous callback. If the | 319 | /// Get an asset synchronously, potentially using an asynchronous callback. If the |