void obj_quicksort_colliders(SCP_vector<int> *list, int left, int right, int axis)
{
	Assert( axis >= 0 );
	Assert( axis <= 2 );

	if ( right > left ) {
		int pivot_index = left + (right - left) / 2;

		float pivot_value = obj_get_collider_endpoint((*list)[pivot_index], axis, true);

		// swap!
		int temp = (*list)[pivot_index];
		(*list)[pivot_index] = (*list)[right];
		(*list)[right] = temp;

		int store_index = left;

		int i;
		for ( i = left; i < right; ++i ) {
			if ( obj_get_collider_endpoint((*list)[i], axis, true) <= pivot_value ) {
				temp = (*list)[i];
				(*list)[i] = (*list)[store_index];
				(*list)[store_index] = temp;
				store_index++;
			}
		}

		temp = (*list)[right];
		(*list)[right] = (*list)[store_index];
		(*list)[store_index] = temp;

		obj_quicksort_colliders(list, left, store_index - 1, axis);
		obj_quicksort_colliders(list, store_index + 1, right, axis);
	}
}
void obj_sort_and_collide()
{
	if (Cmdline_dis_collisions)
		return;

	if ( !(Game_detail_flags & DETAIL_FLAG_COLLISION) )
		return;

	SCP_vector<int> sort_list_y;
	SCP_vector<int> sort_list_z;

	sort_list_y.clear();
	{
		TRACE_SCOPE(tracing::SortColliders);
		obj_quicksort_colliders(&Collision_sort_list, 0, (int)(Collision_sort_list.size() - 1), 0);
	}
	obj_find_overlap_colliders(&sort_list_y, &Collision_sort_list, 0, false);

	sort_list_z.clear();
	{
		TRACE_SCOPE(tracing::SortColliders);
		obj_quicksort_colliders(&sort_list_y, 0, (int)(sort_list_y.size() - 1), 1);
	}
	obj_find_overlap_colliders(&sort_list_z, &sort_list_y, 1, false);

	sort_list_y.clear();
	{
		TRACE_SCOPE(tracing::SortColliders);
		obj_quicksort_colliders(&sort_list_z, 0, (int)(sort_list_z.size() - 1), 2);
	}
	obj_find_overlap_colliders(&sort_list_y, &sort_list_z, 2, true);
}