void TurretShape::updateMove(const Move* move) { PROFILE_SCOPE( TurretShape_UpdateMove ); if (!move) return; Point3F vec, pos; // Update orientation mTurretDelta.rotVec = mRot; VectorF rotVec(0, 0, 0); if (getAllowManualRotation()) { if (mPitchAllowed) { rotVec.x = move->pitch * 2.0f; // Assume that our -2PI to 2PI range was clamped to -PI to PI in script; if (mPitchRate > 0) { rotVec.x *= mPitchRate * TickSec; } } if (mHeadingAllowed) { rotVec.z = move->yaw * 2.0f; // Assume that our -2PI to 2PI range was clamped to -PI to PI in script if (mHeadingRate > 0) { rotVec.z *= mHeadingRate * TickSec; } } } mRot.x += rotVec.x; mRot.z += rotVec.z; _applyLimits(mRot); if (isServerObject()) { // As this ends up animating shape nodes, we have no sense of a transform and // render transform. Therefore we treat this as the true transform and leave the // client shape node changes to interpolateTick() as the render transform. Otherwise // on the client we'll have this node change from processTick() and then backstepping // and catching up to the true node change in interpolateTick(), which causes the // turret to stutter. _setRotation( mRot ); } else { // If on the client, calc delta for backstepping mTurretDelta.rot = mRot; mTurretDelta.rotVec = mTurretDelta.rotVec - mTurretDelta.rot; } setMaskBits(TurretUpdateMask); }
void TurretShape::interpolateTick(F32 dt) { Parent::interpolateTick(dt); if (isMounted()) { MatrixF mat; mMount.object->getRenderMountTransform( dt, mMount.node, mMount.xfm, &mat ); ShapeBase::setRenderTransform(mat); } // Orientation Point3F rot = mTurretDelta.rot + mTurretDelta.rotVec * dt; // Make sure we don't interpolate past the limits _applyLimits(rot); _setRotation(rot); }
void PGE_LevelCamera::setCenterPos(float x, float y) { posRect.setPos(round(x-posRect.width()/2.0), round(y-posRect.height()/2.0)); _applyLimits(); }
void PGE_LevelCamera::setPos(float x, float y) { posRect.setPos(round(x), round(y)); _applyLimits(); }