* Implements IObject.OnTouch += delegate(IObject sender, TouchEventArgs e)

* This is equivalent to LSL 'touch(int senders)'
0.6.5-rc1
Adam Frisby 2009-04-09 07:46:05 +00:00
parent 99bf4ce72f
commit 232241ab25
2 changed files with 73 additions and 0 deletions

View File

@ -32,8 +32,30 @@ using OpenSim.Region.OptionalModules.Scripting.Minimodule.Object;
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
{ {
public class TouchEventArgs : EventArgs
{
public IAvatar Avatar;
public Vector3 TouchBiNormal;
public Vector3 TouchNormal;
public Vector3 TouchPosition;
public Vector2 TouchUV;
public Vector2 TouchST;
public int TouchMaterialIndex;
}
public delegate void OnTouchDelegate(IObject sender, TouchEventArgs e);
public interface IObject public interface IObject
{ {
#region Events
event OnTouchDelegate OnTouch;
#endregion
/// <summary> /// <summary>
/// Returns whether or not this object is still in the world. /// Returns whether or not this object is still in the world.
/// Eg, if you store an IObject reference, however the object /// Eg, if you store an IObject reference, however the object

View File

@ -59,6 +59,57 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
return null; return null;
} }
#region OnTouch
private event OnTouchDelegate _OnTouch;
private bool _OnTouchActive = false;
public event OnTouchDelegate OnTouch
{
add
{
if(!_OnTouchActive)
{
_OnTouchActive = true;
m_rootScene.EventManager.OnObjectGrab += EventManager_OnObjectGrab;
}
_OnTouch += value;
}
remove
{
_OnTouch -= value;
if (_OnTouch == null)
{
_OnTouchActive = false;
m_rootScene.EventManager.OnObjectGrab -= EventManager_OnObjectGrab;
}
}
}
void EventManager_OnObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
{
if (_OnTouchActive && m_localID == localID)
{
TouchEventArgs e = new TouchEventArgs();
e.Avatar = new SPAvatar(m_rootScene, remoteClient.AgentId);
e.TouchBiNormal = surfaceArgs.Binormal;
e.TouchMaterialIndex = surfaceArgs.FaceIndex;
e.TouchNormal = surfaceArgs.Normal;
e.TouchPosition = surfaceArgs.Position;
e.TouchST = new Vector2(surfaceArgs.STCoord.X, surfaceArgs.STCoord.Y);
e.TouchUV = new Vector2(surfaceArgs.UVCoord.X, surfaceArgs.UVCoord.Y);
IObject sender = this;
if (_OnTouch != null)
_OnTouch(sender, e);
}
}
#endregion
public bool Exists public bool Exists
{ {
get { return GetSOP() != null; } get { return GetSOP() != null; }