diff options
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r-- | OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 150 |
1 files changed, 80 insertions, 70 deletions
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs index cf57c0a..e1203ea 100644 --- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs | |||
@@ -256,102 +256,112 @@ namespace OpenSim.Region.Physics.Meshing | |||
256 | PrimMesh primMesh; | 256 | PrimMesh primMesh; |
257 | PrimMesher.SculptMesh sculptMesh; | 257 | PrimMesher.SculptMesh sculptMesh; |
258 | 258 | ||
259 | List<Coord> coords; | 259 | List<Coord> coords = new List<Coord>(); |
260 | List<Face> faces; | 260 | List<Face> faces = new List<Face>(); |
261 | 261 | ||
262 | Image idata = null; | 262 | Image idata = null; |
263 | string decodedSculptFileName = ""; | 263 | string decodedSculptFileName = ""; |
264 | 264 | ||
265 | if (primShape.SculptEntry) | 265 | if (primShape.SculptEntry) |
266 | { | 266 | { |
267 | if (cacheSculptMaps && primShape.SculptTexture != UUID.Zero) | 267 | if (((OpenMetaverse.SculptType)primShape.SculptType) == SculptType.Mesh) |
268 | { | ||
269 | // add code for mesh physics proxy generation here | ||
270 | m_log.Debug("[MESH]: mesh proxy generation not implemented yet "); | ||
271 | return null; | ||
272 | |||
273 | } | ||
274 | else | ||
268 | { | 275 | { |
269 | decodedSculptFileName = System.IO.Path.Combine(decodedSculptMapPath, "smap_" + primShape.SculptTexture.ToString()); | 276 | if (cacheSculptMaps && primShape.SculptTexture != UUID.Zero) |
270 | try | ||
271 | { | 277 | { |
272 | if (File.Exists(decodedSculptFileName)) | 278 | decodedSculptFileName = System.IO.Path.Combine(decodedSculptMapPath, "smap_" + primShape.SculptTexture.ToString()); |
279 | try | ||
273 | { | 280 | { |
274 | idata = Image.FromFile(decodedSculptFileName); | 281 | if (File.Exists(decodedSculptFileName)) |
282 | { | ||
283 | idata = Image.FromFile(decodedSculptFileName); | ||
284 | } | ||
275 | } | 285 | } |
276 | } | 286 | catch (Exception e) |
277 | catch (Exception e) | 287 | { |
278 | { | 288 | m_log.Error("[SCULPT]: unable to load cached sculpt map " + decodedSculptFileName + " " + e.Message); |
279 | m_log.Error("[SCULPT]: unable to load cached sculpt map " + decodedSculptFileName + " " + e.Message); | ||
280 | 289 | ||
290 | } | ||
291 | //if (idata != null) | ||
292 | // m_log.Debug("[SCULPT]: loaded cached map asset for map ID: " + primShape.SculptTexture.ToString()); | ||
281 | } | 293 | } |
282 | //if (idata != null) | ||
283 | // m_log.Debug("[SCULPT]: loaded cached map asset for map ID: " + primShape.SculptTexture.ToString()); | ||
284 | } | ||
285 | 294 | ||
286 | if (idata == null) | 295 | if (idata == null) |
287 | { | ||
288 | if (primShape.SculptData == null || primShape.SculptData.Length == 0) | ||
289 | return null; | ||
290 | |||
291 | try | ||
292 | { | 296 | { |
293 | OpenMetaverse.Imaging.ManagedImage unusedData; | 297 | if (primShape.SculptData == null || primShape.SculptData.Length == 0) |
294 | OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(primShape.SculptData, out unusedData, out idata); | 298 | return null; |
295 | unusedData = null; | 299 | |
300 | try | ||
301 | { | ||
302 | OpenMetaverse.Imaging.ManagedImage unusedData; | ||
303 | OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(primShape.SculptData, out unusedData, out idata); | ||
304 | unusedData = null; | ||
296 | 305 | ||
297 | //idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData); | 306 | //idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData); |
298 | 307 | ||
299 | if (cacheSculptMaps && idata != null) | 308 | if (cacheSculptMaps && idata != null) |
309 | { | ||
310 | try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); } | ||
311 | catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); } | ||
312 | } | ||
313 | } | ||
314 | catch (DllNotFoundException) | ||
300 | { | 315 | { |
301 | try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); } | 316 | m_log.Error("[PHYSICS]: OpenJpeg is not installed correctly on this system. Physics Proxy generation failed. Often times this is because of an old version of GLIBC. You must have version 2.4 or above!"); |
302 | catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); } | 317 | return null; |
318 | } | ||
319 | catch (IndexOutOfRangeException) | ||
320 | { | ||
321 | m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed"); | ||
322 | return null; | ||
323 | } | ||
324 | catch (Exception ex) | ||
325 | { | ||
326 | m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed: " + ex.Message); | ||
327 | return null; | ||
303 | } | 328 | } |
304 | } | 329 | } |
305 | catch (DllNotFoundException) | 330 | |
306 | { | 331 | PrimMesher.SculptMesh.SculptType sculptType; |
307 | m_log.Error("[PHYSICS]: OpenJpeg is not installed correctly on this system. Physics Proxy generation failed. Often times this is because of an old version of GLIBC. You must have version 2.4 or above!"); | 332 | switch ((OpenMetaverse.SculptType)primShape.SculptType) |
308 | return null; | ||
309 | } | ||
310 | catch (IndexOutOfRangeException) | ||
311 | { | ||
312 | m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed"); | ||
313 | return null; | ||
314 | } | ||
315 | catch (Exception ex) | ||
316 | { | 333 | { |
317 | m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed: " + ex.Message); | 334 | case OpenMetaverse.SculptType.Cylinder: |
318 | return null; | 335 | sculptType = PrimMesher.SculptMesh.SculptType.cylinder; |
336 | break; | ||
337 | case OpenMetaverse.SculptType.Plane: | ||
338 | sculptType = PrimMesher.SculptMesh.SculptType.plane; | ||
339 | break; | ||
340 | case OpenMetaverse.SculptType.Torus: | ||
341 | sculptType = PrimMesher.SculptMesh.SculptType.torus; | ||
342 | break; | ||
343 | case OpenMetaverse.SculptType.Sphere: | ||
344 | sculptType = PrimMesher.SculptMesh.SculptType.sphere; | ||
345 | break; | ||
346 | default: | ||
347 | sculptType = PrimMesher.SculptMesh.SculptType.plane; | ||
348 | break; | ||
319 | } | 349 | } |
320 | } | ||
321 | 350 | ||
322 | PrimMesher.SculptMesh.SculptType sculptType; | 351 | bool mirror = ((primShape.SculptType & 128) != 0); |
323 | switch ((OpenMetaverse.SculptType)primShape.SculptType) | 352 | bool invert = ((primShape.SculptType & 64) != 0); |
324 | { | ||
325 | case OpenMetaverse.SculptType.Cylinder: | ||
326 | sculptType = PrimMesher.SculptMesh.SculptType.cylinder; | ||
327 | break; | ||
328 | case OpenMetaverse.SculptType.Plane: | ||
329 | sculptType = PrimMesher.SculptMesh.SculptType.plane; | ||
330 | break; | ||
331 | case OpenMetaverse.SculptType.Torus: | ||
332 | sculptType = PrimMesher.SculptMesh.SculptType.torus; | ||
333 | break; | ||
334 | case OpenMetaverse.SculptType.Sphere: | ||
335 | sculptType = PrimMesher.SculptMesh.SculptType.sphere; | ||
336 | break; | ||
337 | default: | ||
338 | sculptType = PrimMesher.SculptMesh.SculptType.plane; | ||
339 | break; | ||
340 | } | ||
341 | 353 | ||
342 | bool mirror = ((primShape.SculptType & 128) != 0); | 354 | sculptMesh = new PrimMesher.SculptMesh((Bitmap)idata, sculptType, (int)lod, false, mirror, invert); |
343 | bool invert = ((primShape.SculptType & 64) != 0); | 355 | |
356 | idata.Dispose(); | ||
344 | 357 | ||
345 | sculptMesh = new PrimMesher.SculptMesh((Bitmap)idata, sculptType, (int)lod, false, mirror, invert); | 358 | sculptMesh.DumpRaw(baseDir, primName, "primMesh"); |
346 | |||
347 | idata.Dispose(); | ||
348 | 359 | ||
349 | sculptMesh.DumpRaw(baseDir, primName, "primMesh"); | 360 | sculptMesh.Scale(size.X, size.Y, size.Z); |
350 | 361 | ||
351 | sculptMesh.Scale(size.X, size.Y, size.Z); | 362 | coords = sculptMesh.coords; |
352 | 363 | faces = sculptMesh.faces; | |
353 | coords = sculptMesh.coords; | 364 | } |
354 | faces = sculptMesh.faces; | ||
355 | } | 365 | } |
356 | else | 366 | else |
357 | { | 367 | { |