/** * Since we don't care about blending, we just change this decoration to OutCurves * @TODO : Fix this if we're saving vectorcurves and blending */ void FRawCurveTracks::EvaluateTransformCurveData(USkeleton * Skeleton, TMap<FName, FTransform>&OutCurves, float CurrentTime, float BlendWeight) const { check (Skeleton); // evaluate the curve data at the CurrentTime and add to Instance for(auto CurveIter = TransformCurves.CreateConstIterator(); CurveIter; ++CurveIter) { const FTransformCurve& Curve = *CurveIter; // if disabled, do not handle if (Curve.GetCurveTypeFlag(ACF_Disabled)) { continue; } FSmartNameMapping* NameMapping = Skeleton->SmartNames.GetContainer(USkeleton::AnimTrackCurveMappingName); // Add or retrieve curve FName CurveName; // make sure it was added if (ensure (NameMapping->GetName(Curve.CurveUid, CurveName))) { // note we're not checking Curve.GetCurveTypeFlags() yet FTransform & Value = OutCurves.FindOrAdd(CurveName); Value = Curve.Evaluate(CurrentTime, BlendWeight); } } }
void UAnimPreviewInstance::RefreshCurveBoneControllers() { // go through all curves and see if it has Transform Curve // if so, find what bone that belong to and create BoneMOdifier for them UAnimSequence* CurrentSequence = Cast<UAnimSequence>(CurrentAsset); CurveBoneControllers.Empty(); // do not apply if BakedAnimation is on if(CurrentSequence) { // make sure if this needs source update if ( !CurrentSequence->DoesContainTransformCurves() ) { return; } RequiredBones.SetUseSourceData(true); TArray<FTransformCurve>& Curves = CurrentSequence->RawCurveData.TransformCurves; FSmartNameMapping* NameMapping = CurrentSkeleton->SmartNames.GetContainer(USkeleton::AnimTrackCurveMappingName); for (auto& Curve : Curves) { // skip if disabled if (Curve.GetCurveTypeFlag(ACF_Disabled)) { continue; } // add bone modifier FName CurveName; NameMapping->GetName(Curve.CurveUid, CurveName); // @TODO: this is going to be issue. If they don't save skeleton with it, we don't have name at all? if (CurveName == NAME_None) { FSmartNameMapping::UID NewUID; NameMapping->AddOrFindName(Curve.LastObservedName, NewUID); Curve.CurveUid = NewUID; CurveName = Curve.LastObservedName; } FName BoneName = CurveName; if (BoneName != NAME_None && CurrentSkeleton->GetReferenceSkeleton().FindBoneIndex(BoneName) != INDEX_NONE) { ModifyBone(BoneName, true); } } } }
bool USkeleton::RenameSmartnameAndModify(FName ContainerName, FSmartNameMapping::UID Uid, FName NewName) { bool Successful = false; FSmartNameMapping* RequestedMapping = SmartNames.GetContainer(ContainerName); if(RequestedMapping) { FName CurrentName; RequestedMapping->GetName(Uid, CurrentName); if(CurrentName != NewName) { Modify(); Successful = RequestedMapping->Rename(Uid, NewName); } } return Successful; }
/** Called to get the name of a curve back from the animation skeleton */ virtual FText GetCurveName(USkeleton::AnimCurveUID Uid) const { if(BaseSequence.IsValid()) { FSmartNameMapping* NameMapping = BaseSequence.Get()->GetSkeleton()->SmartNames.GetContainer(USkeleton::AnimCurveMappingName); if(NameMapping) { FName CurveName; if(NameMapping->GetName(Uid, CurveName)) { return FText::FromName(CurveName); } } } return FText::GetEmpty(); }
/** Called to get the name of a curve back from the animation skeleton */ virtual FText GetCurveName(USkeleton::AnimCurveUID Uid) const { if(BaseSequence.IsValid()) { FSmartNameMapping* NameMapping = BaseSequence.Get()->GetSkeleton()->SmartNames.GetContainer(USkeleton::AnimTrackCurveMappingName); if(NameMapping) { FName CurveName; if(NameMapping->GetName(Uid, CurveName)) { FName DisplayName = CurveName; return FText::FromString(FString::Printf(TEXT("%s(%c)"), *DisplayName.ToString(), GetCurveTypeCharacter())); } } } return FText::GetEmpty(); }