diff options
author | idb | 2008-12-05 16:48:47 +0000 |
---|---|---|
committer | idb | 2008-12-05 16:48:47 +0000 |
commit | 7ae9ec217d6e1ec039fbd6ed16c952d56cc63dc6 (patch) | |
tree | 6fed56271b075ef0c9c42e3cc899e86e54ea4c25 /OpenSim | |
parent | Fixed Mantis #2756 (diff) | |
download | opensim-SC-7ae9ec217d6e1ec039fbd6ed16c952d56cc63dc6.zip opensim-SC-7ae9ec217d6e1ec039fbd6ed16c952d56cc63dc6.tar.gz opensim-SC-7ae9ec217d6e1ec039fbd6ed16c952d56cc63dc6.tar.bz2 opensim-SC-7ae9ec217d6e1ec039fbd6ed16c952d56cc63dc6.tar.xz |
Implementation of the llDetectedTouch* functions
Diffstat (limited to 'OpenSim')
8 files changed, 129 insertions, 22 deletions
diff --git a/OpenSim/Region/Environment/Scenes/EventManager.cs b/OpenSim/Region/Environment/Scenes/EventManager.cs index 598f8b4..ad25670 100644 --- a/OpenSim/Region/Environment/Scenes/EventManager.cs +++ b/OpenSim/Region/Environment/Scenes/EventManager.cs | |||
@@ -92,7 +92,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
92 | 92 | ||
93 | public event OnShutdownDelegate OnShutdown; | 93 | public event OnShutdownDelegate OnShutdown; |
94 | 94 | ||
95 | public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient); | 95 | public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs); |
96 | public delegate void ObjectDeGrabDelegate(uint localID, uint originalID, IClientAPI remoteClient); | 96 | public delegate void ObjectDeGrabDelegate(uint localID, uint originalID, IClientAPI remoteClient); |
97 | public delegate void ScriptResetDelegate(uint localID, UUID itemID); | 97 | public delegate void ScriptResetDelegate(uint localID, UUID itemID); |
98 | 98 | ||
@@ -530,12 +530,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
530 | handlerShutdown(); | 530 | handlerShutdown(); |
531 | } | 531 | } |
532 | 532 | ||
533 | public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient) | 533 | public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) |
534 | { | 534 | { |
535 | handlerObjectGrab = OnObjectGrab; | 535 | handlerObjectGrab = OnObjectGrab; |
536 | if (handlerObjectGrab != null) | 536 | if (handlerObjectGrab != null) |
537 | { | 537 | { |
538 | handlerObjectGrab(localID, originalID, offsetPos, remoteClient); | 538 | handlerObjectGrab(localID, originalID, offsetPos, remoteClient, surfaceArgs); |
539 | } | 539 | } |
540 | } | 540 | } |
541 | 541 | ||
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index 2bd1f1c..8d12a94 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs | |||
@@ -217,6 +217,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
217 | 217 | ||
218 | List<EntityBase> EntityList = GetEntities(); | 218 | List<EntityBase> EntityList = GetEntities(); |
219 | 219 | ||
220 | SurfaceTouchEventArgs surfaceArg = null; | ||
221 | if (surfaceArgs != null && surfaceArgs.Count > 0) | ||
222 | surfaceArg = surfaceArgs[0]; | ||
223 | |||
220 | foreach (EntityBase ent in EntityList) | 224 | foreach (EntityBase ent in EntityList) |
221 | { | 225 | { |
222 | if (ent is SceneObjectGroup) | 226 | if (ent is SceneObjectGroup) |
@@ -236,9 +240,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
236 | // If the touched prim handles touches, deliver it | 240 | // If the touched prim handles touches, deliver it |
237 | // If not, deliver to root prim | 241 | // If not, deliver to root prim |
238 | if ((part.ScriptEvents & scriptEvents.touch_start) != 0) | 242 | if ((part.ScriptEvents & scriptEvents.touch_start) != 0) |
239 | EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient); | 243 | EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg); |
240 | else | 244 | else |
241 | EventManager.TriggerObjectGrab(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient); | 245 | EventManager.TriggerObjectGrab(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg); |
242 | 246 | ||
243 | return; | 247 | return; |
244 | } | 248 | } |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs index 72766a4..09dbc40 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs | |||
@@ -141,7 +141,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
141 | } | 141 | } |
142 | 142 | ||
143 | public void touch_start(uint localID, uint originalID, | 143 | public void touch_start(uint localID, uint originalID, |
144 | Vector3 offsetPos, IClientAPI remoteClient) | 144 | Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) |
145 | { | 145 | { |
146 | // Add to queue for all scripts in ObjectID object | 146 | // Add to queue for all scripts in ObjectID object |
147 | DetectParams[] det = new DetectParams[1]; | 147 | DetectParams[] det = new DetectParams[1]; |
@@ -165,6 +165,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
165 | myScriptEngine.World.GetSceneObjectPart(originalID); | 165 | myScriptEngine.World.GetSceneObjectPart(originalID); |
166 | det[0].LinkNum = originalPart.LinkNum; | 166 | det[0].LinkNum = originalPart.LinkNum; |
167 | } | 167 | } |
168 | if (surfaceArgs != null) | ||
169 | { | ||
170 | det[0].SurfaceTouchArgs = surfaceArgs; | ||
171 | } | ||
168 | 172 | ||
169 | myScriptEngine.PostObjectEvent(localID, new EventParams( | 173 | myScriptEngine.PostObjectEvent(localID, new EventParams( |
170 | "touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, | 174 | "touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 7a7c8d6..f98a9bb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -889,46 +889,76 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
889 | return new LSL_Integer(parms.LinkNum); | 889 | return new LSL_Integer(parms.LinkNum); |
890 | } | 890 | } |
891 | 891 | ||
892 | /// <summary> | ||
893 | /// See http://wiki.secondlife.com/wiki/LlDetectedTouchBinormal for details | ||
894 | /// </summary> | ||
892 | public LSL_Vector llDetectedTouchBinormal(int index) | 895 | public LSL_Vector llDetectedTouchBinormal(int index) |
893 | { | 896 | { |
894 | m_host.AddScriptLPS(1); | 897 | m_host.AddScriptLPS(1); |
895 | NotImplemented("llDetectedTouchBinormal"); | 898 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); |
896 | return new LSL_Vector(); | 899 | if (detectedParams == null || detectedParams.TouchBinormal == null) |
900 | return new LSL_Vector(); | ||
901 | return detectedParams.TouchBinormal; | ||
897 | } | 902 | } |
898 | 903 | ||
904 | /// <summary> | ||
905 | /// See http://wiki.secondlife.com/wiki/LlDetectedTouchFace for details | ||
906 | /// </summary> | ||
899 | public LSL_Integer llDetectedTouchFace(int index) | 907 | public LSL_Integer llDetectedTouchFace(int index) |
900 | { | 908 | { |
901 | m_host.AddScriptLPS(1); | 909 | m_host.AddScriptLPS(1); |
902 | NotImplemented("llDetectedTouchFace"); | 910 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); |
903 | return new LSL_Integer(0); | 911 | if (detectedParams == null || detectedParams.TouchFace == null) |
912 | return new LSL_Integer(-1); | ||
913 | return new LSL_Integer(detectedParams.TouchFace); | ||
904 | } | 914 | } |
905 | 915 | ||
916 | /// <summary> | ||
917 | /// See http://wiki.secondlife.com/wiki/LlDetectedTouchNormal for details | ||
918 | /// </summary> | ||
906 | public LSL_Vector llDetectedTouchNormal(int index) | 919 | public LSL_Vector llDetectedTouchNormal(int index) |
907 | { | 920 | { |
908 | m_host.AddScriptLPS(1); | 921 | m_host.AddScriptLPS(1); |
909 | NotImplemented("llDetectedTouchNormal"); | 922 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); |
910 | return new LSL_Vector(); | 923 | if (detectedParams == null || detectedParams.TouchNormal == null) |
924 | return new LSL_Vector(); | ||
925 | return detectedParams.TouchNormal; | ||
911 | } | 926 | } |
912 | 927 | ||
928 | /// <summary> | ||
929 | /// See http://wiki.secondlife.com/wiki/LlDetectedTouchPos for details | ||
930 | /// </summary> | ||
913 | public LSL_Vector llDetectedTouchPos(int index) | 931 | public LSL_Vector llDetectedTouchPos(int index) |
914 | { | 932 | { |
915 | m_host.AddScriptLPS(1); | 933 | m_host.AddScriptLPS(1); |
916 | NotImplemented("llDetectedTouchPos"); | 934 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); |
917 | return new LSL_Vector(); | 935 | if (detectedParams == null || detectedParams.TouchPos == null) |
936 | return new LSL_Vector(); | ||
937 | return detectedParams.TouchPos; | ||
918 | } | 938 | } |
919 | 939 | ||
940 | /// <summary> | ||
941 | /// See http://wiki.secondlife.com/wiki/LlDetectedTouchST for details | ||
942 | /// </summary> | ||
920 | public LSL_Vector llDetectedTouchST(int index) | 943 | public LSL_Vector llDetectedTouchST(int index) |
921 | { | 944 | { |
922 | m_host.AddScriptLPS(1); | 945 | m_host.AddScriptLPS(1); |
923 | NotImplemented("llDetectedTouchST"); | 946 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); |
924 | return new LSL_Vector(); | 947 | if (detectedParams == null || detectedParams.TouchST == null) |
948 | return new LSL_Vector(-1.0, -1.0, 0.0); | ||
949 | return detectedParams.TouchST; | ||
925 | } | 950 | } |
926 | 951 | ||
952 | /// <summary> | ||
953 | /// See http://wiki.secondlife.com/wiki/LlDetectedTouchUV for details | ||
954 | /// </summary> | ||
927 | public LSL_Vector llDetectedTouchUV(int index) | 955 | public LSL_Vector llDetectedTouchUV(int index) |
928 | { | 956 | { |
929 | m_host.AddScriptLPS(1); | 957 | m_host.AddScriptLPS(1); |
930 | NotImplemented("llDetectedTouchUV"); | 958 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); |
931 | return new LSL_Vector(); | 959 | if (detectedParams == null || detectedParams.TouchUV == null) |
960 | return new LSL_Vector(-1.0, -1.0, 0.0); | ||
961 | return detectedParams.TouchUV; | ||
932 | } | 962 | } |
933 | 963 | ||
934 | public void llDie() | 964 | public void llDie() |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index e087ea2..b97ec99 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -494,5 +494,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
494 | public const int CLICK_ACTION_OPEN = 4; | 494 | public const int CLICK_ACTION_OPEN = 4; |
495 | public const int CLICK_ACTION_PLAY = 5; | 495 | public const int CLICK_ACTION_PLAY = 5; |
496 | public const int CLICK_ACTION_OPEN_MEDIA = 6; | 496 | public const int CLICK_ACTION_OPEN_MEDIA = 6; |
497 | |||
498 | // constants for the llDetectedTouch* functions | ||
499 | public const int TOUCH_INVALID_FACE = -1; | ||
500 | public static readonly vector TOUCH_INVALID_TEXCOORD = new vector(-1.0, -1.0, 0.0); | ||
501 | public static readonly vector TOUCH_INVALID_VECTOR = ZERO_VECTOR; | ||
497 | } | 502 | } |
498 | } | 503 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs index a061fde..b9ff0cd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs | |||
@@ -80,6 +80,7 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
80 | Rotation = new LSL_Types.Quaternion(); | 80 | Rotation = new LSL_Types.Quaternion(); |
81 | Type = 0; | 81 | Type = 0; |
82 | Velocity = new LSL_Types.Vector3(); | 82 | Velocity = new LSL_Types.Vector3(); |
83 | initializeSurfaceTouch(); | ||
83 | } | 84 | } |
84 | 85 | ||
85 | public UUID Key; | 86 | public UUID Key; |
@@ -93,6 +94,61 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
93 | public int Type; | 94 | public int Type; |
94 | public LSL_Types.Vector3 Velocity; | 95 | public LSL_Types.Vector3 Velocity; |
95 | 96 | ||
97 | private LSL_Types.Vector3 touchST; | ||
98 | public LSL_Types.Vector3 TouchST { get { return touchST; } } | ||
99 | |||
100 | private LSL_Types.Vector3 touchNormal; | ||
101 | public LSL_Types.Vector3 TouchNormal { get { return touchNormal; } } | ||
102 | |||
103 | private LSL_Types.Vector3 touchBinormal; | ||
104 | public LSL_Types.Vector3 TouchBinormal { get { return touchBinormal; } } | ||
105 | |||
106 | private LSL_Types.Vector3 touchPos; | ||
107 | public LSL_Types.Vector3 TouchPos { get { return touchPos; } } | ||
108 | |||
109 | private LSL_Types.Vector3 touchUV; | ||
110 | public LSL_Types.Vector3 TouchUV { get { return touchUV; } } | ||
111 | |||
112 | private int touchFace; | ||
113 | public int TouchFace { get { return touchFace; } } | ||
114 | |||
115 | // This can be done in two places including the constructor | ||
116 | // so be carefull what gets added here | ||
117 | private void initializeSurfaceTouch() | ||
118 | { | ||
119 | touchST = new LSL_Types.Vector3(-1.0, -1.0, 0.0); | ||
120 | touchNormal = new LSL_Types.Vector3(); | ||
121 | touchBinormal = new LSL_Types.Vector3(); | ||
122 | touchPos = new LSL_Types.Vector3(); | ||
123 | touchUV = new LSL_Types.Vector3(-1.0, -1.0, 0.0); | ||
124 | touchFace = -1; | ||
125 | } | ||
126 | |||
127 | /* | ||
128 | * Set up the surface touch detected values | ||
129 | */ | ||
130 | public SurfaceTouchEventArgs SurfaceTouchArgs | ||
131 | { | ||
132 | set | ||
133 | { | ||
134 | if (value == null) | ||
135 | { | ||
136 | // Initialise to defaults if no value | ||
137 | initializeSurfaceTouch(); | ||
138 | } | ||
139 | else | ||
140 | { | ||
141 | // Set the values from the touch data provided by the client | ||
142 | touchST = new LSL_Types.Vector3(value.STCoord.X, value.STCoord.Y, value.STCoord.Z); | ||
143 | touchUV = new LSL_Types.Vector3(value.UVCoord.X, value.UVCoord.Y, value.UVCoord.Z); | ||
144 | touchNormal = new LSL_Types.Vector3(value.Normal.X, value.Normal.Y, value.Normal.Z); | ||
145 | touchBinormal = new LSL_Types.Vector3(value.Binormal.X, value.Binormal.Y, value.Binormal.Z); | ||
146 | touchPos = new LSL_Types.Vector3(value.Position.X, value.Position.Y, value.Position.Z); | ||
147 | touchFace = value.FaceIndex; | ||
148 | } | ||
149 | } | ||
150 | } | ||
151 | |||
96 | public void Populate(Scene scene) | 152 | public void Populate(Scene scene) |
97 | { | 153 | { |
98 | SceneObjectPart part = scene.GetSceneObjectPart(Key); | 154 | SceneObjectPart part = scene.GetSceneObjectPart(Key); |
@@ -177,4 +233,4 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
177 | public Object[] Params; | 233 | public Object[] Params; |
178 | public DetectParams[] DetectParams; | 234 | public DetectParams[] DetectParams; |
179 | } | 235 | } |
180 | } \ No newline at end of file | 236 | } |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index 9ed2fbb..67ac0ce 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs | |||
@@ -80,7 +80,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
80 | } | 80 | } |
81 | 81 | ||
82 | public void touch_start(uint localID, uint originalID, Vector3 offsetPos, | 82 | public void touch_start(uint localID, uint originalID, Vector3 offsetPos, |
83 | IClientAPI remoteClient) | 83 | IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) |
84 | { | 84 | { |
85 | // Add to queue for all scripts in ObjectID object | 85 | // Add to queue for all scripts in ObjectID object |
86 | DetectParams[] det = new DetectParams[1]; | 86 | DetectParams[] det = new DetectParams[1]; |
@@ -102,6 +102,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
102 | det[0].LinkNum = originalPart.LinkNum; | 102 | det[0].LinkNum = originalPart.LinkNum; |
103 | } | 103 | } |
104 | 104 | ||
105 | if (surfaceArgs != null) | ||
106 | { | ||
107 | det[0].SurfaceTouchArgs = surfaceArgs; | ||
108 | } | ||
109 | |||
105 | myScriptEngine.PostObjectEvent(localID, new EventParams( | 110 | myScriptEngine.PostObjectEvent(localID, new EventParams( |
106 | "touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, | 111 | "touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, |
107 | det)); | 112 | det)); |
diff --git a/OpenSim/ScriptEngine/Components/DotNetEngine/Events/LSLEventProvider.cs b/OpenSim/ScriptEngine/Components/DotNetEngine/Events/LSLEventProvider.cs index a2f855c..0641613 100644 --- a/OpenSim/ScriptEngine/Components/DotNetEngine/Events/LSLEventProvider.cs +++ b/OpenSim/ScriptEngine/Components/DotNetEngine/Events/LSLEventProvider.cs | |||
@@ -84,7 +84,7 @@ namespace OpenSim.ScriptEngine.Components.DotNetEngine.Events | |||
84 | RezScript(localID, itemID, script, startParam, postOnRez, engine); | 84 | RezScript(localID, itemID, script, startParam, postOnRez, engine); |
85 | } | 85 | } |
86 | 86 | ||
87 | private void OnObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient) | 87 | private void OnObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) |
88 | { | 88 | { |
89 | // Add to queue for all scripts in ObjectID object | 89 | // Add to queue for all scripts in ObjectID object |
90 | DetectParams[] det = new DetectParams[1]; | 90 | DetectParams[] det = new DetectParams[1]; |
@@ -108,7 +108,10 @@ namespace OpenSim.ScriptEngine.Components.DotNetEngine.Events | |||
108 | CurrentRegion.Scene.GetSceneObjectPart(originalID); | 108 | CurrentRegion.Scene.GetSceneObjectPart(originalID); |
109 | det[0].LinkNum = originalPart.LinkNum; | 109 | det[0].LinkNum = originalPart.LinkNum; |
110 | } | 110 | } |
111 | 111 | if (surfaceArgs != null) | |
112 | { | ||
113 | det[0].SurfaceTouchArgs = surfaceArgs; | ||
114 | } | ||
112 | Shared.EventParams ep = | 115 | Shared.EventParams ep = |
113 | new Shared.EventParams(localID, "touch_start", new Object[] {new LSL_Types.LSLInteger(1)}, det); | 116 | new Shared.EventParams(localID, "touch_start", new Object[] {new LSL_Types.LSLInteger(1)}, det); |
114 | CurrentRegion.Executors_Execute(ep); | 117 | CurrentRegion.Executors_Execute(ep); |