vrshoot
diff libs/assimp/irrXMLWrapper.h @ 0:b2f14e535253
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 01 Feb 2014 19:58:19 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libs/assimp/irrXMLWrapper.h Sat Feb 01 19:58:19 2014 +0200 1.3 @@ -0,0 +1,131 @@ 1.4 +/* 1.5 +Open Asset Import Library (assimp) 1.6 +---------------------------------------------------------------------- 1.7 + 1.8 +Copyright (c) 2006-2012, assimp team 1.9 +All rights reserved. 1.10 + 1.11 +Redistribution and use of this software in source and binary forms, 1.12 +with or without modification, are permitted provided that the 1.13 +following conditions are met: 1.14 + 1.15 +* Redistributions of source code must retain the above 1.16 +copyright notice, this list of conditions and the 1.17 +following disclaimer. 1.18 + 1.19 +* Redistributions in binary form must reproduce the above 1.20 +copyright notice, this list of conditions and the 1.21 +following disclaimer in the documentation and/or other 1.22 +materials provided with the distribution. 1.23 + 1.24 +* Neither the name of the assimp team, nor the names of its 1.25 +contributors may be used to endorse or promote products 1.26 +derived from this software without specific prior 1.27 +written permission of the assimp team. 1.28 + 1.29 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1.30 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1.31 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1.32 +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1.33 +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.34 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.35 +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1.36 +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1.37 +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1.38 +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1.39 +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.40 + 1.41 +---------------------------------------------------------------------- 1.42 +*/ 1.43 + 1.44 +#ifndef INCLUDED_AI_IRRXML_WRAPPER 1.45 +#define INCLUDED_AI_IRRXML_WRAPPER 1.46 + 1.47 +// some long includes .... 1.48 +#include "irrXML/irrXML.h" 1.49 +#include "assimp/IOStream.hpp" 1.50 +namespace Assimp { 1.51 + 1.52 +// --------------------------------------------------------------------------------- 1.53 +/** @brief Utility class to make IrrXML work together with our custom IO system 1.54 + * See the IrrXML docs for more details. 1.55 + * 1.56 + * Construct IrrXML-Reader in BaseImporter::InternReadFile(): 1.57 + * @code 1.58 + * // open the file 1.59 + * boost::scoped_ptr<IOStream> file( pIOHandler->Open( pFile)); 1.60 + * if( file.get() == NULL) { 1.61 + * throw DeadlyImportError( "Failed to open file " + pFile + "."); 1.62 + * } 1.63 + * 1.64 + * // generate a XML reader for it 1.65 + * boost::scoped_ptr<CIrrXML_IOStreamReader> mIOWrapper( new CIrrXML_IOStreamReader( file.get())); 1.66 + * mReader = irr::io::createIrrXMLReader( mIOWrapper.get()); 1.67 + * if( !mReader) { 1.68 + * ThrowException( "xxxx: Unable to open file."); 1.69 + * } 1.70 + * @endcode 1.71 + **/ 1.72 +class CIrrXML_IOStreamReader 1.73 + : public irr::io::IFileReadCallBack 1.74 +{ 1.75 +public: 1.76 + 1.77 + // ---------------------------------------------------------------------------------- 1.78 + //! Construction from an existing IOStream 1.79 + CIrrXML_IOStreamReader(IOStream* _stream) 1.80 + : stream (_stream) 1.81 + , t (0) 1.82 + { 1.83 + 1.84 + // Map the buffer into memory and convert it to UTF8. IrrXML provides its 1.85 + // own conversion, which is merely a cast from uintNN_t to uint8_t. Thus, 1.86 + // it is not suitable for our purposes and we have to do it BEFORE IrrXML 1.87 + // gets the buffer. Sadly, this forces as to map the whole file into 1.88 + // memory. 1.89 + 1.90 + data.resize(stream->FileSize()); 1.91 + stream->Read(&data[0],data.size(),1); 1.92 + 1.93 + BaseImporter::ConvertToUTF8(data); 1.94 + } 1.95 + 1.96 + // ---------------------------------------------------------------------------------- 1.97 + //! Virtual destructor 1.98 + virtual ~CIrrXML_IOStreamReader() {}; 1.99 + 1.100 + // ---------------------------------------------------------------------------------- 1.101 + //! Reads an amount of bytes from the file. 1.102 + /** @param buffer: Pointer to output buffer. 1.103 + * @param sizeToRead: Amount of bytes to read 1.104 + * @return Returns how much bytes were read. */ 1.105 + virtual int read(void* buffer, int sizeToRead) { 1.106 + if(sizeToRead<0) { 1.107 + return 0; 1.108 + } 1.109 + if(t+sizeToRead>data.size()) { 1.110 + sizeToRead = data.size()-t; 1.111 + } 1.112 + 1.113 + memcpy(buffer,&data.front()+t,sizeToRead); 1.114 + 1.115 + t += sizeToRead; 1.116 + return sizeToRead; 1.117 + } 1.118 + 1.119 + // ---------------------------------------------------------------------------------- 1.120 + //! Returns size of file in bytes 1.121 + virtual int getSize() { 1.122 + return (int)data.size(); 1.123 + } 1.124 + 1.125 +private: 1.126 + IOStream* stream; 1.127 + std::vector<char> data; 1.128 + size_t t; 1.129 + 1.130 +}; // ! class CIrrXML_IOStreamReader 1.131 + 1.132 +} // ! Assimp 1.133 + 1.134 +#endif // !! INCLUDED_AI_IRRXML_WRAPPER