本文整理汇总了C++中FRichCurve类的典型用法代码示例。如果您正苦于以下问题:C++ FRichCurve类的具体用法?C++ FRichCurve怎么用?C++ FRichCurve使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了FRichCurve类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetCurves
TArray<FString> UCurveBase::CreateCurveFromCSVString(const FString& InString)
{
// Array used to store problems about curve import
TArray<FString> OutProblems;
TArray<FRichCurveEditInfo> Curves = GetCurves();
const int32 NumCurves = Curves.Num();
const FCsvParser Parser(InString);
const FCsvParser::FRows& Rows = Parser.GetRows();
if(Rows.Num() == 0)
{
OutProblems.Add(FString(TEXT("No data.")));
return OutProblems;
}
// First clear out old data.
ResetCurve();
// Each row represents a point
for(int32 RowIdx=0; RowIdx<Rows.Num(); RowIdx++)
{
const TArray<const TCHAR*>& Cells = Rows[RowIdx];
const int32 NumCells = Cells.Num();
// Need at least two cell, Time and one Value
if(NumCells < 2)
{
OutProblems.Add(FString::Printf(TEXT("Row '%d' has less than 2 cells."), RowIdx));
continue;
}
float Time = FCString::Atof(Cells[0]);
for(int32 CellIdx=1; CellIdx<NumCells && CellIdx<(NumCurves+1); CellIdx++)
{
FRichCurve* Curve = Curves[CellIdx-1].CurveToEdit;
if(Curve != NULL)
{
FKeyHandle KeyHandle = Curve->AddKey(Time, FCString::Atof(Cells[CellIdx]));
Curve->SetKeyInterpMode(KeyHandle, RCIM_Linear);
}
}
// If we get more cells than curves (+1 for time cell)
if(NumCells > (NumCurves + 1))
{
OutProblems.Add(FString::Printf(TEXT("Row '%d' has too many cells for the curve(s)."), RowIdx));
}
// If we got too few cells
else if(NumCells < (NumCurves + 1))
{
OutProblems.Add(FString::Printf(TEXT("Row '%d' has too few cells for the curve(s)."), RowIdx));
}
}
Modify(true);
return OutProblems;
}
示例2: ImportCurvesEmbeddedInSoundWave
bool ImportCurvesEmbeddedInSoundWave()
{
// find/create our sound wave
USoundWave* const SoundWave = ImportSoundWave(TargetPackageName, TargetAssetName, WaveFile);
if (SoundWave)
{
// create our curve table internal to the sound wave
static const FName InternalCurveTableName("InternalCurveTable");
SoundWave->Curves = NewObject<UCurveTable>(SoundWave, InternalCurveTableName);
SoundWave->Curves->ClearFlags(RF_Public | RF_Standalone);
SoundWave->Curves->SetFlags(SoundWave->Curves->GetFlags() | RF_Transactional);
SoundWave->InternalCurves = SoundWave->Curves;
// import curves from FBX
float PreRollTime = 0.0f;
if (FbxAnimUtils::ImportCurveTableFromNode(FbxFile, GetDefault<UFacialAnimationBulkImporterSettings>()->CurveNodeName, SoundWave->Curves, PreRollTime))
{
// we will need to add a curve to tell us the time we want to start playing audio
FRichCurve* AudioCurve = SoundWave->Curves->RowMap.Add(TEXT("Audio"), new FRichCurve());
AudioCurve->AddKey(PreRollTime, 1.0f);
return true;
}
}
return false;
}
示例3: SetOrAddKey
void FMatineeImportTools::SetOrAddKey( FRichCurve& Curve, float Time, float Value, float ArriveTangent, float LeaveTangent, EInterpCurveMode MatineeInterpMode )
{
FKeyHandle KeyHandle = Curve.AddKey( Time, Value, false, Curve.FindKey( Time ) );
FRichCurveKey& Key = Curve.GetKey( KeyHandle );
Key.ArriveTangent = ArriveTangent;
Key.LeaveTangent = LeaveTangent;
Key.InterpMode = MatineeInterpolationToRichCurveInterpolation( MatineeInterpMode );
Key.TangentMode = MatineeInterpolationToRichCurveTangent( MatineeInterpMode );
}
示例4: SCOPE_CYCLE_COUNTER
float FCurveTableRowHandle::Eval(float XValue) const
{
SCOPE_CYCLE_COUNTER(STAT_CurveTableRowHandleEval);
FRichCurve* Curve = GetCurve();
if(Curve != NULL)
{
return Curve->Eval(XValue);
}
return 0;
}
示例5: AddStopTrans
FGradientStopMark SColorGradientEditor::AddStop( const FVector2D& Position, const FGeometry& MyGeometry, bool bColorStop )
{
FScopedTransaction AddStopTrans( LOCTEXT("AddGradientStop", "Add Gradient Stop") );
CurveOwner->ModifyOwner();
FTrackScaleInfo ScaleInfo(ViewMinInput.Get(), ViewMaxInput.Get(), 0.0f, 1.0f, MyGeometry.Size);
FVector2D LocalPos = MyGeometry.AbsoluteToLocal( Position );
float NewStopTime = ScaleInfo.LocalXToInput( LocalPos.X );
TArray<FRichCurveEditInfo> Curves = CurveOwner->GetCurves();
FGradientStopMark NewStop;
NewStop.Time = NewStopTime;
if( bColorStop )
{
FRichCurve* RedCurve = Curves[0].CurveToEdit;
FRichCurve* GreenCurve = Curves[1].CurveToEdit;
FRichCurve* BlueCurve = Curves[2].CurveToEdit;
NewStop.RedKeyHandle = RedCurve->AddKey( NewStopTime, LastModifiedColor.R );
NewStop.GreenKeyHandle = GreenCurve->AddKey( NewStopTime, LastModifiedColor.G );
NewStop.BlueKeyHandle = BlueCurve->AddKey( NewStopTime, LastModifiedColor.B );
}
else
{
FRichCurve* AlphaCurve = Curves[3].CurveToEdit;
NewStop.AlphaKeyHandle = AlphaCurve->AddKey( NewStopTime, LastModifiedColor.A );
}
return NewStop;
}
示例6: SetCurveDefault
void UMovieSceneSection::SetCurveDefault(FRichCurve& InCurve, float Value)
{
if (TryModify())
{
InCurve.SetDefaultValue(Value);
}
}
示例7: AddKeyToCurve
void UMovieSceneSection::AddKeyToCurve(FRichCurve& InCurve, float Time, float Value, EMovieSceneKeyInterpolation Interpolation, const bool bUnwindRotation)
{
if (IsTimeWithinSection(Time))
{
if (TryModify())
{
FKeyHandle ExistingKeyHandle = InCurve.FindKey(Time);
FKeyHandle NewKeyHandle = InCurve.UpdateOrAddKey(Time, Value, bUnwindRotation);
if (!InCurve.IsKeyHandleValid(ExistingKeyHandle) && InCurve.IsKeyHandleValid(NewKeyHandle))
{
MovieSceneHelpers::SetKeyInterpolation(InCurve, NewKeyHandle, Interpolation);
}
}
}
}
示例8: AddKeyToCurve
void UMovieSceneSection::AddKeyToCurve( FRichCurve& InCurve, float Time, float Value )
{
if(IsTimeWithinSection(Time))
{
Modify();
InCurve.UpdateOrAddKey(Time, Value);
}
}
示例9: AddScalarParameterKey
void UMovieSceneParameterSection::AddScalarParameterKey( FName InParameterName, float InTime, float InValue )
{
FRichCurve* ExistingCurve = nullptr;
for ( FScalarParameterNameAndCurve& ScalarParameterNameAndCurve : ScalarParameterNamesAndCurves )
{
if ( ScalarParameterNameAndCurve.ParameterName == InParameterName )
{
ExistingCurve = &ScalarParameterNameAndCurve.ParameterCurve;
break;
}
}
if ( ExistingCurve == nullptr )
{
int32 NewIndex = ScalarParameterNamesAndCurves.Add( FScalarParameterNameAndCurve( InParameterName ) );
ScalarParameterNamesAndCurves[NewIndex].Index = ScalarParameterNamesAndCurves.Num() + VectorParameterNamesAndCurves.Num() - 1;
ExistingCurve = &ScalarParameterNamesAndCurves[NewIndex].ParameterCurve;
}
ExistingCurve->AddKey(InTime, InValue);
}
示例10: BP_Explode
void AProjectile::Explode()
{
BP_Explode();
const FVector Loc = GetActorLocation();
for (TActorIterator<AActor> aItr(GetWorld()); aItr; ++aItr)
{
const float distance = GetDistanceTo(*aItr);
if (distance<AffectArea && aItr && aItr->GetRootComponent() && aItr->GetRootComponent()->Mobility == EComponentMobility::Movable)
{
FVector dir = aItr->GetActorLocation() - Loc;
dir.Normalize();
FRichCurve* RadialDamageCurveData = RadialDamageCurve.GetRichCurve();
FRichCurve* RadialImpulseCurveData = RadialImpulseCurve.GetRichCurve();
ABaseCharacter* theChar = Cast<ABaseCharacter>(*aItr);
//If Player apply damage
if (theChar && RadialDamageCurveData)
{
//printr("Apply Damage");
UGameplayStatics::ApplyDamage(theChar, RadialDamageCurveData->Eval(distance), NULL, this, ExplosionDamageType);
}
if (RadialImpulseCurveData && aItr->GetRootComponent()->IsSimulatingPhysics() && Cast<UPrimitiveComponent>(aItr->GetRootComponent()))
{
Cast<UPrimitiveComponent>(aItr->GetRootComponent())->AddImpulse(dir*RadialImpulseCurveData->Eval(distance));
}
}
}
Destroy();
}
示例11: Super
AProjectile::AProjectile(const class FObjectInitializer& PCIP)
: Super(PCIP)
{
//RootPoint = PCIP.CreateDefaultSubobject<USceneComponent>(this, TEXT("RootPoint"));
// The Collision Component
CollisionComp = PCIP.CreateDefaultSubobject<USphereComponent>(this, TEXT("SphereComp"));
CollisionComp->MoveIgnoreActors.Add(this);
CollisionComp->InitSphereRadius(5.0f);
CollisionComp->BodyInstance.SetCollisionProfileName("Projectile");
CollisionComp->OnComponentHit.AddDynamic(this, &AProjectile::OnHit);
RootComponent = CollisionComp;
Mesh = PCIP.CreateDefaultSubobject<UStaticMeshComponent>(this, TEXT("ProjectileMesh"));
Mesh->bReceivesDecals = false;
Mesh->CastShadow = false;
Mesh->AttachParent = CollisionComp;
// Projectile Movement
ProjectileMovement = PCIP.CreateDefaultSubobject<UProjectileMovementComponent>(this, TEXT("ProjectileComp"));
ProjectileMovement->UpdatedComponent = CollisionComp;
ProjectileMovement->InitialSpeed = 3000.f;
ProjectileMovement->MaxSpeed = 3000.f;
ProjectileMovement->bRotationFollowsVelocity = true;
ProjectileMovement->bShouldBounce = true;
bReplicates = true;
FRichCurve* RadialDamageCurveData = RadialDamageCurve.GetRichCurve();
RadialDamageCurveData->AddKey(0, 90);
RadialDamageCurveData->AddKey(380, 40);
RadialDamageCurveData->AddKey(900, 0);
FRichCurve* RadialImpulseCurveData = RadialImpulseCurve.GetRichCurve();
RadialImpulseCurveData->AddKey(0, 15000);
RadialImpulseCurveData->AddKey(900, 9000);
}
示例12: if
void FGradientStopMark::SetColor( const FLinearColor& InColor, FCurveOwnerInterface& CurveOwner )
{
TArray<FRichCurveEditInfo> Curves = CurveOwner.GetCurves();
// Update the color component on each curve
if( IsValidColorMark(Curves) )
{
FRichCurve* RedCurve = Curves[0].CurveToEdit;
FRichCurve* GreenCurve = Curves[1].CurveToEdit;
FRichCurve* BlueCurve = Curves[2].CurveToEdit;
RedCurve->SetKeyValue( RedKeyHandle, InColor.R );
GreenCurve->SetKeyValue( GreenKeyHandle, InColor.G );
BlueCurve->SetKeyValue( BlueKeyHandle, InColor.B );
}
else if( IsValidAlphaMark(Curves) )
{
FRichCurve* AlphaCurve = Curves[3].CurveToEdit;
AlphaCurve->SetKeyValue( AlphaKeyHandle, InColor.A );
}
}
示例13: DeleteStopTrans
void SColorGradientEditor::DeleteStop( const FGradientStopMark& InMark )
{
FScopedTransaction DeleteStopTrans( LOCTEXT("DeleteGradientStop", "Delete Gradient Stop") );
CurveOwner->ModifyOwner();
TArray<FRichCurveEditInfo> Curves = CurveOwner->GetCurves();
FRichCurve* RedCurve = Curves[0].CurveToEdit;
FRichCurve* GreenCurve = Curves[1].CurveToEdit;
FRichCurve* BlueCurve = Curves[2].CurveToEdit;
FRichCurve* AlphaCurve = Curves[3].CurveToEdit;
if( InMark.IsValidAlphaMark( Curves ) )
{
AlphaCurve->DeleteKey( InMark.AlphaKeyHandle );
}
else if( InMark.IsValidColorMark( Curves ) )
{
RedCurve->DeleteKey( InMark.RedKeyHandle );
GreenCurve->DeleteKey( InMark.GreenKeyHandle );
BlueCurve->DeleteKey( InMark.BlueKeyHandle );
}
}
示例14: Parser
TArray<FString> UCurveTable::CreateTableFromCSVString(const FString& InString, ERichCurveInterpMode InterpMode)
{
// Array used to store problems about table creation
TArray<FString> OutProblems;
const FCsvParser Parser(InString);
const FCsvParser::FRows& Rows = Parser.GetRows();
// Must have at least 2 rows (x values + y values for at least one row)
if(Rows.Num() <= 1)
{
OutProblems.Add(FString(TEXT("Too few rows.")));
return OutProblems;
}
// Empty existing data
EmptyTable();
TArray<float> XValues;
GetCurveValues(Rows[0], &XValues);
// Iterate over rows
for(int32 RowIdx = 1; RowIdx < Rows.Num(); RowIdx++)
{
const TArray<const TCHAR*>& Row = Rows[RowIdx];
// Need at least 1 cells (row name)
if(Row.Num() < 1)
{
OutProblems.Add(FString::Printf(TEXT("Row '%d' has too few cells."), RowIdx));
continue;
}
// Get row name
FName RowName = MakeValidName(Row[0]);
// Check its not 'none'
if(RowName == NAME_None)
{
OutProblems.Add(FString::Printf(TEXT("Row '%d' missing a name."), RowIdx));
continue;
}
// Check its not a duplicate
if(RowMap.Find(RowName) != NULL)
{
OutProblems.Add(FString::Printf(TEXT("Duplicate row name '%s'."), *RowName.ToString()));
continue;
}
TArray<float> YValues;
GetCurveValues(Row, &YValues);
if(XValues.Num() != YValues.Num())
{
OutProblems.Add(FString::Printf(TEXT("Row '%s' does not have the right number of columns."), *RowName.ToString()));
continue;
}
FRichCurve* NewCurve = new FRichCurve();
// Now iterate over cells (skipping first cell, that was row name)
for(int32 ColumnIdx = 0; ColumnIdx < XValues.Num(); ColumnIdx++)
{
FKeyHandle KeyHandle = NewCurve->AddKey(XValues[ColumnIdx], YValues[ColumnIdx]);
NewCurve->SetKeyInterpMode(KeyHandle, InterpMode);
}
RowMap.Add(RowName, NewCurve);
}
Modify(true);
return OutProblems;
}
示例15: EmptyTable
TArray<FString> UCurveTable::CreateTableFromJSONString(const FString& InString, ERichCurveInterpMode InterpMode)
{
// Array used to store problems about table creation
TArray<FString> OutProblems;
if (InString.IsEmpty())
{
OutProblems.Add(TEXT("Input data is empty."));
return OutProblems;
}
TArray< TSharedPtr<FJsonValue> > ParsedTableRows;
{
const TSharedRef< TJsonReader<TCHAR> > JsonReader = TJsonReaderFactory<TCHAR>::Create(InString);
if (!FJsonSerializer::Deserialize(JsonReader, ParsedTableRows) || ParsedTableRows.Num() == 0)
{
OutProblems.Add(FString::Printf(TEXT("Failed to parse the JSON data. Error: %s"), *JsonReader->GetErrorMessage()));
return OutProblems;
}
}
// Empty existing data
EmptyTable();
// Iterate over rows
for (int32 RowIdx = 0; RowIdx < ParsedTableRows.Num(); ++RowIdx)
{
const TSharedPtr<FJsonValue>& ParsedTableRowValue = ParsedTableRows[RowIdx];
TSharedPtr<FJsonObject> ParsedTableRowObject = ParsedTableRowValue->AsObject();
if (!ParsedTableRowObject.IsValid())
{
OutProblems.Add(FString::Printf(TEXT("Row '%d' is not a valid JSON object."), RowIdx));
continue;
}
// Get row name
static const FString RowNameJsonKey = TEXT("Name");
const FName RowName = MakeValidName(ParsedTableRowObject->GetStringField(RowNameJsonKey));
// Check its not 'none'
if (RowName == NAME_None)
{
OutProblems.Add(FString::Printf(TEXT("Row '%d' missing a name."), RowIdx));
continue;
}
// Check its not a duplicate
if (RowMap.Find(RowName) != NULL)
{
OutProblems.Add(FString::Printf(TEXT("Duplicate row name '%s'."), *RowName.ToString()));
continue;
}
// Add a key for each entry in this row
FRichCurve* NewCurve = new FRichCurve();
for (const auto& ParsedTableRowEntry : ParsedTableRowObject->Values)
{
// Skip the name entry
if (ParsedTableRowEntry.Key == RowNameJsonKey)
{
continue;
}
// Make sure we have a valid float key
float EntryKey = 0.0f;
if (!LexicalConversion::TryParseString(EntryKey, *ParsedTableRowEntry.Key))
{
OutProblems.Add(FString::Printf(TEXT("Key '%s' on row '%s' is not a float and cannot be parsed."), *ParsedTableRowEntry.Key, *RowName.ToString()));
continue;
}
// Make sure we have a valid float value
double EntryValue = 0.0;
if (!ParsedTableRowEntry.Value->TryGetNumber(EntryValue))
{
OutProblems.Add(FString::Printf(TEXT("Entry '%s' on row '%s' is not a float and cannot be parsed."), *ParsedTableRowEntry.Key, *RowName.ToString()));
continue;
}
FKeyHandle KeyHandle = NewCurve->AddKey(EntryKey, static_cast<float>(EntryValue));
NewCurve->SetKeyInterpMode(KeyHandle, InterpMode);
}
RowMap.Add(RowName, NewCurve);
}
Modify(true);
return OutProblems;
}