Ejemplo n.º 1
0
	bool ModelInstance::setModel(const char* modelName,ModelNode *pNode)
	{
		IModelManager *pModelManager = getRenderEngine()->getModelManager();
		IModel *pModel = pModelManager->loadModel(modelName);
		if(!pModel)return false;

		m_pModel = pModel;
		m_pNode = pNode;

		//设置buffer		
		m_pIB = m_pModel->getIndexBuffer();
		m_pVBTexcoord = m_pModel->getTexcoordBuffer();
		m_pVBBlendWeight = m_pModel->getBlendWeightBuffer();
		m_pBlendShaderProgram = m_pModel->getBlendShaderProgram();//需要再构造SubModelInstance前设置
		m_needDrawShadow = m_pModel->needDrawShadow();

		//创建子mesh
		uint numSubModels = m_pModel->getNumSubModels();
		for(uint i = 0;i < numSubModels;i++)
		{
			ISubModel *pSubModel = m_pModel->getSubModel(i);
			SubModelInstance *pSubModelInstance = new SubModelInstance(this,pSubModel, i);
			m_subModels.push_back(pSubModelInstance);
			m_vBlendIndices.push_back( m_pModel->getBlendIndicesBuffer(i));//保存骨骼混合的索引buffer
		}

		//创建骨骼树
		if( !m_skeleton.create(m_pModel->getCoreSkeletion() ) )
		{
			return false;
		}
		//uint numBones = m_pModel->numBones();
		//for(uint i = 0;i < numBones;i++)
		//{
		//	BoneData *pData = m_pModel->getBone(i);
		//	Bone *pBone = m_skeleton.createBone(m_pNode);
		//	loadBone(pBone,pData);
		//}
		////骨骼树形结构构建
		//for(size_t i = 0;i < numBones;i++)
		//{
		//	BoneData *pBone = m_pModel->getBone(i);
		//	if(pBone->parentId != -1)
		//	{
		//		for(size_t j = 0;j < numBones;j++)
		//		{
		//			BoneData *pParent = m_pModel->getBone(j);
		//			if(pBone->parentId == pParent->objectId)
		//			{
		//				m_skeleton.getBone(i)->setParent(m_skeleton.getBone(j));
		//				break;
		//			}
		//		}
		//	}
		//	m_skeleton.getBone(i)->setPrecomputeMatrix(pBone->precomputeMtx);
		//}

		//ParticleSystem
		size_t size = m_pModel->numParticleSystem();
		for(size_t j = 0;j < size;j++)
		{
			ParticleSystem *pParticleSystem = new ParticleSystem;
			pParticleSystem->m_pData = m_pModel->getParticleSystemData(j);
			pParticleSystem->m_pBone = m_skeleton.getBone(pParticleSystem->m_pData->boneObjectId);
			pParticleSystem->m_pNode = m_pNode;
			m_vParticleSystem.push_back(pParticleSystem);
		}

		//RibbonSystem
		size = m_pModel->numRibbonSystem();
		for(size_t j = 0;j < size;j++)
		{
			RibbonSystem *pRibbonSystem = new RibbonSystem;
			pRibbonSystem->m_pData = m_pModel->getRibbonSystemData(j);
			pRibbonSystem->m_pBone = m_skeleton.getBone(pRibbonSystem->m_pData->boneObjectId);
			pRibbonSystem->m_pNode = m_pNode;
			m_vRibbonSystem.push_back(pRibbonSystem);
		}

		//MmParticleSystem
		size = m_pModel->numMmParticleSystem();
		for(size_t j = 0;j < size;j++)
		{
			MmParticleSystem *pMmPs = new MmParticleSystem;
			pMmPs->m_pData = m_pModel->getMmParticleSystem(j);
			pMmPs->m_pNode = m_pNode;
			pMmPs->m_pBone = m_skeleton.getBone(pMmPs->m_pData->bone);
			m_vMmParticleSystem.push_back(pMmPs);
		}

		if(m_pModel->getAnimationCount())
			setCurrentAnimation(pModel->getAnimation(0)->getName());

		return true;
	}