-class FaceXMLImporter {
- struct xml_state_t {
- enum EState {
- eDefault,
- ePlanePts,
- eTexdef,
- eBPMatrix,
- eFlags,
- eShader,
- };
-
- EState m_state;
- StringOutputStream m_content;
-
- xml_state_t(EState state)
- : m_state(state)
- {}
-
- EState state() const
- {
- return m_state;
- }
-
- const char *content() const
- {
- return m_content.c_str();
- }
-
- std::size_t write(const char *buffer, std::size_t length)
- {
- return m_content.write(buffer, length);
- }
- };
-
- std::vector<xml_state_t> m_xml_state;
- Face &m_face;
-public:
- FaceXMLImporter(Face &face) : m_face(face)
- {
- m_xml_state.push_back(xml_state_t::eDefault);
- }
-
- ~FaceXMLImporter()
- {
- m_face.planeChanged();
- }
-
- void pushElement(const XMLElement &element)
- {
- ASSERT_MESSAGE(m_xml_state.back().state() == xml_state_t::eDefault, "parse error");
-
- if (strcmp(element.name(), "planepts") == 0) {
- m_xml_state.push_back(xml_state_t::ePlanePts);
- } else if (strcmp(element.name(), "texdef") == 0) {
- m_xml_state.push_back(xml_state_t::eTexdef);
- } else if (strcmp(element.name(), "bpmatrix") == 0) {
- m_xml_state.push_back(xml_state_t::eBPMatrix);
- } else if (strcmp(element.name(), "flags") == 0) {
- m_xml_state.push_back(xml_state_t::eFlags);
- } else if (strcmp(element.name(), "shader") == 0) {
- m_xml_state.push_back(xml_state_t::eShader);
- }
- }
-
- void popElement(const char *name)
- {
- ASSERT_MESSAGE(m_xml_state.back().state() != xml_state_t::eDefault, "parse error");
-
- switch (m_xml_state.back().state()) {
- case xml_state_t::ePlanePts: {
- FacePlane_importXML(m_face.getPlane(), m_xml_state.back().content());
- }
- break;
- case xml_state_t::eTexdef: {
- FaceTexdef_importXML(m_face.getTexdef(), m_xml_state.back().content());
- }
- break;
- case xml_state_t::eBPMatrix: {
- FaceTexdef_BP_importXML(m_face.getTexdef(), m_xml_state.back().content());
- }
- break;
- case xml_state_t::eFlags: {
- StringTokeniser content(m_xml_state.back().content());
-
- m_face.getShader().m_flags.m_contentFlags = atoi(content.getToken());
- m_face.getShader().m_flags.m_surfaceFlags = atoi(content.getToken());
- m_face.getShader().m_flags.m_value = atoi(content.getToken());
- }
- break;
- case xml_state_t::eShader: {
- m_face.getShader().setShader(m_xml_state.back().content());
- }
- break;
- default:
- break;
- }
-
- m_xml_state.pop_back();
- }
-
- std::size_t write(const char *data, std::size_t length)
- {
- ASSERT_MESSAGE(!m_xml_state.empty(), "parse error");
- return m_xml_state.back().write(data, length);
- }