diff options
author | dahlia | 2013-04-20 23:39:07 -0700 |
---|---|---|
committer | dahlia | 2013-04-20 23:39:07 -0700 |
commit | 69f07fdb349a2671fe86f96f119c0ea1276faacb (patch) | |
tree | 70bf4f1b0edb7dd793c4d0a39859fa7cbf5843c1 /OpenSim | |
parent | handle PUT verb for RenderMaterials Cap (diff) | |
download | opensim-SC-69f07fdb349a2671fe86f96f119c0ea1276faacb.zip opensim-SC-69f07fdb349a2671fe86f96f119c0ea1276faacb.tar.gz opensim-SC-69f07fdb349a2671fe86f96f119c0ea1276faacb.tar.bz2 opensim-SC-69f07fdb349a2671fe86f96f119c0ea1276faacb.tar.xz |
Materials persistence via SceneObjectPart.dynAttrs. This appears to work across region restarts and taking objects into inventory, but probably will not work across archiving via OAR or IAR as materials texture assets may not be adequately referenced to trigger archiving.
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs | 162 |
1 files changed, 154 insertions, 8 deletions
diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs index 4501dad..4ab6609 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs | |||
@@ -62,15 +62,21 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
62 | // ## ## # # # # # ## # # ## # # | 62 | // ## ## # # # # # ## # # ## # # |
63 | // # # # # # # # # # # # #### | 63 | // # # # # # # # # # # # #### |
64 | // | 64 | // |
65 | // | 65 | // THIS MODULE IS FOR EXPERIMENTAL USE ONLY AND MAY CAUSE REGION OR ASSET CORRUPTION! |
66 | // | 66 | // |
67 | ////////////// WARNING ////////////////////////////////////////////////////////////////// | 67 | ////////////// WARNING ////////////////////////////////////////////////////////////////// |
68 | /// This is an *Experimental* module for developing support for materials-capable viewers | 68 | /// This is an *Experimental* module for developing support for materials-capable viewers |
69 | /// This module should NOT be used in a production environment! It may cause data corruption and | 69 | /// This module should NOT be used in a production environment! It may cause data corruption and |
70 | /// viewer crashes. It should be only used to evaluate implementations of materials. | 70 | /// viewer crashes. It should be only used to evaluate implementations of materials. |
71 | /// | 71 | /// |
72 | /// CURRENTLY NO MATERIALS ARE PERSISTED ACROSS SIMULATOR RESTARTS OR ARE STORED IN ANY INVENTORY OR ASSETS | 72 | /// Materials are persisted via SceneObjectPart.dynattrs. This is a relatively new feature |
73 | /// This may change in future implementations. | 73 | /// of OpenSimulator and is not field proven at the time this module was written. Persistence |
74 | /// may fail or become corrupt and this could cause viewer crashes due to erroneous materials | ||
75 | /// data being sent to viewers. Materials descriptions might survive IAR, OAR, or other means | ||
76 | /// of archiving however the texture resources used by these materials probably will not as they | ||
77 | /// may not be adequately referenced to ensure proper archiving. | ||
78 | /// | ||
79 | /// | ||
74 | /// | 80 | /// |
75 | /// To enable this module, add this string at the bottom of OpenSim.ini: | 81 | /// To enable this module, add this string at the bottom of OpenSim.ini: |
76 | /// [MaterialsDemoModule] | 82 | /// [MaterialsDemoModule] |
@@ -89,6 +95,8 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
89 | 95 | ||
90 | private Scene m_scene = null; | 96 | private Scene m_scene = null; |
91 | private bool m_enabled = false; | 97 | private bool m_enabled = false; |
98 | |||
99 | public Dictionary<UUID, OSDMap> m_knownMaterials = new Dictionary<UUID, OSDMap>(); | ||
92 | 100 | ||
93 | public void Initialise(IConfigSource source) | 101 | public void Initialise(IConfigSource source) |
94 | { | 102 | { |
@@ -97,7 +105,6 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
97 | return; | 105 | return; |
98 | 106 | ||
99 | m_log.DebugFormat("[MaterialsDemoModule]: INITIALIZED MODULE"); | 107 | m_log.DebugFormat("[MaterialsDemoModule]: INITIALIZED MODULE"); |
100 | |||
101 | } | 108 | } |
102 | 109 | ||
103 | public void Close() | 110 | public void Close() |
@@ -116,6 +123,14 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
116 | m_log.DebugFormat("[MaterialsDemoModule]: REGION {0} ADDED", scene.RegionInfo.RegionName); | 123 | m_log.DebugFormat("[MaterialsDemoModule]: REGION {0} ADDED", scene.RegionInfo.RegionName); |
117 | m_scene = scene; | 124 | m_scene = scene; |
118 | m_scene.EventManager.OnRegisterCaps += new EventManager.RegisterCapsEvent(OnRegisterCaps); | 125 | m_scene.EventManager.OnRegisterCaps += new EventManager.RegisterCapsEvent(OnRegisterCaps); |
126 | m_scene.EventManager.OnObjectAddedToScene += new Action<SceneObjectGroup>(EventManager_OnObjectAddedToScene); | ||
127 | } | ||
128 | |||
129 | void EventManager_OnObjectAddedToScene(SceneObjectGroup obj) | ||
130 | { | ||
131 | foreach (var part in obj.Parts) | ||
132 | if (part != null) | ||
133 | GetStoredMaterialsForPart(part); | ||
119 | } | 134 | } |
120 | 135 | ||
121 | void OnRegisterCaps(OpenMetaverse.UUID agentID, OpenSim.Framework.Capabilities.Caps caps) | 136 | void OnRegisterCaps(OpenMetaverse.UUID agentID, OpenSim.Framework.Capabilities.Caps caps) |
@@ -147,11 +162,130 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
147 | 162 | ||
148 | public void RegionLoaded(Scene scene) | 163 | public void RegionLoaded(Scene scene) |
149 | { | 164 | { |
150 | if (!m_enabled) | 165 | } |
166 | |||
167 | OSDMap GetMaterial(UUID id) | ||
168 | { | ||
169 | OSDMap map = null; | ||
170 | if (m_knownMaterials.ContainsKey(id)) | ||
171 | { | ||
172 | map = new OSDMap(); | ||
173 | map["ID"] = OSD.FromBinary(id.GetBytes()); | ||
174 | map["Material"] = m_knownMaterials[id]; | ||
175 | } | ||
176 | return map; | ||
177 | } | ||
178 | |||
179 | void GetStoredMaterialsForPart(SceneObjectPart part) | ||
180 | { | ||
181 | OSDMap OSMaterials = null; | ||
182 | OSDArray matsArr = null; | ||
183 | |||
184 | if (part.DynAttrs == null) | ||
185 | { | ||
186 | m_log.Warn("[MaterialsDemoModule]: NULL DYNATTRS :( "); | ||
187 | } | ||
188 | |||
189 | lock (part.DynAttrs) | ||
190 | { | ||
191 | if (part.DynAttrs.ContainsKey("OS:Materials")) | ||
192 | OSMaterials = part.DynAttrs["OS:Materials"]; | ||
193 | if (OSMaterials != null && OSMaterials.ContainsKey("Materials")) | ||
194 | { | ||
195 | |||
196 | OSD osd = OSMaterials["Materials"]; | ||
197 | if (osd is OSDArray) | ||
198 | matsArr = osd as OSDArray; | ||
199 | } | ||
200 | } | ||
201 | |||
202 | if (OSMaterials == null) | ||
151 | return; | 203 | return; |
152 | m_log.DebugFormat("[MaterialsDemoModule]: REGION {0} LOADED", scene.RegionInfo.RegionName); | 204 | |
205 | m_log.Info("[MaterialsDemoModule]: OSMaterials: " + OSDParser.SerializeJsonString(OSMaterials)); | ||
206 | |||
207 | |||
208 | if (matsArr == null) | ||
209 | { | ||
210 | m_log.Info("[MaterialsDemoModule]: matsArr is null :( "); | ||
211 | return; | ||
212 | } | ||
213 | |||
214 | foreach (OSD elemOsd in matsArr) | ||
215 | { | ||
216 | if (elemOsd != null && elemOsd is OSDMap) | ||
217 | { | ||
218 | |||
219 | OSDMap matMap = elemOsd as OSDMap; | ||
220 | if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material")) | ||
221 | { | ||
222 | try | ||
223 | { | ||
224 | m_knownMaterials[matMap["ID"].AsUUID()] = (OSDMap)matMap["Material"]; | ||
225 | } | ||
226 | catch (Exception e) | ||
227 | { | ||
228 | m_log.Warn("[MaterialsDemoModule]: exception decoding persisted material: " + e.ToString()); | ||
229 | } | ||
230 | } | ||
231 | } | ||
232 | } | ||
153 | } | 233 | } |
154 | 234 | ||
235 | |||
236 | void StoreMaterialsForPart(SceneObjectPart part) | ||
237 | { | ||
238 | try | ||
239 | { | ||
240 | if (part == null || part.Shape == null) | ||
241 | return; | ||
242 | |||
243 | Dictionary<UUID, OSDMap> mats = new Dictionary<UUID, OSDMap>(); | ||
244 | |||
245 | Primitive.TextureEntry te = part.Shape.Textures; | ||
246 | |||
247 | if (te.DefaultTexture != null) | ||
248 | { | ||
249 | if (m_knownMaterials.ContainsKey(te.DefaultTexture.MaterialID)) | ||
250 | mats[te.DefaultTexture.MaterialID] = m_knownMaterials[te.DefaultTexture.MaterialID]; | ||
251 | } | ||
252 | |||
253 | if (te.FaceTextures != null) | ||
254 | { | ||
255 | foreach (var face in te.FaceTextures) | ||
256 | { | ||
257 | if (face != null) | ||
258 | { | ||
259 | if (m_knownMaterials.ContainsKey(face.MaterialID)) | ||
260 | mats[face.MaterialID] = m_knownMaterials[face.MaterialID]; | ||
261 | } | ||
262 | } | ||
263 | } | ||
264 | if (mats.Count == 0) | ||
265 | return; | ||
266 | |||
267 | OSDArray matsArr = new OSDArray(); | ||
268 | foreach (KeyValuePair<UUID, OSDMap> kvp in mats) | ||
269 | { | ||
270 | OSDMap matOsd = new OSDMap(); | ||
271 | matOsd["ID"] = OSD.FromUUID(kvp.Key); | ||
272 | matOsd["Material"] = kvp.Value; | ||
273 | matsArr.Add(matOsd); | ||
274 | } | ||
275 | |||
276 | OSDMap OSMaterials = new OSDMap(); | ||
277 | OSMaterials["Materials"] = matsArr; | ||
278 | |||
279 | lock (part.DynAttrs) | ||
280 | part.DynAttrs["OS:Materials"] = OSMaterials; | ||
281 | } | ||
282 | catch (Exception e) | ||
283 | { | ||
284 | m_log.Warn("[MaterialsDemoModule]: exception in StoreMaterialsForPart(): " + e.ToString()); | ||
285 | } | ||
286 | } | ||
287 | |||
288 | |||
155 | public string RenderMaterialsPostCap(string request, string path, | 289 | public string RenderMaterialsPostCap(string request, string path, |
156 | string param, IOSHttpRequest httpRequest, | 290 | string param, IOSHttpRequest httpRequest, |
157 | IOSHttpResponse httpResponse) | 291 | IOSHttpResponse httpResponse) |
@@ -300,6 +434,7 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
300 | 434 | ||
301 | sop.ScheduleFullUpdate(); | 435 | sop.ScheduleFullUpdate(); |
302 | 436 | ||
437 | StoreMaterialsForPart(sop); | ||
303 | } | 438 | } |
304 | } | 439 | } |
305 | } | 440 | } |
@@ -327,7 +462,8 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
327 | resp["Zipped"] = ZCompressOSD(respArr, false); | 462 | resp["Zipped"] = ZCompressOSD(respArr, false); |
328 | string response = OSDParser.SerializeLLSDXmlString(resp); | 463 | string response = OSDParser.SerializeLLSDXmlString(resp); |
329 | 464 | ||
330 | m_log.Debug("[MaterialsDemoModule]: cap request: " + request); | 465 | //m_log.Debug("[MaterialsDemoModule]: cap request: " + request); |
466 | m_log.Debug("[MaterialsDemoModule]: cap request (zipped portion): " + ZippedOsdBytesToString(req["Zipped"].AsBinary())); | ||
331 | m_log.Debug("[MaterialsDemoModule]: cap response: " + response); | 467 | m_log.Debug("[MaterialsDemoModule]: cap response: " + response); |
332 | return response; | 468 | return response; |
333 | } | 469 | } |
@@ -364,7 +500,17 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
364 | return OSDParser.SerializeLLSDXmlString(resp); | 500 | return OSDParser.SerializeLLSDXmlString(resp); |
365 | } | 501 | } |
366 | 502 | ||
367 | public Dictionary<UUID, OSDMap> m_knownMaterials = new Dictionary<UUID, OSDMap>(); | 503 | static string ZippedOsdBytesToString(byte[] bytes) |
504 | { | ||
505 | try | ||
506 | { | ||
507 | return OSDParser.SerializeJsonString(ZDecompressBytesToOsd(bytes)); | ||
508 | } | ||
509 | catch (Exception e) | ||
510 | { | ||
511 | return "ZippedOsdBytesToString caught an exception: " + e.ToString(); | ||
512 | } | ||
513 | } | ||
368 | 514 | ||
369 | /// <summary> | 515 | /// <summary> |
370 | /// computes a UUID by hashing a OSD object | 516 | /// computes a UUID by hashing a OSD object |