bool FProceduralFoliageBroadphase::GetOverlaps(FProceduralFoliageInstance* Instance, TArray<FProceduralFoliageOverlap>& Overlaps) const
{
	const float AShadeRadius     = Instance->GetShadeRadius();
	const float ACollisionRadius = Instance->GetCollisionRadius();

	TArray<FProceduralFoliageInstance*> PossibleOverlaps;
	const FBox2D AABB = GetMaxAABB(Instance);
	QuadTree.GetElements(AABB, PossibleOverlaps);
	Overlaps.Reserve(Overlaps.Num() + PossibleOverlaps.Num());
	
	for (FProceduralFoliageInstance* Overlap : PossibleOverlaps)
	{
		if (Overlap != Instance)
		{
			//We must determine if this is an overlap of shade or an overlap of collision. If both the collision overlap wins
			bool bCollisionOverlap = CircleOverlap(Instance->Location, ACollisionRadius, Overlap->Location, Overlap->GetCollisionRadius());
			bool bShadeOverlap     = CircleOverlap(Instance->Location, AShadeRadius, Overlap->Location, Overlap->GetShadeRadius());

			if (bCollisionOverlap || bShadeOverlap)
			{
				new (Overlaps)FProceduralFoliageOverlap(Instance, Overlap, bCollisionOverlap ? ESimulationOverlap::CollisionOverlap : ESimulationOverlap::ShadeOverlap);
			}
			
		}
	}

	return Overlaps.Num() > 0;
}
void BoundingBoxClass::CalculateAABB(String a_sIstance)
{
	vector3 v3Minimum = GetMinAABB();
	vector3 v3Maximum = GetMaxAABB();

	m_v3CentroidAABB = v3Minimum + v3Maximum;
	m_v3CentroidAABB /= 2.0f;

	return;
}
vector3 BoundingBoxClass::GetCentroidAABB(void)
{
	vector3 v3Minimum = GetMinAABB();
	vector3 v3Maximum = GetMaxAABB();

	vector3 v3Centroid = v3Minimum + v3Maximum;
	v3Centroid /= 2.0f;

	m_v3CentroidAABB = v3Centroid;
	return m_v3CentroidAABB;
}
void BoundingBoxClass::SetModelMatrixAABB(matrix4 a_m4Matrix)
{ 
	m_m4ModelToWorldAABB = a_m4Matrix;

	CalculateAABB(m_sInstance);

	matrix4 translate = glm::translate(m_v3CentroidAABB);

	vector3 v3Min = GetMinAABB();
	vector3 v3Max = GetMaxAABB();
	matrix4 scale = glm::scale(v3Max - v3Min);

	matrix4 m4MatrixAABB = translate * scale;

	m_pMeshAABB->SetModelMatrix(m4MatrixAABB);
}
void FProceduralFoliageBroadphase::Remove(FProceduralFoliageInstance* Instance)
{
	const FBox2D AABB = GetMaxAABB(Instance);
	const bool bRemoved = QuadTree.Remove(Instance, AABB);
	check(bRemoved);
}
void FProceduralFoliageBroadphase::Insert(FProceduralFoliageInstance* Instance)
{
	const FBox2D MaxAABB = GetMaxAABB(Instance);
	QuadTree.Insert(Instance, MaxAABB);
}