diff options
-rw-r--r-- | OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs index c4bc8a0..afb788b 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs | |||
@@ -149,12 +149,10 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
149 | } | 149 | } |
150 | 150 | ||
151 | /// <summary> | 151 | /// <summary> |
152 | /// Searches the part for any legacy materials stored in DynAttrs and converts them to assets, replacing | 152 | /// Finds any legacy materials stored in DynAttrs that may exist for this part and add them to 'm_regionMaterials'. |
153 | /// the MaterialIDs in the TextureEntries for the part. | ||
154 | /// Deletes the legacy materials from the part as they are no longer needed. | ||
155 | /// </summary> | 153 | /// </summary> |
156 | /// <param name="part"></param> | 154 | /// <param name="part"></param> |
157 | private void ConvertLegacyMaterialsInPart(SceneObjectPart part) | 155 | private void GetLegacyStoredMaterialsInPart(SceneObjectPart part) |
158 | { | 156 | { |
159 | if (part.DynAttrs == null) | 157 | if (part.DynAttrs == null) |
160 | return; | 158 | return; |
@@ -183,10 +181,6 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
183 | if (matsArr == null) | 181 | if (matsArr == null) |
184 | return; | 182 | return; |
185 | 183 | ||
186 | var te = new Primitive.TextureEntry(part.Shape.TextureEntry, 0, part.Shape.TextureEntry.Length); | ||
187 | if (te == null) | ||
188 | return; | ||
189 | |||
190 | foreach (OSD elemOsd in matsArr) | 184 | foreach (OSD elemOsd in matsArr) |
191 | { | 185 | { |
192 | if (elemOsd != null && elemOsd is OSDMap) | 186 | if (elemOsd != null && elemOsd is OSDMap) |
@@ -194,32 +188,18 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
194 | OSDMap matMap = elemOsd as OSDMap; | 188 | OSDMap matMap = elemOsd as OSDMap; |
195 | if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material")) | 189 | if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material")) |
196 | { | 190 | { |
197 | UUID id = matMap["ID"].AsUUID(); | 191 | try |
198 | OSDMap material = (OSDMap)matMap["Material"]; | 192 | { |
199 | bool used = false; | 193 | lock (m_regionMaterials) |
200 | 194 | m_regionMaterials[matMap["ID"].AsUUID()] = (OSDMap)matMap["Material"]; | |
201 | foreach (var face in te.FaceTextures) | 195 | } |
202 | if (face != null && face.MaterialID == id) | 196 | catch (Exception e) |
203 | used = true; | 197 | { |
204 | 198 | m_log.Warn("[Materials]: exception decoding persisted legacy material: " + e.ToString()); | |
205 | if (used) | ||
206 | { // store legacy material in new asset format, and update the part texture entry with the new hashed UUID | ||
207 | |||
208 | var newId = StoreMaterialAsAsset(part.CreatorID, material, part); | ||
209 | foreach (var face in te.FaceTextures) | ||
210 | if (face != null && face.MaterialID == id) | ||
211 | face.MaterialID = newId; | ||
212 | } | 199 | } |
213 | } | 200 | } |
214 | } | 201 | } |
215 | } | 202 | } |
216 | |||
217 | part.Shape.TextureEntry = te.GetBytes(); | ||
218 | part.ParentGroup.HasGroupChanged = true; | ||
219 | part.ScheduleFullUpdate(); | ||
220 | |||
221 | lock (part.DynAttrs) | ||
222 | part.DynAttrs.RemoveStore("OpenSim", "Materials"); | ||
223 | } | 203 | } |
224 | 204 | ||
225 | /// <summary> | 205 | /// <summary> |
@@ -230,12 +210,12 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
230 | if (part.Shape == null) | 210 | if (part.Shape == null) |
231 | return; | 211 | return; |
232 | 212 | ||
233 | ConvertLegacyMaterialsInPart(part); | ||
234 | |||
235 | var te = new Primitive.TextureEntry(part.Shape.TextureEntry, 0, part.Shape.TextureEntry.Length); | 213 | var te = new Primitive.TextureEntry(part.Shape.TextureEntry, 0, part.Shape.TextureEntry.Length); |
236 | if (te == null) | 214 | if (te == null) |
237 | return; | 215 | return; |
238 | 216 | ||
217 | GetLegacyStoredMaterialsInPart(part); | ||
218 | |||
239 | GetStoredMaterialInFace(part, te.DefaultTexture); | 219 | GetStoredMaterialInFace(part, te.DefaultTexture); |
240 | 220 | ||
241 | foreach (Primitive.TextureEntryFace face in te.FaceTextures) | 221 | foreach (Primitive.TextureEntryFace face in te.FaceTextures) |