/** * 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; }
/** * 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]); }
/** * 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; }