Example #1
0
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);
    }
}
Example #2
0
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);
    }
}