Merge branch 'ubitwork' into avination
commit
51354bad48
|
@ -2103,12 +2103,29 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
|
// if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
|
||||||
{
|
// {
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m",
|
// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m",
|
||||||
// Name, part.Name, part.LocalId);
|
// Name, part.Name, part.LocalId);
|
||||||
|
|
||||||
|
if (m_scene.PhysicsScene != null &&
|
||||||
|
part.PhysActor != null &&
|
||||||
|
Util.GetDistanceTo(AbsolutePosition, pos) <= 30)
|
||||||
|
{
|
||||||
|
|
||||||
|
Vector3 camdif = CameraPosition - part.AbsolutePosition;
|
||||||
|
camdif.Normalize();
|
||||||
|
|
||||||
|
// m_log.InfoFormat("sit {0} {1}", offset.ToString(), camdif.ToString());
|
||||||
|
|
||||||
|
if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
|
||||||
|
{
|
||||||
|
|
||||||
AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
|
AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
|
||||||
canSit = true;
|
canSit = true;
|
||||||
}
|
}
|
||||||
|
@ -2196,197 +2213,54 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
SendSitResponse(targetID, offset, Quaternion.Identity);
|
SendSitResponse(targetID, offset, Quaternion.Identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation)
|
||||||
public void SitRayCastAvatarPosition(SceneObjectPart part)
|
|
||||||
{
|
{
|
||||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
|
||||||
Vector3 StartRayCastPosition = AbsolutePosition;
|
|
||||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
|
||||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
|
||||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SitRayCastAvatarPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
if (status < 0)
|
||||||
{
|
|
||||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
|
||||||
if (part != null)
|
|
||||||
{
|
|
||||||
if (hitYN)
|
|
||||||
{
|
|
||||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
|
||||||
{
|
|
||||||
SitRaycastFindEdge(collisionPoint, normal);
|
|
||||||
m_log.DebugFormat("[SIT]: Raycast Avatar Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SitRayCastAvatarPositionCameraZ(part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SitRayCastAvatarPositionCameraZ(part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
||||||
m_requestedSitTargetUUID = UUID.Zero;
|
return;
|
||||||
m_requestedSitTargetID = 0;
|
|
||||||
m_requestedSitOffset = Vector3.Zero;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
if (status == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
public void SitRayCastAvatarPositionCameraZ(SceneObjectPart part)
|
SceneObjectPart part = m_scene.GetSceneObjectPart(partID);
|
||||||
{
|
if (part == null || part.ParentGroup.IsAttachment)
|
||||||
// Next, try to raycast from the camera Z position
|
|
||||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
|
||||||
Vector3 StartRayCastPosition = AbsolutePosition; StartRayCastPosition.Z = CameraPosition.Z;
|
|
||||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
|
||||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
|
||||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionCameraZResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SitRayCastAvatarPositionCameraZResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
|
||||||
{
|
|
||||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
|
||||||
if (part != null)
|
|
||||||
{
|
{
|
||||||
if (hitYN)
|
return;
|
||||||
{
|
|
||||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
|
||||||
{
|
|
||||||
SitRaycastFindEdge(collisionPoint, normal);
|
|
||||||
m_log.DebugFormat("[SIT]: Raycast Avatar Position + CameraZ succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SitRayCastCameraPosition(part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SitRayCastCameraPosition(part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
|
||||||
m_requestedSitTargetUUID = UUID.Zero;
|
|
||||||
m_requestedSitTargetID = 0;
|
|
||||||
m_requestedSitOffset = Vector3.Zero;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString());
|
||||||
|
|
||||||
|
part.AddSittingAvatar(UUID);
|
||||||
|
|
||||||
|
Vector3 cameraAtOffset = part.GetCameraAtOffset();
|
||||||
|
Vector3 cameraEyeOffset = part.GetCameraEyeOffset();
|
||||||
|
bool forceMouselook = part.GetForceMouselook();
|
||||||
|
|
||||||
|
ControllingClient.SendSitResponse(
|
||||||
|
part.UUID, offset, Orientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
|
||||||
|
|
||||||
|
part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
|
||||||
|
|
||||||
|
// assuming no autopilot in use
|
||||||
|
Velocity = Vector3.Zero;
|
||||||
|
RemoveFromPhysicalScene();
|
||||||
|
|
||||||
|
Rotation = Orientation;
|
||||||
|
m_pos = offset;
|
||||||
|
|
||||||
|
m_requestedSitTargetID = 0; // invalidate the viewer sit comand for now
|
||||||
|
part.ParentGroup.AddAvatar(UUID);
|
||||||
|
|
||||||
|
ParentPart = part;
|
||||||
|
ParentID = part.LocalId;
|
||||||
|
|
||||||
|
Animator.TrySetMovementAnimation("SIT");
|
||||||
|
SendAvatarDataToAllAgents();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SitRayCastCameraPosition(SceneObjectPart part)
|
|
||||||
{
|
|
||||||
// Next, try to raycast from the camera position
|
|
||||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
|
||||||
Vector3 StartRayCastPosition = CameraPosition;
|
|
||||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
|
||||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
|
||||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastCameraPositionResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SitRayCastCameraPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
|
||||||
{
|
|
||||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
|
||||||
if (part != null)
|
|
||||||
{
|
|
||||||
if (hitYN)
|
|
||||||
{
|
|
||||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
|
||||||
{
|
|
||||||
SitRaycastFindEdge(collisionPoint, normal);
|
|
||||||
m_log.DebugFormat("[SIT]: Raycast Camera Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SitRayHorizontal(part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SitRayHorizontal(part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
|
||||||
m_requestedSitTargetUUID = UUID.Zero;
|
|
||||||
m_requestedSitTargetID = 0;
|
|
||||||
m_requestedSitOffset = Vector3.Zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SitRayHorizontal(SceneObjectPart part)
|
|
||||||
{
|
|
||||||
// Next, try to raycast from the avatar position to fwd
|
|
||||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
|
||||||
Vector3 StartRayCastPosition = CameraPosition;
|
|
||||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
|
||||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
|
||||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastHorizontalResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SitRayCastHorizontalResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
|
||||||
{
|
|
||||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
|
||||||
if (part != null)
|
|
||||||
{
|
|
||||||
if (hitYN)
|
|
||||||
{
|
|
||||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
|
||||||
{
|
|
||||||
SitRaycastFindEdge(collisionPoint, normal);
|
|
||||||
m_log.DebugFormat("[SIT]: Raycast Horizontal Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
|
||||||
// Next, try to raycast from the camera position
|
|
||||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
|
||||||
Vector3 StartRayCastPosition = CameraPosition;
|
|
||||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
|
||||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
|
||||||
//m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastResponseAvatarPosition);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ControllingClient.SendAlertMessage("Sit position not accessable.");
|
|
||||||
m_requestedSitTargetUUID = UUID.Zero;
|
|
||||||
m_requestedSitTargetID = 0;
|
|
||||||
m_requestedSitOffset = Vector3.Zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ControllingClient.SendAlertMessage("Sit position not accessable.");
|
|
||||||
m_requestedSitTargetUUID = UUID.Zero;
|
|
||||||
m_requestedSitTargetID = 0;
|
|
||||||
m_requestedSitOffset = Vector3.Zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
|
||||||
m_requestedSitTargetUUID = UUID.Zero;
|
|
||||||
m_requestedSitTargetID = 0;
|
|
||||||
m_requestedSitOffset = Vector3.Zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SitRaycastFindEdge(Vector3 collisionPoint, Vector3 collisionNormal)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
//throw new NotImplementedException();
|
|
||||||
//m_requestedSitTargetUUID = UUID.Zero;
|
|
||||||
//m_requestedSitTargetID = 0;
|
|
||||||
//m_requestedSitOffset = Vector3.Zero;
|
|
||||||
|
|
||||||
SendSitResponse(ControllingClient, m_requestedSitTargetUUID, collisionPoint - m_requestedSitOffset, Quaternion.Identity);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
|
public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -411,6 +411,7 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
// Warning in a parent part it returns itself, not null
|
// Warning in a parent part it returns itself, not null
|
||||||
public virtual PhysicsActor ParentActor { get { return this; } }
|
public virtual PhysicsActor ParentActor { get { return this; } }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NullPhysicsActor : PhysicsActor
|
public class NullPhysicsActor : PhysicsActor
|
||||||
|
|
|
@ -38,6 +38,7 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
|
|
||||||
public delegate void RaycastCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal);
|
public delegate void RaycastCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal);
|
||||||
public delegate void RayCallback(List<ContactResult> list);
|
public delegate void RayCallback(List<ContactResult> list);
|
||||||
|
public delegate void SitAvatarCallback(int status, uint partID, Vector3 offset, Quaternion Orientation);
|
||||||
|
|
||||||
public delegate void JointMoved(PhysicsJoint joint);
|
public delegate void JointMoved(PhysicsJoint joint);
|
||||||
public delegate void JointDeactivated(PhysicsJoint joint);
|
public delegate void JointDeactivated(PhysicsJoint joint);
|
||||||
|
@ -357,5 +358,9 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
return new List<ContactResult>();
|
return new List<ContactResult>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual int SitAvatar(PhysicsActor actor, Vector3 AbsolutePosition, Vector3 CameraPosition, Vector3 offset, Vector3 AvatarSize, SitAvatarCallback PhysicsSitResponse)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
// Ubit 2012
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.Physics.Manager;
|
||||||
|
using OdeAPI;
|
||||||
|
using log4net;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class ODESitAvatar
|
||||||
|
{
|
||||||
|
private OdeScene m_scene;
|
||||||
|
private ODERayCastRequestManager m_raymanager;
|
||||||
|
|
||||||
|
public ODESitAvatar(OdeScene pScene, ODERayCastRequestManager raymanager)
|
||||||
|
{
|
||||||
|
m_scene = pScene;
|
||||||
|
m_raymanager = raymanager;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Vector3 SitAjust = new Vector3(0, 0, 0.4f);
|
||||||
|
|
||||||
|
public void Sit(PhysicsActor actor, Vector3 avPos, Vector3 avCameraPosition, Vector3 offset, Vector3 avOffset, SitAvatarCallback PhysicsSitResponse)
|
||||||
|
{
|
||||||
|
if (!m_scene.haveActor(actor) || !(actor is OdePrim) || ((OdePrim)actor).prim_geom == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
PhysicsSitResponse(-1, actor.LocalID, offset, Quaternion.Identity);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IntPtr geom = ((OdePrim)actor).prim_geom;
|
||||||
|
|
||||||
|
d.Vector3 dtmp = d.GeomGetPosition(geom);
|
||||||
|
Vector3 geopos;
|
||||||
|
geopos.X = dtmp.X;
|
||||||
|
geopos.Y = dtmp.Y;
|
||||||
|
geopos.Z = dtmp.Z;
|
||||||
|
|
||||||
|
|
||||||
|
d.AABB aabb;
|
||||||
|
Quaternion ori;
|
||||||
|
d.Quaternion qtmp;
|
||||||
|
d.GeomCopyQuaternion(geom, out qtmp);
|
||||||
|
Quaternion geomOri;
|
||||||
|
geomOri.X = qtmp.X;
|
||||||
|
geomOri.Y = qtmp.Y;
|
||||||
|
geomOri.Z = qtmp.Z;
|
||||||
|
geomOri.W = qtmp.W;
|
||||||
|
Quaternion geomInvOri;
|
||||||
|
geomInvOri.X = -qtmp.X;
|
||||||
|
geomInvOri.Y = -qtmp.Y;
|
||||||
|
geomInvOri.Z = -qtmp.Z;
|
||||||
|
geomInvOri.W = qtmp.W;
|
||||||
|
|
||||||
|
Vector3 target = geopos + offset;
|
||||||
|
Vector3 rayDir = target - avCameraPosition;
|
||||||
|
float raylen = rayDir.Length();
|
||||||
|
float t = 1 / raylen;
|
||||||
|
rayDir.X *= t;
|
||||||
|
rayDir.Y *= t;
|
||||||
|
rayDir.Z *= t;
|
||||||
|
|
||||||
|
raylen += 0.5f;
|
||||||
|
List<ContactResult> rayResults;
|
||||||
|
|
||||||
|
rayResults = m_scene.RaycastActor(actor, avCameraPosition, rayDir , raylen, 1);
|
||||||
|
if (rayResults.Count == 0 || rayResults[0].ConsumerID != actor.LocalID)
|
||||||
|
{
|
||||||
|
d.GeomGetAABB(geom,out aabb);
|
||||||
|
offset = new Vector3(avOffset.X, 0, aabb.MaxZ + avOffset.Z - geopos.Z);
|
||||||
|
ori = geomInvOri;
|
||||||
|
offset *= geomInvOri;
|
||||||
|
|
||||||
|
PhysicsSitResponse(1, actor.LocalID, offset, ori);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = rayResults[0].Pos - geopos;
|
||||||
|
double ang;
|
||||||
|
float s;
|
||||||
|
float c;
|
||||||
|
|
||||||
|
d.GeomClassID geoclass = d.GeomGetClass(geom);
|
||||||
|
|
||||||
|
if (geoclass == d.GeomClassID.SphereClass)
|
||||||
|
{
|
||||||
|
float r = d.GeomSphereGetRadius(geom);
|
||||||
|
|
||||||
|
offset.Normalize();
|
||||||
|
offset *= r;
|
||||||
|
|
||||||
|
ang = Math.Atan2(offset.Y, offset.X);
|
||||||
|
ang *= 0.5d;
|
||||||
|
s = (float)Math.Sin(ang);
|
||||||
|
c = (float)Math.Cos(ang);
|
||||||
|
|
||||||
|
ori = new Quaternion(0, 0, s, c);
|
||||||
|
|
||||||
|
if (r < 0.4f)
|
||||||
|
{
|
||||||
|
offset = new Vector3(0, 0, r);
|
||||||
|
}
|
||||||
|
else if (offset.Z < 0.4f)
|
||||||
|
{
|
||||||
|
t = offset.Z;
|
||||||
|
float rsq = r * r;
|
||||||
|
|
||||||
|
t = 1.0f / (rsq - t * t);
|
||||||
|
offset.X *= t;
|
||||||
|
offset.Y *= t;
|
||||||
|
offset.Z = 0.4f;
|
||||||
|
t = rsq - 0.16f;
|
||||||
|
offset.X *= t;
|
||||||
|
offset.Y *= t;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += avOffset * ori;
|
||||||
|
|
||||||
|
ori = geomInvOri * ori;
|
||||||
|
offset *= geomInvOri;
|
||||||
|
|
||||||
|
PhysicsSitResponse(1, actor.LocalID, offset, ori);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 norm = rayResults[0].Normal;
|
||||||
|
|
||||||
|
if (norm.Z < 0)
|
||||||
|
{
|
||||||
|
PhysicsSitResponse(0, actor.LocalID, offset, Quaternion.Identity);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ang = Math.Atan2(-rayDir.Y, -rayDir.X);
|
||||||
|
ang *= 0.5d;
|
||||||
|
s = (float)Math.Sin(ang);
|
||||||
|
c = (float)Math.Cos(ang);
|
||||||
|
|
||||||
|
ori = new Quaternion(0, 0, s, c);
|
||||||
|
|
||||||
|
offset += avOffset * ori;
|
||||||
|
|
||||||
|
ori = geomInvOri * ori;
|
||||||
|
offset *= geomInvOri;
|
||||||
|
|
||||||
|
PhysicsSitResponse(1, actor.LocalID, offset, ori);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -362,8 +362,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
nearCallback = near;
|
nearCallback = near;
|
||||||
|
|
||||||
m_rayCastManager = new ODERayCastRequestManager(this);
|
m_rayCastManager = new ODERayCastRequestManager(this);
|
||||||
|
|
||||||
|
|
||||||
lock (OdeLock)
|
lock (OdeLock)
|
||||||
{
|
{
|
||||||
|
@ -2711,5 +2710,17 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
return new List<ContactResult>();
|
return new List<ContactResult>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override int SitAvatar(PhysicsActor actor, Vector3 AbsolutePosition, Vector3 CameraPosition, Vector3 offset, Vector3 AvatarSize, SitAvatarCallback PhysicsSitResponse)
|
||||||
|
{
|
||||||
|
Util.FireAndForget( delegate
|
||||||
|
{
|
||||||
|
ODESitAvatar sitAvatar = new ODESitAvatar(this, m_rayCastManager);
|
||||||
|
if(sitAvatar != null)
|
||||||
|
sitAvatar.Sit(actor, AbsolutePosition, CameraPosition, offset, AvatarSize, PhysicsSitResponse);
|
||||||
|
});
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue