void CDialogSkinAuto::LoadSkel() { const string skel = QFileDialog::getOpenFileName(this, tr("Charger un squelette"), "Model/", tr("Fichier squelette (*.chr)")); if (!skel.isEmpty()) { QFileInfo fileInfo(skel); ModelMng->SetModelPath(fileInfo.path() % '/'); CSkeleton* skl = ModelMng->GetSkeleton(fileInfo.fileName()); if (skl) { Delete(m_mesh->m_skeleton); m_mesh->m_skeleton = skl; DeleteArray(m_mesh->m_bones); ui.bonesList->clear(); m_items.clear(); ui.skelName->setText(fileInfo.fileName()); m_mesh->m_bones = new D3DXMATRIX[skl->GetBoneCount() * 2]; m_mesh->m_invBones = m_mesh->m_bones + skl->GetBoneCount(); skl->ResetBones(m_mesh->m_bones, m_mesh->m_invBones); QList<QTreeWidgetItem*> items; QTreeWidgetItem* item; Bone* bone; for (int i = 0; i < skl->GetBoneCount(); i++) { bone = &skl->m_bones[i]; item = new QTreeWidgetItem(QStringList(bone->name)); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(0, Qt::Unchecked); item->setData(0, Qt::UserRole + 1, QVariant(i)); m_items[i] = item; if (bone->parentID == -1) items.append(item); else m_items[bone->parentID]->addChild(item); } ui.bonesList->insertTopLevelItems(0, items); ui.bonesList->expandAll(); ui.okSkel->setEnabled(true); } } }
void CImporter::_createBones() { int boneCount = m_boneNodes.size(); Bone* bones = new Bone[boneCount]; memset(bones, 0, sizeof(Bone) * boneCount); Bone* bone = null; aiNode* node = null; int i, j, k, l; for (i = 0; i < boneCount; i++) { bone = &bones[i]; node = m_boneNodes[i]; strcpy(bone->name, node->mName.C_Str()); bone->localTM = _getMatrix(node->mTransformation); if (node->mParent == m_scene->mRootNode || node->mParent == null) bone->parentID = -1; else { for (j = 0; j < boneCount; j++) { if (m_boneNodes[j] == node->mParent) { bone->parentID = j; break; } } } } for (i = 0; i < boneCount; i++) { bones[i].TM = bones[i].localTM; if (bones[i].parentID != -1) bones[i].TM *= bones[bones[i].parentID].TM; } aiMesh* mesh = null; for (i = 0; i < m_objects.size(); i++) { for (j = 0; j < (int)m_objects[i]->mNumMeshes; j++) { mesh = m_scene->mMeshes[m_objects[i]->mMeshes[j]]; if (mesh->HasBones()) { for (k = 0; k < (int)mesh->mNumBones; k++) { bone = null; for (l = 0; l < boneCount; l++) { if (strcmp(bones[l].name, mesh->mBones[k]->mName.C_Str()) == 0) { bone = &bones[l]; break; } } if (bone) bone->inverseTM = _getMatrix(mesh->mBones[k]->mOffsetMatrix); } } } } if (m_externBones) { CSkeleton* skel = m_mesh->m_skeleton = new CSkeleton(); skel->m_ID = _getNewID(); skel->m_boneCount = boneCount; skel->m_bones = bones; if (boneCount <= MAX_BONES) skel->m_sendVS = true; m_mesh->m_bones = new D3DXMATRIX[boneCount * 2]; m_mesh->m_invBones = m_mesh->m_bones + boneCount; skel->ResetBones(m_mesh->m_bones, m_mesh->m_invBones); } else { m_obj3D->m_boneCount = boneCount; if (boneCount <= MAX_BONES) m_obj3D->m_sendVS = true; m_obj3D->m_baseBones = new D3DXMATRIX[boneCount * 2]; m_obj3D->m_baseInvBones = m_obj3D->m_baseBones + boneCount; for (i = 0; i < boneCount; i++) { m_obj3D->m_baseBones[i] = bones[i].TM; m_obj3D->m_baseInvBones[i] = bones[i].inverseTM; } } m_bones = bones; }