function init_asteroid_transform(asteroid) { var ast_obj = asteroid.ast_obj; var spawn_coord = _vec3_tmp; spawn_coord[0] = 0; spawn_coord[1] = 0; spawn_coord[2] = -1000; var ident_quat = m_quat.identity(_quat_tmp); m_trans.set_translation_v(ast_obj, spawn_coord); var ast_copy_obj = asteroid.ast_copy_obj; if (ast_copy_obj) m_trans.set_translation_v(ast_copy_obj, spawn_coord); m_vec3.set(0, 0, 0, asteroid.velosity); m_quat.identity(asteroid.angular_velosity); asteroid.active = false; asteroid.strength = ASTEROID_STRENGTH; }
exports["set_eye_params"] = function(camobj, h_angle, v_angle) { var render = camobj._render; m_quat.identity(render.quat); camera.rotate_v_local(camobj, Math.PI/2); camera.rotate_h(camobj, h_angle); camera.rotate_v_local(camobj, -v_angle); transform.update_transform(camobj); }
function damage_asteroid(asteroid, damage) { var name = m_scs.get_object_name_hierarchy(asteroid)[0]; var dupli_name = m_scs.get_object_name_hierarchy(asteroid)[1]; var asteroid = get_asteroid_by_name(name); if (asteroid && !asteroid.is_destroyed) { asteroid.strength -= damage; if (asteroid.strength < 0) { m_vec3.set(0, 0, 0, asteroid.velosity); m_quat.identity(asteroid.angular_velosity); var ast_arm = asteroid.ast_arm; if (ast_arm) { m_anim.apply(ast_arm, dupli_name + "_disruption"); m_anim.play(ast_arm, compile_asteroid); } var ast_copy_mesh_obj = asteroid.ast_copy_mesh_obj; if (ast_copy_mesh_obj) { m_anim.apply(ast_copy_mesh_obj, "asteroid_fading"); m_anim.play(ast_copy_mesh_obj); } var lighting = _cockpit.lighting; if (lighting) { m_anim.apply(lighting, "asteroid_burst"); m_anim.play(lighting); } var emitter = asteroid.ast_emitter_obj; if (emitter) { var trans = m_trans.get_translation(asteroid.ast_obj, _vec3_tmp); m_trans.set_translation_v(emitter, trans); m_anim.apply(emitter, "explosion") m_anim.play(emitter); } var speaker = asteroid.ast_speaker; if (speaker) { var trans = m_trans.get_translation(asteroid.ast_obj, _vec3_tmp); m_trans.set_translation_v(speaker, trans); m_sfx.play_def(speaker); } asteroid.is_destroyed = true; } } }
/** * Rotate camera to fix UP direction. * Uses _vec3_tmp, _vec3_tmp_2, _vec3_tmp_3 */ function correct_up(camobj, y_axis) { var render = camobj._render; var quat = render.quat; var y_world = y_axis; // local camera Y in world space var y_cam_world = m_util.quat_to_dir(render.quat, m_util.AXIS_Y, _vec3_tmp) m_vec3.normalize(y_cam_world, y_cam_world); // handle extreme case (camera looks UP or DOWN) if (Math.abs(m_vec3.dot(y_world, y_cam_world)) > 0.999999) var rotation = m_quat.identity(_quat4_tmp); else { var x_cam_world_new = m_vec3.cross(y_world, y_cam_world, _vec3_tmp_2); m_vec3.normalize(x_cam_world_new, x_cam_world_new); if (render.move_style == m_cam.MS_TARGET_CONTROLS) { if (render.target_cam_upside_down) m_vec3.negate(x_cam_world_new, x_cam_world_new); } else { // Y coord of local camera Z axis in parent(!) space var z_cam_world = m_util.quat_to_dir(render.quat, m_util.AXIS_Z, _vec3_tmp_3); if (m_vec3.dot(z_cam_world, y_axis) > 0) m_vec3.negate(x_cam_world_new, x_cam_world_new); } var x_cam_world = m_util.quat_to_dir(render.quat, m_util.AXIS_X, _vec3_tmp_3); m_vec3.normalize(x_cam_world, x_cam_world); var cosine = m_util.clamp(m_vec3.dot(x_cam_world, x_cam_world_new), -1, 1); var angle = Math.acos(cosine); if (cosine <= -0.999999) var rotation = m_quat.setAxisAngle(y_cam_world, angle, _quat4_tmp); else var rotation = m_quat.rotationTo(x_cam_world, x_cam_world_new, _quat4_tmp); m_quat.normalize(rotation, rotation); } m_quat.multiply(rotation, quat, quat); m_cam.update_camera_upside_down(camobj); }
function create_render(type) { var render = { // common properties type: type, data_id: 0, scale: 0, grid_id: [0, 0], trans: new Float32Array(3), quat: new Float32Array(4), tsr: new Float32Array(8), world_matrix: new Float32Array(16), inv_world_matrix: new Float32Array(16), pivot: new Float32Array(3), move_style: 0, trans_speed: 0, dof_distance: 0, dof_front: 0, dof_rear: 0, dof_power: 0, dof_object: null, underwater: false, distance_min: 0, distance_max: 0, use_distance_limits: false, horizontal_limits: null, vertical_limits: null, cameras: null, glow_anim_settings: null, // game/physics/lod properties friction: 0, elasticity: 0, force_strength: 0, lod_dist_max: 0, lod_dist_min: 0, lod_transition_ratio: 0, physics_type: "", use_collision_compound: false, // rendering flags shadow_cast: false, shadow_receive: false, shadow_cast_only: false, reflexible: false, reflexible_only: false, reflective: false, caustics: false, wind_bending: false, disable_fogging: false, dynamic_geometry: false, dynamic_grass: false, do_not_cull: false, hide: false, last_lod: false, selectable: false, origin_selectable: false, is_hair_particles: false, is_visible: false, // wind bending properties wind_bending_angle: 0, wind_bending_amp: 0, wind_bending_freq: 0, detail_bending_freq: 0, detail_bending_amp: 0, branch_bending_amp: 0, main_bend_col: "", detail_bend_col: null, bend_center_only: false, // billboarding properties hair_billboard_type: "", hair_billboard: false, hair_billboard_spherical: false, // animation properties frame_factor: 0, time: 0, va_frame: 0, va_frame_factor: 0, max_bones: 0, frames_blending: false, vertex_anim: false, is_skinning: false, quats_before: null, quats_after: null, trans_before: null, trans_after: null, bone_pointers: null, // bounding volumes properties bb_local: null, bcyl_local: null, bcap_local: null, bcon_local: null, bb_world: null, bs_local: null, bs_world: null, be_local: null, be_world: null } // setting default values render.scale = 1; render.lod_dist_max = 10000; m_quat.identity(render.quat); m_tsr.identity(render.tsr); m_mat4.identity(render.world_matrix); m_mat4.identity(render.inv_world_matrix); return render; }