本文整理汇总了C++中TMap::Contains方法的典型用法代码示例。如果您正苦于以下问题:C++ TMap::Contains方法的具体用法?C++ TMap::Contains怎么用?C++ TMap::Contains使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TMap
的用法示例。
在下文中一共展示了TMap::Contains方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: IsLevelLocked
/**
* Returns true if the specified level is locked for edit, false otherwise.
*
* @param Level The level to query.
* @return true if the level is locked, false otherwise.
*/
bool FLevelUtils::IsLevelLocked(ULevel* Level)
{
//We should not check file status on disk if we are not running the editor
#if WITH_EDITOR
// Don't permit spawning in read only levels if they are locked
if ( GIsEditor && !GIsEditorLoadingPackage )
{
if ( GEngine && GEngine->bLockReadOnlyLevels )
{
if (!LevelReadOnlyCache.Contains(Level))
{
LevelReadOnlyCache.Add(Level, FLevelReadOnlyData());
}
check(LevelReadOnlyCache.Contains(Level));
FLevelReadOnlyData &LevelData = LevelReadOnlyCache[Level];
//Make sure we test if the level file on disk is readonly only once a frame,
//when the frame time get updated.
if (LevelData.LastUpdateTime < Level->OwningWorld->GetRealTimeSeconds())
{
LevelData.LastUpdateTime = Level->OwningWorld->GetRealTimeSeconds();
//If we dont find package we dont consider it as readonly
LevelData.IsReadOnly = false;
const UPackage* pPackage = Cast<UPackage>(Level->GetOutermost());
if (pPackage)
{
FString PackageFileName;
if (FPackageName::DoesPackageExist(pPackage->GetName(), NULL, &PackageFileName))
{
LevelData.IsReadOnly = IFileManager::Get().IsReadOnly(*PackageFileName);
}
}
}
if (LevelData.IsReadOnly)
{
return true;
}
}
}
#endif //#if WITH_EDITOR
// PIE levels, the persistent level, and transient move levels are usually never locked.
if ( Level->RootPackageHasAnyFlags(PKG_PlayInEditor) || Level->IsPersistentLevel() || Level->GetName() == TEXT("TransLevelMoveBuffer") )
{
return false;
}
ULevelStreaming* StreamingLevel = FindStreamingLevel( Level );
if ( StreamingLevel != NULL )
{
return StreamingLevel->bLocked;
}
else
{
return Level->bLocked;
}
}
示例2: Visit
virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory) override
{
auto Filename = FString(FilenameOrDirectory);
if (!Filename.EndsWith(".cpp.includes"))
{
return true;
}
++FileCount;
TSet<FString> IncludePaths;
FString FileContents;
TArray<FString> OutStrings;
FFileHelper::LoadANSITextFileToStrings(*Filename, &IFileManager::Get(), OutStrings);
IncludePaths.Reserve(OutStrings.Num());
for (auto& IncludePath : OutStrings)
{
IncludePaths.Add(MoveTemp(IncludePath));
}
for (const auto& IncludePath : IncludePaths)
{
if (!IncludeHeaderCount.Contains(IncludePath))
{
IncludeHeaderCount.Add(IncludePath, 1);
}
else
{
++IncludeHeaderCount[IncludePath];
}
}
return true;
}
示例3: GetTrackKeyForTime
void UFaceFXMatineeControl::GetTrackKeyForTime(float InTime, TArray<TPair<int32, const FFaceFXTrackKey*>>& OutResult, TArray<FFaceFXSkelMeshComponentId>* OutNoTracks) const
{
//build a list of all keys for all skelmesh component ids
TMap<int32, TArray<const FFaceFXTrackKey*>> SkelMeshTracks;
TMap<int32, FFaceFXSkelMeshComponentId> SkelMeshIds;
for(const FFaceFXTrackKey& Key : Keys)
{
SkelMeshTracks.FindOrAdd(Key.SkelMeshComponentId.Index).Add(&Key);
if(OutNoTracks && !SkelMeshIds.Contains(Key.SkelMeshComponentId.Index))
{
SkelMeshIds.Add(Key.SkelMeshComponentId.Index, Key.SkelMeshComponentId);
}
}
//then generate the pair results for each skelmesh component
for(auto It = SkelMeshTracks.CreateConstIterator(); It; ++It)
{
const TArray<const FFaceFXTrackKey*>& SkelMeshKeys = It.Value();
const int32 IndexMax = SkelMeshKeys.Num()-1;
int32 Index = INDEX_NONE;
for(; Index < IndexMax && SkelMeshKeys[Index+1]->Time <= InTime; ++Index);
if(Index != INDEX_NONE)
{
OutResult.Add(TPairInitializer<int32, const FFaceFXTrackKey*>(Index, SkelMeshKeys[Index]));
}
else if(OutNoTracks)
{
OutNoTracks->Add(SkelMeshIds.FindChecked(It.Key()));
}
}
}
示例4: LoadSettings
void FSourceControlSettings::LoadSettings()
{
// make sure we load the global ini first
const FString& GlobalIniFile = SourceControlHelpers::GetGlobalSettingsIni();
GConfig->GetBool(*SourceControlSettingsConstants::SettingsSection, TEXT("UseGlobalSettings"), bUseGlobalSettings, GlobalIniFile);
TArray<FString> Tokens;
TArray<FString> Switches;
FCommandLine::Parse( FCommandLine::Get(), Tokens, Switches );
TMap<FString, FString> SwitchPairs;
for (int32 SwitchIdx = Switches.Num() - 1; SwitchIdx >= 0; --SwitchIdx)
{
FString& Switch = Switches[SwitchIdx];
TArray<FString> SplitSwitch;
if (2 == Switch.ParseIntoArray(SplitSwitch, TEXT("="), true))
{
SwitchPairs.Add(SplitSwitch[0], SplitSwitch[1].TrimQuotes());
Switches.RemoveAt(SwitchIdx);
}
}
if( SwitchPairs.Contains( TEXT("SCCProvider") ) )
{
Provider = SwitchPairs[TEXT("SCCProvider")];
}
else
{
const FString& IniFile = SourceControlHelpers::GetSettingsIni();
GConfig->GetString(*SourceControlSettingsConstants::SettingsSection, TEXT("Provider"), Provider, IniFile);
}
}
示例5: CreateCookerFileOrderString
FString FChunkManifestGenerator::CreateCookerFileOrderString(const TMap<FName, FAssetData*>& InAssetData, const TArray<FName>& InMaps)
{
FString FileOrderString;
TArray<FAssetData*> TopLevelNodes;
for (auto Asset : InAssetData)
{
auto PackageName = Asset.Value->PackageName;
TArray<FName> Referencers;
AssetRegistry.GetReferencers(PackageName, Referencers);
bool bIsTopLevel = true;
bool bIsMap = InMaps.Contains(PackageName);
if (!bIsMap && Referencers.Num() > 0)
{
for (auto ReferencerName : Referencers)
{
if (InAssetData.Contains(ReferencerName))
{
bIsTopLevel = false;
break;
}
}
}
if (bIsTopLevel)
{
if (bIsMap)
{
TopLevelNodes.Insert(Asset.Value, 0);
}
else
{
TopLevelNodes.Insert(Asset.Value, TopLevelNodes.Num());
}
}
}
TArray<FName> FileOrder;
TArray<FName> EncounteredNames;
for (auto Asset : TopLevelNodes)
{
AddAssetToFileOrderRecursive(Asset, FileOrder, EncounteredNames, InAssetData, InMaps);
}
int32 CurrentIndex = 0;
for (auto PackageName : FileOrder)
{
auto Asset = InAssetData[PackageName];
bool bIsMap = InMaps.Contains(Asset->PackageName);
auto Filename = FPackageName::LongPackageNameToFilename(Asset->PackageName.ToString(), bIsMap ? FPackageName::GetMapPackageExtension() : FPackageName::GetAssetPackageExtension());
ConvertFilenameToPakFormat(Filename);
auto Line = FString::Printf(TEXT("\"%s\" %i\n"), *Filename, CurrentIndex++);
FileOrderString.Append(Line);
}
return FileOrderString;
}
示例6: FindExistingChunk
bool FDataScannerImpl::FindExistingChunk(const TMap<uint64, TSet<FGuid>>& ChunkLookup, TMap<FGuid, FSHAHash>& ChunkShaHashes, uint64 ChunkHash, const FRollingHash<WindowSize>& RollingHash, FGuid& OutMatchedChunk)
{
FStatsScopedTimer FindTimer(StatFindMatchTime);
bool bFoundChunkMatch = false;
if (ChunkLookup.Contains(ChunkHash))
{
FSHAHash ChunkSha;
RollingHash.GetWindowData().GetShaHash(ChunkSha);
for (FGuid& PotentialMatch : ChunkLookup.FindRef(ChunkHash))
{
// Use sha if we have it
if (ChunkShaHashes.Contains(PotentialMatch))
{
if(ChunkSha == ChunkShaHashes[PotentialMatch])
{
bFoundChunkMatch = true;
OutMatchedChunk = PotentialMatch;
break;
}
}
else
{
// Otherwise compare data
TArray<uint8> SerialBuffer;
FStatsScopedTimer DataMatchTimer(StatDataMatchTime);
FStatsCollector::Accumulate(StatChunkDataChecks, 1);
SerialBuffer.AddUninitialized(WindowSize);
RollingHash.GetWindowData().Serialize(SerialBuffer.GetData());
bool ChunkFound = false;
if (DataMatcher->CompareData(PotentialMatch, ChunkHash, SerialBuffer, ChunkFound))
{
FStatsCollector::Accumulate(StatChunkDataMatches, 1);
ChunkShaHashes.Add(PotentialMatch, ChunkSha);
bFoundChunkMatch = true;
OutMatchedChunk = PotentialMatch;
break;
}
else if(!ChunkFound)
{
FStatsCollector::Accumulate(StatMissingChunks, 1);
}
}
FStatsCollector::Accumulate(StatHashCollisions, 1);
}
}
return bFoundChunkMatch;
}
示例7: HasResourcesAvailable
/******************** HasResourcesAvailable *************************/
bool APOTLStructure::HasResourcesAvailable(TMap<FString, int32>& Request, bool IncludeAllocations, int32 Sequence)
{
bool RequestMet = true;
TMap<FString, int32> ResourceAvailable = FreeResources; //~~ Copy resources ~~//
//~~ Append all allocated resources with lower sequence to available resources ~~//
if (IncludeAllocations)
{
for (auto& AllocatedResource : AllocatedResources)
{
FST_ResourceAllocation& Allocation = AllocatedResource.Value;
if (Allocation.Sequence < Sequence && Allocation.Type == EAllocationType::FactoryProduction && Allocation.To == this && Allocation.Quantity > 0) //~~ If allocation has a lower sequence than the check and is allocated to this structure ~~//
{
if (ResourceAvailable.Contains(Allocation.ResourceKey)) ResourceAvailable[Allocation.ResourceKey] = ResourceAvailable[Allocation.ResourceKey] + Allocation.Quantity;
else ResourceAvailable.Add(Allocation.ResourceKey, Allocation.Quantity);
}
}
}
for (auto& ResourceRequest : Request)
{
if (ResourceAvailable.Contains(ResourceRequest.Key))
{
int32 Remaining = ResourceRequest.Value;
if (Remaining > ResourceAvailable[ResourceRequest.Key]) //~~ If request is larger than the resource pool ~~//
{
RequestMet = false;
break;
}
}
else
{
RequestMet = false;
break;
}
}
return RequestMet;
}
示例8: ExpandFrontierTowardsTarget
// DEPRECATED
void ADEPRECATED_VolumeAdaptiveBuilder::ExpandFrontierTowardsTarget(UDoNNavigationVolumeComponent* current, UDoNNavigationVolumeComponent* neighbor, DoNNavigation::PriorityQueue<UDoNNavigationVolumeComponent*> &frontier, TMap<UDoNNavigationVolumeComponent*, FVector> &entryPointMap, bool &goalFound, UDoNNavigationVolumeComponent* start, UDoNNavigationVolumeComponent* goal, FVector origin, FVector destination, TMap<UDoNNavigationVolumeComponent*, int>& VolumeVsCostMap, bool DrawDebug, TMap<UDoNNavigationVolumeComponent*, TArray<UDoNNavigationVolumeComponent*>> &PathVolumeSolutionMap)
{
if (DrawDebug)
{
DisplayDebugVolume(current, FColor::Red);
DisplayDebugVolume(neighbor, FColor::Blue);
}
float SegmentDist = 0;
FVector nextEntryPoint;
TArray<UDoNNavigationVolumeComponent*> PathSolutionSoFar = PathVolumeSolutionMap.FindOrAdd(current);
nextEntryPoint = NavEntryPointsForTraversal(*entryPointMap.Find(current), current, neighbor, SegmentDist, DrawDebug);
entryPointMap.Add(neighbor, nextEntryPoint);
if (nextEntryPoint == *entryPointMap.Find(current)) // i.e. no traversal solution exists
{
if (DrawDebug)
{
DisplayDebugVolume(current, FColor::Red);
DisplayDebugVolume(neighbor, FColor::Blue);
}
UE_LOG(LogTemp, Log, TEXT("Skipping neighbor due to lack of traversal solution"));
return;
}
//int new_cost = *VolumeVsCostMap.Find(current) + graph.cost(current, next);
int new_cost = *VolumeVsCostMap.Find(current) + SegmentDist;
if (!VolumeVsCostMap.Contains(neighbor) || new_cost < *VolumeVsCostMap.Find(neighbor))
{
PathSolutionSoFar.Add(neighbor);
PathVolumeSolutionMap.Add(neighbor, PathSolutionSoFar);
VolumeVsCostMap.Add(neighbor, new_cost);
float heuristic = FVector::Dist(nextEntryPoint, destination);
int priority = new_cost + heuristic;
if (DrawDebug)
{
DrawDebugLine(GetWorld(), nextEntryPoint, destination, FColor::Red, true, -1.f, 0, 10.f);
FString priorityText = FString::Printf(TEXT("Priority: %d"), priority);
UE_LOG(LogTemp, Log, TEXT("%s"), *priorityText);
}
frontier.put(neighbor, priority);
}
}
示例9: GetClassPathRootForModule
FName FNativeClassHierarchy::GetClassPathRootForModule(const FName& InModuleName, const TSet<FName>& InGameModules, const TMap<FName, FName>& InPluginModules)
{
static const FName EngineRootNodeName = "Classes_Engine";
static const FName GameRootNodeName = "Classes_Game";
// Work out which root this class should go under (anything that isn't a game or plugin module goes under engine)
FName RootNodeName = EngineRootNodeName;
if(InGameModules.Contains(InModuleName))
{
RootNodeName = GameRootNodeName;
}
else if(InPluginModules.Contains(InModuleName))
{
const FName PluginName = InPluginModules.FindRef(InModuleName);
RootNodeName = FName(*(FString(TEXT("Classes_")) + PluginName.ToString()));
}
return RootNodeName;
}
示例10: CanAttachComponentsTo
// Determine whether or not scene components in the new object set can be attached to the given scene root component
bool CanAttachComponentsTo(USceneComponent* InRootComponent)
{
check(InRootComponent);
// For each component in the set, check against the given root component and break if we fail to validate
bool bCanAttachToRoot = true;
for (auto NewComponentIt = NewObjectMap.CreateConstIterator(); NewComponentIt && bCanAttachToRoot; ++NewComponentIt)
{
// If this is a scene component, and it does not already have a parent within the set
USceneComponent* SceneComponent = Cast<USceneComponent>(NewComponentIt->Value);
if (SceneComponent != NULL && !ParentMap.Contains(SceneComponent->GetFName()))
{
// Determine if we are allowed to attach the scene component to the given root component
bCanAttachToRoot = InRootComponent->CanAttachAsChild(SceneComponent, NAME_None)
&& SceneComponent->Mobility >= InRootComponent->Mobility
&& ( !InRootComponent->IsEditorOnly() || SceneComponent->IsEditorOnly() );
}
}
return bCanAttachToRoot;
}
示例11: AddAssetToFileOrderRecursive
void FChunkManifestGenerator::AddAssetToFileOrderRecursive(FAssetData* InAsset, TArray<FName>& OutFileOrder, TArray<FName>& OutEncounteredNames, const TMap<FName, FAssetData*>& InAssets, const TArray<FName>& InMapList)
{
if (!OutEncounteredNames.Contains(InAsset->PackageName))
{
OutEncounteredNames.Add(InAsset->PackageName);
TArray<FName> Dependencies;
AssetRegistry.GetDependencies(InAsset->PackageName, Dependencies);
for (auto DependencyName : Dependencies)
{
if (InAssets.Contains(DependencyName) && !OutFileOrder.Contains(DependencyName))
{
if (!InMapList.Contains(DependencyName))
{
auto Dependency = InAssets[DependencyName];
AddAssetToFileOrderRecursive(Dependency, OutFileOrder, OutEncounteredNames, InAssets, InMapList);
}
}
}
OutFileOrder.Add(InAsset->PackageName);
}
}
示例12: if
/******************** GetResourceAlteration *************************/
TArray<FST_ResourceAlteration> APOTLStructure::GetResourceAlteration()
{
TArray<FST_ResourceAlteration> List;
TMap<FString, FST_ResourceAlteration> TMapList; //~~ Make complete list of resource from FreeResources and allocations ~~//
for (auto& FreeResource : FreeResources)
{
FST_ResourceAlteration ResourceAlteration;
ResourceAlteration.Id = FreeResource.Key;
ResourceAlteration.Storage = FreeResource.Value;
//ResourceAlteration.Alteration = GetAllocationTotal(FreeResource.Key);
TMapList.Add(FreeResource.Key, ResourceAlteration);
}
for (auto& AllocatedResource : AllocatedResources)
{
//~~ Add alteration if allocation key isn't in free resources ~~//
if (AllocatedResource.Value.From == this || AllocatedResource.Value.To == this) //~~~ If either outgoing or incomming, then create an alteration struct ~~//
{
if (!TMapList.Contains(AllocatedResource.Value.ResourceKey))
{
FST_ResourceAlteration ResourceAlteration;
ResourceAlteration.Id = AllocatedResource.Value.ResourceKey;
TMapList.Add(AllocatedResource.Value.ResourceKey, ResourceAlteration);
}
}
//~~ Outgoing resources from root ~~//
if (AllocatedResource.Value.From == this)
{
if (AllocatedResource.Value.Type == EAllocationType::Decay)
{
TMapList[AllocatedResource.Value.ResourceKey].Decay -= AllocatedResource.Value.Quantity;
TMapList[AllocatedResource.Value.ResourceKey].Storage += AllocatedResource.Value.Quantity;
}
else if (AllocatedResource.Value.Type == EAllocationType::FactoryBilling)
{
TMapList[AllocatedResource.Value.ResourceKey].Alteration -= AllocatedResource.Value.Quantity;
TMapList[AllocatedResource.Value.ResourceKey].Storage += AllocatedResource.Value.Quantity;
}
}
//~~ Incomming resources to root ~~//
if (AllocatedResource.Value.To == this)
{
if (AllocatedResource.Value.Type == EAllocationType::ProductionDecay)
{
TMapList[AllocatedResource.Value.ResourceKey].Alteration += AllocatedResource.Value.Quantity;
TMapList[AllocatedResource.Value.ResourceKey].Decay -= AllocatedResource.Value.Quantity;
}
else
{
TMapList[AllocatedResource.Value.ResourceKey].Alteration += AllocatedResource.Value.Quantity;
}
}
}
/*
if (TMapList.Contains(AllocatedResource.Value.ResourceKey))
{
if (AllocatedResource.Value.Type == EAllocationType::FactoryBilling)
{
TMapList[AllocatedResource.Value.ResourceKey].Storage = TMapList[AllocatedResource.Value.ResourceKey].Storage + TMapList[AllocatedResource.Value.ResourceKey].Alteration;
}
}
else
{
FST_ResourceAlteration ResourceAlteration;
ResourceAlteration.Id = AllocatedResource.Value.ResourceKey;
ResourceAlteration.Alteration = GetAllocationTotal(AllocatedResource.Value.ResourceKey);
TMapList.Add(AllocatedResource.Value.ResourceKey, ResourceAlteration);
}
*/
for (auto& TMapItem : TMapList)
{
List.Add(TMapItem.Value);
}
//~~ Sort the list by sort sequence ~~//
/*
List.Sort([](const FString& One, const FString& Two) {
return One > Two;
});
List.Sort([](const FString& A, const FString& B) {
return A.Len() < B.Len();
});
*/
//GameInstance->DATA_Recipes
List.Sort([](const FST_ResourceAlteration& A, const FST_ResourceAlteration& B) {
return A.Id.Len() < B.Id.Len();
//return A.Id.Len() < B.Id.Len();
});
//List.Sort();
return List;
}
示例13: CopyComponents
void FComponentEditorUtils::CopyComponents(const TArray<UActorComponent*>& ComponentsToCopy)
{
FStringOutputDevice Archive;
const FExportObjectInnerContext Context;
// Clear the mark state for saving.
UnMarkAllObjects(EObjectMark(OBJECTMARK_TagExp | OBJECTMARK_TagImp));
// Duplicate the selected component templates into temporary objects that we can modify
TMap<FName, FName> ParentMap;
TMap<FName, UActorComponent*> ObjectMap;
for (UActorComponent* Component : ComponentsToCopy)
{
// Duplicate the component into a temporary object
UObject* DuplicatedComponent = StaticDuplicateObject(Component, GetTransientPackage(), Component->GetFName(), RF_AllFlags & ~RF_ArchetypeObject);
if (DuplicatedComponent)
{
// If the duplicated component is a scene component, wipe its attach parent (to prevent log warnings for referencing a private object in an external package)
if (auto DuplicatedCompAsSceneComp = Cast<USceneComponent>(DuplicatedComponent))
{
DuplicatedCompAsSceneComp->AttachParent = nullptr;
}
// Find the closest parent component of the current component within the list of components to copy
USceneComponent* ClosestSelectedParent = FindClosestParentInList(Component, ComponentsToCopy);
if (ClosestSelectedParent)
{
// If the parent is included in the list, record it into the node->parent map
ParentMap.Add(Component->GetFName(), ClosestSelectedParent->GetFName());
}
// Record the temporary object into the name->object map
ObjectMap.Add(Component->GetFName(), CastChecked<UActorComponent>(DuplicatedComponent));
}
}
// Export the component object(s) to text for copying
for (auto ObjectIt = ObjectMap.CreateIterator(); ObjectIt; ++ObjectIt)
{
// Get the component object to be copied
UActorComponent* ComponentToCopy = ObjectIt->Value;
check(ComponentToCopy);
// If this component object had a parent within the selected set
if (ParentMap.Contains(ComponentToCopy->GetFName()))
{
// Get the name of the parent component
FName ParentName = ParentMap[ComponentToCopy->GetFName()];
if (ObjectMap.Contains(ParentName))
{
// Ensure that this component is a scene component
USceneComponent* SceneComponent = Cast<USceneComponent>(ComponentToCopy);
if (SceneComponent)
{
// Set the attach parent to the matching parent object in the temporary set. This allows us to preserve hierarchy in the copied set.
SceneComponent->AttachParent = Cast<USceneComponent>(ObjectMap[ParentName]);
}
}
}
// Export the component object to the given string
UExporter::ExportToOutputDevice(&Context, ComponentToCopy, NULL, Archive, TEXT("copy"), 0, PPF_ExportsNotFullyQualified | PPF_Copy | PPF_Delimited, false, ComponentToCopy->GetOuter());
}
// Copy text to clipboard
FString ExportedText = Archive;
FPlatformMisc::ClipboardCopy(*ExportedText);
}
示例14: FileAttributesMetaToMap
bool FFileAttributesParserImpl::FileAttributesMetaToMap(const FString& AttributesList, TMap<FString, FFileAttributes>& FileAttributesMap)
{
const TCHAR Quote = TEXT('\"');
const TCHAR EOFile = TEXT('\0');
const TCHAR EOLine = TEXT('\n');
bool Successful = true;
bool FoundFilename = false;
const TCHAR* CharPtr = *AttributesList;
while (*CharPtr != EOFile)
{
// Parse filename
while (*CharPtr != Quote && *CharPtr != EOFile){ ++CharPtr; }
if (*CharPtr == EOFile)
{
if (!FoundFilename)
{
UE_LOG(LogFileAttributesParser, Error, TEXT("Did not find opening quote for filename!"));
return false;
}
break;
}
const TCHAR* FilenameStart = ++CharPtr;
while (*CharPtr != Quote && *CharPtr != EOFile && *CharPtr != EOLine){ ++CharPtr; }
// Check we didn't run out of file
if (*CharPtr == EOFile)
{
UE_LOG(LogFileAttributesParser, Error, TEXT("Unexpected end of file before next quote! Pos:%d"), CharPtr - *AttributesList);
return false;
}
// Check we didn't run out of line
if(*CharPtr == EOLine)
{
UE_LOG(LogFileAttributesParser, Error, TEXT("Unexpected end of line before next quote! Pos:%d"), CharPtr - *AttributesList);
return false;
}
// Save positions
const TCHAR* FilenameEnd = CharPtr++;
const TCHAR* AttributesStart = CharPtr;
// Parse keywords
while (*CharPtr != Quote && *CharPtr != EOFile && *CharPtr != EOLine){ ++CharPtr; }
// Check we hit the end of the line or file, another quote it wrong
if (*CharPtr == Quote)
{
UE_LOG(LogFileAttributesParser, Error, TEXT("Unexpected Quote before end of keywords! Pos:%d"), CharPtr - *AttributesList);
return false;
}
FoundFilename = true;
// Save position
const TCHAR* EndOfLine = CharPtr;
// Grab info
FString Filename = FString(FilenameEnd - FilenameStart, FilenameStart).Replace(TEXT("\\"), TEXT("/"));
FFileAttributes& FileAttributes = FileAttributesMap.FindOrAdd(Filename);
TArray<FString> AttributeParamsArray;
FString AttributeParams(EndOfLine - AttributesStart, AttributesStart);
AttributeParams.ParseIntoArrayWS(AttributeParamsArray);
for (const FString& AttributeParam : AttributeParamsArray)
{
FString Key, Value;
if(!AttributeParam.Split(TEXT(":"), &Key, &Value))
{
Key = AttributeParam;
}
if (AttributeSetters.Contains(Key))
{
AttributeSetters[Key](FileAttributes, MoveTemp(Value));
}
else
{
UE_LOG(LogFileAttributesParser, Error, TEXT("Unrecognised attribute %s for %s"), *AttributeParam, *Filename);
Successful = false;
}
}
}
return Successful;
}
示例15: FixUpChunkBoneMaps
void FixUpChunkBoneMaps( FSkelMeshChunk & Chunk, const TMap<FBoneIndexType, FBoneIndexType> &BonesToRepair ) override
{
// now you have list of bones, remove them from vertex influences
{
TMap<uint8, uint8> BoneMapRemapTable;
// first go through bone map and see if this contains BonesToRemove
int32 BoneMapSize = Chunk.BoneMap.Num();
int32 AdjustIndex=0;
for (int32 BoneMapIndex=0; BoneMapIndex < BoneMapSize; ++BoneMapIndex )
{
// look for this bone to be removed or not?
const FBoneIndexType* ParentBoneIndex = BonesToRepair.Find(Chunk.BoneMap[BoneMapIndex]);
if ( ParentBoneIndex )
{
// this should not happen, I don't ever remove root
check (*ParentBoneIndex!=INDEX_NONE);
// if Parent already exists in the current BoneMap, we just have to fix up the mapping
int32 ParentBoneMapIndex = Chunk.BoneMap.Find(*ParentBoneIndex);
// if it exists
if (ParentBoneMapIndex != INDEX_NONE)
{
// if parent index is higher, we have to decrease it to match to new index
if (ParentBoneMapIndex > BoneMapIndex)
{
--ParentBoneMapIndex;
}
// remove current chunk count, will replace with parent
Chunk.BoneMap.RemoveAt(BoneMapIndex);
}
else
{
// if parent doens't exists, we have to add one
// this doesn't change bone map size
Chunk.BoneMap.RemoveAt(BoneMapIndex);
ParentBoneMapIndex = Chunk.BoneMap.Add(*ParentBoneIndex);
}
// first fix up all indices of BoneMapRemapTable for the indices higher than BoneMapIndex, since BoneMapIndex is being removed
for (auto Iter = BoneMapRemapTable.CreateIterator(); Iter; ++Iter)
{
uint8& Value = Iter.Value();
check (Value != BoneMapIndex);
if (Value > BoneMapIndex)
{
--Value;
}
}
int32 OldIndex = BoneMapIndex+AdjustIndex;
int32 NewIndex = ParentBoneMapIndex;
// you still have to add no matter what even if same since indices might change after added
{
// add to remap table
check (OldIndex < 256 && OldIndex >= 0);
check (NewIndex < 256 && NewIndex >= 0);
check (BoneMapRemapTable.Contains((uint8)OldIndex) == false);
BoneMapRemapTable.Add((uint8)OldIndex, (uint8)NewIndex);
}
// reduce index since the item is removed
--BoneMapIndex;
--BoneMapSize;
// this is to adjust the later indices. We need to refix their indices
++AdjustIndex;
}
else if (AdjustIndex > 0)
{
int32 OldIndex = BoneMapIndex+AdjustIndex;
int32 NewIndex = BoneMapIndex;
check (OldIndex < 256 && OldIndex >= 0);
check (NewIndex < 256 && NewIndex >= 0);
check (BoneMapRemapTable.Contains((uint8)OldIndex) == false);
BoneMapRemapTable.Add((uint8)OldIndex, (uint8)NewIndex);
}
}
if ( BoneMapRemapTable.Num() > 0 )
{
// fix up rigid verts
for (int32 VertIndex=0; VertIndex < Chunk.RigidVertices.Num(); ++VertIndex)
{
FRigidSkinVertex & Vert = Chunk.RigidVertices[VertIndex];
uint8 *RemappedBone = BoneMapRemapTable.Find(Vert.Bone);
if (RemappedBone)
{
Vert.Bone = *RemappedBone;
}
}
// fix up soft verts
for (int32 VertIndex=0; VertIndex < Chunk.SoftVertices.Num(); ++VertIndex)
{
//.........这里部分代码省略.........