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