Implementation of the llDetectedTouch* functions

0.6.1-post-fixes
idb 2008-12-05 16:48:47 +00:00
parent c826570751
commit 7ae9ec217d
8 changed files with 129 additions and 22 deletions

View File

@ -92,7 +92,7 @@ namespace OpenSim.Region.Environment.Scenes
public event OnShutdownDelegate OnShutdown; public event OnShutdownDelegate OnShutdown;
public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient); public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs);
public delegate void ObjectDeGrabDelegate(uint localID, uint originalID, IClientAPI remoteClient); public delegate void ObjectDeGrabDelegate(uint localID, uint originalID, IClientAPI remoteClient);
public delegate void ScriptResetDelegate(uint localID, UUID itemID); public delegate void ScriptResetDelegate(uint localID, UUID itemID);
@ -530,12 +530,12 @@ namespace OpenSim.Region.Environment.Scenes
handlerShutdown(); handlerShutdown();
} }
public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient) public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
{ {
handlerObjectGrab = OnObjectGrab; handlerObjectGrab = OnObjectGrab;
if (handlerObjectGrab != null) if (handlerObjectGrab != null)
{ {
handlerObjectGrab(localID, originalID, offsetPos, remoteClient); handlerObjectGrab(localID, originalID, offsetPos, remoteClient, surfaceArgs);
} }
} }

View File

@ -217,6 +217,10 @@ namespace OpenSim.Region.Environment.Scenes
List<EntityBase> EntityList = GetEntities(); List<EntityBase> EntityList = GetEntities();
SurfaceTouchEventArgs surfaceArg = null;
if (surfaceArgs != null && surfaceArgs.Count > 0)
surfaceArg = surfaceArgs[0];
foreach (EntityBase ent in EntityList) foreach (EntityBase ent in EntityList)
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
@ -236,9 +240,9 @@ namespace OpenSim.Region.Environment.Scenes
// If the touched prim handles touches, deliver it // If the touched prim handles touches, deliver it
// If not, deliver to root prim // If not, deliver to root prim
if ((part.ScriptEvents & scriptEvents.touch_start) != 0) if ((part.ScriptEvents & scriptEvents.touch_start) != 0)
EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient); EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
else else
EventManager.TriggerObjectGrab(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient); EventManager.TriggerObjectGrab(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg);
return; return;
} }

View File

