Some minor changes + krinkec's updates to ll* functions.

afrisby
Tedd Hansen 2007-08-20 10:58:51 +00:00
parent 1b826c2fdc
commit 33326c1a70
3 changed files with 68 additions and 11 deletions

View File

@ -160,7 +160,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
/// Increase "dead script" counter for an AppDomain /// Increase "dead script" counter for an AppDomain
/// </summary> /// </summary>
/// <param name="ad"></param> /// <param name="ad"></param>
[Obsolete("Needs fixing, needs a real purpose in life!!!")] //[Obsolete("Needs fixing, needs a real purpose in life!!!")]
public void StopScript(AppDomain ad) public void StopScript(AppDomain ad)
{ {
lock (FreeLock) lock (FreeLock)

View File

@ -41,7 +41,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
} }
//These are the implementations of the various ll-functions used by the LSL scripts. //These are the implementations of the various ll-functions used by the LSL scripts.
//starting out, we use the System.Math library for trig functions. - CFK 8-14-07 //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07
public double llSin(double f) { return (double)Math.Sin(f); } public double llSin(double f) { return (double)Math.Sin(f); }
public double llCos(double f) { return (double)Math.Cos(f); } public double llCos(double f) { return (double)Math.Cos(f); }
public double llTan(double f) { return (double)Math.Tan(f); } public double llTan(double f) { return (double)Math.Tan(f); }
@ -60,12 +60,71 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
} }
public int llFloor(double f) { return (int)Math.Floor(f); } public int llFloor(double f) { return (int)Math.Floor(f); }
public int llCeil(double f) { return (int)Math.Ceiling(f); } public int llCeil(double f) { return (int)Math.Ceiling(f); }
public int llRound(double f) { return (int)Math.Round(f, 1); } public int llRound(double f) { return (int)Math.Round(f, 3); }
public double llVecMag(LSL_Types.Vector3 v) { return 0; }
public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) { return new LSL_Types.Vector3(); } //This next group are vector operations involving squaring and square root. ckrinke
public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) { return 0; } public double llVecMag(LSL_Types.Vector3 v) { return (v.X*v.X + v.Y*v.Y + v.Z*v.Z); }
public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v)
public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) { return new LSL_Types.Quaternion(); } {
double mag = v.X * v.X + v.Y * v.Y + v.Z * v.Z;
LSL_Types.Vector3 nor = new LSL_Types.Vector3();
nor.X = v.X / mag; nor.Y = v.Y / mag; nor.Z = v.Z / mag;
return nor;
}
public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b)
{
double dx = a.X - b.X; double dy = a.Y - b.Y; double dz = a.Z - b.Z;
return Math.Sqrt(dx * dx + dy * dy + dz * dz);
}
//Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke
public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r)
{
//This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke
LSL_Types.Quaternion t = new LSL_Types.Quaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.R * r.R);
double m = (t.X + t.Y + t.Z + t.R);
if (m == 0) return new LSL_Types.Vector3();
double n = 2 * (r.Y * r.R + r.X * r.Z);
double p = m * m - n * n;
if (p > 0)
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)),
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)));
else if(n>0)
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));
else
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));
}
public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v)
{ //this comes from from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions but is incomplete as of 8/19/07
float err = 0.00001f;
double ax = Math.Sin(v.X / 2); double aw = Math.Cos(v.X / 2);
double by = Math.Sin(v.Y / 2); double bw = Math.Cos(v.Y / 2);
double cz = Math.Sin(v.Z / 2); double cw = Math.Cos(v.Z / 2);
LSL_Types.Quaternion a1 = new LSL_Types.Quaternion(0.0, 0.0, cz, cw);
LSL_Types.Quaternion a2 = new LSL_Types.Quaternion(0.0, by, 0.0, bw);
LSL_Types.Quaternion a3 = new LSL_Types.Quaternion(ax, 0.0, 0.0, aw);
LSL_Types.Quaternion a = new LSL_Types.Quaternion();
//This multiplication doesnt compile, yet. a = a1 * a2 * a3;
LSL_Types.Quaternion b = new LSL_Types.Quaternion(ax * bw * cw + aw * by * cz,
aw * by * cw - ax * bw * cz, aw * bw * cz + ax * by * cw, aw * bw * cw - ax * by * cz);
LSL_Types.Quaternion c = new LSL_Types.Quaternion();
//This addition doesnt compile yet c = a + b;
LSL_Types.Quaternion d = new LSL_Types.Quaternion();
//This addition doesnt compile yet d = a - b;
if ((Math.Abs(c.X) > err && Math.Abs(d.X) > err) ||
(Math.Abs(c.Y) > err && Math.Abs(d.Y) > err) ||
(Math.Abs(c.Z) > err && Math.Abs(d.Z) > err) ||
(Math.Abs(c.R) > err && Math.Abs(d.R) > err))
{
//return a new Quaternion that is null until I figure this out
// return b;
// return a;
}
return new LSL_Types.Quaternion();
}
public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) { return new LSL_Types.Quaternion(); } public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) { return new LSL_Types.Quaternion(); }
public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); }
public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); } public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); }
@ -85,7 +144,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
//public void llSay(int channelID, string text) //public void llSay(int channelID, string text)
public void llSay(int channelID, string text) public void llSay(int channelID, string text)
{ {
//TODO: DO SOMETHING USEFUL HERE
//Common.SendToDebug("INTERNAL FUNCTION llSay(" + (int)channelID + ", \"" + (string)text + "\");"); //Common.SendToDebug("INTERNAL FUNCTION llSay(" + (int)channelID + ", \"" + (string)text + "\");");
//Console.WriteLine("llSay Channel " + channelID + ", Text: \"" + text + "\""); //Console.WriteLine("llSay Channel " + channelID + ", Text: \"" + text + "\"");
//type for say is 1 //type for say is 1
@ -436,7 +494,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
{ {
Int64 tmp = 0; Int64 tmp = 0;
Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp);
return Convert.ToInt32(tmp); return Convert.ToInt32(tmp);
} }

View File

@ -60,7 +60,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{ {
//Console.WriteLine("CurrentDomain_AssemblyResolve: " + args.Name); //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name);
return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null; return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null;
} }