Esempio n. 1
0
void FBXParser::FillParaXModelData(CParaXModel *pMesh, const aiScene *pFbxScene)
{
	pMesh->m_objNum.nVertices = m_vertices.size();
	pMesh->m_objNum.nBones = m_bones.size();
	pMesh->m_objNum.nTextures = m_textures.size();
	pMesh->m_objNum.nAnimations = m_bones.size() > 0 ? m_anims.size() : 0;
	pMesh->m_objNum.nIndices = m_indices.size();
	pMesh->m_header.minExtent = m_minExtent;
	pMesh->m_header.maxExtent = m_maxExtent;
	pMesh->m_vNeckYawAxis = m_modelInfo.m_vNeckYawAxis;
	pMesh->m_vNeckPitchAxis = m_modelInfo.m_vNeckPitchAxis;
	pMesh->initVertices(m_vertices.size(), &(m_vertices[0]));
	pMesh->initIndices(m_indices.size(), &(m_indices[0]));

	if (m_bones.size() > 0)
	{
		pMesh->bones = new ParaEngine::Bone[m_bones.size()];
		for (int i = 0; i < (int)m_bones.size(); ++i)
		{
			m_bones[i].RemoveRedundentKeys();
			pMesh->bones[i] = m_bones[i];
			if (m_bones[i].nBoneID > 0)
				pMesh->m_boneLookup[m_bones[i].nBoneID] = i;
			else if (m_bones[i].IsAttachment())
			{
				// TODO: pivot point
				pMesh->NewAttachment(true, m_bones[i].GetAttachmentId(), i, Vector3::ZERO);
			}
		}
	}

	if (m_anims.size() > 0 && m_bones.size() > 0)
	{
		pMesh->anims = new ModelAnimation[m_anims.size()];
		memcpy(pMesh->anims, &(m_anims[0]), sizeof(ModelAnimation)*m_anims.size());
		pMesh->animBones = true;
		pMesh->animated = true;
	}
	else
	{
		pMesh->animBones = false;
		pMesh->animated = false;
	}

	if (m_textures.size() > 0)
	{
		pMesh->textures = new asset_ptr<TextureEntity>[m_textures.size()];
		for (int i = 0; i < (int)m_textures.size(); i++)
		{
			if (m_textureContentMapping.find(m_textures[i]) != m_textureContentMapping.end())
			{
				int nSize = m_textureContentMapping[m_textures[i]].size();
				if (nSize > 0)
				{
					TextureEntity *texEntity = CGlobals::GetAssetManager()->GetTextureManager().NewEntity(m_textures[i]);
					char* bufferCpy = new char[nSize];
					memcpy(bufferCpy, m_textureContentMapping[m_textures[i]].c_str(), nSize);
					texEntity->SetRawData(bufferCpy, nSize);
					pMesh->textures[i] = texEntity;
				}
			}
			else if (CParaFile::DoesAssetFileExist(m_textures[i].GetFileName().c_str()))
			{
				pMesh->textures[i] = CGlobals::GetAssetManager()->LoadTexture("", m_textures[i], TextureEntity::StaticTexture);
			}
			// for replaceable textures
			if (m_textures[i].nIsReplaceableIndex > 0 && i < 32)
			{
				pMesh->specialTextures[i] = m_textures[i].nIsReplaceableIndex;
			}
		}
	}

	if (pMesh->geosets.size() > 0)
	{
		pMesh->showGeosets = new bool[pMesh->geosets.size()];
		memset(pMesh->showGeosets, true, pMesh->geosets.size()*sizeof(bool));
	}
	pMesh->m_radius = (m_maxExtent - m_minExtent).length() / 2;

	AddDefaultColors(pMesh);
	AddDefaultTransparency(pMesh);

	pMesh->m_RenderMethod = pMesh->HasAnimation() ? CParaXModel::SOFT_ANIM : CParaXModel::NO_ANIM;

	// only enable bmax model, if there are vertex color channel.
	if (m_beUsedVertexColor)
		pMesh->SetBmaxModel();
}