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); }
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); } } }