ResourceFontFileStream::ResourceFontFileStream(const char* resourceID) :
    refCount_(0),
    resourcePtr_(NULL),
    resourceSize_(0)
{
	std::ifstream inStream;
	inStream.open((std::string("Data\\Fonts\\") + resourceID).c_str(), std::ios::in | std::ios::binary | std::ios::ate);

	if (inStream.good())
	{
		size_t fileSize = 0;

		inStream.seekg(0, std::ios::end);
		fileSize = size_t(inStream.tellg());
		inStream.seekg(0, std::ios::beg);

		resourceData_ = std::shared_ptr<char>(new char[fileSize]);
		inStream.read(resourceData_.get(), fileSize);
		resourceSize_ = static_cast<DWORD>(fileSize);
		resourcePtr_ = static_cast<void const*>(resourceData_.get());

		inStream.close();
	}
	else
	{
		DL_PRINT("Failed to open font file.");
	}
}
void
ConnectionInterface::RouteMessage (
        PipelineMessage::Ptr 			msg,
        PipelineMessage::MessageSendStyle 	sendStyle,
        FlowDirection				direction
)
{
        DL_PRINT ( 8, "ROUTING MESSAGE : Conn=" << this << "; msgID=" << msg->msgID );

        if ( _messageHook ) {
                _messageHook->ReceiveMessage ( msg, sendStyle, direction );
        }

        if ( direction & FD_IN_FLOW ) {
                ConsumersMap::iterator it;
                for ( it = _consumers.begin(); it != _consumers.end(); ++it ) {
                        it->second->ReceiveMessage ( msg, sendStyle, FD_IN_FLOW );
                }
        }
        if ( direction & FD_AGAINST_FLOW ) {
                if ( _producer ) {
                        _producer->ReceiveMessage ( msg, sendStyle, FD_AGAINST_FLOW );
                }

        }

}
void
FillVTKImageFromM4DImage( vtkImageData *vtkImage, const Imaging::AImage &m4dImage )
{
	DL_PRINT( 8, "FillVTKImageFromM4DImage(), element ID " << m4dImage.GetElementTypeID() );
	NUMERIC_TYPE_TEMPLATE_SWITCH_DEFAULT_MACRO(
		       	m4dImage.GetElementTypeID(), 
			throw EImpossibleVTKConversion(), 
			TryFillVTKImageFromM4DImage< TTYPE >( vtkImage, m4dImage )
			);
	/*switch ( m4dImage.GetElementTypeID() ) {
	case NTID_VOID:
		throw EImpossibleVTKConversion();
		break;
	case NTID_SIGNED_CHAR:
		TryFillVTKImageFromM4DImage< signed char >( vtkImage, m4dImage );
		break;
	case NTID_UNSIGNED_CHAR:
		TryFillVTKImageFromM4DImage< unsigned char >( vtkImage, m4dImage );
		break;
	case NTID_SHORT:
		TryFillVTKImageFromM4DImage< short >( vtkImage, m4dImage );
		break;
	case NTID_UNSIGNED_SHORT:
		TryFillVTKImageFromM4DImage< unsigned short >( vtkImage, m4dImage );
		break;
	case NTID_INT:
		TryFillVTKImageFromM4DImage< int >( vtkImage, m4dImage );
		break;
	case NTID_UNSIGNED_INT:
		TryFillVTKImageFromM4DImage< unsigned int >( vtkImage, m4dImage );
		break;
	case NTID_LONG:
		TryFillVTKImageFromM4DImage< long >( vtkImage, m4dImage );
		break;
	case NTID_UNSIGNED_LONG:
		TryFillVTKImageFromM4DImage< unsigned long >( vtkImage, m4dImage );
		break;
	case NTID_LONG_LONG:
		TryFillVTKImageFromM4DImage< long long >( vtkImage, m4dImage );
		break;
	case NTID_UNSIGNED_LONG_LONG:
		TryFillVTKImageFromM4DImage< unsigned long long >( vtkImage, m4dImage );
		break;
	case NTID_FLOAT:
		TryFillVTKImageFromM4DImage< float >( vtkImage, m4dImage );
		break;
	case NTID_DOUBLE:
		TryFillVTKImageFromM4DImage< double >( vtkImage, m4dImage );
		break;
	default:
		throw EImpossibleVTKConversion();
		break;
	}*/

	return;
}
void CGameWorld::Init()
{
	Vector3f Vec1({ 1, 0, 0 });
	Vector3f Vec2({ -1, 0, 0 });
	//std::cout << "Angle in rad: " << Vec1.Angle(Vec2) << std::endl;
	//std::cout << "Angle in degrees: " << (Vec1.Angle(Vec2) * (180.0f / 3.14159265359f)) << std::endl;

	std::string name = "";
	unsigned char timer = myTimerManager.CreateTimer();
	myTimerManager.UpdateTimers();

	myJson.Load("root.json", myRooms, this, name);

	myTimerManager.UpdateTimers();
	double delta = myTimerManager.GetTimer(timer).GetTimeElapsed().GetMiliseconds();
	std::cout << "Loading root.json and levels took " << delta << " milliseconds" << std::endl;

	myTimerManager.UpdateTimers();
	myJson.LoadMusic("JSON/Music.json");
	myTimerManager.UpdateTimers();
	delta = myTimerManager.GetTimer(timer).GetTimeElapsed().GetMiliseconds();
	std::cout << "Loading music took " << delta << " milliseconds" << std::endl;
	//myJson.LoadItems("JSON/items.json", myPlayer.GetInventory());

	std::cout << "Level: " << CGame::myTestLevel << std::endl;
	if (CGame::myTestLevel.size() > 0)
	{
		DL_PRINT(CGame::myTestLevel.c_str());
		ChangeLevel(CGame::myTestLevel);
	}
	else
	{
		ChangeLevel(name);
	}


	myDoQuit = false;
	myTalkIsOn = false;
	myPlayerCanMove = true;

	myTextFPS = new DX2D::CText("Text/PassionOne-Regular.ttf_sdf");
	myTextFPS->myPosition = { 0.5f, 0.05f };
	myTextFPS->myText = "FPS: ";
	myTextFPS->mySize = 0.8f;

	myRenderPasses.Init(32);

	myPlayer.Init(DX2D::Vector2f(0.5f, 0.8f), this);

	myFadeIn = 1.0f;
	myDoFadeIn = false;

	myShouldRenderDebug = false;
	myShouldRenderFPS = false;
	myShouldRenderNavPoints = false;
#ifdef _DEBUG
	myShouldRenderFPS = true;
	myShouldRenderNavPoints = true;
#endif

	myCurrentWaypoint = 0;
	myHasPath = false;
	myHasNewTargetPosition = false;
	myTargetPosition = { 0.0f, 0.0f };
	myNewTargetPosition = myTargetPosition;
	
#ifdef _DEBUG
	myDotSprites.Init(12000);
	for (int i = 0; i < 12000; ++i)
	{
		DX2D::CSprite* sprite = new DX2D::CSprite("Sprites/Dot.dds");
		myDotSprites.Add(sprite);
	}
#endif
	
	myOptionsMenu.Initialize();
}