//--------------------------------------------------------------------
	Ptr<CharacterNode> Nebula3Writer::writeCharacterData( const NodeData& instanceNodeData,CharacterData& characterData )
	{
		if( !this->mGeometryDatas.Contains(characterData.geometryUniqueId) ||
			!this->mSkinDatas.Contains(characterData.skinUniqueId) )
		{
			n_error("CharacterData Not have geometryData or SkinData!\n");
		}

		GeometryData& geometryData = this->mGeometryDatas[characterData.geometryUniqueId];
		SkinData& skinData = this->mSkinDatas[characterData.skinUniqueId];
		/// 设置骨架基本信息		
		characterData.RootTransform = instanceNodeData.bind_matrix;
		characterData.characterName = instanceNodeData.nodeName;

		/// 建立骨骼
		this->buildSkeleton(characterData,skinData);
		this->buildSkinWeights(characterData,skinData,geometryData);		
		
		/// 建立骨骼节点
		Ptr<CharacterNode> characterNode = CharacterNode::Create();
		characterNode->SetName(characterData.characterName);

		/// 为骨骼节点添加骨骼
		Util::Array<IndexT> boneIndices;
		const JointMaps& characterJoints = characterData.characterJoints;
		const Util::Array<COLLADAFW::UniqueId>& jointKeys = characterJoints.KeysAsArray();
		for (int i=0;i<jointKeys.Size();i++)
		{
			const COLLADAFW::UniqueId& jointId = jointKeys[i];
			characterNode->AddJoint( jointId,characterJoints[jointId] );
			//if( characterData.inverseMatrixs.Contains(jointId))
			boneIndices.Append( characterJoints[jointId].GetJointIndex());
		}///end for

		/// 为骨骼节点添加蒙皮信息
		Ptr<TransformNode> transformNode = this->writeSkinGeometryData(instanceNodeData,skinData,geometryData);
		Util::Array<Ptr<ModelNode>> shapeNodes = transformNode->GetChildren();
		for (int i=0;i< shapeNodes.Size();i++)
		{
			const Ptr<CharacterSkinNode>& skinNode = shapeNodes[i].downcast<CharacterSkinNode>();
			IndexT groupIndex = skinNode->GetPrimitiveGroupIndex();
			skinNode->AddFragment(groupIndex,boneIndices);					
		}///end for

		Util::String animResId = this->writeAnimationData(characterData,characterJoints);
		characterNode->SetAnimationResourceId(animResId);
		characterNode->AddChild(transformNode.upcast<ModelNode>());
		characterNode->AddSkin(transformNode->GetName().AsString());	

		//Math::vector outTranslate;Math::quaternion outRotate;Math::vector outScale;		
		//Math::matrix44 matTemp = characterData.RootTransform;
		//matTemp.decompose(outScale,outRotate,outTranslate);	
		//characterNode->SetPosition(outTranslate);
		//characterNode->SetRotation(outRotate);
		//characterNode->SetScale(outScale);
		return characterNode;
	}
Ejemplo n.º 2
0
	void SkeletonComponent::GetReferenceResourceId(Util::Array<Resources::ReferenceResource>& list) const
	{
		list.Append(Resources::ReferenceResource(m_SkelID, Resources::RR_Unknown));
		Super::GetReferenceResourceId(list);
	}