X3DImporter_Metadata.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /// \file X3DImporter_Metadata.cpp
  2. /// \brief Parsing data from nodes of "Metadata" set of X3D.
  3. /// \date 2015-2016
  4. /// \author [email protected]
  5. #ifndef ASSIMP_BUILD_NO_X3D_IMPORTER
  6. #include "X3DImporter.hpp"
  7. #include "X3DImporter_Macro.hpp"
  8. namespace Assimp
  9. {
  10. /// \def MACRO_METADATA_FINDCREATE(pDEF_Var, pUSE_Var, pReference, pValue, pNE, pMetaName)
  11. /// Find element by "USE" or create new one.
  12. /// \param [in] pDEF_Var - variable name with "DEF" value.
  13. /// \param [in] pUSE_Var - variable name with "USE" value.
  14. /// \param [in] pReference - variable name with "reference" value.
  15. /// \param [in] pValue - variable name with "value" value.
  16. /// \param [in, out] pNE - pointer to node element.
  17. /// \param [in] pMetaClass - Class of node.
  18. /// \param [in] pMetaName - Name of node.
  19. /// \param [in] pType - type of element to find.
  20. #define MACRO_METADATA_FINDCREATE(pDEF_Var, pUSE_Var, pReference, pValue, pNE, pMetaClass, pMetaName, pType) \
  21. /* if "USE" defined then find already defined element. */ \
  22. if(!pUSE_Var.empty()) \
  23. { \
  24. MACRO_USE_CHECKANDAPPLY(pDEF_Var, pUSE_Var, pType, pNE); \
  25. } \
  26. else \
  27. { \
  28. pNE = new pMetaClass(NodeElement_Cur); \
  29. if(!pDEF_Var.empty()) pNE->ID = pDEF_Var; \
  30. \
  31. ((pMetaClass*)pNE)->Reference = pReference; \
  32. ((pMetaClass*)pNE)->Value = pValue; \
  33. /* also metadata node can contain childs */ \
  34. if(!mReader->isEmptyElement()) \
  35. ParseNode_Metadata(pNE, pMetaName);/* in that case node element will be added to child elements list of current node. */ \
  36. else \
  37. NodeElement_Cur->Child.push_back(pNE);/* else - add element to child list manualy */ \
  38. \
  39. NodeElement_List.push_back(pNE);/* add new element to elements list. */ \
  40. }/* if(!pUSE_Var.empty()) else */ \
  41. \
  42. do {} while(false)
  43. bool X3DImporter::ParseHelper_CheckRead_X3DMetadataObject()
  44. {
  45. if(XML_CheckNode_NameEqual("MetadataBoolean"))
  46. ParseNode_MetadataBoolean();
  47. else if(XML_CheckNode_NameEqual("MetadataDouble"))
  48. ParseNode_MetadataDouble();
  49. else if(XML_CheckNode_NameEqual("MetadataFloat"))
  50. ParseNode_MetadataFloat();
  51. else if(XML_CheckNode_NameEqual("MetadataInteger"))
  52. ParseNode_MetadataInteger();
  53. else if(XML_CheckNode_NameEqual("MetadataSet"))
  54. ParseNode_MetadataSet();
  55. else if(XML_CheckNode_NameEqual("MetadataString"))
  56. ParseNode_MetadataString();
  57. else
  58. return false;
  59. return true;
  60. }
  61. void X3DImporter::ParseNode_Metadata(CX3DImporter_NodeElement* pParentElement, const std::string& pNodeName)
  62. {
  63. ParseHelper_Node_Enter(pParentElement);
  64. MACRO_NODECHECK_METADATA(mReader->getNodeName());
  65. ParseHelper_Node_Exit();
  66. }
  67. // <MetadataBoolean
  68. // DEF="" ID
  69. // USE="" IDREF
  70. // name="" SFString [inputOutput]
  71. // reference="" SFString [inputOutput]
  72. // value="" MFBool [inputOutput]
  73. // />
  74. void X3DImporter::ParseNode_MetadataBoolean()
  75. {
  76. std::string def, use;
  77. std::string name, reference;
  78. std::list<bool> value;
  79. CX3DImporter_NodeElement* ne;
  80. MACRO_ATTRREAD_LOOPBEG;
  81. MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
  82. MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
  83. MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
  84. MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListB);
  85. MACRO_ATTRREAD_LOOPEND;
  86. MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaBoolean, "MetadataBoolean", ENET_MetaBoolean);
  87. }
  88. // <MetadataDouble
  89. // DEF="" ID
  90. // USE="" IDREF
  91. // name="" SFString [inputOutput]
  92. // reference="" SFString [inputOutput]
  93. // value="" MFDouble [inputOutput]
  94. // />
  95. void X3DImporter::ParseNode_MetadataDouble()
  96. {
  97. std::string def, use;
  98. std::string name, reference;
  99. std::list<double> value;
  100. CX3DImporter_NodeElement* ne;
  101. MACRO_ATTRREAD_LOOPBEG;
  102. MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
  103. MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
  104. MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
  105. MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListD);
  106. MACRO_ATTRREAD_LOOPEND;
  107. MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaDouble, "MetadataDouble", ENET_MetaDouble);
  108. }
  109. // <MetadataFloat
  110. // DEF="" ID
  111. // USE="" IDREF
  112. // name="" SFString [inputOutput]
  113. // reference="" SFString [inputOutput]
  114. // value="" MFFloat [inputOutput]
  115. // />
  116. void X3DImporter::ParseNode_MetadataFloat()
  117. {
  118. std::string def, use;
  119. std::string name, reference;
  120. std::list<float> value;
  121. CX3DImporter_NodeElement* ne;
  122. MACRO_ATTRREAD_LOOPBEG;
  123. MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
  124. MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
  125. MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
  126. MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListF);
  127. MACRO_ATTRREAD_LOOPEND;
  128. MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaFloat, "MetadataFloat", ENET_MetaFloat);
  129. }
  130. // <MetadataInteger
  131. // DEF="" ID
  132. // USE="" IDREF
  133. // name="" SFString [inputOutput]
  134. // reference="" SFString [inputOutput]
  135. // value="" MFInteger [inputOutput]
  136. // />
  137. void X3DImporter::ParseNode_MetadataInteger()
  138. {
  139. std::string def, use;
  140. std::string name, reference;
  141. std::list<int32_t> value;
  142. CX3DImporter_NodeElement* ne;
  143. MACRO_ATTRREAD_LOOPBEG;
  144. MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
  145. MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
  146. MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
  147. MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListI32);
  148. MACRO_ATTRREAD_LOOPEND;
  149. MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaInteger, "MetadataInteger", ENET_MetaInteger);
  150. }
  151. // <MetadataSet
  152. // DEF="" ID
  153. // USE="" IDREF
  154. // name="" SFString [inputOutput]
  155. // reference="" SFString [inputOutput]
  156. // />
  157. void X3DImporter::ParseNode_MetadataSet()
  158. {
  159. std::string def, use;
  160. std::string name, reference;
  161. CX3DImporter_NodeElement* ne;
  162. MACRO_ATTRREAD_LOOPBEG;
  163. MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
  164. MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
  165. MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
  166. MACRO_ATTRREAD_LOOPEND;
  167. // if "USE" defined then find already defined element.
  168. if(!use.empty())
  169. {
  170. MACRO_USE_CHECKANDAPPLY(def, use, ENET_MetaSet, ne);
  171. }
  172. else
  173. {
  174. ne = new CX3DImporter_NodeElement_MetaSet(NodeElement_Cur);
  175. if(!def.empty()) ne->ID = def;
  176. ((CX3DImporter_NodeElement_MetaSet*)ne)->Reference = reference;
  177. // also metadata node can contain childs
  178. if(!mReader->isEmptyElement())
  179. ParseNode_Metadata(ne, "MetadataSet");
  180. else
  181. NodeElement_Cur->Child.push_back(ne);// made object as child to current element
  182. NodeElement_List.push_back(ne);// add new element to elements list.
  183. }// if(!use.empty()) else
  184. }
  185. // <MetadataString
  186. // DEF="" ID
  187. // USE="" IDREF
  188. // name="" SFString [inputOutput]
  189. // reference="" SFString [inputOutput]
  190. // value="" MFString [inputOutput]
  191. // />
  192. void X3DImporter::ParseNode_MetadataString()
  193. {
  194. std::string def, use;
  195. std::string name, reference;
  196. std::list<std::string> value;
  197. CX3DImporter_NodeElement* ne;
  198. MACRO_ATTRREAD_LOOPBEG;
  199. MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
  200. MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
  201. MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
  202. MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListS);
  203. MACRO_ATTRREAD_LOOPEND;
  204. MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaString, "MetadataString", ENET_MetaString);
  205. }
  206. }// namespace Assimp
  207. #endif // !ASSIMP_BUILD_NO_X3D_IMPORTER