//---------------------------------------------------------------------------- // Skeleton functions //---------------------------------------------------------------------------- bool CEditableObject::ImportMAXSkeleton(CExporter* E) { bool bResult = true; CEditableMesh* MESH = xr_new<CEditableMesh>(this); m_Meshes.push_back(MESH); // import mesh if (!MESH->Convert(E)) return FALSE; // BONES m_Bones.reserve(E->m_Bones.size()); for (int B=0; B!=E->m_Bones.size(); B++){ m_Bones.push_back(xr_new<CBone>()); CBone* BONE = m_Bones.back(); CBoneDef* bone = E->m_Bones[B]; CBoneDef* parent_bone = bone->parent; Fvector offset,rotate; float length= 0.1f; Fmatrix m; if (parent_bone) m.mul(parent_bone->matOffset,bone->matInit); else m.set(bone->matInit); m.getXYZi (rotate); offset.set (m.c); BONE->SetWMap (bone->name.c_str()); BONE->SetName (bone->name.c_str()); BONE->SetParentName (Helper::ConvertSpace(string(bone->pBone->GetParentNode()->GetName())).c_str()); BONE->SetRestParams (length,offset,rotate); } // DEFAULT BONE PART m_BoneParts.push_back(SBonePart()); SBonePart& BP = m_BoneParts.back(); BP.alias = "default"; for (int b_i=0; b_i<(int)m_Bones.size(); b_i++) BP.bones.push_back(Bones()[b_i]->Name()); m_objectFlags.set(CEditableObject::eoDynamic,TRUE); if ((0==GetVertexCount())||(0==GetFaceCount())){ bResult = false; }else{ ELog.Msg(mtInformation,"Model '%s' contains: %d points, %d faces, %d bones", E->m_MeshNode->GetName(), GetVertexCount(), GetFaceCount(), Bones().size()); } return bResult; }
void __fastcall TfrmBonePart::ebSaveClick(TObject *Sender) { for (int k=0; k<4; k++) { if (T[k]->Items->Count&&E[k]->Text.IsEmpty()) { ELog.DlgMsg(mtError,"Verify parts name."); return; } for (int i=k-1; i>=0; i--) { if (!T[k]->Items->Count) continue; if (E[k]->Text.UpperCase()==E[i]->Text.UpperCase()) { ELog.DlgMsg(mtError,"Unique name required."); return; } } } // verify U8Vec b_use(m_EditObject->BoneCount(),0); for (k=0; k<4; k++) { if (T[k]->Items->Count) for ( TElTreeItem* node = T[k]->Items->GetFirstNode(); node; node = node->GetNext()) b_use[m_EditObject->FindBoneByNameIdx(AnsiString(node->Text).c_str())]++; } for (U8It u_it=b_use.begin(); u_it!=b_use.end(); u_it++) if (*u_it!=1) { ELog.DlgMsg (mtError,"Invalid bone part found (missing or duplicate bones)."); return; } // save m_BoneParts->clear(); for (k=0; k<4; k++) { if (T[k]->Items->Count) { m_BoneParts->push_back(SBonePart()); SBonePart& BP = m_BoneParts->back(); BP.alias = E[k]->Text.c_str(); for ( TElTreeItem* node = T[k]->Items->GetFirstNode(); node; node = node->GetNext()) BP.bones.push_back(AnsiString(node->Text).c_str()); } } ATools->OnMotionDefsModified(); Close(); ModalResult = mrOk; }