@ -141,7 +141,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
} }
public void touch_start(uint localID, uint originalID, public void touch_start(uint localID, uint originalID,
Vector3 offsetPos, IClientAPI remoteClient) Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
{ {
// Add to queue for all scripts in ObjectID object // Add to queue for all scripts in ObjectID object
DetectParams[] det = new DetectParams[1]; DetectParams[] det = new DetectParams[1];
@ -165,6 +165,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
myScriptEngine.World.GetSceneObjectPart(originalID); myScriptEngine.World.GetSceneObjectPart(originalID);
det[0].LinkNum = originalPart.LinkNum; det[0].LinkNum = originalPart.LinkNum;
} }
if (surfaceArgs != null)
{
det[0].SurfaceTouchArgs = surfaceArgs;
}
myScriptEngine.PostObjectEvent(localID, new EventParams( myScriptEngine.PostObjectEvent(localID, new EventParams(
"touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, "touch_start", new Object[] { new LSL_Types.LSLInteger(1) },

View File

@ -889,46 +889,76 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return new LSL_Integer(parms.LinkNum); return new LSL_Integer(parms.LinkNum);
} }
/// <summary>
/// See http://wiki.secondlife.com/wiki/LlDetectedTouchBinormal for details
/// </summary>
public LSL_Vector llDetectedTouchBinormal(int index) public LSL_Vector llDetectedTouchBinormal(int index)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llDetectedTouchBinormal"); DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index);
if (detectedParams == null || detectedParams.TouchBinormal == null)
return new LSL_Vector(); return new LSL_Vector();
return detectedParams.TouchBinormal;
} }
/// <summary>
/// See http://wiki.secondlife.com/wiki/LlDetectedTouchFace for details
/// </summary>
public LSL_Integer llDetectedTouchFace(int index) public LSL_Integer llDetectedTouchFace(int index)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llDetectedTouchFace"); DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index);
return new LSL_Integer(0); if (detectedParams == null || detectedParams.TouchFace == null)
return new LSL_Integer(-1);
return new LSL_Integer(detectedParams.TouchFace);
} }
/// <summary>
/// See http://wiki.secondlife.com/wiki/LlDetectedTouchNormal for details
/// </summary>
public LSL_Vector llDetectedTouchNormal(int index) public LSL_Vector llDetectedTouchNormal(int index)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llDetectedTouchNormal"); DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index);
if (detectedParams == null || detectedParams.TouchNormal == null)
return new LSL_Vector(); return new LSL_Vector();
return detectedParams.TouchNormal;
} }
/// <summary>
/// See http://wiki.secondlife.com/wiki/LlDetectedTouchPos for details
/// </summary>
public LSL_Vector llDetectedTouchPos(int index) public LSL_Vector llDetectedTouchPos(int index)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llDetectedTouchPos"); DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index);
if (detectedParams == null || detectedParams.TouchPos == null)
return new LSL_Vector(); return new LSL_Vector();
return detectedParams.TouchPos;
} }
/// <summary>
/// See http://wiki.secondlife.com/wiki/LlDetectedTouchST for details
/// </summary>
public LSL_Vector llDetectedTouchST(int index) public LSL_Vector llDetectedTouchST(int index)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llDetectedTouchST"); DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index);
return new LSL_Vector(); if (detectedParams == null || detectedParams.TouchST == null)
return new LSL_Vector(-1.0, -1.0, 0.0);
return detectedParams.TouchST;
} }
/// <summary>
/// See http://wiki.secondlife.com/wiki/LlDetectedTouchUV for details
/// </summary>
public LSL_Vector llDetectedTouchUV(int index) public LSL_Vector llDetectedTouchUV(int index)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llDetectedTouchUV"); DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index);
return new LSL_Vector(); if (detectedParams == null || detectedParams.TouchUV == null)
return new LSL_Vector(-1.0, -1.0, 0.0);
return detectedParams.TouchUV;
} }
public void llDie() public void llDie()

View File

@ -494,5 +494,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public const int CLICK_ACTION_OPEN = 4; public const int CLICK_ACTION_OPEN = 4;
public const int CLICK_ACTION_PLAY = 5; public const int CLICK_ACTION_PLAY = 5;
public const int CLICK_ACTION_OPEN_MEDIA = 6; public const int CLICK_ACTION_OPEN_MEDIA = 6;
// constants for the llDetectedTouch* functions
public const int TOUCH_INVALID_FACE = -1;
public static readonly vector TOUCH_INVALID_TEXCOORD = new vector(-1.0, -1.0, 0.0);
public static readonly vector TOUCH_INVALID_VECTOR = ZERO_VECTOR;
} }
} }

View File

