diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs | 228 |
1 files changed, 114 insertions, 114 deletions
diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs index 2aea7f9..4a92120 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs | |||
@@ -267,6 +267,7 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
267 | if (matsArr == null) | 267 | if (matsArr == null) |
268 | return partchanged; | 268 | return partchanged; |
269 | 269 | ||
270 | OSD tmpOSD; | ||
270 | foreach (OSD elemOsd in matsArr) | 271 | foreach (OSD elemOsd in matsArr) |
271 | { | 272 | { |
272 | if (elemOsd != null && elemOsd is OSDMap) | 273 | if (elemOsd != null && elemOsd is OSDMap) |
@@ -278,7 +279,8 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
278 | { | 279 | { |
279 | lock (materialslock) | 280 | lock (materialslock) |
280 | { | 281 | { |
281 | UUID id = matMap["ID"].AsUUID(); | 282 | tmpOSD = matMap["ID"]; |
283 | UUID id = tmpOSD.AsUUID(); | ||
282 | if(m_Materials.ContainsKey(id)) | 284 | if(m_Materials.ContainsKey(id)) |
283 | continue; | 285 | continue; |
284 | 286 | ||
@@ -459,12 +461,13 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
459 | OSDMap resp = new OSDMap(); | 461 | OSDMap resp = new OSDMap(); |
460 | 462 | ||
461 | OSDArray respArr = new OSDArray(); | 463 | OSDArray respArr = new OSDArray(); |
464 | OSD tmpOSD; | ||
462 | 465 | ||
463 | if (req.ContainsKey("Zipped")) | 466 | if (req.TryGetValue("Zipped", out tmpOSD)) |
464 | { | 467 | { |
465 | OSD osd = null; | 468 | OSD osd = null; |
466 | 469 | ||
467 | byte[] inBytes = req["Zipped"].AsBinary(); | 470 | byte[] inBytes = tmpOSD.AsBinary(); |
468 | 471 | ||
469 | try | 472 | try |
470 | { | 473 | { |
@@ -531,12 +534,13 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
531 | 534 | ||
532 | OSDArray respArr = new OSDArray(); | 535 | OSDArray respArr = new OSDArray(); |
533 | 536 | ||
537 | OSD tmpOSD; | ||
534 | HashSet<SceneObjectPart> parts = new HashSet<SceneObjectPart>(); | 538 | HashSet<SceneObjectPart> parts = new HashSet<SceneObjectPart>(); |
535 | if (req.ContainsKey("Zipped")) | 539 | if (req.TryGetValue("Zipped", out tmpOSD)) |
536 | { | 540 | { |
537 | OSD osd = null; | 541 | OSD osd = null; |
538 | 542 | ||
539 | byte[] inBytes = req["Zipped"].AsBinary(); | 543 | byte[] inBytes = tmpOSD.AsBinary(); |
540 | 544 | ||
541 | try | 545 | try |
542 | { | 546 | { |
@@ -546,145 +550,141 @@ namespace OpenSim.Region.OptionalModules.Materials | |||
546 | { | 550 | { |
547 | materialsFromViewer = osd as OSDMap; | 551 | materialsFromViewer = osd as OSDMap; |
548 | 552 | ||
549 | if (materialsFromViewer.ContainsKey("FullMaterialsPerFace")) | 553 | if (materialsFromViewer.TryGetValue("FullMaterialsPerFace", out tmpOSD) && (tmpOSD is OSDArray)) |
550 | { | 554 | { |
551 | OSD matsOsd = materialsFromViewer["FullMaterialsPerFace"]; | 555 | OSDArray matsArr = tmpOSD as OSDArray; |
552 | if (matsOsd is OSDArray) | 556 | try |
553 | { | 557 | { |
554 | OSDArray matsArr = matsOsd as OSDArray; | 558 | foreach (OSDMap matsMap in matsArr) |
555 | |||
556 | try | ||
557 | { | 559 | { |
558 | foreach (OSDMap matsMap in matsArr) | 560 | uint primLocalID = 0; |
561 | try | ||
559 | { | 562 | { |
560 | uint primLocalID = 0; | 563 | tmpOSD = matsMap["ID"]; |
561 | try | 564 | primLocalID = tmpOSD.AsUInteger(); |
562 | { | 565 | } |
563 | primLocalID = matsMap["ID"].AsUInteger(); | 566 | catch (Exception e) |
564 | } | 567 | { |
565 | catch (Exception e) | 568 | m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message); |
566 | { | 569 | continue; |
567 | m_log.Warn("[Materials]: cannot decode \"ID\" from matsMap: " + e.Message); | 570 | } |
568 | continue; | ||
569 | } | ||
570 | 571 | ||
571 | SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID); | 572 | SceneObjectPart sop = m_scene.GetSceneObjectPart(primLocalID); |
572 | if (sop == null) | 573 | if (sop == null) |
573 | { | 574 | { |
574 | m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString()); | 575 | m_log.WarnFormat("[Materials]: SOP not found for localId: {0}", primLocalID.ToString()); |
575 | continue; | 576 | continue; |
576 | } | 577 | } |
577 | 578 | ||
578 | if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID)) | 579 | if (!m_scene.Permissions.CanEditObject(sop.UUID, agentID)) |
579 | { | 580 | { |
580 | m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID); | 581 | m_log.WarnFormat("User {0} can't edit object {1} {2}", agentID, sop.Name, sop.UUID); |
581 | continue; | 582 | continue; |
582 | } | 583 | } |
583 | 584 | ||
584 | OSDMap mat = null; | 585 | OSDMap mat = null; |
585 | try | 586 | try |
586 | { | 587 | { |
587 | mat = matsMap["Material"] as OSDMap; | 588 | mat = matsMap["Material"] as OSDMap; |
588 | } | 589 | } |
589 | catch (Exception e) | 590 | catch (Exception e) |
590 | { | 591 | { |
591 | m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message); | 592 | m_log.Warn("[Materials]: cannot decode \"Material\" from matsMap: " + e.Message); |
592 | continue; | 593 | continue; |
593 | } | 594 | } |
594 | 595 | ||
595 | Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length); | 596 | Primitive.TextureEntry te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length); |
596 | if (te == null) | 597 | if (te == null) |
597 | { | 598 | { |
598 | m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID); | 599 | m_log.WarnFormat("[Materials]: Error in TextureEntry for SOP {0} {1}", sop.Name, sop.UUID); |
599 | continue; | 600 | continue; |
600 | } | 601 | } |
601 | 602 | ||
602 | int face = -1; | 603 | int face = -1; |
603 | UUID oldid = UUID.Zero; | 604 | UUID oldid = UUID.Zero; |
604 | Primitive.TextureEntryFace faceEntry = null; | 605 | Primitive.TextureEntryFace faceEntry = null; |
605 | if (matsMap.ContainsKey("Face")) | 606 | if (matsMap.TryGetValue("Face", out tmpOSD)) |
606 | { | 607 | { |
607 | face = matsMap["Face"].AsInteger(); | 608 | face = tmpOSD.AsInteger(); |
608 | faceEntry = te.CreateFace((uint)face); | 609 | faceEntry = te.CreateFace((uint)face); |
609 | } | 610 | } |
610 | else | 611 | else |
611 | faceEntry = te.DefaultTexture; | 612 | faceEntry = te.DefaultTexture; |
612 | 613 | ||
613 | if (faceEntry == null) | 614 | if (faceEntry == null) |
614 | continue; | 615 | continue; |
615 | 616 | ||
616 | UUID id; | 617 | UUID id; |
617 | FaceMaterial newFaceMat = null; | 618 | FaceMaterial newFaceMat = null; |
618 | if (mat == null) | 619 | if (mat == null) |
619 | { | 620 | { |
620 | // This happens then the user removes a material from a prim | 621 | // This happens then the user removes a material from a prim |
622 | id = UUID.Zero; | ||
623 | } | ||
624 | else | ||
625 | { | ||
626 | newFaceMat = new FaceMaterial(mat); | ||
627 | if(newFaceMat.DiffuseAlphaMode == 1 | ||
628 | && newFaceMat.NormalMapID == UUID.Zero | ||
629 | && newFaceMat.SpecularMapID == UUID.Zero | ||
630 | ) | ||
621 | id = UUID.Zero; | 631 | id = UUID.Zero; |
622 | } | ||
623 | else | 632 | else |
624 | { | 633 | { |
625 | newFaceMat = new FaceMaterial(mat); | 634 | newFaceMat.genID(); |
626 | if(newFaceMat.DiffuseAlphaMode == 1 | 635 | id = newFaceMat.ID; |
627 | && newFaceMat.NormalMapID == UUID.Zero | ||
628 | && newFaceMat.SpecularMapID == UUID.Zero | ||
629 | ) | ||
630 | id = UUID.Zero; | ||
631 | else | ||
632 | { | ||
633 | newFaceMat.genID(); | ||
634 | id = newFaceMat.ID; | ||
635 | } | ||
636 | } | 636 | } |
637 | } | ||
637 | 638 | ||
638 | oldid = faceEntry.MaterialID; | 639 | oldid = faceEntry.MaterialID; |
639 | 640 | ||
640 | if(oldid == id) | 641 | if(oldid == id) |
641 | continue; | 642 | continue; |
642 | 643 | ||
643 | if (faceEntry != null) | 644 | if (faceEntry != null) |
644 | { | 645 | { |
645 | faceEntry.MaterialID = id; | 646 | faceEntry.MaterialID = id; |
646 | //m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id); | 647 | //m_log.DebugFormat("[Materials]: in \"{0}\" {1}, setting material ID for face {2} to {3}", sop.Name, sop.UUID, face, id); |
647 | // We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually | 648 | // We can't use sop.UpdateTextureEntry(te) because it filters, so do it manually |
648 | sop.Shape.TextureEntry = te.GetBytes(9); | 649 | sop.Shape.TextureEntry = te.GetBytes(9); |
649 | } | 650 | } |
650 | 651 | ||
651 | if(oldid != UUID.Zero) | 652 | if(oldid != UUID.Zero) |
652 | RemoveMaterial(oldid); | 653 | RemoveMaterial(oldid); |
653 | 654 | ||
654 | lock(materialslock) | 655 | lock(materialslock) |
656 | { | ||
657 | if(id != UUID.Zero) | ||
655 | { | 658 | { |
656 | if(id != UUID.Zero) | 659 | if (m_Materials.ContainsKey(id)) |
660 | m_MaterialsRefCount[id]++; | ||
661 | else | ||
657 | { | 662 | { |
658 | if (m_Materials.ContainsKey(id)) | 663 | m_Materials[id] = newFaceMat; |
659 | m_MaterialsRefCount[id]++; | 664 | m_MaterialsRefCount[id] = 1; |
660 | else | 665 | m_changed[newFaceMat] = Util.GetTimeStamp(); |
661 | { | ||
662 | m_Materials[id] = newFaceMat; | ||
663 | m_MaterialsRefCount[id] = 1; | ||
664 | m_changed[newFaceMat] = Util.GetTimeStamp(); | ||
665 | } | ||
666 | } | 666 | } |
667 | } | 667 | } |
668 | |||
669 | if(!parts.Contains(sop)) | ||
670 | parts.Add(sop); | ||
671 | } | 668 | } |
672 | 669 | ||
673 | foreach(SceneObjectPart sop in parts) | 670 | if(!parts.Contains(sop)) |
674 | { | 671 | parts.Add(sop); |
675 | if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted) | ||
676 | { | ||
677 | sop.TriggerScriptChangedEvent(Changed.TEXTURE); | ||
678 | sop.ScheduleFullUpdate(); | ||
679 | sop.ParentGroup.HasGroupChanged = true; | ||
680 | } | ||
681 | } | ||
682 | } | 672 | } |
683 | catch (Exception e) | 673 | |
674 | foreach(SceneObjectPart sop in parts) | ||
684 | { | 675 | { |
685 | m_log.Warn("[Materials]: exception processing received material ", e); | 676 | if (sop.ParentGroup != null && !sop.ParentGroup.IsDeleted) |
677 | { | ||
678 | sop.TriggerScriptChangedEvent(Changed.TEXTURE); | ||
679 | sop.ScheduleFullUpdate(); | ||
680 | sop.ParentGroup.HasGroupChanged = true; | ||
681 | } | ||
686 | } | 682 | } |
687 | } | 683 | } |
684 | catch (Exception e) | ||
685 | { | ||
686 | m_log.Warn("[Materials]: exception processing received material ", e); | ||
687 | } | ||
688 | } | 688 | } |
689 | } | 689 | } |
690 | } | 690 | } |