more changes on lookAt and RotLookAt; do something in attachments

LSLKeyTest
UbitUmarov 2015-12-01 12:11:48 +00:00
parent a9e58d6175
commit e37c4e878c
3 changed files with 92 additions and 35 deletions

View File

@ -329,6 +329,7 @@ namespace OpenSim.Region.Framework.Scenes
get { return (RootPart.Flags & PrimFlags.Physics) != 0; } get { return (RootPart.Flags & PrimFlags.Physics) != 0; }
} }
/// <summary> /// <summary>
/// Is this scene object temporary? /// Is this scene object temporary?
/// </summary> /// </summary>
@ -2536,6 +2537,58 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void RotLookAt(Quaternion target, float strength, float damping)
{
if(IsDeleted)
return;
// non physical is handle in LSL api
if(!UsesPhysics || IsAttachment)
return;
SceneObjectPart rootpart = m_rootPart;
if (rootpart != null)
{
/* physics still doesnt suport this
if (rootpart.PhysActor != null)
{
rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
rootpart.PhysActor.APIDStrength = strength;
rootpart.PhysActor.APIDDamping = damping;
rootpart.PhysActor.APIDActive = true;
}
*/
// so do it in rootpart
rootpart.RotLookAt(target, strength, damping);
}
}
public void StartLookAt(Quaternion target, float strength, float damping)
{
if(IsDeleted)
return;
// non physical is done by LSL APi
if(!UsesPhysics || IsAttachment)
return;
if (m_rootPart != null)
m_rootPart.RotLookAt(target, strength, damping);
}
public void StopLookAt()
{
SceneObjectPart rootpart = m_rootPart;
if (rootpart != null)
{
if (rootpart.PhysActor != null)
{
rootpart.PhysActor.APIDActive = false;
}
rootpart.StopLookAt();
}
}
/// <summary> /// <summary>
/// Uses a PID to attempt to clamp the object on the Z axis at the given height over tau seconds. /// Uses a PID to attempt to clamp the object on the Z axis at the given height over tau seconds.
/// </summary> /// </summary>

View File

@ -3091,37 +3091,31 @@ namespace OpenSim.Region.Framework.Scenes
public void RotLookAt(Quaternion target, float strength, float damping) public void RotLookAt(Quaternion target, float strength, float damping)
{ {
// non physical is done on LSL
// physical is a rootpart thing
if(ParentGroup.IsDeleted) if(ParentGroup.IsDeleted)
return; return;
// for now we only handle physics case
if(!ParentGroup.UsesPhysics || ParentGroup.IsAttachment)
return;
// physical is SOG
if(ParentGroup.RootPart != this) if(ParentGroup.RootPart != this)
ParentGroup.RootPart.RotLookAt(target, strength, damping);
if (ParentGroup.IsAttachment)
{ {
/* ParentGroup.RotLookAt(target, strength, damping);
ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar); return;
if (avatar != null)
{
Rotate the Av?
} */
} }
else
{
APIDDamp = damping;
APIDStrength = strength;
APIDTarget = target;
if (APIDStrength <= 0) APIDDamp = damping;
{ APIDStrength = strength;
m_log.WarnFormat("[SceneObjectPart] Invalid rotation strength {0}",APIDStrength); APIDTarget = target;
return;
} if (APIDStrength <= 0)
{
m_log.WarnFormat("[SceneObjectPart] Invalid rotation strength {0}",APIDStrength);
return;
}
APIDActive = true; APIDActive = true;
}
// Necessary to get the lookat deltas applied // Necessary to get the lookat deltas applied
ParentGroup.QueueForUpdateCheck(); ParentGroup.QueueForUpdateCheck();
@ -3129,15 +3123,18 @@ namespace OpenSim.Region.Framework.Scenes
public void StartLookAt(Quaternion target, float strength, float damping) public void StartLookAt(Quaternion target, float strength, float damping)
{ {
// non physical is done on LSL
// physical is a rootpart thing
if(ParentGroup.IsDeleted) if(ParentGroup.IsDeleted)
return; return;
if(ParentGroup.RootPart != this) // non physical is done on LSL
ParentGroup.RootPart.RotLookAt(target, strength, damping); if(ParentGroup.IsAttachment || !ParentGroup.UsesPhysics)
return;
RotLookAt(target,strength,damping); // physical is SOG
if(ParentGroup.RootPart != this)
ParentGroup.RotLookAt(target, strength, damping);
else
RotLookAt(target,strength,damping);
} }
public void StopLookAt() public void StopLookAt()
@ -3145,9 +3142,10 @@ namespace OpenSim.Region.Framework.Scenes
if(ParentGroup.IsDeleted) if(ParentGroup.IsDeleted)
return; return;
if(ParentGroup.RootPart != this) if(ParentGroup.RootPart != this && ParentGroup.UsesPhysics)
ParentGroup.RootPart.StopLookAt(); ParentGroup.StopLookAt();
// just in case do this always
if(APIDActive) if(APIDActive)
AngularVelocity = Vector3.Zero; AngularVelocity = Vector3.Zero;

View File

@ -3569,7 +3569,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// and rotate so Z points to target with X below horizont // and rotate so Z points to target with X below horizont
LSL_Rotation rot = new LSL_Rotation(0.0, 0.707107, 0.0, 0.707107) * llAxes2Rot(dir, left, up); LSL_Rotation rot = new LSL_Rotation(0.0, 0.707107, 0.0, 0.707107) * llAxes2Rot(dir, left, up);
if (m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) SceneObjectGroup sog = m_host.ParentGroup;
if(sog == null || sog.IsDeleted)
return;
if (!sog.UsesPhysics || sog.IsAttachment)
{ {
// Do nothing if either value is 0 (this has been checked in SL) // Do nothing if either value is 0 (this has been checked in SL)
if (strength <= 0.0 || damping <= 0.0) if (strength <= 0.0 || damping <= 0.0)
@ -3585,7 +3589,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return; return;
} }
m_host.StartLookAt(rot, (float)strength, (float)damping); sog.StartLookAt(rot, (float)strength, (float)damping);
} }
} }
@ -3991,15 +3995,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// Per discussion with Melanie, for non-physical objects llLookAt appears to simply // Per discussion with Melanie, for non-physical objects llLookAt appears to simply
// set the rotation of the object, copy that behavior // set the rotation of the object, copy that behavior
PhysicsActor pa = m_host.PhysActor; SceneObjectGroup sog = m_host.ParentGroup;
if(sog == null || sog.IsDeleted)
return;
if (strength == 0 || pa == null || !pa.IsPhysical) if (strength == 0 || !sog.UsesPhysics || sog.IsAttachment)
{ {
llSetLocalRot(target); llSetLocalRot(target);
} }
else else
{ {
m_host.RotLookAt(target, (float)strength, (float)damping); sog.RotLookAt(target, (float)strength, (float)damping);
} }
} }