Exemple #1
0
int DocumentIterator::CalcNodeLevel(int nIdx)
{
	int nLevel = 0;
	int nParentID = m_doc.GetNodeByIdx(nIdx).m_nParentID;
	while(nParentID >= 0){
		nLevel ++;
		nParentID = GetNodeByID(nParentID).m_nParentID;
	}
	return nLevel;
}
void	SMDImporter::WeightGeometry()
{
	if ( !m_pTriangles.GetUsed() )
		return;

	XSI::CRefArray l_bones;
	CSIBCArray<XSI::CDoubleArray>	weightList;
	weightList.Extend ( m_pNodes.GetUsed() );

	for (int e=0;e<m_pNodes.GetUsed();e++)
	{
		weightList[e].Resize ( compress.GetCount() );
	}


	XSI::MATH::CTransformation xfo;
	xfo.SetRotationFromXYZAnglesValues ( -1.570796, 0.0, 0.0 );

	for (int n=0;n<m_pTriangles.GetUsed();n++)
	{
		SMDTriangle* tri = m_pTriangles[n];
		for (int v=0;v<3;v++)
		{
			//
			// get the index of this vertex
			//
			XSI::MATH::CVector3 vec1 = XSI::MATH::MapObjectPositionToWorldSpace ( xfo, tri->m_pVertex[v].m_vPosition );

			long index = compress.GetIndex (vec1.GetX(), 
											vec1.GetY(), 
											vec1.GetZ(),
											tri->m_pVertex[v].m_vUV.GetX(),
											tri->m_pVertex[v].m_vUV.GetY() );

			for (int w=0;w<tri->m_pVertex[v].m_vWeights.GetUsed();w++)
			{
				Weight* weight = &tri->m_pVertex[v].m_vWeights[w];

				XSI::X3DObject bone = GetNodeByID(weight->m_iBoneID);

				bool found = false;
				int ib = 0;
				for (int b=0;b<l_bones.GetCount();b++)
				{
					if ( l_bones[b] == bone )
					{
						found =true;
						break;
					}
					ib++;
				}

				if ( !found )
				{
					l_bones.Add ( bone );
				}

				weightList[ib];
				weightList[ib][index] = weight->m_fWeight * 100.0f;

			}
		}

	}

	//
	// apply envelope
	//

	XSI::Envelope myEnvelope;
	m_pMesh.ApplyEnvelope(	l_bones, XSI::siUnspecified, XSI::siUnspecified, myEnvelope);


	//
	// zero all weights
	//

	for (int z=0;z<l_bones.GetCount();z++)
	{

		XSI::X3DObject	X3d = l_bones[z];

		XSI::CDoubleArray refWeights = myEnvelope.GetDeformerWeights( X3d, 0.0 );

		for (int wc=0;wc<refWeights.GetCount();wc++)
		{
			refWeights[wc] = 0.0;
		}
	
		//
		// first set to zero
		myEnvelope.SetDeformerWeights( X3d, refWeights );


	}

	for (int f=0;f<l_bones.GetCount();f++)
	{

		XSI::X3DObject	X3d = l_bones[f];

		myEnvelope.SetDeformerWeights( X3d, weightList[f] );
	}

}