diff options
Diffstat (limited to 'OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs')
-rw-r--r-- | OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs | 131 |
1 files changed, 65 insertions, 66 deletions
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs index d9ea4a4..0cdaa60 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs | |||
@@ -39,6 +39,24 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
39 | { | 39 | { |
40 | public class MeshBuildingData | 40 | public class MeshBuildingData |
41 | { | 41 | { |
42 | private class vertexcomp : IEqualityComparer<Vertex> | ||
43 | { | ||
44 | public bool Equals(Vertex v1, Vertex v2) | ||
45 | { | ||
46 | if (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z) | ||
47 | return true; | ||
48 | else | ||
49 | return false; | ||
50 | } | ||
51 | public int GetHashCode(Vertex v) | ||
52 | { | ||
53 | int a = v.X.GetHashCode(); | ||
54 | int b = v.Y.GetHashCode(); | ||
55 | int c = v.Z.GetHashCode(); | ||
56 | return (a << 16) ^ (b << 8) ^ c; | ||
57 | } | ||
58 | } | ||
59 | |||
42 | public Dictionary<Vertex, int> m_vertices; | 60 | public Dictionary<Vertex, int> m_vertices; |
43 | public List<Triangle> m_triangles; | 61 | public List<Triangle> m_triangles; |
44 | public float m_obbXmin; | 62 | public float m_obbXmin; |
@@ -49,6 +67,21 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
49 | public float m_obbZmax; | 67 | public float m_obbZmax; |
50 | public Vector3 m_centroid; | 68 | public Vector3 m_centroid; |
51 | public int m_centroidDiv; | 69 | public int m_centroidDiv; |
70 | |||
71 | public MeshBuildingData() | ||
72 | { | ||
73 | vertexcomp vcomp = new vertexcomp(); | ||
74 | m_vertices = new Dictionary<Vertex, int>(vcomp); | ||
75 | m_triangles = new List<Triangle>(); | ||
76 | m_centroid = Vector3.Zero; | ||
77 | m_centroidDiv = 0; | ||
78 | m_obbXmin = float.MaxValue; | ||
79 | m_obbXmax = float.MinValue; | ||
80 | m_obbYmin = float.MaxValue; | ||
81 | m_obbYmax = float.MinValue; | ||
82 | m_obbZmin = float.MaxValue; | ||
83 | m_obbZmax = float.MinValue; | ||
84 | } | ||
52 | } | 85 | } |
53 | 86 | ||
54 | [Serializable()] | 87 | [Serializable()] |
@@ -76,50 +109,20 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
76 | public int RefCount { get; set; } | 109 | public int RefCount { get; set; } |
77 | public AMeshKey Key { get; set; } | 110 | public AMeshKey Key { get; set; } |
78 | 111 | ||
79 | private class vertexcomp : IEqualityComparer<Vertex> | 112 | public Mesh(bool forbuild) |
80 | { | 113 | { |
81 | public bool Equals(Vertex v1, Vertex v2) | 114 | if(forbuild) |
82 | { | 115 | m_bdata = new MeshBuildingData(); |
83 | if (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z) | ||
84 | return true; | ||
85 | else | ||
86 | return false; | ||
87 | } | ||
88 | public int GetHashCode(Vertex v) | ||
89 | { | ||
90 | int a = v.X.GetHashCode(); | ||
91 | int b = v.Y.GetHashCode(); | ||
92 | int c = v.Z.GetHashCode(); | ||
93 | return (a << 16) ^ (b << 8) ^ c; | ||
94 | } | ||
95 | } | ||
96 | |||
97 | public Mesh() | ||
98 | { | ||
99 | vertexcomp vcomp = new vertexcomp(); | ||
100 | |||
101 | m_bdata = new MeshBuildingData(); | ||
102 | m_bdata.m_vertices = new Dictionary<Vertex, int>(vcomp); | ||
103 | m_bdata.m_triangles = new List<Triangle>(); | ||
104 | m_bdata.m_centroid = Vector3.Zero; | ||
105 | m_bdata.m_centroidDiv = 0; | ||
106 | m_bdata.m_obbXmin = float.MaxValue; | ||
107 | m_bdata.m_obbXmax = float.MinValue; | ||
108 | m_bdata.m_obbYmin = float.MaxValue; | ||
109 | m_bdata.m_obbYmax = float.MinValue; | ||
110 | m_bdata.m_obbZmin = float.MaxValue; | ||
111 | m_bdata.m_obbZmax = float.MinValue; | ||
112 | m_obb = new Vector3(0.5f, 0.5f, 0.5f); | 116 | m_obb = new Vector3(0.5f, 0.5f, 0.5f); |
113 | m_obboffset = Vector3.Zero; | 117 | m_obboffset = Vector3.Zero; |
114 | } | 118 | } |
115 | 119 | ||
116 | |||
117 | public Mesh Scale(Vector3 scale) | 120 | public Mesh Scale(Vector3 scale) |
118 | { | 121 | { |
119 | if (m_verticesPtr == null || m_indicesPtr == null) | 122 | if (m_verticesPtr == null || m_indicesPtr == null) |
120 | return null; | 123 | return null; |
121 | 124 | ||
122 | Mesh result = new Mesh(); | 125 | Mesh result = new Mesh(false); |
123 | 126 | ||
124 | float x = scale.X; | 127 | float x = scale.X; |
125 | float y = scale.Y; | 128 | float y = scale.Y; |
@@ -167,7 +170,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
167 | 170 | ||
168 | public Mesh Clone() | 171 | public Mesh Clone() |
169 | { | 172 | { |
170 | Mesh result = new Mesh(); | 173 | Mesh result = new Mesh(false); |
171 | 174 | ||
172 | if (m_bdata != null) | 175 | if (m_bdata != null) |
173 | { | 176 | { |
@@ -514,8 +517,6 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
514 | if (m_indicesPtr == IntPtr.Zero) | 517 | if (m_indicesPtr == IntPtr.Zero) |
515 | indexes = getIndexListAsInt(); | 518 | indexes = getIndexListAsInt(); |
516 | 519 | ||
517 | pinMemory(); | ||
518 | |||
519 | float x, y, z; | 520 | float x, y, z; |
520 | 521 | ||
521 | if (m_bdata.m_centroidDiv > 0) | 522 | if (m_bdata.m_centroidDiv > 0) |
@@ -543,55 +544,53 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
543 | m_obb = new Vector3(x, y, z); | 544 | m_obb = new Vector3(x, y, z); |
544 | 545 | ||
545 | releaseBuildingMeshData(); | 546 | releaseBuildingMeshData(); |
547 | pinMemory(); | ||
546 | } | 548 | } |
549 | |||
547 | public bool ToStream(Stream st) | 550 | public bool ToStream(Stream st) |
548 | { | 551 | { |
549 | if (m_indicesPtr == IntPtr.Zero || m_verticesPtr == IntPtr.Zero) | 552 | if (m_indicesPtr == IntPtr.Zero || m_verticesPtr == IntPtr.Zero) |
550 | return false; | 553 | return false; |
551 | 554 | ||
552 | BinaryWriter bw = new BinaryWriter(st); | ||
553 | bool ok = true; | 555 | bool ok = true; |
554 | 556 | ||
555 | try | 557 | try |
556 | { | 558 | { |
557 | 559 | using(BinaryWriter bw = new BinaryWriter(st)) | |
558 | bw.Write(m_vertexCount); | 560 | { |
559 | bw.Write(m_indexCount); | 561 | bw.Write(m_vertexCount); |
560 | 562 | bw.Write(m_indexCount); | |
561 | for (int i = 0; i < 3 * m_vertexCount; i++) | 563 | |
562 | bw.Write(vertices[i]); | 564 | for (int i = 0; i < 3 * m_vertexCount; i++) |
563 | for (int i = 0; i < m_indexCount; i++) | 565 | bw.Write(vertices[i]); |
564 | bw.Write(indexes[i]); | 566 | for (int i = 0; i < m_indexCount; i++) |
565 | bw.Write(m_obb.X); | 567 | bw.Write(indexes[i]); |
566 | bw.Write(m_obb.Y); | 568 | bw.Write(m_obb.X); |
567 | bw.Write(m_obb.Z); | 569 | bw.Write(m_obb.Y); |
568 | bw.Write(m_obboffset.X); | 570 | bw.Write(m_obb.Z); |
569 | bw.Write(m_obboffset.Y); | 571 | bw.Write(m_obboffset.X); |
570 | bw.Write(m_obboffset.Z); | 572 | bw.Write(m_obboffset.Y); |
573 | bw.Write(m_obboffset.Z); | ||
574 | bw.Flush(); | ||
575 | bw.Close(); | ||
576 | } | ||
571 | } | 577 | } |
572 | catch | 578 | catch |
573 | { | 579 | { |
574 | ok = false; | 580 | ok = false; |
575 | } | 581 | } |
576 | 582 | ||
577 | if (bw != null) | ||
578 | { | ||
579 | bw.Flush(); | ||
580 | bw.Close(); | ||
581 | } | ||
582 | |||
583 | return ok; | 583 | return ok; |
584 | } | 584 | } |
585 | 585 | ||
586 | public static Mesh FromStream(Stream st, AMeshKey key) | 586 | public static Mesh FromStream(Stream st, AMeshKey key) |
587 | { | 587 | { |
588 | Mesh mesh = new Mesh(); | 588 | Mesh mesh = new Mesh(false); |
589 | mesh.releaseBuildingMeshData(); | ||
590 | 589 | ||
591 | bool ok = true; | 590 | bool ok = true; |
592 | using(BinaryReader br = new BinaryReader(st)) | 591 | try |
593 | { | 592 | { |
594 | try | 593 | using(BinaryReader br = new BinaryReader(st)) |
595 | { | 594 | { |
596 | mesh.m_vertexCount = br.ReadInt32(); | 595 | mesh.m_vertexCount = br.ReadInt32(); |
597 | mesh.m_indexCount = br.ReadInt32(); | 596 | mesh.m_indexCount = br.ReadInt32(); |
@@ -613,10 +612,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
613 | mesh.m_obboffset.Y = br.ReadSingle(); | 612 | mesh.m_obboffset.Y = br.ReadSingle(); |
614 | mesh.m_obboffset.Z = br.ReadSingle(); | 613 | mesh.m_obboffset.Z = br.ReadSingle(); |
615 | } | 614 | } |
616 | catch | 615 | } |
617 | { | 616 | catch |
618 | ok = false; | 617 | { |
619 | } | 618 | ok = false; |
620 | } | 619 | } |
621 | 620 | ||
622 | if (ok) | 621 | if (ok) |