Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}

});
Esempio n. 3
0
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);
}

});
Esempio n. 4
0
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)
}

});