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 /OpenSim/Region/ScriptEngine/Shared/Api/Implementation | |
parent | temporarily fix the build break with building the OdePlugin tests assembly. (diff) | |
download | opensim-SC-3e456163dd284fa04ab17465041a1a27f7b632b9.zip opensim-SC-3e456163dd284fa04ab17465041a1a27f7b632b9.tar.gz opensim-SC-3e456163dd284fa04ab17465041a1a27f7b632b9.tar.bz2 opensim-SC-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 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 166 |
1 files changed, 153 insertions, 13 deletions
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) |