diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectPart.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 7bab3b6..e68632b 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -535,6 +535,91 @@ namespace OpenSim.Region.Environment.Scenes | |||
535 | serializer.Serialize(xmlWriter, this); | 535 | serializer.Serialize(xmlWriter, this); |
536 | } | 536 | } |
537 | 537 | ||
538 | public EntityIntersection testIntersection(Ray iray, Quaternion parentrot) | ||
539 | { | ||
540 | |||
541 | //Sphere dummysphere = new Sphere(); | ||
542 | |||
543 | EntityIntersection returnresult = new EntityIntersection(); | ||
544 | Vector3 vAbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z); | ||
545 | Vector3 vScale = new Vector3(Scale.X, Scale.Y, Scale.Z); | ||
546 | Quaternion qRotation = new Quaternion(RotationOffset.W, RotationOffset.X, RotationOffset.Y, RotationOffset.Z); | ||
547 | |||
548 | |||
549 | |||
550 | Quaternion worldRotation = (qRotation * parentrot); | ||
551 | Matrix3 worldRotM = worldRotation.ToRotationMatrix(); | ||
552 | |||
553 | |||
554 | |||
555 | Vector3 rOrigin = iray.Origin; | ||
556 | Vector3 rDirection = iray.Direction; | ||
557 | |||
558 | |||
559 | |||
560 | Vector3 r2ndDirection = rDirection * rDirection; | ||
561 | |||
562 | float itestPart1 = r2ndDirection.x + r2ndDirection.y + r2ndDirection.z; | ||
563 | |||
564 | Vector3 tmVal2 = rOrigin - vAbsolutePosition; | ||
565 | |||
566 | Vector3 r2Direction = rDirection * 2.0f; | ||
567 | Vector3 tmVal3 = r2Direction * tmVal2; | ||
568 | |||
569 | float itestPart2 = tmVal3.x + tmVal3.y + tmVal3.z; | ||
570 | |||
571 | Vector3 tmVal4 = rOrigin * rOrigin; | ||
572 | Vector3 tmVal5 = vAbsolutePosition * vAbsolutePosition; | ||
573 | |||
574 | Vector3 tmVal6 = vAbsolutePosition * rOrigin; | ||
575 | |||
576 | float radius = 0f; | ||
577 | if (vScale.x > radius) | ||
578 | radius = vScale.x; | ||
579 | if (vScale.y > radius) | ||
580 | radius = vScale.y; | ||
581 | if (vScale.z > radius) | ||
582 | radius = vScale.z; | ||
583 | |||
584 | //radius = radius; | ||
585 | |||
586 | float itestPart3 = tmVal4.x + tmVal4.y + tmVal4.z + tmVal5.x + tmVal5.y + tmVal5.z -(2.0f * (tmVal6.x + tmVal6.y + tmVal6.z + (radius * radius))); | ||
587 | |||
588 | // Yuk Quadradrics | ||
589 | float rootsqr = (itestPart2 * itestPart2) - (4.0f * itestPart1 * itestPart3); | ||
590 | if (rootsqr < 0.0f) | ||
591 | { | ||
592 | |||
593 | return returnresult; | ||
594 | } | ||
595 | float root = ((-itestPart2) - (float)Math.Sqrt((double)rootsqr)) / (itestPart1 * 2.0f); | ||
596 | |||
597 | if (root < 0.0f) | ||
598 | { | ||
599 | // perform second quadratic root solution | ||
600 | root = ((-itestPart2) + (float)Math.Sqrt((double)rootsqr)) / (itestPart1 * 2.0f); | ||
601 | |||
602 | // is there any intersection? | ||
603 | if (root < 0.0f) | ||
604 | { | ||
605 | |||
606 | return returnresult; | ||
607 | } | ||
608 | } | ||
609 | |||
610 | Vector3 ipoint = new Vector3(iray.Origin.x + (iray.Direction.x * root),iray.Origin.y + (iray.Direction.y * root),iray.Origin.z + (iray.Direction.z * root)); | ||
611 | |||
612 | returnresult.HitTF = true; | ||
613 | returnresult.ipoint = ipoint; | ||
614 | Vector3 normalpart = ipoint-vAbsolutePosition; | ||
615 | returnresult.normal = normalpart.Normalize(); | ||
616 | returnresult.distance = ParentGroup.m_scene.m_innerScene.Vector3Distance(iray.Origin, ipoint); | ||
617 | |||
618 | return returnresult; | ||
619 | } | ||
620 | |||
621 | |||
622 | |||
538 | /// <summary> | 623 | /// <summary> |
539 | /// | 624 | /// |
540 | /// </summary> | 625 | /// </summary> |