载入中...
搜索中...
未找到
AvatarRuntime.cpp
浏览该文件的文档.
2
4
5#include <sstream>
6#include <utility>
7#include <vector>
8
9namespace eve::avatar_editing {
10namespace {} // namespace
14 const IAvatarTextureResolver* textures) {
15 const auto diagnostics = document.validate();
16 for (const auto& d : diagnostics)
17 if (d.severity() == DiagnosticSeverity::Error)
18 return Result<void>::failure(eve::Status(EditorStatus::Rejected, diagnostics));
19 std::vector<graphics::Texture*> resolved;
20 resolved.reserve(document.layers().size());
21 for (const auto& layer : document.layers()) {
22 if (!textures)
23 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.avatar.textures"),
24 "Image layers require an Avatar texture resolver");
25 auto texture = textures->texture(layer.textureAsset);
26 if (!texture.ok()) return Result<void>::failure(texture.status());
27 if (!texture.value())
28 return eve::editing::failed<void>(EditorStatus::NotFound, RuleId("editor.avatar.texture"),
29 "Avatar texture resolver returned no texture");
30 resolved.push_back(texture.value());
31 }
32 auto candidate = std::make_unique<avatar::AvatarInstance>(document.kind());
33 if (document.kind() == "live2d" && !candidate->loadLive2DModel(document.sourceAsset()))
34 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.avatar.live2d"),
35 "Live2D backend rejected the Avatar model");
36 if (document.kind() == "vroid") {
37 auto imported = candidate->loadVroidModel(document.sourceAsset());
38 if (!imported.ok()) return Result<void>::failure(imported.status());
39 }
40 for (std::size_t i = 0; i < document.layers().size(); ++i) {
41 const auto& layer = document.layers()[i];
42 if (!candidate->addLayer(layer.name, resolved[i], layer.zIndex) ||
43 !candidate->setLayerVisible(layer.name, layer.visible) ||
44 !candidate->setLayerOffset(layer.name, layer.offset[0], layer.offset[1]) ||
45 !candidate->setLayerSize(layer.name, layer.size[0], layer.size[1]) ||
46 !candidate->setLayerColor(layer.name, layer.color[0], layer.color[1], layer.color[2], layer.color[3]))
47 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.avatar.layer"),
48 "Avatar runtime rejected a validated image layer");
49 }
50 for (const auto& parameter : document.parameters()) {
51 if (!candidate->defineParameter(parameter.name, parameter.defaultValue, parameter.minimum, parameter.maximum))
52 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.avatar.parameter"),
53 "Avatar runtime rejected validated parameter metadata");
54 candidate->setParameter(parameter.name, parameter.value);
55 }
56 for (const auto& expression : document.expressions()) {
57 std::ostringstream spec;
58 bool first = true;
59 for (const auto& [name, value] : expression.channels) {
60 if (!first) spec << ';';
61 first = false;
62 spec << name << '=' << value;
63 }
64 if (!candidate->defineExpression(expression.name, spec.str()))
65 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.avatar.expression"),
66 "Avatar runtime rejected a validated expression");
67 }
68 instance_ = std::move(candidate);
69 revision_ = document.revision();
70 return eve::editing::applied<void>(diagnostics);
71}
72} // namespace eve::avatar_editing
double value
std::int32_t first
std::string imported
std::string name
TileLayer * layer
float d
float size
Definition TreeMesh.cpp:156
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
~AvatarDocumentRuntime()
Avatar document runtime.
AvatarDocumentRuntime()
Avatar document runtime.
Result< void > publish(const AvatarDocumentTarget &, const IAvatarTextureResolver *textures=nullptr)
Build all layers, metadata and expressions before replacing the live generation.
Revisioned image/Live2D/VRoid Avatar authoring asset.
std::vector< EditorDiagnostic > validate() const
Validate.
const std::vector< AvatarExpressionValue > & expressions() const
Expressions.
const std::string & sourceAsset() const
Source asset.
const std::string & kind() const
Kind.
const std::vector< AvatarLayerValue > & layers() const
Layers.
const std::vector< AvatarParameterValue > & parameters() const
Parameters.
Resolves image-layer textures for candidate publication.
virtual Result< graphics::Texture * > texture(const std::string &) const =0
Texture.
std::uint64_t revision() const override
Return the current revision.
editing::RuleId RuleId