From b929a2004542db3628d5e7392c3b6ab13f4ea913 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 13 Sep 2020 05:47:05 +0100 Subject: [PATCH] ubOde resize a avatar without recreating it --- .../PhysicsModules/ubOde/ODECharacter.cs | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs index b86be0f7b8..52bae97a70 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs @@ -848,7 +848,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde private void AvatarGeomAndBodyCreation(float npositionX,float npositionY,float npositionZ) { - // sizes one day should came from visual parameters float sx = m_size.X; float sy = m_size.Y; float sz = m_size.Z; @@ -859,7 +858,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde float feetsz = sz * 0.45f; if(feetsz > 0.6f) feetsz = 0.6f; - feetOff = bot + feetsz; AvaAvaSizeXsq = 0.4f * sx; @@ -875,17 +873,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde SafeNativeMethods.GeomSetCategoryBits(collider,(uint)m_collisionCategories); SafeNativeMethods.GeomSetCollideBits(collider,(uint)m_collisionFlags); - float r = m_size.X; - if(m_size.Y > r) - r = m_size.Y; - float l = m_size.Z - r; + float r = sx; + if(sy > r) + r = sy; + float l = sz - r; r *= 0.5f; - capsule = SafeNativeMethods.CreateCapsule(collider,r,l); + capsule = SafeNativeMethods.CreateCapsule(collider, r, l); - m_mass = m_density * m_size.X * m_size.Y * m_size.Z; // update mass - - SafeNativeMethods.MassSetBoxTotal(out ShellMass,m_mass,m_size.X,m_size.Y,m_size.Z); + m_mass = m_density * sx * sy * sz; // update mass + SafeNativeMethods.MassSetBoxTotal(out ShellMass, m_mass, sx, sy, sz); PID_D = basePID_D * m_mass / m_parent_scene.ODE_STEPSIZE; PID_P = basePID_P * m_mass / m_parent_scene.ODE_STEPSIZE; @@ -902,7 +899,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde SafeNativeMethods.BodySetAutoDisableFlag(Body, true); m_bodydisablecontrol = 0; - SafeNativeMethods.BodySetPosition(Body,npositionX,npositionY,npositionZ); + SafeNativeMethods.BodySetPosition(Body, npositionX, npositionY, npositionZ); _position.X = npositionX; _position.Y = npositionY; @@ -1889,18 +1886,48 @@ namespace OpenSim.Region.PhysicsModule.ubOde // for now only look to Z changes since viewers also don't change X and Y if(pSize.Z != m_size.Z) { - AvatarGeomAndBodyDestroy(); - float oldsz = m_size.Z; m_size = pSize; - AvatarGeomAndBodyCreation(_position.X,_position.Y, - _position.Z + (m_size.Z - oldsz) * 0.5f); + float sz = m_size.Z; - // Velocity = Vector3.Zero; + float bot = -sz * 0.5f + m_feetOffset; + boneOff = bot + 0.3f; + + float feetsz = sz * 0.45f; + if (feetsz > 0.6f) + feetsz = 0.6f; + feetOff = bot + feetsz; + + float sx = m_size.X; + AvaAvaSizeXsq = 0.4f * sx; + AvaAvaSizeXsq *= AvaAvaSizeXsq; + + float sy = m_size.Y; + AvaAvaSizeYsq = 0.5f * sy; + AvaAvaSizeYsq *= AvaAvaSizeYsq; + + float r = sx; + if (sy > r) + r = sy; + float l = sz - r; + r *= 0.5f; + + SafeNativeMethods.GeomCapsuleSetParams(capsule, r, l); + + m_mass = m_density * sx * sy * sz; // update mass + PID_D = basePID_D * m_mass / m_parent_scene.ODE_STEPSIZE; + PID_P = basePID_P * m_mass / m_parent_scene.ODE_STEPSIZE; + SafeNativeMethods.MassSetBoxTotal(out ShellMass, m_mass, sx, sy, sz); + SafeNativeMethods.BodySetMass(Body, ref ShellMass); + + _position.Z += (sz - oldsz) * 0.5f; + SafeNativeMethods.BodySetPosition(Body, _position.X, _position.Y, _position.Z); + + m_bodydisablecontrol = 0; + _zeroFlag = false; + _velocity = Vector3.Zero; m_targetVelocity = Vector3.Zero; - - m_parent_scene.actor_name_map[capsule] = (PhysicsActor)this; } m_freemove = false; m_pidControllerActive = true;