コード例 #1
0
/**
 * Set object render world_matrix.
 * NOTE: do not try to update batched objects (buggy _dg_parent influence)
 * @methodOf transform
 * @param {Object} obj Object ID
 */
function update_transform(obj) {
    var render = obj._render;

    // NOTE: need to update before constraints, because they rely on to this flag
    if (obj["type"] == "CAMERA")
        m_cam.update_camera_upside_down(obj);

    m_cons.update_constraint(obj, _elapsed);

    if (obj["type"] == "CAMERA")
        m_cam.update_camera(obj);

    // should not change after constraint update
    var trans = render.trans;
    var scale = render.scale;
    var quat = render.quat;

    m_tsr.set_sep(trans, scale, quat, render.tsr);

    var wm = render.world_matrix;

    m_mat4.identity(wm);
    m_mat4.fromQuat(quat, wm);

    // TODO: remove world matrix and move to tsr system
    if (obj["type"] != "CAMERA")
        m_util.scale_mat4(wm, scale, wm);

    wm[12] = trans[0];
    wm[13] = trans[1];
    wm[14] = trans[2];

    m_mat4.invert(wm, render.inv_world_matrix);

    if (obj._anim_slots.length && m_particles.has_anim_particles(obj))
        m_particles.update_emitter_transform(obj);

    // NOTE: available only after batch creation (really needed now?)
    if (render.bb_local && render.bb_world) {
        m_bounds.bounding_box_transform(render.bb_local, wm, render.bb_world);
        m_bounds.bounding_sphere_transform(render.bs_local, wm, render.bs_world);
        m_bounds.bounding_ellipsoid_transform(render.be_local, render.tsr,
                                             render.be_world)
        if (render.shadow_cast)
            m_scs.schedule_shadow_update(m_scs.get_active());
    }

    switch (obj["type"]) {
    case "SPEAKER":
        m_sfx.speaker_update_transform(obj, _elapsed);
        break;
    case "CAMERA":
        m_cam.update_camera_transform(obj);
        // listener only for active scene camera
        if (m_scs.check_active() && m_scs.get_camera(m_scs.get_active()) == obj)
            m_sfx.listener_update_transform(m_scs.get_active(), trans, quat, _elapsed);
        break;
    case "LAMP":
        m_lights.update_light_transform(obj);
        if (m_scs.check_active())
            m_scs.update_lamp_scene(obj, m_scs.get_active());
        break;
    case "EMPTY":
        if (obj["field"])
            m_scs.update_force(obj);
        break;
    }

    if (obj["type"] == "LAMP" || obj["type"] == "CAMERA") {
        if (m_scs.check_active()) {
            var active_scene = m_scs.get_active();
            m_scs.schedule_shadow_update(active_scene);
            m_scs.schedule_grass_map_update(active_scene);
        }
    }

    if (obj["type"] == "MESH") {
        var modifiers = obj["modifiers"];
        var armobj = null;
        for (var i = 0; i < modifiers.length; i++) {
            var modifier = modifiers[i];
            if (modifier["type"] == "ARMATURE")
                armobj = modifier["object"];
        }

        if (armobj) {
            var armobj_tsr = armobj._render.tsr;
            m_tsr.invert(armobj_tsr, _tsr_tmp);
            m_tsr.multiply(_tsr_tmp, render.tsr, _tsr_tmp);
            m_vec4.set(_tsr_tmp[0], _tsr_tmp[1], _tsr_tmp[2], _tsr_tmp[3],
                     render.arm_rel_trans);
            m_quat.set(_tsr_tmp[4], _tsr_tmp[5], _tsr_tmp[6], _tsr_tmp[7],
                     render.arm_rel_quat);
        }
    }

    var descends = obj._descends;

    for (var i = 0; i < descends.length; i++)
        update_transform(descends[i]);

    render.force_zsort = true;
}
コード例 #2
0
ファイル: transform.js プロジェクト: EmmetCooper/Blend4Web
/**
 * Set object render world_matrix.
 * NOTE: do not try to update batched objects (buggy _dg_parent influence)
 * @methodOf transform
 * @param {Object} obj Object ID
 */
