From 098f16fe3192ef17e7c749a70ea0607a22ae55fa Mon Sep 17 00:00:00 2001 From: idb Date: Mon, 1 Dec 2008 00:49:36 +0000 Subject: Remove duplicated avatar height calculation in lsl functions. Use height calculation in Basic Physics and Physics of Simplicity so that avatars larger than the default walk with straight legs and shorter walk on the ground. --- .../BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 12 ++++++--- OpenSim/Region/Physics/POSPlugin/POSCharacter.cs | 9 +++++-- OpenSim/Region/Physics/POSPlugin/POSScene.cs | 30 ++++++++++++++-------- 3 files changed, 34 insertions(+), 17 deletions(-) (limited to 'OpenSim/Region/Physics') diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs index cacb9eb..6a27f46 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs @@ -152,7 +152,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin actor.Position.X = 255.9F; } - float height = _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + 1.0f; + float height = _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + actor.Size.Z; if (actor.Flying) { if (actor.Position.Z + (actor.Velocity.Z*timeStep) < @@ -210,15 +210,16 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin private PhysicsVector _position; private PhysicsVector _velocity; private PhysicsVector _acceleration; + private PhysicsVector _size; private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; private bool flying; private bool iscolliding; - public BasicActor() { _velocity = new PhysicsVector(); _position = new PhysicsVector(); _acceleration = new PhysicsVector(); + _size = new PhysicsVector(); } public override int PhysicsActorType @@ -315,8 +316,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin public override PhysicsVector Size { - get { return PhysicsVector.Zero; } - set { } + get { return _size; } + set { + _size = value; + _size.Z = _size.Z / 2.0f; + } } public override PrimitiveBaseShape Shape diff --git a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs index a9ddf27..8c185fc 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs @@ -39,6 +39,7 @@ namespace OpenSim.Region.Physics.POSPlugin private PhysicsVector _position; public PhysicsVector _velocity; public PhysicsVector _target_velocity = PhysicsVector.Zero; + public PhysicsVector _size = PhysicsVector.Zero; private PhysicsVector _acceleration; private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; private bool flying; @@ -144,8 +145,12 @@ namespace OpenSim.Region.Physics.POSPlugin public override PhysicsVector Size { - get { return new PhysicsVector(0.5f, 0.5f, 1.0f); } - set { } + get { return _size; } + set + { + _size = value; + _size.Z = _size.Z / 2.0f; + } } public override float Mass diff --git a/OpenSim/Region/Physics/POSPlugin/POSScene.cs b/OpenSim/Region/Physics/POSPlugin/POSScene.cs index 9771a62..9a4e92f 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSScene.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSScene.cs @@ -167,7 +167,7 @@ namespace OpenSim.Region.Physics.POSPlugin float terrainheight = _heightMap[(int)character.Position.Y * Constants.RegionSize + (int)character.Position.X]; if (character.Position.Z + (character._target_velocity.Z * timeStep) < terrainheight + 2) { - character.Position.Z = terrainheight + 1.0f; + character.Position.Z = terrainheight + character.Size.Z; forcedZ = true; } else @@ -184,23 +184,31 @@ namespace OpenSim.Region.Physics.POSPlugin character.Position.Z = oldposZ; // first try Z axis if (isCollidingWithPrim(character)) { - character.Position.Z = oldposZ + 0.4f; // try harder + character.Position.Z = oldposZ + character.Size.Z / 4.4f; // try harder if (isCollidingWithPrim(character)) { - character.Position.X = oldposX; - character.Position.Y = oldposY; - character.Position.Z = oldposZ; - - character.Position.X += character._target_velocity.X * timeStep; + character.Position.Z = oldposZ + character.Size.Z / 2.2f; // try very hard if (isCollidingWithPrim(character)) { character.Position.X = oldposX; + character.Position.Y = oldposY; + character.Position.Z = oldposZ; + + character.Position.X += character._target_velocity.X * timeStep; + if (isCollidingWithPrim(character)) + { + character.Position.X = oldposX; + } + + character.Position.Y += character._target_velocity.Y * timeStep; + if (isCollidingWithPrim(character)) + { + character.Position.Y = oldposY; + } } - - character.Position.Y += character._target_velocity.Y * timeStep; - if (isCollidingWithPrim(character)) + else { - character.Position.Y = oldposY; + forcedZ = true; } } else -- cgit v1.1