diff options
author | Justin Clark-Casey (justincc) | 2011-07-12 22:13:15 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-07-12 22:13:15 +0100 |
commit | 3e456163dd284fa04ab17465041a1a27f7b632b9 (patch) | |
tree | baaa8a470f4afa7637e8919d41e161ec4215ce21 | |
parent | temporarily fix the build break with building the OdePlugin tests assembly. (diff) | |
download | opensim-SC_OLD-3e456163dd284fa04ab17465041a1a27f7b632b9.zip opensim-SC_OLD-3e456163dd284fa04ab17465041a1a27f7b632b9.tar.gz opensim-SC_OLD-3e456163dd284fa04ab17465041a1a27f7b632b9.tar.bz2 opensim-SC_OLD-3e456163dd284fa04ab17465041a1a27f7b632b9.tar.xz |
Port implementation of llCastRay() from Aurora.
I haven't been able to test this since the viewer won't parse the llCastRay() function. Maybe some activation cap is missing. Could wait until it is activated by default in the viewer.
Diffstat (limited to '')
6 files changed, 298 insertions, 33 deletions
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs index 13ea084..0de4626 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs | |||
@@ -37,6 +37,18 @@ namespace OpenSim.Region.Physics.Manager | |||
37 | public delegate void physicsCrash(); | 37 | public delegate void physicsCrash(); |
38 | 38 | ||
39 | public delegate void RaycastCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal); | 39 | public delegate void RaycastCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal); |
40 | public delegate void RayCallback(List<ContactResult> list); | ||
41 | |||
42 | /// <summary> | ||
43 | /// Contact result from a raycast. | ||
44 | /// </summary> | ||
45 | public struct ContactResult | ||
46 | { | ||
47 | public Vector3 Pos; | ||
48 | public float Depth; | ||
49 | public uint ConsumerID; | ||
50 | public Vector3 Normal; | ||
51 | } | ||
40 | 52 | ||
41 | public abstract class PhysicsScene | 53 | public abstract class PhysicsScene |
42 | { | 54 | { |
@@ -61,7 +73,6 @@ namespace OpenSim.Region.Physics.Manager | |||
61 | } | 73 | } |
62 | } | 74 | } |
63 | 75 | ||
64 | |||
65 | public abstract void Initialise(IMesher meshmerizer, IConfigSource config); | 76 | public abstract void Initialise(IMesher meshmerizer, IConfigSource config); |
66 | 77 | ||
67 | public abstract PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying); | 78 | public abstract PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying); |
@@ -225,6 +236,17 @@ namespace OpenSim.Region.Physics.Manager | |||
225 | retMethod(false, Vector3.Zero, 0, 999999999999f, Vector3.Zero); | 236 | retMethod(false, Vector3.Zero, 0, 999999999999f, Vector3.Zero); |
226 | } | 237 | } |
227 | 238 | ||
239 | public virtual void RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayCallback retMethod) | ||
240 | { | ||
241 | if (retMethod != null) | ||
242 | retMethod(new List<ContactResult>()); | ||
243 | } | ||
244 | |||
245 | public virtual List<ContactResult> RaycastWorld(Vector3 position, Vector3 direction, float length, int Count) | ||
246 | { | ||
247 | return new List<ContactResult>(); | ||
248 | } | ||
249 | |||
228 | private class NullPhysicsScene : PhysicsScene | 250 | private class NullPhysicsScene : PhysicsScene |
229 | { | 251 | { |
230 | private static int m_workIndicator; | 252 | private static int m_workIndicator; |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs index ba77dae..6c2bdde 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODERayCastRequestManager.cs | |||
@@ -45,11 +45,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
45 | public class ODERayCastRequestManager | 45 | public class ODERayCastRequestManager |
46 | { | 46 | { |
47 | /// <summary> | 47 | /// <summary> |
48 | /// Pending Raycast Requests | 48 | /// Pending raycast requests |
49 | /// </summary> | 49 | /// </summary> |
50 | protected List<ODERayCastRequest> m_PendingRequests = new List<ODERayCastRequest>(); | 50 | protected List<ODERayCastRequest> m_PendingRequests = new List<ODERayCastRequest>(); |
51 | 51 | ||
52 | /// <summary> | 52 | /// <summary> |
53 | /// Pending ray requests | ||
54 | /// </summary> | ||
55 | protected List<ODERayRequest> m_PendingRayRequests = new List<ODERayRequest>(); | ||
56 | |||
57 | /// <summary> | ||
53 | /// Scene that created this object. | 58 | /// Scene that created this object. |
54 | /// </summary> | 59 | /// </summary> |
55 | private OdeScene m_scene; | 60 | private OdeScene m_scene; |
@@ -96,6 +101,29 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
96 | } | 101 | } |
97 | 102 | ||
98 | /// <summary> | 103 | /// <summary> |
104 | /// Queues a raycast | ||
105 | /// </summary> | ||
106 | /// <param name="position">Origin of Ray</param> | ||
107 | /// <param name="direction">Ray normal</param> | ||
108 | /// <param name="length">Ray length</param> | ||
109 | /// <param name="count"></param> | ||
110 | /// <param name="retMethod">Return method to send the results</param> | ||
111 | public void QueueRequest(Vector3 position, Vector3 direction, float length, int count, RayCallback retMethod) | ||
112 | { | ||
113 | lock (m_PendingRequests) | ||
114 | { | ||
115 | ODERayRequest req = new ODERayRequest(); | ||
116 | req.callbackMethod = retMethod; | ||
117 | req.length = length; | ||
118 | req.Normal = direction; | ||
119 | req.Origin = position; | ||
120 | req.Count = count; | ||
121 | |||
122 | m_PendingRayRequests.Add(req); | ||
123 | } | ||
124 | } | ||
125 | |||
126 | /// <summary> | ||
99 | /// Process all queued raycast requests | 127 | /// Process all queued raycast requests |
100 | /// </summary> | 128 | /// </summary> |
101 | /// <returns>Time in MS the raycasts took to process.</returns> | 129 | /// <returns>Time in MS the raycasts took to process.</returns> |
@@ -112,15 +140,23 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
112 | if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast | 140 | if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast |
113 | RayCast(reqs[i]); // if there isn't anyone to send results | 141 | RayCast(reqs[i]); // if there isn't anyone to send results |
114 | } | 142 | } |
115 | /* | 143 | |
116 | foreach (ODERayCastRequest req in m_PendingRequests) | 144 | m_PendingRequests.Clear(); |
145 | } | ||
146 | } | ||
147 | |||
148 | lock (m_PendingRayRequests) | ||
149 | { | ||
150 | if (m_PendingRayRequests.Count > 0) | ||
151 | { | ||
152 | ODERayRequest[] reqs = m_PendingRayRequests.ToArray(); | ||
153 | for (int i = 0; i < reqs.Length; i++) | ||
117 | { | 154 | { |
118 | if (req.callbackMethod != null) // quick optimization here, don't raycast | 155 | if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast |
119 | RayCast(req); // if there isn't anyone to send results to | 156 | RayCast(reqs[i]); // if there isn't anyone to send results |
120 | |||
121 | } | 157 | } |
122 | */ | 158 | |
123 | m_PendingRequests.Clear(); | 159 | m_PendingRayRequests.Clear(); |
124 | } | 160 | } |
125 | } | 161 | } |
126 | 162 | ||
@@ -146,7 +182,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
146 | // Remove Ray | 182 | // Remove Ray |
147 | d.GeomDestroy(ray); | 183 | d.GeomDestroy(ray); |
148 | 184 | ||
149 | |||
150 | // Define default results | 185 | // Define default results |
151 | bool hitYN = false; | 186 | bool hitYN = false; |
152 | uint hitConsumerID = 0; | 187 | uint hitConsumerID = 0; |
@@ -177,6 +212,31 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
177 | req.callbackMethod(hitYN, closestcontact, hitConsumerID, distance, snormal); | 212 | req.callbackMethod(hitYN, closestcontact, hitConsumerID, distance, snormal); |
178 | } | 213 | } |
179 | 214 | ||
215 | /// <summary> | ||
216 | /// Method that actually initiates the raycast | ||
217 | /// </summary> | ||
218 | /// <param name="req"></param> | ||
219 | private void RayCast(ODERayRequest req) | ||
220 | { | ||
221 | // Create the ray | ||
222 | IntPtr ray = d.CreateRay(m_scene.space, req.length); | ||
223 | d.GeomRaySet(ray, req.Origin.X, req.Origin.Y, req.Origin.Z, req.Normal.X, req.Normal.Y, req.Normal.Z); | ||
224 | |||
225 | // Collide test | ||
226 | d.SpaceCollide2(m_scene.space, ray, IntPtr.Zero, nearCallback); | ||
227 | |||
228 | // Remove Ray | ||
229 | d.GeomDestroy(ray); | ||
230 | |||
231 | // Find closest contact and object. | ||
232 | lock (m_contactResults) | ||
233 | { | ||
234 | // Return results | ||
235 | if (req.callbackMethod != null) | ||
236 | req.callbackMethod(m_contactResults); | ||
237 | } | ||
238 | } | ||
239 | |||
180 | // This is the standard Near. Uses space AABBs to speed up detection. | 240 | // This is the standard Near. Uses space AABBs to speed up detection. |
181 | private void near(IntPtr space, IntPtr g1, IntPtr g2) | 241 | private void near(IntPtr space, IntPtr g1, IntPtr g2) |
182 | { | 242 | { |
@@ -342,10 +402,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
342 | m_contactResults.Add(collisionresult); | 402 | m_contactResults.Add(collisionresult); |
343 | } | 403 | } |
344 | } | 404 | } |
345 | |||
346 | |||
347 | } | 405 | } |
348 | |||
349 | } | 406 | } |
350 | 407 | ||
351 | /// <summary> | 408 | /// <summary> |
@@ -365,11 +422,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
365 | public RaycastCallback callbackMethod; | 422 | public RaycastCallback callbackMethod; |
366 | } | 423 | } |
367 | 424 | ||
368 | public struct ContactResult | 425 | public struct ODERayRequest |
369 | { | 426 | { |
370 | public Vector3 Pos; | 427 | public Vector3 Origin; |
371 | public float Depth; | ||
372 | public uint ConsumerID; | ||
373 | public Vector3 Normal; | 428 | public Vector3 Normal; |
429 | public int Count; | ||
430 | public float length; | ||
431 | public RayCallback callbackMethod; | ||
374 | } | 432 | } |
375 | } | 433 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 7b8a80c..ba8cba4 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs | |||
@@ -3736,6 +3736,34 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name); | |||
3736 | } | 3736 | } |
3737 | } | 3737 | } |
3738 | 3738 | ||
3739 | public override void RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayCallback retMethod) | ||
3740 | { | ||
3741 | if (retMethod != null) | ||
3742 | { | ||
3743 | m_rayCastManager.QueueRequest(position, direction, length, Count, retMethod); | ||
3744 | } | ||
3745 | } | ||
3746 | |||
3747 | public override List<ContactResult> RaycastWorld(Vector3 position, Vector3 direction, float length, int Count) | ||
3748 | { | ||
3749 | ContactResult[] ourResults = null; | ||
3750 | RayCallback retMethod = delegate(List<ContactResult> results) | ||
3751 | { | ||
3752 | ourResults = new ContactResult[results.Count]; | ||
3753 | results.CopyTo(ourResults, 0); | ||
3754 | }; | ||
3755 | int waitTime = 0; | ||
3756 | m_rayCastManager.QueueRequest(position, direction, length, Count, retMethod); | ||
3757 | while (ourResults == null && waitTime < 1000) | ||
3758 | { | ||
3759 | Thread.Sleep(1); | ||
3760 | waitTime++; | ||
3761 | } | ||
3762 | if (ourResults == null) | ||
3763 | return new List<ContactResult> (); | ||
3764 | return new List<ContactResult>(ourResults); | ||
3765 | } | ||
3766 | |||
3739 | #if USE_DRAWSTUFF | 3767 | #if USE_DRAWSTUFF |
3740 | // Keyboard callback | 3768 | // Keyboard callback |
3741 | public void command(int cmd) | 3769 | public void command(int cmd) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index fd6d64c..c8bce60 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -10309,51 +10309,191 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10309 | return rq.ToString(); | 10309 | return rq.ToString(); |
10310 | } | 10310 | } |
10311 | 10311 | ||
10312 | public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) | ||
10313 | { | ||
10314 | m_host.AddScriptLPS(1); | ||
10315 | |||
10316 | Vector3 dir = new Vector3((float)(end-start).x, (float)(end-start).y, (float)(end-start).z); | ||
10317 | Vector3 startvector = new Vector3((float)start.x, (float)start.y, (float)start.z); | ||
10318 | Vector3 endvector = new Vector3((float)end.x, (float)end.y, (float)end.z); | ||
10319 | |||
10320 | int count = 0; | ||
10321 | // int detectPhantom = 0; | ||
10322 | int dataFlags = 0; | ||
10323 | int rejectTypes = 0; | ||
10324 | |||
10325 | for (int i = 0; i < options.Length; i += 2) | ||
10326 | { | ||
10327 | if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_MAX_HITS) | ||
10328 | { | ||
10329 | count = options.GetLSLIntegerItem(i + 1); | ||
10330 | } | ||
10331 | // else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DETECT_PHANTOM) | ||
10332 | // { | ||
10333 | // detectPhantom = options.GetLSLIntegerItem(i + 1); | ||
10334 | // } | ||
10335 | else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DATA_FLAGS) | ||
10336 | { | ||
10337 | dataFlags = options.GetLSLIntegerItem(i + 1); | ||
10338 | } | ||
10339 | else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_REJECT_TYPES) | ||
10340 | { | ||
10341 | rejectTypes = options.GetLSLIntegerItem(i + 1); | ||
10342 | } | ||
10343 | } | ||
10344 | |||
10345 | LSL_List list = new LSL_List(); | ||
10346 | List<ContactResult> results = World.PhysicsScene.RaycastWorld(startvector, dir, dir.Length(), count); | ||
10347 | |||
10348 | double distance = Util.GetDistanceTo(startvector, endvector); | ||
10349 | |||
10350 | if (distance == 0) | ||
10351 | distance = 0.001; | ||
10352 | |||
10353 | Vector3 posToCheck = startvector; | ||
10354 | ITerrainChannel channel = World.RequestModuleInterface<ITerrainChannel>(); | ||
10355 | |||
10356 | bool checkTerrain = !((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) == ScriptBaseClass.RC_REJECT_LAND); | ||
10357 | bool checkAgents = !((rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) == ScriptBaseClass.RC_REJECT_AGENTS); | ||
10358 | bool checkNonPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_NONPHYSICAL) == ScriptBaseClass.RC_REJECT_NONPHYSICAL); | ||
10359 | bool checkPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_PHYSICAL) == ScriptBaseClass.RC_REJECT_PHYSICAL); | ||
10360 | |||
10361 | for (float i = 0; i <= distance; i += 0.1f) | ||
10362 | { | ||
10363 | posToCheck = startvector + (dir * (i / (float)distance)); | ||
10364 | |||
10365 | if (checkTerrain && channel[(int)(posToCheck.X + startvector.X), (int)(posToCheck.Y + startvector.Y)] < posToCheck.Z) | ||
10366 | { | ||
10367 | ContactResult result = new ContactResult(); | ||
10368 | result.ConsumerID = 0; | ||
10369 | result.Depth = 0; | ||
10370 | result.Normal = Vector3.Zero; | ||
10371 | result.Pos = posToCheck; | ||
10372 | results.Add(result); | ||
10373 | checkTerrain = false; | ||
10374 | } | ||
10375 | |||
10376 | if (checkAgents) | ||
10377 | { | ||
10378 | World.ForEachScenePresence(delegate(ScenePresence sp) | ||
10379 | { | ||
10380 | if (sp.AbsolutePosition.ApproxEquals(posToCheck, sp.PhysicsActor.Size.X)) | ||
10381 | { | ||
10382 | ContactResult result = new ContactResult (); | ||
10383 | result.ConsumerID = sp.LocalId; | ||
10384 | result.Depth = 0; | ||
10385 | result.Normal = Vector3.Zero; | ||
10386 | result.Pos = posToCheck; | ||
10387 | results.Add(result); | ||
10388 | } | ||
10389 | }); | ||
10390 | } | ||
10391 | } | ||
10392 | |||
10393 | int refcount = 0; | ||
10394 | foreach (ContactResult result in results) | ||
10395 | { | ||
10396 | if ((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) | ||
10397 | == ScriptBaseClass.RC_REJECT_LAND && result.ConsumerID == 0) | ||
10398 | continue; | ||
10399 | |||
10400 | ISceneEntity entity = World.GetSceneObjectPart(result.ConsumerID); | ||
10401 | |||
10402 | if (entity == null && (rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) != ScriptBaseClass.RC_REJECT_AGENTS) | ||
10403 | entity = World.GetScenePresence(result.ConsumerID); //Only check if we should be looking for agents | ||
10404 | |||
10405 | if (entity == null) | ||
10406 | { | ||
10407 | list.Add(UUID.Zero); | ||
10408 | |||
10409 | if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM) | ||
10410 | list.Add(0); | ||
10411 | |||
10412 | list.Add(result.Pos); | ||
10413 | |||
10414 | if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) | ||
10415 | list.Add(result.Normal); | ||
10416 | |||
10417 | continue; //Can't find it, so add UUID.Zero | ||
10418 | } | ||
10419 | |||
10420 | /*if (detectPhantom == 0 && intersection.obj is ISceneChildEntity && | ||
10421 | ((ISceneChildEntity)intersection.obj).PhysActor == null) | ||
10422 | continue;*/ //Can't do this ATM, physics engine knows only of non phantom objects | ||
10423 | |||
10424 | if (entity is SceneObjectPart) | ||
10425 | { | ||
10426 | if (((SceneObjectPart)entity).PhysActor != null && ((SceneObjectPart)entity).PhysActor.IsPhysical) | ||
10427 | { | ||
10428 | if (!checkPhysical) | ||
10429 | continue; | ||
10430 | } | ||
10431 | else | ||
10432 | { | ||
10433 | if (!checkNonPhysical) | ||
10434 | continue; | ||
10435 | } | ||
10436 | } | ||
10437 | |||
10438 | refcount++; | ||
10439 | if ((dataFlags & ScriptBaseClass.RC_GET_ROOT_KEY) == ScriptBaseClass.RC_GET_ROOT_KEY && entity is SceneObjectPart) | ||
10440 | list.Add(((SceneObjectPart)entity).ParentGroup.UUID); | ||
10441 | else | ||
10442 | list.Add(entity.UUID); | ||
10443 | |||
10444 | if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM) | ||
10445 | { | ||
10446 | if (entity is SceneObjectPart) | ||
10447 | list.Add(((SceneObjectPart)entity).LinkNum); | ||
10448 | else | ||
10449 | list.Add(0); | ||
10450 | } | ||
10451 | |||
10452 | list.Add(result.Pos); | ||
10453 | |||
10454 | if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) | ||
10455 | list.Add(result.Normal); | ||
10456 | } | ||
10457 | |||
10458 | list.Add(refcount); //The status code, either the # of contacts, RCERR_SIM_PERF_LOW, or RCERR_CAST_TIME_EXCEEDED | ||
10459 | |||
10460 | return list; | ||
10461 | } | ||
10462 | |||
10312 | #region Not Implemented | 10463 | #region Not Implemented |
10313 | // | 10464 | // |
10314 | // Listing the unimplemented lsl functions here, please move | 10465 | // Listing the unimplemented lsl functions here, please move |
10315 | // them from this region as they are completed | 10466 | // them from this region as they are completed |
10316 | // | 10467 | // |
10317 | public void llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) | ||
10318 | { | ||
10319 | m_host.AddScriptLPS(1); | ||
10320 | NotImplemented("llCastRay"); | ||
10321 | |||
10322 | } | ||
10323 | 10468 | ||
10324 | public void llGetEnv(LSL_String name) | 10469 | public void llGetEnv(LSL_String name) |
10325 | { | 10470 | { |
10326 | m_host.AddScriptLPS(1); | 10471 | m_host.AddScriptLPS(1); |
10327 | NotImplemented("llGetEnv"); | 10472 | NotImplemented("llGetEnv"); |
10328 | |||
10329 | } | 10473 | } |
10330 | 10474 | ||
10331 | public void llGetSPMaxMemory() | 10475 | public void llGetSPMaxMemory() |
10332 | { | 10476 | { |
10333 | m_host.AddScriptLPS(1); | 10477 | m_host.AddScriptLPS(1); |
10334 | NotImplemented("llGetSPMaxMemory"); | 10478 | NotImplemented("llGetSPMaxMemory"); |
10335 | |||
10336 | } | 10479 | } |
10337 | 10480 | ||
10338 | public void llGetUsedMemory() | 10481 | public void llGetUsedMemory() |
10339 | { | 10482 | { |
10340 | m_host.AddScriptLPS(1); | 10483 | m_host.AddScriptLPS(1); |
10341 | NotImplemented("llGetUsedMemory"); | 10484 | NotImplemented("llGetUsedMemory"); |
10342 | |||
10343 | } | 10485 | } |
10344 | 10486 | ||
10345 | public void llRegionSayTo( LSL_Key target, LSL_Integer channel, LSL_String msg ) | 10487 | public void llRegionSayTo(LSL_Key target, LSL_Integer channel, LSL_String msg) |
10346 | { | 10488 | { |
10347 | m_host.AddScriptLPS(1); | 10489 | m_host.AddScriptLPS(1); |
10348 | NotImplemented("llRegionSayTo"); | 10490 | NotImplemented("llRegionSayTo"); |
10349 | |||
10350 | } | 10491 | } |
10351 | 10492 | ||
10352 | public void llScriptProfiler( LSL_Integer flags ) | 10493 | public void llScriptProfiler(LSL_Integer flags) |
10353 | { | 10494 | { |
10354 | m_host.AddScriptLPS(1); | 10495 | m_host.AddScriptLPS(1); |
10355 | NotImplemented("llScriptProfiler"); | 10496 | NotImplemented("llScriptProfiler"); |
10356 | |||
10357 | } | 10497 | } |
10358 | 10498 | ||
10359 | public void llSetSoundQueueing(int queue) | 10499 | public void llSetSoundQueueing(int queue) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 654ea81..27f9c84 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs | |||
@@ -60,6 +60,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
60 | LSL_String llBase64ToString(string str); | 60 | LSL_String llBase64ToString(string str); |
61 | void llBreakAllLinks(); | 61 | void llBreakAllLinks(); |
62 | void llBreakLink(int linknum); | 62 | void llBreakLink(int linknum); |
63 | LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options); | ||
63 | LSL_Integer llCeil(double f); | 64 | LSL_Integer llCeil(double f); |
64 | void llClearCameraParams(); | 65 | void llClearCameraParams(); |
65 | LSL_Integer llClearPrimMedia(LSL_Integer face); | 66 | LSL_Integer llClearPrimMedia(LSL_Integer face); |
@@ -404,7 +405,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
404 | LSL_String llXorBase64StringsCorrect(string str1, string str2); | 405 | LSL_String llXorBase64StringsCorrect(string str1, string str2); |
405 | void print(string str); | 406 | void print(string str); |
406 | 407 | ||
407 | void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules); | 408 | void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules); |
408 | LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules); | 409 | LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules); |
409 | } | 410 | } |
410 | } | 411 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 9377cda..3f90788 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -593,5 +593,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
593 | 593 | ||
594 | public const string URL_REQUEST_GRANTED = "URL_REQUEST_GRANTED"; | 594 | public const string URL_REQUEST_GRANTED = "URL_REQUEST_GRANTED"; |
595 | public const string URL_REQUEST_DENIED = "URL_REQUEST_DENIED"; | 595 | public const string URL_REQUEST_DENIED = "URL_REQUEST_DENIED"; |
596 | |||
597 | public static readonly LSLInteger RC_REJECT_TYPES = 2; | ||
598 | public static readonly LSLInteger RC_DATA_FLAGS = 4; | ||
599 | public static readonly LSLInteger RC_MAX_HITS = 8; | ||
600 | public static readonly LSLInteger RC_DETECT_PHANTOM = 16; | ||
601 | |||
602 | public static readonly LSLInteger RC_REJECT_AGENTS = 2; | ||
603 | public static readonly LSLInteger RC_REJECT_PHYSICAL = 4; | ||
604 | public static readonly LSLInteger RC_REJECT_NONPHYSICAL = 8; | ||
605 | public static readonly LSLInteger RC_REJECT_LAND = 16; | ||
606 | |||
607 | public static readonly LSLInteger RC_GET_NORMAL = 2; | ||
608 | public static readonly LSLInteger RC_GET_ROOT_KEY = 4; | ||
609 | public static readonly LSLInteger RC_GET_LINK_NUM = 8; | ||
610 | |||
611 | public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 1; | ||
596 | } | 612 | } |
597 | } | 613 | } |