选中优化

This commit is contained in:
Rowland 2026-06-30 10:00:50 +08:00
parent eae20bebb5
commit 49bedde67b

View File

@ -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) {