diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API')
-rw-r--r-- | OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs | 75 |
1 files changed, 66 insertions, 9 deletions
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs index 8982bb6..03f9462 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs | |||
@@ -41,7 +41,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler | |||
41 | } | 41 | } |
42 | 42 | ||
43 | //These are the implementations of the various ll-functions used by the LSL scripts. | 43 | //These are the implementations of the various ll-functions used by the LSL scripts. |
44 | //starting out, we use the System.Math library for trig functions. - CFK 8-14-07 | 44 | //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07 |
45 | public double llSin(double f) { return (double)Math.Sin(f); } | 45 | public double llSin(double f) { return (double)Math.Sin(f); } |
46 | public double llCos(double f) { return (double)Math.Cos(f); } | 46 | public double llCos(double f) { return (double)Math.Cos(f); } |
47 | public double llTan(double f) { return (double)Math.Tan(f); } | 47 | public double llTan(double f) { return (double)Math.Tan(f); } |
@@ -60,12 +60,71 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler | |||
60 | } | 60 | } |
61 | public int llFloor(double f) { return (int)Math.Floor(f); } | 61 | public int llFloor(double f) { return (int)Math.Floor(f); } |
62 | public int llCeil(double f) { return (int)Math.Ceiling(f); } | 62 | public int llCeil(double f) { return (int)Math.Ceiling(f); } |
63 | public int llRound(double f) { return (int)Math.Round(f, 1); } | 63 | public int llRound(double f) { return (int)Math.Round(f, 3); } |
64 | public double llVecMag(LSL_Types.Vector3 v) { return 0; } | 64 | |
65 | public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) { return new LSL_Types.Vector3(); } | 65 | //This next group are vector operations involving squaring and square root. ckrinke |
66 | public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) { return 0; } | 66 | public double llVecMag(LSL_Types.Vector3 v) { return (v.X*v.X + v.Y*v.Y + v.Z*v.Z); } |
67 | public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } | 67 | public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) |
68 | public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) { return new LSL_Types.Quaternion(); } | 68 | { |
69 | double mag = v.X * v.X + v.Y * v.Y + v.Z * v.Z; | ||
70 | LSL_Types.Vector3 nor = new LSL_Types.Vector3(); | ||
71 | nor.X = v.X / mag; nor.Y = v.Y / mag; nor.Z = v.Z / mag; | ||
72 | return nor; | ||
73 | } | ||
74 | |||
75 | public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | ||
76 | { | ||
77 | double dx = a.X - b.X; double dy = a.Y - b.Y; double dz = a.Z - b.Z; | ||
78 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); | ||
79 | } | ||
80 | |||
81 | //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke | ||
82 | public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) | ||
83 | { | ||
84 | //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke | ||
85 | LSL_Types.Quaternion t = new LSL_Types.Quaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.R * r.R); | ||
86 | double m = (t.X + t.Y + t.Z + t.R); | ||
87 | if (m == 0) return new LSL_Types.Vector3(); | ||
88 | double n = 2 * (r.Y * r.R + r.X * r.Z); | ||
89 | double p = m * m - n * n; | ||
90 | if (p > 0) | ||
91 | return new LSL_Types.Vector3(Math.Atan2(2.0 * (r.X*r.R - r.Y*r.Z),(-t.X - t.Y + t.Z + t.R)), | ||
92 | Math.Atan2(n,Math.Sqrt(p)), Math.Atan2(2.0 * (r.Z*r.R - r.X*r.Y),( t.X - t.Y - t.Z + t.R))); | ||
93 | else if(n>0) | ||
94 | return new LSL_Types.Vector3( 0.0, Math.PI/2, Math.Atan2((r.Z*r.R + r.X*r.Y), 0.5 - t.X - t.Z)); | ||
95 | else | ||
96 | return new LSL_Types.Vector3( 0.0, -Math.PI/2, Math.Atan2((r.Z*r.R + r.X*r.Y), 0.5 - t.X - t.Z)); | ||
97 | } | ||
98 | |||
99 | public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) | ||
100 | { //this comes from from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions but is incomplete as of 8/19/07 | ||
101 | float err = 0.00001f; | ||
102 | double ax = Math.Sin(v.X / 2); double aw = Math.Cos(v.X / 2); | ||
103 | double by = Math.Sin(v.Y / 2); double bw = Math.Cos(v.Y / 2); | ||
104 | double cz = Math.Sin(v.Z / 2); double cw = Math.Cos(v.Z / 2); | ||
105 | LSL_Types.Quaternion a1 = new LSL_Types.Quaternion(0.0, 0.0, cz, cw); | ||
106 | LSL_Types.Quaternion a2 = new LSL_Types.Quaternion(0.0, by, 0.0, bw); | ||
107 | LSL_Types.Quaternion a3 = new LSL_Types.Quaternion(ax, 0.0, 0.0, aw); | ||
108 | LSL_Types.Quaternion a = new LSL_Types.Quaternion(); | ||
109 | //This multiplication doesnt compile, yet. a = a1 * a2 * a3; | ||
110 | LSL_Types.Quaternion b = new LSL_Types.Quaternion(ax * bw * cw + aw * by * cz, | ||
111 | aw * by * cw - ax * bw * cz, aw * bw * cz + ax * by * cw, aw * bw * cw - ax * by * cz); | ||
112 | LSL_Types.Quaternion c = new LSL_Types.Quaternion(); | ||
113 | //This addition doesnt compile yet c = a + b; | ||
114 | LSL_Types.Quaternion d = new LSL_Types.Quaternion(); | ||
115 | //This addition doesnt compile yet d = a - b; | ||
116 | if ((Math.Abs(c.X) > err && Math.Abs(d.X) > err) || | ||
117 | (Math.Abs(c.Y) > err && Math.Abs(d.Y) > err) || | ||
118 | (Math.Abs(c.Z) > err && Math.Abs(d.Z) > err) || | ||
119 | (Math.Abs(c.R) > err && Math.Abs(d.R) > err)) | ||
120 | { | ||
121 | //return a new Quaternion that is null until I figure this out | ||
122 | // return b; | ||
123 | // return a; | ||
124 | } | ||
125 | return new LSL_Types.Quaternion(); | ||
126 | } | ||
127 | |||
69 | public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) { return new LSL_Types.Quaternion(); } | 128 | public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) { return new LSL_Types.Quaternion(); } |
70 | public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } | 129 | public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } |
71 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } | 130 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } |
@@ -85,7 +144,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler | |||
85 | //public void llSay(int channelID, string text) | 144 | //public void llSay(int channelID, string text) |
86 | public void llSay(int channelID, string text) | 145 | public void llSay(int channelID, string text) |
87 | { | 146 | { |
88 | //TODO: DO SOMETHING USEFUL HERE | ||
89 | //Common.SendToDebug("INTERNAL FUNCTION llSay(" + (int)channelID + ", \"" + (string)text + "\");"); | 147 | //Common.SendToDebug("INTERNAL FUNCTION llSay(" + (int)channelID + ", \"" + (string)text + "\");"); |
90 | //Console.WriteLine("llSay Channel " + channelID + ", Text: \"" + text + "\""); | 148 | //Console.WriteLine("llSay Channel " + channelID + ", Text: \"" + text + "\""); |
91 | //type for say is 1 | 149 | //type for say is 1 |
@@ -436,7 +494,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler | |||
436 | { | 494 | { |
437 | Int64 tmp = 0; | 495 | Int64 tmp = 0; |
438 | Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); | 496 | Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); |
439 | |||
440 | return Convert.ToInt32(tmp); | 497 | return Convert.ToInt32(tmp); |
441 | } | 498 | } |
442 | 499 | ||