Using the Physique Export Interface

Below is a code example using the physique export interface (IPhysiqueExport) which uses the function FindPhysiqueModifier() from the topic Finding a Physique Modifier.

void ExportPhysiqueData(TimeValue t, ModContext &mc, ObjectState *os, INode *node)
{
  Modifier *phyMod = FindPhysiqueModifier(node);
  if (!phyMod) return;    // Physique Modifier does not exist for given Node
 
  // create a Physique Export Interface for the given Physique Modifier        
   IPhysiqueExport *phyExport = ( IPhysiqueExport*)phyMod->GetInterface(I_PHYINTERFACE);
  if (phyExport)
  {
    // create a ModContext Export Interface for the specific node of the Physique Modifier
     IPhyContextExport *mcExport = ( IPhyContextExport *)phyExport->GetContextInterface(node);
    if (mcExport)
    {
      // we convert all vertices to Rigid in this example
      mcExport->ConvertToRigid(TRUE);
      
      // compute the transformed Point3 at time t
      for (int i = 0; i < os->obj->NumPoints();  i++)
      {
          IPhyVertexExport *vtxExport = mcExport->GetVertexInterface(i);
         if (vtxExport)
         {
             //need to check if vertex has blending
             if (vtxExport->GetVertexType() & BLENDED_TYPE)
            {
               IPhyBlendedRigidVertex *vtxBlend = ( IPhyBlendedRigidVertex *)vtxExport;
               Point3 BlendP(0.0f, 0.0f, 0.0f);
                for (int n = 0; n < vtxBlend->GetNumberNodes(); n++)
               {
                 INode *Bone = vtxBlend->GetNode(n);
                 Point3 Offset = vtxBlend->GetOffsetVector(n);
                  float Weight = vtxBlend->GetWeight(n);
                  BlendP += (Bone->GetNodeTM(t) * Offset) * Weight;
               }
             
                // set the Point of the object (to test the export is correct)
                os->obj->SetPoint(i, BlendP);
                mcExport->ReleaseVertexInterface(vtxExport);
                vtxExport = NULL;
            }
             else
            {
               IPhyRigidVertex *vtxNoBlend = ( IPhyRigidVertex *)vtxExport;
               INode *Bone = vtxNoBlend->GetNode();
               Point3 Offset = vtxNoBlend->GetOffsetVector();
                                        
                // set the Point of the object (to test the export is correct)
                os->obj->SetPoint(i, Bone->GetNodeTM(t) * Offset);
                mcExport->ReleaseVertexInterface(vtxExport);
                vtxExport = NULL;
            }
          }
        }
        phyExport->ReleaseContextInterface(mcExport);
      }
      phyMod->ReleaseInterface(I_PHYINTERFACE, phyExport);
    }