//-------------------------------------------------------------------- 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; }
void SkeletonComponent::GetReferenceResourceId(Util::Array<Resources::ReferenceResource>& list) const { list.Append(Resources::ReferenceResource(m_SkelID, Resources::RR_Unknown)); Super::GetReferenceResourceId(list); }