// // Created by martin on 04.02.22. // #include #include "AnimGraphResource.h" #include "3rdparty/json/json.hpp" using json = nlohmann::json; std::string sPinTypeToStr (SocketType pin_type) { std::string result = "unknown"; switch (pin_type) { case SocketType::SocketTypeFloat: result = "Float"; break; case SocketType::SocketTypeAnimation: result = "AnimationData"; break; default: result = "Unknown"; } return result; } json sSocketToJson(const Socket& pin) { json result; result["name"] = pin.m_name; result["type"] = sPinTypeToStr(pin.m_type); return result; } json sAnimGraphNodeToJson(const AnimNodeResource& node) { json result; result["name"] = node.m_name; result["type"] = "AnimNodeResource"; result["node_type"] = node.m_type_name; for (size_t j = 0; j < 2; j++) { result["position"][j] = node.m_position[j]; } return result; } AnimNodeResource sAnimGraphNodeFromJson(const json& json_node) { AnimNodeResource result; result.m_name = json_node["name"]; result.m_type_name = json_node["node_type"]; result.m_position[0] = json_node["position"][0]; result.m_position[1] = json_node["position"][1]; result.m_anim_node = AnimNodeFactory(result.m_type_name); result.m_socket_accessor = AnimNodeAccessorFactory(result.m_type_name, result.m_anim_node); return result; } json sAnimGraphConnectionToJson(const AnimGraphConnection& connection) { json result; result["type"] = "AnimGraphConnection"; result["source_node_index"] = connection.m_source_node_index; result["source_socket_index"] = connection.m_source_socket_index; result["target_node_index"] = connection.m_target_node_index; result["target_socket_index"] = connection.m_target_socket_index; return result; } AnimGraphConnection sAnimGraphConnectionFromJson(const json& json_node) { AnimGraphConnection connection; connection.m_source_node_index = json_node["source_node_index"]; connection.m_source_socket_index = json_node["source_socket_index"]; connection.m_target_node_index = json_node["target_node_index"]; connection.m_target_socket_index = json_node["target_socket_index"]; return connection; } void AnimGraphResource::clear() { m_name = ""; m_nodes.clear(); m_connections.clear(); } bool AnimGraphResource::saveToFile (const char* filename) const { json result; result["name"] = m_name; result["type"] = "AnimGraphResource"; for (size_t i = 0; i < m_nodes.size(); i++) { const AnimNodeResource& node = m_nodes[i]; result["nodes"][i] = sAnimGraphNodeToJson(node); } for (size_t i = 0; i < m_connections.size(); i++) { const AnimGraphConnection& connection = m_connections[i]; result["connections"][i] = sAnimGraphConnectionToJson(connection); } std::ofstream output_file; output_file.open (filename); output_file << to_string(result) << std::endl; output_file.close(); return true; } bool AnimGraphResource::loadFromFile (const char* filename) { std::ifstream input_file; input_file.open(filename); std::stringstream buffer; buffer << input_file.rdbuf(); json json_data = json::parse(buffer.str(), nullptr, false); if (json_data.is_discarded()) { std::cerr << "Error parsing json of file '" << filename << "'." << std::endl; } if (json_data["type"] != "AnimGraphResource") { std::cerr << "Invalid json object. Expected type 'AnimGraphResource' but got '" << json_data["type"] << "'." << std::endl; } clear(); m_name = json_data["name"]; for (size_t i = 0; i < json_data["nodes"].size(); i++) { const json& json_node = json_data["nodes"][i]; if (json_node["type"] != "AnimNodeResource") { std::cerr << "Invalid json object. Expected type 'AnimNodeResource' but got '" << json_node["type"] << "'." << std::endl; return false; } AnimNodeResource node = sAnimGraphNodeFromJson(json_node); m_nodes.push_back(node); } for (size_t i = 0; i < json_data["connections"].size(); i++) { const json& json_connection = json_data["connections"][i]; if (json_connection["type"] != "AnimGraphConnection") { std::cerr << "Invalid json object. Expected type 'AnimGraphConnection' but got '" << json_connection["type"] << "'." << std::endl; return false; } AnimGraphConnection connection = sAnimGraphConnectionFromJson(json_connection); m_connections.push_back(connection); } return false; }