function update_transform(obj) {

    var render = obj._render;

    m_cons.update_constraint(obj, _elapsed);
    m_cam.update_camera(obj);

    if (obj["type"] == "CAMERA")
        m_cam.clamp_limits(obj);

    // should not change after constraint update
    var trans = render.trans;
    var scale = render.scale;
    var quat = render.quat;

    m_tsr.set_sep(trans, scale, quat, render.tsr);

    var wm = render.world_matrix;

    m_mat4.identity(wm);
    m_mat4.fromQuat(quat, wm);

    // TODO: remove world matrix and move to tsr system
    if (obj["type"] != "CAMERA")
        m_util.scale_mat4(wm, scale, wm);

    wm[12] = trans[0];
    wm[13] = trans[1];
    wm[14] = trans[2];

    m_mat4.invert(wm, render.inv_world_matrix);

    if (obj._anim_slots && m_particles.has_anim_particles(obj))
        m_particles.update_emitter_transform(obj);

    // NOTE: available only after batch creation (really needed now?)
    if (render.bb_local && render.bb_world) {
        m_bounds.bounding_box_transform(render.bb_local, wm, render.bb_world);
        m_bounds.bounding_sphere_transform(render.bs_local, wm, render.bs_world);
        m_bounds.bounding_ellipsoid_transform(render.be_local, render.tsr,
                                             render.be_world)
        if (render.shadow_cast)
            m_scs.schedule_shadow_update(m_scs.get_active());
    }

    switch (obj["type"]) {
    case "SPEAKER":
        m_sfx.speaker_update_transform(obj, _elapsed);
        break;
    case "CAMERA":
        m_cam.update_camera_transform(obj);
        if (m_scs.check_active())
            m_sfx.listener_update_transform(m_scs.get_active(), trans, quat, _elapsed);
        break;
    case "LAMP":
        m_lights.update_light_transform(obj);
        if (m_scs.check_active())
            m_scs.update_lamp_scene(obj, m_scs.get_active());
        break;
    case "EMPTY":
        if (obj["field"])
            m_scs.update_force(obj);
        break;
    }

    if (obj["type"] == "LAMP" || obj["type"] == "CAMERA") {
        if (m_scs.check_active()) {
            var active_scene = m_scs.get_active();
            m_scs.schedule_shadow_update(active_scene);
            m_scs.schedule_grass_map_update(active_scene);
        }
    }

    var descends = obj._descends;

    for (var i = 0; i < descends.length; i++)
        update_transform(descends[i]);
}
コード例 #3
0
ファイル: transform.js プロジェクト: NoxKeini/myb4w
/**
 * Set object render world_tsr.
 * NOTE: do not try to update batched objects (buggy _dg_parent influence)
 * @methodOf transform
 * @param {Object3D} obj Object 3D
 */
