Пример #1
0
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);
		}
	}
}
Пример #2
0
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;
}