/// \file X3DImporter_Light.cpp /// \brief Parsing data from nodes of "Lighting" set of X3D. /// \date 2015-2016 /// \author nevorek@gmail.com #ifndef ASSIMP_BUILD_NO_X3D_IMPORTER #include "X3DImporter.hpp" #include "X3DImporter_Macro.hpp" #include namespace Assimp { // void X3DImporter::ParseNode_Lighting_DirectionalLight() { std::string def, use; float ambientIntensity = 0; aiColor3D color(1, 1, 1); aiVector3D direction(0, 0, -1); bool global = false; float intensity = 1; bool on = true; CX3DImporter_NodeElement* ne; MACRO_ATTRREAD_LOOPBEG; MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use); MACRO_ATTRREAD_CHECK_RET("ambientIntensity", ambientIntensity, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("color", color, XML_ReadNode_GetAttrVal_AsCol3f); MACRO_ATTRREAD_CHECK_REF("direction", direction, XML_ReadNode_GetAttrVal_AsVec3f); MACRO_ATTRREAD_CHECK_RET("global", global, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_CHECK_RET("intensity", intensity, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_RET("on", on, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_LOOPEND; // if "USE" defined then find already defined element. if(!use.empty()) { MACRO_USE_CHECKANDAPPLY(def, use, ENET_DirectionalLight, ne); } else { if(on) { // create and if needed - define new geometry object. ne = new CX3DImporter_NodeElement_Light(CX3DImporter_NodeElement::ENET_DirectionalLight, NodeElement_Cur); if(!def.empty()) ne->ID = def; else ne->ID = boost::str(boost::format("DirectionalLight_%s") % (size_t)ne);// make random name ((CX3DImporter_NodeElement_Light*)ne)->AmbientIntensity = ambientIntensity; ((CX3DImporter_NodeElement_Light*)ne)->Color = color; ((CX3DImporter_NodeElement_Light*)ne)->Direction = direction; ((CX3DImporter_NodeElement_Light*)ne)->Global = global; ((CX3DImporter_NodeElement_Light*)ne)->Intensity = intensity; // Assimp want a node with name similar to a light. "Why? I don't no." ) ParseHelper_Group_Begin(false); NodeElement_Cur->ID = ne->ID;// assign name to node and return to light element. ParseHelper_Node_Exit(); // check for child nodes if(!mReader->isEmptyElement()) ParseNode_Metadata(ne, "DirectionalLight"); 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(on) }// if(!use.empty()) else } // void X3DImporter::ParseNode_Lighting_PointLight() { std::string def, use; float ambientIntensity = 0; aiVector3D attenuation(1, 0, 0); aiColor3D color(1, 1, 1); bool global = true; float intensity = 1; aiVector3D location(0, 0, 0); bool on = true; float radius = 100; CX3DImporter_NodeElement* ne; MACRO_ATTRREAD_LOOPBEG; MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use); MACRO_ATTRREAD_CHECK_RET("ambientIntensity", ambientIntensity, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("attenuation", attenuation, XML_ReadNode_GetAttrVal_AsVec3f); MACRO_ATTRREAD_CHECK_REF("color", color, XML_ReadNode_GetAttrVal_AsCol3f); MACRO_ATTRREAD_CHECK_RET("global", global, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_CHECK_RET("intensity", intensity, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("location", location, XML_ReadNode_GetAttrVal_AsVec3f); MACRO_ATTRREAD_CHECK_RET("on", on, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_CHECK_RET("radius", radius, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_LOOPEND; // if "USE" defined then find already defined element. if(!use.empty()) { MACRO_USE_CHECKANDAPPLY(def, use, ENET_PointLight, ne); } else { if(on) { // create and if needed - define new geometry object. ne = new CX3DImporter_NodeElement_Light(CX3DImporter_NodeElement::ENET_PointLight, NodeElement_Cur); if(!def.empty()) ne->ID = def; ((CX3DImporter_NodeElement_Light*)ne)->AmbientIntensity = ambientIntensity; ((CX3DImporter_NodeElement_Light*)ne)->Attenuation = attenuation; ((CX3DImporter_NodeElement_Light*)ne)->Color = color; ((CX3DImporter_NodeElement_Light*)ne)->Global = global; ((CX3DImporter_NodeElement_Light*)ne)->Intensity = intensity; ((CX3DImporter_NodeElement_Light*)ne)->Location = location; ((CX3DImporter_NodeElement_Light*)ne)->Radius = radius; // Assimp want a node with name similar to a light. "Why? I don't no." ) ParseHelper_Group_Begin(false); // make random name if(ne->ID.empty()) ne->ID = boost::str(boost::format("PointLight_%s") % (size_t)ne); NodeElement_Cur->ID = ne->ID;// assign name to node and return to light element. ParseHelper_Node_Exit(); // check for child nodes if(!mReader->isEmptyElement()) ParseNode_Metadata(ne, "PointLight"); 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(on) }// if(!use.empty()) else } // void X3DImporter::ParseNode_Lighting_SpotLight() { std::string def, use; float ambientIntensity = 0; aiVector3D attenuation(1, 0, 0); float beamWidth = 0.7854; aiColor3D color(1, 1, 1); float cutOffAngle = 1.570796; aiVector3D direction(0, 0, -1); bool global = true; float intensity = 1; aiVector3D location(0, 0, 0); bool on = true; float radius = 100; CX3DImporter_NodeElement* ne; MACRO_ATTRREAD_LOOPBEG; MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use); MACRO_ATTRREAD_CHECK_RET("ambientIntensity", ambientIntensity, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("attenuation", attenuation, XML_ReadNode_GetAttrVal_AsVec3f); MACRO_ATTRREAD_CHECK_RET("beamWidth", beamWidth, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("color", color, XML_ReadNode_GetAttrVal_AsCol3f); MACRO_ATTRREAD_CHECK_RET("cutOffAngle", cutOffAngle, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("direction", direction, XML_ReadNode_GetAttrVal_AsVec3f); MACRO_ATTRREAD_CHECK_RET("global", global, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_CHECK_RET("intensity", intensity, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_CHECK_REF("location", location, XML_ReadNode_GetAttrVal_AsVec3f); MACRO_ATTRREAD_CHECK_RET("on", on, XML_ReadNode_GetAttrVal_AsBool); MACRO_ATTRREAD_CHECK_RET("radius", radius, XML_ReadNode_GetAttrVal_AsFloat); MACRO_ATTRREAD_LOOPEND; // if "USE" defined then find already defined element. if(!use.empty()) { MACRO_USE_CHECKANDAPPLY(def, use, ENET_SpotLight, ne); } else { if(on) { // create and if needed - define new geometry object. ne = new CX3DImporter_NodeElement_Light(CX3DImporter_NodeElement::ENET_SpotLight, NodeElement_Cur); if(!def.empty()) ne->ID = def; if(beamWidth > cutOffAngle) beamWidth = cutOffAngle; ((CX3DImporter_NodeElement_Light*)ne)->AmbientIntensity = ambientIntensity; ((CX3DImporter_NodeElement_Light*)ne)->Attenuation = attenuation; ((CX3DImporter_NodeElement_Light*)ne)->BeamWidth = beamWidth; ((CX3DImporter_NodeElement_Light*)ne)->Color = color; ((CX3DImporter_NodeElement_Light*)ne)->CutOffAngle = cutOffAngle; ((CX3DImporter_NodeElement_Light*)ne)->Direction = direction; ((CX3DImporter_NodeElement_Light*)ne)->Global = global; ((CX3DImporter_NodeElement_Light*)ne)->Intensity = intensity; ((CX3DImporter_NodeElement_Light*)ne)->Location = location; ((CX3DImporter_NodeElement_Light*)ne)->Radius = radius; // Assimp want a node with name similar to a light. "Why? I don't no." ) ParseHelper_Group_Begin(false); // make random name if(ne->ID.empty()) ne->ID = boost::str(boost::format("SpotLight_%s") % (size_t)ne); NodeElement_Cur->ID = ne->ID;// assign name to node and return to light element. ParseHelper_Node_Exit(); // check for child nodes if(!mReader->isEmptyElement()) ParseNode_Metadata(ne, "SpotLight"); 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(on) }// if(!use.empty()) else } }// namespace Assimp #endif // !ASSIMP_BUILD_NO_X3D_IMPORTER