function update_transform(obj) {
    var render = obj.render;
    var scenes_data = obj.scenes_data;

    var obj_type = obj.type;

    // NOTE: need to update before constraints, because they rely on to this flag
    if (obj_type == "CAMERA")
        m_cam.update_camera_upside_down(obj);

    m_cons.update_constraint(obj, _elapsed);

    if (obj_type == "CAMERA")
        m_cam.update_camera(obj);

    // should not change after constraint update
    var trans = m_tsr.get_trans_value(render.world_tsr, _vec3_tmp);
    var quat = m_tsr.get_quat_value(render.world_tsr, _quat4_tmp);

    // NOTE: available only after batch creation (really needed now?)
    if (render.bb_local && render.bb_world) {
        m_bounds.bounding_box_transform(render.bb_local, render.world_tsr, render.bb_world);
        m_bounds.bounding_sphere_transform(render.bs_local, render.world_tsr, render.bs_world);
        m_bounds.bounding_ellipsoid_transform(render.be_local, render.world_tsr,
                                             render.be_world)
    }

    switch (obj_type) {
    case "SPEAKER":
        m_sfx.speaker_update_transform(obj, _elapsed);
        break;
    case "MESH":
        var armobj = obj.armobj;
        if (armobj) {
            var armobj_tsr = armobj.render.world_tsr;
            m_tsr.invert(armobj_tsr, _tsr_tmp);
            m_tsr.multiply(_tsr_tmp, render.world_tsr, _tsr_tmp);
            m_vec4.set(_tsr_tmp[0], _tsr_tmp[1], _tsr_tmp[2], _tsr_tmp[3],
                     render.arm_rel_trans);
            m_quat.set(_tsr_tmp[4], _tsr_tmp[5], _tsr_tmp[6], _tsr_tmp[7],
                     render.arm_rel_quat);
        }
        break;
    case "CAMERA":
        m_cam.update_camera_transform(obj);
        // listener only for active scene camera
        if (m_scs.check_active()) {
            var active_scene = m_scs.get_active();
            if (m_scs.get_camera(active_scene) == obj)
                m_sfx.listener_update_transform(active_scene, trans, quat,
                                                _elapsed);
        }
        break;
    case "LAMP":
        m_lights.update_light_transform(obj);
        break;
    }

    for (var i = 0; i < scenes_data.length; i++) {
        var sc_data = scenes_data[i];
        if (sc_data.is_active) {
            var scene = sc_data.scene;
            var sc_render = scene._render;
            var batches = sc_data.batches;

            switch (obj_type) {
            case "LAMP":
                m_scs.update_lamp_scene(obj, scene);
                break;
            case "CAMERA":
                m_scs.schedule_grass_map_update(scene);
                if (sc_render.shadow_params) {
                    // camera movement only influence csm shadows
                    if (sc_render.shadow_params.enable_csm)
                        m_scs.schedule_shadow_update(scene);
                    m_scs.update_shadow_billboard_view(obj, sc_render.graph);
                }
                   
                break;
            case "MESH":
                if (render.bb_local && render.bb_world) {
                    if (render.shadow_cast)
                        m_scs.schedule_shadow_update(scene);

                    var cube_refl_subs = sc_data.cube_refl_subs;
                    if (render.cube_reflection_id != null && cube_refl_subs) {
                        m_scs.update_cube_reflect_subs(cube_refl_subs, trans);
                    }
                }
                break;
            case "EMPTY":
                m_obj.update_force(obj);
                break;
            }

            var plane_refl_subs = sc_data.plane_refl_subs;
            var refl_objs = obj.reflective_objs;
            if (refl_objs.length) {
                for (var j = 0; j < plane_refl_subs.length; j++) {
                    var cam = plane_refl_subs[j].camera;
                    m_scs.update_plane_reflect_subs(plane_refl_subs[j], trans, quat);
                    m_obj_util.update_refl_objects(refl_objs, cam.reflection_plane);
                    m_cam.set_view(cam, m_scs.get_camera(scene));
                    m_util.extract_frustum_planes(cam.view_proj_matrix, cam.frustum_planes);
                }
            }
        }
    }

    var cons_descends = obj.cons_descends;
    for (var i = 0; i < cons_descends.length; i++)
        update_transform(cons_descends[i]);

    var cons_armat_bone_descends = obj.cons_armat_bone_descends;
    for (var i = 0; i < cons_armat_bone_descends.length; i++) {
        var cons_armat_desc = cons_armat_bone_descends[i];
        var armobj = cons_armat_desc[0];
        var bone_name = cons_armat_desc[1];
        m_cons.update_bone_constraint(armobj, bone_name);
    }

    render.force_zsort = true;
}