1 /* 2 Open Asset Import Library (assimp) 3 ---------------------------------------------------------------------- 4 5 Copyright (c) 2006-2017, assimp team 6 7 All rights reserved. 8 9 Redistribution and use of this software in source and binary forms, 10 with or without modification, are permitted provided that the 11 following conditions are met: 12 13 * Redistributions of source code must retain the above 14 copyright notice, this list of conditions and the 15 following disclaimer. 16 17 * Redistributions in binary form must reproduce the above 18 copyright notice, this list of conditions and the 19 following disclaimer in the documentation and/or other 20 materials provided with the distribution. 21 22 * Neither the name of the assimp team, nor the names of its 23 contributors may be used to endorse or promote products 24 derived from this software without specific prior 25 written permission of the assimp team. 26 27 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 28 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 29 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 30 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 31 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 32 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 33 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 35 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 37 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38 39 ---------------------------------------------------------------------- 40 */ 41 /// \file X3DImporter_Macro.hpp 42 /// \brief Useful macrodefines. 43 /// \date 2015-2016 44 /// \author smal.root@gmail.com 45 46 #ifndef X3DIMPORTER_MACRO_HPP_INCLUDED 47 #define X3DIMPORTER_MACRO_HPP_INCLUDED 48 49 /// \def MACRO_USE_CHECKANDAPPLY(pDEF, pUSE, pNE) 50 /// Used for regular checking while attribute "USE" is defined. 51 /// \param [in] pDEF - string holding "DEF" value. 52 /// \param [in] pUSE - string holding "USE" value. 53 /// \param [in] pType - type of element to find. 54 /// \param [out] pNE - pointer to found node element. 55 #define MACRO_USE_CHECKANDAPPLY(pDEF, pUSE, pType, pNE) \ 56 do { \ 57 XML_CheckNode_MustBeEmpty(); \ 58 if(!pDEF.empty()) Throw_DEF_And_USE(); \ 59 if(!FindNodeElement(pUSE, CX3DImporter_NodeElement::pType, &pNE)) Throw_USE_NotFound(pUSE); \ 60 \ 61 NodeElement_Cur->Child.push_back(pNE);/* add found object as child to current element */ \ 62 } while(false) 63 64 /// \def MACRO_ATTRREAD_LOOPBEG 65 /// Begin of loop that read attributes values. 66 #define MACRO_ATTRREAD_LOOPBEG \ 67 for(int idx = 0, idx_end = mReader->getAttributeCount(); idx < idx_end; idx++) \ 68 { \ 69 std::string an(mReader->getAttributeName(idx)); 70 71 /// \def MACRO_ATTRREAD_LOOPEND 72 /// End of loop that read attributes values. 73 #define MACRO_ATTRREAD_LOOPEND \ 74 Throw_IncorrectAttr(an); \ 75 } 76 77 /// \def MACRO_ATTRREAD_CHECK_REF 78 /// Check curent attribute name and if it equal to requested then read value. Result write to output variable by reference. If result was read then 79 /// "continue" will called. 80 /// \param [in] pAttrName - attribute name. 81 /// \param [out] pVarName - output variable name. 82 /// \param [in] pFunction - function which read attribute value and write it to pVarName. 83 #define MACRO_ATTRREAD_CHECK_REF(pAttrName, pVarName, pFunction) \ 84 if(an == pAttrName) \ 85 { \ 86 pFunction(idx, pVarName); \ 87 continue; \ 88 } 89 90 /// \def MACRO_ATTRREAD_CHECK_RET 91 /// Check curent attribute name and if it equal to requested then read value. Result write to output variable using return value of \ref pFunction. 92 /// If result was read then "continue" will called. 93 /// \param [in] pAttrName - attribute name. 94 /// \param [out] pVarName - output variable name. 95 /// \param [in] pFunction - function which read attribute value and write it to pVarName. 96 #define MACRO_ATTRREAD_CHECK_RET(pAttrName, pVarName, pFunction) \ 97 if(an == pAttrName) \ 98 { \ 99 pVarName = pFunction(idx); \ 100 continue; \ 101 } 102 103 /// \def MACRO_ATTRREAD_CHECKUSEDEF_RET 104 /// Compact variant for checking "USE" and "DEF". Also skip bbox attributes: "bboxCenter", "bboxSize". 105 /// If result was read then "continue" will called. 106 /// \param [out] pDEF_Var - output variable name for "DEF" value. 107 /// \param [out] pUSE_Var - output variable name for "USE" value. 108 #define MACRO_ATTRREAD_CHECKUSEDEF_RET(pDEF_Var, pUSE_Var) \ 109 MACRO_ATTRREAD_CHECK_RET("DEF", pDEF_Var, mReader->getAttributeValue); \ 110 MACRO_ATTRREAD_CHECK_RET("USE", pUSE_Var, mReader->getAttributeValue); \ 111 if(an == "bboxCenter") continue; \ 112 if(an == "bboxSize") continue; \ 113 if(an == "containerField") continue; \ 114 do {} while(false) 115 116 /// \def MACRO_NODECHECK_LOOPBEGIN(pNodeName) 117 /// Begin of loop of parsing child nodes. Do not add ';' at end. 118 /// \param [in] pNodeName - current node name. 119 #define MACRO_NODECHECK_LOOPBEGIN(pNodeName) \ 120 do { \ 121 bool close_found = false; \ 122 \ 123 while(mReader->read()) \ 124 { \ 125 if(mReader->getNodeType() == irr::io::EXN_ELEMENT) \ 126 { 127 128 /// \def MACRO_NODECHECK_LOOPEND(pNodeName) 129 /// End of loop of parsing child nodes. 130 /// \param [in] pNodeName - current node name. 131 #define MACRO_NODECHECK_LOOPEND(pNodeName) \ 132 }/* if(mReader->getNodeType() == irr::io::EXN_ELEMENT) */ \ 133 else if(mReader->getNodeType() == irr::io::EXN_ELEMENT_END) \ 134 { \ 135 if(XML_CheckNode_NameEqual(pNodeName)) \ 136 { \ 137 close_found = true; \ 138 \ 139 break; \ 140 } \ 141 }/* else if(mReader->getNodeType() == irr::io::EXN_ELEMENT_END) */ \ 142 }/* while(mReader->read()) */ \ 143 \ 144 if(!close_found) Throw_CloseNotFound(pNodeName); \ 145 \ 146 } while(false) 147 148 #define MACRO_NODECHECK_METADATA(pNodeName) \ 149 MACRO_NODECHECK_LOOPBEGIN(pNodeName) \ 150 /* and childs must be metadata nodes */ \ 151 if(!ParseHelper_CheckRead_X3DMetadataObject()) XML_CheckNode_SkipUnsupported(pNodeName); \ 152 MACRO_NODECHECK_LOOPEND(pNodeName) 153 154 /// \def MACRO_FACE_ADD_QUAD_FA(pCCW, pOut, pIn, pP1, pP2, pP3, pP4) 155 /// Add points as quad. Means that pP1..pP4 set in CCW order. 156 #define MACRO_FACE_ADD_QUAD_FA(pCCW, pOut, pIn, pP1, pP2, pP3, pP4) \ 157 do { \ 158 if(pCCW) \ 159 { \ 160 pOut.push_back(pIn[pP1]); \ 161 pOut.push_back(pIn[pP2]); \ 162 pOut.push_back(pIn[pP3]); \ 163 pOut.push_back(pIn[pP4]); \ 164 } \ 165 else \ 166 { \ 167 pOut.push_back(pIn[pP4]); \ 168 pOut.push_back(pIn[pP3]); \ 169 pOut.push_back(pIn[pP2]); \ 170 pOut.push_back(pIn[pP1]); \ 171 } \ 172 } while(false) 173 174 /// \def MACRO_FACE_ADD_QUAD(pCCW, pOut, pP1, pP2, pP3, pP4) 175 /// Add points as quad. Means that pP1..pP4 set in CCW order. 176 #define MACRO_FACE_ADD_QUAD(pCCW, pOut, pP1, pP2, pP3, pP4) \ 177 do { \ 178 if(pCCW) \ 179 { \ 180 pOut.push_back(pP1); \ 181 pOut.push_back(pP2); \ 182 pOut.push_back(pP3); \ 183 pOut.push_back(pP4); \ 184 } \ 185 else \ 186 { \ 187 pOut.push_back(pP4); \ 188 pOut.push_back(pP3); \ 189 pOut.push_back(pP2); \ 190 pOut.push_back(pP1); \ 191 } \ 192 } while(false) 193 194 #endif // X3DIMPORTER_MACRO_HPP_INCLUDED 195