BehaviorTree::BEHAVIOR_STATUS MoveTowardNode::execute(void* p_agent)
{
  if (m_target == nullptr || m_target->getId() == 0)
  {
    return BehaviorTree::BT_FAILURE;
  }

  auto entity = static_cast<ECS::Entity*>(p_agent);
  auto parentCRender = entity->get<RenderComponent>();
  auto parentSprite = dynamic_cast<sf::Sprite*>(parentCRender->drawable);

  auto targetCRender = m_target->get<RenderComponent>();
  auto targetSprite = dynamic_cast<sf::Sprite*>(targetCRender->drawable);

  auto dx = targetSprite->getPosition().x - parentSprite->getPosition().x;
  auto dy = targetSprite->getPosition().y - parentSprite->getPosition().y;

  auto parentCPhysics = entity->get<PhysicsComponent>();
  auto parentBody = parentCPhysics->body;

  auto moved = false;

  if (abs(dx) > m_leashDistance)
  {
    auto sign = dx < 0 ? -1 : 1;
    parentBody->ApplyLinearImpulse(b2Vec2(m_speed * sign, 0), parentBody->GetWorldCenter(), true);

    moved = true;
  }

  if (abs(dy) > m_leashDistance)
  {
    auto sign = dy < 0 ? -1 : 1;
    parentBody->ApplyLinearImpulse(b2Vec2(0, m_speed * sign), parentBody->GetWorldCenter(), true);

    moved = true;
  }

  return moved ? BehaviorTree::BT_RUNNING : BehaviorTree::BT_SUCCESS;
}
	void cBoundingVolume::DrawEdges(const cVector3f& avLightPos,float afLightRange, iLowLevelGraphics *apLowLevelGraphics)
	{
		cShadowVolumeBV *pVolume = GetShadowVolume(avLightPos, afLightRange, false);
		
		apLowLevelGraphics->SetBlendActive(true);
		apLowLevelGraphics->SetBlendFunc(eBlendFunc_One,eBlendFunc_One);
		apLowLevelGraphics->SetDepthWriteActive(false);
		tVertexVec vVtx;
		vVtx.resize(4);
		
		for(int capplane=0; capplane<mShadowVolume.mlCapPlanes; capplane++)
		{
			mShadowVolume.mvPlanes[capplane].CalcNormal();
			apLowLevelGraphics->DrawLine(GetWorldCenter(),GetWorldCenter() + 
									mShadowVolume.mvPlanes[capplane].normal*-0.5f, cColor(1,1,1,1));
		}

		int lPlane = mShadowVolume.mlCapPlanes;
		for(int quad = 0; quad < (int)pVolume->mvPoints.size(); quad+=4)
		{
			
			for(int i=0; i<4; i++)
				vVtx[i].pos = pVolume->mvPoints[quad+i];
			
			apLowLevelGraphics->DrawQuad(vVtx,cColor(0.2f,0,0.2f));

			cVector3f vCenter = (vVtx[1].pos + vVtx[0].pos)*0.5f;
			mShadowVolume.mvPlanes[lPlane].CalcNormal();
			apLowLevelGraphics->DrawLine(vCenter,vCenter + 
				mShadowVolume.mvPlanes[lPlane].normal*-0.5f, cColor(1,1,1,1));
			lPlane++;
		}

		apLowLevelGraphics->SetBlendActive(false);
		apLowLevelGraphics->SetDepthWriteActive(true);
	}