@ -80,6 +80,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
Rotation = new LSL_Types.Quaternion(); Rotation = new LSL_Types.Quaternion();
Type = 0; Type = 0;
Velocity = new LSL_Types.Vector3(); Velocity = new LSL_Types.Vector3();
initializeSurfaceTouch();
} }
public UUID Key; public UUID Key;
@ -93,6 +94,61 @@ namespace OpenSim.Region.ScriptEngine.Shared
public int Type; public int Type;
public LSL_Types.Vector3 Velocity; public LSL_Types.Vector3 Velocity;
private LSL_Types.Vector3 touchST;
public LSL_Types.Vector3 TouchST { get { return touchST; } }
private LSL_Types.Vector3 touchNormal;
public LSL_Types.Vector3 TouchNormal { get { return touchNormal; } }
private LSL_Types.Vector3 touchBinormal;
public LSL_Types.Vector3 TouchBinormal { get { return touchBinormal; } }
private LSL_Types.Vector3 touchPos;
public LSL_Types.Vector3 TouchPos { get { return touchPos; } }
private LSL_Types.Vector3 touchUV;
public LSL_Types.Vector3 TouchUV { get { return touchUV; } }
private int touchFace;
public int TouchFace { get { return touchFace; } }
// This can be done in two places including the constructor
// so be carefull what gets added here
private void initializeSurfaceTouch()
{
touchST = new LSL_Types.Vector3(-1.0, -1.0, 0.0);
touchNormal = new LSL_Types.Vector3();
touchBinormal = new LSL_Types.Vector3();
touchPos = new LSL_Types.Vector3();
touchUV = new LSL_Types.Vector3(-1.0, -1.0, 0.0);
touchFace = -1;
}
/*
* Set up the surface touch detected values
*/
public SurfaceTouchEventArgs SurfaceTouchArgs
{
set
{
if (value == null)
{
// Initialise to defaults if no value
initializeSurfaceTouch();
}
else
{
// Set the values from the touch data provided by the client
touchST = new LSL_Types.Vector3(value.STCoord.X, value.STCoord.Y, value.STCoord.Z);
touchUV = new LSL_Types.Vector3(value.UVCoord.X, value.UVCoord.Y, value.UVCoord.Z);
touchNormal = new LSL_Types.Vector3(value.Normal.X, value.Normal.Y, value.Normal.Z);
touchBinormal = new LSL_Types.Vector3(value.Binormal.X, value.Binormal.Y, value.Binormal.Z);
touchPos = new LSL_Types.Vector3(value.Position.X, value.Position.Y, value.Position.Z);
touchFace = value.FaceIndex;
}
}
}
public void Populate(Scene scene) public void Populate(Scene scene)
{ {
SceneObjectPart part = scene.GetSceneObjectPart(Key); SceneObjectPart part = scene.GetSceneObjectPart(Key);

View File

@ -80,7 +80,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
} }
public void touch_start(uint localID, uint originalID, Vector3 offsetPos, public void touch_start(uint localID, uint originalID, Vector3 offsetPos,
IClientAPI remoteClient) IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
{ {
// Add to queue for all scripts in ObjectID object // Add to queue for all scripts in ObjectID object
DetectParams[] det = new DetectParams[1]; DetectParams[] det = new DetectParams[1];
@ -102,6 +102,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
det[0].LinkNum = originalPart.LinkNum; det[0].LinkNum = originalPart.LinkNum;
} }
if (surfaceArgs != null)
{
det[0].SurfaceTouchArgs = surfaceArgs;
}
myScriptEngine.PostObjectEvent(localID, new EventParams( myScriptEngine.PostObjectEvent(localID, new EventParams(
"touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, "touch_start", new Object[] { new LSL_Types.LSLInteger(1) },
det)); det));

View File

@ -84,7 +84,7 @@ namespace OpenSim.ScriptEngine.Components.DotNetEngine.Events
RezScript(localID, itemID, script, startParam, postOnRez, engine); RezScript(localID, itemID, script, startParam, postOnRez, engine);
} }
private void OnObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient) private void OnObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
{ {
// Add to queue for all scripts in ObjectID object // Add to queue for all scripts in ObjectID object
DetectParams[] det = new DetectParams[1]; DetectParams[] det = new DetectParams[1];
@ -108,7 +108,10 @@ namespace OpenSim.ScriptEngine.Components.DotNetEngine.Events
CurrentRegion.Scene.GetSceneObjectPart(originalID); CurrentRegion.Scene.GetSceneObjectPart(originalID);
det[0].LinkNum = originalPart.LinkNum; det[0].LinkNum = originalPart.LinkNum;
} }
if (surfaceArgs != null)
{
det[0].SurfaceTouchArgs = surfaceArgs;
}
Shared.EventParams ep = Shared.EventParams ep =
new Shared.EventParams(localID, "touch_start", new Object[] {new LSL_Types.LSLInteger(1)}, det); new Shared.EventParams(localID, "touch_start", new Object[] {new LSL_Types.LSLInteger(1)}, det);
CurrentRegion.Executors_Execute(ep); CurrentRegion.Executors_Execute(ep);