function init_logic() { var from = new Float32Array(3); var pline = m_math.create_pline(); var to = new Float32Array(3); var decal_num = 0; var decal_src = m_scenes.get_object_by_name("Decal"); var decal_tsr = m_tsr.create(); var obj_tsr = m_tsr.create(); var decal_rot = m_quat.create(); var ray_test_cb = function(id, hit_fract, obj_hit, hit_time, hit_pos, hit_norm) { var decal = m_obj.copy(decal_src, "decal" + String(++decal_num), false); m_scenes.append_object(decal); m_tsr.set_trans(hit_pos, decal_tsr); m_quat.rotationTo(m_util.AXIS_Y, hit_norm, decal_rot); m_trans.set_rotation_v(decal, decal_rot); m_tsr.set_quat(decal_rot, decal_tsr); if (obj_hit && m_anim.is_animated(obj_hit)) { m_trans.get_tsr(obj_hit, obj_tsr); m_tsr.invert(obj_tsr, obj_tsr); m_tsr.multiply(obj_tsr, decal_tsr, decal_tsr); var offset = m_tsr.get_trans_view(decal_tsr); var rot_offset = m_tsr.get_quat_view(decal_tsr); m_cons.append_stiff(decal, obj_hit, offset, rot_offset); } m_trans.set_tsr(decal, decal_tsr); } var mouse_cb = function(e) { var x = e.clientX; var y = e.clientY; m_cam.calc_ray(m_scenes.get_active_camera(), x, y, pline); m_math.get_pline_directional_vec(pline, to); m_vec3.scale(to, 100, to); var obj_src = m_scenes.get_active_camera(); var id = m_phy.append_ray_test_ext(obj_src, from, to, "ANY", ray_test_cb, true, false, true, true); } var cont = m_cont.get_container(); cont.addEventListener("mousedown", mouse_cb, false); }
b4w.register("victory_day_2015_main", function(exports, require) { var m_anim = require("animation"); var m_app = require("app"); var m_cam = require("camera"); var m_cfg = require("config"); var m_cons = require("constraints"); var m_cont = require("container"); var m_data = require("data"); var m_lights = require("lights"); var m_main = require("main"); var m_mat = require("material"); var m_math = require("math"); var m_mouse = require("mouse"); var m_obj = require("objects"); var m_scs = require("scenes"); var m_sfx = require("sfx"); var m_time = require("time"); var m_trans = require("transform"); var m_tsr = require("tsr"); var m_util = require("util"); var m_version = require("version"); var m_quat = require("quat"); var m_vec3 = require("vec3"); var DEBUG = (m_version.type() === "DEBUG"); var objects_array = []; var random_colors = [[255, 255, 0], [255, 0, 148], [0, 255, 0], [0, 0, 255], [161, 0, 255], [255, 255, 255], [94, 255, 255]]; var _cam_tsr = new Float32Array(8); var _camera_point_tsr = new Float32Array(8); var _firework_1_tsr = new Float32Array(8); var _firework_2_1_tsr = new Float32Array(8); var _light_point_tsr = new Float32Array(8); var _tsr_tmp = new Float32Array(8); var _tsr_tmp2 = new Float32Array(8); var _firework_offset = new Float32Array(3); var _rocket_offset = new Float32Array(3); var _rocket_direction = new Float32Array(3); var _vec3_tmp = new Float32Array(3); var _vec3_tmp2 = new Float32Array(3); var _vec3_tmp3 = new Float32Array(3); var _vec3_tmp4 = new Float32Array(3); var ZERO_VECTOR = new Float32Array([0, 0, 0]); var SMOKE_OFFSET = new Float32Array([0, -1, 0]); var _vec4_tmp = new Float32Array(4); var _quat_tmp = new Float32Array(4); var _quat_tmp2 = new Float32Array(4); var _quat_tmp3 = new Float32Array(4); var _pline_tmp = m_math.create_pline(); var FIREWORKS_INTERVAL = 500; var FIREWORKS_QUANTITY = 16; var FIREWORKS_Y_OFFSET = -0.03; var ROCKETS_INTERVAL = 250; var MAX_X_OFFSET = 0.2; var MIN_X_OFFSET = -0.2; var MAX_Z_OFFSET = 1; var MIN_Z_OFFSET = -1; var MAX_ANGLE_OFFSET = 0.3; var MIN_ANGLE_OFFSET = 0; var ROCKET_BEHIND_TIME = 500; var ROCKET_BOTTOM_CLAMPING = 0.5; var ROCKET_DIST_FROM_CAMERA = 3; var ROCKET_FLYING_DIST = 85; var ROCKET_FLYING_TIME = 2000; var ROCKET_IN_RAIL_TIME = 500; var ROCKET_OFFSET_DIST = 1.1; var ROCKET_ROTATE_DIST = 400; var ROCKET_SMOKE_DISCENT = 0.5; var ROCKET_SMOKE_DISCENT_TIME = 1000; var ROCKET_TOP_CLAMPING = 3; var LOGO_FADE_IN = 300; var REPLAY_FADE_IN = 1000; var SOCIAL_FADE_IN = 500; var BG_FADE_OUT = 300; var IMAGE_FADE_IN = 300; var REMOVE_PRELOAD_TIME = 300; var PRELOAD_CONT_FADE_IN = 300; var PRELOAD_FADE_IN = 300; var SUN_FADE_IN = 300; var RESIDUAL_DELAY = 500; var ROCKET_BEFORE_SMOKE = 0; var SETTLING_DELAY = 100; var LIGHT_Z_OFFSET = 8; var FIRE_LIGHT_ENERGY = 20; var _9_may_logo = null; var _bm_13 = null; var _bm_13_Armature = null; var _button_spk = null; var _canvas_elem = null; var _cam = null; var _camera_point = null; var _control_box = null; var _control_box_button = null; var _current_rocket = null; var _current_rail = null; var _firework_1 = null; var _firework_2_1 = null; var _firework_2_2 = null; var _fireworks_spk = null; var _light_point = null; var _load_spk = null; var _load_spk_2 = null; var _noise_spk = null; var _origin_rocket = null; var _residual_armature = null; var _residual_smoke = null; var _rocket_flash = null; var _rocket_plume = null; var _rocket_smoke = null; var _rocket_start_smoke = null; var _rockets_box = null; var _settling_smoke = null; var _shot_spk = null; var _blend4web_logo = null; var _info_container = null; var _replay = null; var _replay_circle = null; var _social_buttons = null; var _start_info_height = 0; var _preload_cont = null var _in_area = false; var _is_grub = false; var _is_smoke = false; var _camera_action = ""; var _camera_state = 0; var _interval = 0; var _rocket_num = 0; var _light_params = null; exports.init = function() { var show_fps = DEBUG; var url_params = m_app.get_url_params(); if (url_params && "show_fps" in url_params) show_fps = true; m_app.init({ canvas_container_id: "main_canvas_container", callback: init_cb, alpha: false, report_init_failure: true, console_verbose: true, assets_dds_available: !DEBUG, assets_min50_available: !DEBUG, show_fps: show_fps }); } function init_cb(canvas_elem, success) { if (!success) { console.log("b4w init failure"); return; } _canvas_elem = canvas_elem; m_main.pause(); create_preloader(); load_stuff(); } function move_rocket(e) { if (!_current_rocket) return; var x = m_mouse.get_coords_x(e); var y = m_mouse.get_coords_y(e); set_rocket_translation(x, y); set_rocket_rotation(x, y); } function action_rocket() { if (!_is_grub) return; _is_grub = false; if (_in_area) { _current_rocket = null; move_rocket_behind_rail(); } else { objects_array.pop(); objects_array.pop(); m_scs.remove_object(_current_rocket); _current_rocket = null; _rocket_num -= 1; } } function move_rocket_behind_rail() { var copied_rocket = objects_array[objects_array.length - 2]; var current_rail = objects_array[objects_array.length - 1]; var rocket_tsr = m_trans.get_tsr(copied_rocket, m_tsr.create()); var rail_tsr = m_trans.get_tsr(current_rail, m_tsr.create()); var rail_offset_tsr = m_tsr.transform_vec3(_rocket_offset, rail_tsr, rail_tsr); m_time.animate(0, 1, ROCKET_BEHIND_TIME, function(e) { var new_tsr = m_tsr.interpolate(rocket_tsr, rail_offset_tsr, m_util.smooth_step(e), m_tsr.create()); m_trans.set_tsr(copied_rocket, new_tsr); if (e == 1) move_rocket_into_rail(copied_rocket, current_rail); }); } function move_rocket_into_rail(copied_rocket, current_rail) { var rocket_tsr = m_trans.get_tsr(copied_rocket, m_tsr.create()); var rail_tsr = m_trans.get_tsr(current_rail, m_tsr.create()); if (Math.round(Math.random())) m_sfx.play_def(_load_spk); else m_sfx.play_def(_load_spk_2); m_time.animate(0, 1, ROCKET_IN_RAIL_TIME, function(e) { var new_tsr = m_tsr.interpolate(rocket_tsr, rail_tsr, m_util.smooth_step(e), m_tsr.create()); m_trans.set_tsr(copied_rocket, new_tsr); if (e == 1) { _canvas_elem.addEventListener("mousedown", get_clicked_object); _canvas_elem.addEventListener("touchstart", get_clicked_object); m_cons.append_stiff(copied_rocket, current_rail, m_vec3.set(0, 0, 0, _vec3_tmp)); m_mat.set_nodemat_value(_control_box, ["control_box", "Value"], 1); } }); } function get_clicked_object(e) { if (e.preventDefault) e.preventDefault(); var x = m_mouse.get_coords_x(e); var y = m_mouse.get_coords_y(e); var obj = m_scs.pick_object(x, y); if (obj) switch (m_scs.get_object_name(obj)) { case "rockets_box": create_new_rocket(x, y); break; case "control_box_button": _camera_state = 2; action_rails(); break; } } function action_rails() { if (!_rocket_num) return; _canvas_elem.removeEventListener("mousedown", get_clicked_object); _canvas_elem.removeEventListener("touchstart", get_clicked_object); m_sfx.stop(_button_spk); m_sfx.play_def(_button_spk); m_anim.apply(_control_box_button, "press_button_Action"); m_anim.set_behavior(_control_box_button, m_anim.AB_FINISH_STOP); m_anim.play(_control_box_button); m_anim.set_speed(_rockets_box, -1); m_anim.play(_rockets_box, function() { m_anim.apply(_bm_13_Armature, "bm_13_Armature_rotate_-37_Action"); m_anim.set_first_frame(_bm_13_Armature); m_anim.set_behavior(_bm_13_Armature, m_anim.AB_FINISH_STOP); m_anim.play(_bm_13_Armature, action_camera); }); } function action_camera() { var apply_anim = m_anim.apply; var play_anim = m_anim.play; var set_beh = m_anim.set_behavior; apply_anim(_cam, _camera_action); m_anim.set_frame(_cam, m_anim.get_anim_start_frame(_bm_13_Armature)); set_beh(_cam, m_anim.AB_FINISH_STOP); play_anim(_cam, action_fire); apply_anim(_control_box, "hide_control_box_Action"); apply_anim(_control_box_button, "hide_control_box_Action"); set_beh(_control_box, m_anim.AB_FINISH_STOP); set_beh(_control_box_button, m_anim.AB_FINISH_STOP); play_anim(_control_box); play_anim(_control_box_button); m_sfx.stop(_noise_spk); } function action_fire() { for (var i = 1; i <= _rocket_num; i++) fire(i); } function fire(rocket_num) { var append_obj = m_scs.append_object; var append_stiff = m_cons.append_stiff; var apply_anim = m_anim.apply; var copy_obj = m_obj.copy; var play_anim = m_anim.play; var remove_cons = m_cons.remove; var remove_obj = m_scs.remove_object; var set_beh = m_anim.set_behavior; var show_obj = m_scs.show_object; var number_prefix = ""; if (rocket_num < 10) number_prefix = "0"; var rocket = m_scs.get_object_by_name("rocket_" + rocket_num); var rail = m_scs.get_object_by_dupli_name("bm_13", "rail_" + number_prefix + rocket_num); remove_cons(rocket); var rocket_flash_copy = copy_obj(_rocket_flash, "rocket_flash_" + rocket_num); var rocket_plume_copy = copy_obj(_rocket_plume, "rocket_plume_" + rocket_num); var rocket_start_smoke_copy = copy_obj(_rocket_start_smoke, "rocket_start_smoke_" + rocket_num, true); var settling_smoke_copy = copy_obj(_settling_smoke, "settling_smoke_" + rocket_num); m_time.set_timeout(function() { append_obj(rocket_flash_copy); append_obj(rocket_plume_copy); append_obj(rocket_start_smoke_copy); append_obj(settling_smoke_copy); show_obj(rocket_start_smoke_copy); show_obj(settling_smoke_copy); apply_anim(rocket_flash_copy, "rocket_flash_Shader_NodetreeAction"); apply_anim(rocket_plume_copy, "rocket_plume_start_Shader_NodetreeAction"); apply_anim(rocket_start_smoke_copy, "rocket_start_smoke_Shader_NodetreeAction"); apply_anim(rocket_start_smoke_copy, "rocket_start_smoke_finalscale", m_anim.SLOT_1); apply_anim(settling_smoke_copy, "settling smoke_Shader_NodetreeAction"); set_beh(rocket_plume_copy, m_anim.AB_FINISH_STOP); set_beh(rocket_flash_copy, m_anim.AB_FINISH_STOP); set_beh(rocket_start_smoke_copy, m_anim.AB_FINISH_STOP); set_beh(rocket_start_smoke_copy, m_anim.AB_FINISH_STOP, m_anim.SLOT_1); set_beh(settling_smoke_copy, m_anim.AB_FINISH_STOP); set_beh(_residual_armature, m_anim.AB_FINISH_STOP); set_beh(_residual_smoke, m_anim.AB_FINISH_STOP); append_stiff(rocket_flash_copy, rocket, ZERO_VECTOR); append_stiff(rocket_plume_copy, rocket, ZERO_VECTOR); append_stiff(rocket_start_smoke_copy, rail, SMOKE_OFFSET); remove_cons(rocket_start_smoke_copy); append_stiff(settling_smoke_copy, rocket, ZERO_VECTOR); play_anim(rocket_flash_copy); play_anim(rocket_start_smoke_copy, function() { remove_obj(rocket_start_smoke_copy); }); var start_tsr = m_tsr.identity(m_tsr.create()); var cur_tsr = m_tsr.identity(m_tsr.create()); m_trans.get_tsr(rocket_start_smoke_copy, start_tsr); m_trans.get_tsr(rocket_start_smoke_copy, cur_tsr); m_time.animate(0, ROCKET_SMOKE_DISCENT, ROCKET_SMOKE_DISCENT_TIME, function(e) { cur_tsr[2] = start_tsr[2] - e; m_trans.set_tsr(rocket_start_smoke_copy, cur_tsr)} ); m_time.set_timeout(function() { play_anim(rocket_start_smoke_copy, null, m_anim.SLOT_1); }, m_anim.frame_to_sec(9)); play_anim(settling_smoke_copy, function() { remove_cons(settling_smoke_copy); remove_obj(settling_smoke_copy); }); play_anim(rocket_plume_copy, function() { apply_anim(rocket_plume_copy, "rocket_plume_loop__Shader_NodetreeAction"); set_beh(rocket_plume_copy, m_anim.AB_CYCLIC); play_anim(rocket_plume_copy); }); m_time.set_timeout(function() { remove_cons(settling_smoke_copy); }, SETTLING_DELAY); m_sfx.play_def(_shot_spk); var rocket_tsr = m_trans.get_tsr(rocket, m_tsr.identity(m_tsr.create())); var copy_rocket_tsr = m_tsr.create(); m_tsr.copy(rocket_tsr, copy_rocket_tsr); var new_rocket_tsr = m_tsr.transform_vec3(_rocket_direction, rocket_tsr, copy_rocket_tsr); if (is_allowed_smoke(rocket_num)) { _is_smoke = true; apply_anim(_residual_armature, "residual_smoke_Armature_Action"); apply_anim(_residual_smoke, "residual_smoke_Shader_NodetreeAction"); apply_anim(_rocket_smoke, "rocket_smoke_Shader_NodetreeAction"); apply_anim(_rocket_smoke, "rocket_smoke_finalscale", m_anim.SLOT_1); m_anim.set_first_frame(_residual_armature); m_anim.set_first_frame(_residual_smoke); m_anim.set_first_frame(_rocket_smoke); m_anim.set_first_frame(_rocket_smoke, m_anim.SLOT_1); set_beh(_residual_armature, m_anim.AB_FINISH_STOP); set_beh(_residual_smoke, m_anim.AB_FINISH_STOP); set_beh(_rocket_smoke, m_anim.AB_FINISH_STOP); set_beh(_rocket_smoke, m_anim.AB_FINISH_STOP, m_anim.SLOT_1); play_anim(_rocket_smoke); play_anim(_rocket_smoke, null, m_anim.SLOT_1); m_time.set_timeout(function() { show_obj(_residual_smoke); play_anim(_residual_armature); m_anim.play(_residual_smoke, function(){ _is_smoke = false; m_trans.set_tsr(_cam, _camera_point_tsr); var cam_quat = m_trans.get_rotation(_cam, _quat_tmp); var new_cam_quat = m_quat.rotateX(cam_quat, Math.PI, _quat_tmp2); m_trans.set_rotation_v(_cam, new_cam_quat); run_firework(); }); }, RESIDUAL_DELAY); } if (rocket_num == 1) m_lights.set_light_params(_light_point, {"light_energy": FIRE_LIGHT_ENERGY}); m_time.animate(0, 1, ROCKET_FLYING_TIME, function(e) { var cur_tsr = m_tsr.interpolate(rocket_tsr, new_rocket_tsr, m_util.smooth_step(e), m_tsr.identity(m_tsr.create())); m_trans.set_tsr(rocket, cur_tsr); m_trans.set_translation(_light_point, cur_tsr[0], cur_tsr[1], cur_tsr[2] + LIGHT_Z_OFFSET); if (e == 1) { remove_cons(rocket_flash_copy); remove_cons(rocket_plume_copy); remove_obj(rocket); remove_obj(rocket_flash_copy); remove_obj(rocket_plume_copy); if (rocket_num == _rocket_num) { objects_array = []; m_sfx.stop(_shot_spk); _canvas_elem.addEventListener("mousedown", get_clicked_object); _canvas_elem.addEventListener("touchstart", get_clicked_object); } } }); }, ROCKETS_INTERVAL * rocket_num); } function is_allowed_smoke(rocket_num) { if (_is_smoke) return false; if (ROCKET_BEFORE_SMOKE >= _rocket_num) { if (_rocket_num == 1) var begin_rocket = 1; else var begin_rocket = _rocket_num - 1; } else var begin_rocket = _rocket_num - ROCKET_BEFORE_SMOKE; if (rocket_num == begin_rocket) return true; return false; } function create_new_rocket(x, y) { if (FIREWORKS_QUANTITY == _rocket_num) return; _rocket_num += 1; var copied_rocket = m_obj.copy(_origin_rocket, "rocket_" + _rocket_num); _current_rocket = copied_rocket; objects_array.push(copied_rocket); var number_prefix = ""; if (_rocket_num < 10) number_prefix = "0"; var current_rail = m_scs.get_object_by_dupli_name("bm_13", "rail_" + number_prefix + _rocket_num); _current_rail = current_rail; objects_array.push(current_rail); m_scs.append_object(copied_rocket); set_rocket_translation(x, y); set_rocket_rotation(x, y); _is_grub = true; } function set_rocket_translation(x, y) { var pline = m_cam.calc_ray(_cam, x, y, _pline_tmp); var camera_ray = m_math.get_pline_directional_vec(pline, _vec3_tmp) var camera_trans = m_trans.get_translation(_cam, _vec3_tmp2); var dist = m_vec3.scale(camera_ray, ROCKET_DIST_FROM_CAMERA, _vec3_tmp3); var point = m_vec3.add(camera_trans, dist, _vec3_tmp4); point[2] = m_util.clamp(point[2], ROCKET_BOTTOM_CLAMPING, ROCKET_TOP_CLAMPING); m_trans.set_translation_v(_current_rocket, point); } function set_rocket_rotation(x, y) { var rocket_trans = m_trans.get_translation(_current_rocket, _vec3_tmp); var rocket_quat = m_trans.get_rotation(_current_rocket, _quat_tmp); var rocket_rail_trans = m_trans.get_translation(_current_rail, _vec3_tmp2); var rocket_rail_quat = m_trans.get_rotation(_current_rail, _quat_tmp2); var project_point = m_cam.project_point(_cam, rocket_rail_trans, _vec3_tmp3); var delta_x = x - project_point[0]; var delta_y = y - project_point[1]; var delta = Math.sqrt(delta_x * delta_x + delta_y * delta_y); if (delta < ROCKET_ROTATE_DIST) _in_area = true; else { _in_area = false; delta = ROCKET_ROTATE_DIST; } var new_rocket_quat = rotate_to(rocket_rail_trans, rocket_trans, rocket_quat); var delta_rocket_quat = m_quat.slerp(rocket_rail_quat, new_rocket_quat, delta/ROCKET_ROTATE_DIST, _quat_tmp3); m_trans.set_rotation_v(_current_rocket, delta_rocket_quat); } function rotate_to(trans, target, quat) { var dir_from = m_util.quat_to_dir(quat, m_util.AXIS_MZ, _vec3_tmp3); var dir_to = m_vec3.subtract(target, trans, _vec3_tmp4); m_vec3.normalize(dir_to, dir_to); var rotation = m_quat.rotationTo(dir_from, dir_to, _vec4_tmp); m_quat.multiply(rotation, quat, quat); m_quat.normalize(quat, quat); return quat; } function load_stuff() { var assets_dir = m_cfg.get_std_assets_path(); m_data.load(assets_dir + "victory_day_2015/main_scene.json", load_cb, preloader_cb); resize(); window.addEventListener("resize", resize); } function resize_info() { var content = document.querySelector("#content"); var info_container = document.querySelector("#info_container"); var footer = document.querySelector("#footer"); if (_start_info_height > window.innerHeight + 10) { if ((_start_info_height - 50) >= window.innerHeight) { footer.style.backgroundImage = "url(icons/scroll_img.png)"; content.style.backgroundImage = "url(icons/scroll_fade_img.png)"; } if (window.innerHeight < 440) { content.style.display = "none"; footer.style.backgroundImage = ""; content.style.backgroundImage = ""; } else { if ((_start_info_height - 50) >= window.innerHeight) { footer.style.backgroundImage = "url(icons/scroll_img.png)"; content.style.backgroundImage = "url(icons/scroll_fade_img.png)"; } content.style.display = ""; content.style.height = info_container.offsetHeight - 200 -175 + "px"; } if (window.innerWidth < 380) content.style.height = parseInt(content.style.height) + 70 + "px"; } else { content.style.height = ""; footer.style.backgroundImage = ""; content.style.backgroundImage = ""; } } function init_global_objects() { init_dom_elems(); init_scene_objects(); init_vectors(); init_constraints(); } function init_dom_elems() { _replay = document.querySelector("#replay"); _replay_circle = _replay.querySelector("#replay_circle"); _info_container = document.querySelector("#info_container"); _blend4web_logo = document.querySelector("#blend4web_logo"); _social_buttons = document.querySelector("#social_buttons"); } function init_scene_objects() { var get_obj_by_dupli = m_scs.get_object_by_dupli_name; var get_obj_by_name = m_scs.get_object_by_name; _cam = m_scs.get_active_camera(); _9_may_logo = get_obj_by_dupli("9_may_logo", "planes"); _firework_1 = get_obj_by_dupli("firework", "firework_1"); _firework_2_1 = get_obj_by_dupli("firework", "firework_2_1"); _firework_2_2 = get_obj_by_dupli("firework", "firework_2_2"); _origin_rocket = get_obj_by_dupli("rocket", "rocket"); _camera_point = get_obj_by_name("Empty_camera_position_2"); _noise_spk = get_obj_by_dupli("red_square", "noise_spk"); _button_spk = get_obj_by_dupli("control_box", "button_spk"); _load_spk = get_obj_by_dupli("bm_13", "load_spk"); _load_spk_2 = get_obj_by_dupli("bm_13", "load_spk_2"); _bm_13_Armature = get_obj_by_dupli("bm_13", "bm_13_Armature"); _fireworks_spk = get_obj_by_dupli("bg", "fireworks_spk") _control_box = get_obj_by_dupli("control_box", "control_box"); _control_box_button = get_obj_by_dupli("control_box", "control_box_button"); _shot_spk = get_obj_by_dupli("bm_13", "shot_spk"); _rocket_flash = get_obj_by_dupli("rocket_plume_flash", "rocket_flash"); _rocket_plume = get_obj_by_dupli("rocket_plume_flash", "rocket_plume"); _rocket_start_smoke = get_obj_by_dupli("rocket_start_smoke", "rocket_start_smoke"); _residual_armature = get_obj_by_dupli("residual_smoke", "residual_smoke_Armature"); _residual_smoke = m_scs.get_object_children(_residual_armature)[0]; _settling_smoke = get_obj_by_dupli("settling smoke", "settling smoke"); _rocket_smoke = get_obj_by_dupli("rocket_smoke", "rocket_smoke"); _light_point = get_obj_by_name("rocket_Point_1"); _bm_13 = get_obj_by_name("bm_13"); _rockets_box = get_obj_by_dupli("rockets_box", "rockets_box_Armature"); _light_params = m_lights.get_light_params(_light_point); } function init_vectors() { var get_tsr = m_trans.get_tsr; var set = m_vec3.set; get_tsr(_cam, _cam_tsr); get_tsr(_firework_1, _firework_1_tsr); get_tsr(_firework_2_1, _firework_2_1_tsr); _firework_2_1_tsr[3] = 1; m_vec3.subtract(_firework_2_1_tsr, _firework_1_tsr, _firework_offset); get_tsr(_camera_point, _camera_point_tsr); set(0, 0, -ROCKET_OFFSET_DIST, _rocket_offset); set(0, 0, ROCKET_FLYING_DIST, _rocket_direction); get_tsr(_light_point, _light_point_tsr); } function init_constraints() { // position control box var cbox = m_scs.get_object_by_name("control_box"); var tsr_cbox_in_cam_space = m_tsr.multiply(m_tsr.invert(_cam_tsr, m_tsr.create()), m_trans.get_tsr(cbox), m_tsr.create()); var distance = Math.abs(tsr_cbox_in_cam_space[2]); var rotation = m_tsr.get_quat_view(tsr_cbox_in_cam_space); m_cons.append_stiff_viewport(cbox, _cam, { right: 0.0, bottom: 0.0, distance: distance, rotation: rotation }); m_cons.append_track(_light_point, _bm_13, "-Z", "X"); } function load_cb(root) { init_url_params(); init_global_objects(); set_camera_action(); replace_camera(); window.addEventListener("resize", resize_info); } function set_camera_action() { if (window.innerWidth > window.innerHeight) _camera_action = "Camera_wide screen_Action"; else _camera_action = "Camera_narrow_screen_Action"; if (_cam && _camera_state == 1 && !m_anim.is_play(_cam)) m_anim.apply(_cam, _camera_action); } function replace_camera() { m_anim.apply(_cam, _camera_action); m_anim.set_last_frame(_cam); } function init_url_params() { var url_params = m_app.get_url_params(); if (url_params && "lang" in url_params) remove_dom_elemnts(url_params["lang"]); } function remove_dom_elemnts(lang) { var css_class = "ru"; if (lang == "ru") css_class = "en"; var removing_soc_but = document.querySelector("#social_buttons." + css_class); var removing_info = document.querySelector("#info." + css_class); var removing_run_but = document.querySelector("#run_button." + css_class); removing_soc_but.parentNode.removeChild(removing_soc_but); removing_info.parentNode.removeChild(removing_info); removing_run_but.parentNode.removeChild(removing_run_but); } function run_firework() { var hide_obj = m_scs.hide_object; hide_obj(_firework_1); hide_obj(_firework_2_1); hide_obj(_firework_2_2); m_anim.apply(_9_may_logo, "9may_atlas_Shader_NodetreeAction"); m_anim.set_first_frame(_9_may_logo); m_anim.set_behavior(_9_may_logo, m_anim.AB_FINISH_STOP); m_sfx.stop(_fireworks_spk); m_sfx.play_def(_fireworks_spk); _interval = 0; for (var i = 2; i <= _rocket_num + 1; i++) action_firework_item(i); } function action_firework_item(firework_num) { var copy_obj = m_obj.copy; var show_obj = m_scs.show_object; var append_obj = m_scs.append_object; var remove_obj = m_scs.remove_object; var apply_anim = m_anim.apply; var play_anim = m_anim.play; var slot_1 = m_anim.SLOT_1; var set_tsr = m_trans.set_tsr; var firework_1_copy = copy_obj(_firework_1, "firework_" + firework_num, true); var firework_2_1_copy = copy_obj(_firework_2_1, "firework_" + firework_num + _rocket_num + 1, true); var firework_2_2_copy = copy_obj(_firework_2_2, "firework_" + firework_num + _rocket_num + 2, true); show_obj(firework_1_copy); show_obj(firework_2_1_copy); show_obj(firework_2_2_copy); var random_index = Math.floor((Math.random() * random_colors.length)) var random_color = random_colors[random_index]; var delta_x = -Math.random() * (MAX_X_OFFSET - MIN_X_OFFSET) + MIN_X_OFFSET; var delta_z = Math.random() * (MAX_Z_OFFSET - MIN_Z_OFFSET) + MIN_Z_OFFSET; var angle = -Math.random() * (MAX_ANGLE_OFFSET - MIN_ANGLE_OFFSET) + MIN_ANGLE_OFFSET; m_mat.set_nodemat_rgb(firework_2_1_copy, ["firework_2", "RGB"], random_color[0] / 255, random_color[1] / 255, random_color[2] / 255); m_mat.set_nodemat_rgb(firework_2_2_copy, ["firework_2", "RGB"], random_color[0] / 255, random_color[1] / 255, random_color[2] / 255); var rand_firework_1_cp_tsr = get_tsr_offset(_firework_1_tsr, delta_x, 0, delta_z, angle, _tsr_tmp); var rand_firework_2_cp_tsr = get_tsr_offset(rand_firework_1_cp_tsr, _firework_offset[0], firework_num * FIREWORKS_Y_OFFSET, _firework_offset[2], 0, _tsr_tmp2); set_tsr(firework_1_copy, rand_firework_1_cp_tsr); set_tsr(firework_2_1_copy, rand_firework_2_cp_tsr); set_tsr(firework_2_2_copy, rand_firework_2_cp_tsr); var cb = null; if (_rocket_num == firework_num - 1) cb = fly_flag; m_time.set_timeout(function() { append_obj(firework_1_copy); append_obj(firework_2_1_copy); append_obj(firework_2_2_copy); apply_anim(firework_1_copy, "firework_1_Shader_NodetreeAction"); apply_anim(firework_2_1_copy, "firework_2_Action"); apply_anim(firework_2_1_copy, "firework_2_Shader_NodetreeAction", slot_1); apply_anim(firework_2_2_copy, "firework_2_Action"); apply_anim(firework_2_2_copy, "firework_2_Shader_NodetreeAction", slot_1); play_anim(firework_1_copy, function() { remove_obj(firework_1_copy); }); play_anim(firework_2_2_copy); play_anim(firework_2_1_copy, function() { remove_obj(firework_2_1_copy); }); play_anim(firework_2_2_copy, function() { remove_obj(firework_2_2_copy); if (cb) cb(); }, slot_1); }, _interval); // randomize: 0.5-1.5 _interval += FIREWORKS_INTERVAL * (0.5 + Math.random()); } function fly_flag() { m_sfx.stop(_fireworks_spk); m_anim.play(_9_may_logo, show_replay); } function show_replay() { _replay_circle.addEventListener("click", return_to_begin); var replay_style = _replay.style; replay_style.opacity = 0; replay_style.display = "block"; var b4w_logo_style = _blend4web_logo.style; b4w_logo_style.opacity = 0; b4w_logo_style.display = "block"; var soc_but_style = _social_buttons.style; soc_but_style.opacity = 0; soc_but_style.display = "block"; m_app.css_animate(_replay, "opacity", 0, 1, REPLAY_FADE_IN, "", "", function() { m_app.css_animate(_blend4web_logo, "opacity", 0, 1, LOGO_FADE_IN); m_app.css_animate(_social_buttons, "opacity", 0, 1, SOCIAL_FADE_IN); }); m_anim.apply(_bm_13_Armature, "bm_13_Armature_rotate_-20_Action"); m_anim.set_behavior(_bm_13_Armature, m_anim.AB_FINISH_STOP); m_anim.set_first_frame(_bm_13_Armature); } function return_to_begin() { _blend4web_logo.style.display = ""; _social_buttons.style.display = ""; _replay.style.display = ""; m_mat.set_nodemat_value(_control_box, ["control_box", "Value"], 0); m_anim.set_first_frame(_cam); _replay_circle.removeEventListener("click", return_to_begin); _rocket_num = 0; m_trans.set_tsr(_cam, _cam_tsr); m_trans.set_tsr(_light_point, _light_point_tsr); m_lights.set_light_params(_light_point, _light_params); m_anim.apply(_cam, _camera_action); m_anim.set_first_frame(_control_box); m_anim.set_first_frame(_control_box_button); m_sfx.play_def(_noise_spk); _camera_state = 1; open_rocket_box(); } function get_tsr_offset(origin_tsr, delta_x, delta_y, delta_z, angle, dest) { m_tsr.identity(dest); var quat = m_quat.setAxisAngle(m_util.AXIS_MY, angle, _quat_tmp); var trans_offset = m_vec3.set(delta_x, delta_y, delta_z, _vec3_tmp); m_tsr.set_trans(trans_offset, dest); m_tsr.set_quat(quat, dest); m_tsr.multiply(origin_tsr, dest, dest); return dest; } function resize() { m_cont.resize_to_container(); set_camera_action(); } function preloader_cb(percentage) { var preloader_line_left = _preload_cont.querySelector("#preloader_line_left"); var preloader_line_right = _preload_cont.querySelector("#preloader_line_right"); var percentage_display = _preload_cont.querySelector("#percentage"); if (percentage == 100) { remove_preloader(); return; } if (percentage <= 40) preloader_line_left.style.width = percentage * 2 + "%"; else if (percentage > 40 && percentage < 60) preloader_line_left.style.width = "100%"; else if (percentage > 60) { preloader_line_left.style.width = "100%"; preloader_line_right.style.width = (percentage - 50) * 2 + "%"; } percentage_display.innerHTML = percentage; } function create_preloader() { _preload_cont = document.querySelector("#preloader_container"); var main_canvas_container = m_cont.get_container(); var bg_image_container = _preload_cont.querySelector("#bg_image_container"); var bg_fade_container = _preload_cont.querySelector("#bg_fade_container"); var sun_container = _preload_cont.querySelector("#sun_container"); var preloader = _preload_cont.querySelector("#preloader"); var css_animate = m_app.css_animate; css_animate(bg_fade_container, "opacity", 0, 0.6, BG_FADE_OUT); css_animate(_preload_cont, "opacity", 0, 1,PRELOAD_CONT_FADE_IN, "", "", function() { css_animate(bg_image_container, "opacity", 0, 1, IMAGE_FADE_IN, "", "", function() { css_animate(sun_container, "opacity", 0, 1, SUN_FADE_IN, "", "", function() { css_animate(preloader, "opacity", 0, 1, PRELOAD_FADE_IN, "", "", function() { m_main.resume(); main_canvas_container.style.visibility = "visible"; }) }) }) }); } function remove_preloader() { show_info(); m_app.css_animate(_preload_cont, "opacity", 1, 0, REMOVE_PRELOAD_TIME, "", "", function() { _preload_cont.parentNode.removeChild(_preload_cont); }); } function show_info() { var close_info = _info_container.querySelector("#close_info_but"); var run_button = _info_container.querySelector("#run_button"); var info = _info_container.querySelector("#info"); var sound_cont = _info_container.querySelector("#sound_cont"); m_scs.hide_object(_rocket_start_smoke); m_scs.hide_object(_settling_smoke); close_info.addEventListener("click", remove_info); run_button.addEventListener("click", remove_info); sound_cont.addEventListener("click", on_off_sound); _info_container.style.display = "block"; info.style.display = "block"; run_button.style.display = "block"; init_container_params(); resize_info(); } function on_off_sound() { var sound_cont = _info_container.querySelector("#sound_cont"); if (sound_cont.className == "active") { sound_cont.className = ""; m_sfx.mute(null, true); } else { sound_cont.className = "active"; m_sfx.mute(null, false); } } function init_container_params() { _start_info_height = _info_container.scrollHeight; } function remove_info() { var bg_color = document.querySelector("#background_color"); window.removeEventListener("resize", resize_info); m_scs.hide_object(_rocket_start_smoke); m_scs.hide_object(_settling_smoke); _info_container.parentNode.removeChild(_info_container); bg_color.parentNode.removeChild(bg_color); run_initial_sounds(); rotate_camera(); } function rotate_camera() { m_anim.set_speed(_cam, -1); m_anim.set_behavior(_cam, m_anim.AB_FINISH_STOP); m_anim.play(_cam, open_rocket_box); } function run_initial_sounds() { var clock_spk = m_scs.get_object_by_dupli_name("red_square", "clock_spk"); m_sfx.stop(clock_spk); m_sfx.stop(_noise_spk); m_sfx.play_def(clock_spk); m_sfx.play_def(_noise_spk); } function open_rocket_box() { m_anim.apply(_rockets_box, "opening_rockets_box_Action"); m_anim.set_first_frame(_rockets_box); m_anim.set_behavior(_rockets_box, m_anim.AB_FINISH_STOP); m_anim.play(_rockets_box, up_20_degrees); } function up_20_degrees() { m_anim.apply(_bm_13_Armature, "bm_13_Armature_rotate_-20_Action"); m_anim.set_first_frame(_bm_13_Armature); m_anim.set_behavior(_bm_13_Armature, m_anim.AB_FINISH_STOP); m_anim.play(_bm_13_Armature, add_listeners); } function add_listeners() { _canvas_elem.removeEventListener("mousedown", get_clicked_object); _canvas_elem.removeEventListener("touchstart", get_clicked_object); _canvas_elem.removeEventListener("mousemove", move_rocket); _canvas_elem.removeEventListener("touchmove", move_rocket); _canvas_elem.removeEventListener("mouseup", action_rocket); _canvas_elem.removeEventListener("touchend", action_rocket); document.removeEventListener("mouseout", action_rocket); _canvas_elem.addEventListener("mousedown", get_clicked_object); _canvas_elem.addEventListener("touchstart", get_clicked_object); _canvas_elem.addEventListener("mousemove", move_rocket); _canvas_elem.addEventListener("touchmove", move_rocket); _canvas_elem.addEventListener("mouseup", action_rocket); _canvas_elem.addEventListener("touchend", action_rocket); document.addEventListener("mouseout", action_rocket); _camera_state = 1; } });
b4w.register("cartoon_interior", function(exports, require) { var m_app = require("app"); var m_cam = require("camera"); var m_cfg = require("config"); var m_cont = require("container"); var m_ctl = require("controls"); var m_data = require("data"); var m_mouse = require("mouse"); var m_math = require("math"); var m_obj = require("objects"); var m_phy = require("physics"); var m_preloader = require("preloader"); var m_scenes = require("scenes"); var m_trans = require("transform"); var m_version = require("version"); var m_quat = require("quat"); var DEBUG = (m_version.type() === "DEBUG"); var OUTLINE_COLOR_VALID = [0, 1, 0]; var OUTLINE_COLOR_ERROR = [1, 0, 0]; var FLOOR_PLANE_NORMAL = [0, 0, 1]; var ROT_ANGLE = Math.PI/4; var WALL_X_MAX = 4; var WALL_X_MIN = -3.8; var WALL_Y_MAX = 3.5; var WALL_Y_MIN = -4.2; var ASSETS_PATH = m_cfg.get_std_assets_path() + "tutorials/cartoon_interior/"; var _obj_delta_xy = new Float32Array(2); var spawner_pos = new Float32Array(3); var _vec3_tmp = new Float32Array(3); var _vec3_tmp2 = new Float32Array(3); var _vec3_tmp3 = new Float32Array(3); var _vec4_tmp = new Float32Array(4); var _pline_tmp = m_math.create_pline(); var _drag_mode = false; var _enable_camera_controls = true; var _selected_obj = null; exports.init = function() { var show_fps = DEBUG; var url_params = m_app.get_url_params(); if (url_params && "show_fps" in url_params) show_fps = true; m_app.init({ canvas_container_id: "main_canvas_container", callback: init_cb, physics_enabled: true, show_fps: show_fps, alpha: false, assets_dds_available: !DEBUG, assets_min50_available: !DEBUG, background_color: [1.0, 1.0, 1.0, 0.0] }); }; function init_cb(canvas_elem, success) { if (!success) { console.log("b4w init failure"); return; } m_preloader.create_preloader(); canvas_elem.addEventListener("mousedown", main_canvas_down); canvas_elem.addEventListener("touchstart", main_canvas_down); canvas_elem.addEventListener("mouseup", main_canvas_up); canvas_elem.addEventListener("touchend", main_canvas_up); canvas_elem.addEventListener("mousemove", main_canvas_move); canvas_elem.addEventListener("touchmove", main_canvas_move); window.onresize = m_cont.resize_to_container; m_cont.resize_to_container(); load(); } function preloader_cb(percentage) { m_preloader.update_preloader(percentage); } function load() { m_data.load(ASSETS_PATH + "environment.json", load_cb, preloader_cb); } function load_cb(data_id) { m_app.enable_camera_controls(false, false, false, m_cont.get_canvas()); init_controls(); var spawner = m_scenes.get_object_by_name("spawner"); m_trans.get_translation(spawner, spawner_pos); } function init_controls() { var controls_elem = document.getElementById("controls-container"); controls_elem.style.display = "block"; init_buttons(); document.getElementById("load-1").addEventListener("click", function(e) { m_data.load(ASSETS_PATH + "bed.json", loaded_cb, null, null, true); }); document.getElementById("load-2").addEventListener("click", function(e) { m_data.load(ASSETS_PATH + "chair.json", loaded_cb, null, null, true); }); document.getElementById("load-3").addEventListener("click", function(e) { m_data.load(ASSETS_PATH + "commode_and_pot.json", loaded_cb, null, null, true); }); document.getElementById("load-4").addEventListener("click", function(e) { m_data.load(ASSETS_PATH + "fan.json", loaded_cb, null, null, true); }); document.getElementById("load-5").addEventListener("click", function(e) { m_data.load(ASSETS_PATH + "table.json", loaded_cb, null, null, true); }); document.getElementById("delete").addEventListener("click", function(e) { if (_selected_obj) { var id = m_scenes.get_object_data_id(_selected_obj); m_data.unload(id); _selected_obj = null; } }); document.getElementById("rot-ccw").addEventListener("click", function(e) { if (_selected_obj) rotate_object(_selected_obj, ROT_ANGLE); }); document.getElementById("rot-cw").addEventListener("click", function(e) { if (_selected_obj) rotate_object(_selected_obj, -ROT_ANGLE); }); } function init_buttons() { var ids = ["delete", "rot-ccw", "rot-cw"]; for (var i = 0; i < ids.length; i++) { var id = ids[i]; document.getElementById(id).addEventListener("mousedown", function(e) { var parent = e.target.parentNode; parent.classList.add("active"); }); document.getElementById(id).addEventListener("mouseup", function(e) { var parent = e.target.parentNode; parent.classList.remove("active"); }); document.getElementById(id).addEventListener("touchstart", function(e) { var parent = e.target.parentNode; parent.classList.add("active"); }); document.getElementById(id).addEventListener("touchend", function(e) { var parent = e.target.parentNode; parent.classList.remove("active"); }); } } function loaded_cb(data_id) { var objs = m_scenes.get_all_objects("ALL", data_id); for (var i = 0; i < objs.length; i++) { var obj = objs[i]; if (m_phy.has_physics(obj)) { m_phy.enable_simulation(obj); // create sensors to detect collisions var sensor_col = m_ctl.create_collision_sensor(obj, "FURNITURE"); var sensor_sel = m_ctl.create_selection_sensor(obj, true); if (obj == _selected_obj) m_ctl.set_custom_sensor(sensor_sel, 1); m_ctl.create_sensor_manifold(obj, "COLLISION", m_ctl.CT_CONTINUOUS, [sensor_col, sensor_sel], logic_func, trigger_outline); // spawn appended object at a certain position var obj_parent = m_obj.get_parent(obj); if (obj_parent && m_obj.is_armature(obj_parent)) // translate the parent (armature) of the animated object m_trans.set_translation_v(obj_parent, spawner_pos); else m_trans.set_translation_v(obj, spawner_pos); } // show appended object if (m_obj.is_mesh(obj)) m_scenes.show_object(obj); } } function logic_func(s) { return s[1]; } function trigger_outline(obj, id, pulse) { if (pulse == 1) { // change outline color according to the // first manifold sensor (collision sensor) status var has_collision = m_ctl.get_sensor_value(obj, id, 0); if (has_collision) m_scenes.set_outline_color(OUTLINE_COLOR_ERROR); else m_scenes.set_outline_color(OUTLINE_COLOR_VALID); } } function rotate_object(obj, angle) { var obj_parent = m_obj.get_parent(obj); if (obj_parent && m_obj.is_armature(obj_parent)) { // rotate the parent (armature) of the animated object var obj_quat = m_trans.get_rotation(obj_parent, _vec4_tmp); m_quat.rotateZ(obj_quat, angle, obj_quat); m_trans.set_rotation_v(obj_parent, obj_quat); } else { var obj_quat = m_trans.get_rotation(obj, _vec4_tmp); m_quat.rotateZ(obj_quat, angle, obj_quat); m_trans.set_rotation_v(obj, obj_quat); } limit_object_position(obj); } function main_canvas_down(e) { _drag_mode = true; if (e.preventDefault) e.preventDefault(); var x = m_mouse.get_coords_x(e); var y = m_mouse.get_coords_y(e); var obj = m_scenes.pick_object(x, y); // handling outline effect if (_selected_obj != obj) { if (_selected_obj) m_scenes.clear_outline_anim(_selected_obj); if (obj) m_scenes.apply_outline_anim(obj, 1, 1, 0); _selected_obj = obj; } // calculate delta in viewport coordinates if (_selected_obj) { var cam = m_scenes.get_active_camera(); var obj_parent = m_obj.get_parent(_selected_obj); if (obj_parent && m_obj.is_armature(obj_parent)) // get translation from the parent (armature) of the animated object m_trans.get_translation(obj_parent, _vec3_tmp); else m_trans.get_translation(_selected_obj, _vec3_tmp); m_cam.project_point(cam, _vec3_tmp, _obj_delta_xy); _obj_delta_xy[0] = x - _obj_delta_xy[0]; _obj_delta_xy[1] = y - _obj_delta_xy[1]; } } function main_canvas_up(e) { _drag_mode = false; // enable camera controls after releasing the object if (!_enable_camera_controls) { m_app.enable_camera_controls(); _enable_camera_controls = true; } } function main_canvas_move(e) { if (_drag_mode) if (_selected_obj) { // disable camera controls while moving the object if (_enable_camera_controls) { m_app.disable_camera_controls(); _enable_camera_controls = false; } // calculate viewport coordinates var cam = m_scenes.get_active_camera(); var x = m_mouse.get_coords_x(e); var y = m_mouse.get_coords_y(e); if (x >= 0 && y >= 0) { x -= _obj_delta_xy[0]; y -= _obj_delta_xy[1]; // emit ray from the camera var pline = m_cam.calc_ray(cam, x, y, _pline_tmp); var camera_ray = m_math.get_pline_directional_vec(pline, _vec3_tmp); // calculate ray/floor_plane intersection point var cam_trans = m_trans.get_translation(cam, _vec3_tmp2); m_math.set_pline_initial_point(_pline_tmp, cam_trans); m_math.set_pline_directional_vec(_pline_tmp, camera_ray); var point = m_math.line_plane_intersect(FLOOR_PLANE_NORMAL, 0, _pline_tmp, _vec3_tmp3); // do not process the parallel case and intersections behind the camera if (point && camera_ray[2] < 0) { var obj_parent = m_obj.get_parent(_selected_obj); if (obj_parent && m_obj.is_armature(obj_parent)) // translate the parent (armature) of the animated object m_trans.set_translation_v(obj_parent, point); else m_trans.set_translation_v(_selected_obj, point); limit_object_position(_selected_obj); } } } } function limit_object_position(obj) { var bb = m_trans.get_object_bounding_box(obj); var obj_parent = m_obj.get_parent(obj); if (obj_parent && m_obj.is_armature(obj_parent)) // get translation from the parent (armature) of the animated object var obj_pos = m_trans.get_translation(obj_parent, _vec3_tmp); else var obj_pos = m_trans.get_translation(obj, _vec3_tmp); if (bb.max_x > WALL_X_MAX) obj_pos[0] -= bb.max_x - WALL_X_MAX; else if (bb.min_x < WALL_X_MIN) obj_pos[0] += WALL_X_MIN - bb.min_x; if (bb.max_y > WALL_Y_MAX) obj_pos[1] -= bb.max_y - WALL_Y_MAX; else if (bb.min_y < WALL_Y_MIN) obj_pos[1] += WALL_Y_MIN - bb.min_y; if (obj_parent && m_obj.is_armature(obj_parent)) // translate the parent (armature) of the animated object m_trans.set_translation_v(obj_parent, obj_pos); else m_trans.set_translation_v(obj, obj_pos); } });
b4w.register("start_menu", function(exports, require) { var m_main = require("main"); var m_app = require("app"); var m_cam = require("camera"); var m_data = require("data"); var m_ctl = require("controls"); var m_scs = require("scenes"); var m_cfg = require("config"); var m_print = require("print"); var m_sfx = require("sfx"); var m_assets = require("assets"); var m_mat = require("material"); var m_cont = require("container"); var m_nla = require("nla"); var m_trans = require("transform"); var m_version = require("version"); var m_phy = require("physics"); var m_math = require("math"); var m_vec3 = require("vec3"); var m_conf = require("game_config"); var game_main = require("game_main"); var _hq_loaded = false; var _button_clicked = false; var _selected_obj = null; var _buttons_info = {}; var _disable_plalist = false; var _intro_spk = null; var _playlist_spks = []; var _end_spk = null; var _ray_id = null; var _cam_from = new Float32Array(3); var _cam_to = new Float32Array(3); var _cam_pline = m_math.create_pline(); var _canvas_elem = null; var _mouse_x = 0; var _mouse_y = 0; var _default_cam_rot = new Float32Array(2); var _cam_dist = null; var _cam_pivot = new Float32Array(3); var _cam_rot_fac = 0; var _vec3_tmp = new Float32Array(3); var _lang = "en"; var _back_to_menu_button = null; var _vec2_tmp = new Float32Array(2); var ASSETS_PATH = m_cfg.get_std_assets_path() + "petigors_tale/"; exports.init = function() { window.addEventListener("load", menu_initialization); } function init_cb(canvas_elem, success) { if (!success) { m_print.log("b4w init failure"); return; } _canvas_elem = canvas_elem; var preloader_cont = document.getElementById("preloader_cont"); preloader_cont.style.visibility = "visible" //var level_name = "level_01"; //var json_path = ASSETS_PATH + level_name + ".json"; //m_data.load(json_path, // function(data_id) { // game_main.level_load_cb(data_id, level_name, preloader_cb, // intro_load_cb, load_level); // }, // preloader_cb, true); if (m_main.detect_mobile()) m_data.load(ASSETS_PATH + "intro_LQ.json", intro_load_cb, preloader_cb, true); else m_data.load(ASSETS_PATH + "intro_HQ.json", intro_load_cb, preloader_cb, true); } function intro_load_cb(data_id) { _hq_loaded = false; _button_clicked = false; _selected_obj = null; _mouse_x = _canvas_elem.width / 2; _mouse_y = _canvas_elem.height / 2; m_assets.enqueue([{id:"config", type:m_assets.AT_JSON, url:"js/intro_config.json"}], process_config); var camobj = m_scs.get_active_camera(); m_cam.get_camera_angles(camobj, _default_cam_rot); setTimeout(function() { var canvas_cont = m_cont.get_container(); canvas_cont.style.opacity = 1; }, 1000); if (!m_main.detect_mobile()) { var ray_test_cb = function(sens_obj, id, pulse) { var sens_val = m_ctl.get_sensor_value(sens_obj, id, 0); var payload = m_ctl.get_sensor_payload(sens_obj, id, 0); var obj = payload.obj_hit; _ray_id = payload.ray_test_id; if (!sens_val) { _selected_obj = null; return; } if (obj != _selected_obj) { _selected_obj = obj; var binfo = _buttons_info[obj.name]; if (binfo && binfo.speaker) m_sfx.play_def(binfo.speaker); } } var ray_sens = m_ctl.create_ray_sensor(camobj, _cam_from, _cam_to, "BUTTON", true, false, true); m_ctl.create_sensor_manifold(null, "BUTTON_HOVER", m_ctl.CT_CONTINUOUS, [ray_sens], function(s){return true}, ray_test_cb); _canvas_elem.addEventListener("mousedown", main_canvas_click, false); _canvas_elem.addEventListener("mousemove", main_canvas_mouse_move, false); setTimeout(function() { if (!_hq_loaded && !_button_clicked) load_HQ_elements(); }, 10000) } else _canvas_elem.addEventListener("touchstart", main_canvas_touch, false); } function setup_language(config) { var lang_val = 1; if (_lang == "ru") lang_val = 0 var lang_obj = m_scs.get_object_by_dupli_name_list(config["language_obj"].split("*")); m_mat.set_nodemat_value(lang_obj, ["main_menu_stone", "language_switcher"], lang_val); if (!m_main.detect_mobile()) { _back_to_menu_button = m_scs.get_object_by_name(config["back_to_menu_obj_name"]); m_mat.set_nodemat_value(_back_to_menu_button, ["back_to_main_menu", "back_button_language"], lang_val); } } function process_config(data, id, type, url) { setup_buttons(data); setup_music(data); setup_language(data); var camobj = m_scs.get_active_camera(); _cam_rot_fac = data["camera_rotation_fac"]; m_vec3.copy(data["camera_pivot"], _cam_pivot); m_trans.get_translation(camobj, _vec3_tmp); _cam_dist = m_vec3.distance(_cam_pivot, _vec3_tmp); } function setup_buttons(config) { var bdata = config["buttons_info"]; var elapsed_sensor = m_ctl.create_elapsed_sensor(); for (var i = 0; i < bdata.length; i++) { var binfo = bdata[i]; var obj = m_scs.get_object_by_dupli_name_list(binfo["button_name"].split("*")); if (obj) _buttons_info[obj.name] = init_button_info(binfo); } m_ctl.create_sensor_manifold(null, "GLOW", m_ctl.CT_CONTINUOUS, [elapsed_sensor], null, button_glow_cb); m_ctl.create_sensor_manifold(null, "ROT_CAMERA", m_ctl.CT_CONTINUOUS, [elapsed_sensor], null, rotate_cam_cb); } function init_button_info(binfo) { var speaker = m_scs.get_object_by_dupli_name_list(binfo["mouse_over_speaker"].split("*")); m_sfx.stop(speaker); var glow_objs = []; var glow_obj_names = binfo["glow_obj_names"]; if (typeof(glow_obj_names) == "object") { // array for (var j = 0; j < glow_obj_names.length; j++) { var glow_obj = m_scs.get_object_by_dupli_name_list(glow_obj_names[j].split("*")); if (glow_obj) glow_objs.push(glow_obj); } } else glow_objs.push(m_scs.get_object_by_dupli_name_list(glow_obj_names.split("*"))); return { glow_objs: glow_objs, speaker: speaker, level_name: binfo["level_name"], material: binfo["material"], value_node_name: binfo["value_node_name"], glow_grow_time: binfo["glow_grow_time"], min_glow_value: binfo["min_glow_value"], max_glow_value: binfo["max_glow_value"], glow_curr_value: binfo["min_glow_value"], outline_grow_time: binfo["outline_grow_time"], min_outline_value: binfo["min_outline_value"], max_outline_value: binfo["max_outline_value"], outline_curr_value: binfo["min_outline_value"], }; } function setup_music(config) { _intro_spk = m_scs.get_object_by_dupli_name_list( config["intro_speaker"].split("*")); _end_spk = m_scs.get_object_by_dupli_name_list( config["end_speaker"].split("*")); var playlist_names = config["playlist_speakers"]; for (var i = 0; i < playlist_names.length; i++) { var spk_name = playlist_names[i]; var spk = m_scs.get_object_by_dupli_name_list(spk_name.split("*")); m_sfx.stop(spk); _playlist_spks.push(spk); m_sfx.mute(spk, false); } var intro_duration = m_sfx.get_duration(_intro_spk) * m_sfx.get_playrate(_intro_spk); m_sfx.mute(_intro_spk, false); m_sfx.mute(_end_spk, false); var playlist_cb = function(obj, id, pulse) { if (_disable_plalist) return; m_sfx.stop(_intro_spk); m_sfx.apply_playlist(_playlist_spks, 0, true); } m_sfx.stop(_end_spk); m_sfx.play_def(_intro_spk); m_ctl.create_sensor_manifold(null, "PLAYLIST", m_ctl.CT_SHOT, [m_ctl.create_timer_sensor(intro_duration)], null, playlist_cb); } function button_glow_cb(obj, id, pulse) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); for (var objname in _buttons_info) { var binfo = _buttons_info[objname]; var cur_glow_val = binfo.glow_curr_value; var min_glow_val = binfo.min_glow_value; var max_glow_val = binfo.max_glow_value; var incr_gl = elapsed / binfo.glow_grow_time; var cur_outline_val = binfo.outline_curr_value; var min_outline_val = binfo.min_outline_value; var max_outline_val = binfo.max_outline_value; var incr_outl = elapsed / binfo.outline_grow_time; if (_selected_obj && objname == _selected_obj.name) { if (cur_glow_val < max_glow_val) binfo.glow_curr_value += incr_gl; if (cur_outline_val !== undefined && cur_outline_val < max_outline_val) binfo.outline_curr_value += incr_outl; } if (!_selected_obj || objname != _selected_obj.name) { if (cur_glow_val > min_glow_val) binfo.glow_curr_value -= incr_gl; if (cur_outline_val !== undefined && cur_outline_val > min_outline_val) binfo.outline_curr_value -= incr_outl; } if (cur_glow_val !== undefined && binfo.glow_curr_value != cur_glow_val) for (var i = 0; i < binfo.glow_objs.length; i++) m_mat.set_nodemat_value(binfo.glow_objs[i], [binfo.material, binfo.value_node_name], binfo.glow_curr_value); if (cur_outline_val !== undefined && binfo.outline_curr_value != cur_outline_val) for (var i = 0; i < binfo.glow_objs.length; i++) m_scs.set_outline_intensity(binfo.glow_objs[i], binfo.outline_curr_value); } } function rotate_cam_cb(obj, id, pulse) { if (m_nla.is_play()) return; if (_cam_dist === null) return; var camobj = m_scs.get_active_camera(); var default_x = _canvas_elem.width / 2; var default_y = _canvas_elem.height / 2; m_cam.get_camera_angles(camobj, _vec2_tmp); var dx = (default_x - _mouse_x) / _canvas_elem.width * _cam_rot_fac; var dy = (default_y - _mouse_y) / _canvas_elem.height * _cam_rot_fac; var x = _default_cam_rot[0] - dx; var y = -_default_cam_rot[1] - dy; _vec3_tmp[0] = _cam_pivot[0] + _cam_dist * Math.sin(x); _vec3_tmp[1] = _cam_pivot[1] - _cam_dist * Math.cos(x); _vec3_tmp[2] = _cam_pivot[2] + _cam_dist * Math.sin(y); m_cam.static_set_look_at(camobj, _vec3_tmp, _cam_pivot); m_cam.correct_up(camobj); } function main_canvas_mouse_move(e) { if (e.preventDefault) e.preventDefault(); var x = e.offsetX; var y = e.offsetY; _mouse_x = x; _mouse_y = y; if (_ray_id !== null) { var camobj = m_scs.get_active_camera(); m_cam.calc_ray(camobj, x, y, _cam_pline); m_math.get_pline_directional_vec(_cam_pline, _cam_to); m_vec3.scale(_cam_to, 100, _cam_to); m_phy.change_ray_test_from_to(_ray_id, _cam_from, _cam_to); } } function main_canvas_touch(e) { if (e.preventDefault) e.preventDefault(); var touches = e.changedTouches; var touch = touches[0]; var x = touch.clientX; var y = touch.clientY; var canvas_xy = m_cont.client_to_canvas_coords(x, y, _vec2_tmp); process_screen_click(canvas_xy[0], canvas_xy[1]); } function main_canvas_click(e) { if (e.preventDefault) e.preventDefault(); var x = e.offsetX; var y = e.offsetY; process_screen_click(x, y); } function process_screen_click(x, y) { var obj = m_scs.pick_object(x, y); if (obj) { _selected_obj = obj; if (_buttons_info[obj.name]) { var level_name = _buttons_info[obj.name].level_name if (level_name) { cleanup_events(); setTimeout(function() {load_level(level_name)}, 1000 * m_conf.LEVEL_LOAD_DELAY); } else if (!m_main.detect_mobile()) { play_ending_speaker(); cleanup_events(); start_intro(); } } } } function cleanup_events() { _button_clicked = true; if (m_main.detect_mobile()) _canvas_elem.removeEventListener("touchstart", main_canvas_touch, false); else { _canvas_elem.removeEventListener("mousedown", main_canvas_click); _canvas_elem.removeEventListener("mousemove", main_canvas_mouse_move); } } function start_intro() { if (!_hq_loaded) load_HQ_elements(); m_ctl.remove_sensor_manifold(null, "ROT_CAMERA"); m_ctl.remove_sensor_manifold(null, "BUTTON_HOVER"); m_ctl.create_sensor_manifold(null, "TIMELINE_CHECK", m_ctl.CT_SHOT, [m_ctl.create_elapsed_sensor()], function(s) {return m_nla.get_frame() >= m_nla.get_frame_end()}, function(){load_level("level_01")}); } function load_HQ_elements() { m_sfx.duck(null, 0, 1); var LQ_obj = m_scs.get_object_by_name("environment_LQ"); var preloader_cont = document.getElementById("preloader_cont"); preloader_cont.style.visibility = "visible" m_data.load(ASSETS_PATH + "intro_HQ_environment.json", function() { m_scs.hide_object(LQ_obj); m_sfx.duck(null, 1, 1); _hq_loaded = true; }, preloader_cb, true, false); } function play_ending_speaker(speaker) { for (var i = 0; i < _playlist_spks.length; i++) { var spk = _playlist_spks[i]; if (m_sfx.is_playing(spk)) m_sfx.duck(spk, 0, 1); } m_sfx.duck(_intro_spk, 0, 1); setTimeout(function() { m_sfx.clear_playlist(); _disable_plalist = true; m_sfx.play_def(_end_spk) }, 1000); } function load_level(level_name) { if (level_name == "quest") window.open("quest.html","_self"); else { m_data.unload(m_data.DATA_ID_ALL); var json_path = ASSETS_PATH + level_name + ".json"; var preloader_cont = document.getElementById("preloader_cont"); preloader_cont.style.visibility = "visible" m_data.load(json_path, function(data_id) { game_main.level_load_cb(data_id, level_name, preloader_cb, intro_load_cb, load_level); }, preloader_cb, true); } } function preloader_cb(percentage) { var prelod_dynamic_path = document.getElementById("prelod_dynamic_path"); var percantage_num = prelod_dynamic_path.nextElementSibling; prelod_dynamic_path.style.width = percentage + "%"; percantage_num.innerHTML = percentage + "%"; if (percentage == 100) { remove_preloader(); return; } } function remove_preloader() { var preloader_cont = document.getElementById("preloader_cont"); setTimeout(function(){ preloader_cont.style.visibility = "hidden" }, 1000); } function menu_initialization() { var start_elem = document.getElementById("start_game"); var start_glow = document.getElementById("start_game_hover"); var quality_elem = document.getElementById("quality"); var menu_elem = document.getElementById("start_cont"); var lang_elem_ru = document.getElementById("lang_ru"); var lang_elem_en = document.getElementById("lang_en"); var qual_elem_low = document.getElementById("low_qual"); var qual_elem_high = document.getElementById("high_qual"); var body_elem = document.body; var brand = document.getElementsByClassName("brand")[0]; var soc = document.getElementsByClassName("soc")[0]; menu_elem.style.display = "block"; menu_elem.style.opacity = 1; document.location.hash = "quality=high"; function switch_lang(lang) { body_elem.setAttribute("lang", lang); start_elem.setAttribute("src", "interface/start_game_" + lang + ".png"); _lang = lang; } function init_app() { var is_mobile = m_main.detect_mobile(); var is_debug = m_version.type() == "DEBUG"; var quality_elem = document.getElementById("quality"); var qual_kind = quality_elem.getAttribute("quality"); if (qual_kind == "high" && !is_mobile) var quality = m_cfg.P_HIGH; else var quality = m_cfg.P_LOW; m_app.init({ canvas_container_id: "canvas3d", callback: init_cb, quality: quality, physics_enabled: true, console_verbose: true, alpha: false, physics_use_workers: !is_mobile, assets_dds_available: !is_debug, assets_pvr_available: !is_debug, assets_min50_available: !is_debug, show_fps: is_debug, autoresize: true }); } function switch_qual(qual) { quality_elem.setAttribute("quality", qual); document.location.hash = "quality=" + qual; } function show_start_btn_glow() { start_glow.style.display = "inline-block"; } function show_brand_glow() { brand.className = "brand hover"; } function show_soc_glow() { soc.className = "soc hover"; } function hide_start_btn_glow() { start_glow.style.display = ""; } function hide_brand_glow() { brand.className = "brand"; } function hide_soc_glow() { soc.className = "soc"; } lang_elem_ru.addEventListener("click", function() {switch_lang("ru")}, false); lang_elem_en.addEventListener("click", function() {switch_lang("en")}, false); qual_elem_low.addEventListener("click", function() {switch_qual("low")}, false); qual_elem_high.addEventListener("click", function() {switch_qual("high")}, false); if (m_main.detect_mobile()) { start_elem.addEventListener("touchstart", show_start_btn_glow); start_elem.addEventListener("touchend", hide_start_btn_glow); brand.addEventListener("touchstart", show_brand_glow); brand.addEventListener("touchend", hide_brand_glow); soc.addEventListener("touchstart", show_soc_glow); soc.addEventListener("touchend", hide_soc_glow); switch_qual("low"); } else { start_elem.addEventListener("mousedown", show_start_btn_glow); start_elem.addEventListener("mouseup", hide_start_btn_glow); start_elem.addEventListener("mouseleave", hide_start_btn_glow); brand.addEventListener("mousedown", show_brand_glow); brand.addEventListener("mouseup", hide_brand_glow); brand.addEventListener("mouseleave", hide_brand_glow); soc.addEventListener("mousedown", show_soc_glow); soc.addEventListener("mouseup", hide_soc_glow); soc.addEventListener("mouseleave", hide_soc_glow); } start_elem.addEventListener("click", function () { menu_elem.style.visibility = "hidden"; init_app(); } , false) } });