void cutSetup(CameraSubject subject, boolean isUser) {
        if (mode == Mode.PLAN) return;

        if (cutCount > 0 && mode == Mode.GAGGLE) {
            //ignore this call if already doing a cut
            return;
        }

        if (!isUser && mode != Mode.GAGGLE) {
            //filter out all calls from sniffers unless watching gaggle
            return;
        }

        //gaggle mode too jumpy
        if (mode == Mode.GAGGLE && cut2Count > 0) return;

        cameraSubject = subject;
        cutCount = CUT_LEN;
        cut2Count = cutCount * 2;

        eyeGoto = cameraSubject.getEye();
        focusGoto = cameraSubject.getFocus();

        deye = eyeGoto.minus(eye);
        dfocus = focusGoto.minus(focus);

        /*
         * eye accelerates from 0 upto velocity
         * deye over cutRamp steps, tracks at deye then
         * slows to zero over cutRamp steps. similarly for focus.
         */
        deye.scaleBy((float) 1.0 / (cutCount - CUT_RAMP));
        dfocus.scaleBy((float) 1.0 / (cutCount - CUT_RAMP));
    }