Houdini Engine For Unreal 18.5.606の不具合と思われるコード

   2031   2   0
User Avatar
Member
7 posts
Joined: Jan. 2021
Offline
お世話になっております。
 
安定版ではないため恐縮ですが、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を使ったテストを試みたところ配列を設定する場合に先頭の値が一致していると後続の設定を行いたいパラメーターが無視されている事を確認しております。
お手数お掛け致しますがご確認いただけますでしょうか?
Edited by yuu_kajii - June 13, 2021 10:43:36
User Avatar
Staff
195 posts
Joined: April 2015
Offline
ご報告有難うございました。こちらは 114062 として登録いたしました。担当開発者の検証までお待ちください。
User Avatar
Staff
195 posts
Joined: April 2015
Offline
こちらの問題はプロダクションビルド 18.5.633 で修正されておりますので、お時間ございましたら、ご確認ください。
  • Quick Links