Exemplo n.º 1
0
function move_camera() {
    if (_trigger_state == TS_CAM_ANIM)
        return;

    m_arm.get_bone_tsr(_cessna_arm, "Root", _tsr);
    var target = m_tsr.get_trans_view(_tsr);

    if (_trigger_state == TS_TRACK)
        var eye = CAM_STAT_POS;
    else if (_trigger_state == TS_FOLLOW) {
        var eye = _vec3_tmp;

        m_vec3.add(target, CAM_TRACKING_OFFSET, eye);
    }

    m_cam.eye_set_look_at(_camera, eye, target);
}
Exemplo n.º 2
0
function register_cockpit() {
    _cockpit = init_cockpit();

    var cockpit_empty = _cockpit.cockpit_empty;
    var cockpit_mesh_obj = _cockpit.cockpit_mesh_obj;
    var camera_asteroids_obj = _cockpit.camera_asteroids_obj;
    var laser_arm = _cockpit.laser_arm;
    var speaker_alarm = _cockpit.speaker_alarm;
    var crosshair_obj = _cockpit.crosshair_obj;
    var environment_empty = _cockpit.environment_empty;
    var environment_sphere_obj = _cockpit.environment_sphere_obj;
    var environment_arm = _cockpit.environment_arm;

    // cockpit and environment logic
    if (cockpit_empty && environment_empty) {
        var init_bending_tsr = m_armat.get_bone_tsr(environment_arm, "move", m_tsr.create());

        // cockpit logic
        var elapsed = m_ctl.create_elapsed_sensor();
        // translation smoothing
        var trans_interp_cb = function(obj, id, pulse) {
            if (Math.abs(_dest_x_trans) > EPSILON_DISTANCE ||
                Math.abs(_dest_y_trans) > EPSILON_DISTANCE) {

                var value = m_ctl.get_sensor_value(obj, id, 0);

                var delta_x = m_util.smooth(_dest_x_trans, 0, value, 1);
                var delta_y = m_util.smooth(_dest_y_trans, 0, value, 1);

                _dest_x_trans -= delta_x;
                _dest_y_trans -= delta_y;
                var trans = m_trans.get_translation(obj, _vec3_tmp);
                trans[0] += delta_x;
                trans[1] += delta_y;
                m_trans.set_translation_v(obj, trans);
                var cam_obj = m_scs.get_active_camera();
                m_trans.set_translation_v(cam_obj, trans);
                m_trans.set_translation_v(camera_asteroids_obj, trans);

                trans[0] -= _dest_x_trans / 2;
                trans[1] -= _dest_y_trans / 2;
                m_trans.set_translation_v(environment_empty, trans);

                var roll_angle = m_util.clamp(_dest_x_trans * COCKPIT_ROT_FACTOR,
                        -Math.PI * COCKPIT_ROT_FACTOR, Math.PI * COCKPIT_ROT_FACTOR);
                var roll_quat = m_quat.setAxisAngle(m_util.AXIS_MZ, roll_angle, _quat_tmp);
                var pitch_angle = - m_util.clamp(_dest_y_trans * COCKPIT_ROT_FACTOR,
                        -Math.PI * COCKPIT_ROT_FACTOR,
                        Math.PI * COCKPIT_ROT_FACTOR) / 4;
                var pitch_quat = m_quat.setAxisAngle(m_util.AXIS_MX, pitch_angle, _quat_tmp2);

                var cockpit_quat = m_quat.multiply(roll_quat, pitch_quat, _quat_tmp);
                m_trans.set_rotation_v(obj, cockpit_quat);

                var environment_sphere_obj = _cockpit.environment_sphere_obj;
                if (environment_sphere_obj) {
                    var cur_sphere_quat = m_trans.get_rotation(environment_sphere_obj, _quat_tmp);
                    var pitch_angle = m_util.clamp(_dest_y_trans * COCKPIT_ROT_FACTOR,
                            -Math.PI * COCKPIT_ROT_FACTOR,
                            Math.PI * COCKPIT_ROT_FACTOR) * ENV_SPHERE_ROT_FACTOR;
                    var pitch_quat = m_quat.setAxisAngle(m_util.AXIS_MX, pitch_angle, _quat_tmp2);
                    var new_sphere_quat = m_quat.multiply(cur_sphere_quat,
                            pitch_quat, _quat_tmp);

                    var yaw_angle = - roll_angle * ENV_SPHERE_ROT_FACTOR;
                    var yaw_quat = m_quat.setAxisAngle(m_util.AXIS_MY,
                            yaw_angle, _quat_tmp2);
                    new_sphere_quat = m_quat.multiply(cur_sphere_quat,
                            yaw_quat, _quat_tmp);
                    m_trans.set_rotation_v(environment_sphere_obj, new_sphere_quat);
                }

                // bend environment
                var init_bending_pos = m_tsr.get_trans_view(init_bending_tsr);
                var new_bending_pos = m_vec3.copy(init_bending_pos, _vec3_tmp);
                new_bending_pos[0] += _dest_x_trans;
                new_bending_pos[1] += _dest_y_trans;
                var new_bending_tsr = m_tsr.copy(init_bending_tsr, _tsr_tmp);
                new_bending_tsr = m_tsr.set_trans(new_bending_pos, new_bending_tsr);
                m_armat.set_bone_tsr(environment_arm, "move", new_bending_tsr);
            }
        }
        m_ctl.create_sensor_manifold(cockpit_empty, "COCKPIT_TRANSLATION",
                m_ctl.CT_POSITIVE, [elapsed], null, trans_interp_cb);
    }

    // environment speed
    var env_tunnel = _cockpit.environment_tunnel_obj;
    if (env_tunnel) {
        var elapsed = m_ctl.create_elapsed_sensor();
        var env_speed_cb = function(obj, id, pulse) {
            var elapsed = m_ctl.get_sensor_value(obj, id, 0);
            _env_speed = m_util.smooth(_asteroid_speed / 50, _env_speed, elapsed, _spawn_delay);
            m_obj.set_nodemat_value(env_tunnel, ["space_dust", "speed"], _env_speed);
        }
        // m_ctl.create_sensor_manifold(null, "ENVIRONMENT_SPEED",
        //         m_ctl.CT_CONTINUOUS, [elapsed], null, env_speed_cb);
    }

    // laser stuff
    if (laser_arm && crosshair_obj) {
        var elapsed = m_ctl.create_elapsed_sensor();
        var laser_arm_cb = function(obj, id, pulse) {
            var cross_view = m_trans.get_rotation(crosshair_obj, _quat_tmp);
            var laser_dir = m_vec3.transformQuat(m_util.AXIS_MY, cross_view,
                    _vec3_tmp);
            laser_dir = m_vec3.scale(laser_dir, MAX_LASER_LENGTH, _vec3_tmp);

            var arm_quat = m_trans.get_rotation(laser_arm, _quat_tmp);
            var inv_arm_quat = m_quat.invert(arm_quat, _quat_tmp);
            laser_dir = m_vec3.transformQuat(laser_dir, inv_arm_quat, _vec3_tmp);

            var laser_tsr = m_tsr.identity(_tsr_tmp);
            if (laser_dir[0] < 0.45 * MAX_LASER_LENGTH) {
                laser_tsr = m_tsr.set_trans(laser_dir, _tsr_tmp);
                m_armat.set_bone_tsr(laser_arm, "left_laser", laser_tsr);
            } else
                m_armat.set_bone_tsr(laser_arm, "left_laser", laser_tsr);

            laser_tsr = m_tsr.identity(_tsr_tmp);
            if (laser_dir[0] > -0.45 * MAX_LASER_LENGTH) {
                var laser_tsr = m_tsr.set_trans(laser_dir, _tsr_tmp);
                m_armat.set_bone_tsr(laser_arm, "right_laser", laser_tsr);
            } else
                m_armat.set_bone_tsr(laser_arm, "right_laser", laser_tsr);
        }
        m_ctl.create_sensor_manifold(laser_arm, "LASER_ARM",
                m_ctl.CT_CONTINUOUS, [elapsed], null, laser_arm_cb);
    }

    // crosshair stuff
    if (crosshair_obj) {
        var cam_obj = m_scs.get_active_camera();

        var elapsed = m_ctl.create_elapsed_sensor();
        var crosshair_cb = function(obj, id, pulse) {
            var cam_pos = m_trans.get_translation(cam_obj, _vec3_tmp);
            m_trans.set_translation_v(obj, cam_pos);

            var view = m_trans.get_rotation(cam_obj, _quat_tmp);
            var cross_view = m_trans.get_rotation(obj, _quat_tmp2);

            var elapsed = m_ctl.get_sensor_value(obj, id, 0);
            var new_cross_view = m_quat.lerp(cross_view, view,
                    CROSSHAIR_DELAY * elapsed, _quat_tmp);
            m_trans.set_rotation_v(obj, new_cross_view);
        }

        m_ctl.create_sensor_manifold(crosshair_obj, "CROSSHAIR",
                m_ctl.CT_CONTINUOUS, [elapsed], null, crosshair_cb);
    }

    // video stream
    function get_user_media() {
        if (Boolean(navigator.getUserMedia))
            return navigator.getUserMedia.bind(navigator);
        else if (Boolean(navigator.webkitGetUserMedia))
            return navigator.webkitGetUserMedia.bind(navigator);
        else if (Boolean(navigator.mozGetUserMedia))
            return navigator.mozGetUserMedia.bind(navigator);
        else if (Boolean(navigator.msGetUserMedia))
            return navigator.msGetUserMedia.bind(navigator);
        else
            return null;
    }

    var user_media = get_user_media();
    if (cockpit_mesh_obj && Boolean(user_media)) {
        var success_cb = function(local_media_stream) {
            var video = document.createElement("video");
            video.setAttribute("autoplay", "true");
            video.src = window.URL.createObjectURL(local_media_stream);

            var context = m_tex.get_canvas_ctx(cockpit_mesh_obj, "camera_01");
            if (context) {
                var update_canvas = function() {
                    context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight,
                            0, 0, context.canvas.width, context.canvas.height);
                    m_tex.update_canvas_ctx(cockpit_mesh_obj, "camera_01");
                    setTimeout(function() {update_canvas()}, USERMEDIA_TIME_DELAY);
                }

                video.onloadedmetadata = function(e) {
                    update_canvas();
                };
            }
        };

        var fail_cb = function() {
            m_print.warn("Web-camera is not avaliable. Please " +
                    "check web-camera connection and allow access to " +
                    "the web-camera.")
        };

        try {
            var constraints = {
                video: {width: 1280, height: 720}
            };
            user_media(constraints, success_cb, fail_cb);
        } catch(err) {
            // Chromium decision
            var constraints = {
                video: {
                    mandatory: {
                        maxWidth: 1024,
                        maxHeight: 768,
                        minWidth: 1024,
                        minHeight: 768
                        }
                }
            };
            user_media(constraints, success_cb, fail_cb);
        }
    }
}