ubOde resize a avatar without recreating it

This commit is contained in:
UbitUmarov
2020-09-13 05:47:05 +01:00
parent 4273519197
commit b929a20045

View File

@@ -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;