bool CEditableObject::VerifyBoneParts() { U8Vec b_use(BoneCount(),0); for (BPIt bp_it=m_BoneParts.begin(); bp_it!=m_BoneParts.end(); bp_it++) for (int i=0; i<int(bp_it->bones.size()); i++){ int idx = FindBoneByNameIdx(bp_it->bones[i].c_str()); if (idx==-1){ bp_it->bones.erase(bp_it->bones.begin()+i); i--; }else{ b_use[idx]++; } } for (U8It u_it=b_use.begin(); u_it!=b_use.end(); u_it++) if (*u_it!=1) return false; return true; }
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; }