void UpdateTask(System.Object c)
    {
        int task_index = (int)c;
        int begin      = task_index * m_entities_par_task;
        int end        = Mathf.Min((task_index + 1) * m_entities_par_task, m_max_entities);

        float dt = m_work_data.delta_time;

        int num_active_entities = 0;

        for (int bi = begin; bi < end; ++bi)
        {
            if (m_entities[bi].lifetime <= 0.0f)
            {
                continue;
            }

            ++num_active_entities;
            m_entities[bi].position += m_entities[bi].velosity * dt;
            m_entities[bi].lifetime -= dt;

            Vector3 pos      = m_entities[bi].position;
            int     owner_id = m_entities[bi].owner_id;
            for (int ei = 0; ei < m_work_data.num_targets; ++ei)
            {
                if (m_work_data.targets[ei].id == owner_id)
                {
                    continue;
                }

                Vector3 diff = m_work_data.targets[ei].position - pos;
                if (diff.magnitude <= m_work_data.targets[ei].radius)
                {
                    Interlocked.Increment(ref m_work_data.targets[ei].num_hits);
                    m_entities[bi].lifetime = 0.0f;
                }
            }

            m_renderer.AddInstanceTR(m_entities[bi].position, m_entities[bi].rotation);
        }
        m_task_work_data[task_index].num_active_entities = num_active_entities;

        Interlocked.Decrement(ref m_num_active_tasks);
    }
 void DataTransfer_SingleCopy(Range r)
 {
     if (m_renderer.m_enable_scale)
     {
         for (int i = r.begin; i < r.end; ++i)
         {
             m_renderer.AddInstanceTRS(m_instance_t[i], m_instance_r[i], m_instance_s[i]);
         }
     }
     else if (m_renderer.m_enable_rotation)
     {
         for (int i = r.begin; i < r.end; ++i)
         {
             m_renderer.AddInstanceTR(m_instance_t[i], m_instance_r[i]);
         }
     }
     else
     {
         for (int i = r.begin; i < r.end; ++i)
         {
             m_renderer.AddInstanceT(m_instance_t[i]);
         }
     }
 }