diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules/ContentManagementSystem/SceneObjectGroupDiff.cs')
-rw-r--r-- | OpenSim/Region/Environment/Modules/ContentManagementSystem/SceneObjectGroupDiff.cs | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Modules/ContentManagementSystem/SceneObjectGroupDiff.cs b/OpenSim/Region/Environment/Modules/ContentManagementSystem/SceneObjectGroupDiff.cs new file mode 100644 index 0000000..c3817ef --- /dev/null +++ b/OpenSim/Region/Environment/Modules/ContentManagementSystem/SceneObjectGroupDiff.cs | |||
@@ -0,0 +1,169 @@ | |||
1 | // SceneObjectGroupDiff.cs | ||
2 | // User: bongiojp | ||
3 | |||
4 | using System; | ||
5 | using System.Collections.Generic; | ||
6 | using System.Drawing; | ||
7 | using libsecondlife; | ||
8 | using Nini.Config; | ||
9 | using OpenSim.Framework; | ||
10 | using OpenSim.Region.Environment.Interfaces; | ||
11 | using OpenSim.Region.Environment.Scenes; | ||
12 | using log4net; | ||
13 | using OpenSim.Region.Physics.Manager; | ||
14 | using Axiom.Math; | ||
15 | using System.Diagnostics; | ||
16 | |||
17 | namespace OpenSim.Region.Environment.Modules.ContentManagement | ||
18 | { | ||
19 | [Flags] | ||
20 | public enum Diff | ||
21 | { | ||
22 | NONE = 0, | ||
23 | FACECOLOR = 1, | ||
24 | SHAPE = 1<<1, | ||
25 | MATERIAL = 1<<2, | ||
26 | TEXTURE = 1<<3, | ||
27 | SCALE = 1<<4, | ||
28 | POSITION = 1<<5, | ||
29 | OFFSETPOSITION = 1<<6, | ||
30 | ROTATIONOFFSET = 1<<7, | ||
31 | ROTATIONALVELOCITY = 1<<8, | ||
32 | ACCELERATION = 1<<9, | ||
33 | ANGULARVELOCITY = 1<<10, | ||
34 | VELOCITY = 1<<11, | ||
35 | OBJECTOWNER = 1<<12, | ||
36 | PERMISSIONS = 1<<13, | ||
37 | DESCRIPTION = 1<<14, | ||
38 | NAME = 1<<15, | ||
39 | SCRIPT = 1<<16, | ||
40 | CLICKACTION = 1<<17, | ||
41 | PARTICLESYSTEM = 1<<18, | ||
42 | GLOW = 1<<19, | ||
43 | SALEPRICE = 1<<20, | ||
44 | SITNAME = 1<<21, | ||
45 | SITTARGETORIENTATION = 1<<22, | ||
46 | SITTARGETPOSITION = 1<<23, | ||
47 | TEXT = 1<<24, | ||
48 | TOUCHNAME = 1<<25 | ||
49 | }; | ||
50 | |||
51 | public static class Difference | ||
52 | { | ||
53 | static float TimeToDiff = 0; | ||
54 | |||
55 | private static readonly ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||
56 | |||
57 | private static int TruncateSignificant(float num, int digits) | ||
58 | { | ||
59 | return (int) Math.Ceiling((Math.Truncate(num * 10 * digits)/10*digits)); | ||
60 | // return (int) ((num * (10*digits))/10*digits); | ||
61 | } | ||
62 | |||
63 | private static bool AreVectorsEquivalent(LLVector3 first, LLVector3 second) | ||
64 | { | ||
65 | if(TruncateSignificant(first.X, 2) == TruncateSignificant(second.X, 2) | ||
66 | && TruncateSignificant(first.Y, 2) == TruncateSignificant(second.Y, 2) | ||
67 | && TruncateSignificant(first.Z, 2) == TruncateSignificant(second.Z, 2) | ||
68 | ) | ||
69 | return true; | ||
70 | else | ||
71 | return false; | ||
72 | } | ||
73 | |||
74 | private static bool AreQuaternionsEquivalent(LLQuaternion first, LLQuaternion second) | ||
75 | { | ||
76 | LLVector3 firstVector = llRot2Euler(first); | ||
77 | LLVector3 secondVector = llRot2Euler(second); | ||
78 | return AreVectorsEquivalent(firstVector, secondVector); | ||
79 | } | ||
80 | |||
81 | // Taken from Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | ||
82 | // Also changed the original function from LSL_Types to LL types | ||
83 | private static LLVector3 llRot2Euler(LLQuaternion r) | ||
84 | { | ||
85 | LLQuaternion t = new LLQuaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.W * r.W); | ||
86 | double m = (t.X + t.Y + t.Z + t.W); | ||
87 | if (m == 0) return new LLVector3(); | ||
88 | double n = 2 * (r.Y * r.W + r.X * r.Z); | ||
89 | double p = m * m - n * n; | ||
90 | if (p > 0) | ||
91 | return new LLVector3((float)NormalizeAngle(Math.Atan2(2.0 * (r.X * r.W - r.Y * r.Z), (-t.X - t.Y + t.Z + t.W))), | ||
92 | (float)NormalizeAngle(Math.Atan2(n, Math.Sqrt(p))), | ||
93 | (float)NormalizeAngle(Math.Atan2(2.0 * (r.Z * r.W - r.X * r.Y), (t.X - t.Y - t.Z + t.W)))); | ||
94 | else if (n > 0) | ||
95 | return new LLVector3(0.0f, (float)(Math.PI / 2), (float)NormalizeAngle(Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Z))); | ||
96 | else | ||
97 | return new LLVector3(0.0f, (float)(-Math.PI / 2), (float)NormalizeAngle(Math.Atan2((r.Z * r.W + r.X * r.Y), 0.5 - t.X - t.Z))); | ||
98 | } | ||
99 | |||
100 | // Taken from Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | ||
101 | private static double NormalizeAngle(double angle) | ||
102 | { | ||
103 | angle = angle % (Math.PI * 2); | ||
104 | if (angle < 0) angle = angle + Math.PI * 2; | ||
105 | return angle; | ||
106 | } | ||
107 | |||
108 | /// <summary> | ||
109 | /// Compares the attributes (Vectors, Quaternions, Strings, etc.) between two scene object parts | ||
110 | /// and returns a Diff bitmask which details what the differences are. | ||
111 | /// </summary> | ||
112 | public static Diff FindDifferences(SceneObjectPart first, SceneObjectPart second) | ||
113 | { | ||
114 | Stopwatch x = new Stopwatch(); | ||
115 | x.Start(); | ||
116 | |||
117 | Diff result = 0; | ||
118 | |||
119 | // VECTOR COMPARISONS | ||
120 | if(! AreVectorsEquivalent(first.Acceleration, second.Acceleration)) | ||
121 | result |= Diff.ACCELERATION; | ||
122 | if(! AreVectorsEquivalent(first.AbsolutePosition, second.AbsolutePosition)) | ||
123 | result |= Diff.POSITION; | ||
124 | if(! AreVectorsEquivalent(first.AngularVelocity, second.AngularVelocity)) | ||
125 | result |= Diff.ANGULARVELOCITY; | ||
126 | if(! AreVectorsEquivalent(first.OffsetPosition, second.OffsetPosition)) | ||
127 | result |= Diff.OFFSETPOSITION; | ||
128 | if(! AreVectorsEquivalent(first.RotationalVelocity, second.RotationalVelocity)) | ||
129 | result |= Diff.ROTATIONALVELOCITY; | ||
130 | if(! AreVectorsEquivalent(first.Scale, second.Scale)) | ||
131 | result |= Diff.SCALE; | ||
132 | if(! AreVectorsEquivalent(first.Velocity, second.Velocity)) | ||
133 | result |= Diff.VELOCITY; | ||
134 | |||
135 | |||
136 | // QUATERNION COMPARISONS | ||
137 | if(! AreQuaternionsEquivalent(first.RotationOffset, second.RotationOffset)) | ||
138 | result |= Diff.ROTATIONOFFSET; | ||
139 | |||
140 | |||
141 | // MISC COMPARISONS (LLUUID, Byte) | ||
142 | if(first.ClickAction != second.ClickAction) | ||
143 | result |= Diff.CLICKACTION; | ||
144 | if(first.ObjectOwner != second.ObjectOwner) | ||
145 | result |= Diff.OBJECTOWNER; | ||
146 | |||
147 | |||
148 | // STRING COMPARISONS | ||
149 | if(first.Description != second.Description) | ||
150 | result |= Diff.DESCRIPTION; | ||
151 | if(first.Material != second.Material) | ||
152 | result |= Diff.MATERIAL; | ||
153 | if(first.Name != second.Name) | ||
154 | result |= Diff.NAME; | ||
155 | if(first.SitName != second.SitName) | ||
156 | result |= Diff.SITNAME; | ||
157 | if(first.Text != second.Text) | ||
158 | result |= Diff.TEXT; | ||
159 | if(first.TouchName != second.TouchName) | ||
160 | result |= Diff.TOUCHNAME; | ||
161 | |||
162 | x.Stop(); | ||
163 | TimeToDiff += x.ElapsedMilliseconds; | ||
164 | //m_log.Info("[DIFFERENCES] Time spent diffing objects so far" + TimeToDiff); | ||
165 | |||
166 | return result; | ||
167 | } | ||
168 | } | ||
169 | } | ||