aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/PhysicsModules/ubOdeMeshing
diff options
context:
space:
mode:
authorUbitUmarov2016-11-07 18:34:45 +0000
committerUbitUmarov2016-11-07 18:34:45 +0000
commit7ebc08ad6512670ed9897c27475e278168eab18d (patch)
tree050ead2d78e7f5575641622ff70afcc5365a550c /OpenSim/Region/PhysicsModules/ubOdeMeshing
parenta few more changes on the avatars Velocity/TargetVelocity/SetMomentum. Need t... (diff)
downloadopensim-SC_OLD-7ebc08ad6512670ed9897c27475e278168eab18d.zip
opensim-SC_OLD-7ebc08ad6512670ed9897c27475e278168eab18d.tar.gz
opensim-SC_OLD-7ebc08ad6512670ed9897c27475e278168eab18d.tar.bz2
opensim-SC_OLD-7ebc08ad6512670ed9897c27475e278168eab18d.tar.xz
partially revert commit f29d5ad662387b97d9e881f28df584dc19fa8c07: if mesh asset does not contain data for PRIM type warn and use convex, do avoid physical peims going underground etc
Diffstat (limited to 'OpenSim/Region/PhysicsModules/ubOdeMeshing')
-rw-r--r--OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs276
1 files changed, 141 insertions, 135 deletions
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
index bcd1530..ca94034 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
@@ -395,6 +395,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
395 { 395 {
396// m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName); 396// m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
397 397
398
399 // for ubOde we have a diferent mesh use priority
400 // priority is to use full mesh then decomposition
401 // SL does the oposite
398 bool usemesh = false; 402 bool usemesh = false;
399 403
400 coords = new List<Coord>(); 404 coords = new List<Coord>();
@@ -443,16 +447,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
443 447
444 if (physicsParms != null) 448 if (physicsParms != null)
445 usemesh = true; 449 usemesh = true;
446 else
447 {
448 m_log.WarnFormat("[MESH]: Data for PRIM shape type not found for prim {0}",primName);
449 return false;
450 }
451 } 450 }
452 451
453 if(!usemesh && (map.ContainsKey("physics_convex"))) 452 if(!usemesh && (map.ContainsKey("physics_convex")))
454 physicsParms = (OSDMap)map["physics_convex"]; 453 physicsParms = (OSDMap)map["physics_convex"];
455
456 454
457 if (physicsParms == null) 455 if (physicsParms == null)
458 { 456 {
@@ -555,160 +553,168 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
555 range = range - min; 553 range = range - min;
556 range *= invMaxU16; 554 range *= invMaxU16;
557 555
558 if (!convex && cmap.ContainsKey("HullList") && cmap.ContainsKey("Positions")) 556 if(!convex)
559 { 557 {
560 List<int> hsizes = new List<int>(); 558 // if mesh data not present and not convex then we need convex decomposition data
561 int totalpoints = 0; 559 if (cmap.ContainsKey("HullList") && cmap.ContainsKey("Positions"))
562 data = cmap["HullList"].AsBinary();
563 for (i = 0; i < data.Length; i++)
564 { 560 {
565 t1 = data[i]; 561 List<int> hsizes = new List<int>();
566 if (t1 == 0) 562 int totalpoints = 0;
567 t1 = 256; 563 data = cmap["HullList"].AsBinary();
568 totalpoints += t1; 564 for (i = 0; i < data.Length; i++)
569 hsizes.Add(t1); 565 {
570 } 566 t1 = data[i];
567 if (t1 == 0)
568 t1 = 256;
569 totalpoints += t1;
570 hsizes.Add(t1);
571 }
571 572
572 data = cmap["Positions"].AsBinary(); 573 data = cmap["Positions"].AsBinary();
573 int ptr = 0; 574 int ptr = 0;
574 int vertsoffset = 0; 575 int vertsoffset = 0;
575 576
576 if (totalpoints == data.Length / 6) // 2 bytes per coord, 3 coords per point 577 if (totalpoints == data.Length / 6) // 2 bytes per coord, 3 coords per point
577 {
578 foreach (int hullsize in hsizes)
579 { 578 {
580 for (i = 0; i < hullsize; i++ ) 579 foreach (int hullsize in hsizes)
581 {
582 t1 = data[ptr++];
583 t1 += data[ptr++] << 8;
584 t2 = data[ptr++];
585 t2 += data[ptr++] << 8;
586 t3 = data[ptr++];
587 t3 += data[ptr++] << 8;
588
589 f3 = new float3((t1 * range.X + min.X),
590 (t2 * range.Y + min.Y),
591 (t3 * range.Z + min.Z));
592 vs.Add(f3);
593 }
594
595 if(hullsize <3)
596 { 580 {
597 vs.Clear(); 581 for (i = 0; i < hullsize; i++ )
598 continue; 582 {
599 } 583 t1 = data[ptr++];
584 t1 += data[ptr++] << 8;
585 t2 = data[ptr++];
586 t2 += data[ptr++] << 8;
587 t3 = data[ptr++];
588 t3 += data[ptr++] << 8;
589
590 f3 = new float3((t1 * range.X + min.X),
591 (t2 * range.Y + min.Y),
592 (t3 * range.Z + min.Z));
593 vs.Add(f3);
594 }
600 595
601 if (hullsize <5) 596 if(hullsize <3)
602 {
603 foreach (float3 point in vs)
604 { 597 {
605 c.X = point.x; 598 vs.Clear();
606 c.Y = point.y; 599 continue;
607 c.Z = point.z;
608 coords.Add(c);
609 } 600 }
610 f = new Face(vertsoffset, vertsoffset + 1, vertsoffset + 2);
611 faces.Add(f);
612 601
613 if (hullsize == 4) 602 if (hullsize <5)
614 { 603 {
615 // not sure about orientation.. 604 foreach (float3 point in vs)
616 f = new Face(vertsoffset, vertsoffset + 2, vertsoffset + 3); 605 {
617 faces.Add(f); 606 c.X = point.x;
618 f = new Face(vertsoffset, vertsoffset + 3, vertsoffset + 1); 607 c.Y = point.y;
619 faces.Add(f); 608 c.Z = point.z;
620 f = new Face(vertsoffset + 3, vertsoffset + 2, vertsoffset + 1); 609 coords.Add(c);
610 }
611 f = new Face(vertsoffset, vertsoffset + 1, vertsoffset + 2);
621 faces.Add(f); 612 faces.Add(f);
613
614 if (hullsize == 4)
615 {
616 // not sure about orientation..
617 f = new Face(vertsoffset, vertsoffset + 2, vertsoffset + 3);
618 faces.Add(f);
619 f = new Face(vertsoffset, vertsoffset + 3, vertsoffset + 1);
620 faces.Add(f);
621 f = new Face(vertsoffset + 3, vertsoffset + 2, vertsoffset + 1);
622 faces.Add(f);
623 }
624 vertsoffset += vs.Count;
625 vs.Clear();
626 continue;
627 }
628 /*
629 if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f))
630 {
631 vs.Clear();
632 continue;
622 } 633 }
623 vertsoffset += vs.Count;
624 vs.Clear();
625 continue;
626 }
627/*
628 if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f))
629 {
630 vs.Clear();
631 continue;
632 }
633 634
634 nverts = hullr.Vertices.Count; 635 nverts = hullr.Vertices.Count;
635 nindexs = hullr.Indices.Count; 636 nindexs = hullr.Indices.Count;
636 637
637 if (nindexs % 3 != 0) 638 if (nindexs % 3 != 0)
638 { 639 {
639 vs.Clear(); 640 vs.Clear();
640 continue; 641 continue;
641 } 642 }
642 643
643 for (i = 0; i < nverts; i++) 644 for (i = 0; i < nverts; i++)
644 { 645 {
645 c.X = hullr.Vertices[i].x; 646 c.X = hullr.Vertices[i].x;
646 c.Y = hullr.Vertices[i].y; 647 c.Y = hullr.Vertices[i].y;
647 c.Z = hullr.Vertices[i].z; 648 c.Z = hullr.Vertices[i].z;
648 coords.Add(c); 649 coords.Add(c);
649 } 650 }
650 651
651 for (i = 0; i < nindexs; i += 3) 652 for (i = 0; i < nindexs; i += 3)
652 { 653 {
653 t1 = hullr.Indices[i]; 654 t1 = hullr.Indices[i];
654 if (t1 > nverts) 655 if (t1 > nverts)
655 break; 656 break;
656 t2 = hullr.Indices[i + 1]; 657 t2 = hullr.Indices[i + 1];
657 if (t2 > nverts) 658 if (t2 > nverts)
658 break; 659 break;
659 t3 = hullr.Indices[i + 2]; 660 t3 = hullr.Indices[i + 2];
660 if (t3 > nverts) 661 if (t3 > nverts)
661 break; 662 break;
662 f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3); 663 f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3);
663 faces.Add(f); 664 faces.Add(f);
664 } 665 }
665*/ 666 */
666 List<int> indices; 667 List<int> indices;
667 if (!HullUtils.ComputeHull(vs, out indices)) 668 if (!HullUtils.ComputeHull(vs, out indices))
668 { 669 {
669 vs.Clear(); 670 vs.Clear();
670 continue; 671 continue;
671 } 672 }
672 673
673 nverts = vs.Count; 674 nverts = vs.Count;
674 nindexs = indices.Count; 675 nindexs = indices.Count;
675 676
676 if (nindexs % 3 != 0) 677 if (nindexs % 3 != 0)
677 { 678 {
678 vs.Clear(); 679 vs.Clear();
679 continue; 680 continue;
680 } 681 }
681 682
682 for (i = 0; i < nverts; i++) 683 for (i = 0; i < nverts; i++)
683 { 684 {
684 c.X = vs[i].x; 685 c.X = vs[i].x;
685 c.Y = vs[i].y; 686 c.Y = vs[i].y;
686 c.Z = vs[i].z; 687 c.Z = vs[i].z;
687 coords.Add(c); 688 coords.Add(c);
688 } 689 }
689 690
690 for (i = 0; i < nindexs; i += 3) 691 for (i = 0; i < nindexs; i += 3)
691 { 692 {
692 t1 = indices[i]; 693 t1 = indices[i];
693 if (t1 > nverts) 694 if (t1 > nverts)
694 break; 695 break;
695 t2 = indices[i + 1]; 696 t2 = indices[i + 1];
696 if (t2 > nverts) 697 if (t2 > nverts)
697 break; 698 break;
698 t3 = indices[i + 2]; 699 t3 = indices[i + 2];
699 if (t3 > nverts) 700 if (t3 > nverts)
700 break; 701 break;
701 f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3); 702 f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3);
702 faces.Add(f); 703 faces.Add(f);
704 }
705 vertsoffset += nverts;
706 vs.Clear();
703 } 707 }
704 vertsoffset += nverts;
705 vs.Clear();
706 } 708 }
709 if (coords.Count > 0 && faces.Count > 0)
710 return true;
711 }
712 else
713 {
714 // if neither mesh or decomposition present, warn and use convex
715 m_log.WarnFormat("[MESH]: Data for PRIM shape type ( mesh or decomposition) not found for prim {0}",primName);
707 } 716 }
708 if (coords.Count > 0 && faces.Count > 0)
709 return true;
710 } 717 }
711
712 vs.Clear(); 718 vs.Clear();
713 719
714 if (cmap.ContainsKey("BoundingVerts")) 720 if (cmap.ContainsKey("BoundingVerts"))