155 lines
5.2 KiB
C++
155 lines
5.2 KiB
C++
/*
|
|
* Copyright (c) <2021> Side Effects Software Inc.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2. The name of Side Effects Software may not be used to endorse or
|
|
* promote products derived from this software without specific prior
|
|
* written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE "AS IS" AND ANY EXPRESS
|
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
|
* NO EVENT SHALL SIDE EFFECTS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include "HoudiniParameterMultiParm.h"
|
|
|
|
UHoudiniParameterMultiParm::UHoudiniParameterMultiParm(const FObjectInitializer & ObjectInitializer)
|
|
: Super(ObjectInitializer), bIsShown(false), InstanceStartOffset(0)
|
|
{
|
|
// TODO Proper Init
|
|
ParmType = EHoudiniParameterType::MultiParm;
|
|
}
|
|
|
|
UHoudiniParameterMultiParm *
|
|
UHoudiniParameterMultiParm::Create(
|
|
UObject* InOuter,
|
|
const FString& InParamName)
|
|
{
|
|
FString ParamNameStr = "HoudiniParameterMultiParm_" + InParamName;
|
|
FName ParamName = MakeUniqueObjectName(InOuter, UHoudiniParameterMultiParm::StaticClass(), *ParamNameStr);
|
|
|
|
// We need to create a new parameter
|
|
UHoudiniParameterMultiParm * HoudiniAssetParameter = NewObject< UHoudiniParameterMultiParm >(
|
|
InOuter, UHoudiniParameterMultiParm::StaticClass(), ParamName, RF_Public | RF_Transactional);
|
|
|
|
HoudiniAssetParameter->SetParameterType(EHoudiniParameterType::MultiParm);
|
|
//HoudiniAssetParameter->UpdateFromParmInfo(InParentParameter, InNodeId, ParmInfo);
|
|
|
|
HoudiniAssetParameter->DefaultInstanceCount = -1;
|
|
|
|
return HoudiniAssetParameter;
|
|
}
|
|
|
|
bool
|
|
UHoudiniParameterMultiParm::SetValue(const int32& InValue)
|
|
{
|
|
if (InValue == Value)
|
|
return false;
|
|
|
|
Value = InValue;
|
|
|
|
return true;
|
|
}
|
|
|
|
void
|
|
UHoudiniParameterMultiParm::InsertElement()
|
|
{
|
|
if (MultiParmInstanceCount > 0 && MultiParmInstanceLastModifyArray.Num() == 0)
|
|
InitializeModifyArray();
|
|
|
|
MultiParmInstanceLastModifyArray.Add(EHoudiniMultiParmModificationType::Inserted);
|
|
}
|
|
|
|
void
|
|
UHoudiniParameterMultiParm::InsertElementAt(int32 Index)
|
|
{
|
|
if (MultiParmInstanceCount > 0 && MultiParmInstanceLastModifyArray.Num() == 0)
|
|
InitializeModifyArray();
|
|
|
|
if (Index >= MultiParmInstanceLastModifyArray.Num())
|
|
MultiParmInstanceLastModifyArray.Add(EHoudiniMultiParmModificationType::Inserted);
|
|
else
|
|
MultiParmInstanceLastModifyArray.Insert(EHoudiniMultiParmModificationType::Inserted, Index);
|
|
}
|
|
|
|
/** Decrement value, used by Slate. **/
|
|
void
|
|
UHoudiniParameterMultiParm::RemoveElement(int32 Index)
|
|
{
|
|
if (MultiParmInstanceCount > 0 && MultiParmInstanceLastModifyArray.Num() == 0)
|
|
InitializeModifyArray();
|
|
|
|
// Remove the last element
|
|
if (Index == -1)
|
|
{
|
|
Index = MultiParmInstanceLastModifyArray.Num() - 1;
|
|
while (MultiParmInstanceLastModifyArray.IsValidIndex(Index) && MultiParmInstanceLastModifyArray[Index] == EHoudiniMultiParmModificationType::Removed)
|
|
Index -= 1;
|
|
}
|
|
|
|
if (MultiParmInstanceLastModifyArray.IsValidIndex(Index))
|
|
{
|
|
// If the removed is a to be inserted instance, simply remove it.
|
|
if (MultiParmInstanceLastModifyArray[Index] == EHoudiniMultiParmModificationType::Inserted)
|
|
MultiParmInstanceLastModifyArray.RemoveAt(Index);
|
|
// Otherwise mark it as to be removed.
|
|
else
|
|
MultiParmInstanceLastModifyArray[Index] = EHoudiniMultiParmModificationType::Removed;
|
|
}
|
|
}
|
|
|
|
void
|
|
UHoudiniParameterMultiParm::EmptyElements()
|
|
{
|
|
if (MultiParmInstanceCount > 0 && MultiParmInstanceLastModifyArray.Num() == 0)
|
|
InitializeModifyArray();
|
|
|
|
for (int32 Index = MultiParmInstanceLastModifyArray.Num() - 1; Index >= 0; --Index)
|
|
{
|
|
// If the removed is a to be inserted instance, simply remove it.
|
|
// Interation starts from the tail, so that the indices won't be changed by element removal.
|
|
if (MultiParmInstanceLastModifyArray[Index] == EHoudiniMultiParmModificationType::Inserted)
|
|
MultiParmInstanceLastModifyArray.RemoveAt(Index);
|
|
else // Otherwise mark it as to be removed.
|
|
MultiParmInstanceLastModifyArray[Index] = EHoudiniMultiParmModificationType::Removed;
|
|
}
|
|
}
|
|
|
|
void
|
|
UHoudiniParameterMultiParm::InitializeModifyArray()
|
|
{
|
|
for (uint32 Index = 0; Index < MultiParmInstanceCount; ++Index)
|
|
{
|
|
MultiParmInstanceLastModifyArray.Add(EHoudiniMultiParmModificationType::None);
|
|
}
|
|
}
|
|
|
|
bool
|
|
UHoudiniParameterMultiParm::IsDefault() const
|
|
{
|
|
//UE_LOG(LogTemp, Warning, TEXT("%d, %d"), MultiParmInstanceNum, MultiParmInstanceCount);
|
|
return DefaultInstanceCount == MultiParmInstanceCount;
|
|
}
|
|
|
|
void
|
|
UHoudiniParameterMultiParm::SetDefaultInstanceCount(int32 InCount)
|
|
{
|
|
if (DefaultInstanceCount >= 0)
|
|
return;
|
|
|
|
DefaultInstanceCount = InCount;
|
|
}
|