next step.s
parent
394651e640
commit
554ed1bf91
|
@ -133,7 +133,7 @@ struct WordIterator {
|
|||
const char *operator*() const { return mStart; }
|
||||
};
|
||||
|
||||
static const char *WordIterator::whitespace = ", \t\r\n";
|
||||
const char *WordIterator::whitespace = ", \t\r\n";
|
||||
|
||||
X3DImporter::X3DImporter() :
|
||||
mNodeElementCur(nullptr), mReader(nullptr) {
|
||||
|
@ -231,11 +231,14 @@ bool X3DImporter::FindNodeElement(const std::string &pID, const X3DNodeElementBa
|
|||
/************************************************************* Functions: XML set ************************************************************/
|
||||
/*********************************************************************************************************************************************/
|
||||
|
||||
void X3DImporter::XML_CheckNode_MustBeEmpty() {
|
||||
if (!mReader->isEmptyElement()) throw DeadlyImportError(std::string("Node <") + mReader->getNodeName() + "> must be empty.");
|
||||
void X3DImporter::XML_CheckNode_MustBeEmpty(XmlNode &node) {
|
||||
if (!node.empty()) {
|
||||
throw DeadlyImportError(std::string("Node <") + node.name() + "> must be empty.");
|
||||
}
|
||||
//if (!mReader->isEmptyElement()) throw DeadlyImportError(std::string("Node <") + mReader->getNodeName() + "> must be empty.");
|
||||
}
|
||||
|
||||
void X3DImporter::XML_CheckNode_SkipUnsupported(const std::string &pParentNodeName) {
|
||||
void X3DImporter::XML_CheckNode_SkipUnsupported(XmlNode &node, const std::string &pParentNodeName) {
|
||||
static const size_t Uns_Skip_Len = 192;
|
||||
const char *Uns_Skip[Uns_Skip_Len] = {
|
||||
// CAD geometry component
|
||||
|
@ -313,26 +316,26 @@ void X3DImporter::XML_CheckNode_SkipUnsupported(const std::string &pParentNodeNa
|
|||
"VolumeData"
|
||||
};
|
||||
|
||||
const std::string nn(mReader->getNodeName());
|
||||
const std::string nn = node.name();
|
||||
bool found = false;
|
||||
bool close_found = false;
|
||||
|
||||
for (size_t i = 0; i < Uns_Skip_Len; i++) {
|
||||
if (nn == Uns_Skip[i]) {
|
||||
found = true;
|
||||
if (mReader->isEmptyElement()) {
|
||||
if (node.empty()) {
|
||||
close_found = true;
|
||||
|
||||
goto casu_cres;
|
||||
}
|
||||
|
||||
while (mReader->read()) {
|
||||
/*while (mReader->read()) {
|
||||
if ((mReader->getNodeType() == irr::io::EXN_ELEMENT_END) && (nn == mReader->getNodeName())) {
|
||||
close_found = true;
|
||||
|
||||
goto casu_cres;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -346,12 +349,13 @@ casu_cres:
|
|||
Throw_CloseNotFound(nn);
|
||||
}
|
||||
|
||||
bool X3DImporter::XML_SearchNode(const std::string &pNodeName) {
|
||||
while (mReader->read()) {
|
||||
bool X3DImporter::XML_SearchNode(XmlNode &node, const std::string &pNodeName) {
|
||||
return XmlParser::hasNode(node, pNodeName.c_str());
|
||||
/*while (mReader->read()) {
|
||||
if ((mReader->getNodeType() == irr::io::EXN_ELEMENT) && XML_CheckNode_NameEqual(pNodeName)) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;*/
|
||||
}
|
||||
|
||||
bool X3DImporter::XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx) {
|
||||
|
|
|
@ -374,7 +374,7 @@ private:
|
|||
/***********************************************/
|
||||
|
||||
/// Check if current node is empty: <node />. If not then exception will throwed.
|
||||
void XML_CheckNode_MustBeEmpty();
|
||||
void XML_CheckNode_MustBeEmpty(XmlNode &node);
|
||||
|
||||
/// Check if current node name is equal to pNodeName.
|
||||
/// \param [in] pNodeName - name for checking.
|
||||
|
@ -383,12 +383,12 @@ private:
|
|||
|
||||
/// Skip unsupported node and report about that. Depend on node name can be skipped begin tag of node all whole node.
|
||||
/// \param [in] pParentNodeName - parent node name. Used for reporting.
|
||||
void XML_CheckNode_SkipUnsupported(const std::string& pParentNodeName);
|
||||
void XML_CheckNode_SkipUnsupported(XmlNode &node, const std::string &pParentNodeName);
|
||||
|
||||
/// Search for specified node in file. XML file read pointer(mReader) will point to found node or file end after search is end.
|
||||
/// \param [in] pNodeName - requested node name.
|
||||
/// return true - if node is found, else - false.
|
||||
bool XML_SearchNode(const std::string& pNodeName);
|
||||
bool XML_SearchNode(XmlNode &node, const std::string &pNodeName);
|
||||
|
||||
/// Read attribute value.
|
||||
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
||||
|
|
|
@ -48,7 +48,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <assimp/BaseImporter.h>
|
||||
#include <assimp/XmlParser.h>
|
||||
#include <assimp/LogAux.h>
|
||||
#include <assimp/irrXMLWrapper.h>
|
||||
#include <assimp/light.h>
|
||||
#include <assimp/material.h>
|
||||
#include <assimp/mesh.h>
|
||||
|
|
|
@ -39,7 +39,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
/** @file ParsingUtils.h
|
||||
* @brief Defines helper functions for text parsing
|
||||
*/
|
||||
|
@ -55,6 +54,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <assimp/StringUtils.h>
|
||||
#include <assimp/defs.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
// NOTE: the functions below are mostly intended as replacement for
|
||||
|
|
|
@ -72,6 +72,9 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
using XmlNode = pugi::xml_node;
|
||||
using XmlAttribute = pugi::xml_attribute;
|
||||
|
||||
template<class TNodeType>
|
||||
class TXmlParser {
|
||||
public:
|
||||
|
@ -144,7 +147,17 @@ public:
|
|||
return mRoot;
|
||||
}
|
||||
|
||||
private:
|
||||
static inline bool hasNode(XmlNode &node, const char *name) {
|
||||
pugi::xml_node child = node.find_child(find_node_by_name_predicate(name));
|
||||
return !child.empty();
|
||||
}
|
||||
|
||||
static inline bool hasAttribute(XmlNode &xmlNode, const char *name) {
|
||||
pugi::xml_attribute attr = xmlNode.attribute(name);
|
||||
return !attr.empty();
|
||||
}
|
||||
|
||||
private:
|
||||
pugi::xml_document *mDoc;
|
||||
TNodeType *mRoot;
|
||||
TNodeType mCurrent;
|
||||
|
@ -152,12 +165,7 @@ private:
|
|||
};
|
||||
|
||||
using XmlParser = TXmlParser<pugi::xml_node>;
|
||||
using XmlNode = pugi::xml_node;
|
||||
|
||||
static inline bool hasAttribute(XmlNode &xmlNode, const char *name) {
|
||||
pugi::xml_attribute attr = xmlNode.attribute(name);
|
||||
return !attr.empty();
|
||||
}
|
||||
|
||||
} // namespace Assimp
|
||||
|
||||
|
|
|
@ -1,149 +0,0 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2020, assimp team
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef INCLUDED_AI_IRRXML_WRAPPER
|
||||
#define INCLUDED_AI_IRRXML_WRAPPER
|
||||
|
||||
// some long includes ....
|
||||
#ifdef ASSIMP_USE_HUNTER
|
||||
# include <irrXML/irrXML.h>
|
||||
#else
|
||||
# include <irrXML.h>
|
||||
#endif
|
||||
#include "IOStream.hpp"
|
||||
#include "BaseImporter.h"
|
||||
#include <vector>
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
// ---------------------------------------------------------------------------------
|
||||
/** @brief Utility class to make IrrXML work together with our custom IO system
|
||||
* See the IrrXML docs for more details.
|
||||
*
|
||||
* Construct IrrXML-Reader in BaseImporter::InternReadFile():
|
||||
* @code
|
||||
* // open the file
|
||||
* std::unique_ptr<IOStream> file( pIOHandler->Open( pFile));
|
||||
* if( file.get() == nullptr ) {
|
||||
* throw DeadlyImportError( "Failed to open file " + pFile + ".");
|
||||
* }
|
||||
*
|
||||
* // generate a XML reader for it
|
||||
* std::unique_ptr<CIrrXML_IOStreamReader> mIOWrapper( new CIrrXML_IOStreamReader( file.get()));
|
||||
* mReader = irr::io::createIrrXMLReader( mIOWrapper.get());
|
||||
* if( !mReader) {
|
||||
* ThrowException( "xxxx: Unable to open file.");
|
||||
* }
|
||||
* @endcode
|
||||
**/
|
||||
class CIrrXML_IOStreamReader : public irr::io::IFileReadCallBack {
|
||||
public:
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
//! Construction from an existing IOStream
|
||||
explicit CIrrXML_IOStreamReader(IOStream* _stream)
|
||||
: stream (_stream)
|
||||
, t (0)
|
||||
{
|
||||
|
||||
// Map the buffer into memory and convert it to UTF8. IrrXML provides its
|
||||
// own conversion, which is merely a cast from uintNN_t to uint8_t. Thus,
|
||||
// it is not suitable for our purposes and we have to do it BEFORE IrrXML
|
||||
// gets the buffer. Sadly, this forces us to map the whole file into
|
||||
// memory.
|
||||
|
||||
data.resize(stream->FileSize());
|
||||
stream->Read(&data[0],data.size(),1);
|
||||
|
||||
// Remove null characters from the input sequence otherwise the parsing will utterly fail
|
||||
// std::find is usually much faster than manually iterating
|
||||
// It is very unlikely that there will be any null characters
|
||||
auto null_char_iter = std::find(data.begin(), data.end(), '\0');
|
||||
|
||||
while (null_char_iter != data.end())
|
||||
{
|
||||
null_char_iter = data.erase(null_char_iter);
|
||||
null_char_iter = std::find(null_char_iter, data.end(), '\0');
|
||||
}
|
||||
|
||||
BaseImporter::ConvertToUTF8(data);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
//! Virtual destructor
|
||||
virtual ~CIrrXML_IOStreamReader() {}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
//! Reads an amount of bytes from the file.
|
||||
/** @param buffer: Pointer to output buffer.
|
||||
* @param sizeToRead: Amount of bytes to read
|
||||
* @return Returns how much bytes were read. */
|
||||
virtual int read(void* buffer, int sizeToRead) {
|
||||
if(sizeToRead<0) {
|
||||
return 0;
|
||||
}
|
||||
if(t+sizeToRead>data.size()) {
|
||||
sizeToRead = static_cast<int>(data.size()-t);
|
||||
}
|
||||
|
||||
memcpy(buffer,&data.front()+t,sizeToRead);
|
||||
|
||||
t += sizeToRead;
|
||||
return sizeToRead;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
//! Returns size of file in bytes
|
||||
virtual int getSize() {
|
||||
return (int)data.size();
|
||||
}
|
||||
|
||||
private:
|
||||
IOStream* stream;
|
||||
std::vector<char> data;
|
||||
size_t t;
|
||||
|
||||
}; // ! class CIrrXML_IOStreamReader
|
||||
|
||||
} // ! Assimp
|
||||
|
||||
#endif // !! INCLUDED_AI_IRRXML_WRAPPER
|
Loading…
Reference in New Issue