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] ); } }