载入中...
搜索中...
未找到
EditorEnvironmentBrowser.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <set>
5
6namespace eve::editor {
7namespace {
8const EditorValue* field(const EditorValue& value, const char* key) {
9 const auto* object = value.getIf<EditorValue::Object>();
10 if (!object) return nullptr;
11 const auto found = object->find(key);
12 return found == object->end() ? nullptr : &found->second;
13}
14}
15
16Result<EnvironmentAssetCard> EnvironmentAssetBrowser::card(const AssetRecord& record) const {
17 EnvironmentAssetCard result;
18 result.asset = record.guid; result.logicalUri = record.logicalUri; result.status = record.status;
19 result.diagnostics = record.diagnostics;
20 if (!record.artifacts.empty()) result.previewArtifact = record.artifacts.front();
21 const auto* layoutEntry = field(record.metadata, "layout");
22 const auto* widthEntry = field(record.metadata, "width");
23 const auto* heightEntry = field(record.metadata, "height");
24 const auto* facesEntry = field(record.metadata, "faceCount");
25 const auto* layout = layoutEntry ? layoutEntry->getIf<std::string>() : nullptr;
26 const auto* width = widthEntry ? widthEntry->getIf<int64_t>() : nullptr;
27 const auto* height = heightEntry ? heightEntry->getIf<int64_t>() : nullptr;
28 const auto* faces = facesEntry ? facesEntry->getIf<int64_t>() : nullptr;
29 static const std::set<std::string> layouts{"cubemap", "horizontal-cross", "vertical-cross", "equirectangular"};
30 if (!layout || !layouts.contains(*layout) || !width || !height || *width <= 0 || *height <= 0) {
31 result.diagnostics.push_back(eve::editing::ruleDiagnostic(
32 eve::DiagnosticCode::InvalidArgument, RuleId("editor.environment.invalid-map-metadata"),
33 DiagnosticSeverity::Error, "Environment map requires supported layout and positive dimensions"));
34 } else {
35 result.layout = *layout; result.width = static_cast<int>(*width); result.height = static_cast<int>(*height);
36 result.faceCount = faces ? static_cast<int>(*faces) : (*layout == "cubemap" ? 6 : 1);
37 if (*layout == "cubemap" && result.faceCount != 6)
38 result.diagnostics.push_back(eve::editing::ruleDiagnostic(
39 eve::DiagnosticCode::InvalidArgument, RuleId("editor.environment.cubemap-face-count"),
40 DiagnosticSeverity::Error, "Cubemap assets require exactly six faces"));
41 if (*layout == "equirectangular" && *width != *height * 2)
42 result.diagnostics.push_back(eve::editing::ruleDiagnostic(
43 eve::DiagnosticCode::InvalidArgument, RuleId("editor.environment.equirectangular-aspect"),
44 DiagnosticSeverity::Warning, "Equirectangular maps normally use a 2:1 aspect ratio"));
45 }
46 if (record.artifacts.empty())
47 result.diagnostics.push_back(eve::editing::ruleDiagnostic(
48 eve::DiagnosticCode::PreconditionViolation, RuleId("editor.environment.missing-artifact"),
49 DiagnosticSeverity::Error, "Environment asset has no imported artifact"));
50 if (record.status != AssetStatus::Ready && record.status != AssetStatus::Warning)
51 result.diagnostics.push_back(eve::editing::ruleDiagnostic(
52 eve::DiagnosticCode::PreconditionViolation, RuleId("editor.environment.asset-not-ready"),
53 DiagnosticSeverity::Error, "Environment asset is not ready for preview or assignment"));
54 const bool error = std::any_of(result.diagnostics.begin(), result.diagnostics.end(),
55 [](const EditorDiagnostic& diagnostic) {
56 return diagnostic.severity() == DiagnosticSeverity::Error ||
57 diagnostic.severity() == DiagnosticSeverity::Fatal;
58 });
59 if (error)
61 eve::Status(EditorStatus::Rejected, result.diagnostics));
62 return eve::editing::applied<EnvironmentAssetCard>(std::move(result));
63}
64
66 std::string text, std::size_t offset, std::size_t limit,
67 std::optional<std::uint64_t> generation) const {
68 if (!database_ || limit == 0)
69 return eve::editing::failed<EnvironmentAssetPage>(EditorStatus::Rejected,
70 RuleId("editor.environment.invalid-browser-query"), "Environment browser requires AssetDB and positive page size");
71 AssetQuery filter; filter.typeIds = {"cubemap", "image.cubemap", "environment-map"};
72 filter.text = std::move(text);
73 auto page = database_->query(filter, offset, limit, generation);
74 if (!page.ok()) return Result<EnvironmentAssetPage>::failure(page.status());
75 EnvironmentAssetPage result; result.nextOffset = page.value().nextOffset;
76 result.hasMore = page.value().hasMore; result.generation = page.value().generation;
77 for (const auto& record : page.value().values) {
78 auto value = card(record);
79 if (value.ok()) result.values.push_back(value.value());
80 }
81 return eve::editing::applied<EnvironmentAssetPage>(std::move(result));
82}
83
85 if (!database_ || asset.empty()) return eve::editing::failed<EnvironmentAssetCard>(EditorStatus::Rejected,
86 RuleId("editor.environment.invalid-selection"), "Environment selection requires AssetDB and asset id");
87 auto found = database_->find(asset);
88 if (!found.ok()) return Result<EnvironmentAssetCard>::failure(found.status());
89 return card(found.value());
90}
91
92} // namespace eve::editor
double value
std::string layout
std::uint32_t key
std::uint32_t height
std::uint32_t width
std::string text
size_t offset
std::string error
Definition Package.cpp:60
std::uint32_t generation
bool found
std::string filter
int limit
Definition TreeMesh.cpp:164
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
bool empty() const noexcept
True when no compatibility spelling has been assigned.
Definition Identity.h:374
std::map< std::string, Value > Object
const T * getIf() const
Return an immediately borrowed typed value.
Result< EnvironmentAssetPage > query(std::string text, std::size_t offset, std::size_t limit, std::optional< std::uint64_t > generation=std::nullopt) const
Query deterministic cards; stale index generations return Conflict.
Result< EnvironmentAssetCard > select(const AssetGuid &asset) const
Resolve a selected environment map and reject unusable import metadata.
Result< AssetRecord > find(const AssetGuid &guid) const
Find one asset by stable GUID.
Result< AssetPage< AssetRecord > > query(const AssetQuery &query, std::size_t offset, std::size_t limit, std::optional< std::uint64_t > generation=std::nullopt) const
Query a deterministic page; stale generations return Conflict.
Diagnostic ruleDiagnostic(eve::DiagnosticCode code, RuleId rule, DiagnosticSeverity severity, std::string message)
Build a common diagnostic carrying an open editing rule identity.
eve::editing::Value EditorValue
Compatibility alias for the UI-independent authoring value tree.
Definition EditorValue.h:8
eve::Diagnostic EditorDiagnostic
eve::editing::RuleId RuleId
Definition EditorIds.h:32
const EditorValue * field(const EditorValue &value, const char *name)
Deterministic filter used by headless and UI asset queries.
std::vector< std::string > typeIds
Generation-qualified environment asset browser page.
std::vector< EnvironmentAssetCard > values