Fix issue with clamping the AngAxisF

This commit is contained in:
James Urquhart 2016-05-10 22:13:04 +01:00
parent 9f49a7844e
commit 185fde8ea4
2 changed files with 47 additions and 27 deletions

View file

@ -79,7 +79,8 @@ void ExtendedMoveManager::init()
const ExtendedMove NullExtendedMove; const ExtendedMove NullExtendedMove;
#define CLAMPPOS(x) (x<0 ? -((-x) & (1<<(MaxPositionBits-1))-1) : (x & (1<<(MaxPositionBits-1))-1)) #define CLAMPPOS(x) ((S32)(((x + 1) * .5) * ((1 << MaxPositionBits) - 1)) & ((1<<MaxPositionBits)-1))
#define UNCLAMPPOS(x) ((F32)(x * 2 / F32((1 << MaxPositionBits) - 1) - 1.0f))
#define CLAMPROT(f) ((S32)(((f + 1) * .5) * ((1 << MaxRotationBits) - 1)) & ((1<<MaxRotationBits)-1)) #define CLAMPROT(f) ((S32)(((f + 1) * .5) * ((1 << MaxRotationBits) - 1)) & ((1<<MaxRotationBits)-1))
#define UNCLAMPROT(x) ((F32)(x * 2 / F32((1 << MaxRotationBits) - 1) - 1.0f)) #define UNCLAMPROT(x) ((F32)(x * 2 / F32((1 << MaxRotationBits) - 1) - 1.0f))
@ -95,6 +96,10 @@ ExtendedMove::ExtendedMove() : Move()
rotZ[i] = 0; rotZ[i] = 0;
rotW[i] = 1; rotW[i] = 1;
cposX[i] = 0;
cposY[i] = 0;
cposZ[i] = 0;
EulerBasedRotation[i] = false; EulerBasedRotation[i] = false;
} }
} }
@ -134,20 +139,20 @@ void ExtendedMove::pack(BitStream *stream, const Move * basemove)
{ {
// Position // Position
if(stream->writeFlag(posX[i] != extBaseMove->posX[i])) if(stream->writeFlag(posX[i] != extBaseMove->posX[i]))
stream->writeSignedInt(posX[i], MaxPositionBits); stream->writeSignedInt(cposX[i], MaxPositionBits);
if(stream->writeFlag(posY[i] != extBaseMove->posY[i])) if(stream->writeFlag(posY[i] != extBaseMove->posY[i]))
stream->writeSignedInt(posY[i], MaxPositionBits); stream->writeSignedInt(cposY[i], MaxPositionBits);
if(stream->writeFlag(posZ[i] != extBaseMove->posZ[i])) if(stream->writeFlag(posZ[i] != extBaseMove->posZ[i]))
stream->writeSignedInt(posZ[i], MaxPositionBits); stream->writeSignedInt(cposZ[i], MaxPositionBits);
// Rotation // Rotation
stream->writeFlag(EulerBasedRotation[i]); stream->writeFlag(EulerBasedRotation[i]);
if(stream->writeFlag(rotX[i] != extBaseMove->rotX[i])) if(stream->writeFlag(rotX[i] != extBaseMove->rotX[i]))
stream->writeInt(crotX[i], MaxRotationBits); stream->writeInt(crotX[i], EulerBasedRotation[i] ? MaxRotationBits : MaxPositionBits);
if(stream->writeFlag(rotY[i] != extBaseMove->rotY[i])) if(stream->writeFlag(rotY[i] != extBaseMove->rotY[i]))
stream->writeInt(crotY[i], MaxRotationBits); stream->writeInt(crotY[i], EulerBasedRotation[i] ? MaxRotationBits : MaxPositionBits);
if(stream->writeFlag(rotZ[i] != extBaseMove->rotZ[i])) if(stream->writeFlag(rotZ[i] != extBaseMove->rotZ[i]))
stream->writeInt(crotZ[i], MaxRotationBits); stream->writeInt(crotZ[i], EulerBasedRotation[i] ? MaxRotationBits : MaxPositionBits);
if(!EulerBasedRotation[i]) if(!EulerBasedRotation[i])
{ {
if(stream->writeFlag(rotW[i] != extBaseMove->rotW[i])) if(stream->writeFlag(rotW[i] != extBaseMove->rotW[i]))
@ -176,18 +181,27 @@ void ExtendedMove::unpack(BitStream *stream, const Move * basemove)
for(U32 i=0; i<MaxPositionsRotations; ++i) for(U32 i=0; i<MaxPositionsRotations; ++i)
{ {
// Position // Position
if(stream->readFlag()) if (stream->readFlag())
{
posX[i] = stream->readSignedInt(MaxPositionBits); posX[i] = stream->readSignedInt(MaxPositionBits);
cposX[i] = UNCLAMPPOS(posX[i]);
}
else else
posX[i] = extBaseMove->posX[i]; posX[i] = extBaseMove->posX[i];
if(stream->readFlag()) if (stream->readFlag())
posY[i] = stream->readSignedInt(MaxPositionBits); {
cposY[i] = stream->readSignedInt(MaxPositionBits);
posY[i] = UNCLAMPPOS(cposY[i]);
}
else else
posY[i] = extBaseMove->posY[i]; posY[i] = extBaseMove->posY[i];
if(stream->readFlag()) if (stream->readFlag())
posZ[i] = stream->readSignedInt(MaxPositionBits); {
cposZ[i] = stream->readSignedInt(MaxPositionBits);
posZ[i] = UNCLAMPPOS(cposZ[i]);
}
else else
posZ[i] = extBaseMove->posZ[i]; posZ[i] = extBaseMove->posZ[i];
@ -198,8 +212,8 @@ void ExtendedMove::unpack(BitStream *stream, const Move * basemove)
scale = M_2PI_F; scale = M_2PI_F;
if(stream->readFlag()) if(stream->readFlag())
{ {
crotX[i] = stream->readInt(MaxRotationBits); crotX[i] = stream->readInt(EulerBasedRotation[i] ? MaxRotationBits : MaxPositionBits);
rotX[i] = UNCLAMPROT(crotX[i]) * scale; rotX[i] = EulerBasedRotation[i] ? (UNCLAMPROT(crotX[i]) * scale) : UNCLAMPPOS(crotX[i]);
} }
else else
{ {
@ -208,8 +222,8 @@ void ExtendedMove::unpack(BitStream *stream, const Move * basemove)
if(stream->readFlag()) if(stream->readFlag())
{ {
crotY[i] = stream->readInt(MaxRotationBits); crotY[i] = stream->readInt(EulerBasedRotation[i] ? MaxRotationBits : MaxPositionBits);
rotY[i] = UNCLAMPROT(crotY[i]) * scale; rotY[i] = EulerBasedRotation[i] ? (UNCLAMPROT(crotY[i]) * scale) : UNCLAMPPOS(crotY[i]);
} }
else else
{ {
@ -218,8 +232,8 @@ void ExtendedMove::unpack(BitStream *stream, const Move * basemove)
if(stream->readFlag()) if(stream->readFlag())
{ {
crotZ[i] = stream->readInt(MaxRotationBits); crotZ[i] = stream->readInt(EulerBasedRotation[i] ? MaxRotationBits : MaxPositionBits);
rotZ[i] = UNCLAMPROT(crotZ[i]) * scale; rotZ[i] = EulerBasedRotation[i] ? (UNCLAMPROT(crotZ[i]) * scale) : UNCLAMPPOS(crotZ[i]);
} }
else else
{ {
@ -231,7 +245,7 @@ void ExtendedMove::unpack(BitStream *stream, const Move * basemove)
if(stream->readFlag()) if(stream->readFlag())
{ {
crotW[i] = stream->readInt(MaxRotationBits); crotW[i] = stream->readInt(MaxRotationBits);
rotW[i] = UNCLAMPROT(crotW[i]); rotW[i] = UNCLAMPROT(crotW[i]) * M_2PI_F;
} }
else else
{ {
@ -266,9 +280,9 @@ void ExtendedMove::clamp()
} }
else else
{ {
crotX[i] = CLAMPROT(rotX[i]); crotX[i] = CLAMPPOS(rotX[i]);
crotY[i] = CLAMPROT(rotY[i]); crotY[i] = CLAMPPOS(rotY[i]);
crotZ[i] = CLAMPROT(rotZ[i]); crotZ[i] = CLAMPPOS(rotZ[i]);
crotW[i] = CLAMPROT(rotW[i] / M_2PI_F); crotW[i] = CLAMPROT(rotW[i] / M_2PI_F);
} }
} }
@ -282,6 +296,10 @@ void ExtendedMove::unclamp()
// Unclamp the values the same as for net traffic so the client matches the server // Unclamp the values the same as for net traffic so the client matches the server
for(U32 i=0; i<MaxPositionsRotations; ++i) for(U32 i=0; i<MaxPositionsRotations; ++i)
{ {
posX[i] = UNCLAMPPOS(posX[i]);
posY[i] = UNCLAMPPOS(posY[i]);
posZ[i] = UNCLAMPPOS(posZ[i]);
// Rotations // Rotations
if(EulerBasedRotation[i]) if(EulerBasedRotation[i])
{ {
@ -291,9 +309,9 @@ void ExtendedMove::unclamp()
} }
else else
{ {
rotX[i] = UNCLAMPROT(crotX[i]); rotX[i] = UNCLAMPPOS(crotX[i]);
rotY[i] = UNCLAMPROT(crotY[i]); rotY[i] = UNCLAMPPOS(crotY[i]);
rotZ[i] = UNCLAMPROT(crotZ[i]); rotZ[i] = UNCLAMPPOS(crotZ[i]);
rotW[i] = UNCLAMPROT(crotW[i]) * M_2PI_F; rotW[i] = UNCLAMPROT(crotW[i]) * M_2PI_F;
} }
} }

View file

@ -11,12 +11,14 @@ struct ExtendedMove : public Move
enum Constants { enum Constants {
MaxPositionsRotations = 3, MaxPositionsRotations = 3,
MaxPositionBits = 13, MaxPositionBits = 16,
MaxRotationBits = 16, MaxRotationBits = 16,
}; };
// Position is in millimeters // Position is in millimeters
S32 posX[MaxPositionsRotations], posY[MaxPositionsRotations], posZ[MaxPositionsRotations]; F32 posX[MaxPositionsRotations], posY[MaxPositionsRotations], posZ[MaxPositionsRotations];
S32 cposX[MaxPositionsRotations], cposY[MaxPositionsRotations], cposZ[MaxPositionsRotations];
bool EulerBasedRotation[MaxPositionsRotations]; bool EulerBasedRotation[MaxPositionsRotations];