// Copyright (c) 2023 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #include "SceneItemParser.hpp" using namespace Dawn; std::vector SceneItemParser::getRequiredAttributes() { return std::vector(); } std::map SceneItemParser::getOptionalAttributes() { return { { "ref", "" }, { "position", "" }, { "scale", "" } }; } int32_t SceneItemParser::onParse( Xml *node, std::map values, struct SceneItem *out, std::string *error ) { out->ref = values["ref"]; if(values["position"].size() > 0) { out->position = vec3Parser(values["position"], error); if(error->size() > 0) return 1; } if(values["scale"].size() > 0) { out->scale = vec3Parser(values["scale"], error); if(error->size() > 0) return 1; } auto itChildren = node->children.begin(); while(itChildren != node->children.end()) { // Parse child nodes, they may be components or not auto c = *itChildren; if(c->node == "child" || c->node == "item") { struct SceneItem child; child.registry = out->registry; auto ret = (SceneItemParser()).parse(c, &child, error); if(ret != 0) return ret; out->children.push_back(child); } else if(c->node == "asset") { struct SceneAsset asset; auto ret = (SceneAssetParser()).parse(c, &asset, error); if(ret != 0) return ret; out->assets.push_back(asset); } else { struct SceneItemComponent component; component.registry = out->registry; auto ret = (SceneItemComponentParser()).parse(c, &component, error); if(ret != 0) return ret; out->components.push_back(component); } ++itChildren; } return 0; }