void gotoNextLiftSource() {
        if (!demoMode)
            return;
        
        Hill hill = null;
        Cloud cloud = null;

        if (app.landscape != null) {
            hill = app.landscape.nextHill(new Vector3d(p.x, p.y + 2, p.z));
        }

        if (app.sky != null) {
            cloud = app.sky.nextCloud(new Vector3d(p.x, p.y + 2, p.z));
        }

        cutPending = false;

        if (hill != null) {
            this.moveManager.setCircuit(hill.getCircuit());

            cutPending = true;
            cutWhen = whenArrive(hill.x0, hill.y0) - app.cameraMan.CUT_LEN * 2; //??2
            cutSubject = hill;
            cutCount = 0;
            //System.out.println("Cut when: " + cutWhen);
            return;
        }

        //no hill - look at clouds
        if (cloud == null) {
            //backtrack upwind

            if (app.sky != null) cloud = app.sky.prevCloud(new Vector3d(p.x, p.y - 2, p.z));

            if (cloud == null) {
                //try again later, fly downwind for now
                this.moveManager.setTargetPoint(new Vector3d(p.x, p.y + 8, p.z));
                tryLater = 25;
                return;
            }
        }

        //glide to cloud
        this.moveManager.setCloud(cloud);

        cutPending = true;
        cutWhen = whenArrive(cloud.p.x, cloud.p.y) - app.cameraMan.CUT_LEN * 2;
        cutSubject = cloud;
        cutCount = 0;
        //System.out.println("Cut when: " + cutWhen);


        //app.cameraMan.cutSetup(cloud, isUser);
    }