Пример #1
0
Файл: Mz.cpp Проект: cpzhang/zen
bool Mz::load( const std::string& fileName )
{
	//
	destroy();

	mzFileName_ = fileName;
	std::string mziFileName(fileName + "i");
	mziFileName = FileSystem::standardFilePath(mziFileName);
	loadMzI(mziFileName);
	//
	std::ifstream f(fileName.c_str(), std::ios::binary);
	if (!f.good())
	{
		return NULL;
	}

	//	[Tag Size Data]
	int t;
	int s;
	while(f.good())
	{
		t = 0;
		s = 0;
		f.read((char*)&t, sizeof(int));
		f.read((char*)&s, sizeof(int));

		if (s <= 0)
		{
			continue;
		}

		char c[5];
		c[0] = *((char*)&t + 3);
		c[1] = *((char*)&t + 2);
		c[2] = *((char*)&t + 1);
		c[3] = *((char*)&t + 0);
		c[4] = 0;

		switch (t)
		{
		case 'MVER':
			{
				decodeVersion(f, s);
			}
			break;

		case 'MSUB':
			{
				decodeSubMesh(f, s);
			}
			break;
		case 'MVTX':
			{
				decodeVertices(f, s);
			}
			break;
		case 'MFAC':
			{
				decodeFaces(f, s);
			}
			break;
		case 'MMTX': // 模型的材质
			{
				decodeMaterial(f, s);
			}
			break;
		case 'MANM':
			{
				decodeAnimation(f, s);
			}
			break;
		case 'MWRD': 
			{
				//废弃
				u32 numBones;
				f.read((char*)&numBones,sizeof(numBones));

				struct tranMatrix
				{
					float m_mat[4][3];
				};
				for(int i = 0;i < numBones;i++)
				{
					tranMatrix tm;
					f.read((char*)&tm,sizeof(tm));
				}
			}
			break;
		case 'MBON': // 模型骨骼信息
			{
				decodeBone(f, s);
			}
			break;
		default:
			{
				f.ignore(s);
				//Error("遇到无法识别的数据块");
			}
			break;
		}
	}
	f.close();
	//
	if (!mParticleEmitter.empty())
	{
		tstring n = FileSystem::removeParent(mzFileName_);
		n = FileSystem::removeFileExtension(n);
		tstring fn = FileSystem::getDataDirectory();
		std::ostringstream ss;
		for (size_t i = 0; i != mParticleEmitter.size(); ++i)
		{
			ss.str("");
			ss.clear();
			ss<<fn<<"\\particle\\"<<n<<"_"<<i<<".particle";
			mParticleEmitter[i].save(ss.str());
		}
	}
	return true;
}
void CCDataReaderHelper::addDataFromJsonCache(const char *fileContent)
{
    cs::CSJsonDictionary json;
    json.initWithDescription(fileContent);

    // Decode armatures
    int length = json.getArrayItemCount(ARMATURE_DATA);
    for (int i = 0; i < length; i++)
    {
        cs::CSJsonDictionary *armatureDic = json.getSubItemFromArray(ARMATURE_DATA, i);
        CCArmatureData *armatureData = decodeArmature(*armatureDic);
        CCArmatureDataManager::sharedArmatureDataManager()->addArmatureData(armatureData->name.c_str(), armatureData);

        delete armatureDic;
    }

    // Decode animations
    length = json.getArrayItemCount(ANIMATION_DATA);
    for (int i = 0; i < length; i++)
    {
        cs::CSJsonDictionary *animationDic = json.getSubItemFromArray(ANIMATION_DATA, i);
        CCAnimationData *animationData = decodeAnimation(*animationDic);
        CCArmatureDataManager::sharedArmatureDataManager()->addAnimationData(animationData->name.c_str(), animationData);

        delete animationDic;
    }

    // Decode textures
    length = json.getArrayItemCount(TEXTURE_DATA);
    for (int i = 0; i < length; i++)
    {
        cs::CSJsonDictionary *textureDic = json.getSubItemFromArray(TEXTURE_DATA, i);
        CCTextureData *textureData = decodeTexture(*textureDic);
        CCArmatureDataManager::sharedArmatureDataManager()->addTextureData(textureData->name.c_str(), textureData);

        delete textureDic;
    }

	// Auto load sprite file
	if (CCArmatureDataManager::sharedArmatureDataManager()->isAutoLoadSpriteFile())
	{
		length = json.getArrayItemCount(CONFIG_FILE_PATH);
		for (int i = 0; i < length; i++)
		{
			const char *path = json.getStringValueFromArray(CONFIG_FILE_PATH, i);
			if (path == NULL)
			{
				CCLOG("load CONFIG_FILE_PATH error.");
				return;
			}

			std::string filePath = path;

			std::string plistPath = filePath;
			std::string pngPath = filePath.erase(filePath.find_last_of(".")) + ".png";

			
			size_t pos = s_filePath.find_last_of("/");
			if (pos != std::string::npos)
			{
				filePath = s_filePath.substr(0, pos+1);
			}

			CCArmatureDataManager::sharedArmatureDataManager()->addSpriteFrameFromFile((filePath + plistPath).c_str(), (filePath + pngPath).c_str());
		}
	}
}