exports.set_hover_cam_angle = function(camobj, angle) {
    m_print.error("set_hover_cam_angle() deprecated, use rotate_camera() or rotate_hover_camera() instead");

    if (!camera.is_hover_camera(camobj)) {
        m_print.error("set_hover_cam_angle(): wrong object or camera move style");
        return;
    }
    var render = camobj._render;

    if (!render.use_distance_limits) {
        m_print.error("set_hover_cam_angle(): distance/hover_angle limits are not defined or disabled");
        return;
    }

    var angles = camera.get_camera_angles(camobj, _vec2_tmp);
    // NOTE: prepare hover angle (CCW style)
    var angle_ccw = -angle;
    var rot_angle = angle_ccw - angles[1];

    if (rot_angle)
        camera.rotate_hover_camera(camobj, 0, rot_angle);

    transform.update_transform(camobj);
    m_phy.sync_transform(camobj);
}
exports.rotate_hover_camera = function(camobj, phi, theta, phi_is_abs, theta_is_abs) {
    if (!camera.is_hover_camera(camobj)) {
        m_print.error("rotate_hover_camera(): wrong object");
        return;
    }

    camera.rotate_hover_camera(camobj, phi, theta, phi_is_abs, theta_is_abs);
    transform.update_transform(camobj);
    m_phy.sync_transform(camobj);
}
exports.rotate_camera = function(camobj, phi, theta, phi_is_abs, theta_is_abs) {
    var move_style = exports.get_move_style(camobj);

    switch (move_style) {
    case camera.MS_STATIC:
    case camera.MS_ANIMATION:
        break; 
    case camera.MS_TARGET_CONTROLS:
        camera.rotate_target_camera(camobj, phi, theta, phi_is_abs, theta_is_abs);
        break;
    case camera.MS_EYE_CONTROLS:
        camera.rotate_eye_camera(camobj, phi, theta, phi_is_abs, theta_is_abs);
        break;
    case camera.MS_HOVER_CONTROLS:
        camera.rotate_hover_camera(camobj, phi, theta, phi_is_abs, theta_is_abs);
        break;
    default:
        m_print.error("rotate_camera(): Wrong object");
        break;
    }

    transform.update_transform(camobj);
    m_phy.sync_transform(camobj);
}