安定版ではないため恐縮ですが、Houdini Engine For Unreal 18.5.606で恐らく意図的ではない と思われるコードを見つけましたのでご報告になります。
18.5.567に追加されたhapiのSetParamaterTuplesの処理に関してです。
まず、
HoudiniEngine\Source\HoudiniEngineEditor\Private\HoudiniPublicAPIAssetWrapper.cpp
の
UHoudiniPublicAPIAssetWrapper::SetParameterTuples_Implementationの実装を見てみると以下のようになっています。
とりあえずbool値の設定部分を見てみます。
bool UHoudiniPublicAPIAssetWrapper::SetParameterTuples_Implementation(const TMap<FName, FHoudiniParameterTuple>& InParameterTuples) { UHoudiniAssetComponent* HAC = nullptr; if (!GetValidHoudiniAssetComponentWithError(HAC)) return false; bool bSuccess = true; for (const TPair<FName, FHoudiniParameterTuple>& Entry : InParameterTuples) { const FName& ParameterTupleName = Entry.Key; const FHoudiniParameterTuple& ParameterTuple = Entry.Value; if (ParameterTuple.BoolValues.Num() > 0) { // Set as bool const int32 TupleSize = ParameterTuple.BoolValues.Num(); for (int32 TupleIndex = 0; TupleIndex < TupleSize; ++TupleIndex) { if (!SetBoolParameterValue(ParameterTupleName, ParameterTuple.BoolValues[TupleIndex], TupleIndex)) { SetErrorMessage(FString::Printf( TEXT("SetParameterTuples: Failed to set %s as a bool at tuple index %d."), *ParameterTupleName.ToString(), TupleIndex)); bSuccess = false; break; } } }
となっており、
if (!SetBoolParameterValue(ParameterTupleName, ParameterTuple.BoolValues, TupleIndex))
{
の内側のスコープでbreakを行っています。
つまり配列の先頭であってもSetBoolParameterValueが偽であった場合には後続のパラメーターは無視されてしまいます。
これは恐らく不正な値であった事を想定していると思うのですが、SetBoolParameterValueでは【値が更新されたかどうか】を返しているようです。
つまり配列の先頭が更新不要であったケースでも後続のパラメーターも無視するような作りになってしまっているようです。
実際にSetBoolParameterValue関数を見てみると
bool UHoudiniPublicAPIAssetWrapper::SetBoolParameterValue_Implementation(FName InParameterTupleName, bool InValue, int32 InAtIndex, bool bInMarkChanged) { UHoudiniParameter* Param = FindValidParameterByName(InParameterTupleName); if (!Param) return false; // Handle all the cases where the underlying parameter value is an int or bool const EHoudiniParameterType ParamType = Param->GetParameterType(); bool bDidChangeValue = false; if (ParamType == EHoudiniParameterType::Toggle) { UHoudiniParameterToggle* ToggleParam = Cast<UHoudiniParameterToggle>(Param); if (!IsValid(ToggleParam)) { SetErrorMessage(FString::Printf( TEXT("Unexpected parameter class (%s) vs type (%d)"), *Param->GetClass()->GetName(), ParamType)); return false; } bDidChangeValue = ToggleParam->SetValueAt(InValue, InAtIndex); } else if (ParamType == EHoudiniParameterType::Folder) { UHoudiniParameterFolder* FolderParam = Cast<UHoudiniParameterFolder>(Param); if (!IsValid(FolderParam)) { SetErrorMessage(FString::Printf( TEXT("Unexpected parameter class (%s) vs type (%d)"), *Param->GetClass()->GetName(), ParamType)); return false; } if (FolderParam->IsChosen() != InValue) { FolderParam->SetChosen(InValue); bDidChangeValue = true; } } if (bDidChangeValue && bInMarkChanged) Param->MarkChanged(true); return bDidChangeValue; }
恐らくはここは関数の最後まで来た場合にはtrueを返すのが正しいのではないかと思います。
というのもfalseを明示のは不正値のケースな場合であるようだからです。
他のSetIntParameterValue_Implementationなどに関しても同様です。
実際PDGを使ったテストを試みたところ配列を設定する場合に先頭の値が一致していると後続の設定を行いたいパラメーターが無視されている事を確認しております。
お手数お掛け致しますがご確認いただけますでしょうか?