1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "fsCAnimationDataManager.h"

#include <fsCore/src/debug/fsAssert.h>
#include <fsCore/src/fsCResourceName.h>

//#define fsSpriter

#if defined fsSpriter
	#include <fsSpriter/src/fsCAnimationDataSpriter.h>
	#include <fsSpriter/src/fsCAnimatingSpriteSpriter.h>
#endif

#include <fsAppCore/src/fsCAppCoreMain.h>

#include "fsCAnimationDataPlayfirst.h"
#include "fsCAnimatingSpritePlayfirst.h"


const fsStr fsCAnimationDataManager::mSpriterExt(".scml");


fsBool fsCAnimationDataManager::spriterFileType(const fsStr& pFileName) const<--- The member function 'fsCAnimationDataManager::spriterFileType' can be static.
{
	return (fsStr::npos != pFileName.find(mSpriterExt));
}

std::shared_ptr<fsIAnimatingSprite> const fsCAnimationDataManager::createAnimationInstance(
	std::shared_ptr<fsIAnimationData> pData, fsCSprite* const pAnimatingRootSprt)
{
	std::shared_ptr<fsIAnimatingSprite> animInst;
#if defined fsSpriter
	if (std::dynamic_pointer_cast<const fsCAnimationDataSpriter>(pData))
	{
		animInst = std::shared_ptr<fsCAnimatingSpriteSpriter>(new fsCAnimatingSpriteSpriter(pAnimatingRootSprt));
	}
	else
#endif
	{
		animInst = std::shared_ptr<fsCAnimatingSpritePlayfirst>(new fsCAnimatingSpritePlayfirst(pAnimatingRootSprt));
	}

	animInst->animationDataSet(pData);
	return animInst;
}

std::shared_ptr<fsIAnimationData> fsCAnimationDataManager::createAnimationData(
	const fsCResourceName& pFileName, fsBool pHitMap)
{
	std::shared_ptr<fsIAnimationData> animData = nullptr;

	spriterFileType(pFileName.nameGet())
		?
#if defined fsSpriter
		animData = std::shared_ptr<fsCAnimationDataSpriter>(new fsCAnimationDataSpriter()) :
#else
		animData = nullptr
		:
#endif
		animData = std::shared_ptr<fsCAnimationDataPlayfirst>(new fsCAnimationDataPlayfirst());

	if (animData)
	{
		animData->initialise(pFileName, pHitMap);
	}
	return animData;
}

std::shared_ptr<fsIAnimationData> fsCAnimationDataManager::getPermanent(const fsCResourceName& pFileName,
                                                                        fsBool pHitMap)
{
	auto animData = mPermanentData.find(pFileName.nameGet());
	if (animData != mPermanentData.end())
	{
		return animData->second;
	}

	return (*mPermanentData.insert(std::pair<fsStr, std::shared_ptr<fsIAnimationData>>(
		                        pFileName.nameGet(),
		                        createAnimationData(pFileName, pHitMap))).
	                        first).second;
}

std::shared_ptr<fsIAnimationData> fsCAnimationDataManager::get(const fsCResourceName& pFileName, fsBool pHitMap)
{
	auto animData = mData.find(pFileName.nameGet());
	if (animData != mData.end())
	{
		return animData->second;
	}

	return (*mData.insert(std::pair<fsStr, std::shared_ptr<fsIAnimationData>>(
		               pFileName.nameGet(),
		               createAnimationData(pFileName, pHitMap))).
	               first).second;
}

void fsCAnimationDataManager::flush()
{
	mData.clear();
}

std::unique_ptr<fsCAnimationDataManager> fsCAnimationDataManager::create()
{
	fsTrace("fsCAnimationDataManager::create");
	return std::unique_ptr<fsCAnimationDataManager>(new fsCAnimationDataManager());
}

fsCAnimationDataManager::fsCAnimationDataManager()
{
}

fsCAnimationDataManager::~fsCAnimationDataManager()
{
	flush();
	mPermanentData.clear();
}