exports.update_emitter_transform = function(obj) { var batches = obj._batches; for (var i = 0; i < batches.length; i++) { var batch = batches[i]; var psys = batches[i].particle_system; if (!psys) continue; var pbuf = batch.bufs_data; var world_space = psys._internal.use_world_space; var pcache = psys._internal.positions_cache; var ncache = psys._internal.normals_cache; var positions = psys._internal.positions; var normals = psys._internal.normals; if (world_space) { var is_billboard = !batch.halo_particles; pose_emitter_world(psys, is_billboard, positions, normals, obj._render.tsr, pcache, ncache); } else pose_emitter_local(positions, normals, obj._render.tsr, pcache, ncache); m_geom.make_dynamic(pbuf); m_geom.update_bufs_data_array(pbuf, "a_position", 3, pcache); m_geom.update_bufs_data_array(pbuf, "a_normal", 3, ncache); } }
exports.set_factor = function(obj, psys_name, factor) { var batches = obj._batches; for (var i = 0; i < batches.length; i++) { var batch = batches[i]; var psys = batch.particle_system; if (!psys || psys["name"] != psys_name) continue; var delay_attrs = psys._internal.delay_attrs; if (factor == 1) var delay_attrs_masked = delay_attrs; else if (factor == 0) { var is_billboard = !batch.halo_particles; var inc = is_billboard? 4: 1; var delay_attrs_masked = psys._internal.delay_attrs_masked; for (var j = 0; j < delay_attrs_masked.length; j+=inc) { delay_attrs_masked[j] = 10000; if (is_billboard) { delay_attrs_masked[j+1] = delay_attrs_masked[j]; delay_attrs_masked[j+2] = delay_attrs_masked[j]; delay_attrs_masked[j+3] = delay_attrs_masked[j]; } } } else { var step = 1 / factor; var delay_attrs_masked = psys._internal.delay_attrs_masked; var is_billboard = !batch.halo_particles; var inc = is_billboard? 4: 1; var ind = 0; for (var j = 0; j < delay_attrs_masked.length; j+=inc) { if (j >= ind) { delay_attrs_masked[j] = delay_attrs[j]; ind += step; } else delay_attrs_masked[j] = 10000; if (is_billboard) { delay_attrs_masked[j+1] = delay_attrs_masked[j]; delay_attrs_masked[j+2] = delay_attrs_masked[j]; delay_attrs_masked[j+3] = delay_attrs_masked[j]; } } } var pbuf = batch.bufs_data; m_geom.update_bufs_data_array(pbuf, "a_p_delay", 1, delay_attrs_masked); } }