function hide_elem(elem, period) { if (!period) { elem.style.opacity = 0; elem.style.visibility = "hidden"; return } var start_opacity = elem.style.opacity; var finish_time = m_time.get_timeline() + period; function show_elem_cb(obj, id, pulse) { var time_left = finish_time - m_time.get_timeline(); if (time_left < 0) { elem.style.visibility = "hidden"; m_ctl.remove_sensor_manifold(null, "HIDE_"+ elem.id); return; } var opacity = time_left / period; elem.style.opacity = start_opacity * opacity; } if (!m_ctl.check_sensor_manifold(null, "HIDE_" + elem.id)) { var elapsed_sens = m_ctl.create_elapsed_sensor(); m_ctl.create_sensor_manifold(null, "HIDE_" + elem.id, m_ctl.CT_CONTINUOUS, [elapsed_sens], null, show_elem_cb); } }
function on_pointerlock_change() { if (document.pointerLockElement === elem || document.webkitPointerLockElement === elem || document.mozPointerLockElement === elem) { //m_print.log("Pointer Lock enabled"); exit_mouse_drag(elem); elem.addEventListener("mousemove", mouse_move_cb, false); var camera = m_scs.get_active_camera(); if (!m_ctl.check_sensor_manifold(camera, "SMOOTH_PL")) { var elapsed = m_ctl.create_elapsed_sensor(); m_ctl.create_sensor_manifold(camera, "SMOOTH_PL", m_ctl.CT_CONTINUOUS, [elapsed], null, smooth_cb); } enabled_cb(); } else { //m_print.log("Pointer Lock disabled"); elem.removeEventListener("mousemove", mouse_move_cb, false); document.removeEventListener("pointerlockchange", on_pointerlock_change, false); document.removeEventListener("webkitpointerlockchange", on_pointerlock_change, false); document.removeEventListener("mozpointerlockchange", on_pointerlock_change, false); disabled_cb(); } }
function show_elem(elem, period) { elem.style.visibility = "visible"; if (!period) { elem.style.opacity = 1; return } elem.style.opacity = 0; var finish_time = m_time.get_timeline() + period; function show_elem_cb(obj, id, pulse) { var time_left = finish_time - m_time.get_timeline(); if (time_left < 0) { m_ctl.remove_sensor_manifold(null, "SHOW_"+ elem.id); return; } var opacity = 1 - time_left / period; elem.style.opacity = opacity; } if (!m_ctl.check_sensor_manifold(null, "SHOW_" + elem.id)) { var elapsed_sens = m_ctl.create_elapsed_sensor(); m_ctl.create_sensor_manifold(null, "SHOW_" + elem.id, m_ctl.CT_CONTINUOUS, [elapsed_sens], null, show_elem_cb); } }
exports.auto_rotate = function(auto_rotate_ratio, callback) { callback = callback || function(){}; var obj = m_scs.get_active_camera(); var cam_type = m_cam.get_move_style(obj); if (cam_type == m_cam.MS_STATIC) throw "wrong camera type"; function elapsed_cb(obj, id, pulse) { if (pulse == 1) { var value = m_ctl.get_sensor_value(obj, id, 0); switch (cam_type) { case m_cam.MS_TARGET_CONTROLS: m_cam.rotate_pivot(obj, value * auto_rotate_ratio, 0); break; case m_cam.MS_EYE_CONTROLS: m_cam.rotate(obj, value * auto_rotate_ratio, 0); break; } } } function mouse_cb() { m_ctl.remove_sensor_manifold(obj, "AUTO_ROTATE"); m_ctl.remove_sensor_manifold(obj, "DISABLE_AUTO_ROTATE"); callback(); } if (!m_ctl.check_sensor_manifold(obj, "AUTO_ROTATE")) { var mouse_move_x = m_ctl.create_mouse_move_sensor("X"); var mouse_move_y = m_ctl.create_mouse_move_sensor("Y"); var mouse_down = m_ctl.create_mouse_click_sensor(); var elapsed = m_ctl.create_elapsed_sensor(); var logic_func = function(s) {return (s[0] && s[2]) || (s[1] && s[2])}; m_ctl.create_sensor_manifold(obj, "DISABLE_AUTO_ROTATE", m_ctl.CT_LEVEL, [mouse_move_x, mouse_move_y, mouse_down], logic_func, mouse_cb); m_ctl.create_sensor_manifold(obj, "AUTO_ROTATE", m_ctl.CT_CONTINUOUS, [elapsed], function(s) {return s[0]}, elapsed_cb); } else mouse_cb(); }
function stop_action(node, instance_id) { var inst = node.instances[instance_id]; if (!inst.action) return; var speakers = inst.action.speakers; var manifold_name = inst.action.manifold_name; var manifold_owner = node.payload.anim_obj; for (var i in speakers) { m_sfx.pause(speakers[i]) m_sfx.stop(speakers[i]); } stop_anims(node); if (manifold_name && m_ctl.check_sensor_manifold(manifold_owner, manifold_name)) m_ctl.remove_sensor_manifold(manifold_owner, manifold_name); }
exports.reset = function() { _char_wrapper.state = m_conf.CH_STILL; _char_wrapper.hp = m_conf.MAX_CHAR_HP; _char_wrapper.island = -1; _char_wrapper.move_state.forw_back = 0; _char_wrapper.move_state.left_right = 0; if (_level_conf) { m_trans.get_rotation(_char_wrapper.phys_body, _quat4_tmp); m_phy.set_transform(_char_wrapper.phys_body, _level_conf.CHAR_DEF_POS, _quat4_tmp); m_phy.set_character_move_dir(_char_wrapper.phys_body, 0, 0); m_scs.hide_object(_char_wrapper.foot_smoke); } var camobj = m_scs.get_active_camera(); if (m_ctl.check_sensor_manifold(camobj, "CAMERA_ROTATION")) m_ctl.remove_sensor_manifold(camobj, "CAMERA_ROTATION"); m_cam.eye_setup(camobj); }
function loaded_cb(data_id) { var cam = m_scenes.get_active_camera(); if (m_ctl.check_sensor_manifold(cam, "COLLISION")) m_ctl.remove_sensor_manifold(cam, "COLLISION"); var objs = m_scenes.get_all_objects("ALL", data_id); // spawn appended object in a certain position for (var i = 0; i < objs.length; i++) { var obj = objs[i]; if (m_phy.has_physics(obj)) { m_phy.enable_simulation(obj); m_trans.set_translation_v(obj, spawner_pos); } m_scenes.show_object(obj); } // create sensors to detect collisions var sensors = []; for (var i = 0; i < objs.length; i++) { var obj = objs[i]; if (m_phy.has_simulated_physics(obj)) { var sensor_col = m_ctl.create_collision_sensor(obj, "FURNITURE"); var sensor_sel = m_ctl.create_selection_sensor(obj); if (obj == _selected_obj) sensor_sel.value = true; sensors.push(sensor_col); sensors.push(sensor_sel); } } var logic_func = function(s) { for (var i = 0; i < s.length; i+=2) if (s[i+1]) return s[i]; return 0; } m_ctl.create_sensor_manifold(cam, "COLLISION", m_ctl.CT_TRIGGER, sensors, logic_func, trigger_glow); }
function request_mouse_drag(elem, use_mouse_control_cb) { exit_pointerlock(); _use_mouse_control_cb = use_mouse_control_cb || function() {return true}; elem.addEventListener("mousedown", drag_mouse_down_cb, false); elem.addEventListener("mouseup", drag_mouse_up_cb, false); var camera = m_scs.get_active_camera(); if (!m_ctl.check_sensor_manifold(camera, "SMOOTH_DRAG")) { var elapsed = m_ctl.create_elapsed_sensor(); m_ctl.create_sensor_manifold(camera, "SMOOTH_DRAG", m_ctl.CT_CONTINUOUS, [elapsed], null, smooth_cb); } }
function switch_auto_rotate_mode(button_elem_id) { var camobj = m_scenes.get_active_camera(); function disable_auto_rotate_cb() { m_ctl.remove_sensor_manifold(camobj, "AUTO_ROTATE"); m_ctl.remove_sensor_manifold(camobj, "DISABLE_AUTO_ROTATE"); button_switch_active(button_elem_id, false); } function elapsed_cb(obj, id, pulse) { if (pulse == 1) { var value = m_ctl.get_sensor_value(obj, id, 0); m_camera.rotate_pivot(obj, value * AUTO_ROTATE_RATIO, 0); } } if (!m_ctl.check_sensor_manifold(camobj, "AUTO_ROTATE")) { var mouse_move = m_ctl.create_mouse_move_sensor("XY"); var mouse_down = m_ctl.create_mouse_click_sensor(); var touch_move = m_ctl.create_touch_move_sensor("XY"); var touch_zoom = m_ctl.create_touch_zoom_sensor(); var elapsed = m_ctl.create_elapsed_sensor(); var logic_func = function(s) { return ((s[0] && s[1]) || s[2] || s[3]); }; m_ctl.create_sensor_manifold(camobj, "AUTO_ROTATE", m_ctl.CT_CONTINUOUS, [elapsed], function(s) {return s[0]}, elapsed_cb); m_ctl.create_sensor_manifold(camobj, "DISABLE_AUTO_ROTATE", m_ctl.CT_SHOT, [mouse_move, mouse_down, touch_move, touch_zoom], logic_func, disable_auto_rotate_cb); button_switch_active(button_elem_id, true); } else { disable_auto_rotate_cb(); } }
/** * Request drag mode. * @param {HTMLElement} elem Element * @param switch_drag Drag mouse mode (ENABLE_DRAG or DISABLE_DRAG) * @param {check_mouse_control_callback} [check_mouse_control] Check the mouse control * callback * @method module:pointerlock.requrest_mouse_drag */ function request_mouse_drag(elem, switch_drag, check_mouse_control) { _check_mouse_control = check_mouse_control || function() {return true}; if (switch_drag) { elem.addEventListener("mousedown", default_mouse_down_cb, false); elem.addEventListener("mouseup", default_mouse_up_cb, false); var camera = b4w.scenes.get_active_camera(); if (!m_ctl.check_sensor_manifold(camera, "SMOOTH_DRAG")) { var elapsed = m_ctl.create_elapsed_sensor(); m_ctl.create_sensor_manifold(camera, "SMOOTH_DRAG", m_ctl.CT_CONTINUOUS, [elapsed], null, smooth_cb); } } else { elem.removeEventListener("mousedown", default_mouse_down_cb, false); elem.removeEventListener("mouseup", default_mouse_up_cb, false); } }