Files
EVEngine/src/modules/editor/EditorAvatarRuntime.cpp
T

14 lines
3.1 KiB
C++

#include "editor/EditorAvatarTarget.h"
#include "avatar/AvatarInstance.h"
#include <sstream>
#include <utility>
#include <vector>
namespace eve::editor {
namespace {template<class T>EditorResult<T>fail(EditorStatus s,const char*r,std::string m){return EditorResult<T>::error(s,RuleId(r),std::move(m));}}
AvatarDocumentRuntime::AvatarDocumentRuntime()=default;AvatarDocumentRuntime::~AvatarDocumentRuntime()=default;
EditorResult<void>AvatarDocumentRuntime::publish(const AvatarDocumentTarget&document,const IAvatarTextureResolver*textures){const auto diagnostics=document.validate();for(const auto&d:diagnostics)if(d.severity==DiagnosticSeverity::Error){EditorResult<void>result;result.status=EditorStatus::Rejected;result.diagnostics=diagnostics;return result;}std::vector<graphics::Texture*>resolved;resolved.reserve(document.layers().size());for(const auto&layer:document.layers()){if(!textures)return fail<void>(EditorStatus::Rejected,"editor.avatar.textures","Image layers require an Avatar texture resolver");auto texture=textures->texture(layer.textureAsset);if(!texture.value||!*texture.value){EditorResult<void>failed;failed.status=texture.status;failed.diagnostics=std::move(texture.diagnostics);return failed;}resolved.push_back(*texture.value);}auto candidate=std::make_unique<avatar::AvatarInstance>(document.kind());if(document.kind()=="live2d"&&!candidate->loadLive2DModel(document.sourceAsset()))return fail<void>(EditorStatus::Failed,"editor.avatar.live2d","Live2D backend rejected the Avatar model");if(document.kind()=="vroid"&&!candidate->loadVroidModelPath(document.sourceAsset()))return fail<void>(EditorStatus::Failed,"editor.avatar.vroid","VRoid backend rejected the Avatar model path");for(std::size_t i=0;i<document.layers().size();++i){const auto&layer=document.layers()[i];if(!candidate->addLayer(layer.name,resolved[i],layer.zIndex)||!candidate->setLayerVisible(layer.name,layer.visible)||!candidate->setLayerOffset(layer.name,layer.offset[0],layer.offset[1])||!candidate->setLayerSize(layer.name,layer.size[0],layer.size[1])||!candidate->setLayerColor(layer.name,layer.color[0],layer.color[1],layer.color[2],layer.color[3]))return fail<void>(EditorStatus::Failed,"editor.avatar.layer","Avatar runtime rejected a validated image layer");}for(const auto&parameter:document.parameters()){if(!candidate->defineParameter(parameter.name,parameter.defaultValue,parameter.minimum,parameter.maximum))return fail<void>(EditorStatus::Failed,"editor.avatar.parameter","Avatar runtime rejected validated parameter metadata");candidate->setParameter(parameter.name,parameter.value);}for(const auto&expression:document.expressions()){std::ostringstream spec;bool first=true;for(const auto&[name,value]:expression.channels){if(!first)spec<<';';first=false;spec<<name<<'='<<value;}if(!candidate->defineExpression(expression.name,spec.str()))return fail<void>(EditorStatus::Failed,"editor.avatar.expression","Avatar runtime rejected a validated expression");}instance_=std::move(candidate);revision_=document.revision();EditorResult<void>result=EditorResult<void>::applied();result.diagnostics=diagnostics;return result;}
} // namespace eve::editor