/// \file X3DImporter_Texturing.cpp /// \brief Parsing data from nodes of "Texturing" set of X3D. /// \date 2015-2016 /// \author smal.root@gmail.com #ifndef ASSIMP_BUILD_NO_X3D_IMPORTER #include "X3DImporter.hpp" #include "X3DImporter_Macro.hpp" namespace Assimp { // // When the url field contains no values ([]), texturing is disabled. void X3DImporter::ParseNode_Texturing_ImageTexture() { std::string use, def; bool repeatS = true; bool repeatT = true; std::list url; CX3DImporter_NodeElement* ne; MACRO_ATTRREAD_LOOPBEG; MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use); MACRO_ATTRREAD_CHECK_RET("repeatS", repeatS, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_CHECK_RET("repeatT", repeatT, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_CHECK_REF("url", url, XML_ReadNode_GetAttrVal_AsListS); MACRO_ATTRREAD_LOOPEND; // if "USE" defined then find already defined element. if(!use.empty()) { MACRO_USE_CHECKANDAPPLY(def, use, ENET_ImageTexture, ne); } else { // create and if needed - define new geometry object. ne = new CX3DImporter_NodeElement_ImageTexture(NodeElement_Cur); if(!def.empty()) ne->ID = def; ((CX3DImporter_NodeElement_ImageTexture*)ne)->RepeatS = repeatS; ((CX3DImporter_NodeElement_ImageTexture*)ne)->RepeatT = repeatT; // Attribute "url" can contain list of strings. But we need only one - first. if(url.size() > 0) ((CX3DImporter_NodeElement_ImageTexture*)ne)->URL = url.front(); else ((CX3DImporter_NodeElement_ImageTexture*)ne)->URL = ""; // check for X3DMetadataObject childs. if(!mReader->isEmptyElement()) ParseNode_Metadata(ne, "ImageTexture"); else NodeElement_Cur->Child.push_back(ne);// add made object as child to current element NodeElement_List.push_back(ne);// add element to node element list because its a new object in graph }// if(!use.empty()) else } // void X3DImporter::ParseNode_Texturing_TextureCoordinate() { std::string use, def; std::list point; CX3DImporter_NodeElement* ne; MACRO_ATTRREAD_LOOPBEG; MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use); MACRO_ATTRREAD_CHECK_REF("point", point, XML_ReadNode_GetAttrVal_AsListVec2f); MACRO_ATTRREAD_LOOPEND; // if "USE" defined then find already defined element. if(!use.empty()) { MACRO_USE_CHECKANDAPPLY(def, use, ENET_TextureCoordinate, ne); } else { // create and if needed - define new geometry object. ne = new CX3DImporter_NodeElement_TextureCoordinate(NodeElement_Cur); if(!def.empty()) ne->ID = def; ((CX3DImporter_NodeElement_TextureCoordinate*)ne)->Value = point; // check for X3DMetadataObject childs. if(!mReader->isEmptyElement()) ParseNode_Metadata(ne, "TextureCoordinate"); else NodeElement_Cur->Child.push_back(ne);// add made object as child to current element NodeElement_List.push_back(ne);// add element to node element list because its a new object in graph }// if(!use.empty()) else } // void X3DImporter::ParseNode_Texturing_TextureTransform() { std::string use, def; aiVector2D center(0, 0); float rotation = 0; aiVector2D scale(1, 1); aiVector2D translation(0, 0); CX3DImporter_NodeElement* ne; MACRO_ATTRREAD_LOOPBEG; MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use); MACRO_ATTRREAD_CHECK_REF("center", center, XML_ReadNode_GetAttrVal_AsVec2f); MACRO_ATTRREAD_CHECK_RET("rotation", rotation, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("scale", scale, XML_ReadNode_GetAttrVal_AsVec2f); MACRO_ATTRREAD_CHECK_REF("translation", translation, XML_ReadNode_GetAttrVal_AsVec2f); MACRO_ATTRREAD_LOOPEND; // if "USE" defined then find already defined element. if(!use.empty()) { MACRO_USE_CHECKANDAPPLY(def, use, ENET_TextureTransform, ne); } else { // create and if needed - define new geometry object. ne = new CX3DImporter_NodeElement_TextureTransform(NodeElement_Cur); if(!def.empty()) ne->ID = def; ((CX3DImporter_NodeElement_TextureTransform*)ne)->Center = center; ((CX3DImporter_NodeElement_TextureTransform*)ne)->Rotation = rotation; ((CX3DImporter_NodeElement_TextureTransform*)ne)->Scale = scale; ((CX3DImporter_NodeElement_TextureTransform*)ne)->Translation = translation; // check for X3DMetadataObject childs. if(!mReader->isEmptyElement()) ParseNode_Metadata(ne, "TextureTransform"); else NodeElement_Cur->Child.push_back(ne);// add made object as child to current element NodeElement_List.push_back(ne);// add element to node element list because its a new object in graph }// if(!use.empty()) else } }// namespace Assimp #endif // !ASSIMP_BUILD_NO_X3D_IMPORTER