diff options
Diffstat (limited to 'OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs')
-rw-r--r-- | OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs new file mode 100644 index 0000000..8957e8f --- /dev/null +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs | |||
@@ -0,0 +1,218 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | #region Header | ||
29 | |||
30 | // SceneObjectGroupDiff.cs | ||
31 | // User: bongiojp | ||
32 | |||
33 | #endregion Header | ||
34 | |||
35 | using System; | ||
36 | using System.Collections.Generic; | ||
37 | using System.Diagnostics; | ||
38 | using System.Drawing; | ||
39 | |||
40 | using OpenMetaverse; | ||
41 | |||
42 | using Nini.Config; | ||
43 | |||
44 | using OpenSim.Framework; | ||
45 | using OpenSim.Region.Framework.Interfaces; | ||
46 | using OpenSim.Region.Framework.Scenes; | ||
47 | using OpenSim.Region.Physics.Manager; | ||
48 | |||
49 | using log4net; | ||
50 | |||
51 | namespace OpenSim.Region.OptionalModules.ContentManagement | ||
52 | { | ||
53 | #region Enumerations | ||
54 | |||
55 | [Flags] | ||
56 | public enum Diff | ||
57 | { | ||
58 | NONE = 0, | ||
59 | FACECOLOR = 1, | ||
60 | SHAPE = 1<<1, | ||
61 | MATERIAL = 1<<2, | ||
62 | TEXTURE = 1<<3, | ||
63 | SCALE = 1<<4, | ||
64 | POSITION = 1<<5, | ||
65 | OFFSETPOSITION = 1<<6, | ||
66 | ROTATIONOFFSET = 1<<7, | ||
67 | ROTATIONALVELOCITY = 1<<8, | ||
68 | ACCELERATION = 1<<9, | ||
69 | ANGULARVELOCITY = 1<<10, | ||
70 | VELOCITY = 1<<11, | ||
71 | OBJECTOWNER = 1<<12, | ||
72 | PERMISSIONS = 1<<13, | ||
73 | DESCRIPTION = 1<<14, | ||
74 | NAME = 1<<15, | ||
75 | SCRIPT = 1<<16, | ||
76 | CLICKACTION = 1<<17, | ||
77 | PARTICLESYSTEM = 1<<18, | ||
78 | GLOW = 1<<19, | ||
79 | SALEPRICE = 1<<20, | ||
80 | SITNAME = 1<<21, | ||
81 | SITTARGETORIENTATION = 1<<22, | ||
82 | SITTARGETPOSITION = 1<<23, | ||
83 | TEXT = 1<<24, | ||
84 | TOUCHNAME = 1<<25 | ||
85 | } | ||
86 | |||
87 | #endregion Enumerations | ||
88 | |||
89 | public static class Difference | ||
90 | { | ||
91 | #region Static Fields | ||
92 | |||
93 | static float TimeToDiff = 0; | ||
94 | // private static readonly ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||
95 | |||
96 | #endregion Static Fields | ||
97 | |||
98 | #region Private Methods | ||
99 | |||
100 | private static bool AreQuaternionsEquivalent(Quaternion first, Quaternion second) | ||
101 | { | ||
102 | Vector3 firstVector = llRot2Euler(first); | ||
103 | Vector3 secondVector = llRot2Euler(second); | ||
104 | return AreVectorsEquivalent(firstVector, secondVector); | ||
105 | } | ||
106 | |||
107 | private static bool AreVectorsEquivalent(Vector3 first, Vector3 second) | ||
108 | { | ||
109 | if (TruncateSignificant(first.X, 2) == TruncateSignificant(second.X, 2) | ||
110 | && TruncateSignificant(first.Y, 2) == TruncateSignificant(second.Y, 2) | ||
111 | && TruncateSignificant(first.Z, 2) == TruncateSignificant(second.Z, 2) | ||
112 | ) | ||
113 | return true; | ||
114 | else | ||
115 | return false; | ||
116 | } | ||
117 | |||
118 | // Taken from Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | ||
119 | private static double NormalizeAngle(double angle) | ||
120 | { | ||
121 | angle = angle % (Math.PI * 2); | ||
122 | if (angle < 0) angle = angle + Math.PI * 2; | ||
123 | return angle; | ||
124 | } | ||
125 | |||
126 | private static int TruncateSignificant(float num, int digits) | ||
127 | { | ||
128 | return (int) Math.Ceiling((Math.Truncate(num * 10 * digits)/10*digits)); | ||
129 | // return (int) ((num * (10*digits))/10*digits); | ||
130 | } | ||
131 | |||
132 | // Taken from Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | ||
133 | // Also changed the original function from LSL_Types to LL types | ||
134 | private static Vector3 llRot2Euler(Quaternion r) | ||
135 | { | ||
136 | Quaternion t = new Quaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.W * r.W); | ||
137 | double m = (t.X + t.Y + t.Z + t.W); | ||
138 | if (m == 0) return new Vector3(); | ||
139 | double n = 2 * (r.Y * r.W + r.X * r.Z); | ||
140 | double p = m * m - n * n; | ||
141 | if (p > 0) | ||
142 | return new Vector3((float)NormalizeAngle(Math.Atan2(2.0 * (r.X * r.W - r.Y * r.Z), (-t.X - t.Y + t.Z + t.W))), | ||
143 | (float)NormalizeAngle(Math.Atan2(n, Math.Sqrt(p))), | ||
144 | (float)NormalizeAngle(Math.Atan2(2.0 * (r.Z * r.W - r.X * r.Y), (t.X - t.Y - t.Z + t.W)))); | ||
145 | else if (n > 0) | ||
146 | return new Vector3(0.0f, (float)(Math.PI / 2), (float)NormalizeAngle(Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Z))); | ||
147 | else | ||
148 | return new Vector3(0.0f, (float)(-Math.PI / 2), (float)NormalizeAngle(Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Z))); | ||
149 | } | ||
150 | |||
151 | #endregion Private Methods | ||
152 | |||
153 | #region Public Methods | ||
154 | |||
155 | /// <summary> | ||
156 | /// Compares the attributes (Vectors, Quaternions, Strings, etc.) between two scene object parts | ||
157 | /// and returns a Diff bitmask which details what the differences are. | ||
158 | /// </summary> | ||
159 | public static Diff FindDifferences(SceneObjectPart first, SceneObjectPart second) | ||
160 | { | ||
161 | Stopwatch x = new Stopwatch(); | ||
162 | x.Start(); | ||
163 | |||
164 | Diff result = 0; | ||
165 | |||
166 | // VECTOR COMPARISONS | ||
167 | if (!AreVectorsEquivalent(first.Acceleration, second.Acceleration)) | ||
168 | result |= Diff.ACCELERATION; | ||
169 | if (!AreVectorsEquivalent(first.AbsolutePosition, second.AbsolutePosition)) | ||
170 | result |= Diff.POSITION; | ||
171 | if (!AreVectorsEquivalent(first.AngularVelocity, second.AngularVelocity)) | ||
172 | result |= Diff.ANGULARVELOCITY; | ||
173 | if (!AreVectorsEquivalent(first.OffsetPosition, second.OffsetPosition)) | ||
174 | result |= Diff.OFFSETPOSITION; | ||
175 | if (!AreVectorsEquivalent(first.RotationalVelocity, second.RotationalVelocity)) | ||
176 | result |= Diff.ROTATIONALVELOCITY; | ||
177 | if (!AreVectorsEquivalent(first.Scale, second.Scale)) | ||
178 | result |= Diff.SCALE; | ||
179 | if (!AreVectorsEquivalent(first.Velocity, second.Velocity)) | ||
180 | result |= Diff.VELOCITY; | ||
181 | |||
182 | |||
183 | // QUATERNION COMPARISONS | ||
184 | if (!AreQuaternionsEquivalent(first.RotationOffset, second.RotationOffset)) | ||
185 | result |= Diff.ROTATIONOFFSET; | ||
186 | |||
187 | |||
188 | // MISC COMPARISONS (UUID, Byte) | ||
189 | if (first.ClickAction != second.ClickAction) | ||
190 | result |= Diff.CLICKACTION; | ||
191 | if (first.ObjectOwner != second.ObjectOwner) | ||
192 | result |= Diff.OBJECTOWNER; | ||
193 | |||
194 | |||
195 | // STRING COMPARISONS | ||
196 | if (first.Description != second.Description) | ||
197 | result |= Diff.DESCRIPTION; | ||
198 | if (first.Material != second.Material) | ||
199 | result |= Diff.MATERIAL; | ||
200 | if (first.Name != second.Name) | ||
201 | result |= Diff.NAME; | ||
202 | if (first.SitName != second.SitName) | ||
203 | result |= Diff.SITNAME; | ||
204 | if (first.Text != second.Text) | ||
205 | result |= Diff.TEXT; | ||
206 | if (first.TouchName != second.TouchName) | ||
207 | result |= Diff.TOUCHNAME; | ||
208 | |||
209 | x.Stop(); | ||
210 | TimeToDiff += x.ElapsedMilliseconds; | ||
211 | //m_log.Info("[DIFFERENCES] Time spent diffing objects so far" + TimeToDiff); | ||
212 | |||
213 | return result; | ||
214 | } | ||
215 | |||
216 | #endregion Public Methods | ||
217 | } | ||
218 | } | ||