#include "munga.h"
#pragma hdrstop

#include "rndorgn.h"
#include "renderer.h"
#include "app.h"
#include "entity.h"

//
//#############################################################################
// RendererOrigin
//#############################################################################
//
RendererOrigin::RendererOrigin(
   Renderer *the_renderer,
   Entity *entity,
   InterestType interest_type,
   InterestDepth depth_calibration
):
	InterestOrigin(
   	entity->GetInterestZoneID(),
      interest_type,
      depth_calibration
   ),
   interestingEntitySocket(NULL)
{
	Check(the_renderer);
   renderer = the_renderer;
}

//
//#############################################################################
// ~RendererOrigin
//#############################################################################
//
RendererOrigin::~RendererOrigin()
{
}

//
//#############################################################################
// TestInstance
//#############################################################################
//
Logical
	RendererOrigin::TestInstance() const
{
	InterestOrigin::TestInstance();
	Check_Signature(renderer);
	Check(&interestingEntitySocket);
	return True;
}

//
//#############################################################################
//#############################################################################
//
void
	RendererOrigin::AddInterestingEntity(Entity *interesting_entity)
{
	Check(this);
	Check(interesting_entity);

	//
	// Add to the socket
	//
	#if DEBUG_LEVEL>0
	{
		SChainIteratorOf<Entity*> iterator(&interestingEntitySocket);
		Check(&iterator);
		Verify(iterator.IsPlugMember(interesting_entity) == False);
	}
	#endif
	interestingEntitySocket.Add(interesting_entity);

	//
	// Notify the renderer
	//
	#if 0
		Renderer::NotifyOfNewInterestingEntityMessage
			message(interesting_entity);

		Check(&message);
		Check(application);
		Check(renderer);
		application->PostInterestEvent(renderer, &message);
	#else
		Renderer::NotifyOfNewInterestingEntityMessage
			message(interesting_entity);

		Check(&message);
		Check(application);
		Check(application->GetInterestManager());
		application->GetInterestManager()->PostRendererEvent(
			interesting_entity,
			renderer,
			&message
		);
	#endif
}

//
//#############################################################################
//#############################################################################
//
void
	RendererOrigin::RemoveUninterestingEntity(Entity *uninteresting_entity)
{
	Check(this);
   Check(uninteresting_entity);

	//
	// Notify the renderer
	//
   #if 1
      Check(renderer);
      renderer->NotifyOfBecomingUninterestingEntity(uninteresting_entity);
   #else
      Renderer::NotifyOfBecomingUninterestingEntityMessage
      	message(uninteresting_entity);

      Check(&message);
      Check(application);
      Check(renderer);
      application->PostInterestEvent(renderer, &message);
   #endif

   //
   // Remove from socket
   //
   #if DEBUG_LEVEL>0
   {
		SChainIteratorOf<Entity*> iterator(&interestingEntitySocket);
      Verify(iterator.IsPlugMember(uninteresting_entity) == True);
   }
   #endif
   PlugIterator remover(uninteresting_entity);
   remover.RemoveSocket(&interestingEntitySocket);
}

//
//#############################################################################
//#############################################################################
//
void
	RendererOrigin::RemoveUninterestingEntities()
{
	Check(this);

	//
	// Notify the renderer of uninteresting entities
	//
	SChainIteratorOf<Entity*> iterator(&interestingEntitySocket);
	Entity *uninteresting_entity;

   Check(&iterator);
	#if 0
      while ((uninteresting_entity = iterator.GetCurrent()) != NULL)
      {
         Check(uninteresting_entity);
         Check(renderer);
         renderer->NotifyOfBecomingUninterestingEntity(uninteresting_entity);
         iterator.Remove();
      }
	#else
      while ((uninteresting_entity = iterator.GetCurrent()) != NULL)
      {
         Check(uninteresting_entity);
			RemoveUninterestingEntity(uninteresting_entity);
      }
   #endif
}

//~~~~~~~~~~~~~~~~~ RendererOrigin__InterestingEntityIterator ~~~~~~~~~~~~~~~~~

RendererOrigin__InterestingEntityIterator::
	RendererOrigin__InterestingEntityIterator(
      RendererOrigin *renderer_origin
   ):
      SChainIteratorOf<Entity*>(&renderer_origin->interestingEntitySocket)
{
}

RendererOrigin__InterestingEntityIterator::
	~RendererOrigin__InterestingEntityIterator()
{
}
