Fixes
This commit is contained in:
@@ -75,7 +75,7 @@ bool X3DImporter::isNodeEmpty(XmlNode &node) {
|
||||
}
|
||||
|
||||
void X3DImporter::checkNodeMustBeEmpty(XmlNode &node) {
|
||||
if (isNodeEmpty(node)) throw DeadlyImportError(std::string("Node <") + node.name() + "> must be empty.");
|
||||
if (!isNodeEmpty(node)) throw DeadlyImportError(std::string("Node <") + node.name() + "> must be empty.");
|
||||
}
|
||||
|
||||
void X3DImporter::skipUnsupportedNode(const std::string &pParentNodeName, XmlNode &node) {
|
||||
@@ -321,7 +321,7 @@ void X3DImporter::readHead(XmlNode &node) {
|
||||
for (auto currentNode : node.children()) {
|
||||
const std::string ¤tName = currentNode.name();
|
||||
if (currentName == "meta") {
|
||||
checkNodeMustBeEmpty(node);
|
||||
//checkNodeMustBeEmpty(node);
|
||||
meta_entry entry;
|
||||
if (XmlParser::getStdStrAttribute(currentNode, "name", entry.name)) {
|
||||
XmlParser::getStdStrAttribute(currentNode, "content", entry.value);
|
||||
@@ -339,6 +339,9 @@ void X3DImporter::readHead(XmlNode &node) {
|
||||
}
|
||||
|
||||
void X3DImporter::readChildNodes(XmlNode &node, const std::string &pParentNodeName) {
|
||||
if (node.empty()) {
|
||||
return;
|
||||
}
|
||||
for (auto currentNode : node.children()) {
|
||||
const std::string ¤tName = currentNode.name();
|
||||
if (currentName == "Shape")
|
||||
@@ -463,6 +466,8 @@ void X3DImporter::ParseHelper_Group_Begin(const bool pStatic) {
|
||||
}
|
||||
|
||||
void X3DImporter::ParseHelper_Node_Enter(X3DNodeElementBase *pNode) {
|
||||
ai_assert(nullptr != pNode);
|
||||
|
||||
mNodeElementCur->Children.push_back(pNode); // add new element to current element child list.
|
||||
mNodeElementCur = pNode; // switch current element to new one.
|
||||
}
|
||||
@@ -471,6 +476,9 @@ void X3DImporter::ParseHelper_Node_Exit() {
|
||||
// check if we can walk up.
|
||||
if (mNodeElementCur != nullptr) {
|
||||
mNodeElementCur = mNodeElementCur->Parent;
|
||||
} else {
|
||||
int i = 0;
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -270,6 +270,7 @@ public:
|
||||
void Clear();
|
||||
|
||||
private:
|
||||
X3DNodeElementBase *MACRO_USE_CHECKANDAPPLY(XmlNode &node, std::string pDEF, std::string pUSE, X3DElemType pType, X3DNodeElementBase *pNE);
|
||||
bool isNodeEmpty(XmlNode &node);
|
||||
void checkNodeMustBeEmpty(XmlNode &node);
|
||||
void skipUnsupportedNode(const std::string &pParentNodeName, XmlNode &node);
|
||||
|
||||
@@ -78,7 +78,7 @@ void X3DImporter::readArc2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Arc2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Arc2D, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementGeometry2D(X3DElemType::ENET_Arc2D, mNodeElementCur);
|
||||
@@ -138,7 +138,7 @@ void X3DImporter::readArcClose2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_ArcClose2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_ArcClose2D, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementGeometry2D(X3DElemType::ENET_ArcClose2D, mNodeElementCur);
|
||||
@@ -185,7 +185,7 @@ void X3DImporter::readCircle2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Circle2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Circle2D, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementGeometry2D(X3DElemType::ENET_Circle2D, mNodeElementCur);
|
||||
@@ -234,7 +234,7 @@ void X3DImporter::readDisk2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Disk2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Disk2D, ne);
|
||||
} else {
|
||||
std::list<aiVector3D> tlist_o, tlist_i;
|
||||
|
||||
@@ -308,7 +308,7 @@ void X3DImporter::readPolyline2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Polyline2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Polyline2D, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementGeometry2D(X3DElemType::ENET_Polyline2D, mNodeElementCur);
|
||||
@@ -351,7 +351,7 @@ void X3DImporter::readPolypoint2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Polypoint2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Polypoint2D, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementGeometry2D(X3DElemType::ENET_Polypoint2D, mNodeElementCur);
|
||||
@@ -391,7 +391,7 @@ void X3DImporter::readRectangle2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Rectangle2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Rectangle2D, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementGeometry2D(X3DElemType::ENET_Rectangle2D, mNodeElementCur);
|
||||
@@ -437,7 +437,7 @@ void X3DImporter::readTriangleSet2D(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleSet2D, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleSet2D, ne);
|
||||
} else {
|
||||
if (vertices.size() % 3) throw DeadlyImportError("TriangleSet2D. Not enough points for defining triangle.");
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -72,9 +72,8 @@ void X3DImporter::startReadGroup(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
X3DNodeElementBase *ne;
|
||||
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
X3DNodeElementBase *ne = nullptr;
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
} else {
|
||||
ParseHelper_Group_Begin(); // create new grouping element and go deeper if node has children.
|
||||
// at this place new group mode created and made current, so we can name it.
|
||||
@@ -111,9 +110,9 @@ void X3DImporter::startReadStaticGroup(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
X3DNodeElementBase *ne;
|
||||
X3DNodeElementBase *ne = nullptr;
|
||||
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
} else {
|
||||
ParseHelper_Group_Begin(true); // create new grouping element and go deeper if node has children.
|
||||
// at this place new group mode created and made current, so we can name it.
|
||||
@@ -154,9 +153,9 @@ void X3DImporter::startReadSwitch(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
X3DNodeElementBase *ne;
|
||||
X3DNodeElementBase *ne=nullptr;
|
||||
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
} else {
|
||||
ParseHelper_Group_Begin(); // create new grouping element and go deeper if node has children.
|
||||
// at this place new group mode created and made current, so we can name it.
|
||||
@@ -228,7 +227,7 @@ void X3DImporter::startReadTransform(XmlNode &node) {
|
||||
if (!use.empty()) {
|
||||
X3DNodeElementBase *ne(nullptr);
|
||||
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
} else {
|
||||
ParseHelper_Group_Begin(); // create new grouping element and go deeper if node has children.
|
||||
// at this place new group mode created and made current, so we can name it.
|
||||
|
||||
@@ -83,7 +83,7 @@ void X3DImporter::readDirectionalLight(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_DirectionalLight, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_DirectionalLight, ne);
|
||||
} else {
|
||||
if (on) {
|
||||
// create and if needed - define new geometry object.
|
||||
@@ -150,7 +150,7 @@ void X3DImporter::readPointLight(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_PointLight, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_PointLight, ne);
|
||||
} else {
|
||||
if (on) {
|
||||
// create and if needed - define new geometry object.
|
||||
@@ -227,7 +227,7 @@ void X3DImporter::readSpotLight(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_SpotLight, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_SpotLight, ne);
|
||||
} else {
|
||||
if (on) {
|
||||
// create and if needed - define new geometry object.
|
||||
|
||||
@@ -47,20 +47,36 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef X3DIMPORTER_MACRO_HPP_INCLUDED
|
||||
#define X3DIMPORTER_MACRO_HPP_INCLUDED
|
||||
|
||||
/// \def MACRO_USE_CHECKANDAPPLY(pDEF, pUSE, pNE)
|
||||
#include <assimp/XmlParser.h>
|
||||
#include "X3DImporter.hpp"
|
||||
#include <string>
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
/// Used for regular checking while attribute "USE" is defined.
|
||||
/// \param [in] pNode - pugi xml node to read.
|
||||
/// \param [in] pDEF - string holding "DEF" value.
|
||||
/// \param [in] pUSE - string holding "USE" value.
|
||||
/// \param [in] pType - type of element to find.
|
||||
/// \param [out] pNE - pointer to found node element.
|
||||
#define MACRO_USE_CHECKANDAPPLY(pNode, pDEF, pUSE, pType, pNE) \
|
||||
do { \
|
||||
checkNodeMustBeEmpty(pNode); \
|
||||
if (!pDEF.empty()) Throw_DEF_And_USE(pNode.name()); \
|
||||
if (!FindNodeElement(pUSE, X3DElemType::pType, &pNE)) Throw_USE_NotFound(pNode.name(), pUSE); \
|
||||
mNodeElementCur->Children.push_back(pNE); /* add found object as child to current element */ \
|
||||
} while (false)
|
||||
inline X3DNodeElementBase *X3DImporter::MACRO_USE_CHECKANDAPPLY(XmlNode &node, std::string pDEF, std::string pUSE, X3DElemType pType, X3DNodeElementBase *pNE) {
|
||||
if (nullptr == mNodeElementCur) {
|
||||
printf("here\n");
|
||||
}
|
||||
|
||||
//do {
|
||||
checkNodeMustBeEmpty(node);
|
||||
if (!pDEF.empty())
|
||||
Assimp::Throw_DEF_And_USE(node.name());
|
||||
if (!FindNodeElement(pUSE, pType, &pNE))
|
||||
Assimp::Throw_USE_NotFound(node.name(), pUSE);
|
||||
mNodeElementCur->Children.push_back(pNE); /* add found object as child to current element */
|
||||
//} while (false);
|
||||
|
||||
return pNE;
|
||||
}
|
||||
|
||||
} // namespace Assimp
|
||||
|
||||
/// \def MACRO_ATTRREAD_CHECKUSEDEF_RET
|
||||
/// Compact variant for checking "USE" and "DEF".
|
||||
|
||||
@@ -93,7 +93,7 @@ void X3DImporter::childrenReadMetadata(XmlNode &node, X3DNodeElementBase *pParen
|
||||
#define MACRO_METADATA_FINDCREATE(pNode, pDEF_Var, pUSE_Var, pReference, pValue, pNE, pMetaClass, pMetaName, pType) \
|
||||
/* if "USE" defined then find already defined element. */ \
|
||||
if (!pUSE_Var.empty()) { \
|
||||
MACRO_USE_CHECKANDAPPLY(pNode, pDEF_Var, pUSE_Var, pType, pNE); \
|
||||
ne = MACRO_USE_CHECKANDAPPLY(pNode, pDEF_Var, pUSE_Var, pType, pNE); \
|
||||
} else { \
|
||||
pNE = new pMetaClass(mNodeElementCur); \
|
||||
if (!pDEF_Var.empty()) pNE->ID = pDEF_Var; \
|
||||
@@ -213,13 +213,13 @@ void X3DImporter::readMetadataSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_MetaSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_MetaSet, ne);
|
||||
} else {
|
||||
ne = new X3DNodeElementMetaSet(mNodeElementCur);
|
||||
if (!def.empty()) ne->ID = def;
|
||||
|
||||
((X3DNodeElementMetaSet *)ne)->Reference = reference;
|
||||
// also metadata node can contain childs
|
||||
// also metadata node can contain children
|
||||
if (!isNodeEmpty(node))
|
||||
childrenReadMetadata(node, ne, "MetadataSet");
|
||||
else
|
||||
|
||||
@@ -78,10 +78,9 @@ void X3DImporter::readInline(XmlNode &node) {
|
||||
X3DXmlHelper::getStringListAttribute(node, "url", url);
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
X3DNodeElementBase *ne = nullptr;
|
||||
if (!use.empty()) {
|
||||
X3DNodeElementBase *ne;
|
||||
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Group, ne);
|
||||
} else {
|
||||
ParseHelper_Group_Begin(true); // create new grouping element and go deeper if node has children.
|
||||
// at this place new group mode created and made current, so we can name it.
|
||||
|
||||
@@ -67,7 +67,7 @@ void X3DImporter::readColor(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Color, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Color, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementColor(mNodeElementCur);
|
||||
@@ -99,7 +99,7 @@ void X3DImporter::readColorRGBA(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_ColorRGBA, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_ColorRGBA, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementColorRGBA(mNodeElementCur);
|
||||
@@ -131,7 +131,7 @@ void X3DImporter::readCoordinate(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Coordinate, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Coordinate, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementCoordinate(mNodeElementCur);
|
||||
@@ -174,7 +174,7 @@ void X3DImporter::readIndexedLineSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedLineSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedLineSet, ne);
|
||||
} else {
|
||||
// check data
|
||||
if ((coordIndex.size() < 2) || ((coordIndex.back() == (-1)) && (coordIndex.size() < 3)))
|
||||
@@ -248,7 +248,7 @@ void X3DImporter::readIndexedTriangleFanSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedTriangleFanSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedTriangleFanSet, ne);
|
||||
} else {
|
||||
// check data
|
||||
if (index.size() == 0) throw DeadlyImportError("IndexedTriangleFanSet must contain not empty \"index\" attribute.");
|
||||
@@ -354,7 +354,7 @@ void X3DImporter::readIndexedTriangleSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedTriangleSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedTriangleSet, ne);
|
||||
} else {
|
||||
// check data
|
||||
if (index.size() == 0) throw DeadlyImportError("IndexedTriangleSet must contain not empty \"index\" attribute.");
|
||||
@@ -453,10 +453,12 @@ void X3DImporter::readIndexedTriangleStripSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedTriangleStripSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_IndexedTriangleStripSet, ne);
|
||||
} else {
|
||||
// check data
|
||||
if (index.size() == 0) throw DeadlyImportError("IndexedTriangleStripSet must contain not empty \"index\" attribute.");
|
||||
if (index.empty()) {
|
||||
throw DeadlyImportError("IndexedTriangleStripSet must contain not empty \"index\" attribute.");
|
||||
}
|
||||
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementIndexedSet(X3DElemType::ENET_IndexedTriangleStripSet, mNodeElementCur);
|
||||
@@ -544,10 +546,12 @@ void X3DImporter::readLineSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_LineSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_LineSet, ne);
|
||||
} else {
|
||||
// check data
|
||||
if (vertexCount.size() == 0) throw DeadlyImportError("LineSet must contain not empty \"vertexCount\" attribute.");
|
||||
if (vertexCount.empty()) {
|
||||
throw DeadlyImportError("LineSet must contain not empty \"vertexCount\" attribute.");
|
||||
}
|
||||
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementSet(X3DElemType::ENET_LineSet, mNodeElementCur);
|
||||
@@ -612,7 +616,7 @@ void X3DImporter::readPointSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_PointSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_PointSet, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementIndexedSet(X3DElemType::ENET_PointSet, mNodeElementCur);
|
||||
@@ -677,10 +681,12 @@ void X3DImporter::readTriangleFanSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleFanSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleFanSet, ne);
|
||||
} else {
|
||||
// check data
|
||||
if (fanCount.size() == 0) throw DeadlyImportError("TriangleFanSet must contain not empty \"fanCount\" attribute.");
|
||||
if (fanCount.empty()) {
|
||||
throw DeadlyImportError("TriangleFanSet must contain not empty \"fanCount\" attribute.");
|
||||
}
|
||||
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementSet(X3DElemType::ENET_TriangleFanSet, mNodeElementCur);
|
||||
@@ -784,7 +790,7 @@ void X3DImporter::readTriangleSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleSet, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementIndexedSet(X3DElemType::ENET_TriangleSet, mNodeElementCur);
|
||||
@@ -859,7 +865,7 @@ void X3DImporter::readTriangleStripSet(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleStripSet, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TriangleStripSet, ne);
|
||||
} else {
|
||||
// check data
|
||||
if (stripCount.size() == 0) throw DeadlyImportError("TriangleStripSet must contain not empty \"stripCount\" attribute.");
|
||||
@@ -958,14 +964,14 @@ void X3DImporter::readTriangleStripSet(XmlNode &node) {
|
||||
void X3DImporter::readNormal(XmlNode &node) {
|
||||
std::string use, def;
|
||||
std::list<aiVector3D> vector;
|
||||
X3DNodeElementBase *ne;
|
||||
X3DNodeElementBase *ne=nullptr;
|
||||
|
||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(node, def, use);
|
||||
X3DXmlHelper::getVector3DListAttribute(node, "vector", vector);
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Normal, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Normal, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementNormal(mNodeElementCur);
|
||||
|
||||
@@ -60,7 +60,7 @@ void X3DImporter::readShape(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Shape, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Shape, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementShape(mNodeElementCur);
|
||||
@@ -74,31 +74,55 @@ void X3DImporter::readShape(XmlNode &node) {
|
||||
// check for appearance node
|
||||
if (currentChildName == "Appearance") readAppearance(currentChildNode);
|
||||
// check for X3DGeometryNodes
|
||||
else if (currentChildName == "Arc2D") readArc2D(currentChildNode);
|
||||
else if (currentChildName == "ArcClose2D") readArcClose2D(currentChildNode);
|
||||
else if (currentChildName == "Circle2D") readCircle2D(currentChildNode);
|
||||
else if (currentChildName == "Disk2D") readDisk2D(currentChildNode);
|
||||
else if (currentChildName == "Polyline2D") readPolyline2D(currentChildNode);
|
||||
else if (currentChildName == "Polypoint2D") readPolypoint2D(currentChildNode);
|
||||
else if (currentChildName == "Rectangle2D") readRectangle2D(currentChildNode);
|
||||
else if (currentChildName == "TriangleSet2D") readTriangleSet2D(currentChildNode);
|
||||
else if (currentChildName == "Box") readBox(currentChildNode);
|
||||
else if (currentChildName == "Cone") readCone(currentChildNode);
|
||||
else if (currentChildName == "Cylinder") readCylinder(currentChildNode);
|
||||
else if (currentChildName == "ElevationGrid") readElevationGrid(currentChildNode);
|
||||
else if (currentChildName == "Extrusion") readExtrusion(currentChildNode);
|
||||
else if (currentChildName == "IndexedFaceSet") readIndexedFaceSet(currentChildNode);
|
||||
else if (currentChildName == "Sphere") readSphere(currentChildNode);
|
||||
else if (currentChildName == "IndexedLineSet") readIndexedLineSet(currentChildNode);
|
||||
else if (currentChildName == "LineSet") readLineSet(currentChildNode);
|
||||
else if (currentChildName == "PointSet") readPointSet(currentChildNode);
|
||||
else if (currentChildName == "IndexedTriangleFanSet") readIndexedTriangleFanSet(currentChildNode);
|
||||
else if (currentChildName == "IndexedTriangleSet") readIndexedTriangleSet(currentChildNode);
|
||||
else if (currentChildName == "IndexedTriangleStripSet") readIndexedTriangleStripSet(currentChildNode);
|
||||
else if (currentChildName == "TriangleFanSet") readTriangleFanSet(currentChildNode);
|
||||
else if (currentChildName == "TriangleSet") readTriangleSet(currentChildNode);
|
||||
else if (currentChildName == "Arc2D")
|
||||
readArc2D(currentChildNode);
|
||||
else if (currentChildName == "ArcClose2D")
|
||||
readArcClose2D(currentChildNode);
|
||||
else if (currentChildName == "Circle2D")
|
||||
readCircle2D(currentChildNode);
|
||||
else if (currentChildName == "Disk2D")
|
||||
readDisk2D(currentChildNode);
|
||||
else if (currentChildName == "Polyline2D")
|
||||
readPolyline2D(currentChildNode);
|
||||
else if (currentChildName == "Polypoint2D")
|
||||
readPolypoint2D(currentChildNode);
|
||||
else if (currentChildName == "Rectangle2D")
|
||||
readRectangle2D(currentChildNode);
|
||||
else if (currentChildName == "TriangleSet2D")
|
||||
readTriangleSet2D(currentChildNode);
|
||||
else if (currentChildName == "Box")
|
||||
readBox(currentChildNode);
|
||||
else if (currentChildName == "Cone")
|
||||
readCone(currentChildNode);
|
||||
else if (currentChildName == "Cylinder")
|
||||
readCylinder(currentChildNode);
|
||||
else if (currentChildName == "ElevationGrid")
|
||||
readElevationGrid(currentChildNode);
|
||||
else if (currentChildName == "Extrusion")
|
||||
readExtrusion(currentChildNode);
|
||||
else if (currentChildName == "IndexedFaceSet")
|
||||
readIndexedFaceSet(currentChildNode);
|
||||
else if (currentChildName == "Sphere")
|
||||
readSphere(currentChildNode);
|
||||
else if (currentChildName == "IndexedLineSet")
|
||||
readIndexedLineSet(currentChildNode);
|
||||
else if (currentChildName == "LineSet")
|
||||
readLineSet(currentChildNode);
|
||||
else if (currentChildName == "PointSet")
|
||||
readPointSet(currentChildNode);
|
||||
else if (currentChildName == "IndexedTriangleFanSet")
|
||||
readIndexedTriangleFanSet(currentChildNode);
|
||||
else if (currentChildName == "IndexedTriangleSet")
|
||||
readIndexedTriangleSet(currentChildNode);
|
||||
else if (currentChildName == "IndexedTriangleStripSet")
|
||||
readIndexedTriangleStripSet(currentChildNode);
|
||||
else if (currentChildName == "TriangleFanSet")
|
||||
readTriangleFanSet(currentChildNode);
|
||||
else if (currentChildName == "TriangleSet")
|
||||
readTriangleSet(currentChildNode);
|
||||
// check for X3DMetadataObject
|
||||
else if (!checkForMetadataNode(currentChildNode)) skipUnsupportedNode("Shape", currentChildNode);
|
||||
else if (!checkForMetadataNode(currentChildNode))
|
||||
skipUnsupportedNode("Shape", currentChildNode);
|
||||
}
|
||||
|
||||
ParseHelper_Node_Exit();
|
||||
@@ -123,42 +147,41 @@ void X3DImporter::readShape(XmlNode &node) {
|
||||
// </Appearance>
|
||||
void X3DImporter::readAppearance(XmlNode &node) {
|
||||
std::string use, def;
|
||||
X3DNodeElementBase* ne( nullptr );
|
||||
X3DNodeElementBase *ne(nullptr);
|
||||
|
||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(node, def, use);
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty())
|
||||
{
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Appearance, ne);
|
||||
}
|
||||
else
|
||||
{
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementAppearance(mNodeElementCur);
|
||||
if(!def.empty()) ne->ID = def;
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Appearance, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementAppearance(mNodeElementCur);
|
||||
if (!def.empty()) ne->ID = def;
|
||||
|
||||
// check for child nodes
|
||||
if(!isNodeEmpty(node))
|
||||
{
|
||||
ParseHelper_Node_Enter(ne);
|
||||
if (!isNodeEmpty(node)) {
|
||||
ParseHelper_Node_Enter(ne);
|
||||
for (auto currentChildNode : node.children()) {
|
||||
const std::string ¤tChildName = currentChildNode.name();
|
||||
if (currentChildName == "Material") readMaterial(currentChildNode);
|
||||
else if (currentChildName == "ImageTexture") readImageTexture(currentChildNode);
|
||||
else if (currentChildName == "TextureTransform") readTextureTransform(currentChildNode);
|
||||
if (currentChildName == "Material")
|
||||
readMaterial(currentChildNode);
|
||||
else if (currentChildName == "ImageTexture")
|
||||
readImageTexture(currentChildNode);
|
||||
else if (currentChildName == "TextureTransform")
|
||||
readTextureTransform(currentChildNode);
|
||||
// check for X3DMetadataObject
|
||||
else if (!checkForMetadataNode(currentChildNode)) skipUnsupportedNode("Appearance", currentChildNode);
|
||||
else if (!checkForMetadataNode(currentChildNode))
|
||||
skipUnsupportedNode("Appearance", currentChildNode);
|
||||
}
|
||||
ParseHelper_Node_Exit();
|
||||
}// if(!isNodeEmpty(node))
|
||||
else
|
||||
{
|
||||
mNodeElementCur->Children.push_back(ne);// add made object as child to current element
|
||||
}
|
||||
ParseHelper_Node_Exit();
|
||||
} // if(!isNodeEmpty(node))
|
||||
else {
|
||||
mNodeElementCur->Children.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
|
||||
NodeElement_List.push_back(ne); // add element to node element list because its a new object in graph
|
||||
} // if(!use.empty()) else
|
||||
}
|
||||
|
||||
// <Material
|
||||
@@ -179,7 +202,7 @@ void X3DImporter::readMaterial(XmlNode &node) {
|
||||
aiColor3D diffuseColor(0.8f, 0.8f, 0.8f);
|
||||
aiColor3D emissiveColor(0, 0, 0);
|
||||
aiColor3D specularColor(0, 0, 0);
|
||||
X3DNodeElementBase* ne( nullptr );
|
||||
X3DNodeElementBase *ne(nullptr);
|
||||
|
||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(node, def, use);
|
||||
XmlParser::getFloatAttribute(node, "ambientIntensity", ambientIntensity);
|
||||
@@ -189,33 +212,30 @@ void X3DImporter::readMaterial(XmlNode &node) {
|
||||
X3DXmlHelper::getColor3DAttribute(node, "emissiveColor", emissiveColor);
|
||||
X3DXmlHelper::getColor3DAttribute(node, "specularColor", specularColor);
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if(!use.empty())
|
||||
{
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Material, ne);
|
||||
}
|
||||
else
|
||||
{
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementMaterial(mNodeElementCur);
|
||||
if(!def.empty()) ne->ID = def;
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_Material, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementMaterial(mNodeElementCur);
|
||||
if (!def.empty()) ne->ID = def;
|
||||
|
||||
((X3DNodeElementMaterial *)ne)->AmbientIntensity = ambientIntensity;
|
||||
((X3DNodeElementMaterial *)ne)->AmbientIntensity = ambientIntensity;
|
||||
((X3DNodeElementMaterial *)ne)->Shininess = shininess;
|
||||
((X3DNodeElementMaterial *)ne)->Transparency = transparency;
|
||||
((X3DNodeElementMaterial *)ne)->DiffuseColor = diffuseColor;
|
||||
((X3DNodeElementMaterial *)ne)->EmissiveColor = emissiveColor;
|
||||
((X3DNodeElementMaterial *)ne)->SpecularColor = specularColor;
|
||||
// check for child nodes
|
||||
if(!isNodeEmpty(node))
|
||||
childrenReadMetadata(node, ne, "Material");
|
||||
else
|
||||
if (!isNodeEmpty(node))
|
||||
childrenReadMetadata(node, ne, "Material");
|
||||
else
|
||||
mNodeElementCur->Children.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
|
||||
NodeElement_List.push_back(ne); // add element to node element list because its a new object in graph
|
||||
} // if(!use.empty()) else
|
||||
}
|
||||
|
||||
}// namespace Assimp
|
||||
} // namespace Assimp
|
||||
|
||||
#endif // !ASSIMP_BUILD_NO_X3D_IMPORTER
|
||||
|
||||
@@ -74,7 +74,7 @@ void X3DImporter::readImageTexture(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_ImageTexture, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_ImageTexture, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementImageTexture(mNodeElementCur);
|
||||
@@ -113,7 +113,7 @@ void X3DImporter::readTextureCoordinate(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TextureCoordinate, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TextureCoordinate, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementTextureCoordinate(mNodeElementCur);
|
||||
@@ -154,7 +154,7 @@ void X3DImporter::readTextureTransform(XmlNode &node) {
|
||||
|
||||
// if "USE" defined then find already defined element.
|
||||
if (!use.empty()) {
|
||||
MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TextureTransform, ne);
|
||||
ne = MACRO_USE_CHECKANDAPPLY(node, def, use, ENET_TextureTransform, ne);
|
||||
} else {
|
||||
// create and if needed - define new geometry object.
|
||||
ne = new X3DNodeElementTextureTransform(mNodeElementCur);
|
||||
|
||||
Reference in New Issue
Block a user