Ejemplo n.º 1
0
//----------------------------------------------------------------------------
// 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;
}
Ejemplo n.º 2
0
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;
}