more changes on lookAt and RotLookAt; do something in attachments
parent
a9e58d6175
commit
e37c4e878c
|
@ -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>
|
||||||
|
|
|
@ -3091,53 +3091,50 @@ 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;
|
m_log.WarnFormat("[SceneObjectPart] Invalid rotation strength {0}",APIDStrength);
|
||||||
APIDStrength = strength;
|
return;
|
||||||
APIDTarget = target;
|
|
||||||
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue