选中优化
This commit is contained in:
parent
eae20bebb5
commit
49bedde67b
@ -3078,7 +3078,6 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon
|
||||
}
|
||||
|
||||
// 槽位列表循环
|
||||
const auto materialChoices = MetaCoreCollectMaterialAssetChoices(editorContext);
|
||||
for (std::size_t materialIndex = 0; materialIndex < meshRenderer.MaterialAssetGuids.size(); ++materialIndex) {
|
||||
MetaCoreAssetGuid materialGuid = meshRenderer.MaterialAssetGuids[materialIndex];
|
||||
const std::string elementLabel = "Element " + std::to_string(materialIndex);
|
||||
@ -3189,6 +3188,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon
|
||||
}
|
||||
}
|
||||
ImGui::Separator();
|
||||
const auto materialChoices = MetaCoreCollectMaterialAssetChoices(editorContext);
|
||||
for (const auto& choice : materialChoices) {
|
||||
bool isSelected = (choice.AssetGuid == materialGuid);
|
||||
if (ImGui::Selectable(choice.Label.c_str(), isSelected)) {
|
||||
@ -6224,6 +6224,7 @@ public:
|
||||
PackageService_.reset();
|
||||
ReflectionRegistry_.reset();
|
||||
ModelCache_.clear();
|
||||
ClearGeneratedAssetCaches();
|
||||
}
|
||||
|
||||
[[nodiscard]] std::optional<MetaCoreModelAssetDocument> LoadModelAsset(
|
||||
@ -6257,6 +6258,11 @@ public:
|
||||
) const override;
|
||||
|
||||
private:
|
||||
void CacheGeneratedAssetDocuments(
|
||||
const MetaCoreAssetRecord& sourceRecord,
|
||||
const MetaCoreModelAssetDocument& document
|
||||
) const;
|
||||
void ClearGeneratedAssetCaches() const;
|
||||
void RescanHotReloadBaseline() const;
|
||||
|
||||
MetaCoreEditorModuleRegistry* ModuleRegistry_ = nullptr;
|
||||
@ -6264,6 +6270,10 @@ private:
|
||||
std::shared_ptr<MetaCoreIPackageService> PackageService_{};
|
||||
std::shared_ptr<MetaCoreIReflectionRegistry> ReflectionRegistry_{};
|
||||
mutable std::unordered_map<MetaCoreAssetGuid, MetaCoreModelAssetDocument, MetaCoreAssetGuidHasher> ModelCache_{};
|
||||
mutable std::unordered_map<MetaCoreAssetGuid, MetaCoreMeshAssetDocument, MetaCoreAssetGuidHasher> MeshCache_{};
|
||||
mutable std::unordered_map<MetaCoreAssetGuid, MetaCoreMaterialAssetDocument, MetaCoreAssetGuidHasher> MaterialCache_{};
|
||||
mutable std::unordered_map<MetaCoreAssetGuid, MetaCoreTextureAssetDocument, MetaCoreAssetGuidHasher> TextureCache_{};
|
||||
mutable std::unordered_map<MetaCoreAssetGuid, MetaCoreResolvedGeneratedAssetRecord, MetaCoreAssetGuidHasher> GeneratedAssetRecordCache_{};
|
||||
};
|
||||
|
||||
bool MetaCoreBuiltinCookService::CookAsset(const MetaCoreAssetGuid& assetGuid) {
|
||||
@ -6406,13 +6416,60 @@ bool MetaCoreBuiltinCookService::CookAsset(const MetaCoreAssetGuid& assetGuid) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void MetaCoreBuiltinAssetEditingService::ClearGeneratedAssetCaches() const {
|
||||
MeshCache_.clear();
|
||||
MaterialCache_.clear();
|
||||
TextureCache_.clear();
|
||||
GeneratedAssetRecordCache_.clear();
|
||||
}
|
||||
|
||||
void MetaCoreBuiltinAssetEditingService::CacheGeneratedAssetDocuments(
|
||||
const MetaCoreAssetRecord& sourceRecord,
|
||||
const MetaCoreModelAssetDocument& document
|
||||
) const {
|
||||
for (std::size_t index = 0; index < document.GeneratedMeshAssets.size(); ++index) {
|
||||
const MetaCoreMeshAssetDocument& mesh = document.GeneratedMeshAssets[index];
|
||||
if (!mesh.AssetGuid.IsValid()) {
|
||||
continue;
|
||||
}
|
||||
MeshCache_[mesh.AssetGuid] = mesh;
|
||||
GeneratedAssetRecordCache_[mesh.AssetGuid] = MetaCoreResolvedGeneratedAssetRecord{
|
||||
sourceRecord,
|
||||
"mesh",
|
||||
index
|
||||
};
|
||||
}
|
||||
|
||||
for (std::size_t index = 0; index < document.GeneratedMaterialAssets.size(); ++index) {
|
||||
const MetaCoreMaterialAssetDocument& material = document.GeneratedMaterialAssets[index];
|
||||
if (!material.AssetGuid.IsValid()) {
|
||||
continue;
|
||||
}
|
||||
MaterialCache_[material.AssetGuid] = material;
|
||||
GeneratedAssetRecordCache_[material.AssetGuid] = MetaCoreResolvedGeneratedAssetRecord{
|
||||
sourceRecord,
|
||||
"material",
|
||||
index
|
||||
};
|
||||
}
|
||||
|
||||
for (std::size_t index = 0; index < document.GeneratedTextureAssets.size(); ++index) {
|
||||
const MetaCoreTextureAssetDocument& texture = document.GeneratedTextureAssets[index];
|
||||
if (!texture.AssetGuid.IsValid()) {
|
||||
continue;
|
||||
}
|
||||
TextureCache_[texture.AssetGuid] = texture;
|
||||
GeneratedAssetRecordCache_[texture.AssetGuid] = MetaCoreResolvedGeneratedAssetRecord{
|
||||
sourceRecord,
|
||||
"texture",
|
||||
index
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<MetaCoreModelAssetDocument> MetaCoreBuiltinAssetEditingService::LoadModelAsset(
|
||||
const MetaCoreAssetGuid& assetGuid
|
||||
) const {
|
||||
if (const auto cacheIterator = ModelCache_.find(assetGuid); cacheIterator != ModelCache_.end()) {
|
||||
return cacheIterator->second;
|
||||
}
|
||||
|
||||
if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) {
|
||||
return std::nullopt;
|
||||
}
|
||||
@ -6422,6 +6479,12 @@ std::optional<MetaCoreModelAssetDocument> MetaCoreBuiltinAssetEditingService::Lo
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
if (const auto cacheIterator = ModelCache_.find(assetGuid); cacheIterator != ModelCache_.end() &&
|
||||
(assetRecord->SourceHash == 0 || cacheIterator->second.SourceHash == assetRecord->SourceHash)) {
|
||||
CacheGeneratedAssetDocuments(*assetRecord, cacheIterator->second);
|
||||
return cacheIterator->second;
|
||||
}
|
||||
|
||||
auto doc = MetaCoreLoadModelAssetDocumentForRecord(
|
||||
*AssetDatabaseService_,
|
||||
*PackageService_,
|
||||
@ -6431,6 +6494,7 @@ std::optional<MetaCoreModelAssetDocument> MetaCoreBuiltinAssetEditingService::Lo
|
||||
);
|
||||
if (doc.has_value()) {
|
||||
ModelCache_[assetGuid] = *doc;
|
||||
CacheGeneratedAssetDocuments(*assetRecord, *doc);
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
@ -6438,6 +6502,10 @@ std::optional<MetaCoreModelAssetDocument> MetaCoreBuiltinAssetEditingService::Lo
|
||||
std::optional<MetaCoreMeshAssetDocument> MetaCoreBuiltinAssetEditingService::LoadMeshAsset(
|
||||
const MetaCoreAssetGuid& meshGuid
|
||||
) const {
|
||||
if (const auto cacheIterator = MeshCache_.find(meshGuid); cacheIterator != MeshCache_.end()) {
|
||||
return cacheIterator->second;
|
||||
}
|
||||
|
||||
if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) {
|
||||
return std::nullopt;
|
||||
}
|
||||
@ -6456,12 +6524,23 @@ std::optional<MetaCoreMeshAssetDocument> MetaCoreBuiltinAssetEditingService::Loa
|
||||
if (resolved->GeneratedIndex >= resolved->Document.GeneratedMeshAssets.size()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return resolved->Document.GeneratedMeshAssets[resolved->GeneratedIndex];
|
||||
const MetaCoreMeshAssetDocument mesh = resolved->Document.GeneratedMeshAssets[resolved->GeneratedIndex];
|
||||
MeshCache_[meshGuid] = mesh;
|
||||
GeneratedAssetRecordCache_[meshGuid] = MetaCoreResolvedGeneratedAssetRecord{
|
||||
resolved->AssetRecord,
|
||||
resolved->GeneratedKind,
|
||||
resolved->GeneratedIndex
|
||||
};
|
||||
return mesh;
|
||||
}
|
||||
|
||||
std::optional<MetaCoreMaterialAssetDocument> MetaCoreBuiltinAssetEditingService::LoadMaterialAsset(
|
||||
const MetaCoreAssetGuid& materialGuid
|
||||
) const {
|
||||
if (const auto cacheIterator = MaterialCache_.find(materialGuid); cacheIterator != MaterialCache_.end()) {
|
||||
return cacheIterator->second;
|
||||
}
|
||||
|
||||
if (AssetDatabaseService_ == nullptr || ReflectionRegistry_ == nullptr) {
|
||||
return std::nullopt;
|
||||
}
|
||||
@ -6484,7 +6563,14 @@ std::optional<MetaCoreMaterialAssetDocument> MetaCoreBuiltinAssetEditingService:
|
||||
);
|
||||
if (resolved.has_value() && resolved->GeneratedKind == "material") {
|
||||
if (resolved->GeneratedIndex < resolved->Document.GeneratedMaterialAssets.size()) {
|
||||
return resolved->Document.GeneratedMaterialAssets[resolved->GeneratedIndex];
|
||||
const MetaCoreMaterialAssetDocument material = resolved->Document.GeneratedMaterialAssets[resolved->GeneratedIndex];
|
||||
MaterialCache_[materialGuid] = material;
|
||||
GeneratedAssetRecordCache_[materialGuid] = MetaCoreResolvedGeneratedAssetRecord{
|
||||
resolved->AssetRecord,
|
||||
resolved->GeneratedKind,
|
||||
resolved->GeneratedIndex
|
||||
};
|
||||
return material;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6495,6 +6581,10 @@ std::optional<MetaCoreMaterialAssetDocument> MetaCoreBuiltinAssetEditingService:
|
||||
std::optional<MetaCoreTextureAssetDocument> MetaCoreBuiltinAssetEditingService::LoadTextureAsset(
|
||||
const MetaCoreAssetGuid& textureGuid
|
||||
) const {
|
||||
if (const auto cacheIterator = TextureCache_.find(textureGuid); cacheIterator != TextureCache_.end()) {
|
||||
return cacheIterator->second;
|
||||
}
|
||||
|
||||
if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) {
|
||||
return std::nullopt;
|
||||
}
|
||||
@ -6542,7 +6632,14 @@ std::optional<MetaCoreTextureAssetDocument> MetaCoreBuiltinAssetEditingService::
|
||||
if (resolved->GeneratedIndex >= resolved->Document.GeneratedTextureAssets.size()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return resolved->Document.GeneratedTextureAssets[resolved->GeneratedIndex];
|
||||
const MetaCoreTextureAssetDocument texture = resolved->Document.GeneratedTextureAssets[resolved->GeneratedIndex];
|
||||
TextureCache_[textureGuid] = texture;
|
||||
GeneratedAssetRecordCache_[textureGuid] = MetaCoreResolvedGeneratedAssetRecord{
|
||||
resolved->AssetRecord,
|
||||
resolved->GeneratedKind,
|
||||
resolved->GeneratedIndex
|
||||
};
|
||||
return texture;
|
||||
}
|
||||
|
||||
void MetaCoreBuiltinAssetEditingService::RescanHotReloadBaseline() const {
|
||||
@ -6582,6 +6679,9 @@ bool MetaCoreBuiltinAssetEditingService::SaveModelImportSettings(
|
||||
*modelDocument
|
||||
);
|
||||
if (saved) {
|
||||
ModelCache_[modelGuid] = *modelDocument;
|
||||
ClearGeneratedAssetCaches();
|
||||
CacheGeneratedAssetDocuments(*assetRecord, *modelDocument);
|
||||
RescanHotReloadBaseline();
|
||||
}
|
||||
return saved;
|
||||
@ -6603,6 +6703,8 @@ bool MetaCoreBuiltinAssetEditingService::SaveMaterialAsset(
|
||||
return false;
|
||||
}
|
||||
|
||||
MaterialCache_.erase(materialGuid);
|
||||
GeneratedAssetRecordCache_.erase(materialGuid);
|
||||
const std::filesystem::path metaPath = MetaCoreBuildMetaPath(absolutePath);
|
||||
MetaCoreAssetMetadataDocument metadata;
|
||||
if (MetaCoreReadMetaJson(metaPath, metadata)) {
|
||||
@ -6636,6 +6738,8 @@ bool MetaCoreBuiltinAssetEditingService::SaveMaterialAsset(
|
||||
);
|
||||
if (saved) {
|
||||
ModelCache_[resolved->AssetRecord.Guid] = editableDocument;
|
||||
ClearGeneratedAssetCaches();
|
||||
CacheGeneratedAssetDocuments(resolved->AssetRecord, editableDocument);
|
||||
RescanHotReloadBaseline();
|
||||
}
|
||||
return saved;
|
||||
@ -6649,6 +6753,11 @@ bool MetaCoreBuiltinAssetEditingService::SaveMaterialAsset(
|
||||
std::optional<MetaCoreResolvedGeneratedAssetRecord> MetaCoreBuiltinAssetEditingService::ResolveGeneratedAsset(
|
||||
const MetaCoreAssetGuid& assetGuid
|
||||
) const {
|
||||
if (const auto cacheIterator = GeneratedAssetRecordCache_.find(assetGuid);
|
||||
cacheIterator != GeneratedAssetRecordCache_.end()) {
|
||||
return cacheIterator->second;
|
||||
}
|
||||
|
||||
if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) {
|
||||
return std::nullopt;
|
||||
}
|
||||
@ -6664,11 +6773,22 @@ std::optional<MetaCoreResolvedGeneratedAssetRecord> MetaCoreBuiltinAssetEditingS
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
return MetaCoreResolvedGeneratedAssetRecord{
|
||||
MetaCoreResolvedGeneratedAssetRecord record{
|
||||
resolved->AssetRecord,
|
||||
resolved->GeneratedKind,
|
||||
resolved->GeneratedIndex
|
||||
};
|
||||
GeneratedAssetRecordCache_[assetGuid] = record;
|
||||
|
||||
if (resolved->GeneratedKind == "mesh" && resolved->GeneratedIndex < resolved->Document.GeneratedMeshAssets.size()) {
|
||||
MeshCache_[assetGuid] = resolved->Document.GeneratedMeshAssets[resolved->GeneratedIndex];
|
||||
} else if (resolved->GeneratedKind == "material" && resolved->GeneratedIndex < resolved->Document.GeneratedMaterialAssets.size()) {
|
||||
MaterialCache_[assetGuid] = resolved->Document.GeneratedMaterialAssets[resolved->GeneratedIndex];
|
||||
} else if (resolved->GeneratedKind == "texture" && resolved->GeneratedIndex < resolved->Document.GeneratedTextureAssets.size()) {
|
||||
TextureCache_[assetGuid] = resolved->Document.GeneratedTextureAssets[resolved->GeneratedIndex];
|
||||
}
|
||||
|
||||
return record;
|
||||
}
|
||||
|
||||
bool MetaCoreBuiltinCookService::CookScene(const std::filesystem::path& relativeScenePath) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user