diff options
Diffstat (limited to 'OpenSim/Region/Physics/Meshing')
-rw-r--r-- | OpenSim/Region/Physics/Meshing/PrimMesher.cs | 116 |
1 files changed, 102 insertions, 14 deletions
diff --git a/OpenSim/Region/Physics/Meshing/PrimMesher.cs b/OpenSim/Region/Physics/Meshing/PrimMesher.cs index 63fb7f7..537d652 100644 --- a/OpenSim/Region/Physics/Meshing/PrimMesher.cs +++ b/OpenSim/Region/Physics/Meshing/PrimMesher.cs | |||
@@ -415,17 +415,23 @@ namespace PrimMesher | |||
415 | 415 | ||
416 | internal List<Coord> coords; | 416 | internal List<Coord> coords; |
417 | internal List<Face> faces; | 417 | internal List<Face> faces; |
418 | internal List<Coord> normals; | ||
419 | |||
420 | internal bool calcVertexNormals = false; | ||
418 | 421 | ||
419 | internal Profile() | 422 | internal Profile() |
420 | { | 423 | { |
421 | this.coords = new List<Coord>(); | 424 | this.coords = new List<Coord>(); |
422 | this.faces = new List<Face>(); | 425 | this.faces = new List<Face>(); |
426 | this.normals = new List<Coord>(); | ||
423 | } | 427 | } |
424 | 428 | ||
425 | public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces) | 429 | public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals) |
426 | { | 430 | { |
431 | this.calcVertexNormals = calcVertexNormals; | ||
427 | this.coords = new List<Coord>(); | 432 | this.coords = new List<Coord>(); |
428 | this.faces = new List<Face>(); | 433 | this.faces = new List<Face>(); |
434 | this.normals = new List<Coord>(); | ||
429 | Coord center = new Coord(0.0f, 0.0f, 0.0f); | 435 | Coord center = new Coord(0.0f, 0.0f, 0.0f); |
430 | List<Coord> hollowCoords = new List<Coord>(); | 436 | List<Coord> hollowCoords = new List<Coord>(); |
431 | 437 | ||
@@ -452,6 +458,20 @@ namespace PrimMesher | |||
452 | return; | 458 | return; |
453 | } | 459 | } |
454 | 460 | ||
461 | if (this.calcVertexNormals) | ||
462 | { | ||
463 | if (sides > 4) | ||
464 | foreach (Angle a in angles.angles) | ||
465 | normals.Add(new Coord(a.X, a.Y, 0.0f)); | ||
466 | else | ||
467 | for (int i = 0; i < angles.angles.Count - 1; i++) | ||
468 | { | ||
469 | Angle a1 = angles.angles[i]; | ||
470 | Angle a2 = angles.angles[i + 1]; | ||
471 | normals.Add(new Coord(0.5f * (a1.X + a2.X), 0.5f * (a1.Y + a2.Y), 0.0f).Normalize()); | ||
472 | } | ||
473 | } | ||
474 | |||
455 | if (hollow > 0.001f) | 475 | if (hollow > 0.001f) |
456 | { | 476 | { |
457 | if (sides == hollowSides) | 477 | if (sides == hollowSides) |
@@ -466,9 +486,27 @@ namespace PrimMesher | |||
466 | return; | 486 | return; |
467 | } | 487 | } |
468 | } | 488 | } |
489 | |||
490 | if (this.calcVertexNormals) | ||
491 | { | ||
492 | if (hollowSides > 4) | ||
493 | foreach (Angle a in hollowAngles.angles) | ||
494 | normals.Add(new Coord(-a.X, -a.Y, 0.0f)); | ||
495 | else | ||
496 | for (int i = 0; i < hollowAngles.angles.Count - 1; i++) | ||
497 | { | ||
498 | Angle a1 = hollowAngles.angles[i]; | ||
499 | Angle a2 = hollowAngles.angles[i + 1]; | ||
500 | normals.Add(new Coord(-0.5f * (a1.X + a2.X), -0.5f * (a1.Y + a2.Y), 0.0f).Normalize()); | ||
501 | } | ||
502 | } | ||
469 | } | 503 | } |
470 | else | 504 | else |
505 | { | ||
471 | this.coords.Add(center); | 506 | this.coords.Add(center); |
507 | if (this.calcVertexNormals && sides > 4) | ||
508 | this.normals.Add(new Coord(0.0f, 0.0f, 1.0f)); | ||
509 | } | ||
472 | 510 | ||
473 | float z = 0.0f; | 511 | float z = 0.0f; |
474 | 512 | ||
@@ -617,6 +655,7 @@ namespace PrimMesher | |||
617 | clone.coords.AddRange(this.coords); | 655 | clone.coords.AddRange(this.coords); |
618 | if (needFaces) | 656 | if (needFaces) |
619 | clone.faces.AddRange(this.faces); | 657 | clone.faces.AddRange(this.faces); |
658 | clone.normals.AddRange(this.normals); | ||
620 | 659 | ||
621 | return clone; | 660 | return clone; |
622 | } | 661 | } |
@@ -646,17 +685,29 @@ namespace PrimMesher | |||
646 | { | 685 | { |
647 | int i; | 686 | int i; |
648 | int numVerts = this.coords.Count; | 687 | int numVerts = this.coords.Count; |
649 | Coord vert; | 688 | Coord c; |
650 | 689 | ||
651 | for (i = 0; i < numVerts; i++) | 690 | for (i = 0; i < numVerts; i++) |
652 | { | 691 | { |
653 | vert = this.coords[i]; | 692 | c = this.coords[i]; |
654 | Coord v = new Coord(vert.X, vert.Y, vert.Z) * q; | 693 | Coord v = new Coord(c.X, c.Y, c.Z) * q; |
655 | 694 | ||
656 | vert.X = v.X; | 695 | c.X = v.X; |
657 | vert.Y = v.Y; | 696 | c.Y = v.Y; |
658 | vert.Z = v.Z; | 697 | c.Z = v.Z; |
659 | this.coords[i] = vert; | 698 | this.coords[i] = c; |
699 | } | ||
700 | |||
701 | int numNormals = this.normals.Count; | ||
702 | for (i = 0; i < numNormals; i++) | ||
703 | { | ||
704 | c = this.normals[i]; | ||
705 | Coord n = new Coord(c.X, c.Y, c.Z) * q; | ||
706 | |||
707 | c.X = n.X; | ||
708 | c.Y = n.Y; | ||
709 | c.Z = n.Z; | ||
710 | this.normals[i] = c; | ||
660 | } | 711 | } |
661 | } | 712 | } |
662 | 713 | ||
@@ -675,6 +726,9 @@ namespace PrimMesher | |||
675 | } | 726 | } |
676 | } | 727 | } |
677 | 728 | ||
729 | /// <summary> | ||
730 | /// Changes order of the vertex indices and negates the center vertex normal. Does not alter vertex normals of radial vertices | ||
731 | /// </summary> | ||
678 | public void FlipNormals() | 732 | public void FlipNormals() |
679 | { | 733 | { |
680 | int i; | 734 | int i; |
@@ -690,9 +744,20 @@ namespace PrimMesher | |||
690 | tmpFace.v1 = tmp; | 744 | tmpFace.v1 = tmp; |
691 | this.faces[i] = tmpFace; | 745 | this.faces[i] = tmpFace; |
692 | } | 746 | } |
747 | |||
748 | if (this.calcVertexNormals) | ||
749 | { | ||
750 | int normalCount = this.normals.Count; | ||
751 | if (normalCount > 0) | ||
752 | { | ||
753 | Coord n = this.normals[normalCount - 1]; | ||
754 | n.Z *= 1.0f; | ||
755 | this.normals[normalCount - 1] = n; | ||
756 | } | ||
757 | } | ||
693 | } | 758 | } |
694 | 759 | ||
695 | public void AddValue2Faces(int num) | 760 | public void AddValue2FaceVertexIndices(int num) |
696 | { | 761 | { |
697 | int numFaces = this.faces.Count; | 762 | int numFaces = this.faces.Count; |
698 | Face tmpFace; | 763 | Face tmpFace; |
@@ -702,10 +767,29 @@ namespace PrimMesher | |||
702 | tmpFace.v1 += num; | 767 | tmpFace.v1 += num; |
703 | tmpFace.v2 += num; | 768 | tmpFace.v2 += num; |
704 | tmpFace.v3 += num; | 769 | tmpFace.v3 += num; |
770 | |||
705 | this.faces[i] = tmpFace; | 771 | this.faces[i] = tmpFace; |
706 | } | 772 | } |
707 | } | 773 | } |
708 | 774 | ||
775 | public void AddValue2FaceNormalIndices(int num) | ||
776 | { | ||
777 | if (this.calcVertexNormals) | ||
778 | { | ||
779 | int numFaces = this.faces.Count; | ||
780 | Face tmpFace; | ||
781 | for (int i = 0; i < numFaces; i++) | ||
782 | { | ||
783 | tmpFace = this.faces[i]; | ||
784 | tmpFace.n1 += num; | ||
785 | tmpFace.n2 += num; | ||
786 | tmpFace.n3 += num; | ||
787 | |||
788 | this.faces[i] = tmpFace; | ||
789 | } | ||
790 | } | ||
791 | } | ||
792 | |||
709 | public void DumpRaw(String path, String name, String title) | 793 | public void DumpRaw(String path, String name, String title) |
710 | { | 794 | { |
711 | if (path == null) | 795 | if (path == null) |
@@ -757,6 +841,8 @@ namespace PrimMesher | |||
757 | public float revolutions = 1.0f; | 841 | public float revolutions = 1.0f; |
758 | public int stepsPerRevolution = 24; | 842 | public int stepsPerRevolution = 24; |
759 | 843 | ||
844 | public bool calcVertexNormals = false; | ||
845 | |||
760 | public string ParamsToDisplayString() | 846 | public string ParamsToDisplayString() |
761 | { | 847 | { |
762 | string s = ""; | 848 | string s = ""; |
@@ -883,7 +969,7 @@ namespace PrimMesher | |||
883 | if (profileStart < 0.0 || profileEnd < 1.0) | 969 | if (profileStart < 0.0 || profileEnd < 1.0) |
884 | hasProfileCut = true; | 970 | hasProfileCut = true; |
885 | 971 | ||
886 | Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true); | 972 | Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true, calcVertexNormals); |
887 | 973 | ||
888 | if (initialProfileRot != 0.0f) | 974 | if (initialProfileRot != 0.0f) |
889 | profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); | 975 | profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); |
@@ -920,7 +1006,7 @@ namespace PrimMesher | |||
920 | // append this layer | 1006 | // append this layer |
921 | 1007 | ||
922 | int coordsLen = this.coords.Count; | 1008 | int coordsLen = this.coords.Count; |
923 | newLayer.AddValue2Faces(coordsLen); | 1009 | newLayer.AddValue2FaceVertexIndices(coordsLen); |
924 | 1010 | ||
925 | this.coords.AddRange(newLayer.coords); | 1011 | this.coords.AddRange(newLayer.coords); |
926 | 1012 | ||
@@ -1071,7 +1157,7 @@ namespace PrimMesher | |||
1071 | else if (twistTotal != 0.0) | 1157 | else if (twistTotal != 0.0) |
1072 | needEndFaces = true; | 1158 | needEndFaces = true; |
1073 | 1159 | ||
1074 | Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces); | 1160 | Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces, calcVertexNormals); |
1075 | 1161 | ||
1076 | if (initialProfileRot != 0.0f) | 1162 | if (initialProfileRot != 0.0f) |
1077 | profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); | 1163 | profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); |
@@ -1135,7 +1221,7 @@ namespace PrimMesher | |||
1135 | // append the layer and fill in the sides | 1221 | // append the layer and fill in the sides |
1136 | 1222 | ||
1137 | int coordsLen = this.coords.Count; | 1223 | int coordsLen = this.coords.Count; |
1138 | newLayer.AddValue2Faces(coordsLen); | 1224 | newLayer.AddValue2FaceVertexIndices(coordsLen); |
1139 | 1225 | ||
1140 | this.coords.AddRange(newLayer.coords); | 1226 | this.coords.AddRange(newLayer.coords); |
1141 | 1227 | ||
@@ -1190,7 +1276,9 @@ namespace PrimMesher | |||
1190 | { | 1276 | { |
1191 | int numFaces = faces.Count; | 1277 | int numFaces = faces.Count; |
1192 | if (faceIndex < 0 || faceIndex >= faces.Count) | 1278 | if (faceIndex < 0 || faceIndex >= faces.Count) |
1193 | return new Coord(0.0f, 0.0f, 0.0f); | 1279 | throw new Exception("faceIndex out of range"); |
1280 | |||
1281 | //return new Coord(0.0f, 0.0f, 0.0f); | ||
1194 | 1282 | ||
1195 | Face face = faces[faceIndex]; | 1283 | Face face = faces[faceIndex]; |
1196 | Coord c1 = coords[face.v1]; | 1284 | Coord c1 = coords[face.v1]; |