Merge branch 'master' into careminster
Conflicts: OpenSim/Region/ScriptEngine/XEngine/XEngine.csavinationmerge
commit
be4c8c4931
|
@ -140,6 +140,25 @@ public struct EntityProperties
|
||||||
public Vector3 Velocity;
|
public Vector3 Velocity;
|
||||||
public Vector3 Acceleration;
|
public Vector3 Acceleration;
|
||||||
public Vector3 RotationalVelocity;
|
public Vector3 RotationalVelocity;
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
StringBuilder buff = new StringBuilder();
|
||||||
|
buff.Append("<i=");
|
||||||
|
buff.Append(ID.ToString());
|
||||||
|
buff.Append(",p=");
|
||||||
|
buff.Append(Position.ToString());
|
||||||
|
buff.Append(",r=");
|
||||||
|
buff.Append(Rotation.ToString());
|
||||||
|
buff.Append(",v=");
|
||||||
|
buff.Append(Velocity.ToString());
|
||||||
|
buff.Append(",a=");
|
||||||
|
buff.Append(Acceleration.ToString());
|
||||||
|
buff.Append(",rv=");
|
||||||
|
buff.Append(RotationalVelocity.ToString());
|
||||||
|
buff.Append(">");
|
||||||
|
return buff.ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format of this structure must match the definition in the C++ code
|
// Format of this structure must match the definition in the C++ code
|
||||||
|
|
|
@ -690,7 +690,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// Bullet does a bunch of smoothing for changing parameters.
|
// Bullet does a bunch of smoothing for changing parameters.
|
||||||
// Since the vehicle is demanding this setting, we override Bullet's smoothing
|
// Since the vehicle is demanding this setting, we override Bullet's smoothing
|
||||||
// by telling Bullet the value was the same last time.
|
// by telling Bullet the value was the same last time.
|
||||||
PhysicsScene.PE.SetInterpolationLinearVelocity(Prim.PhysBody, m_knownVelocity);
|
// PhysicsScene.PE.SetInterpolationLinearVelocity(Prim.PhysBody, m_knownVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedForce) != 0)
|
if ((m_knownChanged & m_knownChangedForce) != 0)
|
||||||
|
@ -702,7 +702,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
|
if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
|
||||||
{
|
{
|
||||||
Prim.ForceRotationalVelocity = m_knownRotationalVelocity;
|
Prim.ForceRotationalVelocity = m_knownRotationalVelocity;
|
||||||
PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity);
|
// PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedRotationalImpulse) != 0)
|
if ((m_knownChanged & m_knownChangedRotationalImpulse) != 0)
|
||||||
|
@ -963,23 +963,23 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
{
|
{
|
||||||
// Step the motor from the current value. Get the correction needed this step.
|
// Step the motor from the current value. Get the correction needed this step.
|
||||||
Vector3 currentVel = VehicleVelocity * Quaternion.Inverse(VehicleOrientation);
|
Vector3 currentVel = VehicleVelocity * Quaternion.Inverse(VehicleOrientation);
|
||||||
Vector3 linearMotorCorrection = m_linearMotor.Step(pTimestep, currentVel);
|
Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVel);
|
||||||
|
|
||||||
// Motor is vehicle coordinates. Rotate it to world coordinates
|
// Motor is vehicle coordinates. Rotate it to world coordinates
|
||||||
Vector3 linearMotorVelocity = linearMotorCorrection * VehicleOrientation;
|
Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation;
|
||||||
|
|
||||||
// If we're a ground vehicle, don't add any upward Z movement
|
// If we're a ground vehicle, don't add any upward Z movement
|
||||||
if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0)
|
if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0)
|
||||||
{
|
{
|
||||||
if (linearMotorVelocity.Z > 0f)
|
if (linearMotorVelocityW.Z > 0f)
|
||||||
linearMotorVelocity.Z = 0f;
|
linearMotorVelocityW.Z = 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add this correction to the velocity to make it faster/slower.
|
// Add this correction to the velocity to make it faster/slower.
|
||||||
VehicleVelocity += linearMotorVelocity;
|
VehicleVelocity += linearMotorVelocityW;
|
||||||
|
|
||||||
VDetailLog("{0}, MoveLinear,velocity,vehVel={1},correction={2},force={3}",
|
VDetailLog("{0}, MoveLinear,velocity,vehVel={1},correction={2},force={3}",
|
||||||
Prim.LocalID, VehicleVelocity, linearMotorCorrection, linearMotorVelocity);
|
Prim.LocalID, VehicleVelocity, linearMotorCorrectionV, linearMotorVelocityW);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ComputeLinearTerrainHeightCorrection(float pTimestep)
|
public void ComputeLinearTerrainHeightCorrection(float pTimestep)
|
||||||
|
@ -1123,8 +1123,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// a downward raycast to find what is below.
|
// a downward raycast to find what is below.
|
||||||
public void ComputeLinearMotorUp(float pTimestep)
|
public void ComputeLinearMotorUp(float pTimestep)
|
||||||
{
|
{
|
||||||
Vector3 ret = Vector3.Zero;
|
|
||||||
|
|
||||||
if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
|
if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
|
||||||
{
|
{
|
||||||
// This code tries to decide if the object is not on the ground and then pushing down
|
// This code tries to decide if the object is not on the ground and then pushing down
|
||||||
|
@ -1250,8 +1248,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
private void ComputeAngularTurning(float pTimestep)
|
private void ComputeAngularTurning(float pTimestep)
|
||||||
{
|
{
|
||||||
// The user wants this many radians per second angular change?
|
// The user wants this many radians per second angular change?
|
||||||
Vector3 currentAngular = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation);
|
Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation);
|
||||||
Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep, currentAngular);
|
Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV);
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
// From http://wiki.secondlife.com/wiki/LlSetVehicleFlags :
|
// From http://wiki.secondlife.com/wiki/LlSetVehicleFlags :
|
||||||
|
@ -1263,12 +1261,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// is a linear effect. Where should this check go?
|
// is a linear effect. Where should this check go?
|
||||||
if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
|
if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
|
||||||
{
|
{
|
||||||
angularMotorContribution.X = 0f;
|
angularMotorContributionV.X = 0f;
|
||||||
angularMotorContribution.Y = 0f;
|
angularMotorContributionV.Y = 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
VehicleRotationalVelocity += angularMotorContribution * VehicleOrientation;
|
VehicleRotationalVelocity += angularMotorContributionV * VehicleOrientation;
|
||||||
VDetailLog("{0}, MoveAngular,angularTurning,angularMotorContrib={1}", Prim.LocalID, angularMotorContribution);
|
VDetailLog("{0}, MoveAngular,angularTurning,angularMotorContrib={1}", Prim.LocalID, angularMotorContributionV);
|
||||||
}
|
}
|
||||||
|
|
||||||
// From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial:
|
// From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial:
|
||||||
|
@ -1284,7 +1282,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// If vertical attaction timescale is reasonable
|
// If vertical attaction timescale is reasonable
|
||||||
if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
|
if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
|
||||||
{
|
{
|
||||||
Vector3 vertContribution = Vector3.Zero;
|
Vector3 vertContributionV = Vector3.Zero;
|
||||||
|
|
||||||
// Take a vector pointing up and convert it from world to vehicle relative coords.
|
// Take a vector pointing up and convert it from world to vehicle relative coords.
|
||||||
Vector3 verticalError = Vector3.UnitZ * VehicleOrientation;
|
Vector3 verticalError = Vector3.UnitZ * VehicleOrientation;
|
||||||
|
@ -1299,26 +1297,26 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
|
|
||||||
// Y error means needed rotation around X axis and visa versa.
|
// Y error means needed rotation around X axis and visa versa.
|
||||||
// Since the error goes from zero to one, the asin is the corresponding angle.
|
// Since the error goes from zero to one, the asin is the corresponding angle.
|
||||||
vertContribution.X = (float)Math.Asin(verticalError.Y);
|
vertContributionV.X = (float)Math.Asin(verticalError.Y);
|
||||||
// (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
|
// (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
|
||||||
vertContribution.Y = -(float)Math.Asin(verticalError.X);
|
vertContributionV.Y = -(float)Math.Asin(verticalError.X);
|
||||||
|
|
||||||
// If verticalError.Z is negative, the vehicle is upside down. Add additional push.
|
// If verticalError.Z is negative, the vehicle is upside down. Add additional push.
|
||||||
if (verticalError.Z < 0f)
|
if (verticalError.Z < 0f)
|
||||||
{
|
{
|
||||||
vertContribution.X += PIOverFour;
|
vertContributionV.X += PIOverFour;
|
||||||
// vertContribution.Y -= PIOverFour;
|
// vertContribution.Y -= PIOverFour;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 'vertContrbution' is now the necessary angular correction to correct tilt in one second.
|
// 'vertContrbution' is now the necessary angular correction to correct tilt in one second.
|
||||||
// Correction happens over a number of seconds.
|
// Correction happens over a number of seconds.
|
||||||
Vector3 unscaledContrib = vertContribution; // DEBUG DEBUG
|
Vector3 unscaledContrib = vertContributionV; // DEBUG DEBUG
|
||||||
vertContribution /= m_verticalAttractionTimescale;
|
vertContributionV /= m_verticalAttractionTimescale;
|
||||||
|
|
||||||
VehicleRotationalVelocity += vertContribution * VehicleOrientation;
|
VehicleRotationalVelocity += vertContributionV * VehicleOrientation;
|
||||||
|
|
||||||
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},ts={4},vertAttr={5}",
|
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},ts={4},vertAttr={5}",
|
||||||
Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, m_verticalAttractionTimescale, vertContribution);
|
Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, m_verticalAttractionTimescale, vertContributionV);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1336,7 +1334,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
|
|
||||||
if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2)
|
if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2)
|
||||||
{
|
{
|
||||||
Vector3 deflectContribution = Vector3.Zero;
|
Vector3 deflectContributionV = Vector3.Zero;
|
||||||
|
|
||||||
// The direction the vehicle is moving
|
// The direction the vehicle is moving
|
||||||
Vector3 movingDirection = VehicleVelocity;
|
Vector3 movingDirection = VehicleVelocity;
|
||||||
|
@ -1363,13 +1361,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
|
// ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
|
||||||
|
|
||||||
// Scale the correction by recovery timescale and efficiency
|
// Scale the correction by recovery timescale and efficiency
|
||||||
deflectContribution = (-deflectionError) * m_angularDeflectionEfficiency;
|
deflectContributionV = (-deflectionError) * m_angularDeflectionEfficiency;
|
||||||
deflectContribution /= m_angularDeflectionTimescale;
|
deflectContributionV /= m_angularDeflectionTimescale;
|
||||||
|
|
||||||
VehicleRotationalVelocity += deflectContribution * VehicleOrientation;
|
VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
|
||||||
|
|
||||||
VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
|
VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
|
||||||
Prim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContribution);
|
Prim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContributionV);
|
||||||
VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}",
|
VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}",
|
||||||
Prim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale);
|
Prim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale);
|
||||||
}
|
}
|
||||||
|
@ -1410,7 +1408,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
{
|
{
|
||||||
if (enableAngularBanking && m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
|
if (enableAngularBanking && m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
|
||||||
{
|
{
|
||||||
Vector3 bankingContribution = Vector3.Zero;
|
Vector3 bankingContributionV = Vector3.Zero;
|
||||||
|
|
||||||
// Rotate a UnitZ vector (pointing up) to how the vehicle is oriented.
|
// Rotate a UnitZ vector (pointing up) to how the vehicle is oriented.
|
||||||
// As the vehicle rolls to the right or left, the Y value will increase from
|
// As the vehicle rolls to the right or left, the Y value will increase from
|
||||||
|
@ -1428,15 +1426,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
mixedYawAngle = ClampInRange(-20f, mixedYawAngle, 20f);
|
mixedYawAngle = ClampInRange(-20f, mixedYawAngle, 20f);
|
||||||
|
|
||||||
// Build the force vector to change rotation from what it is to what it should be
|
// Build the force vector to change rotation from what it is to what it should be
|
||||||
bankingContribution.Z = -mixedYawAngle;
|
bankingContributionV.Z = -mixedYawAngle;
|
||||||
|
|
||||||
// Don't do it all at once.
|
// Don't do it all at once.
|
||||||
bankingContribution /= m_bankingTimescale;
|
bankingContributionV /= m_bankingTimescale;
|
||||||
|
|
||||||
VehicleRotationalVelocity += bankingContribution * VehicleOrientation;
|
VehicleRotationalVelocity += bankingContributionV * VehicleOrientation;
|
||||||
|
|
||||||
VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},rollComp={3},yAng={4},mYAng={5},ret={6}",
|
VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},rollComp={3},yAng={4},mYAng={5},ret={6}",
|
||||||
Prim.LocalID, rollComponents, VehicleForwardSpeed, rollComponents, yawAngle, mixedYawAngle, bankingContribution);
|
Prim.LocalID, rollComponents, VehicleForwardSpeed, rollComponents, yawAngle, mixedYawAngle, bankingContributionV);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -261,11 +261,6 @@ public abstract class BSLinkset
|
||||||
// Called at taint-time!!
|
// Called at taint-time!!
|
||||||
public abstract bool RemoveBodyDependencies(BSPrim child);
|
public abstract bool RemoveBodyDependencies(BSPrim child);
|
||||||
|
|
||||||
// Companion to RemoveBodyDependencies(). If RemoveBodyDependencies() returns 'true',
|
|
||||||
// this routine will restore the removed constraints.
|
|
||||||
// Called at taint-time!!
|
|
||||||
public abstract void RestoreBodyDependencies(BSPrim child);
|
|
||||||
|
|
||||||
// ================================================================
|
// ================================================================
|
||||||
protected virtual float ComputeLinksetMass()
|
protected virtual float ComputeLinksetMass()
|
||||||
{
|
{
|
||||||
|
|
|
@ -290,13 +290,6 @@ public sealed class BSLinksetCompound : BSLinkset
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Companion to RemoveBodyDependencies(). If RemoveBodyDependencies() returns 'true',
|
|
||||||
// this routine will restore the removed constraints.
|
|
||||||
// Called at taint-time!!
|
|
||||||
public override void RestoreBodyDependencies(BSPrim child)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// When the linkset is built, the child shape is added to the compound shape relative to the
|
// When the linkset is built, the child shape is added to the compound shape relative to the
|
||||||
// root shape. The linkset then moves around but this does not move the actual child
|
// root shape. The linkset then moves around but this does not move the actual child
|
||||||
// prim. The child prim's location must be recomputed based on the location of the root shape.
|
// prim. The child prim's location must be recomputed based on the location of the root shape.
|
||||||
|
@ -384,7 +377,7 @@ public sealed class BSLinksetCompound : BSLinkset
|
||||||
// Constraint linksets are rebuilt every time.
|
// Constraint linksets are rebuilt every time.
|
||||||
// Note that this works for rebuilding just the root after a linkset is taken apart.
|
// Note that this works for rebuilding just the root after a linkset is taken apart.
|
||||||
// Called at taint time!!
|
// Called at taint time!!
|
||||||
private bool disableCOM = true; // disable until we get this debugged
|
private bool disableCOM = false; // disable until we get this debugged
|
||||||
private void RecomputeLinksetCompound()
|
private void RecomputeLinksetCompound()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -407,12 +400,16 @@ public sealed class BSLinksetCompound : BSLinkset
|
||||||
} // DEBUG DEBUG
|
} // DEBUG DEBUG
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
centerOfMass = ComputeLinksetGeometricCenter();
|
centerOfMass = ComputeLinksetCenterOfMass();
|
||||||
centerDisplacement = centerOfMass - LinksetRoot.RawPosition;
|
// 'centerDisplacement' is the value to *add* to all the shape offsets
|
||||||
|
centerDisplacement = LinksetRoot.RawPosition - centerOfMass;
|
||||||
|
|
||||||
// Since we're displacing the center of the shape, we need to move the body in the world
|
// Since we're displacing the center of the shape, we need to move the body in the world
|
||||||
LinksetRoot.PositionDisplacement = centerDisplacement;
|
LinksetRoot.PositionDisplacement = centerDisplacement;
|
||||||
|
|
||||||
|
// This causes the root prim position to be set properly based on the new PositionDisplacement
|
||||||
|
LinksetRoot.ForcePosition = LinksetRoot.RawPosition;
|
||||||
|
// Update the local transform for the root child shape so it is offset from the <0,0,0> which is COM
|
||||||
PhysicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape, 0, -centerDisplacement, OMV.Quaternion.Identity, false);
|
PhysicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape, 0, -centerDisplacement, OMV.Quaternion.Identity, false);
|
||||||
DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,com={1},rootPos={2},centerDisp={3}",
|
DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,com={1},rootPos={2},centerDisp={3}",
|
||||||
LinksetRoot.LocalID, centerOfMass, LinksetRoot.RawPosition, centerDisplacement);
|
LinksetRoot.LocalID, centerOfMass, LinksetRoot.RawPosition, centerDisplacement);
|
||||||
|
@ -444,7 +441,7 @@ public sealed class BSLinksetCompound : BSLinkset
|
||||||
|
|
||||||
if (cPrim.PhysShape.isNativeShape)
|
if (cPrim.PhysShape.isNativeShape)
|
||||||
{
|
{
|
||||||
// A native shape is turning into a hull collision shape because native
|
// A native shape is turned into a hull collision shape because native
|
||||||
// shapes are not shared so we have to hullify it so it will be tracked
|
// shapes are not shared so we have to hullify it so it will be tracked
|
||||||
// and freed at the correct time. This also solves the scaling problem
|
// and freed at the correct time. This also solves the scaling problem
|
||||||
// (native shapes scaled but hull/meshes are assumed to not be).
|
// (native shapes scaled but hull/meshes are assumed to not be).
|
||||||
|
|
|
@ -110,14 +110,6 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Companion to RemoveBodyDependencies(). If RemoveBodyDependencies() returns 'true',
|
|
||||||
// this routine will restore the removed constraints.
|
|
||||||
// Called at taint-time!!
|
|
||||||
public override void RestoreBodyDependencies(BSPrim child)
|
|
||||||
{
|
|
||||||
// The Refresh operation queued by RemoveBodyDependencies() will build any missing constraints.
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================================================================
|
// ================================================================
|
||||||
|
|
||||||
// Add a new child to the linkset.
|
// Add a new child to the linkset.
|
||||||
|
|
|
@ -645,11 +645,8 @@ public static class BSParam
|
||||||
entries.Add(new PhysParameterEntry(pd.name, pd.desc));
|
entries.Add(new PhysParameterEntry(pd.name, pd.desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
// make the list in alphabetical order for estetic reasons
|
// make the list alphabetical for estetic reasons
|
||||||
entries.Sort(delegate(PhysParameterEntry ppe1, PhysParameterEntry ppe2)
|
entries.Sort((ppe1, ppe2) => { return ppe1.name.CompareTo(ppe2.name); });
|
||||||
{
|
|
||||||
return ppe1.name.CompareTo(ppe2.name);
|
|
||||||
});
|
|
||||||
|
|
||||||
SettableParameters = entries.ToArray();
|
SettableParameters = entries.ToArray();
|
||||||
}
|
}
|
||||||
|
|
|
@ -322,6 +322,7 @@ public sealed class BSPrim : BSPhysObject
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override OMV.Vector3 ForcePosition {
|
public override OMV.Vector3 ForcePosition {
|
||||||
get {
|
get {
|
||||||
_position = PhysicsScene.PE.GetPosition(PhysBody) - PositionDisplacement;
|
_position = PhysicsScene.PE.GetPosition(PhysBody) - PositionDisplacement;
|
||||||
|
@ -336,25 +337,6 @@ public sealed class BSPrim : BSPhysObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Override to have position displacement immediately update the physical position.
|
|
||||||
// A feeble attempt to keep the sim and physical positions in sync
|
|
||||||
// Must be called at taint time.
|
|
||||||
public override OMV.Vector3 PositionDisplacement
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return base.PositionDisplacement;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
base.PositionDisplacement = value;
|
|
||||||
PhysicsScene.TaintedObject(PhysicsScene.InTaintTime, "BSPrim.setPosition", delegate()
|
|
||||||
{
|
|
||||||
if (PhysBody.HasPhysicalBody)
|
|
||||||
PhysicsScene.PE.SetTranslation(PhysBody, _position + base.PositionDisplacement, _orientation);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check that the current position is sane and, if not, modify the position to make it so.
|
// Check that the current position is sane and, if not, modify the position to make it so.
|
||||||
// Check for being below terrain and being out of bounds.
|
// Check for being below terrain and being out of bounds.
|
||||||
|
@ -371,11 +353,11 @@ public sealed class BSPrim : BSPhysObject
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(_position);
|
float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition);
|
||||||
OMV.Vector3 upForce = OMV.Vector3.Zero;
|
OMV.Vector3 upForce = OMV.Vector3.Zero;
|
||||||
if (RawPosition.Z < terrainHeight)
|
if (RawPosition.Z < terrainHeight)
|
||||||
{
|
{
|
||||||
DetailLog("{0},BSPrim.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight);
|
DetailLog("{0},BSPrim.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, RawPosition, terrainHeight);
|
||||||
float targetHeight = terrainHeight + (Size.Z / 2f);
|
float targetHeight = terrainHeight + (Size.Z / 2f);
|
||||||
// If the object is below ground it just has to be moved up because pushing will
|
// If the object is below ground it just has to be moved up because pushing will
|
||||||
// not get it through the terrain
|
// not get it through the terrain
|
||||||
|
@ -1606,11 +1588,6 @@ public sealed class BSPrim : BSPhysObject
|
||||||
// Called at taint-time!!!
|
// Called at taint-time!!!
|
||||||
public void CreateGeomAndObject(bool forceRebuild)
|
public void CreateGeomAndObject(bool forceRebuild)
|
||||||
{
|
{
|
||||||
// If this prim is part of a linkset, we must remove and restore the physical
|
|
||||||
// links if the body is rebuilt.
|
|
||||||
bool needToRestoreLinkset = false;
|
|
||||||
bool needToRestoreVehicle = false;
|
|
||||||
|
|
||||||
// Create the correct physical representation for this type of object.
|
// Create the correct physical representation for this type of object.
|
||||||
// Updates PhysBody and PhysShape with the new information.
|
// Updates PhysBody and PhysShape with the new information.
|
||||||
// Ignore 'forceRebuild'. This routine makes the right choices and changes of necessary.
|
// Ignore 'forceRebuild'. This routine makes the right choices and changes of necessary.
|
||||||
|
@ -1619,21 +1596,10 @@ public sealed class BSPrim : BSPhysObject
|
||||||
// Called if the current prim body is about to be destroyed.
|
// Called if the current prim body is about to be destroyed.
|
||||||
// Remove all the physical dependencies on the old body.
|
// Remove all the physical dependencies on the old body.
|
||||||
// (Maybe someday make the changing of BSShape an event to be subscribed to by BSLinkset, ...)
|
// (Maybe someday make the changing of BSShape an event to be subscribed to by BSLinkset, ...)
|
||||||
needToRestoreLinkset = Linkset.RemoveBodyDependencies(this);
|
Linkset.RemoveBodyDependencies(this);
|
||||||
needToRestoreVehicle = _vehicle.RemoveBodyDependencies(this);
|
_vehicle.RemoveBodyDependencies(this);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (needToRestoreLinkset)
|
|
||||||
{
|
|
||||||
// If physical body dependencies were removed, restore them
|
|
||||||
Linkset.RestoreBodyDependencies(this);
|
|
||||||
}
|
|
||||||
if (needToRestoreVehicle)
|
|
||||||
{
|
|
||||||
// If physical body dependencies were removed, restore them
|
|
||||||
_vehicle.RestoreBodyDependencies(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure the properties are set on the new object
|
// Make sure the properties are set on the new object
|
||||||
UpdatePhysicalParameters();
|
UpdatePhysicalParameters();
|
||||||
return;
|
return;
|
||||||
|
@ -1653,14 +1619,25 @@ public sealed class BSPrim : BSPhysObject
|
||||||
// entprop.RotationalVelocity = OMV.Vector3.Zero;
|
// entprop.RotationalVelocity = OMV.Vector3.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG
|
||||||
|
|
||||||
|
// Undo any center-of-mass displacement that might have been done.
|
||||||
|
if (PositionDisplacement != OMV.Vector3.Zero)
|
||||||
|
{
|
||||||
|
// Correct for any rotation around the center-of-mass
|
||||||
|
// TODO!!!
|
||||||
|
entprop.Position -= PositionDisplacement;
|
||||||
|
}
|
||||||
|
|
||||||
// Assign directly to the local variables so the normal set actions do not happen
|
// Assign directly to the local variables so the normal set actions do not happen
|
||||||
entprop.Position -= PositionDisplacement;
|
|
||||||
_position = entprop.Position;
|
_position = entprop.Position;
|
||||||
_orientation = entprop.Rotation;
|
_orientation = entprop.Rotation;
|
||||||
_velocity = entprop.Velocity;
|
_velocity = entprop.Velocity;
|
||||||
_acceleration = entprop.Acceleration;
|
_acceleration = entprop.Acceleration;
|
||||||
_rotationalVelocity = entprop.RotationalVelocity;
|
_rotationalVelocity = entprop.RotationalVelocity;
|
||||||
|
|
||||||
|
// DetailLog("{0},BSPrim.UpdateProperties,afterAssign,entprop={1}", LocalID, entprop); // DEBUG DEBUG
|
||||||
|
|
||||||
// The sanity check can change the velocity and/or position.
|
// The sanity check can change the velocity and/or position.
|
||||||
if (IsPhysical && PositionSanityCheck(true))
|
if (IsPhysical && PositionSanityCheck(true))
|
||||||
{
|
{
|
||||||
|
@ -1669,8 +1646,7 @@ public sealed class BSPrim : BSPhysObject
|
||||||
}
|
}
|
||||||
|
|
||||||
OMV.Vector3 direction = OMV.Vector3.UnitX * _orientation; // DEBUG DEBUG DEBUG
|
OMV.Vector3 direction = OMV.Vector3.UnitX * _orientation; // DEBUG DEBUG DEBUG
|
||||||
DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},dir={3},vel={4},rotVel={5}",
|
DetailLog("{0},BSPrim.UpdateProperties,call,entProp={1},dir={2}", LocalID, entprop, direction);
|
||||||
LocalID, _position, _orientation, direction, _velocity, _rotationalVelocity);
|
|
||||||
|
|
||||||
// remember the current and last set values
|
// remember the current and last set values
|
||||||
LastEntityProperties = CurrentEntityProperties;
|
LastEntityProperties = CurrentEntityProperties;
|
||||||
|
|
|
@ -708,8 +708,8 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
// TriggerPreStepEvent
|
// TriggerPreStepEvent
|
||||||
// DoOneTimeTaints
|
// DoOneTimeTaints
|
||||||
// Step()
|
// Step()
|
||||||
// ProcessAndForwardCollisions
|
// ProcessAndSendToSimulatorCollisions
|
||||||
// ProcessAndForwardPropertyUpdates
|
// ProcessAndSendToSimulatorPropertyUpdates
|
||||||
// TriggerPostStepEvent
|
// TriggerPostStepEvent
|
||||||
|
|
||||||
// Calls to the PhysicsActors can't directly call into the physics engine
|
// Calls to the PhysicsActors can't directly call into the physics engine
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
CURRENT PRIORITIES
|
CURRENT PRIORITIES
|
||||||
=================================================
|
=================================================
|
||||||
|
Deleting a linkset while standing on the root will leave the physical shape of the root behind.
|
||||||
|
Not sure if it is because standing on it. Done with large prim linksets.
|
||||||
Child movement in linkset (don't rebuild linkset)
|
Child movement in linkset (don't rebuild linkset)
|
||||||
Vehicle angular vertical attraction
|
Vehicle angular vertical attraction
|
||||||
vehicle angular banking
|
vehicle angular banking
|
||||||
|
|
|
@ -46,6 +46,6 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
|
||||||
/// <param name='item'>/param>
|
/// <param name='item'>/param>
|
||||||
/// <param name='coopSleepHandle'>/param>
|
/// <param name='coopSleepHandle'>/param>
|
||||||
void Initialize(
|
void Initialize(
|
||||||
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, EventWaitHandle coopSleepHandle);
|
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,16 +25,17 @@
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using log4net;
|
|
||||||
using System;
|
using System;
|
||||||
using OpenSim.Region.ScriptEngine.Shared;
|
using System.Reflection;
|
||||||
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenMetaverse;
|
|
||||||
using Nini.Config;
|
|
||||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||||
|
using OpenSim.Region.ScriptEngine.Shared;
|
||||||
using Amib.Threading;
|
using Amib.Threading;
|
||||||
using OpenSim.Framework;
|
using log4net;
|
||||||
|
using Nini.Config;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Interfaces
|
namespace OpenSim.Region.ScriptEngine.Interfaces
|
||||||
{
|
{
|
||||||
|
@ -76,6 +77,38 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
|
||||||
IConfigSource ConfigSource { get; }
|
IConfigSource ConfigSource { get; }
|
||||||
string ScriptEngineName { get; }
|
string ScriptEngineName { get; }
|
||||||
string ScriptEnginePath { get; }
|
string ScriptEnginePath { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the name of the class that will be used for all running scripts.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Each class goes in its own assembly so we don't need to otherwise distinguish the class name.
|
||||||
|
/// </remarks>
|
||||||
|
string ScriptClassName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the name of the base class that will be used for all running scripts.
|
||||||
|
/// </summary>
|
||||||
|
string ScriptBaseClassName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assemblies that need to be referenced when compiling scripts.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// These are currently additional to those always referenced by the compiler, BUT THIS MAY CHANGE IN THE
|
||||||
|
/// FUTURE.
|
||||||
|
/// This can be null if there are no additional assemblies.
|
||||||
|
/// </remarks>
|
||||||
|
string[] ScriptReferencedAssemblies { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parameters for the generated script's constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Can be null if there are no parameters
|
||||||
|
/// </remarks>
|
||||||
|
ParameterInfo[] ScriptBaseClassParameters { get; }
|
||||||
|
|
||||||
IScriptApi GetApi(UUID itemID, string name);
|
IScriptApi GetApi(UUID itemID, string name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
internal TaskInventoryItem m_item;
|
internal TaskInventoryItem m_item;
|
||||||
internal bool m_CMFunctionsEnabled = false;
|
internal bool m_CMFunctionsEnabled = false;
|
||||||
|
|
||||||
public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item, EventWaitHandle coopSleepHandle)
|
public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
|
||||||
{
|
{
|
||||||
m_ScriptEngine = ScriptEngine;
|
m_ScriptEngine = ScriptEngine;
|
||||||
m_host = host;
|
m_host = host;
|
||||||
|
|
|
@ -95,7 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
/// Used for script sleeps when we are using co-operative script termination.
|
/// Used for script sleeps when we are using co-operative script termination.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>null if co-operative script termination is not active</remarks>
|
/// <remarks>null if co-operative script termination is not active</remarks>
|
||||||
EventWaitHandle m_coopSleepHandle;
|
WaitHandle m_coopSleepHandle;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The item that hosts this script
|
/// The item that hosts this script
|
||||||
|
@ -150,7 +150,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
};
|
};
|
||||||
|
|
||||||
public void Initialize(
|
public void Initialize(
|
||||||
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, EventWaitHandle coopSleepHandle)
|
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
|
||||||
{
|
{
|
||||||
m_lastSayShoutCheck = DateTime.UtcNow;
|
m_lastSayShoutCheck = DateTime.UtcNow;
|
||||||
|
|
||||||
|
@ -227,7 +227,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
if (m_coopSleepHandle == null)
|
if (m_coopSleepHandle == null)
|
||||||
System.Threading.Thread.Sleep(delay);
|
System.Threading.Thread.Sleep(delay);
|
||||||
else if (m_coopSleepHandle.WaitOne(delay))
|
else
|
||||||
|
CheckForCoopTermination(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check for co-operative termination.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name='delay'>If called with 0, then just the check is performed with no wait.</param>
|
||||||
|
protected virtual void CheckForCoopTermination(int delay)
|
||||||
|
{
|
||||||
|
if (m_coopSleepHandle.WaitOne(delay))
|
||||||
throw new ScriptCoopStopException();
|
throw new ScriptCoopStopException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
internal IScriptModuleComms m_comms = null;
|
internal IScriptModuleComms m_comms = null;
|
||||||
|
|
||||||
public void Initialize(
|
public void Initialize(
|
||||||
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, EventWaitHandle coopSleepHandle)
|
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
|
||||||
{
|
{
|
||||||
m_ScriptEngine = scriptEngine;
|
m_ScriptEngine = scriptEngine;
|
||||||
m_host = host;
|
m_host = host;
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
internal IScriptModuleComms m_comms = null;
|
internal IScriptModuleComms m_comms = null;
|
||||||
|
|
||||||
public void Initialize(
|
public void Initialize(
|
||||||
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, EventWaitHandle coopSleepHandle)
|
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
|
||||||
{
|
{
|
||||||
m_ScriptEngine = scriptEngine;
|
m_ScriptEngine = scriptEngine;
|
||||||
m_host = host;
|
m_host = host;
|
||||||
|
|
|
@ -144,7 +144,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
protected IUrlModule m_UrlModule = null;
|
protected IUrlModule m_UrlModule = null;
|
||||||
|
|
||||||
public void Initialize(
|
public void Initialize(
|
||||||
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, EventWaitHandle coopSleepHandle)
|
IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
|
||||||
{
|
{
|
||||||
m_ScriptEngine = scriptEngine;
|
m_ScriptEngine = scriptEngine;
|
||||||
m_host = host;
|
m_host = host;
|
||||||
|
|
|
@ -49,6 +49,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
private List<string> m_warnings = new List<string>();
|
private List<string> m_warnings = new List<string>();
|
||||||
private IScriptModuleComms m_comms = null;
|
private IScriptModuleComms m_comms = null;
|
||||||
|
|
||||||
|
private bool m_insertCoopTerminationChecks;
|
||||||
|
private static string m_coopTerminationCheck = "opensim_reserved_CheckForCoopTermination();";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Keep a record of the previous node when we do the parsing.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// We do this here because the parser generated by CSTools does not retain a reference to its parent node.
|
||||||
|
/// The previous node is required so we can correctly insert co-op termination checks when required.
|
||||||
|
/// </remarks>
|
||||||
|
// private SYMBOL m_previousNode;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates an 'empty' CSCodeGenerator instance.
|
/// Creates an 'empty' CSCodeGenerator instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -58,9 +70,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
ResetCounters();
|
ResetCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CSCodeGenerator(IScriptModuleComms comms)
|
public CSCodeGenerator(IScriptModuleComms comms, bool insertCoopTerminationChecks)
|
||||||
{
|
{
|
||||||
m_comms = comms;
|
m_comms = comms;
|
||||||
|
m_insertCoopTerminationChecks = insertCoopTerminationChecks;
|
||||||
ResetCounters();
|
ResetCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,7 +168,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
// here's the payload
|
// here's the payload
|
||||||
retstr += GenerateLine();
|
retstr += GenerateLine();
|
||||||
foreach (SYMBOL s in m_astRoot.kids)
|
foreach (SYMBOL s in m_astRoot.kids)
|
||||||
retstr += GenerateNode(s);
|
retstr += GenerateNode(m_astRoot, s);
|
||||||
|
|
||||||
// close braces!
|
// close braces!
|
||||||
m_braceCount--;
|
m_braceCount--;
|
||||||
|
@ -165,7 +178,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
|
|
||||||
// Removes all carriage return characters which may be generated in Windows platform. Is there
|
// Removes all carriage return characters which may be generated in Windows platform. Is there
|
||||||
// cleaner way of doing this?
|
// cleaner way of doing this?
|
||||||
retstr=retstr.Replace("\r", "");
|
retstr = retstr.Replace("\r", "");
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
}
|
}
|
||||||
|
@ -191,9 +204,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
/// Recursively called to generate each type of node. Will generate this
|
/// Recursively called to generate each type of node. Will generate this
|
||||||
/// node, then all it's children.
|
/// node, then all it's children.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="previousSymbol">The parent node.</param>
|
||||||
/// <param name="s">The current node to generate code for.</param>
|
/// <param name="s">The current node to generate code for.</param>
|
||||||
/// <returns>String containing C# code for SYMBOL s.</returns>
|
/// <returns>String containing C# code for SYMBOL s.</returns>
|
||||||
private string GenerateNode(SYMBOL s)
|
private string GenerateNode(SYMBOL previousSymbol, SYMBOL s)
|
||||||
{
|
{
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
|
@ -207,11 +221,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
else if (s is State)
|
else if (s is State)
|
||||||
retstr += GenerateState((State) s);
|
retstr += GenerateState((State) s);
|
||||||
else if (s is CompoundStatement)
|
else if (s is CompoundStatement)
|
||||||
retstr += GenerateCompoundStatement((CompoundStatement) s);
|
retstr += GenerateCompoundStatement(previousSymbol, (CompoundStatement) s);
|
||||||
else if (s is Declaration)
|
else if (s is Declaration)
|
||||||
retstr += GenerateDeclaration((Declaration) s);
|
retstr += GenerateDeclaration((Declaration) s);
|
||||||
else if (s is Statement)
|
else if (s is Statement)
|
||||||
retstr += GenerateStatement((Statement) s);
|
retstr += GenerateStatement(previousSymbol, (Statement) s);
|
||||||
else if (s is ReturnStatement)
|
else if (s is ReturnStatement)
|
||||||
retstr += GenerateReturnStatement((ReturnStatement) s);
|
retstr += GenerateReturnStatement((ReturnStatement) s);
|
||||||
else if (s is JumpLabel)
|
else if (s is JumpLabel)
|
||||||
|
@ -261,7 +275,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach (SYMBOL kid in s.kids)
|
foreach (SYMBOL kid in s.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(s, kid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -295,7 +309,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
retstr += GenerateLine(")");
|
retstr += GenerateLine(")");
|
||||||
|
|
||||||
foreach (SYMBOL kid in remainingKids)
|
foreach (SYMBOL kid in remainingKids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(gf, kid);
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
}
|
}
|
||||||
|
@ -312,7 +326,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
foreach (SYMBOL s in gv.kids)
|
foreach (SYMBOL s in gv.kids)
|
||||||
{
|
{
|
||||||
retstr += Indent();
|
retstr += Indent();
|
||||||
retstr += GenerateNode(s);
|
retstr += GenerateNode(gv, s);
|
||||||
retstr += GenerateLine(";");
|
retstr += GenerateLine(";");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,7 +379,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
retstr += GenerateLine(")");
|
retstr += GenerateLine(")");
|
||||||
|
|
||||||
foreach (SYMBOL kid in remainingKids)
|
foreach (SYMBOL kid in remainingKids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(se, kid);
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
}
|
}
|
||||||
|
@ -404,7 +418,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
|
|
||||||
foreach (SYMBOL s in al.kids)
|
foreach (SYMBOL s in al.kids)
|
||||||
{
|
{
|
||||||
retstr += GenerateNode(s);
|
retstr += GenerateNode(al, s);
|
||||||
if (0 < comma--)
|
if (0 < comma--)
|
||||||
retstr += Generate(", ");
|
retstr += Generate(", ");
|
||||||
}
|
}
|
||||||
|
@ -417,7 +431,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="cs">The CompoundStatement node.</param>
|
/// <param name="cs">The CompoundStatement node.</param>
|
||||||
/// <returns>String containing C# code for CompoundStatement cs.</returns>
|
/// <returns>String containing C# code for CompoundStatement cs.</returns>
|
||||||
private string GenerateCompoundStatement(CompoundStatement cs)
|
private string GenerateCompoundStatement(SYMBOL previousSymbol, CompoundStatement cs)
|
||||||
{
|
{
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
|
@ -425,8 +439,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
retstr += GenerateIndentedLine("{");
|
retstr += GenerateIndentedLine("{");
|
||||||
m_braceCount++;
|
m_braceCount++;
|
||||||
|
|
||||||
|
if (m_insertCoopTerminationChecks)
|
||||||
|
{
|
||||||
|
// We have to check in event functions as well because the user can manually call these.
|
||||||
|
if (previousSymbol is GlobalFunctionDefinition
|
||||||
|
|| previousSymbol is WhileStatement
|
||||||
|
|| previousSymbol is DoWhileStatement
|
||||||
|
|| previousSymbol is ForLoop
|
||||||
|
|| previousSymbol is StateEvent)
|
||||||
|
retstr += GenerateIndentedLine(m_coopTerminationCheck);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (SYMBOL kid in cs.kids)
|
foreach (SYMBOL kid in cs.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(cs, kid);
|
||||||
|
|
||||||
// closing brace
|
// closing brace
|
||||||
m_braceCount--;
|
m_braceCount--;
|
||||||
|
@ -450,13 +475,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="s">The Statement node.</param>
|
/// <param name="s">The Statement node.</param>
|
||||||
/// <returns>String containing C# code for Statement s.</returns>
|
/// <returns>String containing C# code for Statement s.</returns>
|
||||||
private string GenerateStatement(Statement s)
|
private string GenerateStatement(SYMBOL previousSymbol, Statement s)
|
||||||
{
|
{
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
bool printSemicolon = true;
|
bool printSemicolon = true;
|
||||||
|
|
||||||
retstr += Indent();
|
retstr += Indent();
|
||||||
|
|
||||||
|
if (m_insertCoopTerminationChecks)
|
||||||
|
{
|
||||||
|
// We have to check in event functions as well because the user can manually call these.
|
||||||
|
if (previousSymbol is GlobalFunctionDefinition
|
||||||
|
|| previousSymbol is WhileStatement
|
||||||
|
|| previousSymbol is DoWhileStatement
|
||||||
|
|| previousSymbol is ForLoop
|
||||||
|
|| previousSymbol is StateEvent)
|
||||||
|
retstr += Generate(m_coopTerminationCheck);
|
||||||
|
}
|
||||||
|
|
||||||
if (0 < s.kids.Count)
|
if (0 < s.kids.Count)
|
||||||
{
|
{
|
||||||
// Jump label prints its own colon, we don't need a semicolon.
|
// Jump label prints its own colon, we don't need a semicolon.
|
||||||
|
@ -466,7 +502,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
// (MONO) error.
|
// (MONO) error.
|
||||||
if (!(s.kids.Top is IdentExpression && 1 == s.kids.Count))
|
if (!(s.kids.Top is IdentExpression && 1 == s.kids.Count))
|
||||||
foreach (SYMBOL kid in s.kids)
|
foreach (SYMBOL kid in s.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(s, kid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (printSemicolon)
|
if (printSemicolon)
|
||||||
|
@ -487,10 +523,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
List<string> identifiers = new List<string>();
|
List<string> identifiers = new List<string>();
|
||||||
checkForMultipleAssignments(identifiers, a);
|
checkForMultipleAssignments(identifiers, a);
|
||||||
|
|
||||||
retstr += GenerateNode((SYMBOL) a.kids.Pop());
|
retstr += GenerateNode(a, (SYMBOL) a.kids.Pop());
|
||||||
retstr += Generate(String.Format(" {0} ", a.AssignmentType), a);
|
retstr += Generate(String.Format(" {0} ", a.AssignmentType), a);
|
||||||
foreach (SYMBOL kid in a.kids)
|
foreach (SYMBOL kid in a.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(a, kid);
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
}
|
}
|
||||||
|
@ -563,7 +599,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
retstr += Generate("return ", rs);
|
retstr += Generate("return ", rs);
|
||||||
|
|
||||||
foreach (SYMBOL kid in rs.kids)
|
foreach (SYMBOL kid in rs.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(rs, kid);
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
}
|
}
|
||||||
|
@ -575,7 +611,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
/// <returns>String containing C# code for JumpLabel jl.</returns>
|
/// <returns>String containing C# code for JumpLabel jl.</returns>
|
||||||
private string GenerateJumpLabel(JumpLabel jl)
|
private string GenerateJumpLabel(JumpLabel jl)
|
||||||
{
|
{
|
||||||
return Generate(String.Format("{0}:", CheckName(jl.LabelName)), jl) + " NoOp();\n";
|
string labelStatement;
|
||||||
|
|
||||||
|
if (m_insertCoopTerminationChecks)
|
||||||
|
labelStatement = m_coopTerminationCheck + "\n";
|
||||||
|
else
|
||||||
|
labelStatement = "NoOp();\n";
|
||||||
|
|
||||||
|
return Generate(String.Format("{0}: ", CheckName(jl.LabelName)), jl) + labelStatement;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -598,14 +641,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
retstr += GenerateIndented("if (", ifs);
|
retstr += GenerateIndented("if (", ifs);
|
||||||
retstr += GenerateNode((SYMBOL) ifs.kids.Pop());
|
retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop());
|
||||||
retstr += GenerateLine(")");
|
retstr += GenerateLine(")");
|
||||||
|
|
||||||
// CompoundStatement handles indentation itself but we need to do it
|
// CompoundStatement handles indentation itself but we need to do it
|
||||||
// otherwise.
|
// otherwise.
|
||||||
bool indentHere = ifs.kids.Top is Statement;
|
bool indentHere = ifs.kids.Top is Statement;
|
||||||
if (indentHere) m_braceCount++;
|
if (indentHere) m_braceCount++;
|
||||||
retstr += GenerateNode((SYMBOL) ifs.kids.Pop());
|
retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop());
|
||||||
if (indentHere) m_braceCount--;
|
if (indentHere) m_braceCount--;
|
||||||
|
|
||||||
if (0 < ifs.kids.Count) // do it again for an else
|
if (0 < ifs.kids.Count) // do it again for an else
|
||||||
|
@ -614,7 +657,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
|
|
||||||
indentHere = ifs.kids.Top is Statement;
|
indentHere = ifs.kids.Top is Statement;
|
||||||
if (indentHere) m_braceCount++;
|
if (indentHere) m_braceCount++;
|
||||||
retstr += GenerateNode((SYMBOL) ifs.kids.Pop());
|
retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop());
|
||||||
if (indentHere) m_braceCount--;
|
if (indentHere) m_braceCount--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,14 +684,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
retstr += GenerateIndented("while (", ws);
|
retstr += GenerateIndented("while (", ws);
|
||||||
retstr += GenerateNode((SYMBOL) ws.kids.Pop());
|
retstr += GenerateNode(ws, (SYMBOL) ws.kids.Pop());
|
||||||
retstr += GenerateLine(")");
|
retstr += GenerateLine(")");
|
||||||
|
|
||||||
// CompoundStatement handles indentation itself but we need to do it
|
// CompoundStatement handles indentation itself but we need to do it
|
||||||
// otherwise.
|
// otherwise.
|
||||||
bool indentHere = ws.kids.Top is Statement;
|
bool indentHere = ws.kids.Top is Statement;
|
||||||
if (indentHere) m_braceCount++;
|
if (indentHere) m_braceCount++;
|
||||||
retstr += GenerateNode((SYMBOL) ws.kids.Pop());
|
retstr += GenerateNode(ws, (SYMBOL) ws.kids.Pop());
|
||||||
if (indentHere) m_braceCount--;
|
if (indentHere) m_braceCount--;
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -669,11 +712,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
// otherwise.
|
// otherwise.
|
||||||
bool indentHere = dws.kids.Top is Statement;
|
bool indentHere = dws.kids.Top is Statement;
|
||||||
if (indentHere) m_braceCount++;
|
if (indentHere) m_braceCount++;
|
||||||
retstr += GenerateNode((SYMBOL) dws.kids.Pop());
|
retstr += GenerateNode(dws, (SYMBOL) dws.kids.Pop());
|
||||||
if (indentHere) m_braceCount--;
|
if (indentHere) m_braceCount--;
|
||||||
|
|
||||||
retstr += GenerateIndented("while (", dws);
|
retstr += GenerateIndented("while (", dws);
|
||||||
retstr += GenerateNode((SYMBOL) dws.kids.Pop());
|
retstr += GenerateNode(dws, (SYMBOL) dws.kids.Pop());
|
||||||
retstr += GenerateLine(");");
|
retstr += GenerateLine(");");
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -702,7 +745,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
retstr += Generate("; ");
|
retstr += Generate("; ");
|
||||||
// for (x = 0; x < 10; x++)
|
// for (x = 0; x < 10; x++)
|
||||||
// ^^^^^^
|
// ^^^^^^
|
||||||
retstr += GenerateNode((SYMBOL) fl.kids.Pop());
|
retstr += GenerateNode(fl, (SYMBOL) fl.kids.Pop());
|
||||||
retstr += Generate("; ");
|
retstr += Generate("; ");
|
||||||
// for (x = 0; x < 10; x++)
|
// for (x = 0; x < 10; x++)
|
||||||
// ^^^
|
// ^^^
|
||||||
|
@ -713,7 +756,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
// otherwise.
|
// otherwise.
|
||||||
bool indentHere = fl.kids.Top is Statement;
|
bool indentHere = fl.kids.Top is Statement;
|
||||||
if (indentHere) m_braceCount++;
|
if (indentHere) m_braceCount++;
|
||||||
retstr += GenerateNode((SYMBOL) fl.kids.Pop());
|
retstr += GenerateNode(fl, (SYMBOL) fl.kids.Pop());
|
||||||
if (indentHere) m_braceCount--;
|
if (indentHere) m_braceCount--;
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -758,7 +801,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
while (s is ParenthesisExpression)
|
while (s is ParenthesisExpression)
|
||||||
s = (SYMBOL)s.kids.Pop();
|
s = (SYMBOL)s.kids.Pop();
|
||||||
|
|
||||||
retstr += GenerateNode(s);
|
retstr += GenerateNode(fls, s);
|
||||||
if (0 < comma--)
|
if (0 < comma--)
|
||||||
retstr += Generate(", ");
|
retstr += Generate(", ");
|
||||||
}
|
}
|
||||||
|
@ -779,20 +822,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
{
|
{
|
||||||
// special case handling for logical and/or, see Mantis 3174
|
// special case handling for logical and/or, see Mantis 3174
|
||||||
retstr += "((bool)(";
|
retstr += "((bool)(";
|
||||||
retstr += GenerateNode((SYMBOL)be.kids.Pop());
|
retstr += GenerateNode(be, (SYMBOL)be.kids.Pop());
|
||||||
retstr += "))";
|
retstr += "))";
|
||||||
retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol.Substring(0,1)), be);
|
retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol.Substring(0,1)), be);
|
||||||
retstr += "((bool)(";
|
retstr += "((bool)(";
|
||||||
foreach (SYMBOL kid in be.kids)
|
foreach (SYMBOL kid in be.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(be, kid);
|
||||||
retstr += "))";
|
retstr += "))";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
retstr += GenerateNode((SYMBOL)be.kids.Pop());
|
retstr += GenerateNode(be, (SYMBOL)be.kids.Pop());
|
||||||
retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol), be);
|
retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol), be);
|
||||||
foreach (SYMBOL kid in be.kids)
|
foreach (SYMBOL kid in be.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(be, kid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -808,7 +851,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
retstr += Generate(ue.UnarySymbol, ue);
|
retstr += Generate(ue.UnarySymbol, ue);
|
||||||
retstr += GenerateNode((SYMBOL) ue.kids.Pop());
|
retstr += GenerateNode(ue, (SYMBOL) ue.kids.Pop());
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
}
|
}
|
||||||
|
@ -824,7 +867,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
|
|
||||||
retstr += Generate("(");
|
retstr += Generate("(");
|
||||||
foreach (SYMBOL kid in pe.kids)
|
foreach (SYMBOL kid in pe.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(pe, kid);
|
||||||
retstr += Generate(")");
|
retstr += Generate(")");
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -861,7 +904,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
|
|
||||||
// we wrap all typecasted statements in parentheses
|
// we wrap all typecasted statements in parentheses
|
||||||
retstr += Generate(String.Format("({0}) (", te.TypecastType), te);
|
retstr += Generate(String.Format("({0}) (", te.TypecastType), te);
|
||||||
retstr += GenerateNode((SYMBOL) te.kids.Pop());
|
retstr += GenerateNode(te, (SYMBOL) te.kids.Pop());
|
||||||
retstr += Generate(")");
|
retstr += Generate(")");
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -931,7 +974,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (SYMBOL kid in fc.kids)
|
foreach (SYMBOL kid in fc.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(fc, kid);
|
||||||
|
|
||||||
retstr += Generate(")");
|
retstr += Generate(")");
|
||||||
|
|
||||||
|
@ -980,11 +1023,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
retstr += Generate(String.Format("new {0}(", vc.Type), vc);
|
retstr += Generate(String.Format("new {0}(", vc.Type), vc);
|
||||||
retstr += GenerateNode((SYMBOL) vc.kids.Pop());
|
retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop());
|
||||||
retstr += Generate(", ");
|
retstr += Generate(", ");
|
||||||
retstr += GenerateNode((SYMBOL) vc.kids.Pop());
|
retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop());
|
||||||
retstr += Generate(", ");
|
retstr += Generate(", ");
|
||||||
retstr += GenerateNode((SYMBOL) vc.kids.Pop());
|
retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop());
|
||||||
retstr += Generate(")");
|
retstr += Generate(")");
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -1000,13 +1043,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
string retstr = String.Empty;
|
string retstr = String.Empty;
|
||||||
|
|
||||||
retstr += Generate(String.Format("new {0}(", rc.Type), rc);
|
retstr += Generate(String.Format("new {0}(", rc.Type), rc);
|
||||||
retstr += GenerateNode((SYMBOL) rc.kids.Pop());
|
retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
|
||||||
retstr += Generate(", ");
|
retstr += Generate(", ");
|
||||||
retstr += GenerateNode((SYMBOL) rc.kids.Pop());
|
retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
|
||||||
retstr += Generate(", ");
|
retstr += Generate(", ");
|
||||||
retstr += GenerateNode((SYMBOL) rc.kids.Pop());
|
retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
|
||||||
retstr += Generate(", ");
|
retstr += Generate(", ");
|
||||||
retstr += GenerateNode((SYMBOL) rc.kids.Pop());
|
retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
|
||||||
retstr += Generate(")");
|
retstr += Generate(")");
|
||||||
|
|
||||||
return retstr;
|
return retstr;
|
||||||
|
@ -1024,7 +1067,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
retstr += Generate(String.Format("new {0}(", lc.Type), lc);
|
retstr += Generate(String.Format("new {0}(", lc.Type), lc);
|
||||||
|
|
||||||
foreach (SYMBOL kid in lc.kids)
|
foreach (SYMBOL kid in lc.kids)
|
||||||
retstr += GenerateNode(kid);
|
retstr += GenerateNode(lc, kid);
|
||||||
|
|
||||||
retstr += Generate(")");
|
retstr += Generate(")");
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.CSharp;
|
using Microsoft.CSharp;
|
||||||
//using Microsoft.JScript;
|
//using Microsoft.JScript;
|
||||||
|
@ -72,6 +73,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
private bool CompileWithDebugInformation;
|
private bool CompileWithDebugInformation;
|
||||||
private Dictionary<string, bool> AllowedCompilers = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase);
|
private Dictionary<string, bool> AllowedCompilers = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
private Dictionary<string, enumCompileType> LanguageMapping = new Dictionary<string, enumCompileType>(StringComparer.CurrentCultureIgnoreCase);
|
private Dictionary<string, enumCompileType> LanguageMapping = new Dictionary<string, enumCompileType>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
private bool m_insertCoopTerminationCalls;
|
||||||
|
|
||||||
private string FilePrefix;
|
private string FilePrefix;
|
||||||
private string ScriptEnginesPath = null;
|
private string ScriptEnginesPath = null;
|
||||||
|
@ -95,20 +97,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
private Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>> m_lineMaps =
|
private Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>> m_lineMaps =
|
||||||
new Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>>();
|
new Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>>();
|
||||||
|
|
||||||
|
public bool in_startup = true;
|
||||||
|
|
||||||
public Compiler(IScriptEngine scriptEngine)
|
public Compiler(IScriptEngine scriptEngine)
|
||||||
{
|
{
|
||||||
m_scriptEngine = scriptEngine;;
|
m_scriptEngine = scriptEngine;
|
||||||
ScriptEnginesPath = scriptEngine.ScriptEnginePath;
|
ScriptEnginesPath = scriptEngine.ScriptEnginePath;
|
||||||
ReadConfig();
|
ReadConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool in_startup = true;
|
|
||||||
public void ReadConfig()
|
public void ReadConfig()
|
||||||
{
|
{
|
||||||
// Get some config
|
// Get some config
|
||||||
WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false);
|
WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false);
|
||||||
CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true);
|
CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true);
|
||||||
bool DeleteScriptsOnStartup = m_scriptEngine.Config.GetBoolean("DeleteScriptsOnStartup", true);
|
bool DeleteScriptsOnStartup = m_scriptEngine.Config.GetBoolean("DeleteScriptsOnStartup", true);
|
||||||
|
m_insertCoopTerminationCalls = m_scriptEngine.Config.GetString("ScriptStopStrategy", "abort") == "co-op";
|
||||||
|
|
||||||
// Get file prefix from scriptengine name and make it file system safe:
|
// Get file prefix from scriptengine name and make it file system safe:
|
||||||
FilePrefix = "CommonCompiler";
|
FilePrefix = "CommonCompiler";
|
||||||
|
@ -386,7 +390,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
if (language == enumCompileType.lsl)
|
if (language == enumCompileType.lsl)
|
||||||
{
|
{
|
||||||
// Its LSL, convert it to C#
|
// Its LSL, convert it to C#
|
||||||
LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms);
|
LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms, m_insertCoopTerminationCalls);
|
||||||
compileScript = LSL_Converter.Convert(Script);
|
compileScript = LSL_Converter.Convert(Script);
|
||||||
|
|
||||||
// copy converter warnings into our warnings.
|
// copy converter warnings into our warnings.
|
||||||
|
@ -411,16 +415,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
{
|
{
|
||||||
case enumCompileType.cs:
|
case enumCompileType.cs:
|
||||||
case enumCompileType.lsl:
|
case enumCompileType.lsl:
|
||||||
compileScript = CreateCSCompilerScript(compileScript);
|
compileScript = CreateCSCompilerScript(
|
||||||
|
compileScript,
|
||||||
|
m_scriptEngine.ScriptClassName,
|
||||||
|
m_scriptEngine.ScriptBaseClassName,
|
||||||
|
m_scriptEngine.ScriptBaseClassParameters);
|
||||||
break;
|
break;
|
||||||
case enumCompileType.vb:
|
case enumCompileType.vb:
|
||||||
compileScript = CreateVBCompilerScript(compileScript);
|
compileScript = CreateVBCompilerScript(
|
||||||
|
compileScript, m_scriptEngine.ScriptClassName, m_scriptEngine.ScriptBaseClassName);
|
||||||
break;
|
break;
|
||||||
// case enumCompileType.js:
|
// case enumCompileType.js:
|
||||||
// compileScript = CreateJSCompilerScript(compileScript);
|
// compileScript = CreateJSCompilerScript(compileScript, m_scriptEngine.ScriptBaseClassName);
|
||||||
// break;
|
// break;
|
||||||
case enumCompileType.yp:
|
case enumCompileType.yp:
|
||||||
compileScript = CreateYPCompilerScript(compileScript);
|
compileScript = CreateYPCompilerScript(
|
||||||
|
compileScript, m_scriptEngine.ScriptClassName,m_scriptEngine.ScriptBaseClassName);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,43 +461,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
// return compileScript;
|
// return compileScript;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
private static string CreateCSCompilerScript(string compileScript)
|
private static string CreateCSCompilerScript(
|
||||||
|
string compileScript, string className, string baseClassName, ParameterInfo[] constructorParameters)
|
||||||
{
|
{
|
||||||
compileScript = String.Empty +
|
compileScript = string.Format(
|
||||||
"using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\r\n" +
|
@"using OpenSim.Region.ScriptEngine.Shared;
|
||||||
String.Empty + "namespace SecondLife { " +
|
using System.Collections.Generic;
|
||||||
String.Empty + "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass { \r\n" +
|
|
||||||
@"public Script() { } " +
|
namespace SecondLife
|
||||||
compileScript +
|
{{
|
||||||
"} }\r\n";
|
public class {0} : {1}
|
||||||
|
{{
|
||||||
|
public {0}({2}) : base({3}) {{}}
|
||||||
|
{4}
|
||||||
|
}}
|
||||||
|
}}",
|
||||||
|
className,
|
||||||
|
baseClassName,
|
||||||
|
constructorParameters != null
|
||||||
|
? string.Join(", ", Array.ConvertAll<ParameterInfo, string>(constructorParameters, pi => pi.ToString()))
|
||||||
|
: "",
|
||||||
|
constructorParameters != null
|
||||||
|
? string.Join(", ", Array.ConvertAll<ParameterInfo, string>(constructorParameters, pi => pi.Name))
|
||||||
|
: "",
|
||||||
|
compileScript);
|
||||||
|
|
||||||
return compileScript;
|
return compileScript;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string CreateYPCompilerScript(string compileScript)
|
private static string CreateYPCompilerScript(string compileScript, string className, string baseClassName)
|
||||||
{
|
{
|
||||||
compileScript = String.Empty +
|
compileScript = String.Empty +
|
||||||
"using OpenSim.Region.ScriptEngine.Shared.YieldProlog; " +
|
"using OpenSim.Region.ScriptEngine.Shared.YieldProlog; " +
|
||||||
"using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\r\n" +
|
"using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\r\n" +
|
||||||
String.Empty + "namespace SecondLife { " +
|
String.Empty + "namespace SecondLife { " +
|
||||||
String.Empty + "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass { \r\n" +
|
String.Empty + "public class " + className + " : " + baseClassName + " { \r\n" +
|
||||||
//@"public Script() { } " +
|
//@"public Script() { } " +
|
||||||
@"static OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP YP=null; " +
|
@"static OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP YP=null; " +
|
||||||
@"public Script() { YP= new OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP(); } " +
|
@"public " + className + "() { YP= new OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP(); } " +
|
||||||
|
|
||||||
compileScript +
|
compileScript +
|
||||||
"} }\r\n";
|
"} }\r\n";
|
||||||
|
|
||||||
return compileScript;
|
return compileScript;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string CreateVBCompilerScript(string compileScript)
|
private static string CreateVBCompilerScript(string compileScript, string className, string baseClassName)
|
||||||
{
|
{
|
||||||
compileScript = String.Empty +
|
compileScript = String.Empty +
|
||||||
"Imports OpenSim.Region.ScriptEngine.Shared: Imports System.Collections.Generic: " +
|
"Imports OpenSim.Region.ScriptEngine.Shared: Imports System.Collections.Generic: " +
|
||||||
String.Empty + "NameSpace SecondLife:" +
|
String.Empty + "NameSpace SecondLife:" +
|
||||||
String.Empty + "Public Class Script: Inherits OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass: " +
|
String.Empty + "Public Class " + className + ": Inherits " + baseClassName +
|
||||||
"\r\nPublic Sub New()\r\nEnd Sub: " +
|
"\r\nPublic Sub New()\r\nEnd Sub: " +
|
||||||
compileScript +
|
compileScript +
|
||||||
":End Class :End Namespace\r\n";
|
":End Class :End Namespace\r\n";
|
||||||
|
|
||||||
return compileScript;
|
return compileScript;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,6 +576,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
|
parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
|
||||||
"OpenMetaverseTypes.dll"));
|
"OpenMetaverseTypes.dll"));
|
||||||
|
|
||||||
|
if (m_scriptEngine.ScriptReferencedAssemblies != null)
|
||||||
|
Array.ForEach<string>(
|
||||||
|
m_scriptEngine.ScriptReferencedAssemblies,
|
||||||
|
a => parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, a)));
|
||||||
|
|
||||||
if (lang == enumCompileType.yp)
|
if (lang == enumCompileType.yp)
|
||||||
{
|
{
|
||||||
parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
|
parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
|
||||||
|
|
|
@ -252,7 +252,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
/// <param name='dom'></param>
|
/// <param name='dom'></param>
|
||||||
/// <param name='assembly'></param>
|
/// <param name='assembly'></param>
|
||||||
/// <param name='stateSource'></param>
|
/// <param name='stateSource'></param>
|
||||||
public void Load(AppDomain dom, string assembly, StateSource stateSource)
|
/// <returns>false if load failed, true if suceeded</returns>
|
||||||
|
public bool Load(AppDomain dom, string assembly, StateSource stateSource)
|
||||||
{
|
{
|
||||||
m_Assembly = assembly;
|
m_Assembly = assembly;
|
||||||
m_stateSource = stateSource;
|
m_stateSource = stateSource;
|
||||||
|
@ -267,14 +268,56 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (dom != System.AppDomain.CurrentDomain)
|
object[] constructorParams;
|
||||||
m_Script = (IScript)dom.CreateInstanceAndUnwrap(
|
|
||||||
Path.GetFileNameWithoutExtension(assembly),
|
Assembly scriptAssembly = dom.Load(Path.GetFileNameWithoutExtension(assembly));
|
||||||
"SecondLife.Script");
|
Type scriptType = scriptAssembly.GetType("SecondLife.XEngineScript");
|
||||||
|
|
||||||
|
if (scriptType != null)
|
||||||
|
{
|
||||||
|
constructorParams = new object[] { m_coopSleepHandle };
|
||||||
|
}
|
||||||
|
else if (!m_coopTermination)
|
||||||
|
{
|
||||||
|
scriptType = scriptAssembly.GetType("SecondLife.Script");
|
||||||
|
constructorParams = null;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
m_Script = (IScript)Assembly.Load(
|
{
|
||||||
Path.GetFileNameWithoutExtension(assembly)).CreateInstance(
|
m_log.ErrorFormat(
|
||||||
"SecondLife.Script");
|
"[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. You must remove all existing {6}* script DLL files before using enabling co-op termination"
|
||||||
|
+ ", either by setting DeleteScriptsOnStartup = true in [XEngine] for one run"
|
||||||
|
+ " or by deleting these files manually.",
|
||||||
|
ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[SCRIPT INSTANCE]: Looking to load {0} from assembly {1} in {2}",
|
||||||
|
// scriptType.FullName, Path.GetFileNameWithoutExtension(assembly), Engine.World.Name);
|
||||||
|
|
||||||
|
if (dom != System.AppDomain.CurrentDomain)
|
||||||
|
m_Script
|
||||||
|
= (IScript)dom.CreateInstanceAndUnwrap(
|
||||||
|
Path.GetFileNameWithoutExtension(assembly),
|
||||||
|
scriptType.FullName,
|
||||||
|
false,
|
||||||
|
BindingFlags.Default,
|
||||||
|
null,
|
||||||
|
constructorParams,
|
||||||
|
null,
|
||||||
|
null);
|
||||||
|
else
|
||||||
|
m_Script
|
||||||
|
= (IScript)scriptAssembly.CreateInstance(
|
||||||
|
scriptType.FullName,
|
||||||
|
false,
|
||||||
|
BindingFlags.Default,
|
||||||
|
null,
|
||||||
|
constructorParams,
|
||||||
|
null,
|
||||||
|
null);
|
||||||
|
|
||||||
//ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
|
//ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
|
||||||
//RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
|
//RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
|
||||||
|
@ -283,8 +326,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[SCRIPT INSTANCE]: Error loading assembly {0}. Exception {1}{2}",
|
"[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error loading assembly {6}. Exception {7}{8}",
|
||||||
assembly, e.Message, e.StackTrace);
|
ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly, e.Message, e.StackTrace);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -302,10 +347,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[SCRIPT INSTANCE]: Error loading script instance from assembly {0}. Exception {1}{2}",
|
"[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error initializing script instance. Exception {6}{7}",
|
||||||
assembly, e.Message, e.StackTrace);
|
ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, e.Message, e.StackTrace);
|
||||||
|
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_SaveState = true;
|
m_SaveState = true;
|
||||||
|
@ -358,15 +403,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.WarnFormat(
|
m_log.WarnFormat(
|
||||||
"[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). Memory limit exceeded",
|
"[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. Memory limit exceeded.",
|
||||||
savedState, ScriptName, ItemID, PrimName, ObjectID, assembly);
|
ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). XML is {6}. Exception {7}{8}",
|
"[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. XML is {7}. Exception {8}{9}",
|
||||||
savedState, ScriptName, ItemID, PrimName, ObjectID, assembly, xml, e.Message, e.StackTrace);
|
ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState, xml, e.Message, e.StackTrace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// else
|
// else
|
||||||
|
@ -377,6 +422,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
|
// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Init()
|
public void Init()
|
||||||
|
@ -560,9 +607,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
if (DebugLevel >= 1)
|
||||||
"[SCRIPT INSTANCE]: Co-operatively stopping script {0} {1} in {2} {3}",
|
m_log.DebugFormat(
|
||||||
ScriptName, ItemID, PrimName, ObjectID);
|
"[SCRIPT INSTANCE]: Co-operatively stopping script {0} {1} in {2} {3}",
|
||||||
|
ScriptName, ItemID, PrimName, ObjectID);
|
||||||
|
|
||||||
// This will terminate the event on next handle check by the script.
|
// This will terminate the event on next handle check by the script.
|
||||||
m_coopSleepHandle.Set();
|
m_coopSleepHandle.Set();
|
||||||
|
@ -571,9 +619,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
// checking is implemented. May want to allow a shorter timeout option later.
|
// checking is implemented. May want to allow a shorter timeout option later.
|
||||||
if (workItem.Wait(TimeSpan.MaxValue))
|
if (workItem.Wait(TimeSpan.MaxValue))
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
if (DebugLevel >= 1)
|
||||||
"[SCRIPT INSTANCE]: Co-operatively stopped script {0} {1} in {2} {3}",
|
m_log.DebugFormat(
|
||||||
ScriptName, ItemID, PrimName, ObjectID);
|
"[SCRIPT INSTANCE]: Co-operatively stopped script {0} {1} in {2} {3}",
|
||||||
|
ScriptName, ItemID, PrimName, ObjectID);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -894,9 +943,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
}
|
}
|
||||||
else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException))
|
else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException))
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
if (DebugLevel >= 1)
|
||||||
"[SCRIPT INSTANCE]: Script {0}.{1} in event {2}, state {3} stopped co-operatively.",
|
m_log.DebugFormat(
|
||||||
PrimName, ScriptName, data.EventName, State);
|
"[SCRIPT INSTANCE]: Script {0}.{1} in event {2}, state {3} stopped co-operatively.",
|
||||||
|
PrimName, ScriptName, data.EventName, State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,14 +50,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance.Tests
|
||||||
private TestScene m_scene;
|
private TestScene m_scene;
|
||||||
private OpenSim.Region.ScriptEngine.XEngine.XEngine m_xEngine;
|
private OpenSim.Region.ScriptEngine.XEngine.XEngine m_xEngine;
|
||||||
|
|
||||||
private AutoResetEvent m_chatEvent = new AutoResetEvent(false);
|
private AutoResetEvent m_chatEvent;
|
||||||
private AutoResetEvent m_stoppedEvent = new AutoResetEvent(false);
|
private AutoResetEvent m_stoppedEvent;
|
||||||
|
|
||||||
private OSChatMessage m_osChatMessageReceived;
|
private OSChatMessage m_osChatMessageReceived;
|
||||||
|
|
||||||
[TestFixtureSetUp]
|
[SetUp]
|
||||||
public void Init()
|
public void Init()
|
||||||
{
|
{
|
||||||
|
m_osChatMessageReceived = null;
|
||||||
|
m_chatEvent = new AutoResetEvent(false);
|
||||||
|
m_stoppedEvent = new AutoResetEvent(false);
|
||||||
|
|
||||||
//AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin");
|
//AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin");
|
||||||
// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
|
// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
|
||||||
m_xEngine = new OpenSim.Region.ScriptEngine.XEngine.XEngine();
|
m_xEngine = new OpenSim.Region.ScriptEngine.XEngine.XEngine();
|
||||||
|
@ -77,7 +81,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance.Tests
|
||||||
|
|
||||||
xEngineConfig.Set("ScriptStopStrategy", "co-op");
|
xEngineConfig.Set("ScriptStopStrategy", "co-op");
|
||||||
|
|
||||||
m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource);
|
// Make sure loops aren't actually being terminated by a script delay wait.
|
||||||
|
xEngineConfig.Set("ScriptDelayFactor", 0);
|
||||||
|
|
||||||
|
// This is really just set for debugging the test.
|
||||||
|
xEngineConfig.Set("WriteScriptSourceToDebugFile", true);
|
||||||
|
|
||||||
|
// Set to false if we need to debug test so the old scripts don't get wiped before each separate test
|
||||||
|
// xEngineConfig.Set("DeleteScriptsOnStartup", false);
|
||||||
|
|
||||||
|
// This is not currently used at all for co-op termination. Bumping up to demonstrate that co-op termination
|
||||||
|
// has an effect - without it tests will fail due to a 120 second wait for the event to finish.
|
||||||
|
xEngineConfig.Set("WaitForEventCompletionOnScriptStop", 120000);
|
||||||
|
|
||||||
|
m_scene = new SceneHelpers().SetupScene("My Test", TestHelpers.ParseTail(0x9999), 1000, 1000, configSource);
|
||||||
SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine);
|
SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine);
|
||||||
m_scene.StartScripts();
|
m_scene.StartScripts();
|
||||||
}
|
}
|
||||||
|
@ -95,12 +112,218 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance.Tests
|
||||||
TestHelpers.InMethod();
|
TestHelpers.InMethod();
|
||||||
// TestHelpers.EnableLogging();
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
llSleep(60);
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnLongSingleStatementForLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
for (i = 0; i < 2147483647; i++)
|
||||||
|
llSay(0, ""Iter "" + (string)i);
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnLongCompoundStatementForLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
for (i = 0; i < 2147483647; i++)
|
||||||
|
{
|
||||||
|
llSay(0, ""Iter "" + (string)i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnLongSingleStatementWhileLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
while (1 == 1)
|
||||||
|
llSay(0, ""Iter "" + (string)i++);
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnLongCompoundStatementWhileLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
while (1 == 1)
|
||||||
|
{
|
||||||
|
llSay(0, ""Iter "" + (string)i++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnLongDoWhileLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
llSay(0, ""Iter "" + (string)i++);
|
||||||
|
} while (1 == 1);
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnInfiniteJumpLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
@p1;
|
||||||
|
llSay(0, ""Iter "" + (string)i++);
|
||||||
|
jump p1;
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnInfiniteUserFunctionCallLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"
|
||||||
|
integer i = 0;
|
||||||
|
|
||||||
|
ufn1()
|
||||||
|
{
|
||||||
|
llSay(0, ""Iter ufn1() "" + (string)i++);
|
||||||
|
ufn1();
|
||||||
|
}
|
||||||
|
|
||||||
|
default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
ufn1();
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStopOnInfiniteManualEventCallLoop()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
string script =
|
||||||
|
@"default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
integer i = 0;
|
||||||
|
llSay(0, ""Thin Lizzy"");
|
||||||
|
|
||||||
|
llSay(0, ""Iter"" + (string)i++);
|
||||||
|
default_event_state_entry();
|
||||||
|
}
|
||||||
|
}";
|
||||||
|
|
||||||
|
TestStop(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TestStop(string script)
|
||||||
|
{
|
||||||
UUID userId = TestHelpers.ParseTail(0x1);
|
UUID userId = TestHelpers.ParseTail(0x1);
|
||||||
// UUID objectId = TestHelpers.ParseTail(0x100);
|
// UUID objectId = TestHelpers.ParseTail(0x100);
|
||||||
// UUID itemId = TestHelpers.ParseTail(0x3);
|
// UUID itemId = TestHelpers.ParseTail(0x3);
|
||||||
string itemName = "TestStopOnObjectDerezLongSleep() Item";
|
string itemName = "TestStop() Item";
|
||||||
|
|
||||||
SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "TestStopOnObjectDerezLongSleep", 0x100);
|
SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "TestStop", 0x100);
|
||||||
m_scene.AddNewSceneObject(so, true);
|
m_scene.AddNewSceneObject(so, true);
|
||||||
|
|
||||||
InventoryItemBase itemTemplate = new InventoryItemBase();
|
InventoryItemBase itemTemplate = new InventoryItemBase();
|
||||||
|
@ -111,15 +334,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance.Tests
|
||||||
|
|
||||||
m_scene.EventManager.OnChatFromWorld += OnChatFromWorld;
|
m_scene.EventManager.OnChatFromWorld += OnChatFromWorld;
|
||||||
|
|
||||||
SceneObjectPart partWhereRezzed = m_scene.RezNewScript(userId, itemTemplate,
|
SceneObjectPart partWhereRezzed = m_scene.RezNewScript(userId, itemTemplate, script);
|
||||||
@"default
|
|
||||||
{
|
|
||||||
state_entry()
|
|
||||||
{
|
|
||||||
llSay(0, ""Thin Lizzy"");
|
|
||||||
llSleep(60);
|
|
||||||
}
|
|
||||||
}");
|
|
||||||
|
|
||||||
TaskInventoryItem rezzedItem = partWhereRezzed.Inventory.GetInventoryItem(itemName);
|
TaskInventoryItem rezzedItem = partWhereRezzed.Inventory.GetInventoryItem(itemName);
|
||||||
|
|
||||||
|
@ -129,7 +344,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance.Tests
|
||||||
Console.WriteLine("Script started with message [{0}]", m_osChatMessageReceived.Message);
|
Console.WriteLine("Script started with message [{0}]", m_osChatMessageReceived.Message);
|
||||||
|
|
||||||
// FIXME: This is a very poor way of trying to avoid a low-probability race condition where the script
|
// FIXME: This is a very poor way of trying to avoid a low-probability race condition where the script
|
||||||
// executes llSay() but has not started the sleep before we try to stop it.
|
// executes llSay() but has not started the next statement before we try to stop it.
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
|
|
||||||
// We need a way of carrying on if StopScript() fail, since it won't return if the script isn't actually
|
// We need a way of carrying on if StopScript() fail, since it won't return if the script isn't actually
|
||||||
|
@ -148,7 +363,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance.Tests
|
||||||
|
|
||||||
private void OnChatFromWorld(object sender, OSChatMessage oscm)
|
private void OnChatFromWorld(object sender, OSChatMessage oscm)
|
||||||
{
|
{
|
||||||
// Console.WriteLine("Got chat [{0}]", oscm.Message);
|
m_scene.EventManager.OnChatFromWorld -= OnChatFromWorld;
|
||||||
|
Console.WriteLine("Got chat [{0}]", oscm.Message);
|
||||||
|
|
||||||
m_osChatMessageReceived = oscm;
|
m_osChatMessageReceived = oscm;
|
||||||
m_chatEvent.Set();
|
m_chatEvent.Set();
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Runtime.Remoting;
|
||||||
|
using System.Runtime.Remoting.Lifetime;
|
||||||
|
using System.Security.Permissions;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||||
|
using OpenSim.Region.ScriptEngine.Shared;
|
||||||
|
using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.ScriptEngine.XEngine.ScriptBase
|
||||||
|
{
|
||||||
|
public class XEngineScriptBase : ScriptBaseClass
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Used for script sleeps when we are using co-operative script termination.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>null if co-operative script termination is not active</remarks>
|
||||||
|
WaitHandle m_coopSleepHandle;
|
||||||
|
|
||||||
|
public XEngineScriptBase(WaitHandle coopSleepHandle) : base()
|
||||||
|
{
|
||||||
|
m_coopSleepHandle = coopSleepHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void opensim_reserved_CheckForCoopTermination()
|
||||||
|
{
|
||||||
|
if (m_coopSleepHandle != null && m_coopSleepHandle.WaitOne(0))
|
||||||
|
throw new ScriptCoopStopException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -52,7 +52,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
{
|
{
|
||||||
myScriptEngine = _ScriptEngine;
|
myScriptEngine = _ScriptEngine;
|
||||||
|
|
||||||
m_log.Info("[XEngine] Hooking up to server events");
|
// m_log.Info("[XEngine] Hooking up to server events");
|
||||||
myScriptEngine.World.EventManager.OnAttach += attach;
|
myScriptEngine.World.EventManager.OnAttach += attach;
|
||||||
myScriptEngine.World.EventManager.OnObjectGrab += touch_start;
|
myScriptEngine.World.EventManager.OnObjectGrab += touch_start;
|
||||||
myScriptEngine.World.EventManager.OnObjectGrabbing += touch;
|
myScriptEngine.World.EventManager.OnObjectGrabbing += touch;
|
||||||
|
@ -69,7 +69,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
myScriptEngine.World.EventManager.OnScriptLandColliderStart += land_collision_start;
|
myScriptEngine.World.EventManager.OnScriptLandColliderStart += land_collision_start;
|
||||||
myScriptEngine.World.EventManager.OnScriptLandColliding += land_collision;
|
myScriptEngine.World.EventManager.OnScriptLandColliding += land_collision;
|
||||||
myScriptEngine.World.EventManager.OnScriptLandColliderEnd += land_collision_end;
|
myScriptEngine.World.EventManager.OnScriptLandColliderEnd += land_collision_end;
|
||||||
IMoneyModule money=myScriptEngine.World.RequestModuleInterface<IMoneyModule>();
|
IMoneyModule money = myScriptEngine.World.RequestModuleInterface<IMoneyModule>();
|
||||||
if (money != null)
|
if (money != null)
|
||||||
{
|
{
|
||||||
money.OnObjectPaid+=HandleObjectPaid;
|
money.OnObjectPaid+=HandleObjectPaid;
|
||||||
|
|
|
@ -47,13 +47,15 @@ using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Console;
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||||
using OpenSim.Region.ScriptEngine.Shared;
|
using OpenSim.Region.ScriptEngine.Shared;
|
||||||
using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
|
using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
|
||||||
using OpenSim.Region.ScriptEngine.Shared.CodeTools;
|
using OpenSim.Region.ScriptEngine.Shared.CodeTools;
|
||||||
using OpenSim.Region.ScriptEngine.Shared.Instance;
|
using OpenSim.Region.ScriptEngine.Shared.Instance;
|
||||||
using OpenSim.Region.ScriptEngine.Shared.Api;
|
using OpenSim.Region.ScriptEngine.Shared.Api;
|
||||||
using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
|
using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
|
||||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
|
||||||
|
using OpenSim.Region.ScriptEngine.XEngine.ScriptBase;
|
||||||
using Timer = OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer;
|
using Timer = OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer;
|
||||||
|
|
||||||
using ScriptCompileQueue = OpenSim.Framework.LocklessQueue<object[]>;
|
using ScriptCompileQueue = OpenSim.Framework.LocklessQueue<object[]>;
|
||||||
|
@ -244,6 +246,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
get { return "XEngine"; }
|
get { return "XEngine"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string ScriptClassName { get; private set; }
|
||||||
|
|
||||||
|
public string ScriptBaseClassName { get; private set; }
|
||||||
|
|
||||||
|
public ParameterInfo[] ScriptBaseClassParameters { get; private set; }
|
||||||
|
|
||||||
|
public string[] ScriptReferencedAssemblies { get; private set; }
|
||||||
|
|
||||||
public Scene World
|
public Scene World
|
||||||
{
|
{
|
||||||
get { return m_Scene; }
|
get { return m_Scene; }
|
||||||
|
@ -298,21 +308,35 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
|
|
||||||
m_ScriptConfig = configSource.Configs["XEngine"];
|
m_ScriptConfig = configSource.Configs["XEngine"];
|
||||||
m_ConfigSource = configSource;
|
m_ConfigSource = configSource;
|
||||||
|
|
||||||
|
string rawScriptStopStrategy = m_ScriptConfig.GetString("ScriptStopStrategy", "abort");
|
||||||
|
|
||||||
|
m_log.InfoFormat("[XEngine]: Script stop strategy is {0}", rawScriptStopStrategy);
|
||||||
|
|
||||||
|
if (rawScriptStopStrategy == "co-op")
|
||||||
|
{
|
||||||
|
ScriptClassName = "XEngineScript";
|
||||||
|
ScriptBaseClassName = typeof(XEngineScriptBase).FullName;
|
||||||
|
ScriptBaseClassParameters = typeof(XEngineScriptBase).GetConstructor(new Type[] { typeof(WaitHandle) }).GetParameters();
|
||||||
|
ScriptReferencedAssemblies = new string[] { Path.GetFileName(typeof(XEngineScriptBase).Assembly.Location) };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ScriptClassName = "Script";
|
||||||
|
ScriptBaseClassName = typeof(ScriptBaseClass).FullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Console.WriteLine("ASSEMBLY NAME: {0}", ScriptReferencedAssemblies[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddRegion(Scene scene)
|
public void AddRegion(Scene scene)
|
||||||
{
|
{
|
||||||
if (m_ScriptConfig == null)
|
if (m_ScriptConfig == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_ScriptFailCount = 0;
|
m_ScriptFailCount = 0;
|
||||||
m_ScriptErrorMessage = String.Empty;
|
m_ScriptErrorMessage = String.Empty;
|
||||||
|
|
||||||
if (m_ScriptConfig == null)
|
|
||||||
{
|
|
||||||
// m_log.ErrorFormat("[XEngine] No script configuration found. Scripts disabled");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Enabled = m_ScriptConfig.GetBoolean("Enabled", true);
|
m_Enabled = m_ScriptConfig.GetBoolean("Enabled", true);
|
||||||
|
|
||||||
if (!m_Enabled)
|
if (!m_Enabled)
|
||||||
|
@ -1180,7 +1204,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
"[XEngine] Loading script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}",
|
"[XEngine]: Loading script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}",
|
||||||
part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID,
|
part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID,
|
||||||
part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
|
part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
|
@ -1201,6 +1225,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
lock (m_AddingAssemblies)
|
lock (m_AddingAssemblies)
|
||||||
{
|
{
|
||||||
m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assembly, out linemap);
|
m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assembly, out linemap);
|
||||||
|
|
||||||
if (!m_AddingAssemblies.ContainsKey(assembly)) {
|
if (!m_AddingAssemblies.ContainsKey(assembly)) {
|
||||||
m_AddingAssemblies[assembly] = 1;
|
m_AddingAssemblies[assembly] = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1250,7 +1275,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
// m_log.ErrorFormat("[XEngine]: Exception when rezzing script {0}{1}", e.Message, e.StackTrace);
|
// m_log.ErrorFormat(
|
||||||
|
// "[XEngine]: Exception when rezzing script with item ID {0}, {1}{2}",
|
||||||
|
// itemID, e.Message, e.StackTrace);
|
||||||
|
|
||||||
// try
|
// try
|
||||||
// {
|
// {
|
||||||
|
@ -1329,13 +1356,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
sandbox = AppDomain.CurrentDomain;
|
sandbox = AppDomain.CurrentDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
//PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
|
if (!instance.Load(m_AppDomains[appDomain], assembly, stateSource))
|
||||||
//AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
|
return false;
|
||||||
//PermissionSet sandboxPermissionSet = sandboxPolicy.GetNamedPermissionSet("Internet");
|
|
||||||
//PolicyStatement sandboxPolicyStatement = new PolicyStatement(sandboxPermissionSet);
|
|
||||||
//CodeGroup sandboxCodeGroup = new UnionCodeGroup(sandboxMembershipCondition, sandboxPolicyStatement);
|
|
||||||
//sandboxPolicy.RootCodeGroup = sandboxCodeGroup;
|
|
||||||
//sandbox.SetAppDomainPolicy(sandboxPolicy);
|
|
||||||
|
|
||||||
m_AppDomains[appDomain] = sandbox;
|
m_AppDomains[appDomain] = sandbox;
|
||||||
|
|
||||||
|
|
|
@ -745,13 +745,6 @@
|
||||||
;; The trade-off may be increased memory usage by the script engine.
|
;; The trade-off may be increased memory usage by the script engine.
|
||||||
; ThreadStackSize = 262144
|
; ThreadStackSize = 262144
|
||||||
|
|
||||||
;# {DeleteScriptsOnStartup} {} {Delete previously compiled script DLLs on startup?} (true false) true
|
|
||||||
;; Controls whether previously compiled scripts DLLs are deleted on sim restart. If you set this to false
|
|
||||||
;; then startup will be considerably faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the
|
|
||||||
;; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used
|
|
||||||
;; by scripts have changed.
|
|
||||||
; DeleteScriptsOnStartup = true
|
|
||||||
|
|
||||||
;; Set this to true (the default) to load each script into a separate
|
;; Set this to true (the default) to load each script into a separate
|
||||||
;; AppDomain.
|
;; AppDomain.
|
||||||
;;
|
;;
|
||||||
|
@ -764,6 +757,23 @@
|
||||||
;; Some Windows users have also reported script loading problems when AppDomainLoading = false
|
;; Some Windows users have also reported script loading problems when AppDomainLoading = false
|
||||||
; AppDomainLoading = true
|
; AppDomainLoading = true
|
||||||
|
|
||||||
|
;; Controls whether scripts are stopped by aborting their threads externally (abort) or by co-operative checks from the compiled script (co-op)
|
||||||
|
;; co-op will be more stable but this option is currently experimental.
|
||||||
|
;; If moving from co-op to abort, existing script DLLs will need to be recompiled.
|
||||||
|
;; This currently can only be done manually, either by setting DeleteScriptsOnStartup = true for one run
|
||||||
|
;; or by deleting the script DLL* files in bin/ScriptEngines/<region-id>/
|
||||||
|
;; One can move from co-op back to abort without recompilation, but reverting back to co-op again will need script recompile
|
||||||
|
;; Current valid values are "abort" and "co-op"
|
||||||
|
; ScriptStopStrategy = abort
|
||||||
|
|
||||||
|
|
||||||
|
;# {DeleteScriptsOnStartup} {} {Delete previously compiled script DLLs on startup?} (true false) true
|
||||||
|
;; Controls whether previously compiled scripts DLLs are deleted on sim restart. If you set this to false
|
||||||
|
;; then startup will be considerably faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the
|
||||||
|
;; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used
|
||||||
|
;; by scripts have changed.
|
||||||
|
; DeleteScriptsOnStartup = true
|
||||||
|
|
||||||
;# {DefaultCompileLanguage} {Enabled:true} {Default script language?} {lsl vb cs} lsl
|
;# {DefaultCompileLanguage} {Enabled:true} {Default script language?} {lsl vb cs} lsl
|
||||||
;; Default language for scripts
|
;; Default language for scripts
|
||||||
; DefaultCompileLanguage = "lsl"
|
; DefaultCompileLanguage = "lsl"
|
||||||
|
|
|
@ -1311,6 +1311,20 @@
|
||||||
; script assemblies
|
; script assemblies
|
||||||
AppDomainLoading = true
|
AppDomainLoading = true
|
||||||
|
|
||||||
|
; Controls whether previously compiled scripts DLLs are deleted on sim restart. If you set this to false
|
||||||
|
; then startup will be considerably faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the
|
||||||
|
; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used
|
||||||
|
; by scripts have changed.
|
||||||
|
; DeleteScriptsOnStartup = false
|
||||||
|
|
||||||
|
; Controls whether scripts are stopped by aborting their threads externally (abort) or by co-operative checks from the compiled script (co-op)
|
||||||
|
; co-op will be more stable but this option is currently experimental.
|
||||||
|
; If moving from co-op to abort, existing script DLLs will need to be recompiled.
|
||||||
|
; This currently can only be done manually, either by setting DeleteScriptsOnStartup = true for one run
|
||||||
|
; or by deleting the script DLL* files in bin/ScriptEngines/<region-id>/
|
||||||
|
; One can move from co-op back to abort without recompilation, but reverting back to co-op again will need script recompile
|
||||||
|
ScriptStopStrategy = abort
|
||||||
|
|
||||||
; Rate to poll for asynchronous command replies (ms)
|
; Rate to poll for asynchronous command replies (ms)
|
||||||
; currently unused
|
; currently unused
|
||||||
;AsyncLLCommandLoopms = 50
|
;AsyncLLCommandLoopms = 50
|
||||||
|
@ -1412,12 +1426,6 @@
|
||||||
;; Path to script assemblies
|
;; Path to script assemblies
|
||||||
; ScriptEnginesPath = "ScriptEngines"
|
; ScriptEnginesPath = "ScriptEngines"
|
||||||
|
|
||||||
; Controls whether previously compiled scripts DLLs are deleted on sim restart. If you set this to false
|
|
||||||
; then startup will be considerably faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the
|
|
||||||
; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used
|
|
||||||
; by scripts have changed.
|
|
||||||
; DeleteScriptsOnStartup = false
|
|
||||||
|
|
||||||
|
|
||||||
[Concierge]
|
[Concierge]
|
||||||
; Enable concierge module
|
; Enable concierge module
|
||||||
|
|
37
prebuild.xml
37
prebuild.xml
|
@ -2516,6 +2516,40 @@
|
||||||
</Files>
|
</Files>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
|
<Project frameworkVersion="v3_5" name="OpenSim.Region.ScriptEngine.XEngine.Api.Runtime" path="OpenSim/Region/ScriptEngine/XEngine/Api/Runtime" type="Library">
|
||||||
|
<Configuration name="Debug">
|
||||||
|
<Options>
|
||||||
|
<OutputPath>../../../../../../bin/</OutputPath>
|
||||||
|
</Options>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration name="Release">
|
||||||
|
<Options>
|
||||||
|
<OutputPath>../../../../../../bin/</OutputPath>
|
||||||
|
</Options>
|
||||||
|
</Configuration>
|
||||||
|
|
||||||
|
<ReferencePath>../../../../../../bin/</ReferencePath>
|
||||||
|
<Reference name="System"/>
|
||||||
|
<Reference name="System.Data"/>
|
||||||
|
<Reference name="System.Web"/>
|
||||||
|
<Reference name="System.Xml"/>
|
||||||
|
<Reference name="OpenMetaverseTypes" path="../../../../../../bin/"/>
|
||||||
|
<Reference name="OpenSim"/>
|
||||||
|
<Reference name="OpenSim.Framework"/>
|
||||||
|
<Reference name="OpenSim.Framework.Communications"/>
|
||||||
|
<Reference name="OpenSim.Region.Framework"/>
|
||||||
|
<Reference name="OpenSim.Region.CoreModules"/>
|
||||||
|
<Reference name="OpenSim.Framework.Console"/>
|
||||||
|
<Reference name="OpenSim.Region.ScriptEngine.Shared"/>
|
||||||
|
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api.Runtime"/>
|
||||||
|
<Reference name="Nini" path="../../../../../../bin/"/>
|
||||||
|
<Reference name="log4net" path="../../../../../../bin/"/>
|
||||||
|
|
||||||
|
<Files>
|
||||||
|
<Match pattern="*.cs" recurse="true"/>
|
||||||
|
</Files>
|
||||||
|
</Project>
|
||||||
|
|
||||||
<Project frameworkVersion="v3_5" name="OpenSim.Region.ScriptEngine.XEngine" path="OpenSim/Region/ScriptEngine/XEngine" type="Library">
|
<Project frameworkVersion="v3_5" name="OpenSim.Region.ScriptEngine.XEngine" path="OpenSim/Region/ScriptEngine/XEngine" type="Library">
|
||||||
<Configuration name="Debug">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
|
@ -2546,6 +2580,8 @@
|
||||||
<Reference name="OpenSim.Region.ScriptEngine.Shared.CodeTools"/>
|
<Reference name="OpenSim.Region.ScriptEngine.Shared.CodeTools"/>
|
||||||
<Reference name="OpenSim.Region.ScriptEngine.Shared.Instance"/>
|
<Reference name="OpenSim.Region.ScriptEngine.Shared.Instance"/>
|
||||||
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api"/>
|
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api"/>
|
||||||
|
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api.Runtime"/>
|
||||||
|
<Reference name="OpenSim.Region.ScriptEngine.XEngine.Api.Runtime"/>
|
||||||
<Reference name="SmartThreadPool"/>
|
<Reference name="SmartThreadPool"/>
|
||||||
<Reference name="Nini" path="../../../../bin/"/>
|
<Reference name="Nini" path="../../../../bin/"/>
|
||||||
<Reference name="log4net" path="../../../../bin/"/>
|
<Reference name="log4net" path="../../../../bin/"/>
|
||||||
|
@ -2553,6 +2589,7 @@
|
||||||
<Files>
|
<Files>
|
||||||
<Match buildAction="EmbeddedResource" path="Resources" pattern="*.addin.xml" recurse="true"/>
|
<Match buildAction="EmbeddedResource" path="Resources" pattern="*.addin.xml" recurse="true"/>
|
||||||
<Match pattern="*.cs" recurse="true">
|
<Match pattern="*.cs" recurse="true">
|
||||||
|
<Exclude name="Api"/>
|
||||||
<Exclude name="Tests" pattern="Tests"/>
|
<Exclude name="Tests" pattern="Tests"/>
|
||||||
</Match>
|
</Match>
|
||||||
</Files>
|
</Files>
|
||||||
|
|
Loading…
Reference in New Issue