bool hkbGetWorldFromModelModifier::write(HkxXMLWriter *writer){
    std::lock_guard <std::mutex> guard(mutex);
    auto writedatafield = [&](const QString & name, const QString & value){
        writer->writeLine(writer->parameter, QStringList(writer->name), QStringList(name), value);
    };
    if (writer && !getIsWritten()){
        QString refString = "null";
        QStringList list1 = {writer->name, writer->clas, writer->signature};
        QStringList list2 = {getReferenceString(), getClassname(), "0x"+QString::number(getSignature(), 16)};
        writer->writeLine(writer->object, list1, list2, "");
        if (getVariableBindingSetData()){
            refString = getVariableBindingSet()->getReferenceString();
        }
        writedatafield("variableBindingSet", refString);
        writedatafield("userData", QString::number(userData));
        writedatafield("name", name);
        writedatafield("enable", getBoolAsString(enable));
        writedatafield("translationOut", translationOut.getValueAsString());
        writedatafield("rotationOut", rotationOut.getValueAsString());
        writer->writeLine(writer->object, false);
        setIsWritten();
        writer->writeLine("\n");
        if (getVariableBindingSetData() && !getVariableBindingSet()->write(writer)){
            LogFile::writeToLog(getParentFilename()+": "+getClassname()+": write()!\nUnable to write 'variableBindingSet'!!!");
        }
    }
    return true;
}
Exemple #2
0
// DataIO_Std::WriteByGroup()
int DataIO_Std::WriteByGroup(CpptrajFile& file, DataSetList const& SetList, GroupType gtype)
{
  int err = 0;
  bool firstWrite = true;
  DataSetList tmpdsl;
  std::vector<bool> setIsWritten(SetList.size(), false);
  unsigned int startIdx = 0;
  unsigned int nWritten = 0;
  while (nWritten < SetList.size()) {
    std::string currentName;
    Dimension currentDim;
    int currentNum = -1;
    switch (gtype) {
      case BY_NAME   : currentName = SetList[startIdx]->Meta().Name(); break;
      case BY_ASPECT : currentName = SetList[startIdx]->Meta().Aspect(); break;
      case BY_IDX    : currentNum  = SetList[startIdx]->Meta().Idx(); break;
      case BY_ENS    : currentNum  = SetList[startIdx]->Meta().EnsembleNum(); break;
      case BY_DIM    : currentDim  = SetList[startIdx]->Dim(0); break;
      case NO_TYPE   : return 1;
    }
    int firstNonMatch = -1;
    for (unsigned int idx = startIdx; idx != SetList.size(); idx++)
    {
      if (!setIsWritten[idx])
      {
        bool match = false;
        switch (gtype) {
          case BY_NAME   : match = (currentName == SetList[idx]->Meta().Name()); break;
          case BY_ASPECT : match = (currentName == SetList[idx]->Meta().Aspect()); break;
          case BY_IDX    : match = (currentNum  == SetList[idx]->Meta().Idx()); break;
          case BY_ENS    : match = (currentNum  == SetList[idx]->Meta().EnsembleNum()); break;
          case BY_DIM    : match = (currentDim  == SetList[idx]->Dim(0)); break;
          case NO_TYPE   : return 1;
        }
        if (match)
        {
          tmpdsl.AddCopyOfSet( SetList[idx] );
          setIsWritten[idx] = true;
          nWritten++;
        } else if (firstNonMatch == -1)
          firstNonMatch = (int)idx;
      }
    }
    if (firstNonMatch > -1)
      startIdx = (unsigned int)firstNonMatch;
    if (!firstWrite)
      file.Printf("\n");
    else
      firstWrite = false;
    if (isInverted_)
      err += WriteDataInverted(file, tmpdsl);
    else
      err += WriteDataNormal(file, tmpdsl);
    tmpdsl.ClearAll();
  }
  return err;
}
bool hkbBehaviorGraphStringData::write(HkxXMLWriter *writer){
    std::lock_guard <std::mutex> guard(mutex);
    if (writer && !getIsWritten()){
        QStringList list1 = {writer->name, writer->clas, writer->signature};
        QStringList list2 = {getReferenceString(), getClassname(), "0x"+QString::number(getSignature(), 16)};
        writer->writeLine(writer->object, list1, list2, "");
        QStringList list3 = {writer->name, writer->numelements};
        QStringList list4 = {"eventNames", QString::number(eventNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < eventNames.size(); i++){
            writer->writeLine(writer->string, QStringList(), QStringList(), eventNames.at(i));
        }
        if (eventNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"attributeNames", QString::number(attributeNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < attributeNames.size(); i++){
            writer->writeLine(writer->string, QStringList(), QStringList(), attributeNames.at(i));
        }
        if (attributeNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"variableNames", QString::number(variableNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < variableNames.size(); i++){
            writer->writeLine(writer->string, QStringList(), QStringList(), variableNames.at(i));
        }
        if (variableNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"characterPropertyNames", QString::number(characterPropertyNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < characterPropertyNames.size(); i++){
            writer->writeLine(writer->string, QStringList(), QStringList(), characterPropertyNames.at(i));
        }
        if (characterPropertyNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        writer->writeLine(writer->object, false);
        setIsWritten();
        writer->writeLine("\n");
    }
    return true;
}
bool hkbHandIkDriverInfo::write(HkxXMLWriter *writer){
    std::lock_guard <std::mutex> guard(mutex);
    auto writedatafield = [&](const QString & name, const QString & value){
        writer->writeLine(writer->parameter, QStringList(writer->name), QStringList(name), value);
    };
    if (writer && !getIsWritten()){
        QStringList list1 = {writer->name, writer->clas, writer->signature};
        QStringList list2 = {getReferenceString(), getClassname(), "0x"+QString::number(getSignature(), 16)};
        writer->writeLine(writer->object, list1, list2, "");
        list1 = {writer->name, writer->numelements};
        list2 = {"hands", QString::number(hands.size())};
        writer->writeLine(writer->parameter, list1, list2, "");
        for (auto i = 0; i < hands.size(); i++){
            writer->writeLine(writer->object, true);
            writedatafield("elbowAxisLS", hands[i].elbowAxisLS.getValueAsString());
            writedatafield("backHandNormalLS", hands[i].backHandNormalLS.getValueAsString());
            writedatafield("handOffsetLS", hands[i].handOffsetLS.getValueAsString());
            writedatafield("handOrienationOffsetLS", hands[i].handOrienationOffsetLS.getValueAsString());
            writedatafield("maxElbowAngleDegrees", QString::number(hands.at(i).maxElbowAngleDegrees, char('f'), 6));
            writedatafield("minElbowAngleDegrees", QString::number(hands.at(i).minElbowAngleDegrees, char('f'), 6));
            writedatafield("shoulderIndex", QString::number(hands.at(i).shoulderIndex));
            writedatafield("shoulderSiblingIndex", QString::number(hands.at(i).shoulderSiblingIndex));
            writedatafield("elbowIndex", QString::number(hands.at(i).elbowIndex));
            writedatafield("elbowSiblingIndex", QString::number(hands.at(i).elbowSiblingIndex));
            writedatafield("wristIndex", QString::number(hands.at(i).wristIndex));
            writedatafield("enforceEndPosition", getBoolAsString(hands.at(i).enforceEndPosition));
            writedatafield("enforceEndRotation", getBoolAsString(hands.at(i).enforceEndRotation));
            writer->writeLine(writer->parameter, QStringList(writer->name), QStringList("localFrameName"), hands.at(i).localFrameName, true);
            writer->writeLine(writer->object, false);
        }
        if (hands.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        writedatafield("fadeInOutCurve", fadeInOutCurve);
        writer->writeLine(writer->object, false);
        setIsWritten();
        writer->writeLine("\n");
    }
    return true;
}
bool hkbProxyModifier::write(HkxXMLWriter *writer){
    std::lock_guard <std::mutex> guard(mutex);
    auto writedatafield = [&](const QString & name, const QString & value){
        writer->writeLine(writer->parameter, QStringList(writer->name), QStringList(name), value);
    };
    if (writer && !getIsWritten()){
        QString refString = "null";
        QStringList list1 = {writer->name, writer->clas, writer->signature};
        QStringList list2 = {getReferenceString(), getClassname(), "0x"+QString::number(getSignature(), 16)};
        writer->writeLine(writer->object, list1, list2, "");
        if (getVariableBindingSetData()){
            refString = getVariableBindingSet()->getReferenceString();
        }
        writedatafield("variableBindingSet", refString);
        writedatafield("userData", QString::number(userData));
        writedatafield("name", name);
        writedatafield("enable", getBoolAsString(enable));
        writedatafield("proxyInfo", "");
        writer->writeLine(writer->object, true);
        writedatafield("dynamicFriction", QString::number(proxyInfo.dynamicFriction, char('f'), 6));
        writedatafield("staticFriction", QString::number(proxyInfo.staticFriction, char('f'), 6));
        writedatafield("keepContactTolerance", QString::number(proxyInfo.keepContactTolerance));
        writedatafield("up", proxyInfo.up.getValueAsString());
        writedatafield("keepDistance", QString::number(proxyInfo.keepDistance, char('f'), 6));
        writedatafield("contactAngleSensitivity", QString::number(proxyInfo.contactAngleSensitivity, char('f'), 6));
        writedatafield("userPlanes", QString::number(proxyInfo.userPlanes));
        writedatafield("maxCharacterSpeedForSolver", QString::number(proxyInfo.maxCharacterSpeedForSolver, char('f'), 6));
        writedatafield("characterStrength", QString::number(proxyInfo.characterStrength, char('f'), 6));
        writedatafield("characterMass", QString::number(proxyInfo.characterMass, char('f'), 6));
        writedatafield("maxSlope", QString::number(proxyInfo.maxSlope, char('f'), 6));
        writedatafield("penetrationRecoverySpeed", QString::number(proxyInfo.penetrationRecoverySpeed, char('f'), 6));
        writedatafield("maxCastIterations", QString::number(proxyInfo.maxCastIterations));
        writedatafield("id", getBoolAsString(proxyInfo.refreshManifoldInCheckSupport));
        writer->writeLine(writer->object, false);
        writer->writeLine(writer->parameter, false);
        writedatafield("linearVelocity", linearVelocity.getValueAsString());
        writedatafield("horizontalGain", QString::number(horizontalGain, char('f'), 6));
        writedatafield("verticalGain", QString::number(verticalGain, char('f'), 6));
        writedatafield("maxHorizontalSeparation", QString::number(maxHorizontalSeparation, char('f'), 6));
        writedatafield("limitHeadingDegrees", QString::number(limitHeadingDegrees, char('f'), 6));
        writedatafield("maxVerticalSeparation", QString::number(maxVerticalSeparation, char('f'), 6));
        writedatafield("verticalDisplacementError", QString::number(verticalDisplacementError, char('f'), 6));
        writedatafield("verticalDisplacementErrorGain", QString::number(verticalDisplacementErrorGain, char('f'), 6));
        writedatafield("maxVerticalDisplacement", QString::number(maxVerticalDisplacement, char('f'), 6));
        writedatafield("minVerticalDisplacement", QString::number(minVerticalDisplacement, char('f'), 6));
        writedatafield("capsuleHeight", QString::number(capsuleHeight, char('f'), 6));
        writedatafield("capsuleRadius", QString::number(capsuleRadius, char('f'), 6));
        writedatafield("maxSlopeForRotation", QString::number(maxSlopeForRotation, char('f'), 6));
        writedatafield("collisionFilterInfo", QString::number(collisionFilterInfo));
        writedatafield("phantomType", phantomType);
        writedatafield("linearVelocityMode", linearVelocityMode);
        writedatafield("ignoreIncomingRotation", getBoolAsString(ignoreIncomingRotation));
        writedatafield("ignoreCollisionDuringRotation", getBoolAsString(ignoreCollisionDuringRotation));
        writedatafield("ignoreIncomingTranslation", getBoolAsString(ignoreIncomingTranslation));
        writedatafield("includeDownwardMomentum", getBoolAsString(includeDownwardMomentum));
        writedatafield("followWorldFromModel", getBoolAsString(followWorldFromModel));
        writedatafield("isTouchingGround", getBoolAsString(isTouchingGround));
        writer->writeLine(writer->object, false);
        setIsWritten();
        writer->writeLine("\n");
        if (getVariableBindingSetData() && !getVariableBindingSet()->write(writer)){
            LogFile::writeToLog(getParentFilename()+": "+getClassname()+": write()!\nUnable to write 'variableBindingSet'!!!");
        }
    }
    return true;
}
bool hkbCharacterStringData::write(HkxXMLWriter *writer){
    std::lock_guard <std::mutex> guard(mutex);
    auto writedatafield = [&](const QString & name, const QString & value){
        writer->writeLine(writer->parameter, QStringList(writer->name), QStringList(name), value);
    };
    if (writer && !getIsWritten()){
        QStringList list1 = {writer->name, writer->clas, writer->signature};
        QStringList list2 = {getReferenceString(), getClassname(), "0x"+QString::number(getSignature(), 16)};
        writer->writeLine(writer->object, list1, list2, "");
        QStringList list3 = {writer->name, writer->numelements};
        QStringList list4 = {"deformableSkinNames", QString::number(deformableSkinNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < deformableSkinNames.size(); i++){
            writedatafield("", deformableSkinNames.at(i));
        }
        if (deformableSkinNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"rigidSkinNames", QString::number(rigidSkinNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < rigidSkinNames.size(); i++){
            writedatafield("", rigidSkinNames.at(i));
        }
        if (rigidSkinNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"animationNames", QString::number(animationNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < animationNames.size(); i++){
            writedatafield("", QString(animationNames.at(i)).replace("/", "\\"));
        }
        if (animationNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"animationFilenames", QString::number(animationFilenames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < animationFilenames.size(); i++){
            writedatafield("", animationFilenames.at(i));
        }
        if (animationFilenames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"characterPropertyNames", QString::number(characterPropertyNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < characterPropertyNames.size(); i++){
            writedatafield("", characterPropertyNames.at(i));
        }
        if (characterPropertyNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"retargetingSkeletonMapperFilenames", QString::number(retargetingSkeletonMapperFilenames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < retargetingSkeletonMapperFilenames.size(); i++){
            writedatafield("", retargetingSkeletonMapperFilenames.at(i));
        }
        if (retargetingSkeletonMapperFilenames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"lodNames", QString::number(lodNames.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < lodNames.size(); i++){
            writedatafield("", lodNames.at(i));
        }
        if (lodNames.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"mirroredSyncPointSubstringsA", QString::number(mirroredSyncPointSubstringsA.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < mirroredSyncPointSubstringsA.size(); i++){
            writedatafield("", mirroredSyncPointSubstringsA.at(i));
        }
        if (mirroredSyncPointSubstringsA.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        list3 = {writer->name, writer->numelements};
        list4 = {"mirroredSyncPointSubstringsB", QString::number(mirroredSyncPointSubstringsB.size())};
        writer->writeLine(writer->parameter, list3, list4, "");
        for (auto i = 0; i < mirroredSyncPointSubstringsB.size(); i++){
            writedatafield("", mirroredSyncPointSubstringsB.at(i));
        }
        if (mirroredSyncPointSubstringsB.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        writedatafield("name", name);
        writedatafield("rigName", QString(rigName).replace("/", "\\"));
        writedatafield("ragdollName", QString(ragdollName).replace("/", "\\"));
        writedatafield("behaviorFilename", QString(behaviorFilename).replace("/", "\\"));
        writer->writeLine(writer->object, false);
        setIsWritten();
        writer->writeLine("\n");
    }
    return true;
}
bool hkbStateMachineTransitionInfoArray::write(HkxXMLWriter *writer){
    std::lock_guard <std::mutex> guard(mutex);
    auto writedatafield = [&](const QString & name, const QString & value){
        writer->writeLine(writer->parameter, QStringList(writer->name), QStringList(name), value);
    };
    auto writeref = [&](const HkxSharedPtr & shdptr, const QString & name){
        QString refString = "null";
        (shdptr.data()) ? refString = shdptr->getReferenceString() : NULL;
        writer->writeLine(writer->parameter, QStringList(writer->name), QStringList(name), refString);
    };
    auto writechild = [&](const HkxSharedPtr & shdptr, const QString & datafield){
        if (shdptr.data() && !shdptr->write(writer))
            LogFile::writeToLog(getParentFilename()+": "+getClassname()+": write()!\nUnable to write '"+datafield+"'!!!");
    };
    if (writer && !getIsWritten()){
        QStringList list1 = {writer->name, writer->clas, writer->signature};
        QStringList list2 = {getReferenceString(), getClassname(), "0x"+QString::number(getSignature(), 16)};
        writer->writeLine(writer->object, list1, list2, "");
        list1 = {writer->name, writer->numelements};
        list2 = {"transitions", QString::number(transitions.size())};
        writer->writeLine(writer->parameter, list1, list2, "");
        for (auto i = 0; i < transitions.size(); i++){
            writer->writeLine(writer->object, true);
            writedatafield("triggerInterval", "");
            writer->writeLine(writer->object, true);
            writedatafield("enterEventId", QString::number(transitions.at(i).triggerInterval.enterEventId));
            writedatafield("exitEventId", QString::number(transitions.at(i).triggerInterval.exitEventId));
            writedatafield("enterTime", QString::number(transitions.at(i).triggerInterval.enterTime, char('f'), 6));
            writedatafield("exitTime", QString::number(transitions.at(i).triggerInterval.exitTime, char('f'), 6));
            writer->writeLine(writer->object, false);
            writer->writeLine(writer->parameter, false);
            writedatafield("initiateInterval", "");
            writer->writeLine(writer->object, true);
            writedatafield("enterEventId", QString::number(transitions.at(i).initiateInterval.enterEventId));
            writedatafield("exitEventId", QString::number(transitions.at(i).initiateInterval.exitEventId));
            writedatafield("enterTime", QString::number(transitions.at(i).initiateInterval.enterTime, char('f'), 6));
            writedatafield("exitTime", QString::number(transitions.at(i).initiateInterval.exitTime, char('f'), 6));
            writer->writeLine(writer->object, false);
            writer->writeLine(writer->parameter, false);
            writeref(transitions.at(i).transition, "transition");
            writeref(transitions.at(i).condition, "condition");
            writedatafield("eventId", QString::number(transitions.at(i).eventId));
            writedatafield("toStateId", QString::number(transitions.at(i).toStateId));
            writedatafield("fromNestedStateId", QString::number(transitions.at(i).fromNestedStateId));
            writedatafield("toNestedStateId", QString::number(transitions.at(i).toNestedStateId));
            writedatafield("priority", QString::number(transitions.at(i).priority));
            writedatafield("flags", transitions.at(i).flags);
            writer->writeLine(writer->object, false);
        }
        if (transitions.size() > 0){
            writer->writeLine(writer->parameter, false);
        }
        writer->writeLine(writer->object, false);
        setIsWritten();
        writer->writeLine("\n");
        for (auto i = 0; i < transitions.size(); i++){
            writechild(transitions.at(i).transition, "transitions.at("+QString::number(i)+").transition");
            writechild(transitions.at(i).condition, "transitions.at("+QString::number(i)+").condition");
        }
    }
    return true;
}