From 1d6ed840fb9382c3234b719bbb97f72c836ac4d2 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Wed, 20 Apr 2022 12:14:35 +0200 Subject: [PATCH 001/232] Replace single allocations in fbx loader by block allocation --- code/Common/StackAllocator.cpp | 84 ++++++++++++++++++++++++++++++++ code/Common/StackAllocator.h | 89 ++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 code/Common/StackAllocator.cpp create mode 100644 code/Common/StackAllocator.h diff --git a/code/Common/StackAllocator.cpp b/code/Common/StackAllocator.cpp new file mode 100644 index 000000000..c789099a2 --- /dev/null +++ b/code/Common/StackAllocator.cpp @@ -0,0 +1,84 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2022, 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. + +---------------------------------------------------------------------- +*/ + +#include "StackAllocator.h" +#include + +using namespace Assimp; + + +StackAllocator::StackAllocator() { +} + +StackAllocator::~StackAllocator() { + FreeAll(); +} + +void *StackAllocator::Allocate(size_t byteSize) { + if (m_subIndex + byteSize > m_blockAllocationSize) // start a new block + { + // double block size every time, up to maximum of g_maxBytesPerBlock. + // Block size must be at least as large as byteSize, but we want to use this for small allocations anyway. + m_blockAllocationSize = std::max(std::min(m_blockAllocationSize * 2, g_maxBytesPerBlock), byteSize); + uint8_t *data = (uint8_t *)malloc(m_blockAllocationSize); + m_storageBlocks.push_back(data); + m_subIndex = byteSize; + return data; + } + + uint8_t *data = m_storageBlocks.back(); + data += m_subIndex; + m_subIndex += byteSize; + + return data; +} + +void StackAllocator::FreeAll() { + for (size_t i = 0; i < m_storageBlocks.size(); i++) { + free(m_storageBlocks[i]); + } + std::deque empty; + m_storageBlocks.swap(empty); + // start over: + m_blockAllocationSize = g_startBytesPerBlock; + m_subIndex = g_maxBytesPerBlock; +} diff --git a/code/Common/StackAllocator.h b/code/Common/StackAllocator.h new file mode 100644 index 000000000..b0f1ecfe1 --- /dev/null +++ b/code/Common/StackAllocator.h @@ -0,0 +1,89 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2022, 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. + +---------------------------------------------------------------------- +*/ + +/** @file StackAllocator.h + * @brief A very bare-bone allocator class that is suitable when + * allocating many small objects, e.g. during parsing. + * Individual objects are not freed, instead only the whole memory + * can be deallocated. + */ +#ifndef AI_STACK_ALLOCATOR_H_INC +#define AI_STACK_ALLOCATOR_H_INC + + +#include + +namespace Assimp +{ + +/** @brief A very bare-bone allocator class that is suitable when + * allocating many small objects, e.g. during parsing. + * Individual objects are not freed, instead only the whole memory + * can be deallocated. +*/ +class StackAllocator { +public: + // Constructs the allocator + StackAllocator(); + // Destructs the allocator and frees all memory + ~StackAllocator(); + + // Returns a pointer to byteSize bytes of heap memory that persists + // for the lifetime of the allocator (or until FreeAll is called). + void *Allocate(size_t byteSize); + + // Releases all the memory owned by this allocator. + // Memory provided through function Allocate is not valid anymore after this function has been called. + void FreeAll(); + +private: + constexpr const static size_t g_maxBytesPerBlock = 64 * 1024 * 1024; // The maximum size (in bytes) of a block + constexpr const static size_t g_startBytesPerBlock = 16 * 1024; // Size of the first block. Next blocks will double in size until maximum size of g_maxBytesPerBlock + size_t m_blockAllocationSize = g_startBytesPerBlock; // Block size of the current block + size_t m_subIndex = g_maxBytesPerBlock; // The current byte offset in the current block + std::deque m_storageBlocks; // A list of blocks +}; + + +} // namespace Assimp + +#endif // include guard From 2b3c49cb93d404a023fe8b852ebdb3e331fa6a15 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Wed, 20 Apr 2022 12:33:39 +0200 Subject: [PATCH 002/232] All allocation changes --- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 10 ++++------ code/AssetLib/FBX/FBXDocument.cpp | 23 ++++++++++------------- code/AssetLib/FBX/FBXDocument.h | 2 ++ code/AssetLib/FBX/FBXImporter.cpp | 10 ++++------ code/AssetLib/FBX/FBXParser.cpp | 20 ++++++++------------ code/AssetLib/FBX/FBXParser.h | 17 +++++++++++------ code/AssetLib/FBX/FBXTokenizer.cpp | 20 ++++++++++---------- code/AssetLib/FBX/FBXTokenizer.h | 7 ++++--- code/CMakeLists.txt | 2 ++ 9 files changed, 55 insertions(+), 56 deletions(-) diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 1a4d11856..43154e2ab 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -341,8 +341,7 @@ void ReadData(const char*& sbegin_out, const char*& send_out, const char* input, // ------------------------------------------------------------------------------------------------ -bool ReadScope(TokenList& output_tokens, const char* input, const char*& cursor, const char* end, bool const is64bits) -{ +bool ReadScope(TokenList &output_tokens, StackAllocator &token_allocator, const char *input, const char *&cursor, const char *end, bool const is64bits) { // the first word contains the offset at which this block ends const uint64_t end_offset = is64bits ? ReadDoubleWord(input, cursor, end) : ReadWord(input, cursor, end); @@ -408,7 +407,7 @@ bool ReadScope(TokenList& output_tokens, const char* input, const char*& cursor, // XXX this is vulnerable to stack overflowing .. while(Offset(input, cursor) < end_offset - sentinel_block_length) { - ReadScope(output_tokens, input, cursor, input + end_offset - sentinel_block_length, is64bits); + ReadScope(output_tokens, token_allocator, input, cursor, input + end_offset - sentinel_block_length, is64bits); } output_tokens.push_back(new_Token(cursor, cursor + 1, TokenType_CLOSE_BRACKET, Offset(input, cursor) )); @@ -431,8 +430,7 @@ bool ReadScope(TokenList& output_tokens, const char* input, const char*& cursor, // ------------------------------------------------------------------------------------------------ // TODO: Test FBX Binary files newer than the 7500 version to check if the 64 bits address behaviour is consistent -void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) -{ +void TokenizeBinary(TokenList &output_tokens, const char *input, size_t length, StackAllocator &token_allocator) { ai_assert(input); ASSIMP_LOG_DEBUG("Tokenizing binary FBX file"); @@ -465,7 +463,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) try { while (cursor < end ) { - if (!ReadScope(output_tokens, input, cursor, input + length, is64bits)) { + if (!ReadScope(output_tokens, token_allocator, input, cursor, input + length, is64bits)) { break; } } diff --git a/code/AssetLib/FBX/FBXDocument.cpp b/code/AssetLib/FBX/FBXDocument.cpp index b49ee625a..17b347f86 100644 --- a/code/AssetLib/FBX/FBXDocument.cpp +++ b/code/AssetLib/FBX/FBXDocument.cpp @@ -235,7 +235,7 @@ FileGlobalSettings::FileGlobalSettings(const Document &doc, std::shared_ptrCompound(); for(const ElementMap::value_type& el : sobjects.Elements()) { @@ -377,7 +372,7 @@ void Document::ReadObjects() { DOMWarning("encountered duplicate object id, ignoring first occurrence",el.second); } - objects[id] = new LazyObject(id, *el.second, *this); + objects[id] = new_LazyObject(id, *el.second, *this); // grab all animation stacks upfront since there is no listing of them if(!strcmp(el.first.c_str(),"AnimationStack")) { @@ -444,8 +439,10 @@ void Document::ReadPropertyTemplates() { } // ------------------------------------------------------------------------------------------------ -void Document::ReadConnections() { - const Scope& sc = parser.GetRootScope(); +void Document::ReadConnections() +{ + StackAllocator &allocator = parser.GetAllocator(); + const Scope &sc = parser.GetRootScope(); // read property templates from "Definitions" section const Element* const econns = sc["Connections"]; if(!econns || !econns->Compound()) { @@ -484,7 +481,7 @@ void Document::ReadConnections() { } // add new connection - const Connection* const c = new Connection(insertionOrder++,src,dest,prop,*this); + const Connection* const c = new_Connection(insertionOrder++,src,dest,prop,*this); src_connections.insert(ConnectionMap::value_type(src,c)); dest_connections.insert(ConnectionMap::value_type(dest,c)); } diff --git a/code/AssetLib/FBX/FBXDocument.h b/code/AssetLib/FBX/FBXDocument.h index c61a47410..142e870ff 100644 --- a/code/AssetLib/FBX/FBXDocument.h +++ b/code/AssetLib/FBX/FBXDocument.h @@ -80,6 +80,8 @@ class BlendShape; class Skin; class Cluster; +#define new_LazyObject new (allocator.Allocate(sizeof(LazyObject))) LazyObject +#define new_Connection new (allocator.Allocate(sizeof(Connection))) Connection /** Represents a delay-parsed FBX objects. Many objects in the scene * are not needed by assimp, so it makes no sense to parse them diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 0f63acc8f..96c5a9f14 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -160,17 +160,18 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy TokenList tokens; try { + Assimp::StackAllocator tempAllocator; bool is_binary = false; if (!strncmp(begin, "Kaydara FBX Binary", 18)) { is_binary = true; - TokenizeBinary(tokens, begin, contents.size()); + TokenizeBinary(tokens, begin, contents.size(), tempAllocator); } else { - Tokenize(tokens, begin); + Tokenize(tokens, begin, tempAllocator); } // use this information to construct a very rudimentary // parse-tree representing the FBX scope structure - Parser parser(tokens, is_binary); + Parser parser(tokens, tempAllocator, is_binary); // take the raw parse-tree and convert it to a FBX DOM Document doc(parser, settings); @@ -189,10 +190,7 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // Set FBX file scale is relative to CM must be converted to M for // assimp universal format (M) SetFileScale(size_relative_to_cm * 0.01f); - - std::for_each(tokens.begin(), tokens.end(), Util::delete_fun()); } catch (std::exception &) { - std::for_each(tokens.begin(), tokens.end(), Util::delete_fun()); throw; } } diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index e20377a3c..e6cc39f46 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -117,6 +117,7 @@ namespace FBX { // ------------------------------------------------------------------------------------------------ Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) { TokenPtr n = nullptr; + StackAllocator &allocator = parser.GetAllocator(); do { n = parser.AdvanceToNextToken(); if(!n) { @@ -145,7 +146,7 @@ Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) } if (n->Type() == TokenType_OPEN_BRACKET) { - compound.reset(new Scope(parser)); + compound.reset(new_Scope(parser)); // current token should be a TOK_CLOSE_BRACKET n = parser.CurrentToken(); @@ -178,6 +179,7 @@ Scope::Scope(Parser& parser,bool topLevel) } } + StackAllocator &allocator = parser.GetAllocator(); TokenPtr n = parser.AdvanceToNextToken(); if (n == nullptr) { ParseError("unexpected end of file"); @@ -208,22 +210,16 @@ Scope::Scope(Parser& parser,bool topLevel) } // ------------------------------------------------------------------------------------------------ -Scope::~Scope() { - for(ElementMap::value_type& v : elements) { - delete v.second; - } +Scope::~Scope() +{ } // ------------------------------------------------------------------------------------------------ -Parser::Parser (const TokenList& tokens, bool is_binary) -: tokens(tokens) -, last() -, current() -, cursor(tokens.begin()) -, is_binary(is_binary) +Parser::Parser(const TokenList &tokens, StackAllocator &allocator, bool is_binary) : + tokens(tokens), allocator(allocator), last(), current(), cursor(tokens.begin()), is_binary(is_binary) { ASSIMP_LOG_DEBUG("Parsing FBX tokens"); - root.reset(new Scope(*this,true)); + root = new_Scope(*this, true); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/FBX/FBXParser.h b/code/AssetLib/FBX/FBXParser.h index 314481e42..5eed61fef 100644 --- a/code/AssetLib/FBX/FBXParser.h +++ b/code/AssetLib/FBX/FBXParser.h @@ -52,6 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include "Common/StackAllocator.h" #include "FBXCompileConfig.h" #include "FBXTokenizer.h" @@ -68,8 +69,8 @@ typedef std::fbx_unordered_multimap< std::string, Element* > ElementMap; typedef std::pair ElementCollection; -# define new_Scope new Scope -# define new_Element new Element +#define new_Scope new (allocator.Allocate(sizeof(Scope))) Scope +#define new_Element new (allocator.Allocate(sizeof(Element))) Element /** FBX data entity that consists of a key:value tuple. @@ -159,17 +160,21 @@ class Parser public: /** Parse given a token list. Does not take ownership of the tokens - * the objects must persist during the entire parser lifetime */ - Parser (const TokenList& tokens,bool is_binary); + Parser(const TokenList &tokens, StackAllocator &allocator, bool is_binary); ~Parser(); const Scope& GetRootScope() const { - return *root.get(); + return *root; } bool IsBinary() const { return is_binary; } + StackAllocator &GetAllocator() { + return allocator; + } + private: friend class Scope; friend class Element; @@ -180,10 +185,10 @@ private: private: const TokenList& tokens; - + StackAllocator &allocator; TokenPtr last, current; TokenList::const_iterator cursor; - std::unique_ptr root; + Scope *root; const bool is_binary; }; diff --git a/code/AssetLib/FBX/FBXTokenizer.cpp b/code/AssetLib/FBX/FBXTokenizer.cpp index 8698abac6..7f03b71da 100644 --- a/code/AssetLib/FBX/FBXTokenizer.cpp +++ b/code/AssetLib/FBX/FBXTokenizer.cpp @@ -96,7 +96,8 @@ AI_WONT_RETURN void TokenizeError(const std::string& message, unsigned int line, // process a potential data token up to 'cur', adding it to 'output_tokens'. // ------------------------------------------------------------------------------------------------ -void ProcessDataToken( TokenList& output_tokens, const char*& start, const char*& end, +void ProcessDataToken(TokenList &output_tokens, StackAllocator &token_allocator, + const char*& start, const char*& end, unsigned int line, unsigned int column, TokenType type = TokenType_DATA, @@ -133,8 +134,7 @@ void ProcessDataToken( TokenList& output_tokens, const char*& start, const char* } // ------------------------------------------------------------------------------------------------ -void Tokenize(TokenList& output_tokens, const char* input) -{ +void Tokenize(TokenList &output_tokens, const char *input, StackAllocator &token_allocator) { ai_assert(input); ASSIMP_LOG_DEBUG("Tokenizing ASCII FBX file"); @@ -166,7 +166,7 @@ void Tokenize(TokenList& output_tokens, const char* input) in_double_quotes = false; token_end = cur; - ProcessDataToken(output_tokens,token_begin,token_end,line,column); + ProcessDataToken(output_tokens, token_allocator, token_begin, token_end, line, column); pending_data_token = false; } continue; @@ -183,30 +183,30 @@ void Tokenize(TokenList& output_tokens, const char* input) continue; case ';': - ProcessDataToken(output_tokens,token_begin,token_end,line,column); + ProcessDataToken(output_tokens, token_allocator, token_begin, token_end, line, column); comment = true; continue; case '{': - ProcessDataToken(output_tokens,token_begin,token_end, line, column); + ProcessDataToken(output_tokens, token_allocator, token_begin, token_end, line, column); output_tokens.push_back(new_Token(cur,cur+1,TokenType_OPEN_BRACKET,line,column)); continue; case '}': - ProcessDataToken(output_tokens,token_begin,token_end,line,column); + ProcessDataToken(output_tokens, token_allocator, token_begin, token_end, line, column); output_tokens.push_back(new_Token(cur,cur+1,TokenType_CLOSE_BRACKET,line,column)); continue; case ',': if (pending_data_token) { - ProcessDataToken(output_tokens,token_begin,token_end,line,column,TokenType_DATA,true); + ProcessDataToken(output_tokens, token_allocator, token_begin, token_end, line, column, TokenType_DATA, true); } output_tokens.push_back(new_Token(cur,cur+1,TokenType_COMMA,line,column)); continue; case ':': if (pending_data_token) { - ProcessDataToken(output_tokens,token_begin,token_end,line,column,TokenType_KEY,true); + ProcessDataToken(output_tokens, token_allocator, token_begin, token_end, line, column, TokenType_KEY, true); } else { TokenizeError("unexpected colon", line, column); @@ -228,7 +228,7 @@ void Tokenize(TokenList& output_tokens, const char* input) } } - ProcessDataToken(output_tokens,token_begin,token_end,line,column,type); + ProcessDataToken(output_tokens, token_allocator, token_begin, token_end, line, column, type); } pending_data_token = false; diff --git a/code/AssetLib/FBX/FBXTokenizer.h b/code/AssetLib/FBX/FBXTokenizer.h index 877950945..d5f7999e4 100644 --- a/code/AssetLib/FBX/FBXTokenizer.h +++ b/code/AssetLib/FBX/FBXTokenizer.h @@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define INCLUDED_AI_FBX_TOKENIZER_H #include "FBXCompileConfig.h" +#include "Common/StackAllocator.h" #include #include #include @@ -158,7 +159,7 @@ private: typedef const Token* TokenPtr; typedef std::vector< TokenPtr > TokenList; -#define new_Token new Token +#define new_Token new (token_allocator.Allocate(sizeof(Token))) Token /** Main FBX tokenizer function. Transform input buffer into a list of preprocessed tokens. @@ -168,7 +169,7 @@ typedef std::vector< TokenPtr > TokenList; * @param output_tokens Receives a list of all tokens in the input data. * @param input_buffer Textual input buffer to be processed, 0-terminated. * @throw DeadlyImportError if something goes wrong */ -void Tokenize(TokenList& output_tokens, const char* input); +void Tokenize(TokenList &output_tokens, const char *input, StackAllocator &tokenAllocator); /** Tokenizer function for binary FBX files. @@ -179,7 +180,7 @@ void Tokenize(TokenList& output_tokens, const char* input); * @param input_buffer Binary input buffer to be processed. * @param length Length of input buffer, in bytes. There is no 0-terminal. * @throw DeadlyImportError if something goes wrong */ -void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length); +void TokenizeBinary(TokenList &output_tokens, const char *input, size_t length, StackAllocator &tokenAllocator); } // ! FBX diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 5b08c0f37..e7eaf1d84 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -193,6 +193,8 @@ SET( Common_SRCS Common/ScenePreprocessor.cpp Common/ScenePreprocessor.h Common/SkeletonMeshBuilder.cpp + Common/StackAllocator.h + Common/StackAllocator.cpp Common/StandardShapes.cpp Common/TargetAnimation.cpp Common/TargetAnimation.h From d3646c3118b9b93fa7fe5dc9a979424450f8f72a Mon Sep 17 00:00:00 2001 From: Florian Born Date: Wed, 20 Apr 2022 16:11:09 +0200 Subject: [PATCH 003/232] Proper destruction of individual objects --- code/AssetLib/FBX/FBXDocument.cpp | 13 ++++++++++++- code/AssetLib/FBX/FBXDocument.h | 2 ++ code/AssetLib/FBX/FBXImporter.cpp | 14 +++++++++----- code/AssetLib/FBX/FBXParser.cpp | 17 ++++++++++++++--- code/AssetLib/FBX/FBXParser.h | 7 ++++--- code/AssetLib/FBX/FBXTokenizer.h | 1 + code/AssetLib/FBX/FBXUtil.h | 11 +++++++++++ code/Common/StackAllocator.h | 4 ++++ 8 files changed, 57 insertions(+), 12 deletions(-) diff --git a/code/AssetLib/FBX/FBXDocument.cpp b/code/AssetLib/FBX/FBXDocument.cpp index 17b347f86..437bf210b 100644 --- a/code/AssetLib/FBX/FBXDocument.cpp +++ b/code/AssetLib/FBX/FBXDocument.cpp @@ -257,7 +257,18 @@ Document::Document(Parser& parser, const ImportSettings& settings) : } // ------------------------------------------------------------------------------------------------ -Document::~Document() { +Document::~Document() +{ + // The document does not own the memory for the following objects, but we need to call their d'tor + // so they can properly free memory like string members: + + for (ObjectMap::value_type &v : objects) { + delete_LazyObject(v.second); + } + + for (ConnectionMap::value_type &v : src_connections) { + delete_Connection(v.second); + } // |dest_connections| contain the same Connection objects as the |src_connections| } diff --git a/code/AssetLib/FBX/FBXDocument.h b/code/AssetLib/FBX/FBXDocument.h index 142e870ff..11ee17f4c 100644 --- a/code/AssetLib/FBX/FBXDocument.h +++ b/code/AssetLib/FBX/FBXDocument.h @@ -82,6 +82,8 @@ class Cluster; #define new_LazyObject new (allocator.Allocate(sizeof(LazyObject))) LazyObject #define new_Connection new (allocator.Allocate(sizeof(Connection))) Connection +#define delete_LazyObject(_p) (_p)->~LazyObject() +#define delete_Connection(_p) (_p)->~Connection() /** Represents a delay-parsed FBX objects. Many objects in the scene * are not needed by assimp, so it makes no sense to parse them diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 96c5a9f14..fa2122c4f 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -158,9 +158,8 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // broadphase tokenizing pass in which we identify the core // syntax elements of FBX (brackets, commas, key:value mappings) TokenList tokens; - try { - - Assimp::StackAllocator tempAllocator; + Assimp::StackAllocator tempAllocator; + try { bool is_binary = false; if (!strncmp(begin, "Kaydara FBX Binary", 18)) { is_binary = true; @@ -190,8 +189,13 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // Set FBX file scale is relative to CM must be converted to M for // assimp universal format (M) SetFileScale(size_relative_to_cm * 0.01f); - } catch (std::exception &) { - throw; + + // This collection does not own the memory for the tokens, but we need to call their d'tor + std::for_each(tokens.begin(), tokens.end(), Util::destructor_fun()); + + } catch (std::exception &) { + std::for_each(tokens.begin(), tokens.end(), Util::destructor_fun()); + throw; } } diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index e6cc39f46..976cdb90b 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -115,7 +115,9 @@ namespace Assimp { namespace FBX { // ------------------------------------------------------------------------------------------------ -Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) { +Element::Element(const Token& key_token, Parser& parser) : + key_token(key_token), compound(nullptr) +{ TokenPtr n = nullptr; StackAllocator &allocator = parser.GetAllocator(); do { @@ -146,7 +148,7 @@ Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) } if (n->Type() == TokenType_OPEN_BRACKET) { - compound.reset(new_Scope(parser)); + compound = new_Scope(parser); // current token should be a TOK_CLOSE_BRACKET n = parser.CurrentToken(); @@ -166,6 +168,10 @@ Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) // ------------------------------------------------------------------------------------------------ Element::~Element() { + if (compound) { + delete_Scope(compound); + } + // no need to delete tokens, they are owned by the parser } @@ -212,6 +218,11 @@ Scope::Scope(Parser& parser,bool topLevel) // ------------------------------------------------------------------------------------------------ Scope::~Scope() { + // This collection does not own the memory for the elements, but we need to call their d'tor: + + for (ElementMap::value_type &v : elements) { + delete_Element(v.second); + } } // ------------------------------------------------------------------------------------------------ @@ -225,7 +236,7 @@ Parser::Parser(const TokenList &tokens, StackAllocator &allocator, bool is_binar // ------------------------------------------------------------------------------------------------ Parser::~Parser() { - // empty + delete_Scope(root); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/FBX/FBXParser.h b/code/AssetLib/FBX/FBXParser.h index 5eed61fef..9b654239b 100644 --- a/code/AssetLib/FBX/FBXParser.h +++ b/code/AssetLib/FBX/FBXParser.h @@ -71,7 +71,8 @@ typedef std::pair Element #define new_Scope new (allocator.Allocate(sizeof(Scope))) Scope #define new_Element new (allocator.Allocate(sizeof(Element))) Element - +#define delete_Scope(_p) (_p)->~Scope() +#define delete_Element(_p) (_p)->~Element() /** FBX data entity that consists of a key:value tuple. * @@ -91,7 +92,7 @@ public: ~Element(); const Scope* Compound() const { - return compound.get(); + return compound; } const Token& KeyToken() const { @@ -105,7 +106,7 @@ public: private: const Token& key_token; TokenList tokens; - std::unique_ptr compound; + Scope* compound; }; /** FBX data entity that consists of a 'scope', a collection diff --git a/code/AssetLib/FBX/FBXTokenizer.h b/code/AssetLib/FBX/FBXTokenizer.h index d5f7999e4..7e395d5e9 100644 --- a/code/AssetLib/FBX/FBXTokenizer.h +++ b/code/AssetLib/FBX/FBXTokenizer.h @@ -160,6 +160,7 @@ typedef const Token* TokenPtr; typedef std::vector< TokenPtr > TokenList; #define new_Token new (token_allocator.Allocate(sizeof(Token))) Token +#define delete_Token(_p) (_p)->~Token() /** Main FBX tokenizer function. Transform input buffer into a list of preprocessed tokens. diff --git a/code/AssetLib/FBX/FBXUtil.h b/code/AssetLib/FBX/FBXUtil.h index 0e0bb75be..4674a5054 100644 --- a/code/AssetLib/FBX/FBXUtil.h +++ b/code/AssetLib/FBX/FBXUtil.h @@ -66,6 +66,17 @@ struct delete_fun } }; +/** helper for std::for_each to call the destructor on all items in a container without freeing their heap*/ +template +struct destructor_fun { + void operator()(const volatile T* del) { + if (del) { + del->~T(); + } + } +}; + + /** Get a string representation for a #TokenType. */ const char* TokenTypeString(TokenType t); diff --git a/code/Common/StackAllocator.h b/code/Common/StackAllocator.h index b0f1ecfe1..b670b7434 100644 --- a/code/Common/StackAllocator.h +++ b/code/Common/StackAllocator.h @@ -67,6 +67,10 @@ public: // Destructs the allocator and frees all memory ~StackAllocator(); + // non copyable + StackAllocator(const StackAllocator &) = delete; + StackAllocator &operator=(const StackAllocator &) = delete; + // Returns a pointer to byteSize bytes of heap memory that persists // for the lifetime of the allocator (or until FreeAll is called). void *Allocate(size_t byteSize); From 320775b9392cd809b663440839b9124da844518c Mon Sep 17 00:00:00 2001 From: Florian Born Date: Wed, 20 Apr 2022 16:39:36 +0200 Subject: [PATCH 004/232] Compile fix --- code/Common/StackAllocator.h | 1 + 1 file changed, 1 insertion(+) diff --git a/code/Common/StackAllocator.h b/code/Common/StackAllocator.h index b670b7434..cc252f8df 100644 --- a/code/Common/StackAllocator.h +++ b/code/Common/StackAllocator.h @@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include namespace Assimp { From 0355ae967feefd5811ddf4c37d91e43fff880a13 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Wed, 20 Apr 2022 17:57:03 +0200 Subject: [PATCH 005/232] compile fix on other platforms --- code/Common/StackAllocator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/Common/StackAllocator.cpp b/code/Common/StackAllocator.cpp index c789099a2..259a565be 100644 --- a/code/Common/StackAllocator.cpp +++ b/code/Common/StackAllocator.cpp @@ -59,7 +59,7 @@ void *StackAllocator::Allocate(size_t byteSize) { // double block size every time, up to maximum of g_maxBytesPerBlock. // Block size must be at least as large as byteSize, but we want to use this for small allocations anyway. m_blockAllocationSize = std::max(std::min(m_blockAllocationSize * 2, g_maxBytesPerBlock), byteSize); - uint8_t *data = (uint8_t *)malloc(m_blockAllocationSize); + uint8_t *data = new uint8_t[m_blockAllocationSize]; m_storageBlocks.push_back(data); m_subIndex = byteSize; return data; @@ -74,7 +74,7 @@ void *StackAllocator::Allocate(size_t byteSize) { void StackAllocator::FreeAll() { for (size_t i = 0; i < m_storageBlocks.size(); i++) { - free(m_storageBlocks[i]); + delete [] m_storageBlocks[i]; } std::deque empty; m_storageBlocks.swap(empty); From 7f0509ae87b852216ca853d7b7094fdb1cecf627 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Thu, 21 Apr 2022 11:33:04 +0200 Subject: [PATCH 006/232] Stack allocator is now inline --- code/CMakeLists.txt | 2 +- code/Common/StackAllocator.h | 10 ++++++---- code/Common/{StackAllocator.cpp => StackAllocator.inl} | 8 ++++---- 3 files changed, 11 insertions(+), 9 deletions(-) rename code/Common/{StackAllocator.cpp => StackAllocator.inl} (93%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index e7eaf1d84..75a5cb377 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -194,7 +194,7 @@ SET( Common_SRCS Common/ScenePreprocessor.h Common/SkeletonMeshBuilder.cpp Common/StackAllocator.h - Common/StackAllocator.cpp + Common/StackAllocator.inl Common/StandardShapes.cpp Common/TargetAnimation.cpp Common/TargetAnimation.h diff --git a/code/Common/StackAllocator.h b/code/Common/StackAllocator.h index cc252f8df..aff36fa47 100644 --- a/code/Common/StackAllocator.h +++ b/code/Common/StackAllocator.h @@ -64,9 +64,9 @@ namespace Assimp class StackAllocator { public: // Constructs the allocator - StackAllocator(); + inline StackAllocator(); // Destructs the allocator and frees all memory - ~StackAllocator(); + inline ~StackAllocator(); // non copyable StackAllocator(const StackAllocator &) = delete; @@ -74,11 +74,11 @@ public: // Returns a pointer to byteSize bytes of heap memory that persists // for the lifetime of the allocator (or until FreeAll is called). - void *Allocate(size_t byteSize); + inline void *Allocate(size_t byteSize); // Releases all the memory owned by this allocator. // Memory provided through function Allocate is not valid anymore after this function has been called. - void FreeAll(); + inline void FreeAll(); private: constexpr const static size_t g_maxBytesPerBlock = 64 * 1024 * 1024; // The maximum size (in bytes) of a block @@ -91,4 +91,6 @@ private: } // namespace Assimp +#include "StackAllocator.inl" + #endif // include guard diff --git a/code/Common/StackAllocator.cpp b/code/Common/StackAllocator.inl similarity index 93% rename from code/Common/StackAllocator.cpp rename to code/Common/StackAllocator.inl index 259a565be..d973b7794 100644 --- a/code/Common/StackAllocator.cpp +++ b/code/Common/StackAllocator.inl @@ -46,14 +46,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -StackAllocator::StackAllocator() { +inline StackAllocator::StackAllocator() { } -StackAllocator::~StackAllocator() { +inline StackAllocator::~StackAllocator() { FreeAll(); } -void *StackAllocator::Allocate(size_t byteSize) { +inline void *StackAllocator::Allocate(size_t byteSize) { if (m_subIndex + byteSize > m_blockAllocationSize) // start a new block { // double block size every time, up to maximum of g_maxBytesPerBlock. @@ -72,7 +72,7 @@ void *StackAllocator::Allocate(size_t byteSize) { return data; } -void StackAllocator::FreeAll() { +inline void StackAllocator::FreeAll() { for (size_t i = 0; i < m_storageBlocks.size(); i++) { delete [] m_storageBlocks[i]; } From a415f33fb561d8e2531205aa61d1228e47158c19 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Thu, 21 Apr 2022 16:09:28 +0200 Subject: [PATCH 007/232] merge failure, parts in this file were missing --- code/AssetLib/FBX/FBXDocument.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/FBX/FBXDocument.h b/code/AssetLib/FBX/FBXDocument.h index 11ee17f4c..c701056f6 100644 --- a/code/AssetLib/FBX/FBXDocument.h +++ b/code/AssetLib/FBX/FBXDocument.h @@ -1076,7 +1076,7 @@ private: /** DOM root for a FBX file */ class Document { public: - Document(const Parser& parser, const ImportSettings& settings); + Document(Parser& parser, const ImportSettings& settings); ~Document(); @@ -1160,7 +1160,7 @@ private: const ImportSettings& settings; ObjectMap objects; - const Parser& parser; + Parser& parser; PropertyTemplateMap templates; ConnectionMap src_connections; From b2ea018fd57326a6421375cc7999d08a7ee341a2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 11 Sep 2022 17:04:58 +0200 Subject: [PATCH 008/232] Use user-define element destructor. --- code/AssetLib/FBX/FBXParser.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXParser.h b/code/AssetLib/FBX/FBXParser.h index 597096548..67707342e 100644 --- a/code/AssetLib/FBX/FBXParser.h +++ b/code/AssetLib/FBX/FBXParser.h @@ -89,7 +89,7 @@ class Element { public: Element(const Token& key_token, Parser& parser); - ~Element() = default; + ~Element(): const Scope* Compound() const { return compound; From 07d4e83f4350ac638f2e6abd1c9262eaadf3f709 Mon Sep 17 00:00:00 2001 From: Gargaj Date: Sat, 3 Dec 2022 20:27:00 +0100 Subject: [PATCH 009/232] fix warnings-as-errors for msvc x64 --- code/Common/SkeletonMeshBuilder.cpp | 49 +++++++++++++++-------------- code/Common/StandardShapes.cpp | 6 ++-- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/code/Common/SkeletonMeshBuilder.cpp b/code/Common/SkeletonMeshBuilder.cpp index bdb926b75..f3c8fb412 100644 --- a/code/Common/SkeletonMeshBuilder.cpp +++ b/code/Common/SkeletonMeshBuilder.cpp @@ -131,32 +131,33 @@ void SkeletonMeshBuilder::CreateGeometry(const aiNode *pNode) { // if the node has no children, it's an end node. Put a little knob there instead aiVector3D ownpos(pNode->mTransformation.a4, pNode->mTransformation.b4, pNode->mTransformation.c4); ai_real sizeEstimate = ownpos.Length() * ai_real(0.18); + const ai_real zero(0.0); - mVertices.emplace_back(-sizeEstimate, 0.0, 0.0); - mVertices.emplace_back(0.0, sizeEstimate, 0.0); - mVertices.emplace_back(0.0, 0.0, -sizeEstimate); - mVertices.emplace_back(0.0, sizeEstimate, 0.0); - mVertices.emplace_back(sizeEstimate, 0.0, 0.0); - mVertices.emplace_back(0.0, 0.0, -sizeEstimate); - mVertices.emplace_back(sizeEstimate, 0.0, 0.0); - mVertices.emplace_back(0.0, -sizeEstimate, 0.0); - mVertices.emplace_back(0.0, 0.0, -sizeEstimate); - mVertices.emplace_back(0.0, -sizeEstimate, 0.0); - mVertices.emplace_back(-sizeEstimate, 0.0, 0.0); - mVertices.emplace_back(0.0, 0.0, -sizeEstimate); + mVertices.emplace_back(-sizeEstimate, zero, zero); + mVertices.emplace_back(zero, sizeEstimate, zero); + mVertices.emplace_back(zero, zero, -sizeEstimate); + mVertices.emplace_back(zero, sizeEstimate, zero); + mVertices.emplace_back(sizeEstimate, zero, zero); + mVertices.emplace_back(zero, zero, -sizeEstimate); + mVertices.emplace_back(sizeEstimate, zero, zero); + mVertices.emplace_back(zero, -sizeEstimate, zero); + mVertices.emplace_back(zero, zero, -sizeEstimate); + mVertices.emplace_back(zero, -sizeEstimate, zero); + mVertices.emplace_back(-sizeEstimate, zero, zero); + mVertices.emplace_back(zero, zero, -sizeEstimate); - mVertices.emplace_back(-sizeEstimate, 0.0, 0.0); - mVertices.emplace_back(0.0, 0.0, sizeEstimate); - mVertices.emplace_back(0.0, sizeEstimate, 0.0); - mVertices.emplace_back(0.0, sizeEstimate, 0.0); - mVertices.emplace_back(0.0, 0.0, sizeEstimate); - mVertices.emplace_back(sizeEstimate, 0.0, 0.0); - mVertices.emplace_back(sizeEstimate, 0.0, 0.0); - mVertices.emplace_back(0.0, 0.0, sizeEstimate); - mVertices.emplace_back(0.0, -sizeEstimate, 0.0); - mVertices.emplace_back(0.0, -sizeEstimate, 0.0); - mVertices.emplace_back(0.0, 0.0, sizeEstimate); - mVertices.emplace_back(-sizeEstimate, 0.0, 0.0); + mVertices.emplace_back(-sizeEstimate, zero, zero); + mVertices.emplace_back(zero, zero, sizeEstimate); + mVertices.emplace_back(zero, sizeEstimate, zero); + mVertices.emplace_back(zero, sizeEstimate, zero); + mVertices.emplace_back(zero, zero, sizeEstimate); + mVertices.emplace_back(sizeEstimate, zero, zero); + mVertices.emplace_back(sizeEstimate, zero, zero); + mVertices.emplace_back(zero, zero, sizeEstimate); + mVertices.emplace_back(zero, -sizeEstimate, zero); + mVertices.emplace_back(zero, -sizeEstimate, zero); + mVertices.emplace_back(zero, zero, sizeEstimate); + mVertices.emplace_back(-sizeEstimate, zero, zero); mFaces.emplace_back(vertexStartIndex + 0, vertexStartIndex + 1, vertexStartIndex + 2); mFaces.emplace_back(vertexStartIndex + 3, vertexStartIndex + 4, vertexStartIndex + 5); diff --git a/code/Common/StandardShapes.cpp b/code/Common/StandardShapes.cpp index 351f03f87..fc45c075d 100644 --- a/code/Common/StandardShapes.cpp +++ b/code/Common/StandardShapes.cpp @@ -421,16 +421,18 @@ void StandardShapes::MakeCone(ai_real height, ai_real radius1, positions.push_back(v3); if (!bOpen) { + const ai_real zero(0.0); + // generate the end 'cap' positions.emplace_back(s * radius2, halfHeight, t * radius2); positions.emplace_back(s2 * radius2, halfHeight, t2 * radius2); - positions.emplace_back(0.0, halfHeight, 0.0); + positions.emplace_back(zero, halfHeight, zero); if (radius1) { // generate the other end 'cap' positions.emplace_back(s * radius1, -halfHeight, t * radius1); positions.emplace_back(s2 * radius1, -halfHeight, t2 * radius1); - positions.emplace_back(0.0, -halfHeight, 0.0); + positions.emplace_back(zero, -halfHeight, zero); } } s = s2; From 9c839f2d9ae2a7b8016554f1bd2b289d65040fb3 Mon Sep 17 00:00:00 2001 From: Gargaj Date: Sat, 3 Dec 2022 20:44:57 +0100 Subject: [PATCH 010/232] more fixes --- code/Common/StandardShapes.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/Common/StandardShapes.cpp b/code/Common/StandardShapes.cpp index fc45c075d..abf3c4839 100644 --- a/code/Common/StandardShapes.cpp +++ b/code/Common/StandardShapes.cpp @@ -468,13 +468,14 @@ void StandardShapes::MakeCircle(ai_real radius, unsigned int tess, ai_real t = 0.0; // std::sin(angle == 0); for (ai_real angle = 0.0; angle < angle_max;) { - positions.emplace_back(s * radius, 0.0, t * radius); + const ai_real zero(0.0); + positions.emplace_back(s * radius, zero, t * radius); angle += angle_delta; s = std::cos(angle); t = std::sin(angle); - positions.emplace_back(s * radius, 0.0, t * radius); + positions.emplace_back(s * radius, zero, t * radius); - positions.emplace_back(0.0, 0.0, 0.0); + positions.emplace_back(zero, zero, zero); } } From 769b47ed0ea1fd5c480a24b85637e4ba5022a707 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 8 Dec 2022 09:35:11 +0100 Subject: [PATCH 011/232] Ensure face pointer is not nullptr - closes https://github.com/assimp/assimp/issues/4831 --- code/Common/ScenePreprocessor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/Common/ScenePreprocessor.cpp b/code/Common/ScenePreprocessor.cpp index c769ec30c..95c63ae1c 100644 --- a/code/Common/ScenePreprocessor.cpp +++ b/code/Common/ScenePreprocessor.cpp @@ -142,6 +142,7 @@ void ScenePreprocessor::ProcessMesh(aiMesh *mesh) { // If the information which primitive types are there in the // mesh is currently not available, compute it. if (!mesh->mPrimitiveTypes) { + ai_assert(mesh->mFaces != nullptr); for (unsigned int a = 0; a < mesh->mNumFaces; ++a) { aiFace &face = mesh->mFaces[a]; switch (face.mNumIndices) { From 2d372b302ffdaeb7ac629ca105b8a13e6de584e8 Mon Sep 17 00:00:00 2001 From: Umesh Rajesh Ramchandani Date: Fri, 2 Dec 2022 13:59:08 +0100 Subject: [PATCH 012/232] Fixed bug when exporting binary FBX Fixed vector subscript out of range bug when NULL_RECORD is passed to PutString and is actually null --- code/AssetLib/FBX/FBXCommon.h | 1 + code/AssetLib/FBX/FBXExportNode.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXCommon.h b/code/AssetLib/FBX/FBXCommon.h index c592c5649..c3d715892 100644 --- a/code/AssetLib/FBX/FBXCommon.h +++ b/code/AssetLib/FBX/FBXCommon.h @@ -55,6 +55,7 @@ const char NULL_RECORD[NumNullRecords] = { // 25 null bytes in 64-bit and 13 nul '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }; // who knows why, it looks like two integers 32/64 bit (compressed and uncompressed sizes?) + 1 byte (might be compression type?) +static std::string NULL_RECORD_STRING(NumNullRecords, '\0'); const std::string SEPARATOR = { '\x00', '\x01' }; // for use inside strings const std::string MAGIC_NODE_TAG = "_$AssimpFbx$"; // from import const int64_t SECOND = 46186158000; // FBX's kTime unit diff --git a/code/AssetLib/FBX/FBXExportNode.cpp b/code/AssetLib/FBX/FBXExportNode.cpp index 21c61b257..21e591425 100644 --- a/code/AssetLib/FBX/FBXExportNode.cpp +++ b/code/AssetLib/FBX/FBXExportNode.cpp @@ -360,7 +360,7 @@ void FBX::Node::EndBinary( bool has_children ) { // if there were children, add a null record - if (has_children) { s.PutString(Assimp::FBX::NULL_RECORD); } + if (has_children) { s.PutString(Assimp::FBX::NULL_RECORD_STRING); } // now go back and write initial pos this->end_pos = s.Tell(); From d5294be00b0f89486b3459d5835045dbf26444b5 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 10 Dec 2022 01:22:00 +0000 Subject: [PATCH 013/232] Fixes Heap-buffer-overflow READ 4 in Assimp::ScenePreprocessor::ProcessMesh https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=49797 --- code/AssetLib/OFF/OFFLoader.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/OFF/OFFLoader.cpp b/code/AssetLib/OFF/OFFLoader.cpp index a366d7463..cb265029a 100644 --- a/code/AssetLib/OFF/OFFLoader.cpp +++ b/code/AssetLib/OFF/OFFLoader.cpp @@ -290,11 +290,12 @@ void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS sz = line; SkipSpaces(&sz); idx = strtoul10(sz,&sz); if(!idx || idx > 9) { - ASSIMP_LOG_ERROR("OFF: Faces with zero indices aren't allowed"); + ASSIMP_LOG_ERROR("OFF: Faces with zero indices aren't allowed"); --mesh->mNumFaces; + ++i; continue; - } - faces->mNumIndices = idx; + } + faces->mNumIndices = idx; faces->mIndices = new unsigned int[faces->mNumIndices]; for (unsigned int m = 0; m < faces->mNumIndices;++m) { SkipSpaces(&sz); From 90769ef3e6a6d05691e46024b7415aafda4b9c7d Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 11 Dec 2022 00:02:09 +0000 Subject: [PATCH 014/232] Fixes Heap-buffer-overflow READ 1 in Assimp::MD5::MD5Parser::ParseHeader https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=49422 When it reaches the `SkipSpacesAndLineEnd`, `in` already points past `bufferEnd` and it leads to out of bounds memory read. --- code/AssetLib/MD5/MD5Parser.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/AssetLib/MD5/MD5Parser.cpp b/code/AssetLib/MD5/MD5Parser.cpp index 2cd738581..02b34fe4b 100644 --- a/code/AssetLib/MD5/MD5Parser.cpp +++ b/code/AssetLib/MD5/MD5Parser.cpp @@ -117,6 +117,8 @@ void MD5Parser::ParseHeader() { ReportError("MD5 version tag is unknown (10 is expected)"); } SkipLine(); + if (buffer == bufferEnd) + return; // print the command line options to the console // FIX: can break the log length limit, so we need to be careful From 917352dd8b44292c5c3490de8365932edb24c9a1 Mon Sep 17 00:00:00 2001 From: sashashura Date: Sun, 11 Dec 2022 01:54:57 +0100 Subject: [PATCH 015/232] Fixes Heap-buffer-overflow READ 1 in Assimp::ObjFileParser::getFace https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=49274 --- code/AssetLib/Obj/ObjFileParser.cpp | 2 +- code/AssetLib/Obj/ObjTools.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/Obj/ObjFileParser.cpp b/code/AssetLib/Obj/ObjFileParser.cpp index 42bd23689..360c1d0e9 100644 --- a/code/AssetLib/Obj/ObjFileParser.cpp +++ b/code/AssetLib/Obj/ObjFileParser.cpp @@ -440,7 +440,7 @@ void ObjFileParser::getFace(aiPrimitiveType type) { const bool vt = (!m_pModel->mTextureCoord.empty()); const bool vn = (!m_pModel->mNormals.empty()); int iPos = 0; - while (m_DataIt != m_DataItEnd) { + while (m_DataIt < m_DataItEnd) { int iStep = 1; if (IsLineEnd(*m_DataIt)) { diff --git a/code/AssetLib/Obj/ObjTools.h b/code/AssetLib/Obj/ObjTools.h index a24bfd5a2..99d2bc5e3 100644 --- a/code/AssetLib/Obj/ObjTools.h +++ b/code/AssetLib/Obj/ObjTools.h @@ -111,6 +111,9 @@ inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd) { */ template inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) { + if (it >= end) + return it; + while (!isEndOfBuffer(it, end) && !IsLineEnd(*it)) { ++it; } From db8ff416799bbbed7195c9b7e0c98292e8631ce1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 15 Dec 2022 14:06:57 +0100 Subject: [PATCH 016/232] Update MD5Parser.cpp --- code/AssetLib/MD5/MD5Parser.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/AssetLib/MD5/MD5Parser.cpp b/code/AssetLib/MD5/MD5Parser.cpp index 02b34fe4b..dce4c5732 100644 --- a/code/AssetLib/MD5/MD5Parser.cpp +++ b/code/AssetLib/MD5/MD5Parser.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -117,8 +115,9 @@ void MD5Parser::ParseHeader() { ReportError("MD5 version tag is unknown (10 is expected)"); } SkipLine(); - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return; + } // print the command line options to the console // FIX: can break the log length limit, so we need to be careful @@ -137,8 +136,9 @@ bool MD5Parser::ParseSection(Section &out) { // first parse the name of the section char *sz = buffer; - while (!IsSpaceOrNewLine(*buffer)) - buffer++; + while (!IsSpaceOrNewLine(*buffer)) { + ++buffer; + } out.mName = std::string(sz, (uintptr_t)(buffer - sz)); SkipSpaces(); @@ -146,14 +146,14 @@ bool MD5Parser::ParseSection(Section &out) { while (running) { if ('{' == *buffer) { // it is a normal section so read all lines - buffer++; + ++buffer; bool run = true; while (run) { if (!SkipSpacesAndLineEnd()) { return false; // seems this was the last section } if ('}' == *buffer) { - buffer++; + ++buffer; break; } @@ -165,7 +165,7 @@ bool MD5Parser::ParseSection(Section &out) { // terminate the line with zero while (!IsLineEnd(*buffer)) - buffer++; + ++buffer; if (*buffer) { ++lineNumber; *buffer++ = '\0'; From c3d15a3f5166d295544cd16243f4c8e3d352d4a6 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 16 Dec 2022 09:03:40 +0100 Subject: [PATCH 017/232] Fix minor review findings. --- code/AssetLib/Obj/ObjTools.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/Obj/ObjTools.h b/code/AssetLib/Obj/ObjTools.h index 99d2bc5e3..a76054825 100644 --- a/code/AssetLib/Obj/ObjTools.h +++ b/code/AssetLib/Obj/ObjTools.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. @@ -111,8 +111,9 @@ inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd) { */ template inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) { - if (it >= end) + if (it >= end) { return it; + } while (!isEndOfBuffer(it, end) && !IsLineEnd(*it)) { ++it; @@ -132,7 +133,7 @@ inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) { /** * @brief Get a name from the current line. Preserve space in the middle, - * but trim it at the end. + * but trim it at the end. * @param[in] it set to current position * @param[in] end set to end of scratch buffer for readout * @param[out] name Separated name From 6743274b3182093dbee9a41836a14971331f5a3d Mon Sep 17 00:00:00 2001 From: RKJ <37873142+rohit-kumar-j@users.noreply.github.com> Date: Mon, 19 Dec 2022 04:06:36 +0530 Subject: [PATCH 018/232] illegal token on right-side-of ::Windows Error without: ``` assimp\material.inl(101,47): message : error recovery skipped: ') ?' ``` Reference : https://stackoverflow.com/questions/2561368/illegal-token-on-right-side-of --- include/assimp/material.inl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/assimp/material.inl b/include/assimp/material.inl index cdf272201..0f80fdecc 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -98,8 +98,10 @@ AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, return AI_FAILURE; } +#undef max +#undef min iNum = static_cast(std::min(static_cast(iNum),prop->mDataLength / sizeof(Type))); - ::memcpy(pOut,prop->mData,iNum * sizeof(Type)); + std::memcpy(pOut,prop->mData,iNum * sizeof(Type)); if (pMax) { *pMax = iNum; } From 76de8ba1f4163828c7a29efe92d326a865158b7c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 19 Dec 2022 08:58:45 +0100 Subject: [PATCH 019/232] Update material.inl --- include/assimp/material.inl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 0f80fdecc..342c26646 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -97,9 +97,10 @@ AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, if (prop->mType != aiPTI_Buffer) { return AI_FAILURE; } - -#undef max -#undef min +// std::min has in some cases a conflict with a defined min +#ifdef min +# undef min +#endif iNum = static_cast(std::min(static_cast(iNum),prop->mDataLength / sizeof(Type))); std::memcpy(pOut,prop->mData,iNum * sizeof(Type)); if (pMax) { From 89b5011759613ae77d4c8f79faf6e6e2f0c00c66 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 23 Dec 2022 13:50:16 +0100 Subject: [PATCH 020/232] Update unzip.c - Fix compiler warning. --- contrib/unzip/unzip.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/unzip/unzip.c b/contrib/unzip/unzip.c index b2f045b0a..ba15257a9 100644 --- a/contrib/unzip/unzip.c +++ b/contrib/unzip/unzip.c @@ -1175,7 +1175,7 @@ extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, in pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)s; - pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; pfile_in_zip_read_info->stream.avail_in = 0; #ifdef HAVE_APPLE_COMPRESSION @@ -1997,4 +1997,4 @@ extern int ZEXPORT unzEndOfFile(unzFile file) #ifdef _MSC_VER # pragma warning(pop) -#endif // _MSC_VER \ No newline at end of file +#endif // _MSC_VER From a8e50be781cd907bac86057d6f0091373f0190c4 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 23 Dec 2022 16:19:39 +0100 Subject: [PATCH 021/232] Refactoring: Move asserthandler header to include --- code/CMakeLists.txt | 2 +- code/Common/AssertHandler.cpp | 2 +- {code/Common => include/assimp}/AssertHandler.h | 0 test/unit/Common/utAssertHandler.cpp | 2 +- test/unit/Common/utBaseProcess.cpp | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename {code/Common => include/assimp}/AssertHandler.h (100%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index b87bc665f..8f26d2daf 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1,6 +1,5 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- -# # Copyright (c) 2006-2022, assimp team # # All rights reserved. @@ -94,6 +93,7 @@ SET( PUBLIC_HEADERS ${HEADER_PATH}/vector3.inl ${HEADER_PATH}/version.h ${HEADER_PATH}/cimport.h + ${HEADER_PATH}/AssertHandler.h ${HEADER_PATH}/importerdesc.h ${HEADER_PATH}/Importer.hpp ${HEADER_PATH}/DefaultLogger.hpp diff --git a/code/Common/AssertHandler.cpp b/code/Common/AssertHandler.cpp index 469e7bec5..2fd4046ad 100644 --- a/code/Common/AssertHandler.cpp +++ b/code/Common/AssertHandler.cpp @@ -43,7 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @brief Implementation of assert handling logic. */ -#include "AssertHandler.h" +#include #include #include diff --git a/code/Common/AssertHandler.h b/include/assimp/AssertHandler.h similarity index 100% rename from code/Common/AssertHandler.h rename to include/assimp/AssertHandler.h diff --git a/test/unit/Common/utAssertHandler.cpp b/test/unit/Common/utAssertHandler.cpp index a2585fe65..039ba8345 100644 --- a/test/unit/Common/utAssertHandler.cpp +++ b/test/unit/Common/utAssertHandler.cpp @@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif #include -#include +#include namespace { diff --git a/test/unit/Common/utBaseProcess.cpp b/test/unit/Common/utBaseProcess.cpp index 978af7e99..359042315 100644 --- a/test/unit/Common/utBaseProcess.cpp +++ b/test/unit/Common/utBaseProcess.cpp @@ -43,7 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "UnitTestPCH.h" #include "Common/BaseProcess.h" -#include "Common/AssertHandler.h" +#include using namespace Assimp; From 25f0146f44c454c2decbd9146329db9921b4f937 Mon Sep 17 00:00:00 2001 From: sfjohnston Date: Wed, 28 Dec 2022 12:32:11 -0800 Subject: [PATCH 022/232] sprintf to snprintf with known MAXLEN for buffer. --- test/unit/utPretransformVertices.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utPretransformVertices.cpp b/test/unit/utPretransformVertices.cpp index b22fdf71f..b3ae818bc 100644 --- a/test/unit/utPretransformVertices.cpp +++ b/test/unit/utPretransformVertices.cpp @@ -68,7 +68,7 @@ void AddNodes(unsigned int num, aiNode *father, unsigned int depth) { for (unsigned int i = 0; i < 5; ++i) { aiNode *nd = father->mChildren[i] = new aiNode(); - nd->mName.length = sprintf(nd->mName.data, "%i%i", depth, i); + nd->mName.length = snprintf(nd->mName.data, MAXLEN, "%i%i", depth, i); // spawn two meshes nd->mMeshes = new unsigned int[nd->mNumMeshes = 2]; From e893248e7c88b7c2133ee2201d89d729091bd545 Mon Sep 17 00:00:00 2001 From: Andy Maloney Date: Sun, 1 Jan 2023 13:27:16 -0500 Subject: [PATCH 023/232] Fix several spelling mistakes & a comment --- code/AssetLib/Collada/ColladaExporter.cpp | 4 ++-- code/AssetLib/Collada/ColladaExporter.h | 2 +- code/AssetLib/Collada/ColladaHelper.h | 2 +- code/CMakeLists.txt | 4 ++-- include/assimp/Importer.hpp | 2 +- include/assimp/config.h.in | 6 +++--- include/assimp/material.h | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/AssetLib/Collada/ColladaExporter.cpp b/code/AssetLib/Collada/ColladaExporter.cpp index 401d4a2a2..29b714bd7 100644 --- a/code/AssetLib/Collada/ColladaExporter.cpp +++ b/code/AssetLib/Collada/ColladaExporter.cpp @@ -448,7 +448,7 @@ void ColladaExporter::WriteLight(size_t pIndex) { PushTag(); switch (light->mType) { case aiLightSource_AMBIENT: - WriteAmbienttLight(light); + WriteAmbientLight(light); break; case aiLightSource_DIRECTIONAL: WriteDirectionalLight(light); @@ -543,7 +543,7 @@ void ColladaExporter::WriteSpotLight(const aiLight *const light) { mOutput << startstr << "" << endstr; } -void ColladaExporter::WriteAmbienttLight(const aiLight *const light) { +void ColladaExporter::WriteAmbientLight(const aiLight *const light) { const aiColor3D &color = light->mColorAmbient; mOutput << startstr << "" << endstr; diff --git a/code/AssetLib/Collada/ColladaExporter.h b/code/AssetLib/Collada/ColladaExporter.h index 7288dce54..e372a5c5c 100644 --- a/code/AssetLib/Collada/ColladaExporter.h +++ b/code/AssetLib/Collada/ColladaExporter.h @@ -101,7 +101,7 @@ protected: void WritePointLight(const aiLight *const light); void WriteDirectionalLight(const aiLight *const light); void WriteSpotLight(const aiLight *const light); - void WriteAmbienttLight(const aiLight *const light); + void WriteAmbientLight(const aiLight *const light); /// Writes the controller library void WriteControllerLibrary(); diff --git a/code/AssetLib/Collada/ColladaHelper.h b/code/AssetLib/Collada/ColladaHelper.h index 2930f5108..c5b6a2d13 100644 --- a/code/AssetLib/Collada/ColladaHelper.h +++ b/code/AssetLib/Collada/ColladaHelper.h @@ -666,7 +666,7 @@ struct ChannelEntry { const Collada::Accessor *mTimeAccessor; ///> Collada accessor to the time values const Collada::Data *mTimeData; ///> Source data array for the time values const Collada::Accessor *mValueAccessor; ///> Collada accessor to the key value values - const Collada::Data *mValueData; ///> Source datat array for the key value values + const Collada::Data *mValueData; ///> Source data array for the key value values ChannelEntry() : mChannel(), diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 8f26d2daf..a098f3e85 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -270,8 +270,8 @@ if (NOT ASSIMP_NO_EXPORT) # ASSIMP_BUILD_XXX_EXPORTER to TRUE for each exporter OPTION(ASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT "default value of all ASSIMP_BUILD_XXX_EXPORTER values" TRUE) - # macro to add the CMake Option ADD_ASSIMP_IMPORTER_ which enables compile of loader - # this way selective loaders can be compiled (reduces filesize + compile time) + # macro to add the CMake Option ADD_ASSIMP_EXPORTER_ which enables compilation of an exporter + # this way selective exporters can be compiled (reduces filesize + compile time) MACRO(ADD_ASSIMP_EXPORTER name) IF (ASSIMP_NO_EXPORT) set(ASSIMP_EXPORTER_ENABLED FALSE) diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index 05a15139a..418643f1f 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -113,7 +113,7 @@ namespace Assimp { * If you need the Importer to do custom file handling to access the files, * implement IOSystem and IOStream and supply an instance of your custom * IOSystem implementation by calling SetIOHandler() before calling ReadFile(). -* If you do not assign a custion IO handler, a default handler using the +* If you do not assign a custom IO handler, a default handler using the * standard C++ IO logic will be used. * * @note One Importer instance is not thread-safe. If you use multiple diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index a348bc36a..ad16fa88c 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -241,7 +241,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // --------------------------------------------------------------------------- /** * @brief Configures the #aiProcess_FindDegenerates to check the area of a - * trinagle to be greates than e-6. If this is not the case the triangle will + * triangle to be greater than e-6. If this is not the case the triangle will * be removed if #AI_CONFIG_PP_FD_REMOVE is set to true. */ #define AI_CONFIG_PP_FD_CHECKAREA \ @@ -662,7 +662,7 @@ enum aiComponent "AI_CONFIG_FBX_CONVERT_TO_M" // --------------------------------------------------------------------------- -/** @brief Will enable the skeleton structo to store bone data. +/** @brief Will enable the skeleton struct to store bone data. * * This will decouple the bone coupling to the mesh. This feature is * experimental. @@ -1083,7 +1083,7 @@ enum aiComponent #define AI_CONFIG_EXPORT_BLOB_NAME "EXPORT_BLOB_NAME" /** - * @brief Specifies a gobal key factor for scale, float value + * @brief Specifies a global key factor for scale, float value */ #define AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY "GLOBAL_SCALE_FACTOR" diff --git a/include/assimp/material.h b/include/assimp/material.h index 0052888d1..80551e53d 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -306,7 +306,7 @@ enum aiTextureType { aiTextureType_SHEEN = 19, /** Clearcoat - * Simulates a layer of 'polish' or 'laquer' layered on top of a PBR substrate + * Simulates a layer of 'polish' or 'lacquer' layered on top of a PBR substrate * https://autodesk.github.io/standard-surface/#closures/coating * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat */ From 465566a87edc837a9712ca247acffddd4be99349 Mon Sep 17 00:00:00 2001 From: Andy Maloney Date: Tue, 3 Jan 2023 05:04:25 -0500 Subject: [PATCH 024/232] {cmake} Remove dead code BUILD_LIB_TYPE isn't used anywhere. I think the intent with "add_definitions" here was to affect cmake (?), but it's actually just adding "#define DDL_STATIC_LIBRARY OFF" which isn't used in the code anywhere. --- CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3288a18f0..e613a43cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -388,14 +388,6 @@ IF (NOT TARGET uninstall AND ASSIMP_INSTALL) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") ENDIF() -# cmake configuration files -if(${BUILD_SHARED_LIBS}) - set(BUILD_LIB_TYPE SHARED) -else() - set(BUILD_LIB_TYPE STATIC) - add_definitions(-DDDL_STATIC_LIBRARY=OFF) -endif() - IF( UNIX ) # Use GNUInstallDirs for Unix predefined directories INCLUDE(GNUInstallDirs) From df8a9bb2b83161d6ac68c1df2e511c4c89d1fa40 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 3 Jan 2023 21:11:09 +0100 Subject: [PATCH 025/232] Fix: Fix signed unsigned mismatch - closes https://github.com/assimp/assimp/issues/4854 --- include/assimp/scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/scene.h b/include/assimp/scene.h index f6dfd82b0..9b173f939 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -433,7 +433,7 @@ struct aiScene for (unsigned int i = 0; i < mNumTextures; i++) { const char* shortTextureFilename = GetShortFilename(mTextures[i]->mFilename.C_Str()); if (strcmp(shortTextureFilename, shortFilename) == 0) { - return std::make_pair(mTextures[i], i); + return std::make_pair(mTextures[i], static_cast(i)); } } return std::make_pair(nullptr, -1); From 96b071bdb1965084c6e78073f9f42a872300f308 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 4 Jan 2023 09:19:37 +0100 Subject: [PATCH 026/232] Fix: Fix possible division by zero - closes https://github.com/assimp/assimp/issues/4860 --- code/AssetLib/LWO/LWOAnimation.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/LWO/LWOAnimation.cpp b/code/AssetLib/LWO/LWOAnimation.cpp index f729f84b1..7ebbfb810 100644 --- a/code/AssetLib/LWO/LWOAnimation.cpp +++ b/code/AssetLib/LWO/LWOAnimation.cpp @@ -162,8 +162,11 @@ void AnimResolver::UpdateAnimRangeSetup() { const double my_last = (*it).keys.back().time; const double delta = my_last - my_first; + if (delta == 0.0) { + continue; + } + const size_t old_size = (*it).keys.size(); - const float value_delta = (*it).keys.back().value - (*it).keys.front().value; // NOTE: We won't handle reset, linear and constant here. @@ -176,8 +179,7 @@ void AnimResolver::UpdateAnimRangeSetup() { case LWO::PrePostBehaviour_Oscillate: { const double start_time = delta - std::fmod(my_first - first, delta); std::vector::iterator n = std::find_if((*it).keys.begin(), (*it).keys.end(), - [start_time](double t) { return start_time > t; }), - m; + [start_time](double t) { return start_time > t; }), m; size_t ofs = 0; if (n != (*it).keys.end()) { From fa7d3aa0c092fcdccc5816ff395f3903d692ebfb Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 5 Jan 2023 11:32:01 +0100 Subject: [PATCH 027/232] Update the getting help section --- Readme.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Readme.md b/Readme.md index 0a04da999..30133aa84 100644 --- a/Readme.md +++ b/Readme.md @@ -76,10 +76,15 @@ The source code is organized in the following way: code/AssetLib/ Implementation for import and export for the format ### Where to get help ### -For more information, visit [our website](http://assimp.org/). Or check out the `./doc`- folder, which contains the official documentation in HTML format. -(CHMs for Windows are included in some release packages and should be located right here in the root folder). +To find our documentation, visit [our website](https://assimp.org/) or check out [Wiki](https://github.com/assimp/assimp/wiki) -If the docs don't solve your problem, ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). If you think you found a bug, please open an issue on Github. +If the docs don't solve your problem, you can check +- Ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). +- Ask on [Assimp-Community on Reddit](https://www.reddit.com/r/Assimp/) +- File a question at [The Assimp-Issue Tracker](https://github.com/assimp/assimp/issues) +- Ask a question at [The Assimp-Discussion Board](https://github.com/assimp/assimp/discussions) + +If you think you found a bug, please open an issue on Github. Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export. From f6457e1c8736b2f066bfef9d05dbb676111874eb Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 5 Jan 2023 11:34:12 +0100 Subject: [PATCH 028/232] Update Readme.md --- Readme.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Readme.md b/Readme.md index 30133aa84..917b8e8aa 100644 --- a/Readme.md +++ b/Readme.md @@ -78,13 +78,11 @@ The source code is organized in the following way: ### Where to get help ### To find our documentation, visit [our website](https://assimp.org/) or check out [Wiki](https://github.com/assimp/assimp/wiki) -If the docs don't solve your problem, you can check +If the docs don't solve your problem, you can: - Ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). - Ask on [Assimp-Community on Reddit](https://www.reddit.com/r/Assimp/) -- File a question at [The Assimp-Issue Tracker](https://github.com/assimp/assimp/issues) - Ask a question at [The Assimp-Discussion Board](https://github.com/assimp/assimp/discussions) - -If you think you found a bug, please open an issue on Github. +- Nothing has worked? File a question or an issue-report at [The Assimp-Issue Tracker](https://github.com/assimp/assimp/issues) Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export. From 74af523b3ef6a68fa07749ac974d4fd51c6324e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20R=C3=B6sner?= Date: Thu, 12 Jan 2023 13:13:46 +0100 Subject: [PATCH 029/232] Generalize JoinVerticesProcess for multiple UV and color channels --- code/PostProcessing/JoinVerticesProcess.cpp | 49 +++++++++++++-------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index ef5999875..f752ed0eb 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -105,7 +105,11 @@ void JoinVerticesProcess::Execute( aiScene* pScene) { namespace { -bool areVerticesEqual(const Vertex &lhs, const Vertex &rhs, bool complex) { +bool areVerticesEqual( + const Vertex &lhs, + const Vertex &rhs, + unsigned numUVChannels, + unsigned numColorChannels) { // A little helper to find locally close vertices faster. // Try to reuse the lookup table from the last step. const static float epsilon = 1e-5f; @@ -124,10 +128,6 @@ bool areVerticesEqual(const Vertex &lhs, const Vertex &rhs, bool complex) { return false; } - if ((lhs.texcoords[0] - rhs.texcoords[0]).SquareLength() > squareEpsilon) { - return false; - } - if ((lhs.tangent - rhs.tangent).SquareLength() > squareEpsilon) { return false; } @@ -136,19 +136,18 @@ bool areVerticesEqual(const Vertex &lhs, const Vertex &rhs, bool complex) { return false; } - // Usually we won't have vertex colors or multiple UVs, so we can skip from here - // Actually this increases runtime performance slightly, at least if branch - // prediction is on our side. - if (complex) { - for (int i = 0; i < 8; i++) { - if (i > 0 && (lhs.texcoords[i] - rhs.texcoords[i]).SquareLength() > squareEpsilon) { - return false; - } - if (GetColorDifference(lhs.colors[i], rhs.colors[i]) > squareEpsilon) { - return false; - } + for (unsigned i = 0; i < numUVChannels; i++) { + if ((lhs.texcoords[i] - rhs.texcoords[i]).SquareLength() > squareEpsilon) { + return false; } } + + for (unsigned i = 0; i < numColorChannels; i++) { + if (GetColorDifference(lhs.colors[i], rhs.colors[i]) > squareEpsilon) { + return false; + } + } + return true; } @@ -241,9 +240,16 @@ struct std::hash { //template specialization for std::equal_to for Vertex template<> struct std::equal_to { + equal_to(unsigned numUVChannels, unsigned numColorChannels) : + mNumUVChannels(numUVChannels), + mNumColorChannels(numColorChannels) {} bool operator()(const Vertex &lhs, const Vertex &rhs) const { - return areVerticesEqual(lhs, rhs, false); + return areVerticesEqual(lhs, rhs, mNumUVChannels, mNumColorChannels); } + +private: + unsigned mNumUVChannels; + unsigned mNumColorChannels; }; // now start the JoinVerticesProcess int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { @@ -316,8 +322,13 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { uniqueAnimatedVertices[animMeshIndex].reserve(pMesh->mNumVertices); } } - // a map that maps a vertix to its new index - std::unordered_map vertex2Index; + // a map that maps a vertex to its new index + const auto numBuckets = pMesh->mNumVertices; + const auto hasher = std::hash(); + const auto comparator = std::equal_to( + pMesh->GetNumUVChannels(), + pMesh->GetNumColorChannels()); + std::unordered_map vertex2Index(numBuckets, hasher, comparator); // we can not end up with more vertices than we started with vertex2Index.reserve(pMesh->mNumVertices); // Now check each vertex if it brings something new to the table From b2672c082d652b8af19b886c9419a01b6af0fc22 Mon Sep 17 00:00:00 2001 From: Steve M Date: Thu, 12 Jan 2023 12:01:22 -0800 Subject: [PATCH 030/232] Change mMethod type to enum aiMorphingMethod Address sanitizer warning --- include/assimp/mesh.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 49d43f9f9..363627464 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -566,6 +566,9 @@ struct aiAnimMesh { /** @brief Enumerates the methods of mesh morphing supported by Assimp. */ enum aiMorphingMethod { + /** Morphing method to be determined */ + aiMorphingMethod_UNKNOWN = 0x0, + /** Interpolation between morph targets */ aiMorphingMethod_VERTEX_BLEND = 0x1, @@ -747,7 +750,7 @@ struct aiMesh { * Method of morphing when anim-meshes are specified. * @see aiMorphingMethod to learn more about the provided morphing targets. */ - unsigned int mMethod; + enum aiMorphingMethod mMethod; /** * The bounding box. @@ -778,7 +781,7 @@ struct aiMesh { mMaterialIndex(0), mNumAnimMeshes(0), mAnimMeshes(nullptr), - mMethod(0), + mMethod(aiMorphingMethod_UNKNOWN), mAABB(), mTextureCoordsNames(nullptr) { for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) { @@ -1002,7 +1005,7 @@ struct aiSkeletonBone { #endif // __cplusplus }; /** - * @brief + * @brief */ struct aiSkeleton { /** From 2d37f49f51e022d3862f9e3e55d9353fa229a80e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 15 Jan 2023 19:12:24 +0100 Subject: [PATCH 031/232] Remove deprecated comment - closes https://github.com/assimp/assimp/issues/4869 --- code/AssetLib/FBX/FBXTokenizer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXTokenizer.h b/code/AssetLib/FBX/FBXTokenizer.h index 5ed48e61d..79f71229b 100644 --- a/code/AssetLib/FBX/FBXTokenizer.h +++ b/code/AssetLib/FBX/FBXTokenizer.h @@ -154,7 +154,6 @@ private: const unsigned int column; }; -// XXX should use C++11's unique_ptr - but assimp's need to keep working with 03 typedef const Token* TokenPtr; typedef std::vector< TokenPtr > TokenList; From 43c0f8bb3d41250d6b566e6cb5b9a5c79e36aae3 Mon Sep 17 00:00:00 2001 From: Martin Mory Date: Sun, 15 Jan 2023 23:03:41 +0100 Subject: [PATCH 032/232] Remove whitespace between a tag and the first number, otherwise first call to strtoul10() returns 0 and the indices are broken, leading to possible out-of-bound access and memory corruption/crash --- code/AssetLib/Collada/ColladaParser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 91f32f485..cce6a0db6 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -762,6 +762,7 @@ void ColladaParser::ReadControllerWeights(XmlNode &node, Collada::Controller &pC if (text == nullptr) { throw DeadlyImportError("Out of data while reading "); } + SkipSpacesAndLineEnd(&text); it->first = strtoul10(text, &text); SkipSpacesAndLineEnd(&text); if (*text == 0) { From e5c02e8d45489ac89b13333f034c5361afa5cd71 Mon Sep 17 00:00:00 2001 From: Krishty Date: Mon, 16 Jan 2023 08:12:24 +0100 Subject: [PATCH 033/232] =?UTF-8?q?Remove=20Useless=20=E2=80=9Cvirtual?= =?UTF-8?q?=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These functions are already marked “override”, and their neighbors had “virtual” removed as well. --- code/AssetLib/Ogre/OgreImporter.h | 8 ++++---- code/AssetLib/glTF2/glTF2Importer.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/AssetLib/Ogre/OgreImporter.h b/code/AssetLib/Ogre/OgreImporter.h index dc8b09051..3a72ae70e 100644 --- a/code/AssetLib/Ogre/OgreImporter.h +++ b/code/AssetLib/Ogre/OgreImporter.h @@ -60,17 +60,17 @@ namespace Ogre { class OgreImporter : public BaseImporter { public: /// BaseImporter override. - virtual bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const override; + bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const override; protected: /// BaseImporter override. - virtual void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override; + void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override; /// BaseImporter override. - virtual const aiImporterDesc *GetInfo() const override; + const aiImporterDesc *GetInfo() const override; /// BaseImporter override. - virtual void SetupProperties(const Importer *pImp) override; + void SetupProperties(const Importer *pImp) override; private: /// Read materials referenced by the @c mesh to @c pScene. diff --git a/code/AssetLib/glTF2/glTF2Importer.h b/code/AssetLib/glTF2/glTF2Importer.h index 831bcd7d2..80cf689dc 100644 --- a/code/AssetLib/glTF2/glTF2Importer.h +++ b/code/AssetLib/glTF2/glTF2Importer.h @@ -65,7 +65,7 @@ public: protected: const aiImporterDesc *GetInfo() const override; void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override; - virtual void SetupProperties(const Importer *pImp) override; + void SetupProperties(const Importer *pImp) override; private: void ImportEmbeddedTextures(glTF2::Asset &a); From bad76fd0f18e82279c2812773727fec884b22c9b Mon Sep 17 00:00:00 2001 From: Krishty Date: Mon, 16 Jan 2023 08:18:36 +0100 Subject: [PATCH 034/232] Replace Variables With Literals --- code/AssetLib/Blender/BlenderBMesh.cpp | 3 +-- code/AssetLib/Blender/BlenderLoader.cpp | 3 +-- code/AssetLib/Blender/BlenderTessellator.cpp | 6 ++---- code/AssetLib/C4D/C4DImporter.cpp | 3 +-- code/AssetLib/FBX/FBXImporter.cpp | 3 +-- code/AssetLib/IFC/IFCLoader.cpp | 3 +-- code/AssetLib/XGL/XGLLoader.cpp | 3 +-- 7 files changed, 8 insertions(+), 16 deletions(-) diff --git a/code/AssetLib/Blender/BlenderBMesh.cpp b/code/AssetLib/Blender/BlenderBMesh.cpp index b15da185d..a82e7c678 100644 --- a/code/AssetLib/Blender/BlenderBMesh.cpp +++ b/code/AssetLib/Blender/BlenderBMesh.cpp @@ -52,8 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { template <> const char *LogFunctions::Prefix() { - static auto prefix = "BLEND_BMESH: "; - return prefix; + return "BLEND_BMESH: "; } } // namespace Assimp diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index f1fb0246d..269c90b96 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -80,8 +80,7 @@ namespace Assimp { template <> const char *LogFunctions::Prefix() { - static auto prefix = "BLEND: "; - return prefix; + return "BLEND: "; } } // namespace Assimp diff --git a/code/AssetLib/Blender/BlenderTessellator.cpp b/code/AssetLib/Blender/BlenderTessellator.cpp index d3ef5ae5e..9c78d0a2a 100644 --- a/code/AssetLib/Blender/BlenderTessellator.cpp +++ b/code/AssetLib/Blender/BlenderTessellator.cpp @@ -62,8 +62,7 @@ namspace Assimp { template< > const char* LogFunctions< BlenderTessellatorGL >::Prefix() { - static auto prefix = "BLEND_TESS_GL: "; - return prefix; + return "BLEND_TESS_GL: "; } } @@ -259,8 +258,7 @@ namespace Assimp { template< > const char* LogFunctions< BlenderTessellatorP2T >::Prefix() { - static auto prefix = "BLEND_TESS_P2T: "; - return prefix; + return "BLEND_TESS_P2T: "; } } diff --git a/code/AssetLib/C4D/C4DImporter.cpp b/code/AssetLib/C4D/C4DImporter.cpp index 06d7a3412..f21ff8602 100644 --- a/code/AssetLib/C4D/C4DImporter.cpp +++ b/code/AssetLib/C4D/C4DImporter.cpp @@ -86,8 +86,7 @@ void GetWriterInfo(int &id, String &appname) { namespace Assimp { template<> const char* LogFunctions::Prefix() { - static auto prefix = "C4D: "; - return prefix; + return "C4D: "; } } diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 7ff194905..7a106d535 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -62,8 +62,7 @@ namespace Assimp { template <> const char *LogFunctions::Prefix() { - static auto prefix = "FBX: "; - return prefix; + return "FBX: "; } } // namespace Assimp diff --git a/code/AssetLib/IFC/IFCLoader.cpp b/code/AssetLib/IFC/IFCLoader.cpp index 908dc8dfa..ee718681e 100644 --- a/code/AssetLib/IFC/IFCLoader.cpp +++ b/code/AssetLib/IFC/IFCLoader.cpp @@ -73,8 +73,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { template <> const char *LogFunctions::Prefix() { - static auto prefix = "IFC: "; - return prefix; + return "IFC: "; } } // namespace Assimp diff --git a/code/AssetLib/XGL/XGLLoader.cpp b/code/AssetLib/XGL/XGLLoader.cpp index 7cacbca4d..04e303370 100644 --- a/code/AssetLib/XGL/XGLLoader.cpp +++ b/code/AssetLib/XGL/XGLLoader.cpp @@ -65,8 +65,7 @@ namespace Assimp { // this has to be in here because LogFunctions is in ::Assimp template <> const char *LogFunctions::Prefix() { - static auto prefix = "XGL: "; - return prefix; + return "XGL: "; } } // namespace Assimp From 5cbc00a595db2166463bc494435a67b4080d28fc Mon Sep 17 00:00:00 2001 From: Krishty Date: Mon, 16 Jan 2023 08:29:49 +0100 Subject: [PATCH 035/232] Fix Build With M3D Import Only `M3DWrapper.h` is designed to omit the definition of `class M3DWrapper` if neither M3D import nor M3D export are compiled. 608bccd9cf3a28c55163c10e84aec025293b7ab0 touched the corresponding preprocessor checks and introduced a bug: ``` #ifndef ASSIMP_BUILD_NO_M3D_IMPORTER #if !(ASSIMP_BUILD_NO_EXPORT || ASSIMP_BUILD_NO_M3D_EXPORTER) class M3DWrapper { ``` When compiling - with M3D import enabled, - but with either export generally disabled or M3D export disabled specifically, These checks evaluate to the wrong result and skip the definition, leading to a build failure in dependent code. ``` #if 1 // import enabled #if !(1 || 1) // export disabled and M3D export disabled ``` This commit fixes the check to compile the definition if neither import is disabled. --- code/AssetLib/M3D/M3DWrapper.cpp | 4 +--- code/AssetLib/M3D/M3DWrapper.h | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/M3D/M3DWrapper.cpp b/code/AssetLib/M3D/M3DWrapper.cpp index 30452c776..05087d592 100644 --- a/code/AssetLib/M3D/M3DWrapper.cpp +++ b/code/AssetLib/M3D/M3DWrapper.cpp @@ -39,8 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER -#if !(ASSIMP_BUILD_NO_EXPORT || ASSIMP_BUILD_NO_M3D_EXPORTER) +#if !defined ASSIMP_BUILD_NO_M3D_IMPORTER || !(defined ASSIMP_BUILD_NO_EXPORT || defined ASSIMP_BUILD_NO_M3D_EXPORTER) #include "M3DWrapper.h" @@ -149,4 +148,3 @@ void M3DWrapper::ClearSave() { } // namespace Assimp #endif -#endif diff --git a/code/AssetLib/M3D/M3DWrapper.h b/code/AssetLib/M3D/M3DWrapper.h index c75ff1027..880aca996 100644 --- a/code/AssetLib/M3D/M3DWrapper.h +++ b/code/AssetLib/M3D/M3DWrapper.h @@ -47,8 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_M3DWRAPPER_H_INC #define AI_M3DWRAPPER_H_INC -#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER -#if !(ASSIMP_BUILD_NO_EXPORT || ASSIMP_BUILD_NO_M3D_EXPORTER) +#if !defined ASSIMP_BUILD_NO_M3D_IMPORTER || !(defined ASSIMP_BUILD_NO_EXPORT || defined ASSIMP_BUILD_NO_M3D_EXPORTER) #include #include @@ -126,7 +125,6 @@ inline m3d_t *M3DWrapper::M3D() const { } // namespace Assimp -#endif #endif // ASSIMP_BUILD_NO_M3D_IMPORTER #endif // AI_M3DWRAPPER_H_INC From 793284a766e33a0cad7d1af3e6ad95df07ac826b Mon Sep 17 00:00:00 2001 From: Krishty Date: Mon, 16 Jan 2023 08:42:50 +0100 Subject: [PATCH 036/232] Fix Build Without ArmaturePopulate Post Process Step This post process step introduced new attributes into `aiSkeletonBone`. Said attributes are only defined with the process enabled, i.e. when the `ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS` macro has not been defined. Some code, however, accessed the variables unconditionally, leading to build failures if `ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS` was defined. This commit adds the missing checks. --- code/AssetLib/FBX/FBXConverter.cpp | 2 ++ include/assimp/mesh.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index 75d28fbdf..b989e8730 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -1455,7 +1455,9 @@ static void copyBoneToSkeletonBone(aiMesh *mesh, aiBone *bone, aiSkeletonBone *s skeletonBone->mWeights = bone->mWeights; skeletonBone->mOffsetMatrix = bone->mOffsetMatrix; skeletonBone->mMeshId = mesh; +#ifndef ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS skeletonBone->mNode = bone->mNode; +#endif skeletonBone->mParent = -1; } diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 363627464..b0179e179 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -988,8 +988,10 @@ struct aiSkeletonBone { #ifdef __cplusplus aiSkeletonBone() : mParent(-1), +#ifndef ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS mArmature(nullptr), mNode(nullptr), +#endif mNumnWeights(0), mMeshId(nullptr), mWeights(nullptr), From 3d3e8569255a113bc4e12d6f79297ea66cf3c357 Mon Sep 17 00:00:00 2001 From: Krishty Date: Mon, 16 Jan 2023 09:12:35 +0100 Subject: [PATCH 037/232] Trim Trailing Whitespace --- code/AssetLib/3MF/D3MFOpcPackage.cpp | 2 +- code/AssetLib/3MF/XmlSerializer.cpp | 4 ++-- code/AssetLib/Assbin/AssbinExporter.h | 2 +- code/AssetLib/Assbin/AssbinFileWriter.cpp | 6 +++--- code/AssetLib/Assjson/json_exporter.cpp | 10 ++++----- code/AssetLib/C4D/C4DImporter.cpp | 2 +- code/AssetLib/Collada/ColladaLoader.cpp | 2 +- code/AssetLib/DXF/DXFLoader.cpp | 2 +- code/AssetLib/FBX/FBXConverter.cpp | 4 ++-- code/AssetLib/FBX/FBXMeshGeometry.h | 6 +++--- code/AssetLib/FBX/FBXParser.cpp | 2 +- code/AssetLib/HMP/HMPLoader.cpp | 6 +++--- code/AssetLib/LWO/LWOAnimation.cpp | 2 +- code/AssetLib/LWO/LWOLoader.cpp | 2 +- code/AssetLib/MD5/MD5Parser.h | 2 +- code/AssetLib/MDL/MDLMaterialLoader.cpp | 2 +- code/AssetLib/NFF/NFFLoader.h | 2 +- code/AssetLib/Obj/ObjFileMtlImporter.cpp | 10 ++++----- code/AssetLib/Obj/ObjFileParser.cpp | 2 +- code/AssetLib/Obj/ObjTools.h | 22 ++++++++++---------- code/AssetLib/SMD/SMDLoader.cpp | 10 ++++----- code/AssetLib/SMD/SMDLoader.h | 2 +- code/AssetLib/Step/STEPFile.h | 14 ++++++------- code/AssetLib/X/XFileParser.cpp | 2 +- code/AssetLib/X3D/X3DImporter.cpp | 2 +- code/AssetLib/X3D/X3DImporter_Geometry2D.cpp | 2 +- code/AssetLib/glTF/glTFAsset.h | 16 +++++++------- code/AssetLib/glTF/glTFExporter.cpp | 6 +++--- code/AssetLib/glTF2/glTF2Asset.h | 14 ++++++------- code/AssetLib/glTF2/glTF2Asset.inl | 2 +- code/AssetLib/glTF2/glTF2Exporter.cpp | 18 ++++++++-------- code/Common/BaseImporter.cpp | 2 +- code/Common/Importer.cpp | 4 ++-- code/Common/PolyTools.h | 2 +- code/Common/RemoveComments.cpp | 2 +- code/Common/ScenePreprocessor.cpp | 2 +- code/Common/SpatialSort.cpp | 2 +- code/Common/Version.cpp | 2 +- code/PostProcessing/JoinVerticesProcess.cpp | 6 +++--- include/assimp/Bitmap.h | 2 +- include/assimp/DefaultIOStream.h | 2 +- include/assimp/Hash.h | 2 +- include/assimp/LogAux.h | 2 +- include/assimp/ObjMaterial.h | 4 ++-- include/assimp/SpatialSort.h | 2 +- include/assimp/XmlParser.h | 4 ++-- include/assimp/aabb.h | 4 ++-- include/assimp/ai_assert.h | 2 +- include/assimp/anim.h | 6 +++--- include/assimp/defs.h | 2 +- include/assimp/material.inl | 6 +++--- include/assimp/quaternion.inl | 2 +- include/assimp/scene.h | 2 +- include/assimp/vector3.h | 8 +++---- port/AndroidJNI/AndroidJNIIOSystem.cpp | 8 +++---- port/jassimp/jassimp-native/src/jassimp.cpp | 6 +++--- test/unit/AssimpAPITest_aiQuaternion.cpp | 2 +- test/unit/Common/uiScene.cpp | 2 +- tools/assimp_cmd/Main.cpp | 2 +- tools/assimp_view/MaterialManager.h | 2 +- 60 files changed, 137 insertions(+), 137 deletions(-) diff --git a/code/AssetLib/3MF/D3MFOpcPackage.cpp b/code/AssetLib/3MF/D3MFOpcPackage.cpp index a2182dc29..934305d49 100644 --- a/code/AssetLib/3MF/D3MFOpcPackage.cpp +++ b/code/AssetLib/3MF/D3MFOpcPackage.cpp @@ -160,7 +160,7 @@ D3MFOpcPackage::D3MFOpcPackage(IOSystem *pIOHandler, const std::string &rFile) : // deal with zip-bug rootFile = rootFile.substr(1); } - } + } ASSIMP_LOG_VERBOSE_DEBUG(rootFile); diff --git a/code/AssetLib/3MF/XmlSerializer.cpp b/code/AssetLib/3MF/XmlSerializer.cpp index 674c6b916..c77111728 100644 --- a/code/AssetLib/3MF/XmlSerializer.cpp +++ b/code/AssetLib/3MF/XmlSerializer.cpp @@ -216,7 +216,7 @@ void XmlSerializer::ImportXml(aiScene *scene) { if (nullptr == scene) { return; } - + scene->mRootNode = new aiNode(XmlTag::RootTag); XmlNode node = mXmlParser->getRootNode().child(XmlTag::model); if (node.empty()) { @@ -444,7 +444,7 @@ void XmlSerializer::ImportTriangles(XmlNode &node, aiMesh *mesh) { } mesh->mTextureCoords[0] = new aiVector3D[mesh->mNumVertices]; } - } + } } } diff --git a/code/AssetLib/Assbin/AssbinExporter.h b/code/AssetLib/Assbin/AssbinExporter.h index 1801c1680..8b721994d 100644 --- a/code/AssetLib/Assbin/AssbinExporter.h +++ b/code/AssetLib/Assbin/AssbinExporter.h @@ -56,5 +56,5 @@ namespace Assimp { void ASSIMP_API ExportSceneAssbin(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* /*pProperties*/); } -#endif +#endif #endif // AI_ASSBINEXPORTER_H_INC diff --git a/code/AssetLib/Assbin/AssbinFileWriter.cpp b/code/AssetLib/Assbin/AssbinFileWriter.cpp index 97be634de..e9d857a84 100644 --- a/code/AssetLib/Assbin/AssbinFileWriter.cpp +++ b/code/AssetLib/Assbin/AssbinFileWriter.cpp @@ -291,15 +291,15 @@ public: size_t Read(void * /*pvBuffer*/, size_t /*pSize*/, size_t /*pCount*/) override { return 0; } - + aiReturn Seek(size_t /*pOffset*/, aiOrigin /*pOrigin*/) override { return aiReturn_FAILURE; } - + size_t Tell() const override { return cursor; } - + void Flush() override { // not implemented } diff --git a/code/AssetLib/Assjson/json_exporter.cpp b/code/AssetLib/Assjson/json_exporter.cpp index 7a8403831..ea5194fb0 100644 --- a/code/AssetLib/Assjson/json_exporter.cpp +++ b/code/AssetLib/Assjson/json_exporter.cpp @@ -43,7 +43,7 @@ public: Flag_WriteSpecialFloats = 0x2, Flag_SkipWhitespaces = 0x4 }; - + JSONWriter(Assimp::IOStream &out, unsigned int flags = 0u) : out(out), indent (""), newline("\n"), space(" "), buff (), first(false), flags(flags) { // make sure that all formatting happens using the standard, C locale and not the user's current locale @@ -499,18 +499,18 @@ static void Write(JSONWriter &out, const aiMaterial &ai, bool is_elem = true) { } break; - case aiPTI_String: + case aiPTI_String: { aiString s; aiGetMaterialString(&ai, prop->mKey.data, prop->mSemantic, prop->mIndex, &s); out.SimpleValue(s); - } + } break; - case aiPTI_Buffer: + case aiPTI_Buffer: { // binary data is written as series of hex-encoded octets out.SimpleValue(prop->mData, prop->mDataLength); - } + } break; default: ai_assert(false); diff --git a/code/AssetLib/C4D/C4DImporter.cpp b/code/AssetLib/C4D/C4DImporter.cpp index 06d7a3412..866229626 100644 --- a/code/AssetLib/C4D/C4DImporter.cpp +++ b/code/AssetLib/C4D/C4DImporter.cpp @@ -124,7 +124,7 @@ bool C4DImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, b } else if ((!extension.length() || checkSig) && pIOHandler) { // TODO } - + return false; } diff --git a/code/AssetLib/Collada/ColladaLoader.cpp b/code/AssetLib/Collada/ColladaLoader.cpp index 2d578aff3..0a732a8db 100644 --- a/code/AssetLib/Collada/ColladaLoader.cpp +++ b/code/AssetLib/Collada/ColladaLoader.cpp @@ -1523,7 +1523,7 @@ void ColladaLoader::AddTexture(aiMaterial &mat, map = -1; for (std::string::const_iterator it = sampler.mUVChannel.begin(); it != sampler.mUVChannel.end(); ++it) { if (IsNumeric(*it)) { - map = strtoul10(&(*it)); + map = strtoul10(&(*it)); break; } } diff --git a/code/AssetLib/DXF/DXFLoader.cpp b/code/AssetLib/DXF/DXFLoader.cpp index 46c723375..1fb9490cc 100644 --- a/code/AssetLib/DXF/DXFLoader.cpp +++ b/code/AssetLib/DXF/DXFLoader.cpp @@ -371,7 +371,7 @@ void DXFImporter::ExpandBlockReferences(DXF::Block& bl,const DXF::BlockMap& bloc ASSIMP_LOG_ERROR("DXF: PolyLine instance is nullptr, skipping."); continue; } - + std::shared_ptr pl_out = std::shared_ptr(new DXF::PolyLine(*pl_in)); if (bl_src.base.Length() || insert.scale.x!=1.f || insert.scale.y!=1.f || insert.scale.z!=1.f || insert.angle || insert.pos.Length()) { diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index 75d28fbdf..e2f43b885 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -1563,7 +1563,7 @@ void FBXConverter::ConvertWeights(aiMesh *out, const MeshGeometry &geo, const ai out->mBones = nullptr; out->mNumBones = 0; return; - } + } out->mBones = new aiBone *[bones.size()](); out->mNumBones = static_cast(bones.size()); @@ -3228,7 +3228,7 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name, } bool ok = false; - + const auto zero_epsilon = ai_epsilon; const aiVector3D& preRotation = PropertyGet(props, "PreRotation", ok); diff --git a/code/AssetLib/FBX/FBXMeshGeometry.h b/code/AssetLib/FBX/FBXMeshGeometry.h index ad24877e4..03f01b763 100644 --- a/code/AssetLib/FBX/FBXMeshGeometry.h +++ b/code/AssetLib/FBX/FBXMeshGeometry.h @@ -59,9 +59,9 @@ class Geometry : public Object { public: /// @brief The class constructor with all parameters. /// @param id The id. - /// @param element - /// @param name - /// @param doc + /// @param element + /// @param name + /// @param doc Geometry( uint64_t id, const Element& element, const std::string& name, const Document& doc ); virtual ~Geometry() = default; diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index da6d3889a..d71321452 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -187,7 +187,7 @@ Scope::Scope(Parser& parser,bool topLevel) if (str.empty()) { ParseError("unexpected content: empty string."); } - + elements.insert(ElementMap::value_type(str,new_Element(*n,parser))); // Element() should stop at the next Key token (or right after a Close token) diff --git a/code/AssetLib/HMP/HMPLoader.cpp b/code/AssetLib/HMP/HMPLoader.cpp index efb148eae..3dd27eb02 100644 --- a/code/AssetLib/HMP/HMPLoader.cpp +++ b/code/AssetLib/HMP/HMPLoader.cpp @@ -327,7 +327,7 @@ void HMPImporter::CreateMaterial(const unsigned char *szCurrent, ReadFirstSkin(pcHeader->numskins, szCurrent, &szCurrent); *szCurrentOut = szCurrent; return; - } + } // generate a default material const int iMode = (int)aiShadingMode_Gouraud; @@ -484,11 +484,11 @@ void HMPImporter::GenerateTextureCoords(const unsigned int width, const unsigned if (uv == nullptr) { return; } - + if (height == 0.0f || width == 0.0) { return; } - + const float fY = (1.0f / height) + (1.0f / height) / height; const float fX = (1.0f / width) + (1.0f / width) / width; diff --git a/code/AssetLib/LWO/LWOAnimation.cpp b/code/AssetLib/LWO/LWOAnimation.cpp index 7ebbfb810..8dda4586f 100644 --- a/code/AssetLib/LWO/LWOAnimation.cpp +++ b/code/AssetLib/LWO/LWOAnimation.cpp @@ -165,7 +165,7 @@ void AnimResolver::UpdateAnimRangeSetup() { if (delta == 0.0) { continue; } - + const size_t old_size = (*it).keys.size(); const float value_delta = (*it).keys.back().value - (*it).keys.front().value; diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index c3cee0607..96fed248b 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -215,7 +215,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, } else { mIsLWO2 = true; } - + LoadLWO2File(); // The newer lightwave format allows the user to configure the diff --git a/code/AssetLib/MD5/MD5Parser.h b/code/AssetLib/MD5/MD5Parser.h index e39ce8a8e..bb4843cf9 100644 --- a/code/AssetLib/MD5/MD5Parser.h +++ b/code/AssetLib/MD5/MD5Parser.h @@ -394,7 +394,7 @@ private: bool SkipLine(const char* in, const char** out); bool SkipLine( ); - bool SkipSpacesAndLineEnd( const char* in, const char** out); + bool SkipSpacesAndLineEnd( const char* in, const char** out); bool SkipSpacesAndLineEnd(); bool SkipSpaces(); diff --git a/code/AssetLib/MDL/MDLMaterialLoader.cpp b/code/AssetLib/MDL/MDLMaterialLoader.cpp index db4b534f2..799368264 100644 --- a/code/AssetLib/MDL/MDLMaterialLoader.cpp +++ b/code/AssetLib/MDL/MDLMaterialLoader.cpp @@ -470,7 +470,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7( ASSIMP_LOG_ERROR("Found a reference to an embedded DDS texture, but texture width is zero, aborting import."); return; } - + pcNew.reset(new aiTexture); pcNew->mHeight = 0; pcNew->mWidth = iWidth; diff --git a/code/AssetLib/NFF/NFFLoader.h b/code/AssetLib/NFF/NFFLoader.h index 0fa615b19..7fd094306 100644 --- a/code/AssetLib/NFF/NFFLoader.h +++ b/code/AssetLib/NFF/NFFLoader.h @@ -107,7 +107,7 @@ private: aiColor3D color, diffuse, specular, ambient, emissive; ai_real refracti; - std::string texFile; + std::string texFile; bool twoSided; // For NFF2 bool shaded; ai_real opacity, shininess; diff --git a/code/AssetLib/Obj/ObjFileMtlImporter.cpp b/code/AssetLib/Obj/ObjFileMtlImporter.cpp index 78743dd05..2c3ce9ee5 100644 --- a/code/AssetLib/Obj/ObjFileMtlImporter.cpp +++ b/code/AssetLib/Obj/ObjFileMtlImporter.cpp @@ -514,16 +514,16 @@ void ObjFileMtlImporter::getTextureOption(bool &clamp, int &clampIndex, aiString DataArrayIt it = getNextToken(m_DataIt, m_DataItEnd); getFloat(it, m_DataItEnd, m_pModel->mCurrentMaterial->bump_multiplier); skipToken = 2; - } else if (!ASSIMP_strincmp(pPtr, BlendUOption, static_cast(strlen(BlendUOption))) || + } else if (!ASSIMP_strincmp(pPtr, BlendUOption, static_cast(strlen(BlendUOption))) || !ASSIMP_strincmp(pPtr, BlendVOption, static_cast(strlen(BlendVOption))) || - !ASSIMP_strincmp(pPtr, BoostOption, static_cast(strlen(BoostOption))) || - !ASSIMP_strincmp(pPtr, ResolutionOption, static_cast(strlen(ResolutionOption))) || + !ASSIMP_strincmp(pPtr, BoostOption, static_cast(strlen(BoostOption))) || + !ASSIMP_strincmp(pPtr, ResolutionOption, static_cast(strlen(ResolutionOption))) || !ASSIMP_strincmp(pPtr, ChannelOption, static_cast(strlen(ChannelOption)))) { skipToken = 2; } else if (!ASSIMP_strincmp(pPtr, ModifyMapOption, static_cast(strlen(ModifyMapOption)))) { skipToken = 3; - } else if (!ASSIMP_strincmp(pPtr, OffsetOption, static_cast(strlen(OffsetOption))) || - !ASSIMP_strincmp(pPtr, ScaleOption, static_cast(strlen(ScaleOption))) || + } else if (!ASSIMP_strincmp(pPtr, OffsetOption, static_cast(strlen(OffsetOption))) || + !ASSIMP_strincmp(pPtr, ScaleOption, static_cast(strlen(ScaleOption))) || !ASSIMP_strincmp(pPtr, TurbulenceOption, static_cast(strlen(TurbulenceOption)))) { skipToken = 4; } diff --git a/code/AssetLib/Obj/ObjFileParser.cpp b/code/AssetLib/Obj/ObjFileParser.cpp index 360c1d0e9..c7121083a 100644 --- a/code/AssetLib/Obj/ObjFileParser.cpp +++ b/code/AssetLib/Obj/ObjFileParser.cpp @@ -458,7 +458,7 @@ void ObjFileParser::getFace(aiPrimitiveType type) { //OBJ USES 1 Base ARRAYS!!!! const char *token = &(*m_DataIt); const int iVal = ::atoi(token); - + // increment iStep position based off of the sign and # of digits int tmp = iVal; if (iVal < 0) { diff --git a/code/AssetLib/Obj/ObjTools.h b/code/AssetLib/Obj/ObjTools.h index a76054825..ca173de0a 100644 --- a/code/AssetLib/Obj/ObjTools.h +++ b/code/AssetLib/Obj/ObjTools.h @@ -51,7 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { -/** +/** * @brief Returns true, if the last entry of the buffer is reached. * @param[in] it Iterator of current position. * @param[in] end Iterator with end of buffer. @@ -67,7 +67,7 @@ inline bool isEndOfBuffer(char_t it, char_t end) { return (it == end); } -/** +/** * @brief Returns next word separated by a space * @param[in] pBuffer Pointer to data buffer * @param[in] pEnd Pointer to end of buffer @@ -85,7 +85,7 @@ inline Char_T getNextWord(Char_T pBuffer, Char_T pEnd) { return pBuffer; } -/** +/** * @brief Returns pointer a next token * @param[in] pBuffer Pointer to data buffer * @param[in] pEnd Pointer to end of buffer @@ -102,7 +102,7 @@ inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd) { return getNextWord(pBuffer, pEnd); } -/** +/** * @brief Skips a line * @param[in] it Iterator set to current position * @param[in] end Iterator set to end of scratch buffer for readout @@ -131,7 +131,7 @@ inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) { return it; } -/** +/** * @brief Get a name from the current line. Preserve space in the middle, * but trim it at the end. * @param[in] it set to current position @@ -162,13 +162,13 @@ inline char_t getName(char_t it, char_t end, std::string &name) { std::string strName(pStart, &(*it)); if (!strName.empty()) { name = strName; - } - + } + return it; } -/** +/** * @brief Get a name from the current line. Do not preserve space * in the middle, but trim it at the end. * @param it set to current position @@ -202,11 +202,11 @@ inline char_t getNameNoSpace(char_t it, char_t end, std::string &name) { if (!strName.empty()) { name = strName; } - + return it; } -/** +/** * @brief Get next word from given line * @param[in] it set to current position * @param[in] end set to end of scratch buffer for readout @@ -230,7 +230,7 @@ inline char_t CopyNextWord(char_t it, char_t end, char *pBuffer, size_t length) return it; } -/** +/** * @brief Get next float from given line * @param[in] it set to current position * @param[in] end set to end of scratch buffer for readout diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index 896d0b196..039760b94 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -82,13 +82,13 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer SMDImporter::SMDImporter() : - configFrameID(), - mBuffer(), - pScene( nullptr ), - iFileSize( 0 ), + configFrameID(), + mBuffer(), + pScene( nullptr ), + iFileSize( 0 ), iSmallestFrame( INT_MAX ), dLengthOfAnim( 0.0 ), - bHasUVs(false ), + bHasUVs(false ), iLineNumber((unsigned int)-1) { // empty } diff --git a/code/AssetLib/SMD/SMDLoader.h b/code/AssetLib/SMD/SMDLoader.h index db882a241..26f8c751a 100644 --- a/code/AssetLib/SMD/SMDLoader.h +++ b/code/AssetLib/SMD/SMDLoader.h @@ -90,7 +90,7 @@ struct Face { iTexture(0x0), avVertices{} { // empty } - + //! Texture index for the face unsigned int iTexture; diff --git a/code/AssetLib/Step/STEPFile.h b/code/AssetLib/Step/STEPFile.h index 47d6f5010..76a9370f5 100644 --- a/code/AssetLib/Step/STEPFile.h +++ b/code/AssetLib/Step/STEPFile.h @@ -121,7 +121,7 @@ namespace STEP { // ------------------------------------------------------------------------------- /** Exception class used by the STEP loading & parsing code. It is typically - * coupled with a line number. + * coupled with a line number. */ // ------------------------------------------------------------------------------- struct SyntaxError : DeadlyImportError { @@ -230,7 +230,7 @@ private: }; // ------------------------------------------------------------------------------- -/** Shared implementation for some of the primitive data type, i.e. int, float +/** Shared implementation for some of the primitive data type, i.e. int, float */ // ------------------------------------------------------------------------------- template @@ -278,7 +278,7 @@ public: typedef ENUMERATION BOOLEAN; // ------------------------------------------------------------------------------- -/** This is just a reference to an entity/object somewhere else +/** This is just a reference to an entity/object somewhere else */ // ------------------------------------------------------------------------------- class ENTITY : public PrimitiveDataType { @@ -302,7 +302,7 @@ public: } public: - /** @see DaraType::Parse + /** @see DaraType::Parse */ static std::shared_ptr Parse(const char *&inout, uint64_t line = SyntaxError::LINE_NOT_SPECIFIED, @@ -322,7 +322,7 @@ public: // ------------------------------------------------------------------------------- /* Not exactly a full EXPRESS schema but rather a list of conversion functions * to extract valid C++ objects out of a STEP file. Those conversion functions - * may, however, perform further schema validations. + * may, however, perform further schema validations. */ // ------------------------------------------------------------------------------- class ConversionSchema { @@ -384,7 +384,7 @@ struct HeaderInfo { }; // ------------------------------------------------------------------------------ -/** Base class for all concrete object instances +/** Base class for all concrete object instances */ // ------------------------------------------------------------------------------ class Object { @@ -511,7 +511,7 @@ private: // ------------------------------------------------------------------------------ /** A LazyObject is created when needed. Before this happens, we just keep - * the text line that contains the object definition. + * the text line that contains the object definition. */ // ------------------------------------------------------------------------------- class LazyObject { diff --git a/code/AssetLib/X/XFileParser.cpp b/code/AssetLib/X/XFileParser.cpp index 808bb9efd..8786c3166 100644 --- a/code/AssetLib/X/XFileParser.cpp +++ b/code/AssetLib/X/XFileParser.cpp @@ -183,7 +183,7 @@ XFileParser::XFileParser(const std::vector &pBuffer) : P1 += ofs; est_out += MSZIP_BLOCK; // one decompressed block is 327861 in size } - + // Allocate storage and terminating zero and do the actual uncompressing Compression compression; uncompressed.resize(est_out + 1); diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index 6e25fb60f..eeb20b7c1 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/code/AssetLib/X3D/X3DImporter.cpp @@ -471,7 +471,7 @@ void X3DImporter::ParseHelper_Node_Enter(X3DNodeElementBase *pNode) { mNodeElementCur->Children.push_back(pNode); // add new element to current element child list. mNodeElementCur = pNode; // switch current element to new one. -} +} void X3DImporter::ParseHelper_Node_Exit() { // check if we can walk up. diff --git a/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp b/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp index 653203b4e..2e97902d8 100644 --- a/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp +++ b/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp @@ -263,7 +263,7 @@ void X3DImporter::readDisk2D(XmlNode &node) { // if (tlist_i.size() < 2) { // tlist_i and tlist_o has equal size. - throw DeadlyImportError("Disk2D. Not enough points for creating quad list."); + throw DeadlyImportError("Disk2D. Not enough points for creating quad list."); } // add all quads except last diff --git a/code/AssetLib/glTF/glTFAsset.h b/code/AssetLib/glTF/glTFAsset.h index 26ef239cd..8dd7c8d45 100644 --- a/code/AssetLib/glTF/glTFAsset.h +++ b/code/AssetLib/glTF/glTFAsset.h @@ -260,7 +260,7 @@ public: VEC4, MAT2, MAT3, - MAT4 + MAT4 }; inline static Value FromString(const char *str) { @@ -288,8 +288,8 @@ private: }; template - struct data { - static const Info infos[NUM_VALUES]; + struct data { + static const Info infos[NUM_VALUES]; }; }; @@ -297,11 +297,11 @@ private: template const AttribType::Info AttribType::data::infos[AttribType::NUM_VALUES] = { { "SCALAR", 1 }, - { "VEC2", 2 }, - { "VEC3", 3 }, - { "VEC4", 4 }, - { "MAT2", 4 }, - { "MAT3", 9 }, + { "VEC2", 2 }, + { "VEC3", 3 }, + { "VEC4", 4 }, + { "MAT2", 4 }, + { "MAT3", 9 }, { "MAT4", 16 } }; diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index 4010f2b18..91d88f1ae 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -322,7 +322,7 @@ void glTFExporter::GetTexSampler(const aiMaterial* mat, glTF::TexProperty& prop) prop.texture->sampler->minFilter = SamplerMinFilter_Linear; } -void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& prop, +void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& prop, const char* propName, int type, int idx, aiTextureType tt) { aiString tex; aiColor4D col; @@ -370,9 +370,9 @@ void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& pr } if (mat->Get(propName, type, idx, col) == AI_SUCCESS) { - prop.color[0] = col.r; + prop.color[0] = col.r; prop.color[1] = col.g; - prop.color[2] = col.b; + prop.color[2] = col.b; prop.color[3] = col.a; } } diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 85af49acf..2b58eec23 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -1123,13 +1123,13 @@ public: bool KHR_texture_basisu; Extensions() : - KHR_materials_pbrSpecularGlossiness(false), - KHR_materials_unlit(false), - KHR_lights_punctual(false), - KHR_texture_transform(false), - KHR_materials_sheen(false), - KHR_materials_clearcoat(false), - KHR_materials_transmission(false), + KHR_materials_pbrSpecularGlossiness(false), + KHR_materials_unlit(false), + KHR_lights_punctual(false), + KHR_texture_transform(false), + KHR_materials_sheen(false), + KHR_materials_clearcoat(false), + KHR_materials_transmission(false), KHR_materials_volume(false), KHR_materials_ior(false), KHR_materials_emissive_strength(false), diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index af41c23c3..0e2998357 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -1903,7 +1903,7 @@ inline void Asset::Load(const std::string &pFile, bool isBinary) std::vector sceneData; rapidjson::Document doc = ReadDocument(*stream, isBinary, sceneData); - // If a schemaDocumentProvider is available, see if the glTF schema is present. + // If a schemaDocumentProvider is available, see if the glTF schema is present. // If so, use it to validate the document. if (mSchemaDocumentProvider) { if (const rapidjson::SchemaDocument *gltfSchema = mSchemaDocumentProvider->GetRemoteDocument("glTF.schema.json", 16)) { diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 0fdb8e510..51c7f8e05 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -516,7 +516,7 @@ void glTF2Exporter::GetMatTex(const aiMaterial &mat, Ref &texture, unsi if (mat.GetTextureCount(tt) == 0) { return; } - + aiString tex; // Read texcoord (UV map index) @@ -855,13 +855,13 @@ void glTF2Exporter::ExportMaterials() { mAsset->extensionsUsed.KHR_materials_transmission = true; m->materialTransmission = Nullable(transmission); } - + MaterialVolume volume; if (GetMatVolume(mat, volume)) { mAsset->extensionsUsed.KHR_materials_volume = true; m->materialVolume = Nullable(volume); } - + MaterialIOR ior; if (GetMatIOR(mat, ior)) { mAsset->extensionsUsed.KHR_materials_ior = true; @@ -921,7 +921,7 @@ Ref FindSkeletonRootJoint(Ref &skinRef) { return parentNodeRef; } -void ExportSkin(Asset &mAsset, const aiMesh *aimesh, Ref &meshRef, Ref &bufferRef, Ref &skinRef, +void ExportSkin(Asset &mAsset, const aiMesh *aimesh, Ref &meshRef, Ref &bufferRef, Ref &skinRef, std::vector &inverseBindMatricesData) { if (aimesh->mNumBones < 1) { return; @@ -985,14 +985,14 @@ void ExportSkin(Asset &mAsset, const aiMesh *aimesh, Ref &meshRef, Ref(jointNamesIndex); vertexWeightData[vertexId][jointsPerVertex[vertexId]] = vertWeight; - jointsPerVertex[vertexId] += 1; + jointsPerVertex[vertexId] += 1; } } } // End: for-loop mNumMeshes Mesh::Primitive &p = meshRef->primitives.back(); - Ref vertexJointAccessor = ExportData(mAsset, skinRef->id, bufferRef, aimesh->mNumVertices, + Ref vertexJointAccessor = ExportData(mAsset, skinRef->id, bufferRef, aimesh->mNumVertices, vertexJointData, AttribType::VEC4, AttribType::VEC4, ComponentType_FLOAT); if (vertexJointAccessor) { size_t offset = vertexJointAccessor->bufferView->byteOffset; @@ -1090,7 +1090,7 @@ void glTF2Exporter::ExportMeshes() { } } - Ref n = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mNormals, AttribType::VEC3, + Ref n = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mNormals, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT, BufferViewTarget_ARRAY_BUFFER); if (n) { p.attributes.normal.push_back(n); @@ -1112,7 +1112,7 @@ void glTF2Exporter::ExportMeshes() { if (aim->mNumUVComponents[i] > 0) { AttribType::Value type = (aim->mNumUVComponents[i] == 2) ? AttribType::VEC2 : AttribType::VEC3; - Ref tc = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mTextureCoords[i], + Ref tc = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mTextureCoords[i], AttribType::VEC3, type, ComponentType_FLOAT, BufferViewTarget_ARRAY_BUFFER); if (tc) { p.attributes.texcoord.push_back(tc); @@ -1140,7 +1140,7 @@ void glTF2Exporter::ExportMeshes() { } } - p.indices = ExportData(*mAsset, meshId, b, indices.size(), &indices[0], AttribType::SCALAR, AttribType::SCALAR, + p.indices = ExportData(*mAsset, meshId, b, indices.size(), &indices[0], AttribType::SCALAR, AttribType::SCALAR, ComponentType_UNSIGNED_INT, BufferViewTarget_ELEMENT_ARRAY_BUFFER); } diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 587fa7bc1..87b385268 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -247,7 +247,7 @@ void BaseImporter::GetExtensionList(std::set &extensions) { } if (ext2 && !ASSIMP_stricmp(ext_real, ext2)) { - return true; + return true; } return false; diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index 52b6097e7..df2895eef 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -1118,7 +1118,7 @@ bool Importer::SetPropertyMatrix(const char* szName, const aiMatrix4x4& value) { // Set a configuration property bool Importer::SetPropertyPointer(const char* szName, void* value) { ai_assert(nullptr != pimpl); - + bool existing; ASSIMP_BEGIN_EXCEPTION_REGION(); existing = SetGenericProperty(pimpl->mPointerProperties, szName,value); @@ -1162,7 +1162,7 @@ aiMatrix4x4 Importer::GetPropertyMatrix(const char* szName, const aiMatrix4x4& i // Get a configuration property void* Importer::GetPropertyPointer(const char* szName, void* iErrorReturn /*= nullptr*/) const { ai_assert(nullptr != pimpl); - + return GetGenericProperty(pimpl->mPointerProperties,szName,iErrorReturn); } diff --git a/code/Common/PolyTools.h b/code/Common/PolyTools.h index 11f627392..9837a2991 100644 --- a/code/Common/PolyTools.h +++ b/code/Common/PolyTools.h @@ -88,7 +88,7 @@ inline bool PointInTriangle2D(const T& p0, const T& p1,const T& p2, const T& pp) if (denom == 0.0) { return false; } - + const double invDenom = 1.0 / denom; dot11 = (dot11 * dot02 - dot01 * dot12) * invDenom; dot00 = (dot00 * dot12 - dot01 * dot02) * invDenom; diff --git a/code/Common/RemoveComments.cpp b/code/Common/RemoveComments.cpp index 4fae21c95..52dd37ff0 100644 --- a/code/Common/RemoveComments.cpp +++ b/code/Common/RemoveComments.cpp @@ -39,7 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** +/** * @file RemoveComments.cpp * @brief Defines the CommentRemover utility class */ diff --git a/code/Common/ScenePreprocessor.cpp b/code/Common/ScenePreprocessor.cpp index 95c63ae1c..18a257ad4 100644 --- a/code/Common/ScenePreprocessor.cpp +++ b/code/Common/ScenePreprocessor.cpp @@ -106,7 +106,7 @@ void ScenePreprocessor::ProcessMesh(aiMesh *mesh) { if (!mesh->mTextureCoords[i]) { mesh->mNumUVComponents[i] = 0; continue; - } + } if (!mesh->mNumUVComponents[i]) { mesh->mNumUVComponents[i] = 2; diff --git a/code/Common/SpatialSort.cpp b/code/Common/SpatialSort.cpp index a35ebb055..c8c5c30ed 100644 --- a/code/Common/SpatialSort.cpp +++ b/code/Common/SpatialSort.cpp @@ -94,7 +94,7 @@ ai_real SpatialSort::CalculateDistance(const aiVector3D &pPosition) const { void SpatialSort::Finalize() { const ai_real scale = 1.0f / mPositions.size(); for (unsigned int i = 0; i < mPositions.size(); i++) { - mCentroid += scale * mPositions[i].mPosition; + mCentroid += scale * mPositions[i].mPosition; } for (unsigned int i = 0; i < mPositions.size(); i++) { mPositions[i].mDistance = CalculateDistance(mPositions[i].mPosition); diff --git a/code/Common/Version.cpp b/code/Common/Version.cpp index 808c3598d..9c3d0250c 100644 --- a/code/Common/Version.cpp +++ b/code/Common/Version.cpp @@ -185,6 +185,6 @@ ASSIMP_API aiScene::~aiScene() { aiMetadata::Dealloc(mMetaData); delete[] mSkeletons; - + delete static_cast(mPrivate); } diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index ef5999875..acb1e9651 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -95,7 +95,7 @@ void JoinVerticesProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("JoinVerticesProcess finished "); return; } - + // Show statistics ASSIMP_LOG_INFO("JoinVerticesProcess finished | Verts in: ", iNumOldVertices, " out: ", iNumVertices, " | ~", @@ -235,7 +235,7 @@ struct std::hash { std::size_t operator()(Vertex const& v) const noexcept { size_t seed = 0; hash_combine(seed, v.position.x ,v.position.y,v.position.z); - return seed; + return seed; } }; //template specialization for std::equal_to for Vertex @@ -399,7 +399,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { } if (weightAlreadyExists) { continue; - } + } aiVertexWeight nw; nw.mVertexId = replaceIndex[ ow.mVertexId ]; nw.mWeight = ow.mWeight; diff --git a/include/assimp/Bitmap.h b/include/assimp/Bitmap.h index 94dd0b81b..2678b5f64 100644 --- a/include/assimp/Bitmap.h +++ b/include/assimp/Bitmap.h @@ -63,7 +63,7 @@ namespace Assimp { class IOStream; // --------------------------------------------------------------------------- -/** +/** * This class is used to store and write bitmap information. */ class ASSIMP_API Bitmap { diff --git a/include/assimp/DefaultIOStream.h b/include/assimp/DefaultIOStream.h index aa298a667..e8d9ed329 100644 --- a/include/assimp/DefaultIOStream.h +++ b/include/assimp/DefaultIOStream.h @@ -74,7 +74,7 @@ class ASSIMP_API DefaultIOStream : public IOStream { #endif // __ANDROID__ protected: - /// @brief + /// @brief DefaultIOStream() AI_NO_EXCEPT; /// @brief The class constructor with the file name and the stream. diff --git a/include/assimp/Hash.h b/include/assimp/Hash.h index 188e98a94..cf889362c 100644 --- a/include/assimp/Hash.h +++ b/include/assimp/Hash.h @@ -77,7 +77,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inline uint32_t SuperFastHash (const char * data, uint32_t len = 0, uint32_t hash = 0) { uint32_t tmp; int rem; - + if (data == NULL) return 0; if (len == 0)len = (uint32_t)::strlen(data); diff --git a/include/assimp/LogAux.h b/include/assimp/LogAux.h index c7b86a185..a8cb8f24c 100644 --- a/include/assimp/LogAux.h +++ b/include/assimp/LogAux.h @@ -57,7 +57,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { /// @brief Logger class, which will extend the class by log-functions. -/// @tparam TDeriving +/// @tparam TDeriving template class LogFunctions { public: diff --git a/include/assimp/ObjMaterial.h b/include/assimp/ObjMaterial.h index bba207638..9c511916a 100644 --- a/include/assimp/ObjMaterial.h +++ b/include/assimp/ObjMaterial.h @@ -41,7 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file OBJMATERIAL.h * @brief Obj-specific material macros - * + * */ #ifndef AI_OBJMATERIAL_H_INC @@ -64,7 +64,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Pure key names for all obj texture-related properties //! @cond MATS_DOC_FULL -// support for bump -bm +// support for bump -bm #define _AI_MATKEY_OBJ_BUMPMULT_BASE "$tex.bumpmult" //! @endcond diff --git a/include/assimp/SpatialSort.h b/include/assimp/SpatialSort.h index 87b009da7..cd055450e 100644 --- a/include/assimp/SpatialSort.h +++ b/include/assimp/SpatialSort.h @@ -162,7 +162,7 @@ protected: unsigned int mIndex; ///< The vertex referred by this entry aiVector3D mPosition; ///< Position /// Distance of this vertex to the sorting plane. This is set by Finalize. - ai_real mDistance; + ai_real mDistance; Entry() AI_NO_EXCEPT : mIndex(std::numeric_limits::max()), diff --git a/include/assimp/XmlParser.h b/include/assimp/XmlParser.h index 2b850e6c2..52a23bd83 100644 --- a/include/assimp/XmlParser.h +++ b/include/assimp/XmlParser.h @@ -58,8 +58,8 @@ namespace Assimp { struct find_node_by_name_predicate { /// @brief The default constructor. find_node_by_name_predicate() = default; - - + + std::string mName; ///< The name to find. find_node_by_name_predicate(const std::string &name) : mName(name) { diff --git a/include/assimp/aabb.h b/include/assimp/aabb.h index fac77993d..b38aa1697 100644 --- a/include/assimp/aabb.h +++ b/include/assimp/aabb.h @@ -50,8 +50,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include // --------------------------------------------------------------------------- -/** - * An axis-aligned bounding box. +/** + * An axis-aligned bounding box. */ struct aiAABB { C_STRUCT aiVector3D mMin; diff --git a/include/assimp/ai_assert.h b/include/assimp/ai_assert.h index b41c08f52..e49a482dd 100644 --- a/include/assimp/ai_assert.h +++ b/include/assimp/ai_assert.h @@ -55,7 +55,7 @@ namespace Assimp { /// @brief Assert violation behavior can be customized: see AssertHandler.h. /// @param failedExpression The expression to validate. -/// @param file The file location +/// @param file The file location /// @param line The line number ASSIMP_API void aiAssertViolation(const char* failedExpression, const char* file, int line); diff --git a/include/assimp/anim.h b/include/assimp/anim.h index ef56c1dc2..edb048f50 100644 --- a/include/assimp/anim.h +++ b/include/assimp/anim.h @@ -98,7 +98,7 @@ struct aiVectorKey { bool operator<(const aiVectorKey &rhs) const { return mTime < rhs.mTime; } - + bool operator>(const aiVectorKey &rhs) const { return mTime > rhs.mTime; } @@ -132,7 +132,7 @@ struct aiQuatKey { bool operator==(const aiQuatKey &rhs) const { return rhs.mValue == this->mValue; } - + bool operator!=(const aiQuatKey &rhs) const { return rhs.mValue != this->mValue; } @@ -141,7 +141,7 @@ struct aiQuatKey { bool operator<(const aiQuatKey &rhs) const { return mTime < rhs.mTime; } - + bool operator>(const aiQuatKey &rhs) const { return mTime > rhs.mTime; } diff --git a/include/assimp/defs.h b/include/assimp/defs.h index 0626a8d8a..ddb209bec 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -190,7 +190,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef __cplusplus /* No explicit 'struct' and 'enum' tags for C++, this keeps showing up - * in doxydocs. + * in doxydocs. */ #define C_STRUCT #define C_ENUM diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 342c26646..744743bc7 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -100,7 +100,7 @@ AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, // std::min has in some cases a conflict with a defined min #ifdef min # undef min -#endif +#endif iNum = static_cast(std::min(static_cast(iNum),prop->mDataLength / sizeof(Type))); std::memcpy(pOut,prop->mData,iNum * sizeof(Type)); if (pMax) { @@ -227,8 +227,8 @@ AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, // --------------------------------------------------------------------------- template -aiReturn aiMaterial::AddProperty (const TYPE* pInput, - const unsigned int pNumValues, const char* pKey, unsigned int type, +aiReturn aiMaterial::AddProperty (const TYPE* pInput, + const unsigned int pNumValues, const char* pKey, unsigned int type, unsigned int index) { return AddBinaryProperty((const void*)pInput, pNumValues * sizeof(TYPE), pKey,type,index,aiPTI_Buffer); diff --git a/include/assimp/quaternion.inl b/include/assimp/quaternion.inl index 1b93be9ed..2cb24653c 100644 --- a/include/assimp/quaternion.inl +++ b/include/assimp/quaternion.inl @@ -237,7 +237,7 @@ inline void aiQuaterniont::Interpolate( aiQuaterniont& pOut, const aiQuat // Calculate coefficients TReal sclp, sclq; - + if ((static_cast(1.0) - cosom) > ai_epsilon) // 0.0001 -> some epsillon { // Standard case (slerp) diff --git a/include/assimp/scene.h b/include/assimp/scene.h index 9b173f939..1b830a5b0 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -450,7 +450,7 @@ struct aiScene }; #ifdef __cplusplus -} +} #endif //! extern "C" #endif // AI_SCENE_H_INC diff --git a/include/assimp/vector3.h b/include/assimp/vector3.h index a886def1d..5d0962b6a 100644 --- a/include/assimp/vector3.h +++ b/include/assimp/vector3.h @@ -70,17 +70,17 @@ class aiVector3t { public: /// @brief The default class constructor. aiVector3t() AI_NO_EXCEPT : x(), y(), z() {} - + /// @brief The class constructor with the components. /// @param _x The x-component for the vector. /// @param _y The y-component for the vector. /// @param _z The z-component for the vector. aiVector3t(TReal _x, TReal _y, TReal _z) : x(_x), y(_y), z(_z) {} - + /// @brief The class constructor with a default value. /// @param _xyz The value for x, y and z. explicit aiVector3t (TReal _xyz ) : x(_xyz), y(_xyz), z(_xyz) {} - + /// @brief The copy constructor. /// @param o The instance to copy from. aiVector3t( const aiVector3t& o ) = default; @@ -113,7 +113,7 @@ public: bool operator!= (const aiVector3t& other) const; bool operator < (const aiVector3t& other) const; - /// @brief + /// @brief bool Equal(const aiVector3t &other, TReal epsilon = ai_epsilon) const; template diff --git a/port/AndroidJNI/AndroidJNIIOSystem.cpp b/port/AndroidJNI/AndroidJNIIOSystem.cpp index e0f812362..4625d3f30 100644 --- a/port/AndroidJNI/AndroidJNIIOSystem.cpp +++ b/port/AndroidJNI/AndroidJNIIOSystem.cpp @@ -84,7 +84,7 @@ AndroidJNIIOSystem::~AndroidJNIIOSystem() { bool AndroidJNIIOSystem::Exists( const char* pFile) const { AAsset* asset = AAssetManager_open(mApkAssetManager, pFile, AASSET_MODE_UNKNOWN); FILE* file = ::fopen( (mApkWorkspacePath + getOsSeparator() + std::string(pFile)).c_str(), "rb"); - + if (!asset && !file) { __android_log_print(ANDROID_LOG_ERROR, "Assimp", "Asset manager can not find: %s", pFile); return false; @@ -94,7 +94,7 @@ bool AndroidJNIIOSystem::Exists( const char* pFile) const { if (file) { ::fclose( file); } - + return true; } @@ -140,7 +140,7 @@ bool AndroidJNIIOSystem::AndroidExtractAsset(std::string name) { __android_log_print(ANDROID_LOG_DEFAULT, "Assimp", "Asset already extracted"); return true; } - + // Open file AAsset* asset = AAssetManager_open(mApkAssetManager, name.c_str(), AASSET_MODE_UNKNOWN); @@ -182,7 +182,7 @@ bool AndroidJNIIOSystem::AndroidExtractAsset(std::string name) { __android_log_print(ANDROID_LOG_ERROR, "assimp", "Asset not found: %s", name.c_str()); return false; } - + return true; } diff --git a/port/jassimp/jassimp-native/src/jassimp.cpp b/port/jassimp/jassimp-native/src/jassimp.cpp index 6661ce9c4..979357b52 100644 --- a/port/jassimp/jassimp-native/src/jassimp.cpp +++ b/port/jassimp/jassimp-native/src/jassimp.cpp @@ -558,13 +558,13 @@ class JavaIOSystem : public Assimp::IOSystem { lprintf("NULL object from AiIOSystem.open\n"); return NULL; } - + size_t size = calli(mJniEnv, jStream, "jassimp/AiIOStream", "getFileSize", "()I"); lprintf("Model file size is %d\n", size); - + char* buffer = (char*)malloc(size); jobject javaBuffer = mJniEnv->NewDirectByteBuffer(buffer, size); - + jvalue readParams[1]; readParams[0].l = javaBuffer; if(call(mJniEnv, jStream, "jassimp/AiIOStream", "read", "(Ljava/nio/ByteBuffer;)Z", readParams)) diff --git a/test/unit/AssimpAPITest_aiQuaternion.cpp b/test/unit/AssimpAPITest_aiQuaternion.cpp index 7e93033cf..68daeefec 100644 --- a/test/unit/AssimpAPITest_aiQuaternion.cpp +++ b/test/unit/AssimpAPITest_aiQuaternion.cpp @@ -120,7 +120,7 @@ TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionMultiplyTest) { result_c = result_cpp = random_quat(); result_cpp = result_cpp * temp; aiQuaternionMultiply(&result_c, &temp); - + EXPECT_FLOAT_EQ(result_cpp.x, result_c.x); EXPECT_FLOAT_EQ(result_cpp.y, result_c.y); EXPECT_FLOAT_EQ(result_cpp.z, result_c.z); diff --git a/test/unit/Common/uiScene.cpp b/test/unit/Common/uiScene.cpp index 87001cef4..509bf71b1 100644 --- a/test/unit/Common/uiScene.cpp +++ b/test/unit/Common/uiScene.cpp @@ -91,7 +91,7 @@ TEST_F(utScene, getShortFilenameTest) { TEST_F(utScene, deepCopyTest) { scene->mRootNode = new aiNode(); - + scene->mNumMeshes = 1; scene->mMeshes = new aiMesh *[scene->mNumMeshes] (); scene->mMeshes[0] = new aiMesh (); diff --git a/tools/assimp_cmd/Main.cpp b/tools/assimp_cmd/Main.cpp index c6349550f..06c44f029 100644 --- a/tools/assimp_cmd/Main.cpp +++ b/tools/assimp_cmd/Main.cpp @@ -303,7 +303,7 @@ const aiScene* ImportModel( const clock_t first = clock(); ConsoleProgressHandler *ph = new ConsoleProgressHandler; globalImporter->SetProgressHandler(ph); - + const aiScene* scene = globalImporter->ReadFile(path,imp.ppFlags); if (imp.showLog) { diff --git a/tools/assimp_view/MaterialManager.h b/tools/assimp_view/MaterialManager.h index 625cae27e..b708fb337 100644 --- a/tools/assimp_view/MaterialManager.h +++ b/tools/assimp_view/MaterialManager.h @@ -73,7 +73,7 @@ public: /// A shader is considered to be identical if it has the same input /// signature and takes the same number of texture channels. int CreateMaterial(AssetHelper::MeshHelper *pcMesh, const aiMesh *pcSource); - + /// @brief Setup the material for a given mesh. /// @param pcMesh Mesh to be rendered /// @param pcProj Projection matrix From 39cbef1e21c2910366e58d28f2d955030e04bac6 Mon Sep 17 00:00:00 2001 From: shimaowo <45767709+shimaowo@users.noreply.github.com> Date: Mon, 16 Jan 2023 11:39:13 -0800 Subject: [PATCH 038/232] Fix: fix incorrect math for calculating the horizontal FOV of a perspective camera in GLTF2 import #4435 --- code/AssetLib/glTF2/glTF2Importer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 7d3a4b9fe..0cf5472d6 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -853,7 +853,7 @@ void glTF2Importer::ImportCameras(glTF2::Asset &r) { if (cam.type == Camera::Perspective) { aicam->mAspect = cam.cameraProperties.perspective.aspectRatio; - aicam->mHorizontalFOV = cam.cameraProperties.perspective.yfov * ((aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); + aicam->mHorizontalFOV = 2.0f * std::atan(std::tan(cam.cameraProperties.perspective.yfov * 0.5f) * (aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); aicam->mClipPlaneFar = cam.cameraProperties.perspective.zfar; aicam->mClipPlaneNear = cam.cameraProperties.perspective.znear; } else { From 43a062a5d7f867b71e0aed2d2906855ecf473838 Mon Sep 17 00:00:00 2001 From: Krishty Date: Mon, 16 Jan 2023 20:45:00 +0100 Subject: [PATCH 039/232] Remove Stray Semicolon --- code/AssetLib/glTF2/glTF2Importer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 7d3a4b9fe..a6674ccb3 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -185,7 +185,6 @@ static void SetMaterialTextureProperty(std::vector &embeddedTexIdxs, Asset const ai_real rsin(sin(-transform.mRotation)); transform.mTranslation.x = (static_cast(0.5) * transform.mScaling.x) * (-rcos + rsin + 1) + prop.TextureTransformExt_t.offset[0]; transform.mTranslation.y = ((static_cast(0.5) * transform.mScaling.y) * (rsin + rcos - 1)) + 1 - transform.mScaling.y - prop.TextureTransformExt_t.offset[1]; - ; mat->AddProperty(&transform, 1, _AI_MATKEY_UVTRANSFORM_BASE, texType, texSlot); } From 36305cf987788b01c64dcd891584e11cf7c205c0 Mon Sep 17 00:00:00 2001 From: Krishty Date: Mon, 16 Jan 2023 21:47:11 +0100 Subject: [PATCH 040/232] Tidy Up Constructors and Destructors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit does not add or remove c’tors or d’tors, so it is *not* ABI-breaking. If a c’tor/d’tor does nothing else than the default behavior, this commit replaces it with “= default”. If an initializer list entry does nothing else than the default behavior, this commit removes it. First and foremost, remove default c’tor calls of base classes (always called by the compiler if no other base c’tor is explicitly called) and c’tor calls of members with complex types (e.g. “std::vector”). In a few instances, user-defined copy c’tors / move c’tors / assignment operators / move assignment operators were replaced with “= default”, too. I only did this if I had a clear understanding of what’s going on. --- code/AssetLib/3DS/3DSHelper.h | 125 ++----------------- code/AssetLib/3MF/3MFTypes.h | 4 +- code/AssetLib/3MF/D3MFExporter.cpp | 2 +- code/AssetLib/AMF/AMFImporter.cpp | 6 +- code/AssetLib/AMF/AMFImporter_Node.hpp | 10 +- code/AssetLib/Blender/BlenderDNA.h | 4 +- code/AssetLib/Blender/BlenderModifier.h | 4 +- code/AssetLib/Blender/BlenderScene.h | 25 ++-- code/AssetLib/Blender/BlenderTessellator.cpp | 4 +- code/AssetLib/C4D/C4DImporter.cpp | 9 +- code/AssetLib/Collada/ColladaLoader.cpp | 9 -- code/AssetLib/DXF/DXFHelper.h | 4 +- code/AssetLib/FBX/FBXExportNode.h | 4 - code/AssetLib/FBX/FBXImporter.cpp | 5 +- code/AssetLib/Irr/IRRMeshLoader.cpp | 6 +- code/AssetLib/Irr/IRRShared.h | 4 +- code/AssetLib/M3D/M3DImporter.h | 2 +- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 1 - code/AssetLib/Ply/PlyParser.h | 20 +-- code/AssetLib/Q3BSP/Q3BSPFileData.h | 14 +-- code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 2 +- code/AssetLib/SMD/SMDLoader.cpp | 1 - code/AssetLib/SMD/SMDLoader.h | 2 +- code/AssetLib/X/XFileHelper.h | 23 +--- code/AssetLib/X/XFileImporter.cpp | 4 +- code/AssetLib/X3D/X3DExporter.hpp | 12 +- code/AssetLib/X3D/X3DImporter_Node.hpp | 8 +- code/AssetLib/glTF/glTFAsset.h | 8 +- code/AssetLib/glTF/glTFImporter.cpp | 2 +- code/AssetLib/glTF2/glTF2Asset.h | 14 +-- code/AssetLib/glTF2/glTF2Importer.cpp | 3 - code/Common/FileSystemFilter.h | 4 +- include/assimp/IOStream.hpp | 4 +- include/assimp/IOStreamBuffer.h | 4 +- include/assimp/IOSystem.hpp | 5 +- include/assimp/LineSplitter.h | 5 +- include/assimp/MemoryIOWrapper.h | 3 +- include/assimp/Profiler.h | 4 +- include/assimp/ProgressHandler.hpp | 8 +- include/assimp/SceneCombiner.h | 8 +- 40 files changed, 63 insertions(+), 323 deletions(-) diff --git a/code/AssetLib/3DS/3DSHelper.h b/code/AssetLib/3DS/3DSHelper.h index dc1098035..06c36bfeb 100644 --- a/code/AssetLib/3DS/3DSHelper.h +++ b/code/AssetLib/3DS/3DSHelper.h @@ -322,7 +322,6 @@ struct Texture { //! Default constructor Texture() AI_NO_EXCEPT : mTextureBlend(0.0f), - mMapName(), mOffsetU(0.0), mOffsetV(0.0), mScaleU(1.0), @@ -334,51 +333,11 @@ struct Texture { mTextureBlend = get_qnan(); } - Texture(const Texture &other) : - mTextureBlend(other.mTextureBlend), - mMapName(other.mMapName), - mOffsetU(other.mOffsetU), - mOffsetV(other.mOffsetV), - mScaleU(other.mScaleU), - mScaleV(other.mScaleV), - mRotation(other.mRotation), - mMapMode(other.mMapMode), - bPrivate(other.bPrivate), - iUVSrc(other.iUVSrc) { - // empty - } + Texture(const Texture &other) = default; - Texture(Texture &&other) AI_NO_EXCEPT : mTextureBlend(other.mTextureBlend), - mMapName(std::move(other.mMapName)), - mOffsetU(other.mOffsetU), - mOffsetV(other.mOffsetV), - mScaleU(other.mScaleU), - mScaleV(other.mScaleV), - mRotation(other.mRotation), - mMapMode(other.mMapMode), - bPrivate(other.bPrivate), - iUVSrc(other.iUVSrc) { - // empty - } + Texture(Texture &&other) AI_NO_EXCEPT = default; - Texture &operator=(Texture &&other) AI_NO_EXCEPT { - if (this == &other) { - return *this; - } - - mTextureBlend = other.mTextureBlend; - mMapName = std::move(other.mMapName); - mOffsetU = other.mOffsetU; - mOffsetV = other.mOffsetV; - mScaleU = other.mScaleU; - mScaleV = other.mScaleV; - mRotation = other.mRotation; - mMapMode = other.mMapMode; - bPrivate = other.bPrivate; - iUVSrc = other.iUVSrc; - - return *this; - } + Texture &operator=(Texture &&other) AI_NO_EXCEPT = default; //! Specifies the blend factor for the texture ai_real mTextureBlend; @@ -436,83 +395,13 @@ struct Material { // empty } - Material(const Material &other) : - mName(other.mName), - mDiffuse(other.mDiffuse), - mSpecularExponent(other.mSpecularExponent), - mShininessStrength(other.mShininessStrength), - mSpecular(other.mSpecular), - mAmbient(other.mAmbient), - mShading(other.mShading), - mTransparency(other.mTransparency), - sTexDiffuse(other.sTexDiffuse), - sTexOpacity(other.sTexOpacity), - sTexSpecular(other.sTexSpecular), - sTexReflective(other.sTexReflective), - sTexBump(other.sTexBump), - sTexEmissive(other.sTexEmissive), - sTexShininess(other.sTexShininess), - mBumpHeight(other.mBumpHeight), - mEmissive(other.mEmissive), - sTexAmbient(other.sTexAmbient), - mTwoSided(other.mTwoSided) { - // empty - } + Material(const Material &other) = default; - //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it - Material(Material &&other) AI_NO_EXCEPT : mName(std::move(other.mName)), - mDiffuse(other.mDiffuse), - mSpecularExponent(other.mSpecularExponent), - mShininessStrength(other.mShininessStrength), - mSpecular(other.mSpecular), - mAmbient(other.mAmbient), - mShading(other.mShading), - mTransparency(other.mTransparency), - sTexDiffuse(std::move(other.sTexDiffuse)), - sTexOpacity(std::move(other.sTexOpacity)), - sTexSpecular(std::move(other.sTexSpecular)), - sTexReflective(std::move(other.sTexReflective)), - sTexBump(std::move(other.sTexBump)), - sTexEmissive(std::move(other.sTexEmissive)), - sTexShininess(std::move(other.sTexShininess)), - mBumpHeight(other.mBumpHeight), - mEmissive(other.mEmissive), - sTexAmbient(std::move(other.sTexAmbient)), - mTwoSided(other.mTwoSided) { - // empty - } + Material(Material &&other) AI_NO_EXCEPT = default; - Material &operator=(Material &&other) AI_NO_EXCEPT { - if (this == &other) { - return *this; - } + Material &operator=(Material &&other) AI_NO_EXCEPT = default; - mName = std::move(other.mName); - mDiffuse = other.mDiffuse; - mSpecularExponent = other.mSpecularExponent; - mShininessStrength = other.mShininessStrength, - mSpecular = other.mSpecular; - mAmbient = other.mAmbient; - mShading = other.mShading; - mTransparency = other.mTransparency; - sTexDiffuse = std::move(other.sTexDiffuse); - sTexOpacity = std::move(other.sTexOpacity); - sTexSpecular = std::move(other.sTexSpecular); - sTexReflective = std::move(other.sTexReflective); - sTexBump = std::move(other.sTexBump); - sTexEmissive = std::move(other.sTexEmissive); - sTexShininess = std::move(other.sTexShininess); - mBumpHeight = other.mBumpHeight; - mEmissive = other.mEmissive; - sTexAmbient = std::move(other.sTexAmbient); - mTwoSided = other.mTwoSided; - - return *this; - } - - virtual ~Material() { - // empty - } + virtual ~Material() = default; //! Name of the material std::string mName; diff --git a/code/AssetLib/3MF/3MFTypes.h b/code/AssetLib/3MF/3MFTypes.h index 987cdf613..02238ceab 100644 --- a/code/AssetLib/3MF/3MFTypes.h +++ b/code/AssetLib/3MF/3MFTypes.h @@ -69,9 +69,7 @@ public: // empty } - virtual ~Resource() { - // empty - } + virtual ~Resource() = default; virtual ResourceType getType() const { return ResourceType::RT_Unknown; diff --git a/code/AssetLib/3MF/D3MFExporter.cpp b/code/AssetLib/3MF/D3MFExporter.cpp index 42cd991e6..4ba3bbf24 100644 --- a/code/AssetLib/3MF/D3MFExporter.cpp +++ b/code/AssetLib/3MF/D3MFExporter.cpp @@ -83,7 +83,7 @@ void ExportScene3MF(const char *pFile, IOSystem *pIOSystem, const aiScene *pScen namespace D3MF { D3MFExporter::D3MFExporter(const char *pFile, const aiScene *pScene) : - mArchiveName(pFile), m_zipArchive(nullptr), mScene(pScene), mModelOutput(), mRelOutput(), mContentOutput(), mBuildItems(), mRelations() { + mArchiveName(pFile), m_zipArchive(nullptr), mScene(pScene) { // empty } diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp index b95fdf540..ff581b492 100644 --- a/code/AssetLib/AMF/AMFImporter.cpp +++ b/code/AssetLib/AMF/AMFImporter.cpp @@ -83,11 +83,7 @@ void AMFImporter::Clear() { AMFImporter::AMFImporter() AI_NO_EXCEPT : mNodeElement_Cur(nullptr), - mXmlParser(nullptr), - mUnit(), - mVersion(), - mMaterial_Converted(), - mTexture_Converted() { + mXmlParser(nullptr) { // empty } diff --git a/code/AssetLib/AMF/AMFImporter_Node.hpp b/code/AssetLib/AMF/AMFImporter_Node.hpp index c827533a6..dd27316d3 100644 --- a/code/AssetLib/AMF/AMFImporter_Node.hpp +++ b/code/AssetLib/AMF/AMFImporter_Node.hpp @@ -88,9 +88,7 @@ public: std::list Child; ///< Child elements. public: /// Destructor, virtual.. - virtual ~AMFNodeElementBase() { - // empty - } + virtual ~AMFNodeElementBase() = default; /// Disabled copy constructor and co. AMFNodeElementBase(const AMFNodeElementBase &pNodeElement) = delete; @@ -103,7 +101,7 @@ protected: /// \param [in] pType - element type. /// \param [in] pParent - parent element. AMFNodeElementBase(const EType pType, AMFNodeElementBase *pParent) : - Type(pType), ID(), Parent(pParent), Child() { + Type(pType), Parent(pParent) { // empty } }; // class IAMFImporter_NodeElement @@ -174,7 +172,7 @@ struct AMFColor : public AMFNodeElementBase { /// @brief Constructor. /// @param [in] pParent - pointer to parent node. AMFColor(AMFNodeElementBase *pParent) : - AMFNodeElementBase(ENET_Color, pParent), Composed(false), Color(), Profile() { + AMFNodeElementBase(ENET_Color, pParent), Composed(false), Color() { // empty } }; @@ -270,7 +268,7 @@ struct AMFTexMap : public AMFNodeElementBase { /// Constructor. /// \param [in] pParent - pointer to parent node. AMFTexMap(AMFNodeElementBase *pParent) : - AMFNodeElementBase(ENET_TexMap, pParent), TextureCoordinate{}, TextureID_R(), TextureID_G(), TextureID_B(), TextureID_A() { + AMFNodeElementBase(ENET_TexMap, pParent), TextureCoordinate{} { // empty } }; diff --git a/code/AssetLib/Blender/BlenderDNA.h b/code/AssetLib/Blender/BlenderDNA.h index dcae3198b..494dc4b34 100644 --- a/code/AssetLib/Blender/BlenderDNA.h +++ b/code/AssetLib/Blender/BlenderDNA.h @@ -106,9 +106,7 @@ struct ElemBase { // empty } - virtual ~ElemBase() { - // empty - } + virtual ~ElemBase() = default; /** Type name of the element. The type * string points is the `c_str` of the `name` attribute of the diff --git a/code/AssetLib/Blender/BlenderModifier.h b/code/AssetLib/Blender/BlenderModifier.h index 5af560caf..180a456a1 100644 --- a/code/AssetLib/Blender/BlenderModifier.h +++ b/code/AssetLib/Blender/BlenderModifier.h @@ -62,9 +62,7 @@ public: /** * The class destructor, virtual. */ - virtual ~BlenderModifier() { - // empty - } + virtual ~BlenderModifier() = default; // -------------------- /** diff --git a/code/AssetLib/Blender/BlenderScene.h b/code/AssetLib/Blender/BlenderScene.h index 436e47061..ba7ded909 100644 --- a/code/AssetLib/Blender/BlenderScene.h +++ b/code/AssetLib/Blender/BlenderScene.h @@ -182,7 +182,7 @@ struct MVert : ElemBase { int bweight; MVert() : - ElemBase(), flag(0), mat_nr(0), bweight(0) {} + flag(0), mat_nr(0), bweight(0) {} }; // ------------------------------------------------------------------------------- @@ -417,7 +417,6 @@ struct CustomDataLayer : ElemBase { std::shared_ptr data; // must be converted to real type according type member CustomDataLayer() : - ElemBase(), type(0), offset(0), flag(0), @@ -729,7 +728,7 @@ struct Object : ElemBase { ListBase modifiers; Object() : - ElemBase(), type(Type_EMPTY), parent(nullptr), track(), proxy(), proxy_from(), data() { + type(Type_EMPTY), parent(nullptr) { // empty } }; @@ -741,8 +740,7 @@ struct Base : ElemBase { std::shared_ptr object WARN; Base() : - ElemBase(), prev(nullptr), next(), object() { - // empty + prev(nullptr) { // empty } }; @@ -758,10 +756,7 @@ struct Scene : ElemBase { ListBase base; - Scene() : - ElemBase(), camera(), world(), basact(), master_collection() { - // empty - } + Scene() = default; }; // ------------------------------------------------------------------------------- @@ -791,10 +786,7 @@ struct Image : ElemBase { short gen_x, gen_y, gen_type; - Image() : - ElemBase() { - // empty - } + Image() = default; }; // ------------------------------------------------------------------------------- @@ -884,7 +876,7 @@ struct Tex : ElemBase { //char use_nodes; Tex() : - ElemBase(), imaflag(ImageFlags_INTERPOL), type(Type_CLOUDS), ima() { + imaflag(ImageFlags_INTERPOL), type(Type_CLOUDS) { // empty } }; @@ -976,10 +968,7 @@ struct MTex : ElemBase { //float shadowfac; //float zenupfac, zendownfac, blendfac; - MTex() : - ElemBase() { - // empty - } + MTex() = default; }; } // namespace Blender diff --git a/code/AssetLib/Blender/BlenderTessellator.cpp b/code/AssetLib/Blender/BlenderTessellator.cpp index d3ef5ae5e..40117a974 100644 --- a/code/AssetLib/Blender/BlenderTessellator.cpp +++ b/code/AssetLib/Blender/BlenderTessellator.cpp @@ -81,9 +81,7 @@ BlenderTessellatorGL::BlenderTessellatorGL( BlenderBMeshConverter& converter ): } // ------------------------------------------------------------------------------------------------ -BlenderTessellatorGL::~BlenderTessellatorGL( ) -{ -} +BlenderTessellatorGL::~BlenderTessellatorGL() = default; // ------------------------------------------------------------------------------------------------ void BlenderTessellatorGL::Tessellate( const MLoop* polyLoop, int vertexCount, const std::vector< MVert >& vertices ) diff --git a/code/AssetLib/C4D/C4DImporter.cpp b/code/AssetLib/C4D/C4DImporter.cpp index 06d7a3412..9a3a72667 100644 --- a/code/AssetLib/C4D/C4DImporter.cpp +++ b/code/AssetLib/C4D/C4DImporter.cpp @@ -106,15 +106,10 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ -C4DImporter::C4DImporter() -: BaseImporter() { - // empty -} +C4DImporter::C4DImporter() = default; // ------------------------------------------------------------------------------------------------ -C4DImporter::~C4DImporter() { - // empty -} +C4DImporter::~C4DImporter() = default; // ------------------------------------------------------------------------------------------------ bool C4DImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const { diff --git a/code/AssetLib/Collada/ColladaLoader.cpp b/code/AssetLib/Collada/ColladaLoader.cpp index 2d578aff3..1280fd0d1 100644 --- a/code/AssetLib/Collada/ColladaLoader.cpp +++ b/code/AssetLib/Collada/ColladaLoader.cpp @@ -92,15 +92,6 @@ inline void AddNodeMetaData(aiNode *node, const std::string &key, const T &value // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer ColladaLoader::ColladaLoader() : - mFileName(), - mMeshIndexByID(), - mMaterialIndexByName(), - mMeshes(), - newMats(), - mCameras(), - mLights(), - mTextures(), - mAnims(), noSkeletonMesh(false), removeEmptyBones(false), ignoreUpDirection(false), diff --git a/code/AssetLib/DXF/DXFHelper.h b/code/AssetLib/DXF/DXFHelper.h index e50c471d2..4d7893cc4 100644 --- a/code/AssetLib/DXF/DXFHelper.h +++ b/code/AssetLib/DXF/DXFHelper.h @@ -65,7 +65,6 @@ public: LineReader(StreamReaderLE& reader) : splitter(reader,false,true) , groupcode( 0 ) - , value() , end() { // empty } @@ -186,8 +185,7 @@ struct InsertBlock { InsertBlock() : pos() , scale(1.f,1.f,1.f) - , angle() - , name() { + , angle() { // empty } diff --git a/code/AssetLib/FBX/FBXExportNode.h b/code/AssetLib/FBX/FBXExportNode.h index 62c06e16b..99644b216 100644 --- a/code/AssetLib/FBX/FBXExportNode.h +++ b/code/AssetLib/FBX/FBXExportNode.h @@ -77,8 +77,6 @@ public: // constructors /// The class constructor with the name. Node(const std::string& n) : name(n) - , properties() - , children() , force_has_children( false ) { // empty } @@ -87,8 +85,6 @@ public: // constructors template Node(const std::string& n, More&&... more) : name(n) - , properties() - , children() , force_has_children(false) { AddProperties(std::forward(more)...); } diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 7ff194905..6a727c3d7 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -90,10 +90,7 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by #Importer -FBXImporter::FBXImporter() : - mSettings() { - // empty -} +FBXImporter::FBXImporter() = default; // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. diff --git a/code/AssetLib/Irr/IRRMeshLoader.cpp b/code/AssetLib/Irr/IRRMeshLoader.cpp index 9b4faec83..52fb82ff9 100644 --- a/code/AssetLib/Irr/IRRMeshLoader.cpp +++ b/code/AssetLib/Irr/IRRMeshLoader.cpp @@ -71,11 +71,7 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -IRRMeshImporter::IRRMeshImporter() : - BaseImporter(), - IrrlichtBase() { - // empty -} +IRRMeshImporter::IRRMeshImporter() = default; // ------------------------------------------------------------------------------------------------ // Destructor, private as well diff --git a/code/AssetLib/Irr/IRRShared.h b/code/AssetLib/Irr/IRRShared.h index 90e212d65..ee1309e14 100644 --- a/code/AssetLib/Irr/IRRShared.h +++ b/code/AssetLib/Irr/IRRShared.h @@ -63,9 +63,7 @@ protected: // empty } - ~IrrlichtBase() { - // empty - } + ~IrrlichtBase() = default; /** @brief Data structure for a simple name-value property */ diff --git a/code/AssetLib/M3D/M3DImporter.h b/code/AssetLib/M3D/M3DImporter.h index 5d3fcaa7b..9ca8f9211 100644 --- a/code/AssetLib/M3D/M3DImporter.h +++ b/code/AssetLib/M3D/M3DImporter.h @@ -65,7 +65,7 @@ class M3DImporter : public BaseImporter { public: /// \brief Default constructor M3DImporter(); - ~M3DImporter() override {} + ~M3DImporter() override = default; /// \brief Returns whether the class can handle the format of the given file. /// \remark See BaseImporter::CanRead() for details. diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index 2883f9612..1bd981656 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -261,7 +261,6 @@ OpenGEXImporter::RefInfo::RefInfo(aiNode *node, Type type, std::vector alProperties; @@ -386,10 +381,7 @@ class ElementInstanceList public: //! Default constructor - ElementInstanceList() AI_NO_EXCEPT - : alInstances() { - // empty - } + ElementInstanceList() AI_NO_EXCEPT = default; //! List of all element instances std::vector< ElementInstance > alInstances; @@ -413,11 +405,7 @@ class DOM public: //! Default constructor - DOM() AI_NO_EXCEPT - : alElements() - , alElementData() { - - } + DOM() AI_NO_EXCEPT = default; //! Contains all elements of the file format diff --git a/code/AssetLib/Q3BSP/Q3BSPFileData.h b/code/AssetLib/Q3BSP/Q3BSPFileData.h index 8ccee0b0a..086cf7842 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileData.h +++ b/code/AssetLib/Q3BSP/Q3BSPFileData.h @@ -169,19 +169,7 @@ struct Q3BSPModel { std::vector m_EntityData; std::string m_ModelName; - Q3BSPModel() : - m_Data(), - m_Lumps(), - m_Vertices(), - m_Faces(), - m_Indices(), - m_Textures(), - m_Lightmaps(), - m_EntityData(), - m_ModelName() - { - // empty - } + Q3BSPModel() = default; ~Q3BSPModel() { for ( unsigned int i=0; i mMeshes; Node() AI_NO_EXCEPT - : mName(), - mTrafoMatrix(), - mParent(nullptr), - mChildren(), - mMeshes() { + : mTrafoMatrix(), + mParent(nullptr) { // empty } explicit Node(Node *pParent) : - mName(), mTrafoMatrix(), mParent(pParent), mChildren(), mMeshes() { + mTrafoMatrix(), mParent(pParent) { // empty } @@ -211,8 +198,6 @@ struct Scene { Scene() AI_NO_EXCEPT : mRootNode(nullptr), - mGlobalMeshes(), - mGlobalMaterials(), mAnimTicksPerSecond(0) { // empty } diff --git a/code/AssetLib/X/XFileImporter.cpp b/code/AssetLib/X/XFileImporter.cpp index 8bd5d9e88..32865e8a8 100644 --- a/code/AssetLib/X/XFileImporter.cpp +++ b/code/AssetLib/X/XFileImporter.cpp @@ -75,9 +75,7 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -XFileImporter::XFileImporter() : mBuffer() { - // empty -} +XFileImporter::XFileImporter() = default; // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. diff --git a/code/AssetLib/X3D/X3DExporter.hpp b/code/AssetLib/X3D/X3DExporter.hpp index 7a87821b4..e77aa6877 100644 --- a/code/AssetLib/X3D/X3DExporter.hpp +++ b/code/AssetLib/X3D/X3DExporter.hpp @@ -52,22 +52,14 @@ class X3DExporter { struct SAttribute { const std::string Name; const std::string Value; - SAttribute() : - Name(), - Value() { - // empty - } + SAttribute() = default; SAttribute(const std::string &name, const std::string &value) : Name(name), Value(value) { // empty } - SAttribute(SAttribute &&rhs) AI_NO_EXCEPT : - Name(rhs.Name), - Value(rhs.Value) { - // empty - } + SAttribute(SAttribute &&rhs) AI_NO_EXCEPT = default; }; /***********************************************/ diff --git a/code/AssetLib/X3D/X3DImporter_Node.hpp b/code/AssetLib/X3D/X3DImporter_Node.hpp index 8d33c4b7a..62bf857e4 100644 --- a/code/AssetLib/X3D/X3DImporter_Node.hpp +++ b/code/AssetLib/X3D/X3DImporter_Node.hpp @@ -108,9 +108,7 @@ struct X3DNodeElementBase { std::list Children; X3DElemType Type; - virtual ~X3DNodeElementBase() { - // empty - } + virtual ~X3DNodeElementBase() = default; protected: X3DNodeElementBase(X3DElemType type, X3DNodeElementBase *pParent) : @@ -367,9 +365,7 @@ struct X3DNodeElementMeta : X3DNodeElementBase { std::string Name; ///< Name of metadata object. std::string Reference; - virtual ~X3DNodeElementMeta() { - // empty - } + virtual ~X3DNodeElementMeta() = default; protected: X3DNodeElementMeta(X3DElemType type, X3DNodeElementBase *parent) : diff --git a/code/AssetLib/glTF/glTFAsset.h b/code/AssetLib/glTF/glTFAsset.h index 26ef239cd..955dea40f 100644 --- a/code/AssetLib/glTF/glTFAsset.h +++ b/code/AssetLib/glTF/glTFAsset.h @@ -629,9 +629,7 @@ struct Mesh : public Object { SExtension(const EType pType) : Type(pType) {} - virtual ~SExtension() { - // empty - } + virtual ~SExtension() = default; }; #ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC @@ -657,9 +655,7 @@ struct Mesh : public Object { // empty } - virtual ~SCompression_Open3DGC() { - // empty - } + virtual ~SCompression_Open3DGC() = default; }; #endif diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index 3a5b0ef3c..61c11f594 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -80,7 +80,7 @@ static const aiImporterDesc desc = { }; glTFImporter::glTFImporter() : - BaseImporter(), meshOffsets(), embeddedTexIdxs(), mScene(nullptr) { + mScene(nullptr) { // empty } diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 85af49acf..e8d1d88d1 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -365,16 +365,7 @@ struct CustomExtension { ~CustomExtension() = default; - CustomExtension(const CustomExtension &other) : - name(other.name), - mStringValue(other.mStringValue), - mDoubleValue(other.mDoubleValue), - mUint64Value(other.mUint64Value), - mInt64Value(other.mInt64Value), - mBoolValue(other.mBoolValue), - mValues(other.mValues) { - // empty - } + CustomExtension(const CustomExtension &other) = default; CustomExtension& operator=(const CustomExtension&) = default; }; @@ -1086,8 +1077,7 @@ struct AssetMetadata { void Read(Document &doc); - AssetMetadata() : - version() {} + AssetMetadata() = default; }; // diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 7d3a4b9fe..d6b65b458 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -96,9 +96,6 @@ static const aiImporterDesc desc = { }; glTF2Importer::glTF2Importer() : - BaseImporter(), - meshOffsets(), - mEmbeddedTexIdxs(), mScene(nullptr) { // empty } diff --git a/code/Common/FileSystemFilter.h b/code/Common/FileSystemFilter.h index 9ab3812e2..d28233ae9 100644 --- a/code/Common/FileSystemFilter.h +++ b/code/Common/FileSystemFilter.h @@ -93,9 +93,7 @@ public: } /** Destructor. */ - ~FileSystemFilter() { - // empty - } + ~FileSystemFilter() = default; // ------------------------------------------------------------------- /** Tests for the existence of a file at the given path. */ diff --git a/include/assimp/IOStream.hpp b/include/assimp/IOStream.hpp index 3b9b3c3f8..12beb0dbb 100644 --- a/include/assimp/IOStream.hpp +++ b/include/assimp/IOStream.hpp @@ -128,9 +128,7 @@ public: // ---------------------------------------------------------------------------------- AI_FORCE_INLINE -IOStream::IOStream() AI_NO_EXCEPT { - // empty -} +IOStream::IOStream() AI_NO_EXCEPT = default; // ---------------------------------------------------------------------------------- AI_FORCE_INLINE diff --git a/include/assimp/IOStreamBuffer.h b/include/assimp/IOStreamBuffer.h index 09ca1c962..b34fc9ee1 100644 --- a/include/assimp/IOStreamBuffer.h +++ b/include/assimp/IOStreamBuffer.h @@ -141,9 +141,7 @@ AI_FORCE_INLINE IOStreamBuffer::IOStreamBuffer(size_t cache) : } template -AI_FORCE_INLINE IOStreamBuffer::~IOStreamBuffer() { - // empty -} +AI_FORCE_INLINE IOStreamBuffer::~IOStreamBuffer() = default; template AI_FORCE_INLINE bool IOStreamBuffer::open(IOStream *stream) { diff --git a/include/assimp/IOSystem.hpp b/include/assimp/IOSystem.hpp index b4531f96a..30f48b81c 100644 --- a/include/assimp/IOSystem.hpp +++ b/include/assimp/IOSystem.hpp @@ -237,10 +237,7 @@ private: }; // ---------------------------------------------------------------------------- -AI_FORCE_INLINE IOSystem::IOSystem() AI_NO_EXCEPT : - m_pathStack() { - // empty -} +AI_FORCE_INLINE IOSystem::IOSystem() AI_NO_EXCEPT = default; // ---------------------------------------------------------------------------- AI_FORCE_INLINE IOSystem::~IOSystem() = default; diff --git a/include/assimp/LineSplitter.h b/include/assimp/LineSplitter.h index a8aa665db..379821f03 100644 --- a/include/assimp/LineSplitter.h +++ b/include/assimp/LineSplitter.h @@ -145,7 +145,6 @@ private: AI_FORCE_INLINE LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_empty_lines, bool trim ) : mIdx(0), - mCur(), mStream(stream), mSwallow(), mSkip_empty_lines(skip_empty_lines), @@ -155,9 +154,7 @@ AI_FORCE_INLINE LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_emp mIdx = 0; } -AI_FORCE_INLINE LineSplitter::~LineSplitter() { - // empty -} +AI_FORCE_INLINE LineSplitter::~LineSplitter() = default; AI_FORCE_INLINE LineSplitter& LineSplitter::operator++() { if (mSwallow) { diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index b4c37763d..0bd3bc108 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -162,8 +162,7 @@ public: } /** Destructor. */ - ~MemoryIOSystem() { - } + ~MemoryIOSystem() = default; // ------------------------------------------------------------------- /** Tests for the existence of a file at the given path. */ diff --git a/include/assimp/Profiler.h b/include/assimp/Profiler.h index fe0ffbb10..3b9263b40 100644 --- a/include/assimp/Profiler.h +++ b/include/assimp/Profiler.h @@ -68,9 +68,7 @@ using namespace Formatter; */ class Profiler { public: - Profiler() { - // empty - } + Profiler() = default; /** Start a named timer */ diff --git a/include/assimp/ProgressHandler.hpp b/include/assimp/ProgressHandler.hpp index 1a272bb87..93d881659 100644 --- a/include/assimp/ProgressHandler.hpp +++ b/include/assimp/ProgressHandler.hpp @@ -67,15 +67,11 @@ class ASSIMP_API ProgressHandler { protected: /// @brief Default constructor - ProgressHandler () AI_NO_EXCEPT { - // empty - } + ProgressHandler () AI_NO_EXCEPT = default; public: /// @brief Virtual destructor. - virtual ~ProgressHandler () { - // empty - } + virtual ~ProgressHandler () = default; // ------------------------------------------------------------------- /** @brief Progress callback. diff --git a/include/assimp/SceneCombiner.h b/include/assimp/SceneCombiner.h index 6da38cd15..d6096900c 100644 --- a/include/assimp/SceneCombiner.h +++ b/include/assimp/SceneCombiner.h @@ -191,13 +191,9 @@ struct SceneHelper { */ class ASSIMP_API SceneCombiner { // class cannot be instanced - SceneCombiner() { - // empty - } + SceneCombiner() = delete; - ~SceneCombiner() { - // empty - } + ~SceneCombiner() = delete; public: // ------------------------------------------------------------------- From b298b79a46bb30545dcd82979a5320a9b9b55e27 Mon Sep 17 00:00:00 2001 From: shimaowo <45767709+shimaowo@users.noreply.github.com> Date: Tue, 17 Jan 2023 10:53:41 -0800 Subject: [PATCH 041/232] add missing parens --- code/AssetLib/glTF2/glTF2Importer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 0cf5472d6..94b7ad665 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -853,7 +853,7 @@ void glTF2Importer::ImportCameras(glTF2::Asset &r) { if (cam.type == Camera::Perspective) { aicam->mAspect = cam.cameraProperties.perspective.aspectRatio; - aicam->mHorizontalFOV = 2.0f * std::atan(std::tan(cam.cameraProperties.perspective.yfov * 0.5f) * (aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); + aicam->mHorizontalFOV = 2.0f * std::atan(std::tan(cam.cameraProperties.perspective.yfov * 0.5f) * ((aicam->mAspect == 0.f) ? 1.f : aicam->mAspect)); aicam->mClipPlaneFar = cam.cameraProperties.perspective.zfar; aicam->mClipPlaneNear = cam.cameraProperties.perspective.znear; } else { From 72f360710a846c45d253ca05090edea8d27095d1 Mon Sep 17 00:00:00 2001 From: Krishty Date: Wed, 18 Jan 2023 00:08:38 +0100 Subject: [PATCH 042/232] =?UTF-8?q?Fix=20MSVC=20Warnings=20With=20?= =?UTF-8?q?=E2=80=9Cemplace=5Fback()=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Several places in the code call `std::vector.emplace_back(0, 0, 0)`. The constructor of `aiVector3D` actually expects arguments of the type `ai_real`, (alias of `float` if compiling without `ASSIMP_DOUBLE_PRECISION`) but the literal `0` is of type `int`. `emplace_back()` does support promotion, but `int` to `float` is a potentially lossy conversion. tl;dr: On warning level 4, MSVC spits out a very deeply nested `warning C4244: 'argument': conversion from '_Ty' to 'TReal', possible loss of data with _Ty=int and TReal=ai_real`. --- code/AssetLib/MMD/MMDImporter.cpp | 2 +- code/AssetLib/X3D/X3DGeoHelper.cpp | 8 ++++---- code/AssetLib/X3D/X3DImporter_Geometry2D.cpp | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/AssetLib/MMD/MMDImporter.cpp b/code/AssetLib/MMD/MMDImporter.cpp index 97b04f4eb..0905ce1e0 100644 --- a/code/AssetLib/MMD/MMDImporter.cpp +++ b/code/AssetLib/MMD/MMDImporter.cpp @@ -269,7 +269,7 @@ aiMesh *MMDImporter::CreateMesh(const pmx::PmxModel *pModel, dynamic_cast(v->skinning.get()); switch (v->skinning_type) { case pmx::PmxVertexSkinningType::BDEF1: - bone_vertex_map[vsBDEF1_ptr->bone_index].emplace_back(index, 1.0); + bone_vertex_map[vsBDEF1_ptr->bone_index].emplace_back(index, static_cast(1)); break; case pmx::PmxVertexSkinningType::BDEF2: bone_vertex_map[vsBDEF2_ptr->bone_index1].emplace_back(index, vsBDEF2_ptr->bone_weight); diff --git a/code/AssetLib/X3D/X3DGeoHelper.cpp b/code/AssetLib/X3D/X3DGeoHelper.cpp index e89aeb428..0a62ff9b0 100644 --- a/code/AssetLib/X3D/X3DGeoHelper.cpp +++ b/code/AssetLib/X3D/X3DGeoHelper.cpp @@ -193,7 +193,7 @@ void X3DGeoHelper::add_color(aiMesh &pMesh, const std::list &pColors, // create RGBA array from RGB. for (std::list::const_iterator it = pColors.begin(); it != pColors.end(); ++it) - tcol.emplace_back((*it).r, (*it).g, (*it).b, 1); + tcol.emplace_back((*it).r, (*it).g, (*it).b, static_cast(1)); // call existing function for adding RGBA colors add_color(pMesh, tcol, pColorPerVertex); @@ -238,7 +238,7 @@ void X3DGeoHelper::add_color(aiMesh &pMesh, const std::vector &pCoordId // create RGBA array from RGB. for (std::list::const_iterator it = pColors.begin(); it != pColors.end(); ++it) { - tcol.emplace_back((*it).r, (*it).g, (*it).b, 1); + tcol.emplace_back((*it).r, (*it).g, (*it).b, static_cast(1)); } // call existing function for adding RGBA colors @@ -440,7 +440,7 @@ void X3DGeoHelper::add_tex_coord(aiMesh &pMesh, const std::vector &pCoo // copy list to array because we are need indexed access to normals. texcoord_arr_copy.reserve(pTexCoords.size()); for (std::list::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); ++it) { - texcoord_arr_copy.emplace_back((*it).x, (*it).y, 0); + texcoord_arr_copy.emplace_back((*it).x, (*it).y, static_cast(0)); } if (pTexCoordIdx.size() > 0) { @@ -480,7 +480,7 @@ void X3DGeoHelper::add_tex_coord(aiMesh &pMesh, const std::list &pTe // copy list to array because we are need convert aiVector2D to aiVector3D and also get indexed access as a bonus. tc_arr_copy.reserve(pTexCoords.size()); for (std::list::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); ++it) { - tc_arr_copy.emplace_back((*it).x, (*it).y, 0); + tc_arr_copy.emplace_back((*it).x, (*it).y, static_cast(0)); } // copy texture coordinates to mesh diff --git a/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp b/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp index 653203b4e..8e33decee 100644 --- a/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp +++ b/code/AssetLib/X3D/X3DImporter_Geometry2D.cpp @@ -151,7 +151,7 @@ void X3DImporter::readArcClose2D(XmlNode &node) { std::list &vlist = ((X3DNodeElementGeometry2D *)ne)->Vertices; // just short alias. if ((closureType == "PIE") || (closureType == "\"PIE\"")) - vlist.emplace_back(0, 0, 0); // center point - first radial line + vlist.emplace_back(static_cast(0), static_cast(0), static_cast(0)); // center point - first radial line else if ((closureType != "CHORD") && (closureType != "\"CHORD\"")) Throw_IncorrectAttrValue("ArcClose2D", "closureType"); @@ -323,7 +323,7 @@ void X3DImporter::readPolyline2D(XmlNode &node) { // convert vec2 to vec3 for (std::list::iterator it2 = lineSegments.begin(); it2 != lineSegments.end(); ++it2) - tlist.emplace_back(it2->x, it2->y, 0); + tlist.emplace_back(it2->x, it2->y, static_cast(0)); // convert point set to line set X3DGeoHelper::extend_point_to_line(tlist, ((X3DNodeElementGeometry2D *)ne)->Vertices); @@ -361,7 +361,7 @@ void X3DImporter::readPolypoint2D(XmlNode &node) { // convert vec2 to vec3 for (std::list::iterator it2 = point.begin(); it2 != point.end(); ++it2) { - ((X3DNodeElementGeometry2D *)ne)->Vertices.emplace_back(it2->x, it2->y, 0); + ((X3DNodeElementGeometry2D *)ne)->Vertices.emplace_back(it2->x, it2->y, static_cast(0)); } ((X3DNodeElementGeometry2D *)ne)->NumIndices = 1; @@ -405,10 +405,10 @@ void X3DImporter::readRectangle2D(XmlNode &node) { float y2 = size.y / 2.0f; std::list &vlist = ((X3DNodeElementGeometry2D *)ne)->Vertices; // just short alias. - vlist.emplace_back(x2, y1, 0); // 1st point - vlist.emplace_back(x2, y2, 0); // 2nd point - vlist.emplace_back(x1, y2, 0); // 3rd point - vlist.emplace_back(x1, y1, 0); // 4th point + vlist.emplace_back(x2, y1, static_cast(0)); // 1st point + vlist.emplace_back(x2, y2, static_cast(0)); // 2nd point + vlist.emplace_back(x1, y2, static_cast(0)); // 3rd point + vlist.emplace_back(x1, y1, static_cast(0)); // 4th point ((X3DNodeElementGeometry2D *)ne)->Solid = solid; ((X3DNodeElementGeometry2D *)ne)->NumIndices = 4; // check for X3DMetadataObject childs. @@ -449,7 +449,7 @@ void X3DImporter::readTriangleSet2D(XmlNode &node) { // convert vec2 to vec3 for (std::list::iterator it2 = vertices.begin(); it2 != vertices.end(); ++it2) { - ((X3DNodeElementGeometry2D *)ne)->Vertices.emplace_back(it2->x, it2->y, 0); + ((X3DNodeElementGeometry2D *)ne)->Vertices.emplace_back(it2->x, it2->y, static_cast(0)); } ((X3DNodeElementGeometry2D *)ne)->Solid = solid; From eb5d3c51e8987a6c687657503a30481e45a90de1 Mon Sep 17 00:00:00 2001 From: lsnoel <52174215+lsnoel@users.noreply.github.com> Date: Thu, 19 Jan 2023 16:46:29 +0000 Subject: [PATCH 043/232] Correctly consider aiProcess_FlipWindingOrder AND aiProcess_MakeLeftHanded when generating normals --- code/PostProcessing/GenFaceNormalsProcess.cpp | 5 +++-- code/PostProcessing/GenFaceNormalsProcess.h | 1 + code/PostProcessing/GenVertexNormalsProcess.cpp | 5 +++-- code/PostProcessing/GenVertexNormalsProcess.h | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/code/PostProcessing/GenFaceNormalsProcess.cpp b/code/PostProcessing/GenFaceNormalsProcess.cpp index f104b98b6..0edbd9c6f 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.cpp +++ b/code/PostProcessing/GenFaceNormalsProcess.cpp @@ -67,6 +67,7 @@ GenFaceNormalsProcess::~GenFaceNormalsProcess() = default; bool GenFaceNormalsProcess::IsActive(unsigned int pFlags) const { force_ = (pFlags & aiProcess_ForceGenNormals) != 0; flippedWindingOrder_ = (pFlags & aiProcess_FlipWindingOrder) != 0; + leftHanded_ = (pFlags & aiProcess_MakeLeftHanded) != 0; return (pFlags & aiProcess_GenNormals) != 0; } @@ -131,8 +132,8 @@ bool GenFaceNormalsProcess::GenMeshFaceNormals(aiMesh *pMesh) { const aiVector3D *pV1 = &pMesh->mVertices[face.mIndices[0]]; const aiVector3D *pV2 = &pMesh->mVertices[face.mIndices[1]]; const aiVector3D *pV3 = &pMesh->mVertices[face.mIndices[face.mNumIndices - 1]]; - if (flippedWindingOrder_) - std::swap( pV2, pV3 ); + if (flippedWindingOrder_ != leftHanded_) // Boolean XOR + std::swap(pV2, pV3); const aiVector3D vNor = ((*pV2 - *pV1) ^ (*pV3 - *pV1)).NormalizeSafe(); for (unsigned int i = 0; i < face.mNumIndices; ++i) { diff --git a/code/PostProcessing/GenFaceNormalsProcess.h b/code/PostProcessing/GenFaceNormalsProcess.h index 586c4902e..c2f157e20 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.h +++ b/code/PostProcessing/GenFaceNormalsProcess.h @@ -81,6 +81,7 @@ private: bool GenMeshFaceNormals(aiMesh* pcMesh); mutable bool force_ = false; mutable bool flippedWindingOrder_ = false; + mutable bool leftHanded_ = false; }; } // end of namespace Assimp diff --git a/code/PostProcessing/GenVertexNormalsProcess.cpp b/code/PostProcessing/GenVertexNormalsProcess.cpp index 0cb2bddb1..e9541c7d9 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.cpp +++ b/code/PostProcessing/GenVertexNormalsProcess.cpp @@ -69,6 +69,7 @@ GenVertexNormalsProcess::~GenVertexNormalsProcess() = default; bool GenVertexNormalsProcess::IsActive(unsigned int pFlags) const { force_ = (pFlags & aiProcess_ForceGenNormals) != 0; flippedWindingOrder_ = (pFlags & aiProcess_FlipWindingOrder) != 0; + leftHanded_ = (pFlags & aiProcess_MakeLeftHanded) != 0; return (pFlags & aiProcess_GenSmoothNormals) != 0; } @@ -141,8 +142,8 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals(aiMesh *pMesh, unsigned int m const aiVector3D *pV1 = &pMesh->mVertices[face.mIndices[0]]; const aiVector3D *pV2 = &pMesh->mVertices[face.mIndices[1]]; const aiVector3D *pV3 = &pMesh->mVertices[face.mIndices[face.mNumIndices - 1]]; - if (flippedWindingOrder_) - std::swap( pV2, pV3 ); + if (flippedWindingOrder_ != leftHanded_) // Boolean XOR + std::swap(pV2, pV3); const aiVector3D vNor = ((*pV2 - *pV1) ^ (*pV3 - *pV1)).NormalizeSafe(); for (unsigned int i = 0; i < face.mNumIndices; ++i) { diff --git a/code/PostProcessing/GenVertexNormalsProcess.h b/code/PostProcessing/GenVertexNormalsProcess.h index 0dcae793a..370bf42b1 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.h +++ b/code/PostProcessing/GenVertexNormalsProcess.h @@ -105,6 +105,7 @@ private: ai_real configMaxAngle; mutable bool force_ = false; mutable bool flippedWindingOrder_ = false; + mutable bool leftHanded_ = false; }; } // end of namespace Assimp From 8d1256f472702cc22292abcb8bbd6f15b1edda64 Mon Sep 17 00:00:00 2001 From: lsnoel <52174215+lsnoel@users.noreply.github.com> Date: Fri, 20 Jan 2023 14:55:06 +0000 Subject: [PATCH 044/232] Comments about winding order fix for gen normals --- code/PostProcessing/GenFaceNormalsProcess.cpp | 4 +++- code/PostProcessing/GenVertexNormalsProcess.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/PostProcessing/GenFaceNormalsProcess.cpp b/code/PostProcessing/GenFaceNormalsProcess.cpp index 0edbd9c6f..d3520d4b2 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.cpp +++ b/code/PostProcessing/GenFaceNormalsProcess.cpp @@ -132,7 +132,9 @@ bool GenFaceNormalsProcess::GenMeshFaceNormals(aiMesh *pMesh) { const aiVector3D *pV1 = &pMesh->mVertices[face.mIndices[0]]; const aiVector3D *pV2 = &pMesh->mVertices[face.mIndices[1]]; const aiVector3D *pV3 = &pMesh->mVertices[face.mIndices[face.mNumIndices - 1]]; - if (flippedWindingOrder_ != leftHanded_) // Boolean XOR + // Boolean XOR - if either but not both of these flags is set, then the winding order has + // changed and the cross product to calculate the normal needs to be reversed + if (flippedWindingOrder_ != leftHanded_) std::swap(pV2, pV3); const aiVector3D vNor = ((*pV2 - *pV1) ^ (*pV3 - *pV1)).NormalizeSafe(); diff --git a/code/PostProcessing/GenVertexNormalsProcess.cpp b/code/PostProcessing/GenVertexNormalsProcess.cpp index e9541c7d9..5b9033383 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.cpp +++ b/code/PostProcessing/GenVertexNormalsProcess.cpp @@ -142,7 +142,9 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals(aiMesh *pMesh, unsigned int m const aiVector3D *pV1 = &pMesh->mVertices[face.mIndices[0]]; const aiVector3D *pV2 = &pMesh->mVertices[face.mIndices[1]]; const aiVector3D *pV3 = &pMesh->mVertices[face.mIndices[face.mNumIndices - 1]]; - if (flippedWindingOrder_ != leftHanded_) // Boolean XOR + // Boolean XOR - if either but not both of these flags is set, then the winding order has + // changed and the cross product to calculate the normal needs to be reversed + if (flippedWindingOrder_ != leftHanded_) std::swap(pV2, pV3); const aiVector3D vNor = ((*pV2 - *pV1) ^ (*pV3 - *pV1)).NormalizeSafe(); From ab0a119626a93d55944208b96be856c914900f65 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 20 Jan 2023 19:14:04 +0100 Subject: [PATCH 045/232] Update LimitBoneWeightsProcess.cpp - Removing empty bones only if AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES is enabled. - closes https://github.com/assimp/assimp/issues/4840 --- .../LimitBoneWeightsProcess.cpp | 70 ++++++++----------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/code/PostProcessing/LimitBoneWeightsProcess.cpp b/code/PostProcessing/LimitBoneWeightsProcess.cpp index 3192e07bc..1db9158ef 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.cpp +++ b/code/PostProcessing/LimitBoneWeightsProcess.cpp @@ -55,10 +55,7 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -LimitBoneWeightsProcess::LimitBoneWeightsProcess() -{ - mMaxWeights = AI_LMW_MAX_WEIGHTS; -} +LimitBoneWeightsProcess::LimitBoneWeightsProcess() : mMaxWeights(AI_LMW_MAX_WEIGHTS) {} // ------------------------------------------------------------------------------------------------ // Destructor, private as well @@ -66,15 +63,15 @@ LimitBoneWeightsProcess::~LimitBoneWeightsProcess() = default; // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool LimitBoneWeightsProcess::IsActive( unsigned int pFlags) const -{ +bool LimitBoneWeightsProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_LimitBoneWeights) != 0; } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void LimitBoneWeightsProcess::Execute( aiScene* pScene) -{ +void LimitBoneWeightsProcess::Execute( aiScene* pScene) { + ai_assert(pScene != nullptr); + ASSIMP_LOG_DEBUG("LimitBoneWeightsProcess begin"); for (unsigned int m = 0; m < pScene->mNumMeshes; ++m) { @@ -86,16 +83,28 @@ void LimitBoneWeightsProcess::Execute( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void LimitBoneWeightsProcess::SetupProperties(const Importer* pImp) -{ - // get the current value of the property +void LimitBoneWeightsProcess::SetupProperties(const Importer* pImp) { this->mMaxWeights = pImp->GetPropertyInteger(AI_CONFIG_PP_LBW_MAX_WEIGHTS,AI_LMW_MAX_WEIGHTS); } +// ------------------------------------------------------------------------------------------------ +static void removeEmptyBones(aiMesh *pMesh) { + ai_assert(pMesh != nullptr); + + unsigned int writeBone = 0; + for (unsigned int readBone = 0; readBone< pMesh->mNumBones; ++readBone) { + aiBone* bone = pMesh->mBones[readBone]; + if (bone->mNumWeights > 0) { + pMesh->mBones[writeBone++] = bone; + } else { + delete bone; + } + } +} + // ------------------------------------------------------------------------------------------------ // Unites identical vertices in the given mesh -void LimitBoneWeightsProcess::ProcessMesh(aiMesh* pMesh) -{ +void LimitBoneWeightsProcess::ProcessMesh(aiMesh* pMesh) { if (!pMesh->HasBones()) return; @@ -105,11 +114,9 @@ void LimitBoneWeightsProcess::ProcessMesh(aiMesh* pMesh) WeightsPerVertex vertexWeights(pMesh->mNumVertices); size_t maxVertexWeights = 0; - for (unsigned int b = 0; b < pMesh->mNumBones; ++b) - { + for (unsigned int b = 0; b < pMesh->mNumBones; ++b) { const aiBone* bone = pMesh->mBones[b]; - for (unsigned int w = 0; w < bone->mNumWeights; ++w) - { + for (unsigned int w = 0; w < bone->mNumWeights; ++w) { const aiVertexWeight& vw = bone->mWeights[w]; if (vertexWeights.size() <= vw.mVertexId) @@ -126,8 +133,7 @@ void LimitBoneWeightsProcess::ProcessMesh(aiMesh* pMesh) unsigned int removed = 0, old_bones = pMesh->mNumBones; // now cut the weight count if it exceeds the maximum - for (WeightsPerVertex::iterator vit = vertexWeights.begin(); vit != vertexWeights.end(); ++vit) - { + for (WeightsPerVertex::iterator vit = vertexWeights.begin(); vit != vertexWeights.end(); ++vit) { if (vit->size() <= mMaxWeights) continue; @@ -154,39 +160,25 @@ void LimitBoneWeightsProcess::ProcessMesh(aiMesh* pMesh) } // clear weight count for all bone - for (unsigned int a = 0; a < pMesh->mNumBones; ++a) - { + for (unsigned int a = 0; a < pMesh->mNumBones; ++a) { pMesh->mBones[a]->mNumWeights = 0; } // rebuild the vertex weight array for all bones - for (unsigned int a = 0; a < vertexWeights.size(); ++a) - { + for (unsigned int a = 0; a < vertexWeights.size(); ++a) { const VertexWeightArray& vw = vertexWeights[a]; - for (const Weight* it = vw.begin(); it != vw.end(); ++it) - { + for (const Weight* it = vw.begin(); it != vw.end(); ++it) { aiBone* bone = pMesh->mBones[it->mBone]; bone->mWeights[bone->mNumWeights++] = aiVertexWeight(a, it->mWeight); } } // remove empty bones - unsigned int writeBone = 0; +#ifdef AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES + removeEmptyBones(pMesh); +#endif // AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES - for (unsigned int readBone = 0; readBone< pMesh->mNumBones; ++readBone) - { - aiBone* bone = pMesh->mBones[readBone]; - if (bone->mNumWeights > 0) - { - pMesh->mBones[writeBone++] = bone; - } - else - { - delete bone; - } - } pMesh->mNumBones = writeBone; - if (!DefaultLogger::isNullLogger()) { ASSIMP_LOG_INFO("Removed ", removed, " weights. Input bones: ", old_bones, ". Output bones: ", pMesh->mNumBones); } From 81cf1369dbf905dffbedd6fb6cd427455025b73f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 20 Jan 2023 19:20:06 +0100 Subject: [PATCH 046/232] Set correct number of bones in mesh instance --- .../LimitBoneWeightsProcess.cpp | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/code/PostProcessing/LimitBoneWeightsProcess.cpp b/code/PostProcessing/LimitBoneWeightsProcess.cpp index 1db9158ef..8820c0113 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.cpp +++ b/code/PostProcessing/LimitBoneWeightsProcess.cpp @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2022, assimp team - +Copyright (c) 2006-2023, assimp team All rights reserved. @@ -36,13 +35,7 @@ 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. - ----------------------------------------------------------------------- -*/ - -/** Implementation of the LimitBoneWeightsProcess post processing step */ - - +---------------------------------------------------------------------- */ #include "LimitBoneWeightsProcess.h" #include #include @@ -51,7 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -using namespace Assimp; +namespace Assimp { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer @@ -88,7 +81,7 @@ void LimitBoneWeightsProcess::SetupProperties(const Importer* pImp) { } // ------------------------------------------------------------------------------------------------ -static void removeEmptyBones(aiMesh *pMesh) { +static unsigned int removeEmptyBones(aiMesh *pMesh) { ai_assert(pMesh != nullptr); unsigned int writeBone = 0; @@ -100,6 +93,8 @@ static void removeEmptyBones(aiMesh *pMesh) { delete bone; } } + + return writeBone; } // ------------------------------------------------------------------------------------------------ @@ -175,11 +170,12 @@ void LimitBoneWeightsProcess::ProcessMesh(aiMesh* pMesh) { // remove empty bones #ifdef AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES - removeEmptyBones(pMesh); + pMesh->mNumBones = removeEmptyBones(pMesh); #endif // AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES - pMesh->mNumBones = writeBone; if (!DefaultLogger::isNullLogger()) { ASSIMP_LOG_INFO("Removed ", removed, " weights. Input bones: ", old_bones, ". Output bones: ", pMesh->mNumBones); } } + +} // namespace Assimp From 9e1de3ec6e6a5749ff23f3b8640da96bb32b1046 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 20 Jan 2023 19:45:45 +0100 Subject: [PATCH 047/232] Remove /Zi compiler flag for MSVC, release config - closes https://github.com/assimp/assimp/issues/4845 --- CMakeLists.txt | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e613a43cc..d20e6c9e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- -# Copyright (c) 2006-2022, assimp team +# Copyright (c) 2006-2023, assimp team # # All rights reserved. # @@ -262,13 +262,13 @@ IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT MINGW) ENDIF() # hide all not-exported symbols IF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "mips64" ) - SET(CMAKE_CXX_FLAGS "-mxgot -fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") - SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") - SET(LIBSTDC++_LIBRARIES -lstdc++) + SET(CMAKE_CXX_FLAGS "-mxgot -fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") + SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") + SET(LIBSTDC++_LIBRARIES -lstdc++) ELSE() - SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") - SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") - SET(LIBSTDC++_LIBRARIES -lstdc++) + SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") + SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") + SET(LIBSTDC++_LIBRARIES -lstdc++) ENDIF() ELSEIF(MSVC) # enable multi-core compilation with MSVC @@ -277,13 +277,15 @@ ELSEIF(MSVC) ELSE() # msvc ADD_COMPILE_OPTIONS(/MP /bigobj /W4 /WX) ENDIF() + # disable "elements of array '' will be default initialized" warning on MSVC2013 IF(MSVC12) ADD_COMPILE_OPTIONS(/wd4351) ENDIF() - ADD_COMPILE_OPTIONS(/wd4244) #supress warning for double to float conversion if Double precission is activated + # supress warning for double to float conversion if Double precission is activated + ADD_COMPILE_OPTIONS(/wd4244) SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_DEBUG /Zi /Od") - SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi") + SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG:FULL /PDBALTPATH:%_PDB% /OPT:REF /OPT:ICF") ELSEIF (CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) IF(NOT ASSIMP_HUNTER_ENABLED) From 5ed01bcfa386ec889d4840eaa399d30d082e09e6 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 20 Jan 2023 20:00:36 +0100 Subject: [PATCH 048/232] Ensure initializer exists - Fixing a Codaxy finding. --- code/PostProcessing/LimitBoneWeightsProcess.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/PostProcessing/LimitBoneWeightsProcess.cpp b/code/PostProcessing/LimitBoneWeightsProcess.cpp index 8820c0113..51fb43dfc 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.cpp +++ b/code/PostProcessing/LimitBoneWeightsProcess.cpp @@ -46,6 +46,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { +// Make sure this value is set. +#ifndef AI_LMW_MAX_WEIGHTS +# define AI_LMW_MAX_WEIGHTS 16 +#endif + // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer LimitBoneWeightsProcess::LimitBoneWeightsProcess() : mMaxWeights(AI_LMW_MAX_WEIGHTS) {} From f8bc8293cec316f37c0b86a481ef53ce103b3edc Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 22 Jan 2023 16:48:45 +0100 Subject: [PATCH 049/232] Update FBXMeshGeometry.h --- code/AssetLib/FBX/FBXMeshGeometry.h | 81 +++++++++++++++++------------ 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/code/AssetLib/FBX/FBXMeshGeometry.h b/code/AssetLib/FBX/FBXMeshGeometry.h index 03f01b763..f4a1a2673 100644 --- a/code/AssetLib/FBX/FBXMeshGeometry.h +++ b/code/AssetLib/FBX/FBXMeshGeometry.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2022, assimp team - +Copyright (c) 2006-2023, assimp team All rights reserved. @@ -53,22 +52,26 @@ namespace Assimp { namespace FBX { /** - * DOM base class for all kinds of FBX geometry + * @brief DOM base class for all kinds of FBX geometry */ class Geometry : public Object { public: /// @brief The class constructor with all parameters. /// @param id The id. - /// @param element - /// @param name - /// @param doc + /// @param element The element instance + /// @param name The name instance + /// @param doc The document instance Geometry( uint64_t id, const Element& element, const std::string& name, const Document& doc ); + + /// @brief The class destructor, default. virtual ~Geometry() = default; - /// Get the Skin attached to this geometry or nullptr + /// @brief Get the Skin attached to this geometry or nullptr. + /// @return The deformer skip instance as a pointer, nullptr if none. const Skin* DeformerSkin() const; - /// Get the BlendShape attached to this geometry or nullptr + /// @brief Get the BlendShape attached to this geometry or nullptr + /// @return The blendshape arrays. const std::vector& GetBlendShapes() const; private: @@ -78,59 +81,71 @@ private: typedef std::vector MatIndexArray; - /** - * DOM class for FBX geometry of type "Mesh" + * @brief DOM class for FBX geometry of type "Mesh" */ class MeshGeometry : public Geometry { public: - /** The class constructor */ + /// @brief The class constructor + /// @param id The id. + /// @param element The element instance + /// @param name The name instance + /// @param doc The document instance MeshGeometry( uint64_t id, const Element& element, const std::string& name, const Document& doc ); - /** The class destructor */ + /// @brief The class destructor, default. virtual ~MeshGeometry() = default; - /** Get a list of all vertex points, non-unique*/ + /// brief Get a vector of all vertex points, non-unique. + /// @return The vertices vector. const std::vector& GetVertices() const; - /** Get a list of all vertex normals or an empty array if - * no normals are specified. */ + /// @brief Get a vector of all vertex normals or an empty array if no normals are specified. + /// @return The normal vector. const std::vector& GetNormals() const; - /** Get a list of all vertex tangents or an empty array - * if no tangents are specified */ + /// @brief Get a vector of all vertex tangents or an empty array if no tangents are specified. + /// @return The vertex tangents vector. const std::vector& GetTangents() const; - /** Get a list of all vertex bi-normals or an empty array - * if no bi-normals are specified */ + /// @brief Get a vector of all vertex bi-normals or an empty array if no bi-normals are specified. + /// @return The binomal vector. const std::vector& GetBinormals() const; - /** Return list of faces - each entry denotes a face and specifies - * how many vertices it has. Vertices are taken from the - * vertex data arrays in sequential order. */ + /// @brief Return list of faces - each entry denotes a face and specifies how many vertices it has. + /// Vertices are taken from the vertex data arrays in sequential order. + /// @return The face indices vector. const std::vector& GetFaceIndexCounts() const; - /** Get a UV coordinate slot, returns an empty array if - * the requested slot does not exist. */ + /// @brief Get a UV coordinate slot, returns an empty array if the requested slot does not exist. + /// @param index The requested texture coordinate slot. + /// @return The texture coordinates. const std::vector& GetTextureCoords( unsigned int index ) const; - /** Get a UV coordinate slot, returns an empty array if - * the requested slot does not exist. */ + /// @brief Get a UV coordinate slot, returns an empty array if the requested slot does not exist. + /// @param index The requested texture coordinate slot. + /// @return The texture coordinate channel name. std::string GetTextureCoordChannelName( unsigned int index ) const; - /** Get a vertex color coordinate slot, returns an empty array if - * the requested slot does not exist. */ + /// @brief Get a vertex color coordinate slot, returns an empty array if the requested slot does not exist. + /// @param index The requested texture coordinate slot. + /// @return The vertex color vector. const std::vector& GetVertexColors( unsigned int index ) const; - /** Get per-face-vertex material assignments */ + /// @brief Get per-face-vertex material assignments. + /// @return The Material indices Array. const MatIndexArray& GetMaterialIndices() const; - /** Convert from a fbx file vertex index (for example from a #Cluster weight) or nullptr - * if the vertex index is not valid. */ + /// @brief Convert from a fbx file vertex index (for example from a #Cluster weight) or nullptr if the vertex index is not valid. + /// @param in_index The requested input index. + /// @param count The number of indices. + /// @return The indices. const unsigned int* ToOutputVertexIndex( unsigned int in_index, unsigned int& count ) const; - /** Determine the face to which a particular output vertex index belongs. - * This mapping is always unique. */ + /// @brief Determine the face to which a particular output vertex index belongs. + /// This mapping is always unique. + /// @param in_index The requested input index. + /// @return The face-to-vertex index. unsigned int FaceForVertexIndex( unsigned int in_index ) const; private: From 72b178b9fc6825adc1607afdfed4c8cdae10f615 Mon Sep 17 00:00:00 2001 From: AdamCichocki Date: Mon, 23 Jan 2023 14:51:02 +0100 Subject: [PATCH 050/232] Optimized usedVertexIndices by using bitmask instead of unordered_set --- code/PostProcessing/JoinVerticesProcess.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index 0423ab5c2..30831eed0 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -264,12 +264,13 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { // We should care only about used vertices, not all of them // (this can happen due to original file vertices buffer being used by // multiple meshes) - std::unordered_set usedVertexIndices; - usedVertexIndices.reserve(pMesh->mNumVertices); - for( unsigned int a = 0; a < pMesh->mNumFaces; a++) { + std::vector usedVertexIndicesMask; + usedVertexIndicesMask.resize((pMesh->mNumVertices + 31) / 32, 0); + for (unsigned int a = 0; a < pMesh->mNumFaces; a++) { aiFace& face = pMesh->mFaces[a]; - for( unsigned int b = 0; b < face.mNumIndices; b++) { - usedVertexIndices.insert(face.mIndices[b]); + for (unsigned int b = 0; b < face.mNumIndices; b++) { + const unsigned int currIndex = face.mIndices[b]; + usedVertexIndicesMask[currIndex / 32] |= 1u << (currIndex % 32); } } @@ -335,7 +336,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { int newIndex = 0; for( unsigned int a = 0; a < pMesh->mNumVertices; a++) { // if the vertex is unused Do nothing - if (usedVertexIndices.find(a) == usedVertexIndices.end()) { + if (0 == (usedVertexIndicesMask[a / 32] & (1u << (a % 32)))) { continue; } // collect the vertex data From 5ed09b7ab6fde84099a095c4ffcef055c9d715a5 Mon Sep 17 00:00:00 2001 From: AdamCichocki Date: Mon, 23 Jan 2023 16:39:06 +0100 Subject: [PATCH 051/232] usedVertexIndicesMask is now based on vector instead of vector --- code/PostProcessing/JoinVerticesProcess.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index 30831eed0..3bf96afeb 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -264,13 +264,12 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { // We should care only about used vertices, not all of them // (this can happen due to original file vertices buffer being used by // multiple meshes) - std::vector usedVertexIndicesMask; - usedVertexIndicesMask.resize((pMesh->mNumVertices + 31) / 32, 0); + std::vector usedVertexIndicesMask; + usedVertexIndicesMask.resize(pMesh->mNumVertices, false); for (unsigned int a = 0; a < pMesh->mNumFaces; a++) { aiFace& face = pMesh->mFaces[a]; for (unsigned int b = 0; b < face.mNumIndices; b++) { - const unsigned int currIndex = face.mIndices[b]; - usedVertexIndicesMask[currIndex / 32] |= 1u << (currIndex % 32); + usedVertexIndicesMask[face.mIndices[b]] = true; } } @@ -336,7 +335,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { int newIndex = 0; for( unsigned int a = 0; a < pMesh->mNumVertices; a++) { // if the vertex is unused Do nothing - if (0 == (usedVertexIndicesMask[a / 32] & (1u << (a % 32)))) { + if (!usedVertexIndicesMask[a]) { continue; } // collect the vertex data From cb8320945d11209928af498e4d64380b8372b02f Mon Sep 17 00:00:00 2001 From: PencilAmazing Date: Sun, 22 Jan 2023 19:51:36 -0500 Subject: [PATCH 052/232] Fix issue #4866 by continuing to resetting read loop after hitting a comment --- code/AssetLib/Ply/PlyParser.cpp | 4 ++-- test/models/PLY/issue623.ply | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/Ply/PlyParser.cpp b/code/AssetLib/Ply/PlyParser.cpp index c2b264b21..a7cf92606 100644 --- a/code/AssetLib/Ply/PlyParser.cpp +++ b/code/AssetLib/Ply/PlyParser.cpp @@ -308,8 +308,8 @@ bool PLY::Element::ParseElement(IOStreamBuffer &streamBuffer, std::vector< streamBuffer.getNextLine(buffer); pCur = (char *)&buffer[0]; - // skip all comments - PLY::DOM::SkipComments(buffer); + // skip all comments and go to next line + if (PLY::DOM::SkipComments(buffer)) continue; PLY::Property prop; if (!PLY::Property::ParseProperty(buffer, &prop)) diff --git a/test/models/PLY/issue623.ply b/test/models/PLY/issue623.ply index af8811752..6cff78e65 100644 --- a/test/models/PLY/issue623.ply +++ b/test/models/PLY/issue623.ply @@ -2,6 +2,7 @@ ply format ascii 1.0 comment Created by Blender 2.77 (sub 0) - www.blender.org, source file: '' element vertex 24 +comment Manually added comment line to fix issue #4866 property float x property float y property float z From 37903f8ed2933b3ce61b3609e89eb369b05004eb Mon Sep 17 00:00:00 2001 From: Shaun Reed Date: Sat, 21 Jan 2023 09:57:44 -0500 Subject: [PATCH 053/232] Don't build zlib if ASSIMP_BUILD_ZLIB=OFF --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d20e6c9e0..e859986b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -482,7 +482,11 @@ ELSE() FIND_PACKAGE(ZLIB) ENDIF() - IF( NOT ZLIB_FOUND ) + IF ( NOT ZLIB_FOUND AND NOT ASSIMP_BUILD_ZLIB ) + message( FATAL_ERROR + "Build configured with -DASSIMP_BUILD_ZLIB=OFF but unable to find zlib" + ) + ELSEIF( NOT ZLIB_FOUND ) MESSAGE(STATUS "compiling zlib from sources") INCLUDE(CheckIncludeFile) INCLUDE(CheckTypeSize) From ffbeb2db186143ce85a05c024396093905706861 Mon Sep 17 00:00:00 2001 From: Shaun Reed Date: Tue, 24 Jan 2023 19:21:54 -0500 Subject: [PATCH 054/232] CI --- .github/workflows/ccpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 47914a3f2..f9d0d6c05 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -99,7 +99,7 @@ jobs: - name: Set Windows specific CMake arguments if: contains(matrix.name, 'windows') id: windows_extra_cmake_args - run: echo "::set-output name=args::-DASSIMP_BUILD_ASSIMP_TOOLS=1 -DASSIMP_BUILD_ASSIMP_VIEW=1" + run: echo "::set-output name=args::-DASSIMP_BUILD_ASSIMP_TOOLS=1 -DASSIMP_BUILD_ASSIMP_VIEW=1 -DASSIMP_BUILD_ZLIB=1" - name: Set Hunter specific CMake arguments if: contains(matrix.name, 'hunter') From eff13f6a40bb2cac50935bf9764595932373327e Mon Sep 17 00:00:00 2001 From: Steve M Date: Wed, 25 Jan 2023 20:52:25 -0800 Subject: [PATCH 055/232] Update morph mesh documentation now that gltf known to work --- include/assimp/anim.h | 5 ++++- include/assimp/mesh.h | 11 +++++++++-- port/PyAssimp/pyassimp/structs.py | 9 +++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/assimp/anim.h b/include/assimp/anim.h index edb048f50..49f0d5014 100644 --- a/include/assimp/anim.h +++ b/include/assimp/anim.h @@ -198,7 +198,10 @@ struct aiMeshMorphKey { /** The time of this key */ double mTime; - /** The values and weights at the time of this key */ + /** The values and weights at the time of this key + * - mValues: index of attachment mesh to apply weight at the same position in mWeights + * - mWeights: weight to apply to the blend shape index at the same position in mValues + */ unsigned int *mValues; double *mWeights; diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 363627464..c2d78a73c 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -737,13 +737,20 @@ struct aiMesh { **/ C_STRUCT aiString mName; - /** The number of attachment meshes. Note! Currently only works with Collada loader. */ + /** The number of attachment meshes. + * Currently known to work with loaders: + * - Collada + * - gltf + */ unsigned int mNumAnimMeshes; /** Attachment meshes for this mesh, for vertex-based animation. * Attachment meshes carry replacement data for some of the * mesh'es vertex components (usually positions, normals). - * Note! Currently only works with Collada loader.*/ + * Currently known to work with loaders: + * - Collada + * - gltf + */ C_STRUCT aiAnimMesh **mAnimMeshes; /** diff --git a/port/PyAssimp/pyassimp/structs.py b/port/PyAssimp/pyassimp/structs.py index e1fba1950..932998025 100644 --- a/port/PyAssimp/pyassimp/structs.py +++ b/port/PyAssimp/pyassimp/structs.py @@ -748,13 +748,18 @@ class Mesh(Structure): # - Vertex animations refer to meshes by their names. ("mName", String), - # The number of attachment meshes. Note! Currently only works with Collada loader. + # The number of attachment meshes. + # Currently known to work with loaders: + # - Collada + # - gltf ("mNumAnimMeshes", c_uint), # Attachment meshes for this mesh, for vertex-based animation. # Attachment meshes carry replacement data for some of the # mesh'es vertex components (usually positions, normals). - # Note! Currently only works with Collada loader. + # Currently known to work with loaders: + # - Collada + # - gltf ("mAnimMeshes", POINTER(POINTER(AnimMesh))), # Method of morphing when animeshes are specified. From 5c286b8c134997aebb31060548f8e4e59e8598aa Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 31 Jan 2023 20:12:07 +0100 Subject: [PATCH 056/232] Fix: Remove deprecated dependency. --- port/iOS/build.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/port/iOS/build.sh b/port/iOS/build.sh index 335b450d1..1248eb641 100755 --- a/port/iOS/build.sh +++ b/port/iOS/build.sh @@ -190,11 +190,9 @@ if [[ "$DEPLOY_FAT" -eq 1 ]]; then if [[ "$BUILD_TYPE" =~ "Debug" ]]; then make_fat_static_or_shared_binary 'libassimpd' - make_fat_static_binary 'libIrrXMLd' make_fat_static_binary 'libzlibstaticd' else make_fat_static_or_shared_binary 'libassimp' - make_fat_static_binary 'libIrrXML' make_fat_static_binary 'libzlibstatic' fi From 47303c2d28967ffb36d31df7db6a04c9f5917eda Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 31 Jan 2023 20:41:18 +0100 Subject: [PATCH 057/232] Fix:Remove deprecated features from iOS build. --- port/iOS/build.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/port/iOS/build.sh b/port/iOS/build.sh index 1248eb641..099bd8b0f 100755 --- a/port/iOS/build.sh +++ b/port/iOS/build.sh @@ -76,7 +76,7 @@ build_arch() rm CMakeCache.txt - CMAKE_CLI_INPUT="-DCMAKE_C_COMPILER=$CMAKE_C_COMPILER -DCMAKE_CXX_COMPILER=$CMAKE_CXX_COMPILER -DCMAKE_TOOLCHAIN_FILE=./port/iOS/IPHONEOS_$(echo $1 | tr '[:lower:]' '[:upper:]')_TOOLCHAIN.cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DENABLE_BOOST_WORKAROUND=ON -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS" + CMAKE_CLI_INPUT="-DCMAKE_C_COMPILER=$CMAKE_C_COMPILER -DCMAKE_CXX_COMPILER=$CMAKE_CXX_COMPILER -DCMAKE_TOOLCHAIN_FILE=./port/iOS/IPHONEOS_$(echo $1 | tr '[:lower:]' '[:upper:]')_TOOLCHAIN.cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS" echo "[!] Running CMake with -G 'Unix Makefiles' $CMAKE_CLI_INPUT" @@ -190,10 +190,8 @@ if [[ "$DEPLOY_FAT" -eq 1 ]]; then if [[ "$BUILD_TYPE" =~ "Debug" ]]; then make_fat_static_or_shared_binary 'libassimpd' - make_fat_static_binary 'libzlibstaticd' else make_fat_static_or_shared_binary 'libassimp' - make_fat_static_binary 'libzlibstatic' fi echo "[!] Done! The fat binaries can be found at $BUILD_DIR" From a2273df48e003c6c4d9e487e4c17d0dbf666821b Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Thu, 2 Feb 2023 14:05:32 +0200 Subject: [PATCH 058/232] Unit test warning fixes GCC was warning about possibly uninitialized variables. Initialize them and use values which are nonzero and distinct from each other and any real value passed to any set method. This should prevent any false positives from zero initialization. --- test/unit/utMetadata.cpp | 8 ++++---- test/unit/utSharedPPData.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/unit/utMetadata.cpp b/test/unit/utMetadata.cpp index 6bd536d6c..514b1a4a4 100644 --- a/test/unit/utMetadata.cpp +++ b/test/unit/utMetadata.cpp @@ -212,7 +212,7 @@ TEST_F( utMetadata, copy_test ) { // int32_t test { - int32_t v = 0; + int32_t v = 127; bool ok = copy.Get( "int32", v ); EXPECT_TRUE( ok ); EXPECT_EQ( i32v, v ); @@ -220,7 +220,7 @@ TEST_F( utMetadata, copy_test ) { // uint64_t test { - uint64_t v; + uint64_t v = 255; bool ok = copy.Get( "uint64", v ); EXPECT_TRUE( ok ); EXPECT_EQ( ui64v, v ); @@ -228,14 +228,14 @@ TEST_F( utMetadata, copy_test ) { // float test { - float v; + float v = -9.9999f; EXPECT_TRUE( copy.Get( "float", v ) ); EXPECT_EQ( fv, v ); } // double test { - double v; + double v = -99.99; EXPECT_TRUE( copy.Get( "double", v ) ); EXPECT_EQ( dv, v ); } diff --git a/test/unit/utSharedPPData.cpp b/test/unit/utSharedPPData.cpp index e4be169dd..16ee9c75f 100644 --- a/test/unit/utSharedPPData.cpp +++ b/test/unit/utSharedPPData.cpp @@ -81,7 +81,7 @@ TEST_F(SharedPPDataTest, testPODProperty) EXPECT_FALSE(shared->GetProperty("test2",o)); EXPECT_EQ(5, o); - float f = 12.f, m; + float f = 12.f, m = -98.7654f; shared->AddProperty("test",f); EXPECT_TRUE(shared->GetProperty("test",m)); EXPECT_EQ(12.f, m); From 8d405d60d94aecfe383dabf9c4cb2b1ba3ca6813 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 3 Feb 2023 11:44:27 +0200 Subject: [PATCH 059/232] Fix Terragen loader Fixes e8d2b840178b2b22336eb02b2535f32f3d5cc37b --- code/AssetLib/Terragen/TerragenLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/Terragen/TerragenLoader.cpp b/code/AssetLib/Terragen/TerragenLoader.cpp index dcf01461a..738ad8e27 100644 --- a/code/AssetLib/Terragen/TerragenLoader.cpp +++ b/code/AssetLib/Terragen/TerragenLoader.cpp @@ -230,8 +230,8 @@ void TerragenImporter::InternReadFile(const std::string &pFile, } // Get to the next chunk (4 byte aligned) - unsigned dtt = reader.GetCurrentPos(); - if (dtt & 0x3) { + unsigned dtt = reader.GetCurrentPos() & 0x3; + if (dtt) { reader.IncPtr(4 - dtt); } } From 94533424911a46c38dcf1e3fe8f8867e35cffdc5 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 3 Feb 2023 11:45:11 +0200 Subject: [PATCH 060/232] Re-enable Terragen loader unit test --- test/unit/ImportExport/Terragen/utTerragenImportExport.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp index 6432dbf5f..8ec20e0c0 100644 --- a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp +++ b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp @@ -48,13 +48,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class utTerragenImportExport : public AbstractImportExportBase { public: virtual bool importerTest() { - /*Assimp::Importer importer; + Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/TER/RealisticTerrain.ter", aiProcess_ValidateDataStructure); - return nullptr != scene;*/ - return true; + return nullptr != scene; } }; -TEST_F(utTerragenImportExport, importX3DFromFileTest) { +TEST_F(utTerragenImportExport, importFromFileTest) { EXPECT_TRUE(importerTest()); } From 88ef9eecc1e94534af5497e27d20bc4b0c7fa443 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Fri, 3 Feb 2023 20:29:56 -0500 Subject: [PATCH 061/232] ACLoader: add support for reading more than one texture per object --- code/AssetLib/AC/ACLoader.cpp | 10 ++++++---- code/AssetLib/AC/ACLoader.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index 275a592f4..e93fba5f0 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -227,7 +227,9 @@ void AC3DImporter::LoadObjectSection(std::vector &objects) { } } else if (TokenMatch(buffer, "texture", 7)) { SkipSpaces(&buffer); - buffer = AcGetString(buffer, obj.texture); + std::string texture; + buffer = AcGetString(buffer, texture); + obj.textures.push_back(texture); } else if (TokenMatch(buffer, "texrep", 6)) { SkipSpaces(&buffer); buffer = TAcCheckedLoadFloatArray(buffer, "", 0, 2, &obj.texRepeat); @@ -351,8 +353,8 @@ void AC3DImporter::ConvertMaterial(const Object &object, s.Set(matSrc.name); matDest.AddProperty(&s, AI_MATKEY_NAME); } - if (object.texture.length()) { - s.Set(object.texture); + if (!object.textures.empty()) { + s.Set(object.textures[0]); matDest.AddProperty(&s, AI_MATKEY_TEXTURE_DIFFUSE(0)); // UV transformation @@ -532,7 +534,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, // allocate UV coordinates, but only if the texture name for the // surface is not empty aiVector3D *uv = nullptr; - if (object.texture.length()) { + if (!object.textures.empty()) { uv = mesh->mTextureCoords[0] = new aiVector3D[mesh->mNumVertices]; mesh->mNumUVComponents[0] = 2; } diff --git a/code/AssetLib/AC/ACLoader.h b/code/AssetLib/AC/ACLoader.h index aabc114e3..7f8dfd03c 100644 --- a/code/AssetLib/AC/ACLoader.h +++ b/code/AssetLib/AC/ACLoader.h @@ -125,7 +125,6 @@ public: type(World), name(), children(), - texture(), texRepeat(1.f, 1.f), texOffset(0.0f, 0.0f), rotation(), @@ -151,7 +150,8 @@ public: std::vector children; // texture to be assigned to all surfaces of the object - std::string texture; + // the .acc format supports up to 4 textures + std::vector textures; // texture repat factors (scaling for all coordinates) aiVector2D texRepeat, texOffset; From db72c6ee38e5a87f4aaf255197eb49da2b1fa651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20M=C3=B6ller?= Date: Sat, 4 Feb 2023 15:16:22 +0100 Subject: [PATCH 062/232] When "getNextBlock" was called after "getNextLine", the pointer could still on the newline. The pointer to a newline could not advance enough, when the line ended with \r\n. The resulting buffer was correct, as the buffer range went from until \r, but that the pointer increased by just 1 could lead to the problem that the next pointer points at \n, which is still part of the newline and therefore, "getNextBlock" got 1 byte too much. Refs Issue #4871 --- code/AssetLib/Ply/PlyParser.cpp | 2 +- include/assimp/IOStreamBuffer.h | 2 ++ .../PLY/cube_binary_header_with_RN_newline.ply | Bin 0 -> 448 bytes test/unit/utPLYImportExport.cpp | 16 ++++++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/models/PLY/cube_binary_header_with_RN_newline.ply diff --git a/code/AssetLib/Ply/PlyParser.cpp b/code/AssetLib/Ply/PlyParser.cpp index a7cf92606..6edba71fc 100644 --- a/code/AssetLib/Ply/PlyParser.cpp +++ b/code/AssetLib/Ply/PlyParser.cpp @@ -420,7 +420,7 @@ bool PLY::DOM::ParseHeader(IOStreamBuffer &streamBuffer, std::vector if (PLY::Element::ParseElement(streamBuffer, buffer, &out)) { // add the element to the list of elements alElements.push_back(out); - } else if (TokenMatch(buffer, "end_header", 10)) { //checks for /n ending, if it doesn't end with /r/n + } else if (TokenMatch(buffer, "end_header", 10)) { // we have reached the end of the header break; } else { diff --git a/include/assimp/IOStreamBuffer.h b/include/assimp/IOStreamBuffer.h index b34fc9ee1..abae1572c 100644 --- a/include/assimp/IOStreamBuffer.h +++ b/include/assimp/IOStreamBuffer.h @@ -323,7 +323,9 @@ AI_FORCE_INLINE bool IOStreamBuffer::getNextLine(std::vector &buffer) { } } buffer[i] = '\n'; + while (m_cachePos < m_cacheSize && (m_cache[m_cachePos] == '\r' || m_cache[m_cachePos] == '\n')) { ++m_cachePos; + } return true; } diff --git a/test/models/PLY/cube_binary_header_with_RN_newline.ply b/test/models/PLY/cube_binary_header_with_RN_newline.ply new file mode 100644 index 0000000000000000000000000000000000000000..bff3478608e03aa250ae359f10e43864f6825966 GIT binary patch literal 448 zcmZvW!D_=W5Ja6iX+Y3_*e?iiPrVhALn!pzt5NNBEs$j+tHtiApPn5VH^xM;(!AN# zNSz&3)%r#U`ZP}aF}EfJ%Q?H!Xh+%MsEW2}*aiAHU*6wN^u><74qPg>92-CE0}u3~ zI^TApN2+WqiNo3$*T(OEMx_g;?D;leO&{pHsI?~}k56ypM!r>WujG4q&AMd&q>{Vq z?{%_qE;ZblmwKLCpGlHpY$Np`6=4?XUYtj%9XbGrEkG)Y*a1KwB*g~6y$BF75gPzO PDIf{};s7xk0D*M{J^E0f literal 0 HcmV?d00001 diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp index 2edbdd71f..1f733c0e7 100644 --- a/test/unit/utPLYImportExport.cpp +++ b/test/unit/utPLYImportExport.cpp @@ -125,6 +125,22 @@ TEST_F(utPLYImportExport, importBinaryPLY) { EXPECT_EQ(12u, scene->mMeshes[0]->mNumFaces); } +// Tests of a PLY file gets read with \r\n as newlines instead of just \n (i.e. solidwork exported ply files) +TEST_F(utPLYImportExport, importBinaryPLYWithRNNewline) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_binary_header_with_RN_newline.ply", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMeshes[0]); + // This test model is double sided, so 12 faces instead of 6 + ASSERT_EQ(12u, scene->mMeshes[0]->mNumFaces); + // Also check if the indices were parsed correctly + ASSERT_EQ(3u, scene->mMeshes[0]->mFaces[0].mNumIndices); + EXPECT_EQ(0u, scene->mMeshes[0]->mFaces[0].mIndices[0]); + EXPECT_EQ(1u, scene->mMeshes[0]->mFaces[0].mIndices[1]); + EXPECT_EQ(2u, scene->mMeshes[0]->mFaces[0].mIndices[2]); +} + TEST_F(utPLYImportExport, vertexColorTest) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", aiProcess_ValidateDataStructure); From e9c95d484e6b57e3352bb6d68061ff0deb1f0eff Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 4 Feb 2023 18:36:36 +0100 Subject: [PATCH 063/232] Update IOStreamBuffer.h --- include/assimp/IOStreamBuffer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/IOStreamBuffer.h b/include/assimp/IOStreamBuffer.h index abae1572c..fae480e71 100644 --- a/include/assimp/IOStreamBuffer.h +++ b/include/assimp/IOStreamBuffer.h @@ -324,7 +324,7 @@ AI_FORCE_INLINE bool IOStreamBuffer::getNextLine(std::vector &buffer) { } buffer[i] = '\n'; while (m_cachePos < m_cacheSize && (m_cache[m_cachePos] == '\r' || m_cache[m_cachePos] == '\n')) { - ++m_cachePos; + ++m_cachePos; } return true; From 647f1e47fad55ef1a1e18d693a68ce5e6b9f7d47 Mon Sep 17 00:00:00 2001 From: sunjc Date: Tue, 7 Feb 2023 20:05:39 +0800 Subject: [PATCH 064/232] fix regression in join vertices post process. --- code/PostProcessing/JoinVerticesProcess.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index 3bf96afeb..d99921507 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -357,7 +357,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { } } else{ // if the vertex is already there just find the replace index that is appropriate to it - replaceIndex[a] = it->second; + // mark it with '0x80000000' + replaceIndex[a] = it->second | 0x80000000; } } @@ -400,17 +401,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { for ( unsigned int b = 0; b < bone->mNumWeights; b++ ) { const aiVertexWeight& ow = bone->mWeights[ b ]; // if the vertex is a unique one, translate it + // filter out joined vertices by mrak. if ( !( replaceIndex[ ow.mVertexId ] & 0x80000000 ) ) { - bool weightAlreadyExists = false; - for (std::vector::iterator vit = newWeights.begin(); vit != newWeights.end(); ++vit) { - if (vit->mVertexId == replaceIndex[ow.mVertexId]) { - weightAlreadyExists = true; - break; - } - } - if (weightAlreadyExists) { - continue; - } aiVertexWeight nw; nw.mVertexId = replaceIndex[ ow.mVertexId ]; nw.mWeight = ow.mWeight; From 0c05682bafab2237b53238da049f9ebf80012d1d Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 7 Feb 2023 20:02:06 +0100 Subject: [PATCH 065/232] Delete .coveralls.yml --- .coveralls.yml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .coveralls.yml diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100644 index f69c0ba34..000000000 --- a/.coveralls.yml +++ /dev/null @@ -1,2 +0,0 @@ -service_name: travis-pro -repo_token: GZXuNlublKFy7HAewHAZLk5ZwgipTFAOA From fb146b7d393006950980917c8650732486d25ccb Mon Sep 17 00:00:00 2001 From: sunjc Date: Wed, 8 Feb 2023 10:13:48 +0800 Subject: [PATCH 066/232] fix typo, use a macro to avoid magic numbers. --- code/PostProcessing/JoinVerticesProcess.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index d99921507..91f305b2d 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -251,6 +251,8 @@ private: unsigned mNumUVChannels; unsigned mNumColorChannels; }; + +#define JOINED_VERTICES_MARK 0x80000000u // now start the JoinVerticesProcess int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { static_assert( AI_MAX_NUMBER_OF_COLOR_SETS == 8, "AI_MAX_NUMBER_OF_COLOR_SETS == 8"); @@ -357,8 +359,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { } } else{ // if the vertex is already there just find the replace index that is appropriate to it - // mark it with '0x80000000' - replaceIndex[a] = it->second | 0x80000000; + // mark it with JOINED_VERTICES_MARK + replaceIndex[a] = it->second | JOINED_VERTICES_MARK; } } @@ -387,7 +389,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { for( unsigned int a = 0; a < pMesh->mNumFaces; a++) { aiFace& face = pMesh->mFaces[a]; for( unsigned int b = 0; b < face.mNumIndices; b++) { - face.mIndices[b] = replaceIndex[face.mIndices[b]] & ~0x80000000; + face.mIndices[b] = replaceIndex[face.mIndices[b]] & ~JOINED_VERTICES_MARK; } } @@ -401,8 +403,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { for ( unsigned int b = 0; b < bone->mNumWeights; b++ ) { const aiVertexWeight& ow = bone->mWeights[ b ]; // if the vertex is a unique one, translate it - // filter out joined vertices by mrak. - if ( !( replaceIndex[ ow.mVertexId ] & 0x80000000 ) ) { + // filter out joined vertices by JOINED_VERTICES_MARK. + if ( !( replaceIndex[ ow.mVertexId ] & JOINED_VERTICES_MARK ) ) { aiVertexWeight nw; nw.mVertexId = replaceIndex[ ow.mVertexId ]; nw.mWeight = ow.mWeight; From b170370e5cd02b2f2e5abdf873537c97455a2ea7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 8 Feb 2023 21:29:54 +0100 Subject: [PATCH 067/232] Fix: Fix memleak when exiting method by exception --- code/Common/Importer.cpp | 54 ++++++++++++++++++-------------- fuzz/assimp_fuzzer.cc | 7 +++-- include/assimp/MemoryIOWrapper.h | 12 +++---- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index df2895eef..b66059397 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -482,37 +482,43 @@ bool Importer::ValidateFlags(unsigned int pFlags) const { } // ------------------------------------------------------------------------------------------------ -const aiScene* Importer::ReadFileFromMemory( const void* pBuffer, - size_t pLength, - unsigned int pFlags, - const char* pHint /*= ""*/) { +const aiScene* Importer::ReadFileFromMemory(const void* pBuffer, size_t pLength, unsigned int pFlags, const char* pHint ) { ai_assert(nullptr != pimpl); - ASSIMP_BEGIN_EXCEPTION_REGION(); - if (!pHint) { - pHint = ""; - } - - if (!pBuffer || !pLength || strlen(pHint) > MaxLenHint ) { - pimpl->mErrorString = "Invalid parameters passed to ReadFileFromMemory()"; - return nullptr; - } - - // prevent deletion of the previous IOHandler IOSystem* io = pimpl->mIOHandler; - pimpl->mIOHandler = nullptr; + try { + if (pHint == nullptr) { + pHint = ""; + } + if (!pBuffer || !pLength || strlen(pHint) > MaxLenHint ) { + pimpl->mErrorString = "Invalid parameters passed to ReadFileFromMemory()"; + return nullptr; + } + // prevent deletion of the previous IOHandler + pimpl->mIOHandler = nullptr; - SetIOHandler(new MemoryIOSystem((const uint8_t*)pBuffer,pLength,io)); + SetIOHandler(new MemoryIOSystem((const uint8_t*)pBuffer,pLength,io)); - // read the file and recover the previous IOSystem - static const size_t BufSize(Importer::MaxLenHint + 28); - char fbuff[BufSize]; - ai_snprintf(fbuff, BufSize, "%s.%s",AI_MEMORYIO_MAGIC_FILENAME,pHint); + // read the file and recover the previous IOSystem + static const size_t BufSize(Importer::MaxLenHint + 28); + char fbuff[BufSize]; + ai_snprintf(fbuff, BufSize, "%s.%s",AI_MEMORYIO_MAGIC_FILENAME,pHint); - ReadFile(fbuff,pFlags); - SetIOHandler(io); + ReadFile(fbuff,pFlags); + SetIOHandler(io); + } catch(const DeadlyImportError &e) { + pimpl->mErrorString = e.what(); + pimpl->mException = std::current_exception(); + SetIOHandler(io); + return ExceptionSwallower()(); \ + } catch(...) { + pimpl->mErrorString = "Unknown exception"; + pimpl->mException = std::current_exception(); + SetIOHandler(io); + return ExceptionSwallower()(); \ + + } - ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mException); return pimpl->mScene; } diff --git a/fuzz/assimp_fuzzer.cc b/fuzz/assimp_fuzzer.cc index 33748c10f..edb5fdbb5 100644 --- a/fuzz/assimp_fuzzer.cc +++ b/fuzz/assimp_fuzzer.cc @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2020, assimp team +Copyright (c) 2006-2023, assimp team All rights reserved. @@ -46,8 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) { - aiLogStream stream = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT,NULL); - aiAttachLogStream(&stream); + aiLogStream stream = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT,NULL); + aiAttachLogStream(&stream); Importer importer; const aiScene *sc = importer.ReadFileFromMemory(data, dataSize, @@ -57,3 +57,4 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) { return 0; } + diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index 0bd3bc108..d52c4384f 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -153,11 +152,7 @@ private: class MemoryIOSystem : public IOSystem { public: /** Constructor. */ - MemoryIOSystem(const uint8_t* buff, size_t len, IOSystem* io) - : buffer(buff) - , length(len) - , existing_io(io) - , created_streams() { + MemoryIOSystem(const uint8_t* buff, size_t len, IOSystem* io) : buffer(buff), length(len), existing_io(io) { // empty } @@ -167,6 +162,7 @@ public: // ------------------------------------------------------------------- /** Tests for the existence of a file at the given path. */ bool Exists(const char* pFile) const override { + printf("Exists\n"); if (0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) { return true; } @@ -187,7 +183,7 @@ public: created_streams.emplace_back(new MemoryIOStream(buffer, length)); return created_streams.back(); } - return existing_io ? existing_io->Open(pFile, pMode) : NULL; + return existing_io ? existing_io->Open(pFile, pMode) : nullptr; } // ------------------------------------------------------------------- @@ -246,4 +242,4 @@ private: } // end namespace Assimp -#endif +#endif // AI_MEMORYIOSTREAM_H_INC From b7d08fc8f2f9250de3ecefef49a26367e8ad141a Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 8 Feb 2023 21:48:55 +0100 Subject: [PATCH 068/232] Fix review findings. --- include/assimp/MemoryIOWrapper.h | 61 +++++++++++++++----------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index d52c4384f..720fd8424 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -65,23 +65,21 @@ namespace Assimp { // ---------------------------------------------------------------------------------- class MemoryIOStream : public IOStream { public: - MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) - : buffer (buff) - , length(len) - , pos((size_t)0) - , own(own) { + MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) : + buffer (buff), + length(len), + pos(static_cast(0)), + own(own) { // empty } - ~MemoryIOStream () { + ~MemoryIOStream() override { if(own) { delete[] buffer; } } - // ------------------------------------------------------------------- - // Read from stream - size_t Read(void* pvBuffer, size_t pSize, size_t pCount) { + size_t Read(void* pvBuffer, size_t pSize, size_t pCount) override { ai_assert(nullptr != pvBuffer); ai_assert(0 != pSize); @@ -94,16 +92,12 @@ public: return cnt; } - // ------------------------------------------------------------------- - // Write to stream - size_t Write(const void* /*pvBuffer*/, size_t /*pSize*/,size_t /*pCount*/) { + size_t Write(const void*, size_t, size_t ) override { ai_assert(false); // won't be needed return 0; } - // ------------------------------------------------------------------- - // Seek specific position - aiReturn Seek(size_t pOffset, aiOrigin pOrigin) { + aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override { if (aiOrigin_SET == pOrigin) { if (pOffset > length) { return AI_FAILURE; @@ -123,20 +117,14 @@ public: return AI_SUCCESS; } - // ------------------------------------------------------------------- - // Get current seek position - size_t Tell() const { + size_t Tell() const override { return pos; } - // ------------------------------------------------------------------- - // Get size of file - size_t FileSize() const { + size_t FileSize() const override { return length; } - // ------------------------------------------------------------------- - // Flush file contents void Flush() { ai_assert(false); // won't be needed } @@ -148,19 +136,19 @@ private: }; // --------------------------------------------------------------------------- -/** Dummy IO system to read from a memory buffer */ +/// @brief Dummy IO system to read from a memory buffer. class MemoryIOSystem : public IOSystem { public: - /** Constructor. */ + /// @brief Constructor. MemoryIOSystem(const uint8_t* buff, size_t len, IOSystem* io) : buffer(buff), length(len), existing_io(io) { // empty } - /** Destructor. */ + /// @brief Destructor. ~MemoryIOSystem() = default; // ------------------------------------------------------------------- - /** Tests for the existence of a file at the given path. */ + /// @brief Tests for the existence of a file at the given path. bool Exists(const char* pFile) const override { printf("Exists\n"); if (0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) { @@ -170,14 +158,14 @@ public: } // ------------------------------------------------------------------- - /** Returns the directory separator. */ + /// @brief Returns the directory separator. char getOsSeparator() const override { return existing_io ? existing_io->getOsSeparator() : '/'; // why not? it doesn't care } // ------------------------------------------------------------------- - /** Open a new file with a given path. */ + /// @brief Open a new file with a given path. IOStream* Open(const char* pFile, const char* pMode = "rb") override { if ( 0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) { created_streams.emplace_back(new MemoryIOStream(buffer, length)); @@ -187,7 +175,7 @@ public: } // ------------------------------------------------------------------- - /** Closes the given file and releases all resources associated with it. */ + /// @brief Closes the given file and releases all resources associated with it. void Close( IOStream* pFile) override { auto it = std::find(created_streams.begin(), created_streams.end(), pFile); if (it != created_streams.end()) { @@ -199,36 +187,43 @@ public: } // ------------------------------------------------------------------- - /** Compare two paths */ + /// @brief Compare two paths bool ComparePaths(const char* one, const char* second) const override { return existing_io ? existing_io->ComparePaths(one, second) : false; } - + + /// @brief Will push the directory. bool PushDirectory( const std::string &path ) override { return existing_io ? existing_io->PushDirectory(path) : false; } + /// @brief Will return the current directory from the stack top. const std::string &CurrentDirectory() const override { static std::string empty; return existing_io ? existing_io->CurrentDirectory() : empty; } + /// @brief Returns the stack size. size_t StackSize() const override { return existing_io ? existing_io->StackSize() : 0; } + /// @brief Will pop the upper directory. bool PopDirectory() override { return existing_io ? existing_io->PopDirectory() : false; } + /// @brief Will create the directory. bool CreateDirectory( const std::string &path ) override { return existing_io ? existing_io->CreateDirectory(path) : false; } - + + /// @brief Will change the directory. bool ChangeDirectory( const std::string &path ) override { return existing_io ? existing_io->ChangeDirectory(path) : false; } + /// @brief Will delete the file. bool DeleteFile( const std::string &file ) override { return existing_io ? existing_io->DeleteFile(file) : false; } From 2390822baff6283c8ee2dacb1f5392645487f423 Mon Sep 17 00:00:00 2001 From: jiannanya Date: Thu, 9 Feb 2023 21:30:36 +0800 Subject: [PATCH 069/232] Fix: the member function 'Flush()' of class 'MemoryIOStream' need to be marked as override for msvc clang compiling --- include/assimp/MemoryIOWrapper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index 720fd8424..77071e96f 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -125,7 +125,7 @@ public: return length; } - void Flush() { + void Flush() override{ ai_assert(false); // won't be needed } From 7b3f70a08bfd192242914e25ca9ed482552256eb Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 9 Feb 2023 21:12:21 +0100 Subject: [PATCH 070/232] Add skeleton doc --- include/assimp/mesh.h | 44 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 16cd4fa3c..fd2f3218e 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -952,17 +952,32 @@ struct aiMesh { #endif // __cplusplus }; +* + * @brief A skeleton bone represents a single bone is a skeleton structure. + * + * Skeleton-Animations can be represented via a skeleton struct, which describes + * a hierarchical tree assembled from skeleton bones. A bone is linked to a mesh. + * The bone knows its parent bone. If there is no parent bone the parent id is + * marked with -1. + * The skeleton-bone stores a pointer to its used armature. If there is no + * armature this value if set to nullptr. + * A skeleton bone stores its offset-matrix, which is the absolute transformation + * for the bone. The bone stores the locale transformation to its parent as well. + * You can compute the offset matrix by multiplying the hierarchy like: + * Tree: s1 -> s2 -> s3 + * Offset-Matrix s3 = locale-s3 * locale-s2 * locale-s1 + */ struct aiSkeletonBone { /// The parent bone index, is -1 one if this bone represents the root bone. int mParent; #ifndef ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS - /// The bone armature node - used for skeleton conversion + /// @brief The bone armature node - used for skeleton conversion /// you must enable aiProcess_PopulateArmatureData to populate this C_STRUCT aiNode *mArmature; - /// The bone node in the scene - used for skeleton conversion + /// @brief The bone node in the scene - used for skeleton conversion /// you must enable aiProcess_PopulateArmatureData to populate this C_STRUCT aiNode *mNode; @@ -993,6 +1008,7 @@ struct aiSkeletonBone { C_STRUCT aiMatrix4x4 mLocalMatrix; #ifdef __cplusplus + /// @brief The class constructor. aiSkeletonBone() : mParent(-1), #ifndef ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS @@ -1007,6 +1023,7 @@ struct aiSkeletonBone { // empty } + /// @brief The class destructor. ~aiSkeletonBone() { delete[] mWeights; mWeights = nullptr; @@ -1014,34 +1031,45 @@ struct aiSkeletonBone { #endif // __cplusplus }; /** - * @brief + * @brief A skeleton represents the bone hierarchy of an animation. + * + * Skeleton animations can be described as a tree of bones: + * root + * | + * node1 + * / \ + * node3 node4 + * If you want to calculate the transformation of node three you need to compute the + * transformation hierarchy for the transformation chain of node3: + * root->node1->node3 + * Each node is represented as a skeleton instance. */ struct aiSkeleton { /** - * + * @brief The name of the skeleton instance. */ C_STRUCT aiString mName; /** - * + * @brief The number of bones in the skeleton. */ unsigned int mNumBones; /** - * + * @brief The bone instance in the skeleton. */ C_STRUCT aiSkeletonBone **mBones; #ifdef __cplusplus /** - * + * @brief The class constructor. */ aiSkeleton() AI_NO_EXCEPT : mName(), mNumBones(0), mBones(nullptr) { // empty } /** - * + * @brief The class destructor. */ ~aiSkeleton() { delete[] mBones; From bde9a6a3c384f2c721692ba69915401e80d66ac3 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 9 Feb 2023 22:36:06 +0100 Subject: [PATCH 071/232] Update mesh.h --- include/assimp/mesh.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index fd2f3218e..0f2c4588e 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -952,7 +952,7 @@ struct aiMesh { #endif // __cplusplus }; -* +/** * @brief A skeleton bone represents a single bone is a skeleton structure. * * Skeleton-Animations can be represented via a skeleton struct, which describes From 156a393b84fd28fa1923bddf2655bacdcb061f56 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 10 Feb 2023 08:07:09 +0100 Subject: [PATCH 072/232] Fix a typo --- include/assimp/mesh.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 0f2c4588e..65507532c 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -631,7 +631,9 @@ struct aiMesh { */ C_STRUCT aiVector3D *mVertices; - /** Vertex normals. + /** + * @brief Vertex normals. + * * The array contains normalized vectors, nullptr if not present. * The array is mNumVertices in size. Normals are undefined for * point and line primitives. A mesh consisting of points and @@ -770,7 +772,7 @@ struct aiMesh { #ifdef __cplusplus - //! Default constructor. Initializes all members to 0 + //! The default class constructor. aiMesh() AI_NO_EXCEPT : mPrimitiveTypes(0), mNumVertices(0), @@ -953,7 +955,7 @@ struct aiMesh { }; /** - * @brief A skeleton bone represents a single bone is a skeleton structure. + * @brief A skeleton bone represents a single bone in a aiSkeleton instance. * * Skeleton-Animations can be represented via a skeleton struct, which describes * a hierarchical tree assembled from skeleton bones. A bone is linked to a mesh. From 4c723a4ec862b2c500a82c5ca8b7dbfadd8cf451 Mon Sep 17 00:00:00 2001 From: Shammel Lee Date: Tue, 14 Feb 2023 20:21:33 -0500 Subject: [PATCH 073/232] Fix PyAssimp README typo --- port/PyAssimp/README.md | 2 +- port/PyAssimp/README.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/port/PyAssimp/README.md b/port/PyAssimp/README.md index c9944f717..900003be4 100644 --- a/port/PyAssimp/README.md +++ b/port/PyAssimp/README.md @@ -76,7 +76,7 @@ $ python setup.py install ``` PyAssimp requires a assimp dynamic library (`DLL` on windows, -`.so` on linux, `.dynlib` on macOS) in order to work. The default search directories are: +`.so` on linux, `.dylib` on macOS) in order to work. The default search directories are: - the current directory - on linux additionally: `/usr/lib`, `/usr/local/lib`, `/usr/lib/x86_64-linux-gnu` diff --git a/port/PyAssimp/README.rst b/port/PyAssimp/README.rst index 03b7968f1..45624145f 100644 --- a/port/PyAssimp/README.rst +++ b/port/PyAssimp/README.rst @@ -81,7 +81,7 @@ Install ``pyassimp`` by running: $ python setup.py install PyAssimp requires a assimp dynamic library (``DLL`` on windows, ``.so`` -on linux, ``.dynlib`` on macOS) in order to work. The default search +on linux, ``.dylib`` on macOS) in order to work. The default search directories are: - the current directory From 9898138516083380e16b7f19c28bac9d0fd7fe58 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 15 Feb 2023 21:02:03 +0100 Subject: [PATCH 074/232] Update mesh.h --- include/assimp/mesh.h | 527 ++++++++++++++++++++++++------------------ 1 file changed, 304 insertions(+), 223 deletions(-) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 65507532c..878620e4c 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2022, assimp team +Copyright (c) 2006-2023, assimp team All rights reserved. @@ -111,7 +111,8 @@ extern "C" { #endif // !! AI_MAX_NUMBER_OF_TEXTURECOORDS // --------------------------------------------------------------------------- -/** @brief A single face in a mesh, referring to multiple vertices. +/** + * @brief A single face in a mesh, referring to multiple vertices. * * If mNumIndices is 3, we call the face 'triangle', for mNumIndices > 3 * it's called 'polygon' (hey, that's just a definition!). @@ -142,25 +143,25 @@ struct aiFace { #ifdef __cplusplus - //! Default constructor + //! @brief Default constructor. aiFace() AI_NO_EXCEPT : mNumIndices(0), mIndices(nullptr) { // empty } - //! Default destructor. Delete the index array + //! @brief Default destructor. Delete the index array ~aiFace() { delete[] mIndices; } - //! Copy constructor. Copy the index array + //! @brief Copy constructor. Copy the index array aiFace(const aiFace &o) : mNumIndices(0), mIndices(nullptr) { *this = o; } - //! Assignment operator. Copy the index array + //! @brief Assignment operator. Copy the index array aiFace &operator=(const aiFace &o) { if (&o == this) { return *this; @@ -178,8 +179,7 @@ struct aiFace { return *this; } - //! Comparison operator. Checks whether the index array - //! of two faces is identical + //! @brief Comparison operator. Checks whether the index array of two faces is identical. bool operator==(const aiFace &o) const { if (mIndices == o.mIndices) { return true; @@ -202,7 +202,7 @@ struct aiFace { return true; } - //! Inverse comparison operator. Checks whether the index + //! @brief Inverse comparison operator. Checks whether the index //! array of two faces is NOT identical bool operator!=(const aiFace &o) const { return !(*this == o); @@ -223,14 +223,14 @@ struct aiVertexWeight { #ifdef __cplusplus - //! Default constructor + //! @brief Default constructor aiVertexWeight() AI_NO_EXCEPT : mVertexId(0), mWeight(0.0f) { // empty } - //! Initialization from a given index and vertex weight factor + //! @brief Initialization from a given index and vertex weight factor //! \param pID ID //! \param pWeight Vertex weight factor aiVertexWeight(unsigned int pID, float pWeight) : @@ -261,27 +261,38 @@ struct aiNode; * position of the bone at the time of binding. */ struct aiBone { - //! The name of the bone. + /** + * The name of the bone. + */ C_STRUCT aiString mName; - //! The number of vertices affected by this bone. - //! The maximum value for this member is #AI_MAX_BONE_WEIGHTS. + /** + * The number of vertices affected by this bone. + * The maximum value for this member is #AI_MAX_BONE_WEIGHTS. + */ unsigned int mNumWeights; #ifndef ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS - /// The bone armature node - used for skeleton conversion - /// you must enable aiProcess_PopulateArmatureData to populate this + /** + * The bone armature node - used for skeleton conversion + * you must enable aiProcess_PopulateArmatureData to populate this + */ C_STRUCT aiNode *mArmature; - /// The bone node in the scene - used for skeleton conversion - /// you must enable aiProcess_PopulateArmatureData to populate this + /** + * The bone node in the scene - used for skeleton conversion + * you must enable aiProcess_PopulateArmatureData to populate this + */ C_STRUCT aiNode *mNode; #endif - //! The influence weights of this bone, by vertex index. + /** + * The influence weights of this bone, by vertex index. + */ C_STRUCT aiVertexWeight *mWeights; - /** Matrix that transforms from mesh space to bone space in bind pose. + /** + * Matrix that transforms from mesh space to bone space in bind pose. * * This matrix describes the position of the mesh * in the local space of this bone when the skeleton was bound. @@ -338,7 +349,7 @@ struct aiBone { ::memcpy(mWeights, other.mWeights, mNumWeights * sizeof(aiVertexWeight)); } - //! Assignment operator + //! @brief Assignment operator aiBone &operator = (const aiBone &other) { if (this == &other) { return *this; @@ -352,6 +363,7 @@ struct aiBone { return *this; } + /// @brief Compare operator. bool operator==(const aiBone &rhs) const { if (mName != rhs.mName || mNumWeights != rhs.mNumWeights ) { return false; @@ -365,7 +377,7 @@ struct aiBone { return true; } - //! Destructor - deletes the array of vertex weights + //! @brief Destructor - deletes the array of vertex weights ~aiBone() { delete[] mWeights; } @@ -381,27 +393,31 @@ struct aiBone { * @see AI_CONFIG_PP_SBP_REMOVE Removal of specific primitive types. */ enum aiPrimitiveType { - /** A point primitive. + /** + * @brief A point primitive. * * This is just a single vertex in the virtual world, * #aiFace contains just one index for such a primitive. */ aiPrimitiveType_POINT = 0x1, - /** A line primitive. + /** + * @brief A line primitive. * * This is a line defined through a start and an end position. * #aiFace contains exactly two indices for such a primitive. */ aiPrimitiveType_LINE = 0x2, - /** A triangular primitive. + /** + * @brief A triangular primitive. * * A triangle consists of three indices. */ aiPrimitiveType_TRIANGLE = 0x4, - /** A higher-level polygon with more than 3 edges. + /** + * @brief A higher-level polygon with more than 3 edges. * * A triangle is a polygon, but polygon in this context means * "all polygons that are not triangles". The "Triangulate"-Step @@ -411,7 +427,7 @@ enum aiPrimitiveType { aiPrimitiveType_POLYGON = 0x8, /** - * A flag to determine whether this triangles only mesh is NGON encoded. + * @brief A flag to determine whether this triangles only mesh is NGON encoded. * * NGON encoding is a special encoding that tells whether 2 or more consecutive triangles * should be considered as a triangle fan. This is identified by looking at the first vertex index. @@ -428,8 +444,9 @@ enum aiPrimitiveType { */ aiPrimitiveType_NGONEncodingFlag = 0x10, -/** This value is not used. It is just here to force the - * compiler to map this enum to a 32 Bit integer. + /** + * This value is not used. It is just here to force the + * compiler to map this enum to a 32 Bit integer. */ #ifndef SWIG _aiPrimitiveType_Force32Bit = INT_MAX @@ -494,25 +511,20 @@ struct aiAnimMesh { float mWeight; #ifdef __cplusplus - - aiAnimMesh() AI_NO_EXCEPT - : mVertices(nullptr), - mNormals(nullptr), - mTangents(nullptr), - mBitangents(nullptr), - mColors(), - mTextureCoords(), - mNumVertices(0), - mWeight(0.0f) { - // fixme consider moving this to the ctor initializer list as well - for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++) { - mTextureCoords[a] = nullptr; - } - for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++) { - mColors[a] = nullptr; - } + /// @brief The class constructor. + aiAnimMesh() AI_NO_EXCEPT : + mVertices(nullptr), + mNormals(nullptr), + mTangents(nullptr), + mBitangents(nullptr), + mColors {nullptr}, + mTextureCoords{nullptr}, + mNumVertices(0), + mWeight(0.0f) { + // empty } + /// @brief The class destructor. ~aiAnimMesh() { delete[] mVertices; delete[] mNormals; @@ -526,35 +538,51 @@ struct aiAnimMesh { } } - /** Check whether the anim mesh overrides the vertex positions - * of its host mesh*/ + /** + * @brief Check whether the anim-mesh overrides the vertex positions + * of its host mesh. + * @return true if positions are stored, false if not. + */ bool HasPositions() const { return mVertices != nullptr; } - /** Check whether the anim mesh overrides the vertex normals - * of its host mesh*/ + /** + * @brief Check whether the anim-mesh overrides the vertex normals + * of its host mesh + * @return true if normals are stored, false if not. + */ bool HasNormals() const { return mNormals != nullptr; } - /** Check whether the anim mesh overrides the vertex tangents - * and bitangents of its host mesh. As for aiMesh, - * tangents and bitangents always go together. */ + /** + * @brief Check whether the anim-mesh overrides the vertex tangents + * and bitangents of its host mesh. As for aiMesh, + * tangents and bitangents always go together. + * @return true if tangents and bi-tangents are stored, false if not. + */ bool HasTangentsAndBitangents() const { return mTangents != nullptr; } - /** Check whether the anim mesh overrides a particular - * set of vertex colors on his host mesh. - * @param pIndex 0= AI_MAX_NUMBER_OF_COLOR_SETS ? false : mColors[pIndex] != nullptr; } - /** Check whether the anim mesh overrides a particular - * set of texture coordinates on his host mesh. - * @param pIndex 0= AI_MAX_NUMBER_OF_TEXTURECOORDS ? false : mTextureCoords[pIndex] != nullptr; } @@ -588,145 +616,167 @@ enum aiMorphingMethod { // --------------------------------------------------------------------------- /** @brief A mesh represents a geometry or model with a single material. -* -* It usually consists of a number of vertices and a series of primitives/faces -* referencing the vertices. In addition there might be a series of bones, each -* of them addressing a number of vertices with a certain weight. Vertex data -* is presented in channels with each channel containing a single per-vertex -* information such as a set of texture coordinates or a normal vector. -* If a data pointer is non-null, the corresponding data stream is present. -* From C++-programs you can also use the comfort functions Has*() to -* test for the presence of various data streams. -* -* A Mesh uses only a single material which is referenced by a material ID. -* @note The mPositions member is usually not optional. However, vertex positions -* *could* be missing if the #AI_SCENE_FLAGS_INCOMPLETE flag is set in -* @code -* aiScene::mFlags -* @endcode -*/ + * + * It usually consists of a number of vertices and a series of primitives/faces + * referencing the vertices. In addition there might be a series of bones, each + * of them addressing a number of vertices with a certain weight. Vertex data + * is presented in channels with each channel containing a single per-vertex + * information such as a set of texture coordinates or a normal vector. + * If a data pointer is non-null, the corresponding data stream is present. + * From C++-programs you can also use the comfort functions Has*() to + * test for the presence of various data streams. + * + * A Mesh uses only a single material which is referenced by a material ID. + * @note The mPositions member is usually not optional. However, vertex positions + * *could* be missing if the #AI_SCENE_FLAGS_INCOMPLETE flag is set in + * @code + * aiScene::mFlags + * @endcode + */ struct aiMesh { - /** Bitwise combination of the members of the #aiPrimitiveType enum. + /** + * Bitwise combination of the members of the #aiPrimitiveType enum. * This specifies which types of primitives are present in the mesh. * The "SortByPrimitiveType"-Step can be used to make sure the * output meshes consist of one primitive type each. */ unsigned int mPrimitiveTypes; - /** The number of vertices in this mesh. - * This is also the size of all of the per-vertex data arrays. - * The maximum value for this member is #AI_MAX_VERTICES. - */ + /** + * The number of vertices in this mesh. + * This is also the size of all of the per-vertex data arrays. + * The maximum value for this member is #AI_MAX_VERTICES. + */ unsigned int mNumVertices; - /** The number of primitives (triangles, polygons, lines) in this mesh. - * This is also the size of the mFaces array. - * The maximum value for this member is #AI_MAX_FACES. - */ + /** + * The number of primitives (triangles, polygons, lines) in this mesh. + * This is also the size of the mFaces array. + * The maximum value for this member is #AI_MAX_FACES. + */ unsigned int mNumFaces; - /** Vertex positions. - * This array is always present in a mesh. The array is - * mNumVertices in size. - */ + /** + * @brief Vertex positions. + * + * This array is always present in a mesh. The array is + * mNumVertices in size. + */ C_STRUCT aiVector3D *mVertices; - /** - * @brief Vertex normals. - * - * The array contains normalized vectors, nullptr if not present. - * The array is mNumVertices in size. Normals are undefined for - * point and line primitives. A mesh consisting of points and - * lines only may not have normal vectors. Meshes with mixed - * primitive types (i.e. lines and triangles) may have normals, - * but the normals for vertices that are only referenced by - * point or line primitives are undefined and set to QNaN (WARN: - * qNaN compares to inequal to *everything*, even to qNaN itself. - * Using code like this to check whether a field is qnan is: - * @code - * #define IS_QNAN(f) (f != f) - * @endcode - * still dangerous because even 1.f == 1.f could evaluate to false! ( - * remember the subtleties of IEEE754 artithmetics). Use stuff like - * @c fpclassify instead. - * @note Normal vectors computed by Assimp are always unit-length. - * However, this needn't apply for normals that have been taken - * directly from the model file. - */ + /** + * @brief Vertex normals. + * + * The array contains normalized vectors, nullptr if not present. + * The array is mNumVertices in size. Normals are undefined for + * point and line primitives. A mesh consisting of points and + * lines only may not have normal vectors. Meshes with mixed + * primitive types (i.e. lines and triangles) may have normals, + * but the normals for vertices that are only referenced by + * point or line primitives are undefined and set to QNaN (WARN: + * qNaN compares to inequal to *everything*, even to qNaN itself. + * Using code like this to check whether a field is qnan is: + * @code + * #define IS_QNAN(f) (f != f) + * @endcode + * still dangerous because even 1.f == 1.f could evaluate to false! ( + * remember the subtleties of IEEE754 artithmetics). Use stuff like + * @c fpclassify instead. + * @note Normal vectors computed by Assimp are always unit-length. + * However, this needn't apply for normals that have been taken + * directly from the model file. + */ C_STRUCT aiVector3D *mNormals; - /** Vertex tangents. - * The tangent of a vertex points in the direction of the positive - * X texture axis. The array contains normalized vectors, nullptr if - * not present. The array is mNumVertices in size. A mesh consisting - * of points and lines only may not have normal vectors. Meshes with - * mixed primitive types (i.e. lines and triangles) may have - * normals, but the normals for vertices that are only referenced by - * point or line primitives are undefined and set to qNaN. See - * the #mNormals member for a detailed discussion of qNaNs. - * @note If the mesh contains tangents, it automatically also - * contains bitangents. - */ + /** + * @brief Vertex tangents. + * + * The tangent of a vertex points in the direction of the positive + * X texture axis. The array contains normalized vectors, nullptr if + * not present. The array is mNumVertices in size. A mesh consisting + * of points and lines only may not have normal vectors. Meshes with + * mixed primitive types (i.e. lines and triangles) may have + * normals, but the normals for vertices that are only referenced by + * point or line primitives are undefined and set to qNaN. See + * the #mNormals member for a detailed discussion of qNaNs. + * @note If the mesh contains tangents, it automatically also + * contains bitangents. + */ C_STRUCT aiVector3D *mTangents; - /** Vertex bitangents. - * The bitangent of a vertex points in the direction of the positive - * Y texture axis. The array contains normalized vectors, nullptr if not - * present. The array is mNumVertices in size. - * @note If the mesh contains tangents, it automatically also contains - * bitangents. - */ + /** + * @brief Vertex bitangents. + * + * The bitangent of a vertex points in the direction of the positive + * Y texture axis. The array contains normalized vectors, nullptr if not + * present. The array is mNumVertices in size. + * @note If the mesh contains tangents, it automatically also contains + * bitangents. + */ C_STRUCT aiVector3D *mBitangents; - /** Vertex color sets. - * A mesh may contain 0 to #AI_MAX_NUMBER_OF_COLOR_SETS vertex - * colors per vertex. nullptr if not present. Each array is - * mNumVertices in size if present. - */ + /** + * @brief Vertex color sets. + * + * A mesh may contain 0 to #AI_MAX_NUMBER_OF_COLOR_SETS vertex + * colors per vertex. nullptr if not present. Each array is + * mNumVertices in size if present. + */ C_STRUCT aiColor4D *mColors[AI_MAX_NUMBER_OF_COLOR_SETS]; - /** Vertex texture coordinates, also known as UV channels. - * A mesh may contain 0 to AI_MAX_NUMBER_OF_TEXTURECOORDS per - * vertex. nullptr if not present. The array is mNumVertices in size. - */ + /** + * @brief Vertex texture coordinates, also known as UV channels. + * + * A mesh may contain 0 to AI_MAX_NUMBER_OF_TEXTURECOORDS per + * vertex. nullptr if not present. The array is mNumVertices in size. + */ C_STRUCT aiVector3D *mTextureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; - /** Specifies the number of components for a given UV channel. - * Up to three channels are supported (UVW, for accessing volume - * or cube maps). If the value is 2 for a given channel n, the - * component p.z of mTextureCoords[n][p] is set to 0.0f. - * If the value is 1 for a given channel, p.y is set to 0.0f, too. - * @note 4D coordinates are not supported - */ + /** + * @brief Specifies the number of components for a given UV channel. + * + * Up to three channels are supported (UVW, for accessing volume + * or cube maps). If the value is 2 for a given channel n, the + * component p.z of mTextureCoords[n][p] is set to 0.0f. + * If the value is 1 for a given channel, p.y is set to 0.0f, too. + * @note 4D coordinates are not supported + */ unsigned int mNumUVComponents[AI_MAX_NUMBER_OF_TEXTURECOORDS]; - /** The faces the mesh is constructed from. - * Each face refers to a number of vertices by their indices. - * This array is always present in a mesh, its size is given - * in mNumFaces. If the #AI_SCENE_FLAGS_NON_VERBOSE_FORMAT - * is NOT set each face references an unique set of vertices. - */ + /** + * @brief The faces the mesh is constructed from. + * + * Each face refers to a number of vertices by their indices. + * This array is always present in a mesh, its size is given + * in mNumFaces. If the #AI_SCENE_FLAGS_NON_VERBOSE_FORMAT + * is NOT set each face references an unique set of vertices. + */ C_STRUCT aiFace *mFaces; - /** The number of bones this mesh contains. - * Can be 0, in which case the mBones array is nullptr. + /** + * The number of bones this mesh contains. Can be 0, in which case the mBones array is nullptr. */ unsigned int mNumBones; - /** The bones of this mesh. - * A bone consists of a name by which it can be found in the - * frame hierarchy and a set of vertex weights. - */ + /** + * @brief The bones of this mesh. + * + * A bone consists of a name by which it can be found in the + * frame hierarchy and a set of vertex weights. + */ C_STRUCT aiBone **mBones; - /** The material used by this mesh. + /** + * @brief The material used by this mesh. + * * A mesh uses only a single material. If an imported model uses * multiple materials, the import splits up the mesh. Use this value * as index into the scene's material list. */ unsigned int mMaterialIndex; - /** Name of the mesh. Meshes can be named, but this is not a + /** + * Name of the mesh. Meshes can be named, but this is not a * requirement and leaving this field empty is totally fine. * There are mainly three uses for mesh names: * - some formats name nodes and meshes independently. @@ -736,22 +786,24 @@ struct aiMesh { * aids the caller at recovering the original mesh * partitioning. * - Vertex animations refer to meshes by their names. - **/ + */ C_STRUCT aiString mName; - /** The number of attachment meshes. - * Currently known to work with loaders: - * - Collada - * - gltf + /** + * The number of attachment meshes. + * Currently known to work with loaders: + * - Collada + * - gltf */ unsigned int mNumAnimMeshes; - /** Attachment meshes for this mesh, for vertex-based animation. - * Attachment meshes carry replacement data for some of the - * mesh'es vertex components (usually positions, normals). - * Currently known to work with loaders: - * - Collada - * - gltf + /** + * Attachment meshes for this mesh, for vertex-based animation. + * Attachment meshes carry replacement data for some of the + * mesh'es vertex components (usually positions, normals). + * Currently known to work with loaders: + * - Collada + * - gltf */ C_STRUCT aiAnimMesh **mAnimMeshes; @@ -766,7 +818,8 @@ struct aiMesh { */ C_STRUCT aiAABB mAABB; - /** Vertex UV stream names. Pointer to array of size AI_MAX_NUMBER_OF_TEXTURECOORDS + /** + * Vertex UV stream names. Pointer to array of size AI_MAX_NUMBER_OF_TEXTURECOORDS */ C_STRUCT aiString **mTextureCoordsNames; @@ -781,9 +834,9 @@ struct aiMesh { mNormals(nullptr), mTangents(nullptr), mBitangents(nullptr), - mColors(), - mTextureCoords(), - mNumUVComponents(), + mColors{nullptr}, + mTextureCoords{nullptr}, + mNumUVComponents{0}, mFaces(nullptr), mNumBones(0), mBones(nullptr), @@ -793,17 +846,10 @@ struct aiMesh { mMethod(aiMorphingMethod_UNKNOWN), mAABB(), mTextureCoordsNames(nullptr) { - for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) { - mNumUVComponents[a] = 0; - mTextureCoords[a] = nullptr; - } - - for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a) { - mColors[a] = nullptr; - } + // empty } - //! Deletes all storage allocated for the mesh + //! @brief The class destructor. ~aiMesh() { delete[] mVertices; delete[] mNormals; @@ -844,44 +890,58 @@ struct aiMesh { delete[] mFaces; } - //! Check whether the mesh contains positions. Provided no special - //! scene flags are set, this will always be true - bool HasPositions() const { return mVertices != nullptr && mNumVertices > 0; } + //! @brief Check whether the mesh contains positions. Provided no special + //! scene flags are set, this will always be true + //! @return true, if positions are stored, false if not. + bool HasPositions() const { + return mVertices != nullptr && mNumVertices > 0; + } - //! Check whether the mesh contains faces. If no special scene flags - //! are set this should always return true - bool HasFaces() const { return mFaces != nullptr && mNumFaces > 0; } + //! @brief Check whether the mesh contains faces. If no special scene flags + //! are set this should always return true + //! @return true, if faces are stored, false if not. + bool HasFaces() const { + return mFaces != nullptr && mNumFaces > 0; + } - //! Check whether the mesh contains normal vectors - bool HasNormals() const { return mNormals != nullptr && mNumVertices > 0; } + //! @brief Check whether the mesh contains normal vectors + //! @return true, if normals are stored, false if not. + bool HasNormals() const { + return mNormals != nullptr && mNumVertices > 0; + } - //! Check whether the mesh contains tangent and bitangent vectors + //! @brief Check whether the mesh contains tangent and bitangent vectors. + //! //! It is not possible that it contains tangents and no bitangents //! (or the other way round). The existence of one of them //! implies that the second is there, too. - bool HasTangentsAndBitangents() const { return mTangents != nullptr && mBitangents != nullptr && mNumVertices > 0; } - - //! Check whether the mesh contains a vertex color set - //! \param pIndex Index of the vertex color set - bool HasVertexColors(unsigned int pIndex) const { - if (pIndex >= AI_MAX_NUMBER_OF_COLOR_SETS) { - return false; - } else { - return mColors[pIndex] != nullptr && mNumVertices > 0; - } + //! @return true, if tangents and bi-tangents are stored, false if not. + bool HasTangentsAndBitangents() const { + return mTangents != nullptr && mBitangents != nullptr && mNumVertices > 0; } - //! Check whether the mesh contains a texture coordinate set - //! \param pIndex Index of the texture coordinates set - bool HasTextureCoords(unsigned int pIndex) const { - if (pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS) { + //! @brief Check whether the mesh contains a vertex color set + //! @param index Index of the vertex color set + //! @return true, if vertex colors are stored, false if not. + bool HasVertexColors(unsigned int index) const { + if (index >= AI_MAX_NUMBER_OF_COLOR_SETS) { return false; - } else { - return mTextureCoords[pIndex] != nullptr && mNumVertices > 0; } + return mColors[index] != nullptr && mNumVertices > 0; } - //! Get the number of UV channels the mesh contains + //! @brief Check whether the mesh contains a texture coordinate set + //! @param index Index of the texture coordinates set + //! @return true, if texture coordinates are stored, false if not. + bool HasTextureCoords(unsigned int index) const { + if (index >= AI_MAX_NUMBER_OF_TEXTURECOORDS) { + return false; + } + return (mTextureCoords[index] != nullptr && mNumVertices > 0); + } + + //! @brief Get the number of UV channels the mesh contains. + //! @return the number of stored uv-channels. unsigned int GetNumUVChannels() const { unsigned int n(0); while (n < AI_MAX_NUMBER_OF_TEXTURECOORDS && mTextureCoords[n]) { @@ -891,7 +951,8 @@ struct aiMesh { return n; } - //! Get the number of vertex color channels the mesh contains + //! @brief Get the number of vertex color channels the mesh contains. + //! @return The number of stored color channels. unsigned int GetNumColorChannels() const { unsigned int n(0); while (n < AI_MAX_NUMBER_OF_COLOR_SETS && mColors[n]) { @@ -900,13 +961,15 @@ struct aiMesh { return n; } - //! Check whether the mesh contains bones + //! @brief Check whether the mesh contains bones. + //! @return true, if bones are stored. bool HasBones() const { return mBones != nullptr && mNumBones > 0; } - //! Check whether the mesh contains a texture coordinate set name - //! \param pIndex Index of the texture coordinates set + //! @brief Check whether the mesh contains a texture coordinate set name + //! @param pIndex Index of the texture coordinates set + //! @return true, if texture coordinates for the index exists. bool HasTextureCoordsName(unsigned int pIndex) const { if (mTextureCoordsNames == nullptr || pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS) { return false; @@ -914,9 +977,9 @@ struct aiMesh { return mTextureCoordsNames[pIndex] != nullptr; } - //! Set a texture coordinate set name - //! \param pIndex Index of the texture coordinates set - //! \param texCoordsName name of the texture coordinate set + //! @brief Set a texture coordinate set name + //! @param pIndex Index of the texture coordinates set + //! @param texCoordsName name of the texture coordinate set void SetTextureCoordsName(unsigned int pIndex, const aiString &texCoordsName) { if (pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS) { return; @@ -941,21 +1004,22 @@ struct aiMesh { *mTextureCoordsNames[pIndex] = texCoordsName; } - //! Get a texture coordinate set name - //! \param pIndex Index of the texture coordinates set - const aiString *GetTextureCoordsName(unsigned int pIndex) const { - if (mTextureCoordsNames == nullptr || pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS) { + //! @brief Get a texture coordinate set name + //! @param pIndex Index of the texture coordinates set + //! @return The texture coordinate name. + const aiString *GetTextureCoordsName(unsigned int index) const { + if (mTextureCoordsNames == nullptr || index >= AI_MAX_NUMBER_OF_TEXTURECOORDS) { return nullptr; } - return mTextureCoordsNames[pIndex]; + return mTextureCoordsNames[index]; } #endif // __cplusplus }; /** - * @brief A skeleton bone represents a single bone in a aiSkeleton instance. + * @brief A skeleton bone represents a single bone is a skeleton structure. * * Skeleton-Animations can be represented via a skeleton struct, which describes * a hierarchical tree assembled from skeleton bones. A bone is linked to a mesh. @@ -1025,6 +1089,21 @@ struct aiSkeletonBone { // empty } + /// @brief The class constructor with its parent + /// @param parent The parent node index. + aiSkeletonBone(unsigned int parent) : + mParent(parent), +#ifndef ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS + mArmature(nullptr), + mNode(nullptr), +#endif + mNumnWeights(0), + mMeshId(nullptr), + mWeights(nullptr), + mOffsetMatrix(), + mLocalMatrix() { + // empty + } /// @brief The class destructor. ~aiSkeletonBone() { delete[] mWeights; @@ -1081,4 +1160,6 @@ struct aiSkeleton { #ifdef __cplusplus } #endif //! extern "C" + #endif // AI_MESH_H_INC + From bc8a122d88fa01f521cd41660c0945de7a8fb7b7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 16 Feb 2023 09:28:35 +0100 Subject: [PATCH 075/232] Review finding: Use constexpr instead of macro --- code/PostProcessing/JoinVerticesProcess.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index 91f305b2d..10872cdb7 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -252,7 +252,8 @@ private: unsigned mNumColorChannels; }; -#define JOINED_VERTICES_MARK 0x80000000u +static constexpr siue_T JOINED_VERTICES_MARK = 0x80000000u; + // now start the JoinVerticesProcess int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { static_assert( AI_MAX_NUMBER_OF_COLOR_SETS == 8, "AI_MAX_NUMBER_OF_COLOR_SETS == 8"); From 7877dab43a1c393177fe9563c0aed0065ffa3044 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 16 Feb 2023 10:59:36 +0100 Subject: [PATCH 076/232] Fix: Fix typo --- code/PostProcessing/JoinVerticesProcess.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index 10872cdb7..d36915e0c 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -55,13 +55,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include using namespace Assimp; -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -JoinVerticesProcess::JoinVerticesProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -JoinVerticesProcess::~JoinVerticesProcess() = default; // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. @@ -252,7 +245,7 @@ private: unsigned mNumColorChannels; }; -static constexpr siue_T JOINED_VERTICES_MARK = 0x80000000u; +static constexpr size_t JOINED_VERTICES_MARK = 0x80000000u; // now start the JoinVerticesProcess int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { From 3585dd577dde0106c5802d841475c6cd6d53931d Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 16 Feb 2023 11:19:23 +0100 Subject: [PATCH 077/232] Fix: Add default parameter to constructor/destructor. --- code/PostProcessing/JoinVerticesProcess.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.h b/code/PostProcessing/JoinVerticesProcess.h index f95236e31..b05d74ef5 100644 --- a/code/PostProcessing/JoinVerticesProcess.h +++ b/code/PostProcessing/JoinVerticesProcess.h @@ -64,8 +64,13 @@ namespace Assimp */ class ASSIMP_API JoinVerticesProcess : public BaseProcess { public: - JoinVerticesProcess(); - ~JoinVerticesProcess(); + // ------------------------------------------------------------------- + /// @brief The default class constructor. + JoinVerticesProcess() = default; + + // ------------------------------------------------------------------- + /// @brief The default class destructor. + ~JoinVerticesProcess() = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. From 2cd3da4831cf379896f7dede82849e6507812091 Mon Sep 17 00:00:00 2001 From: Anton Vaneev Date: Thu, 16 Feb 2023 11:21:29 +0100 Subject: [PATCH 078/232] Fix a leak in FBXDocument when duplicate object IDs are found When a duplicate ID is encountered, existing LazyObject is overwritten. Previously allocated instance leaks. This change deletes the previously allocated instance before overwriting the pointer. --- code/AssetLib/FBX/FBXDocument.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXDocument.cpp b/code/AssetLib/FBX/FBXDocument.cpp index a71c4b959..ea39a9a00 100644 --- a/code/AssetLib/FBX/FBXDocument.cpp +++ b/code/AssetLib/FBX/FBXDocument.cpp @@ -381,8 +381,10 @@ void Document::ReadObjects() { DOMError("encountered object with implicitly defined id 0",el.second); } - if(objects.find(id) != objects.end()) { + const auto foundObject = objects.find(id); + if(foundObject != objects.end()) { DOMWarning("encountered duplicate object id, ignoring first occurrence",el.second); + delete foundObject->second; } objects[id] = new LazyObject(id, *el.second, *this); From e4386d3013ab9d3a9b33988918aa74e5c5efe2a0 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Thu, 16 Feb 2023 15:16:54 -0800 Subject: [PATCH 079/232] Fix implicit conversion errors on macOS --- code/AssetLib/MDL/MDLLoader.cpp | 2 +- code/AssetLib/SMD/SMDLoader.cpp | 2 +- code/AssetLib/glTF2/glTF2AssetWriter.inl | 4 ++-- contrib/zip/src/miniz.h | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/MDL/MDLLoader.cpp b/code/AssetLib/MDL/MDLLoader.cpp index b60657805..d862ccaf4 100644 --- a/code/AssetLib/MDL/MDLLoader.cpp +++ b/code/AssetLib/MDL/MDLLoader.cpp @@ -975,7 +975,7 @@ void MDLImporter::CalcAbsBoneMatrices_3DGS_MDL7(MDL::IntBone_MDL7 **apcOutBones) } // store the name of the bone - pcOutBone->mName.length = (size_t)iMaxLen; + pcOutBone->mName.length = (ai_uint32)iMaxLen; ::memcpy(pcOutBone->mName.data, pcBone->name, pcOutBone->mName.length); pcOutBone->mName.data[pcOutBone->mName.length] = '\0'; } diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index dd1f56dc3..bb26eb88c 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -590,7 +590,7 @@ void SMDImporter::CreateOutputMaterials() { pScene->mMaterials[iMat] = pcMat; aiString szName; - szName.length = (size_t)ai_snprintf(szName.data,MAXLEN,"Texture_%u",iMat); + szName.length = (ai_uint32)ai_snprintf(szName.data,MAXLEN,"Texture_%u",iMat); pcMat->AddProperty(&szName,AI_MATKEY_NAME); if (aszTextures[iMat].length()) diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index 868d9cbdf..6bec0fb55 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -836,7 +836,7 @@ namespace glTF2 { throw DeadlyExportError("Failed to write scene data!"); } - uint32_t jsonChunkLength = (docBuffer.GetSize() + 3) & ~3; // Round up to next multiple of 4 + uint32_t jsonChunkLength = (uint32_t)((docBuffer.GetSize() + 3) & ~3); // Round up to next multiple of 4 auto paddingLength = jsonChunkLength - docBuffer.GetSize(); GLB_Chunk jsonChunk; @@ -862,7 +862,7 @@ namespace glTF2 { int GLB_Chunk_count = 1; uint32_t binaryChunkLength = 0; if (bodyBuffer->byteLength > 0) { - binaryChunkLength = (bodyBuffer->byteLength + 3) & ~3; // Round up to next multiple of 4 + binaryChunkLength = (uint32_t)((bodyBuffer->byteLength + 3) & ~3); // Round up to next multiple of 4 auto curPaddingLength = binaryChunkLength - bodyBuffer->byteLength; ++GLB_Chunk_count; diff --git a/contrib/zip/src/miniz.h b/contrib/zip/src/miniz.h index 0a5560b24..7a6ff8d1a 100644 --- a/contrib/zip/src/miniz.h +++ b/contrib/zip/src/miniz.h @@ -6092,8 +6092,8 @@ mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip) { if (!pZip->m_file_offset_alignment) return 0; n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1)); - return (pZip->m_file_offset_alignment - n) & - (pZip->m_file_offset_alignment - 1); + return (mz_uint)((pZip->m_file_offset_alignment - n) & + (pZip->m_file_offset_alignment - 1)); } static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, From 53e5f19b14acb4f0dd4c123f607b256e51923f4a Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 17 Feb 2023 11:20:00 -0800 Subject: [PATCH 080/232] Use C++ style casts --- code/AssetLib/MDL/MDLLoader.cpp | 2 +- code/AssetLib/SMD/SMDLoader.cpp | 2 +- code/AssetLib/glTF2/glTF2AssetWriter.inl | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/MDL/MDLLoader.cpp b/code/AssetLib/MDL/MDLLoader.cpp index d862ccaf4..76b61cda5 100644 --- a/code/AssetLib/MDL/MDLLoader.cpp +++ b/code/AssetLib/MDL/MDLLoader.cpp @@ -975,7 +975,7 @@ void MDLImporter::CalcAbsBoneMatrices_3DGS_MDL7(MDL::IntBone_MDL7 **apcOutBones) } // store the name of the bone - pcOutBone->mName.length = (ai_uint32)iMaxLen; + pcOutBone->mName.length = static_cast(iMaxLen); ::memcpy(pcOutBone->mName.data, pcBone->name, pcOutBone->mName.length); pcOutBone->mName.data[pcOutBone->mName.length] = '\0'; } diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index bb26eb88c..1c73c7e66 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -590,7 +590,7 @@ void SMDImporter::CreateOutputMaterials() { pScene->mMaterials[iMat] = pcMat; aiString szName; - szName.length = (ai_uint32)ai_snprintf(szName.data,MAXLEN,"Texture_%u",iMat); + szName.length = static_cast(ai_snprintf(szName.data,MAXLEN,"Texture_%u",iMat)); pcMat->AddProperty(&szName,AI_MATKEY_NAME); if (aszTextures[iMat].length()) diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index 6bec0fb55..6f6eda502 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -836,7 +836,7 @@ namespace glTF2 { throw DeadlyExportError("Failed to write scene data!"); } - uint32_t jsonChunkLength = (uint32_t)((docBuffer.GetSize() + 3) & ~3); // Round up to next multiple of 4 + uint32_t jsonChunkLength = static_cast((docBuffer.GetSize() + 3) & ~3); // Round up to next multiple of 4 auto paddingLength = jsonChunkLength - docBuffer.GetSize(); GLB_Chunk jsonChunk; @@ -862,7 +862,7 @@ namespace glTF2 { int GLB_Chunk_count = 1; uint32_t binaryChunkLength = 0; if (bodyBuffer->byteLength > 0) { - binaryChunkLength = (uint32_t)((bodyBuffer->byteLength + 3) & ~3); // Round up to next multiple of 4 + binaryChunkLength = static_cast((bodyBuffer->byteLength + 3) & ~3); // Round up to next multiple of 4 auto curPaddingLength = binaryChunkLength - bodyBuffer->byteLength; ++GLB_Chunk_count; From 3ad67771fe036c0027c5512d58c02a7c179b9941 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 18 Feb 2023 17:09:14 +0100 Subject: [PATCH 081/232] Add missing pod types. --- CMakeLists.txt | 16 ++++++++++++---- include/assimp/metadata.h | 38 +++++++++++++++++++++++++++++++++++++- test/unit/utMetadata.cpp | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e859986b7..0f0e5a793 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,10 +84,6 @@ OPTION( ASSIMP_NO_EXPORT "Disable Assimp's export functionality." OFF ) -OPTION( ASSIMP_BUILD_ZLIB - "Build your own zlib" - OFF -) OPTION( ASSIMP_BUILD_ASSIMP_TOOLS "If the supplementary tools for Assimp are built in addition to the library." OFF @@ -134,6 +130,18 @@ OPTION ( ASSIMP_IGNORE_GIT_HASH OFF ) +IF (WIN32) + OPTION( ASSIMP_BUILD_ZLIB + "Build your own zlib" + ON + ) +ELSE() + OPTION( ASSIMP_BUILD_ZLIB + "Build your own zlib" + OFF + ) +ENDIF() + IF (WIN32) # Use subset of Windows.h ADD_DEFINITIONS( -DWIN32_LEAN_AND_MEAN ) diff --git a/include/assimp/metadata.h b/include/assimp/metadata.h index d2ec837e9..c766d0ae2 100644 --- a/include/assimp/metadata.h +++ b/include/assimp/metadata.h @@ -56,6 +56,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #endif +#include + // ------------------------------------------------------------------------------- /** * Enum used to distinguish data types @@ -70,7 +72,9 @@ typedef enum aiMetadataType { AI_AISTRING = 5, AI_AIVECTOR3D = 6, AI_AIMETADATA = 7, - AI_META_MAX = 8, + AI_INT64 = 8, + AI_UINT32 = 9, + AI_META_MAX = 10, #ifndef SWIG FORCE_32BIT = INT_MAX @@ -133,6 +137,12 @@ inline aiMetadataType GetAiType(const aiVector3D &) { inline aiMetadataType GetAiType(const aiMetadata &) { return AI_AIMETADATA; } +inline aiMetadataType GetAiType(int64_t) { + return AI_INT64; +} +inline aiMetadataType GetAiType(uint32_t) { + return AI_UINT32; +} #endif // __cplusplus @@ -215,6 +225,16 @@ struct aiMetadata { rhs.Get(static_cast(i), v); mValues[i].mData = new aiMetadata(v); } break; + case AI_INT64: { + int64_t v; + ::memcpy(&v, rhs.mValues[i].mData, sizeof(int64_t)); + mValues[i].mData = new int64_t(v); + } break; + case AI_UINT32: { + uint32_t v; + ::memcpy(&v, rhs.mValues[i].mData, sizeof(uint32_t)); + mValues[i].mData = new uint32_t(v); + } break; #ifndef SWIG case FORCE_32BIT: #endif @@ -267,6 +287,12 @@ struct aiMetadata { case AI_AIMETADATA: delete static_cast(data); break; + case AI_INT64: + delete static_cast(data); + break; + case AI_UINT32: + delete static_cast(data); + break; #ifndef SWIG case FORCE_32BIT: #endif @@ -510,6 +536,16 @@ struct aiMetadata { return false; } } break; + case AI_INT64: { + if (*static_cast(lhs.mValues[i].mData) != *static_cast(rhs.mValues[i].mData)) { + return false; + } + } break; + case AI_UINT32: { + if (*static_cast(lhs.mValues[i].mData) != *static_cast(rhs.mValues[i].mData)) { + return false; + } + } break; #ifndef SWIG case FORCE_32BIT: #endif diff --git a/test/unit/utMetadata.cpp b/test/unit/utMetadata.cpp index 514b1a4a4..676404c3c 100644 --- a/test/unit/utMetadata.cpp +++ b/test/unit/utMetadata.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -84,7 +82,7 @@ TEST_F( utMetadata, allocTest ) { } TEST_F( utMetadata, get_set_pod_Test ) { - m_data = aiMetadata::Alloc( 5 ); + m_data = aiMetadata::Alloc( 7 ); // int, 32 bit unsigned int index( 0 ); @@ -137,6 +135,28 @@ TEST_F( utMetadata, get_set_pod_Test ) { EXPECT_TRUE( success ); EXPECT_DOUBLE_EQ( 3.0, result_double ); + // int64_t + index++; + const std::string key_int64 = "test_int64"; + int64_t val_int64 = 64; + success = m_data->Set(index, key_int64, val_int64); + EXPECT_TRUE(success); + int64_t result_int64(0); + success = m_data->Get(key_int64, result_int64); + EXPECT_TRUE(success); + EXPECT_EQ(result_int64, val_int64); + + // uint32 + index++; + const std::string key_uint32 = "test_uint32"; + int64_t val_uint32 = 32; + success = m_data->Set(index, key_uint32, val_uint32); + EXPECT_TRUE(success); + int64_t result_uint32(0); + success = m_data->Get(key_uint32, result_uint32); + EXPECT_TRUE(success); + EXPECT_EQ(result_uint32, val_uint32); + // error int result; success = m_data->Get( "bla", result ); @@ -181,6 +201,7 @@ TEST_F( utMetadata, get_set_aiVector3D_Test ) { EXPECT_TRUE( success ); } + TEST_F( utMetadata, copy_test ) { m_data = aiMetadata::Alloc( AI_META_MAX ); bool bv = true; @@ -199,9 +220,12 @@ TEST_F( utMetadata, copy_test ) { m_data->Set( 6, "aiVector3D", vecVal ); aiMetadata metaVal; m_data->Set( 7, "aiMetadata", metaVal ); - - aiMetadata copy( *m_data ); - EXPECT_EQ( 8u, copy.mNumProperties ); + int64_t i64 = 64; + m_data->Set(8, "int64_t", i64); + uint32_t ui32 = 32; + m_data->Set(9, "uint32_t", ui32); + aiMetadata copy(*m_data); + EXPECT_EQ( 10u, copy.mNumProperties ); // bool test { From f8132bf17cf4ba605a3dedbc3f8318c9eb8c78c4 Mon Sep 17 00:00:00 2001 From: Johan Mattsson <39247600+mjunix@users.noreply.github.com> Date: Mon, 20 Feb 2023 19:50:06 +0100 Subject: [PATCH 082/232] Fix index out of bounds --- code/AssetLib/B3D/B3DImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/B3D/B3DImporter.cpp b/code/AssetLib/B3D/B3DImporter.cpp index d970ecabb..e87744603 100644 --- a/code/AssetLib/B3D/B3DImporter.cpp +++ b/code/AssetLib/B3D/B3DImporter.cpp @@ -150,7 +150,7 @@ AI_WONT_RETURN void B3DImporter::Fail(const string &str) { // ------------------------------------------------------------------------------------------------ int B3DImporter::ReadByte() { - if (_pos > _buf.size()) { + if (_pos >= _buf.size()) { Fail("EOF"); } From fa4273ee1f069058a9bc151465d10726fc128986 Mon Sep 17 00:00:00 2001 From: Johan Mattsson <39247600+mjunix@users.noreply.github.com> Date: Mon, 20 Feb 2023 19:56:57 +0100 Subject: [PATCH 083/232] Fix index out of bounds --- code/AssetLib/MS3D/MS3DLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/MS3D/MS3DLoader.cpp b/code/AssetLib/MS3D/MS3DLoader.cpp index 577078158..d4dd2be75 100644 --- a/code/AssetLib/MS3D/MS3DLoader.cpp +++ b/code/AssetLib/MS3D/MS3DLoader.cpp @@ -486,7 +486,7 @@ void MS3DImporter::InternReadFile( const std::string& pFile, for (unsigned int j = 0,n = 0; j < m->mNumFaces; ++j) { aiFace& f = m->mFaces[j]; - if (g.triangles[j]>triangles.size()) { + if (g.triangles[j] >= triangles.size()) { throw DeadlyImportError("MS3D: Encountered invalid triangle index, file is malformed"); } @@ -494,7 +494,7 @@ void MS3DImporter::InternReadFile( const std::string& pFile, f.mIndices = new unsigned int[f.mNumIndices=3]; for (unsigned int k = 0; k < 3; ++k,++n) { - if (t.indices[k]>vertices.size()) { + if (t.indices[k] >= vertices.size()) { throw DeadlyImportError("MS3D: Encountered invalid vertex index, file is malformed"); } From 2d448616d03f584cb4fa0becf02a03359db2bfad Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Mon, 20 Feb 2023 14:53:45 +0200 Subject: [PATCH 084/232] Move string definitions into conditional block to fix unused variable warnings --- tools/assimp_cmd/Info.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/assimp_cmd/Info.cpp b/tools/assimp_cmd/Info.cpp index a21a39201..d67974269 100644 --- a/tools/assimp_cmd/Info.cpp +++ b/tools/assimp_cmd/Info.cpp @@ -55,26 +55,28 @@ constexpr char AICMD_MSG_INFO_HELP_E[] = "\t-v,--verbose: Print verbose info such as node transform data\n" "\t-s, --silent: Print only minimal info\n"; -constexpr char TREE_BRANCH_ASCII[] = "|-"; -constexpr char TREE_BRANCH_UTF8[] = "\xe2\x94\x9c\xe2\x95\xb4"; -constexpr char TREE_STOP_ASCII[] = "'-"; -constexpr char TREE_STOP_UTF8[] = "\xe2\x94\x94\xe2\x95\xb4"; -constexpr char TREE_CONTINUE_ASCII[] = "| "; -constexpr char TREE_CONTINUE_UTF8[] = "\xe2\x94\x82 "; // note: by default this is using utf-8 text. // this is well supported on pretty much any linux terminal. // if this causes problems on some platform, // put an #ifdef to use the ascii version for that platform. #ifdef _WIN32 +constexpr char TREE_BRANCH_ASCII[] = "|-"; +constexpr char TREE_STOP_ASCII[] = "'-"; +constexpr char TREE_CONTINUE_ASCII[] = "| "; + const char *TREE_BRANCH = TREE_BRANCH_ASCII; const char *TREE_STOP = TREE_STOP_ASCII; const char *TREE_CONTINUE = TREE_CONTINUE_ASCII; -#else +#else // _WIN32 +constexpr char TREE_BRANCH_UTF8[] = "\xe2\x94\x9c\xe2\x95\xb4"; +constexpr char TREE_STOP_UTF8[] = "\xe2\x94\x94\xe2\x95\xb4"; +constexpr char TREE_CONTINUE_UTF8[] = "\xe2\x94\x82 "; + const char *TREE_BRANCH = TREE_BRANCH_UTF8; const char *TREE_STOP = TREE_STOP_UTF8; const char *TREE_CONTINUE = TREE_CONTINUE_UTF8; -#endif +#endif // _WIN32 // ----------------------------------------------------------------------------------- unsigned int CountNodes(const aiNode *root) { From 6aac7a2458730dace3631f3924906c885931ed3b Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 21 Feb 2023 21:34:49 +0100 Subject: [PATCH 085/232] Fix: Fix typo in doc - closes https://github.com/assimp/assimp/issues/4973 --- doc/Fileformats.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Fileformats.md b/doc/Fileformats.md index 89b68e17f..118d798f2 100644 --- a/doc/Fileformats.md +++ b/doc/Fileformats.md @@ -14,7 +14,7 @@ __Importers__: - B3D - [BLEND](https://en.wikipedia.org/wiki/.blend_(file_format)) - [BVH](https://en.wikipedia.org/wiki/Biovision_Hierarchy) -- CMS +- CSM - COB - [DAE/Collada](https://en.wikipedia.org/wiki/COLLADA) - [DXF](https://en.wikipedia.org/wiki/AutoCAD_DXF) From bb5a6abae0ef105e5dc9126181d239d8cc3294f8 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 12:43:06 +0200 Subject: [PATCH 086/232] Add more LWO files to unit tests --- test/unit/utLWOImportExport.cpp | 323 ++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) diff --git a/test/unit/utLWOImportExport.cpp b/test/unit/utLWOImportExport.cpp index 266105030..e0053020f 100644 --- a/test/unit/utLWOImportExport.cpp +++ b/test/unit/utLWOImportExport.cpp @@ -75,3 +75,326 @@ TEST_F(utLWOImportExport, importLWOformatdetection) { EXPECT_NE(nullptr, scene); } + + +TEST_F(utLWOImportExport, importLWOempty) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/invalid/empty.lwo", aiProcess_ValidateDataStructure); + + EXPECT_EQ(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWObox_2uv_1unused) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/box_2uv_1unused.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWObox_2vc_1unused) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/box_2vc_1unused.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOconcave_polygon) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/concave_polygon.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOconcave_self_intersecting) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/concave_self_intersecting.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOhierarchy) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/hierarchy.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOhierarchy_smoothed) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/hierarchy_smoothed.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_cylindrical_x) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_cylindrical_x.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_cylindrical_x_scale_222_wrap_21) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_cylindrical_x_scale_222_wrap_21.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_cylindrical_y) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_cylindrical_y.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_cylindrical_y_scale_111) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_cylindrical_y_scale_111.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_cylindrical_y_scale_111_wrap_21) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_cylindrical_y_scale_111_wrap_21.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_cylindrical_z) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_cylindrical_z.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_planar_x) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_planar_x.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_planar_y) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_planar_y.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_planar_z) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_planar_z.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_planar_z_scale_111) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_planar_z_scale_111.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_spherical_x) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_spherical_x.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_spherical_x_scale_222_wrap_22) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_spherical_x_scale_222_wrap_22.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_spherical_y) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_spherical_y.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_spherical_) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_spherical_z.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_spherical_z_wrap_22) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_spherical_z_wrap_22.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOearth_uv_cylindrical_y) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/MappingModes/earth_uv_cylindrical_y.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOModoExport_vertNormals) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/ModoExport_vertNormals.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOnonplanar_polygon) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/nonplanar_polygon.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOCellShader) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/shader_test/CellShader.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOfastFresne) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/shader_test/fastFresnel.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOrealFresnel) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/shader_test/realFresnel.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOSuperCellShader) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/shader_test/SuperCellShader.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOsphere_with_gradient) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/sphere_with_gradient.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOsphere_with_mat_gloss_10pc) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/sphere_with_mat_gloss_10pc.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOSubdivision) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/Subdivision.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOtransparency) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/transparency.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOUglyVertexColors) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/UglyVertexColors.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOuvtest) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/uvtest.lwo", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +// These tests leak memory and complain on ASAN CI build +#if 0 + + +TEST_F(utLWOImportExport, importLWOBConcavePolygon) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/ConcavePolygon.lwo", aiProcess_ValidateDataStructure); + + // FIXME: this should succees but there's a bug in the importer + EXPECT_EQ(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOBbluewithcylindrictex) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/MappingModes/bluewithcylindrictexz.lwo", aiProcess_ValidateDataStructure); + + // FIXME: this should succees but there's a bug in the importer + EXPECT_EQ(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOBsphere_with_mat_gloss_10pc) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/sphere_with_mat_gloss_10pc.lwo", aiProcess_ValidateDataStructure); + + // FIXME: this should succees but there's a bug in the importer + EXPECT_EQ(nullptr, scene); +} + + +TEST_F(utLWOImportExport, importLWOBsphere_with_mat_gloss_50pc) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/sphere_with_mat_gloss_50pc.lwo", aiProcess_ValidateDataStructure); + + // FIXME: this should succees but there's a bug in the importer + EXPECT_EQ(nullptr, scene); +} + + +#endif // ASAN failing tests From 28d4e394c0c44dee234d468eb40e90e8359b7a8a Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 13:17:32 +0200 Subject: [PATCH 087/232] Use std::unique_ptr a bit --- code/AssetLib/LWO/LWOLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 96fed248b..75ae6a416 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -429,7 +429,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, // Generate nodes to render the mesh. Store the source layer in the mParent member of the nodes unsigned int num = static_cast(apcMeshes.size() - meshStart); if (layer.mName != "" || num > 0) { - aiNode *pcNode = new aiNode(); + std::unique_ptr pcNode(new aiNode()); pcNode->mName.Set(layer.mName); pcNode->mParent = (aiNode *)&layer; pcNode->mNumMeshes = num; @@ -439,7 +439,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, for (unsigned int p = 0; p < pcNode->mNumMeshes; ++p) pcNode->mMeshes[p] = p + meshStart; } - apcNodes[layer.mIndex] = pcNode; + apcNodes[layer.mIndex] = pcNode.release(); } } From 92f7c50c915414a41ae3905fcb5714435c2e65d9 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 13:18:04 +0200 Subject: [PATCH 088/232] Remove dead code --- code/AssetLib/LWO/LWOLoader.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 75ae6a416..1a3cf4e1a 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -398,14 +398,6 @@ void LWOImporter::InternReadFile(const std::string &pFile, pvVC[w]++; } -#if 0 - // process vertex weights. We can't properly reconstruct the whole skeleton for now, - // but we can create dummy bones for all weight channels which we have. - for (unsigned int w = 0; w < layer.mWeightChannels.size();++w) - { - } -#endif - face.mIndices[q] = vert; } pf->mIndices = face.mIndices; From 53c6cc096634392b3cc23c12bbdf7e8f4ddce2ad Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 13:19:38 +0200 Subject: [PATCH 089/232] Add a scope so mapPivot is destroyed when no longer used --- code/AssetLib/LWO/LWOLoader.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 1a3cf4e1a..9d76d6bc7 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -565,6 +565,7 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { root->mName.Set(""); //Set parent of all children, inserting pivots + { std::map mapPivot; for (auto itapcNodes = apcNodes.begin(); itapcNodes != apcNodes.end(); ++itapcNodes) { @@ -599,6 +600,7 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { for (auto itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end(); ++itMapPivot) { apcNodes[itMapPivot->first] = itMapPivot->second; } + } //Set children of all parents apcNodes[(uint16_t)-1] = root; From be28f0949b3ed004659f3a1d266be5557c84f1f0 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 13:20:40 +0200 Subject: [PATCH 090/232] Whitespace --- code/AssetLib/LWO/LWOLoader.cpp | 58 ++++++++++++++++----------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 9d76d6bc7..7a09b60a2 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -566,40 +566,40 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { //Set parent of all children, inserting pivots { - std::map mapPivot; - for (auto itapcNodes = apcNodes.begin(); itapcNodes != apcNodes.end(); ++itapcNodes) { + std::map mapPivot; + for (auto itapcNodes = apcNodes.begin(); itapcNodes != apcNodes.end(); ++itapcNodes) { - //Get the parent index - LWO::Layer *nodeLayer = (LWO::Layer *)(itapcNodes->second->mParent); - uint16_t parentIndex = nodeLayer->mParent; + //Get the parent index + LWO::Layer *nodeLayer = (LWO::Layer *)(itapcNodes->second->mParent); + uint16_t parentIndex = nodeLayer->mParent; - //Create pivot node, store it into the pivot map, and set the parent as the pivot - aiNode *pivotNode = new aiNode(); - pivotNode->mName.Set("Pivot-" + std::string(itapcNodes->second->mName.data)); - itapcNodes->second->mParent = pivotNode; + //Create pivot node, store it into the pivot map, and set the parent as the pivot + aiNode *pivotNode = new aiNode(); + pivotNode->mName.Set("Pivot-" + std::string(itapcNodes->second->mName.data)); + itapcNodes->second->mParent = pivotNode; - //Look for the parent node to attach the pivot to - if (apcNodes.find(parentIndex) != apcNodes.end()) { - pivotNode->mParent = apcNodes[parentIndex]; - } else { - //If not, attach to the root node - pivotNode->mParent = root; + //Look for the parent node to attach the pivot to + if (apcNodes.find(parentIndex) != apcNodes.end()) { + pivotNode->mParent = apcNodes[parentIndex]; + } else { + //If not, attach to the root node + pivotNode->mParent = root; + } + + //Set the node and the pivot node transformation + itapcNodes->second->mTransformation.a4 = -nodeLayer->mPivot.x; + itapcNodes->second->mTransformation.b4 = -nodeLayer->mPivot.y; + itapcNodes->second->mTransformation.c4 = -nodeLayer->mPivot.z; + pivotNode->mTransformation.a4 = nodeLayer->mPivot.x; + pivotNode->mTransformation.b4 = nodeLayer->mPivot.y; + pivotNode->mTransformation.c4 = nodeLayer->mPivot.z; + mapPivot[-(itapcNodes->first + 2)] = pivotNode; } - //Set the node and the pivot node transformation - itapcNodes->second->mTransformation.a4 = -nodeLayer->mPivot.x; - itapcNodes->second->mTransformation.b4 = -nodeLayer->mPivot.y; - itapcNodes->second->mTransformation.c4 = -nodeLayer->mPivot.z; - pivotNode->mTransformation.a4 = nodeLayer->mPivot.x; - pivotNode->mTransformation.b4 = nodeLayer->mPivot.y; - pivotNode->mTransformation.c4 = nodeLayer->mPivot.z; - mapPivot[-(itapcNodes->first + 2)] = pivotNode; - } - - //Merge pivot map into node map - for (auto itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end(); ++itMapPivot) { - apcNodes[itMapPivot->first] = itMapPivot->second; - } + //Merge pivot map into node map + for (auto itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end(); ++itMapPivot) { + apcNodes[itMapPivot->first] = itMapPivot->second; + } } //Set children of all parents From 3bdfecb0ed61118fa39955454c82e1bc889c333a Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 13:26:34 +0200 Subject: [PATCH 091/232] Destroy mapPivot nodes as we go --- code/AssetLib/LWO/LWOLoader.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 7a09b60a2..a44c1dc96 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -597,8 +597,9 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { } //Merge pivot map into node map - for (auto itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end(); ++itMapPivot) { + for (auto itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end();) { apcNodes[itMapPivot->first] = itMapPivot->second; + itMapPivot = mapPivot.erase(itMapPivot); } } From 657c1d8ad0b0afba9c96cd1526d8bb2ea305a2c0 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 13:44:40 +0200 Subject: [PATCH 092/232] Use unique_ptr to store pivot nodes until moved to mapPivot --- code/AssetLib/LWO/LWOLoader.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index a44c1dc96..35ebc512c 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -574,9 +574,9 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { uint16_t parentIndex = nodeLayer->mParent; //Create pivot node, store it into the pivot map, and set the parent as the pivot - aiNode *pivotNode = new aiNode(); + std::unique_ptr pivotNode(new aiNode()); pivotNode->mName.Set("Pivot-" + std::string(itapcNodes->second->mName.data)); - itapcNodes->second->mParent = pivotNode; + itapcNodes->second->mParent = pivotNode.get(); //Look for the parent node to attach the pivot to if (apcNodes.find(parentIndex) != apcNodes.end()) { @@ -593,7 +593,7 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { pivotNode->mTransformation.a4 = nodeLayer->mPivot.x; pivotNode->mTransformation.b4 = nodeLayer->mPivot.y; pivotNode->mTransformation.c4 = nodeLayer->mPivot.z; - mapPivot[-(itapcNodes->first + 2)] = pivotNode; + mapPivot[-(itapcNodes->first + 2)] = pivotNode.release(); } //Merge pivot map into node map From 3bdc43a216a39b5b08423422acf5e17fd4881030 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 14:22:44 +0200 Subject: [PATCH 093/232] Add debug logging to LWO node graph generation --- code/AssetLib/LWO/LWOLoader.cpp | 35 ++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 35ebc512c..7cca332b1 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -431,6 +431,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, for (unsigned int p = 0; p < pcNode->mNumMeshes; ++p) pcNode->mMeshes[p] = p + meshStart; } + ASSIMP_LOG_DEBUG("insert apcNode for layer ", layer.mIndex, " \"", layer.mName, "\""); apcNodes[layer.mIndex] = pcNode.release(); } } @@ -564,6 +565,11 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { aiNode *root = mScene->mRootNode = new aiNode(); root->mName.Set(""); + ASSIMP_LOG_DEBUG("apcNodes initial size: ", apcNodes.size()); + if (!apcNodes.empty()) { + ASSIMP_LOG_DEBUG("first apcNode is: ", apcNodes.begin()->first, " \"", apcNodes.begin()->second->mName.C_Str(), "\""); + } + //Set parent of all children, inserting pivots { std::map mapPivot; @@ -593,14 +599,30 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { pivotNode->mTransformation.a4 = nodeLayer->mPivot.x; pivotNode->mTransformation.b4 = nodeLayer->mPivot.y; pivotNode->mTransformation.c4 = nodeLayer->mPivot.z; - mapPivot[-(itapcNodes->first + 2)] = pivotNode.release(); + uint16_t pivotNodeId = static_cast(-(itapcNodes->first + 2)); + ASSIMP_LOG_DEBUG("insert pivot node: ", pivotNodeId); + auto oldNodeIt = mapPivot.find(pivotNodeId); + if (oldNodeIt != mapPivot.end()) { + ASSIMP_LOG_ERROR("attempted to insert pivot node which already exists in pivot map ", pivotNodeId, " \"", pivotNode->mName.C_Str(), "\""); + } else { + mapPivot.emplace(pivotNodeId, pivotNode.release()); + } } + ASSIMP_LOG_DEBUG("pivot nodes: ", mapPivot.size()); //Merge pivot map into node map for (auto itMapPivot = mapPivot.begin(); itMapPivot != mapPivot.end();) { - apcNodes[itMapPivot->first] = itMapPivot->second; + uint16_t pivotNodeId = itMapPivot->first; + auto oldApcNodeIt = apcNodes.find(pivotNodeId); + if (oldApcNodeIt != apcNodes.end()) { + ASSIMP_LOG_ERROR("attempted to insert pivot node which already exists in apc nodes ", pivotNodeId, " \"", itMapPivot->second->mName.C_Str(), "\""); + } else { + apcNodes.emplace(pivotNodeId, itMapPivot->second); + } + itMapPivot->second = nullptr; itMapPivot = mapPivot.erase(itMapPivot); } + ASSIMP_LOG_DEBUG("total nodes: ", apcNodes.size()); } //Set children of all parents @@ -622,8 +644,15 @@ void LWOImporter::GenerateNodeGraph(std::map &apcNodes) { } } - if (!mScene->mRootNode->mNumChildren) + if (!mScene->mRootNode->mNumChildren) { + ASSIMP_LOG_DEBUG("All apcNodes:"); + for (auto nodeIt = apcNodes.begin(); nodeIt != apcNodes.end(); ) { + ASSIMP_LOG_DEBUG("Node ", nodeIt->first, " \"", nodeIt->second->mName.C_Str(), "\""); + nodeIt->second = nullptr; + nodeIt = apcNodes.erase(nodeIt); + } throw DeadlyImportError("LWO: Unable to build a valid node graph"); + } // Remove a single root node with no meshes assigned to it ... if (1 == mScene->mRootNode->mNumChildren) { From e8f0eb930d8b33b44bbf50810040662f6da05991 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Fri, 24 Feb 2023 14:34:32 +0200 Subject: [PATCH 094/232] Fix loading binary LWO files --- code/AssetLib/LWO/LWOLoader.cpp | 2 +- test/unit/utLWOImportExport.cpp | 19 ++++--------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 7cca332b1..1bf39b2da 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -178,7 +178,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, mLayers->push_back(Layer()); mCurLayer = &mLayers->back(); mCurLayer->mName = ""; - mCurLayer->mIndex = (uint16_t) -1; + mCurLayer->mIndex = 1; // old lightwave file format (prior to v6) mIsLWO2 = false; diff --git a/test/unit/utLWOImportExport.cpp b/test/unit/utLWOImportExport.cpp index e0053020f..2ab1c4722 100644 --- a/test/unit/utLWOImportExport.cpp +++ b/test/unit/utLWOImportExport.cpp @@ -357,16 +357,11 @@ TEST_F(utLWOImportExport, importLWOuvtest) { } -// These tests leak memory and complain on ASAN CI build -#if 0 - - TEST_F(utLWOImportExport, importLWOBConcavePolygon) { ::Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/ConcavePolygon.lwo", aiProcess_ValidateDataStructure); - // FIXME: this should succees but there's a bug in the importer - EXPECT_EQ(nullptr, scene); + EXPECT_NE(nullptr, scene); } @@ -374,8 +369,7 @@ TEST_F(utLWOImportExport, importLWOBbluewithcylindrictex) { ::Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/MappingModes/bluewithcylindrictexz.lwo", aiProcess_ValidateDataStructure); - // FIXME: this should succees but there's a bug in the importer - EXPECT_EQ(nullptr, scene); + EXPECT_NE(nullptr, scene); } @@ -383,8 +377,7 @@ TEST_F(utLWOImportExport, importLWOBsphere_with_mat_gloss_10pc) { ::Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/sphere_with_mat_gloss_10pc.lwo", aiProcess_ValidateDataStructure); - // FIXME: this should succees but there's a bug in the importer - EXPECT_EQ(nullptr, scene); + EXPECT_NE(nullptr, scene); } @@ -392,9 +385,5 @@ TEST_F(utLWOImportExport, importLWOBsphere_with_mat_gloss_50pc) { ::Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWOB/sphere_with_mat_gloss_50pc.lwo", aiProcess_ValidateDataStructure); - // FIXME: this should succees but there's a bug in the importer - EXPECT_EQ(nullptr, scene); + EXPECT_NE(nullptr, scene); } - - -#endif // ASAN failing tests From 437958ef91920bde96ebd8481540406a33aaa947 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:10:35 +0800 Subject: [PATCH 095/232] bugfix fails to check if point in triangle. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/Common/PolyTools.h | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/code/Common/PolyTools.h b/code/Common/PolyTools.h index 9837a2991..a5bd1090b 100644 --- a/code/Common/PolyTools.h +++ b/code/Common/PolyTools.h @@ -74,26 +74,8 @@ inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) { * both aiVector3D and aiVector2D, but generally ignores the third coordinate.*/ template inline bool PointInTriangle2D(const T& p0, const T& p1,const T& p2, const T& pp) { - // Point in triangle test using baryzentric coordinates - const aiVector2D v0 = p1 - p0; - const aiVector2D v1 = p2 - p0; - const aiVector2D v2 = pp - p0; - - double dot00 = v0 * v0; - double dot11 = v1 * v1; - const double dot01 = v0 * v1; - const double dot02 = v0 * v2; - const double dot12 = v1 * v2; - const double denom = dot00 * dot11 - dot01 * dot01; - if (denom == 0.0) { - return false; - } - - const double invDenom = 1.0 / denom; - dot11 = (dot11 * dot02 - dot01 * dot12) * invDenom; - dot00 = (dot00 * dot12 - dot01 * dot02) * invDenom; - - return (dot11 > 0) && (dot00 > 0) && (dot11 + dot00 < 1); + // pp should be left side of the three triangle side, by ccw arrow + return OnLeftSideOfLine2D(p0, p1, pp) && OnLeftSideOfLine2D(p1, p2, pp) && OnLeftSideOfLine2D(p2, p0, pp); } From 94d977354804608d29281a7e3e940b71aa148865 Mon Sep 17 00:00:00 2001 From: FeeshWyvern Date: Mon, 27 Feb 2023 20:02:34 -0800 Subject: [PATCH 096/232] Bug fix: Correctly set the name of the attributes. PR #3940 did not seem to update in Master? --- port/PyAssimp/pyassimp/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/port/PyAssimp/pyassimp/core.py b/port/PyAssimp/pyassimp/core.py index 35ad882b3..37beac886 100644 --- a/port/PyAssimp/pyassimp/core.py +++ b/port/PyAssimp/pyassimp/core.py @@ -211,7 +211,7 @@ def _init(self, target = None, parent = None): else: # starts with 'm' but not iterable - setattr(target, m, obj) + setattr(target, name, obj) logger.debug("Added " + name + " as self." + name + " (type: " + str(type(obj)) + ")") if _is_init_type(obj): From f9fcf33aaa639fbfd386631cb796ac66d01fef94 Mon Sep 17 00:00:00 2001 From: FeeshWyvern Date: Mon, 27 Feb 2023 20:06:05 -0800 Subject: [PATCH 097/232] Bug fix: We should not be accessing `mPrivate` according to structs.Scene and fixes a crash when `mPrivate` points to invalid data. --- port/PyAssimp/pyassimp/core.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/port/PyAssimp/pyassimp/core.py b/port/PyAssimp/pyassimp/core.py index 37beac886..edde8b29a 100644 --- a/port/PyAssimp/pyassimp/core.py +++ b/port/PyAssimp/pyassimp/core.py @@ -115,6 +115,10 @@ def _init(self, target = None, parent = None): if m.startswith("_"): continue + # We should not be accessing `mPrivate` according to structs.Scene. + if m == 'mPrivate': + continue + if m.startswith('mNum'): if 'm' + m[4:] in dirself: continue # will be processed later on From a1aace74e58460d0d5c6462cea81682b5647e4b7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 28 Feb 2023 21:53:18 +0100 Subject: [PATCH 098/232] Fix: Use C++17 compliant utf8 encoding. --- samples/SharedCode/UTFConverter.cpp | 2 +- samples/SharedCode/UTFConverter.h | 43 ++++++++++++++++++----------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/samples/SharedCode/UTFConverter.cpp b/samples/SharedCode/UTFConverter.cpp index a1bff7e4b..e6c07e946 100644 --- a/samples/SharedCode/UTFConverter.cpp +++ b/samples/SharedCode/UTFConverter.cpp @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace AssimpSamples { namespace SharedCode { -typename UTFConverter::UTFConverterImpl UTFConverter::impl_; +//typename UTFConverter::UTFConverterImpl UTFConverter::impl_; } } diff --git a/samples/SharedCode/UTFConverter.h b/samples/SharedCode/UTFConverter.h index 17e89ee4d..34b2293de 100644 --- a/samples/SharedCode/UTFConverter.h +++ b/samples/SharedCode/UTFConverter.h @@ -45,43 +45,54 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define ASSIMP_SAMPLES_SHARED_CODE_UTFCONVERTER_H #include -#include -#include +#include + +#ifdef ASSIMP_USE_HUNTER +#include +#else +#include "../contrib/utf8cpp/source/utf8.h" +#endif namespace AssimpSamples { namespace SharedCode { // Used to convert between multibyte and unicode strings. class UTFConverter { - using UTFConverterImpl = std::wstring_convert, wchar_t>; public: - UTFConverter(const char* s) : - s_(s), - ws_(impl_.from_bytes(s)) { + //utf8::utf16to8(start, end, back_inserter(str)); + + UTFConverter(const char* s) : s_(s), ws_() { + std::vector str; + utf8::utf8to16(s, s + std::strlen(s) + 1, back_inserter(str)); } - UTFConverter(const wchar_t* s) : - s_(impl_.to_bytes(s)), - ws_(s) { + + UTFConverter(const wchar_t* s) : s_(),ws_(s) { + std::vector str; + utf8::utf16to8(s, s + ws_.size() + 1, back_inserter(str)); } - UTFConverter(const std::string& s) : - s_(s), - ws_(impl_.from_bytes(s)) { + + UTFConverter(const std::string& s) : s_(s), ws_() { + std::vector str; + utf8::utf8to16(s.c_str(), s.c_str() + s.size() + 1, back_inserter(str)); } - UTFConverter(const std::wstring& s) : - s_(impl_.to_bytes(s)), - ws_(s) { + + UTFConverter(const std::wstring& s) : s_(), ws_(s) { + std::vector str; + utf8::utf16to8(s.c_str(), s.c_str() + ws_.size() + 1, back_inserter(str)); } + inline const char* c_str() const { return s_.c_str(); } + inline const std::string& str() const { return s_; } + inline const wchar_t* c_wstr() const { return ws_.c_str(); } private: - static UTFConverterImpl impl_; std::string s_; std::wstring ws_; }; From 60da5e7e963d5753a5a532cea1ff78600cf8185f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 28 Feb 2023 23:27:46 +0100 Subject: [PATCH 099/232] Update UTFConverter.cpp --- samples/SharedCode/UTFConverter.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/samples/SharedCode/UTFConverter.cpp b/samples/SharedCode/UTFConverter.cpp index e6c07e946..383ae43f1 100644 --- a/samples/SharedCode/UTFConverter.cpp +++ b/samples/SharedCode/UTFConverter.cpp @@ -5,8 +5,6 @@ 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, @@ -46,7 +44,5 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace AssimpSamples { namespace SharedCode { -//typename UTFConverter::UTFConverterImpl UTFConverter::impl_; - } } From 534ee288c5d5864f871a924a44ef5462c2acf435 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 28 Feb 2023 23:28:24 +0100 Subject: [PATCH 100/232] Update UTFConverter.h --- samples/SharedCode/UTFConverter.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/samples/SharedCode/UTFConverter.h b/samples/SharedCode/UTFConverter.h index 34b2293de..8173d474c 100644 --- a/samples/SharedCode/UTFConverter.h +++ b/samples/SharedCode/UTFConverter.h @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2020, assimp team - - +Copyright (c) 2006-2023, assimp team All rights reserved. @@ -56,11 +54,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace AssimpSamples { namespace SharedCode { -// Used to convert between multibyte and unicode strings. +/// @brief Used to convert between multibyte and unicode strings. class UTFConverter { public: - //utf8::utf16to8(start, end, back_inserter(str)); - UTFConverter(const char* s) : s_(s), ws_() { std::vector str; utf8::utf8to16(s, s + std::strlen(s) + 1, back_inserter(str)); From 39efe4c832c02e8e6560b9922b0504716fd3c99c Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:11:35 +0800 Subject: [PATCH 101/232] upgrade draco to 1.5.6 Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- contrib/draco/.cmake-format.py | 217 +- contrib/draco/.gitattributes | 1 + contrib/draco/.gitmodules | 12 + contrib/draco/BUILDING.md | 86 +- contrib/draco/CMakeLists.txt | 1193 +++--- contrib/draco/README.md | 150 +- contrib/draco/cmake/DracoConfig.cmake | 3 - contrib/draco/cmake/FindDraco.cmake | 56 - contrib/draco/cmake/compiler_flags.cmake | 220 - contrib/draco/cmake/compiler_tests.cmake | 103 - .../draco/cmake/draco-config.cmake.template | 5 +- contrib/draco/cmake/draco.pc.template | 9 +- .../draco/cmake/draco_build_definitions.cmake | 79 +- contrib/draco/cmake/draco_cpu_detection.cmake | 14 + contrib/draco/cmake/draco_dependencies.cmake | 136 + contrib/draco/cmake/draco_emscripten.cmake | 177 +- contrib/draco/cmake/draco_flags.cmake | 51 +- contrib/draco/cmake/draco_helpers.cmake | 14 + contrib/draco/cmake/draco_install.cmake | 126 +- contrib/draco/cmake/draco_intrinsics.cmake | 34 +- contrib/draco/cmake/draco_options.cmake | 185 +- contrib/draco/cmake/draco_sanitizer.cmake | 22 +- contrib/draco/cmake/draco_targets.cmake | 147 +- contrib/draco/cmake/draco_test_config.h.cmake | 15 + contrib/draco/cmake/draco_tests.cmake | 154 +- contrib/draco/cmake/draco_variables.cmake | 29 +- contrib/draco/cmake/sanitizers.cmake | 19 - .../cmake/toolchains/aarch64-linux-gnu.cmake | 14 + .../cmake/toolchains/android-ndk-common.cmake | 14 + contrib/draco/cmake/toolchains/android.cmake | 20 +- .../cmake/toolchains/arm-ios-common.cmake | 16 +- .../toolchains/arm-linux-gnueabihf.cmake | 14 + .../toolchains/arm64-android-ndk-libcpp.cmake | 14 + .../draco/cmake/toolchains/arm64-ios.cmake | 15 +- .../cmake/toolchains/arm64-linux-gcc.cmake | 14 + .../toolchains/armv7-android-ndk-libcpp.cmake | 14 + .../draco/cmake/toolchains/armv7-ios.cmake | 15 +- .../cmake/toolchains/armv7-linux-gcc.cmake | 14 + .../draco/cmake/toolchains/armv7s-ios.cmake | 15 +- contrib/draco/cmake/toolchains/i386-ios.cmake | 15 +- .../toolchains/x86-android-ndk-libcpp.cmake | 14 + .../x86_64-android-ndk-libcpp.cmake | 14 + .../draco/cmake/toolchains/x86_64-ios.cmake | 15 +- contrib/draco/cmake/util.cmake | 79 - .../draco/src/draco/animation/animation.cc | 47 + contrib/draco/src/draco/animation/animation.h | 149 + .../src/draco/animation/animation_test.cc | 71 + .../keyframe_animation_encoding_test.cc | 17 +- .../animation/keyframe_animation_test.cc | 6 +- .../src/draco/animation/node_animation_data.h | 150 + contrib/draco/src/draco/animation/skin.cc | 29 + contrib/draco/src/draco/animation/skin.h | 64 + .../draco/attributes/attribute_transform.cc | 7 +- .../draco/attributes/geometry_attribute.cc | 2 +- .../src/draco/attributes/geometry_attribute.h | 225 +- .../src/draco/attributes/point_attribute.cc | 43 + .../src/draco/attributes/point_attribute.h | 6 + .../attributes/attributes_encoder.cc | 16 +- .../attributes/kd_tree_attributes_decoder.cc | 73 +- .../attributes/kd_tree_attributes_decoder.h | 4 + .../attributes/normal_compression_utils.h | 38 +- .../compression/attributes/point_d_vector.h | 12 +- ..._constrained_multi_parallelogram_decoder.h | 7 +- ..._constrained_multi_parallelogram_encoder.h | 2 +- ...ction_scheme_multi_parallelogram_decoder.h | 4 +- ...esh_prediction_scheme_tex_coords_decoder.h | 58 +- ...ction_scheme_tex_coords_portable_encoder.h | 5 +- ...ion_scheme_tex_coords_portable_predictor.h | 64 +- .../prediction_scheme_encoder_factory.cc | 53 +- .../prediction_scheme_encoder_factory.h | 7 +- ...ahedron_canonicalized_decoding_transform.h | 6 +- ...octahedron_canonicalized_transform_test.cc | 10 +- ...eme_normal_octahedron_decoding_transform.h | 18 +- ...scheme_normal_octahedron_transform_test.cc | 8 +- .../prediction_scheme_wrap_transform_base.h | 4 +- .../sequential_integer_attribute_decoder.cc | 10 +- .../sequential_integer_attribute_encoder.cc | 8 +- .../sequential_normal_attribute_encoder.cc | 3 +- .../bit_coders/direct_bit_decoder.h | 9 +- .../compression/config/encoder_options.h | 4 + .../src/draco/compression/decode_test.cc | 76 + .../compression/draco_compression_options.cc | 59 + .../compression/draco_compression_options.h | 141 + .../draco_compression_options_test.cc | 45 + contrib/draco/src/draco/compression/encode.h | 1 - .../draco/src/draco/compression/encode_base.h | 2 +- .../src/draco/compression/encode_test.cc | 187 +- .../draco/src/draco/compression/entropy/ans.h | 1 - .../compression/entropy/rans_symbol_decoder.h | 7 + .../compression/entropy/rans_symbol_encoder.h | 4 +- .../compression/entropy/symbol_decoding.cc | 2 +- .../src/draco/compression/expert_encode.cc | 118 + .../src/draco/compression/expert_encode.h | 6 + .../mesh/mesh_edgebreaker_decoder_impl.cc | 54 +- .../mesh/mesh_edgebreaker_encoder.cc | 1 - .../mesh/mesh_edgebreaker_encoder_impl.cc | 2 +- .../mesh/mesh_edgebreaker_encoder_impl.h | 1 - .../mesh/mesh_edgebreaker_encoding_test.cc | 27 +- .../mesh/mesh_edgebreaker_shared.h | 2 - ...sh_edgebreaker_traversal_valence_decoder.h | 6 +- .../compression/mesh/mesh_encoder_test.cc | 8 +- .../mesh/mesh_sequential_decoder.cc | 6 +- .../mesh/mesh_sequential_encoder.cc | 4 - .../mesh/mesh_sequential_encoder.h | 1 - ...mesh_attribute_indices_encoding_observer.h | 2 +- .../mesh/traverser/mesh_traversal_sequencer.h | 2 +- .../dynamic_integer_points_kd_tree_decoder.h | 53 +- .../dynamic_integer_points_kd_tree_encoder.h | 5 +- .../algorithms/float_points_tree_encoder.h | 4 +- .../integer_points_kd_tree_decoder.h | 3 +- .../integer_points_kd_tree_encoder.h | 3 +- .../algorithms/quantize_points_3.h | 6 +- .../point_cloud_kd_tree_encoding_test.cc | 4 +- contrib/draco/src/draco/core/bounding_box.cc | 15 +- contrib/draco/src/draco/core/bounding_box.h | 5 + contrib/draco/src/draco/core/constants.h | 6 + contrib/draco/src/draco/core/data_buffer.cc | 2 +- contrib/draco/src/draco/core/data_buffer.h | 2 +- contrib/draco/src/draco/core/decoder_buffer.h | 14 +- .../src/draco/core/draco_index_type_vector.h | 15 +- .../draco/src/draco/core/draco_test_utils.cc | 26 +- .../draco/src/draco/core/draco_test_utils.h | 53 + contrib/draco/src/draco/core/draco_version.h | 4 +- contrib/draco/src/draco/core/macros.h | 21 +- contrib/draco/src/draco/core/math_utils.h | 24 + .../draco/src/draco/core/math_utils_test.cc | 4 +- contrib/draco/src/draco/core/options.cc | 3 +- contrib/draco/src/draco/core/options.h | 7 +- contrib/draco/src/draco/core/status.cc | 44 + contrib/draco/src/draco/core/status.h | 6 + contrib/draco/src/draco/core/status_test.cc | 7 + contrib/draco/src/draco/core/vector_d.h | 6 +- contrib/draco/src/draco/core/vector_d_test.cc | 60 - .../draco/src/draco/io/file_reader_factory.cc | 2 +- contrib/draco/src/draco/io/file_utils.cc | 37 +- contrib/draco/src/draco/io/file_utils.h | 15 +- contrib/draco/src/draco/io/file_utils_test.cc | 2 + .../draco/src/draco/io/file_writer_factory.cc | 1 + .../draco/src/draco/io/file_writer_utils.cc | 21 +- .../src/draco/io/file_writer_utils_test.cc | 49 + contrib/draco/src/draco/io/gltf_decoder.cc | 2893 +++++++++++++ contrib/draco/src/draco/io/gltf_decoder.h | 524 +++ .../draco/src/draco/io/gltf_decoder_test.cc | 1402 +++++++ contrib/draco/src/draco/io/gltf_encoder.cc | 3662 +++++++++++++++++ contrib/draco/src/draco/io/gltf_encoder.h | 134 + .../draco/src/draco/io/gltf_encoder_test.cc | 1717 ++++++++ .../draco/src/draco/io/gltf_test_helper.cc | 823 ++++ contrib/draco/src/draco/io/gltf_test_helper.h | 61 + contrib/draco/src/draco/io/gltf_utils.cc | 154 + contrib/draco/src/draco/io/gltf_utils.h | 186 + contrib/draco/src/draco/io/gltf_utils_test.cc | 366 ++ .../src/draco/io/image_compression_options.h | 31 + contrib/draco/src/draco/io/mesh_io.cc | 33 +- contrib/draco/src/draco/io/obj_decoder.cc | 132 +- contrib/draco/src/draco/io/obj_decoder.h | 22 +- .../draco/src/draco/io/obj_decoder_test.cc | 128 +- contrib/draco/src/draco/io/obj_encoder.cc | 169 +- contrib/draco/src/draco/io/obj_encoder.h | 15 + .../draco/src/draco/io/obj_encoder_test.cc | 34 + contrib/draco/src/draco/io/parser_utils.cc | 43 +- .../draco/src/draco/io/ply_decoder_test.cc | 1 + contrib/draco/src/draco/io/ply_encoder.cc | 13 +- contrib/draco/src/draco/io/ply_reader_test.cc | 10 +- contrib/draco/src/draco/io/scene_io.cc | 127 + contrib/draco/src/draco/io/scene_io.h | 55 + contrib/draco/src/draco/io/scene_io_test.cc | 86 + .../src/draco/io/stdio_file_reader_test.cc | 2 +- contrib/draco/src/draco/io/stl_decoder.cc | 77 + contrib/draco/src/draco/io/stl_decoder.h | 38 + .../draco/src/draco/io/stl_decoder_test.cc | 49 + contrib/draco/src/draco/io/stl_encoder.cc | 111 + contrib/draco/src/draco/io/stl_encoder.h | 52 + .../draco/src/draco/io/stl_encoder_test.cc | 78 + contrib/draco/src/draco/io/texture_io.cc | 94 + contrib/draco/src/draco/io/texture_io.h | 56 + contrib/draco/src/draco/io/texture_io_test.cc | 55 + contrib/draco/src/draco/io/tiny_gltf_utils.cc | 230 ++ contrib/draco/src/draco/io/tiny_gltf_utils.h | 140 + .../animation_decoder_webidl_wrapper.cc | 101 - .../animation_decoder_webidl_wrapper.h | 73 - .../animation_encoder_webidl_wrapper.cc | 89 - .../animation_encoder_webidl_wrapper.h | 66 - .../emscripten/decoder_webidl_wrapper.cc | 12 +- .../draco_animation_decoder_glue_wrapper.cc | 28 - .../draco_animation_web_decoder.idl | 52 - .../draco_animation_web_encoder.idl | 34 - .../draco/javascript/emscripten/version.js | 2 +- contrib/draco/src/draco/material/material.cc | 258 ++ contrib/draco/src/draco/material/material.h | 276 ++ .../src/draco/material/material_library.cc | 125 + .../src/draco/material/material_library.h | 104 + .../draco/material/material_library_test.cc | 155 + .../draco/src/draco/material/material_test.cc | 320 ++ .../src/draco/material/material_utils.cc | 14 + .../draco/src/draco/material/material_utils.h | 14 + .../src/draco/material/material_utils_test.cc | 24 + contrib/draco/src/draco/mesh/corner_table.cc | 1 + contrib/draco/src/draco/mesh/corner_table.h | 1 + .../src/draco/mesh/corner_table_iterators.h | 32 +- .../draco/src/draco/mesh/corner_table_test.cc | 126 + contrib/draco/src/draco/mesh/mesh.cc | 433 ++ contrib/draco/src/draco/mesh/mesh.h | 180 + .../src/draco/mesh/mesh_are_equivalent.cc | 52 + .../draco/mesh/mesh_are_equivalent_test.cc | 37 + .../draco/mesh/mesh_attribute_corner_table.cc | 14 +- .../draco/mesh/mesh_attribute_corner_table.h | 10 +- contrib/draco/src/draco/mesh/mesh_cleanup.cc | 12 +- contrib/draco/src/draco/mesh/mesh_cleanup.h | 16 +- .../draco/src/draco/mesh/mesh_cleanup_test.cc | 16 +- .../draco/mesh/mesh_connected_components.h | 161 + contrib/draco/src/draco/mesh/mesh_features.cc | 98 + contrib/draco/src/draco/mesh/mesh_features.h | 93 + .../src/draco/mesh/mesh_features_test.cc | 98 + contrib/draco/src/draco/mesh/mesh_indices.h | 37 + .../src/draco/mesh/mesh_misc_functions.h | 1 - contrib/draco/src/draco/mesh/mesh_splitter.cc | 451 ++ contrib/draco/src/draco/mesh/mesh_splitter.h | 109 + .../mesh_splitter_test.cc} | 23 +- .../draco/src/draco/mesh/mesh_stripifier.h | 2 - contrib/draco/src/draco/mesh/mesh_test.cc | 644 +++ contrib/draco/src/draco/mesh/mesh_utils.cc | 492 +++ contrib/draco/src/draco/mesh/mesh_utils.h | 102 + .../draco/src/draco/mesh/mesh_utils_test.cc | 391 ++ .../draco/mesh/triangle_soup_mesh_builder.cc | 16 +- .../draco/mesh/triangle_soup_mesh_builder.h | 63 + .../mesh/triangle_soup_mesh_builder_test.cc | 72 +- .../src/draco/metadata/geometry_metadata.cc | 15 +- .../src/draco/metadata/geometry_metadata.h | 2 + contrib/draco/src/draco/metadata/metadata.cc | 8 + contrib/draco/src/draco/metadata/metadata.h | 1 + .../src/draco/metadata/metadata_decoder.cc | 21 +- .../draco/src/draco/metadata/metadata_test.cc | 6 +- .../src/draco/metadata/property_table.cc | 183 + .../draco/src/draco/metadata/property_table.h | 243 ++ .../src/draco/metadata/property_table_test.cc | 624 +++ .../src/draco/metadata/structural_metadata.cc | 74 + .../src/draco/metadata/structural_metadata.h | 64 + .../metadata/structural_metadata_test.cc | 170 + .../src/draco/point_cloud/point_cloud.cc | 39 +- .../draco/src/draco/point_cloud/point_cloud.h | 10 + .../draco/point_cloud/point_cloud_builder.cc | 2 + .../draco/point_cloud/point_cloud_builder.h | 11 + .../src/draco/point_cloud/point_cloud_test.cc | 54 + .../draco/src/draco/scene/instance_array.cc | 45 + .../draco/src/draco/scene/instance_array.h | 61 + .../src/draco/scene/instance_array_test.cc | 179 + contrib/draco/src/draco/scene/light.cc | 45 + contrib/draco/src/draco/scene/light.h | 81 + contrib/draco/src/draco/scene/light_test.cc | 64 + contrib/draco/src/draco/scene/mesh_group.h | 138 + .../draco/src/draco/scene/mesh_group_test.cc | 196 + contrib/draco/src/draco/scene/scene.cc | 174 + contrib/draco/src/draco/scene/scene.h | 258 ++ .../src/draco/scene/scene_are_equivalent.cc | 109 + .../src/draco/scene/scene_are_equivalent.h | 42 + .../draco/scene/scene_are_equivalent_test.cc | 86 + contrib/draco/src/draco/scene/scene_indices.h | 72 + contrib/draco/src/draco/scene/scene_node.h | 105 + contrib/draco/src/draco/scene/scene_test.cc | 295 ++ contrib/draco/src/draco/scene/scene_utils.cc | 962 +++++ contrib/draco/src/draco/scene/scene_utils.h | 150 + .../draco/src/draco/scene/scene_utils_test.cc | 763 ++++ contrib/draco/src/draco/scene/trs_matrix.cc | 102 + contrib/draco/src/draco/scene/trs_matrix.h | 124 + .../draco/src/draco/scene/trs_matrix_test.cc | 79 + .../draco/src/draco/texture/source_image.cc | 29 + .../draco/src/draco/texture/source_image.h | 72 + contrib/draco/src/draco/texture/texture.h | 46 + .../src/draco/texture/texture_library.cc | 61 + .../draco/src/draco/texture/texture_library.h | 67 + .../src/draco/texture/texture_library_test.cc | 22 + .../draco/src/draco/texture/texture_map.cc | 86 + contrib/draco/src/draco/texture/texture_map.h | 175 + .../src/draco/texture/texture_map_test.cc | 0 .../src/draco/texture/texture_transform.cc | 79 + .../src/draco/texture/texture_transform.h | 75 + .../draco/texture/texture_transform_test.cc | 0 .../draco/src/draco/texture/texture_utils.cc | 144 + .../draco/src/draco/texture/texture_utils.h | 78 + .../src/draco/texture/texture_utils_test.cc | 163 + .../draco/src/draco/tools/draco_decoder.cc | 20 +- .../draco/src/draco/tools/draco_encoder.cc | 59 +- .../draco/src/draco/tools/draco_transcoder.cc | 130 + .../src/draco/tools/draco_transcoder_lib.cc | 86 + .../src/draco/tools/draco_transcoder_lib.h | 103 + .../draco/tools/draco_transcoder_lib_test.cc | 172 + contrib/draco/src/draco/tools/fuzz/build.sh | 2 +- .../draco/tools/install_test/CMakeLists.txt | 25 + .../src/draco/tools/install_test/main.cc | 44 + .../src/draco/tools/install_test/test.py | 456 ++ 290 files changed, 30940 insertions(+), 2350 deletions(-) create mode 100644 contrib/draco/.gitattributes create mode 100644 contrib/draco/.gitmodules delete mode 100644 contrib/draco/cmake/DracoConfig.cmake delete mode 100644 contrib/draco/cmake/FindDraco.cmake delete mode 100644 contrib/draco/cmake/compiler_flags.cmake delete mode 100644 contrib/draco/cmake/compiler_tests.cmake create mode 100644 contrib/draco/cmake/draco_dependencies.cmake delete mode 100644 contrib/draco/cmake/sanitizers.cmake delete mode 100644 contrib/draco/cmake/util.cmake create mode 100644 contrib/draco/src/draco/animation/animation.cc create mode 100644 contrib/draco/src/draco/animation/animation.h create mode 100644 contrib/draco/src/draco/animation/animation_test.cc create mode 100644 contrib/draco/src/draco/animation/node_animation_data.h create mode 100644 contrib/draco/src/draco/animation/skin.cc create mode 100644 contrib/draco/src/draco/animation/skin.h create mode 100644 contrib/draco/src/draco/compression/draco_compression_options.cc create mode 100644 contrib/draco/src/draco/compression/draco_compression_options.h create mode 100644 contrib/draco/src/draco/compression/draco_compression_options_test.cc create mode 100644 contrib/draco/src/draco/core/constants.h create mode 100644 contrib/draco/src/draco/core/status.cc create mode 100644 contrib/draco/src/draco/io/file_writer_utils_test.cc create mode 100644 contrib/draco/src/draco/io/gltf_decoder.cc create mode 100644 contrib/draco/src/draco/io/gltf_decoder.h create mode 100644 contrib/draco/src/draco/io/gltf_decoder_test.cc create mode 100644 contrib/draco/src/draco/io/gltf_encoder.cc create mode 100644 contrib/draco/src/draco/io/gltf_encoder.h create mode 100644 contrib/draco/src/draco/io/gltf_encoder_test.cc create mode 100644 contrib/draco/src/draco/io/gltf_test_helper.cc create mode 100644 contrib/draco/src/draco/io/gltf_test_helper.h create mode 100644 contrib/draco/src/draco/io/gltf_utils.cc create mode 100644 contrib/draco/src/draco/io/gltf_utils.h create mode 100644 contrib/draco/src/draco/io/gltf_utils_test.cc create mode 100644 contrib/draco/src/draco/io/image_compression_options.h create mode 100644 contrib/draco/src/draco/io/scene_io.cc create mode 100644 contrib/draco/src/draco/io/scene_io.h create mode 100644 contrib/draco/src/draco/io/scene_io_test.cc create mode 100644 contrib/draco/src/draco/io/stl_decoder.cc create mode 100644 contrib/draco/src/draco/io/stl_decoder.h create mode 100644 contrib/draco/src/draco/io/stl_decoder_test.cc create mode 100644 contrib/draco/src/draco/io/stl_encoder.cc create mode 100644 contrib/draco/src/draco/io/stl_encoder.h create mode 100644 contrib/draco/src/draco/io/stl_encoder_test.cc create mode 100644 contrib/draco/src/draco/io/texture_io.cc create mode 100644 contrib/draco/src/draco/io/texture_io.h create mode 100644 contrib/draco/src/draco/io/texture_io_test.cc create mode 100644 contrib/draco/src/draco/io/tiny_gltf_utils.cc create mode 100644 contrib/draco/src/draco/io/tiny_gltf_utils.h delete mode 100644 contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.cc delete mode 100644 contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.h delete mode 100644 contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.cc delete mode 100644 contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.h delete mode 100644 contrib/draco/src/draco/javascript/emscripten/draco_animation_decoder_glue_wrapper.cc delete mode 100644 contrib/draco/src/draco/javascript/emscripten/draco_animation_web_decoder.idl delete mode 100644 contrib/draco/src/draco/javascript/emscripten/draco_animation_web_encoder.idl create mode 100644 contrib/draco/src/draco/material/material.cc create mode 100644 contrib/draco/src/draco/material/material.h create mode 100644 contrib/draco/src/draco/material/material_library.cc create mode 100644 contrib/draco/src/draco/material/material_library.h create mode 100644 contrib/draco/src/draco/material/material_library_test.cc create mode 100644 contrib/draco/src/draco/material/material_test.cc create mode 100644 contrib/draco/src/draco/material/material_utils.cc create mode 100644 contrib/draco/src/draco/material/material_utils.h create mode 100644 contrib/draco/src/draco/material/material_utils_test.cc create mode 100644 contrib/draco/src/draco/mesh/corner_table_test.cc create mode 100644 contrib/draco/src/draco/mesh/mesh_connected_components.h create mode 100644 contrib/draco/src/draco/mesh/mesh_features.cc create mode 100644 contrib/draco/src/draco/mesh/mesh_features.h create mode 100644 contrib/draco/src/draco/mesh/mesh_features_test.cc create mode 100644 contrib/draco/src/draco/mesh/mesh_indices.h create mode 100644 contrib/draco/src/draco/mesh/mesh_splitter.cc create mode 100644 contrib/draco/src/draco/mesh/mesh_splitter.h rename contrib/draco/src/draco/{javascript/emscripten/draco_animation_encoder_glue_wrapper.cc => mesh/mesh_splitter_test.cc} (51%) create mode 100644 contrib/draco/src/draco/mesh/mesh_test.cc create mode 100644 contrib/draco/src/draco/mesh/mesh_utils.cc create mode 100644 contrib/draco/src/draco/mesh/mesh_utils.h create mode 100644 contrib/draco/src/draco/mesh/mesh_utils_test.cc create mode 100644 contrib/draco/src/draco/metadata/property_table.cc create mode 100644 contrib/draco/src/draco/metadata/property_table.h create mode 100644 contrib/draco/src/draco/metadata/property_table_test.cc create mode 100644 contrib/draco/src/draco/metadata/structural_metadata.cc create mode 100644 contrib/draco/src/draco/metadata/structural_metadata.h create mode 100644 contrib/draco/src/draco/metadata/structural_metadata_test.cc create mode 100644 contrib/draco/src/draco/scene/instance_array.cc create mode 100644 contrib/draco/src/draco/scene/instance_array.h create mode 100644 contrib/draco/src/draco/scene/instance_array_test.cc create mode 100644 contrib/draco/src/draco/scene/light.cc create mode 100644 contrib/draco/src/draco/scene/light.h create mode 100644 contrib/draco/src/draco/scene/light_test.cc create mode 100644 contrib/draco/src/draco/scene/mesh_group.h create mode 100644 contrib/draco/src/draco/scene/mesh_group_test.cc create mode 100644 contrib/draco/src/draco/scene/scene.cc create mode 100644 contrib/draco/src/draco/scene/scene.h create mode 100644 contrib/draco/src/draco/scene/scene_are_equivalent.cc create mode 100644 contrib/draco/src/draco/scene/scene_are_equivalent.h create mode 100644 contrib/draco/src/draco/scene/scene_are_equivalent_test.cc create mode 100644 contrib/draco/src/draco/scene/scene_indices.h create mode 100644 contrib/draco/src/draco/scene/scene_node.h create mode 100644 contrib/draco/src/draco/scene/scene_test.cc create mode 100644 contrib/draco/src/draco/scene/scene_utils.cc create mode 100644 contrib/draco/src/draco/scene/scene_utils.h create mode 100644 contrib/draco/src/draco/scene/scene_utils_test.cc create mode 100644 contrib/draco/src/draco/scene/trs_matrix.cc create mode 100644 contrib/draco/src/draco/scene/trs_matrix.h create mode 100644 contrib/draco/src/draco/scene/trs_matrix_test.cc create mode 100644 contrib/draco/src/draco/texture/source_image.cc create mode 100644 contrib/draco/src/draco/texture/source_image.h create mode 100644 contrib/draco/src/draco/texture/texture.h create mode 100644 contrib/draco/src/draco/texture/texture_library.cc create mode 100644 contrib/draco/src/draco/texture/texture_library.h create mode 100644 contrib/draco/src/draco/texture/texture_library_test.cc create mode 100644 contrib/draco/src/draco/texture/texture_map.cc create mode 100644 contrib/draco/src/draco/texture/texture_map.h create mode 100644 contrib/draco/src/draco/texture/texture_map_test.cc create mode 100644 contrib/draco/src/draco/texture/texture_transform.cc create mode 100644 contrib/draco/src/draco/texture/texture_transform.h create mode 100644 contrib/draco/src/draco/texture/texture_transform_test.cc create mode 100644 contrib/draco/src/draco/texture/texture_utils.cc create mode 100644 contrib/draco/src/draco/texture/texture_utils.h create mode 100644 contrib/draco/src/draco/texture/texture_utils_test.cc create mode 100644 contrib/draco/src/draco/tools/draco_transcoder.cc create mode 100644 contrib/draco/src/draco/tools/draco_transcoder_lib.cc create mode 100644 contrib/draco/src/draco/tools/draco_transcoder_lib.h create mode 100644 contrib/draco/src/draco/tools/draco_transcoder_lib_test.cc create mode 100644 contrib/draco/src/draco/tools/install_test/CMakeLists.txt create mode 100644 contrib/draco/src/draco/tools/install_test/main.cc create mode 100644 contrib/draco/src/draco/tools/install_test/test.py diff --git a/contrib/draco/.cmake-format.py b/contrib/draco/.cmake-format.py index 64f2495b4..5b36f67aa 100644 --- a/contrib/draco/.cmake-format.py +++ b/contrib/draco/.cmake-format.py @@ -1,102 +1,137 @@ -# Generated with cmake-format 0.5.1 -# How wide to allow formatted cmake files -line_width = 80 - -# How many spaces to tab for indent -tab_size = 2 - -# If arglists are longer than this, break them always -max_subargs_per_line = 10 - -# If true, separate flow control names from their parentheses with a space -separate_ctrl_name_with_space = False - -# If true, separate function names from parentheses with a space -separate_fn_name_with_space = False - -# If a statement is wrapped to more than one line, than dangle the closing -# parenthesis on its own line -dangle_parens = False - -# What character to use for bulleted lists -bullet_char = '*' - -# What character to use as punctuation after numerals in an enumerated list -enum_char = '.' - -# What style line endings to use in the output. -line_ending = u'unix' - -# Format command names consistently as 'lower' or 'upper' case -command_case = u'lower' - -# Format keywords consistently as 'lower' or 'upper' case -keyword_case = u'unchanged' - -# Specify structure for custom cmake functions -additional_commands = { - "foo": { - "flags": [ - "BAR", - "BAZ" - ], - "kwargs": { - "HEADERS": "*", - "DEPENDS": "*", - "SOURCES": "*" - } +with section('parse'): + # Specify structure for custom cmake functions + additional_commands = { + 'draco_add_emscripten_executable': { + 'kwargs': { + 'NAME': '*', + 'SOURCES': '*', + 'OUTPUT_NAME': '*', + 'DEFINES': '*', + 'INCLUDES': '*', + 'COMPILE_FLAGS': '*', + 'LINK_FLAGS': '*', + 'OBJLIB_DEPS': '*', + 'LIB_DEPS': '*', + 'GLUE_PATH': '*', + 'PRE_LINK_JS_SOURCES': '*', + 'POST_LINK_JS_SOURCES': '*', + 'FEATURES': '*', + }, + 'pargs': 0, + }, + 'draco_add_executable': { + 'kwargs': { + 'NAME': '*', + 'SOURCES': '*', + 'OUTPUT_NAME': '*', + 'TEST': 0, + 'DEFINES': '*', + 'INCLUDES': '*', + 'COMPILE_FLAGS': '*', + 'LINK_FLAGS': '*', + 'OBJLIB_DEPS': '*', + 'LIB_DEPS': '*', + }, + 'pargs': 0, + }, + 'draco_add_library': { + 'kwargs': { + 'NAME': '*', + 'TYPE': '*', + 'SOURCES': '*', + 'TEST': 0, + 'OUTPUT_NAME': '*', + 'DEFINES': '*', + 'INCLUDES': '*', + 'COMPILE_FLAGS': '*', + 'LINK_FLAGS': '*', + 'OBJLIB_DEPS': '*', + 'LIB_DEPS': '*', + 'PUBLIC_INCLUDES': '*', + }, + 'pargs': 0, + }, + 'draco_generate_emscripten_glue': { + 'kwargs': { + 'INPUT_IDL': '*', + 'OUTPUT_PATH': '*', + }, + 'pargs': 0, + }, + 'draco_get_required_emscripten_flags': { + 'kwargs': { + 'FLAG_LIST_VAR_COMPILER': '*', + 'FLAG_LIST_VAR_LINKER': '*', + }, + 'pargs': 0, + }, + 'draco_option': { + 'kwargs': { + 'NAME': '*', + 'HELPSTRING': '*', + 'VALUE': '*', + }, + 'pargs': 0, + }, + # Rules for built in CMake commands and those from dependencies. + 'list': { + 'kwargs': { + 'APPEND': '*', + 'FILTER': '*', + 'FIND': '*', + 'GET': '*', + 'INSERT': '*', + 'JOIN': '*', + 'LENGTH': '*', + 'POP_BACK': '*', + 'POP_FRONT': '*', + 'PREPEND': '*', + 'REMOVE_DUPLICATES': '*', + 'REMOVE_ITEM': '*', + 'REVERSE': '*', + 'SORT': '*', + 'SUBLIST': '*', + 'TRANSFORM': '*', + }, + }, + 'protobuf_generate': { + 'kwargs': { + 'IMPORT_DIRS': '*', + 'LANGUAGE': '*', + 'OUT_VAR': '*', + 'PROTOC_OUT_DIR': '*', + 'PROTOS': '*', + }, + }, } -} -# A list of command names which should always be wrapped -always_wrap = [] +with section('format'): + # Formatting options. -# Specify the order of wrapping algorithms during successive reflow attempts -algorithm_order = [0, 1, 2, 3, 4] + # How wide to allow formatted cmake files + line_width = 80 -# If true, the argument lists which are known to be sortable will be sorted -# lexicographicall -autosort = False + # How many spaces to tab for indent + tab_size = 2 -# enable comment markup parsing and reflow -enable_markup = True + # If true, separate flow control names from their parentheses with a space + separate_ctrl_name_with_space = False -# If comment markup is enabled, don't reflow the first comment block in -# eachlistfile. Use this to preserve formatting of your -# copyright/licensestatements. -first_comment_is_literal = False + # If true, separate function names from parentheses with a space + separate_fn_name_with_space = False -# If comment markup is enabled, don't reflow any comment block which matchesthis -# (regex) pattern. Default is `None` (disabled). -literal_comment_pattern = None + # If a statement is wrapped to more than one line, than dangle the closing + # parenthesis on its own line. + dangle_parens = False -# Regular expression to match preformat fences in comments -# default=r'^\s*([`~]{3}[`~]*)(.*)$' -fence_pattern = u'^\\s*([`~]{3}[`~]*)(.*)$' + # Do not sort argument lists. + enable_sort = False -# Regular expression to match rulers in comments -# default=r'^\s*[^\w\s]{3}.*[^\w\s]{3}$' -ruler_pattern = u'^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$' + # What style line endings to use in the output. + line_ending = 'unix' -# If true, emit the unicode byte-order mark (BOM) at the start of the file -emit_byteorder_mark = False + # Format command names consistently as 'lower' or 'upper' case + command_case = 'canonical' -# If a comment line starts with at least this many consecutive hash characters, -# then don't lstrip() them off. This allows for lazy hash rulers where the first -# hash char is not separated by space -hashruler_min_length = 10 - -# If true, then insert a space between the first hash char and remaining hash -# chars in a hash ruler, and normalize its length to fill the column -canonicalize_hashrulers = True - -# Specify the encoding of the input file. Defaults to utf-8. -input_encoding = u'utf-8' - -# Specify the encoding of the output file. Defaults to utf-8. Note that cmake -# only claims to support utf-8 so be careful when using anything else -output_encoding = u'utf-8' - -# A dictionary containing any per-command configuration overrides. Currently -# only `command_case` is supported. -per_command = {} + # Format keywords consistently as 'lower' or 'upper' case + keyword_case = 'upper' diff --git a/contrib/draco/.gitattributes b/contrib/draco/.gitattributes new file mode 100644 index 000000000..96acfc612 --- /dev/null +++ b/contrib/draco/.gitattributes @@ -0,0 +1 @@ +*.obj eol=lf \ No newline at end of file diff --git a/contrib/draco/.gitmodules b/contrib/draco/.gitmodules new file mode 100644 index 000000000..25f0a1c03 --- /dev/null +++ b/contrib/draco/.gitmodules @@ -0,0 +1,12 @@ +[submodule "third_party/googletest"] + path = third_party/googletest + url = https://github.com/google/googletest.git +[submodule "third_party/eigen"] + path = third_party/eigen + url = https://gitlab.com/libeigen/eigen.git +[submodule "third_party/tinygltf"] + path = third_party/tinygltf + url = https://github.com/syoyo/tinygltf.git +[submodule "third_party/filesystem"] + path = third_party/filesystem + url = https://github.com/gulrak/filesystem diff --git a/contrib/draco/BUILDING.md b/contrib/draco/BUILDING.md index d33917b88..340b2b83b 100644 --- a/contrib/draco/BUILDING.md +++ b/contrib/draco/BUILDING.md @@ -4,8 +4,10 @@ _**Contents**_ * [Mac OS X](#mac-os-x) * [Windows](#windows) * [CMake Build Configuration](#cmake-build-configuration) + * [Transcoder](#transcoder) * [Debugging and Optimization](#debugging-and-optimization) * [Googletest Integration](#googletest-integration) + * [Third Party Libraries](#third-party-libraries) * [Javascript Encoder/Decoder](#javascript-encoderdecoder) * [WebAssembly Decoder](#webassembly-decoder) * [WebAssembly Mesh Only Decoder](#webassembly-mesh-only-decoder) @@ -72,6 +74,43 @@ C:\Users\nobody> cmake ../ -G "Visual Studio 16 2019" -A x64 CMake Build Configuration ------------------------- +Transcoder +---------- + +Before attempting to build Draco with transcoding support you must run an +additional Git command to obtain the submodules: + +~~~~~ bash +# Run this command from within your Draco clone. +$ git submodule update --init +# See below if you prefer to use existing versions of Draco dependencies. +~~~~~ + +In order to build the `draco_transcoder` target, the transcoding support needs +to be explicitly enabled when you run `cmake`, for example: + +~~~~~ bash +$ cmake ../ -DDRACO_TRANSCODER_SUPPORTED=ON +~~~~~ + +The above option is currently not compatible with our Javascript or WebAssembly +builds but all other use cases are supported. Note that binaries and libraries +built with the transcoder support may result in increased binary sizes of the +produced libraries and executables compared to the default CMake settings. + +The following CMake variables can be used to configure Draco to use local +copies of third party dependencies instead of git submodules. + +- `DRACO_EIGEN_PATH`: this path must contain an Eigen directory that includes + the Eigen sources. +- `DRACO_FILESYSTEM_PATH`: this path must contain the ghc directory where the + filesystem includes are located. +- `DRACO_TINYGLTF_PATH`: this path must contain tiny_gltf.h and its + dependencies. + +When not specified the Draco build requires the presence of the submodules that +are stored within `draco/third_party`. + Debugging and Optimization -------------------------- @@ -114,17 +153,52 @@ $ cmake ../ -DDRACO_SANITIZE=address Googletest Integration ---------------------- -Draco includes testing support built using Googletest. To enable Googletest unit -test support the DRACO_TESTS cmake variable must be turned on at cmake -generation time: +Draco includes testing support built using Googletest. The Googletest repository +is included as a submodule of the Draco git repository. Run the following +command to clone the Googletest repository: + +~~~~~ bash +$ git submodule update --init +~~~~~ + +To enable Googletest unit test support the DRACO_TESTS cmake variable must be +turned on at cmake generation time: ~~~~~ bash $ cmake ../ -DDRACO_TESTS=ON ~~~~~ -When cmake is used as shown in the above example the googletest directory must -be a sibling of the Draco repository root directory. To run the tests execute -`draco_tests` from your build output directory. +To run the tests execute `draco_tests` from your build output directory: + +~~~~~ bash +$ ./draco_tests +~~~~~ + +Draco can be configured to use a local Googletest installation. The +`DRACO_GOOGLETEST_PATH` variable overrides the behavior described above and +configures Draco to use the Googletest at the specified path. + +Third Party Libraries +--------------------- + +When Draco is built with transcoding and/or testing support enabled the project +has dependencies on third party libraries: + +- [Eigen](https://eigen.tuxfamily.org/) + - Provides various math utilites. +- [Googletest](https://github.com/google/googletest) + - Provides testing support. +- [Gulrak/filesystem](https://github.com/gulrak/filesystem) + - Provides C++17 std::filesystem emulation for pre-C++17 environments. +- [TinyGLTF](https://github.com/syoyo/tinygltf) + - Provides GLTF I/O support. + +These dependencies are managed as Git submodules. To obtain the dependencies +run the following command in your Draco repository: + +~~~~~ bash +$ git submodule update --init +~~~~~ WebAssembly Decoder ------------------- diff --git a/contrib/draco/CMakeLists.txt b/contrib/draco/CMakeLists.txt index 6ea9b21fd..a93267d25 100644 --- a/contrib/draco/CMakeLists.txt +++ b/contrib/draco/CMakeLists.txt @@ -1,7 +1,18 @@ -cmake_minimum_required(VERSION 3.12 FATAL_ERROR) +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. -# Draco requires C++11. -set(CMAKE_CXX_STANDARD 11) +cmake_minimum_required(VERSION 3.12 FATAL_ERROR) project(draco C CXX) if(NOT CMAKE_BUILD_TYPE) @@ -10,21 +21,23 @@ endif() set(draco_root "${CMAKE_CURRENT_SOURCE_DIR}") set(draco_src_root "${draco_root}/src/draco") -set(draco_build "${Assimp_BINARY_DIR}") +set(draco_build "${CMAKE_BINARY_DIR}") if("${draco_root}" STREQUAL "${draco_build}") message( - FATAL_ERROR "Building from within the Draco source tree is not supported.\n" - "Hint: Run these commands\n" - "$ rm -rf CMakeCache.txt CMakeFiles\n" - "$ mkdir -p ../draco_build\n" "$ cd ../draco_build\n" - "And re-run CMake from the draco_build directory.") + FATAL_ERROR + "Building from within the Draco source tree is not supported.\n" + "Hint: Run these commands\n" + "$ rm -rf CMakeCache.txt CMakeFiles\n" + "$ mkdir -p ../draco_build\n" + "$ cd ../draco_build\n" + "And re-run CMake from the draco_build directory.") endif() -include(CMakePackageConfigHelpers) include(FindPythonInterp) include("${draco_root}/cmake/draco_build_definitions.cmake") include("${draco_root}/cmake/draco_cpu_detection.cmake") +include("${draco_root}/cmake/draco_dependencies.cmake") include("${draco_root}/cmake/draco_emscripten.cmake") include("${draco_root}/cmake/draco_flags.cmake") include("${draco_root}/cmake/draco_helpers.cmake") @@ -49,6 +62,7 @@ draco_track_configuration_variable(DRACO_GENERATED_SOURCES_DIRECTORY) # Controls use of std::mutex and absl::Mutex in ThreadPool. draco_track_configuration_variable(DRACO_THREADPOOL_USE_STD_MUTEX) + if(DRACO_VERBOSE) draco_dump_cmake_flag_variables() draco_dump_tracked_configuration_variables() @@ -68,29 +82,32 @@ draco_reset_target_lists() draco_setup_options() draco_set_build_definitions() draco_set_cxx_flags() +draco_set_exe_linker_flags() draco_generate_features_h() # Draco source file listing variables. -list(APPEND draco_attributes_sources - "${draco_src_root}/attributes/attribute_octahedron_transform.cc" - "${draco_src_root}/attributes/attribute_octahedron_transform.h" - "${draco_src_root}/attributes/attribute_quantization_transform.cc" - "${draco_src_root}/attributes/attribute_quantization_transform.h" - "${draco_src_root}/attributes/attribute_transform.cc" - "${draco_src_root}/attributes/attribute_transform.h" - "${draco_src_root}/attributes/attribute_transform_data.h" - "${draco_src_root}/attributes/attribute_transform_type.h" - "${draco_src_root}/attributes/geometry_attribute.cc" - "${draco_src_root}/attributes/geometry_attribute.h" - "${draco_src_root}/attributes/geometry_indices.h" - "${draco_src_root}/attributes/point_attribute.cc" - "${draco_src_root}/attributes/point_attribute.h") +list( + APPEND draco_attributes_sources + "${draco_src_root}/attributes/attribute_octahedron_transform.cc" + "${draco_src_root}/attributes/attribute_octahedron_transform.h" + "${draco_src_root}/attributes/attribute_quantization_transform.cc" + "${draco_src_root}/attributes/attribute_quantization_transform.h" + "${draco_src_root}/attributes/attribute_transform.cc" + "${draco_src_root}/attributes/attribute_transform.h" + "${draco_src_root}/attributes/attribute_transform_data.h" + "${draco_src_root}/attributes/attribute_transform_type.h" + "${draco_src_root}/attributes/geometry_attribute.cc" + "${draco_src_root}/attributes/geometry_attribute.h" + "${draco_src_root}/attributes/geometry_indices.h" + "${draco_src_root}/attributes/point_attribute.cc" + "${draco_src_root}/attributes/point_attribute.h") list( APPEND draco_compression_attributes_dec_sources "${draco_src_root}/compression/attributes/attributes_decoder.cc" "${draco_src_root}/compression/attributes/attributes_decoder.h" + "${draco_src_root}/compression/attributes/attributes_decoder_interface.h" "${draco_src_root}/compression/attributes/kd_tree_attributes_decoder.cc" "${draco_src_root}/compression/attributes/kd_tree_attributes_decoder.h" "${draco_src_root}/compression/attributes/kd_tree_attributes_shared.h" @@ -107,7 +124,7 @@ list( "${draco_src_root}/compression/attributes/sequential_normal_attribute_decoder.h" "${draco_src_root}/compression/attributes/sequential_quantization_attribute_decoder.cc" "${draco_src_root}/compression/attributes/sequential_quantization_attribute_decoder.h" - ) +) list( APPEND @@ -128,7 +145,7 @@ list( "${draco_src_root}/compression/attributes/sequential_normal_attribute_encoder.h" "${draco_src_root}/compression/attributes/sequential_quantization_attribute_encoder.cc" "${draco_src_root}/compression/attributes/sequential_quantization_attribute_encoder.h" - ) +) list( @@ -160,7 +177,7 @@ list( "${draco_src_root}/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_transform_base.h" "${draco_src_root}/compression/attributes/prediction_schemes/prediction_scheme_wrap_decoding_transform.h" "${draco_src_root}/compression/attributes/prediction_schemes/prediction_scheme_wrap_transform_base.h" - ) +) list( APPEND @@ -192,7 +209,7 @@ list( "${draco_src_root}/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_transform_base.h" "${draco_src_root}/compression/attributes/prediction_schemes/prediction_scheme_wrap_encoding_transform.h" "${draco_src_root}/compression/attributes/prediction_schemes/prediction_scheme_wrap_transform_base.h" - ) +) list( APPEND @@ -217,27 +234,34 @@ list( "${draco_src_root}/compression/bit_coders/symbol_bit_encoder.cc" "${draco_src_root}/compression/bit_coders/symbol_bit_encoder.h") -list(APPEND draco_enc_config_sources - "${draco_src_root}/compression/config/compression_shared.h" - "${draco_src_root}/compression/config/draco_options.h" - "${draco_src_root}/compression/config/encoder_options.h" - "${draco_src_root}/compression/config/encoding_features.h") +list( + APPEND draco_enc_config_sources + "${draco_src_root}/compression/config/compression_shared.h" + "${draco_src_root}/compression/config/draco_options.h" + "${draco_src_root}/compression/config/encoder_options.h" + "${draco_src_root}/compression/config/encoding_features.h") -list(APPEND draco_dec_config_sources - "${draco_src_root}/compression/config/compression_shared.h" - "${draco_src_root}/compression/config/decoder_options.h" - "${draco_src_root}/compression/config/draco_options.h") +list( + APPEND draco_dec_config_sources + "${draco_src_root}/compression/config/compression_shared.h" + "${draco_src_root}/compression/config/decoder_options.h" + "${draco_src_root}/compression/config/draco_options.h") + +list(APPEND draco_compression_options_sources + "${draco_src_root}/compression/draco_compression_options.cc" + "${draco_src_root}/compression/draco_compression_options.h") list(APPEND draco_compression_decode_sources "${draco_src_root}/compression/decode.cc" "${draco_src_root}/compression/decode.h") -list(APPEND draco_compression_encode_sources - "${draco_src_root}/compression/encode.cc" - "${draco_src_root}/compression/encode.h" - "${draco_src_root}/compression/encode_base.h" - "${draco_src_root}/compression/expert_encode.cc" - "${draco_src_root}/compression/expert_encode.h") +list( + APPEND draco_compression_encode_sources + "${draco_src_root}/compression/encode.cc" + "${draco_src_root}/compression/encode.h" + "${draco_src_root}/compression/encode_base.h" + "${draco_src_root}/compression/expert_encode.cc" + "${draco_src_root}/compression/expert_encode.h") list( APPEND @@ -291,7 +315,7 @@ list( "${draco_src_root}/compression/point_cloud/point_cloud_kd_tree_decoder.h" "${draco_src_root}/compression/point_cloud/point_cloud_sequential_decoder.cc" "${draco_src_root}/compression/point_cloud/point_cloud_sequential_decoder.h" - ) +) list( APPEND @@ -302,112 +326,126 @@ list( "${draco_src_root}/compression/point_cloud/point_cloud_kd_tree_encoder.h" "${draco_src_root}/compression/point_cloud/point_cloud_sequential_encoder.cc" "${draco_src_root}/compression/point_cloud/point_cloud_sequential_encoder.h" - ) +) -list(APPEND draco_compression_entropy_sources - "${draco_src_root}/compression/entropy/ans.h" - "${draco_src_root}/compression/entropy/rans_symbol_coding.h" - "${draco_src_root}/compression/entropy/rans_symbol_decoder.h" - "${draco_src_root}/compression/entropy/rans_symbol_encoder.h" - "${draco_src_root}/compression/entropy/shannon_entropy.cc" - "${draco_src_root}/compression/entropy/shannon_entropy.h" - "${draco_src_root}/compression/entropy/symbol_decoding.cc" - "${draco_src_root}/compression/entropy/symbol_decoding.h" - "${draco_src_root}/compression/entropy/symbol_encoding.cc" - "${draco_src_root}/compression/entropy/symbol_encoding.h") +list( + APPEND draco_compression_entropy_sources + "${draco_src_root}/compression/entropy/ans.h" + "${draco_src_root}/compression/entropy/rans_symbol_coding.h" + "${draco_src_root}/compression/entropy/rans_symbol_decoder.h" + "${draco_src_root}/compression/entropy/rans_symbol_encoder.h" + "${draco_src_root}/compression/entropy/shannon_entropy.cc" + "${draco_src_root}/compression/entropy/shannon_entropy.h" + "${draco_src_root}/compression/entropy/symbol_decoding.cc" + "${draco_src_root}/compression/entropy/symbol_decoding.h" + "${draco_src_root}/compression/entropy/symbol_encoding.cc" + "${draco_src_root}/compression/entropy/symbol_encoding.h") -list(APPEND draco_core_sources - "${draco_src_root}/core/bit_utils.cc" - "${draco_src_root}/core/bit_utils.h" - "${draco_src_root}/core/bounding_box.cc" - "${draco_src_root}/core/bounding_box.h" - "${draco_src_root}/core/cycle_timer.cc" - "${draco_src_root}/core/cycle_timer.h" - "${draco_src_root}/core/data_buffer.cc" - "${draco_src_root}/core/data_buffer.h" - "${draco_src_root}/core/decoder_buffer.cc" - "${draco_src_root}/core/decoder_buffer.h" - "${draco_src_root}/core/divide.cc" - "${draco_src_root}/core/divide.h" - "${draco_src_root}/core/draco_index_type.h" - "${draco_src_root}/core/draco_index_type_vector.h" - "${draco_src_root}/core/draco_types.cc" - "${draco_src_root}/core/draco_types.h" - "${draco_src_root}/core/encoder_buffer.cc" - "${draco_src_root}/core/encoder_buffer.h" - "${draco_src_root}/core/hash_utils.cc" - "${draco_src_root}/core/hash_utils.h" - "${draco_src_root}/core/macros.h" - "${draco_src_root}/core/math_utils.h" - "${draco_src_root}/core/options.cc" - "${draco_src_root}/core/options.h" - "${draco_src_root}/core/quantization_utils.cc" - "${draco_src_root}/core/quantization_utils.h" - "${draco_src_root}/core/status.h" - "${draco_src_root}/core/status_or.h" - "${draco_src_root}/core/varint_decoding.h" - "${draco_src_root}/core/varint_encoding.h" - "${draco_src_root}/core/vector_d.h") +list( + APPEND draco_core_sources + "${draco_src_root}/core/bit_utils.cc" + "${draco_src_root}/core/bit_utils.h" + "${draco_src_root}/core/bounding_box.cc" + "${draco_src_root}/core/bounding_box.h" + "${draco_src_root}/core/constants.h" + "${draco_src_root}/core/cycle_timer.cc" + "${draco_src_root}/core/cycle_timer.h" + "${draco_src_root}/core/data_buffer.cc" + "${draco_src_root}/core/data_buffer.h" + "${draco_src_root}/core/decoder_buffer.cc" + "${draco_src_root}/core/decoder_buffer.h" + "${draco_src_root}/core/divide.cc" + "${draco_src_root}/core/divide.h" + "${draco_src_root}/core/draco_index_type.h" + "${draco_src_root}/core/draco_index_type_vector.h" + "${draco_src_root}/core/draco_types.cc" + "${draco_src_root}/core/draco_types.h" + "${draco_src_root}/core/draco_version.h" + "${draco_src_root}/core/encoder_buffer.cc" + "${draco_src_root}/core/encoder_buffer.h" + "${draco_src_root}/core/hash_utils.cc" + "${draco_src_root}/core/hash_utils.h" + "${draco_src_root}/core/macros.h" + "${draco_src_root}/core/math_utils.h" + "${draco_src_root}/core/options.cc" + "${draco_src_root}/core/options.h" + "${draco_src_root}/core/quantization_utils.cc" + "${draco_src_root}/core/quantization_utils.h" + "${draco_src_root}/core/status.h" + "${draco_src_root}/core/status_or.h" + "${draco_src_root}/core/varint_decoding.h" + "${draco_src_root}/core/varint_encoding.h" + "${draco_src_root}/core/vector_d.h") -list(APPEND draco_io_sources - "${draco_src_root}/io/file_reader_factory.cc" - "${draco_src_root}/io/file_reader_factory.h" - "${draco_src_root}/io/file_reader_interface.h" - "${draco_src_root}/io/file_utils.cc" - "${draco_src_root}/io/file_utils.h" - "${draco_src_root}/io/file_writer_factory.cc" - "${draco_src_root}/io/file_writer_factory.h" - "${draco_src_root}/io/file_writer_interface.h" - "${draco_src_root}/io/file_writer_utils.h" - "${draco_src_root}/io/file_writer_utils.cc" - "${draco_src_root}/io/mesh_io.cc" - "${draco_src_root}/io/mesh_io.h" - "${draco_src_root}/io/obj_decoder.cc" - "${draco_src_root}/io/obj_decoder.h" - "${draco_src_root}/io/obj_encoder.cc" - "${draco_src_root}/io/obj_encoder.h" - "${draco_src_root}/io/parser_utils.cc" - "${draco_src_root}/io/parser_utils.h" - "${draco_src_root}/io/ply_decoder.cc" - "${draco_src_root}/io/ply_decoder.h" - "${draco_src_root}/io/ply_encoder.cc" - "${draco_src_root}/io/ply_encoder.h" - "${draco_src_root}/io/ply_property_reader.h" - "${draco_src_root}/io/ply_property_writer.h" - "${draco_src_root}/io/ply_reader.cc" - "${draco_src_root}/io/ply_reader.h" - "${draco_src_root}/io/point_cloud_io.cc" - "${draco_src_root}/io/point_cloud_io.h" - "${draco_src_root}/io/stdio_file_reader.cc" - "${draco_src_root}/io/stdio_file_reader.h" - "${draco_src_root}/io/stdio_file_writer.cc" - "${draco_src_root}/io/stdio_file_writer.h") +list( + APPEND draco_io_sources + "${draco_src_root}/io/file_reader_factory.cc" + "${draco_src_root}/io/file_reader_factory.h" + "${draco_src_root}/io/file_reader_interface.h" + "${draco_src_root}/io/file_utils.cc" + "${draco_src_root}/io/file_utils.h" + "${draco_src_root}/io/file_writer_factory.cc" + "${draco_src_root}/io/file_writer_factory.h" + "${draco_src_root}/io/file_writer_interface.h" + "${draco_src_root}/io/file_writer_utils.h" + "${draco_src_root}/io/file_writer_utils.cc" + "${draco_src_root}/io/mesh_io.cc" + "${draco_src_root}/io/mesh_io.h" + "${draco_src_root}/io/obj_decoder.cc" + "${draco_src_root}/io/obj_decoder.h" + "${draco_src_root}/io/obj_encoder.cc" + "${draco_src_root}/io/obj_encoder.h" + "${draco_src_root}/io/parser_utils.cc" + "${draco_src_root}/io/parser_utils.h" + "${draco_src_root}/io/ply_decoder.cc" + "${draco_src_root}/io/ply_decoder.h" + "${draco_src_root}/io/ply_encoder.cc" + "${draco_src_root}/io/ply_encoder.h" + "${draco_src_root}/io/ply_property_reader.h" + "${draco_src_root}/io/ply_property_writer.h" + "${draco_src_root}/io/ply_reader.cc" + "${draco_src_root}/io/ply_reader.h" + "${draco_src_root}/io/stl_decoder.cc" + "${draco_src_root}/io/stl_decoder.h" + "${draco_src_root}/io/stl_encoder.cc" + "${draco_src_root}/io/stl_encoder.h" + "${draco_src_root}/io/point_cloud_io.cc" + "${draco_src_root}/io/point_cloud_io.h" + "${draco_src_root}/io/stdio_file_reader.cc" + "${draco_src_root}/io/stdio_file_reader.h" + "${draco_src_root}/io/stdio_file_writer.cc" + "${draco_src_root}/io/stdio_file_writer.h") -list(APPEND draco_mesh_sources - "${draco_src_root}/mesh/corner_table.cc" - "${draco_src_root}/mesh/corner_table.h" - "${draco_src_root}/mesh/corner_table_iterators.h" - "${draco_src_root}/mesh/mesh.cc" - "${draco_src_root}/mesh/mesh.h" - "${draco_src_root}/mesh/mesh_are_equivalent.cc" - "${draco_src_root}/mesh/mesh_are_equivalent.h" - "${draco_src_root}/mesh/mesh_attribute_corner_table.cc" - "${draco_src_root}/mesh/mesh_attribute_corner_table.h" - "${draco_src_root}/mesh/mesh_cleanup.cc" - "${draco_src_root}/mesh/mesh_cleanup.h" - "${draco_src_root}/mesh/mesh_misc_functions.cc" - "${draco_src_root}/mesh/mesh_misc_functions.h" - "${draco_src_root}/mesh/mesh_stripifier.cc" - "${draco_src_root}/mesh/mesh_stripifier.h" - "${draco_src_root}/mesh/triangle_soup_mesh_builder.cc" - "${draco_src_root}/mesh/triangle_soup_mesh_builder.h" - "${draco_src_root}/mesh/valence_cache.h") +list( + APPEND draco_mesh_sources + "${draco_src_root}/mesh/corner_table.cc" + "${draco_src_root}/mesh/corner_table.h" + "${draco_src_root}/mesh/corner_table_iterators.h" + "${draco_src_root}/mesh/mesh.cc" + "${draco_src_root}/mesh/mesh.h" + "${draco_src_root}/mesh/mesh_are_equivalent.cc" + "${draco_src_root}/mesh/mesh_are_equivalent.h" + "${draco_src_root}/mesh/mesh_attribute_corner_table.cc" + "${draco_src_root}/mesh/mesh_attribute_corner_table.h" + "${draco_src_root}/mesh/mesh_cleanup.cc" + "${draco_src_root}/mesh/mesh_cleanup.h" + "${draco_src_root}/mesh/mesh_features.cc" + "${draco_src_root}/mesh/mesh_features.h" + "${draco_src_root}/mesh/mesh_indices.h" + "${draco_src_root}/mesh/mesh_misc_functions.cc" + "${draco_src_root}/mesh/mesh_misc_functions.h" + "${draco_src_root}/mesh/mesh_stripifier.cc" + "${draco_src_root}/mesh/mesh_stripifier.h" + "${draco_src_root}/mesh/triangle_soup_mesh_builder.cc" + "${draco_src_root}/mesh/triangle_soup_mesh_builder.h" + "${draco_src_root}/mesh/valence_cache.h") -list(APPEND draco_point_cloud_sources - "${draco_src_root}/point_cloud/point_cloud.cc" - "${draco_src_root}/point_cloud/point_cloud.h" - "${draco_src_root}/point_cloud/point_cloud_builder.cc" - "${draco_src_root}/point_cloud/point_cloud_builder.h") +list( + APPEND draco_point_cloud_sources + "${draco_src_root}/point_cloud/point_cloud.cc" + "${draco_src_root}/point_cloud/point_cloud.h" + "${draco_src_root}/point_cloud/point_cloud_builder.cc" + "${draco_src_root}/point_cloud/point_cloud_builder.h") list( APPEND @@ -424,7 +462,7 @@ list( "${draco_src_root}/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_decoder.h" "${draco_src_root}/compression/point_cloud/algorithms/float_points_tree_decoder.cc" "${draco_src_root}/compression/point_cloud/algorithms/float_points_tree_decoder.h" - ) +) list( APPEND @@ -433,13 +471,18 @@ list( "${draco_src_root}/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_encoder.h" "${draco_src_root}/compression/point_cloud/algorithms/float_points_tree_encoder.cc" "${draco_src_root}/compression/point_cloud/algorithms/float_points_tree_encoder.h" - ) +) -list(APPEND draco_metadata_sources - "${draco_src_root}/metadata/geometry_metadata.cc" - "${draco_src_root}/metadata/geometry_metadata.h" - "${draco_src_root}/metadata/metadata.cc" - "${draco_src_root}/metadata/metadata.h") +list( + APPEND draco_metadata_sources + "${draco_src_root}/metadata/geometry_metadata.cc" + "${draco_src_root}/metadata/geometry_metadata.h" + "${draco_src_root}/metadata/metadata.cc" + "${draco_src_root}/metadata/metadata.h" + "${draco_src_root}/metadata/property_table.cc" + "${draco_src_root}/metadata/property_table.h" + "${draco_src_root}/metadata/structural_metadata.cc" + "${draco_src_root}/metadata/structural_metadata.h") list(APPEND draco_metadata_enc_sources "${draco_src_root}/metadata/metadata_encoder.cc" @@ -465,7 +508,7 @@ list( APPEND draco_js_dec_sources "${draco_src_root}/javascript/emscripten/decoder_webidl_wrapper.cc" "${draco_src_root}/javascript/emscripten/draco_decoder_glue_wrapper.cc" - ) +) list( APPEND draco_js_enc_sources @@ -477,14 +520,14 @@ list( draco_animation_js_dec_sources "${draco_src_root}/javascript/emscripten/animation_decoder_webidl_wrapper.cc" "${draco_src_root}/javascript/emscripten/draco_animation_decoder_glue_wrapper.cc" - ) +) list( APPEND draco_animation_js_enc_sources "${draco_src_root}/javascript/emscripten/animation_encoder_webidl_wrapper.cc" "${draco_src_root}/javascript/emscripten/draco_animation_encoder_glue_wrapper.cc" - ) +) list(APPEND draco_unity_plug_sources "${draco_src_root}/unity/draco_unity_plugin.cc" @@ -494,49 +537,133 @@ list(APPEND draco_maya_plug_sources "${draco_src_root}/maya/draco_maya_plugin.cc" "${draco_src_root}/maya/draco_maya_plugin.h") +if(DRACO_TRANSCODER_SUPPORTED) + list( + APPEND draco_animation_sources + "${draco_src_root}/animation/animation.cc" + "${draco_src_root}/animation/animation.h" + "${draco_src_root}/animation/node_animation_data.h" + "${draco_src_root}/animation/skin.cc" + "${draco_src_root}/animation/skin.h") + + list( + APPEND draco_io_sources + "${draco_src_root}/io/gltf_decoder.cc" + "${draco_src_root}/io/gltf_decoder.h" + "${draco_src_root}/io/gltf_encoder.cc" + "${draco_src_root}/io/gltf_encoder.h" + "${draco_src_root}/io/gltf_utils.cc" + "${draco_src_root}/io/gltf_utils.h" + "${draco_src_root}/io/image_compression_options.h" + "${draco_src_root}/io/scene_io.cc" + "${draco_src_root}/io/scene_io.h" + "${draco_src_root}/io/texture_io.cc" + "${draco_src_root}/io/texture_io.h" + "${draco_src_root}/io/tiny_gltf_utils.cc" + "${draco_src_root}/io/tiny_gltf_utils.h") + + list( + APPEND draco_material_sources + "${draco_src_root}/material/material.cc" + "${draco_src_root}/material/material.h" + "${draco_src_root}/material/material_library.cc" + "${draco_src_root}/material/material_library.h") + + list( + APPEND draco_mesh_sources + "${draco_src_root}/mesh/mesh_connected_components.h" + "${draco_src_root}/mesh/mesh_splitter.cc" + "${draco_src_root}/mesh/mesh_splitter.h" + "${draco_src_root}/mesh/mesh_utils.cc" + "${draco_src_root}/mesh/mesh_utils.h") + + list( + APPEND draco_scene_sources + "${draco_src_root}/scene/instance_array.cc" + "${draco_src_root}/scene/instance_array.h" + "${draco_src_root}/scene/light.cc" + "${draco_src_root}/scene/light.h" + "${draco_src_root}/scene/mesh_group.h" + "${draco_src_root}/scene/scene.cc" + "${draco_src_root}/scene/scene.h" + "${draco_src_root}/scene/scene_are_equivalent.cc" + "${draco_src_root}/scene/scene_are_equivalent.h" + "${draco_src_root}/scene/scene_indices.h" + "${draco_src_root}/scene/scene_node.h" + "${draco_src_root}/scene/scene_utils.cc" + "${draco_src_root}/scene/scene_utils.h" + "${draco_src_root}/scene/trs_matrix.cc" + "${draco_src_root}/scene/trs_matrix.h") + + list( + APPEND draco_texture_sources + "${draco_src_root}/texture/source_image.cc" + "${draco_src_root}/texture/source_image.h" + "${draco_src_root}/texture/texture.h" + "${draco_src_root}/texture/texture_library.cc" + "${draco_src_root}/texture/texture_library.h" + "${draco_src_root}/texture/texture_map.cc" + "${draco_src_root}/texture/texture_map.h" + "${draco_src_root}/texture/texture_transform.cc" + "${draco_src_root}/texture/texture_transform.h" + "${draco_src_root}/texture/texture_utils.cc" + "${draco_src_root}/texture/texture_utils.h") + + +endif() + # # Draco targets. # if(EMSCRIPTEN AND DRACO_JS_GLUE) # Draco decoder and encoder "executable" targets in various flavors for - # Emsscripten. - list(APPEND draco_decoder_src - ${draco_attributes_sources} - ${draco_compression_attributes_dec_sources} - ${draco_compression_attributes_pred_schemes_dec_sources} - ${draco_compression_bit_coders_sources} - ${draco_compression_decode_sources} - ${draco_compression_entropy_sources} - ${draco_compression_mesh_traverser_sources} - ${draco_compression_mesh_dec_sources} - ${draco_compression_point_cloud_dec_sources} - ${draco_core_sources} - ${draco_dec_config_sources} - ${draco_js_dec_sources} - ${draco_mesh_sources} - ${draco_metadata_dec_sources} - ${draco_metadata_sources} - ${draco_point_cloud_sources} - ${draco_points_dec_sources}) + # Emscripten. - list(APPEND draco_encoder_src - ${draco_attributes_sources} - ${draco_compression_attributes_enc_sources} - ${draco_compression_attributes_pred_schemes_enc_sources} - ${draco_compression_bit_coders_sources} - ${draco_compression_encode_sources} - ${draco_compression_entropy_sources} - ${draco_compression_mesh_traverser_sources} - ${draco_compression_mesh_enc_sources} - ${draco_compression_point_cloud_enc_sources} - ${draco_core_sources} - ${draco_enc_config_sources} - ${draco_js_enc_sources} - ${draco_mesh_sources} - ${draco_metadata_enc_sources} - ${draco_metadata_sources} - ${draco_point_cloud_sources} - ${draco_points_enc_sources}) + if(DRACO_TRANSCODER_SUPPORTED) + message(FATAL_ERROR "The transcoder is not supported in Emscripten.") + endif() + + list( + APPEND draco_decoder_src + ${draco_attributes_sources} + ${draco_compression_attributes_dec_sources} + ${draco_compression_attributes_pred_schemes_dec_sources} + ${draco_compression_bit_coders_sources} + ${draco_compression_decode_sources} + ${draco_compression_entropy_sources} + ${draco_compression_mesh_traverser_sources} + ${draco_compression_mesh_dec_sources} + ${draco_compression_options_sources} + ${draco_compression_point_cloud_dec_sources} + ${draco_core_sources} + ${draco_dec_config_sources} + ${draco_js_dec_sources} + ${draco_mesh_sources} + ${draco_metadata_dec_sources} + ${draco_metadata_sources} + ${draco_point_cloud_sources} + ${draco_points_dec_sources}) + + list( + APPEND draco_encoder_src + ${draco_attributes_sources} + ${draco_compression_attributes_enc_sources} + ${draco_compression_attributes_pred_schemes_enc_sources} + ${draco_compression_bit_coders_sources} + ${draco_compression_encode_sources} + ${draco_compression_entropy_sources} + ${draco_compression_mesh_traverser_sources} + ${draco_compression_mesh_enc_sources} + ${draco_compression_options_sources} + ${draco_compression_point_cloud_enc_sources} + ${draco_core_sources} + ${draco_enc_config_sources} + ${draco_js_enc_sources} + ${draco_mesh_sources} + ${draco_metadata_enc_sources} + ${draco_metadata_sources} + ${draco_point_cloud_sources} + ${draco_points_enc_sources}) list(APPEND draco_js_dec_idl "${draco_src_root}/javascript/emscripten/draco_web_decoder.idl") @@ -561,10 +688,10 @@ if(EMSCRIPTEN AND DRACO_JS_GLUE) set(draco_decoder_glue_path "${draco_build}/glue_decoder") set(draco_encoder_glue_path "${draco_build}/glue_encoder") - draco_generate_emscripten_glue(INPUT_IDL ${draco_js_dec_idl} OUTPUT_PATH - ${draco_decoder_glue_path}) - draco_generate_emscripten_glue(INPUT_IDL ${draco_js_enc_idl} OUTPUT_PATH - ${draco_encoder_glue_path}) + draco_generate_emscripten_glue(INPUT_IDL ${draco_js_dec_idl} + OUTPUT_PATH ${draco_decoder_glue_path}) + draco_generate_emscripten_glue(INPUT_IDL ${draco_js_enc_idl} + OUTPUT_PATH ${draco_encoder_glue_path}) if(DRACO_DECODER_ATTRIBUTE_DEDUPLICATION) list(APPEND draco_decoder_features @@ -572,45 +699,28 @@ if(EMSCRIPTEN AND DRACO_JS_GLUE) "DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED") endif() - draco_add_emscripten_executable(NAME - draco_decoder - SOURCES - ${draco_decoder_src} - DEFINES - ${draco_defines} - FEATURES - ${draco_decoder_features} - INCLUDES - ${draco_include_paths} - LINK_FLAGS - "-sEXPORT_NAME=\"DracoDecoderModule\"" - GLUE_PATH - ${draco_decoder_glue_path} - PRE_LINK_JS_SOURCES - ${draco_pre_link_js_sources} - POST_LINK_JS_SOURCES - ${draco_post_link_js_decoder_sources}) + draco_add_emscripten_executable( + NAME draco_decoder + SOURCES ${draco_decoder_src} + DEFINES ${draco_defines} + FEATURES ${draco_decoder_features} + INCLUDES ${draco_include_paths} + LINK_FLAGS "-sEXPORT_NAME=\"DracoDecoderModule\"" + GLUE_PATH ${draco_decoder_glue_path} + PRE_LINK_JS_SOURCES ${draco_pre_link_js_sources} + POST_LINK_JS_SOURCES ${draco_post_link_js_decoder_sources}) draco_add_emscripten_executable( - NAME - draco_encoder - SOURCES - ${draco_encoder_src} - DEFINES - ${draco_defines} - FEATURES - DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED - DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED - INCLUDES - ${draco_include_paths} - LINK_FLAGS - "-sEXPORT_NAME=\"DracoEncoderModule\"" - GLUE_PATH - ${draco_encoder_glue_path} - PRE_LINK_JS_SOURCES - ${draco_pre_link_js_sources} - POST_LINK_JS_SOURCES - ${draco_post_link_js_sources}) + NAME draco_encoder + SOURCES ${draco_encoder_src} + DEFINES ${draco_defines} + FEATURES DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED + DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED + INCLUDES ${draco_include_paths} + LINK_FLAGS "-sEXPORT_NAME=\"DracoEncoderModule\"" + GLUE_PATH ${draco_encoder_glue_path} + PRE_LINK_JS_SOURCES ${draco_pre_link_js_sources} + POST_LINK_JS_SOURCES ${draco_post_link_js_sources}) if(DRACO_ANIMATION_ENCODING) set(draco_anim_decoder_glue_path "${draco_build}/glue_animation_decoder") @@ -622,186 +732,270 @@ if(EMSCRIPTEN AND DRACO_JS_GLUE) OUTPUT_PATH ${draco_anim_encoder_glue_path}) draco_add_emscripten_executable( - NAME - draco_animation_decoder - SOURCES - ${draco_animation_dec_sources} - ${draco_animation_js_dec_sources} - ${draco_animation_sources} - ${draco_decoder_src} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - LINK_FLAGS - "-sEXPORT_NAME=\"DracoAnimationDecoderModule\"" - GLUE_PATH - ${draco_anim_decoder_glue_path} - PRE_LINK_JS_SOURCES - ${draco_pre_link_js_sources} - POST_LINK_JS_SOURCES - ${draco_post_link_js_decoder_sources}) + NAME draco_animation_decoder + SOURCES ${draco_animation_dec_sources} ${draco_animation_js_dec_sources} + ${draco_animation_sources} ${draco_decoder_src} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + LINK_FLAGS "-sEXPORT_NAME=\"DracoAnimationDecoderModule\"" + GLUE_PATH ${draco_anim_decoder_glue_path} + PRE_LINK_JS_SOURCES ${draco_pre_link_js_sources} + POST_LINK_JS_SOURCES ${draco_post_link_js_decoder_sources}) draco_add_emscripten_executable( - NAME - draco_animation_encoder - SOURCES - ${draco_animation_enc_sources} - ${draco_animation_js_enc_sources} - ${draco_animation_sources} - ${draco_encoder_src} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - LINK_FLAGS - "-sEXPORT_NAME=\"DracoAnimationEncoderModule\"" - GLUE_PATH - ${draco_anim_encoder_glue_path} - PRE_LINK_JS_SOURCES - ${draco_pre_link_js_sources} - POST_LINK_JS_SOURCES - ${draco_post_link_js_sources}) + NAME draco_animation_encoder + SOURCES ${draco_animation_enc_sources} ${draco_animation_js_enc_sources} + ${draco_animation_sources} ${draco_encoder_src} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + LINK_FLAGS "-sEXPORT_NAME=\"DracoAnimationEncoderModule\"" + GLUE_PATH ${draco_anim_encoder_glue_path} + PRE_LINK_JS_SOURCES ${draco_pre_link_js_sources} + POST_LINK_JS_SOURCES ${draco_post_link_js_sources}) endif() else() # Standard Draco libs, encoder and decoder. Object collections that mirror the # Draco directory structure. - draco_add_library(NAME draco_attributes TYPE OBJECT SOURCES - ${draco_attributes_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME - draco_compression_attributes_dec - OBJECT - ${draco_compression_attributes_dec_sources} - TYPE - OBJECT - SOURCES - ${draco_compression_attributes_dec_sources} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths}) - draco_add_library(NAME draco_compression_attributes_enc TYPE OBJECT SOURCES - ${draco_compression_attributes_enc_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_attributes_pred_schemes_dec TYPE - OBJECT SOURCES - ${draco_compression_attributes_pred_schemes_dec_sources}) - draco_add_library(NAME draco_compression_attributes_pred_schemes_enc TYPE - OBJECT SOURCES - ${draco_compression_attributes_pred_schemes_enc_sources} - DEFINES ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_bit_coders TYPE OBJECT SOURCES - ${draco_compression_bit_coders_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_enc_config TYPE OBJECT SOURCES - ${draco_enc_config_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_dec_config TYPE OBJECT SOURCES - ${draco_dec_config_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_decode TYPE OBJECT SOURCES - ${draco_compression_decode_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_encode TYPE OBJECT SOURCES - ${draco_compression_encode_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_entropy TYPE OBJECT SOURCES - ${draco_compression_entropy_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_mesh_traverser TYPE OBJECT SOURCES - ${draco_compression_mesh_traverser_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_mesh_dec TYPE OBJECT SOURCES - ${draco_compression_mesh_dec_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_mesh_enc TYPE OBJECT SOURCES - ${draco_compression_mesh_enc_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_point_cloud_dec TYPE OBJECT SOURCES - ${draco_compression_point_cloud_dec_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_compression_point_cloud_enc TYPE OBJECT SOURCES - ${draco_compression_point_cloud_enc_sources} DEFINES - ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_core TYPE OBJECT SOURCES ${draco_core_sources} - DEFINES ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_io TYPE OBJECT SOURCES ${draco_io_sources} - DEFINES ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_mesh TYPE OBJECT SOURCES ${draco_mesh_sources} - DEFINES ${draco_defines} INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_metadata_dec TYPE OBJECT SOURCES - ${draco_metadata_dec_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_metadata_enc TYPE OBJECT SOURCES - ${draco_metadata_enc_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_metadata TYPE OBJECT SOURCES - ${draco_metadata_sources} DEFINES ${draco_defines} INCLUDES - ${draco_include_paths}) - draco_add_library(NAME draco_animation_dec TYPE OBJECT SOURCES - ${draco_animation_dec_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_animation_enc TYPE OBJECT SOURCES - ${draco_animation_enc_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME draco_animation TYPE OBJECT SOURCES - ${draco_animation_sources} DEFINES ${draco_defines} INCLUDES - ${draco_include_paths}) - draco_add_library(NAME draco_point_cloud TYPE OBJECT SOURCES - ${draco_point_cloud_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) - draco_add_library(NAME - draco_points_dec - TYPE - OBJECT - SOURCES - ${draco_points_common_sources} - ${draco_points_dec_sources} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths}) - draco_add_library(NAME - draco_points_enc - TYPE - OBJECT - SOURCES - ${draco_points_common_sources} - ${draco_points_enc_sources} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths}) + draco_add_library( + NAME draco_attributes + TYPE OBJECT + SOURCES ${draco_attributes_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_attributes_dec OBJECT + ${draco_compression_attributes_dec_sources} + TYPE OBJECT + SOURCES ${draco_compression_attributes_dec_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_attributes_enc + TYPE OBJECT + SOURCES ${draco_compression_attributes_enc_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_attributes_pred_schemes_dec + TYPE OBJECT + SOURCES ${draco_compression_attributes_pred_schemes_dec_sources}) + draco_add_library( + NAME draco_compression_attributes_pred_schemes_enc + TYPE OBJECT + SOURCES ${draco_compression_attributes_pred_schemes_enc_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_bit_coders + TYPE OBJECT + SOURCES ${draco_compression_bit_coders_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_enc_config + TYPE OBJECT + SOURCES ${draco_enc_config_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_dec_config + TYPE OBJECT + SOURCES ${draco_dec_config_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_decode + TYPE OBJECT + SOURCES ${draco_compression_decode_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_encode + TYPE OBJECT + SOURCES ${draco_compression_encode_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_entropy + TYPE OBJECT + SOURCES ${draco_compression_entropy_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_mesh_traverser + TYPE OBJECT + SOURCES ${draco_compression_mesh_traverser_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_mesh_dec + TYPE OBJECT + SOURCES ${draco_compression_mesh_dec_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_mesh_enc + TYPE OBJECT + SOURCES ${draco_compression_mesh_enc_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_options + TYPE OBJECT + SOURCES ${draco_compression_options_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_point_cloud_dec + TYPE OBJECT + SOURCES ${draco_compression_point_cloud_dec_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_compression_point_cloud_enc + TYPE OBJECT + SOURCES ${draco_compression_point_cloud_enc_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_core + TYPE OBJECT + SOURCES ${draco_core_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_io + TYPE OBJECT + SOURCES ${draco_io_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_mesh + TYPE OBJECT + SOURCES ${draco_mesh_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_metadata_dec + TYPE OBJECT + SOURCES ${draco_metadata_dec_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_metadata_enc + TYPE OBJECT + SOURCES ${draco_metadata_enc_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_metadata + TYPE OBJECT + SOURCES ${draco_metadata_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_animation_dec + TYPE OBJECT + SOURCES ${draco_animation_dec_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_animation_enc + TYPE OBJECT + SOURCES ${draco_animation_enc_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_animation + TYPE OBJECT + SOURCES ${draco_animation_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_point_cloud + TYPE OBJECT + SOURCES ${draco_point_cloud_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_points_dec + TYPE OBJECT + SOURCES ${draco_points_common_sources} ${draco_points_dec_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_points_enc + TYPE OBJECT + SOURCES ${draco_points_common_sources} ${draco_points_enc_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) - set(draco_object_library_deps - draco_attributes - draco_compression_attributes_dec - draco_compression_attributes_enc - draco_compression_attributes_pred_schemes_dec - draco_compression_attributes_pred_schemes_enc - draco_compression_bit_coders - draco_compression_decode - draco_compression_encode - draco_compression_entropy - draco_compression_mesh_dec - draco_compression_mesh_enc - draco_compression_point_cloud_dec - draco_compression_point_cloud_enc - draco_core - draco_dec_config - draco_enc_config - draco_io - draco_mesh - draco_metadata - draco_metadata_dec - draco_metadata_enc - draco_animation - draco_animation_dec - draco_animation_enc - draco_point_cloud - draco_points_dec - draco_points_enc) + if(DRACO_TRANSCODER_SUPPORTED) + if(MSVC) + # TODO(https://github.com/google/draco/issues/826) + set_source_files_properties("${draco_src_root}/io/gltf_decoder.cc" + PROPERTIES COMPILE_OPTIONS "/Od") + endif() + + draco_add_library( + NAME draco_material + TYPE OBJECT + SOURCES ${draco_material_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + + draco_add_library( + NAME draco_scene + TYPE OBJECT + SOURCES ${draco_scene_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + + draco_add_library( + NAME draco_texture + TYPE OBJECT + SOURCES ${draco_texture_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) + + endif() + + list( + APPEND draco_object_library_deps + draco_attributes + draco_compression_attributes_dec + draco_compression_attributes_enc + draco_compression_attributes_pred_schemes_dec + draco_compression_attributes_pred_schemes_enc + draco_compression_bit_coders + draco_compression_decode + draco_compression_encode + draco_compression_entropy + draco_compression_mesh_dec + draco_compression_mesh_enc + draco_compression_options + draco_compression_point_cloud_dec + draco_compression_point_cloud_enc + draco_core + draco_dec_config + draco_enc_config + draco_io + draco_mesh + draco_metadata + draco_metadata_dec + draco_metadata_enc + draco_animation + draco_animation_dec + draco_animation_enc + draco_point_cloud + draco_points_dec + draco_points_enc) + + if(DRACO_TRANSCODER_SUPPORTED) + list(APPEND draco_object_library_deps draco_material draco_scene + draco_texture) + + endif() # Library targets that consume the object collections. if(MSVC) @@ -809,56 +1003,48 @@ else() # that the exported symbols are part of the DLL target. The unfortunate side # effect of this is that a single configuration cannot output both the # static library and the DLL: This results in an either/or situation. - # Windows users of the draco build can have a DLL and an import library, - # or they can have a static library; they cannot have both from a single + # Windows users of the draco build can have a DLL and an import library, or + # they can have a static library; they cannot have both from a single # configuration of the build. if(BUILD_SHARED_LIBS) set(draco_lib_type SHARED) else() set(draco_lib_type STATIC) endif() - draco_add_library(NAME - draco - OUTPUT_NAME - draco - TYPE - ${draco_lib_type} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - OBJLIB_DEPS - ${draco_object_library_deps}) + draco_add_library( + NAME draco + OUTPUT_NAME draco + TYPE ${draco_lib_type} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + OBJLIB_DEPS ${draco_object_library_deps} + LIB_DEPS ${draco_lib_deps}) + add_library(draco::draco ALIAS draco) else() - draco_add_library(NAME - draco_static - OUTPUT_NAME - draco - TYPE - STATIC - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - OBJLIB_DEPS - ${draco_object_library_deps}) + draco_add_library( + NAME draco_static + OUTPUT_NAME draco + TYPE STATIC + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + OBJLIB_DEPS ${draco_object_library_deps} + LIB_DEPS ${draco_lib_deps}) if(BUILD_SHARED_LIBS) - draco_add_library(NAME - draco_shared - SOURCES - "${draco_src_root}/core/draco_version.h" - OUTPUT_NAME - draco - TYPE - SHARED - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - LIB_DEPS - draco_static) + draco_add_library( + NAME draco_shared + SOURCES "${draco_src_root}/core/draco_version.h" + OUTPUT_NAME draco + TYPE SHARED + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + LIB_DEPS draco_static) + add_library(draco::draco ALIAS draco_shared) + set_target_properties(draco_shared PROPERTIES EXPORT_NAME draco) + else() + add_library(draco::draco ALIAS draco_static) + set_target_properties(draco_static PROPERTIES EXPORT_NAME draco) endif() endif() @@ -869,22 +1055,20 @@ else() set(unity_decoder_lib_type MODULE) endif() - draco_add_library(NAME draco_unity_plugin TYPE OBJECT SOURCES - ${draco_unity_plug_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_unity_plugin + TYPE OBJECT + SOURCES ${draco_unity_plug_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) - draco_add_library(NAME - dracodec_unity - TYPE - ${unity_decoder_lib_type} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - OBJLIB_DEPS - draco_unity_plugin - LIB_DEPS - ${draco_plugin_dependency}) + draco_add_library( + NAME dracodec_unity + TYPE ${unity_decoder_lib_type} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + OBJLIB_DEPS draco_unity_plugin + LIB_DEPS ${draco_plugin_dependency}) # For Mac, we need to build a .bundle for the unity plugin. if(APPLE) @@ -893,22 +1077,20 @@ else() endif() if(DRACO_MAYA_PLUGIN) - draco_add_library(NAME draco_maya_plugin TYPE OBJECT SOURCES - ${draco_maya_plug_sources} DEFINES ${draco_defines} - INCLUDES ${draco_include_paths}) + draco_add_library( + NAME draco_maya_plugin + TYPE OBJECT + SOURCES ${draco_maya_plug_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths}) - draco_add_library(NAME - draco_maya_wrapper - TYPE - MODULE - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - OBJLIB_DEPS - draco_maya_plugin - LIB_DEPS - ${draco_plugin_dependency}) + draco_add_library( + NAME draco_maya_wrapper + TYPE MODULE + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + OBJLIB_DEPS draco_maya_plugin + LIB_DEPS ${draco_plugin_dependency}) # For Mac, we need to build a .bundle for the plugin. if(APPLE) @@ -917,29 +1099,44 @@ else() endif() # Draco app targets. - draco_add_executable(NAME - draco_decoder - SOURCES - "${draco_src_root}/tools/draco_decoder.cc" - ${draco_io_sources} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - LIB_DEPS - ${draco_dependency}) + draco_add_executable( + NAME draco_decoder + SOURCES "${draco_src_root}/tools/draco_decoder.cc" ${draco_io_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + LIB_DEPS ${draco_dependency}) - draco_add_executable(NAME - draco_encoder - SOURCES - "${draco_src_root}/tools/draco_encoder.cc" - ${draco_io_sources} - DEFINES - ${draco_defines} - INCLUDES - ${draco_include_paths} - LIB_DEPS - ${draco_dependency}) + draco_add_executable( + NAME draco_encoder + SOURCES "${draco_src_root}/tools/draco_encoder.cc" ${draco_io_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + LIB_DEPS ${draco_dependency}) + + if(DRACO_TRANSCODER_SUPPORTED) + draco_add_executable( + NAME draco_transcoder + SOURCES "${draco_src_root}/tools/draco_transcoder.cc" + "${draco_src_root}/tools/draco_transcoder_lib.cc" + "${draco_src_root}/tools/draco_transcoder_lib.h" + ${draco_io_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + LIB_DEPS ${draco_dependency}) + + if(DRACO_SIMPLIFIER_SUPPORTED) + draco_add_executable( + NAME draco_simplifier + SOURCES ${draco_pipeline_proto_header} + "${draco_src_root}/tools/draco_simplifier.cc" + "${draco_src_root}/tools/draco_simplifier_lib.cc" + "${draco_src_root}/tools/draco_simplifier_lib.h" + ${draco_io_sources} + DEFINES ${draco_defines} + INCLUDES ${draco_include_paths} + LIB_DEPS ${draco_dependency}) + endif() + endif() draco_setup_install_target() draco_setup_test_targets() diff --git a/contrib/draco/README.md b/contrib/draco/README.md index 0d980b387..4cc717c8d 100644 --- a/contrib/draco/README.md +++ b/contrib/draco/README.md @@ -2,10 +2,93 @@

-[![Build Status](https://github.com/google/draco/workflows/Build/badge.svg)](https://github.com/google/draco/actions?query=workflow%3ABuild) +[![draco-ci](https://github.com/google/draco/workflows/draco-ci/badge.svg?branch=master)](https://github.com/google/draco/actions/workflows/ci.yml) News ======= + +Attention GStatic users: the Draco team strongly recommends using the versioned +URLs for accessing Draco GStatic content. If you are using the URLs that include +the `v1/decoders` substring within the URL, edge caching and GStatic propagation +delays can result in transient errors that can be difficult to diagnose when +new Draco releases are launched. To avoid the issue pin your sites to a +versioned release. + +### Version 1.5.6 release: +* Using the versioned www.gstatic.com WASM and Javascript decoders continues + to be recommended. To use v1.5.6, use this URL: + * https://www.gstatic.com/draco/versioned/decoders/1.5.6/* +* The CMake flag DRACO_DEBUG_MSVC_WARNINGS has been replaced with + DRACO_DEBUG_COMPILER_WARNINGS, and the behavior has changed. It is now a + boolean flag defined in draco_options.cmake. +* Bug fixes. +* Security fixes. + +### Version 1.5.5 release: +* Using the versioned www.gstatic.com WASM and Javascript decoders continues + to be recommended. To use v1.5.5, use this URL: + * https://www.gstatic.com/draco/versioned/decoders/1.5.5/* +* Bug fix: https://github.com/google/draco/issues/935 + +### Version 1.5.4 release: +* Using the versioned www.gstatic.com WASM and Javascript decoders continues + to be recommended. To use v1.5.4, use this URL: + * https://www.gstatic.com/draco/versioned/decoders/1.5.4/* +* Added partial support for glTF extensions EXT_mesh_features and + EXT_structural_metadata. +* Bug fixes. +* Security fixes. + +### Version 1.5.3 release: +* Using the versioned www.gstatic.com WASM and Javascript decoders continues + to be recommended. To use v1.5.3, use this URL: + * https://www.gstatic.com/draco/versioned/decoders/1.5.3/* +* Bug fixes. + +### Version 1.5.2 release +* This is the same as v1.5.1 with the following two bug fixes: + * Fixes DRACO_TRANSCODER_SUPPORTED enabled builds. + * ABI version updated. + +### Version 1.5.1 release +* Adds assertion enabled Emscripten builds to the release, and a subset of the + assertion enabled builds to GStatic. See the file listing below. +* Custom paths to third party dependencies are now supported. See BUILDING.md + for more information. +* The CMake configuration file draco-config.cmake is now tested and known to + work for using Draco in Linux, MacOS, and Windows CMake projects. See the + `install_test` subdirectory of `src/draco/tools` for more information. +* Bug fixes. + +### Version 1.5.0 release +* Adds the draco_transcoder tool. See the section below on the glTF transcoding + tool, and BUILDING.md for build and dependency information. +* Some changes to configuration variables have been made for this release: + - The DRACO_GLTF flag has been renamed to DRACO_GLTF_BITSTREAM to help + increase understanding of its purpose, which is to limit Draco features to + those included in the Draco glTF specification. + - Variables exported in CMake via draco-config.cmake and find-draco.cmake + (formerly FindDraco.cmake) have been renamed. It's unlikely that this + impacts any existing projects as the aforementioned files were not formed + correctly. See [PR775](https://github.com/google/draco/pull/775) for full + details of the changes. +* A CMake version file has been added. +* The CMake install target now uses absolute paths direct from CMake instead + of building them using CMAKE_INSTALL_PREFIX. This was done to make Draco + easier to use for downstream packagers and should have little to no impact on + users picking up Draco from source. +* Certain MSVC warnings have had their levels changed via compiler flag to + reduce the amount of noise output by the MSVC compilers. Set MSVC warning + level to 4, or define DRACO_DEBUG_MSVC_WARNINGS at CMake configuration time + to restore previous behavior. +* Bug fixes. + +### Version 1.4.3 release +* Using the versioned www.gstatic.com WASM and Javascript decoders continues + to be recommended. To use v1.4.3, use this URL: + * https://www.gstatic.com/draco/versioned/decoders/1.4.3/* +* Bug fixes + ### Version 1.4.1 release * Using the versioned www.gstatic.com WASM and Javascript decoders is now recommended. To use v1.4.1, use this URL: @@ -129,6 +212,7 @@ _**Contents**_ * [Encoding Tool](#encoding-tool) * [Encoding Point Clouds](#encoding-point-clouds) * [Decoding Tool](#decoding-tool) + * [glTF Transcoding Tool](#gltf-transcoding-tool) * [C++ Decoder API](#c-decoder-api) * [Javascript Encoder API](#javascript-encoder-api) * [Javascript Decoder API](#javascript-decoder-api) @@ -136,6 +220,7 @@ _**Contents**_ * [Metadata API](#metadata-api) * [NPM Package](#npm-package) * [three.js Renderer Example](#threejs-renderer-example) + * [GStatic Javascript Builds](#gstatic-javascript-builds) * [Support](#support) * [License](#license) * [References](#references) @@ -170,16 +255,18 @@ Command Line Applications ------------------------ The default target created from the build files will be the `draco_encoder` -and `draco_decoder` command line applications. For both applications, if you -run them without any arguments or `-h`, the applications will output usage and -options. +and `draco_decoder` command line applications. Additionally, `draco_transcoder` +is generated when CMake is run with the DRACO_TRANSCODER_SUPPORTED variable set +to ON (see [BUILDING](BUILDING.md#transcoder) for more details). For all +applications, if you run them without any arguments or `-h`, the applications +will output usage and options. Encoding Tool ------------- -`draco_encoder` will read OBJ or PLY files as input, and output Draco-encoded -files. We have included Stanford's [Bunny] mesh for testing. The basic command -line looks like this: +`draco_encoder` will read OBJ, STL or PLY files as input, and output +Draco-encoded files. We have included Stanford's [Bunny] mesh for testing. The +basic command line looks like this: ~~~~~ bash ./draco_encoder -i testdata/bun_zipper.ply -o out.drc @@ -232,15 +319,34 @@ and denser point clouds. Decoding Tool ------------- -`draco_decoder` will read Draco files as input, and output OBJ or PLY files. -The basic command line looks like this: +`draco_decoder` will read Draco files as input, and output OBJ, STL or PLY +files. The basic command line looks like this: ~~~~~ bash ./draco_decoder -i in.drc -o out.obj ~~~~~ +glTF Transcoding Tool +--------------------- + +`draco_transcoder` can be used to add Draco compression to glTF assets. The +basic command line looks like this: + +~~~~~ bash +./draco_transcoder -i in.glb -o out.glb +~~~~~ + +This command line will add geometry compression to all meshes in the `in.glb` +file. Quantization values for different glTF attributes can be specified +similarly to the `draco_encoder` tool. For example `-qp` can be used to define +quantization of the position attribute: + +~~~~~ bash +./draco_transcoder -i in.glb -o out.glb -qp 12 +~~~~~ + C++ Decoder API -------------- +--------------- If you'd like to add decoding to your applications you will need to include the `draco_dec` library. In order to use the Draco decoder you need to @@ -442,6 +548,30 @@ Javascript decoder using the `three.js` renderer. Please see the [javascript/example/README.md](javascript/example/README.md) file for more information. +GStatic Javascript Builds +========================= + +Prebuilt versions of the Emscripten-built Draco javascript decoders are hosted +on www.gstatic.com in version labeled directories: + +https://www.gstatic.com/draco/versioned/decoders/VERSION/* + +As of the v1.4.3 release the files available are: + +- [draco_decoder.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder.js) +- [draco_decoder.wasm](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder.wasm) +- [draco_decoder_gltf.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder_gltf.js) +- [draco_decoder_gltf.wasm](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder_gltf.wasm) +- [draco_wasm_wrapper.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_wasm_wrapper.js) +- [draco_wasm_wrapper_gltf.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_wasm_wrapper_gltf.js) + +Beginning with the v1.5.1 release assertion enabled builds of the following +files are available: + +- [draco_decoder.js](https://www.gstatic.com/draco/versioned/decoders/1.5.1/with_asserts/draco_decoder.js) +- [draco_decoder.wasm](https://www.gstatic.com/draco/versioned/decoders/1.5.1/with_asserts/draco_decoder.wasm) +- [draco_wasm_wrapper.js](https://www.gstatic.com/draco/versioned/decoders/1.5.1/with_asserts/draco_wasm_wrapper.js) + Support ======= diff --git a/contrib/draco/cmake/DracoConfig.cmake b/contrib/draco/cmake/DracoConfig.cmake deleted file mode 100644 index be5e1faef..000000000 --- a/contrib/draco/cmake/DracoConfig.cmake +++ /dev/null @@ -1,3 +0,0 @@ -@PACKAGE_INIT@ -set_and_check(draco_INCLUDE_DIR "@PACKAGE_draco_include_install_dir@") -set_and_check(draco_LIBRARY_DIR "@PACKAGE_draco_lib_install_dir@") diff --git a/contrib/draco/cmake/FindDraco.cmake b/contrib/draco/cmake/FindDraco.cmake deleted file mode 100644 index 0a9193065..000000000 --- a/contrib/draco/cmake/FindDraco.cmake +++ /dev/null @@ -1,56 +0,0 @@ -# Finddraco -# -# Locates draco and sets the following variables: -# -# draco_FOUND draco_INCLUDE_DIRS draco_LIBARY_DIRS draco_LIBRARIES -# draco_VERSION_STRING -# -# draco_FOUND is set to YES only when all other variables are successfully -# configured. - -unset(draco_FOUND) -unset(draco_INCLUDE_DIRS) -unset(draco_LIBRARY_DIRS) -unset(draco_LIBRARIES) -unset(draco_VERSION_STRING) - -mark_as_advanced(draco_FOUND) -mark_as_advanced(draco_INCLUDE_DIRS) -mark_as_advanced(draco_LIBRARY_DIRS) -mark_as_advanced(draco_LIBRARIES) -mark_as_advanced(draco_VERSION_STRING) - -set(draco_version_file_no_prefix "draco/src/draco/core/draco_version.h") - -# Set draco_INCLUDE_DIRS -find_path(draco_INCLUDE_DIRS NAMES "${draco_version_file_no_prefix}") - -# Extract the version string from draco_version.h. -if(draco_INCLUDE_DIRS) - set(draco_version_file - "${draco_INCLUDE_DIRS}/draco/src/draco/core/draco_version.h") - file(STRINGS "${draco_version_file}" draco_version REGEX "kdracoVersion") - list(GET draco_version 0 draco_version) - string(REPLACE "static const char kdracoVersion[] = " "" draco_version - "${draco_version}") - string(REPLACE ";" "" draco_version "${draco_version}") - string(REPLACE "\"" "" draco_version "${draco_version}") - set(draco_VERSION_STRING ${draco_version}) -endif() - -# Find the library. -if(BUILD_SHARED_LIBS) - find_library(draco_LIBRARIES NAMES draco.dll libdraco.dylib libdraco.so) -else() - find_library(draco_LIBRARIES NAMES draco.lib libdraco.a) -endif() - -# Store path to library. -get_filename_component(draco_LIBRARY_DIRS ${draco_LIBRARIES} DIRECTORY) - -if(draco_INCLUDE_DIRS - AND draco_LIBRARY_DIRS - AND draco_LIBRARIES - AND draco_VERSION_STRING) - set(draco_FOUND YES) -endif() diff --git a/contrib/draco/cmake/compiler_flags.cmake b/contrib/draco/cmake/compiler_flags.cmake deleted file mode 100644 index 8750e6f7d..000000000 --- a/contrib/draco/cmake/compiler_flags.cmake +++ /dev/null @@ -1,220 +0,0 @@ -if(DRACO_CMAKE_COMPILER_FLAGS_CMAKE_) - return() -endif() -set(DRACO_CMAKE_COMPILER_FLAGS_CMAKE_ 1) - -include(CheckCCompilerFlag) -include(CheckCXXCompilerFlag) -include("${draco_root}/cmake/compiler_tests.cmake") - -# Strings used to cache failed C/CXX flags. -set(DRACO_FAILED_C_FLAGS) -set(DRACO_FAILED_CXX_FLAGS) - -# Checks C compiler for support of $c_flag. Adds $c_flag to $CMAKE_C_FLAGS when -# the compile test passes. Caches $c_flag in $DRACO_FAILED_C_FLAGS when the test -# fails. -macro(add_c_flag_if_supported c_flag) - unset(C_FLAG_FOUND CACHE) - string(FIND "${CMAKE_C_FLAGS}" "${c_flag}" C_FLAG_FOUND) - unset(C_FLAG_FAILED CACHE) - string(FIND "${DRACO_FAILED_C_FLAGS}" "${c_flag}" C_FLAG_FAILED) - - if(${C_FLAG_FOUND} EQUAL -1 AND ${C_FLAG_FAILED} EQUAL -1) - unset(C_FLAG_SUPPORTED CACHE) - message("Checking C compiler flag support for: " ${c_flag}) - check_c_compiler_flag("${c_flag}" C_FLAG_SUPPORTED) - if(${C_FLAG_SUPPORTED}) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${c_flag}" CACHE STRING "") - else() - set(DRACO_FAILED_C_FLAGS - "${DRACO_FAILED_C_FLAGS} ${c_flag}" - CACHE STRING "" FORCE) - endif() - endif() -endmacro() - -# Checks C++ compiler for support of $cxx_flag. Adds $cxx_flag to -# $CMAKE_CXX_FLAGS when the compile test passes. Caches $c_flag in -# $DRACO_FAILED_CXX_FLAGS when the test fails. -macro(add_cxx_flag_if_supported cxx_flag) - unset(CXX_FLAG_FOUND CACHE) - string(FIND "${CMAKE_CXX_FLAGS}" "${cxx_flag}" CXX_FLAG_FOUND) - unset(CXX_FLAG_FAILED CACHE) - string(FIND "${DRACO_FAILED_CXX_FLAGS}" "${cxx_flag}" CXX_FLAG_FAILED) - - if(${CXX_FLAG_FOUND} EQUAL -1 AND ${CXX_FLAG_FAILED} EQUAL -1) - unset(CXX_FLAG_SUPPORTED CACHE) - message("Checking CXX compiler flag support for: " ${cxx_flag}) - check_cxx_compiler_flag("${cxx_flag}" CXX_FLAG_SUPPORTED) - if(${CXX_FLAG_SUPPORTED}) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${cxx_flag}" CACHE STRING "") - else() - set(DRACO_FAILED_CXX_FLAGS - "${DRACO_FAILED_CXX_FLAGS} ${cxx_flag}" - CACHE STRING "" FORCE) - endif() - endif() -endmacro() - -# Convenience method for adding a flag to both the C and C++ compiler command -# lines. -macro(add_compiler_flag_if_supported flag) - add_c_flag_if_supported(${flag}) - add_cxx_flag_if_supported(${flag}) -endmacro() - -# Checks C compiler for support of $c_flag and terminates generation when -# support is not present. -macro(require_c_flag c_flag update_c_flags) - unset(C_FLAG_FOUND CACHE) - string(FIND "${CMAKE_C_FLAGS}" "${c_flag}" C_FLAG_FOUND) - - if(${C_FLAG_FOUND} EQUAL -1) - unset(HAVE_C_FLAG CACHE) - message("Checking C compiler flag support for: " ${c_flag}) - check_c_compiler_flag("${c_flag}" HAVE_C_FLAG) - if(NOT ${HAVE_C_FLAG}) - message( - FATAL_ERROR "${PROJECT_NAME} requires support for C flag: ${c_flag}.") - endif() - if(${update_c_flags}) - set(CMAKE_C_FLAGS "${c_flag} ${CMAKE_C_FLAGS}" CACHE STRING "" FORCE) - endif() - endif() -endmacro() - -# Checks CXX compiler for support of $cxx_flag and terminates generation when -# support is not present. -macro(require_cxx_flag cxx_flag update_cxx_flags) - unset(CXX_FLAG_FOUND CACHE) - string(FIND "${CMAKE_CXX_FLAGS}" "${cxx_flag}" CXX_FLAG_FOUND) - - if(${CXX_FLAG_FOUND} EQUAL -1) - unset(HAVE_CXX_FLAG CACHE) - message("Checking CXX compiler flag support for: " ${cxx_flag}) - check_cxx_compiler_flag("${cxx_flag}" HAVE_CXX_FLAG) - if(NOT ${HAVE_CXX_FLAG}) - message( - FATAL_ERROR - "${PROJECT_NAME} requires support for CXX flag: ${cxx_flag}.") - endif() - if(${update_cxx_flags}) - set(CMAKE_CXX_FLAGS - "${cxx_flag} ${CMAKE_CXX_FLAGS}" - CACHE STRING "" FORCE) - endif() - endif() -endmacro() - -# Checks for support of $flag by both the C and CXX compilers. Terminates -# generation when support is not present in both compilers. -macro(require_compiler_flag flag update_cmake_flags) - require_c_flag(${flag} ${update_cmake_flags}) - require_cxx_flag(${flag} ${update_cmake_flags}) -endmacro() - -# Checks only non-MSVC targets for support of $c_flag and terminates generation -# when support is not present. -macro(require_c_flag_nomsvc c_flag update_c_flags) - if(NOT MSVC) - require_c_flag(${c_flag} ${update_c_flags}) - endif() -endmacro() - -# Checks only non-MSVC targets for support of $cxx_flag and terminates -# generation when support is not present. -macro(require_cxx_flag_nomsvc cxx_flag update_cxx_flags) - if(NOT MSVC) - require_cxx_flag(${cxx_flag} ${update_cxx_flags}) - endif() -endmacro() - -# Checks only non-MSVC targets for support of $flag by both the C and CXX -# compilers. Terminates generation when support is not present in both -# compilers. -macro(require_compiler_flag_nomsvc flag update_cmake_flags) - require_c_flag_nomsvc(${flag} ${update_cmake_flags}) - require_cxx_flag_nomsvc(${flag} ${update_cmake_flags}) -endmacro() - -# Adds $flag to assembler command line. -macro(append_as_flag flag) - unset(AS_FLAG_FOUND CACHE) - string(FIND "${DRACO_AS_FLAGS}" "${flag}" AS_FLAG_FOUND) - - if(${AS_FLAG_FOUND} EQUAL -1) - set(DRACO_AS_FLAGS "${DRACO_AS_FLAGS} ${flag}") - endif() -endmacro() - -# Adds $flag to the C compiler command line. -macro(append_c_flag flag) - unset(C_FLAG_FOUND CACHE) - string(FIND "${CMAKE_C_FLAGS}" "${flag}" C_FLAG_FOUND) - - if(${C_FLAG_FOUND} EQUAL -1) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") - endif() -endmacro() - -# Adds $flag to the CXX compiler command line. -macro(append_cxx_flag flag) - unset(CXX_FLAG_FOUND CACHE) - string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" CXX_FLAG_FOUND) - - if(${CXX_FLAG_FOUND} EQUAL -1) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") - endif() -endmacro() - -# Adds $flag to the C and CXX compiler command lines. -macro(append_compiler_flag flag) - append_c_flag(${flag}) - append_cxx_flag(${flag}) -endmacro() - -# Adds $flag to the executable linker command line. -macro(append_exe_linker_flag flag) - unset(LINKER_FLAG_FOUND CACHE) - string(FIND "${CMAKE_EXE_LINKER_FLAGS}" "${flag}" LINKER_FLAG_FOUND) - - if(${LINKER_FLAG_FOUND} EQUAL -1) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}") - endif() -endmacro() - -# Adds $flag to the link flags for $target. -function(append_link_flag_to_target target flags) - unset(target_link_flags) - get_target_property(target_link_flags ${target} LINK_FLAGS) - - if(target_link_flags) - unset(link_flag_found) - string(FIND "${target_link_flags}" "${flags}" link_flag_found) - - if(NOT ${link_flag_found} EQUAL -1) - return() - endif() - - set(target_link_flags "${target_link_flags} ${flags}") - else() - set(target_link_flags "${flags}") - endif() - - set_target_properties(${target} PROPERTIES LINK_FLAGS ${target_link_flags}) -endfunction() - -# Adds $flag to executable linker flags, and makes sure C/CXX builds still work. -macro(require_linker_flag flag) - append_exe_linker_flag(${flag}) - - unset(c_passed) - draco_check_c_compiles("LINKER_FLAG_C_TEST(${flag})" "" c_passed) - unset(cxx_passed) - draco_check_cxx_compiles("LINKER_FLAG_CXX_TEST(${flag})" "" cxx_passed) - - if(NOT c_passed OR NOT cxx_passed) - message(FATAL_ERROR "Linker flag test for ${flag} failed.") - endif() -endmacro() diff --git a/contrib/draco/cmake/compiler_tests.cmake b/contrib/draco/cmake/compiler_tests.cmake deleted file mode 100644 index e781a6537..000000000 --- a/contrib/draco/cmake/compiler_tests.cmake +++ /dev/null @@ -1,103 +0,0 @@ -if(DRACO_CMAKE_COMPILER_TESTS_CMAKE_) - return() -endif() -set(DRACO_CMAKE_COMPILER_TESTS_CMAKE_ 1) - -include(CheckCSourceCompiles) -include(CheckCXXSourceCompiles) - -# The basic main() macro used in all compile tests. -set(DRACO_C_MAIN "\nint main(void) { return 0; }") -set(DRACO_CXX_MAIN "\nint main() { return 0; }") - -# Strings containing the names of passed and failed tests. -set(DRACO_C_PASSED_TESTS) -set(DRACO_C_FAILED_TESTS) -set(DRACO_CXX_PASSED_TESTS) -set(DRACO_CXX_FAILED_TESTS) - -macro(draco_push_var var new_value) - set(SAVED_${var} ${var}) - set(${var} ${new_value}) -endmacro() - -macro(draco_pop_var var) - set(var ${SAVED_${var}}) - unset(SAVED_${var}) -endmacro() - -# Confirms $test_source compiles and stores $test_name in one of -# $DRACO_C_PASSED_TESTS or $DRACO_C_FAILED_TESTS depending on out come. When the -# test passes $result_var is set to 1. When it fails $result_var is unset. The -# test is not run if the test name is found in either of the passed or failed -# test variables. -macro(draco_check_c_compiles test_name test_source result_var) - unset(C_TEST_PASSED CACHE) - unset(C_TEST_FAILED CACHE) - string(FIND "${DRACO_C_PASSED_TESTS}" "${test_name}" C_TEST_PASSED) - string(FIND "${DRACO_C_FAILED_TESTS}" "${test_name}" C_TEST_FAILED) - if(${C_TEST_PASSED} EQUAL -1 AND ${C_TEST_FAILED} EQUAL -1) - unset(C_TEST_COMPILED CACHE) - message("Running C compiler test: ${test_name}") - check_c_source_compiles("${test_source} ${DRACO_C_MAIN}" C_TEST_COMPILED) - set(${result_var} ${C_TEST_COMPILED}) - - if(${C_TEST_COMPILED}) - set(DRACO_C_PASSED_TESTS "${DRACO_C_PASSED_TESTS} ${test_name}") - else() - set(DRACO_C_FAILED_TESTS "${DRACO_C_FAILED_TESTS} ${test_name}") - message("C Compiler test ${test_name} failed.") - endif() - elseif(NOT ${C_TEST_PASSED} EQUAL -1) - set(${result_var} 1) - else() # ${C_TEST_FAILED} NOT EQUAL -1 - unset(${result_var}) - endif() -endmacro() - -# Confirms $test_source compiles and stores $test_name in one of -# $DRACO_CXX_PASSED_TESTS or $DRACO_CXX_FAILED_TESTS depending on out come. When -# the test passes $result_var is set to 1. When it fails $result_var is unset. -# The test is not run if the test name is found in either of the passed or -# failed test variables. -macro(draco_check_cxx_compiles test_name test_source result_var) - unset(CXX_TEST_PASSED CACHE) - unset(CXX_TEST_FAILED CACHE) - string(FIND "${DRACO_CXX_PASSED_TESTS}" "${test_name}" CXX_TEST_PASSED) - string(FIND "${DRACO_CXX_FAILED_TESTS}" "${test_name}" CXX_TEST_FAILED) - if(${CXX_TEST_PASSED} EQUAL -1 AND ${CXX_TEST_FAILED} EQUAL -1) - unset(CXX_TEST_COMPILED CACHE) - message("Running CXX compiler test: ${test_name}") - check_cxx_source_compiles("${test_source} ${DRACO_CXX_MAIN}" - CXX_TEST_COMPILED) - set(${result_var} ${CXX_TEST_COMPILED}) - - if(${CXX_TEST_COMPILED}) - set(DRACO_CXX_PASSED_TESTS "${DRACO_CXX_PASSED_TESTS} ${test_name}") - else() - set(DRACO_CXX_FAILED_TESTS "${DRACO_CXX_FAILED_TESTS} ${test_name}") - message("CXX Compiler test ${test_name} failed.") - endif() - elseif(NOT ${CXX_TEST_PASSED} EQUAL -1) - set(${result_var} 1) - else() # ${CXX_TEST_FAILED} NOT EQUAL -1 - unset(${result_var}) - endif() -endmacro() - -# Convenience macro that confirms $test_source compiles as C and C++. -# $result_var is set to 1 when both tests are successful, and 0 when one or both -# tests fail. Note: This macro is intended to be used to write to result -# variables that are expanded via configure_file(). $result_var is set to 1 or 0 -# to allow direct usage of the value in generated source files. -macro(draco_check_source_compiles test_name test_source result_var) - unset(C_PASSED) - unset(CXX_PASSED) - draco_check_c_compiles(${test_name} ${test_source} C_PASSED) - draco_check_cxx_compiles(${test_name} ${test_source} CXX_PASSED) - if(${C_PASSED} AND ${CXX_PASSED}) - set(${result_var} 1) - else() - set(${result_var} 0) - endif() -endmacro() diff --git a/contrib/draco/cmake/draco-config.cmake.template b/contrib/draco/cmake/draco-config.cmake.template index ca4a456bf..ed86823ea 100644 --- a/contrib/draco/cmake/draco-config.cmake.template +++ b/contrib/draco/cmake/draco-config.cmake.template @@ -1,2 +1,3 @@ -set(DRACO_INCLUDE_DIRS "@DRACO_INCLUDE_DIRS@") -set(DRACO_LIBRARIES "draco") +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/draco-targets.cmake") diff --git a/contrib/draco/cmake/draco.pc.template b/contrib/draco/cmake/draco.pc.template index b8ae48212..050219ccb 100644 --- a/contrib/draco/cmake/draco.pc.template +++ b/contrib/draco/cmake/draco.pc.template @@ -1,11 +1,6 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - Name: @PROJECT_NAME@ Description: Draco geometry de(com)pression library. Version: @DRACO_VERSION@ -Cflags: -I${includedir} -Libs: -L${libdir} -ldraco +Cflags: -I@includes_path@ +Libs: -L@libs_path@ -ldraco Libs.private: @CMAKE_THREAD_LIBS_INIT@ diff --git a/contrib/draco/cmake/draco_build_definitions.cmake b/contrib/draco/cmake/draco_build_definitions.cmake index f7354c15f..4dc232333 100644 --- a/contrib/draco/cmake/draco_build_definitions.cmake +++ b/contrib/draco/cmake/draco_build_definitions.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_BUILD_DEFINITIONS_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_BUILD_DEFINITIONS_CMAKE_ @@ -17,10 +31,6 @@ macro(set_draco_target) endif() set(draco_plugin_dependency draco_static) endif() - - if(BUILD_SHARED_LIBS) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - endif() endmacro() # Configures flags and sets build system globals. @@ -36,23 +46,37 @@ macro(draco_set_build_definitions) endif() draco_load_version_info() - set(DRACO_SOVERSION 1) + + # Library version info. See the libtool docs for updating the values: + # https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info + # + # c=, r=, a= + # + # libtool generates a .so file as .so.[c-a].a.r, while -version-info c:r:a is + # passed to libtool. + # + # We set DRACO_SOVERSION = [c-a].a.r + set(LT_CURRENT 8) + set(LT_REVISION 0) + set(LT_AGE 0) + math(EXPR DRACO_SOVERSION_MAJOR "${LT_CURRENT} - ${LT_AGE}") + set(DRACO_SOVERSION "${DRACO_SOVERSION_MAJOR}.${LT_AGE}.${LT_REVISION}") + unset(LT_CURRENT) + unset(LT_REVISION) + unset(LT_AGE) list(APPEND draco_include_paths "${draco_root}" "${draco_root}/src" "${draco_build}") - if(DRACO_ABSL) - list(APPEND draco_include_path "${draco_root}/third_party/abseil-cpp") + if(DRACO_TRANSCODER_SUPPORTED) + draco_setup_eigen() + draco_setup_filesystem() + draco_setup_tinygltf() + + endif() - list(APPEND draco_gtest_include_paths - "${draco_root}/../googletest/googlemock/include" - "${draco_root}/../googletest/googlemock" - "${draco_root}/../googletest/googletest/include" - "${draco_root}/../googletest/googletest") - list(APPEND draco_test_include_paths ${draco_include_paths} - ${draco_gtest_include_paths}) list(APPEND draco_defines "DRACO_CMAKE=1" "DRACO_FLAGS_SRCDIR=\"${draco_root}\"" "DRACO_FLAGS_TMPDIR=\"/tmp\"") @@ -63,11 +87,22 @@ macro(draco_set_build_definitions) if(BUILD_SHARED_LIBS) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) endif() - else() + endif() + + if(NOT MSVC) if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) # Ensure 64-bit platforms can support large files. list(APPEND draco_defines "_LARGEFILE_SOURCE" "_FILE_OFFSET_BITS=64") endif() + + if(NOT DRACO_DEBUG_COMPILER_WARNINGS) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + list(APPEND draco_clang_cxx_flags + "-Wno-implicit-const-int-float-conversion") + else() + list(APPEND draco_base_cxx_flags "-Wno-deprecated-declarations") + endif() + endif() endif() if(ANDROID) @@ -102,13 +137,9 @@ macro(draco_set_build_definitions) set(draco_neon_source_file_suffix "neon.cc") set(draco_sse4_source_file_suffix "sse4.cc") - if((${CMAKE_CXX_COMPILER_ID} - STREQUAL - "GNU" - AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 5) - OR (${CMAKE_CXX_COMPILER_ID} - STREQUAL - "Clang" + if((${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" AND ${CMAKE_CXX_COMPILER_VERSION} + VERSION_LESS 5) + OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 4)) message( WARNING "GNU/GCC < v5 or Clang/LLVM < v4, ENABLING COMPATIBILITY MODE.") @@ -117,7 +148,9 @@ macro(draco_set_build_definitions) if(EMSCRIPTEN) draco_check_emscripten_environment() - draco_get_required_emscripten_flags(FLAG_LIST_VAR draco_base_cxx_flags) + draco_get_required_emscripten_flags( + FLAG_LIST_VAR_COMPILER draco_base_cxx_flags + FLAG_LIST_VAR_LINKER draco_base_exe_linker_flags) endif() draco_configure_sanitizer() diff --git a/contrib/draco/cmake/draco_cpu_detection.cmake b/contrib/draco/cmake/draco_cpu_detection.cmake index 96e4a289b..c3b77b80c 100644 --- a/contrib/draco/cmake/draco_cpu_detection.cmake +++ b/contrib/draco/cmake/draco_cpu_detection.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_CPU_DETECTION_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_CPU_DETECTION_CMAKE_ diff --git a/contrib/draco/cmake/draco_dependencies.cmake b/contrib/draco/cmake/draco_dependencies.cmake new file mode 100644 index 000000000..91ee0839b --- /dev/null +++ b/contrib/draco/cmake/draco_dependencies.cmake @@ -0,0 +1,136 @@ +# Copyright 2022 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +if(DRACO_CMAKE_DRACO_DEPENDENCIES_CMAKE) + return() +endif() +set(DRACO_CMAKE_DRACO_DEPENDENCIES_CMAKE 1) + +include("${draco_root}/cmake/draco_variables.cmake") + +# Each variable holds a user specified custom path to a local copy of the +# sources that belong to each project that Draco depends on. When paths are +# empty the build will be generated pointing to the Draco git submodules. +# Otherwise the paths specified by the user will be used in the build +# configuration. + +# Path to the Eigen. The path must contain the Eigen directory. +set(DRACO_EIGEN_PATH) +draco_track_configuration_variable(DRACO_EIGEN_PATH) + +# Path to the gulrak/filesystem installation. The path specified must contain +# the ghc subdirectory that houses the filesystem includes. +set(DRACO_FILESYSTEM_PATH) +draco_track_configuration_variable(DRACO_FILESYSTEM_PATH) + +# Path to the googletest installation. The path must be to the root of the +# Googletest project directory. +set(DRACO_GOOGLETEST_PATH) +draco_track_configuration_variable(DRACO_GOOGLETEST_PATH) + +# Path to the syoyo/tinygltf installation. The path must be to the root of the +# project directory. +set(DRACO_TINYGLTF_PATH) +draco_track_configuration_variable(DRACO_TINYGLTF_PATH) + +# Utility macro for killing the build due to a missing submodule directory. +macro(draco_die_missing_submodule dir) + message(FATAL_ERROR "${dir} missing, run git submodule update --init") +endmacro() + +# Determines the Eigen location and updates the build configuration accordingly. +macro(draco_setup_eigen) + if(DRACO_EIGEN_PATH) + set(eigen_path "${DRACO_EIGEN_PATH}") + + if(NOT IS_DIRECTORY "${eigen_path}") + message(FATAL_ERROR "DRACO_EIGEN_PATH does not exist.") + endif() + else() + set(eigen_path "${draco_root}/third_party/eigen") + + if(NOT IS_DIRECTORY "${eigen_path}") + draco_die_missing_submodule("${eigen_path}") + endif() + endif() + + set(eigen_include_path "${eigen_path}/Eigen") + + if(NOT EXISTS "${eigen_path}/Eigen") + message(FATAL_ERROR "The eigen path does not contain an Eigen directory.") + endif() + + list(APPEND draco_include_paths "${eigen_path}") +endmacro() + +# Determines the gulrak/filesystem location and updates the build configuration +# accordingly. +macro(draco_setup_filesystem) + if(DRACO_FILESYSTEM_PATH) + set(fs_path "${DRACO_FILESYSTEM_PATH}") + + if(NOT IS_DIRECTORY "${fs_path}") + message(FATAL_ERROR "DRACO_FILESYSTEM_PATH does not exist.") + endif() + else() + set(fs_path "${draco_root}/third_party/filesystem/include") + + if(NOT IS_DIRECTORY "${fs_path}") + draco_die_missing_submodule("${fs_path}") + endif() + endif() + + list(APPEND draco_include_paths "${fs_path}") +endmacro() + +# Determines the Googletest location and sets up include and source list vars +# for the draco_tests build. +macro(draco_setup_googletest) + if(DRACO_GOOGLETEST_PATH) + set(gtest_path "${DRACO_GOOGLETEST_PATH}") + if(NOT IS_DIRECTORY "${gtest_path}") + message(FATAL_ERROR "DRACO_GOOGLETEST_PATH does not exist.") + endif() + else() + set(gtest_path "${draco_root}/third_party/googletest") + endif() + + list(APPEND draco_test_include_paths ${draco_include_paths} + "${gtest_path}/include" "${gtest_path}/googlemock" + "${gtest_path}/googletest/include" "${gtest_path}/googletest") + + list(APPEND draco_gtest_all "${gtest_path}/googletest/src/gtest-all.cc") + list(APPEND draco_gtest_main "${gtest_path}/googletest/src/gtest_main.cc") +endmacro() + + +# Determines the location of TinyGLTF and updates the build configuration +# accordingly. +macro(draco_setup_tinygltf) + if(DRACO_TINYGLTF_PATH) + set(tinygltf_path "${DRACO_TINYGLTF_PATH}") + + if(NOT IS_DIRECTORY "${tinygltf_path}") + message(FATAL_ERROR "DRACO_TINYGLTF_PATH does not exist.") + endif() + else() + set(tinygltf_path "${draco_root}/third_party/tinygltf") + + if(NOT IS_DIRECTORY "${tinygltf_path}") + draco_die_missing_submodule("${tinygltf_path}") + endif() + endif() + + list(APPEND draco_include_paths "${tinygltf_path}") +endmacro() diff --git a/contrib/draco/cmake/draco_emscripten.cmake b/contrib/draco/cmake/draco_emscripten.cmake index 10c935043..c9616ae86 100644 --- a/contrib/draco/cmake/draco_emscripten.cmake +++ b/contrib/draco/cmake/draco_emscripten.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_EMSCRIPTEN_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_EMSCRIPTEN_CMAKE_ @@ -18,39 +32,64 @@ endmacro() # Obtains the required Emscripten flags for Draco targets. macro(draco_get_required_emscripten_flags) - set(em_FLAG_LIST_VAR) + set(em_FLAG_LIST_VAR_COMPILER) + set(em_FLAG_LIST_VAR_LINKER) set(em_flags) - set(em_single_arg_opts FLAG_LIST_VAR) + set(em_single_arg_opts FLAG_LIST_VAR_COMPILER FLAG_LIST_VAR_LINKER) set(em_multi_arg_opts) cmake_parse_arguments(em "${em_flags}" "${em_single_arg_opts}" "${em_multi_arg_opts}" ${ARGN}) - if(NOT em_FLAG_LIST_VAR) - message(FATAL "draco_get_required_emscripten_flags: FLAG_LIST_VAR required") + if(NOT em_FLAG_LIST_VAR_COMPILER) + message( + FATAL + "draco_get_required_emscripten_flags: FLAG_LIST_VAR_COMPILER required") + endif() + + if(NOT em_FLAG_LIST_VAR_LINKER) + message( + FATAL + "draco_get_required_emscripten_flags: FLAG_LIST_VAR_LINKER required") endif() if(DRACO_JS_GLUE) unset(required_flags) - list(APPEND ${em_FLAG_LIST_VAR} "-sALLOW_MEMORY_GROWTH=1") - list(APPEND ${em_FLAG_LIST_VAR} "-Wno-almost-asm") - list(APPEND ${em_FLAG_LIST_VAR} "--memory-init-file" "0") - list(APPEND ${em_FLAG_LIST_VAR} "-fno-omit-frame-pointer") - list(APPEND ${em_FLAG_LIST_VAR} "-sMODULARIZE=1") - list(APPEND ${em_FLAG_LIST_VAR} "-sNO_FILESYSTEM=1") - list(APPEND ${em_FLAG_LIST_VAR} "-sEXPORTED_RUNTIME_METHODS=[]") - list(APPEND ${em_FLAG_LIST_VAR} "-sPRECISE_F32=1") - list(APPEND ${em_FLAG_LIST_VAR} "-sNODEJS_CATCH_EXIT=0") - list(APPEND ${em_FLAG_LIST_VAR} "-sNODEJS_CATCH_REJECTION=0") + # TODO(tomfinegan): Revisit splitting of compile/link flags for Emscripten, + # and drop -Wno-unused-command-line-argument. Emscripten complains about + # what are supposedly link-only flags sent with compile commands, but then + # proceeds to produce broken code if the warnings are heeded. + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} + "-Wno-unused-command-line-argument") + + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-Wno-almost-asm") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "--memory-init-file" "0") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-fno-omit-frame-pointer") + + # According to Emscripten the following flags are linker only, but sending + # these flags (en masse) to only the linker results in a broken Emscripten + # build with an empty DracoDecoderModule. + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sALLOW_MEMORY_GROWTH=1") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sMODULARIZE=1") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sFILESYSTEM=0") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} + "-sEXPORTED_FUNCTIONS=[\"_free\",\"_malloc\"]") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sPRECISE_F32=1") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sNODEJS_CATCH_EXIT=0") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sNODEJS_CATCH_REJECTION=0") if(DRACO_FAST) - list(APPEND ${em_FLAG_LIST_VAR} "--llvm-lto" "1") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "--llvm-lto" "1") endif() + + # The WASM flag is reported as linker only. if(DRACO_WASM) - list(APPEND ${em_FLAG_LIST_VAR} "-sWASM=1") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sWASM=1") else() - list(APPEND ${em_FLAG_LIST_VAR} "-sWASM=0") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sWASM=0") endif() + + # The LEGACY_VM_SUPPORT flag is reported as linker only. if(DRACO_IE_COMPATIBLE) - list(APPEND ${em_FLAG_LIST_VAR} "-sLEGACY_VM_SUPPORT=1") + list(APPEND ${em_FLAG_LIST_VAR_COMPILER} "-sLEGACY_VM_SUPPORT=1") endif() endif() endmacro() @@ -66,10 +105,11 @@ macro(draco_generate_emscripten_glue) "${glue_multi_arg_opts}" ${ARGN}) if(DRACO_VERBOSE GREATER 1) - message("--------- draco_generate_emscripten_glue -----------\n" - "glue_INPUT_IDL=${glue_INPUT_IDL}\n" - "glue_OUTPUT_PATH=${glue_OUTPUT_PATH}\n" ] - "----------------------------------------------------\n") + message( + "--------- draco_generate_emscripten_glue -----------\n" + "glue_INPUT_IDL=${glue_INPUT_IDL}\n" + "glue_OUTPUT_PATH=${glue_OUTPUT_PATH}\n" + "----------------------------------------------------\n") endif() if(NOT glue_INPUT_IDL OR NOT glue_OUTPUT_PATH) @@ -79,22 +119,22 @@ macro(draco_generate_emscripten_glue) endif() # Generate the glue source. - execute_process(COMMAND ${PYTHON_EXECUTABLE} - $ENV{EMSCRIPTEN}/tools/webidl_binder.py - ${glue_INPUT_IDL} ${glue_OUTPUT_PATH}) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} $ENV{EMSCRIPTEN}/tools/webidl_binder.py + ${glue_INPUT_IDL} ${glue_OUTPUT_PATH}) if(NOT EXISTS "${glue_OUTPUT_PATH}.cpp") message(FATAL_ERROR "JS glue generation failed for ${glue_INPUT_IDL}.") endif() # Create a dependency so that it regenerated on edits. - add_custom_command(OUTPUT "${glue_OUTPUT_PATH}.cpp" - COMMAND ${PYTHON_EXECUTABLE} - $ENV{EMSCRIPTEN}/tools/webidl_binder.py - ${glue_INPUT_IDL} ${glue_OUTPUT_PATH} - DEPENDS ${draco_js_dec_idl} - COMMENT "Generating ${glue_OUTPUT_PATH}.cpp." - WORKING_DIRECTORY ${draco_build} - VERBATIM) + add_custom_command( + OUTPUT "${glue_OUTPUT_PATH}.cpp" + COMMAND ${PYTHON_EXECUTABLE} $ENV{EMSCRIPTEN}/tools/webidl_binder.py + ${glue_INPUT_IDL} ${glue_OUTPUT_PATH} + DEPENDS ${draco_js_dec_idl} + COMMENT "Generating ${glue_OUTPUT_PATH}.cpp." + WORKING_DIRECTORY ${draco_build} + VERBATIM) endmacro() # Wrapper for draco_add_executable() that handles the extra work necessary for @@ -120,8 +160,14 @@ macro(draco_add_emscripten_executable) unset(emexe_LINK_FLAGS) set(optional_args) set(single_value_args NAME GLUE_PATH) - set(multi_value_args SOURCES DEFINES FEATURES INCLUDES LINK_FLAGS - PRE_LINK_JS_SOURCES POST_LINK_JS_SOURCES) + set(multi_value_args + SOURCES + DEFINES + FEATURES + INCLUDES + LINK_FLAGS + PRE_LINK_JS_SOURCES + POST_LINK_JS_SOURCES) cmake_parse_arguments(emexe "${optional_args}" "${single_value_args}" "${multi_value_args}" ${ARGN}) @@ -136,49 +182,50 @@ macro(draco_add_emscripten_executable) endif() if(DRACO_VERBOSE GREATER 1) - message("--------- draco_add_emscripten_executable ---------\n" - "emexe_NAME=${emexe_NAME}\n" - "emexe_SOURCES=${emexe_SOURCES}\n" - "emexe_DEFINES=${emexe_DEFINES}\n" - "emexe_INCLUDES=${emexe_INCLUDES}\n" - "emexe_LINK_FLAGS=${emexe_LINK_FLAGS}\n" - "emexe_GLUE_PATH=${emexe_GLUE_PATH}\n" - "emexe_FEATURES=${emexe_FEATURES}\n" - "emexe_PRE_LINK_JS_SOURCES=${emexe_PRE_LINK_JS_SOURCES}\n" - "emexe_POST_LINK_JS_SOURCES=${emexe_POST_LINK_JS_SOURCES}\n" - "----------------------------------------------------\n") + message( + "--------- draco_add_emscripten_executable ---------\n" + "emexe_NAME=${emexe_NAME}\n" + "emexe_SOURCES=${emexe_SOURCES}\n" + "emexe_DEFINES=${emexe_DEFINES}\n" + "emexe_INCLUDES=${emexe_INCLUDES}\n" + "emexe_LINK_FLAGS=${emexe_LINK_FLAGS}\n" + "emexe_GLUE_PATH=${emexe_GLUE_PATH}\n" + "emexe_FEATURES=${emexe_FEATURES}\n" + "emexe_PRE_LINK_JS_SOURCES=${emexe_PRE_LINK_JS_SOURCES}\n" + "emexe_POST_LINK_JS_SOURCES=${emexe_POST_LINK_JS_SOURCES}\n" + "----------------------------------------------------\n") endif() # The Emscripten linker needs the C++ flags in addition to whatever has been # passed in with the target. list(APPEND emexe_LINK_FLAGS ${DRACO_CXX_FLAGS}) - if(DRACO_GLTF) - draco_add_executable(NAME - ${emexe_NAME} - OUTPUT_NAME - ${emexe_NAME}_gltf - SOURCES - ${emexe_SOURCES} - DEFINES - ${emexe_DEFINES} - INCLUDES - ${emexe_INCLUDES} - LINK_FLAGS - ${emexe_LINK_FLAGS}) + if(DRACO_GLTF_BITSTREAM) + # Add "_gltf" suffix to target output name. + draco_add_executable( + NAME ${emexe_NAME} + OUTPUT_NAME ${emexe_NAME}_gltf + SOURCES ${emexe_SOURCES} + DEFINES ${emexe_DEFINES} + INCLUDES ${emexe_INCLUDES} + LINK_FLAGS ${emexe_LINK_FLAGS}) else() - draco_add_executable(NAME ${emexe_NAME} SOURCES ${emexe_SOURCES} DEFINES - ${emexe_DEFINES} INCLUDES ${emexe_INCLUDES} LINK_FLAGS - ${emexe_LINK_FLAGS}) + draco_add_executable( + NAME ${emexe_NAME} + SOURCES ${emexe_SOURCES} + DEFINES ${emexe_DEFINES} + INCLUDES ${emexe_INCLUDES} + LINK_FLAGS ${emexe_LINK_FLAGS}) endif() foreach(feature ${emexe_FEATURES}) draco_enable_feature(FEATURE ${feature} TARGETS ${emexe_NAME}) endforeach() - set_property(SOURCE ${emexe_SOURCES} - APPEND - PROPERTY OBJECT_DEPENDS "${emexe_GLUE_PATH}.cpp") + set_property( + SOURCE ${emexe_SOURCES} + APPEND + PROPERTY OBJECT_DEPENDS "${emexe_GLUE_PATH}.cpp") em_link_pre_js(${emexe_NAME} ${emexe_PRE_LINK_JS_SOURCES}) em_link_post_js(${emexe_NAME} "${emexe_GLUE_PATH}.js" ${emexe_POST_LINK_JS_SOURCES}) diff --git a/contrib/draco/cmake/draco_flags.cmake b/contrib/draco/cmake/draco_flags.cmake index 0397859a4..f3b24c6e1 100644 --- a/contrib/draco/cmake/draco_flags.cmake +++ b/contrib/draco/cmake/draco_flags.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_FLAGS_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_FLAGS_CMAKE_ @@ -24,7 +38,7 @@ macro(draco_set_compiler_flags_for_sources) endif() set_source_files_properties(${compiler_SOURCES} PROPERTIES COMPILE_FLAGS - ${compiler_FLAGS}) + ${compiler_FLAGS}) if(DRACO_VERBOSE GREATER 1) foreach(source ${compiler_SOURCES}) @@ -85,8 +99,8 @@ macro(draco_test_cxx_flag) # are passed as a list it will remove the list separators, and attempt to run # a compile command using list entries concatenated together as a single # argument. Avoid the problem by forcing the argument to be a string. - draco_set_and_stringify(SOURCE_VARS all_cxx_flags DEST all_cxx_flags) - check_cxx_compiler_flag("${all_cxx_flags}" draco_all_cxx_flags_pass) + draco_set_and_stringify(SOURCE_VARS all_cxx_flags DEST all_cxx_flags_string) + check_cxx_compiler_flag("${all_cxx_flags_string}" draco_all_cxx_flags_pass) if(cxx_test_FLAG_REQUIRED AND NOT draco_all_cxx_flags_pass) draco_die("Flag test failed for required flag(s): " @@ -245,3 +259,34 @@ macro(draco_set_cxx_flags) draco_test_cxx_flag(FLAG_LIST_VAR_NAMES ${cxx_flag_lists}) endif() endmacro() + +# Collects Draco built-in and user-specified linker flags and tests them. Halts +# configuration and reports the error when any flags cause the build to fail. +# +# Note: draco_test_exe_linker_flag() does the real work of setting the flags and +# running the test compile commands. +macro(draco_set_exe_linker_flags) + unset(linker_flag_lists) + + if(DRACO_VERBOSE) + message("draco_set_exe_linker_flags: " + "draco_base_exe_linker_flags=${draco_base_exe_linker_flags}") + endif() + + if(draco_base_exe_linker_flags) + list(APPEND linker_flag_lists draco_base_exe_linker_flags) + endif() + + if(linker_flag_lists) + unset(test_linker_flags) + + if(DRACO_VERBOSE) + message("draco_set_exe_linker_flags: " + "linker_flag_lists=${linker_flag_lists}") + endif() + + draco_set_and_stringify(DEST test_linker_flags SOURCE_VARS + ${linker_flag_lists}) + draco_test_exe_linker_flag(FLAG_LIST_VAR_NAME test_linker_flags) + endif() +endmacro() diff --git a/contrib/draco/cmake/draco_helpers.cmake b/contrib/draco/cmake/draco_helpers.cmake index 0b3b804cf..69e24c5be 100644 --- a/contrib/draco/cmake/draco_helpers.cmake +++ b/contrib/draco/cmake/draco_helpers.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_HELPERS_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_HELPERS_CMAKE_ diff --git a/contrib/draco/cmake/draco_install.cmake b/contrib/draco/cmake/draco_install.cmake index 09bfb591d..3be1ba163 100644 --- a/contrib/draco/cmake/draco_install.cmake +++ b/contrib/draco/cmake/draco_install.cmake @@ -1,32 +1,32 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_INSTALL_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_INSTALL_CMAKE_ set(DRACO_CMAKE_DRACO_INSTALL_CMAKE_ 1) +include(CMakePackageConfigHelpers) +include(GNUInstallDirs) + # Sets up the draco install targets. Must be called after the static library # target is created. macro(draco_setup_install_target) - include(GNUInstallDirs) - - # pkg-config: draco.pc - set(prefix "${CMAKE_INSTALL_PREFIX}") - set(exec_prefix "\${prefix}") - set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}") - set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") - set(draco_lib_name "draco") - - configure_file("${draco_root}/cmake/draco.pc.template" - "${draco_build}/draco.pc" @ONLY NEWLINE_STYLE UNIX) - install(FILES "${draco_build}/draco.pc" - DESTINATION "${prefix}/${CMAKE_INSTALL_LIBDIR}/pkgconfig") - - # CMake config: draco-config.cmake - set(DRACO_INCLUDE_DIRS "${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") - configure_file("${draco_root}/cmake/draco-config.cmake.template" - "${draco_build}/draco-config.cmake" @ONLY NEWLINE_STYLE UNIX) - install( - FILES "${draco_build}/draco-config.cmake" - DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/cmake") + set(bin_path "${CMAKE_INSTALL_BINDIR}") + set(data_path "${CMAKE_INSTALL_DATAROOTDIR}") + set(includes_path "${CMAKE_INSTALL_INCLUDEDIR}") + set(libs_path "${CMAKE_INSTALL_LIBDIR}") foreach(file ${draco_sources}) if(file MATCHES "h$") @@ -34,46 +34,88 @@ macro(draco_setup_install_target) endif() endforeach() + list(REMOVE_DUPLICATES draco_api_includes) + # Strip $draco_src_root from the file paths: we need to install relative to # $include_directory. list(TRANSFORM draco_api_includes REPLACE "${draco_src_root}/" "") - set(include_directory "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}") foreach(draco_api_include ${draco_api_includes}) get_filename_component(file_directory ${draco_api_include} DIRECTORY) - set(target_directory "${include_directory}/draco/${file_directory}") + set(target_directory "${includes_path}/draco/${file_directory}") install(FILES ${draco_src_root}/${draco_api_include} DESTINATION "${target_directory}") endforeach() - install( - FILES "${draco_build}/draco/draco_features.h" - DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/draco/") + install(FILES "${draco_build}/draco/draco_features.h" + DESTINATION "${includes_path}/draco/") - install(TARGETS draco_decoder DESTINATION - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") - install(TARGETS draco_encoder DESTINATION - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") + install(TARGETS draco_decoder DESTINATION "${bin_path}") + install(TARGETS draco_encoder DESTINATION "${bin_path}") + + if(DRACO_TRANSCODER_SUPPORTED) + install(TARGETS draco_transcoder DESTINATION "${bin_path}") + endif() if(MSVC) - install(TARGETS draco DESTINATION - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + install( + TARGETS draco + EXPORT dracoExport + RUNTIME DESTINATION "${bin_path}" + ARCHIVE DESTINATION "${libs_path}" + LIBRARY DESTINATION "${libs_path}") else() - install(TARGETS draco_static DESTINATION - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + install( + TARGETS draco_static + EXPORT dracoExport + DESTINATION "${libs_path}") + if(BUILD_SHARED_LIBS) - install(TARGETS draco_shared DESTINATION - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + install( + TARGETS draco_shared + EXPORT dracoExport + RUNTIME DESTINATION "${bin_path}" + ARCHIVE DESTINATION "${libs_path}" + LIBRARY DESTINATION "${libs_path}") endif() endif() if(DRACO_UNITY_PLUGIN) - install(TARGETS dracodec_unity DESTINATION - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") - endif() - if(DRACO_MAYA_PLUGIN) - install(TARGETS draco_maya_wrapper DESTINATION - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + install(TARGETS dracodec_unity DESTINATION "${libs_path}") endif() + if(DRACO_MAYA_PLUGIN) + install(TARGETS draco_maya_wrapper DESTINATION "${libs_path}") + endif() + + # pkg-config: draco.pc + configure_file("${draco_root}/cmake/draco.pc.template" + "${draco_build}/draco.pc" @ONLY NEWLINE_STYLE UNIX) + install(FILES "${draco_build}/draco.pc" DESTINATION "${libs_path}/pkgconfig") + + # CMake config: draco-config.cmake + configure_package_config_file( + "${draco_root}/cmake/draco-config.cmake.template" + "${draco_build}/draco-config.cmake" + INSTALL_DESTINATION "${data_path}/cmake/draco") + + write_basic_package_version_file( + "${draco_build}/draco-config-version.cmake" + VERSION ${DRACO_VERSION} + COMPATIBILITY AnyNewerVersion) + + export( + EXPORT dracoExport + NAMESPACE draco:: + FILE "${draco_build}/draco-targets.cmake") + + install( + EXPORT dracoExport + NAMESPACE draco:: + FILE draco-targets.cmake + DESTINATION "${data_path}/cmake/draco") + + install(FILES "${draco_build}/draco-config.cmake" + "${draco_build}/draco-config-version.cmake" + DESTINATION "${data_path}/cmake/draco") endmacro() diff --git a/contrib/draco/cmake/draco_intrinsics.cmake b/contrib/draco/cmake/draco_intrinsics.cmake index 9011c0de5..178df97a6 100644 --- a/contrib/draco/cmake/draco_intrinsics.cmake +++ b/contrib/draco/cmake/draco_intrinsics.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_INTRINSICS_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_INTRINSICS_CMAKE_ @@ -61,17 +75,15 @@ macro(draco_process_intrinsics_sources) unset(sse4_sources) list(APPEND sse4_sources ${arg_SOURCES}) - list(FILTER sse4_sources INCLUDE REGEX - "${draco_sse4_source_file_suffix}$") + list(FILTER sse4_sources INCLUDE REGEX "${draco_sse4_source_file_suffix}$") if(sse4_sources) unset(sse4_flags) - draco_get_intrinsics_flag_for_suffix(SUFFIX - ${draco_sse4_source_file_suffix} - VARIABLE sse4_flags) + draco_get_intrinsics_flag_for_suffix( + SUFFIX ${draco_sse4_source_file_suffix} VARIABLE sse4_flags) if(sse4_flags) draco_set_compiler_flags_for_sources(SOURCES ${sse4_sources} FLAGS - ${sse4_flags}) + ${sse4_flags}) endif() endif() endif() @@ -79,17 +91,15 @@ macro(draco_process_intrinsics_sources) if(DRACO_ENABLE_NEON AND draco_have_neon) unset(neon_sources) list(APPEND neon_sources ${arg_SOURCES}) - list(FILTER neon_sources INCLUDE REGEX - "${draco_neon_source_file_suffix}$") + list(FILTER neon_sources INCLUDE REGEX "${draco_neon_source_file_suffix}$") if(neon_sources AND DRACO_NEON_INTRINSICS_FLAG) unset(neon_flags) - draco_get_intrinsics_flag_for_suffix(SUFFIX - ${draco_neon_source_file_suffix} - VARIABLE neon_flags) + draco_get_intrinsics_flag_for_suffix( + SUFFIX ${draco_neon_source_file_suffix} VARIABLE neon_flags) if(neon_flags) draco_set_compiler_flags_for_sources(SOURCES ${neon_sources} FLAGS - ${neon_flags}) + ${neon_flags}) endif() endif() endif() diff --git a/contrib/draco/cmake/draco_options.cmake b/contrib/draco/cmake/draco_options.cmake index 832bfb69f..085149774 100644 --- a/contrib/draco/cmake/draco_options.cmake +++ b/contrib/draco/cmake/draco_options.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_OPTIONS_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_OPTIONS_CMAKE_ @@ -18,17 +32,22 @@ macro(draco_option) cmake_parse_arguments(option "${optional_args}" "${single_value_args}" "${multi_value_args}" ${ARGN}) - if(NOT (option_NAME AND option_HELPSTRING AND DEFINED option_VALUE)) + if(NOT + (option_NAME + AND option_HELPSTRING + AND DEFINED option_VALUE)) message(FATAL_ERROR "draco_option: NAME HELPSTRING and VALUE required.") endif() option(${option_NAME} ${option_HELPSTRING} ${option_VALUE}) if(DRACO_VERBOSE GREATER 2) - message("--------- draco_option ---------\n" "option_NAME=${option_NAME}\n" - "option_HELPSTRING=${option_HELPSTRING}\n" - "option_VALUE=${option_VALUE}\n" - "------------------------------------------\n") + message( + "--------- draco_option ---------\n" + "option_NAME=${option_NAME}\n" + "option_HELPSTRING=${option_HELPSTRING}\n" + "option_VALUE=${option_VALUE}\n" + "------------------------------------------\n") endif() list(APPEND draco_options ${option_NAME}) @@ -44,33 +63,74 @@ endmacro() # Set default options. macro(draco_set_default_options) - draco_option(NAME DRACO_FAST HELPSTRING "Try to build faster libs." VALUE OFF) - draco_option(NAME DRACO_JS_GLUE HELPSTRING - "Enable JS Glue and JS targets when using Emscripten." VALUE ON) - draco_option(NAME DRACO_IE_COMPATIBLE HELPSTRING - "Enable support for older IE builds when using Emscripten." VALUE - OFF) - draco_option(NAME DRACO_MESH_COMPRESSION HELPSTRING "Enable mesh compression." - VALUE ON) - draco_option(NAME DRACO_POINT_CLOUD_COMPRESSION HELPSTRING - "Enable point cloud compression." VALUE ON) - draco_option(NAME DRACO_PREDICTIVE_EDGEBREAKER HELPSTRING - "Enable predictive edgebreaker." VALUE ON) - draco_option(NAME DRACO_STANDARD_EDGEBREAKER HELPSTRING - "Enable stand edgebreaker." VALUE ON) - draco_option(NAME DRACO_BACKWARDS_COMPATIBILITY HELPSTRING - "Enable backwards compatibility." VALUE ON) - draco_option(NAME DRACO_DECODER_ATTRIBUTE_DEDUPLICATION HELPSTRING - "Enable attribute deduping." VALUE OFF) - draco_option(NAME DRACO_TESTS HELPSTRING "Enables tests." VALUE OFF) - draco_option(NAME DRACO_WASM HELPSTRING "Enables WASM support." VALUE OFF) - draco_option(NAME DRACO_UNITY_PLUGIN HELPSTRING - "Build plugin library for Unity." VALUE OFF) - draco_option(NAME DRACO_ANIMATION_ENCODING HELPSTRING "Enable animation." - VALUE OFF) - draco_option(NAME DRACO_GLTF HELPSTRING "Support GLTF." VALUE OFF) - draco_option(NAME DRACO_MAYA_PLUGIN HELPSTRING - "Build plugin library for Maya." VALUE OFF) + draco_option( + NAME DRACO_FAST + HELPSTRING "Try to build faster libs." + VALUE OFF) + draco_option( + NAME DRACO_JS_GLUE + HELPSTRING "Enable JS Glue and JS targets when using Emscripten." + VALUE ON) + draco_option( + NAME DRACO_IE_COMPATIBLE + HELPSTRING "Enable support for older IE builds when using Emscripten." + VALUE OFF) + draco_option( + NAME DRACO_MESH_COMPRESSION + HELPSTRING "Enable mesh compression." + VALUE ON) + draco_option( + NAME DRACO_POINT_CLOUD_COMPRESSION + HELPSTRING "Enable point cloud compression." + VALUE ON) + draco_option( + NAME DRACO_PREDICTIVE_EDGEBREAKER + HELPSTRING "Enable predictive edgebreaker." + VALUE ON) + draco_option( + NAME DRACO_STANDARD_EDGEBREAKER + HELPSTRING "Enable stand edgebreaker." + VALUE ON) + draco_option( + NAME DRACO_BACKWARDS_COMPATIBILITY + HELPSTRING "Enable backwards compatibility." + VALUE ON) + draco_option( + NAME DRACO_DECODER_ATTRIBUTE_DEDUPLICATION + HELPSTRING "Enable attribute deduping." + VALUE OFF) + draco_option( + NAME DRACO_TESTS + HELPSTRING "Enables tests." + VALUE OFF) + draco_option( + NAME DRACO_WASM + HELPSTRING "Enables WASM support." + VALUE OFF) + draco_option( + NAME DRACO_UNITY_PLUGIN + HELPSTRING "Build plugin library for Unity." + VALUE OFF) + draco_option( + NAME DRACO_ANIMATION_ENCODING + HELPSTRING "Enable animation." + VALUE OFF) + draco_option( + NAME DRACO_GLTF_BITSTREAM + HELPSTRING "Draco GLTF extension bitstream specified features only." + VALUE OFF) + draco_option( + NAME DRACO_MAYA_PLUGIN + HELPSTRING "Build plugin library for Maya." + VALUE OFF) + draco_option( + NAME DRACO_TRANSCODER_SUPPORTED + HELPSTRING "Enable the Draco transcoder." + VALUE OFF) + draco_option( + NAME DRACO_DEBUG_COMPILER_WARNINGS + HELPSTRING "Turn on more warnings." + VALUE OFF) draco_check_deprecated_options() endmacro() @@ -117,14 +177,16 @@ macro(draco_check_deprecated_options) DRACO_MAYA_PLUGIN) draco_handle_deprecated_option(OLDNAME BUILD_USD_PLUGIN NEWNAME BUILD_SHARED_LIBS) + draco_handle_deprecated_option(OLDNAME DRACO_GLTF NEWNAME + DRACO_GLTF_BITSTREAM) endmacro() # Macro for setting Draco features based on user configuration. Features enabled # by this macro are Draco global. macro(draco_set_optional_features) - if(DRACO_GLTF) - # Override settings when building for GLTF. + if(DRACO_GLTF_BITSTREAM) + # Enable only the features included in the Draco GLTF bitstream spec. draco_enable_feature(FEATURE "DRACO_MESH_COMPRESSION_SUPPORTED") draco_enable_feature(FEATURE "DRACO_NORMAL_ENCODING_SUPPORTED") draco_enable_feature(FEATURE "DRACO_STANDARD_EDGEBREAKER_SUPPORTED") @@ -170,6 +232,11 @@ macro(draco_set_optional_features) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() + if(DRACO_TRANSCODER_SUPPORTED) + draco_enable_feature(FEATURE "DRACO_TRANSCODER_SUPPORTED") + endif() + + endmacro() # Macro that handles tracking of Draco preprocessor symbols for the purpose of @@ -221,8 +288,56 @@ function(draco_generate_features_h) file(APPEND "${draco_features_file_name}.new" "#define ${feature}\n") endforeach() + if(MSVC) + if(NOT DRACO_DEBUG_COMPILER_WARNINGS) + file(APPEND "${draco_features_file_name}.new" + "// Enable DRACO_DEBUG_COMPILER_WARNINGS at CMake generation \n" + "// time to remove these pragmas.\n") + + # warning C4018: '': signed/unsigned mismatch. + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4018)\n") + + # warning C4146: unary minus operator applied to unsigned type, result + # still unsigned + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4146)\n") + + # warning C4244: 'return': conversion from '' to '', possible + # loss of data. + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4244)\n") + + # warning C4267: 'initializing' conversion from '' to '', + # possible loss of data. + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4267)\n") + + # warning C4305: 'context' : truncation from 'type1' to 'type2'. + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4305)\n") + + # warning C4661: 'identifier' : no suitable definition provided for + # explicit template instantiation request. + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4661)\n") + + # warning C4800: Implicit conversion from 'type' to bool. Possible + # information loss. + # Also, in older MSVC releases: + # warning C4800: 'type' : forcing value to bool 'true' or 'false' + # (performance warning). + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4800)\n") + + # warning C4804: '': unsafe use of type '' in operation. + file(APPEND "${draco_features_file_name}.new" + "#pragma warning(disable:4804)\n") + endif() + endif() + file(APPEND "${draco_features_file_name}.new" - "\n#endif // DRACO_FEATURES_H_") + "\n#endif // DRACO_FEATURES_H_\n") # Will replace ${draco_features_file_name} only if the file content has # changed. This prevents forced Draco rebuilds after CMake runs. diff --git a/contrib/draco/cmake/draco_sanitizer.cmake b/contrib/draco/cmake/draco_sanitizer.cmake index d2e41a6cb..77d141481 100644 --- a/contrib/draco/cmake/draco_sanitizer.cmake +++ b/contrib/draco/cmake/draco_sanitizer.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_SANITIZER_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_SANITIZER_CMAKE_ @@ -5,7 +19,9 @@ set(DRACO_CMAKE_DRACO_SANITIZER_CMAKE_ 1) # Handles the details of enabling sanitizers. macro(draco_configure_sanitizer) - if(DRACO_SANITIZE AND NOT EMSCRIPTEN AND NOT MSVC) + if(DRACO_SANITIZE + AND NOT EMSCRIPTEN + AND NOT MSVC) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(DRACO_SANITIZE MATCHES "cfi") list(APPEND SAN_CXX_FLAGS "-flto" "-fno-sanitize-trap=cfi") @@ -13,8 +29,8 @@ macro(draco_configure_sanitizer) "-fuse-ld=gold") endif() - if(${CMAKE_SIZEOF_VOID_P} EQUAL 4 - AND DRACO_SANITIZE MATCHES "integer|undefined") + if(${CMAKE_SIZEOF_VOID_P} EQUAL 4 AND DRACO_SANITIZE MATCHES + "integer|undefined") list(APPEND SAN_LINKER_FLAGS "--rtlib=compiler-rt" "-lgcc_s") endif() endif() diff --git a/contrib/draco/cmake/draco_targets.cmake b/contrib/draco/cmake/draco_targets.cmake index 0456c4d7b..c8c79f511 100644 --- a/contrib/draco/cmake/draco_targets.cmake +++ b/contrib/draco/cmake/draco_targets.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_TARGETS_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_TARGETS_CMAKE_ @@ -51,26 +65,33 @@ macro(draco_add_executable) unset(exe_LIB_DEPS) set(optional_args TEST) set(single_value_args NAME OUTPUT_NAME) - set(multi_value_args SOURCES DEFINES INCLUDES COMPILE_FLAGS LINK_FLAGS - OBJLIB_DEPS LIB_DEPS) + set(multi_value_args + SOURCES + DEFINES + INCLUDES + COMPILE_FLAGS + LINK_FLAGS + OBJLIB_DEPS + LIB_DEPS) cmake_parse_arguments(exe "${optional_args}" "${single_value_args}" "${multi_value_args}" ${ARGN}) if(DRACO_VERBOSE GREATER 1) - message("--------- draco_add_executable ---------\n" - "exe_TEST=${exe_TEST}\n" - "exe_TEST_DEFINES_MAIN=${exe_TEST_DEFINES_MAIN}\n" - "exe_NAME=${exe_NAME}\n" - "exe_OUTPUT_NAME=${exe_OUTPUT_NAME}\n" - "exe_SOURCES=${exe_SOURCES}\n" - "exe_DEFINES=${exe_DEFINES}\n" - "exe_INCLUDES=${exe_INCLUDES}\n" - "exe_COMPILE_FLAGS=${exe_COMPILE_FLAGS}\n" - "exe_LINK_FLAGS=${exe_LINK_FLAGS}\n" - "exe_OBJLIB_DEPS=${exe_OBJLIB_DEPS}\n" - "exe_LIB_DEPS=${exe_LIB_DEPS}\n" - "------------------------------------------\n") + message( + "--------- draco_add_executable ---------\n" + "exe_TEST=${exe_TEST}\n" + "exe_TEST_DEFINES_MAIN=${exe_TEST_DEFINES_MAIN}\n" + "exe_NAME=${exe_NAME}\n" + "exe_OUTPUT_NAME=${exe_OUTPUT_NAME}\n" + "exe_SOURCES=${exe_SOURCES}\n" + "exe_DEFINES=${exe_DEFINES}\n" + "exe_INCLUDES=${exe_INCLUDES}\n" + "exe_COMPILE_FLAGS=${exe_COMPILE_FLAGS}\n" + "exe_LINK_FLAGS=${exe_LINK_FLAGS}\n" + "exe_OBJLIB_DEPS=${exe_OBJLIB_DEPS}\n" + "exe_LIB_DEPS=${exe_LIB_DEPS}\n" + "------------------------------------------\n") endif() if(NOT (exe_NAME AND exe_SOURCES)) @@ -87,7 +108,12 @@ macro(draco_add_executable) endif() add_executable(${exe_NAME} ${exe_SOURCES}) - set_target_properties(${exe_NAME} PROPERTIES VERSION ${DRACO_VERSION}) + + target_compile_features(${exe_NAME} PUBLIC cxx_std_11) + + if(NOT EMSCRIPTEN) + set_target_properties(${exe_NAME} PROPERTIES VERSION ${DRACO_VERSION}) + endif() if(exe_OUTPUT_NAME) set_target_properties(${exe_NAME} PROPERTIES OUTPUT_NAME ${exe_OUTPUT_NAME}) @@ -104,8 +130,8 @@ macro(draco_add_executable) endif() if(exe_COMPILE_FLAGS OR DRACO_CXX_FLAGS) - target_compile_options(${exe_NAME} - PRIVATE ${exe_COMPILE_FLAGS} ${DRACO_CXX_FLAGS}) + target_compile_options(${exe_NAME} PRIVATE ${exe_COMPILE_FLAGS} + ${DRACO_CXX_FLAGS}) endif() if(exe_LINK_FLAGS OR DRACO_EXE_LINKER_FLAGS) @@ -113,8 +139,8 @@ macro(draco_add_executable) list(APPEND exe_LINK_FLAGS "${DRACO_EXE_LINKER_FLAGS}") # LINK_FLAGS is managed as a string. draco_set_and_stringify(SOURCE "${exe_LINK_FLAGS}" DEST exe_LINK_FLAGS) - set_target_properties(${exe_NAME} - PROPERTIES LINK_FLAGS "${exe_LINK_FLAGS}") + set_target_properties(${exe_NAME} PROPERTIES LINK_FLAGS + "${exe_LINK_FLAGS}") else() target_link_options(${exe_NAME} PRIVATE ${exe_LINK_FLAGS} ${DRACO_EXE_LINKER_FLAGS}) @@ -136,12 +162,7 @@ macro(draco_add_executable) endif() if(exe_LIB_DEPS) - unset(exe_static) - if("${CMAKE_EXE_LINKER_FLAGS} ${DRACO_EXE_LINKER_FLAGS}" MATCHES "static") - set(exe_static ON) - endif() - - if(exe_static AND CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") + if(CMAKE_CXX_COMPILER_ID MATCHES "^Clang|^GNU") # Third party dependencies can introduce dependencies on system and test # libraries. Since the target created here is an executable, and CMake # does not provide a method of controlling order of link dependencies, @@ -149,6 +170,10 @@ macro(draco_add_executable) # ensure that dependencies of third party targets can be resolved when # those dependencies happen to be resolved by dependencies of the current # target. + # TODO(tomfinegan): For portability use LINK_GROUP with RESCAN instead of + # directly (ab)using compiler/linker specific flags once CMake v3.24 is in + # wider use. See: + # https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#genex:LINK_GROUP list(INSERT exe_LIB_DEPS 0 -Wl,--start-group) list(APPEND exe_LIB_DEPS -Wl,--end-group) endif() @@ -209,27 +234,36 @@ macro(draco_add_library) unset(lib_TARGET_PROPERTIES) set(optional_args TEST) set(single_value_args NAME OUTPUT_NAME TYPE) - set(multi_value_args SOURCES DEFINES INCLUDES COMPILE_FLAGS LINK_FLAGS - OBJLIB_DEPS LIB_DEPS PUBLIC_INCLUDES TARGET_PROPERTIES) + set(multi_value_args + SOURCES + DEFINES + INCLUDES + COMPILE_FLAGS + LINK_FLAGS + OBJLIB_DEPS + LIB_DEPS + PUBLIC_INCLUDES + TARGET_PROPERTIES) cmake_parse_arguments(lib "${optional_args}" "${single_value_args}" "${multi_value_args}" ${ARGN}) if(DRACO_VERBOSE GREATER 1) - message("--------- draco_add_library ---------\n" - "lib_TEST=${lib_TEST}\n" - "lib_NAME=${lib_NAME}\n" - "lib_OUTPUT_NAME=${lib_OUTPUT_NAME}\n" - "lib_TYPE=${lib_TYPE}\n" - "lib_SOURCES=${lib_SOURCES}\n" - "lib_DEFINES=${lib_DEFINES}\n" - "lib_INCLUDES=${lib_INCLUDES}\n" - "lib_COMPILE_FLAGS=${lib_COMPILE_FLAGS}\n" - "lib_LINK_FLAGS=${lib_LINK_FLAGS}\n" - "lib_OBJLIB_DEPS=${lib_OBJLIB_DEPS}\n" - "lib_LIB_DEPS=${lib_LIB_DEPS}\n" - "lib_PUBLIC_INCLUDES=${lib_PUBLIC_INCLUDES}\n" - "---------------------------------------\n") + message( + "--------- draco_add_library ---------\n" + "lib_TEST=${lib_TEST}\n" + "lib_NAME=${lib_NAME}\n" + "lib_OUTPUT_NAME=${lib_OUTPUT_NAME}\n" + "lib_TYPE=${lib_TYPE}\n" + "lib_SOURCES=${lib_SOURCES}\n" + "lib_DEFINES=${lib_DEFINES}\n" + "lib_INCLUDES=${lib_INCLUDES}\n" + "lib_COMPILE_FLAGS=${lib_COMPILE_FLAGS}\n" + "lib_LINK_FLAGS=${lib_LINK_FLAGS}\n" + "lib_OBJLIB_DEPS=${lib_OBJLIB_DEPS}\n" + "lib_LIB_DEPS=${lib_LIB_DEPS}\n" + "lib_PUBLIC_INCLUDES=${lib_PUBLIC_INCLUDES}\n" + "---------------------------------------\n") endif() if(NOT (lib_NAME AND lib_TYPE)) @@ -256,14 +290,24 @@ macro(draco_add_library) endif() add_library(${lib_NAME} ${lib_TYPE} ${lib_SOURCES}) + + target_compile_features(${lib_NAME} PUBLIC cxx_std_11) + + target_include_directories(${lib_NAME} PUBLIC $) + + if(BUILD_SHARED_LIBS) + # Enable PIC for all targets in shared configurations. + set_target_properties(${lib_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() + if(lib_SOURCES) draco_process_intrinsics_sources(TARGET ${lib_NAME} SOURCES ${lib_SOURCES}) endif() if(lib_OUTPUT_NAME) if(NOT (BUILD_SHARED_LIBS AND MSVC)) - set_target_properties(${lib_NAME} - PROPERTIES OUTPUT_NAME ${lib_OUTPUT_NAME}) + set_target_properties(${lib_NAME} PROPERTIES OUTPUT_NAME + ${lib_OUTPUT_NAME}) endif() endif() @@ -280,8 +324,8 @@ macro(draco_add_library) endif() if(lib_COMPILE_FLAGS OR DRACO_CXX_FLAGS) - target_compile_options(${lib_NAME} - PRIVATE ${lib_COMPILE_FLAGS} ${DRACO_CXX_FLAGS}) + target_compile_options(${lib_NAME} PRIVATE ${lib_COMPILE_FLAGS} + ${DRACO_CXX_FLAGS}) endif() if(lib_LINK_FLAGS) @@ -320,11 +364,12 @@ macro(draco_add_library) set_target_properties(${lib_NAME} PROPERTIES PREFIX "") endif() - # VERSION and SOVERSION as necessary - if(NOT lib_TYPE STREQUAL STATIC AND NOT lib_TYPE STREQUAL MODULE) - set_target_properties(${lib_NAME} PROPERTIES VERSION ${DRACO_VERSION}) - if(NOT MSVC) - set_target_properties(${lib_NAME} PROPERTIES SOVERSION ${DRACO_SOVERSION}) + if(NOT EMSCRIPTEN) + # VERSION and SOVERSION as necessary + if((lib_TYPE STREQUAL BUNDLE OR lib_TYPE STREQUAL SHARED) AND NOT MSVC) + set_target_properties( + ${lib_NAME} PROPERTIES VERSION ${DRACO_SOVERSION} + SOVERSION ${DRACO_SOVERSION_MAJOR}) endif() endif() diff --git a/contrib/draco/cmake/draco_test_config.h.cmake b/contrib/draco/cmake/draco_test_config.h.cmake index 77a574123..9bb174569 100644 --- a/contrib/draco/cmake/draco_test_config.h.cmake +++ b/contrib/draco/cmake/draco_test_config.h.cmake @@ -1,3 +1,17 @@ +// Copyright 2021 The Draco Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #ifndef DRACO_TESTING_DRACO_TEST_CONFIG_H_ #define DRACO_TESTING_DRACO_TEST_CONFIG_H_ @@ -9,5 +23,6 @@ #define DRACO_TEST_DATA_DIR "${DRACO_TEST_DATA_DIR}" #define DRACO_TEST_TEMP_DIR "${DRACO_TEST_TEMP_DIR}" +#define DRACO_TEST_ROOT_DIR "${DRACO_TEST_ROOT_DIR}" #endif // DRACO_TESTING_DRACO_TEST_CONFIG_H_ diff --git a/contrib/draco/cmake/draco_tests.cmake b/contrib/draco/cmake/draco_tests.cmake index a6dfc5b57..1d905a969 100644 --- a/contrib/draco/cmake/draco_tests.cmake +++ b/contrib/draco/cmake/draco_tests.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_TESTS_CMAKE) return() endif() @@ -10,6 +24,13 @@ set(draco_factory_test_sources "${draco_src_root}/io/file_reader_factory_test.cc" "${draco_src_root}/io/file_writer_factory_test.cc") +list( + APPEND draco_test_common_sources + "${draco_src_root}/core/draco_test_base.h" + "${draco_src_root}/core/draco_test_utils.cc" + "${draco_src_root}/core/draco_test_utils.h" + "${draco_src_root}/core/status.cc") + list( APPEND draco_test_sources @@ -30,22 +51,23 @@ list( "${draco_src_root}/compression/point_cloud/point_cloud_kd_tree_encoding_test.cc" "${draco_src_root}/compression/point_cloud/point_cloud_sequential_encoding_test.cc" "${draco_src_root}/core/buffer_bit_coding_test.cc" - "${draco_src_root}/core/draco_test_base.h" - "${draco_src_root}/core/draco_test_utils.cc" - "${draco_src_root}/core/draco_test_utils.h" "${draco_src_root}/core/math_utils_test.cc" "${draco_src_root}/core/quantization_utils_test.cc" "${draco_src_root}/core/status_test.cc" "${draco_src_root}/core/vector_d_test.cc" "${draco_src_root}/io/file_reader_test_common.h" "${draco_src_root}/io/file_utils_test.cc" + "${draco_src_root}/io/file_writer_utils_test.cc" "${draco_src_root}/io/stdio_file_reader_test.cc" "${draco_src_root}/io/stdio_file_writer_test.cc" "${draco_src_root}/io/obj_decoder_test.cc" "${draco_src_root}/io/obj_encoder_test.cc" "${draco_src_root}/io/ply_decoder_test.cc" "${draco_src_root}/io/ply_reader_test.cc" + "${draco_src_root}/io/stl_decoder_test.cc" + "${draco_src_root}/io/stl_encoder_test.cc" "${draco_src_root}/io/point_cloud_io_test.cc" + "${draco_src_root}/mesh/corner_table_test.cc" "${draco_src_root}/mesh/mesh_are_equivalent_test.cc" "${draco_src_root}/mesh/mesh_cleanup_test.cc" "${draco_src_root}/mesh/triangle_soup_mesh_builder_test.cc" @@ -54,47 +76,71 @@ list( "${draco_src_root}/point_cloud/point_cloud_builder_test.cc" "${draco_src_root}/point_cloud/point_cloud_test.cc") -list(APPEND draco_gtest_all - "${draco_root}/../googletest/googletest/src/gtest-all.cc") -list(APPEND draco_gtest_main - "${draco_root}/../googletest/googletest/src/gtest_main.cc") +if(DRACO_TRANSCODER_SUPPORTED) + list( + APPEND draco_test_sources + "${draco_src_root}/animation/animation_test.cc" + "${draco_src_root}/io/gltf_decoder_test.cc" + "${draco_src_root}/io/gltf_encoder_test.cc" + "${draco_src_root}/io/gltf_utils_test.cc" + "${draco_src_root}/io/gltf_test_helper.cc" + "${draco_src_root}/io/gltf_test_helper.h" + "${draco_src_root}/io/scene_io_test.cc" + "${draco_src_root}/io/texture_io_test.cc" + "${draco_src_root}/material/material_library_test.cc" + "${draco_src_root}/material/material_test.cc" + "${draco_src_root}/metadata/property_table_test.cc" + "${draco_src_root}/metadata/structural_metadata_test.cc" + "${draco_src_root}/scene/instance_array_test.cc" + "${draco_src_root}/scene/light_test.cc" + "${draco_src_root}/scene/mesh_group_test.cc" + "${draco_src_root}/scene/scene_test.cc" + "${draco_src_root}/scene/scene_are_equivalent_test.cc" + "${draco_src_root}/scene/scene_utils_test.cc" + "${draco_src_root}/scene/trs_matrix_test.cc" + "${draco_src_root}/texture/texture_library_test.cc" + "${draco_src_root}/texture/texture_map_test.cc" + "${draco_src_root}/texture/texture_transform_test.cc") + +endif() macro(draco_setup_test_targets) if(DRACO_TESTS) + draco_setup_googletest() + if(NOT (EXISTS ${draco_gtest_all} AND EXISTS ${draco_gtest_main})) - message(FATAL "googletest must be a sibling directory of ${draco_root}.") + message(FATAL_ERROR "googletest missing, run git submodule update --init") endif() list(APPEND draco_test_defines GTEST_HAS_PTHREAD=0) - draco_add_library(TEST - NAME - draco_gtest - TYPE - STATIC - SOURCES - ${draco_gtest_all} - DEFINES - ${draco_defines} - ${draco_test_defines} - INCLUDES - ${draco_test_include_paths}) + draco_add_library( + TEST + NAME draco_test_common + TYPE STATIC + SOURCES ${draco_test_common_sources} + DEFINES ${draco_defines} ${draco_test_defines} + INCLUDES ${draco_test_include_paths}) - draco_add_library(TEST - NAME - draco_gtest_main - TYPE - STATIC - SOURCES - ${draco_gtest_main} - DEFINES - ${draco_defines} - ${draco_test_defines} - INCLUDES - ${draco_test_include_paths}) + draco_add_library( + TEST + NAME draco_gtest + TYPE STATIC + SOURCES ${draco_gtest_all} + DEFINES ${draco_defines} ${draco_test_defines} + INCLUDES ${draco_test_include_paths}) + + draco_add_library( + TEST + NAME draco_gtest_main + TYPE STATIC + SOURCES ${draco_gtest_main} + DEFINES ${draco_defines} ${draco_test_defines} + INCLUDES ${draco_test_include_paths}) set(DRACO_TEST_DATA_DIR "${draco_root}/testdata") set(DRACO_TEST_TEMP_DIR "${draco_build}/draco_test_temp") + set(DRACO_TEST_ROOT_DIR "${draco_root}") file(MAKE_DIRECTORY "${DRACO_TEST_TEMP_DIR}") # Sets DRACO_TEST_DATA_DIR and DRACO_TEST_TEMP_DIR. @@ -102,32 +148,24 @@ macro(draco_setup_test_targets) "${draco_build}/testing/draco_test_config.h") # Create the test targets. - draco_add_executable(NAME - draco_tests - SOURCES - ${draco_test_sources} - DEFINES - ${draco_defines} - ${draco_test_defines} - INCLUDES - ${draco_test_include_paths} - LIB_DEPS - draco_static - draco_gtest - draco_gtest_main) + draco_add_executable( + TEST + NAME draco_tests + SOURCES ${draco_test_sources} + DEFINES ${draco_defines} ${draco_test_defines} + INCLUDES ${draco_test_include_paths} + LIB_DEPS ${draco_dependency} draco_gtest draco_gtest_main + draco_test_common) + + draco_add_executable( + TEST + NAME draco_factory_tests + SOURCES ${draco_factory_test_sources} + DEFINES ${draco_defines} ${draco_test_defines} + INCLUDES ${draco_test_include_paths} + LIB_DEPS ${draco_dependency} draco_gtest draco_gtest_main + draco_test_common) + - draco_add_executable(NAME - draco_factory_tests - SOURCES - ${draco_factory_test_sources} - DEFINES - ${draco_defines} - ${draco_test_defines} - INCLUDES - ${draco_test_include_paths} - LIB_DEPS - draco_static - draco_gtest - draco_gtest_main) endif() endmacro() diff --git a/contrib/draco/cmake/draco_variables.cmake b/contrib/draco/cmake/draco_variables.cmake index 8dbc77a53..6d1b6a99d 100644 --- a/contrib/draco/cmake/draco_variables.cmake +++ b/contrib/draco/cmake/draco_variables.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_DRACO_VARIABLES_CMAKE_) return() endif() # DRACO_CMAKE_DRACO_VARIABLES_CMAKE_ @@ -14,8 +28,7 @@ macro(draco_variable_must_be_directory variable_name) if("${${variable_name}}" STREQUAL "") message( - FATAL_ERROR - "Empty variable ${variable_name} is required to build draco.") + FATAL_ERROR "Empty variable ${variable_name} is required to build draco.") endif() if(NOT IS_DIRECTORY "${${variable_name}}") @@ -44,11 +57,13 @@ macro(draco_dump_cmake_flag_variables) list(APPEND flag_variables "CMAKE_CXX_FLAGS_INIT" "CMAKE_CXX_FLAGS" "CMAKE_EXE_LINKER_FLAGS_INIT" "CMAKE_EXE_LINKER_FLAGS") if(CMAKE_BUILD_TYPE) - list(APPEND flag_variables "CMAKE_BUILD_TYPE" - "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}_INIT" - "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" - "CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE}_INIT" - "CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE}") + list( + APPEND flag_variables + "CMAKE_BUILD_TYPE" + "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}_INIT" + "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" + "CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE}_INIT" + "CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE}") endif() foreach(flag_variable ${flag_variables}) message("${flag_variable}:${${flag_variable}}") diff --git a/contrib/draco/cmake/sanitizers.cmake b/contrib/draco/cmake/sanitizers.cmake deleted file mode 100644 index e720bc045..000000000 --- a/contrib/draco/cmake/sanitizers.cmake +++ /dev/null @@ -1,19 +0,0 @@ -if(DRACO_CMAKE_SANITIZERS_CMAKE_) - return() -endif() -set(DRACO_CMAKE_SANITIZERS_CMAKE_ 1) - -if(MSVC OR NOT SANITIZE) - return() -endif() - -include("${draco_root}/cmake/compiler_flags.cmake") - -string(TOLOWER ${SANITIZE} SANITIZE) - -# Require the sanitizer requested. -require_linker_flag("-fsanitize=${SANITIZE}") -require_compiler_flag("-fsanitize=${SANITIZE}" YES) - -# Make callstacks accurate. -require_compiler_flag("-fno-omit-frame-pointer -fno-optimize-sibling-calls" YES) diff --git a/contrib/draco/cmake/toolchains/aarch64-linux-gnu.cmake b/contrib/draco/cmake/toolchains/aarch64-linux-gnu.cmake index 87e0b4a45..a55da20fa 100644 --- a/contrib/draco/cmake/toolchains/aarch64-linux-gnu.cmake +++ b/contrib/draco/cmake/toolchains/aarch64-linux-gnu.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_AARCH64_LINUX_GNU_CMAKE_) return() endif() # DRACO_CMAKE_TOOLCHAINS_AARCH64_LINUX_GNU_CMAKE_ diff --git a/contrib/draco/cmake/toolchains/android-ndk-common.cmake b/contrib/draco/cmake/toolchains/android-ndk-common.cmake index 5126d6e29..80396af48 100644 --- a/contrib/draco/cmake/toolchains/android-ndk-common.cmake +++ b/contrib/draco/cmake/toolchains/android-ndk-common.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ANDROID_NDK_COMMON_CMAKE_) return() endif() diff --git a/contrib/draco/cmake/toolchains/android.cmake b/contrib/draco/cmake/toolchains/android.cmake index b8f576d5e..ba50576b7 100644 --- a/contrib/draco/cmake/toolchains/android.cmake +++ b/contrib/draco/cmake/toolchains/android.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ANDROID_CMAKE_) return() endif() # DRACO_CMAKE_TOOLCHAINS_ANDROID_CMAKE_ @@ -16,9 +30,9 @@ if(NOT ANDROID_ABI) set(ANDROID_ABI arm64-v8a) endif() -# Force arm mode for 32-bit targets (instead of the default thumb) to improve -# performance. -if(NOT ANDROID_ARM_MODE) +# Force arm mode for 32-bit arm targets (instead of the default thumb) to +# improve performance. +if(ANDROID_ABI MATCHES "^armeabi" AND NOT ANDROID_ARM_MODE) set(ANDROID_ARM_MODE arm) endif() diff --git a/contrib/draco/cmake/toolchains/arm-ios-common.cmake b/contrib/draco/cmake/toolchains/arm-ios-common.cmake index 65326d1c2..fab54bb39 100644 --- a/contrib/draco/cmake/toolchains/arm-ios-common.cmake +++ b/contrib/draco/cmake/toolchains/arm-ios-common.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARM_IOS_COMMON_CMAKE_) return() endif() @@ -13,5 +27,3 @@ set(CMAKE_C_COMPILER clang) set(CMAKE_C_COMPILER_ARG1 "-arch ${CMAKE_SYSTEM_PROCESSOR}") set(CMAKE_CXX_COMPILER clang++) set(CMAKE_CXX_COMPILER_ARG1 "-arch ${CMAKE_SYSTEM_PROCESSOR}") - -# TODO(tomfinegan): Handle bit code embedding. diff --git a/contrib/draco/cmake/toolchains/arm-linux-gnueabihf.cmake b/contrib/draco/cmake/toolchains/arm-linux-gnueabihf.cmake index 6e45969e9..f1f83d67c 100644 --- a/contrib/draco/cmake/toolchains/arm-linux-gnueabihf.cmake +++ b/contrib/draco/cmake/toolchains/arm-linux-gnueabihf.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARM_LINUX_GNUEABIHF_CMAKE_) return() endif() # DRACO_CMAKE_TOOLCHAINS_ARM_LINUX_GNUEABIHF_CMAKE_ diff --git a/contrib/draco/cmake/toolchains/arm64-android-ndk-libcpp.cmake b/contrib/draco/cmake/toolchains/arm64-android-ndk-libcpp.cmake index 4b6d366f0..80d452f97 100644 --- a/contrib/draco/cmake/toolchains/arm64-android-ndk-libcpp.cmake +++ b/contrib/draco/cmake/toolchains/arm64-android-ndk-libcpp.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARM64_ANDROID_NDK_LIBCPP_CMAKE_) return() endif() diff --git a/contrib/draco/cmake/toolchains/arm64-ios.cmake b/contrib/draco/cmake/toolchains/arm64-ios.cmake index c4ec7e3fa..5365d70f1 100644 --- a/contrib/draco/cmake/toolchains/arm64-ios.cmake +++ b/contrib/draco/cmake/toolchains/arm64-ios.cmake @@ -1,10 +1,23 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARM64_IOS_CMAKE_) return() endif() set(DRACO_CMAKE_TOOLCHAINS_ARM64_IOS_CMAKE_ 1) if(XCODE) - # TODO(tomfinegan): Handle arm builds in Xcode. message(FATAL_ERROR "This toolchain does not support Xcode.") endif() diff --git a/contrib/draco/cmake/toolchains/arm64-linux-gcc.cmake b/contrib/draco/cmake/toolchains/arm64-linux-gcc.cmake index 046ff0139..a332760b2 100644 --- a/contrib/draco/cmake/toolchains/arm64-linux-gcc.cmake +++ b/contrib/draco/cmake/toolchains/arm64-linux-gcc.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARM64_LINUX_GCC_CMAKE_) return() endif() diff --git a/contrib/draco/cmake/toolchains/armv7-android-ndk-libcpp.cmake b/contrib/draco/cmake/toolchains/armv7-android-ndk-libcpp.cmake index 80ee98b18..bedcc0cad 100644 --- a/contrib/draco/cmake/toolchains/armv7-android-ndk-libcpp.cmake +++ b/contrib/draco/cmake/toolchains/armv7-android-ndk-libcpp.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARMV7_ANDROID_NDK_LIBCPP_CMAKE_) return() endif() diff --git a/contrib/draco/cmake/toolchains/armv7-ios.cmake b/contrib/draco/cmake/toolchains/armv7-ios.cmake index 8ddd6997b..43e208b1f 100644 --- a/contrib/draco/cmake/toolchains/armv7-ios.cmake +++ b/contrib/draco/cmake/toolchains/armv7-ios.cmake @@ -1,10 +1,23 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARMV7_IOS_CMAKE_) return() endif() set(DRACO_CMAKE_TOOLCHAINS_ARMV7_IOS_CMAKE_ 1) if(XCODE) - # TODO(tomfinegan): Handle arm builds in Xcode. message(FATAL_ERROR "This toolchain does not support Xcode.") endif() diff --git a/contrib/draco/cmake/toolchains/armv7-linux-gcc.cmake b/contrib/draco/cmake/toolchains/armv7-linux-gcc.cmake index 9c9472319..730a87f4b 100644 --- a/contrib/draco/cmake/toolchains/armv7-linux-gcc.cmake +++ b/contrib/draco/cmake/toolchains/armv7-linux-gcc.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARMV7_LINUX_GCC_CMAKE_) return() endif() diff --git a/contrib/draco/cmake/toolchains/armv7s-ios.cmake b/contrib/draco/cmake/toolchains/armv7s-ios.cmake index b433025ba..472756117 100644 --- a/contrib/draco/cmake/toolchains/armv7s-ios.cmake +++ b/contrib/draco/cmake/toolchains/armv7s-ios.cmake @@ -1,10 +1,23 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_ARMV7S_IOS_CMAKE_) return() endif() set(DRACO_CMAKE_TOOLCHAINS_ARMV7S_IOS_CMAKE_ 1) if(XCODE) - # TODO(tomfinegan): Handle arm builds in Xcode. message(FATAL_ERROR "This toolchain does not support Xcode.") endif() diff --git a/contrib/draco/cmake/toolchains/i386-ios.cmake b/contrib/draco/cmake/toolchains/i386-ios.cmake index e9a105591..38989d225 100644 --- a/contrib/draco/cmake/toolchains/i386-ios.cmake +++ b/contrib/draco/cmake/toolchains/i386-ios.cmake @@ -1,10 +1,23 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_i386_IOS_CMAKE_) return() endif() set(DRACO_CMAKE_TOOLCHAINS_i386_IOS_CMAKE_ 1) if(XCODE) - # TODO(tomfinegan): Handle arm builds in Xcode. message(FATAL_ERROR "This toolchain does not support Xcode.") endif() diff --git a/contrib/draco/cmake/toolchains/x86-android-ndk-libcpp.cmake b/contrib/draco/cmake/toolchains/x86-android-ndk-libcpp.cmake index d43383640..6f63f2c31 100644 --- a/contrib/draco/cmake/toolchains/x86-android-ndk-libcpp.cmake +++ b/contrib/draco/cmake/toolchains/x86-android-ndk-libcpp.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_X86_ANDROID_NDK_LIBCPP_CMAKE_) return() endif() diff --git a/contrib/draco/cmake/toolchains/x86_64-android-ndk-libcpp.cmake b/contrib/draco/cmake/toolchains/x86_64-android-ndk-libcpp.cmake index d6fabeacc..7a630f4d4 100644 --- a/contrib/draco/cmake/toolchains/x86_64-android-ndk-libcpp.cmake +++ b/contrib/draco/cmake/toolchains/x86_64-android-ndk-libcpp.cmake @@ -1,3 +1,17 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_X86_64_ANDROID_NDK_LIBCPP_CMAKE_) return() endif() diff --git a/contrib/draco/cmake/toolchains/x86_64-ios.cmake b/contrib/draco/cmake/toolchains/x86_64-ios.cmake index 4c50a72a2..6946ce410 100644 --- a/contrib/draco/cmake/toolchains/x86_64-ios.cmake +++ b/contrib/draco/cmake/toolchains/x86_64-ios.cmake @@ -1,10 +1,23 @@ +# Copyright 2021 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + if(DRACO_CMAKE_TOOLCHAINS_X86_64_IOS_CMAKE_) return() endif() set(DRACO_CMAKE_TOOLCHAINS_X86_64_IOS_CMAKE_ 1) if(XCODE) - # TODO(tomfinegan): Handle arm builds in Xcode. message(FATAL_ERROR "This toolchain does not support Xcode.") endif() diff --git a/contrib/draco/cmake/util.cmake b/contrib/draco/cmake/util.cmake deleted file mode 100644 index 813146a62..000000000 --- a/contrib/draco/cmake/util.cmake +++ /dev/null @@ -1,79 +0,0 @@ -if(DRACO_CMAKE_UTIL_CMAKE_) - return() -endif() -set(DRACO_CMAKE_UTIL_CMAKE_ 1) - -# Creates dummy source file in $draco_build_dir named $basename.$extension and -# returns the full path to the dummy source file via the $out_file_path -# parameter. -function(create_dummy_source_file basename extension out_file_path) - set(dummy_source_file "${draco_build_dir}/${basename}.${extension}") - file(WRITE "${dummy_source_file}.new" - "// Generated file. DO NOT EDIT!\n" - "// ${target_name} needs a ${extension} file to force link language, \n" - "// or to silence a harmless CMake warning: Ignore me.\n" - "void ${target_name}_dummy_function(void) {}\n") - - # Will replace ${dummy_source_file} only if the file content has changed. - # This prevents forced Draco rebuilds after CMake runs. - configure_file("${dummy_source_file}.new" "${dummy_source_file}") - file(REMOVE "${dummy_source_file}.new") - - set(${out_file_path} ${dummy_source_file} PARENT_SCOPE) -endfunction() - -# Convenience function for adding a dummy source file to $target_name using -# $extension as the file extension. Wraps create_dummy_source_file(). -function(add_dummy_source_file_to_target target_name extension) - create_dummy_source_file("${target_name}" "${extension}" "dummy_source_file") - target_sources(${target_name} PRIVATE ${dummy_source_file}) -endfunction() - -# Extracts the version number from $version_file and returns it to the user via -# $version_string_out_var. This is achieved by finding the first instance of the -# kDracoVersion variable and then removing everything but the string literal -# assigned to the variable. Quotes and semicolon are stripped from the returned -# string. -function(extract_version_string version_file version_string_out_var) - file(STRINGS "${version_file}" draco_version REGEX "kDracoVersion") - list(GET draco_version 0 draco_version) - string(REPLACE "static const char kDracoVersion[] = " "" draco_version - "${draco_version}") - string(REPLACE ";" "" draco_version "${draco_version}") - string(REPLACE "\"" "" draco_version "${draco_version}") - set("${version_string_out_var}" "${draco_version}" PARENT_SCOPE) -endfunction() - -# Sets CMake compiler launcher to $launcher_name when $launcher_name is found in -# $PATH. Warns user about ignoring build flag $launcher_flag when $launcher_name -# is not found in $PATH. -function(set_compiler_launcher launcher_flag launcher_name) - find_program(launcher_path "${launcher_name}") - if(launcher_path) - set(CMAKE_C_COMPILER_LAUNCHER "${launcher_path}" PARENT_SCOPE) - set(CMAKE_CXX_COMPILER_LAUNCHER "${launcher_path}" PARENT_SCOPE) - message("--- Using ${launcher_name} as compiler launcher.") - else() - message( - WARNING "--- Cannot find ${launcher_name}, ${launcher_flag} ignored.") - endif() -endfunction() - -# Terminates CMake execution when $var_name is unset in the environment. Sets -# CMake variable to the value of the environment variable when the variable is -# present in the environment. -macro(require_variable var_name) - if("$ENV{${var_name}}" STREQUAL "") - message(FATAL_ERROR "${var_name} must be set in environment.") - endif() - set_variable_if_unset(${var_name} "") -endmacro() - -# Sets $var_name to $default_value if not already set. -macro(set_variable_if_unset var_name default_value) - if(NOT "$ENV{${var_name}}" STREQUAL "") - set(${var_name} $ENV{${var_name}}) - elseif(NOT ${var_name}) - set(${var_name} ${default_value}) - endif() -endmacro() diff --git a/contrib/draco/src/draco/animation/animation.cc b/contrib/draco/src/draco/animation/animation.cc new file mode 100644 index 000000000..471cf2942 --- /dev/null +++ b/contrib/draco/src/draco/animation/animation.cc @@ -0,0 +1,47 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/animation/animation.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +void Animation::Copy(const Animation &src) { + name_ = src.name_; + channels_.clear(); + for (int i = 0; i < src.NumChannels(); ++i) { + std::unique_ptr new_channel(new AnimationChannel()); + new_channel->Copy(*src.GetChannel(i)); + channels_.push_back(std::move(new_channel)); + } + + samplers_.clear(); + for (int i = 0; i < src.NumSamplers(); ++i) { + std::unique_ptr new_sampler(new AnimationSampler()); + new_sampler->Copy(*src.GetSampler(i)); + samplers_.push_back(std::move(new_sampler)); + } + + node_animation_data_.clear(); + for (int i = 0; i < src.NumNodeAnimationData(); ++i) { + std::unique_ptr new_data(new NodeAnimationData()); + new_data->Copy(*src.GetNodeAnimationData(i)); + node_animation_data_.push_back(std::move(new_data)); + } +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/animation/animation.h b/contrib/draco/src/draco/animation/animation.h new file mode 100644 index 000000000..3713f9886 --- /dev/null +++ b/contrib/draco/src/draco/animation/animation.h @@ -0,0 +1,149 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_ANIMATION_ANIMATION_H_ +#define DRACO_ANIMATION_ANIMATION_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/animation/node_animation_data.h" +#include "draco/core/status.h" + +namespace draco { + +// Struct to hold information about an animation's sampler. +struct AnimationSampler { + enum class SamplerInterpolation { LINEAR, STEP, CUBICSPLINE }; + + static std::string InterpolationToString(SamplerInterpolation value) { + switch (value) { + case SamplerInterpolation::STEP: + return "STEP"; + case SamplerInterpolation::CUBICSPLINE: + return "CUBICSPLINE"; + default: + return "LINEAR"; + } + } + + AnimationSampler() + : input_index(-1), + interpolation_type(SamplerInterpolation::LINEAR), + output_index(-1) {} + + void Copy(const AnimationSampler &src) { + input_index = src.input_index; + interpolation_type = src.interpolation_type; + output_index = src.output_index; + } + + int input_index; + SamplerInterpolation interpolation_type; + int output_index; +}; + +// Struct to hold information about an animation's channel. +struct AnimationChannel { + enum class ChannelTransformation { TRANSLATION, ROTATION, SCALE, WEIGHTS }; + + static std::string TransformationToString(ChannelTransformation value) { + switch (value) { + case ChannelTransformation::ROTATION: + return "rotation"; + case ChannelTransformation::SCALE: + return "scale"; + case ChannelTransformation::WEIGHTS: + return "weights"; + default: + return "translation"; + } + } + + AnimationChannel() + : target_index(-1), + transformation_type(ChannelTransformation::TRANSLATION), + sampler_index(-1) {} + + void Copy(const AnimationChannel &src) { + target_index = src.target_index; + transformation_type = src.transformation_type; + sampler_index = src.sampler_index; + } + + int target_index; + ChannelTransformation transformation_type; + int sampler_index; +}; + +// This class is used to hold data and information of glTF animations. +class Animation { + public: + Animation() {} + + void Copy(const Animation &src); + + const std::string &GetName() const { return name_; } + void SetName(const std::string &name) { name_ = name; } + + // Returns the number of channels in an animation. + int NumChannels() const { return channels_.size(); } + // Returns the number of samplers in an animation. + int NumSamplers() const { return samplers_.size(); } + // Returns the number of accessors in an animation. + int NumNodeAnimationData() const { return node_animation_data_.size(); } + + // Returns a channel in the animation. + AnimationChannel *GetChannel(int index) { return channels_[index].get(); } + const AnimationChannel *GetChannel(int index) const { + return channels_[index].get(); + } + // Returns a sampler in the animation. + AnimationSampler *GetSampler(int index) { return samplers_[index].get(); } + const AnimationSampler *GetSampler(int index) const { + return samplers_[index].get(); + } + // Returns an accessor in the animation. + NodeAnimationData *GetNodeAnimationData(int index) { + return node_animation_data_[index].get(); + } + const NodeAnimationData *GetNodeAnimationData(int index) const { + return node_animation_data_[index].get(); + } + + void AddNodeAnimationData( + std::unique_ptr node_animation_data) { + node_animation_data_.push_back(std::move(node_animation_data)); + } + void AddSampler(std::unique_ptr sampler) { + samplers_.push_back(std::move(sampler)); + } + void AddChannel(std::unique_ptr channel) { + channels_.push_back(std::move(channel)); + } + + private: + std::string name_; + std::vector> samplers_; + std::vector> channels_; + std::vector> node_animation_data_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_ANIMATION_ANIMATION_H_ diff --git a/contrib/draco/src/draco/animation/animation_test.cc b/contrib/draco/src/draco/animation/animation_test.cc new file mode 100644 index 000000000..473938bca --- /dev/null +++ b/contrib/draco/src/draco/animation/animation_test.cc @@ -0,0 +1,71 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/animation/animation.h" + +#include "draco/core/draco_test_base.h" +#include "draco/draco_features.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED +TEST(AnimationTest, TestCopy) { + // Test copying of animation data. + draco::Animation src_anim; + ASSERT_TRUE(src_anim.GetName().empty()); + src_anim.SetName("Walking"); + ASSERT_EQ(src_anim.GetName(), "Walking"); + + std::unique_ptr src_sampler_0( + new draco::AnimationSampler()); + src_sampler_0->interpolation_type = + draco::AnimationSampler::SamplerInterpolation::CUBICSPLINE; + std::unique_ptr src_sampler_1( + new draco::AnimationSampler()); + src_sampler_1->Copy(*src_sampler_0); + + ASSERT_EQ(src_sampler_0->interpolation_type, + src_sampler_1->interpolation_type); + + src_sampler_1->interpolation_type = + draco::AnimationSampler::SamplerInterpolation::STEP; + + src_anim.AddSampler(std::move(src_sampler_0)); + src_anim.AddSampler(std::move(src_sampler_1)); + ASSERT_EQ(src_anim.NumSamplers(), 2); + + std::unique_ptr src_channel( + new draco::AnimationChannel()); + src_channel->transformation_type = + draco::AnimationChannel::ChannelTransformation::WEIGHTS; + src_anim.AddChannel(std::move(src_channel)); + ASSERT_EQ(src_anim.NumChannels(), 1); + + draco::Animation dst_anim; + dst_anim.Copy(src_anim); + + ASSERT_EQ(dst_anim.GetName(), src_anim.GetName()); + ASSERT_EQ(dst_anim.NumSamplers(), 2); + ASSERT_EQ(dst_anim.NumChannels(), 1); + + ASSERT_EQ(dst_anim.GetSampler(0)->interpolation_type, + src_anim.GetSampler(0)->interpolation_type); + ASSERT_EQ(dst_anim.GetSampler(1)->interpolation_type, + src_anim.GetSampler(1)->interpolation_type); + ASSERT_EQ(dst_anim.GetChannel(0)->transformation_type, + src_anim.GetChannel(0)->transformation_type); +} +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/animation/keyframe_animation_encoding_test.cc b/contrib/draco/src/draco/animation/keyframe_animation_encoding_test.cc index 4a6491f9d..fcd0eaa6f 100644 --- a/contrib/draco/src/draco/animation/keyframe_animation_encoding_test.cc +++ b/contrib/draco/src/draco/animation/keyframe_animation_encoding_test.cc @@ -26,8 +26,9 @@ class KeyframeAnimationEncodingTest : public ::testing::Test { bool CreateAndAddTimestamps(int32_t num_frames) { timestamps_.resize(num_frames); - for (int i = 0; i < timestamps_.size(); ++i) + for (int i = 0; i < timestamps_.size(); ++i) { timestamps_[i] = static_cast(i); + } return keyframe_animation_.SetTimestamps(timestamps_); } @@ -35,8 +36,9 @@ class KeyframeAnimationEncodingTest : public ::testing::Test { uint32_t num_components) { // Create and add animation data with. animation_data_.resize(num_frames * num_components); - for (int i = 0; i < animation_data_.size(); ++i) + for (int i = 0; i < animation_data_.size(); ++i) { animation_data_[i] = static_cast(i); + } return keyframe_animation_.AddKeyframes(draco::DT_FLOAT32, num_components, animation_data_); } @@ -49,7 +51,7 @@ class KeyframeAnimationEncodingTest : public ::testing::Test { ASSERT_EQ(animation0.num_animations(), animation1.num_animations()); if (quantized) { - // TODO(hemmer) : Add test for stable quantization. + // TODO(b/199760123) : Add test for stable quantization. // Quantization will result in slightly different values. // Skip comparing values. return; @@ -109,9 +111,8 @@ class KeyframeAnimationEncodingTest : public ::testing::Test { } } - ASSERT_TRUE( - encoder.EncodeKeyframeAnimation(keyframe_animation_, options, &buffer) - .ok()); + DRACO_ASSERT_OK( + encoder.EncodeKeyframeAnimation(keyframe_animation_, options, &buffer)); draco::DecoderBuffer dec_decoder; draco::KeyframeAnimationDecoder decoder; @@ -122,8 +123,8 @@ class KeyframeAnimationEncodingTest : public ::testing::Test { std::unique_ptr decoded_animation( new KeyframeAnimation()); DecoderOptions dec_options; - ASSERT_TRUE( - decoder.Decode(dec_options, &dec_buffer, decoded_animation.get()).ok()); + DRACO_ASSERT_OK( + decoder.Decode(dec_options, &dec_buffer, decoded_animation.get())); // Verify if animation before and after compression is identical. CompareAnimationData(keyframe_animation_, diff --git a/contrib/draco/src/draco/animation/keyframe_animation_test.cc b/contrib/draco/src/draco/animation/keyframe_animation_test.cc index bc92b25ff..94566972b 100644 --- a/contrib/draco/src/draco/animation/keyframe_animation_test.cc +++ b/contrib/draco/src/draco/animation/keyframe_animation_test.cc @@ -24,8 +24,9 @@ class KeyframeAnimationTest : public ::testing::Test { bool CreateAndAddTimestamps(int32_t num_frames) { timestamps_.resize(num_frames); - for (int i = 0; i < timestamps_.size(); ++i) + for (int i = 0; i < timestamps_.size(); ++i) { timestamps_[i] = static_cast(i); + } return keyframe_animation_.SetTimestamps(timestamps_); } @@ -33,8 +34,9 @@ class KeyframeAnimationTest : public ::testing::Test { uint32_t num_components) { // Create and add animation data with. animation_data_.resize(num_frames * num_components); - for (int i = 0; i < animation_data_.size(); ++i) + for (int i = 0; i < animation_data_.size(); ++i) { animation_data_[i] = static_cast(i); + } return keyframe_animation_.AddKeyframes(draco::DT_FLOAT32, num_components, animation_data_); } diff --git a/contrib/draco/src/draco/animation/node_animation_data.h b/contrib/draco/src/draco/animation/node_animation_data.h new file mode 100644 index 000000000..7799e3376 --- /dev/null +++ b/contrib/draco/src/draco/animation/node_animation_data.h @@ -0,0 +1,150 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_ANIMATION_NODE_ANIMATION_DATA_H_ +#define DRACO_ANIMATION_NODE_ANIMATION_DATA_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include "draco/core/hash_utils.h" +#include "draco/core/status.h" +#include "draco/core/status_or.h" + +namespace draco { + +// This class is used to store information and data for animations that only +// affect the nodes. +// TODO(fgalligan): Think about changing the name of this class now that Skin +// is using it. +class NodeAnimationData { + public: + enum class Type { SCALAR, VEC3, VEC4, MAT4 }; + + NodeAnimationData() : type_(Type::SCALAR), count_(0), normalized_(false) {} + + void Copy(const NodeAnimationData &src) { + type_ = src.type_; + count_ = src.count_; + normalized_ = src.normalized_; + data_ = src.data_; + } + + Type type() const { return type_; } + int count() const { return count_; } + bool normalized() const { return normalized_; } + + std::vector *GetMutableData() { return &data_; } + const std::vector *GetData() const { return &data_; } + + void SetType(Type type) { type_ = type; } + void SetCount(int count) { count_ = count; } + void SetNormalized(bool normalized) { normalized_ = normalized; } + + int ComponentSize() const { return sizeof(float); } + int NumComponents() const { + switch (type_) { + case Type::SCALAR: + return 1; + case Type::VEC3: + return 3; + case Type::MAT4: + return 16; + default: + return 4; + } + } + + std::string TypeAsString() const { + switch (type_) { + case Type::SCALAR: + return "SCALAR"; + case Type::VEC3: + return "VEC3"; + case Type::MAT4: + return "MAT4"; + default: + return "VEC4"; + } + } + + bool operator==(const NodeAnimationData &nad) const { + return type_ == nad.type_ && count_ == nad.count_ && + normalized_ == nad.normalized_ && data_ == nad.data_; + } + + private: + Type type_; + int count_; + bool normalized_; + std::vector data_; +}; + +// Wrapper class for hashing NodeAnimationData. When using different containers, +// this class is preferable instead of copying the data in NodeAnimationData +// every time. +class NodeAnimationDataHash { + public: + NodeAnimationDataHash() = delete; + NodeAnimationDataHash &operator=(const NodeAnimationDataHash &) = delete; + NodeAnimationDataHash(NodeAnimationDataHash &&) = delete; + NodeAnimationDataHash &operator=(NodeAnimationDataHash &&) = delete; + + explicit NodeAnimationDataHash(const NodeAnimationData *nad) + : node_animation_data_(nad) { + hash_ = NodeAnimationDataHash::HashNodeAnimationData(*node_animation_data_); + } + + NodeAnimationDataHash(const NodeAnimationDataHash &nadh) { + node_animation_data_ = nadh.node_animation_data_; + hash_ = nadh.hash_; + } + + bool operator==(const NodeAnimationDataHash &nadh) const { + return *node_animation_data_ == *nadh.node_animation_data_; + } + + struct Hash { + size_t operator()(const NodeAnimationDataHash &nadh) const { + return nadh.hash_; + } + }; + + const NodeAnimationData *GetNodeAnimationData() { + return node_animation_data_; + } + + private: + // Returns a hash of |nad|. + static size_t HashNodeAnimationData(const NodeAnimationData &nad) { + size_t hash = 79; // Magic number. + hash = HashCombine(static_cast(nad.type()), hash); + hash = HashCombine(nad.count(), hash); + hash = HashCombine(nad.normalized(), hash); + const uint64_t data_hash = + FingerprintString(reinterpret_cast(nad.GetData()->data()), + nad.GetData()->size() * sizeof(float)); + hash = HashCombine(data_hash, hash); + return hash; + } + + const NodeAnimationData *node_animation_data_; + size_t hash_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_ANIMATION_NODE_ANIMATION_DATA_H_ diff --git a/contrib/draco/src/draco/animation/skin.cc b/contrib/draco/src/draco/animation/skin.cc new file mode 100644 index 000000000..f232978c2 --- /dev/null +++ b/contrib/draco/src/draco/animation/skin.cc @@ -0,0 +1,29 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/animation/skin.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +void Skin::Copy(const Skin &s) { + inverse_bind_matrices_.Copy(s.GetInverseBindMatrices()); + joints_ = s.GetJoints(); + joint_root_index_ = s.GetJointRoot(); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/animation/skin.h b/contrib/draco/src/draco/animation/skin.h new file mode 100644 index 000000000..81ca997eb --- /dev/null +++ b/contrib/draco/src/draco/animation/skin.h @@ -0,0 +1,64 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_ANIMATION_SKIN_H_ +#define DRACO_ANIMATION_SKIN_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include + +#include "draco/animation/node_animation_data.h" +#include "draco/scene/scene_indices.h" + +namespace draco { + +// This class is used to store information on animation skins. +class Skin { + public: + Skin() : joint_root_index_(-1) {} + + void Copy(const Skin &s); + + NodeAnimationData &GetInverseBindMatrices() { return inverse_bind_matrices_; } + const NodeAnimationData &GetInverseBindMatrices() const { + return inverse_bind_matrices_; + } + + int AddJoint(SceneNodeIndex index) { + joints_.push_back(index); + return joints_.size() - 1; + } + int NumJoints() const { return joints_.size(); } + SceneNodeIndex GetJoint(int index) const { return joints_[index]; } + SceneNodeIndex &GetJoint(int index) { return joints_[index]; } + const std::vector &GetJoints() const { return joints_; } + + void SetJointRoot(SceneNodeIndex index) { joint_root_index_ = index; } + SceneNodeIndex GetJointRoot() const { return joint_root_index_; } + + private: + NodeAnimationData inverse_bind_matrices_; + + // List of node indices that make up the joint hierarchy. + std::vector joints_; + SceneNodeIndex joint_root_index_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_ANIMATION_SKIN_H_ diff --git a/contrib/draco/src/draco/attributes/attribute_transform.cc b/contrib/draco/src/draco/attributes/attribute_transform.cc index 174e6b822..fb2ed1829 100644 --- a/contrib/draco/src/draco/attributes/attribute_transform.cc +++ b/contrib/draco/src/draco/attributes/attribute_transform.cc @@ -28,12 +28,13 @@ std::unique_ptr AttributeTransform::InitTransformedAttribute( const PointAttribute &src_attribute, int num_entries) { const int num_components = GetTransformedNumComponents(src_attribute); const DataType dt = GetTransformedDataType(src_attribute); - GeometryAttribute va; - va.Init(src_attribute.attribute_type(), nullptr, num_components, dt, false, + GeometryAttribute ga; + ga.Init(src_attribute.attribute_type(), nullptr, num_components, dt, false, num_components * DataTypeLength(dt), 0); - std::unique_ptr transformed_attribute(new PointAttribute(va)); + std::unique_ptr transformed_attribute(new PointAttribute(ga)); transformed_attribute->Reset(num_entries); transformed_attribute->SetIdentityMapping(); + transformed_attribute->set_unique_id(src_attribute.unique_id()); return transformed_attribute; } diff --git a/contrib/draco/src/draco/attributes/geometry_attribute.cc b/contrib/draco/src/draco/attributes/geometry_attribute.cc index b62478426..141130f43 100644 --- a/contrib/draco/src/draco/attributes/geometry_attribute.cc +++ b/contrib/draco/src/draco/attributes/geometry_attribute.cc @@ -26,7 +26,7 @@ GeometryAttribute::GeometryAttribute() unique_id_(0) {} void GeometryAttribute::Init(GeometryAttribute::Type attribute_type, - DataBuffer *buffer, int8_t num_components, + DataBuffer *buffer, uint8_t num_components, DataType data_type, bool normalized, int64_t byte_stride, int64_t byte_offset) { buffer_ = buffer; diff --git a/contrib/draco/src/draco/attributes/geometry_attribute.h b/contrib/draco/src/draco/attributes/geometry_attribute.h index f4d099b1b..28f743fa0 100644 --- a/contrib/draco/src/draco/attributes/geometry_attribute.h +++ b/contrib/draco/src/draco/attributes/geometry_attribute.h @@ -15,12 +15,18 @@ #ifndef DRACO_ATTRIBUTES_GEOMETRY_ATTRIBUTE_H_ #define DRACO_ATTRIBUTES_GEOMETRY_ATTRIBUTE_H_ +#include #include +#include #include #include "draco/attributes/geometry_indices.h" #include "draco/core/data_buffer.h" #include "draco/core/hash_utils.h" +#include "draco/draco_features.h" +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/status.h" +#endif namespace draco { @@ -51,6 +57,16 @@ class GeometryAttribute { // predefined use case. Such attributes are often used for a shader specific // data. GENERIC, +#ifdef DRACO_TRANSCODER_SUPPORTED + // TODO(ostava): Adding a new attribute would be bit-stream change for GLTF. + // Older decoders wouldn't know what to do with this attribute type. This + // should be open-sourced only when we are ready to increase our bit-stream + // version. + TANGENT, + MATERIAL, + JOINTS, + WEIGHTS, +#endif // Total number of different attribute types. // Always keep behind all named attributes. NAMED_ATTRIBUTES_COUNT, @@ -58,7 +74,7 @@ class GeometryAttribute { GeometryAttribute(); // Initializes and enables the attribute. - void Init(Type attribute_type, DataBuffer *buffer, int8_t num_components, + void Init(Type attribute_type, DataBuffer *buffer, uint8_t num_components, DataType data_type, bool normalized, int64_t byte_stride, int64_t byte_offset); bool IsValid() const { return buffer_ != nullptr; } @@ -129,6 +145,17 @@ class GeometryAttribute { buffer_->Write(byte_pos, value, byte_stride()); } +#ifdef DRACO_TRANSCODER_SUPPORTED + // Sets a value of an attribute entry. The input |value| must have + // |input_num_components| entries and it will be automatically converted to + // the internal format used by the geometry attribute. If the conversion is + // not possible, an error status will be returned. + template + Status ConvertAndSetAttributeValue(AttributeValueIndex avi, + int input_num_components, + const InputT *value); +#endif + // DEPRECATED: Use // ConvertValue(AttributeValueIndex att_id, // int out_num_components, @@ -233,10 +260,11 @@ class GeometryAttribute { // Returns the number of components that are stored for each entry. // For position attribute this is usually three (x,y,z), // while texture coordinates have two components (u,v). - int8_t num_components() const { return num_components_; } + uint8_t num_components() const { return num_components_; } // Indicates whether the data type should be normalized before interpretation, // that is, it should be divided by the max value of the data type. bool normalized() const { return normalized_; } + void set_normalized(bool normalized) { normalized_ = normalized; } // The buffer storing the entire data of the attribute. const DataBuffer *buffer() const { return buffer_; } // Returns the number of bytes between two attribute entries, this is, at @@ -260,7 +288,7 @@ class GeometryAttribute { // T is the stored attribute data type. // OutT is the desired data type of the attribute. template - bool ConvertTypedValue(AttributeValueIndex att_id, int8_t out_num_components, + bool ConvertTypedValue(AttributeValueIndex att_id, uint8_t out_num_components, OutT *out_value) const { const uint8_t *src_address = GetAddress(att_id); @@ -270,29 +298,10 @@ class GeometryAttribute { return false; } const T in_value = *reinterpret_cast(src_address); - - // Make sure the in_value fits within the range of values that OutT - // is able to represent. Perform the check only for integral types. - if (std::is_integral::value && std::is_integral::value) { - static constexpr OutT kOutMin = - std::is_signed::value ? std::numeric_limits::lowest() : 0; - if (in_value < kOutMin || in_value > std::numeric_limits::max()) { - return false; - } + if (!ConvertComponentValue(in_value, normalized_, + out_value + i)) { + return false; } - - out_value[i] = static_cast(in_value); - // When converting integer to floating point, normalize the value if - // necessary. - if (std::is_integral::value && std::is_floating_point::value && - normalized_) { - out_value[i] /= static_cast(std::numeric_limits::max()); - } - // TODO(ostava): Add handling of normalized attributes when converting - // between different integer representations. If the attribute is - // normalized, integer values should be converted as if they represent 0-1 - // range. E.g. when we convert uint16 to uint8, the range <0, 2^16 - 1> - // should be converted to range <0, 2^8 - 1>. src_address += sizeof(T); } // Fill empty data for unused output components if needed. @@ -302,12 +311,128 @@ class GeometryAttribute { return true; } +#ifdef DRACO_TRANSCODER_SUPPORTED + // Function that converts input |value| from type T to the internal attribute + // representation defined by OutT and |num_components_|. + template + Status ConvertAndSetAttributeTypedValue(AttributeValueIndex avi, + int8_t input_num_components, + const T *value) { + uint8_t *address = GetAddress(avi); + + // Convert all components available in both the original and output formats. + for (int i = 0; i < num_components_; ++i) { + if (!IsAddressValid(address)) { + return ErrorStatus("GeometryAttribute: Invalid address."); + } + OutT *const out_value = reinterpret_cast(address); + if (i < input_num_components) { + if (!ConvertComponentValue(*(value + i), normalized_, + out_value)) { + return ErrorStatus( + "GeometryAttribute: Failed to convert component value."); + } + } else { + *out_value = static_cast(0); + } + address += sizeof(OutT); + } + return OkStatus(); + } +#endif // DRACO_TRANSCODER_SUPPORTED + + // Converts |in_value| of type T into |out_value| of type OutT. If + // |normalized| is true, any conversion between floating point and integer + // values will be treating integers as normalized types (the entire integer + // range will be used to represent 0-1 floating point range). + template + static bool ConvertComponentValue(const T &in_value, bool normalized, + OutT *out_value) { + // Make sure the |in_value| can be represented as an integral type OutT. + if (std::is_integral::value) { + // Make sure the |in_value| fits within the range of values that OutT + // is able to represent. Perform the check only for integral types. + if (!std::is_same::value && std::is_integral::value) { + static constexpr OutT kOutMin = + std::is_signed::value ? std::numeric_limits::min() : 0; + if (in_value < kOutMin || in_value > std::numeric_limits::max()) { + return false; + } + } + + // Check conversion of floating point |in_value| to integral value OutT. + if (std::is_floating_point::value) { + // Make sure the floating point |in_value| is not NaN and not Inf as + // integral type OutT is unable to represent these values. + if (sizeof(in_value) > sizeof(double)) { + if (std::isnan(static_cast(in_value)) || + std::isinf(static_cast(in_value))) { + return false; + } + } else if (sizeof(in_value) > sizeof(float)) { + if (std::isnan(static_cast(in_value)) || + std::isinf(static_cast(in_value))) { + return false; + } + } else { + if (std::isnan(static_cast(in_value)) || + std::isinf(static_cast(in_value))) { + return false; + } + } + + // Make sure the floating point |in_value| fits within the range of + // values that integral type OutT is able to represent. + if (in_value < std::numeric_limits::min() || + in_value >= std::numeric_limits::max()) { + return false; + } + } + } + + if (std::is_integral::value && std::is_floating_point::value && + normalized) { + // When converting integer to floating point, normalize the value if + // necessary. + *out_value = static_cast(in_value); + *out_value /= static_cast(std::numeric_limits::max()); + } else if (std::is_floating_point::value && + std::is_integral::value && normalized) { + // Converting from floating point to a normalized integer. + if (in_value > 1 || in_value < 0) { + // Normalized float values need to be between 0 and 1. + return false; + } + // TODO(ostava): Consider allowing float to normalized integer conversion + // for 64-bit integer types. Currently it doesn't work because we don't + // have a floating point type that could store all 64 bit integers. + if (sizeof(OutT) > 4) { + return false; + } + // Expand the float to the range of the output integer and round it to the + // nearest representable value. Use doubles for the math to ensure the + // integer values are represented properly during the conversion process. + *out_value = static_cast(std::floor( + in_value * static_cast(std::numeric_limits::max()) + + 0.5)); + } else { + *out_value = static_cast(in_value); + } + + // TODO(ostava): Add handling of normalized attributes when converting + // between different integer representations. If the attribute is + // normalized, integer values should be converted as if they represent 0-1 + // range. E.g. when we convert uint16 to uint8, the range <0, 2^16 - 1> + // should be converted to range <0, 2^8 - 1>. + return true; + } + DataBuffer *buffer_; // The buffer descriptor is stored at the time the buffer is attached to this // attribute. The purpose is to detect if any changes happened to the buffer // since the time it was attached. DataBufferDescriptor buffer_descriptor_; - int8_t num_components_; + uint8_t num_components_; DataType data_type_; bool normalized_; int64_t byte_stride_; @@ -323,6 +448,54 @@ class GeometryAttribute { friend struct GeometryAttributeHasher; }; +#ifdef DRACO_TRANSCODER_SUPPORTED +template +Status GeometryAttribute::ConvertAndSetAttributeValue(AttributeValueIndex avi, + int input_num_components, + const InputT *value) { + switch (this->data_type()) { + case DT_INT8: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_UINT8: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_INT16: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_UINT16: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_INT32: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_UINT32: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_INT64: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_UINT64: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_FLOAT32: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_FLOAT64: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + case DT_BOOL: + return ConvertAndSetAttributeTypedValue( + avi, input_num_components, value); + default: + break; + } + return ErrorStatus( + "GeometryAttribute::SetAndConvertAttributeValue: Unsupported " + "attribute type."); +} +#endif + // Hashing support // Function object for using Attribute as a hash key. diff --git a/contrib/draco/src/draco/attributes/point_attribute.cc b/contrib/draco/src/draco/attributes/point_attribute.cc index b28f860c1..e54ab5427 100644 --- a/contrib/draco/src/draco/attributes/point_attribute.cc +++ b/contrib/draco/src/draco/attributes/point_attribute.cc @@ -222,4 +222,47 @@ AttributeValueIndex::ValueType PointAttribute::DeduplicateFormattedValues( } #endif +#ifdef DRACO_TRANSCODER_SUPPORTED +void PointAttribute::RemoveUnusedValues() { + if (is_mapping_identity()) { + return; // For identity mapping, all values are always used. + } + // For explicit mapping we need to check if any point is mapped to a value. + // If not we can delete the value. + IndexTypeVector is_value_used(size(), false); + int num_used_values = 0; + for (PointIndex pi(0); pi < indices_map_.size(); ++pi) { + const AttributeValueIndex avi = indices_map_[pi]; + if (!is_value_used[avi]) { + is_value_used[avi] = true; + num_used_values++; + } + } + if (num_used_values == size()) { + return; // All values are used. + } + + // Remap the values and update the point to value mapping. + IndexTypeVector + old_to_new_value_map(size(), kInvalidAttributeValueIndex); + AttributeValueIndex new_avi(0); + for (AttributeValueIndex avi(0); avi < size(); ++avi) { + if (!is_value_used[avi]) { + continue; + } + if (avi != new_avi) { + SetAttributeValue(new_avi, GetAddress(avi)); + } + old_to_new_value_map[avi] = new_avi++; + } + + // Remap all points to the new attribute values. + for (PointIndex pi(0); pi < indices_map_.size(); ++pi) { + indices_map_[pi] = old_to_new_value_map[indices_map_[pi]]; + } + + num_unique_entries_ = num_used_values; +} +#endif + } // namespace draco diff --git a/contrib/draco/src/draco/attributes/point_attribute.h b/contrib/draco/src/draco/attributes/point_attribute.h index ee3662031..d55c50c8a 100644 --- a/contrib/draco/src/draco/attributes/point_attribute.h +++ b/contrib/draco/src/draco/attributes/point_attribute.h @@ -133,6 +133,12 @@ class PointAttribute : public GeometryAttribute { return attribute_transform_data_.get(); } +#ifdef DRACO_TRANSCODER_SUPPORTED + // Removes unused values from the attribute. Value is unused when no point + // is mapped to the value. Only applicable when the mapping is not identity. + void RemoveUnusedValues(); +#endif + private: #ifdef DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED template diff --git a/contrib/draco/src/draco/compression/attributes/attributes_encoder.cc b/contrib/draco/src/draco/compression/attributes/attributes_encoder.cc index 797c62f30..480e3ff34 100644 --- a/contrib/draco/src/draco/compression/attributes/attributes_encoder.cc +++ b/contrib/draco/src/draco/compression/attributes/attributes_encoder.cc @@ -15,14 +15,16 @@ #include "draco/compression/attributes/attributes_encoder.h" #include "draco/core/varint_encoding.h" +#include "draco/draco_features.h" namespace draco { AttributesEncoder::AttributesEncoder() : point_cloud_encoder_(nullptr), point_cloud_(nullptr) {} -AttributesEncoder::AttributesEncoder(int att_id) : AttributesEncoder() { - AddAttributeId(att_id); +AttributesEncoder::AttributesEncoder(int point_attrib_id) + : AttributesEncoder() { + AddAttributeId(point_attrib_id); } bool AttributesEncoder::Init(PointCloudEncoder *encoder, const PointCloud *pc) { @@ -37,7 +39,15 @@ bool AttributesEncoder::EncodeAttributesEncoderData(EncoderBuffer *out_buffer) { for (uint32_t i = 0; i < num_attributes(); ++i) { const int32_t att_id = point_attribute_ids_[i]; const PointAttribute *const pa = point_cloud_->attribute(att_id); - out_buffer->Encode(static_cast(pa->attribute_type())); + GeometryAttribute::Type type = pa->attribute_type(); +#ifdef DRACO_TRANSCODER_SUPPORTED + // Attribute types TANGENT, MATERIAL, JOINTS, and WEIGHTS are not supported + // in the official bitstream. They will be encoded as GENERIC. + if (type > GeometryAttribute::GENERIC) { + type = GeometryAttribute::GENERIC; + } +#endif + out_buffer->Encode(static_cast(type)); out_buffer->Encode(static_cast(pa->data_type())); out_buffer->Encode(static_cast(pa->num_components())); out_buffer->Encode(static_cast(pa->normalized())); diff --git a/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.cc b/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.cc index e4d53485d..51c41cf7a 100644 --- a/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.cc +++ b/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.cc @@ -72,16 +72,19 @@ class PointAttributeVectorOutputIterator { Self &operator*() { return *this; } // Still needed in some cases. - // TODO(hemmer): remove. + // TODO(b/199760123): Remove. // hardcoded to 3 based on legacy usage. const Self &operator=(const VectorD &val) { DRACO_DCHECK_EQ(attributes_.size(), 1); // Expect only ONE attribute. AttributeTuple &att = attributes_[0]; PointAttribute *attribute = std::get<0>(att); + const AttributeValueIndex avi = attribute->mapped_index(point_id_); + if (avi >= static_cast(attribute->size())) { + return *this; + } const uint32_t &offset = std::get<1>(att); DRACO_DCHECK_EQ(offset, 0); // expected to be zero - attribute->SetAttributeValue(attribute->mapped_index(point_id_), - &val[0] + offset); + attribute->SetAttributeValue(avi, &val[0] + offset); return *this; } // Additional operator taking std::vector as argument. @@ -89,6 +92,10 @@ class PointAttributeVectorOutputIterator { for (auto index = 0; index < attributes_.size(); index++) { AttributeTuple &att = attributes_[index]; PointAttribute *attribute = std::get<0>(att); + const AttributeValueIndex avi = attribute->mapped_index(point_id_); + if (avi >= static_cast(attribute->size())) { + return *this; + } const uint32_t &offset = std::get<1>(att); const uint32_t &data_size = std::get<3>(att); const uint32_t &num_components = std::get<4>(att); @@ -103,10 +110,6 @@ class PointAttributeVectorOutputIterator { // redirect to copied data data_source = reinterpret_cast(data_); } - const AttributeValueIndex avi = attribute->mapped_index(point_id_); - if (avi >= static_cast(attribute->size())) { - return *this; - } attribute->SetAttributeValue(avi, data_source); } return *this; @@ -195,54 +198,55 @@ bool KdTreeAttributesDecoder::DecodePortableAttributes( data_size, num_components); total_dimensionality += num_components; } - PointAttributeVectorOutputIterator out_it(atts); + typedef PointAttributeVectorOutputIterator OutIt; + OutIt out_it(atts); switch (compression_level) { case 0: { - DynamicIntegerPointsKdTreeDecoder<0> decoder(total_dimensionality); - if (!decoder.DecodePoints(in_buffer, out_it)) { + if (!DecodePoints<0, OutIt>(total_dimensionality, num_points, in_buffer, + &out_it)) { return false; } break; } case 1: { - DynamicIntegerPointsKdTreeDecoder<1> decoder(total_dimensionality); - if (!decoder.DecodePoints(in_buffer, out_it)) { + if (!DecodePoints<1, OutIt>(total_dimensionality, num_points, in_buffer, + &out_it)) { return false; } break; } case 2: { - DynamicIntegerPointsKdTreeDecoder<2> decoder(total_dimensionality); - if (!decoder.DecodePoints(in_buffer, out_it)) { + if (!DecodePoints<2, OutIt>(total_dimensionality, num_points, in_buffer, + &out_it)) { return false; } break; } case 3: { - DynamicIntegerPointsKdTreeDecoder<3> decoder(total_dimensionality); - if (!decoder.DecodePoints(in_buffer, out_it)) { + if (!DecodePoints<3, OutIt>(total_dimensionality, num_points, in_buffer, + &out_it)) { return false; } break; } case 4: { - DynamicIntegerPointsKdTreeDecoder<4> decoder(total_dimensionality); - if (!decoder.DecodePoints(in_buffer, out_it)) { + if (!DecodePoints<4, OutIt>(total_dimensionality, num_points, in_buffer, + &out_it)) { return false; } break; } case 5: { - DynamicIntegerPointsKdTreeDecoder<5> decoder(total_dimensionality); - if (!decoder.DecodePoints(in_buffer, out_it)) { + if (!DecodePoints<5, OutIt>(total_dimensionality, num_points, in_buffer, + &out_it)) { return false; } break; } case 6: { - DynamicIntegerPointsKdTreeDecoder<6> decoder(total_dimensionality); - if (!decoder.DecodePoints(in_buffer, out_it)) { + if (!DecodePoints<6, OutIt>(total_dimensionality, num_points, in_buffer, + &out_it)) { return false; } break; @@ -253,6 +257,19 @@ bool KdTreeAttributesDecoder::DecodePortableAttributes( return true; } +template +bool KdTreeAttributesDecoder::DecodePoints(int total_dimensionality, + int num_expected_points, + DecoderBuffer *in_buffer, + OutIteratorT *out_iterator) { + DynamicIntegerPointsKdTreeDecoder decoder(total_dimensionality); + if (!decoder.DecodePoints(in_buffer, *out_iterator, num_expected_points) || + decoder.num_decoded_points() != num_expected_points) { + return false; + } + return true; +} + bool KdTreeAttributesDecoder::DecodeDataNeededByPortableTransforms( DecoderBuffer *in_buffer) { if (in_buffer->bitstream_version() >= DRACO_BITSTREAM_VERSION(2, 3)) { @@ -336,6 +353,10 @@ bool KdTreeAttributesDecoder::DecodeDataNeededByPortableTransforms( return false; } if (method == KdTreeAttributesEncodingMethod::kKdTreeQuantizationEncoding) { + // This method only supports one attribute with exactly three components. + if (atts.size() != 1 || std::get<4>(atts[0]) != 3) { + return false; + } uint8_t compression_level = 0; if (!in_buffer->Decode(&compression_level)) { return false; @@ -376,7 +397,7 @@ bool KdTreeAttributesDecoder::DecodeDataNeededByPortableTransforms( GetDecoder()->point_cloud()->attribute(att_id); attr->Reset(num_points); attr->SetIdentityMapping(); - }; + } PointAttributeVectorOutputIterator out_it(atts); @@ -455,7 +476,11 @@ bool KdTreeAttributesDecoder::TransformAttributeBackToSignedType( att->GetValue(avi, &unsigned_val[0]); for (int c = 0; c < att->num_components(); ++c) { // Up-cast |unsigned_val| to int32_t to ensure we don't overflow it for - // smaller data types. + // smaller data types. But first check that the up-casting does not cause + // signed integer overflow. + if (unsigned_val[c] > std::numeric_limits::max()) { + return false; + } signed_val[c] = static_cast( static_cast(unsigned_val[c]) + min_signed_values_[num_processed_signed_components + c]); diff --git a/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.h b/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.h index 87338d6b0..4af367a1a 100644 --- a/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.h +++ b/contrib/draco/src/draco/compression/attributes/kd_tree_attributes_decoder.h @@ -31,6 +31,10 @@ class KdTreeAttributesDecoder : public AttributesDecoder { bool TransformAttributesToOriginalFormat() override; private: + template + bool DecodePoints(int total_dimensionality, int num_expected_points, + DecoderBuffer *in_buffer, OutIteratorT *out_iterator); + template bool TransformAttributeBackToSignedType(PointAttribute *att, int num_processed_signed_components); diff --git a/contrib/draco/src/draco/compression/attributes/normal_compression_utils.h b/contrib/draco/src/draco/compression/attributes/normal_compression_utils.h index 8a6f25b66..b717d0dbe 100644 --- a/contrib/draco/src/draco/compression/attributes/normal_compression_utils.h +++ b/contrib/draco/src/draco/compression/attributes/normal_compression_utils.h @@ -61,7 +61,7 @@ class OctahedronToolBox { return false; } quantization_bits_ = q; - max_quantized_value_ = (1 << quantization_bits_) - 1; + max_quantized_value_ = (1u << quantization_bits_) - 1; max_value_ = max_quantized_value_ - 1; dequantization_scale_ = 2.f / max_value_; center_value_ = max_value_ / 2; @@ -208,7 +208,9 @@ class OctahedronToolBox { DRACO_DCHECK_LE(t, center_value_); DRACO_DCHECK_GE(s, -center_value_); DRACO_DCHECK_GE(t, -center_value_); - return std::abs(s) + std::abs(t) <= center_value_; + const uint32_t st = + static_cast(std::abs(s)) + static_cast(std::abs(t)); + return st <= center_value_; } void InvertDiamond(int32_t *s, int32_t *t) const { @@ -230,19 +232,29 @@ class OctahedronToolBox { sign_t = (*t > 0) ? 1 : -1; } - const int32_t corner_point_s = sign_s * center_value_; - const int32_t corner_point_t = sign_t * center_value_; - *s = 2 * *s - corner_point_s; - *t = 2 * *t - corner_point_t; + // Perform the addition and subtraction using unsigned integers to avoid + // signed integer overflows for bad data. Note that the result will be + // unchanged for non-overflowing cases. + const uint32_t corner_point_s = sign_s * center_value_; + const uint32_t corner_point_t = sign_t * center_value_; + uint32_t us = *s; + uint32_t ut = *t; + us = us + us - corner_point_s; + ut = ut + ut - corner_point_t; if (sign_s * sign_t >= 0) { - int32_t temp = *s; - *s = -*t; - *t = -temp; + uint32_t temp = us; + us = -ut; + ut = -temp; } else { - std::swap(*s, *t); + std::swap(us, ut); } - *s = (*s + corner_point_s) / 2; - *t = (*t + corner_point_t) / 2; + us = us + corner_point_s; + ut = ut + corner_point_t; + + *s = us; + *t = ut; + *s /= 2; + *t /= 2; } void InvertDirection(int32_t *s, int32_t *t) const { @@ -318,7 +330,7 @@ class OctahedronToolBox { // Remaining coordinate can be computed by projecting the (y, z) values onto // the surface of the octahedron. - const float x = 1.f - abs(y) - abs(z); + const float x = 1.f - std::abs(y) - std::abs(z); // |x| is essentially a signed distance from the diagonal edges of the // diamond shown on the figure above. It is positive for all points in the diff --git a/contrib/draco/src/draco/compression/attributes/point_d_vector.h b/contrib/draco/src/draco/compression/attributes/point_d_vector.h index 3b115d500..6ceb454ae 100644 --- a/contrib/draco/src/draco/compression/attributes/point_d_vector.h +++ b/contrib/draco/src/draco/compression/attributes/point_d_vector.h @@ -16,7 +16,9 @@ #ifndef DRACO_COMPRESSION_ATTRIBUTES_POINT_D_VECTOR_H_ #define DRACO_COMPRESSION_ATTRIBUTES_POINT_D_VECTOR_H_ +#include #include +#include #include #include @@ -99,11 +101,17 @@ class PointDVector { data_(n_items * dimensionality), data0_(data_.data()) {} // random access iterator - class PointDVectorIterator - : public std::iterator { + class PointDVectorIterator { friend class PointDVector; public: + // Iterator traits expected by std libraries. + using iterator_category = std::random_access_iterator_tag; + using value_type = size_t; + using difference_type = size_t; + using pointer = PointDVector *; + using reference = PointDVector &; + // std::iter_swap is called inside of std::partition and needs this // specialized support PseudoPointD operator*() const { diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_decoder.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_decoder.h index 36c124baa..17899d054 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_decoder.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_decoder.h @@ -22,6 +22,7 @@ #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_decoder.h" #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_parallelogram_shared.h" #include "draco/compression/bit_coders/rans_bit_decoder.h" +#include "draco/core/math_utils.h" #include "draco/core/varint_decoding.h" #include "draco/draco_features.h" @@ -161,7 +162,8 @@ bool MeshPredictionSchemeConstrainedMultiParallelogramDecoder< if (!is_crease) { ++num_used_parallelograms; for (int j = 0; j < num_components; ++j) { - multi_pred_vals[j] += pred_vals[i][j]; + multi_pred_vals[j] = + AddAsUnsigned(multi_pred_vals[j], pred_vals[i][j]); } } } @@ -210,6 +212,9 @@ bool MeshPredictionSchemeConstrainedMultiParallelogramDecoder< if (!DecodeVarint(&num_flags, buffer)) { return false; } + if (num_flags > this->mesh_data().corner_table()->num_corners()) { + return false; + } if (num_flags > 0) { is_crease_edge_[i].resize(num_flags); RAnsBitDecoder decoder; diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_encoder.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_encoder.h index 77df8ee24..736598b15 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_encoder.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_constrained_multi_parallelogram_encoder.h @@ -392,7 +392,7 @@ bool MeshPredictionSchemeConstrainedMultiParallelogramEncoder< RAnsBitEncoder encoder; encoder.StartEncoding(); // Encode the crease edge flags in the reverse vertex order that is needed - // be the decoder. Note that for the currently supported mode, each vertex + // by the decoder. Note that for the currently supported mode, each vertex // has exactly |num_used_parallelograms| edges that need to be encoded. for (int j = static_cast(is_crease_edge_[i].size()) - num_used_parallelograms; diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_multi_parallelogram_decoder.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_multi_parallelogram_decoder.h index fc82e0a8f..9825c7261 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_multi_parallelogram_decoder.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_multi_parallelogram_decoder.h @@ -18,6 +18,7 @@ #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_decoder.h" #include "draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_parallelogram_shared.h" +#include "draco/core/math_utils.h" #include "draco/draco_features.h" namespace draco { @@ -89,7 +90,8 @@ bool MeshPredictionSchemeMultiParallelogramDecoder(data[data_offset + 1])); } - void ComputePredictedValue(CornerIndex corner_id, const DataTypeT *data, + bool ComputePredictedValue(CornerIndex corner_id, const DataTypeT *data, int data_id); private: @@ -123,6 +123,10 @@ bool MeshPredictionSchemeTexCoordsDecoder:: ComputeOriginalValues(const CorrType *in_corr, DataTypeT *out_data, int /* size */, int num_components, const PointIndex *entry_to_point_id_map) { + if (num_components != 2) { + // Corrupt/malformed input. Two output components are req'd. + return false; + } num_components_ = num_components; entry_to_point_id_map_ = entry_to_point_id_map; predicted_value_ = @@ -133,7 +137,9 @@ bool MeshPredictionSchemeTexCoordsDecoder:: static_cast(this->mesh_data().data_to_corner_map()->size()); for (int p = 0; p < corner_map_size; ++p) { const CornerIndex corner_id = this->mesh_data().data_to_corner_map()->at(p); - ComputePredictedValue(corner_id, out_data, p); + if (!ComputePredictedValue(corner_id, out_data, p)) { + return false; + } const int dst_offset = p * num_components; this->transform().ComputeOriginalValue( @@ -159,6 +165,11 @@ bool MeshPredictionSchemeTexCoordsDecoder:: if (num_orientations == 0) { return false; } + if (num_orientations > this->mesh_data().corner_table()->num_corners()) { + // We can't have more orientations than the maximum number of decoded + // values. + return false; + } orientations_.resize(num_orientations); bool last_orientation = true; RAnsBitDecoder decoder; @@ -177,7 +188,7 @@ bool MeshPredictionSchemeTexCoordsDecoder:: } template -void MeshPredictionSchemeTexCoordsDecoder:: +bool MeshPredictionSchemeTexCoordsDecoder:: ComputePredictedValue(CornerIndex corner_id, const DataTypeT *data, int data_id) { // Compute the predicted UV coordinate from the positions on all corners @@ -206,9 +217,17 @@ void MeshPredictionSchemeTexCoordsDecoder:: const Vector2f p_uv = GetTexCoordForEntryId(prev_data_id, data); if (p_uv == n_uv) { // We cannot do a reliable prediction on degenerated UV triangles. - predicted_value_[0] = static_cast(p_uv[0]); - predicted_value_[1] = static_cast(p_uv[1]); - return; + // Technically floats > INT_MAX are undefined, but compilers will + // convert those values to INT_MIN. We are being explicit here for asan. + for (const int i : {0, 1}) { + if (std::isnan(p_uv[i]) || static_cast(p_uv[i]) > INT_MAX || + static_cast(p_uv[i]) < INT_MIN) { + predicted_value_[i] = INT_MIN; + } else { + predicted_value_[i] = static_cast(p_uv[i]); + } + } + return true; } // Get positions at all corners. @@ -282,32 +301,40 @@ void MeshPredictionSchemeTexCoordsDecoder:: const float pnvs = pn_uv[1] * s + n_uv[1]; const float pnvt = pn_uv[1] * t; Vector2f predicted_uv; + if (orientations_.empty()) { + return false; + } // When decoding the data, we already know which orientation to use. const bool orientation = orientations_.back(); orientations_.pop_back(); - if (orientation) + if (orientation) { predicted_uv = Vector2f(pnus - pnvt, pnvs + pnut); - else + } else { predicted_uv = Vector2f(pnus + pnvt, pnvs - pnut); - + } if (std::is_integral::value) { // Round the predicted value for integer types. - if (std::isnan(predicted_uv[0])) { + // Technically floats > INT_MAX are undefined, but compilers will + // convert those values to INT_MIN. We are being explicit here for asan. + const double u = floor(predicted_uv[0] + 0.5); + if (std::isnan(u) || u > INT_MAX || u < INT_MIN) { predicted_value_[0] = INT_MIN; } else { - predicted_value_[0] = static_cast(floor(predicted_uv[0] + 0.5)); + predicted_value_[0] = static_cast(u); } - if (std::isnan(predicted_uv[1])) { + const double v = floor(predicted_uv[1] + 0.5); + if (std::isnan(v) || v > INT_MAX || v < INT_MIN) { predicted_value_[1] = INT_MIN; } else { - predicted_value_[1] = static_cast(floor(predicted_uv[1] + 0.5)); + predicted_value_[1] = static_cast(v); } } else { predicted_value_[0] = static_cast(predicted_uv[0]); predicted_value_[1] = static_cast(predicted_uv[1]); } - return; + + return true; } // Else we don't have available textures on both corners. For such case we // can't use positions for predicting the uv value and we resort to delta @@ -330,12 +357,13 @@ void MeshPredictionSchemeTexCoordsDecoder:: for (int i = 0; i < num_components_; ++i) { predicted_value_[i] = 0; } - return; + return true; } } for (int i = 0; i < num_components_; ++i) { predicted_value_[i] = data[data_offset + i]; } + return true; } } // namespace draco diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_encoder.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_encoder.h index 741ec66dc..44fcc7a6a 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_encoder.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_encoder.h @@ -98,7 +98,10 @@ bool MeshPredictionSchemeTexCoordsPortableEncoder(this->mesh_data().data_to_corner_map()->size() - 1); p >= 0; --p) { const CornerIndex corner_id = this->mesh_data().data_to_corner_map()->at(p); - predictor_.template ComputePredictedValue(corner_id, in_data, p); + if (!predictor_.template ComputePredictedValue(corner_id, in_data, + p)) { + return false; + } const int dst_offset = p * num_components; this->transform().ComputeCorrection(in_data + dst_offset, diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_predictor.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_predictor.h index f05e5ddd7..26262fb13 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_predictor.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/mesh_prediction_scheme_tex_coords_portable_predictor.h @@ -17,6 +17,9 @@ #include +#include +#include + #include "draco/attributes/point_attribute.h" #include "draco/core/math_utils.h" #include "draco/core/vector_d.h" @@ -105,10 +108,14 @@ bool MeshPredictionSchemeTexCoordsPortablePredictor< next_data_id = mesh_data_.vertex_to_data_map()->at(next_vert_id); prev_data_id = mesh_data_.vertex_to_data_map()->at(prev_vert_id); + typedef VectorD Vec2; + typedef VectorD Vec3; + typedef VectorD Vec2u; + if (prev_data_id < data_id && next_data_id < data_id) { // Both other corners have available UV coordinates for prediction. - const VectorD n_uv = GetTexCoordForEntryId(next_data_id, data); - const VectorD p_uv = GetTexCoordForEntryId(prev_data_id, data); + const Vec2 n_uv = GetTexCoordForEntryId(next_data_id, data); + const Vec2 p_uv = GetTexCoordForEntryId(prev_data_id, data); if (p_uv == n_uv) { // We cannot do a reliable prediction on degenerated UV triangles. predicted_value_[0] = p_uv[0]; @@ -117,9 +124,9 @@ bool MeshPredictionSchemeTexCoordsPortablePredictor< } // Get positions at all corners. - const VectorD tip_pos = GetPositionForEntryId(data_id); - const VectorD next_pos = GetPositionForEntryId(next_data_id); - const VectorD prev_pos = GetPositionForEntryId(prev_data_id); + const Vec3 tip_pos = GetPositionForEntryId(data_id); + const Vec3 next_pos = GetPositionForEntryId(next_data_id); + const Vec3 prev_pos = GetPositionForEntryId(prev_data_id); // We use the positions of the above triangle to predict the texture // coordinate on the tip corner C. // To convert the triangle into the UV coordinate system we first compute @@ -135,17 +142,17 @@ bool MeshPredictionSchemeTexCoordsPortablePredictor< // Where next_pos is point (N), prev_pos is point (P) and tip_pos is the // position of predicted coordinate (C). // - const VectorD pn = prev_pos - next_pos; + const Vec3 pn = prev_pos - next_pos; const uint64_t pn_norm2_squared = pn.SquaredNorm(); if (pn_norm2_squared != 0) { // Compute the projection of C onto PN by computing dot product of CN with // PN and normalizing it by length of PN. This gives us a factor |s| where // |s = PN.Dot(CN) / PN.SquaredNorm2()|. This factor can be used to // compute X in UV space |X_UV| as |X_UV = N_UV + s * PN_UV|. - const VectorD cn = tip_pos - next_pos; + const Vec3 cn = tip_pos - next_pos; const int64_t cn_dot_pn = pn.Dot(cn); - const VectorD pn_uv = p_uv - n_uv; + const Vec2 pn_uv = p_uv - n_uv; // Because we perform all computations with integers, we don't explicitly // compute the normalized factor |s|, but rather we perform all operations // over UV vectors in a non-normalized coordinate system scaled with a @@ -153,19 +160,30 @@ bool MeshPredictionSchemeTexCoordsPortablePredictor< // // x_uv = X_UV * PN.Norm2Squared() // - const VectorD x_uv = - n_uv * pn_norm2_squared + (cn_dot_pn * pn_uv); - + const int64_t n_uv_absmax_element = + std::max(std::abs(n_uv[0]), std::abs(n_uv[1])); + if (n_uv_absmax_element > + std::numeric_limits::max() / pn_norm2_squared) { + // Return false if the below multiplication would overflow. + return false; + } + const int64_t pn_uv_absmax_element = + std::max(std::abs(pn_uv[0]), std::abs(pn_uv[1])); + if (cn_dot_pn > + std::numeric_limits::max() / pn_uv_absmax_element) { + // Return false if squared length calculation would overflow. + return false; + } + const Vec2 x_uv = n_uv * pn_norm2_squared + (cn_dot_pn * pn_uv); const int64_t pn_absmax_element = std::max(std::max(std::abs(pn[0]), std::abs(pn[1])), std::abs(pn[2])); if (cn_dot_pn > std::numeric_limits::max() / pn_absmax_element) { - // return false if squared length calculation would overflow. + // Return false if squared length calculation would overflow. return false; } // Compute squared length of vector CX in position coordinate system: - const VectorD x_pos = - next_pos + (cn_dot_pn * pn) / pn_norm2_squared; + const Vec3 x_pos = next_pos + (cn_dot_pn * pn) / pn_norm2_squared; const uint64_t cx_norm2_squared = (tip_pos - x_pos).SquaredNorm(); // Compute vector CX_UV in the uv space by rotating vector PN_UV by 90 @@ -182,7 +200,7 @@ bool MeshPredictionSchemeTexCoordsPortablePredictor< // // cx_uv = CX.Norm2() * PN.Norm2() * Rot(PN_UV) // - VectorD cx_uv(pn_uv[1], -pn_uv[0]); // Rotated PN_UV. + Vec2 cx_uv(pn_uv[1], -pn_uv[0]); // Rotated PN_UV. // Compute CX.Norm2() * PN.Norm2() const uint64_t norm_squared = IntSqrt(cx_norm2_squared * pn_norm2_squared); @@ -191,17 +209,15 @@ bool MeshPredictionSchemeTexCoordsPortablePredictor< // Predicted uv coordinate is then computed by either adding or // subtracting CX_UV to/from X_UV. - VectorD predicted_uv; + Vec2 predicted_uv; if (is_encoder_t) { // When encoding, compute both possible vectors and determine which one // results in a better prediction. // Both vectors need to be transformed back from the scaled space to // the real UV coordinate space. - const VectorD predicted_uv_0((x_uv + cx_uv) / - pn_norm2_squared); - const VectorD predicted_uv_1((x_uv - cx_uv) / - pn_norm2_squared); - const VectorD c_uv = GetTexCoordForEntryId(data_id, data); + const Vec2 predicted_uv_0((x_uv + cx_uv) / pn_norm2_squared); + const Vec2 predicted_uv_1((x_uv - cx_uv) / pn_norm2_squared); + const Vec2 c_uv = GetTexCoordForEntryId(data_id, data); if ((c_uv - predicted_uv_0).SquaredNorm() < (c_uv - predicted_uv_1).SquaredNorm()) { predicted_uv = predicted_uv_0; @@ -217,10 +233,12 @@ bool MeshPredictionSchemeTexCoordsPortablePredictor< } const bool orientation = orientations_.back(); orientations_.pop_back(); + // Perform operations in unsigned type to avoid signed integer overflow. + // Note that the result will be the same (for non-overflowing values). if (orientation) { - predicted_uv = (x_uv + cx_uv) / pn_norm2_squared; + predicted_uv = Vec2(Vec2u(x_uv) + Vec2u(cx_uv)) / pn_norm2_squared; } else { - predicted_uv = (x_uv - cx_uv) / pn_norm2_squared; + predicted_uv = Vec2(Vec2u(x_uv) - Vec2u(cx_uv)) / pn_norm2_squared; } } predicted_value_[0] = static_cast(predicted_uv[0]); diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc index f410a6cd2..2338f2f76 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.cc @@ -18,22 +18,58 @@ namespace draco { PredictionSchemeMethod SelectPredictionMethod( int att_id, const PointCloudEncoder *encoder) { - if (encoder->options()->GetSpeed() >= 10) { + return SelectPredictionMethod(att_id, *encoder->options(), encoder); +} + +PredictionSchemeMethod SelectPredictionMethod( + int att_id, const EncoderOptions &options, + const PointCloudEncoder *encoder) { + if (options.GetSpeed() >= 10) { // Selected fastest, though still doing some compression. return PREDICTION_DIFFERENCE; } if (encoder->GetGeometryType() == TRIANGULAR_MESH) { // Use speed setting to select the best encoding method. + const int att_quant = + options.GetAttributeInt(att_id, "quantization_bits", -1); const PointAttribute *const att = encoder->point_cloud()->attribute(att_id); - if (att->attribute_type() == GeometryAttribute::TEX_COORD) { - if (encoder->options()->GetSpeed() < 4) { + if (att_quant != -1 && + att->attribute_type() == GeometryAttribute::TEX_COORD && + att->num_components() == 2) { + // Texture coordinate predictor needs a position attribute that is either + // integer or quantized. For numerical reasons, we require the position + // quantization to be at most 21 bits and the 2*position_quantization + + // uv_quantization < 64 (TODO(b/231259902)). + const PointAttribute *const pos_att = + encoder->point_cloud()->GetNamedAttribute( + GeometryAttribute::POSITION); + bool is_pos_att_valid = false; + if (pos_att) { + if (IsDataTypeIntegral(pos_att->data_type())) { + is_pos_att_valid = true; + } else { + // Check quantization of the position attribute. + const int pos_att_id = encoder->point_cloud()->GetNamedAttributeId( + GeometryAttribute::POSITION); + const int pos_quant = + options.GetAttributeInt(pos_att_id, "quantization_bits", -1); + // Must be quantized but the quantization is restricted to 21 bits and + // 2*|pos_quant|+|att_quant| must be smaller than 64 bits. + if (pos_quant > 0 && pos_quant <= 21 && + 2 * pos_quant + att_quant < 64) { + is_pos_att_valid = true; + } + } + } + + if (is_pos_att_valid && options.GetSpeed() < 4) { // Use texture coordinate prediction for speeds 0, 1, 2, 3. return MESH_PREDICTION_TEX_COORDS_PORTABLE; } } if (att->attribute_type() == GeometryAttribute::NORMAL) { #ifdef DRACO_NORMAL_ENCODING_SUPPORTED - if (encoder->options()->GetSpeed() < 4) { + if (options.GetSpeed() < 4) { // Use geometric normal prediction for speeds 0, 1, 2, 3. // For this prediction, the position attribute needs to be either // integer or quantized as well. @@ -43,8 +79,8 @@ PredictionSchemeMethod SelectPredictionMethod( encoder->point_cloud()->GetNamedAttribute( GeometryAttribute::POSITION); if (pos_att && (IsDataTypeIntegral(pos_att->data_type()) || - encoder->options()->GetAttributeInt( - pos_att_id, "quantization_bits", -1) > 0)) { + options.GetAttributeInt(pos_att_id, "quantization_bits", + -1) > 0)) { return MESH_PREDICTION_GEOMETRIC_NORMAL; } } @@ -52,11 +88,10 @@ PredictionSchemeMethod SelectPredictionMethod( return PREDICTION_DIFFERENCE; // default } // Handle other attribute types. - if (encoder->options()->GetSpeed() >= 8) { + if (options.GetSpeed() >= 8) { return PREDICTION_DIFFERENCE; } - if (encoder->options()->GetSpeed() >= 2 || - encoder->point_cloud()->num_points() < 40) { + if (options.GetSpeed() >= 2 || encoder->point_cloud()->num_points() < 40) { // Parallelogram prediction is used for speeds 2 - 7 or when the overhead // of using constrained multi-parallelogram would be too high. return MESH_PREDICTION_PARALLELOGRAM; diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h index 40a7683aa..11db5a62e 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_encoder_factory.h @@ -38,6 +38,10 @@ namespace draco { PredictionSchemeMethod SelectPredictionMethod(int att_id, const PointCloudEncoder *encoder); +PredictionSchemeMethod SelectPredictionMethod(int att_id, + const EncoderOptions &options, + const PointCloudEncoder *encoder); + // Factory class for creating mesh prediction schemes. template struct MeshPredictionSchemeEncoderFactory { @@ -97,10 +101,11 @@ CreatePredictionSchemeForEncoder(PredictionSchemeMethod method, int att_id, // template nature of the prediction schemes). const MeshEncoder *const mesh_encoder = static_cast(encoder); + const uint16_t bitstream_version = kDracoMeshBitstreamVersion; auto ret = CreateMeshPredictionScheme< MeshEncoder, PredictionSchemeEncoder, MeshPredictionSchemeEncoderFactory>( - mesh_encoder, method, att_id, transform, kDracoMeshBitstreamVersion); + mesh_encoder, method, att_id, transform, bitstream_version); if (ret) { return ret; } diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_decoding_transform.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_decoding_transform.h index 5a6c7c2dd..e9e345343 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_decoding_transform.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_decoding_transform.h @@ -21,6 +21,7 @@ #include "draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_transform_base.h" #include "draco/core/decoder_buffer.h" #include "draco/core/macros.h" +#include "draco/core/math_utils.h" #include "draco/core/vector_d.h" namespace draco { @@ -98,9 +99,8 @@ class PredictionSchemeNormalOctahedronCanonicalizedDecodingTransform if (!pred_is_in_bottom_left) { pred = this->RotatePoint(pred, rotation_count); } - Point2 orig = pred + corr; - orig[0] = this->ModMax(orig[0]); - orig[1] = this->ModMax(orig[1]); + Point2 orig(this->ModMax(AddAsUnsigned(pred[0], corr[0])), + this->ModMax(AddAsUnsigned(pred[1], corr[1]))); if (!pred_is_in_bottom_left) { const int32_t reverse_rotation_count = (4 - rotation_count) % 4; orig = this->RotatePoint(orig, reverse_rotation_count); diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_transform_test.cc b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_transform_test.cc index 8c8932f77..298758d8c 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_transform_test.cc +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_canonicalized_transform_test.cc @@ -25,10 +25,10 @@ class PredictionSchemeNormalOctahedronCanonicalizedTransformTest Transform; typedef Transform::Point2 Point2; - void TestComputeCorrection(const Transform &transform, const int32_t &ox, - const int32_t &oy, const int32_t &px, - const int32_t &py, const int32_t &cx, - const int32_t &cy) { + void TestComputeCorrection(const Transform &transform, const int32_t ox, + const int32_t oy, const int32_t px, + const int32_t py, const int32_t cx, + const int32_t cy) { const int32_t o[2] = {ox + 7, oy + 7}; const int32_t p[2] = {px + 7, py + 7}; int32_t corr[2] = {500, 500}; @@ -38,7 +38,7 @@ class PredictionSchemeNormalOctahedronCanonicalizedTransformTest } void TestGetRotationCount(const Transform &transform, const Point2 &pred, - const int32_t &rot_dir) { + const int32_t rot_dir) { const int32_t rotation_count = transform.GetRotationCount(pred); ASSERT_EQ(rot_dir, rotation_count); } diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_decoding_transform.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_decoding_transform.h index a1bc4a327..d3705c8ad 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_decoding_transform.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_decoding_transform.h @@ -80,19 +80,31 @@ class PredictionSchemeNormalOctahedronDecodingTransform private: Point2 ComputeOriginalValue(Point2 pred, const Point2 &corr) const { const Point2 t(this->center_value(), this->center_value()); - pred = pred - t; + typedef typename std::make_unsigned::type UnsignedDataTypeT; + typedef VectorD Point2u; + + // Perform the addition in unsigned type to avoid signed integer overflow. + // Note that the result will be the same (for non-overflowing values). + pred = Point2(Point2u(pred) - Point2u(t)); const bool pred_is_in_diamond = this->IsInDiamond(pred[0], pred[1]); if (!pred_is_in_diamond) { this->InvertDiamond(&pred[0], &pred[1]); } - Point2 orig = pred + corr; + + // Perform the addition in unsigned type to avoid signed integer overflow. + // Note that the result will be the same (for non-overflowing values). + Point2 orig(Point2u(pred) + Point2u(corr)); + orig[0] = this->ModMax(orig[0]); orig[1] = this->ModMax(orig[1]); if (!pred_is_in_diamond) { this->InvertDiamond(&orig[0], &orig[1]); } - orig = orig + t; + + // Perform the addition in unsigned type to avoid signed integer overflow. + // Note that the result will be the same (for non-overflowing values). + orig = Point2(Point2u(orig) + Point2u(t)); return orig; } }; diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_transform_test.cc b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_transform_test.cc index 1001b19fa..1403973c4 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_transform_test.cc +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_normal_octahedron_transform_test.cc @@ -23,10 +23,10 @@ class PredictionSchemeNormalOctahedronTransformTest : public ::testing::Test { Transform; typedef Transform::Point2 Point2; - void TestComputeCorrection(const Transform &transform, const int32_t &ox, - const int32_t &oy, const int32_t &px, - const int32_t &py, const int32_t &cx, - const int32_t &cy) { + void TestComputeCorrection(const Transform &transform, const int32_t ox, + const int32_t oy, const int32_t px, + const int32_t py, const int32_t cx, + const int32_t cy) { const int32_t o[2] = {ox + 7, oy + 7}; const int32_t p[2] = {px + 7, py + 7}; int32_t corr[2] = {500, 500}; diff --git a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_wrap_transform_base.h b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_wrap_transform_base.h index 26f61fbaf..bba3de09c 100644 --- a/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_wrap_transform_base.h +++ b/contrib/draco/src/draco/compression/attributes/prediction_schemes/prediction_scheme_wrap_transform_base.h @@ -70,10 +70,10 @@ class PredictionSchemeWrapTransformBase { clamped_value_[i] = predicted_val[i]; } } - return &clamped_value_[0]; + return clamped_value_.data(); } - // TODO(hemmer): Consider refactoring to avoid this dummy. + // TODO(b/199760123): Consider refactoring to avoid this dummy. int quantization_bits() const { DRACO_DCHECK(false); return -1; diff --git a/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_decoder.cc b/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_decoder.cc index 83f42125a..17f32fc16 100644 --- a/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_decoder.cc +++ b/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_decoder.cc @@ -148,8 +148,9 @@ bool SequentialIntegerAttributeDecoder::DecodeIntegerValues( return false; } for (size_t i = 0; i < num_values; ++i) { - if (!in_buffer->Decode(portable_attribute_data + i, num_bytes)) + if (!in_buffer->Decode(portable_attribute_data + i, num_bytes)) { return false; + } } } } @@ -228,12 +229,13 @@ void SequentialIntegerAttributeDecoder::StoreTypedValues(uint32_t num_values) { void SequentialIntegerAttributeDecoder::PreparePortableAttribute( int num_entries, int num_components) { - GeometryAttribute va; - va.Init(attribute()->attribute_type(), nullptr, num_components, DT_INT32, + GeometryAttribute ga; + ga.Init(attribute()->attribute_type(), nullptr, num_components, DT_INT32, false, num_components * DataTypeLength(DT_INT32), 0); - std::unique_ptr port_att(new PointAttribute(va)); + std::unique_ptr port_att(new PointAttribute(ga)); port_att->SetIdentityMapping(); port_att->Reset(num_entries); + port_att->set_unique_id(attribute()->unique_id()); SetPortableAttribute(std::move(port_att)); } diff --git a/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_encoder.cc b/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_encoder.cc index e66a0a8a4..5f673be42 100644 --- a/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_encoder.cc +++ b/contrib/draco/src/draco/compression/attributes/sequential_integer_attribute_encoder.cc @@ -138,9 +138,11 @@ bool SequentialIntegerAttributeEncoder::EncodeValues( // All integer values are initialized. Process them using the prediction // scheme if we have one. if (prediction_scheme_) { - prediction_scheme_->ComputeCorrectionValues( - portable_attribute_data, &encoded_data[0], num_values, num_components, - point_ids.data()); + if (!prediction_scheme_->ComputeCorrectionValues( + portable_attribute_data, &encoded_data[0], num_values, + num_components, point_ids.data())) { + return false; + } } if (prediction_scheme_ == nullptr || diff --git a/contrib/draco/src/draco/compression/attributes/sequential_normal_attribute_encoder.cc b/contrib/draco/src/draco/compression/attributes/sequential_normal_attribute_encoder.cc index 2e20e89e6..3c5ef0ebc 100644 --- a/contrib/draco/src/draco/compression/attributes/sequential_normal_attribute_encoder.cc +++ b/contrib/draco/src/draco/compression/attributes/sequential_normal_attribute_encoder.cc @@ -20,8 +20,9 @@ namespace draco { bool SequentialNormalAttributeEncoder::Init(PointCloudEncoder *encoder, int attribute_id) { - if (!SequentialIntegerAttributeEncoder::Init(encoder, attribute_id)) + if (!SequentialIntegerAttributeEncoder::Init(encoder, attribute_id)) { return false; + } // Currently this encoder works only for 3-component normal vectors. if (attribute()->num_components() != 3) { return false; diff --git a/contrib/draco/src/draco/compression/bit_coders/direct_bit_decoder.h b/contrib/draco/src/draco/compression/bit_coders/direct_bit_decoder.h index b9fbc2d6f..6273692a2 100644 --- a/contrib/draco/src/draco/compression/bit_coders/direct_bit_decoder.h +++ b/contrib/draco/src/draco/compression/bit_coders/direct_bit_decoder.h @@ -47,14 +47,13 @@ class DirectBitDecoder { // Decode the next |nbits| and return the sequence in |value|. |nbits| must be // > 0 and <= 32. - void DecodeLeastSignificantBits32(int nbits, uint32_t *value) { + bool DecodeLeastSignificantBits32(int nbits, uint32_t *value) { DRACO_DCHECK_EQ(true, nbits <= 32); DRACO_DCHECK_EQ(true, nbits > 0); const int remaining = 32 - num_used_bits_; if (nbits <= remaining) { if (pos_ == bits_.end()) { - *value = 0; - return; + return false; } *value = (*pos_ << num_used_bits_) >> (32 - nbits); num_used_bits_ += nbits; @@ -64,8 +63,7 @@ class DirectBitDecoder { } } else { if (pos_ + 1 == bits_.end()) { - *value = 0; - return; + return false; } const uint32_t value_l = ((*pos_) << num_used_bits_); num_used_bits_ = nbits - remaining; @@ -73,6 +71,7 @@ class DirectBitDecoder { const uint32_t value_r = (*pos_) >> (32 - num_used_bits_); *value = (value_l >> (32 - num_used_bits_ - remaining)) | value_r; } + return true; } void EndDecoding() {} diff --git a/contrib/draco/src/draco/compression/config/encoder_options.h b/contrib/draco/src/draco/compression/config/encoder_options.h index ed1b02068..e8a55bbba 100644 --- a/contrib/draco/src/draco/compression/config/encoder_options.h +++ b/contrib/draco/src/draco/compression/config/encoder_options.h @@ -65,6 +65,10 @@ class EncoderOptionsBase : public DracoOptions { this->SetGlobalInt("encoding_speed", encoding_speed); this->SetGlobalInt("decoding_speed", decoding_speed); } + bool IsSpeedSet() const { + return this->IsGlobalOptionSet("encoding_speed") || + this->IsGlobalOptionSet("decoding_speed"); + } // Sets a given feature as supported or unsupported by the target decoder. // Encoder will always use only supported features when encoding the input diff --git a/contrib/draco/src/draco/compression/decode_test.cc b/contrib/draco/src/draco/compression/decode_test.cc index 198714690..8f3e7f4e9 100644 --- a/contrib/draco/src/draco/compression/decode_test.cc +++ b/contrib/draco/src/draco/compression/decode_test.cc @@ -17,9 +17,11 @@ #include #include +#include "draco/compression/encode.h" #include "draco/core/draco_test_base.h" #include "draco/core/draco_test_utils.h" #include "draco/io/file_utils.h" +#include "draco/io/obj_encoder.h" namespace { @@ -166,4 +168,78 @@ TEST_F(DecodeTest, TestSkipAttributeTransformWithNoQuantization) { ASSERT_EQ(pos_att->GetAttributeTransformData(), nullptr); } +TEST_F(DecodeTest, TestSkipAttributeTransformUniqueId) { + // Tests that decoders preserve unique id of attributes even when their + // attribute transforms are skipped. + const std::string file_name = "cube_att.obj"; + auto src_mesh = draco::ReadMeshFromTestFile(file_name); + ASSERT_NE(src_mesh, nullptr); + + constexpr int kPosUniqueId = 7; + constexpr int kNormUniqueId = 42; + // Set unique ids for some of the attributes. + src_mesh + ->attribute( + src_mesh->GetNamedAttributeId(draco::GeometryAttribute::POSITION)) + ->set_unique_id(kPosUniqueId); + src_mesh + ->attribute( + src_mesh->GetNamedAttributeId(draco::GeometryAttribute::NORMAL)) + ->set_unique_id(kNormUniqueId); + + draco::EncoderBuffer encoder_buffer; + draco::Encoder encoder; + encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, 10); + encoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL, 11); + encoder.EncodeMeshToBuffer(*src_mesh, &encoder_buffer); + + // Create a draco decoding buffer. + draco::DecoderBuffer buffer; + buffer.Init(encoder_buffer.data(), encoder_buffer.size()); + + // First we decode the mesh without skipping the attribute transforms. + draco::Decoder decoder_no_skip; + std::unique_ptr mesh_no_skip = + decoder_no_skip.DecodeMeshFromBuffer(&buffer).value(); + ASSERT_NE(mesh_no_skip, nullptr); + + // Now we decode it again while skipping some attributes. + draco::Decoder decoder_skip; + // Make sure we skip dequantization for the position and normal attribute. + decoder_skip.SetSkipAttributeTransform(draco::GeometryAttribute::POSITION); + decoder_skip.SetSkipAttributeTransform(draco::GeometryAttribute::NORMAL); + + // Decode the input data into a geometry. + buffer.Init(encoder_buffer.data(), encoder_buffer.size()); + std::unique_ptr mesh_skip = + decoder_skip.DecodeMeshFromBuffer(&buffer).value(); + ASSERT_NE(mesh_skip, nullptr); + + // Compare the unique ids. + const draco::PointAttribute *const pos_att_no_skip = + mesh_no_skip->GetNamedAttribute(draco::GeometryAttribute::POSITION); + ASSERT_NE(pos_att_no_skip, nullptr); + ASSERT_EQ(pos_att_no_skip->data_type(), draco::DataType::DT_FLOAT32); + + const draco::PointAttribute *const pos_att_skip = + mesh_skip->GetNamedAttribute(draco::GeometryAttribute::POSITION); + ASSERT_NE(pos_att_skip, nullptr); + ASSERT_EQ(pos_att_skip->data_type(), draco::DataType::DT_INT32); + + const draco::PointAttribute *const norm_att_no_skip = + mesh_no_skip->GetNamedAttribute(draco::GeometryAttribute::NORMAL); + ASSERT_NE(norm_att_no_skip, nullptr); + ASSERT_EQ(norm_att_no_skip->data_type(), draco::DataType::DT_FLOAT32); + + const draco::PointAttribute *const norm_att_skip = + mesh_skip->GetNamedAttribute(draco::GeometryAttribute::NORMAL); + ASSERT_NE(norm_att_skip, nullptr); + ASSERT_EQ(norm_att_skip->data_type(), draco::DataType::DT_INT32); + + ASSERT_EQ(pos_att_skip->unique_id(), pos_att_no_skip->unique_id()); + ASSERT_EQ(norm_att_skip->unique_id(), norm_att_no_skip->unique_id()); + std::cout << pos_att_skip->unique_id() << " " << norm_att_skip->unique_id() + << std::endl; +} + } // namespace diff --git a/contrib/draco/src/draco/compression/draco_compression_options.cc b/contrib/draco/src/draco/compression/draco_compression_options.cc new file mode 100644 index 000000000..08171c678 --- /dev/null +++ b/contrib/draco/src/draco/compression/draco_compression_options.cc @@ -0,0 +1,59 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/compression/draco_compression_options.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +SpatialQuantizationOptions::SpatialQuantizationOptions(int quantization_bits) { + SetQuantizationBits(quantization_bits); +} + +void SpatialQuantizationOptions::SetQuantizationBits(int quantization_bits) { + mode_ = LOCAL_QUANTIZATION_BITS; + quantization_bits_ = quantization_bits; +} + +bool SpatialQuantizationOptions::AreQuantizationBitsDefined() const { + return mode_ == LOCAL_QUANTIZATION_BITS; +} + +SpatialQuantizationOptions &SpatialQuantizationOptions::SetGrid(float spacing) { + mode_ = GLOBAL_GRID; + spacing_ = spacing; + return *this; +} + +bool SpatialQuantizationOptions::operator==( + const SpatialQuantizationOptions &other) const { + if (mode_ != other.mode_) { + return false; + } + if (mode_ == LOCAL_QUANTIZATION_BITS) { + if (quantization_bits_ != other.quantization_bits_) { + return false; + } + } else if (mode_ == GLOBAL_GRID) { + if (spacing_ != other.spacing_) { + return false; + } + } + return true; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/compression/draco_compression_options.h b/contrib/draco/src/draco/compression/draco_compression_options.h new file mode 100644 index 000000000..31a4418ed --- /dev/null +++ b/contrib/draco/src/draco/compression/draco_compression_options.h @@ -0,0 +1,141 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_COMPRESSION_DRACO_COMPRESSION_OPTIONS_H_ +#define DRACO_COMPRESSION_DRACO_COMPRESSION_OPTIONS_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/status.h" + +namespace draco { + +// Quantization options for positions. Currently there are two modes for +// quantizing positions: +// +// 1. Quantization bits: +// - User defined number of quantization bits that is evenly distributed +// to cover the compressed geometry. +// 2. Grid: +// - Positions are snapped to a global grid defined by grid spacing. +// - This method is primarily intended to be used when the location of +// quantized vertices needs to be consistent between multiple +// geometries. +class SpatialQuantizationOptions { + public: + explicit SpatialQuantizationOptions(int quantization_bits); + + // Sets quantization bits that are going to be used for the compressed + // geometry. If the geometry is a scene, the same number of quantization bits + // is going to be applied to each mesh of the scene. Quantized values are + // going to be distributed within the bounds of individual meshes. + void SetQuantizationBits(int quantization_bits); + + // If this returns true, quantization_bits() should be used to get the + // desired number of quantization bits for compression. Otherwise the grid + // mode is selected and spacing() should be used to get the desired grid + // spacing. + bool AreQuantizationBitsDefined() const; + const int quantization_bits() const { return quantization_bits_; } + + // Defines quantization grid used for the compressed geometry. All vertices + // are going to be snapped to the nearest grid vertex that corresponds to an + // integer quantized position. |spacing| defines the distance between two grid + // vertices. E.g. a grid with |spacing| = 10 would have grid vertices at + // locations {10 * i, 10 * j, 10 * k} where i, j, k are integer numbers. + SpatialQuantizationOptions &SetGrid(float spacing); + + const float spacing() const { return spacing_; } + + bool operator==(const SpatialQuantizationOptions &other) const; + + private: + enum Mode { LOCAL_QUANTIZATION_BITS, GLOBAL_GRID }; + Mode mode_ = LOCAL_QUANTIZATION_BITS; + int quantization_bits_; // Default quantization bits for positions. + float spacing_ = 0.f; +}; + +// TODO(fgalligan): Add support for unified_position_quantization. +// Struct to hold Draco compression options. +struct DracoCompressionOptions { + int compression_level = 7; // compression level [0-10], most=10, least=0. + SpatialQuantizationOptions quantization_position{11}; + int quantization_bits_normal = 8; + int quantization_bits_tex_coord = 10; + int quantization_bits_color = 8; + int quantization_bits_generic = 8; + int quantization_bits_tangent = 8; + int quantization_bits_weight = 8; + bool find_non_degenerate_texture_quantization = false; + + bool operator==(const DracoCompressionOptions &other) const { + return compression_level == other.compression_level && + quantization_position == other.quantization_position && + quantization_bits_normal == other.quantization_bits_normal && + quantization_bits_tex_coord == other.quantization_bits_tex_coord && + quantization_bits_color == other.quantization_bits_color && + quantization_bits_generic == other.quantization_bits_generic && + quantization_bits_tangent == other.quantization_bits_tangent && + quantization_bits_weight == other.quantization_bits_weight && + find_non_degenerate_texture_quantization == + other.find_non_degenerate_texture_quantization; + } + + bool operator!=(const DracoCompressionOptions &other) const { + return !(*this == other); + } + + Status Check() const { + DRACO_RETURN_IF_ERROR( + Validate("Compression level", compression_level, 0, 10)); + if (quantization_position.AreQuantizationBitsDefined()) { + DRACO_RETURN_IF_ERROR(Validate("Position quantization", + quantization_position.quantization_bits(), + 0, 30)); + } else { + if (quantization_position.spacing() <= 0.f) { + return ErrorStatus("Position quantization spacing is invalid."); + } + } + DRACO_RETURN_IF_ERROR( + Validate("Normals quantization", quantization_bits_normal, 0, 30)); + DRACO_RETURN_IF_ERROR( + Validate("Tex coord quantization", quantization_bits_tex_coord, 0, 30)); + DRACO_RETURN_IF_ERROR( + Validate("Color quantization", quantization_bits_color, 0, 30)); + DRACO_RETURN_IF_ERROR( + Validate("Generic quantization", quantization_bits_generic, 0, 30)); + DRACO_RETURN_IF_ERROR( + Validate("Tangent quantization", quantization_bits_tangent, 0, 30)); + DRACO_RETURN_IF_ERROR( + Validate("Weights quantization", quantization_bits_weight, 0, 30)); + return OkStatus(); + } + + static Status Validate(const std::string &name, int value, int min, int max) { + if (value < min || value > max) { + const std::string range = + "[" + std::to_string(min) + "-" + std::to_string(max) + "]."; + return Status(Status::DRACO_ERROR, name + " is out of range " + range); + } + return OkStatus(); + } +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_COMPRESSION_DRACO_COMPRESSION_OPTIONS_H_ diff --git a/contrib/draco/src/draco/compression/draco_compression_options_test.cc b/contrib/draco/src/draco/compression/draco_compression_options_test.cc new file mode 100644 index 000000000..415295211 --- /dev/null +++ b/contrib/draco/src/draco/compression/draco_compression_options_test.cc @@ -0,0 +1,45 @@ +#include "draco/compression/draco_compression_options.h" + +#include "draco/core/draco_test_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace { + +TEST(DracoCompressionOptionsTest, TestPositionQuantizationBits) { + // Test verifies that we can define draco compression options using + // quantization bits. + draco::SpatialQuantizationOptions options(10); + + // Quantization bits should be used by default. + ASSERT_TRUE(options.AreQuantizationBitsDefined()); + ASSERT_EQ(options.quantization_bits(), 10); + + // Change the quantization bits. + options.SetQuantizationBits(9); + ASSERT_TRUE(options.AreQuantizationBitsDefined()); + ASSERT_EQ(options.quantization_bits(), 9); + + // If we select the grid, quantization bits should not be used. + options.SetGrid(0.5f); + ASSERT_FALSE(options.AreQuantizationBitsDefined()); +} + +TEST(DracoCompressionOptionsTest, TestPositionQuantizationGrid) { + // Test verifies that we can define draco compression options using + // quantization grid. + draco::SpatialQuantizationOptions options(10); + + // Quantization bits should be used by default. + ASSERT_TRUE(options.AreQuantizationBitsDefined()); + + // Set the grid parameters. + options.SetGrid(0.25f); + ASSERT_FALSE(options.AreQuantizationBitsDefined()); + + ASSERT_EQ(options.spacing(), 0.25f); +} + +} // namespace + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/compression/encode.h b/contrib/draco/src/draco/compression/encode.h index bce8b34c2..00ccb9b2e 100644 --- a/contrib/draco/src/draco/compression/encode.h +++ b/contrib/draco/src/draco/compression/encode.h @@ -129,7 +129,6 @@ class Encoder // call of EncodePointCloudToBuffer or EncodeMeshToBuffer is going to fail. void SetEncodingMethod(int encoding_method); - protected: // Creates encoder options for the expert encoder used during the actual // encoding. EncoderOptions CreateExpertEncoderOptions(const PointCloud &pc) const; diff --git a/contrib/draco/src/draco/compression/encode_base.h b/contrib/draco/src/draco/compression/encode_base.h index c501bc4fa..6211efc22 100644 --- a/contrib/draco/src/draco/compression/encode_base.h +++ b/contrib/draco/src/draco/compression/encode_base.h @@ -98,7 +98,7 @@ class EncoderBase { "Invalid prediction scheme for attribute type."); } } - // TODO(hemmer): Try to enable more prediction schemes for normals. + // TODO(b/199760123): Try to enable more prediction schemes for normals. if (att_type == GeometryAttribute::NORMAL) { if (!(prediction_scheme == PREDICTION_DIFFERENCE || prediction_scheme == MESH_PREDICTION_GEOMETRIC_NORMAL)) { diff --git a/contrib/draco/src/draco/compression/encode_test.cc b/contrib/draco/src/draco/compression/encode_test.cc index fde4f6f5b..00d834703 100644 --- a/contrib/draco/src/draco/compression/encode_test.cc +++ b/contrib/draco/src/draco/compression/encode_test.cc @@ -26,6 +26,7 @@ #include "draco/core/draco_test_base.h" #include "draco/core/draco_test_utils.h" #include "draco/core/vector_d.h" +#include "draco/io/file_utils.h" #include "draco/io/obj_decoder.h" #include "draco/mesh/triangle_soup_mesh_builder.h" #include "draco/point_cloud/point_cloud_builder.h" @@ -213,16 +214,14 @@ class EncodeTest : public ::testing::Test { draco::Decoder decoder; if (mesh) { - auto maybe_mesh = decoder.DecodeMeshFromBuffer(&decoder_buffer); - ASSERT_TRUE(maybe_mesh.ok()); - auto decoded_mesh = std::move(maybe_mesh).value(); + DRACO_ASSIGN_OR_ASSERT(auto decoded_mesh, + decoder.DecodeMeshFromBuffer(&decoder_buffer)); ASSERT_NE(decoded_mesh, nullptr); ASSERT_EQ(decoded_mesh->num_points(), encoder.num_encoded_points()); ASSERT_EQ(decoded_mesh->num_faces(), encoder.num_encoded_faces()); } else { - auto maybe_pc = decoder.DecodePointCloudFromBuffer(&decoder_buffer); - ASSERT_TRUE(maybe_pc.ok()); - auto decoded_pc = std::move(maybe_pc).value(); + DRACO_ASSIGN_OR_ASSERT( + auto decoded_pc, decoder.DecodePointCloudFromBuffer(&decoder_buffer)); ASSERT_EQ(decoded_pc->num_points(), encoder.num_encoded_points()); } } @@ -274,7 +273,7 @@ TEST_F(EncodeTest, TestLinesObj) { encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, 16); draco::EncoderBuffer buffer; - ASSERT_TRUE(encoder.EncodePointCloudToBuffer(*pc, &buffer).ok()); + DRACO_ASSERT_OK(encoder.EncodePointCloudToBuffer(*pc, &buffer)); } TEST_F(EncodeTest, TestQuantizedInfinity) { @@ -315,7 +314,7 @@ TEST_F(EncodeTest, TestUnquantizedInfinity) { encoder.SetEncodingMethod(draco::POINT_CLOUD_SEQUENTIAL_ENCODING); draco::EncoderBuffer buffer; - ASSERT_TRUE(encoder.EncodePointCloudToBuffer(*pc, &buffer).ok()); + DRACO_ASSERT_OK(encoder.EncodePointCloudToBuffer(*pc, &buffer)); } TEST_F(EncodeTest, TestQuantizedAndUnquantizedAttributes) { @@ -330,7 +329,7 @@ TEST_F(EncodeTest, TestQuantizedAndUnquantizedAttributes) { encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, 11); encoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL, 0); draco::EncoderBuffer buffer; - ASSERT_TRUE(encoder.EncodePointCloudToBuffer(*pc, &buffer).ok()); + DRACO_ASSERT_OK(encoder.EncodePointCloudToBuffer(*pc, &buffer)); } TEST_F(EncodeTest, TestKdTreeEncoding) { @@ -348,7 +347,7 @@ TEST_F(EncodeTest, TestKdTreeEncoding) { // Now set quantization for the position attribute which should make // the encoder happy. encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, 16); - ASSERT_TRUE(encoder.EncodePointCloudToBuffer(*pc, &buffer).ok()); + DRACO_ASSERT_OK(encoder.EncodePointCloudToBuffer(*pc, &buffer)); } TEST_F(EncodeTest, TestTrackingOfNumberOfEncodedEntries) { @@ -373,7 +372,7 @@ TEST_F(EncodeTest, TestTrackingOfNumberOfEncodedEntriesNotSet) { draco::EncoderBuffer buffer; draco::Encoder encoder; - ASSERT_TRUE(encoder.EncodeMeshToBuffer(*mesh, &buffer).ok()); + DRACO_ASSERT_OK(encoder.EncodeMeshToBuffer(*mesh, &buffer)); ASSERT_EQ(encoder.num_encoded_points(), 0); ASSERT_EQ(encoder.num_encoded_faces(), 0); } @@ -404,4 +403,170 @@ TEST_F(EncodeTest, TestNoPosQuantizationNormalCoding) { ASSERT_NE(decoded_mesh, nullptr); } +#ifdef DRACO_TRANSCODER_SUPPORTED +TEST_F(EncodeTest, TestDracoCompressionOptions) { + // This test verifies that we can set the encoder's compression options via + // draco::Mesh's compression options. + const auto mesh = draco::ReadMeshFromTestFile("test_nm.obj"); + ASSERT_NE(mesh, nullptr); + + // First set compression level and quantization manually. + draco::Encoder encoder_manual; + draco::EncoderBuffer buffer_manual; + encoder_manual.SetAttributeQuantization(draco::GeometryAttribute::POSITION, + 8); + encoder_manual.SetAttributeQuantization(draco::GeometryAttribute::NORMAL, 7); + encoder_manual.SetSpeedOptions(4, 4); + + DRACO_ASSERT_OK(encoder_manual.EncodeMeshToBuffer(*mesh, &buffer_manual)); + + // Now do the same with options provided via DracoCompressionOptions. + draco::DracoCompressionOptions compression_options; + compression_options.compression_level = 6; + compression_options.quantization_position.SetQuantizationBits(8); + compression_options.quantization_bits_normal = 7; + mesh->SetCompressionOptions(compression_options); + mesh->SetCompressionEnabled(true); + + draco::Encoder encoder_auto; + draco::EncoderBuffer buffer_auto; + DRACO_ASSERT_OK(encoder_auto.EncodeMeshToBuffer(*mesh, &buffer_auto)); + + // Ensure that both encoders produce the same result. + ASSERT_EQ(buffer_manual.size(), buffer_auto.size()); + + // Now change some of the mesh's compression settings and ensure the + // compression changes as well. + compression_options.compression_level = 7; + mesh->SetCompressionOptions(compression_options); + buffer_auto.Clear(); + DRACO_ASSERT_OK(encoder_auto.EncodeMeshToBuffer(*mesh, &buffer_auto)); + ASSERT_NE(buffer_manual.size(), buffer_auto.size()); + + // Check that |mesh| compression options do not override the encoder options. + mesh->GetCompressionOptions().compression_level = 10; + mesh->GetCompressionOptions().quantization_position.SetQuantizationBits(10); + mesh->GetCompressionOptions().quantization_bits_normal = 10; + draco::EncoderBuffer buffer; + DRACO_ASSERT_OK(encoder_manual.EncodeMeshToBuffer(*mesh, &buffer)); + ASSERT_EQ(buffer.size(), buffer_manual.size()); +} + +TEST_F(EncodeTest, TestDracoCompressionOptionsManualOverride) { + // This test verifies that we can use encoder's option to override compression + // options provided in draco::Mesh's compression options. + const auto mesh = draco::ReadMeshFromTestFile("test_nm.obj"); + ASSERT_NE(mesh, nullptr); + + // Set some compression options. + draco::DracoCompressionOptions compression_options; + compression_options.compression_level = 6; + compression_options.quantization_position.SetQuantizationBits(8); + compression_options.quantization_bits_normal = 7; + mesh->SetCompressionOptions(compression_options); + mesh->SetCompressionEnabled(true); + + draco::Encoder encoder; + draco::EncoderBuffer buffer_no_override; + DRACO_ASSERT_OK(encoder.EncodeMeshToBuffer(*mesh, &buffer_no_override)); + + // Now override some options and ensure the compression is different. + encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, 5); + draco::EncoderBuffer buffer_with_override; + DRACO_ASSERT_OK(encoder.EncodeMeshToBuffer(*mesh, &buffer_with_override)); + ASSERT_LT(buffer_with_override.size(), buffer_no_override.size()); +} + +TEST_F(EncodeTest, TestDracoCompressionOptionsGridQuantization) { + // Test verifies that we can set position quantization via grid spacing. + + // 1x1x1 cube. + const auto mesh = draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + mesh->SetCompressionEnabled(true); + + // Set grid quantization for positions. + draco::DracoCompressionOptions compression_options; + // This should result in 10x10x10 quantization. + compression_options.quantization_position.SetGrid(0.1); + mesh->SetCompressionOptions(compression_options); + + draco::ExpertEncoder encoder(*mesh); + draco::EncoderBuffer buffer; + DRACO_ASSERT_OK(encoder.EncodeToBuffer(&buffer)); + + // The grid options should be reflected in the |encoder|. Check that the + // computed values are correct. + const int pos_att_id = + mesh->GetNamedAttributeId(draco::GeometryAttribute::POSITION); + draco::Vector3f origin; + encoder.options().GetAttributeVector(pos_att_id, "quantization_origin", 3, + &origin[0]); + ASSERT_EQ(origin, draco::Vector3f(0.f, 0.f, 0.f)); + + // We need 4 quantization bits (for 10 values). + ASSERT_EQ( + encoder.options().GetAttributeInt(pos_att_id, "quantization_bits", -1), + 4); + + // The quantization range should be ((1 << quantization_bits) - 1) * spacing. + ASSERT_NEAR(encoder.options().GetAttributeFloat(pos_att_id, + "quantization_range", 0.f), + 15.f * 0.1f, 1e-6f); +} + +TEST_F(EncodeTest, TestDracoCompressionOptionsGridQuantizationWithOffset) { + // Test verifies that we can set position quantization via grid spacing when + // the geometry is not perfectly aligned with the quantization grid. + + // 1x1x1 cube. + const auto mesh = draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + // Move all positions a bit. + auto *pos_att = mesh->attribute( + mesh->GetNamedAttributeId(draco::GeometryAttribute::POSITION)); + for (draco::AttributeValueIndex avi(0); avi < pos_att->size(); ++avi) { + draco::Vector3f pos; + pos_att->GetValue(avi, &pos[0]); + pos = pos + draco::Vector3f(-0.55f, 0.65f, 10.75f); + pos_att->SetAttributeValue(avi, &pos[0]); + } + + mesh->SetCompressionEnabled(true); + + // Set grid quantization for positions. + draco::DracoCompressionOptions compression_options; + // This should result in 16x16x16 quantization if the grid was perfectly + // aligned but since it is not we should expect 17 or 18 values per component. + compression_options.quantization_position.SetGrid(0.0625f); + mesh->SetCompressionOptions(compression_options); + + draco::ExpertEncoder encoder(*mesh); + draco::EncoderBuffer buffer; + DRACO_ASSERT_OK(encoder.EncodeToBuffer(&buffer)); + + // The grid options should be reflected in the |encoder|. Check that the + // computed values are correct. + const int pos_att_id = + mesh->GetNamedAttributeId(draco::GeometryAttribute::POSITION); + draco::Vector3f origin; + encoder.options().GetAttributeVector(pos_att_id, "quantization_origin", 3, + &origin[0]); + // The origin is the first lower value on the quantization grid for each + // component of the mesh. + ASSERT_EQ(origin, draco::Vector3f(-0.5625f, 0.625f, 10.75f)); + + // We need 5 quantization bits (for 17-18 values). + ASSERT_EQ( + encoder.options().GetAttributeInt(pos_att_id, "quantization_bits", -1), + 5); + + // The quantization range should be ((1 << quantization_bits) - 1) * spacing. + ASSERT_NEAR(encoder.options().GetAttributeFloat(pos_att_id, + "quantization_range", 0.f), + 31.f * 0.0625f, 1e-6f); +} +#endif // DRACO_TRANSCODER_SUPPORTED + } // namespace diff --git a/contrib/draco/src/draco/compression/entropy/ans.h b/contrib/draco/src/draco/compression/entropy/ans.h index c71d58975..313546fee 100644 --- a/contrib/draco/src/draco/compression/entropy/ans.h +++ b/contrib/draco/src/draco/compression/entropy/ans.h @@ -391,7 +391,6 @@ class RAnsEncoder { ans_.buf[ans_.buf_offset++] = ans_.state % DRACO_ANS_IO_BASE; ans_.state /= DRACO_ANS_IO_BASE; } - // TODO(ostava): The division and multiplication should be optimized. ans_.state = (ans_.state / p) * rans_precision + ans_.state % p + sym->cum_prob; } diff --git a/contrib/draco/src/draco/compression/entropy/rans_symbol_decoder.h b/contrib/draco/src/draco/compression/entropy/rans_symbol_decoder.h index 10cdc6781..3b408c079 100644 --- a/contrib/draco/src/draco/compression/entropy/rans_symbol_decoder.h +++ b/contrib/draco/src/draco/compression/entropy/rans_symbol_decoder.h @@ -75,6 +75,13 @@ bool RAnsSymbolDecoder::Create( return false; } } + // Check that decoded number of symbols is not unreasonably high. Remaining + // buffer size must be at least |num_symbols| / 64 bytes to contain the + // probability table. The |prob_data| below is one byte but it can be + // theoretically stored for each 64th symbol. + if (num_symbols_ / 64 > buffer->remaining_size()) { + return false; + } probability_table_.resize(num_symbols_); if (num_symbols_ == 0) { return true; diff --git a/contrib/draco/src/draco/compression/entropy/rans_symbol_encoder.h b/contrib/draco/src/draco/compression/entropy/rans_symbol_encoder.h index 4e07ec871..4b738b50a 100644 --- a/contrib/draco/src/draco/compression/entropy/rans_symbol_encoder.h +++ b/contrib/draco/src/draco/compression/entropy/rans_symbol_encoder.h @@ -125,8 +125,8 @@ bool RAnsSymbolEncoder::Create( for (int i = 0; i < num_symbols; ++i) { sorted_probabilities[i] = i; } - std::sort(sorted_probabilities.begin(), sorted_probabilities.end(), - ProbabilityLess(&probability_table_)); + std::stable_sort(sorted_probabilities.begin(), sorted_probabilities.end(), + ProbabilityLess(&probability_table_)); if (total_rans_prob < rans_precision_) { // This happens rather infrequently, just add the extra needed precision // to the most frequent symbol. diff --git a/contrib/draco/src/draco/compression/entropy/symbol_decoding.cc b/contrib/draco/src/draco/compression/entropy/symbol_decoding.cc index 93d29971c..79e811818 100644 --- a/contrib/draco/src/draco/compression/entropy/symbol_decoding.cc +++ b/contrib/draco/src/draco/compression/entropy/symbol_decoding.cc @@ -72,7 +72,7 @@ bool DecodeTaggedSymbols(uint32_t num_values, int num_components, int value_id = 0; for (uint32_t i = 0; i < num_values; i += num_components) { // Decode the tag. - const int bit_length = tag_decoder.DecodeSymbol(); + const uint32_t bit_length = tag_decoder.DecodeSymbol(); // Decode the actual value. for (int j = 0; j < num_components; ++j) { uint32_t val; diff --git a/contrib/draco/src/draco/compression/expert_encode.cc b/contrib/draco/src/draco/compression/expert_encode.cc index f9aec15eb..a3e649193 100644 --- a/contrib/draco/src/draco/compression/expert_encode.cc +++ b/contrib/draco/src/draco/compression/expert_encode.cc @@ -14,6 +14,12 @@ // #include "draco/compression/expert_encode.h" +#include +#include +#include +#include +#include + #include "draco/compression/mesh/mesh_edgebreaker_encoder.h" #include "draco/compression/mesh/mesh_sequential_encoder.h" #ifdef DRACO_POINT_CLOUD_COMPRESSION_SUPPORTED @@ -21,6 +27,9 @@ #include "draco/compression/point_cloud/point_cloud_sequential_encoder.h" #endif +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/bit_utils.h" +#endif namespace draco { ExpertEncoder::ExpertEncoder(const PointCloud &point_cloud) @@ -101,6 +110,11 @@ Status ExpertEncoder::EncodePointCloudToBuffer(const PointCloud &pc, Status ExpertEncoder::EncodeMeshToBuffer(const Mesh &m, EncoderBuffer *out_buffer) { +#ifdef DRACO_TRANSCODER_SUPPORTED + // Apply DracoCompressionOptions associated with the mesh. + DRACO_RETURN_IF_ERROR(ApplyCompressionOptions(m)); +#endif // DRACO_TRANSCODER_SUPPORTED + std::unique_ptr encoder; // Select the encoding method only based on the provided options. int encoding_method = options().GetGlobalInt("encoding_method", -1); @@ -118,6 +132,7 @@ Status ExpertEncoder::EncodeMeshToBuffer(const Mesh &m, encoder = std::unique_ptr(new MeshSequentialEncoder()); } encoder->SetMesh(m); + DRACO_RETURN_IF_ERROR(encoder->Encode(options(), out_buffer)); set_num_encoded_points(encoder->num_encoded_points()); @@ -179,4 +194,107 @@ Status ExpertEncoder::SetAttributePredictionScheme( return status; } +#ifdef DRACO_TRANSCODER_SUPPORTED +Status ExpertEncoder::ApplyCompressionOptions(const Mesh &mesh) { + if (!mesh.IsCompressionEnabled()) { + return OkStatus(); + } + const auto &compression_options = mesh.GetCompressionOptions(); + + // Set any encoder options that haven't been explicitly set by users (don't + // override existing options). + if (!options().IsSpeedSet()) { + options().SetSpeed(10 - compression_options.compression_level, + 10 - compression_options.compression_level); + } + + for (int ai = 0; ai < mesh.num_attributes(); ++ai) { + if (options().IsAttributeOptionSet(ai, "quantization_bits")) { + continue; // Don't override options that have been set. + } + int quantization_bits = 0; + const auto type = mesh.attribute(ai)->attribute_type(); + switch (type) { + case GeometryAttribute::POSITION: + if (compression_options.quantization_position + .AreQuantizationBitsDefined()) { + quantization_bits = + compression_options.quantization_position.quantization_bits(); + } else { + DRACO_RETURN_IF_ERROR(ApplyGridQuantization(mesh, ai)); + } + break; + case GeometryAttribute::TEX_COORD: + quantization_bits = compression_options.quantization_bits_tex_coord; + break; + case GeometryAttribute::NORMAL: + quantization_bits = compression_options.quantization_bits_normal; + break; + case GeometryAttribute::COLOR: + quantization_bits = compression_options.quantization_bits_color; + break; + case GeometryAttribute::TANGENT: + quantization_bits = compression_options.quantization_bits_tangent; + break; + case GeometryAttribute::WEIGHTS: + quantization_bits = compression_options.quantization_bits_weight; + break; + case GeometryAttribute::GENERIC: + quantization_bits = compression_options.quantization_bits_generic; + break; + default: + break; + } + if (quantization_bits > 0) { + options().SetAttributeInt(ai, "quantization_bits", quantization_bits); + } + } + return OkStatus(); +} + +Status ExpertEncoder::ApplyGridQuantization(const Mesh &mesh, + int attribute_index) { + const auto compression_options = mesh.GetCompressionOptions(); + if (mesh.attribute(attribute_index)->num_components() != 3) { + return ErrorStatus( + "Invalid number of components: Grid quantization is currently " + "supported only for 3D positions."); + } + const float spacing = compression_options.quantization_position.spacing(); + // Compute quantization properties based on the grid spacing. + const auto &bbox = mesh.ComputeBoundingBox(); + // Snap min and max points of the |bbox| to the quantization grid vertices. + Vector3f min_pos; + int num_values = 0; // Number of values that we need to encode. + for (int c = 0; c < 3; ++c) { + // Min / max position on grid vertices in grid coordinates. + const float min_grid_pos = floor(bbox.GetMinPoint()[c] / spacing); + const float max_grid_pos = ceil(bbox.GetMaxPoint()[c] / spacing); + + // Min pos on grid vertex in mesh coordinates. + min_pos[c] = min_grid_pos * spacing; + + const float component_num_values = + static_cast(max_grid_pos) - static_cast(min_grid_pos) + 1; + if (component_num_values > num_values) { + num_values = component_num_values; + } + } + // Now compute the number of bits needed to encode |num_values|. + int bits = MostSignificantBit(num_values); + if ((1 << bits) < num_values) { + // If the |num_values| is larger than number of values representable by + // |bits|, we need to use one more bit. This will be almost always true + // unless |num_values| was equal to 1 << |bits|. + bits++; + } + // Compute the range in mesh coordinates that matches the quantization bits. + // Note there are n-1 intervals between the |n| quantization values. + const float range = ((1 << bits) - 1) * spacing; + SetAttributeExplicitQuantization(attribute_index, bits, 3, min_pos.data(), + range); + return OkStatus(); +} +#endif // DRACO_TRANSCODER_SUPPORTED + } // namespace draco diff --git a/contrib/draco/src/draco/compression/expert_encode.h b/contrib/draco/src/draco/compression/expert_encode.h index ea59393d3..5c1485e1e 100644 --- a/contrib/draco/src/draco/compression/expert_encode.h +++ b/contrib/draco/src/draco/compression/expert_encode.h @@ -138,6 +138,12 @@ class ExpertEncoder : public EncoderBase { Status EncodeMeshToBuffer(const Mesh &m, EncoderBuffer *out_buffer); +#ifdef DRACO_TRANSCODER_SUPPORTED + // Applies compression options stored in |mesh|. + Status ApplyCompressionOptions(const Mesh &mesh); + Status ApplyGridQuantization(const Mesh &mesh, int attribute_index); +#endif // DRACO_TRANSCODER_SUPPORTED + const PointCloud *point_cloud_; const Mesh *mesh_; }; diff --git a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_decoder_impl.cc b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_decoder_impl.cc index 0bbbea4af..21ad9959c 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_decoder_impl.cc +++ b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_decoder_impl.cc @@ -454,7 +454,7 @@ bool MeshEdgebreakerDecoderImpl::DecodeConnectivity() { #endif // Decode connectivity of non-position attributes. - if (attribute_data_.size() > 0) { + if (!attribute_data_.empty()) { #ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED if (decoder_->bitstream_version() < DRACO_BITSTREAM_VERSION(2, 1)) { for (CornerIndex ci(0); ci < corner_table_->num_corners(); ci += 3) { @@ -484,7 +484,10 @@ bool MeshEdgebreakerDecoderImpl::DecodeConnectivity() { attribute_data_[i].connectivity_data.AddSeamEdge(CornerIndex(c)); } // Recompute vertices from the newly added seam edges. - attribute_data_[i].connectivity_data.RecomputeVertices(nullptr, nullptr); + if (!attribute_data_[i].connectivity_data.RecomputeVertices(nullptr, + nullptr)) { + return false; + } } pos_encoding_data_.Init(corner_table_->num_vertices()); @@ -574,6 +577,17 @@ int MeshEdgebreakerDecoderImpl::DecodeConnectivity( const CornerIndex corner_b = corner_table_->Next(corner_table_->LeftMostCorner(vertex_x)); + if (corner_a == corner_b) { + // All matched corners must be different. + return -1; + } + if (corner_table_->Opposite(corner_a) != kInvalidCornerIndex || + corner_table_->Opposite(corner_b) != kInvalidCornerIndex) { + // One of the corners is already opposite to an existing face, which + // should not happen unless the input was tampered with. + return -1; + } + // New tip corner. const CornerIndex corner(3 * face.value()); // Update opposite corner mappings. @@ -616,6 +630,11 @@ int MeshEdgebreakerDecoderImpl::DecodeConnectivity( return -1; } const CornerIndex corner_a = active_corner_stack.back(); + if (corner_table_->Opposite(corner_a) != kInvalidCornerIndex) { + // Active corner is already opposite to an existing face, which should + // not happen unless the input was tampered with. + return -1; + } // First corner on the new face is either corner "l" or "r". const CornerIndex corner(3 * face.value()); @@ -681,10 +700,14 @@ int MeshEdgebreakerDecoderImpl::DecodeConnectivity( } const CornerIndex corner_a = active_corner_stack.back(); + if (corner_a == corner_b) { + // All matched corners must be different. + return -1; + } if (corner_table_->Opposite(corner_a) != kInvalidCornerIndex || corner_table_->Opposite(corner_b) != kInvalidCornerIndex) { // One of the corners is already opposite to an existing face, which - // should not happen unless the input was tempered with. + // should not happen unless the input was tampered with. return -1; } @@ -713,9 +736,15 @@ int MeshEdgebreakerDecoderImpl::DecodeConnectivity( // Also update the vertex id at corner "n" and all corners that are // connected to it in the CCW direction. + const CornerIndex first_corner = corner_n; while (corner_n != kInvalidCornerIndex) { corner_table_->MapCornerToVertex(corner_n, vertex_p); corner_n = corner_table_->SwingLeft(corner_n); + if (corner_n == first_corner) { + // We reached the start again which should not happen for split + // symbols. + return -1; + } } // Make sure the old vertex n is now mapped to an invalid corner (make it // isolated). @@ -800,7 +829,7 @@ int MeshEdgebreakerDecoderImpl::DecodeConnectivity( return -1; // Unexpected number of decoded vertices. } // Decode start faces and connect them to the faces from the active stack. - while (active_corner_stack.size() > 0) { + while (!active_corner_stack.empty()) { const CornerIndex corner = active_corner_stack.back(); active_corner_stack.pop_back(); const bool interior_face = @@ -842,6 +871,18 @@ int MeshEdgebreakerDecoderImpl::DecodeConnectivity( const CornerIndex corner_c = corner_table_->Next(corner_table_->LeftMostCorner(vert_x)); + if (corner == corner_b || corner == corner_c || corner_b == corner_c) { + // All matched corners must be different. + return -1; + } + if (corner_table_->Opposite(corner) != kInvalidCornerIndex || + corner_table_->Opposite(corner_b) != kInvalidCornerIndex || + corner_table_->Opposite(corner_c) != kInvalidCornerIndex) { + // One of the corners is already opposite to an existing face, which + // should not happen unless the input was tampered with. + return -1; + } + const VertexIndex vert_p = corner_table_->Vertex(corner_table_->Next(corner_c)); @@ -894,6 +935,11 @@ int MeshEdgebreakerDecoderImpl::DecodeConnectivity( VertexCornersIterator vcit(corner_table_.get(), src_vert); for (; !vcit.End(); ++vcit) { const CornerIndex cid = vcit.Corner(); + if (corner_table_->Vertex(cid) != src_vert) { + // Vertex mapped to |cid| was not |src_vert|. This indicates corrupted + // data and we should terminate the decoding. + return -1; + } corner_table_->MapCornerToVertex(cid, invalid_vert); } corner_table_->SetLeftMostCorner(invalid_vert, diff --git a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder.cc b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder.cc index 5aff5d8cc..a7f381480 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder.cc +++ b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder.cc @@ -31,7 +31,6 @@ bool MeshEdgebreakerEncoder::InitializeEncoder() { impl_ = nullptr; // For tiny meshes it's usually better to use the basic edgebreaker as the // overhead of the predictive one may turn out to be too big. - // TODO(b/111065939): Check if this can be improved. const bool is_tiny_mesh = mesh()->num_faces() < 1000; int selected_edgebreaker_method = diff --git a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.cc b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.cc index 0791dc670..4bf6aa920 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.cc +++ b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.cc @@ -408,7 +408,7 @@ Status MeshEdgebreakerEncoderImpl::EncodeConnectivity() { init_face_connectivity_corners.begin(), init_face_connectivity_corners.end()); // Encode connectivity for all non-position attributes. - if (attribute_data_.size() > 0) { + if (!attribute_data_.empty()) { // Use the same order of corner that will be used by the decoder. visited_faces_.assign(mesh_->num_faces(), false); for (CornerIndex ci : processed_connectivity_corners_) { diff --git a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.h b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.h index fb3377163..979e1d373 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.h +++ b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoder_impl.h @@ -177,7 +177,6 @@ class MeshEdgebreakerEncoderImpl : public MeshEdgebreakerEncoderImplInterface { uint32_t num_split_symbols_; // Struct holding data used for encoding each non-position attribute. - // TODO(ostava): This should be probably renamed to something better. struct AttributeData { AttributeData() : attribute_index(-1), is_connectivity_used(true) {} int attribute_index; diff --git a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoding_test.cc b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoding_test.cc index 831388245..523303b09 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoding_test.cc +++ b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_encoding_test.cc @@ -44,7 +44,7 @@ class MeshEdgebreakerEncodingTest : public ::testing::Test { EncoderOptions encoder_options = EncoderOptions::CreateDefaultOptions(); encoder_options.SetSpeed(10 - compression_level, 10 - compression_level); encoder.SetMesh(*mesh); - ASSERT_TRUE(encoder.Encode(encoder_options, &buffer).ok()); + DRACO_ASSERT_OK(encoder.Encode(encoder_options, &buffer)); DecoderBuffer dec_buffer; dec_buffer.Init(buffer.data(), buffer.size()); @@ -52,15 +52,14 @@ class MeshEdgebreakerEncodingTest : public ::testing::Test { std::unique_ptr decoded_mesh(new Mesh()); DecoderOptions dec_options; - ASSERT_TRUE( - decoder.Decode(dec_options, &dec_buffer, decoded_mesh.get()).ok()); + DRACO_ASSERT_OK( + decoder.Decode(dec_options, &dec_buffer, decoded_mesh.get())); // Cleanup the input mesh to make sure that input and output can be // compared (edgebreaker method discards degenerated triangles and isolated // vertices). const MeshCleanupOptions options; - MeshCleanup cleanup; - ASSERT_TRUE(cleanup(mesh, options)) << "Failed to clean the input mesh."; + DRACO_ASSERT_OK(MeshCleanup::Cleanup(mesh, options)); MeshAreEquivalent eq; ASSERT_TRUE(eq(*mesh, *decoded_mesh.get())) @@ -102,8 +101,8 @@ TEST_F(MeshEdgebreakerEncodingTest, TestEncoderReuse) { EncoderOptions encoder_options = EncoderOptions::CreateDefaultOptions(); encoder.SetMesh(*mesh); EncoderBuffer buffer_0, buffer_1; - ASSERT_TRUE(encoder.Encode(encoder_options, &buffer_0).ok()); - ASSERT_TRUE(encoder.Encode(encoder_options, &buffer_1).ok()); + DRACO_ASSERT_OK(encoder.Encode(encoder_options, &buffer_0)); + DRACO_ASSERT_OK(encoder.Encode(encoder_options, &buffer_1)); // Make sure both buffer are identical. ASSERT_EQ(buffer_0.size(), buffer_1.size()); @@ -123,7 +122,7 @@ TEST_F(MeshEdgebreakerEncodingTest, TestDecoderReuse) { EncoderOptions encoder_options = EncoderOptions::CreateDefaultOptions(); encoder.SetMesh(*mesh); EncoderBuffer buffer; - ASSERT_TRUE(encoder.Encode(encoder_options, &buffer).ok()); + DRACO_ASSERT_OK(encoder.Encode(encoder_options, &buffer)); DecoderBuffer dec_buffer; dec_buffer.Init(buffer.data(), buffer.size()); @@ -133,13 +132,13 @@ TEST_F(MeshEdgebreakerEncodingTest, TestDecoderReuse) { // Decode the mesh two times. std::unique_ptr decoded_mesh_0(new Mesh()); DecoderOptions dec_options; - ASSERT_TRUE( - decoder.Decode(dec_options, &dec_buffer, decoded_mesh_0.get()).ok()); + DRACO_ASSERT_OK( + decoder.Decode(dec_options, &dec_buffer, decoded_mesh_0.get())); dec_buffer.Init(buffer.data(), buffer.size()); std::unique_ptr decoded_mesh_1(new Mesh()); - ASSERT_TRUE( - decoder.Decode(dec_options, &dec_buffer, decoded_mesh_1.get()).ok()); + DRACO_ASSERT_OK( + decoder.Decode(dec_options, &dec_buffer, decoded_mesh_1.get())); // Make sure both of the meshes are identical. MeshAreEquivalent eq; @@ -169,7 +168,7 @@ TEST_F(MeshEdgebreakerEncodingTest, TestSingleConnectivityEncoding) { encoder.SetAttributeQuantization(GeometryAttribute::TEX_COORD, 8); encoder.SetAttributeQuantization(GeometryAttribute::NORMAL, 8); encoder.SetEncodingMethod(MESH_EDGEBREAKER_ENCODING); - ASSERT_TRUE(encoder.EncodeMeshToBuffer(*mesh, &buffer).ok()); + DRACO_ASSERT_OK(encoder.EncodeMeshToBuffer(*mesh, &buffer)); DecoderBuffer dec_buffer; dec_buffer.Init(buffer.data(), buffer.size()); @@ -216,7 +215,7 @@ TEST_F(MeshEdgebreakerEncodingTest, TestWrongAttributeOrder) { encoder.SetAttributeQuantization(GeometryAttribute::POSITION, 8); encoder.SetAttributeQuantization(GeometryAttribute::NORMAL, 8); encoder.SetEncodingMethod(MESH_EDGEBREAKER_ENCODING); - ASSERT_TRUE(encoder.EncodeMeshToBuffer(*mesh, &buffer).ok()); + DRACO_ASSERT_OK(encoder.EncodeMeshToBuffer(*mesh, &buffer)); DecoderBuffer dec_buffer; dec_buffer.Init(buffer.data(), buffer.size()); diff --git a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_shared.h b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_shared.h index cb3c29dd6..c650bc352 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_shared.h +++ b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_shared.h @@ -50,8 +50,6 @@ namespace draco { // \ / S \ / / E \ // *-------* *-------* // -// TODO(ostava): Get rid of the topology bit pattern. It's important only for -// encoding but the algorithms should use EdgebreakerSymbol instead. enum EdgebreakerTopologyBitPattern { TOPOLOGY_C = 0x0, // 0 TOPOLOGY_S = 0x1, // 1 0 0 diff --git a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_traversal_valence_decoder.h b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_traversal_valence_decoder.h index c00373727..89553e909 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_traversal_valence_decoder.h +++ b/contrib/draco/src/draco/compression/mesh/mesh_edgebreaker_traversal_valence_decoder.h @@ -129,7 +129,11 @@ class MeshEdgebreakerTraversalValenceDecoder if (context_counter < 0) { return TOPOLOGY_INVALID; } - const int symbol_id = context_symbols_[active_context_][context_counter]; + const uint32_t symbol_id = + context_symbols_[active_context_][context_counter]; + if (symbol_id > 4) { + return TOPOLOGY_INVALID; + } last_symbol_ = edge_breaker_symbol_to_topology_id[symbol_id]; } else { #ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED diff --git a/contrib/draco/src/draco/compression/mesh/mesh_encoder_test.cc b/contrib/draco/src/draco/compression/mesh/mesh_encoder_test.cc index 55f683696..2dfdb58ef 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_encoder_test.cc +++ b/contrib/draco/src/draco/compression/mesh/mesh_encoder_test.cc @@ -78,9 +78,10 @@ class MeshEncoderTest : public ::testing::TestWithParam { encoder.SetAttributeQuantization(i, 12); } EncoderBuffer buffer; - ASSERT_TRUE(encoder.EncodeToBuffer(&buffer).ok()) - << "Failed encoding test mesh " << file_name << " with method " - << GetParam().encoding_method; + const Status status = encoder.EncodeToBuffer(&buffer); + EXPECT_TRUE(status.ok()) << "Failed encoding test mesh " << file_name + << " with method " << GetParam().encoding_method; + DRACO_ASSERT_OK(status); // Check that the encoded mesh was really encoded with the selected method. DecoderBuffer decoder_buffer; decoder_buffer.Init(buffer.data(), buffer.size()); @@ -88,6 +89,7 @@ class MeshEncoderTest : public ::testing::TestWithParam { uint8_t encoded_method; ASSERT_TRUE(decoder_buffer.Decode(&encoded_method)); ASSERT_EQ(encoded_method, method); + if (!FLAGS_update_golden_files) { EXPECT_TRUE( CompareGoldenFile(golden_file_name, buffer.data(), buffer.size())) diff --git a/contrib/draco/src/draco/compression/mesh/mesh_sequential_decoder.cc b/contrib/draco/src/draco/compression/mesh/mesh_sequential_decoder.cc index be349f543..595a487a4 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_sequential_decoder.cc +++ b/contrib/draco/src/draco/compression/mesh/mesh_sequential_decoder.cc @@ -96,7 +96,7 @@ bool MeshSequentialDecoder::DecodeConnectivity() { } mesh()->AddFace(face); } - } else if (mesh()->num_points() < (1 << 21) && + } else if (num_points < (1 << 21) && bitstream_version() >= DRACO_BITSTREAM_VERSION(2, 2)) { // Decode indices as uint32_t. for (uint32_t i = 0; i < num_faces; ++i) { @@ -158,6 +158,10 @@ bool MeshSequentialDecoder::DecodeAndDecompressIndices(uint32_t num_faces) { index_diff = -index_diff; } const int32_t index_value = index_diff + last_index_value; + if (index_value < 0) { + // Negative indices are not allowed. + return false; + } face[j] = index_value; last_index_value = index_value; } diff --git a/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.cc b/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.cc index 02ac7779e..fd8b11392 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.cc +++ b/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.cc @@ -32,8 +32,6 @@ Status MeshSequentialEncoder::EncodeConnectivity() { EncodeVarint(static_cast(mesh()->num_points()), buffer()); // We encode all attributes in the original (possibly duplicated) format. - // TODO(ostava): This may not be optimal if we have only one attribute or if - // all attributes share the same index mapping. if (options()->GetGlobalBool("compress_connectivity", false)) { // 0 = Encode compressed indices. buffer()->Encode(static_cast(0)); @@ -44,8 +42,6 @@ Status MeshSequentialEncoder::EncodeConnectivity() { // 1 = Encode indices directly. buffer()->Encode(static_cast(1)); // Store vertex indices using a smallest data type that fits their range. - // TODO(ostava): This can be potentially improved by using a tighter - // fit that is not bound by a bit-length of any particular data type. if (mesh()->num_points() < 256) { // Serialize indices as uint8_t. for (FaceIndex i(0); i < num_faces; ++i) { diff --git a/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.h b/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.h index 672609642..6e2b05877 100644 --- a/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.h +++ b/contrib/draco/src/draco/compression/mesh/mesh_sequential_encoder.h @@ -33,7 +33,6 @@ namespace draco { // Class that encodes mesh data using a simple binary representation of mesh's // connectivity and geometry. -// TODO(ostava): Use a better name. class MeshSequentialEncoder : public MeshEncoder { public: MeshSequentialEncoder(); diff --git a/contrib/draco/src/draco/compression/mesh/traverser/mesh_attribute_indices_encoding_observer.h b/contrib/draco/src/draco/compression/mesh/traverser/mesh_attribute_indices_encoding_observer.h index e66dd14b2..dd9738ba2 100644 --- a/contrib/draco/src/draco/compression/mesh/traverser/mesh_attribute_indices_encoding_observer.h +++ b/contrib/draco/src/draco/compression/mesh/traverser/mesh_attribute_indices_encoding_observer.h @@ -25,7 +25,7 @@ namespace draco { // values based on the traversal of the encoded mesh. The class should be used // as the TraversalObserverT member of a Traverser class such as the // DepthFirstTraverser (depth_first_traverser.h). -// TODO(hemmer): rename to AttributeIndicesCodingTraverserObserver +// TODO(b/199760123): Rename to AttributeIndicesCodingTraverserObserver. template class MeshAttributeIndicesEncodingObserver { public: diff --git a/contrib/draco/src/draco/compression/mesh/traverser/mesh_traversal_sequencer.h b/contrib/draco/src/draco/compression/mesh/traverser/mesh_traversal_sequencer.h index ebe1d5f7a..e55c93a79 100644 --- a/contrib/draco/src/draco/compression/mesh/traverser/mesh_traversal_sequencer.h +++ b/contrib/draco/src/draco/compression/mesh/traverser/mesh_traversal_sequencer.h @@ -25,7 +25,7 @@ namespace draco { // Sequencer that generates point sequence in an order given by a deterministic // traversal on the mesh surface. Note that all attributes encoded with this // sequence must share the same connectivity. -// TODO(hemmer): Consider refactoring such that this is an observer. +// TODO(b/199760123): Consider refactoring such that this is an observer. template class MeshTraversalSequencer : public PointsSequencer { public: diff --git a/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_decoder.h b/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_decoder.h index 87bc2b7ef..55bafe7c4 100644 --- a/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_decoder.h +++ b/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_decoder.h @@ -18,8 +18,10 @@ #define DRACO_COMPRESSION_POINT_CLOUD_ALGORITHMS_DYNAMIC_INTEGER_POINTS_KD_TREE_DECODER_H_ #include +#include #include #include +#include #include "draco/compression/bit_coders/adaptive_rans_bit_decoder.h" #include "draco/compression/bit_coders/direct_bit_decoder.h" @@ -92,17 +94,29 @@ class DynamicIntegerPointsKdTreeDecoder { base_stack_(32 * dimension + 1, VectorUint32(dimension, 0)), levels_stack_(32 * dimension + 1, VectorUint32(dimension, 0)) {} - // Decodes a integer point cloud from |buffer|. + // Decodes an integer point cloud from |buffer|. Optional |oit_max_points| can + // be used to tell the decoder the maximum number of points accepted by the + // iterator. template bool DecodePoints(DecoderBuffer *buffer, OutputIteratorT &oit); + template + bool DecodePoints(DecoderBuffer *buffer, OutputIteratorT &oit, + uint32_t oit_max_points); + #ifndef DRACO_OLD_GCC template bool DecodePoints(DecoderBuffer *buffer, OutputIteratorT &&oit); + template + bool DecodePoints(DecoderBuffer *buffer, OutputIteratorT &&oit, + uint32_t oit_max_points); #endif // DRACO_OLD_GCC const uint32_t dimension() const { return dimension_; } + // Returns the number of decoded points. Must be called after DecodePoints(). + uint32_t num_decoded_points() const { return num_decoded_points_; } + private: uint32_t GetAxis(uint32_t num_remaining_points, const VectorUint32 &levels, uint32_t last_axis); @@ -146,8 +160,15 @@ template template bool DynamicIntegerPointsKdTreeDecoder::DecodePoints( DecoderBuffer *buffer, OutputIteratorT &&oit) { + return DecodePoints(buffer, oit, std::numeric_limits::max()); +} + +template +template +bool DynamicIntegerPointsKdTreeDecoder::DecodePoints( + DecoderBuffer *buffer, OutputIteratorT &&oit, uint32_t oit_max_points) { OutputIteratorT local = std::forward(oit); - return DecodePoints(buffer, local); + return DecodePoints(buffer, local, oit_max_points); } #endif // DRACO_OLD_GCC @@ -155,6 +176,13 @@ template template bool DynamicIntegerPointsKdTreeDecoder::DecodePoints( DecoderBuffer *buffer, OutputIteratorT &oit) { + return DecodePoints(buffer, oit, std::numeric_limits::max()); +} + +template +template +bool DynamicIntegerPointsKdTreeDecoder::DecodePoints( + DecoderBuffer *buffer, OutputIteratorT &oit, uint32_t oit_max_points) { if (!buffer->Decode(&bit_length_)) { return false; } @@ -167,6 +195,9 @@ bool DynamicIntegerPointsKdTreeDecoder::DecodePoints( if (num_points_ == 0) { return true; } + if (num_points_ > oit_max_points) { + return false; + } num_decoded_points_ = 0; if (!numbers_decoder_.StartDecoding(buffer)) { @@ -227,7 +258,7 @@ bool DynamicIntegerPointsKdTreeDecoder::DecodeInternal( std::stack status_stack; status_stack.push(init_status); - // TODO(hemmer): use preallocated vector instead of stack. + // TODO(b/199760123): Use preallocated vector instead of stack. while (!status_stack.empty()) { const DecodingStatus status = status_stack.top(); status_stack.pop(); @@ -263,7 +294,8 @@ bool DynamicIntegerPointsKdTreeDecoder::DecodeInternal( // Fast decoding of remaining bits if number of points is 1 or 2. if (num_remaining_points <= 2) { - // TODO(hemmer): axes_ not necessary, remove would change bitstream! + // TODO(b/199760123): |axes_| not necessary, remove would change + // bitstream! axes_[0] = axis; for (uint32_t i = 1; i < dimension_; i++) { axes_[i] = DRACO_INCREMENT_MOD(axes_[i - 1], dimension_); @@ -273,8 +305,10 @@ bool DynamicIntegerPointsKdTreeDecoder::DecodeInternal( p_[axes_[j]] = 0; const uint32_t num_remaining_bits = bit_length_ - levels[axes_[j]]; if (num_remaining_bits) { - remaining_bits_decoder_.DecodeLeastSignificantBits32( - num_remaining_bits, &p_[axes_[j]]); + if (!remaining_bits_decoder_.DecodeLeastSignificantBits32( + num_remaining_bits, &p_[axes_[j]])) { + return false; + } } p_[axes_[j]] = old_base[axes_[j]] | p_[axes_[j]]; } @@ -299,7 +333,12 @@ bool DynamicIntegerPointsKdTreeDecoder::DecodeInternal( uint32_t number = 0; DecodeNumber(incoming_bits, &number); - uint32_t first_half = num_remaining_points / 2 - number; + uint32_t first_half = num_remaining_points / 2; + if (first_half < number) { + // Invalid |number|. + return false; + } + first_half -= number; uint32_t second_half = num_remaining_points - first_half; if (first_half != second_half) { diff --git a/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_encoder.h b/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_encoder.h index 14fa32d70..65b3d07a6 100644 --- a/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_encoder.h +++ b/contrib/draco/src/draco/compression/point_cloud/algorithms/dynamic_integer_points_kd_tree_encoder.h @@ -280,7 +280,7 @@ void DynamicIntegerPointsKdTreeEncoder::EncodeInternal( std::stack status_stack; status_stack.push(init_status); - // TODO(hemmer): use preallocated vector instead of stack. + // TODO(b/199760123): Use preallocated vector instead of stack. while (!status_stack.empty()) { Status status = status_stack.top(); status_stack.pop(); @@ -305,7 +305,8 @@ void DynamicIntegerPointsKdTreeEncoder::EncodeInternal( // Fast encoding of remaining bits if number of points is 1 or 2. // Doing this also for 2 gives a slight additional speed up. if (num_remaining_points <= 2) { - // TODO(hemmer): axes_ not necessary, remove would change bitstream! + // TODO(b/199760123): |axes_| not necessary, remove would change + // bitstream! axes_[0] = axis; for (uint32_t i = 1; i < dimension_; i++) { axes_[i] = DRACO_INCREMENT_MOD(axes_[i - 1], dimension_); diff --git a/contrib/draco/src/draco/compression/point_cloud/algorithms/float_points_tree_encoder.h b/contrib/draco/src/draco/compression/point_cloud/algorithms/float_points_tree_encoder.h index 26ba94f1f..44c1b3d3a 100644 --- a/contrib/draco/src/draco/compression/point_cloud/algorithms/float_points_tree_encoder.h +++ b/contrib/draco/src/draco/compression/point_cloud/algorithms/float_points_tree_encoder.h @@ -44,7 +44,7 @@ namespace draco { // there are more leading zeros, which is then compressed better by the // arithmetic encoding. -// TODO(hemmer): Remove class because it duplicates quantization code. +// TODO(b/199760123): Remove class because it duplicates quantization code. class FloatPointsTreeEncoder { public: explicit FloatPointsTreeEncoder(PointCloudCompressionMethod method); @@ -91,7 +91,7 @@ bool FloatPointsTreeEncoder::EncodePointCloud(InputIteratorT points_begin, // Collect necessary data for encoding. num_points_ = std::distance(points_begin, points_end); - // TODO(hemmer): Extend quantization tools to make this more automatic. + // TODO(b/199760123): Extend quantization tools to make this more automatic. // Compute range of points for quantization std::vector qpoints; qpoints.reserve(num_points_); diff --git a/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_decoder.h b/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_decoder.h index 94e523cad..bc31af586 100644 --- a/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_decoder.h +++ b/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_decoder.h @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// TODO(hemmer): Make this a wrapper using DynamicIntegerPointsKdTreeDecoder. +// TODO(b/199760123): Make this a wrapper using +// DynamicIntegerPointsKdTreeDecoder. // // See integer_points_kd_tree_encoder.h for documentation. diff --git a/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_encoder.h b/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_encoder.h index b8811092e..654f14a78 100644 --- a/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_encoder.h +++ b/contrib/draco/src/draco/compression/point_cloud/algorithms/integer_points_kd_tree_encoder.h @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// TODO(hemmer): Make this a wrapper using DynamicIntegerPointsKdTreeEncoder. +// TODO(b/199760123): Make this a wrapper using +// DynamicIntegerPointsKdTreeEncoder. #ifndef DRACO_COMPRESSION_POINT_CLOUD_ALGORITHMS_INTEGER_POINTS_KD_TREE_ENCODER_H_ #define DRACO_COMPRESSION_POINT_CLOUD_ALGORITHMS_INTEGER_POINTS_KD_TREE_ENCODER_H_ diff --git a/contrib/draco/src/draco/compression/point_cloud/algorithms/quantize_points_3.h b/contrib/draco/src/draco/compression/point_cloud/algorithms/quantize_points_3.h index 01943ad9e..8ea0741da 100644 --- a/contrib/draco/src/draco/compression/point_cloud/algorithms/quantize_points_3.h +++ b/contrib/draco/src/draco/compression/point_cloud/algorithms/quantize_points_3.h @@ -22,7 +22,7 @@ namespace draco { -// TODO(hemmer): Make this a stable bounding box. +// TODO(b/199760123): Make this a stable bounding box. struct QuantizationInfo { uint32_t quantization_bits; float range; @@ -41,7 +41,7 @@ OutputIterator QuantizePoints3(const PointIterator &begin, max_range = std::max(std::fabs((*it)[2]), max_range); } - const uint32_t max_quantized_value((1 << info->quantization_bits) - 1); + const uint32_t max_quantized_value((1u << info->quantization_bits) - 1); Quantizer quantize; quantize.Init(max_range, max_quantized_value); info->range = max_range; @@ -66,7 +66,7 @@ void DequantizePoints3(const QPointIterator &begin, const QPointIterator &end, const uint32_t quantization_bits = info.quantization_bits; const float range = info.range; - const uint32_t max_quantized_value((1 << quantization_bits) - 1); + const uint32_t max_quantized_value((1u << quantization_bits) - 1); Dequantizer dequantize; dequantize.Init(range, max_quantized_value); diff --git a/contrib/draco/src/draco/compression/point_cloud/point_cloud_kd_tree_encoding_test.cc b/contrib/draco/src/draco/compression/point_cloud/point_cloud_kd_tree_encoding_test.cc index 2249bb09e..7a7b597f2 100644 --- a/contrib/draco/src/draco/compression/point_cloud/point_cloud_kd_tree_encoding_test.cc +++ b/contrib/draco/src/draco/compression/point_cloud/point_cloud_kd_tree_encoding_test.cc @@ -68,7 +68,7 @@ class PointCloudKdTreeEncodingTest : public ::testing::Test { ++compression_level) { options.SetSpeed(10 - compression_level, 10 - compression_level); encoder.SetPointCloud(pc); - ASSERT_TRUE(encoder.Encode(options, &buffer).ok()); + DRACO_ASSERT_OK(encoder.Encode(options, &buffer)); DecoderBuffer dec_buffer; dec_buffer.Init(buffer.data(), buffer.size()); @@ -76,7 +76,7 @@ class PointCloudKdTreeEncodingTest : public ::testing::Test { std::unique_ptr out_pc(new PointCloud()); DecoderOptions dec_options; - ASSERT_TRUE(decoder.Decode(dec_options, &dec_buffer, out_pc.get()).ok()); + DRACO_ASSERT_OK(decoder.Decode(dec_options, &dec_buffer, out_pc.get())); ComparePointClouds(pc, *out_pc); } diff --git a/contrib/draco/src/draco/core/bounding_box.cc b/contrib/draco/src/draco/core/bounding_box.cc index 8a0709678..8acd6687b 100644 --- a/contrib/draco/src/draco/core/bounding_box.cc +++ b/contrib/draco/src/draco/core/bounding_box.cc @@ -20,11 +20,20 @@ BoundingBox::BoundingBox() : BoundingBox(Vector3f(std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()), - Vector3f(-std::numeric_limits::max(), - -std::numeric_limits::max(), - -std::numeric_limits::max())) {} + Vector3f(std::numeric_limits::lowest(), + std::numeric_limits::lowest(), + std::numeric_limits::lowest())) {} BoundingBox::BoundingBox(const Vector3f &min_point, const Vector3f &max_point) : min_point_(min_point), max_point_(max_point) {} +const bool BoundingBox::IsValid() const { + return GetMinPoint()[0] != std::numeric_limits::max() && + GetMinPoint()[1] != std::numeric_limits::max() && + GetMinPoint()[2] != std::numeric_limits::max() && + GetMaxPoint()[0] != std::numeric_limits::lowest() && + GetMaxPoint()[1] != std::numeric_limits::lowest() && + GetMaxPoint()[2] != std::numeric_limits::lowest(); +} + } // namespace draco diff --git a/contrib/draco/src/draco/core/bounding_box.h b/contrib/draco/src/draco/core/bounding_box.h index 31ba2d683..697a73b6f 100644 --- a/contrib/draco/src/draco/core/bounding_box.h +++ b/contrib/draco/src/draco/core/bounding_box.h @@ -38,6 +38,11 @@ class BoundingBox { // Returns the maximum point of the bounding box. inline const Vector3f &GetMaxPoint() const { return max_point_; } + // Checks if the bounding box object was created with the default constructor + // then never updated. Internally, checks if the bounding box minimum and + // maximum points hold the largest positive and smallest negative values. + const bool IsValid() const; + // Conditionally updates the bounding box with a given |new_point|. void Update(const Vector3f &new_point) { for (int i = 0; i < 3; i++) { diff --git a/contrib/draco/src/draco/core/constants.h b/contrib/draco/src/draco/core/constants.h new file mode 100644 index 000000000..3e81992a1 --- /dev/null +++ b/contrib/draco/src/draco/core/constants.h @@ -0,0 +1,6 @@ +#ifndef DRACO_CORE_CONSTANTS_H_ +#define DRACO_CORE_CONSTANTS_H_ + +#define DRACO_PI 3.14159265358979323846 + +#endif // DRACO_CORE_CONSTANTS_H_ diff --git a/contrib/draco/src/draco/core/data_buffer.cc b/contrib/draco/src/draco/core/data_buffer.cc index f0b43d67d..96a378798 100644 --- a/contrib/draco/src/draco/core/data_buffer.cc +++ b/contrib/draco/src/draco/core/data_buffer.cc @@ -52,7 +52,7 @@ void DataBuffer::Resize(int64_t size) { } void DataBuffer::WriteDataToStream(std::ostream &stream) { - if (data_.size() == 0) { + if (data_.empty()) { return; } stream.write(reinterpret_cast(data_.data()), data_.size()); diff --git a/contrib/draco/src/draco/core/data_buffer.h b/contrib/draco/src/draco/core/data_buffer.h index 8ee690540..8eac0f6b4 100644 --- a/contrib/draco/src/draco/core/data_buffer.h +++ b/contrib/draco/src/draco/core/data_buffer.h @@ -67,7 +67,7 @@ class DataBuffer { int64_t update_count() const { return descriptor_.buffer_update_count; } size_t data_size() const { return data_.size(); } const uint8_t *data() const { return data_.data(); } - uint8_t *data() { return &data_[0]; } + uint8_t *data() { return data_.data(); } int64_t buffer_id() const { return descriptor_.buffer_id; } void set_buffer_id(int64_t buffer_id) { descriptor_.buffer_id = buffer_id; } diff --git a/contrib/draco/src/draco/core/decoder_buffer.h b/contrib/draco/src/draco/core/decoder_buffer.h index 0559abbe4..71189b7e7 100644 --- a/contrib/draco/src/draco/core/decoder_buffer.h +++ b/contrib/draco/src/draco/core/decoder_buffer.h @@ -54,12 +54,11 @@ class DecoderBuffer { // Decodes up to 32 bits into out_val. Can be called only in between // StartBitDecoding and EndBitDecoding. Otherwise returns false. - bool DecodeLeastSignificantBits32(int nbits, uint32_t *out_value) { + bool DecodeLeastSignificantBits32(uint32_t nbits, uint32_t *out_value) { if (!bit_decoder_active()) { return false; } - bit_decoder_.GetBits(nbits, out_value); - return true; + return bit_decoder_.GetBits(nbits, out_value); } // Decodes an arbitrary data type. @@ -158,11 +157,12 @@ class DecoderBuffer { inline void ConsumeBits(int k) { bit_offset_ += k; } // Returns |nbits| bits in |x|. - inline bool GetBits(int32_t nbits, uint32_t *x) { - DRACO_DCHECK_GE(nbits, 0); - DRACO_DCHECK_LE(nbits, 32); + inline bool GetBits(uint32_t nbits, uint32_t *x) { + if (nbits > 32) { + return false; + } uint32_t value = 0; - for (int32_t bit = 0; bit < nbits; ++bit) { + for (uint32_t bit = 0; bit < nbits; ++bit) { value |= GetBit() << bit; } *x = value; diff --git a/contrib/draco/src/draco/core/draco_index_type_vector.h b/contrib/draco/src/draco/core/draco_index_type_vector.h index aae1e7aaf..f5256ded9 100644 --- a/contrib/draco/src/draco/core/draco_index_type_vector.h +++ b/contrib/draco/src/draco/core/draco_index_type_vector.h @@ -25,25 +25,32 @@ namespace draco { // A wrapper around the standard std::vector that supports indexing of the // vector entries using the strongly typed indices as defined in -// draco_index_type.h . -// TODO(ostava): Make the interface more complete. It's currently missing -// features such as iterators. -// TODO(vytyaz): Add more unit tests for this class. +// draco_index_type.h. +// TODO(ostava): Make the interface more complete. It's currently missing some +// features. template class IndexTypeVector { public: typedef typename std::vector::const_reference const_reference; typedef typename std::vector::reference reference; + typedef typename std::vector::iterator iterator; + typedef typename std::vector::const_iterator const_iterator; IndexTypeVector() {} explicit IndexTypeVector(size_t size) : vector_(size) {} IndexTypeVector(size_t size, const ValueTypeT &val) : vector_(size, val) {} + iterator begin() { return vector_.begin(); } + const_iterator begin() const { return vector_.begin(); } + iterator end() { return vector_.end(); } + const_iterator end() const { return vector_.end(); } + void clear() { vector_.clear(); } void reserve(size_t size) { vector_.reserve(size); } void resize(size_t size) { vector_.resize(size); } void resize(size_t size, const ValueTypeT &val) { vector_.resize(size, val); } void assign(size_t size, const ValueTypeT &val) { vector_.assign(size, val); } + iterator erase(iterator position) { return vector_.erase(position); } void swap(IndexTypeVector &arg) { vector_.swap(arg.vector_); diff --git a/contrib/draco/src/draco/core/draco_test_utils.cc b/contrib/draco/src/draco/core/draco_test_utils.cc index edca9856d..a71082a86 100644 --- a/contrib/draco/src/draco/core/draco_test_utils.cc +++ b/contrib/draco/src/draco/core/draco_test_utils.cc @@ -16,9 +16,9 @@ #include +#include "draco/core/draco_test_base.h" #include "draco/core/macros.h" #include "draco/io/file_utils.h" -#include "draco_test_base.h" namespace draco { @@ -27,6 +27,8 @@ static constexpr char kTestDataDir[] = DRACO_TEST_DATA_DIR; static constexpr char kTestTempDir[] = DRACO_TEST_TEMP_DIR; } // namespace +std::string GetTestTempDir() { return std::string(kTestDataDir); } + std::string GetTestFileFullPath(const std::string &file_name) { return std::string(kTestDataDir) + std::string("/") + file_name; } @@ -55,11 +57,13 @@ bool CompareGoldenFile(const std::string &golden_file_name, const void *data, size_t remaining_data_size = data_size; int offset = 0; while ((extracted_size = in_file.read(buffer, buffer_size).gcount()) > 0) { - if (remaining_data_size <= 0) + if (remaining_data_size <= 0) { break; // Input and golden sizes are different. + } size_t size_to_check = extracted_size; - if (remaining_data_size < size_to_check) + if (remaining_data_size < size_to_check) { size_to_check = remaining_data_size; + } for (uint32_t i = 0; i < size_to_check; ++i) { if (buffer[i] != data_c8[offset++]) { LOG(INFO) << "Test output differed from golden file at byte " @@ -77,4 +81,20 @@ bool CompareGoldenFile(const std::string &golden_file_name, const void *data, return true; } +#ifdef DRACO_TRANSCODER_SUPPORTED + +template <> +std::unique_ptr ReadGeometryFromTestFile( + const std::string &file_name) { + return ReadMeshFromTestFile(file_name); +} + +template <> +std::unique_ptr ReadGeometryFromTestFile( + const std::string &file_name) { + return ReadSceneFromTestFile(file_name); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + } // namespace draco diff --git a/contrib/draco/src/draco/core/draco_test_utils.h b/contrib/draco/src/draco/core/draco_test_utils.h index fa548f52d..658096fe1 100644 --- a/contrib/draco/src/draco/core/draco_test_utils.h +++ b/contrib/draco/src/draco/core/draco_test_utils.h @@ -15,12 +15,24 @@ #ifndef DRACO_CORE_DRACO_TEST_UTILS_H_ #define DRACO_CORE_DRACO_TEST_UTILS_H_ +#include +#include +#include + #include "draco/core/draco_test_base.h" +#include "draco/draco_features.h" #include "draco/io/mesh_io.h" #include "draco/io/point_cloud_io.h" +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/io/scene_io.h" +#endif + namespace draco { +// Returns test temporary directory. +std::string GetTestTempDir(); + // Returns the full path to a given file system entry, such as test file or test // directory. std::string GetTestFileFullPath(const std::string &entry_name); @@ -65,6 +77,47 @@ inline std::unique_ptr ReadPointCloudFromTestFile( return ReadPointCloudFromFile(path).value(); } +#ifdef DRACO_TRANSCODER_SUPPORTED +inline std::unique_ptr ReadSceneFromTestFile( + const std::string &file_name) { + const std::string path = GetTestFileFullPath(file_name); + return ReadSceneFromFile(path).value(); +} + +// Loads geometry specified by a |file_name| that is going to be automatically +// converted to the correct path available to the testing instance. Supported +// geometry types are Mesh and Scene. +template +std::unique_ptr ReadGeometryFromTestFile(const std::string &file_name); + +#endif // DRACO_TRANSCODER_SUPPORTED + +// Utility class for redirection and capture of stderr/stdout. +class CaptureStream { + public: + explicit CaptureStream(std::ostream &stream) + : old_buffer_(stream.rdbuf(buffer_.rdbuf())), stream_(stream) {} + + ~CaptureStream() { Reset(); } + + std::string GetStringAndRelease() { + Reset(); + return buffer_.str(); + } + + void Reset() { + if (old_buffer_) { + stream_.rdbuf(old_buffer_); + old_buffer_ = nullptr; + } + } + + private: + std::ostringstream buffer_; + std::streambuf *old_buffer_ = nullptr; + std::ostream &stream_; +}; + // Evaluates an expression that returns draco::Status. If the status is not OK, // the macro asserts and logs the error message. #define DRACO_ASSERT_OK(expression) \ diff --git a/contrib/draco/src/draco/core/draco_version.h b/contrib/draco/src/draco/core/draco_version.h index 14a504a50..88856447f 100644 --- a/contrib/draco/src/draco/core/draco_version.h +++ b/contrib/draco/src/draco/core/draco_version.h @@ -18,9 +18,7 @@ namespace draco { // Draco version is comprised of ... -static const char kDracoVersion[] = "1.4.1"; - -const char *Version() { return kDracoVersion; } +static const char kDracoVersion[] = "1.5.6"; } // namespace draco diff --git a/contrib/draco/src/draco/core/macros.h b/contrib/draco/src/draco/core/macros.h index 147bbaafc..a31e7c44b 100644 --- a/contrib/draco/src/draco/core/macros.h +++ b/contrib/draco/src/draco/core/macros.h @@ -15,7 +15,8 @@ #ifndef DRACO_CORE_MACROS_H_ #define DRACO_CORE_MACROS_H_ -#include "assert.h" +#include + #include "draco/draco_features.h" #ifdef ANDROID_LOGGING @@ -37,7 +38,7 @@ namespace draco { #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName &) = delete; \ void operator=(const TypeName &) = delete; -#endif +#endif // DISALLOW_COPY_AND_ASSIGN #ifndef FALLTHROUGH_INTENDED #if defined(__clang__) && defined(__has_warning) @@ -46,7 +47,7 @@ namespace draco { #endif #elif defined(__GNUC__) && __GNUC__ >= 7 #define FALLTHROUGH_INTENDED [[gnu::fallthrough]] -#endif +#endif // FALLTHROUGH_INTENDED // If FALLTHROUGH_INTENDED is still not defined, define it. #ifndef FALLTHROUGH_INTENDED @@ -54,7 +55,7 @@ namespace draco { do { \ } while (0) #endif -#endif +#endif // FALLTHROUGH_INTENDED #ifndef LOG #define LOG(...) std::cout @@ -84,12 +85,16 @@ namespace draco { #define DRACO_DCHECK_LE(a, b) #define DRACO_DCHECK_LT(a, b) #define DRACO_DCHECK_NOTNULL(x) -#endif +#endif // DRACO_DEBUG // Helper macros for concatenating macro values. #define DRACO_MACROS_IMPL_CONCAT_INNER_(x, y) x##y #define DRACO_MACROS_IMPL_CONCAT_(x, y) DRACO_MACROS_IMPL_CONCAT_INNER_(x, y) +#define DRACO_MACROS_IMPL_CONCAT_INNER_3_(x, y, z) x##y##z +#define DRACO_MACROS_IMPL_CONCAT_3_(x, y, z) \ + DRACO_MACROS_IMPL_CONCAT_INNER_3_(x, y, z) + // Expand the n-th argument of the macro. Used to select an argument based on // the number of entries in a variadic macro argument. Example usage: // @@ -100,9 +105,9 @@ namespace draco { // #define VARIADIC_MACRO(...) // DRACO_SELECT_NTH_FROM_3(__VA_ARGS__, FUNC_3, FUNC_2, FUNC_1) __VA_ARGS__ // -#define DRACO_SELECT_NTH_FROM_2(_1, _2, NAME) NAME -#define DRACO_SELECT_NTH_FROM_3(_1, _2, _3, NAME) NAME -#define DRACO_SELECT_NTH_FROM_4(_1, _2, _3, _4, NAME) NAME +#define DRACO_SELECT_NTH_FROM_2(_1, _2, NAME, ...) NAME +#define DRACO_SELECT_NTH_FROM_3(_1, _2, _3, NAME, ...) NAME +#define DRACO_SELECT_NTH_FROM_4(_1, _2, _3, _4, NAME, ...) NAME // Macro that converts the Draco bit-stream into one uint16_t number. // Useful mostly when checking version numbers. diff --git a/contrib/draco/src/draco/core/math_utils.h b/contrib/draco/src/draco/core/math_utils.h index 7f382fa34..d7732e55d 100644 --- a/contrib/draco/src/draco/core/math_utils.h +++ b/contrib/draco/src/draco/core/math_utils.h @@ -19,6 +19,8 @@ #include "draco/core/vector_d.h" +namespace draco { + #define DRACO_INCREMENT_MOD(I, M) (((I) == ((M)-1)) ? 0 : ((I) + 1)) // Returns floor(sqrt(x)) where x is an integer number. The main intend of this @@ -52,4 +54,26 @@ inline uint64_t IntSqrt(uint64_t number) { return square_root; } +// Performs the addition in unsigned type to avoid signed integer overflow. Note +// that the result will be the same (for non-overflowing values). +template < + typename DataTypeT, + typename std::enable_if::value && + std::is_signed::value>::type * = nullptr> +inline DataTypeT AddAsUnsigned(DataTypeT a, DataTypeT b) { + typedef typename std::make_unsigned::type DataTypeUT; + return static_cast(static_cast(a) + + static_cast(b)); +} + +template ::value || + !std::is_signed::value>::type * = + nullptr> +inline DataTypeT AddAsUnsigned(DataTypeT a, DataTypeT b) { + return a + b; +} + +} // namespace draco + #endif // DRACO_CORE_MATH_UTILS_H_ diff --git a/contrib/draco/src/draco/core/math_utils_test.cc b/contrib/draco/src/draco/core/math_utils_test.cc index 8c255d046..460a67444 100644 --- a/contrib/draco/src/draco/core/math_utils_test.cc +++ b/contrib/draco/src/draco/core/math_utils_test.cc @@ -5,7 +5,7 @@ #include "draco/core/draco_test_base.h" -using draco::Vector3f; +namespace draco { TEST(MathUtils, Mod) { EXPECT_EQ(DRACO_INCREMENT_MOD(1, 1 << 1), 0); } @@ -20,3 +20,5 @@ TEST(MathUtils, IntSqrt) { ASSERT_EQ(IntSqrt(number), static_cast(floor(std::sqrt(number)))); } } + +} // namespace draco diff --git a/contrib/draco/src/draco/core/options.cc b/contrib/draco/src/draco/core/options.cc index 9b81db489..ceb87cccc 100644 --- a/contrib/draco/src/draco/core/options.cc +++ b/contrib/draco/src/draco/core/options.cc @@ -15,13 +15,12 @@ #include "draco/core/options.h" #include +#include #include #include namespace draco { -Options::Options() {} - void Options::MergeAndReplace(const Options &other_options) { for (const auto &item : other_options.options_) { options_[item.first] = item.second; diff --git a/contrib/draco/src/draco/core/options.h b/contrib/draco/src/draco/core/options.h index 1bc4dc0fb..3f15d13ba 100644 --- a/contrib/draco/src/draco/core/options.h +++ b/contrib/draco/src/draco/core/options.h @@ -19,6 +19,8 @@ #include #include +#include "draco/draco_features.h" + namespace draco { // Class for storing generic options as a pair in a string map. @@ -27,7 +29,8 @@ namespace draco { // data type. class Options { public: - Options(); + Options() = default; + ~Options() = default; // Merges |other_options| on top of the existing options of this instance // replacing all entries that are present in both options instances. @@ -71,8 +74,6 @@ class Options { private: // All entries are internally stored as strings and converted to the desired // return type based on the used Get* method. - // TODO(ostava): Consider adding type safety mechanism that would prevent - // unsafe operations such as a conversion from vector to int. std::map options_; }; diff --git a/contrib/draco/src/draco/core/status.cc b/contrib/draco/src/draco/core/status.cc new file mode 100644 index 000000000..ecb0b536e --- /dev/null +++ b/contrib/draco/src/draco/core/status.cc @@ -0,0 +1,44 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "draco/core/status.h" + +#include + +namespace draco { + +std::string Status::code_string() const { + switch (code_) { + case Code::OK: + return "OK"; + case Code::DRACO_ERROR: + return "DRACO_ERROR"; + case Code::IO_ERROR: + return "IO_ERROR"; + case Code::INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case Code::UNSUPPORTED_VERSION: + return "UNSUPPORTED_VERSION"; + case Code::UNKNOWN_VERSION: + return "UNKNOWN_VERSION"; + case Code::UNSUPPORTED_FEATURE: + return "UNSUPPORTED_FEATURE"; + } + return "UNKNOWN_STATUS_VALUE"; +} + +std::string Status::code_and_error_string() const { + return code_string() + ": " + error_msg_string(); +} + +} // namespace draco diff --git a/contrib/draco/src/draco/core/status.h b/contrib/draco/src/draco/core/status.h index 449ad8566..fac96046c 100644 --- a/contrib/draco/src/draco/core/status.h +++ b/contrib/draco/src/draco/core/status.h @@ -15,6 +15,7 @@ #ifndef DRACO_CORE_STATUS_H_ #define DRACO_CORE_STATUS_H_ +#include #include namespace draco { @@ -44,6 +45,8 @@ class Status { Code code() const { return code_; } const std::string &error_msg_string() const { return error_msg_; } const char *error_msg() const { return error_msg_.c_str(); } + std::string code_string() const; + std::string code_and_error_string() const; bool operator==(Code code) const { return code == code_; } bool ok() const { return code_ == OK; } @@ -61,6 +64,9 @@ inline std::ostream &operator<<(std::ostream &os, const Status &status) { } inline Status OkStatus() { return Status(Status::OK); } +inline Status ErrorStatus(const std::string &msg) { + return Status(Status::DRACO_ERROR, msg); +} // Evaluates an expression that returns draco::Status. If the status is not OK, // the macro returns the status object. diff --git a/contrib/draco/src/draco/core/status_test.cc b/contrib/draco/src/draco/core/status_test.cc index c1ad4ab30..dc36496d4 100644 --- a/contrib/draco/src/draco/core/status_test.cc +++ b/contrib/draco/src/draco/core/status_test.cc @@ -29,10 +29,17 @@ TEST_F(StatusTest, TestStatusOutput) { // Tests that the Status can be stored in a provided std::ostream. const draco::Status status(draco::Status::DRACO_ERROR, "Error msg."); ASSERT_EQ(status.code(), draco::Status::DRACO_ERROR); + ASSERT_EQ(status.code_string(), "DRACO_ERROR"); std::stringstream str; str << status; ASSERT_EQ(str.str(), "Error msg."); + + const draco::Status status2 = draco::ErrorStatus("Error msg2."); + ASSERT_EQ(status2.code(), draco::Status::DRACO_ERROR); + ASSERT_EQ(status2.error_msg_string(), "Error msg2."); + ASSERT_EQ(status2.code_string(), "DRACO_ERROR"); + ASSERT_EQ(status2.code_and_error_string(), "DRACO_ERROR: Error msg2."); } } // namespace diff --git a/contrib/draco/src/draco/core/vector_d.h b/contrib/draco/src/draco/core/vector_d.h index a3c46a46a..a0ec2dedf 100644 --- a/contrib/draco/src/draco/core/vector_d.h +++ b/contrib/draco/src/draco/core/vector_d.h @@ -34,7 +34,7 @@ class VectorD { typedef ScalarT Scalar; typedef VectorD Self; - // TODO(hemmer): Deprecate. + // TODO(b/199760123): Deprecate. typedef ScalarT CoefficientType; VectorD() { @@ -45,7 +45,7 @@ class VectorD { // The following constructor does not compile in opt mode, which for now led // to the constructors further down, which is not ideal. - // TODO(hemmer): fix constructor below and remove others. + // TODO(b/199760123): Fix constructor below and remove others. // template // explicit VectorD(Args... args) : v_({args...}) {} @@ -111,7 +111,7 @@ class VectorD { Scalar &operator[](int i) { return v_[i]; } const Scalar &operator[](int i) const { return v_[i]; } - // TODO(hemmer): remove. + // TODO(b/199760123): Remove. // Similar to interface of Eigen library. Scalar &operator()(int i) { return v_[i]; } const Scalar &operator()(int i) const { return v_[i]; } diff --git a/contrib/draco/src/draco/core/vector_d_test.cc b/contrib/draco/src/draco/core/vector_d_test.cc index d66128fb1..21c1ca4c5 100644 --- a/contrib/draco/src/draco/core/vector_d_test.cc +++ b/contrib/draco/src/draco/core/vector_d_test.cc @@ -32,16 +32,6 @@ typedef draco::Vector5ui Vector5ui; typedef draco::VectorD Vector3i; typedef draco::VectorD Vector4i; -template -void TestSquaredDistance(const draco::VectorD v1, - const draco::VectorD v2, - const CoeffT result) { - CoeffT squared_distance = SquaredDistance(v1, v2); - ASSERT_EQ(squared_distance, result); - squared_distance = SquaredDistance(v2, v1); - ASSERT_EQ(squared_distance, result); -} - TEST(VectorDTest, TestOperators) { { const Vector3f v; @@ -170,56 +160,6 @@ TEST(VectorTest, TestGetNormalizedWithZeroLengthVector) { ASSERT_EQ(normalized[2], 0); } -TEST(VectorDTest, TestSquaredDistance) { - // Test Vector2f: float, 2D. - Vector2f v1_2f(5.5, 10.5); - Vector2f v2_2f(3.5, 15.5); - float result_f = 29; - TestSquaredDistance(v1_2f, v2_2f, result_f); - - // Test Vector3f: float, 3D. - Vector3f v1_3f(5.5, 10.5, 2.3); - Vector3f v2_3f(3.5, 15.5, 0); - result_f = 34.29; - TestSquaredDistance(v1_3f, v2_3f, result_f); - - // Test Vector4f: float, 4D. - Vector4f v1_4f(5.5, 10.5, 2.3, 7.2); - Vector4f v2_4f(3.5, 15.5, 0, 9.9); - result_f = 41.58; - TestSquaredDistance(v1_4f, v2_4f, result_f); - - // Test Vector5f: float, 5D. - Vector5f v1_5f(5.5, 10.5, 2.3, 7.2, 1.0); - Vector5f v2_5f(3.5, 15.5, 0, 9.9, 0.2); - result_f = 42.22; - TestSquaredDistance(v1_5f, v2_5f, result_f); - - // Test Vector 2ui: uint32_t, 2D. - Vector2ui v1_2ui(5, 10); - Vector2ui v2_2ui(3, 15); - uint32_t result_ui = 29; - TestSquaredDistance(v1_2ui, v2_2ui, result_ui); - - // Test Vector 3ui: uint32_t, 3D. - Vector3ui v1_3ui(5, 10, 2); - Vector3ui v2_3ui(3, 15, 0); - result_ui = 33; - TestSquaredDistance(v1_3ui, v2_3ui, result_ui); - - // Test Vector 4ui: uint32_t, 4D. - Vector4ui v1_4ui(5, 10, 2, 7); - Vector4ui v2_4ui(3, 15, 0, 9); - result_ui = 37; - TestSquaredDistance(v1_4ui, v2_4ui, result_ui); - - // Test Vector 5ui: uint32_t, 5D. - Vector5ui v1_5ui(5, 10, 2, 7, 1); - Vector5ui v2_5ui(3, 15, 0, 9, 12); - result_ui = 158; - TestSquaredDistance(v1_5ui, v2_5ui, result_ui); -} - TEST(VectorDTest, TestCrossProduct3D) { const Vector3i e1(1, 0, 0); const Vector3i e2(0, 1, 0); diff --git a/contrib/draco/src/draco/io/file_reader_factory.cc b/contrib/draco/src/draco/io/file_reader_factory.cc index ac7b09288..a8f15a11f 100644 --- a/contrib/draco/src/draco/io/file_reader_factory.cc +++ b/contrib/draco/src/draco/io/file_reader_factory.cc @@ -1,5 +1,6 @@ #include "draco/io/file_reader_factory.h" +#include #include namespace draco { @@ -38,7 +39,6 @@ std::unique_ptr FileReaderFactory::OpenReader( } return reader; } - FILEREADER_LOG_ERROR("No file reader able to open input"); return nullptr; } diff --git a/contrib/draco/src/draco/io/file_utils.cc b/contrib/draco/src/draco/io/file_utils.cc index f93cbd899..694d259e8 100644 --- a/contrib/draco/src/draco/io/file_utils.cc +++ b/contrib/draco/src/draco/io/file_utils.cc @@ -14,6 +14,8 @@ // #include "draco/io/file_utils.h" +#include + #include "draco/io/file_reader_factory.h" #include "draco/io/file_reader_interface.h" #include "draco/io/file_writer_factory.h" @@ -30,7 +32,7 @@ void SplitPath(const std::string &full_path, std::string *out_folder_path, std::string ReplaceFileExtension(const std::string &in_file_name, const std::string &new_extension) { - const auto pos = in_file_name.find_last_of("."); + const auto pos = in_file_name.find_last_of('.'); if (pos == std::string::npos) { // No extension found. return in_file_name + "." + new_extension; @@ -46,6 +48,22 @@ std::string LowercaseFileExtension(const std::string &filename) { return parser::ToLower(filename.substr(pos + 1)); } +std::string LowercaseMimeTypeExtension(const std::string &mime_type) { + const size_t pos = mime_type.find_last_of('/'); + if (pos == 0 || pos == std::string::npos || pos == mime_type.length() - 1) { + return ""; + } + return parser::ToLower(mime_type.substr(pos + 1)); +} + +std::string RemoveFileExtension(const std::string &filename) { + const size_t pos = filename.find_last_of('.'); + if (pos == 0 || pos == std::string::npos || pos == filename.length() - 1) { + return filename; + } + return filename.substr(0, pos); +} + std::string GetFullPath(const std::string &input_file_relative_path, const std::string &sibling_file_full_path) { const auto pos = sibling_file_full_path.find_last_of("/\\"); @@ -76,6 +94,23 @@ bool ReadFileToBuffer(const std::string &file_name, return file_reader->ReadFileToBuffer(buffer); } +bool ReadFileToString(const std::string &file_name, std::string *contents) { + if (!contents) { + return false; + } + std::unique_ptr file_reader = + FileReaderFactory::OpenReader(file_name); + if (file_reader == nullptr) { + return false; + } + std::vector buffer; + if (!ReadFileToBuffer(file_name, &buffer)) { + return false; + } + contents->assign(buffer.begin(), buffer.end()); + return true; +} + bool WriteBufferToFile(const char *buffer, size_t buffer_size, const std::string &file_name) { std::unique_ptr file_writer = diff --git a/contrib/draco/src/draco/io/file_utils.h b/contrib/draco/src/draco/io/file_utils.h index 4b734e049..7a5fc475b 100644 --- a/contrib/draco/src/draco/io/file_utils.h +++ b/contrib/draco/src/draco/io/file_utils.h @@ -15,6 +15,7 @@ #ifndef DRACO_IO_FILE_UTILS_H_ #define DRACO_IO_FILE_UTILS_H_ +#include #include #include @@ -37,6 +38,13 @@ std::string ReplaceFileExtension(const std::string &in_file_name, // '.' (e.g. Linux hidden files), the first delimiter is ignored. std::string LowercaseFileExtension(const std::string &filename); +// Returns the mime type extension in lowercase if present, else "". Extension +// is defined as the string after the last '/ character. +std::string LowercaseMimeTypeExtension(const std::string &mime_type); + +// Returns the file name without extension. +std::string RemoveFileExtension(const std::string &filename); + // Given a path of the input file |input_file_relative_path| relative to the // parent directory of |sibling_file_full_path|, this function returns full path // to the input file. If |sibling_file_full_path| has no directory, the relative @@ -46,13 +54,18 @@ std::string LowercaseFileExtension(const std::string &filename); std::string GetFullPath(const std::string &input_file_relative_path, const std::string &sibling_file_full_path); -// Convenience method. Uses draco::FileReaderFactory internally. Reads contents +// Convenience methods. Uses draco::FileReaderFactory internally. Reads contents // of file referenced by |file_name| into |buffer| and returns true upon // success. bool ReadFileToBuffer(const std::string &file_name, std::vector *buffer); bool ReadFileToBuffer(const std::string &file_name, std::vector *buffer); +// Convenience method for reading a file into a std::string. Reads contents +// of file referenced by |file_name| into |contents| and returns true upon +// success. +bool ReadFileToString(const std::string &file_name, std::string *contents); + // Convenience method. Uses draco::FileWriterFactory internally. Writes contents // of |buffer| to file referred to by |file_name|. File is overwritten if it // exists. Returns true after successful write. diff --git a/contrib/draco/src/draco/io/file_utils_test.cc b/contrib/draco/src/draco/io/file_utils_test.cc index 4085ff0cd..b55b1e3be 100644 --- a/contrib/draco/src/draco/io/file_utils_test.cc +++ b/contrib/draco/src/draco/io/file_utils_test.cc @@ -14,6 +14,8 @@ // #include "draco/io/file_utils.h" +#include + #include "draco/core/draco_test_base.h" #include "draco/core/draco_test_utils.h" diff --git a/contrib/draco/src/draco/io/file_writer_factory.cc b/contrib/draco/src/draco/io/file_writer_factory.cc index cb6851602..8ffd5400a 100644 --- a/contrib/draco/src/draco/io/file_writer_factory.cc +++ b/contrib/draco/src/draco/io/file_writer_factory.cc @@ -1,5 +1,6 @@ #include "draco/io/file_writer_factory.h" +#include #include namespace draco { diff --git a/contrib/draco/src/draco/io/file_writer_utils.cc b/contrib/draco/src/draco/io/file_writer_utils.cc index bcadccfc6..3dab80bbf 100644 --- a/contrib/draco/src/draco/io/file_writer_utils.cc +++ b/contrib/draco/src/draco/io/file_writer_utils.cc @@ -7,6 +7,10 @@ #include "draco/draco_features.h" +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "ghc/filesystem.hpp" +#endif // DRACO_TRANSCODER_SUPPORTED + namespace draco { void SplitPathPrivate(const std::string &full_path, @@ -30,8 +34,18 @@ void SplitPathPrivate(const std::string &full_path, } } -bool DirectoryExists(const std::string &path) { +bool DirectoryExists(const std::string &path_arg) { struct stat path_stat; + std::string path = path_arg; + +#if defined(_WIN32) && not defined(__MINGW32__) + // Avoid a silly windows issue: stat() will fail on a drive letter missing the + // trailing slash. + if (path.size() > 0 && path[path.size()] != '\\' && + path[path.size()] != '/') { + path.append("\\"); + } +#endif // Check if |path| exists. if (stat(path.c_str(), &path_stat) != 0) { @@ -50,7 +64,12 @@ bool CheckAndCreatePathForFile(const std::string &filename) { std::string basename; SplitPathPrivate(filename, &path, &basename); +#ifdef DRACO_TRANSCODER_SUPPORTED + const ghc::filesystem::path ghc_path(path); + ghc::filesystem::create_directories(ghc_path); +#endif // DRACO_TRANSCODER_SUPPORTED const bool directory_exists = DirectoryExists(path); + return directory_exists; } diff --git a/contrib/draco/src/draco/io/file_writer_utils_test.cc b/contrib/draco/src/draco/io/file_writer_utils_test.cc new file mode 100644 index 000000000..14a3013e0 --- /dev/null +++ b/contrib/draco/src/draco/io/file_writer_utils_test.cc @@ -0,0 +1,49 @@ +#include "draco/io/file_writer_utils.h" + +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace draco { +namespace { + +TEST(FileWriterUtilsTest, SplitPathPrivateNonWindows) { + const std::string test_path = "/path/to/file"; + std::string directory; + std::string file; + SplitPathPrivate(test_path, &directory, &file); + ASSERT_EQ(directory, "/path/to"); + ASSERT_EQ(file, "file"); +} + +TEST(FileWriterUtilsTest, SplitPathPrivateWindows) { + const std::string test_path = "C:\\path\\to\\file"; + std::string directory; + std::string file; + SplitPathPrivate(test_path, &directory, &file); + ASSERT_EQ(directory, "C:\\path\\to"); + ASSERT_EQ(file, "file"); +} + +TEST(FileWriterUtilsTest, DirectoryExistsTest) { + ASSERT_TRUE(DirectoryExists(GetTestTempDir())); + ASSERT_FALSE(DirectoryExists("fake/test/subdir")); +} + +#ifdef DRACO_TRANSCODER_SUPPORTED +TEST(FileWriterUtilsTest, CheckAndCreatePathForFileTest) { + const std::string fake_file = "fake.file"; + const std::string fake_file_subdir = "a/few/dirs/down"; + const std::string test_temp_dir = GetTestTempDir(); + const std::string fake_file_directory = + test_temp_dir + "/" + fake_file_subdir; + const std::string fake_full_path = + test_temp_dir + "/" + fake_file_subdir + "/" + fake_file; + ASSERT_TRUE(CheckAndCreatePathForFile(fake_full_path)); + ASSERT_TRUE(DirectoryExists(fake_file_directory)); +} +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace +} // namespace draco diff --git a/contrib/draco/src/draco/io/gltf_decoder.cc b/contrib/draco/src/draco/io/gltf_decoder.cc new file mode 100644 index 000000000..521b7524f --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_decoder.cc @@ -0,0 +1,2893 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/gltf_decoder.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include +#include +#include +#include +#include + +#include "draco/core/draco_types.h" +#include "draco/core/hash_utils.h" +#include "draco/core/status.h" +#include "draco/core/status_or.h" +#include "draco/io/tiny_gltf_utils.h" +#include "draco/material/material_library.h" +#include "draco/mesh/mesh.h" +#include "draco/mesh/mesh_features.h" +#include "draco/mesh/triangle_soup_mesh_builder.h" +#include "draco/metadata/property_table.h" +#include "draco/point_cloud/point_cloud_builder.h" +#include "draco/scene/scene_indices.h" +#include "draco/texture/source_image.h" +#include "draco/texture/texture_utils.h" + +namespace draco { + +namespace { +draco::DataType GltfComponentTypeToDracoType(int component_type) { + switch (component_type) { + case TINYGLTF_COMPONENT_TYPE_BYTE: + return DT_INT8; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE: + return DT_UINT8; + case TINYGLTF_COMPONENT_TYPE_SHORT: + return DT_INT16; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT: + return DT_UINT16; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT: + return DT_UINT32; + case TINYGLTF_COMPONENT_TYPE_FLOAT: + return DT_FLOAT32; + } + return DT_INVALID; +} + +GeometryAttribute::Type GltfAttributeToDracoAttribute( + const std::string attribute_name) { + if (attribute_name == "POSITION") { + return GeometryAttribute::POSITION; + } else if (attribute_name == "NORMAL") { + return GeometryAttribute::NORMAL; + } else if (attribute_name == "TEXCOORD_0") { + return GeometryAttribute::TEX_COORD; + } else if (attribute_name == "TEXCOORD_1") { + return GeometryAttribute::TEX_COORD; + } else if (attribute_name == "TANGENT") { + return GeometryAttribute::TANGENT; + } else if (attribute_name == "COLOR_0") { + return GeometryAttribute::COLOR; + } else if (attribute_name == "JOINTS_0") { + return GeometryAttribute::JOINTS; + } else if (attribute_name == "WEIGHTS_0") { + return GeometryAttribute::WEIGHTS; + } else if (attribute_name.rfind("_FEATURE_ID_") == 0) { + // Feature ID attribute like _FEATURE_ID_5 from EXT_mesh_features extension. + return GeometryAttribute::GENERIC; + } + return GeometryAttribute::INVALID; +} + +StatusOr TinyGltfToDracoAxisWrappingMode( + int wrap_mode) { + switch (wrap_mode) { + case TINYGLTF_TEXTURE_WRAP_CLAMP_TO_EDGE: + return TextureMap::CLAMP_TO_EDGE; + case TINYGLTF_TEXTURE_WRAP_MIRRORED_REPEAT: + return TextureMap::MIRRORED_REPEAT; + case TINYGLTF_TEXTURE_WRAP_REPEAT: + return TextureMap::REPEAT; + default: + return Status(Status::UNSUPPORTED_FEATURE, "Unsupported wrapping mode."); + } +} + +StatusOr TinyGltfToDracoFilterType(int filter_type) { + switch (filter_type) { + case -1: + return TextureMap::UNSPECIFIED; + case TINYGLTF_TEXTURE_FILTER_NEAREST: + return TextureMap::NEAREST; + case TINYGLTF_TEXTURE_FILTER_LINEAR: + return TextureMap::LINEAR; + case TINYGLTF_TEXTURE_FILTER_NEAREST_MIPMAP_NEAREST: + return TextureMap::NEAREST_MIPMAP_NEAREST; + case TINYGLTF_TEXTURE_FILTER_LINEAR_MIPMAP_NEAREST: + return TextureMap::LINEAR_MIPMAP_NEAREST; + case TINYGLTF_TEXTURE_FILTER_NEAREST_MIPMAP_LINEAR: + return TextureMap::NEAREST_MIPMAP_LINEAR; + case TINYGLTF_TEXTURE_FILTER_LINEAR_MIPMAP_LINEAR: + return TextureMap::LINEAR_MIPMAP_LINEAR; + default: + return Status(Status::DRACO_ERROR, "Unsupported texture filter type."); + } +} + +StatusOr> CopyDataAsUint32( + const tinygltf::Model &model, const tinygltf::Accessor &accessor) { + if (accessor.componentType == TINYGLTF_COMPONENT_TYPE_BYTE) { + return Status(Status::DRACO_ERROR, "Byte cannot be converted to Uint32."); + } + if (accessor.componentType == TINYGLTF_COMPONENT_TYPE_SHORT) { + return Status(Status::DRACO_ERROR, "Short cannot be converted to Uint32."); + } + if (accessor.componentType == TINYGLTF_COMPONENT_TYPE_INT) { + return Status(Status::DRACO_ERROR, "Int cannot be converted to Uint32."); + } + if (accessor.componentType == TINYGLTF_COMPONENT_TYPE_FLOAT) { + return Status(Status::DRACO_ERROR, "Float cannot be converted to Uint32."); + } + if (accessor.componentType == TINYGLTF_COMPONENT_TYPE_DOUBLE) { + return Status(Status::DRACO_ERROR, "Double cannot be converted to Uint32."); + } + if (accessor.bufferView < 0) { + return Status(Status::DRACO_ERROR, + "Error CopyDataAsUint32() bufferView < 0."); + } + + const tinygltf::BufferView &buffer_view = + model.bufferViews[accessor.bufferView]; + if (buffer_view.buffer < 0) { + return Status(Status::DRACO_ERROR, "Error CopyDataAsUint32() buffer < 0."); + } + + const tinygltf::Buffer &buffer = model.buffers[buffer_view.buffer]; + + const uint8_t *const data_start = + buffer.data.data() + buffer_view.byteOffset + accessor.byteOffset; + const int byte_stride = accessor.ByteStride(buffer_view); + const int component_size = + tinygltf::GetComponentSizeInBytes(accessor.componentType); + const int num_components = + TinyGltfUtils::GetNumComponentsForType(accessor.type); + const int num_elements = accessor.count * num_components; + + std::vector output; + output.resize(num_elements); + + int out_index = 0; + const uint8_t *data = data_start; + for (int i = 0; i < accessor.count; ++i) { + for (int c = 0; c < num_components; ++c) { + uint32_t value = 0; + memcpy(&value, data + (c * component_size), component_size); + output[out_index++] = value; + } + + data += byte_stride; + } + + return output; +} + +// Specialization for arithmetic types. +template < + typename TypeT, + typename std::enable_if::value>::type * = nullptr> +StatusOr> CopyDataAs(const tinygltf::Model &model, + const tinygltf::Accessor &accessor) { + if (std::is_same::value) { + if (TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE != accessor.componentType) { + return ErrorStatus("Accessor data cannot be converted to Uint8."); + } + } else if (std::is_same::value) { + if (TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE != accessor.componentType && + TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT != accessor.componentType) { + return ErrorStatus("Accessor data cannot be converted to Uint16."); + } + } else if (std::is_same::value) { + if (TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE != accessor.componentType && + TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT != accessor.componentType && + TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT != accessor.componentType) { + return ErrorStatus("Accessor data cannot be converted to Uint32."); + } + } else if (std::is_same::value) { + if (TINYGLTF_COMPONENT_TYPE_FLOAT != accessor.componentType) { + return ErrorStatus("Accessor data cannot be converted to Float."); + } + } + if (accessor.bufferView < 0) { + return Status(Status::DRACO_ERROR, "Error CopyDataAs() bufferView < 0."); + } + + const tinygltf::BufferView &buffer_view = + model.bufferViews[accessor.bufferView]; + if (buffer_view.buffer < 0) { + return Status(Status::DRACO_ERROR, "Error CopyDataAs() buffer < 0."); + } + + const tinygltf::Buffer &buffer = model.buffers[buffer_view.buffer]; + + const uint8_t *const data_start = + buffer.data.data() + buffer_view.byteOffset + accessor.byteOffset; + const int byte_stride = accessor.ByteStride(buffer_view); + const int component_size = + tinygltf::GetComponentSizeInBytes(accessor.componentType); + + std::vector output; + output.resize(accessor.count); + + const int num_components = + TinyGltfUtils::GetNumComponentsForType(accessor.type); + int out_index = 0; + const uint8_t *data = data_start; + for (int i = 0; i < accessor.count; ++i) { + for (int c = 0; c < num_components; ++c) { + TypeT value = 0; + memcpy(&value, data + (c * component_size), component_size); + output[out_index++] = value; + } + data += byte_stride; + } + return output; +} + +// Specialization for remaining types is used for draco::VectorD. +template ::value>::type * = + nullptr> +StatusOr> CopyDataAs(const tinygltf::Model &model, + const tinygltf::Accessor &accessor) { + const int num_components = + TinyGltfUtils::GetNumComponentsForType(accessor.type); + if (num_components != TypeT::dimension) { + return Status(Status::DRACO_ERROR, + "Dimension does not equal num components."); + } + if (accessor.bufferView < 0) { + return Status(Status::DRACO_ERROR, "Error CopyDataAs() bufferView < 0."); + } + + const tinygltf::BufferView &buffer_view = + model.bufferViews[accessor.bufferView]; + if (buffer_view.buffer < 0) { + return Status(Status::DRACO_ERROR, "Error CopyDataAs() buffer < 0."); + } + + const tinygltf::Buffer &buffer = model.buffers[buffer_view.buffer]; + + const uint8_t *const data_start = + buffer.data.data() + buffer_view.byteOffset + accessor.byteOffset; + const int byte_stride = accessor.ByteStride(buffer_view); + const int component_size = + tinygltf::GetComponentSizeInBytes(accessor.componentType); + + std::vector output; + output.resize(accessor.count); + + const uint8_t *data = data_start; + for (int i = 0; i < accessor.count; ++i) { + TypeT values; + for (int c = 0; c < num_components; ++c) { + memcpy(&values[c], data + (c * component_size), component_size); + } + output[i] = values; + data += byte_stride; + } + return output; +} + +// Copies the data referenced from |buffer_view_id| into |data|. Currently only +// supports a byte stride of 0. I.e. tightly packed. +Status CopyDataFromBufferView(const tinygltf::Model &model, int buffer_view_id, + std::vector *data) { + if (buffer_view_id < 0) { + return ErrorStatus("Error CopyDataFromBufferView() bufferView < 0."); + } + const tinygltf::BufferView &buffer_view = model.bufferViews[buffer_view_id]; + if (buffer_view.buffer < 0) { + return ErrorStatus("Error CopyDataFromBufferView() buffer < 0."); + } + if (buffer_view.byteStride != 0) { + return Status(Status::DRACO_ERROR, "Error buffer view byteStride != 0."); + } + + const tinygltf::Buffer &buffer = model.buffers[buffer_view.buffer]; + const uint8_t *const data_start = buffer.data.data() + buffer_view.byteOffset; + + data->resize(buffer_view.byteLength); + memcpy(&(*data)[0], data_start, buffer_view.byteLength); + return OkStatus(); +} + +// Returns a SourceImage created from |image|. +StatusOr> GetSourceImage( + const tinygltf::Model &model, const tinygltf::Image &image, + const Texture &texture) { + std::unique_ptr source_image(new SourceImage()); + // If the image is in an external file then the buffer view is < 0. + if (image.bufferView >= 0) { + DRACO_RETURN_IF_ERROR(CopyDataFromBufferView( + model, image.bufferView, &source_image->MutableEncodedData())); + } + source_image->set_filename(image.uri); + source_image->set_mime_type(image.mimeType); + + return source_image; +} + +std::unique_ptr GetNodeTrsMatrix(const tinygltf::Node &node) { + std::unique_ptr trsm(new TrsMatrix()); + if (node.matrix.size() == 16) { + Eigen::Matrix4d transformation; + // clang-format off + // |node.matrix| is in the column-major order. + transformation << + node.matrix[0], node.matrix[4], node.matrix[8], node.matrix[12], + node.matrix[1], node.matrix[5], node.matrix[9], node.matrix[13], + node.matrix[2], node.matrix[6], node.matrix[10], node.matrix[14], + node.matrix[3], node.matrix[7], node.matrix[11], node.matrix[15]; + // clang-format on + if (transformation != Eigen::Matrix4d::Identity()) { + trsm->SetMatrix(transformation); + } + } + + if (node.translation.size() == 3) { + const Eigen::Vector3d default_translation(0.0, 0.0, 0.0); + const Eigen::Vector3d node_translation( + node.translation[0], node.translation[1], node.translation[2]); + if (node_translation != default_translation) { + trsm->SetTranslation(node_translation); + } + } + if (node.scale.size() == 3) { + const Eigen::Vector3d default_scale(1.0, 1.0, 1.0); + const Eigen::Vector3d node_scale(node.scale[0], node.scale[1], + node.scale[2]); + if (node_scale != default_scale) { + trsm->SetScale(node_scale); + } + } + if (node.rotation.size() == 4) { + // Eigen quaternion is defined in (w, x, y, z) vs glTF that uses + // (x, y, z, w). + const Eigen::Quaterniond default_rotation(0.0, 0.0, 0.0, 1.0); + const Eigen::Quaterniond node_rotation(node.rotation[3], node.rotation[0], + node.rotation[1], node.rotation[2]); + if (node_rotation != default_rotation) { + trsm->SetRotation(node_rotation); + } + } + + return trsm; +} + +Eigen::Matrix4d UpdateMatrixForNormals( + const Eigen::Matrix4d &transform_matrix) { + Eigen::Matrix3d mat3x3; + // clang-format off + mat3x3 << + transform_matrix(0, 0), transform_matrix(0, 1), transform_matrix(0, 2), + transform_matrix(1, 0), transform_matrix(1, 1), transform_matrix(1, 2), + transform_matrix(2, 0), transform_matrix(2, 1), transform_matrix(2, 2); + // clang-format on + + mat3x3 = mat3x3.inverse().transpose(); + Eigen::Matrix4d mat4x4; + // clang-format off + mat4x4 << mat3x3(0, 0), mat3x3(0, 1), mat3x3(0, 2), 0.0, + mat3x3(1, 0), mat3x3(1, 1), mat3x3(1, 2), 0.0, + mat3x3(2, 0), mat3x3(2, 1), mat3x3(2, 2), 0.0, + 0.0, 0.0, 0.0, 1.0; + // clang-format on + return mat4x4; +} + +float Determinant(const Eigen::Matrix4d &transform_matrix) { + Eigen::Matrix3d mat3x3; + // clang-format off + mat3x3 << + transform_matrix(0, 0), transform_matrix(0, 1), transform_matrix(0, 2), + transform_matrix(1, 0), transform_matrix(1, 1), transform_matrix(1, 2), + transform_matrix(2, 0), transform_matrix(2, 1), transform_matrix(2, 2); + // clang-format on + return mat3x3.determinant(); +} + +bool FileExists(const std::string &filepath, void * /*user_data*/) { + return GetFileSize(filepath) != 0; +} + +bool ReadWholeFile(std::vector *out, std::string *err, + const std::string &filepath, void *user_data) { + if (!ReadFileToBuffer(filepath, out)) { + if (err) { + *err = "Unable to read: " + filepath; + } + return false; + } + if (user_data) { + auto *files_vector = + reinterpret_cast *>(user_data); + files_vector->push_back(filepath); + } + return true; +} + +bool WriteWholeFile(std::string * /*err*/, const std::string &filepath, + const std::vector &contents, + void * /*user_data*/) { + return WriteBufferToFile(contents.data(), contents.size(), filepath); +} + +} // namespace + +GltfDecoder::GltfDecoder() + : next_face_id_(0), + next_point_id_(0), + total_face_indices_count_(0), + total_point_indices_count_(0), + material_att_id_(-1) {} + +StatusOr> GltfDecoder::DecodeFromFile( + const std::string &file_name) { + return DecodeFromFile(file_name, nullptr); +} + +StatusOr> GltfDecoder::DecodeFromFile( + const std::string &file_name, std::vector *mesh_files) { + DRACO_RETURN_IF_ERROR(LoadFile(file_name, mesh_files)); + return BuildMesh(); +} + +StatusOr> GltfDecoder::DecodeFromBuffer( + DecoderBuffer *buffer) { + DRACO_RETURN_IF_ERROR(LoadBuffer(*buffer)); + return BuildMesh(); +} + +StatusOr> GltfDecoder::DecodeFromFileToScene( + const std::string &file_name) { + return DecodeFromFileToScene(file_name, nullptr); +} + +StatusOr> GltfDecoder::DecodeFromFileToScene( + const std::string &file_name, std::vector *scene_files) { + DRACO_RETURN_IF_ERROR(LoadFile(file_name, scene_files)); + scene_ = std::unique_ptr(new Scene()); + DRACO_RETURN_IF_ERROR(DecodeGltfToScene()); + return std::move(scene_); +} + +StatusOr> GltfDecoder::DecodeFromBufferToScene( + DecoderBuffer *buffer) { + DRACO_RETURN_IF_ERROR(LoadBuffer(*buffer)); + scene_ = std::unique_ptr(new Scene()); + DRACO_RETURN_IF_ERROR(DecodeGltfToScene()); + return std::move(scene_); +} + +Status GltfDecoder::LoadFile(const std::string &file_name, + std::vector *input_files) { + const std::string extension = LowercaseFileExtension(file_name); + tinygltf::TinyGLTF loader; + std::string err; + std::string warn; + + const tinygltf::FsCallbacks fs_callbacks = { + &FileExists, + // TinyGLTF's ExpandFilePath does not do filesystem i/o, so it's safe to + // use in all environments. + &tinygltf::ExpandFilePath, &ReadWholeFile, &WriteWholeFile, + reinterpret_cast(input_files)}; + + loader.SetFsCallbacks(fs_callbacks); + + if (extension == "glb") { + if (!loader.LoadBinaryFromFile(&gltf_model_, &err, &warn, file_name)) { + return Status(Status::DRACO_ERROR, + "TinyGLTF failed to load glb file: " + err); + } + } else if (extension == "gltf") { + if (!loader.LoadASCIIFromFile(&gltf_model_, &err, &warn, file_name)) { + return Status(Status::DRACO_ERROR, + "TinyGLTF failed to load glTF file: " + err); + } + } else { + return Status(Status::DRACO_ERROR, "Unknown input file extension."); + } + DRACO_RETURN_IF_ERROR(CheckUnsupportedFeatures()); + input_file_name_ = file_name; + return OkStatus(); +} + +Status GltfDecoder::LoadBuffer(const DecoderBuffer &buffer) { + tinygltf::TinyGLTF loader; + std::string err; + std::string warn; + + if (!loader.LoadBinaryFromMemory( + &gltf_model_, &err, &warn, + reinterpret_cast(buffer.data_head()), + buffer.remaining_size())) { + return Status(Status::DRACO_ERROR, + "TinyGLTF failed to load glb buffer: " + err); + } + DRACO_RETURN_IF_ERROR(CheckUnsupportedFeatures()); + input_file_name_.clear(); + return OkStatus(); +} + +StatusOr> GltfDecoder::BuildMesh() { + DRACO_RETURN_IF_ERROR(GatherAttributeAndMaterialStats()); + if (total_face_indices_count_ > 0 && total_point_indices_count_ > 0) { + return ErrorStatus( + "Decoding to mesh can't handle triangle and point primitives at the " + "same time."); + } + if (total_face_indices_count_ > 0) { + mb_.Start(total_face_indices_count_ / 3); + DRACO_RETURN_IF_ERROR(AddAttributesToDracoMesh(&mb_)); + } else { + pb_.Start(total_point_indices_count_); + DRACO_RETURN_IF_ERROR(AddAttributesToDracoMesh(&pb_)); + } + + for (const tinygltf::Scene &scene : gltf_model_.scenes) { + for (int i = 0; i < scene.nodes.size(); ++i) { + const Eigen::Matrix4d parent_matrix = Eigen::Matrix4d::Identity(); + DRACO_RETURN_IF_ERROR(DecodeNode(scene.nodes[i], parent_matrix)); + } + } + DRACO_ASSIGN_OR_RETURN( + std::unique_ptr mesh, + BuildMeshFromBuilder(total_face_indices_count_ > 0, &mb_, &pb_)); + + DRACO_RETURN_IF_ERROR(CopyTextures(mesh.get())); + SetAttributePropertiesOnDracoMesh(mesh.get()); + DRACO_RETURN_IF_ERROR(AddMaterialsToDracoMesh(mesh.get())); + DRACO_RETURN_IF_ERROR(AddMeshFeaturesToDracoMesh(mesh.get())); + DRACO_RETURN_IF_ERROR(AddStructuralMetadataToGeometry(mesh.get())); + MoveNonMaterialTextures(mesh.get()); + return mesh; +} + +Status GltfDecoder::AddMeshFeaturesToDracoMesh(Mesh *mesh) { + for (const tinygltf::Scene &scene : gltf_model_.scenes) { + for (int i = 0; i < scene.nodes.size(); ++i) { + DRACO_RETURN_IF_ERROR(AddMeshFeaturesToDracoMesh(scene.nodes[i], mesh)); + } + } + return OkStatus(); +} + +Status GltfDecoder::AddMeshFeaturesToDracoMesh(int node_index, Mesh *mesh) { + const tinygltf::Node &node = gltf_model_.nodes[node_index]; + if (node.mesh >= 0) { + const tinygltf::Mesh &gltf_mesh = gltf_model_.meshes[node.mesh]; + for (const auto &primitive : gltf_mesh.primitives) { + // Decode mesh feature ID sets if present in this primitive. + DRACO_RETURN_IF_ERROR(DecodeMeshFeatures( + primitive, &mesh->GetMaterialLibrary().MutableTextureLibrary(), + mesh)); + } + } + for (int i = 0; i < node.children.size(); ++i) { + DRACO_RETURN_IF_ERROR(AddMeshFeaturesToDracoMesh(node.children[i], mesh)); + } + return OkStatus(); +} + +Status GltfDecoder::CheckUnsupportedFeatures() { + // Check for morph targets. + for (const auto &mesh : gltf_model_.meshes) { + for (const auto &primitive : mesh.primitives) { + if (!primitive.targets.empty()) { + return Status(Status::UNSUPPORTED_FEATURE, + "Morph targets are unsupported."); + } + } + } + + // Check for sparse accessors. + for (const auto &accessor : gltf_model_.accessors) { + if (accessor.sparse.isSparse) { + return Status(Status::UNSUPPORTED_FEATURE, + "Sparse accessors are unsupported."); + } + } + + // Check for extensions. + for (const auto &extension : gltf_model_.extensionsRequired) { + if (extension != "KHR_materials_unlit" && + extension != "KHR_texture_transform" && + extension != "KHR_draco_mesh_compression") { + return Status(Status::UNSUPPORTED_FEATURE, + extension + " is unsupported."); + } + } + return OkStatus(); +} + +Status GltfDecoder::DecodeNode(int node_index, + const Eigen::Matrix4d &parent_matrix) { + const tinygltf::Node &node = gltf_model_.nodes[node_index]; + const std::unique_ptr trsm = GetNodeTrsMatrix(node); + const Eigen::Matrix4d node_matrix = + parent_matrix * trsm->ComputeTransformationMatrix(); + + if (node.mesh >= 0) { + const tinygltf::Mesh &mesh = gltf_model_.meshes[node.mesh]; + for (const auto &primitive : mesh.primitives) { + DRACO_RETURN_IF_ERROR(DecodePrimitive(primitive, node_matrix)); + } + } + for (int i = 0; i < node.children.size(); ++i) { + DRACO_RETURN_IF_ERROR(DecodeNode(node.children[i], node_matrix)); + } + return OkStatus(); +} + +StatusOr GltfDecoder::DecodePrimitiveAttributeCount( + const tinygltf::Primitive &primitive) const { + // Use the first primitive attribute as all attributes have the same entry + // count according to glTF 2.0 spec. + if (primitive.attributes.empty()) { + return Status(Status::DRACO_ERROR, "Primitive has no attributes."); + } + const tinygltf::Accessor &accessor = + gltf_model_.accessors[primitive.attributes.begin()->second]; + return accessor.count; +} + +StatusOr GltfDecoder::DecodePrimitiveIndicesCount( + const tinygltf::Primitive &primitive) const { + if (primitive.indices < 0) { + // Primitive has implicit indices [0, 1, 2, 3, ...]. Determine indices count + // based on entry count of a primitive attribute. + return DecodePrimitiveAttributeCount(primitive); + } + const tinygltf::Accessor &indices = gltf_model_.accessors[primitive.indices]; + return indices.count; +} + +StatusOr> GltfDecoder::DecodePrimitiveIndices( + const tinygltf::Primitive &primitive) const { + std::vector indices_data; + if (primitive.indices < 0) { + // Primitive has implicit indices [0, 1, 2, 3, ...]. Create indices based on + // entry count of a primitive attribute. + DRACO_ASSIGN_OR_RETURN(const int num_vertices, + DecodePrimitiveAttributeCount(primitive)); + indices_data.reserve(num_vertices); + for (int i = 0; i < num_vertices; i++) { + indices_data.push_back(i); + } + } else { + // Get indices from the primitive's indices property. + const tinygltf::Accessor &indices = + gltf_model_.accessors[primitive.indices]; + if (indices.count <= 0) { + return Status(Status::DRACO_ERROR, "Could not convert indices."); + } + DRACO_ASSIGN_OR_RETURN(indices_data, + CopyDataAsUint32(gltf_model_, indices)); + } + return indices_data; +} + +Status GltfDecoder::DecodePrimitive(const tinygltf::Primitive &primitive, + const Eigen::Matrix4d &transform_matrix) { + if (primitive.mode != TINYGLTF_MODE_TRIANGLES && + primitive.mode != TINYGLTF_MODE_POINTS) { + return Status(Status::DRACO_ERROR, + "Primitive does not contain triangles or points."); + } + + // Store the transformation scale of this primitive loading as draco::Mesh. + if (scene_ == nullptr) { + // TODO(vytyaz): Do something for non-uniform scaling. + const float scale = transform_matrix.col(0).norm(); + gltf_primitive_material_to_scales_[primitive.material].push_back(scale); + } + + // Handle indices first. + DRACO_ASSIGN_OR_RETURN(const std::vector indices_data, + DecodePrimitiveIndices(primitive)); + const int number_of_faces = indices_data.size() / 3; + const int number_of_points = indices_data.size(); + + for (const auto &attribute : primitive.attributes) { + const tinygltf::Accessor &accessor = + gltf_model_.accessors[attribute.second]; + + const int att_id = + attribute_name_to_draco_mesh_attribute_id_[attribute.first]; + if (att_id == -1) { + continue; + } + + if (primitive.mode == TINYGLTF_MODE_TRIANGLES) { + DRACO_RETURN_IF_ERROR(AddAttributeValuesToBuilder( + attribute.first, accessor, indices_data, att_id, number_of_faces, + transform_matrix, &mb_)); + } else { + DRACO_RETURN_IF_ERROR(AddAttributeValuesToBuilder( + attribute.first, accessor, indices_data, att_id, number_of_points, + transform_matrix, &pb_)); + } + } + + // Add the material data only if there is more than one material. + if (gltf_primitive_material_to_draco_material_.size() > 1) { + const int material_index = primitive.material; + const auto it = + gltf_primitive_material_to_draco_material_.find(material_index); + if (it != gltf_primitive_material_to_draco_material_.end()) { + if (primitive.mode == TINYGLTF_MODE_TRIANGLES) { + DRACO_RETURN_IF_ERROR( + AddMaterialDataToBuilder(it->second, number_of_faces, &mb_)); + } else { + DRACO_RETURN_IF_ERROR( + AddMaterialDataToBuilder(it->second, number_of_points, &pb_)); + } + } + } + + next_face_id_ += number_of_faces; + next_point_id_ += number_of_points; + return OkStatus(); +} + +Status GltfDecoder::NodeGatherAttributeAndMaterialStats( + const tinygltf::Node &node) { + if (node.mesh >= 0) { + const tinygltf::Mesh &mesh = gltf_model_.meshes[node.mesh]; + for (const auto &primitive : mesh.primitives) { + DRACO_RETURN_IF_ERROR(AccumulatePrimitiveStats(primitive)); + + const auto it = + gltf_primitive_material_to_draco_material_.find(primitive.material); + if (it == gltf_primitive_material_to_draco_material_.end()) { + gltf_primitive_material_to_draco_material_[primitive.material] = + gltf_primitive_material_to_draco_material_.size(); + } + } + } + for (int i = 0; i < node.children.size(); ++i) { + const tinygltf::Node &child = gltf_model_.nodes[node.children[i]]; + DRACO_RETURN_IF_ERROR(NodeGatherAttributeAndMaterialStats(child)); + } + + return OkStatus(); +} + +Status GltfDecoder::GatherAttributeAndMaterialStats() { + for (const auto &scene : gltf_model_.scenes) { + for (int i = 0; i < scene.nodes.size(); ++i) { + const tinygltf::Node &node = gltf_model_.nodes[scene.nodes[i]]; + DRACO_RETURN_IF_ERROR(NodeGatherAttributeAndMaterialStats(node)); + } + } + return OkStatus(); +} + +void GltfDecoder::SumAttributeStats(const std::string &attribute_name, + int count) { + // We know that there must be a valid entry for |attribute_name| at this time. + mesh_attribute_data_[attribute_name].total_attribute_counts += count; +} + +Status GltfDecoder::CheckTypes(const std::string &attribute_name, + int component_type, int type, bool normalized) { + auto it_mad = mesh_attribute_data_.find(attribute_name); + + if (it_mad == mesh_attribute_data_.end()) { + MeshAttributeData mad; + mad.component_type = component_type; + mad.attribute_type = type; + mad.normalized = normalized; + mesh_attribute_data_[attribute_name] = mad; + return OkStatus(); + } + if (it_mad->second.component_type != component_type) { + return Status( + Status::DRACO_ERROR, + attribute_name + " attribute component type does not match previous."); + } + if (it_mad->second.attribute_type != type) { + return Status(Status::DRACO_ERROR, + attribute_name + " attribute type does not match previous."); + } + if (it_mad->second.normalized != normalized) { + return Status( + Status::DRACO_ERROR, + attribute_name + + " attribute normalized property does not match previous."); + } + + return OkStatus(); +} + +Status GltfDecoder::AccumulatePrimitiveStats( + const tinygltf::Primitive &primitive) { + DRACO_ASSIGN_OR_RETURN(const int indices_count, + DecodePrimitiveIndicesCount(primitive)); + if (primitive.mode == TINYGLTF_MODE_TRIANGLES) { + total_face_indices_count_ += indices_count; + } else if (primitive.mode == TINYGLTF_MODE_POINTS) { + total_point_indices_count_ += indices_count; + } else { + return ErrorStatus("Unsupported primitive indices mode."); + } + + for (const auto &attribute : primitive.attributes) { + if (attribute.second >= gltf_model_.accessors.size()) { + return ErrorStatus("Invalid accessor."); + } + const tinygltf::Accessor &accessor = + gltf_model_.accessors[attribute.second]; + + DRACO_RETURN_IF_ERROR(CheckTypes(attribute.first, accessor.componentType, + accessor.type, accessor.normalized)); + SumAttributeStats(attribute.first, accessor.count); + } + return OkStatus(); +} + +template +Status GltfDecoder::AddAttributesToDracoMesh(BuilderT *builder) { + for (const auto &attribute : mesh_attribute_data_) { + const GeometryAttribute::Type draco_att_type = + GltfAttributeToDracoAttribute(attribute.first); + if (draco_att_type == GeometryAttribute::INVALID) { + // Map an invalid attribute to attribute id -1 that will be ignored and + // not included in the Draco mesh. + attribute_name_to_draco_mesh_attribute_id_[attribute.first] = -1; + continue; + } + DRACO_ASSIGN_OR_RETURN( + const int att_id, + AddAttribute(draco_att_type, attribute.second.component_type, + attribute.second.attribute_type, builder)); + attribute_name_to_draco_mesh_attribute_id_[attribute.first] = att_id; + } + + // Add the material attribute. + if (gltf_model_.materials.size() > 1) { + draco::DataType component_type = DT_UINT32; + if (gltf_model_.materials.size() < 256) { + component_type = DT_UINT8; + } else if (gltf_model_.materials.size() < (1 << 16)) { + component_type = DT_UINT16; + } + material_att_id_ = + builder->AddAttribute(GeometryAttribute::MATERIAL, 1, component_type); + } + + return OkStatus(); +} + +template +Status GltfDecoder::AddAttributeValuesToBuilder( + const std::string &attribute_name, const tinygltf::Accessor &accessor, + const std::vector &indices_data, int att_id, + int number_of_elements, const Eigen::Matrix4d &transform_matrix, + BuilderT *builder) { + const bool reverse_winding = Determinant(transform_matrix) < 0; + if (attribute_name == "TEXCOORD_0" || attribute_name == "TEXCOORD_1") { + DRACO_RETURN_IF_ERROR(AddTexCoordToBuilder(accessor, indices_data, att_id, + number_of_elements, + reverse_winding, builder)); + } else if (attribute_name == "TANGENT") { + const Eigen::Matrix4d matrix = UpdateMatrixForNormals(transform_matrix); + DRACO_RETURN_IF_ERROR(AddTangentToBuilder(accessor, indices_data, att_id, + number_of_elements, matrix, + reverse_winding, builder)); + } else if (attribute_name == "POSITION" || attribute_name == "NORMAL") { + const Eigen::Matrix4d matrix = + (attribute_name == "NORMAL") ? UpdateMatrixForNormals(transform_matrix) + : transform_matrix; + const bool normalize = (attribute_name == "NORMAL"); + DRACO_RETURN_IF_ERROR(AddTransformedDataToBuilder( + accessor, indices_data, att_id, number_of_elements, matrix, normalize, + reverse_winding, builder)); + } else if (attribute_name.rfind("_FEATURE_ID_") == 0) { + DRACO_RETURN_IF_ERROR(AddFeatureIdToBuilder( + accessor, indices_data, att_id, number_of_elements, reverse_winding, + attribute_name, builder)); + } else { + DRACO_RETURN_IF_ERROR(AddAttributeDataByTypes(accessor, indices_data, + att_id, number_of_elements, + reverse_winding, builder)); + } + return OkStatus(); +} + +template +Status GltfDecoder::AddTangentToBuilder( + const tinygltf::Accessor &accessor, + const std::vector &indices_data, int att_id, + int number_of_elements, const Eigen::Matrix4d &transform_matrix, + bool reverse_winding, BuilderT *builder) { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + TinyGltfUtils::CopyDataAsFloat(gltf_model_, accessor)); + + for (int v = 0; v < data.size(); ++v) { + Eigen::Vector4d vec4(data[v][0], data[v][1], data[v][2], 1); + vec4 = transform_matrix * vec4; + + // Normalize the data. + Eigen::Vector3d vec3(vec4[0], vec4[1], vec4[2]); + vec3 = vec3.normalized(); + for (int i = 0; i < 3; ++i) { + vec4[i] = vec3[i]; + } + + // Add back the original w component. + vec4[3] = data[v][3]; + for (int i = 0; i < 4; ++i) { + data[v][i] = vec4[i]; + } + } + + SetValuesForBuilder(indices_data, att_id, number_of_elements, data, + reverse_winding, builder); + return OkStatus(); +} + +template +Status GltfDecoder::AddTexCoordToBuilder( + const tinygltf::Accessor &accessor, + const std::vector &indices_data, int att_id, + int number_of_elements, bool reverse_winding, BuilderT *builder) { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + TinyGltfUtils::CopyDataAsFloat(gltf_model_, accessor)); + + // glTF stores texture coordinates flipped on the horizontal axis compared to + // how Draco stores texture coordinates. + for (auto &uv : data) { + uv[1] = 1.0 - uv[1]; + } + + SetValuesForBuilder(indices_data, att_id, number_of_elements, data, + reverse_winding, builder); + return OkStatus(); +} + +template +Status GltfDecoder::AddFeatureIdToBuilder( + const tinygltf::Accessor &accessor, + const std::vector &indices_data, int att_id, + int number_of_elements, bool reverse_winding, + const std::string &attribute_name, BuilderT *builder) { + // Check that the feature ID attribute has correct type. + const int num_components = + TinyGltfUtils::GetNumComponentsForType(accessor.type); + if (num_components != 1) { + return ErrorStatus("Invalid feature ID attribute type."); + } + const draco::DataType draco_component_type = + GltfComponentTypeToDracoType(accessor.componentType); + if (draco_component_type != DT_UINT8 && draco_component_type != DT_UINT16 && + draco_component_type != DT_FLOAT32) { + return ErrorStatus("Invalid feature ID attribute component type."); + } + + // Set feature ID attribute values to mesh faces. + DRACO_RETURN_IF_ERROR(AddAttributeDataByTypes(accessor, indices_data, att_id, + number_of_elements, + reverse_winding, builder)); + + // Store feature ID attribute name with index like _FEATURE_ID_5 in Draco + // attribute metadata. + std::unique_ptr metadata(new draco::AttributeMetadata()); + metadata->AddEntryString("attribute_name", attribute_name); + builder->AddAttributeMetadata(att_id, std::move(metadata)); + return OkStatus(); +} + +template +Status GltfDecoder::AddTransformedDataToBuilder( + const tinygltf::Accessor &accessor, + const std::vector &indices_data, int att_id, + int number_of_elements, const Eigen::Matrix4d &transform_matrix, + bool normalize, bool reverse_winding, BuilderT *builder) { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + TinyGltfUtils::CopyDataAsFloat(gltf_model_, accessor)); + + for (int v = 0; v < data.size(); ++v) { + Eigen::Vector4d vec4(data[v][0], data[v][1], data[v][2], 1); + vec4 = transform_matrix * vec4; + Eigen::Vector3d vec3(vec4[0], vec4[1], vec4[2]); + if (normalize) { + vec3 = vec3.normalized(); + } + for (int i = 0; i < 3; ++i) { + data[v][i] = vec3[i]; + } + } + + SetValuesForBuilder(indices_data, att_id, number_of_elements, data, + reverse_winding, builder); + return OkStatus(); +} + +template +void GltfDecoder::SetValuesForBuilder(const std::vector &indices_data, + int att_id, int number_of_elements, + const std::vector &data, + bool reverse_winding, + TriangleSoupMeshBuilder *builder) { + SetValuesPerFace(indices_data, att_id, number_of_elements, data, + reverse_winding, builder); +} + +template +void GltfDecoder::SetValuesForBuilder(const std::vector &indices_data, + int att_id, int number_of_elements, + const std::vector &data, + bool reverse_winding, + PointCloudBuilder *builder) { + for (int i = 0; i < number_of_elements; ++i) { + const uint32_t v_id = indices_data[i]; + const PointIndex pi(v_id + next_point_id_); + builder->SetAttributeValueForPoint(att_id, pi, + GetDataContentAddress(data[v_id])); + } +} + +template +void GltfDecoder::SetValuesPerFace(const std::vector &indices_data, + int att_id, int number_of_faces, + const std::vector &data, + bool reverse_winding, + TriangleSoupMeshBuilder *mb) { + for (int f = 0; f < number_of_faces; ++f) { + const int base_corner = f * 3; + const uint32_t v_id = indices_data[base_corner]; + const int next_offset = reverse_winding ? 2 : 1; + const int prev_offset = reverse_winding ? 1 : 2; + const uint32_t v_next_id = indices_data[base_corner + next_offset]; + const uint32_t v_prev_id = indices_data[base_corner + prev_offset]; + + const FaceIndex face_index(f + next_face_id_); + mb->SetAttributeValuesForFace(att_id, face_index, + GetDataContentAddress(data[v_id]), + GetDataContentAddress(data[v_next_id]), + GetDataContentAddress(data[v_prev_id])); + } +} + +// Get the address of data content for arithmetic types |T|. +template +const void *GetDataContentAddressImpl(const T &data, + std::true_type /* is_arithmetic */) { + return &data; +} + +// Get the address of data content for vector types |T|. +template +const void *GetDataContentAddressImpl(const T &data, + std::false_type /* is_arithmetic */) { + return data.data(); +} + +template +const void *GltfDecoder::GetDataContentAddress(const T &data) const { + return GetDataContentAddressImpl(data, std::is_arithmetic()); +} + +template +Status GltfDecoder::AddAttributeDataByTypes( + const tinygltf::Accessor &accessor, + const std::vector &indices_data, int att_id, + int number_of_elements, bool reverse_winding, BuilderT *builder) { + typedef VectorD Vector2u8i; + typedef VectorD Vector3u8i; + typedef VectorD Vector4u8i; + typedef VectorD Vector2u16i; + typedef VectorD Vector3u16i; + typedef VectorD Vector4u16i; + switch (accessor.type) { + case TINYGLTF_TYPE_SCALAR: + switch (accessor.componentType) { + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE: { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, number_of_elements, + data, reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT: { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT: { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_FLOAT: { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, number_of_elements, + data, reverse_winding, builder); + } break; + default: + return ErrorStatus("Add attribute data, unknown component type."); + } + break; + case TINYGLTF_TYPE_VEC2: + switch (accessor.componentType) { + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE: { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT: { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_FLOAT: { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + TinyGltfUtils::CopyDataAsFloat(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + default: + return Status(Status::DRACO_ERROR, + "Add attribute data, unknown component type."); + } + break; + case TINYGLTF_TYPE_VEC3: + switch (accessor.componentType) { + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE: { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT: { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_FLOAT: { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + TinyGltfUtils::CopyDataAsFloat(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + default: + return Status(Status::DRACO_ERROR, + "Add attribute data, unknown component type."); + } + break; + case TINYGLTF_TYPE_VEC4: + switch (accessor.componentType) { + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE: { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT: { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + CopyDataAs(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + case TINYGLTF_COMPONENT_TYPE_FLOAT: { + DRACO_ASSIGN_OR_RETURN( + std::vector data, + TinyGltfUtils::CopyDataAsFloat(gltf_model_, accessor)); + SetValuesForBuilder(indices_data, att_id, + number_of_elements, data, + reverse_winding, builder); + } break; + default: + return Status(Status::DRACO_ERROR, + "Add attribute data, unknown component type."); + } + break; + default: + return Status(Status::DRACO_ERROR, "Add attribute data, unknown type."); + } + return OkStatus(); +} + +template +Status GltfDecoder::CopyTextures(T *owner) { + for (int i = 0; i < gltf_model_.images.size(); ++i) { + const tinygltf::Image &image = gltf_model_.images[i]; + if (image.width == -1 || image.height == -1 || image.component == -1) { + // TinyGLTF does not return an error when it cannot find an image. It will + // add an image with negative values. + return Status(Status::DRACO_ERROR, "Error loading image."); + } + + std::unique_ptr draco_texture(new Texture()); + + // Update mapping between glTF images and textures in the texture library. + gltf_image_to_draco_texture_[i] = draco_texture.get(); + + DRACO_ASSIGN_OR_RETURN(std::unique_ptr source_image, + GetSourceImage(gltf_model_, image, *draco_texture)); + if (source_image->encoded_data().empty() && + !source_image->filename().empty()) { + // Update filename of source image to be relative of the glTF file. + std::string dirname; + std::string basename; + SplitPath(input_file_name_, &dirname, &basename); + source_image->set_filename(dirname + "/" + source_image->filename()); + } + draco_texture->set_source_image(*source_image); + + owner->GetMaterialLibrary().MutableTextureLibrary().PushTexture( + std::move(draco_texture)); + } + return OkStatus(); +} + +void GltfDecoder::SetAttributePropertiesOnDracoMesh(Mesh *mesh) { + for (const auto &mad : mesh_attribute_data_) { + const int att_id = attribute_name_to_draco_mesh_attribute_id_[mad.first]; + if (att_id == -1) { + continue; + } + if (mad.second.normalized) { + mesh->attribute(att_id)->set_normalized(true); + } + } +} + +Status GltfDecoder::AddMaterialsToDracoMesh(Mesh *mesh) { + bool is_normal_map_used = false; + + int default_material_index = -1; + const auto it = gltf_primitive_material_to_draco_material_.find(-1); + if (it != gltf_primitive_material_to_draco_material_.end()) { + default_material_index = it->second; + } + + int output_material_index = 0; + for (int input_material_index = 0; + input_material_index < gltf_model_.materials.size(); + ++input_material_index) { + if (default_material_index == input_material_index) { + // Insert a default material here for primitives that did not have a + // material index. + mesh->GetMaterialLibrary().MutableMaterial(output_material_index++); + } + + Material *const output_material = + mesh->GetMaterialLibrary().MutableMaterial(output_material_index++); + DRACO_RETURN_IF_ERROR( + AddGltfMaterial(input_material_index, output_material)); + if (output_material->GetTextureMapByType( + TextureMap::NORMAL_TANGENT_SPACE)) { + is_normal_map_used = true; + } + } + + return OkStatus(); +} + +template +Status GltfDecoder::AddMaterialDataToBuilder(int material_value, + int number_of_elements, + BuilderT *builder) { + if (gltf_primitive_material_to_draco_material_.size() < 256) { + const uint8_t typed_material_value = material_value; + DRACO_RETURN_IF_ERROR(AddMaterialDataToBuilderInternal( + typed_material_value, number_of_elements, builder)); + } else if (gltf_primitive_material_to_draco_material_.size() < (1 << 16)) { + const uint16_t typed_material_value = material_value; + DRACO_RETURN_IF_ERROR(AddMaterialDataToBuilderInternal( + typed_material_value, number_of_elements, builder)); + } else { + const uint32_t typed_material_value = material_value; + DRACO_RETURN_IF_ERROR(AddMaterialDataToBuilderInternal( + typed_material_value, number_of_elements, builder)); + } + return OkStatus(); +} + +template +Status GltfDecoder::AddMaterialDataToBuilderInternal( + T material_value, int number_of_faces, TriangleSoupMeshBuilder *builder) { + for (int f = 0; f < number_of_faces; ++f) { + const FaceIndex face_index(f + next_face_id_); + builder->SetPerFaceAttributeValueForFace(material_att_id_, face_index, + &material_value); + } + return OkStatus(); +} + +template +Status GltfDecoder::AddMaterialDataToBuilderInternal( + T material_value, int number_of_points, PointCloudBuilder *builder) { + for (int pi = 0; pi < number_of_points; ++pi) { + const PointIndex point_index(pi + next_point_id_); + builder->SetAttributeValueForPoint(material_att_id_, point_index, + &material_value); + } + return OkStatus(); +} + +Status GltfDecoder::CheckAndAddTextureToDracoMaterial( + int texture_index, int tex_coord_attribute_index, + const tinygltf::ExtensionMap &tex_info_ext, Material *material, + TextureMap::Type type) { + if (texture_index < 0) { + return OkStatus(); + } + + const tinygltf::Texture &input_texture = gltf_model_.textures[texture_index]; + int source_index = input_texture.source; + + const auto texture_it = gltf_image_to_draco_texture_.find(source_index); + if (texture_it != gltf_image_to_draco_texture_.end()) { + Texture *const texture = texture_it->second; + // Default GLTF 2.0 sampler uses REPEAT mode along both S and T directions. + TextureMap::WrappingMode wrapping_mode(TextureMap::REPEAT); + TextureMap::FilterType min_filter = TextureMap::UNSPECIFIED; + TextureMap::FilterType mag_filter = TextureMap::UNSPECIFIED; + + if (input_texture.sampler >= 0) { + const tinygltf::Sampler &sampler = + gltf_model_.samplers[input_texture.sampler]; + DRACO_ASSIGN_OR_RETURN(wrapping_mode.s, + TinyGltfToDracoAxisWrappingMode(sampler.wrapS)); + DRACO_ASSIGN_OR_RETURN(wrapping_mode.t, + TinyGltfToDracoAxisWrappingMode(sampler.wrapT)); + DRACO_ASSIGN_OR_RETURN(min_filter, + TinyGltfToDracoFilterType(sampler.minFilter)); + DRACO_ASSIGN_OR_RETURN(mag_filter, + TinyGltfToDracoFilterType(sampler.magFilter)); + } + if (tex_coord_attribute_index < 0 || tex_coord_attribute_index > 1) { + return Status(Status::DRACO_ERROR, "Incompatible tex coord index."); + } + TextureTransform transform; + DRACO_ASSIGN_OR_RETURN(const bool has_transform, + CheckKhrTextureTransform(tex_info_ext, &transform)); + if (has_transform) { + DRACO_RETURN_IF_ERROR(material->SetTextureMap( + texture, type, wrapping_mode, min_filter, mag_filter, transform, + tex_coord_attribute_index)); + } else { + DRACO_RETURN_IF_ERROR( + material->SetTextureMap(texture, type, wrapping_mode, min_filter, + mag_filter, tex_coord_attribute_index)); + } + } + return OkStatus(); +} + +Status GltfDecoder::DecodeGltfToScene() { + DRACO_RETURN_IF_ERROR(GatherAttributeAndMaterialStats()); + DRACO_RETURN_IF_ERROR(AddLightsToScene()); + DRACO_RETURN_IF_ERROR(AddMaterialsVariantsNamesToScene()); + DRACO_RETURN_IF_ERROR(AddStructuralMetadataToGeometry(scene_.get())); + DRACO_RETURN_IF_ERROR(CopyTextures(scene_.get())); + for (const tinygltf::Scene &scene : gltf_model_.scenes) { + for (int i = 0; i < scene.nodes.size(); ++i) { + DRACO_RETURN_IF_ERROR( + DecodeNodeForScene(scene.nodes[i], kInvalidSceneNodeIndex)); + scene_->AddRootNodeIndex(gltf_node_to_scenenode_index_[scene.nodes[i]]); + } + } + + DRACO_RETURN_IF_ERROR(AddAnimationsToScene()); + DRACO_RETURN_IF_ERROR(AddMaterialsToScene()); + DRACO_RETURN_IF_ERROR(AddSkinsToScene()); + MoveNonMaterialTextures(scene_.get()); + + return OkStatus(); +} + +Status GltfDecoder::AddLightsToScene() { + // Add all lights to Draco scene. + for (const auto &light : gltf_model_.lights) { + // Add a new light to the scene. + const LightIndex light_index = scene_->AddLight(); + Light *scene_light = scene_->GetLight(light_index); + + // Decode light type. + const std::map types = { + {"directional", Light::DIRECTIONAL}, + {"point", Light::POINT}, + {"spot", Light::SPOT}}; + if (types.count(light.type) == 0) { + return ErrorStatus("Light type is invalid."); + } + scene_light->SetType(types.at(light.type)); + + // Decode spot light properties. + if (scene_light->GetType() == Light::SPOT) { + scene_light->SetInnerConeAngle(light.spot.innerConeAngle); + scene_light->SetOuterConeAngle(light.spot.outerConeAngle); + } + + // Decode other light properties. + scene_light->SetName(light.name); + if (!light.color.empty()) { // Empty means that color is not specified. + if (light.color.size() != 3) { + return ErrorStatus("Light color is malformed."); + } + scene_light->SetColor( + Vector3f(light.color[0], light.color[1], light.color[2])); + } + scene_light->SetIntensity(light.intensity); + if (light.range != 0.0) { // Zero means that range is not specified. + if (light.range < 0.0) { + return ErrorStatus("Light range must be positive."); + } + scene_light->SetRange(light.range); + } + } + return OkStatus(); +} + +Status GltfDecoder::AddMaterialsVariantsNamesToScene() { + // Check whether the scene has materials variants. + const auto &e = gltf_model_.extensions.find("KHR_materials_variants"); + if (e == gltf_model_.extensions.end()) { + // The scene has no materials variants. + return OkStatus(); + } + + // Decode all materials variants names into Draco scene from JSON like this: + // "KHR_materials_variants": { + // "variants": [ + // {"name": "Loki" }, + // {"name": "Odin" }, + // ] + // } + const tinygltf::Value::Object &o = e->second.Get(); + const auto &variants = o.find("variants"); + if (variants == o.end()) { + return ErrorStatus("Materials variants extension with names is malformed."); + } + const tinygltf::Value &variants_array = variants->second; + if (!variants_array.IsArray()) { + return ErrorStatus("Materials variants names array is malformed."); + } + for (int i = 0; i < variants_array.Size(); i++) { + const auto &variant_object = variants_array.Get(i); + if (!variant_object.IsObject() || !variant_object.Has("name")) { + return ErrorStatus("Materials variants name is missing."); + } + const auto &name_string = variant_object.Get("name"); + if (!name_string.IsString()) { + return ErrorStatus("Materials variant name is malformed."); + } + const std::string &name = name_string.Get(); + scene_->GetMaterialLibrary().AddMaterialsVariant(name); + } + return OkStatus(); +} + +template +Status GltfDecoder::AddStructuralMetadataToGeometry(GeometryT *geometry) { + // Check whether the glTF model has structural metadata. + const auto &e = gltf_model_.extensions.find("EXT_structural_metadata"); + if (e == gltf_model_.extensions.end()) { + // The glTF model has no structural metadata. + return OkStatus(); + } + const tinygltf::Value::Object &o = e->second.Get(); + + // Decode property table schema. + { + const auto &value = o.find("schema"); + if (value == o.end()) { + return ErrorStatus("Structural metadata extension has no schema."); + } + const tinygltf::Value &object = value->second; + if (!object.IsObject()) { + return ErrorStatus("Structural metadata extension schema is malformed."); + } + + // Decodes tinygltf::Value into PropertyTable::Schema::Object. + struct SchemaParser { + static Status Parse(const tinygltf::Value &value, + PropertyTable::Schema::Object *object) { + switch (value.Type()) { + case tinygltf::OBJECT_TYPE: { + for (auto &it : value.Get()) { + object->SetObjects().emplace_back(it.first); + DRACO_RETURN_IF_ERROR( + Parse(it.second, &object->SetObjects().back())); + } + } break; + case tinygltf::ARRAY_TYPE: { + for (int i = 0; i < value.ArrayLen(); ++i) { + object->SetArray().emplace_back(); + DRACO_RETURN_IF_ERROR( + Parse(value.Get(i), &object->SetArray().back())); + } + } break; + case tinygltf::STRING_TYPE: + object->SetString(value.Get()); + break; + case tinygltf::INT_TYPE: + object->SetInteger(value.Get()); + break; + case tinygltf::BOOL_TYPE: + object->SetBoolean(value.Get()); + break; + case tinygltf::REAL_TYPE: + case tinygltf::BINARY_TYPE: + case tinygltf::NULL_TYPE: + default: + // Not used in the schema JSON. + return ErrorStatus("Unsupported JSON type in schema."); + } + return OkStatus(); + } + }; + + // Parse property table schema and set it to |geometry|. + PropertyTable::Schema schema; + DRACO_RETURN_IF_ERROR(SchemaParser::Parse(object, &schema.json)); + geometry->GetStructuralMetadata().SetPropertyTableSchema(schema); + } + + // Decode property tables. + { + const auto &tables = o.find("propertyTables"); + if (tables == o.end()) { + return ErrorStatus( + "Structural metadata extension has no property tables."); + } + const tinygltf::Value &tables_array = tables->second; + if (!tables_array.IsArray()) { + return ErrorStatus("Property tables array is malformed."); + } + + // Loop over all property tables. + for (int i = 0; i < tables_array.Size(); i++) { + // Create a property table and populate it below. + std::unique_ptr property_table(new PropertyTable()); + + const auto &object = tables_array.Get(i); + if (!object.IsObject()) { + return ErrorStatus("Property table is malformed."); + } + const auto o = object.Get(); + + // The "class" property is required. + bool success; + std::string str_value; + DRACO_ASSIGN_OR_RETURN(success, DecodeString("class", o, &str_value)); + if (success) { + property_table->SetClass(str_value); + } else { + return ErrorStatus("Property class is malformed."); + } + + // The "count" property is required. + int int_value; + DRACO_ASSIGN_OR_RETURN(success, DecodeInt("count", o, &int_value)); + if (success) { + property_table->SetCount(int_value); + } else { + return ErrorStatus("Property count is malformed."); + } + + // The "name" property is optional. + DRACO_ASSIGN_OR_RETURN(success, DecodeString("name", o, &str_value)); + if (success) { + property_table->SetName(str_value); + } + + // Decode property table properties (columns). + { + constexpr char kName[] = "properties"; + if (!object.Has(kName)) { + return ErrorStatus("Property table is malformed."); + } + const tinygltf::Value &value = object.Get(kName); + if (!value.IsObject()) { + return ErrorStatus( + "Property table properties property is malformed."); + } + + // Loop over property table properties. + for (const auto &key : value.Keys()) { + // Create a property table property and populate it below. + std::unique_ptr property( + new PropertyTable::Property()); + + const auto &property_object = value.Get(key); + if (!property_object.IsObject()) { + return ErrorStatus("Property entry is malformed."); + } + property->SetName(key); + const auto o = property_object.Get(); + + // The "values" property is required. + DRACO_ASSIGN_OR_RETURN( + success, + DecodePropertyTableData("values", o, &property->GetData())); + if (!success) { + return ErrorStatus("Property values property is malformed."); + } + + // All other properties are not required. + DRACO_ASSIGN_OR_RETURN( + success, DecodeString("stringOffsetType", o, &str_value)); + if (success) { + property->GetStringOffsets().type = str_value; + } + DRACO_ASSIGN_OR_RETURN( + success, DecodeString("arrayOffsetType", o, &str_value)); + if (success) { + property->GetArrayOffsets().type = str_value; + } + DRACO_ASSIGN_OR_RETURN( + success, + DecodePropertyTableData("arrayOffsets", o, + &property->GetArrayOffsets().data)); + DRACO_ASSIGN_OR_RETURN( + success, + DecodePropertyTableData("stringOffsets", o, + &property->GetStringOffsets().data)); + + // Add property to the property table. + property_table->AddProperty(std::move(property)); + } + } + + // Add property table to structural metadata. + geometry->GetStructuralMetadata().AddPropertyTable( + std::move(property_table)); + } + } + return OkStatus(); +} + +Status GltfDecoder::AddAnimationsToScene() { + for (const auto &animation : gltf_model_.animations) { + const AnimationIndex animation_index = scene_->AddAnimation(); + Animation *const encoder_animation = scene_->GetAnimation(animation_index); + encoder_animation->SetName(animation.name); + + for (const tinygltf::AnimationChannel &channel : animation.channels) { + const auto it = gltf_node_to_scenenode_index_.find(channel.target_node); + if (it == gltf_node_to_scenenode_index_.end()) { + return Status(Status::DRACO_ERROR, "Could not find Node in the scene."); + } + DRACO_RETURN_IF_ERROR(TinyGltfUtils::AddChannelToAnimation( + gltf_model_, animation, channel, it->second.value(), + encoder_animation)); + } + } + return OkStatus(); +} + +Status GltfDecoder::DecodeNodeForScene(int node_index, + SceneNodeIndex parent_index) { + SceneNodeIndex scene_node_index = kInvalidSceneNodeIndex; + SceneNode *scene_node = nullptr; + bool is_new_node; + if (gltf_scene_graph_mode_ == GltfSceneGraphMode::DAG && + gltf_node_to_scenenode_index_.find(node_index) != + gltf_node_to_scenenode_index_.end()) { + // Node has been decoded already. + scene_node_index = gltf_node_to_scenenode_index_[node_index]; + scene_node = scene_->GetNode(scene_node_index); + is_new_node = false; + } else { + scene_node_index = scene_->AddNode(); + // Update mapping between glTF Nodes and indices in the scene. + gltf_node_to_scenenode_index_[node_index] = scene_node_index; + + scene_node = scene_->GetNode(scene_node_index); + is_new_node = true; + } + + if (parent_index != kInvalidSceneNodeIndex) { + scene_node->AddParentIndex(parent_index); + SceneNode *const parent_node = scene_->GetNode(parent_index); + parent_node->AddChildIndex(scene_node_index); + } + + if (!is_new_node) { + return OkStatus(); + } + const tinygltf::Node &node = gltf_model_.nodes[node_index]; + if (!node.name.empty()) { + scene_node->SetName(node.name); + } + std::unique_ptr trsm = GetNodeTrsMatrix(node); + scene_node->SetTrsMatrix(*trsm); + if (node.skin >= 0) { + // Save the index to the source skins in the node. This will be updated + // later when the skins are processed. + scene_node->SetSkinIndex(SkinIndex(node.skin)); + } + if (node.mesh >= 0) { + // Check if we have already parsed this glTF Mesh. + const auto it = gltf_mesh_to_scene_mesh_group_.find(node.mesh); + if (it != gltf_mesh_to_scene_mesh_group_.end()) { + // We already processed this glTF mesh. + scene_node->SetMeshGroupIndex(it->second); + } else { + const MeshGroupIndex scene_mesh_group_index = scene_->AddMeshGroup(); + MeshGroup *const scene_mesh = + scene_->GetMeshGroup(scene_mesh_group_index); + + const tinygltf::Mesh &mesh = gltf_model_.meshes[node.mesh]; + if (!mesh.name.empty()) { + scene_mesh->SetName(mesh.name); + } + for (const auto &primitive : mesh.primitives) { + DRACO_RETURN_IF_ERROR(DecodePrimitiveForScene(primitive, scene_mesh)); + } + scene_node->SetMeshGroupIndex(scene_mesh_group_index); + gltf_mesh_to_scene_mesh_group_[node.mesh] = scene_mesh_group_index; + } + } + + // Decode light index. + const auto &e = node.extensions.find("KHR_lights_punctual"); + if (e != node.extensions.end()) { + const tinygltf::Value::Object &o = e->second.Get(); + const auto &light = o.find("light"); + if (light != o.end()) { + const tinygltf::Value &value = light->second; + if (!value.IsInt()) { + return ErrorStatus("Node light index is malformed."); + } + const int light_index = value.Get(); + if (light_index < 0 || light_index >= scene_->NumLights()) { + return ErrorStatus("Node light index is out of bounds."); + } + scene_node->SetLightIndex(LightIndex(light_index)); + } + } + + for (int i = 0; i < node.children.size(); ++i) { + DRACO_RETURN_IF_ERROR( + DecodeNodeForScene(node.children[i], scene_node_index)); + } + return OkStatus(); +} + +Status GltfDecoder::DecodePrimitiveForScene( + const tinygltf::Primitive &primitive, MeshGroup *mesh_group) { + if (primitive.mode != TINYGLTF_MODE_TRIANGLES && + primitive.mode != TINYGLTF_MODE_POINTS) { + return Status(Status::DRACO_ERROR, + "Primitive does not contain triangles or points."); + } + + // Decode materials variants mappings if present in this primitive. + std::vector mappings; + const auto &e = primitive.extensions.find("KHR_materials_variants"); + if (e != primitive.extensions.end()) { + DRACO_RETURN_IF_ERROR(DecodeMaterialsVariantsMappings( + e->second.Get(), &mappings)); + } + + const PrimitiveSignature signature(primitive); + const auto existing_mesh_index = + gltf_primitive_to_draco_mesh_index_.find(signature); + if (existing_mesh_index != gltf_primitive_to_draco_mesh_index_.end()) { + mesh_group->AddMeshInstance( + {existing_mesh_index->second, primitive.material, mappings}); + return OkStatus(); + } + + // Handle indices first. + DRACO_ASSIGN_OR_RETURN(const std::vector indices_data, + DecodePrimitiveIndices(primitive)); + const int number_of_faces = indices_data.size() / 3; + const int number_of_points = indices_data.size(); + + // Note that glTF mesh |primitive| has no name; no name is set to Draco mesh. + TriangleSoupMeshBuilder mb; + PointCloudBuilder pb; + if (primitive.mode == TINYGLTF_MODE_TRIANGLES) { + mb.Start(number_of_faces); + } else { + pb.Start(number_of_points); + } + + std::set normalized_attributes; + for (const auto &attribute : primitive.attributes) { + if (attribute.second >= gltf_model_.accessors.size()) { + return ErrorStatus("Invalid accessor."); + } + const tinygltf::Accessor &accessor = + gltf_model_.accessors[attribute.second]; + const int component_type = accessor.componentType; + const int type = accessor.type; + const bool normalized = accessor.normalized; + int att_id = -1; + if (primitive.mode == TINYGLTF_MODE_TRIANGLES) { + DRACO_ASSIGN_OR_RETURN( + att_id, AddAttribute(attribute.first, component_type, type, &mb)); + } else { + DRACO_ASSIGN_OR_RETURN( + att_id, AddAttribute(attribute.first, component_type, type, &pb)); + } + if (att_id == -1) { + continue; + } + if (normalized) { + normalized_attributes.insert(att_id); + } + + if (primitive.mode == TINYGLTF_MODE_TRIANGLES) { + DRACO_RETURN_IF_ERROR(AddAttributeValuesToBuilder( + attribute.first, accessor, indices_data, att_id, number_of_faces, + Eigen::Matrix4d::Identity(), &mb)); + } else { + DRACO_RETURN_IF_ERROR(AddAttributeValuesToBuilder( + attribute.first, accessor, indices_data, att_id, number_of_points, + Eigen::Matrix4d::Identity(), &pb)); + } + } + + int material_index = primitive.material; + + DRACO_ASSIGN_OR_RETURN( + std::unique_ptr mesh, + BuildMeshFromBuilder(primitive.mode == TINYGLTF_MODE_TRIANGLES, &mb, + &pb)); + + // Set all normalized flags for appropriate attributes. + for (const int32_t att_id : normalized_attributes) { + mesh->attribute(att_id)->set_normalized(true); + } + // Decode mesh feature ID sets if present in this primitive. + DRACO_RETURN_IF_ERROR(DecodeMeshFeatures( + primitive, &scene_->GetMaterialLibrary().MutableTextureLibrary(), + mesh.get())); + + const MeshIndex mesh_index = scene_->AddMesh(std::move(mesh)); + if (mesh_index == kInvalidMeshIndex) { + return Status(Status::DRACO_ERROR, "Could not add Draco mesh to scene."); + } + mesh_group->AddMeshInstance({mesh_index, material_index, mappings}); + + gltf_primitive_to_draco_mesh_index_[signature] = mesh_index; + return OkStatus(); +} + +Status GltfDecoder::DecodeMaterialsVariantsMappings( + const tinygltf::Value::Object &extension, + std::vector *mappings) { + // Decode all materials variants mappings from JSON like this: + // "KHR_materials_variants" : { + // "mappings": [ + // { + // "material": 2, + // "variants": [0, 2, 4] + // }, + // { + // "material": 3, + // "variants": [1, 3] + // } + // ] + // } + const auto &mappings_object = extension.find("mappings"); + if (mappings_object == extension.end()) { + return ErrorStatus("Materials variants extension is malformed."); + } + const tinygltf::Value &mappings_array = mappings_object->second; + if (!mappings_array.IsArray()) { + return ErrorStatus("Materials variants mappings array is malformed."); + } + for (int i = 0; i < mappings_array.Size(); i++) { + const auto &mapping_object = mappings_array.Get(i); + if (!mapping_object.IsObject() || !mapping_object.Has("material") || + !mapping_object.Has("variants")) { + return ErrorStatus("Materials variants mapping is malformed."); + } + const tinygltf::Value &material_int = mapping_object.Get("material"); + if (!material_int.IsInt()) { + return ErrorStatus("Materials variant mapping material is malformed."); + } + const int material = material_int.Get(); + const tinygltf::Value &variants_array = mapping_object.Get("variants"); + if (!variants_array.IsArray()) { + return ErrorStatus("Materials variant mapping variants is malformed."); + } + std::vector variants; + for (int j = 0; j < variants_array.Size(); j++) { + const tinygltf::Value &variant_int = variants_array.Get(j); + if (!variant_int.IsInt()) { + return ErrorStatus("Materials variants mapping variant is malformed."); + } + variants.push_back(variant_int.Get()); + } + mappings->push_back({material, variants}); + } + return OkStatus(); +} + +Status GltfDecoder::DecodeMeshFeatures(const tinygltf::Primitive &primitive, + TextureLibrary *texture_library, + Mesh *mesh) { + const auto &e = primitive.extensions.find("EXT_mesh_features"); + if (e == primitive.extensions.end()) { + return OkStatus(); + } + std::vector> mesh_features; + DRACO_RETURN_IF_ERROR( + DecodeMeshFeatures(e->second.Get(), + texture_library, &mesh_features)); + for (int i = 0; i < mesh_features.size(); i++) { + const MeshFeaturesIndex mfi = + mesh->AddMeshFeatures(std::move(mesh_features[i])); + if (scene_ == nullptr) { + // If we are decoding to a mesh, we need to restrict the mesh features to + // the primitive's material. + // TODO(ostava): This will not work properly when two primitives share the + // same material but have different mesh features. We will need to + // duplicate the materials in this case. + const auto mat_it = + gltf_primitive_material_to_draco_material_.find(primitive.material); + if (mat_it != gltf_primitive_material_to_draco_material_.end()) { + mesh->AddMeshFeaturesMaterialMask(mfi, mat_it->second); + } + } + } + return OkStatus(); +} + +Status GltfDecoder::DecodeMeshFeatures( + const tinygltf::Value::Object &extension, TextureLibrary *texture_library, + std::vector> *mesh_features) { + // Decode all mesh feature ID sets from JSON like this: + // "EXT_mesh_features": { + // "featureIds": [ + // { + // "label": "water", + // "featureCount": 2, + // "propertyTable": 0, + // "attribute": 0 + // }, + // { + // "featureCount": 12, + // "nullFeatureId": 100, + // "texture" : { + // "index": 0, + // "texCoord": 0, + // "channels": [0, 1, 2, 3] + // } + // } + // ] + // } + const auto &object = extension.find("featureIds"); + if (object == extension.end()) { + return ErrorStatus("Mesh features extension is malformed."); + } + const tinygltf::Value &array = object->second; + if (!array.IsArray()) { + return ErrorStatus("Mesh features array is malformed."); + } + for (int i = 0; i < array.Size(); i++) { + // Create a new feature ID set object and populate it below. + mesh_features->push_back(std::unique_ptr(new MeshFeatures())); + MeshFeatures &features = *mesh_features->back(); + + const auto &object = array.Get(i); + if (!object.IsObject()) { + return ErrorStatus("Mesh features array entry is malformed."); + } + + // The "featureCount" property is required. + { + constexpr char kName[] = "featureCount"; + if (!object.Has(kName)) { + return ErrorStatus("Mesh features is malformed."); + } + const tinygltf::Value &value = object.Get(kName); + if (!value.IsInt()) { + return ErrorStatus("Feature count property is malformed."); + } + features.SetFeatureCount(value.Get()); + } + + // All other properties are optional. + { + constexpr char kName[] = "nullFeatureId"; + if (object.Has(kName)) { + const tinygltf::Value &value = object.Get(kName); + if (!value.IsInt()) { + return ErrorStatus("Null feature ID property is malformed."); + } + features.SetNullFeatureId(value.Get()); + } + } + { + constexpr char kName[] = "label"; + if (object.Has(kName)) { + const tinygltf::Value &value = object.Get(kName); + if (!value.IsString()) { + return ErrorStatus("Label property is malformed."); + } + features.SetLabel(value.Get()); + } + } + { + constexpr char kName[] = "attribute"; + if (object.Has(kName)) { + const tinygltf::Value &value = object.Get(kName); + if (!value.IsInt()) { + return ErrorStatus("Attribute property is malformed."); + } + features.SetAttributeIndex(value.Get()); + } + } + { + constexpr char kName[] = "texture"; + if (object.Has(kName)) { + const tinygltf::Value &value = object.Get(kName); + if (!value.IsObject()) { + return ErrorStatus("Texture property is malformed."); + } + + // Decode texture contining mesh feature IDs into the |features| object + // via a temporary |material| object. + Material material(texture_library); + const auto &container_object = object.Get(); + DRACO_RETURN_IF_ERROR(DecodeTexture(kName, TextureMap::GENERIC, + container_object, &material)); + features.SetTextureMap( + *material.GetTextureMapByType(TextureMap::GENERIC)); + + // Decode array of texture channel indices. + std::vector channels; + { + constexpr char kName[] = "channels"; + if (value.Has(kName)) { + const tinygltf::Value &array = value.Get(kName); + if (!array.IsArray()) { + return ErrorStatus("Channels property is malformed."); + } + for (int i = 0; i < array.Size(); i++) { + const tinygltf::Value &value = array.Get(i); + if (!value.IsNumber()) { + return Status(Status::DRACO_ERROR, + "Channels value is malformed."); + } + channels.push_back(value.Get()); + } + } else { + channels = {0}; + } + } + features.SetTextureChannels(channels); + } + } + { + constexpr char kName[] = "propertyTable"; + if (object.Has(kName)) { + const tinygltf::Value &value = object.Get(kName); + if (!value.IsInt()) { + return ErrorStatus("Property table property is malformed."); + } + features.SetPropertyTableIndex(value.Get()); + } + } + } + return OkStatus(); +} + +template +StatusOr GltfDecoder::AddAttribute(const std::string &attribute_name, + int component_type, int type, + BuilderT *builder) { + const GeometryAttribute::Type draco_att_type = + GltfAttributeToDracoAttribute(attribute_name); + if (draco_att_type == GeometryAttribute::INVALID) { + // Return attribute id -1 that will be ignored and not included in the mesh. + return -1; + } + DRACO_ASSIGN_OR_RETURN( + const int att_id, + AddAttribute(draco_att_type, component_type, type, builder)); + return att_id; +} + +template +StatusOr GltfDecoder::AddAttribute(GeometryAttribute::Type attribute_type, + int component_type, int type, + BuilderT *builder) { + const int num_components = TinyGltfUtils::GetNumComponentsForType(type); + if (num_components == 0) { + return Status(Status::DRACO_ERROR, + "Could not add attribute with 0 components."); + } + + const draco::DataType draco_component_type = + GltfComponentTypeToDracoType(component_type); + if (draco_component_type == DT_INVALID) { + return Status(Status::DRACO_ERROR, + "Could not add attribute with invalid type."); + } + const int att_id = builder->AddAttribute(attribute_type, num_components, + draco_component_type); + if (att_id < 0) { + return Status(Status::DRACO_ERROR, "Could not add attribute."); + } + return att_id; +} + +StatusOr GltfDecoder::CheckKhrTextureTransform( + const tinygltf::ExtensionMap &extension, TextureTransform *transform) { + bool transform_set = false; + + const auto &e = extension.find("KHR_texture_transform"); + if (e == extension.end()) { + return false; + } + const tinygltf::Value::Object &o = e->second.Get(); + const auto &scale = o.find("scale"); + if (scale != o.end()) { + const tinygltf::Value &array = scale->second; + if (!array.IsArray() || array.Size() != 2) { + return Status(Status::DRACO_ERROR, + "KhrTextureTransform scale is malformed."); + } + std::array scale; + for (int i = 0; i < array.Size(); i++) { + const tinygltf::Value &value = array.Get(i); + if (!value.IsNumber()) { + return Status(Status::DRACO_ERROR, + "KhrTextureTransform scale is malformed."); + } + scale[i] = value.Get(); + transform_set = true; + } + transform->set_scale(scale); + } + const auto &rotation = o.find("rotation"); + if (rotation != o.end()) { + const tinygltf::Value &value = rotation->second; + if (!value.IsNumber()) { + return Status(Status::DRACO_ERROR, + "KhrTextureTransform rotation is malformed."); + } + transform->set_rotation(value.Get()); + transform_set = true; + } + const auto &offset = o.find("offset"); + if (offset != o.end()) { + const tinygltf::Value &array = offset->second; + if (!array.IsArray() || array.Size() != 2) { + return Status(Status::DRACO_ERROR, + "KhrTextureTransform offset is malformed."); + } + std::array offset; + for (int i = 0; i < array.Size(); i++) { + const tinygltf::Value &value = array.Get(i); + if (!value.IsNumber()) { + return Status(Status::DRACO_ERROR, + "KhrTextureTransform offset is malformed."); + } + offset[i] = value.Get(); + transform_set = true; + } + transform->set_offset(offset); + } + const auto &tex_coord = o.find("texCoord"); + if (tex_coord != o.end()) { + const tinygltf::Value &value = tex_coord->second; + if (!value.IsInt()) { + return Status(Status::DRACO_ERROR, + "KhrTextureTransform texCoord is malformed."); + } + transform->set_tex_coord(value.Get()); + transform_set = true; + } + return transform_set; +} + +Status GltfDecoder::AddGltfMaterial(int input_material_index, + Material *output_material) { + const tinygltf::Material &input_material = + gltf_model_.materials[input_material_index]; + + output_material->SetName(input_material.name); + output_material->SetTransparencyMode( + TinyGltfUtils::TextToMaterialMode(input_material.alphaMode)); + output_material->SetAlphaCutoff(input_material.alphaCutoff); + if (input_material.emissiveFactor.size() == 3) { + output_material->SetEmissiveFactor(Vector3f( + input_material.emissiveFactor[0], input_material.emissiveFactor[1], + input_material.emissiveFactor[2])); + } + const tinygltf::PbrMetallicRoughness &pbr = + input_material.pbrMetallicRoughness; + + if (pbr.baseColorFactor.size() == 4) { + output_material->SetColorFactor( + Vector4f(pbr.baseColorFactor[0], pbr.baseColorFactor[1], + pbr.baseColorFactor[2], pbr.baseColorFactor[3])); + } + output_material->SetMetallicFactor(pbr.metallicFactor); + output_material->SetRoughnessFactor(pbr.roughnessFactor); + output_material->SetDoubleSided(input_material.doubleSided); + + DRACO_RETURN_IF_ERROR(CheckAndAddTextureToDracoMaterial( + pbr.baseColorTexture.index, pbr.baseColorTexture.texCoord, + pbr.baseColorTexture.extensions, output_material, TextureMap::COLOR)); + DRACO_RETURN_IF_ERROR(CheckAndAddTextureToDracoMaterial( + pbr.metallicRoughnessTexture.index, pbr.metallicRoughnessTexture.texCoord, + pbr.metallicRoughnessTexture.extensions, output_material, + TextureMap::METALLIC_ROUGHNESS)); + + DRACO_RETURN_IF_ERROR(CheckAndAddTextureToDracoMaterial( + input_material.normalTexture.index, input_material.normalTexture.texCoord, + input_material.normalTexture.extensions, output_material, + TextureMap::NORMAL_TANGENT_SPACE)); + if (input_material.normalTexture.scale != 1.0) { + output_material->SetNormalTextureScale(input_material.normalTexture.scale); + } + DRACO_RETURN_IF_ERROR(CheckAndAddTextureToDracoMaterial( + input_material.occlusionTexture.index, + input_material.occlusionTexture.texCoord, + input_material.occlusionTexture.extensions, output_material, + TextureMap::AMBIENT_OCCLUSION)); + DRACO_RETURN_IF_ERROR(CheckAndAddTextureToDracoMaterial( + input_material.emissiveTexture.index, + input_material.emissiveTexture.texCoord, + input_material.emissiveTexture.extensions, output_material, + TextureMap::EMISSIVE)); + + // Decode material extensions. + DecodeMaterialUnlitExtension(input_material, output_material); + DRACO_RETURN_IF_ERROR( + DecodeMaterialSheenExtension(input_material, output_material)); + DRACO_RETURN_IF_ERROR( + DecodeMaterialTransmissionExtension(input_material, output_material)); + DRACO_RETURN_IF_ERROR( + DecodeMaterialClearcoatExtension(input_material, output_material)); + DRACO_RETURN_IF_ERROR(DecodeMaterialVolumeExtension( + input_material, input_material_index, output_material)); + DRACO_RETURN_IF_ERROR( + DecodeMaterialIorExtension(input_material, output_material)); + DRACO_RETURN_IF_ERROR( + DecodeMaterialSpecularExtension(input_material, output_material)); + + return OkStatus(); +} + +void GltfDecoder::DecodeMaterialUnlitExtension( + const tinygltf::Material &input_material, Material *output_material) { + // Do nothing if extension is absent. + const auto &extension_it = + input_material.extensions.find("KHR_materials_unlit"); + if (extension_it == input_material.extensions.end()) { + return; + } + + // Set the unlit property in Draco material. + output_material->SetUnlit(true); +} + +Status GltfDecoder::DecodeMaterialSheenExtension( + const tinygltf::Material &input_material, Material *output_material) { + // Do nothing if extension is absent. + const auto &extension_it = + input_material.extensions.find("KHR_materials_sheen"); + if (extension_it == input_material.extensions.end()) { + return OkStatus(); + } + + output_material->SetHasSheen(true); + const tinygltf::Value::Object &extension_object = + extension_it->second.Get(); + + // Decode sheen color factor. + Vector3f vector; + bool success; + DRACO_ASSIGN_OR_RETURN( + success, DecodeVector3f("sheenColorFactor", extension_object, &vector)); + if (success) { + output_material->SetSheenColorFactor(vector); + } + + // Decode sheen roughness factor. + float value; + DRACO_ASSIGN_OR_RETURN( + success, DecodeFloat("sheenRoughnessFactor", extension_object, &value)); + if (success) { + output_material->SetSheenRoughnessFactor(value); + } + + // Decode sheen color texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("sheenColorTexture", + TextureMap::SHEEN_COLOR, extension_object, + output_material)); + + // Decode sheen roughness texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("sheenRoughnessTexture", + TextureMap::SHEEN_ROUGHNESS, + extension_object, output_material)); + + return OkStatus(); +} + +Status GltfDecoder::DecodeMaterialTransmissionExtension( + const tinygltf::Material &input_material, Material *output_material) { + // Do nothing if extension is absent. + const auto &extension_it = + input_material.extensions.find("KHR_materials_transmission"); + if (extension_it == input_material.extensions.end()) { + return OkStatus(); + } + + output_material->SetHasTransmission(true); + const tinygltf::Value::Object &extension_object = + extension_it->second.Get(); + + // Decode transmission factor. + float value; + DRACO_ASSIGN_OR_RETURN( + const bool success, + DecodeFloat("transmissionFactor", extension_object, &value)); + if (success) { + output_material->SetTransmissionFactor(value); + } + + // Decode transmission texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("transmissionTexture", + TextureMap::TRANSMISSION, + extension_object, output_material)); + + return OkStatus(); +} + +Status GltfDecoder::DecodeMaterialClearcoatExtension( + const tinygltf::Material &input_material, Material *output_material) { + // Do nothing if extension is absent. + const auto &extension_it = + input_material.extensions.find("KHR_materials_clearcoat"); + if (extension_it == input_material.extensions.end()) { + return OkStatus(); + } + + output_material->SetHasClearcoat(true); + const tinygltf::Value::Object &extension_object = + extension_it->second.Get(); + + // Decode clearcoat factor. + float value; + bool success; + DRACO_ASSIGN_OR_RETURN( + success, DecodeFloat("clearcoatFactor", extension_object, &value)); + if (success) { + output_material->SetClearcoatFactor(value); + } + + // Decode clearcoat roughness factor. + DRACO_ASSIGN_OR_RETURN(success, DecodeFloat("clearcoatRoughnessFactor", + extension_object, &value)); + if (success) { + output_material->SetClearcoatRoughnessFactor(value); + } + + // Decode clearcoat texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("clearcoatTexture", TextureMap::CLEARCOAT, + extension_object, output_material)); + + // Decode clearcoat roughness texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("clearcoatRoughnessTexture", + TextureMap::CLEARCOAT_ROUGHNESS, + extension_object, output_material)); + + // Decode clearcoat normal texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("clearcoatNormalTexture", + TextureMap::CLEARCOAT_NORMAL, + extension_object, output_material)); + + return OkStatus(); +} + +Status GltfDecoder::DecodeMaterialVolumeExtension( + const tinygltf::Material &input_material, int input_material_index, + Material *output_material) { + // Do nothing if extension is absent. + const auto &extension_it = + input_material.extensions.find("KHR_materials_volume"); + if (extension_it == input_material.extensions.end()) { + return OkStatus(); + } + + output_material->SetHasVolume(true); + const tinygltf::Value::Object &extension_object = + extension_it->second.Get(); + + // Decode thickness factor. + float value; + bool success; + DRACO_ASSIGN_OR_RETURN( + success, DecodeFloat("thicknessFactor", extension_object, &value)); + if (success) { + // Volume thickness factor is given in the coordinate space of the model. + // When the model is loaded as draco::Mesh, the scene graph transformations + // are applied to position attribute. Since this effectively scales the + // model coordinate space, the volume thickness factor also must be scaled. + // No scaling is done when the model is loaded as draco::Scene. + float scale = 1.0f; + if (scene_ == nullptr) { + if (gltf_primitive_material_to_scales_.count(input_material_index) == 1) { + const std::vector &scales = + gltf_primitive_material_to_scales_[input_material_index]; + + // It is only possible to scale the volume thickness factor if all + // primitives using this material have the same transformation scale. + // An alternative would be to create a separate meterial for each scale. + scale = scales[0]; + for (int i = 1; i < scales.size(); i++) { + // Note that close-enough scales could also be permitted. + if (scales[i] != scale) { + return ErrorStatus("Cannot represent volume thickness in a mesh."); + } + } + } + } + output_material->SetThicknessFactor(scale * value); + } + + // Decode attenuation distance. + DRACO_ASSIGN_OR_RETURN( + success, DecodeFloat("attenuationDistance", extension_object, &value)); + if (success) { + output_material->SetAttenuationDistance(value); + } + + // Decode attenuation color. + Vector3f vector; + DRACO_ASSIGN_OR_RETURN( + success, DecodeVector3f("attenuationColor", extension_object, &vector)); + if (success) { + output_material->SetAttenuationColor(vector); + } + + // Decode thickness texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("thicknessTexture", TextureMap::THICKNESS, + extension_object, output_material)); + + return OkStatus(); +} + +Status GltfDecoder::DecodeMaterialIorExtension( + const tinygltf::Material &input_material, Material *output_material) { + // Do nothing if extension is absent. + const auto &extension_it = + input_material.extensions.find("KHR_materials_ior"); + if (extension_it == input_material.extensions.end()) { + return OkStatus(); + } + + output_material->SetHasIor(true); + const tinygltf::Value::Object &extension_object = + extension_it->second.Get(); + + // Decode index of refraction. + float value; + DRACO_ASSIGN_OR_RETURN(const bool success, + DecodeFloat("ior", extension_object, &value)); + if (success) { + output_material->SetIor(value); + } + + return OkStatus(); +} + +Status GltfDecoder::DecodeMaterialSpecularExtension( + const tinygltf::Material &input_material, Material *output_material) { + // Do nothing if extension is absent. + const auto &extension_it = + input_material.extensions.find("KHR_materials_specular"); + if (extension_it == input_material.extensions.end()) { + return OkStatus(); + } + + output_material->SetHasSpecular(true); + const tinygltf::Value::Object &extension_object = + extension_it->second.Get(); + + // Decode specular factor. + float value; + bool success; + DRACO_ASSIGN_OR_RETURN( + success, DecodeFloat("specularFactor", extension_object, &value)); + if (success) { + output_material->SetSpecularFactor(value); + } + + // Decode specular color factor. + Vector3f vector; + DRACO_ASSIGN_OR_RETURN(success, DecodeVector3f("specularColorFactor", + extension_object, &vector)); + if (success) { + output_material->SetSpecularColorFactor(vector); + } + + // Decode speclar texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("specularTexture", TextureMap::SPECULAR, + extension_object, output_material)); + + // Decode specular color texture. + DRACO_RETURN_IF_ERROR(DecodeTexture("specularColorTexture", + TextureMap::SPECULAR_COLOR, + extension_object, output_material)); + + return OkStatus(); +} + +StatusOr GltfDecoder::DecodeFloat(const std::string &name, + const tinygltf::Value::Object &object, + float *value) { + const auto &it = object.find(name); + if (it == object.end()) { + return false; + } + const tinygltf::Value &number = it->second; + if (!number.IsNumber()) { + return Status(Status::DRACO_ERROR, "Invalid " + name + "."); + } + *value = number.Get(); + return true; +} + +StatusOr GltfDecoder::DecodeInt(const std::string &name, + const tinygltf::Value::Object &object, + int *value) { + const auto &it = object.find(name); + if (it == object.end()) { + return false; + } + const tinygltf::Value &number = it->second; + if (!number.IsNumber()) { + return ErrorStatus("Invalid " + name + "."); + } + *value = number.Get(); + return true; +} + +StatusOr GltfDecoder::DecodeString(const std::string &name, + const tinygltf::Value::Object &object, + std::string *value) { + const auto &it = object.find(name); + if (it == object.end()) { + return false; + } + const tinygltf::Value &string = it->second; + if (!string.IsString()) { + return ErrorStatus("Invalid " + name + "."); + } + *value = string.Get(); + return true; +} + +StatusOr GltfDecoder::DecodePropertyTableData( + const std::string &name, const tinygltf::Value::Object &object, + PropertyTable::Property::Data *data) { + int buffer_view_index; + DRACO_ASSIGN_OR_RETURN(const bool success, + DecodeInt(name, object, &buffer_view_index)); + if (!success) { + return false; + } + DRACO_RETURN_IF_ERROR( + CopyDataFromBufferView(gltf_model_, buffer_view_index, &data->data)); + data->target = gltf_model_.bufferViews[buffer_view_index].target; + return true; +} + +StatusOr GltfDecoder::DecodeVector3f( + const std::string &name, const tinygltf::Value::Object &object, + Vector3f *value) { + const auto &it = object.find(name); + if (it == object.end()) { + return false; + } + const tinygltf::Value &array = it->second; + if (!array.IsArray() || array.Size() != 3) { + return Status(Status::DRACO_ERROR, "Invalid " + name + "."); + } + for (int i = 0; i < array.Size(); i++) { + const tinygltf::Value &array_entry = array.Get(i); + if (!array_entry.IsNumber()) { + return Status(Status::DRACO_ERROR, "Invalid " + name + "."); + } + (*value)[i] = array_entry.Get(); + } + return true; +} + +Status GltfDecoder::DecodeTexture(const std::string &name, + TextureMap::Type type, + const tinygltf::Value::Object &object, + Material *material) { + tinygltf::TextureInfo info; + DRACO_RETURN_IF_ERROR(ParseTextureInfo(name, object, &info)); + DRACO_RETURN_IF_ERROR(CheckAndAddTextureToDracoMaterial( + info.index, info.texCoord, info.extensions, material, type)); + return OkStatus(); +} + +Status GltfDecoder::ParseTextureInfo( + const std::string &texture_name, + const tinygltf::Value::Object &container_object, + tinygltf::TextureInfo *texture_info) { + // Note that tinygltf only parses material textures and not material extension + // textures. This method mimics the behavior of tinygltf's private function + // ParseTextureInfo() in order for Draco to decode extension textures. + + // Do nothing if texture with such name is absent. + const auto &texture_object_it = container_object.find(texture_name); + if (texture_object_it == container_object.end()) { + return OkStatus(); + } + + const tinygltf::Value::Object &texture_object = + texture_object_it->second.Get(); + + // Decode texture index. + const auto &index_it = texture_object.find("index"); + if (index_it != texture_object.end()) { + const tinygltf::Value &value = index_it->second; + if (!value.IsNumber()) { + return Status(Status::DRACO_ERROR, "Invalid texture index."); + } + texture_info->index = value.Get(); + } + + // Decode texture coordinate index. + const auto &tex_coord_it = texture_object.find("texCoord"); + if (tex_coord_it != texture_object.end()) { + const tinygltf::Value &value = tex_coord_it->second; + if (!value.IsInt()) { + return Status(Status::DRACO_ERROR, "Invalid texture texCoord."); + } + texture_info->texCoord = value.Get(); + } + + // Decode texture extensions. + const auto &extensions_it = texture_object.find("extensions"); + if (extensions_it != texture_object.end()) { + const tinygltf::Value &extensions = extensions_it->second; + if (!extensions.IsObject()) { + return Status(Status::DRACO_ERROR, "Invalid extension."); + } + for (const std::string &key : extensions.Keys()) { + texture_info->extensions[key] = extensions.Get(key); + } + } + + // Decode texture extras. + const auto &extras_it = texture_object.find("extras"); + if (extras_it != texture_object.end()) { + texture_info->extras = extras_it->second; + } + + return OkStatus(); +} + +Status GltfDecoder::AddMaterialsToScene() { + for (int input_material_index = 0; + input_material_index < gltf_model_.materials.size(); + ++input_material_index) { + Material *const output_material = + scene_->GetMaterialLibrary().MutableMaterial(input_material_index); + DRACO_RETURN_IF_ERROR( + AddGltfMaterial(input_material_index, output_material)); + } + + // Check if we need to add a default material for primitives without an + // assigned material. + const int default_material_index = + scene_->GetMaterialLibrary().NumMaterials(); + bool default_material_needed = false; + for (MeshGroupIndex mgi(0); mgi < scene_->NumMeshGroups(); ++mgi) { + MeshGroup *const mg = scene_->GetMeshGroup(mgi); + for (int mi = 0; mi < mg->NumMeshInstances(); ++mi) { + MeshGroup::MeshInstance &mesh_instance = mg->GetMeshInstance(mi); + if (mesh_instance.material_index == -1) { + mesh_instance.material_index = default_material_index; + default_material_needed = true; + } + } + } + if (default_material_needed) { + // Create an empty default material (our defaults correspond to glTF + // defaults). + scene_->GetMaterialLibrary().MutableMaterial(default_material_index); + } + + std::unordered_set meshes_that_need_tangents; + // Check if we need to generate tangent space for any of the loaded meshes. + for (MeshGroupIndex mgi(0); mgi < scene_->NumMeshGroups(); ++mgi) { + const MeshGroup *const mg = scene_->GetMeshGroup(mgi); + for (int mi = 0; mi < mg->NumMeshInstances(); ++mi) { + const MeshGroup::MeshInstance &mesh_instance = mg->GetMeshInstance(mi); + const auto tangent_map = + scene_->GetMaterialLibrary() + .GetMaterial(mesh_instance.material_index) + ->GetTextureMapByType(TextureMap::NORMAL_TANGENT_SPACE); + if (tangent_map != nullptr) { + Mesh &mesh = scene_->GetMesh(mesh_instance.mesh_index); + if (mesh.GetNamedAttribute(GeometryAttribute::TANGENT) == nullptr) { + meshes_that_need_tangents.insert(&mesh); + } + } + } + } + + return OkStatus(); +} + +Status GltfDecoder::AddSkinsToScene() { + for (int source_skin_index = 0; source_skin_index < gltf_model_.skins.size(); + ++source_skin_index) { + const tinygltf::Skin &skin = gltf_model_.skins[source_skin_index]; + const SkinIndex skin_index = scene_->AddSkin(); + Skin *const new_skin = scene_->GetSkin(skin_index); + + // The skin index was set previously while processing the nodes. + if (skin_index.value() != source_skin_index) { + return Status(Status::DRACO_ERROR, "Skin indices are mismatched."); + } + + if (skin.inverseBindMatrices >= 0) { + const tinygltf::Accessor &accessor = + gltf_model_.accessors[skin.inverseBindMatrices]; + DRACO_RETURN_IF_ERROR(TinyGltfUtils::AddAccessorToAnimationData( + gltf_model_, accessor, &new_skin->GetInverseBindMatrices())); + } + + if (skin.skeleton >= 0) { + const auto it = gltf_node_to_scenenode_index_.find(skin.skeleton); + if (it == gltf_node_to_scenenode_index_.end()) { + // TODO(b/200317162): If skeleton is not found set the default. + return Status(Status::DRACO_ERROR, + "Could not find skeleton in the skin."); + } + new_skin->SetJointRoot(it->second); + } + + for (int joint : skin.joints) { + const auto it = gltf_node_to_scenenode_index_.find(joint); + if (it == gltf_node_to_scenenode_index_.end()) { + // TODO(b/200317162): If skeleton is not found set the default. + return Status(Status::DRACO_ERROR, + "Could not find skeleton in the skin."); + } + new_skin->AddJoint(it->second); + } + } + return OkStatus(); +} + +void GltfDecoder::MoveNonMaterialTextures(Mesh *mesh) { + std::unordered_set non_material_textures; + for (MeshFeaturesIndex i(0); i < mesh->NumMeshFeatures(); i++) { + Texture *const texture = mesh->GetMeshFeatures(i).GetTextureMap().texture(); + if (texture != nullptr) { + non_material_textures.insert(texture); + } + } + MoveNonMaterialTextures(non_material_textures, + &mesh->GetMaterialLibrary().MutableTextureLibrary(), + &mesh->GetNonMaterialTextureLibrary()); +} + +void GltfDecoder::MoveNonMaterialTextures(Scene *scene) { + std::unordered_set non_material_textures; + for (MeshIndex i(0); i < scene->NumMeshes(); i++) { + for (MeshFeaturesIndex j(0); j < scene->GetMesh(i).NumMeshFeatures(); j++) { + Texture *const texture = + scene->GetMesh(i).GetMeshFeatures(j).GetTextureMap().texture(); + if (texture != nullptr) { + non_material_textures.insert(texture); + } + } + } + MoveNonMaterialTextures(non_material_textures, + &scene->GetMaterialLibrary().MutableTextureLibrary(), + &scene->GetNonMaterialTextureLibrary()); +} + +void GltfDecoder::MoveNonMaterialTextures( + const std::unordered_set &non_material_textures, + TextureLibrary *material_tl, TextureLibrary *non_material_tl) { + // TODO(vytyaz): Consider textures that are both material and non-material. + for (int i = 0; i < material_tl->NumTextures(); i++) { + // Move non-material texture from material to non-material texture library. + if (non_material_textures.count(material_tl->GetTexture(i)) == 1) { + non_material_tl->PushTexture(material_tl->RemoveTexture(i--)); + } + } +} + +bool GltfDecoder::PrimitiveSignature::operator==( + const PrimitiveSignature &signature) const { + return primitive.indices == signature.primitive.indices && + primitive.attributes == signature.primitive.attributes && + primitive.extras == signature.primitive.extras && + primitive.extensions == signature.primitive.extensions && + primitive.mode == signature.primitive.mode && + primitive.targets == signature.primitive.targets; +} + +size_t GltfDecoder::PrimitiveSignature::Hash::operator()( + const PrimitiveSignature &signature) const { + size_t hash = 79; // Magic number. + hash = HashCombine(signature.primitive.attributes.size(), hash); + for (auto it = signature.primitive.attributes.begin(); + it != signature.primitive.attributes.end(); ++it) { + hash = HashCombine(it->first, hash); + hash = HashCombine(it->second, hash); + } + hash = HashCombine(signature.primitive.indices, hash); + hash = HashCombine(signature.primitive.mode, hash); + return hash; +} + +StatusOr> GltfDecoder::BuildMeshFromBuilder( + bool use_mesh_builder, TriangleSoupMeshBuilder *mb, PointCloudBuilder *pb) { + std::unique_ptr mesh; + if (use_mesh_builder) { + mesh = mb->Finalize(); + } else { + std::unique_ptr pc = pb->Finalize(true); + if (pc) { + mesh.reset(new Mesh()); + PointCloud *mesh_pc = mesh.get(); + mesh_pc->Copy(*pc); + } + } + if (!mesh) { + return ErrorStatus("Failed to build Draco mesh from glTF data."); + } + return mesh; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/gltf_decoder.h b/contrib/draco/src/draco/io/gltf_decoder.h new file mode 100644 index 000000000..2ae12106e --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_decoder.h @@ -0,0 +1,524 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_GLTF_DECODER_H_ +#define DRACO_IO_GLTF_DECODER_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include +#include +#include +#include + +#include "draco/core/decoder_buffer.h" +#include "draco/core/status.h" +#include "draco/core/status_or.h" +#include "draco/io/tiny_gltf_utils.h" +#include "draco/mesh/mesh.h" +#include "draco/mesh/triangle_soup_mesh_builder.h" +#include "draco/point_cloud/point_cloud_builder.h" +#include "draco/scene/scene.h" + +namespace draco { + +// Decodes a glTF file and returns a draco::Mesh. All of the |mesh|'s attributes +// will be merged into one draco::Mesh +class GltfDecoder { + public: + GltfDecoder(); + + // Decodes a glTF file stored in the input |file_name| or |buffer| to a Mesh. + // The second form returns a vector of files used as input to the mesh during + // the decoding process. Returns nullptr when decode fails. + StatusOr> DecodeFromFile(const std::string &file_name); + StatusOr> DecodeFromFile( + const std::string &file_name, std::vector *mesh_files); + StatusOr> DecodeFromBuffer(DecoderBuffer *buffer); + + // Decodes a glTF file stored in the input |file_name| or |buffer| to a Scene. + // The second form returns a vector of files used as input to the scene during + // the decoding process. Returns nullptr if the decode fails. + StatusOr> DecodeFromFileToScene( + const std::string &file_name); + StatusOr> DecodeFromFileToScene( + const std::string &file_name, std::vector *scene_files); + StatusOr> DecodeFromBufferToScene( + DecoderBuffer *buffer); + + // Scene graph can be loaded either as a tree or a general directed acyclic + // graph (DAG) that allows multiple parent nodes. By default. we decode the + // scene graph as a tree. If the tree mode is selected and the input contains + // nodes with multiple parents, these nodes are duplicated to form a tree. + // TODO(ostava): Add support for DAG mode to other parts of the Draco + // library. + enum class GltfSceneGraphMode { TREE, DAG }; + void SetSceneGraphMode(GltfSceneGraphMode mode) { + gltf_scene_graph_mode_ = mode; + } + + private: + // Loads |file_name| into |gltf_model_|. Fills |input_files| with paths to all + // input files when non-null. + Status LoadFile(const std::string &file_name, + std::vector *input_files); + + // Loads |gltf_model_| from |buffer| in GLB format. + Status LoadBuffer(const DecoderBuffer &buffer); + + // Builds mesh from |gltf_model_|. + StatusOr> BuildMesh(); + + // Checks |gltf_model_| for unsupported features. If |gltf_model_| contains + // unsupported features then the function will return with a status code of + // UNSUPPORTED_FEATURE. + Status CheckUnsupportedFeatures(); + + // Decodes a glTF Node as well as any child Nodes. If |node| contains a mesh + // it will process all of the mesh's primitives. + Status DecodeNode(int node_index, const Eigen::Matrix4d &parent_matrix); + + // Decodes the number of entries in the first attribute of a given glTF + // |primitive|. Note that all attributes have the same entry count according + // to glTF 2.0 spec. + StatusOr DecodePrimitiveAttributeCount( + const tinygltf::Primitive &primitive) const; + + // Decodes the number of indices in a given glTF |primitive|. If primitive's + // indices property is not defined, the index count is implied from the entry + // count of a primitive attribute. + StatusOr DecodePrimitiveIndicesCount( + const tinygltf::Primitive &primitive) const; + + // Decodes indices property of a given glTF |primitive|. If primitive's + // indices property is not defined, the indices are generated based on entry + // count of a primitive attribute. + StatusOr> DecodePrimitiveIndices( + const tinygltf::Primitive &primitive) const; + + // Decodes a glTF Primitive. All of the |primitive|'s attributes will be + // merged into the draco::Mesh output if they are of the same type that + // already has been decoded. + Status DecodePrimitive(const tinygltf::Primitive &primitive, + const Eigen::Matrix4d &transform_matrix); + + // Sums the number of elements per attribute for |node|'s mesh and any of + // |node|'s children. Fills out the material index map. + Status NodeGatherAttributeAndMaterialStats(const tinygltf::Node &node); + + // Sums the number of elements per attribute for all of the meshes and + // primitives. + Status GatherAttributeAndMaterialStats(); + + // Sums the attribute counts into total_attribute_counts_. + void SumAttributeStats(const std::string &attribute_name, int count); + + // Checks that all the same glTF attribute types in different meshes and + // primitives contain the same characteristics. + Status CheckTypes(const std::string &attribute_name, int component_type, + int type, bool normalized); + + // Accumulates the number of elements per attribute for |primitive|. + Status AccumulatePrimitiveStats(const tinygltf::Primitive &primitive); + + // Adds all of the attributes from the glTF file to a Draco mesh. + // GatherAttributeAndMaterialStats() must be called before this function. The + // GeometryAttribute::MATERIAL attribute will be created only if the glTF file + // contains more than one material. + template + Status AddAttributesToDracoMesh(BuilderT *builder); + + // Copies attribute data from |accessor| and adds it to a Draco mesh using the + // geometry builder |builder|. + template + Status AddAttributeValuesToBuilder(const std::string &attribute_name, + const tinygltf::Accessor &accessor, + const std::vector &indices_data, + int att_id, int number_of_elements, + const Eigen::Matrix4d &transform_matrix, + BuilderT *builder); + + // Copies the tangent attribute data from |accessor| and adds it to a Draco + // mesh. This function will transform all of the data by |transform_matrix| + // and then normalize before adding the data to the Draco mesh. + // |indices_data| is the indices data from the glTF file. |att_id| is the + // attribute id of the tangent attribute in the Draco mesh. + // |number_of_elements| is the number of faces or points this function will + // process. |reverse_winding| if set will change the orientation of the data. + template + Status AddTangentToBuilder(const tinygltf::Accessor &accessor, + const std::vector &indices_data, + int att_id, int number_of_elements, + const Eigen::Matrix4d &transform_matrix, + bool reverse_winding, BuilderT *builder); + + // Copies the texture coordinate attribute data from |accessor| and adds it to + // a Draco mesh. This function will flip the data on the horizontal axis as + // Draco meshes store the texture coordinates differently than glTF. + // |indices_data| is the indices data from the glTF file. |att_id| is the + // attribute id of the texture coordinate attribute in the Draco mesh. + // |number_of_elements| is the number of faces or points this function will + // process. |reverse_winding| if set will change the orientation of the data. + template + Status AddTexCoordToBuilder(const tinygltf::Accessor &accessor, + const std::vector &indices_data, + int att_id, int number_of_elements, + bool reverse_winding, BuilderT *builder); + + // Copies the mesh feature ID attribute data from |accessor| and adds it to a + // Draco mesh. |indices_data| is the indices data from the glTF file. |att_id| + // is the attribute ID of the mesh feature ID attribute in the Draco mesh. + // |number_of_elements| is the number of faces or points this function will + // process. |reverse_winding| if set will change the orientation of the data. + template + Status AddFeatureIdToBuilder(const tinygltf::Accessor &accessor, + const std::vector &indices_data, + int att_id, int number_of_elements, + bool reverse_winding, + const std::string &attribute_name, + BuilderT *builder); + + // Copies the attribute data from |accessor| and adds it to a Draco mesh. + // This function will transform all of the data by |transform_matrix| before + // adding the data to the Draco mesh. |indices_data| is the indices data + // from the glTF file. |att_id| is the attribute id of the attribute in the + // Draco mesh. |number_of_elements| is the number of faces or points this + // function will process. |normalize| if set will normalize all of the vector + // data after transformation. |reverse_winding| if set will change the + // orientation of the data. + template + Status AddTransformedDataToBuilder(const tinygltf::Accessor &accessor, + const std::vector &indices_data, + int att_id, int number_of_elements, + const Eigen::Matrix4d &transform_matrix, + bool normalize, bool reverse_winding, + BuilderT *builder); + + // Sets values in |data| into the builder |builder| for |att_id|. + template + void SetValuesForBuilder(const std::vector &indices_data, + int att_id, int number_of_elements, + const std::vector &data, bool reverse_winding, + TriangleSoupMeshBuilder *builder); + template + void SetValuesForBuilder(const std::vector &indices_data, + int att_id, int number_of_elements, + const std::vector &data, bool reverse_winding, + PointCloudBuilder *builder); + + // Sets values in |data| into the mesh builder |mb| for |att_id|. + // |reverse_winding| if set will change the orientation of the data. + template + void SetValuesPerFace(const std::vector &indices_data, int att_id, + int number_of_faces, const std::vector &data, + bool reverse_winding, TriangleSoupMeshBuilder *mb); + + // Returns an address pointing to the content stored in |data|. This is used + // when passing values to mesh / point cloud builder when the input type can + // be either a VectorD or an arithmetic type. + template + const void *GetDataContentAddress(const T &data) const; + + // Adds the attribute data in |accessor| to |mb| for unique attribute + // |att_id|. |indices_data| is the mesh's indices data. |reverse_winding| if + // set will change the orientation of the data. + template + Status AddAttributeDataByTypes(const tinygltf::Accessor &accessor, + const std::vector &indices_data, + int att_id, int number_of_elements, + bool reverse_winding, BuilderT *builder); + + // Adds the textures to |owner|. + template + Status CopyTextures(T *owner); + + // Sets extra attribute properties on a constructed draco mesh. + void SetAttributePropertiesOnDracoMesh(Mesh *mesh); + + // Adds the materials to |mesh|. + Status AddMaterialsToDracoMesh(Mesh *mesh); + + // Adds the material data for the GeometryAttribute::MATERIAL attribute to the + // Draco mesh. + template + Status AddMaterialDataToBuilder(int material_value, int number_of_elements, + BuilderT *builder); + template + Status AddMaterialDataToBuilderInternal(T material_value, int number_of_faces, + TriangleSoupMeshBuilder *builder); + template + Status AddMaterialDataToBuilderInternal(T material_value, + int number_of_points, + PointCloudBuilder *builder); + + // Checks if the glTF file contains a texture. If there is a texture, this + // function will read the texture data and add it to the Draco |material|. If + // there is no texture, this function will return OkStatus(). |texture_info| + // is the data structure containing information about the texture in the glTF + // file. |type| is the type of texture defined by Draco. This is not the same + // as the texture coordinate attribute id. + Status CheckAndAddTextureToDracoMaterial( + int texture_index, int tex_coord_attribute_index, + const tinygltf::ExtensionMap &tex_info_ext, Material *material, + TextureMap::Type type); + + // Decode glTF file to scene. + Status DecodeGltfToScene(); + + // Decode glTF lights into a scene. + Status AddLightsToScene(); + + // Decodes glTF materials variants names into a scene. + Status AddMaterialsVariantsNamesToScene(); + + // Decode glTF animations into a scene. All of the glTF nodes must be decoded + // to the scene before this function is called. + Status AddAnimationsToScene(); + + // Decode glTF node into a Draco scene. |parent_index| is the index of the + // parent node. If |node| is a root node set |parent_index| to + // |kInvalidSceneNodeIndex|. All glTF lights must be decoded to the scene + // before this function is called. + Status DecodeNodeForScene(int node_index, SceneNodeIndex parent_index); + + // Decode glTF primitive into a Draco scene. + Status DecodePrimitiveForScene(const tinygltf::Primitive &primitive, + MeshGroup *mesh_group); + + // Decodes glTF materials variants from |extension| and adds it into materials + // variants |mappings|. Before calling this function, all materials variants + // names must be decoded by calling AddMaterialsVariantsNamesToScene(). + Status DecodeMaterialsVariantsMappings( + const tinygltf::Value::Object &extension, + std::vector *mappings); + + // Decodes glTF mesh feature ID sets from all glTF primitives and adds them to + // |mesh|. + Status AddMeshFeaturesToDracoMesh(Mesh *mesh); + + // Decodes glTF mesh feature ID sets from glTF primitive in glTF node at + // |node_index| and adds them to |mesh|. + Status AddMeshFeaturesToDracoMesh(int node_index, Mesh *mesh); + + // Decodes glTF structural metadata from glTF model and adds it to |geometry|. + template + Status AddStructuralMetadataToGeometry(GeometryT *geometry); + + // Decodes glTF mesh feature ID sets from |primitive| and adds them to |mesh|. + Status DecodeMeshFeatures(const tinygltf::Primitive &primitive, + TextureLibrary *texture_library, Mesh *mesh); + + // Decodes glTF mesh feature ID sets from |extension| and adds them to the + // |mesh_features| vector. + Status DecodeMeshFeatures( + const tinygltf::Value::Object &extension, TextureLibrary *texture_library, + std::vector> *mesh_features); + + // Adds an attribute of type |attribute_name| to |builder|. Returns the + // attribute id. + template + StatusOr AddAttribute(const std::string &attribute_name, + int component_type, int type, BuilderT *builder); + + // Adds an attribute of |attribute_type| to |builder|. Returns the attribute + // id. + template + StatusOr AddAttribute(GeometryAttribute::Type attribute_type, + int component_type, int type, BuilderT *builder); + + // Returns true if the KHR_texture_transform extension is set in |extension|. + // If the KHR_texture_transform extension is set then the values are returned + // in |transform|. + StatusOr CheckKhrTextureTransform( + const tinygltf::ExtensionMap &extension, TextureTransform *transform); + + // Adds glTF material |input_material_index| to |output_material|. + Status AddGltfMaterial(int input_material_index, Material *output_material); + + // Adds unlit property from glTF |input_material| to |output_material|. + void DecodeMaterialUnlitExtension(const tinygltf::Material &input_material, + Material *output_material); + + // Adds sheen properties from glTF |input_material| to |output_material|. + Status DecodeMaterialSheenExtension(const tinygltf::Material &input_material, + Material *output_material); + + // Adds transmission from glTF |input_material| to |output_material|. + Status DecodeMaterialTransmissionExtension( + const tinygltf::Material &input_material, Material *output_material); + + // Adds clearcoat properties from glTF |input_material| to |output_material|. + Status DecodeMaterialClearcoatExtension( + const tinygltf::Material &input_material, Material *output_material); + + // Adds volume properties from glTF |input_material| to |output_material|. + Status DecodeMaterialVolumeExtension(const tinygltf::Material &input_material, + int input_material_index, + Material *output_material); + + // Adds ior properties from glTF |input_material| to |output_material|. + Status DecodeMaterialIorExtension(const tinygltf::Material &input_material, + Material *output_material); + + // Adds specular properties from glTF |input_material| to |output_material|. + Status DecodeMaterialSpecularExtension( + const tinygltf::Material &input_material, Material *output_material); + + // Decodes a float value with |name| from |object| to |value| and returns true + // if a well-formed value with such |name| is present. + static StatusOr DecodeFloat(const std::string &name, + const tinygltf::Value::Object &object, + float *value); + + // Decodes an integer value with |name| from |object| to |value| and returns + // true if a well-formed value with such |name| is present. + static StatusOr DecodeInt(const std::string &name, + const tinygltf::Value::Object &object, + int *value); + + // Decodes a string value with |name| from |object| to |value| and returns + // true if a well-formed value with such |name| is present. + static StatusOr DecodeString(const std::string &name, + const tinygltf::Value::Object &object, + std::string *value); + + // Decodes data and data target from buffer view index with |name| in |object| + // to |data| and returns true if a well-formed data is present. + StatusOr DecodePropertyTableData(const std::string &name, + const tinygltf::Value::Object &object, + PropertyTable::Property::Data *data); + + // Decodes a 3D vector with |name| from |object| to |value| and returns true + // if a well-formed vector with such |name| is present. + static StatusOr DecodeVector3f(const std::string &name, + const tinygltf::Value::Object &object, + Vector3f *value); + + // Decodes a texture with |name| from |object| and adds it to |material| as a + // texture map of |type|. + Status DecodeTexture(const std::string &name, TextureMap::Type type, + const tinygltf::Value::Object &object, + Material *material); + + // Reads texture with |texture_name| from |container_object| into + // |texture_info|. + static Status ParseTextureInfo( + const std::string &texture_name, + const tinygltf::Value::Object &container_object, + tinygltf::TextureInfo *texture_info); + + // Adds the materials to the scene. + Status AddMaterialsToScene(); + + // Adds the skins to the scene. + Status AddSkinsToScene(); + + // All material and non-material textures (e.g., from EXT_mesh_features) are + // initially loaded into a texture library inside the the material library. + // These methods move |non_material_textures| from material texture library + // |material_tl| to non-material texture library |non_material_tl|. + static void MoveNonMaterialTextures(Mesh *mesh); + static void MoveNonMaterialTextures(Scene *scene); + static void MoveNonMaterialTextures( + const std::unordered_set &non_material_textures, + TextureLibrary *material_tl, TextureLibrary *non_material_tl); + + // Builds and returns a mesh constructed from either mesh builder |mb| or + // point cloud builder |pb|. Mesh builder is used if |use_mesh_builder| is set + // to true. + static StatusOr> BuildMeshFromBuilder( + bool use_mesh_builder, TriangleSoupMeshBuilder *mb, + PointCloudBuilder *pb); + + // Map of glTF Mesh to Draco scene mesh group. + std::map gltf_mesh_to_scene_mesh_group_; + + // Data structure that stores the glTF data. + tinygltf::Model gltf_model_; + + // Path to the glTF file. + std::string input_file_name_; + + // Class used to build the Draco mesh. + TriangleSoupMeshBuilder mb_; + PointCloudBuilder pb_; + + // Next face index used when adding attribute data to the Draco mesh. + int next_face_id_; + + // Next point index used when adding attribute data to the point cloud. + int next_point_id_; + + // Total number of indices from all the meshes and primitives. + int total_face_indices_count_; + int total_point_indices_count_; + + // This is the id of the GeometryAttribute::MATERIAL attribute added to the + // Draco mesh. + int material_att_id_; + + // Data used when decoding the entire glTF asset into a single draco::Mesh. + // The struct tracks the total number of elements across all matching + // attributes and it ensures all matching attributes are compatible. + struct MeshAttributeData { + int component_type = 0; + int attribute_type = 0; + bool normalized = false; + int total_attribute_counts = 0; + }; + + // Map of glTF attribute name to attribute component type. + std::map mesh_attribute_data_; + + // Map of glTF attribute name to Draco mesh attribute id. + std::map attribute_name_to_draco_mesh_attribute_id_; + + // Map of glTF material to Draco material index. + std::map gltf_primitive_material_to_draco_material_; + + // Map of glTF material index to transformation scales of primitives. + std::map> gltf_primitive_material_to_scales_; + + // Map of glTF image to Draco textures. + std::map gltf_image_to_draco_texture_; + + std::unique_ptr scene_; + + // Map of glTF Node to local store order. + std::map gltf_node_to_scenenode_index_; + + // Selected mode of the decoded scene graph. + GltfSceneGraphMode gltf_scene_graph_mode_ = GltfSceneGraphMode::TREE; + + // Functionality for deduping primitives on decode. + struct PrimitiveSignature { + const tinygltf::Primitive &primitive; + explicit PrimitiveSignature(const tinygltf::Primitive &primitive) + : primitive(primitive) {} + bool operator==(const PrimitiveSignature &signature) const; + struct Hash { + size_t operator()(const PrimitiveSignature &signature) const; + }; + }; + std::unordered_map + gltf_primitive_to_draco_mesh_index_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_GLTF_DECODER_H_ diff --git a/contrib/draco/src/draco/io/gltf_decoder_test.cc b/contrib/draco/src/draco/io/gltf_decoder_test.cc new file mode 100644 index 000000000..fade3ee26 --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_decoder_test.cc @@ -0,0 +1,1402 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/gltf_decoder.h" + +#include +#include +#include +#include +#include +#include + +#include "draco/material/material_library.h" +#include "draco/scene/mesh_group.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/constants.h" +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/core/draco_types.h" +#include "draco/io/gltf_test_helper.h" +#include "draco/io/texture_io.h" +#include "draco/mesh/mesh_are_equivalent.h" +#include "draco/mesh/mesh_utils.h" +#include "draco/scene/scene_indices.h" +#include "draco/scene/scene_utils.h" +#include "draco/texture/texture_utils.h" + +namespace draco { + +namespace { +std::unique_ptr DecodeGltfFile(const std::string &file_name) { + const std::string path = GetTestFileFullPath(file_name); + GltfDecoder decoder; + + auto maybe_geometry = decoder.DecodeFromFile(path); + if (!maybe_geometry.ok()) { + return nullptr; + } + std::unique_ptr geometry = std::move(maybe_geometry).value(); + return geometry; +} + +std::unique_ptr DecodeGltfFileToScene(const std::string &file_name) { + const std::string path = GetTestFileFullPath(file_name); + GltfDecoder decoder; + + auto maybe_scene = decoder.DecodeFromFileToScene(path); + if (!maybe_scene.ok()) { + return nullptr; + } + std::unique_ptr scene = std::move(maybe_scene).value(); + return scene; +} + +void CompareVectorArray(const std::array &a, + const std::array &b) { + for (int v = 0; v < 3; ++v) { + for (int c = 0; c < 3; ++c) { + EXPECT_FLOAT_EQ(a[v][c], b[v][c]) << "v:" << v << " c:" << c; + } + } +} +} // namespace + +// Tests multiple textures. +TEST(GltfDecoderTest, SphereGltf) { + const std::string file_name = "sphere.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->num_attributes(), 4) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 231) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 224) << "Unexpected number of faces."; + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 2); +} + +TEST(GltfDecoderTest, TriangleGltf) { + const std::string file_name = "one_face_123.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->num_attributes(), 1) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 3) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 1) << "Unexpected number of faces."; + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 0); + + const auto *const pos_attribute = + mesh->GetNamedAttribute(GeometryAttribute::POSITION); + EXPECT_NE(pos_attribute, nullptr); + const auto &face = mesh->face(FaceIndex(0)); + std::array pos; + for (int c = 0; c < 3; ++c) { + pos_attribute->GetMappedValue(face[c], &pos[c][0]); + } + + // Test position values match. + std::array pos_test; + pos_test[0] = Vector3f(1, 0.0999713, 0); + pos_test[1] = Vector3f(2.00006104, 0.01, 0); + pos_test[2] = Vector3f(3, 0.10998169, 0); + CompareVectorArray(pos, pos_test); +} + +TEST(GltfDecoderTest, MirroredTriangleGltf) { + const std::string file_name = "one_face_123_mirror.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->num_attributes(), 1) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 3) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 1) << "Unexpected number of faces."; + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 0); + + const auto *const pos_attribute = + mesh->GetNamedAttribute(GeometryAttribute::POSITION); + EXPECT_NE(pos_attribute, nullptr); + const auto &face = mesh->face(FaceIndex(0)); + std::array pos; + for (int c = 0; c < 3; ++c) { + pos_attribute->GetMappedValue(face[c], &pos[c][0]); + } + + // Test position values match. + std::array pos_test; + pos_test[0] = Vector3f(-1, -0.0999713, 0); + pos_test[1] = Vector3f(-3, -0.10998169, 0); + pos_test[2] = Vector3f(-2.00006104, -0.01, 0); + CompareVectorArray(pos, pos_test); +} + +TEST(GltfDecoderTest, TranslateTriangleGltf) { + const std::string file_name = "one_face_123_translated.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->num_attributes(), 1) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 3) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 1) << "Unexpected number of faces."; + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 0); + + const auto *const pos_attribute = + mesh->GetNamedAttribute(GeometryAttribute::POSITION); + EXPECT_NE(pos_attribute, nullptr); + const auto &face = mesh->face(FaceIndex(0)); + std::array pos; + for (int c = 0; c < 3; ++c) { + pos_attribute->GetMappedValue(face[c], &pos[c][0]); + } + + // Test position values match. The glTF file contains a matrix in the main + // node. The matrix defines a translation of (-1.5, 5.0, 2.3). + std::array pos_test; + pos_test[0] = Vector3f(1, 0.0999713, 0); + pos_test[1] = Vector3f(2.00006104, 0.01, 0); + pos_test[2] = Vector3f(3, 0.10998169, 0); + const Vector3f translate(-1.5, 5.0, 2.3); + for (int v = 0; v < 3; ++v) { + pos_test[v] = pos_test[v] + translate; + } + CompareVectorArray(pos, pos_test); +} + +// Tests multiple materials. +TEST(GltfDecoderTest, MilkTruckGltf) { + const std::string file_name = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->num_attributes(), 4) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 3564) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 3624) << "Unexpected number of faces."; + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 4); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(1)->NumTextureMaps(), 0); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(2)->NumTextureMaps(), 0); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(3)->NumTextureMaps(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->GetName(), "truck"); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(1)->GetName(), "glass"); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(2)->GetName(), + "window_trim"); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(3)->GetName(), "wheels"); +} + +TEST(GltfDecoderTest, SceneMilkTruckGltf) { + const std::string file_name = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + + ASSERT_EQ(scene->NumMeshes(), 4); + ASSERT_EQ(scene->NumMeshGroups(), 2); + ASSERT_EQ(scene->NumNodes(), 5); + ASSERT_EQ(scene->NumRootNodes(), 1); + ASSERT_EQ(scene->NumLights(), 0); + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterials(), 4); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(1)->NumTextureMaps(), 0); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(2)->NumTextureMaps(), 0); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(3)->NumTextureMaps(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->GetName(), "truck"); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(1)->GetName(), "glass"); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(2)->GetName(), + "window_trim"); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(3)->GetName(), "wheels"); + ASSERT_EQ(scene->NumAnimations(), 1); + ASSERT_EQ(scene->NumSkins(), 0); + for (AnimationIndex i(0); i < scene->NumAnimations(); ++i) { + const Animation *const animation = scene->GetAnimation(i); + ASSERT_NE(animation, nullptr); + ASSERT_EQ(animation->NumSamplers(), 2); + ASSERT_EQ(animation->NumChannels(), 2); + } + + ASSERT_EQ(scene->GetMeshGroup(MeshGroupIndex(0))->GetName(), + "Cesium_Milk_Truck"); + ASSERT_EQ(scene->GetMeshGroup(MeshGroupIndex(1))->GetName(), "Wheels"); + + // Check all of the meshes do not have any materials. + for (MeshIndex i(0); i < scene->NumMeshes(); ++i) { + const Mesh &mesh = scene->GetMesh(i); + ASSERT_EQ(mesh.GetMaterialLibrary().NumMaterials(), 0); + } +} + +TEST(GltfDecoderTest, AnimatedBonesGltf) { + const std::string file_name = "CesiumMan/glTF/CesiumMan.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 1); + const MeshGroup &mesh_group = *scene->GetMeshGroup(MeshGroupIndex(0)); + ASSERT_EQ(mesh_group.NumMeshInstances(), 1); + ASSERT_EQ(mesh_group.GetMeshInstance(0).material_index, 0); + ASSERT_EQ(scene->NumNodes(), 22); + ASSERT_EQ(scene->NumRootNodes(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(scene->NumAnimations(), 1); + ASSERT_EQ(scene->NumSkins(), 1); + for (AnimationIndex i(0); i < scene->NumAnimations(); ++i) { + const Animation *const animation = scene->GetAnimation(i); + ASSERT_NE(animation, nullptr); + ASSERT_EQ(animation->NumSamplers(), 57); + ASSERT_EQ(animation->NumChannels(), 57); + } + + // Check all of the meshes do not have any materials. + for (MeshIndex i(0); i < scene->NumMeshes(); ++i) { + const Mesh &mesh = scene->GetMesh(i); + ASSERT_EQ(mesh.GetMaterialLibrary().NumMaterials(), 0); + } +} + +TEST(GltfDecoderTest, AnimatedBonesGlb) { + const std::string file_name = "CesiumMan/glTF_Binary/CesiumMan.glb"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 1); + const MeshGroup &mesh_group = *scene->GetMeshGroup(MeshGroupIndex(0)); + ASSERT_EQ(mesh_group.NumMeshInstances(), 1); + ASSERT_EQ(mesh_group.GetMeshInstance(0).material_index, 0); + ASSERT_EQ(scene->NumNodes(), 22); + ASSERT_EQ(scene->NumRootNodes(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(scene->NumAnimations(), 1); + ASSERT_EQ(scene->NumSkins(), 1); + for (AnimationIndex i(0); i < scene->NumAnimations(); ++i) { + const Animation *const animation = scene->GetAnimation(i); + ASSERT_NE(animation, nullptr); + ASSERT_EQ(animation->NumSamplers(), 57); + ASSERT_EQ(animation->NumChannels(), 57); + } + + // Check all of the meshes do not have any materials. + for (MeshIndex i(0); i < scene->NumMeshes(); ++i) { + const Mesh &mesh = scene->GetMesh(i); + ASSERT_EQ(mesh.GetMaterialLibrary().NumMaterials(), 0); + } +} + +// Tests multiple primitives with the same material index. +TEST(GltfDecoderTest, LanternGltf) { + const std::string file_name = "Lantern/glTF/Lantern.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + + EXPECT_EQ(mesh->num_attributes(), 4) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 4145) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 5394) << "Unexpected number of faces."; + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 4); +} + +// Tests COLOR_0 input attribute. +TEST(GltfDecoderTest, ColorAttributeGltf) { + const std::string file_name = "test_pos_color.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->num_attributes(), 2) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 114) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 224) << "Unexpected number of faces."; + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 0); + ASSERT_NE(mesh->GetNamedAttribute(GeometryAttribute::COLOR), nullptr); + ASSERT_EQ(mesh->GetNamedAttribute(GeometryAttribute::COLOR)->data_type(), + draco::DT_UINT8); + // Ensure the normalized property for the color attribute is set properly. + ASSERT_TRUE(mesh->GetNamedAttribute(GeometryAttribute::COLOR)->normalized()); +} + +// Tests COLOR_0 input attribute when the asset is loaded into a scene. +TEST(GltfDecoderTest, ColorAttributeGltfScene) { + const std::string file_name = "test_pos_color.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_EQ(scene->NumMeshes(), 1); + const Mesh &mesh = scene->GetMesh(MeshIndex(0)); + ASSERT_NE(mesh.GetNamedAttribute(GeometryAttribute::COLOR), nullptr); + ASSERT_EQ(mesh.GetNamedAttribute(GeometryAttribute::COLOR)->data_type(), + draco::DT_UINT8); + // Ensure the normalized property for the color attribute is set properly. + ASSERT_TRUE(mesh.GetNamedAttribute(GeometryAttribute::COLOR)->normalized()); +} + +// Tests a mesh with two sets of texture coordinates. +TEST(GltfDecoderTest, TwoTexCoordAttributesGltf) { + const std::string file_name = "sphere_two_tex_coords.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->NumNamedAttributes(GeometryAttribute::TEX_COORD), 2); +} + +// Tests an input with a valid tangent attribute does not auto generate the +// tangent attribute. +TEST(GltfDecoderTest, TestSceneWithTangents) { + const std::string file_name = "Lantern/glTF/Lantern.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + // Ensure no mesh has auto-generated tangents (and that some meshes have the + // tangent attribute). + int num_tangent_attributes = 0; + for (MeshIndex mi(0); mi < scene->NumMeshes(); ++mi) { + if (scene->GetMesh(mi).GetNamedAttribute(GeometryAttribute::TANGENT) != + nullptr) { + num_tangent_attributes++; + ASSERT_FALSE(MeshUtils::HasAutoGeneratedTangents(scene->GetMesh(mi))); + } + } + ASSERT_GT(num_tangent_attributes, 0); +} + +// Tests an input file where multiple textures share the same image asset. +TEST(GltfDecoderTest, SharedImages) { + const std::string file_name = "SphereAllSame/sphere_texture_all.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 5); + ASSERT_EQ(mesh->GetMaterialLibrary().GetTextureLibrary().NumTextures(), 4); +} + +TEST(GltfDecoderTest, TextureNamesAreNotEmpty) { + const std::string file_name = "SphereAllSame/sphere_texture_all.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 5); + ASSERT_EQ(mesh->GetMaterialLibrary().GetTextureLibrary().NumTextures(), 4); + const std::vector textures = { + mesh->GetMaterialLibrary().GetTextureLibrary().GetTexture(0), + mesh->GetMaterialLibrary().GetTextureLibrary().GetTexture(1), + mesh->GetMaterialLibrary().GetTextureLibrary().GetTexture(2), + mesh->GetMaterialLibrary().GetTextureLibrary().GetTexture(3)}; + EXPECT_EQ(TextureUtils::GetTargetStem(*textures[0]), "256x256_all_orange"); + EXPECT_EQ(TextureUtils::GetTargetStem(*textures[1]), "256x256_all_blue"); + EXPECT_EQ(TextureUtils::GetTargetStem(*textures[2]), "256x256_all_red"); + EXPECT_EQ(TextureUtils::GetTargetStem(*textures[3]), "256x256_all_green"); + EXPECT_EQ(TextureUtils::GetTargetFormat(*textures[0]), ImageFormat::PNG); + EXPECT_EQ(TextureUtils::GetTargetFormat(*textures[1]), ImageFormat::PNG); + EXPECT_EQ(TextureUtils::GetTargetFormat(*textures[2]), ImageFormat::PNG); + EXPECT_EQ(TextureUtils::GetTargetFormat(*textures[3]), ImageFormat::PNG); +} + +TEST(GltfDecoderTest, TestTexCoord1) { + const std::string file_name = "MultiUVTest/glTF/MultiUVTest.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 2); + ASSERT_EQ(mesh->GetMaterialLibrary().GetTextureLibrary().NumTextures(), 2); + const std::vector textures = { + mesh->GetMaterialLibrary().GetTextureLibrary().GetTexture(0), + mesh->GetMaterialLibrary().GetTextureLibrary().GetTexture(1)}; + EXPECT_EQ(TextureUtils::GetTargetStem(*textures[0]), "uv0"); + EXPECT_EQ(TextureUtils::GetTargetStem(*textures[1]), "uv1"); + EXPECT_EQ(TextureUtils::GetTargetFormat(*textures[0]), ImageFormat::PNG); + EXPECT_EQ(TextureUtils::GetTargetFormat(*textures[1]), ImageFormat::PNG); + ASSERT_EQ(mesh->NumNamedAttributes(GeometryAttribute::TEX_COORD), 2); + ASSERT_EQ(mesh->NumNamedAttributes(GeometryAttribute::POSITION), 1); + ASSERT_EQ(mesh->NumNamedAttributes(GeometryAttribute::NORMAL), 1); + ASSERT_EQ(mesh->NumNamedAttributes(GeometryAttribute::TANGENT), 1); +} + +TEST(GltfDecoderTest, SimpleScene) { + const std::string file_name = "Box/glTF/Box.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 1); + const MeshGroup &mesh_group = *scene->GetMeshGroup(MeshGroupIndex(0)); + ASSERT_EQ(mesh_group.NumMeshInstances(), 1); + ASSERT_EQ(mesh_group.GetMeshInstance(0).material_index, 0); + ASSERT_EQ(scene->NumNodes(), 2); + ASSERT_EQ(scene->NumRootNodes(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 0); + ASSERT_EQ(scene->NumSkins(), 0); + ASSERT_EQ(scene->NumAnimations(), 0); + + // Check all of the meshes do not have any materials. + for (MeshIndex i(0); i < scene->NumMeshes(); ++i) { + const Mesh &mesh = scene->GetMesh(i); + ASSERT_EQ(mesh.GetMaterialLibrary().NumMaterials(), 0); + } + + // Check names of nodes are empty. + EXPECT_TRUE(scene->GetNode(SceneNodeIndex(0))->GetName().empty()); + EXPECT_TRUE(scene->GetNode(SceneNodeIndex(1))->GetName().empty()); +} + +TEST(GltfDecoderTest, LanternScene) { + const std::string file_name = "Lantern/glTF/Lantern.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + + EXPECT_EQ(scene->NumMeshes(), 3); + EXPECT_EQ(scene->NumMeshGroups(), 3); + EXPECT_EQ(scene->NumNodes(), 4); + EXPECT_EQ(scene->NumRootNodes(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 4); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->GetDoubleSided(), + false); + EXPECT_EQ(scene->NumSkins(), 0); + EXPECT_EQ(scene->NumAnimations(), 0); + + // Check names of nodes have been populated. + EXPECT_EQ(scene->GetNode(SceneNodeIndex(0))->GetName(), "Lantern"); + EXPECT_EQ(scene->GetNode(SceneNodeIndex(1))->GetName(), "LanternPole_Body"); + EXPECT_EQ(scene->GetNode(SceneNodeIndex(2))->GetName(), "LanternPole_Chain"); + EXPECT_EQ(scene->GetNode(SceneNodeIndex(3))->GetName(), + "LanternPole_Lantern"); +} + +TEST(GltfDecoderTest, SimpleTriangleMesh) { + const std::string file_name = "Triangle/glTF/Triangle.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + + EXPECT_EQ(mesh->num_attributes(), 1) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 3) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 1) << "Unexpected number of faces."; + EXPECT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 0); +} + +TEST(GltfDecoderTest, SimpleTriangleScene) { + const std::string file_name = "Triangle/glTF/Triangle.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + + EXPECT_EQ(scene->NumMeshes(), 1); + EXPECT_EQ(scene->NumMeshGroups(), 1); + const MeshGroup &mesh_group = *scene->GetMeshGroup(MeshGroupIndex(0)); + ASSERT_EQ(mesh_group.NumMeshInstances(), 1); + ASSERT_EQ(mesh_group.GetMeshInstance(0).material_index, 0); + EXPECT_EQ(scene->NumNodes(), 1); + EXPECT_EQ(scene->NumRootNodes(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(scene->NumSkins(), 0); + EXPECT_EQ(scene->NumAnimations(), 0); +} + +TEST(GltfDecoderTest, ThreeMeshesOneNoMaterialScene) { + const std::string file_name = + "three_meshes_two_materials_one_no_material/" + "three_meshes_two_materials_one_no_material.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + + EXPECT_EQ(scene->NumMeshes(), 3); + EXPECT_EQ(scene->NumMeshGroups(), 3); + EXPECT_EQ(scene->NumNodes(), 4); + EXPECT_EQ(scene->NumRootNodes(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 3); + EXPECT_EQ(scene->NumSkins(), 0); + EXPECT_EQ(scene->NumAnimations(), 0); +} + +TEST(GltfDecoderTest, ThreeMeshesOneNoMaterialMesh) { + const std::string file_name = + "three_meshes_two_materials_one_no_material/" + "three_meshes_two_materials_one_no_material.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + + EXPECT_EQ(mesh->num_attributes(), 4) << "Unexpected number of attributes."; + EXPECT_EQ(mesh->num_points(), 72) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 36) << "Unexpected number of faces."; + EXPECT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 3); +} + +TEST(GltfDecoderTest, DoubleSidedMaterial) { + const std::string file_name = "TwoSidedPlane/glTF/TwoSidedPlane.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->GetDoubleSided(), true); + + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->GetDoubleSided(), true); +} + +TEST(GltfDecoderTest, VertexColorTest) { + const std::string file_name = "VertexColorTest/glTF/VertexColorTest.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + EXPECT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 2); + EXPECT_EQ(mesh->NumNamedAttributes(GeometryAttribute::COLOR), 1); + + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 2); + EXPECT_EQ(scene->NumMeshes(), 2); + const Mesh &second_mesh = scene->GetMesh(MeshIndex(1)); + EXPECT_EQ(second_mesh.NumNamedAttributes(GeometryAttribute::COLOR), 1); +} + +TEST(GltfDecoderTest, MorphTargets) { + const std::string filename = + "KhronosSampleModels/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf"; + const std::string path = GetTestFileFullPath(filename); + GltfDecoder decoder; + const auto maybe_scene = decoder.DecodeFromFileToScene(path); + EXPECT_FALSE(maybe_scene.ok()); + EXPECT_EQ(maybe_scene.status().code(), Status::Code::UNSUPPORTED_FEATURE); +} + +TEST(GltfDecoderTest, SparseAccessors) { + const std::string filename = + "KhronosSampleModels/SimpleSparseAccessor/glTF/SimpleSparseAccessor.gltf"; + const std::string path = GetTestFileFullPath(filename); + GltfDecoder decoder; + const auto maybe_scene = decoder.DecodeFromFileToScene(path); + EXPECT_FALSE(maybe_scene.ok()); + EXPECT_EQ(maybe_scene.status().code(), Status::Code::UNSUPPORTED_FEATURE); +} + +TEST(GltfDecoderTest, PbrSpecularGlossinessExtension) { + const std::string filename = + "KhronosSampleModels/SpecGlossVsMetalRough/glTF/" + "SpecGlossVsMetalRough.gltf"; + const std::string path = GetTestFileFullPath(filename); + GltfDecoder decoder; + const auto maybe_scene = decoder.DecodeFromFileToScene(path); + EXPECT_FALSE(maybe_scene.ok()); + EXPECT_EQ(maybe_scene.status().code(), Status::Code::UNSUPPORTED_FEATURE); +} + +TEST(GltfDecoderTest, DifferentWrappingModes) { + const std::string filename = + "KhronosSampleModels/TextureSettingsTest/glTF/TextureSettingsTest.gltf"; + const std::string path = GetTestFileFullPath(filename); + GltfDecoder decoder; + const auto maybe_scene = decoder.DecodeFromFileToScene(path); + EXPECT_TRUE(maybe_scene.ok()); + const draco::Scene &scene = *maybe_scene.value(); + ASSERT_EQ(scene.GetMaterialLibrary().GetTextureLibrary().NumTextures(), 3); + ASSERT_EQ(scene.GetMaterialLibrary().NumMaterials(), 10); + const draco::Material &material = *scene.GetMaterialLibrary().GetMaterial(0); + ASSERT_EQ(material.NumTextureMaps(), 1); + ASSERT_EQ(material.GetTextureMapByIndex(0)->wrapping_mode().s, + draco::TextureMap::REPEAT); + ASSERT_EQ(material.GetTextureMapByIndex(0)->wrapping_mode().t, + draco::TextureMap::MIRRORED_REPEAT); +} + +TEST(GltfDecoderTest, KhrMaterialsUnlitExtension) { + const std::string no_unlit_filename = "Box/glTF/Box.gltf"; + const std::unique_ptr scene_no_unlit( + DecodeGltfFileToScene(no_unlit_filename)); + EXPECT_EQ(scene_no_unlit->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(scene_no_unlit->GetMaterialLibrary().GetMaterial(0)->GetUnlit(), + false); + + const std::string filename = + "KhronosSampleModels/UnlitTest/glTF/UnlitTest.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(filename)); + EXPECT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 2); + EXPECT_EQ(mesh->GetMaterialLibrary().GetMaterial(0)->GetUnlit(), true); + EXPECT_EQ(mesh->GetMaterialLibrary().GetMaterial(1)->GetUnlit(), true); + + const std::unique_ptr scene(DecodeGltfFileToScene(filename)); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 2); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->GetUnlit(), true); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(1)->GetUnlit(), true); +} + +TEST(GltfDecoderTest, KhrMaterialsSheenExtension) { + // Check that a model with no sheen is loaded with no sheen. + { + const std::unique_ptr scene( + DecodeGltfFileToScene("Box/glTF/Box.gltf")); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + + // Check that material has no sheen. + const Material &material = *scene->GetMaterialLibrary().GetMaterial(0); + EXPECT_FALSE(material.HasSheen()); + + // Check that sheen color and roughness factors have default values. + EXPECT_EQ(material.GetSheenColorFactor(), Vector3f(0.f, 0.f, 0.f)); + EXPECT_EQ(material.GetSheenRoughnessFactor(), 0.f); + + // Check that sheen textures are absent. + EXPECT_EQ(material.GetTextureMapByType(TextureMap::SHEEN_COLOR), nullptr); + EXPECT_EQ(material.GetTextureMapByType(TextureMap::SHEEN_ROUGHNESS), + nullptr); + } + + // Check that a model with sheen is loaded as a mesh with sheen. + { + // Load model as a mesh. + const std::unique_ptr mesh( + DecodeGltfFile("KhronosSampleModels/SheenCloth/glTF/SheenCloth.gltf")); + EXPECT_NE(mesh, nullptr); + const Material &material = *mesh->GetMaterialLibrary().GetMaterial(0); + + // Check that material has sheen. + EXPECT_TRUE(material.HasSheen()); + + // Check that sheen color and roughness factors are present. + EXPECT_EQ(material.GetSheenColorFactor(), Vector3f(1.f, 1.f, 1.f)); + EXPECT_EQ(material.GetSheenRoughnessFactor(), 1.f); + + // Check that sheen color and roughness textures are present. + EXPECT_NE(material.GetTextureMapByType(TextureMap::SHEEN_COLOR), nullptr); + EXPECT_NE(material.GetTextureMapByType(TextureMap::SHEEN_ROUGHNESS), + nullptr); + + // Check that sheen color and roughness textures are shared. + EXPECT_EQ( + material.GetTextureMapByType(TextureMap::SHEEN_COLOR)->texture(), + material.GetTextureMapByType(TextureMap::SHEEN_ROUGHNESS)->texture()); + } + + // Check that a model with sheen is loaded as a scene with sheen. + { + // Load model as a scene. + const std::unique_ptr scene(DecodeGltfFileToScene( + "KhronosSampleModels/SheenCloth/glTF/SheenCloth.gltf")); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + const Material &material = *scene->GetMaterialLibrary().GetMaterial(0); + + // Check that material has sheen. + EXPECT_TRUE(material.HasSheen()); + + // Check that sheen color and roughness factors are present. + EXPECT_EQ(material.GetSheenColorFactor(), Vector3f(1.f, 1.f, 1.f)); + EXPECT_EQ(material.GetSheenRoughnessFactor(), 1.f); + + // Check that sheen color and roughness textures are present. + EXPECT_NE(material.GetTextureMapByType(TextureMap::SHEEN_COLOR), nullptr); + EXPECT_NE(material.GetTextureMapByType(TextureMap::SHEEN_ROUGHNESS), + nullptr); + + // Check that sheen color and roughness textures are shared. + EXPECT_EQ( + material.GetTextureMapByType(TextureMap::SHEEN_COLOR)->texture(), + material.GetTextureMapByType(TextureMap::SHEEN_ROUGHNESS)->texture()); + } +} + +TEST(GltfDecoderTest, PbrNextExtensions) { + // Check that a model with no material extensions is loaded correctly. + { + const std::unique_ptr scene( + DecodeGltfFileToScene("Box/glTF/Box.gltf")); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + const Material &m = *scene->GetMaterialLibrary().GetMaterial(0); + + // Check that material has no extensions. + EXPECT_FALSE(m.HasSheen()); + EXPECT_FALSE(m.HasTransmission()); + EXPECT_FALSE(m.HasClearcoat()); + EXPECT_FALSE(m.HasVolume()); + EXPECT_FALSE(m.HasIor()); + EXPECT_FALSE(m.HasSpecular()); + } + + // Check that a model with material extensions is loaded correctly. + { + const std::unique_ptr mesh( + DecodeGltfFile("pbr_next/sphere/glTF/sphere.gltf")); + EXPECT_NE(mesh, nullptr); + const Material &m = *mesh->GetMaterialLibrary().GetMaterial(0); + + // Check that material has extensions. + EXPECT_TRUE(m.HasSheen()); + EXPECT_TRUE(m.HasTransmission()); + EXPECT_TRUE(m.HasClearcoat()); + EXPECT_TRUE(m.HasVolume()); + EXPECT_TRUE(m.HasIor()); + EXPECT_TRUE(m.HasSpecular()); + + // Check that material has correct extension properties. + EXPECT_EQ(m.GetSheenColorFactor(), Vector3f(1.0f, 0.329f, 0.1f)); + EXPECT_EQ(m.GetSheenRoughnessFactor(), 0.8f); + EXPECT_EQ(m.GetTransmissionFactor(), 0.75f); + EXPECT_EQ(m.GetClearcoatFactor(), 0.95f); + EXPECT_EQ(m.GetClearcoatRoughnessFactor(), 0.03f); + EXPECT_EQ(m.GetAttenuationColor(), Vector3f(0.921f, 0.640f, 0.064f)); + EXPECT_EQ(m.GetAttenuationDistance(), 0.155f); + EXPECT_EQ(m.GetThicknessFactor(), 2.27f); + EXPECT_EQ(m.GetIor(), 1.55f); + EXPECT_EQ(m.GetSpecularFactor(), 0.3f); + EXPECT_EQ(m.GetSpecularColorFactor(), Vector3f(0.212f, 0.521f, 0.051f)); + + // Check that material has all extension textures. + EXPECT_NE(m.GetTextureMapByType(TextureMap::SHEEN_COLOR), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::SHEEN_ROUGHNESS), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::TRANSMISSION), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::CLEARCOAT), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::CLEARCOAT_ROUGHNESS), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::CLEARCOAT_NORMAL), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::THICKNESS), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::SPECULAR), nullptr); + EXPECT_NE(m.GetTextureMapByType(TextureMap::SPECULAR_COLOR), nullptr); + } +} + +TEST(GltfDecoderTest, TextureTransformTest) { + const std::string filename = + "KhronosSampleModels/TextureTransformTest/glTF/TextureTransformTest.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(filename)); + EXPECT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 9); + for (int i = 0; i < 6; ++i) { + EXPECT_FALSE(TextureTransform::IsDefault(mesh->GetMaterialLibrary() + .GetMaterial(i) + ->GetTextureMapByIndex(0) + ->texture_transform())); + } + for (int i = 6; i < 9; ++i) { + EXPECT_TRUE(TextureTransform::IsDefault(mesh->GetMaterialLibrary() + .GetMaterial(i) + ->GetTextureMapByIndex(0) + ->texture_transform())); + } + + const std::unique_ptr scene(DecodeGltfFileToScene(filename)); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 9); + for (int i = 0; i < 6; ++i) { + EXPECT_FALSE(TextureTransform::IsDefault(scene->GetMaterialLibrary() + .GetMaterial(i) + ->GetTextureMapByIndex(0) + ->texture_transform())); + } + for (int i = 6; i < 9; ++i) { + EXPECT_TRUE(TextureTransform::IsDefault(scene->GetMaterialLibrary() + .GetMaterial(i) + ->GetTextureMapByIndex(0) + ->texture_transform())); + } +} + +TEST(GltfDecoderTest, GlbTextureSource) { + const std::string file_name = "KhronosSampleModels/Duck/glTF_Binary/Duck.glb"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + EXPECT_EQ(scene->NumMeshes(), 1); + EXPECT_EQ(scene->NumMeshGroups(), 1); + const MeshGroup &mesh_group = *scene->GetMeshGroup(MeshGroupIndex(0)); + ASSERT_EQ(mesh_group.NumMeshInstances(), 1); + ASSERT_EQ(mesh_group.GetMeshInstance(0).material_index, 0); + EXPECT_EQ(scene->NumNodes(), 3); + EXPECT_EQ(scene->NumRootNodes(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 1); + EXPECT_EQ(scene->NumAnimations(), 0); + EXPECT_EQ(scene->NumSkins(), 0); + EXPECT_EQ(scene->GetMaterialLibrary().GetTextureLibrary().NumTextures(), 1); + const Texture *const texture = + scene->GetMaterialLibrary().GetTextureLibrary().GetTexture(0); + ASSERT_NE(texture, nullptr); + const SourceImage &source_image = texture->source_image(); + EXPECT_EQ(source_image.encoded_data().size(), 16302); + EXPECT_EQ(source_image.filename(), ""); + EXPECT_EQ(source_image.mime_type(), "image/png"); +} + +TEST(GltfDecoderTest, GltfTextureSource) { + const std::string file_name = "KhronosSampleModels/Duck/glTF/Duck.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + EXPECT_EQ(scene->NumMeshes(), 1); + EXPECT_EQ(scene->NumMeshGroups(), 1); + const MeshGroup &mesh_group = *scene->GetMeshGroup(MeshGroupIndex(0)); + ASSERT_EQ(mesh_group.NumMeshInstances(), 1); + ASSERT_EQ(mesh_group.GetMeshInstance(0).material_index, 0); + EXPECT_EQ(scene->NumNodes(), 3); + EXPECT_EQ(scene->NumRootNodes(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 1); + EXPECT_EQ(scene->NumAnimations(), 0); + EXPECT_EQ(scene->NumSkins(), 0); + EXPECT_EQ(scene->GetMaterialLibrary().GetTextureLibrary().NumTextures(), 1); + const Texture *const texture = + scene->GetMaterialLibrary().GetTextureLibrary().GetTexture(0); + ASSERT_NE(texture, nullptr); + const SourceImage &source_image = texture->source_image(); + EXPECT_EQ(source_image.encoded_data().size(), 0); + EXPECT_FALSE(source_image.filename().empty()); + EXPECT_EQ(source_image.mime_type(), ""); +} + +TEST(GltfDecoderTest, GltfDecodeWithDraco) { + // Tests that we can decode a glTF containing Draco compressed geometry. + const std::string file_name = "Box/glTF_Binary/Box.glb"; + const std::string file_name_with_draco = "Box/glTF_Binary/Box_Draco.glb"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + const std::unique_ptr scene_draco( + DecodeGltfFileToScene(file_name_with_draco)); + ASSERT_NE(scene, nullptr); + ASSERT_NE(scene_draco, nullptr); + EXPECT_EQ(scene->NumMeshes(), scene_draco->NumMeshes()); + EXPECT_EQ(scene->NumMeshGroups(), scene_draco->NumMeshGroups()); + EXPECT_EQ(scene->NumNodes(), scene_draco->NumNodes()); + EXPECT_EQ(scene->NumRootNodes(), scene_draco->NumRootNodes()); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), + scene_draco->GetMaterialLibrary().NumMaterials()); + EXPECT_EQ(scene->NumAnimations(), scene_draco->NumAnimations()); + EXPECT_EQ(scene->NumSkins(), scene_draco->NumSkins()); + + EXPECT_EQ(scene->NumMeshes(), 1); + EXPECT_EQ(scene->GetMesh(draco::MeshIndex(0)).num_faces(), + scene_draco->GetMesh(draco::MeshIndex(0)).num_faces()); +} + +TEST(GltfDecoderTest, TestAnimationNames) { + const std::string file_name = "InterpolationTest/glTF/InterpolationTest.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + EXPECT_EQ(scene->NumAnimations(), 9); + + const std::vector animation_names{ + "Step Scale", "Linear Scale", + "CubicSpline Scale", "Step Rotation", + "CubicSpline Rotation", "Linear Rotation", + "Step Translation", "CubicSpline Translation", + "Linear Translation"}; + for (int i = 0; i < scene->NumAnimations(); ++i) { + const Animation *const anim = scene->GetAnimation(AnimationIndex(i)); + ASSERT_NE(anim, nullptr); + ASSERT_EQ(anim->GetName(), animation_names[i]); + } +} + +TEST(GltfDecoderTest, DuplicatePrimitives) { + const std::string file_name = "DuplicateMeshes/duplicate_meshes.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + // There should be only one unique base mesh in the scene and four mesh + // groups (instances). + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 4); + + // There should be two materials used by the instances. + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterials(), 2); +} + +TEST(GltfDecoderTest, SimpleSkin) { + // This is a simple skin example from glTF tutorial. + const std::string file_name = "simple_skin.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + // Check scene size. + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 1); + ASSERT_EQ(scene->GetMeshGroup(draco::MeshGroupIndex(0))->NumMeshInstances(), + 1); + ASSERT_EQ(scene->NumNodes(), 3); + ASSERT_EQ(scene->NumRootNodes(), 1); + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(scene->NumAnimations(), 1); + ASSERT_EQ(scene->NumSkins(), 1); + + // Check animation size. + const Animation *const animation = scene->GetAnimation(AnimationIndex(0)); + ASSERT_NE(animation, nullptr); + ASSERT_EQ(animation->NumSamplers(), 1); + ASSERT_EQ(animation->NumChannels(), 1); + ASSERT_EQ(animation->NumNodeAnimationData(), 2); + + // Check animation sampler. + const AnimationSampler *const sampler = animation->GetSampler(0); + ASSERT_NE(sampler, nullptr); + ASSERT_EQ(sampler->input_index, 0); + ASSERT_EQ(sampler->interpolation_type, + AnimationSampler::SamplerInterpolation::LINEAR); + ASSERT_EQ(sampler->output_index, 1); + + // Check animation channel. + const AnimationChannel *const channel = animation->GetChannel(0); + ASSERT_NE(channel, nullptr); + ASSERT_EQ(channel->sampler_index, 0); + ASSERT_EQ(channel->target_index, 2); + ASSERT_EQ(channel->transformation_type, + AnimationChannel::ChannelTransformation::ROTATION); + + // Check the first node animation data. + { + const NodeAnimationData *const node_animation = + animation->GetNodeAnimationData(0); + ASSERT_EQ(node_animation->ComponentSize(), 4); + ASSERT_EQ(node_animation->NumComponents(), 1); + ASSERT_EQ(node_animation->count(), 12); + ASSERT_EQ(node_animation->type(), NodeAnimationData::Type::SCALAR); + ASSERT_FALSE(node_animation->normalized()); + const std::vector &node_animation_data = *node_animation->GetData(); + const std::vector expected_node_animation_data{ + 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f, 3.5f, 4.0f, 4.5f, 5.0f, 5.5f}; + ASSERT_EQ(node_animation_data, expected_node_animation_data); + } + + // Check the second node animation data. + { + const NodeAnimationData *const node_animation = + animation->GetNodeAnimationData(1); + ASSERT_EQ(node_animation->ComponentSize(), 4); + ASSERT_EQ(node_animation->NumComponents(), 4); + ASSERT_EQ(node_animation->count(), 12); + ASSERT_EQ(node_animation->type(), NodeAnimationData::Type::VEC4); + ASSERT_FALSE(node_animation->normalized()); + const std::vector &node_animation_data = *node_animation->GetData(); + std::cout << std::endl; + // clang-format off + const std::vector expected_node_animation_data{ + 0.000f, 0.000f, 0.000f, 1.000f, + 0.000f, 0.000f, 0.383f, 0.924f, + 0.000f, 0.000f, 0.707f, 0.707f, + 0.000f, 0.000f, 0.707f, 0.707f, + 0.000f, 0.000f, 0.383f, 0.924f, + 0.000f, 0.000f, 0.000f, 1.000f, + 0.000f, 0.000f, 0.000f, 1.000f, + 0.000f, 0.000f, -0.383f, 0.924f, + 0.000f, 0.000f, -0.707f, 0.707f, + 0.000f, 0.000f, -0.707f, 0.707f, + 0.000f, 0.000f, -0.383f, 0.924f, + 0.000f, 0.000f, 0.000f, 1.000f}; + // clang-format on + ASSERT_EQ(node_animation_data, expected_node_animation_data); + } + + // Check skin. + const Skin *const skin = scene->GetSkin(SkinIndex(0)); + ASSERT_NE(skin, nullptr); + ASSERT_EQ(skin->NumJoints(), 2); + ASSERT_EQ(skin->GetJointRoot(), kInvalidSceneNodeIndex); + ASSERT_EQ(skin->GetJoint(0), SceneNodeIndex(1)); + ASSERT_EQ(skin->GetJoint(1), SceneNodeIndex(2)); + + // Check inverse bind matrices. + const NodeAnimationData &bind_matrices = skin->GetInverseBindMatrices(); + ASSERT_EQ(bind_matrices.type(), NodeAnimationData::Type::MAT4); + ASSERT_EQ(bind_matrices.count(), 2); + ASSERT_EQ(bind_matrices.normalized(), false); + ASSERT_NE(bind_matrices.GetData(), nullptr); + const std::vector &bind_matrices_data = *bind_matrices.GetData(); + // clang-format off + const std::vector expected_bind_matrices_data{ + // First matrix. + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + -0.5f, -1.0f, 0.0f, 1.0f, + // Second matrix. + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + -0.5f, -1.0f, 0.0f, 1.0f}; + // clang-format on + ASSERT_EQ(bind_matrices_data, expected_bind_matrices_data); + + // Check mesh size. + const Mesh &mesh = scene->GetMesh(MeshIndex(0)); + ASSERT_EQ(mesh.num_faces(), 8); + ASSERT_EQ(mesh.num_points(), 10); + ASSERT_EQ(mesh.num_attributes(), 3); + + // Check vertex joint indices. + const PointAttribute *const joints_att = + mesh.GetNamedAttribute(GeometryAttribute::JOINTS); + ASSERT_NE(joints_att, nullptr); + ASSERT_EQ(joints_att->data_type(), DT_UINT16); + ASSERT_EQ(joints_att->num_components(), 4); + ASSERT_EQ(joints_att->size(), 1); + // clang-format off + const std::array expected_joints = { + // Each vertex is associated with four joints. + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0 }; + // clang-format on + std::array joints; + for (draco::PointIndex pi(0); pi < mesh.num_points(); ++pi) { + joints_att->GetMappedValue(pi, &joints[4 * pi.value()]); + } + ASSERT_EQ(joints, expected_joints); + + // Check vertex joint weights. + const PointAttribute *const weights_att = + mesh.GetNamedAttribute(GeometryAttribute::WEIGHTS); + ASSERT_NE(weights_att, nullptr); + ASSERT_EQ(weights_att->data_type(), DT_FLOAT32); + ASSERT_EQ(weights_att->num_components(), 4); + ASSERT_EQ(weights_att->size(), 5); + // clang-format off + const std::array expected_weights = { + // Each vertex has four joint weights. + 1.00f, 0.00f, 0.00f, 0.00f, + 1.00f, 0.00f, 0.00f, 0.00f, + 0.75f, 0.25f, 0.00f, 0.00f, + 0.75f, 0.25f, 0.00f, 0.00f, + 0.50f, 0.50f, 0.00f, 0.00f, + 0.50f, 0.50f, 0.00f, 0.00f, + 0.25f, 0.75f, 0.00f, 0.00f, + 0.25f, 0.75f, 0.00f, 0.00f, + 0.00f, 1.00f, 0.00f, 0.00f, + 0.00f, 1.00f, 0.00f, 0.00f }; + // clang-format on + std::array weights; + for (draco::PointIndex pi(0); pi < mesh.num_points(); ++pi) { + weights_att->GetMappedValue(pi, &weights[4 * pi.value()]); + } + ASSERT_EQ(weights, expected_weights); +} + +TEST(GltfDecoderTest, DecodeMeshWithImplicitPrimitiveIndices) { + // Check that glTF primitives with implicit indices can be loaded as a mesh. + const std::string file_name = "Fox/glTF/Fox.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->num_faces(), 576); +} + +TEST(GltfDecoderTest, DecodeSceneWithImplicitPrimitiveIndices) { + // Check that glTF primitives with implicit indices can be loaded as a scene. + const std::string file_name = "Fox/glTF/Fox.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->GetMesh(MeshIndex(0)).num_faces(), 576); +} + +TEST(GltfDecoderTest, DecodeFromBufferToMesh) { + // Checks that a mesh can be decoded from buffer in GLB format. + // Read GLB file contents into a buffer. + const std::string file_name = "KhronosSampleModels/Duck/glTF_Binary/Duck.glb"; + const std::string file_path = GetTestFileFullPath(file_name); + std::vector file_data; + ASSERT_TRUE(ReadFileToBuffer(file_path, &file_data)); + DecoderBuffer buffer; + buffer.Init(file_data.data(), file_data.size()); + + // Decode mesh from buffer. + GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto mesh, decoder.DecodeFromBuffer(&buffer)); + ASSERT_NE(mesh, nullptr); + + // Decode mesh from GLB file. + const std::unique_ptr expected_mesh(DecodeGltfFile(file_name)); + ASSERT_NE(expected_mesh, nullptr); + + // Check that meshes decoded from the buffer and from GLB file are equivalent. + MeshAreEquivalent eq; + ASSERT_TRUE(eq(*mesh, *expected_mesh)); +} + +TEST(GltfDecoderTest, DecodeGraph) { + // Checks that we can decode a scene with a general graph structure where a + // node has multiple parents. + // The input model has one root node, 4 children nodes that all point to a + // single node that contains the cube mesh. + const std::string file_name = "CubeScaledInstances/glTF/cube_att.gltf"; + const std::string file_path = GetTestFileFullPath(file_name); + + // First decode the scene into a tree-graph. + draco::GltfDecoder dec_tree; + DRACO_ASSIGN_OR_ASSERT(auto scene_tree, + dec_tree.DecodeFromFileToScene(file_path)); + // We expect to have 9 nodes with 4 mesh instances. The leaf node with the + // cube is duplicated 4 times, once for each instance. + ASSERT_EQ(scene_tree->NumNodes(), 9); + auto instances_tree = draco::SceneUtils::ComputeAllInstances(*scene_tree); + ASSERT_EQ(instances_tree.size(), 4); + + // Decode the scene into a scene-graph. + draco::GltfDecoder dec_graph; + dec_graph.SetSceneGraphMode(draco::GltfDecoder::GltfSceneGraphMode::DAG); + DRACO_ASSIGN_OR_ASSERT(auto scene_graph, + dec_graph.DecodeFromFileToScene(file_path)); + + // We expect to have 6 nodes with 4 mesh instances. The leaf node is shared + // for all mesh instances. + ASSERT_EQ(scene_graph->NumNodes(), 6); + auto instances_graph = draco::SceneUtils::ComputeAllInstances(*scene_graph); + ASSERT_EQ(instances_graph.size(), 4); + + // Check that all instances share the same scene node. + for (draco::MeshInstanceIndex mii(1); mii < 4; ++mii) { + ASSERT_EQ(instances_graph[mii - 1].scene_node_index, + instances_graph[mii].scene_node_index); + } +} + +TEST(GltfDecoderTest, CorrectVolumeThicknessFactor) { + // Checks that when a model is decoded as draco::Mesh the PBR material volume + // thickness factor is corrected according to geometry transformation scale in + // the scene graph. + constexpr float kDragonScale = 0.25f; + constexpr float kDragonVolumeThickness = 2.27f; + + // Read model as draco::Scene and check dragon mesh transformation scale and + // its PBR material volume thickness factor. + const std::unique_ptr scene = draco::ReadSceneFromTestFile( + "KhronosSampleModels/DragonAttenuation/glTF/DragonAttenuation.gltf"); + ASSERT_NE(scene, nullptr); + auto instances = draco::SceneUtils::ComputeAllInstances(*scene); + ASSERT_EQ(instances.size(), 2); + ASSERT_EQ(instances[MeshInstanceIndex(0)].transform.col(0).norm(), + kDragonScale); + ASSERT_EQ(scene->GetMaterialLibrary().GetMaterial(1)->GetThicknessFactor(), + kDragonVolumeThickness); + + // Read model as draco::Mesh and check corrected volume thickness factor. + const std::unique_ptr mesh = draco::ReadMeshFromTestFile( + "KhronosSampleModels/DragonAttenuation/glTF/DragonAttenuation.gltf"); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(1)->GetThicknessFactor(), + kDragonScale * kDragonVolumeThickness); +} + +TEST(GltfDecoderTest, DecodeLightsIntoMesh) { + // Checks that a model with lights can be decoded into draco::Mesh with the + // lights discarded. + const std::string file_name = "sphere_lights.gltf"; + const std::unique_ptr mesh(DecodeGltfFile(file_name)); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->num_faces(), 224); +} + +TEST(GltfDecoderTest, DecodeLightsIntoScene) { + // Checks that a model with lights can be decoded into draco::Scene. + const std::string file_name = "sphere_lights.gltf"; + const std::unique_ptr scene(DecodeGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumLights(), 4); + + // Check spot light with all properties specified. + Light &light = *scene->GetLight(LightIndex(0)); + ASSERT_EQ(light.GetName(), "Blue Lightsaber"); + ASSERT_EQ(light.GetColor(), draco::Vector3f(0.72f, 0.71f, 1.00f)); + ASSERT_EQ(light.GetIntensity(), 3.0); + ASSERT_EQ(light.GetType(), draco::Light::SPOT); + ASSERT_EQ(light.GetRange(), 100); + ASSERT_EQ(light.GetInnerConeAngle(), 0.2); + ASSERT_EQ(light.GetOuterConeAngle(), 0.8); + + // Check point light with all properties specified. + light = *scene->GetLight(LightIndex(1)); + ASSERT_EQ(light.GetName(), "The Star of Earendil"); + ASSERT_EQ(light.GetColor(), draco::Vector3f(0.90f, 0.97f, 1.0f)); + ASSERT_EQ(light.GetIntensity(), 5.0); + ASSERT_EQ(light.GetType(), draco::Light::POINT); + ASSERT_EQ(light.GetRange(), 1000); + ASSERT_EQ(light.GetInnerConeAngle(), 0.0); + ASSERT_NEAR(light.GetOuterConeAngle(), DRACO_PI / 4.0f, 1e-8); + + // Check directional light with some properties specified. + light = *scene->GetLight(LightIndex(2)); + ASSERT_EQ(light.GetName(), "Arc Reactor"); + ASSERT_EQ(light.GetColor(), draco::Vector3f(0.9f, 0.9, 0.9f)); + ASSERT_EQ(light.GetIntensity(), 1.0); + ASSERT_EQ(light.GetType(), draco::Light::DIRECTIONAL); + ASSERT_EQ(light.GetRange(), 200.0); + + // Check spot light with no properties specified. + light = *scene->GetLight(LightIndex(3)); + ASSERT_EQ(light.GetName(), ""); + ASSERT_EQ(light.GetColor(), draco::Vector3f(1.0f, 1.0f, 1.0f)); + ASSERT_EQ(light.GetIntensity(), 1.0); + ASSERT_EQ(light.GetType(), draco::Light::SPOT); + ASSERT_EQ(light.GetRange(), std::numeric_limits::max()); + ASSERT_EQ(light.GetInnerConeAngle(), 0.0); + ASSERT_NEAR(light.GetOuterConeAngle(), DRACO_PI / 4.0f, 1e-8); + + // Check that lights are referenced by the scene nodes. + ASSERT_EQ(scene->GetNode(SceneNodeIndex(0))->GetLightIndex(), + kInvalidLightIndex); + ASSERT_EQ(scene->GetNode(SceneNodeIndex(1))->GetLightIndex(), LightIndex(0)); + ASSERT_EQ(scene->GetNode(SceneNodeIndex(2))->GetLightIndex(), LightIndex(2)); + ASSERT_EQ(scene->GetNode(SceneNodeIndex(3))->GetLightIndex(), LightIndex(3)); + ASSERT_EQ(scene->GetNode(SceneNodeIndex(4))->GetLightIndex(), LightIndex(1)); +} + +TEST(GltfDecoderTest, MaterialsVariants) { + // Checks that a model with KHR_materials_variants extension can be decoded. + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto scene, + decoder.DecodeFromFileToScene(GetTestFileFullPath( + "KhronosSampleModels/DragonAttenuation/glTF/" + "DragonAttenuation.gltf"))); + ASSERT_NE(scene, nullptr); + const draco::MaterialLibrary &library = scene->GetMaterialLibrary(); + ASSERT_EQ(library.NumMaterialsVariants(), 2); + ASSERT_EQ(library.GetMaterialsVariantName(0), "Attenuation"); + ASSERT_EQ(library.GetMaterialsVariantName(1), "Surface Color"); + + // Check that the cloth mesh has no material variants. + const draco::MeshGroup &cloth_group = + *scene->GetMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(cloth_group.GetName(), "Cloth Backdrop"); + ASSERT_EQ(cloth_group.NumMeshInstances(), 1); + const auto &cloth_mappings = + cloth_group.GetMeshInstance(0).materials_variants_mappings; + ASSERT_EQ(cloth_mappings.size(), 0); + + // Check that the dragon has correct materials variants. + const draco::MeshGroup &dragon_group = + *scene->GetMeshGroup(draco::MeshGroupIndex(1)); + ASSERT_EQ(dragon_group.GetName(), "Dragon"); + ASSERT_EQ(dragon_group.NumMeshInstances(), 1); + const auto &dragon_mappings = + dragon_group.GetMeshInstance(0).materials_variants_mappings; + ASSERT_EQ(dragon_mappings.size(), 2); + ASSERT_EQ(dragon_mappings[0].material, 1); + ASSERT_EQ(dragon_mappings[1].material, 2); + ASSERT_EQ(dragon_mappings[0].variants.size(), 1); + ASSERT_EQ(dragon_mappings[1].variants.size(), 1); + ASSERT_EQ(dragon_mappings[0].variants[0], 0); + ASSERT_EQ(dragon_mappings[1].variants[0], 1); +} + +TEST(GltfDecoderTest, DecodeMeshWithMeshFeaturesWithStructuralMetadata) { + // Checks decoding of a simple glTF with mesh features and structural metadata + // property table as draco::Mesh. + constexpr bool kDracoCompressionEnabled = false; + const auto path = GetTestFileFullPath("BoxMeta/glTF/BoxMeta.gltf"); + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto mesh, decoder.DecodeFromFile(path)); + ASSERT_NE(mesh, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*mesh, kDracoCompressionEnabled); + GltfTestHelper::CheckBoxMetaStructuralMetadata(*mesh); +} + +TEST(GltfDecoderTest, DecodeMeshWithMeshFeaturesWithDracoCompression) { + // Checks decoding of a simple glTF with mesh features compressed with Draco + // as draco::Mesh. + constexpr bool kDracoCompressionEnabled = true; + const auto path = GetTestFileFullPath("BoxMetaDraco/glTF/BoxMetaDraco.gltf"); + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto mesh, decoder.DecodeFromFile(path)); + ASSERT_NE(mesh, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*mesh, kDracoCompressionEnabled); +} + +TEST(GltfDecoderTest, DecodeSceneWithMeshFeaturesWithStructuralMetadata) { + // Checks decoding of a simple glTF with mesh features and structural metadata + // property table as draco::Scene. + constexpr bool kHasDracoCompression = false; + const auto path = GetTestFileFullPath("BoxMeta/glTF/BoxMeta.gltf"); + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto scene, decoder.DecodeFromFileToScene(path)); + ASSERT_NE(scene, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*scene, kHasDracoCompression); + GltfTestHelper::CheckBoxMetaStructuralMetadata(*scene); +} + +TEST(GltfDecoderTest, DecodeSceneWithMeshFeaturesWithDracoCompression) { + // Checks decoding of a simple glTF with mesh features compressed with Draco + // as draco::Scene. + constexpr bool kHasDracoCompression = true; + const auto path = GetTestFileFullPath("BoxMetaDraco/glTF/BoxMetaDraco.gltf"); + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto scene, decoder.DecodeFromFileToScene(path)); + ASSERT_NE(scene, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*scene, kHasDracoCompression); +} + +TEST(GltfDecoderTest, DecodePointCloudToMesh) { + // Checks decoding of a simple glTF with point primitives (no meshes). + const auto path = GetTestFileFullPath( + "SphereTwoMaterials/sphere_two_materials_point_cloud.gltf"); + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto mesh, decoder.DecodeFromFile(path)); + ASSERT_NE(mesh, nullptr); + + // Check the point cloud has expected number of points and attributes. + ASSERT_EQ(mesh->num_faces(), 0); + ASSERT_EQ(mesh->num_points(), 462); + + ASSERT_EQ(mesh->NumNamedAttributes(draco::GeometryAttribute::NORMAL), 1); + ASSERT_EQ(mesh->NumNamedAttributes(draco::GeometryAttribute::TEX_COORD), 1); + ASSERT_EQ(mesh->NumNamedAttributes(draco::GeometryAttribute::TANGENT), 1); + ASSERT_EQ(mesh->NumNamedAttributes(draco::GeometryAttribute::MATERIAL), 1); + + // Check the point cloud has two materials. + ASSERT_EQ(mesh->GetNamedAttribute(draco::GeometryAttribute::MATERIAL)->size(), + 2); +} + +TEST(GltfDecoderTest, DecodeMeshAndPointCloudToMesh) { + // Checks decoding of a simple glTF with a mesh and point primitives into + // draco::Mesh. This should fail (draco::Mesh can't support mixed primitives). + const auto path = GetTestFileFullPath( + "SphereTwoMaterials/sphere_two_materials_mesh_and_point_cloud.gltf"); + draco::GltfDecoder decoder; + ASSERT_FALSE(decoder.DecodeFromFile(path).ok()); +} + +TEST(GltfDecoderTest, DecodePointCloudToScene) { + // Checks decoding of a simple glTF with point primitives (no meshes) into + // draco::Scene. + const auto path = GetTestFileFullPath( + "SphereTwoMaterials/sphere_two_materials_point_cloud.gltf"); + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto scene, decoder.DecodeFromFileToScene(path)); + ASSERT_NE(scene, nullptr); + + ASSERT_EQ(scene->NumMeshes(), 2); + + // Check that each point cloud has expected number of points and attributes. + for (draco::MeshIndex mi(0); mi < scene->NumMeshes(); ++mi) { + const auto &mesh = scene->GetMesh(mi); + ASSERT_EQ(mesh.num_faces(), 0); + ASSERT_EQ(mesh.num_points(), 231); + + ASSERT_EQ(mesh.NumNamedAttributes(draco::GeometryAttribute::NORMAL), 1); + ASSERT_EQ(mesh.NumNamedAttributes(draco::GeometryAttribute::TEX_COORD), 1); + ASSERT_EQ(mesh.NumNamedAttributes(draco::GeometryAttribute::TANGENT), 1); + ASSERT_EQ(mesh.NumNamedAttributes(draco::GeometryAttribute::MATERIAL), 0); + } + + // Check the materials are properly assigned to each point cloud. + const auto instances = draco::SceneUtils::ComputeAllInstances(*scene); + ASSERT_EQ(instances.size(), 2); + ASSERT_EQ(draco::SceneUtils::GetMeshInstanceMaterialIndex( + *scene, instances[draco::MeshInstanceIndex(0)]), + 0); + ASSERT_EQ(draco::SceneUtils::GetMeshInstanceMaterialIndex( + *scene, instances[draco::MeshInstanceIndex(1)]), + 1); +} + +TEST(GltfDecoderTest, DecodeMeshAndPointCloudToScene) { + // Checks decoding of a simple glTF with a mesh and point primitives into + // draco::Scene. + const auto path = GetTestFileFullPath( + "SphereTwoMaterials/sphere_two_materials_mesh_and_point_cloud.gltf"); + draco::GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto scene, decoder.DecodeFromFileToScene(path)); + ASSERT_NE(scene, nullptr); + + ASSERT_EQ(scene->NumMeshes(), 2); + + // First mesh should be a real mesh while the other one should be a point + // cloud (no faces). Otherwise, they should have the same properties. + for (draco::MeshIndex mi(0); mi < scene->NumMeshes(); ++mi) { + const auto &mesh = scene->GetMesh(mi); + ASSERT_EQ(mesh.num_faces(), mi.value() == 0 ? 224 : 0); + ASSERT_EQ(mesh.num_points(), 231); + + ASSERT_EQ(mesh.NumNamedAttributes(draco::GeometryAttribute::NORMAL), 1); + ASSERT_EQ(mesh.NumNamedAttributes(draco::GeometryAttribute::TEX_COORD), 1); + ASSERT_EQ(mesh.NumNamedAttributes(draco::GeometryAttribute::TANGENT), 1); + } +} + +TEST(GltfDecoderTest, TestLoadUnsupportedTexCoordAttributes) { + // Checks that unsupported attributes (TEXCOORD_2 ... TEXCOORD_7) are ignored + // without causing the decoder to fail. + auto scene = draco::ReadSceneFromTestFile("UnusedTexCoords/TexCoord2.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->GetMesh(draco::MeshIndex(0)) + .NumNamedAttributes(draco::GeometryAttribute::TEX_COORD), + 2); +} + +} // namespace draco +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/gltf_encoder.cc b/contrib/draco/src/draco/io/gltf_encoder.cc new file mode 100644 index 000000000..0509b588f --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_encoder.cc @@ -0,0 +1,3662 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/gltf_encoder.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "draco/attributes/geometry_attribute.h" +#include "draco/attributes/point_attribute.h" +#include "draco/compression/draco_compression_options.h" +#include "draco/compression/expert_encode.h" +#include "draco/core/draco_types.h" +#include "draco/core/vector_d.h" +#include "draco/io/file_utils.h" +#include "draco/io/file_writer_utils.h" +#include "draco/io/gltf_utils.h" +#include "draco/io/texture_io.h" +#include "draco/mesh/mesh_features.h" +#include "draco/mesh/mesh_splitter.h" +#include "draco/mesh/mesh_utils.h" +#include "draco/scene/instance_array.h" +#include "draco/scene/scene_indices.h" +#include "draco/scene/scene_utils.h" +#include "draco/texture/texture_utils.h" + +namespace draco { + +// Values are specfified from glTF 2.0 sampler spec. See here for more +// information: +// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#sampler +int TextureFilterTypeToGltfValue(TextureMap::FilterType filter_type) { + switch (filter_type) { + case TextureMap::NEAREST: + return 9728; + case TextureMap::LINEAR: + return 9729; + case TextureMap::NEAREST_MIPMAP_NEAREST: + return 9984; + case TextureMap::LINEAR_MIPMAP_NEAREST: + return 9985; + case TextureMap::NEAREST_MIPMAP_LINEAR: + return 9986; + case TextureMap::LINEAR_MIPMAP_LINEAR: + return 9987; + default: + return -1; + } +} + +// Values are specfified from glTF 2.0 sampler spec. See here for more +// information: +// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#sampler +int TextureAxisWrappingModeToGltfValue(TextureMap::AxisWrappingMode mode) { + switch (mode) { + case TextureMap::CLAMP_TO_EDGE: + return 33071; + case TextureMap::MIRRORED_REPEAT: + return 33648; + case TextureMap::REPEAT: + return 10497; + default: + return -1; + } +} + +// Checks |att| metadata entry in |mesh| with key "attribute_name" and returns +// entry value if it begins with "_FEATURE_ID_", or an empty string otherwise. +std::string GetFeatureIdAttributeName(const PointAttribute &att, + const Mesh &mesh) { + const auto *const metadata = + mesh.GetAttributeMetadataByAttributeId(att.unique_id()); + if (metadata) { + std::string attribute_name; + if (metadata->GetEntryString("attribute_name", &attribute_name)) { + constexpr char kPrefix[] = "_FEATURE_ID_"; + if (attribute_name.rfind(kPrefix) == 0) { + return attribute_name; + } + } + } + return std::string(); +} + +// Struct to hold glTF Scene data. +struct GltfScene { + std::vector node_indices; +}; + +// Struct to hold glTF Node data. +struct GltfNode { + GltfNode() + : mesh_index(-1), + skin_index(-1), + light_index(-1), + instance_array_index(-1), + root_node(false) {} + + std::string name; + std::vector childern_indices; + int mesh_index; + int skin_index; + int light_index; + int instance_array_index; + bool root_node; + TrsMatrix trs_matrix; +}; + +// Struct to hold image data. +struct GltfImage { + std::string image_name; + const Texture *texture; + std::unique_ptr owned_texture; + int num_components = 0; + int buffer_view = -1; + std::string mime_type; +}; + +// Struct to hold texture filtering options. The members are based on glTF 2.0 +// samplers. For more information see: +// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#samplers +struct TextureSampler { + TextureSampler(TextureMap::FilterType min, TextureMap::FilterType mag, + TextureMap::WrappingMode mode) + : min_filter(min), mag_filter(mag), wrapping_mode(mode) {} + + bool operator==(const TextureSampler &other) const { + if (min_filter != other.min_filter) { + return false; + } + if (mag_filter != other.mag_filter) { + return false; + } + return wrapping_mode.s == other.wrapping_mode.s && + wrapping_mode.t == other.wrapping_mode.t; + } + + TextureMap::FilterType min_filter = TextureMap::UNSPECIFIED; + TextureMap::FilterType mag_filter = TextureMap::UNSPECIFIED; + TextureMap::WrappingMode wrapping_mode = {TextureMap::CLAMP_TO_EDGE, + TextureMap::CLAMP_TO_EDGE}; +}; + +// Struct to hold texture data. Multiple textures can reference the same image. +struct GltfTexture { + GltfTexture(int image, int sampler) + : image_index(image), sampler_index(sampler) {} + bool operator==(const GltfTexture &other) const { + return image_index == other.image_index && + sampler_index == other.sampler_index; + } + int image_index; + int sampler_index; +}; + +// Struct to hold glTF Accessor data. +struct GltfAccessor { + GltfAccessor() + : buffer_view_index(-1), + byte_stride(0), + component_type(-1), + normalized(false) {} + + int buffer_view_index; + int byte_stride; + int component_type; + int64_t count; + std::vector max; + std::vector min; + std::string type; + bool normalized; +}; + +// Struct to hold glTF BufferView data. Currently there is only one Buffer, so +// there is no need to store a buffer index. +struct GltfBufferView { + int64_t buffer_byte_offset = -1; + int64_t byte_length = 0; + int target = 0; +}; + +// Struct to hold information about a Draco compressed mesh. +struct GltfDracoCompressedMesh { + int buffer_view_index = -1; + std::map attributes; +}; + +// Struct to hold glTF Primitive data. +struct GltfPrimitive { + GltfPrimitive() : indices(-1), mode(4), material(0) {} + + int indices; + int mode; + int material; + std::vector material_variants_mappings; + std::vector mesh_features; + std::map attributes; + GltfDracoCompressedMesh compressed_mesh_info; +}; + +struct GltfMesh { + std::string name; + std::vector primitives; +}; + +// Class to hold and output glTF data. +class GltfAsset { + public: + // glTF value types and values. + enum ComponentType { + BYTE = 5120, + UNSIGNED_BYTE = 5121, + SHORT = 5122, + UNSIGNED_SHORT = 5123, + UNSIGNED_INT = 5125, + FLOAT = 5126 + }; + // Return the size of the component based on |max_value|. + static int UnsignedIntComponentSize(unsigned int max_value); + + // Return component type based on |max_value|. + static ComponentType UnsignedIntComponentType(unsigned int max_value); + + GltfAsset(); + + std::string generator() const { return generator_; } + std::string version() const { return version_; } + std::string buffer_name() const { return buffer_name_; } + void buffer_name(const std::string &name) { buffer_name_ = name; } + const EncoderBuffer *Buffer() const { return &buffer_; } + + // Convert a Draco Mesh to glTF data. + bool AddDracoMesh(const Mesh &mesh); + + // Convert a Draco Scene to glTF data. + Status AddScene(const Scene &scene); + + // Copy the glTF data to |buf_out|. + Status Output(EncoderBuffer *buf_out); + + // Return the output image referenced by |index|. + const GltfImage *GetImage(int index) const; + + // Return the number of images added to the GltfAsset. + int NumImages() const { return images_.size(); } + + const std::string &image_name(int i) const { return images_[i].image_name; } + + void set_add_images_to_buffer(bool flag) { add_images_to_buffer_ = flag; } + bool add_images_to_buffer() const { return add_images_to_buffer_; } + void set_output_type(GltfEncoder::OutputType type) { output_type_ = type; } + GltfEncoder::OutputType output_type() const { return output_type_; } + void set_json_output_mode(JsonWriter::Mode mode) { gltf_json_.SetMode(mode); } + + private: + // Pad |buffer_| to 4 byte boundary. + bool PadBuffer(); + + // Returns the index of the scene that was added. -1 on error. + int AddScene(); + + // Add a glTF attribute index to |draco_extension|. + void AddAttributeToDracoExtension( + const Mesh &mesh, GeometryAttribute::Type type, int index, + const std::string &name, GltfDracoCompressedMesh *compressed_mesh_info); + + // Compresses |mesh| using Draco. On success returns the buffer_view in + // |primitive| and number of encoded points and faces. + Status CompressMeshWithDraco(const Mesh &mesh, + const Eigen::Matrix4d &transform, + GltfPrimitive *primitive, + int64_t *num_encoded_points, + int64_t *num_encoded_faces); + + // Adds a Draco mesh associated with a material id and material variants. + bool AddDracoMesh(const Mesh &mesh, int material_id, + const std::vector + &material_variants_mappings, + const Eigen::Matrix4d &transform); + + // Add the Draco mesh indices to the glTF data. |num_encoded_faces| is the + // number of faces encoded in |mesh|, which can be different than + // mesh.numfaces(). Returns the index of the accessor that was added. -1 on + // error. + int AddDracoIndices(const Mesh &mesh, int64_t num_encoded_faces); + + // Add the Draco mesh positions attribute to the glTF data. + // |num_encoded_points| is the number of points encoded in |mesh|, which can + // be different than mesh.num_points(). Returns the index of the accessor that + // was added. -1 on error. + int AddDracoPositions(const Mesh &mesh, int num_encoded_points); + + // Add the Draco mesh normals attribute to the glTF data. |num_encoded_points| + // is the number of points encoded in |mesh|, which can be different than + // mesh.num_points(). Returns the index of + // the accessor that was added. -1 on error. + int AddDracoNormals(const Mesh &mesh, int num_encoded_points); + + // Add the Draco mesh vertex color attribute to the glTF data. + // |num_encoded_points| is the number of points encoded in |mesh|, which can + // be different than mesh.num_points(). Returns the index of the accessor that + // was added. -1 on error. + int AddDracoColors(const Mesh &mesh, int num_encoded_points); + + // Add the Draco mesh texture attribute to the glTF data. |tex_coord_index| is + // the index into the texture coordinates added to |mesh|. + // |num_encoded_points| is the number of points encoded in |mesh|, which can + // be different than mesh.num_points(). Returns the index of the accessor that + // was added. -1 on error. + int AddDracoTexture(const Mesh &mesh, int tex_coord_index, + int num_encoded_points); + + // Add the Draco mesh tangent attribute to the glTF data. The Draco mesh + // tangents only contains the x, y, and z components and glTF needs the + // x, y, z, and w components for glTF mesh tangents. Note this is not true + // for tangents of glTF morph targets. This function will add the w component + // to the glTF tangents. |num_encoded_points| is the + // number of points encoded in |mesh|, which can be different than + // mesh.num_points(). Returns the index of the accessor that was added. + // -1 on error. + // Note: Tangents are not added if the attribute contains "auto_generated" + // metadata. See go/tangents_and_draco_simplifier for more details. + int AddDracoTangents(const Mesh &mesh, int num_encoded_points); + + int AddDracoJoints(const Mesh &mesh, int num_encoded_points); + int AddDracoWeights(const Mesh &mesh, int num_encoded_points); + std::vector> AddDracoGenerics( + const Mesh &mesh, int num_encoded_points); + + // Iterate through the materials that are associated with |mesh| and add them + // to the asset. Returns true if |mesh| does not contain any materials or all + // the materials are supported. Returns false if |mesh| contains materials + // that are not supported. + bool AddMaterials(const Mesh &mesh); + + // Checks whether a given Draco |attribute| has data of expected |data_type| + // and whether the data has one of expected |num_components|. Returns true + // when the |attribute| meets expectations, false otherwise. + static bool CheckDracoAttribute(const PointAttribute *attribute, + const std::set &data_types, + const std::set &num_components); + + // Returns the name of |texture|. If |texture|'s name is empty then it will + // generate a name using |texture_index| and |suffix|. If it cannot generate a + // name then it will return an empty string. + std::string GetTextureName(const Texture &texture, int texture_index, + const std::string &suffix) const; + + // Adds a new glTF image to the asset and returns its index. |owned_texture| + // is an optional argument that can be used when the added image is not + // contained in the encoded MaterialLibrary (e.g. for images that are locally + // modified before they are encoded to disk). The image file name is generated + // by combining |image_stem| and image mime type contained in the |texture|. + StatusOr AddImage(const std::string &image_stem, const Texture *texture, + int num_components); + StatusOr AddImage(const std::string &image_stem, const Texture *texture, + std::unique_ptr owned_texture, + int num_components); + + // Saves an image with a given |image_index| into a buffer. + Status SaveImageToBuffer(int image_index); + + // Adds |sampler| to vector of samplers and returns the index. If |sampler| is + // equal to default values then |sampler| is not added to the vector and + // returns -1. + StatusOr AddTextureSampler(const TextureSampler &sampler); + + // Adds a Draco SceneNode, referenced by |scene_node_index|, to the glTF data. + Status AddSceneNode(const Scene &scene, SceneNodeIndex scene_node_index); + + // Iterate through the materials that are associated with |scene| and add them + // to the asset. Returns true if |scene| does not contain any materials or all + // the materials are supported. Returns false if |scene| contains materials + // that are not supported. + bool AddMaterials(const Scene &scene); + + // Iterate through the animations that are associated with |scene| and add + // them to the asset. Returns OkStatus() if |scene| does not contain any + // animations. + Status AddAnimations(const Scene &scene); + + // Converts the data associated with |node_animation_data| and adds that to + // the encoder as an accessor. + StatusOr AddNodeAnimationData( + const NodeAnimationData &node_animation_data); + + // Iterate through the skins that are associated with |scene| and add + // them to the asset. Returns OkStatus() if |scene| does not contain any + // skins. + Status AddSkins(const Scene &scene); + + // Iterate through the lights that are associated with |scene| and add them to + // the asset. Returns OkStatus() if |scene| does not contain any lights. + Status AddLights(const Scene &scene); + + // Iterate through materials variants names that are associated with |scene| + // and add them to the asset. Returns OkStatus() if |scene| does not contain + // any materials variants. + Status AddMaterialsVariantsNames(const Scene &scene); + + // Iterate through the mesh group instance arrays that are associated with + // |scene| and add them to the asset. Returns OkStatus() if |scene| does not + // contain any mesh group instance arrays. + Status AddInstanceArrays(const Scene &scene); + + // Adds structural metadata from |geometry| to the asset, if any. + template + void AddStructuralMetadata(const GeometryT &geometry); + + // Adds float |data| representing |num_components|-length vectors to the + // encoder as accessor and return the new accessor index. + StatusOr AddData(const std::vector &data, int num_components); + + // Adds property table |data| as buffer view and returns buffer view index. + StatusOr AddBufferView(const PropertyTable::Property::Data &data); + + bool EncodeAssetProperty(EncoderBuffer *buf_out); + bool EncodeScenesProperty(EncoderBuffer *buf_out); + bool EncodeInitialSceneProperty(EncoderBuffer *buf_out); + bool EncodeNodesProperty(EncoderBuffer *buf_out); + Status EncodeMeshesProperty(EncoderBuffer *buf_out); + Status EncodePrimitiveExtensionsProperty(const GltfPrimitive &primitive, + EncoderBuffer *buf_out); + Status EncodeMaterials(EncoderBuffer *buf_out); + + // Encodes a color material. |red|, |green|, |blue|, |alpha|, and + // |metallic_factor| are values in the range of 0.0 - 1.0. + void EncodeColorMaterial(float red, float green, float blue, float alpha, + float metallic_factor); + Status EncodeDefaultMaterial(EncoderBuffer *buf_out); + + // Encodes a texture map. |object_name| is the name of the texture map. + // |image_index| is the index into the texture image array. |tex_coord_index| + // is the index into the texture coordinates. |texture_map| is a reference to + // the texture map that is going to be encoded. + Status EncodeTextureMap(const std::string &object_name, int image_index, + int tex_coord_index, const Material &material, + const TextureMap &texture_map); + + // Encodes a texture map similar to the method above. When the |object_name| + // is "texture" and |channels| is not empty, then the |channels| is encoded + // into the "channels" property as required by the "texture" object of the + // EXT_mesh_features extension. + Status EncodeTextureMap(const std::string &object_name, int image_index, + int tex_coord_index, const Material &material, + const TextureMap &texture_map, + const std::vector &channels); + Status EncodeMaterialsProperty(EncoderBuffer *buf_out); + + void EncodeMaterialUnlitExtension(const Material &material); + Status EncodeMaterialSheenExtension(const Material &material, + const Material &defaults, + int material_index); + Status EncodeMaterialTransmissionExtension(const Material &material, + const Material &defaults, + int material_index); + Status EncodeMaterialClearcoatExtension(const Material &material, + const Material &defaults, + int material_index); + Status EncodeMaterialVolumeExtension(const Material &material, + const Material &defaults, + int material_index); + Status EncodeMaterialIorExtension(const Material &material, + const Material &defaults); + Status EncodeMaterialSpecularExtension(const Material &material, + const Material &defaults, + int material_index); + Status EncodeTexture(const std::string &name, const std::string &stem_suffix, + TextureMap::Type type, int num_components, + const Material &material, int material_index); + Status EncodeAnimationsProperty(EncoderBuffer *buf_out); + Status EncodeSkinsProperty(EncoderBuffer *buf_out); + Status EncodeTopLevelExtensionsProperty(EncoderBuffer *buf_out); + Status EncodeLightsProperty(EncoderBuffer *buf_out); + Status EncodeMaterialsVariantsNamesProperty(EncoderBuffer *buf_out); + Status EncodeStructuralMetadataProperty(EncoderBuffer *buf_out); + bool EncodeAccessorsProperty(EncoderBuffer *buf_out); + bool EncodeBufferViewsProperty(EncoderBuffer *buf_out); + bool EncodeBuffersProperty(EncoderBuffer *buf_out); + Status EncodeExtensionsProperties(EncoderBuffer *buf_out); + + // Encodes a draco::VectorNX as a glTF array. + template + void EncodeVectorArray(const std::string &array_name, T vec) { + gltf_json_.BeginArray(array_name); + for (int i = 0; i < T::dimension; ++i) { + gltf_json_.OutputValue(vec[i]); + } + gltf_json_.EndArray(); + } + + // Add a mesh Draco attribute |att| that is comprised of floats to the glTF + // data. Returns the index accessor added to the glTF data. Returns -1 on + // error. + template + int AddAttribute(const PointAttribute &att, int num_points, + int num_encoded_points, bool compress) { + const int num_components = att.num_components(); + switch (num_components) { + case 1: + return AddAttribute<1, att_data_t>(att, num_points, num_encoded_points, + "SCALAR", compress); + break; + case 2: + return AddAttribute<2, att_data_t>(att, num_points, num_encoded_points, + "VEC2", compress); + break; + case 3: + return AddAttribute<3, att_data_t>(att, num_points, num_encoded_points, + "VEC3", compress); + break; + case 4: + return AddAttribute<4, att_data_t>(att, num_points, num_encoded_points, + "VEC4", compress); + break; + default: + break; + } + return -1; + } + + // Template method only has specialized implementations for known glTF types. + template + ComponentType GetComponentType() const = delete; + + template + int AddAttribute(const PointAttribute &att, int num_points, + int num_encoded_points, const std::string &type, + bool compress); + + std::string generator_; + std::string version_; + std::vector scenes_; + + // Initial scene to load. + int scene_index_; + + std::vector nodes_; + std::vector accessors_; + std::vector buffer_views_; + std::vector meshes_; + + // Data structure to copy the input meshes materials. + MaterialLibrary material_library_; + + std::vector images_; + std::vector textures_; + + std::unordered_map texture_to_image_index_map_; + + std::string buffer_name_; + EncoderBuffer buffer_; + JsonWriter gltf_json_; + + // Keeps track if the glTF mesh has been added. + std::map mesh_group_index_to_gltf_mesh_; + std::map> mesh_index_to_gltf_mesh_primitive_; + IndexTypeVector base_mesh_transforms_; + + struct EncoderAnimation { + std::string name; + std::vector> samplers; + std::vector> channels; + }; + std::vector> animations_; + + struct EncoderSkin { + EncoderSkin() : inverse_bind_matrices_index(-1), skeleton_index(-1) {} + int inverse_bind_matrices_index; + std::vector joints; + int skeleton_index; + }; + + // Instance array is represented by its attribute accessors. + struct EncoderInstanceArray { + EncoderInstanceArray() : translation(-1), rotation(-1), scale(-1) {} + int translation; + int rotation; + int scale; + }; + + std::vector> skins_; + std::vector> lights_; + std::vector materials_variants_names_; + std::vector instance_arrays_; + PropertyTable::Schema property_table_schema_; + std::vector property_tables_; + + // Indicates whether Draco compression is used for any of the asset meshes. + bool draco_compression_used_; + + // Indicates whether mesh features are used. + bool mesh_features_used_; + + // Counter for naming mesh feature textures. + int mesh_features_texture_index_; + + // If set GltfAsset will add the images to |buffer_| instead of writing the + // images to separate files. + bool add_images_to_buffer_; + + // Used to hold the extensions used and required by the glTF asset. + std::set extensions_used_; + std::set extensions_required_; + + std::vector texture_samplers_; + + GltfEncoder::OutputType output_type_; + + // Temporary storage for meshes created during the runtime of the GltfEncoder. + // We need to store them here to ensure their content doesn't get deleted + // before it is used by the encoder. + std::vector> local_meshes_; +}; + +int GltfAsset::UnsignedIntComponentSize(unsigned int max_value) { + // According to GLTF 2.0 spec, 0xff (and 0xffff respectively) are reserved for + // the primitive restart symbol. + if (max_value < 0xff) { + return 1; + } else if (max_value < 0xffff) { + return 2; + } + return 4; +} + +GltfAsset::ComponentType GltfAsset::UnsignedIntComponentType( + unsigned int max_value) { + // According to GLTF 2.0 spec, 0xff (and 0xffff respectively) are reserved for + // the primitive restart symbol. + if (max_value < 0xff) { + return UNSIGNED_BYTE; + } else if (max_value < 0xffff) { + return UNSIGNED_SHORT; + } + return UNSIGNED_INT; +} + +GltfAsset::GltfAsset() + : generator_("draco_decoder"), + version_("2.0"), + scene_index_(-1), + buffer_name_("buffer0.bin"), + draco_compression_used_(false), + mesh_features_used_(false), + mesh_features_texture_index_(0), + add_images_to_buffer_(false), + output_type_(GltfEncoder::COMPACT) {} + +bool GltfAsset::AddDracoMesh(const Mesh &mesh) { + const int scene_index = AddScene(); + if (scene_index < 0) { + return false; + } + if (!AddMaterials(mesh)) { + return false; + } + + GltfMesh gltf_mesh; + meshes_.push_back(gltf_mesh); + + AddStructuralMetadata(mesh); + + const int32_t material_att_id = + mesh.GetNamedAttributeId(GeometryAttribute::MATERIAL); + if (material_att_id == -1) { + if (!AddDracoMesh(mesh, 0, {}, Eigen::Matrix4d::Identity())) { + return false; + } + } else { + const auto mat_att = mesh.GetNamedAttribute(GeometryAttribute::MATERIAL); + + // Split mesh using the material attribute. + MeshSplitter splitter; + auto split_maybe = splitter.SplitMesh(mesh, material_att_id); + if (!split_maybe.ok()) { + return false; + } + auto split_meshes = std::move(split_maybe).value(); + for (int i = 0; i < split_meshes.size(); ++i) { + if (split_meshes[i] == nullptr) { + continue; // Empty mesh. Ignore. + } + uint32_t mat_index = 0; + mat_att->GetValue(AttributeValueIndex(i), &mat_index); + + // Copy over mesh features for a given material index. + Mesh::CopyMeshFeaturesForMaterial(mesh, split_meshes[i].get(), mat_index); + + // Move the split mesh to a temporary storage of the GltfAsset. This will + // ensure the mesh will stay alive as long the asset needs it. We have to + // do this because the split mesh may contain mesh features data that are + // used later in the encoding process. + local_meshes_.push_back(std::move(split_meshes[i])); + + // The material index in the glTF file corresponds to the index of the + // split mesh. + if (!AddDracoMesh(*(local_meshes_.back().get()), mat_index, {}, + Eigen::Matrix4d::Identity())) { + return false; + } + } + } + + // Currently output only one mesh. + GltfNode mesh_node; + mesh_node.mesh_index = 0; + nodes_.push_back(mesh_node); + nodes_.back().root_node = true; + return true; +} + +int GltfAsset::AddScene() { + GltfScene scene; + scenes_.push_back(scene); + const int scene_index = static_cast(scenes_.size()) - 1; + + if (scene_index_ == -1) { + scene_index_ = scene_index; + } + return scene_index; +} + +Status GltfAsset::Output(EncoderBuffer *buf_out) { + gltf_json_.BeginObject(); + if (!EncodeAssetProperty(buf_out)) { + return Status(Status::DRACO_ERROR, "Failed encoding asset."); + } + if (!EncodeScenesProperty(buf_out)) { + return Status(Status::DRACO_ERROR, "Failed encoding scenes."); + } + if (!EncodeInitialSceneProperty(buf_out)) { + return Status(Status::DRACO_ERROR, "Failed encoding initial scene."); + } + if (!EncodeNodesProperty(buf_out)) { + return Status(Status::DRACO_ERROR, "Failed encoding nodes."); + } + DRACO_RETURN_IF_ERROR(EncodeMeshesProperty(buf_out)); + DRACO_RETURN_IF_ERROR(EncodeMaterials(buf_out)); + if (!EncodeAccessorsProperty(buf_out)) { + return Status(Status::DRACO_ERROR, "Failed encoding accessors."); + } + DRACO_RETURN_IF_ERROR(EncodeAnimationsProperty(buf_out)); + DRACO_RETURN_IF_ERROR(EncodeSkinsProperty(buf_out)); + DRACO_RETURN_IF_ERROR(EncodeTopLevelExtensionsProperty(buf_out)); + if (!EncodeBufferViewsProperty(buf_out)) { + return Status(Status::DRACO_ERROR, "Failed encoding buffer views."); + } + if (!EncodeBuffersProperty(buf_out)) { + return Status(Status::DRACO_ERROR, "Failed encoding buffers."); + } + DRACO_RETURN_IF_ERROR(EncodeExtensionsProperties(buf_out)); + gltf_json_.EndObject(); + + const std::string asset_str = gltf_json_.MoveData(); + if (!buf_out->Encode(asset_str.data(), asset_str.length())) { + return Status(Status::DRACO_ERROR, "Failed encoding json data."); + } + if (!buf_out->Encode("\n", 1)) { + return Status(Status::DRACO_ERROR, "Failed encoding json data."); + } + return OkStatus(); +} + +const GltfImage *GltfAsset::GetImage(int index) const { + if (index < 0 || index >= images_.size()) { + return nullptr; + } + return &images_[index]; +} + +bool GltfAsset::PadBuffer() { + if (buffer_.size() % 4 != 0) { + const int pad_bytes = 4 - buffer_.size() % 4; + const int pad_data = 0; + if (!buffer_.Encode(&pad_data, pad_bytes)) { + return false; + } + } + return true; +} + +void GltfAsset::AddAttributeToDracoExtension( + const Mesh &mesh, GeometryAttribute::Type type, int index, + const std::string &name, GltfDracoCompressedMesh *compressed_mesh_info) { + if (mesh.IsCompressionEnabled()) { + const PointAttribute *const att = mesh.GetNamedAttribute(type, index); + if (att) { + compressed_mesh_info->attributes.insert( + std::pair(name, att->unique_id())); + } + } +} + +Status GltfAsset::CompressMeshWithDraco(const Mesh &mesh, + const Eigen::Matrix4d &transform, + GltfPrimitive *primitive, + int64_t *num_encoded_points, + int64_t *num_encoded_faces) { + // Check that geometry comression options are valid. + DracoCompressionOptions compression_options = mesh.GetCompressionOptions(); + DRACO_RETURN_IF_ERROR(compression_options.Check()); + + // Make a copy of the mesh. It will be modified and compressed. + std::unique_ptr mesh_copy(new Mesh()); + mesh_copy->Copy(mesh); + + // Delete auto-generated tangents. + if (MeshUtils::HasAutoGeneratedTangents(*mesh_copy)) { + for (int i = 0; i < mesh_copy->num_attributes(); ++i) { + PointAttribute *const att = mesh_copy->attribute(i); + if (att->attribute_type() == GeometryAttribute::TANGENT) { + while (mesh_copy->GetNamedAttribute(GeometryAttribute::TANGENT)) { + mesh_copy->DeleteAttribute( + mesh_copy->GetNamedAttributeId(GeometryAttribute::TANGENT)); + } + break; + } + } + } + + // Create Draco encoder. + EncoderBuffer buffer; + ExpertEncoder encoder(*mesh_copy); + encoder.SetTrackEncodedProperties(true); + + // Convert compression level to speed (that 0 = slowest, 10 = fastest). + const int speed = 10 - compression_options.compression_level; + encoder.SetSpeedOptions(speed, speed); + + // Configure attribute quantization. + for (int i = 0; i < mesh_copy->num_attributes(); ++i) { + const PointAttribute *const att = mesh_copy->attribute(i); + if (att->attribute_type() == GeometryAttribute::POSITION && + !compression_options.quantization_position + .AreQuantizationBitsDefined()) { + // Desired spacing in the "global" coordinate system. + const float global_spacing = + compression_options.quantization_position.spacing(); + + // Note: Ideally we would transform the whole mesh before encoding and + // apply the original global spacing on the transformed mesh. But neither + // KHR_draco_mesh_compression, nor Draco bitstream support post-decoding + // transformations so we have to modify the grid settings here. + + // Transform this spacing to the local coordinate system of the base mesh. + // We will get the largest scale factor from the transformation matrix and + // use it to adjust the grid spacing. + const Vector3f scale_vec(transform.col(0).norm(), transform.col(1).norm(), + transform.col(2).norm()); + + const float max_scale = scale_vec.MaxCoeff(); + + // Spacing is inverse to the scale. The larger the scale, the smaller the + // spacing must be. + const float local_spacing = global_spacing / max_scale; + + // Update the compression options of the processed mesh. + compression_options.quantization_position.SetGrid(local_spacing); + } else { + int num_quantization_bits = -1; + switch (att->attribute_type()) { + case GeometryAttribute::POSITION: + num_quantization_bits = + compression_options.quantization_position.quantization_bits(); + break; + case GeometryAttribute::NORMAL: + num_quantization_bits = compression_options.quantization_bits_normal; + break; + case GeometryAttribute::TEX_COORD: + num_quantization_bits = + compression_options.quantization_bits_tex_coord; + break; + case GeometryAttribute::TANGENT: + num_quantization_bits = compression_options.quantization_bits_tangent; + break; + case GeometryAttribute::WEIGHTS: + num_quantization_bits = compression_options.quantization_bits_weight; + break; + case GeometryAttribute::GENERIC: + if (GetFeatureIdAttributeName(*att, *mesh_copy).empty()) { + num_quantization_bits = + compression_options.quantization_bits_generic; + } else { + // Quantization is explicitly disabled for feature ID attributes. + encoder.SetAttributeQuantization(i, -1); + } + break; + default: + break; + } + if (num_quantization_bits > 0) { + encoder.SetAttributeQuantization(i, num_quantization_bits); + } + } + } + + // Flip UV values as required by glTF Draco and non-Draco files. + for (int i = 0; i < mesh_copy->num_attributes(); ++i) { + PointAttribute *const att = mesh_copy->attribute(i); + if (att->attribute_type() == GeometryAttribute::TEX_COORD) { + if (!MeshUtils::FlipTextureUvValues(false, true, att)) { + return Status(Status::DRACO_ERROR, "Could not flip texture UV values."); + } + } + } + + // Change tangents, joints, and weights attribute types to generic. The + // original mesh's attribute type is unchanged and the mapping of the glTF + // attribute type to Draco compressed attribute id is written to the output + // glTF file. + for (int i = 0; i < mesh_copy->num_attributes(); ++i) { + PointAttribute *const att = mesh_copy->attribute(i); + if (att->attribute_type() == GeometryAttribute::TANGENT || + att->attribute_type() == GeometryAttribute::JOINTS || + att->attribute_type() == GeometryAttribute::WEIGHTS) { + att->set_attribute_type(GeometryAttribute::GENERIC); + } + } + + // |compression_options| may have been modified and we need to update them + // before we start the encoding. + mesh_copy->SetCompressionOptions(compression_options); + DRACO_RETURN_IF_ERROR(encoder.EncodeToBuffer(&buffer)); + *num_encoded_points = encoder.num_encoded_points(); + *num_encoded_faces = encoder.num_encoded_faces(); + const size_t buffer_start_offset = buffer_.size(); + if (!buffer_.Encode(buffer.data(), buffer.size())) { + return Status(Status::DRACO_ERROR, "Could not copy Draco compressed data."); + } + if (!PadBuffer()) { + return Status(Status::DRACO_ERROR, "Could not pad glTF buffer."); + } + + GltfBufferView buffer_view; + buffer_view.buffer_byte_offset = buffer_start_offset; + buffer_view.byte_length = buffer_.size() - buffer_start_offset; + buffer_views_.push_back(buffer_view); + primitive->compressed_mesh_info.buffer_view_index = + static_cast(buffer_views_.size() - 1); + return OkStatus(); +} + +bool CheckAndGetTexCoordAttributeOrder(const Mesh &mesh, + std::vector *tex_coord_order) { + // We will only consider at most two texture coordinate attributes. + *tex_coord_order = {0, 1}; + const int num_attributes = + std::min(mesh.NumNamedAttributes(GeometryAttribute::TEX_COORD), 2); + + // Collect texture coordinate attribute names from metadata. + std::vector names(num_attributes, ""); + for (int i = 0; i < num_attributes; i++) { + const auto metadata = mesh.GetAttributeMetadataByAttributeId( + mesh.GetNamedAttributeId(GeometryAttribute::TEX_COORD, i)); + std::string attribute_name; + if (metadata != nullptr) { + metadata->GetEntryString("attribute_name", &attribute_name); + names[i] = attribute_name; + } + } + + // Attribute names may be absent. + if (num_attributes == 0 || + std::all_of(names.begin(), names.end(), + [](const std::string &name) { return name.empty(); })) { + return true; + } + + // Attribute names must be unique. + const std::unordered_set unique_names(names.begin(), + names.end()); + if (unique_names.size() != num_attributes) { + return false; + } + + // Attribute names must be valid. + if (std::any_of(names.begin(), names.end(), [](const std::string &name) { + return name != "TEXCOORD_0" && name != "TEXCOORD_1"; + })) { + return false; + } + + // Populate texture coordinate order index based on attribute names. + if (names[0] == "TEXCOORD_1") { + *tex_coord_order = {1, 0}; + } + return true; +} + +bool GltfAsset::AddDracoMesh( + const Mesh &mesh, int material_id, + const std::vector + &material_variants_mappings, + const Eigen::Matrix4d &transform) { + GltfPrimitive primitive; + int64_t num_encoded_points = mesh.num_points(); + int64_t num_encoded_faces = mesh.num_faces(); + if (num_encoded_faces > 0 && mesh.IsCompressionEnabled()) { + const Status status = CompressMeshWithDraco( + mesh, transform, &primitive, &num_encoded_points, &num_encoded_faces); + if (!status.ok()) { + return false; + } + draco_compression_used_ = true; + } + int indices_index = -1; + if (num_encoded_faces > 0) { + indices_index = AddDracoIndices(mesh, num_encoded_faces); + if (indices_index < 0) { + return false; + } + } + const int position_index = AddDracoPositions(mesh, num_encoded_points); + if (position_index < 0) { + return false; + } + // Check texture coordinate attributes and get the desired encoding order. + std::vector tex_coord_order; + if (!CheckAndGetTexCoordAttributeOrder(mesh, &tex_coord_order)) { + return false; + } + const int normals_accessor_index = AddDracoNormals(mesh, num_encoded_points); + const int colors_accessor_index = AddDracoColors(mesh, num_encoded_points); + const int texture0_accessor_index = + AddDracoTexture(mesh, tex_coord_order[0], num_encoded_points); + const int texture1_accessor_index = + AddDracoTexture(mesh, tex_coord_order[1], num_encoded_points); + const int tangent_accessor_index = AddDracoTangents(mesh, num_encoded_points); + const int joints_accessor_index = AddDracoJoints(mesh, num_encoded_points); + const int weights_accessor_index = AddDracoWeights(mesh, num_encoded_points); + const std::vector> generics_accessors = + AddDracoGenerics(mesh, num_encoded_points); + + if (num_encoded_faces == 0) { + primitive.mode = 0; // POINTS mode. + } + primitive.material = material_id; + primitive.material_variants_mappings = material_variants_mappings; + primitive.mesh_features.reserve(mesh.NumMeshFeatures()); + for (MeshFeaturesIndex i(0); i < mesh.NumMeshFeatures(); ++i) { + primitive.mesh_features.push_back(&mesh.GetMeshFeatures(i)); + } + primitive.indices = indices_index; + primitive.attributes.insert( + std::pair("POSITION", position_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::POSITION, 0, "POSITION", + &primitive.compressed_mesh_info); + if (normals_accessor_index > 0) { + primitive.attributes.insert( + std::pair("NORMAL", normals_accessor_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::NORMAL, 0, "NORMAL", + &primitive.compressed_mesh_info); + } + if (colors_accessor_index > 0) { + primitive.attributes.insert( + std::pair("COLOR_0", colors_accessor_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::COLOR, 0, "COLOR_0", + &primitive.compressed_mesh_info); + } + if (texture0_accessor_index > 0) { + primitive.attributes.insert( + std::pair("TEXCOORD_0", texture0_accessor_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::TEX_COORD, 0, + "TEXCOORD_0", &primitive.compressed_mesh_info); + } + if (texture1_accessor_index > 0) { + primitive.attributes.insert( + std::pair("TEXCOORD_1", texture1_accessor_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::TEX_COORD, 1, + "TEXCOORD_1", &primitive.compressed_mesh_info); + } + if (tangent_accessor_index > 0) { + primitive.attributes.insert( + std::pair("TANGENT", tangent_accessor_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::TANGENT, 0, "TANGENT", + &primitive.compressed_mesh_info); + } + if (joints_accessor_index > 0) { + primitive.attributes.insert( + std::pair("JOINTS_0", joints_accessor_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::JOINTS, 0, "JOINTS_0", + &primitive.compressed_mesh_info); + } + if (weights_accessor_index > 0) { + primitive.attributes.insert( + std::pair("WEIGHTS_0", weights_accessor_index)); + AddAttributeToDracoExtension(mesh, GeometryAttribute::WEIGHTS, 0, + "WEIGHTS_0", &primitive.compressed_mesh_info); + } + for (int att_index = 0; att_index < generics_accessors.size(); ++att_index) { + const std::string &attribute_name = generics_accessors[att_index].first; + if (!attribute_name.empty()) { + primitive.attributes.insert(generics_accessors[att_index]); + AddAttributeToDracoExtension(mesh, GeometryAttribute::GENERIC, att_index, + attribute_name, + &primitive.compressed_mesh_info); + } + } + + meshes_.back().primitives.push_back(primitive); + return true; +} + +int GltfAsset::AddDracoIndices(const Mesh &mesh, int64_t num_encoded_faces) { + // Get the min and max value for the indices. + uint32_t min_index = 0xffffffff; + uint32_t max_index = 0; + for (FaceIndex i(0); i < mesh.num_faces(); ++i) { + const auto &f = mesh.face(i); + + for (int j = 0; j < 3; ++j) { + if (f[j] < min_index) { + min_index = f[j].value(); + } + if (f[j] > max_index) { + max_index = f[j].value(); + } + } + } + + const int component_size = GltfAsset::UnsignedIntComponentSize(max_index); + + GltfAccessor accessor; + if (!mesh.IsCompressionEnabled()) { + const size_t buffer_start_offset = buffer_.size(); + for (FaceIndex i(0); i < mesh.num_faces(); ++i) { + const auto &f = mesh.face(i); + for (int j = 0; j < 3; ++j) { + int index = f[j].value(); + if (!buffer_.Encode(&index, component_size)) { + return -1; + } + } + } + + if (!PadBuffer()) { + return -1; + } + + GltfBufferView buffer_view; + buffer_view.buffer_byte_offset = buffer_start_offset; + buffer_view.byte_length = buffer_.size() - buffer_start_offset; + buffer_views_.push_back(buffer_view); + accessor.buffer_view_index = static_cast(buffer_views_.size() - 1); + } + + accessor.component_type = UnsignedIntComponentType(max_index); + accessor.count = num_encoded_faces * 3; + if (output_type_ == GltfEncoder::VERBOSE) { + accessor.max.push_back(GltfValue(max_index)); + accessor.min.push_back(GltfValue(min_index)); + } + accessor.type = "SCALAR"; + accessors_.push_back(accessor); + return static_cast(accessors_.size() - 1); +} + +int GltfAsset::AddDracoPositions(const Mesh &mesh, int num_encoded_points) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::POSITION); + if (!CheckDracoAttribute(att, {DT_FLOAT32}, {3})) { + return -1; + } + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); +} + +int GltfAsset::AddDracoNormals(const Mesh &mesh, int num_encoded_points) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::NORMAL); + if (!CheckDracoAttribute(att, {DT_FLOAT32}, {3})) { + return -1; + } + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); +} + +int GltfAsset::AddDracoColors(const Mesh &mesh, int num_encoded_points) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::COLOR); + // TODO(b/200302561): Add support for DT_UINT16 with COLOR. + if (!CheckDracoAttribute(att, {DT_UINT8, DT_FLOAT32}, {3, 4})) { + return -1; + } + if (att->data_type() == DT_FLOAT32) { + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); + } + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); +} + +int GltfAsset::AddDracoTexture(const Mesh &mesh, int tex_coord_index, + int num_encoded_points) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::TEX_COORD, tex_coord_index); + // TODO(b/200303080): Add support for DT_UINT8 and DT_UINT16 with TEX_COORD. + if (!CheckDracoAttribute(att, {DT_FLOAT32}, {2})) { + return -1; + } + + // glTF stores texture coordinates flipped on the horizontal axis compared to + // how Draco stores texture coordinates. + GeometryAttribute ga; + ga.Init(GeometryAttribute::TEX_COORD, nullptr, 2, att->data_type(), false, + DataTypeLength(att->data_type()) * 2, 0); + PointAttribute ta(ga); + ta.SetIdentityMapping(); + ta.Reset(mesh.num_points()); + + std::array value; + for (PointIndex v(0); v < mesh.num_points(); ++v) { + if (!att->GetValue(att->mapped_index(v), &value)) { + return -1; + } + + // Draco texture v component needs to be flipped. + Vector2f texture_coord(value[0], 1.0 - value[1]); + ta.SetAttributeValue(AttributeValueIndex(v.value()), texture_coord.data()); + } + return AddAttribute(ta, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); +} + +int GltfAsset::AddDracoTangents(const Mesh &mesh, int num_encoded_points) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::TANGENT); + if (!CheckDracoAttribute(att, {DT_FLOAT32}, {3, 4})) { + return -1; + } + if (MeshUtils::HasAutoGeneratedTangents(mesh)) { + // Ignore auto-generated tangents. See go/tangents_and_draco_simplifier. + return -1; + } + + if (att->num_components() == 4) { + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); + } + + // glTF mesh needs the w component. + GeometryAttribute ga; + ga.Init(GeometryAttribute::TANGENT, nullptr, 4, DT_FLOAT32, false, + DataTypeLength(DT_FLOAT32) * 4, 0); + PointAttribute ta(ga); + ta.SetIdentityMapping(); + ta.Reset(mesh.num_points()); + + std::array value; + for (PointIndex v(0); v < mesh.num_points(); ++v) { + if (!att->GetValue(att->mapped_index(v), &value)) { + return -1; + } + + // Draco tangent w component is always 1.0. + Vector4f tangent(value[0], value[1], value[2], 1.0); + ta.SetAttributeValue(AttributeValueIndex(v.value()), tangent.data()); + } + return AddAttribute(ta, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); +} + +int GltfAsset::AddDracoJoints(const Mesh &mesh, int num_encoded_points) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::JOINTS); + if (!CheckDracoAttribute(att, {DT_UINT8, DT_UINT16}, {4})) { + return -1; + } + if (att->data_type() == DT_UINT16) { + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); + } + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); +} + +int GltfAsset::AddDracoWeights(const Mesh &mesh, int num_encoded_points) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::WEIGHTS); + // TODO(b/200303026): Add support for DT_UINT8 and DT_UINT16 with WEIGHTS. + if (!CheckDracoAttribute(att, {DT_FLOAT32}, {4})) { + return -1; + } + return AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); +} + +// Adds generic attributes that have metadata describing the attribute name. +// This allows for export of application-specific attributes and feature ID +// attributes defined in glTF extension EXT_mesh_features. Returns a vector of +// attribute-name, accessor pairs for each valid attribute. The length of the +// vector is equal to the number of generic attributes. Vector entries +// corresponding to unsupported attributes (e.g., with no metadata) contain +// empty attribute names. +std::vector> GltfAsset::AddDracoGenerics( + const Mesh &mesh, int num_encoded_points) { + const int num_attributes = + mesh.NumNamedAttributes(GeometryAttribute::GENERIC); + std::vector> attrs(num_attributes); + for (int i = 0; i < num_attributes; ++i) { + const PointAttribute *const att = + mesh.GetNamedAttribute(GeometryAttribute::GENERIC, i); + auto const *metadata = + mesh.GetAttributeMetadataByAttributeId(att->unique_id()); + if (metadata) { + std::string attr_name; + if (metadata->GetEntryString(GltfEncoder::kDracoMetadataGltfAttributeName, + &attr_name)) { + if (att->data_type() == DT_FLOAT32) { + int accessor = + AddAttribute(*att, mesh.num_points(), num_encoded_points, + mesh.IsCompressionEnabled()); + attrs[i] = {attr_name, accessor}; + } + } else { + // Try to find feature ID attribute name like "_FEATURE_ID_5" then check + // that the attribute stores scalar values of complient data types as + // defined by the EXT_mesh_features glTF extension. + attr_name = GetFeatureIdAttributeName(*att, mesh); + if (!attr_name.empty() && att->num_components() == 1) { + int accessor = -1; + switch (att->data_type()) { + case DT_UINT8: + accessor = AddAttribute(*att, mesh.num_points(), + num_encoded_points, + mesh.IsCompressionEnabled()); + break; + case DT_UINT16: + accessor = AddAttribute(*att, mesh.num_points(), + num_encoded_points, + mesh.IsCompressionEnabled()); + break; + case DT_FLOAT32: + accessor = AddAttribute(*att, mesh.num_points(), + num_encoded_points, + mesh.IsCompressionEnabled()); + break; + default: + continue; + } + attrs[i] = {attr_name, accessor}; + } + } + } + } + return attrs; +} + +bool GltfAsset::AddMaterials(const Mesh &mesh) { + if (mesh.GetMaterialLibrary().NumMaterials() == 0) { + return true; + } + material_library_.Copy(mesh.GetMaterialLibrary()); + return true; +} + +bool GltfAsset::CheckDracoAttribute(const PointAttribute *attribute, + const std::set &data_types, + const std::set &num_components) { + // Attribute must be valid. + if (attribute == nullptr || attribute->size() == 0) { + return false; + } + + // Attribute must have an expected data type. + if (data_types.find(attribute->data_type()) == data_types.end()) { + return false; + } + + // Attribute must have an expected number of components. + if (num_components.find(attribute->num_components()) == + num_components.end()) { + return false; + } + + return true; +} + +StatusOr GltfAsset::AddImage(const std::string &image_stem, + const Texture *texture, int num_components) { + return AddImage(image_stem, texture, nullptr, num_components); +} + +StatusOr GltfAsset::AddImage(const std::string &image_stem, + const Texture *texture, + std::unique_ptr owned_texture, + int num_components) { + const auto it = texture_to_image_index_map_.find(texture); + if (it != texture_to_image_index_map_.end()) { + // We already have an image for the given |texture|. Update its number of + // components if needed. + GltfImage &image = images_[it->second]; + if (image.num_components < num_components) { + image.num_components = num_components; + } + return it->second; + } + std::string extension = TextureUtils::GetTargetExtension(*texture); + if (extension.empty()) { + // Try to get extension from the source file name. + extension = LowercaseFileExtension(texture->source_image().filename()); + } + GltfImage image; + image.image_name = image_stem + "." + extension; + image.texture = texture; + image.owned_texture = std::move(owned_texture); + image.num_components = num_components; + + // Always maintain the mime_type. Used elsewhere to determine image type. + if (extension == "jpg") { + image.mime_type = "image/jpeg"; + } else { + image.mime_type = "image/" + extension; + } + + // For KTX2 with Basis compression, state that its extension is required. + if (extension == "ktx2") { + extensions_used_.insert("KHR_texture_basisu"); + extensions_required_.insert("KHR_texture_basisu"); + } + + // If this is webp, state that its extension is required. + if (extension == "webp") { + extensions_used_.insert("EXT_texture_webp"); + extensions_required_.insert("EXT_texture_webp"); + } + + images_.push_back(std::move(image)); + texture_to_image_index_map_[texture] = images_.size() - 1; + return images_.size() - 1; +} + +Status GltfAsset::SaveImageToBuffer(int image_index) { + GltfImage &image = images_[image_index]; + const Texture *const texture = image.texture; + const int num_components = image.num_components; + std::vector buffer; + DRACO_RETURN_IF_ERROR(WriteTextureToBuffer(*texture, &buffer)); + + // Add the image data to the buffer. + const size_t buffer_start_offset = buffer_.size(); + buffer_.Encode(buffer.data(), buffer.size()); + if (!PadBuffer()) { + return Status(Status::DRACO_ERROR, + "Could not pad buffer in SaveImageToBuffer."); + } + + // Add a buffer view pointing to the image data in the buffer. + GltfBufferView buffer_view; + buffer_view.buffer_byte_offset = buffer_start_offset; + buffer_view.byte_length = buffer_.size() - buffer_start_offset; + buffer_views_.push_back(buffer_view); + + image.buffer_view = buffer_views_.size() - 1; + return OkStatus(); +} + +// TODO(vytyaz): The return type could be int. +StatusOr GltfAsset::AddTextureSampler(const TextureSampler &sampler) { + // If sampler is equal to defaults do not add to vector and return -1. + if (sampler.min_filter == TextureMap::UNSPECIFIED && + sampler.mag_filter == TextureMap::UNSPECIFIED && + sampler.wrapping_mode.s == TextureMap::REPEAT && + sampler.wrapping_mode.t == TextureMap::REPEAT) { + return -1; + } + + const auto &it = + std::find(texture_samplers_.begin(), texture_samplers_.end(), sampler); + if (it != texture_samplers_.end()) { + const int index = std::distance(texture_samplers_.begin(), it); + return index; + } + + texture_samplers_.push_back(sampler); + return texture_samplers_.size() - 1; +} + +Status GltfAsset::AddScene(const Scene &scene) { + const int scene_index = AddScene(); + if (scene_index < 0) { + return Status(Status::DRACO_ERROR, "Error creating a new scene."); + } + if (!AddMaterials(scene)) { + return Status(Status::DRACO_ERROR, "Error adding materials to the scene."); + } + // Initialize base mesh transforms that may be needed when the base meshes are + // compressed with Draco. + base_mesh_transforms_ = SceneUtils::FindLargestBaseMeshTransforms(scene); + for (SceneNodeIndex i(0); i < scene.NumNodes(); ++i) { + DRACO_RETURN_IF_ERROR(AddSceneNode(scene, i)); + } + // There is 1:1 mapping between draco::Scene node indices and |nodes_|. + for (int i = 0; i < scene.NumRootNodes(); ++i) { + nodes_[scene.GetRootNodeIndex(i).value()].root_node = true; + } + DRACO_RETURN_IF_ERROR(AddAnimations(scene)); + DRACO_RETURN_IF_ERROR(AddSkins(scene)); + DRACO_RETURN_IF_ERROR(AddLights(scene)); + DRACO_RETURN_IF_ERROR(AddMaterialsVariantsNames(scene)); + DRACO_RETURN_IF_ERROR(AddInstanceArrays(scene)); + AddStructuralMetadata(scene); + return OkStatus(); +} + +Status GltfAsset::AddSceneNode(const Scene &scene, + SceneNodeIndex scene_node_index) { + const SceneNode *const scene_node = scene.GetNode(scene_node_index); + if (scene_node == nullptr) { + return Status(Status::DRACO_ERROR, "Could not find node in scene."); + } + + GltfNode node; + node.name = scene_node->GetName(); + node.trs_matrix.Copy(scene_node->GetTrsMatrix()); + + for (int i = 0; i < scene_node->NumChildren(); ++i) { + node.childern_indices.push_back(scene_node->Child(i).value()); + } + + const MeshGroupIndex mesh_group_index = scene_node->GetMeshGroupIndex(); + if (mesh_group_index != kInvalidMeshGroupIndex) { + const auto it = mesh_group_index_to_gltf_mesh_.find(mesh_group_index); + if (it == mesh_group_index_to_gltf_mesh_.end()) { + GltfMesh gltf_mesh; + const MeshGroup *const mesh_group = scene.GetMeshGroup(mesh_group_index); + if (!mesh_group->GetName().empty()) { + gltf_mesh.name = mesh_group->GetName(); + } + meshes_.push_back(gltf_mesh); + + for (int i = 0; i < mesh_group->NumMeshInstances(); ++i) { + const MeshGroup::MeshInstance &instance = + mesh_group->GetMeshInstance(i); + const auto mi_it = + mesh_index_to_gltf_mesh_primitive_.find(instance.mesh_index); + if (mi_it == mesh_index_to_gltf_mesh_primitive_.end()) { + // We have not added the mesh to the scene yet. + const Mesh &mesh = scene.GetMesh(instance.mesh_index); + if (!AddDracoMesh(mesh, instance.material_index, + instance.materials_variants_mappings, + base_mesh_transforms_[instance.mesh_index])) { + return Status(Status::DRACO_ERROR, "Adding a Draco mesh failed."); + } + const int gltf_mesh_index = meshes_.size() - 1; + const int gltf_primitive_index = meshes_.back().primitives.size() - 1; + mesh_index_to_gltf_mesh_primitive_[instance.mesh_index] = + std::make_pair(gltf_mesh_index, gltf_primitive_index); + } else { + // The mesh was already added to the scene. This is a copy instance + // that may have a different material. + const int gltf_mesh_index = mi_it->second.first; + const int gltf_primitive_index = mi_it->second.second; + GltfPrimitive primitive = + meshes_[gltf_mesh_index].primitives[gltf_primitive_index]; + primitive.material = instance.material_index; + primitive.material_variants_mappings = + instance.materials_variants_mappings; + const Mesh &mesh = scene.GetMesh(instance.mesh_index); + primitive.mesh_features.clear(); + primitive.mesh_features.reserve(mesh.NumMeshFeatures()); + for (MeshFeaturesIndex j(0); j < mesh.NumMeshFeatures(); ++j) { + primitive.mesh_features.push_back(&mesh.GetMeshFeatures(j)); + } + meshes_.back().primitives.push_back(primitive); + } + } + mesh_group_index_to_gltf_mesh_[mesh_group_index] = meshes_.size() - 1; + } + node.mesh_index = mesh_group_index_to_gltf_mesh_[mesh_group_index]; + } + node.skin_index = scene_node->GetSkinIndex().value(); + node.light_index = scene_node->GetLightIndex().value(); + node.instance_array_index = scene_node->GetInstanceArrayIndex().value(); + + nodes_.push_back(node); + return OkStatus(); +} + +bool GltfAsset::AddMaterials(const Scene &scene) { + if (scene.GetMaterialLibrary().NumMaterials() == 0) { + return true; + } + material_library_.Copy(scene.GetMaterialLibrary()); + return true; +} + +Status GltfAsset::AddAnimations(const Scene &scene) { + if (scene.NumAnimations() == 0) { + return OkStatus(); + } + // Mapping of the node animation data to the output accessors. The first part + // of the key is the animation index and the second part of the key is the + // node animation data index. + std::map, int> node_animation_data_to_accessor; + + // Mapping of the node animation data to the output accessors. + std::unordered_map + data_to_index_map; + + // First add all the accessors and create a mapping from animation accessors + // to accessors owned by the encoder. + for (AnimationIndex i(0); i < scene.NumAnimations(); ++i) { + const Animation *const animation = scene.GetAnimation(i); + + for (int j = 0; j < animation->NumNodeAnimationData(); ++j) { + const NodeAnimationData *const node_animation_data = + animation->GetNodeAnimationData(j); + + int index = -1; + + NodeAnimationDataHash nadh(node_animation_data); + if (data_to_index_map.find(nadh) == data_to_index_map.end()) { + // The current data is new, add it to the encoder. + DRACO_ASSIGN_OR_RETURN( + index, AddNodeAnimationData(*nadh.GetNodeAnimationData())); + data_to_index_map[nadh] = index; + } else { + index = data_to_index_map[nadh]; + } + + const auto key = std::make_pair(i.value(), j); + node_animation_data_to_accessor[key] = index; + } + } + + // Add all the samplers and channels. + for (AnimationIndex i(0); i < scene.NumAnimations(); ++i) { + const Animation *const animation = scene.GetAnimation(i); + std::unique_ptr new_animation(new EncoderAnimation); + new_animation->name = animation->GetName(); + + for (int j = 0; j < animation->NumSamplers(); ++j) { + const AnimationSampler *const sampler = animation->GetSampler(j); + const auto input_key = std::make_pair(i.value(), sampler->input_index); + const auto input_it = node_animation_data_to_accessor.find(input_key); + if (input_it == node_animation_data_to_accessor.end()) { + return Status(Status::DRACO_ERROR, + "Could not find animation accessor input index."); + } + const auto output_key = std::make_pair(i.value(), sampler->output_index); + const auto output_it = node_animation_data_to_accessor.find(output_key); + if (output_it == node_animation_data_to_accessor.end()) { + return Status(Status::DRACO_ERROR, + "Could not find animation accessor output index."); + } + + std::unique_ptr new_sampler(new AnimationSampler()); + new_sampler->input_index = input_it->second; + new_sampler->output_index = output_it->second; + + if (output_type_ == GltfEncoder::COMPACT) { + // Remove min/max from output accessor. + accessors_[new_sampler->output_index].min.clear(); + accessors_[new_sampler->output_index].max.clear(); + } + + new_sampler->interpolation_type = sampler->interpolation_type; + + new_animation->samplers.push_back(std::move(new_sampler)); + } + + for (int j = 0; j < animation->NumChannels(); ++j) { + const AnimationChannel *const channel = animation->GetChannel(j); + std::unique_ptr new_channel(new AnimationChannel()); + new_channel->Copy(*channel); + new_animation->channels.push_back(std::move(new_channel)); + } + + animations_.push_back(std::move(new_animation)); + } + return OkStatus(); +} + +StatusOr GltfAsset::AddNodeAnimationData( + const NodeAnimationData &node_animation_data) { + const size_t buffer_start_offset = buffer_.size(); + + const int component_size = node_animation_data.ComponentSize(); + const int num_components = node_animation_data.NumComponents(); + const std::vector *data = node_animation_data.GetData(); + + std::vector min_values; + min_values.resize(num_components); + for (int j = 0; j < num_components; ++j) { + min_values[j] = (*data)[j]; + } + std::vector max_values = min_values; + + for (int i = 0; i < node_animation_data.count(); ++i) { + for (int j = 0; j < num_components; ++j) { + const float value = (*data)[(i * num_components) + j]; + if (value < min_values[j]) { + min_values[j] = value; + } + if (value > max_values[j]) { + max_values[j] = value; + } + + buffer_.Encode(&value, component_size); + } + } + + if (!PadBuffer()) { + return Status(Status::DRACO_ERROR, + "AddNodeAnimationData: PadBuffer returned DRACO_ERROR."); + } + + GltfBufferView buffer_view; + buffer_view.buffer_byte_offset = buffer_start_offset; + buffer_view.byte_length = buffer_.size() - buffer_start_offset; + buffer_views_.push_back(buffer_view); + + GltfAccessor accessor; + accessor.buffer_view_index = static_cast(buffer_views_.size() - 1); + accessor.component_type = ComponentType::FLOAT; + accessor.count = node_animation_data.count(); + for (int j = 0; j < num_components; ++j) { + accessor.max.push_back(GltfValue(max_values[j])); + accessor.min.push_back(GltfValue(min_values[j])); + } + accessor.type = node_animation_data.TypeAsString(); + accessor.normalized = node_animation_data.normalized(); + accessors_.push_back(accessor); + return static_cast(accessors_.size() - 1); +} + +Status GltfAsset::AddSkins(const Scene &scene) { + if (scene.NumSkins() == 0) { + return OkStatus(); + } + + for (SkinIndex i(0); i < scene.NumSkins(); ++i) { + const Skin *const skin = scene.GetSkin(i); + DRACO_ASSIGN_OR_RETURN( + const int output_accessor_index, + AddNodeAnimationData(skin->GetInverseBindMatrices())); + + std::unique_ptr encoder_skin(new EncoderSkin); + encoder_skin->inverse_bind_matrices_index = output_accessor_index; + encoder_skin->joints.reserve(skin->NumJoints()); + for (int j = 0; j < skin->NumJoints(); j++) { + encoder_skin->joints.push_back(skin->GetJoint(j).value()); + } + encoder_skin->skeleton_index = skin->GetJointRoot().value(); + skins_.push_back(std::move(encoder_skin)); + } + return OkStatus(); +} + +Status GltfAsset::AddLights(const Scene &scene) { + if (scene.NumLights() == 0) { + return OkStatus(); + } + + for (LightIndex i(0); i < scene.NumLights(); ++i) { + std::unique_ptr light = std::unique_ptr(new Light()); + light->Copy(*scene.GetLight(i)); + lights_.push_back(std::move(light)); + } + return OkStatus(); +} + +Status GltfAsset::AddMaterialsVariantsNames(const Scene &scene) { + const MaterialLibrary &library = scene.GetMaterialLibrary(); + for (int i = 0; i < library.NumMaterialsVariants(); ++i) { + materials_variants_names_.push_back(library.GetMaterialsVariantName(i)); + } + return OkStatus(); +} + +Status GltfAsset::AddInstanceArrays(const Scene &scene) { + if (scene.NumInstanceArrays() == 0) { + return OkStatus(); + } + + // Add each of the instance arrays. + std::vector t_data; + std::vector r_data; + std::vector s_data; + for (InstanceArrayIndex i(0); i < scene.NumInstanceArrays(); ++i) { + // Find which of the optional TRS components are set. + // TODO(vytyaz): Treat default TRS component vectors as absent. + const InstanceArray &array = *scene.GetInstanceArray(i); + bool is_t_set = false; + bool is_r_set = false; + bool is_s_set = false; + for (int i = 0; i < array.NumInstances(); i++) { + const InstanceArray::Instance &instance = array.GetInstance(i); + if (instance.trs.TranslationSet()) { + is_t_set = true; + } + if (instance.trs.RotationSet()) { + is_r_set = true; + } + if (instance.trs.ScaleSet()) { + is_s_set = true; + } + } + + // Create contiguous data vectors for individual TRS components. + t_data.clear(); + r_data.clear(); + s_data.clear(); + if (is_t_set) { + t_data.reserve(array.NumInstances() * 3); + } + if (is_r_set) { + r_data.reserve(array.NumInstances() * 4); + } + if (is_s_set) { + s_data.reserve(array.NumInstances() * 3); + } + + // Add TRS vectors of each instance to corresponding data vectors. + for (int i = 0; i < array.NumInstances(); i++) { + const InstanceArray::Instance &instance = array.GetInstance(i); + if (is_t_set) { + DRACO_ASSIGN_OR_RETURN(const auto &t_vector, + instance.trs.Translation()); + t_data.push_back(t_vector.x()); + t_data.push_back(t_vector.y()); + t_data.push_back(t_vector.z()); + } + if (is_r_set) { + DRACO_ASSIGN_OR_RETURN(const auto &r_vector, instance.trs.Rotation()); + r_data.push_back(r_vector.x()); + r_data.push_back(r_vector.y()); + r_data.push_back(r_vector.z()); + r_data.push_back(r_vector.w()); + } + if (is_s_set) { + DRACO_ASSIGN_OR_RETURN(const auto &s_vector, instance.trs.Scale()); + s_data.push_back(s_vector.x()); + s_data.push_back(s_vector.y()); + s_data.push_back(s_vector.z()); + } + } + + // Add TRS vectors to attribute buffers and collect their accessor indices. + EncoderInstanceArray accessors; + if (is_t_set) { + DRACO_ASSIGN_OR_RETURN(accessors.translation, AddData(t_data, 3)); + } + if (is_r_set) { + DRACO_ASSIGN_OR_RETURN(accessors.rotation, AddData(r_data, 4)); + } + if (is_s_set) { + DRACO_ASSIGN_OR_RETURN(accessors.scale, AddData(s_data, 3)); + } + + // Store accessors for later to encode as EXT_mesh_gpu_instancing extension. + instance_arrays_.push_back(accessors); + } + return OkStatus(); +} + +template +void GltfAsset::AddStructuralMetadata(const GeometryT &geometry) { + const StructuralMetadata &structural_metadata = + geometry.GetStructuralMetadata(); + if (!structural_metadata.GetPropertyTableSchema().Empty()) { + property_table_schema_ = structural_metadata.GetPropertyTableSchema(); + for (int i = 0; i < structural_metadata.NumPropertyTables(); ++i) { + property_tables_.push_back(&structural_metadata.GetPropertyTable(i)); + } + } +} + +StatusOr GltfAsset::AddData(const std::vector &data, + int num_components) { + std::string type; + switch (num_components) { + case 3: + type = "VEC3"; + break; + case 4: + type = "VEC4"; + break; + default: + return ErrorStatus("Unsupported number of components."); + } + + const size_t buffer_start_offset = buffer_.size(); + + std::vector min_values(num_components); + for (int j = 0; j < num_components; ++j) { + min_values[j] = data[j]; + } + std::vector max_values = min_values; + + const int count = data.size() / num_components; + for (int i = 0; i < count; ++i) { + for (int j = 0; j < num_components; ++j) { + const float value = data[(i * num_components) + j]; + if (value < min_values[j]) { + min_values[j] = value; + } + if (value > max_values[j]) { + max_values[j] = value; + } + buffer_.Encode(&value, sizeof(float)); + } + } + + if (!PadBuffer()) { + return ErrorStatus("AddArray: PadBuffer returned DRACO_ERROR."); + } + + GltfBufferView buffer_view; + buffer_view.buffer_byte_offset = buffer_start_offset; + buffer_view.byte_length = buffer_.size() - buffer_start_offset; + buffer_views_.push_back(buffer_view); + + GltfAccessor accessor; + accessor.buffer_view_index = static_cast(buffer_views_.size() - 1); + accessor.component_type = ComponentType::FLOAT; + accessor.count = count; + for (int j = 0; j < num_components; ++j) { + accessor.max.push_back(GltfValue(max_values[j])); + accessor.min.push_back(GltfValue(min_values[j])); + } + accessor.type = type; + accessor.normalized = false; + accessors_.push_back(accessor); + return static_cast(accessors_.size() - 1); +} + +StatusOr GltfAsset::AddBufferView( + const PropertyTable::Property::Data &data) { + const size_t buffer_start_offset = buffer_.size(); + buffer_.Encode(data.data.data(), data.data.size()); + if (!PadBuffer()) { + return ErrorStatus("AddBufferView: PadBuffer returned DRACO_ERROR."); + } + GltfBufferView buffer_view; + buffer_view.buffer_byte_offset = buffer_start_offset; + buffer_view.byte_length = buffer_.size() - buffer_start_offset; + buffer_view.target = data.target; + buffer_views_.push_back(buffer_view); + return static_cast(buffer_views_.size() - 1); +} + +bool GltfAsset::EncodeAssetProperty(EncoderBuffer *buf_out) { + gltf_json_.BeginObject("asset"); + gltf_json_.OutputValue("version", version_); + gltf_json_.OutputValue("generator", generator_); + gltf_json_.EndObject(); + + const std::string asset_str = gltf_json_.MoveData(); + return buf_out->Encode(asset_str.data(), asset_str.length()); +} + +bool GltfAsset::EncodeScenesProperty(EncoderBuffer *buf_out) { + // We currently only support one scene. + gltf_json_.BeginArray("scenes"); + gltf_json_.BeginObject(); + gltf_json_.BeginArray("nodes"); + + for (int i = 0; i < nodes_.size(); ++i) { + if (nodes_[i].root_node) { + gltf_json_.OutputValue(i); + } + } + gltf_json_.EndArray(); + gltf_json_.EndObject(); + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + return buf_out->Encode(asset_str.data(), asset_str.length()); +} + +bool GltfAsset::EncodeInitialSceneProperty(EncoderBuffer *buf_out) { + gltf_json_.OutputValue("scene", scene_index_); + const std::string asset_str = gltf_json_.MoveData(); + return buf_out->Encode(asset_str.data(), asset_str.length()); +} + +bool GltfAsset::EncodeNodesProperty(EncoderBuffer *buf_out) { + gltf_json_.BeginArray("nodes"); + + for (int i = 0; i < nodes_.size(); ++i) { + gltf_json_.BeginObject(); + if (!nodes_[i].name.empty()) { + gltf_json_.OutputValue("name", nodes_[i].name); + } + if (nodes_[i].mesh_index >= 0) { + gltf_json_.OutputValue("mesh", nodes_[i].mesh_index); + } + if (nodes_[i].skin_index >= 0) { + gltf_json_.OutputValue("skin", nodes_[i].skin_index); + } + if (nodes_[i].instance_array_index >= 0 || nodes_[i].light_index >= 0) { + gltf_json_.BeginObject("extensions"); + if (nodes_[i].instance_array_index >= 0) { + gltf_json_.BeginObject("EXT_mesh_gpu_instancing"); + gltf_json_.BeginObject("attributes"); + const int index = nodes_[i].instance_array_index; + const EncoderInstanceArray &accessors = instance_arrays_[index]; + if (accessors.translation != -1) { + gltf_json_.OutputValue("TRANSLATION", accessors.translation); + } + if (accessors.rotation != -1) { + gltf_json_.OutputValue("ROTATION", accessors.rotation); + } + if (accessors.scale != -1) { + gltf_json_.OutputValue("SCALE", accessors.scale); + } + gltf_json_.EndObject(); + gltf_json_.EndObject(); + } + if (nodes_[i].light_index >= 0) { + gltf_json_.BeginObject("KHR_lights_punctual"); + gltf_json_.OutputValue("light", nodes_[i].light_index); + gltf_json_.EndObject(); + } + gltf_json_.EndObject(); + } + + if (!nodes_[i].childern_indices.empty()) { + gltf_json_.BeginArray("children"); + for (int j = 0; j < nodes_[i].childern_indices.size(); ++j) { + gltf_json_.OutputValue(nodes_[i].childern_indices[j]); + } + gltf_json_.EndArray(); + } + + if (!nodes_[i].trs_matrix.IsMatrixIdentity()) { + const auto maybe_transformation = nodes_[i].trs_matrix.Matrix(); + const auto transformation = maybe_transformation.ValueOrDie(); + + if (nodes_[i].trs_matrix.IsMatrixTranslationOnly()) { + gltf_json_.BeginArray("translation"); + for (int j = 0; j < 3; ++j) { + gltf_json_.OutputValue(transformation(j, 3)); + } + gltf_json_.EndArray(); + } else { + gltf_json_.BeginArray("matrix"); + for (int j = 0; j < 4; ++j) { + for (int k = 0; k < 4; ++k) { + gltf_json_.OutputValue(transformation(k, j)); + } + } + gltf_json_.EndArray(); + } + } else { + if (nodes_[i].trs_matrix.TranslationSet()) { + const auto maybe_translation = nodes_[i].trs_matrix.Translation(); + const auto translation = maybe_translation.ValueOrDie(); + gltf_json_.BeginArray("translation"); + for (int j = 0; j < 3; ++j) { + gltf_json_.OutputValue(translation[j]); + } + gltf_json_.EndArray(); + } + if (nodes_[i].trs_matrix.RotationSet()) { + const auto maybe_rotation = nodes_[i].trs_matrix.Rotation(); + const auto rotation = maybe_rotation.ValueOrDie(); + gltf_json_.BeginArray("rotation"); + for (int j = 0; j < 4; ++j) { + // Note: coeffs() returns quaternion values as (x, y, z, w) which is + // the expected format of glTF. + gltf_json_.OutputValue(rotation.coeffs()[j]); + } + gltf_json_.EndArray(); + } + if (nodes_[i].trs_matrix.ScaleSet()) { + const auto maybe_scale = nodes_[i].trs_matrix.Scale(); + const auto scale = maybe_scale.ValueOrDie(); + gltf_json_.BeginArray("scale"); + for (int j = 0; j < 3; ++j) { + gltf_json_.OutputValue(scale[j]); + } + gltf_json_.EndArray(); + } + } + + gltf_json_.EndObject(); + } + + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + return buf_out->Encode(asset_str.data(), asset_str.length()); +} + +Status GltfAsset::EncodeMeshesProperty(EncoderBuffer *buf_out) { + mesh_features_texture_index_ = 0; + gltf_json_.BeginArray("meshes"); + + for (int i = 0; i < meshes_.size(); ++i) { + gltf_json_.BeginObject(); + + if (!meshes_[i].name.empty()) { + gltf_json_.OutputValue("name", meshes_[i].name); + } + + if (!meshes_[i].primitives.empty()) { + gltf_json_.BeginArray("primitives"); + + for (int j = 0; j < meshes_[i].primitives.size(); ++j) { + const GltfPrimitive &primitive = meshes_[i].primitives[j]; + gltf_json_.BeginObject(); + + gltf_json_.BeginObject("attributes"); + for (auto const &it : primitive.attributes) { + gltf_json_.OutputValue(it.first, it.second); + } + gltf_json_.EndObject(); + + if (primitive.indices >= 0) { + gltf_json_.OutputValue("indices", primitive.indices); + } + gltf_json_.OutputValue("mode", primitive.mode); + if (primitive.material >= 0) { + gltf_json_.OutputValue("material", primitive.material); + } + DRACO_RETURN_IF_ERROR( + EncodePrimitiveExtensionsProperty(primitive, buf_out)); + gltf_json_.EndObject(); + } + + gltf_json_.EndArray(); + } + + gltf_json_.EndObject(); + } + + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + if (!buf_out->Encode(asset_str.data(), asset_str.length())) { + return ErrorStatus("Failed encoding meshes."); + } + return OkStatus(); +} + +Status GltfAsset::EncodePrimitiveExtensionsProperty( + const GltfPrimitive &primitive, EncoderBuffer *buf_out) { + // Return if the primitive has no extensions to encode. + const bool has_draco_mesh_compression = + primitive.compressed_mesh_info.buffer_view_index >= 0; + const bool has_materials_variants = + !primitive.material_variants_mappings.empty(); + const bool has_mesh_features = !primitive.mesh_features.empty(); + if (!has_draco_mesh_compression && !has_materials_variants && + !has_mesh_features) { + return OkStatus(); + } + + // Encode primitive extensions. + gltf_json_.BeginObject("extensions"); + if (has_draco_mesh_compression) { + gltf_json_.BeginObject("KHR_draco_mesh_compression"); + gltf_json_.OutputValue("bufferView", + primitive.compressed_mesh_info.buffer_view_index); + gltf_json_.BeginObject("attributes"); + for (auto const &it : primitive.compressed_mesh_info.attributes) { + gltf_json_.OutputValue(it.first, it.second); + } + gltf_json_.EndObject(); // attributes entry. + gltf_json_.EndObject(); // KHR_draco_mesh_compression entry. + } + if (has_materials_variants) { + gltf_json_.BeginObject("KHR_materials_variants"); + gltf_json_.BeginArray("mappings"); + for (const auto &mapping : primitive.material_variants_mappings) { + gltf_json_.BeginObject(); + gltf_json_.OutputValue("material", mapping.material); + gltf_json_.BeginArray("variants"); + for (const int variant : mapping.variants) { + gltf_json_.OutputValue(variant); + } + gltf_json_.EndArray(); // variants array. + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); // mappings array. + gltf_json_.EndObject(); // KHR_materials_variants entry. + } + if (has_mesh_features) { + gltf_json_.BeginObject("EXT_mesh_features"); + gltf_json_.BeginArray("featureIds"); + for (int i = 0; i < primitive.mesh_features.size(); i++) { + const auto &features = primitive.mesh_features[i]; + gltf_json_.BeginObject(); + if (!features->GetLabel().empty()) { + gltf_json_.OutputValue("label", features->GetLabel()); + } + gltf_json_.OutputValue("featureCount", features->GetFeatureCount()); + if (features->GetAttributeIndex() != -1) { + gltf_json_.OutputValue("attribute", features->GetAttributeIndex()); + } + if (features->GetPropertyTableIndex() != -1) { + gltf_json_.OutputValue("propertyTable", + features->GetPropertyTableIndex()); + } + if (features->GetTextureMap().tex_coord_index() != -1) { + const TextureMap &texture_map = features->GetTextureMap(); + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *texture_map.texture(), mesh_features_texture_index_++, + "_MeshFeatures"); + + // Save image as RGBA if the A channel is used to store feature ID. + const auto &channels = features->GetTextureChannels(); + const int num_channels = + std::count(channels.begin(), channels.end(), 3) == 1 ? 4 : 3; + DRACO_ASSIGN_OR_RETURN( + const int image_index, + AddImage(texture_stem, texture_map.texture(), num_channels)); + const int tex_coord_index = texture_map.tex_coord_index(); + Material dummy_material; + DRACO_RETURN_IF_ERROR(EncodeTextureMap("texture", image_index, + tex_coord_index, dummy_material, + texture_map, channels)); + } + if (features->GetNullFeatureId() != -1) { + gltf_json_.OutputValue("nullFeatureId", features->GetNullFeatureId()); + } + gltf_json_.EndObject(); + mesh_features_used_ = true; + } + gltf_json_.EndArray(); // featureIds array. + gltf_json_.EndObject(); // EXT_mesh_features entry. + } + gltf_json_.EndObject(); // extensions entry. + return OkStatus(); +} + +Status GltfAsset::EncodeMaterials(EncoderBuffer *buf_out) { + // Check if we have textures to write. + if (material_library_.NumMaterials() == 0) { + return EncodeDefaultMaterial(buf_out); + } + return EncodeMaterialsProperty(buf_out); +} + +void GltfAsset::EncodeColorMaterial(float red, float green, float blue, + float alpha, float metallic_factor) { + gltf_json_.BeginObject("pbrMetallicRoughness"); + + gltf_json_.BeginArray("baseColorFactor"); + gltf_json_.OutputValue(red); + gltf_json_.OutputValue(green); + gltf_json_.OutputValue(blue); + gltf_json_.OutputValue(alpha); + gltf_json_.EndArray(); + gltf_json_.OutputValue("metallicFactor", metallic_factor); + + gltf_json_.EndObject(); // pbrMetallicRoughness +} + +Status GltfAsset::EncodeDefaultMaterial(EncoderBuffer *buf_out) { + gltf_json_.BeginArray("materials"); + gltf_json_.BeginObject(); + EncodeColorMaterial(0.75, 0.75, 0.75, 1.0, 0.0); + gltf_json_.EndObject(); + gltf_json_.EndArray(); // materials + + const std::string asset_str = gltf_json_.MoveData(); + if (!buf_out->Encode(asset_str.data(), asset_str.length())) { + return Status(Status::DRACO_ERROR, "Error encoding default material."); + } + return OkStatus(); +} + +Status GltfAsset::EncodeTextureMap(const std::string &object_name, + int image_index, int tex_coord_index, + const Material &material, + const TextureMap &texture_map) { + return EncodeTextureMap(object_name, image_index, tex_coord_index, material, + texture_map, {}); +} + +Status GltfAsset::EncodeTextureMap(const std::string &object_name, + int image_index, int tex_coord_index, + const Material &material, + const TextureMap &texture_map, + const std::vector &channels) { + // Create a new texture sampler (or reuse an existing one if possible). + const TextureSampler sampler(texture_map.min_filter(), + texture_map.mag_filter(), + texture_map.wrapping_mode()); + DRACO_ASSIGN_OR_RETURN(const int sampler_index, AddTextureSampler(sampler)); + + // Check if we can reuse an existing texture object. + const GltfTexture texture(image_index, sampler_index); + const auto texture_it = + std::find(textures_.begin(), textures_.end(), texture); + int texture_index; + if (texture_it == textures_.end()) { + // Create a new texture object for this texture map. + texture_index = textures_.size(); + textures_.push_back(GltfTexture(image_index, sampler_index)); + } else { + // Reuse an existing texture object. + texture_index = std::distance(textures_.begin(), texture_it); + } + + gltf_json_.BeginObject(object_name); + gltf_json_.OutputValue("index", texture_index); + gltf_json_.OutputValue("texCoord", tex_coord_index); + if (object_name == "normalTexture") { + const float scale = material.GetNormalTextureScale(); + if (scale != 1.0f) { + gltf_json_.OutputValue("scale", scale); + } + } + + // The "texture" object of the EXT_mesh_features extension has a custom + // property "channels" that is encoded here. + if (object_name == "texture" && !channels.empty()) { + gltf_json_.BeginArray("channels"); + for (const int channel : channels) { + gltf_json_.OutputValue(channel); + } + gltf_json_.EndArray(); // channels array. + } + + // Check if |texture_map| is using the KHR_texture_transform extension. + if (!TextureTransform::IsDefault(texture_map.texture_transform())) { + gltf_json_.BeginObject("extensions"); + gltf_json_.BeginObject("KHR_texture_transform"); + if (texture_map.texture_transform().IsOffsetSet()) { + const std::array &offset = + texture_map.texture_transform().offset(); + gltf_json_.BeginArray("offset"); + gltf_json_.OutputValue(offset[0]); + gltf_json_.OutputValue(offset[1]); + gltf_json_.EndArray(); + } + if (texture_map.texture_transform().IsRotationSet()) { + gltf_json_.OutputValue("rotation", + texture_map.texture_transform().rotation()); + } + if (texture_map.texture_transform().IsScaleSet()) { + const std::array &scale = + texture_map.texture_transform().scale(); + gltf_json_.BeginArray("scale"); + gltf_json_.OutputValue(scale[0]); + gltf_json_.OutputValue(scale[1]); + gltf_json_.EndArray(); + } + // TODO(fgalligan): The spec says the extension is not required if the + // pre-transform and the post-transform tex coords are the same. But I'm not + // sure why. I have filed a bug asking for clarification. + // https://github.com/KhronosGroup/glTF/issues/1724 + if (texture_map.texture_transform().IsTexCoordSet()) { + gltf_json_.OutputValue("texCoord", + texture_map.texture_transform().tex_coord()); + } else { + extensions_required_.insert("KHR_texture_transform"); + } + gltf_json_.EndObject(); + gltf_json_.EndObject(); + + extensions_used_.insert("KHR_texture_transform"); + } + gltf_json_.EndObject(); + return OkStatus(); +} + +Status GltfAsset::EncodeMaterialsProperty(EncoderBuffer *buf_out) { + gltf_json_.BeginArray("materials"); + for (int i = 0; i < material_library_.NumMaterials(); ++i) { + const Material *const material = material_library_.GetMaterial(i); + if (!material) { + return Status(Status::DRACO_ERROR, "Error getting material."); + } + + const TextureMap *const color = + material->GetTextureMapByType(TextureMap::COLOR); + const TextureMap *const metallic = + material->GetTextureMapByType(TextureMap::METALLIC_ROUGHNESS); + const TextureMap *const normal = + material->GetTextureMapByType(TextureMap::NORMAL_TANGENT_SPACE); + const TextureMap *const occlusion = + material->GetTextureMapByType(TextureMap::AMBIENT_OCCLUSION); + const TextureMap *const emissive = + material->GetTextureMapByType(TextureMap::EMISSIVE); + + // Check if material is unlit and does not have a fallback. + if (material->GetUnlit() && + (!color || metallic || normal || occlusion || emissive || + material->GetMetallicFactor() != 0.0 || + material->GetRoughnessFactor() <= 0.5 || + material->GetEmissiveFactor() != Vector3f(0.0, 0.0, 0.0))) { + // If we find one material that is unlit and does not contain a fallback + // we must set "KHR_materials_unlit" in extensions reqruied for the entire + // glTF file. + extensions_required_.insert("KHR_materials_unlit"); + } + + int occlusion_metallic_roughness_image_index = -1; + + gltf_json_.BeginObject(); // material object. + + gltf_json_.BeginObject("pbrMetallicRoughness"); + if (color) { + const bool rgba = true; // Unused for now. + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *color->texture(), i, "_BaseColor"); + DRACO_ASSIGN_OR_RETURN( + const int color_image_index, + AddImage(texture_stem, color->texture(), rgba ? 4 : 3)); + DRACO_RETURN_IF_ERROR( + EncodeTextureMap("baseColorTexture", color_image_index, + color->tex_coord_index(), *material, *color)); + } + // Try to combine metallic and occlusion only if they have the same tex + // coord index. + // TODO(b/145991271): Check out if we need to check texture indices. + if (metallic && occlusion && + metallic->tex_coord_index() == occlusion->tex_coord_index()) { + if (metallic->texture() == occlusion->texture()) { + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *metallic->texture(), i, "_OcclusionMetallicRoughness"); + // Metallic and occlusion textures are already combined. + DRACO_ASSIGN_OR_RETURN(occlusion_metallic_roughness_image_index, + AddImage(texture_stem, metallic->texture(), 3)); + } + if (occlusion_metallic_roughness_image_index != -1) + DRACO_RETURN_IF_ERROR(EncodeTextureMap( + "metallicRoughnessTexture", + occlusion_metallic_roughness_image_index, + metallic->tex_coord_index(), *material, *metallic)); + } + + if (metallic && occlusion_metallic_roughness_image_index == -1) { + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *metallic->texture(), i, "_MetallicRoughness"); + DRACO_ASSIGN_OR_RETURN(const int metallic_roughness_image_index, + AddImage(texture_stem, metallic->texture(), 3)); + DRACO_RETURN_IF_ERROR(EncodeTextureMap( + "metallicRoughnessTexture", metallic_roughness_image_index, + metallic->tex_coord_index(), *material, *metallic)); + } + + EncodeVectorArray("baseColorFactor", material->GetColorFactor()); + gltf_json_.OutputValue("metallicFactor", material->GetMetallicFactor()); + gltf_json_.OutputValue("roughnessFactor", material->GetRoughnessFactor()); + gltf_json_.EndObject(); // pbrMetallicRoughness + + if (normal) { + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *normal->texture(), i, "_Normal"); + DRACO_ASSIGN_OR_RETURN(const int normal_image_index, + AddImage(texture_stem, normal->texture(), 3)); + DRACO_RETURN_IF_ERROR( + EncodeTextureMap("normalTexture", normal_image_index, + normal->tex_coord_index(), *material, *normal)); + } + + if (occlusion_metallic_roughness_image_index != -1) { + DRACO_RETURN_IF_ERROR(EncodeTextureMap( + "occlusionTexture", occlusion_metallic_roughness_image_index, + metallic->tex_coord_index(), *material, *metallic)); + } else if (occlusion) { + // Store occlusion texture in a grayscale format, unless it is used by + // metallic-roughness map of some other matierial. It is possible that + // this material uses occlusion (R channel) and some other material uses + // metallic-roughness (GB channels) from this texture. + const int num_components = TextureUtils::ComputeRequiredNumChannels( + *occlusion->texture(), material_library_); + const std::string suffix = + (num_components == 1) ? "_Occlusion" : "_OcclusionMetallicRoughness"; + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *occlusion->texture(), i, suffix); + DRACO_ASSIGN_OR_RETURN( + const int occlusion_image_index, + AddImage(texture_stem, occlusion->texture(), num_components)); + DRACO_RETURN_IF_ERROR(EncodeTextureMap( + "occlusionTexture", occlusion_image_index, + occlusion->tex_coord_index(), *material, *occlusion)); + } + + if (emissive) { + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *emissive->texture(), i, "_Emissive"); + DRACO_ASSIGN_OR_RETURN(const int emissive_image_index, + AddImage(texture_stem, emissive->texture(), 3)); + DRACO_RETURN_IF_ERROR( + EncodeTextureMap("emissiveTexture", emissive_image_index, + emissive->tex_coord_index(), *material, *emissive)); + } + + EncodeVectorArray("emissiveFactor", + material->GetEmissiveFactor()); + + switch (material->GetTransparencyMode()) { + case Material::TransparencyMode::TRANSPARENCY_MASK: + gltf_json_.OutputValue("alphaMode", "MASK"); + gltf_json_.OutputValue("alphaCutoff", material->GetAlphaCutoff()); + break; + case Material::TransparencyMode::TRANSPARENCY_BLEND: + gltf_json_.OutputValue("alphaMode", "BLEND"); + break; + default: + gltf_json_.OutputValue("alphaMode", "OPAQUE"); + break; + } + if (!material->GetName().empty()) { + gltf_json_.OutputValue("name", material->GetName()); + } + + // Output doubleSided if different than the default. + if (material->GetDoubleSided()) { + gltf_json_.OutputValue("doubleSided", material->GetDoubleSided()); + } + + // Encode material extensions if any. + if (material->GetUnlit() || material->HasSheen() || + material->HasTransmission() || material->HasClearcoat() || + material->HasVolume() || material->HasIor() || + material->HasSpecular()) { + gltf_json_.BeginObject("extensions"); + + // Encode individual material extensions. + if (material->GetUnlit()) { + EncodeMaterialUnlitExtension(*material); + } else { + // PBR extensions can only be added to non-unlit materials. + Material defaults; + if (material->HasSheen()) { + DRACO_RETURN_IF_ERROR( + EncodeMaterialSheenExtension(*material, defaults, i)); + } + if (material->HasTransmission()) { + DRACO_RETURN_IF_ERROR( + EncodeMaterialTransmissionExtension(*material, defaults, i)); + } + if (material->HasClearcoat()) { + DRACO_RETURN_IF_ERROR( + EncodeMaterialClearcoatExtension(*material, defaults, i)); + } + if (material->HasVolume()) { + DRACO_RETURN_IF_ERROR( + EncodeMaterialVolumeExtension(*material, defaults, i)); + } + if (material->HasIor()) { + DRACO_RETURN_IF_ERROR( + EncodeMaterialIorExtension(*material, defaults)); + } + if (material->HasSpecular()) { + DRACO_RETURN_IF_ERROR( + EncodeMaterialSpecularExtension(*material, defaults, i)); + } + } + + gltf_json_.EndObject(); // extensions object. + } + + gltf_json_.EndObject(); // material object. + } + + gltf_json_.EndArray(); // materials array. + + if (!textures_.empty()) { + gltf_json_.BeginArray("textures"); + for (int i = 0; i < textures_.size(); ++i) { + const int image_index = textures_[i].image_index; + gltf_json_.BeginObject(); + if (images_[image_index].mime_type == "image/webp") { + gltf_json_.BeginObject("extensions"); + gltf_json_.BeginObject("EXT_texture_webp"); + gltf_json_.OutputValue("source", image_index); + gltf_json_.EndObject(); + gltf_json_.EndObject(); + } else if (images_[image_index].mime_type == "image/ktx2") { + gltf_json_.BeginObject("extensions"); + gltf_json_.BeginObject("KHR_texture_basisu"); + gltf_json_.OutputValue("source", image_index); + gltf_json_.EndObject(); + gltf_json_.EndObject(); + } else { + gltf_json_.OutputValue("source", image_index); + } + if (textures_[i].sampler_index >= 0) { + gltf_json_.OutputValue("sampler", textures_[i].sampler_index); + } + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); + } + + if (!texture_samplers_.empty()) { + gltf_json_.BeginArray("samplers"); + for (int i = 0; i < texture_samplers_.size(); ++i) { + gltf_json_.BeginObject(); + + const int mode_s = TextureAxisWrappingModeToGltfValue( + texture_samplers_[i].wrapping_mode.s); + const int mode_t = TextureAxisWrappingModeToGltfValue( + texture_samplers_[i].wrapping_mode.t); + gltf_json_.OutputValue("wrapS", mode_s); + gltf_json_.OutputValue("wrapT", mode_t); + + if (texture_samplers_[i].min_filter != TextureMap::UNSPECIFIED) { + gltf_json_.OutputValue( + "minFilter", + TextureFilterTypeToGltfValue(texture_samplers_[i].min_filter)); + } + if (texture_samplers_[i].mag_filter != TextureMap::UNSPECIFIED) { + gltf_json_.OutputValue( + "magFilter", + TextureFilterTypeToGltfValue(texture_samplers_[i].mag_filter)); + } + + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); + } + + if (!images_.empty()) { + gltf_json_.BeginArray("images"); + for (int i = 0; i < images_.size(); ++i) { + if (add_images_to_buffer_) { + DRACO_RETURN_IF_ERROR(SaveImageToBuffer(i)); + } + gltf_json_.BeginObject(); + if (images_[i].buffer_view >= 0) { + gltf_json_.OutputValue("bufferView", images_[i].buffer_view); + gltf_json_.OutputValue("mimeType", images_[i].mime_type); + } else { + gltf_json_.OutputValue("uri", images_[i].image_name); + } + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); + } + + const std::string asset_str = gltf_json_.MoveData(); + if (!buf_out->Encode(asset_str.data(), asset_str.length())) { + return Status(Status::DRACO_ERROR, "Error encoding materials."); + } + return OkStatus(); +} + +void GltfAsset::EncodeMaterialUnlitExtension(const Material &material) { + extensions_used_.insert("KHR_materials_unlit"); + gltf_json_.BeginObject("KHR_materials_unlit"); + gltf_json_.EndObject(); +} + +Status GltfAsset::EncodeMaterialSheenExtension(const Material &material, + const Material &defaults, + int material_index) { + extensions_used_.insert("KHR_materials_sheen"); + gltf_json_.BeginObject("KHR_materials_sheen"); + + // Add sheen color factor, unless it is the default. + if (material.GetSheenColorFactor() != defaults.GetSheenColorFactor()) { + EncodeVectorArray("sheenColorFactor", + material.GetSheenColorFactor()); + } + + // Add sheen roughness factor, unless it is the default. + if (material.GetSheenRoughnessFactor() != + defaults.GetSheenRoughnessFactor()) { + gltf_json_.OutputValue("sheenRoughnessFactor", + material.GetSheenRoughnessFactor()); + } + + // Add sheen color texture (RGB channels) if present. + // TODO(vytyaz): Combine sheen color and roughness images if possible. + DRACO_RETURN_IF_ERROR(EncodeTexture("sheenColorTexture", "_SheenColor", + TextureMap::SHEEN_COLOR, -1, material, + material_index)); + + // Add sheen roughness texture (A channel) if present. + DRACO_RETURN_IF_ERROR( + EncodeTexture("sheenRoughnessTexture", "_SheenRoughness", + TextureMap::SHEEN_ROUGHNESS, 4, material, material_index)); + + gltf_json_.EndObject(); // KHR_materials_sheen object. + + return OkStatus(); +} + +Status GltfAsset::EncodeMaterialTransmissionExtension(const Material &material, + const Material &defaults, + int material_index) { + extensions_used_.insert("KHR_materials_transmission"); + gltf_json_.BeginObject("KHR_materials_transmission"); + + // Add transmission factor, unless it is the default. + if (material.GetTransmissionFactor() != defaults.GetTransmissionFactor()) { + gltf_json_.OutputValue("transmissionFactor", + material.GetTransmissionFactor()); + } + + // Add transmission texture (R channel) if present. + // TODO(vytyaz): Store texture in a grayscale format if possible. + DRACO_RETURN_IF_ERROR(EncodeTexture("transmissionTexture", "_Transmission", + TextureMap::TRANSMISSION, 3, material, + material_index)); + + gltf_json_.EndObject(); // KHR_materials_transmission object. + + return OkStatus(); +} + +Status GltfAsset::EncodeMaterialClearcoatExtension(const Material &material, + const Material &defaults, + int material_index) { + extensions_used_.insert("KHR_materials_clearcoat"); + gltf_json_.BeginObject("KHR_materials_clearcoat"); + + // Add clearcoat factor, unless it is the default. + if (material.GetClearcoatFactor() != defaults.GetClearcoatFactor()) { + gltf_json_.OutputValue("clearcoatFactor", material.GetClearcoatFactor()); + } + + // Add clearcoat roughness factor, unless it is the default. + if (material.GetClearcoatRoughnessFactor() != + defaults.GetClearcoatRoughnessFactor()) { + gltf_json_.OutputValue("clearcoatRoughnessFactor", + material.GetClearcoatRoughnessFactor()); + } + + // Add clearcoat texture (R channel) if present. + // TODO(vytyaz): Combine clearcoat and clearcoat roughness images if possible. + // TODO(vytyaz): Store texture in a grayscale format if possible. + DRACO_RETURN_IF_ERROR(EncodeTexture("clearcoatTexture", "_Clearcoat", + TextureMap::CLEARCOAT, 3, material, + material_index)); + + // Add clearcoat roughness texture (G channel) if present. + DRACO_RETURN_IF_ERROR(EncodeTexture( + "clearcoatRoughnessTexture", "_ClearcoatRoughness", + TextureMap::CLEARCOAT_ROUGHNESS, 3, material, material_index)); + + // Add clearcoat normal texture (RGB channels) if present. + DRACO_RETURN_IF_ERROR( + EncodeTexture("clearcoatNormalTexture", "_ClearcoatNormal", + TextureMap::CLEARCOAT_NORMAL, 3, material, material_index)); + + gltf_json_.EndObject(); // KHR_materials_clearcoat object. + + return OkStatus(); +} + +Status GltfAsset::EncodeMaterialVolumeExtension(const Material &material, + const Material &defaults, + int material_index) { + extensions_used_.insert("KHR_materials_volume"); + gltf_json_.BeginObject("KHR_materials_volume"); + + // Add thickness factor, unless it is the default. + if (material.GetThicknessFactor() != defaults.GetThicknessFactor()) { + gltf_json_.OutputValue("thicknessFactor", material.GetThicknessFactor()); + } + + // Add attenuation distance, unless it is the default. + if (material.GetAttenuationDistance() != defaults.GetAttenuationDistance()) { + gltf_json_.OutputValue("attenuationDistance", + material.GetAttenuationDistance()); + } + + // Add attenuation color, unless it is the default. + if (material.GetAttenuationColor() != defaults.GetAttenuationColor()) { + EncodeVectorArray("attenuationColor", + material.GetAttenuationColor()); + } + + // Add thickness texture (G channel) if present. + DRACO_RETURN_IF_ERROR(EncodeTexture("thicknessTexture", "_Thickness", + TextureMap::THICKNESS, 3, material, + material_index)); + + gltf_json_.EndObject(); // KHR_materials_volume object. + + return OkStatus(); +} + +Status GltfAsset::EncodeMaterialIorExtension(const Material &material, + const Material &defaults) { + extensions_used_.insert("KHR_materials_ior"); + gltf_json_.BeginObject("KHR_materials_ior"); + + // Add ior, unless it is the default. + if (material.GetIor() != defaults.GetIor()) { + gltf_json_.OutputValue("ior", material.GetIor()); + } + + gltf_json_.EndObject(); // KHR_materials_ior object. + + return OkStatus(); +} + +Status GltfAsset::EncodeMaterialSpecularExtension(const Material &material, + const Material &defaults, + int material_index) { + extensions_used_.insert("KHR_materials_specular"); + gltf_json_.BeginObject("KHR_materials_specular"); + + // Add specular factor, unless it is the default. + if (material.GetSpecularFactor() != defaults.GetSpecularFactor()) { + gltf_json_.OutputValue("specularFactor", material.GetSpecularFactor()); + } + + // Add specular color factor, unless it is the default. + if (material.GetSpecularColorFactor() != defaults.GetSpecularColorFactor()) { + EncodeVectorArray("specularColorFactor", + material.GetSpecularColorFactor()); + } + + // Add specular texture (A channel) if present. + // TODO(vytyaz): Combine specular and specular color images if possible. + DRACO_RETURN_IF_ERROR(EncodeTexture("specularTexture", "_Specular", + TextureMap::SPECULAR, 4, material, + material_index)); + + // Add specular color texture (RGB channels) if present. + DRACO_RETURN_IF_ERROR(EncodeTexture("specularColorTexture", "_SpecularColor", + TextureMap::SPECULAR_COLOR, -1, material, + material_index)); + + gltf_json_.EndObject(); // KHR_materials_specular object. + + return OkStatus(); +} + +Status GltfAsset::EncodeTexture(const std::string &name, + const std::string &stem_suffix, + TextureMap::Type type, int num_components, + const Material &material, int material_index) { + const TextureMap *const texture_map = material.GetTextureMapByType(type); + if (texture_map) { + if (num_components == -1) { + const bool rgba = true; // Unused for now. + num_components = rgba ? 4 : 3; + } + const std::string texture_stem = TextureUtils::GetOrGenerateTargetStem( + *texture_map->texture(), material_index, stem_suffix); + DRACO_ASSIGN_OR_RETURN( + const int image_index, + AddImage(texture_stem, texture_map->texture(), num_components)); + DRACO_RETURN_IF_ERROR(EncodeTextureMap(name, image_index, + texture_map->tex_coord_index(), + material, *texture_map)); + } + return OkStatus(); +} + +Status GltfAsset::EncodeAnimationsProperty(EncoderBuffer *buf_out) { + if (animations_.empty()) { + return OkStatus(); + } + + gltf_json_.BeginArray("animations"); + for (int i = 0; i < animations_.size(); ++i) { + gltf_json_.BeginObject(); + + if (!animations_[i]->name.empty()) { + gltf_json_.OutputValue("name", animations_[i]->name); + } + + gltf_json_.BeginArray("samplers"); + for (int j = 0; j < animations_[i]->samplers.size(); ++j) { + gltf_json_.BeginObject(); + gltf_json_.OutputValue("input", animations_[i]->samplers[j]->input_index); + gltf_json_.OutputValue( + "interpolation", + AnimationSampler::InterpolationToString( + animations_[i]->samplers[j]->interpolation_type)); + gltf_json_.OutputValue("output", + animations_[i]->samplers[j]->output_index); + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); + + gltf_json_.BeginArray("channels"); + for (int j = 0; j < animations_[i]->channels.size(); ++j) { + gltf_json_.BeginObject(); + gltf_json_.OutputValue("sampler", + animations_[i]->channels[j]->sampler_index); + + gltf_json_.BeginObject("target"); + gltf_json_.OutputValue("node", animations_[i]->channels[j]->target_index); + gltf_json_.OutputValue( + "path", AnimationChannel::TransformationToString( + animations_[i]->channels[j]->transformation_type)); + gltf_json_.EndObject(); + + gltf_json_.EndObject(); // Channel entry. + } + gltf_json_.EndArray(); + + gltf_json_.EndObject(); // Animmation entry. + } + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + if (!buf_out->Encode(asset_str.data(), asset_str.length())) { + return Status(Status::DRACO_ERROR, "Could not encode animations."); + } + return OkStatus(); +} + +Status GltfAsset::EncodeSkinsProperty(EncoderBuffer *buf_out) { + if (skins_.empty()) { + return OkStatus(); + } + + gltf_json_.BeginArray("skins"); + for (int i = 0; i < skins_.size(); ++i) { + gltf_json_.BeginObject(); + + if (skins_[i]->inverse_bind_matrices_index >= 0) { + gltf_json_.OutputValue("inverseBindMatrices", + skins_[i]->inverse_bind_matrices_index); + } + if (skins_[i]->skeleton_index >= 0) { + gltf_json_.OutputValue("skeleton", skins_[i]->skeleton_index); + } + + if (!skins_[i]->joints.empty()) { + gltf_json_.BeginArray("joints"); + for (int j = 0; j < skins_[i]->joints.size(); ++j) { + gltf_json_.OutputValue(skins_[i]->joints[j]); + } + gltf_json_.EndArray(); + } + gltf_json_.EndObject(); // Skin entry. + } + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + if (!buf_out->Encode(asset_str.data(), asset_str.length())) { + return Status(Status::DRACO_ERROR, "Could not encode animations."); + } + return OkStatus(); +} + +Status GltfAsset::EncodeTopLevelExtensionsProperty(EncoderBuffer *buf_out) { + // Return if there are no top-level asset extensions to encode. + if (lights_.empty() && materials_variants_names_.empty() && + property_tables_.empty()) { + return OkStatus(); + } + + // Encode top-level extensions. + gltf_json_.BeginObject("extensions"); + DRACO_RETURN_IF_ERROR(EncodeLightsProperty(buf_out)); + DRACO_RETURN_IF_ERROR(EncodeMaterialsVariantsNamesProperty(buf_out)); + DRACO_RETURN_IF_ERROR(EncodeStructuralMetadataProperty(buf_out)); + gltf_json_.EndObject(); // extensions entry. + return OkStatus(); +} + +Status GltfAsset::EncodeLightsProperty(EncoderBuffer *buf_out) { + if (lights_.empty()) { + return OkStatus(); + } + + gltf_json_.BeginObject("KHR_lights_punctual"); + gltf_json_.BeginArray("lights"); + const Light defaults; + for (const auto &light : lights_) { + gltf_json_.BeginObject(); + if (light->GetName() != defaults.GetName()) { + gltf_json_.OutputValue("name", light->GetName()); + } + if (light->GetColor() != defaults.GetColor()) { + gltf_json_.BeginArray("color"); + gltf_json_.OutputValue(light->GetColor()[0]); + gltf_json_.OutputValue(light->GetColor()[1]); + gltf_json_.OutputValue(light->GetColor()[2]); + gltf_json_.EndArray(); + } + if (light->GetIntensity() != defaults.GetIntensity()) { + gltf_json_.OutputValue("intensity", light->GetIntensity()); + } + switch (light->GetType()) { + case Light::DIRECTIONAL: + gltf_json_.OutputValue("type", "directional"); + break; + case Light::POINT: + gltf_json_.OutputValue("type", "point"); + break; + case Light::SPOT: + gltf_json_.OutputValue("type", "spot"); + break; + } + if (light->GetRange() != defaults.GetRange()) { + gltf_json_.OutputValue("range", light->GetRange()); + } + if (light->GetType() == Light::SPOT) { + gltf_json_.BeginObject("spot"); + if (light->GetInnerConeAngle() != defaults.GetInnerConeAngle()) { + gltf_json_.OutputValue("innerConeAngle", light->GetInnerConeAngle()); + } + if (light->GetOuterConeAngle() != defaults.GetOuterConeAngle()) { + gltf_json_.OutputValue("outerConeAngle", light->GetOuterConeAngle()); + } + gltf_json_.EndObject(); + } + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); + gltf_json_.EndObject(); // KHR_lights_punctual entry. + return OkStatus(); +} + +Status GltfAsset::EncodeMaterialsVariantsNamesProperty(EncoderBuffer *buf_out) { + if (materials_variants_names_.empty()) { + return OkStatus(); + } + + gltf_json_.BeginObject("KHR_materials_variants"); + gltf_json_.BeginArray("variants"); + for (const std::string &name : materials_variants_names_) { + gltf_json_.BeginObject(); + gltf_json_.OutputValue("name", name); + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); + gltf_json_.EndObject(); // KHR_materials_variants entry. + return OkStatus(); +} + +Status GltfAsset::EncodeStructuralMetadataProperty(EncoderBuffer *buf_out) { + if (property_table_schema_.Empty()) { + return OkStatus(); + } + + gltf_json_.BeginObject("EXT_structural_metadata"); + + // Encodes property table schema. + struct SchemaWriter { + static void Write(const PropertyTable::Schema::Object &object, + JsonWriter *json_writer) { + switch (object.GetType()) { + case PropertyTable::Schema::Object::OBJECT: + json_writer->BeginObject(object.GetName()); + for (const PropertyTable::Schema::Object &obj : object.GetObjects()) { + Write(obj, json_writer); + } + json_writer->EndObject(); + break; + case PropertyTable::Schema::Object::ARRAY: + json_writer->BeginArray(object.GetName()); + for (const PropertyTable::Schema::Object &obj : object.GetArray()) { + Write(obj, json_writer); + } + json_writer->EndArray(); + break; + case PropertyTable::Schema::Object::STRING: + json_writer->OutputValue(object.GetName(), object.GetString()); + break; + case PropertyTable::Schema::Object::INTEGER: + json_writer->OutputValue(object.GetName(), object.GetInteger()); + break; + case PropertyTable::Schema::Object::BOOLEAN: + json_writer->OutputValue(object.GetName(), object.GetBoolean()); + break; + } + } + }; + + // Encode property table schema. + SchemaWriter::Write(property_table_schema_.json, &gltf_json_); + + // Encode all property tables. + gltf_json_.BeginArray("propertyTables"); + for (const PropertyTable *const table : property_tables_) { + gltf_json_.BeginObject(); + if (!table->GetName().empty()) { + gltf_json_.OutputValue("name", table->GetName()); + } + if (!table->GetClass().empty()) { + gltf_json_.OutputValue("class", table->GetClass()); + } + gltf_json_.OutputValue("count", table->GetCount()); + + // Encoder all property table properties. + gltf_json_.BeginObject("properties"); + for (int i = 0; i < table->NumProperties(); ++i) { + const PropertyTable::Property &property = table->GetProperty(i); + gltf_json_.BeginObject(property.GetName()); + + // Encode property values. + DRACO_ASSIGN_OR_RETURN(const int buffer_view_index, + AddBufferView(property.GetData())); + gltf_json_.OutputValue("values", buffer_view_index); + + // Encode offsets for variable-length arrays. + if (!property.GetArrayOffsets().data.data.empty()) { + if (!property.GetArrayOffsets().type.empty()) { + gltf_json_.OutputValue("arrayOffsetType", + property.GetArrayOffsets().type); + } + DRACO_ASSIGN_OR_RETURN(const int buffer_view_index, + AddBufferView(property.GetArrayOffsets().data)); + gltf_json_.OutputValue("arrayOffsets", buffer_view_index); + } + + // Encode offsets for strings. + if (!property.GetStringOffsets().data.data.empty()) { + if (!property.GetStringOffsets().type.empty()) { + gltf_json_.OutputValue("stringOffsetType", + property.GetStringOffsets().type); + } + DRACO_ASSIGN_OR_RETURN(const int buffer_view_index, + AddBufferView(property.GetStringOffsets().data)); + gltf_json_.OutputValue("stringOffsets", buffer_view_index); + } + gltf_json_.EndObject(); // Named property entry. + } + gltf_json_.EndObject(); // properties entry. + gltf_json_.EndObject(); + } + gltf_json_.EndArray(); // propertyTables entry. + gltf_json_.EndObject(); // EXT_structural_metadata entry. + return OkStatus(); +} + +bool GltfAsset::EncodeAccessorsProperty(EncoderBuffer *buf_out) { + gltf_json_.BeginArray("accessors"); + + for (int i = 0; i < accessors_.size(); ++i) { + gltf_json_.BeginObject(); + + if (accessors_[i].buffer_view_index >= 0) { + gltf_json_.OutputValue("bufferView", accessors_[i].buffer_view_index); + if (output_type_ == GltfEncoder::VERBOSE) { + gltf_json_.OutputValue("byteOffset", 0); + } + } + gltf_json_.OutputValue("componentType", accessors_[i].component_type); + gltf_json_.OutputValue("count", accessors_[i].count); + if (accessors_[i].normalized) { + gltf_json_.OutputValue("normalized", accessors_[i].normalized); + } + + if (!accessors_[i].max.empty()) { + gltf_json_.BeginArray("max"); + for (int j = 0; j < accessors_[i].max.size(); ++j) { + gltf_json_.OutputValue(accessors_[i].max[j]); + } + gltf_json_.EndArray(); + } + + if (!accessors_[i].min.empty()) { + gltf_json_.BeginArray("min"); + for (int j = 0; j < accessors_[i].min.size(); ++j) { + gltf_json_.OutputValue(accessors_[i].min[j]); + } + gltf_json_.EndArray(); + } + + gltf_json_.OutputValue("type", accessors_[i].type); + + gltf_json_.EndObject(); + } + + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + return buf_out->Encode(asset_str.data(), asset_str.length()); +} + +bool GltfAsset::EncodeBufferViewsProperty(EncoderBuffer *buf_out) { + // We currently only support one buffer. + gltf_json_.BeginArray("bufferViews"); + + for (int i = 0; i < buffer_views_.size(); ++i) { + gltf_json_.BeginObject(); + gltf_json_.OutputValue("buffer", 0); + gltf_json_.OutputValue("byteOffset", buffer_views_[i].buffer_byte_offset); + gltf_json_.OutputValue("byteLength", buffer_views_[i].byte_length); + if (buffer_views_[i].target != 0) { + gltf_json_.OutputValue("target", buffer_views_[i].target); + } + gltf_json_.EndObject(); + } + + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + return buf_out->Encode(asset_str.data(), asset_str.length()); +} + +bool GltfAsset::EncodeBuffersProperty(EncoderBuffer *buf_out) { + if (buffer_.size() == 0) { + return true; + } + // We currently only support one buffer. + gltf_json_.BeginArray("buffers"); + gltf_json_.BeginObject(); + gltf_json_.OutputValue("byteLength", buffer_.size()); + if (!buffer_name_.empty()) { + gltf_json_.OutputValue("uri", buffer_name_); + } + gltf_json_.EndObject(); + gltf_json_.EndArray(); + + const std::string asset_str = gltf_json_.MoveData(); + return buf_out->Encode(asset_str.data(), asset_str.length()); +} + +Status GltfAsset::EncodeExtensionsProperties(EncoderBuffer *buf_out) { + if (draco_compression_used_) { + const std::string draco_tag = "KHR_draco_mesh_compression"; + extensions_used_.insert(draco_tag); + extensions_required_.insert(draco_tag); + } + if (!lights_.empty()) { + extensions_used_.insert("KHR_lights_punctual"); + } + if (!materials_variants_names_.empty()) { + extensions_used_.insert("KHR_materials_variants"); + } + if (!instance_arrays_.empty()) { + extensions_used_.insert("EXT_mesh_gpu_instancing"); + extensions_required_.insert("EXT_mesh_gpu_instancing"); + } + if (mesh_features_used_) { + extensions_used_.insert("EXT_mesh_features"); + } + if (!property_table_schema_.Empty()) { + extensions_used_.insert("EXT_structural_metadata"); + } + + if (!extensions_required_.empty()) { + gltf_json_.BeginArray("extensionsRequired"); + for (const auto &extension : extensions_required_) { + gltf_json_.OutputValue(extension); + } + gltf_json_.EndArray(); + } + if (!extensions_used_.empty()) { + gltf_json_.BeginArray("extensionsUsed"); + for (const auto &extension : extensions_used_) { + gltf_json_.OutputValue(extension); + } + gltf_json_.EndArray(); + } + + const std::string asset_str = gltf_json_.MoveData(); + if (!asset_str.empty()) { + if (!buf_out->Encode(asset_str.data(), asset_str.length())) { + return Status(Status::DRACO_ERROR, "Could not encode extensions."); + } + } + return OkStatus(); +} + +template <> +GltfAsset::ComponentType GltfAsset::GetComponentType() const { + return BYTE; +} + +template <> +GltfAsset::ComponentType GltfAsset::GetComponentType() const { + return UNSIGNED_BYTE; +} + +template <> +GltfAsset::ComponentType GltfAsset::GetComponentType() const { + return SHORT; +} + +template <> +GltfAsset::ComponentType GltfAsset::GetComponentType() const { + return UNSIGNED_SHORT; +} + +template <> +GltfAsset::ComponentType GltfAsset::GetComponentType() const { + return UNSIGNED_INT; +} + +template <> +GltfAsset::ComponentType GltfAsset::GetComponentType() const { + return FLOAT; +} + +template +int GltfAsset::AddAttribute(const PointAttribute &att, int num_points, + int num_encoded_points, const std::string &type, + bool compress) { + if (att.size() == 0) { + return -1; // Attribute size must be greater than 0. + } + + std::array value; + std::array min_values; + std::array max_values; + + // Set min and max values. + if (!att.ConvertValue(AttributeValueIndex(0), + &min_values[0])) { + return -1; + } + max_values = min_values; + + if (output_type_ == GltfEncoder::VERBOSE || + att.attribute_type() == GeometryAttribute::POSITION) { + for (AttributeValueIndex i(1); i < static_cast(att.size()); ++i) { + if (!att.ConvertValue(i, &value[0])) { + return -1; + } + for (int j = 0; j < att_components_t; ++j) { + if (value[j] < min_values[j]) { + min_values[j] = value[j]; + } + if (value[j] > max_values[j]) { + max_values[j] = value[j]; + } + } + } + } + + const int kComponentSize = sizeof(att_data_t); + + GltfAccessor accessor; + if (!compress) { + const size_t buffer_start_offset = buffer_.size(); + for (PointIndex v(0); v < num_points; ++v) { + if (!att.ConvertValue(att.mapped_index(v), + &value[0])) { + return -1; + } + + for (int j = 0; j < att_components_t; ++j) { + buffer_.Encode(&value[j], kComponentSize); + } + } + + if (!PadBuffer()) { + return -1; + } + + GltfBufferView buffer_view; + buffer_view.buffer_byte_offset = buffer_start_offset; + buffer_view.byte_length = buffer_.size() - buffer_start_offset; + buffer_views_.push_back(buffer_view); + accessor.buffer_view_index = static_cast(buffer_views_.size() - 1); + } + + accessor.component_type = GetComponentType(); + accessor.count = num_encoded_points; + if (output_type_ == GltfEncoder::VERBOSE || + att.attribute_type() == GeometryAttribute::POSITION) { + for (int j = 0; j < att_components_t; ++j) { + accessor.max.push_back(GltfValue(max_values[j])); + accessor.min.push_back(GltfValue(min_values[j])); + } + } + accessor.type = type; + accessor.normalized = att.attribute_type() == GeometryAttribute::COLOR && + att.data_type() != DT_FLOAT32; + accessors_.push_back(accessor); + return static_cast(accessors_.size() - 1); +} + +const char GltfEncoder::kDracoMetadataGltfAttributeName[] = + "//GLTF/ApplicationSpecificAttributeName"; + +GltfEncoder::GltfEncoder() : out_buffer_(nullptr), output_type_(COMPACT) {} + +template +bool GltfEncoder::EncodeToFile(const T &geometry, const std::string &file_name, + const std::string &base_dir) { + const std::string buffer_name = base_dir + "/buffer0.bin"; + return EncodeFile(geometry, file_name, buffer_name, base_dir).ok(); +} + +template +Status GltfEncoder::EncodeFile(const T &geometry, const std::string &filename) { + if (filename.empty()) { + return Status(Status::DRACO_ERROR, "Output parameter is empty."); + } + + std::string dir_path; + std::string basename; + draco::SplitPath(filename, &dir_path, &basename); + const std::string bin_basename = ReplaceFileExtension(basename, "bin"); + const std::string bin_filename = dir_path + "/" + bin_basename; + return EncodeFile(geometry, filename, bin_filename, dir_path); +} + +template +Status GltfEncoder::EncodeFile(const T &geometry, const std::string &filename, + const std::string &bin_filename) { + if (filename.empty()) { + return Status(Status::DRACO_ERROR, "Output parameter is empty."); + } + + std::string dir_path; + std::string basename; + draco::SplitPath(filename, &dir_path, &basename); + return EncodeFile(geometry, filename, bin_filename, dir_path); +} + +template +Status GltfEncoder::EncodeFile(const T &geometry, const std::string &filename, + const std::string &bin_filename, + const std::string &resource_dir) { + if (filename.empty() || bin_filename.empty() || resource_dir.empty()) { + return Status(Status::DRACO_ERROR, "Output parameter is empty."); + } + const std::string extension = LowercaseFileExtension(filename); + if (extension != "gltf" && extension != "glb") { + return Status(Status::DRACO_ERROR, + "gltf_encoder only supports .gltf or .glb output."); + } + + GltfAsset gltf_asset; + gltf_asset.set_output_type(output_type_); + + if (extension == "gltf") { + std::string bin_path; + std::string bin_basename; + draco::SplitPath(bin_filename, &bin_path, &bin_basename); + gltf_asset.buffer_name(bin_basename); + } else { + gltf_asset.buffer_name(""); + gltf_asset.set_add_images_to_buffer(true); + } + + // Encode the geometry into a buffer. + EncoderBuffer buffer; + DRACO_RETURN_IF_ERROR(EncodeToBuffer(geometry, &gltf_asset, &buffer)); + if (extension == "glb") { + return WriteGlbFile(gltf_asset, buffer, filename); + } + return WriteGltfFiles(gltf_asset, buffer, filename, bin_filename, + resource_dir); +} + +template +Status GltfEncoder::EncodeToBuffer(const T &geometry, + EncoderBuffer *out_buffer) { + GltfAsset gltf_asset; + gltf_asset.set_output_type(output_type_); + gltf_asset.buffer_name(""); + gltf_asset.set_add_images_to_buffer(true); + + // Encode the geometry into a buffer. + EncoderBuffer buffer; + DRACO_RETURN_IF_ERROR(EncodeToBuffer(geometry, &gltf_asset, &buffer)); + + // Define a function for concatenating GLB file chunks into a single buffer. + const auto encode_chunk_to_buffer = + [&out_buffer](const EncoderBuffer &chunk) -> Status { + if (!out_buffer->Encode(chunk.data(), chunk.size())) { + return Status(Status::DRACO_ERROR, "Error writing to buffer."); + } + return OkStatus(); + }; + + // Create GLB file chunks and concatenate them to a single buffer. + return ProcessGlbFileChunks(gltf_asset, buffer, encode_chunk_to_buffer); +} + +// Explicit instantiation for Mesh and Scene. +template bool GltfEncoder::EncodeToFile(const Mesh &geometry, + const std::string &file_name, + const std::string &base_dir); +template bool GltfEncoder::EncodeToFile(const Scene &geometry, + const std::string &file_name, + const std::string &base_dir); +template Status GltfEncoder::EncodeFile(const Mesh &geometry, + const std::string &filename); +template Status GltfEncoder::EncodeFile(const Scene &geometry, + const std::string &filename); +template Status GltfEncoder::EncodeFile(const Mesh &geometry, + const std::string &filename, + const std::string &bin_filename); +template Status GltfEncoder::EncodeFile(const Scene &geometry, + const std::string &filename, + const std::string &bin_filename); +template Status GltfEncoder::EncodeFile(const Mesh &geometry, + const std::string &filename, + const std::string &bin_filename, + const std::string &resource_dir); +template Status GltfEncoder::EncodeFile(const Scene &geometry, + const std::string &filename, + const std::string &bin_filename, + const std::string &resource_dir); +template Status GltfEncoder::EncodeToBuffer(const Mesh &geometry, + EncoderBuffer *out_buffer); +template Status GltfEncoder::EncodeToBuffer(const Scene &geometry, + EncoderBuffer *out_buffer); + +Status GltfEncoder::EncodeToBuffer(const Mesh &mesh, GltfAsset *gltf_asset, + EncoderBuffer *out_buffer) { + out_buffer_ = out_buffer; + SetJsonWriterMode(gltf_asset); + if (!gltf_asset->AddDracoMesh(mesh)) { + return Status(Status::DRACO_ERROR, "Error adding Draco mesh."); + } + return gltf_asset->Output(out_buffer); +} + +Status GltfEncoder::EncodeToBuffer(const Scene &scene, GltfAsset *gltf_asset, + EncoderBuffer *out_buffer) { + out_buffer_ = out_buffer; + SetJsonWriterMode(gltf_asset); + DRACO_RETURN_IF_ERROR(gltf_asset->AddScene(scene)); + return gltf_asset->Output(out_buffer); +} + +void GltfEncoder::SetJsonWriterMode(class GltfAsset *gltf_asset) { + if (gltf_asset->output_type() == COMPACT && + gltf_asset->add_images_to_buffer()) { + gltf_asset->set_json_output_mode(JsonWriter::COMPACT); + } else { + gltf_asset->set_json_output_mode(JsonWriter::READABLE); + } +} + +Status GltfEncoder::WriteGltfFiles(const GltfAsset &gltf_asset, + const EncoderBuffer &buffer, + const std::string &filename, + const std::string &bin_filename, + const std::string &resource_dir) { + std::unique_ptr file = + FileWriterFactory::OpenWriter(filename); + if (!file) { + return Status(Status::DRACO_ERROR, "Output glTF file could not be opened."); + } + std::unique_ptr bin_file = + FileWriterFactory::OpenWriter(bin_filename); + if (!bin_file) { + return Status(Status::DRACO_ERROR, + "Output glTF bin file could not be opened."); + } + + // Write the glTF data into the file. + if (!file->Write(buffer.data(), buffer.size())) { + return Status(Status::DRACO_ERROR, "Error writing to glTF file."); + } + + // Write the glTF buffer into the file. + if (!bin_file->Write(gltf_asset.Buffer()->data(), + gltf_asset.Buffer()->size())) { + return Status(Status::DRACO_ERROR, "Error writing to glTF bin file."); + } + + for (int i = 0; i < gltf_asset.NumImages(); ++i) { + const std::string name = resource_dir + "/" + gltf_asset.image_name(i); + const GltfImage *const image = gltf_asset.GetImage(i); + if (!image) { + return Status(Status::DRACO_ERROR, "Error getting glTF image."); + } + DRACO_RETURN_IF_ERROR(WriteTextureToFile(name, *image->texture)); + } + return OkStatus(); +} + +Status GltfEncoder::WriteGlbFile(const GltfAsset &gltf_asset, + const EncoderBuffer &json_data, + const std::string &filename) { + std::unique_ptr file = + FileWriterFactory::OpenWriter(filename); + if (!file) { + return Status(Status::DRACO_ERROR, "Output glb file could not be opened."); + } + + // Define a function for writing GLB file chunks to |file|. + const auto write_chunk_to_file = + [&file](const EncoderBuffer &chunk) -> Status { + if (!file->Write(chunk.data(), chunk.size())) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + return OkStatus(); + }; + + // Create GLB file chunks and write them to file. + return ProcessGlbFileChunks(gltf_asset, json_data, write_chunk_to_file); +} + +Status GltfEncoder::ProcessGlbFileChunks( + const class GltfAsset &gltf_asset, const EncoderBuffer &json_data, + const std::function &process_chunk) const { + // The json data must be padded so the next chunk starts on a 4-byte boundary. + const uint32_t json_pad_length = + (json_data.size() % 4) ? 4 - json_data.size() % 4 : 0; + const uint32_t json_length = json_data.size() + json_pad_length; + const uint32_t total_length = + 12 + 8 + json_length + 8 + gltf_asset.Buffer()->size(); + + EncoderBuffer header; + // Write the glb file header. + const uint32_t gltf_version = 2; + if (!header.Encode("glTF", 4)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + if (!header.Encode(gltf_version)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + if (!header.Encode(total_length)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + + // Write the JSON chunk. + const uint32_t json_chunk_type = 0x4E4F534A; + if (!header.Encode(json_length)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + if (!header.Encode(json_chunk_type)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + DRACO_RETURN_IF_ERROR(process_chunk(header)); + DRACO_RETURN_IF_ERROR(process_chunk(json_data)); + + // Pad the data if needed. + header.Clear(); + if (json_pad_length > 0) { + if (!header.Encode(" ", json_pad_length)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + } + + // Write the binary buffer chunk. + const uint32_t bin_chunk_type = 0x004E4942; + const uint32_t gltf_bin_size = gltf_asset.Buffer()->size(); + if (!header.Encode(gltf_bin_size)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + if (!header.Encode(bin_chunk_type)) { + return Status(Status::DRACO_ERROR, "Error writing to glb file."); + } + DRACO_RETURN_IF_ERROR(process_chunk(header)); + DRACO_RETURN_IF_ERROR(process_chunk(*gltf_asset.Buffer())); + return OkStatus(); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/gltf_encoder.h b/contrib/draco/src/draco/io/gltf_encoder.h new file mode 100644 index 000000000..16403ac31 --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_encoder.h @@ -0,0 +1,134 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_GLTF_ENCODER_H_ +#define DRACO_IO_GLTF_ENCODER_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include +#include +#include +#include + +#include "draco/core/encoder_buffer.h" +#include "draco/io/file_writer_factory.h" +#include "draco/io/file_writer_interface.h" +#include "draco/io/texture_io.h" +#include "draco/mesh/mesh.h" +#include "draco/scene/scene.h" + +namespace draco { + +// Class for encoding draco::Mesh into the glTF file format. +class GltfEncoder { + public: + // Types of output modes for the glTF data encoder. |COMPACT| will output + // required and non-default glTF data. |VERBOSE| will output required and + // default glTF data as well as readable JSON even when the output is saved in + // a glTF-Binary file. + enum OutputType { COMPACT, VERBOSE }; + + GltfEncoder(); + + // Encodes the geometry and saves it into a file. Returns false when either + // the encoding failed or when the file couldn't be opened. + template + bool EncodeToFile(const T &geometry, const std::string &file_name, + const std::string &base_dir); + + // Saves |geometry| into glTF 2.0 format. |filename| is the name of the + // glTF file. The glTF bin file (if needed) will be named stem(|filename|) + + // “.bin”. The other files (if needed) will be saved to basedir(|filename|). + // If |filename| has the extension "glb" then |filename| will be written as a + // glTF-Binary file. Otherwise |filename| will be written as non-binary glTF + // file. + template + Status EncodeFile(const T &geometry, const std::string &filename); + + // Saves |geometry| into glTF 2.0 format. |filename| is the name of the + // glTF file. |bin_filename| is the name of the glTF bin file. The other + // files (if needed) will be saved to basedir(|filename|). |bin_filename| will + // be ignored if output is glTF-Binary. + template + Status EncodeFile(const T &geometry, const std::string &filename, + const std::string &bin_filename); + + // Saves |geometry| into glTF 2.0 format. |filename| is the name of the + // glTF file. |bin_filename| is the name of the glTF bin file. The other + // files will be saved to |resource_dir|. |bin_filename| and |resource_dir| + // will be ignored if output is glTF-Binary. + template + Status EncodeFile(const T &geometry, const std::string &filename, + const std::string &bin_filename, + const std::string &resource_dir); + + // Encodes |geometry| to |out_buffer| in glTF 2.0 GLB format. + template + Status EncodeToBuffer(const T &geometry, EncoderBuffer *out_buffer); + + void set_output_type(OutputType type) { output_type_ = type; } + OutputType output_type() const { return output_type_; } + + // The name of the attribute metadata that contains the glTF attribute + // name. For application-specific generic attributes, if the metadata for + // an attribute contains this key, then the value will be used as the + // encoded attribute name in the output GLTF. + static const char kDracoMetadataGltfAttributeName[]; + + private: + // Encodes the mesh or the point cloud into a buffer. + Status EncodeToBuffer(const Mesh &mesh, class GltfAsset *gltf_asset, + EncoderBuffer *out_buffer); + Status EncodeToBuffer(const Scene &scene, class GltfAsset *gltf_asset, + EncoderBuffer *out_buffer); + + // Sets appropriate Json writer mode based on the provided |gltf_asset| + // options. + static void SetJsonWriterMode(class GltfAsset *gltf_asset); + + // Writes the ".gltf" and associted files. |gltf_asset| holds the glTF data. + // |buffer| is the encoded glTF json data. |filename| is the name of the + // ".gltf" file. |bin_filename| is the name of the glTF bin file. The other + // files will be saved to |resource_dir|. + Status WriteGltfFiles(const class GltfAsset &gltf_asset, + const EncoderBuffer &buffer, + const std::string &filename, + const std::string &bin_filename, + const std::string &resource_dir); + + // Writes the ".glb" file. |gltf_asset| holds the glTF data. |json_data| is + // the encoded glTF json data. |filename| is the name of the ".glb" file. + Status WriteGlbFile(const class GltfAsset &gltf_asset, + const EncoderBuffer &json_data, + const std::string &filename); + + // Creates GLB file chunks and passes them to |process_chunk| function for + // processing. |gltf_asset| holds the glTF data. |json_data| is the encoded + // glTF json data. + Status ProcessGlbFileChunks( + const class GltfAsset &gltf_asset, const EncoderBuffer &json_data, + const std::function &process_chunk) const; + + EncoderBuffer *out_buffer_; + OutputType output_type_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_GLTF_ENCODER_H_ diff --git a/contrib/draco/src/draco/io/gltf_encoder_test.cc b/contrib/draco/src/draco/io/gltf_encoder_test.cc new file mode 100644 index 000000000..179256dfd --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_encoder_test.cc @@ -0,0 +1,1717 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/gltf_encoder.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/io/file_reader_factory.h" +#include "draco/io/file_reader_interface.h" +#include "draco/io/file_utils.h" +#include "draco/io/gltf_decoder.h" +#include "draco/io/gltf_test_helper.h" +#include "draco/io/parser_utils.h" +#include "draco/io/texture_io.h" +#include "draco/material/material_utils.h" +#include "draco/mesh/mesh_utils.h" +#include "draco/scene/mesh_group.h" +#include "draco/scene/scene.h" +#include "draco/scene/scene_utils.h" +#include "draco/texture/texture_utils.h" + +namespace draco { + +namespace { +std::unique_ptr DecodeFullPathGltfFileToScene( + const std::string &file_name) { + GltfDecoder decoder; + + auto maybe_scene = decoder.DecodeFromFileToScene(file_name); + if (!maybe_scene.ok()) { + std::cout << maybe_scene.status().error_msg_string() << std::endl; + return nullptr; + } + std::unique_ptr scene = std::move(maybe_scene).value(); + return scene; +} + +std::unique_ptr DecodeTestGltfFileToScene(const std::string &file_name) { + const std::string path = GetTestFileFullPath(file_name); + return DecodeFullPathGltfFileToScene(path); +} +} // namespace + +class GltfEncoderTest : public ::testing::Test { + protected: + // This function searches for the |search| string and checks that there are at + // least |count| occurrences. + void CheckGltfFileAtLeastStringCount(const std::string &gltf_file, + const std::string &search, int count) { + std::vector data; + ASSERT_TRUE(ReadFileToBuffer(gltf_file, &data)); + + draco::DecoderBuffer buffer; + buffer.Init(data.data(), data.size()); + + int strings_found = 0; + do { + std::string gltf_line; + draco::parser::ParseLine(&buffer, &gltf_line); + if (gltf_line.empty()) { + break; + } + + if (gltf_line.find(search) != std::string::npos) { + strings_found++; + } + // No need to keep counting pass |count|. + } while (strings_found < count); + ASSERT_GE(strings_found, count); + } + + // This function searches for the |search| string and checks that there no + // occurrences. + void CheckGltfFileNoString(const std::string &gltf_file, + const std::string &search) { + std::vector data; + ASSERT_TRUE(ReadFileToBuffer(gltf_file, &data)); + + draco::DecoderBuffer buffer; + buffer.Init(data.data(), data.size()); + + do { + std::string gltf_line; + draco::parser::ParseLine(&buffer, &gltf_line); + if (gltf_line.empty()) { + break; + } + ASSERT_TRUE(gltf_line.find(search) == std::string::npos); + } while (true); + } + + void CheckAnimationAccessors(const Scene &scene, + int expected_num_input_accessors, + int expected_num_output_accessors) { + int num_input_accessors = 0; + int num_output_accessors = 0; + + for (int i = 0; i < scene.NumAnimations(); ++i) { + const Animation *anim = scene.GetAnimation(AnimationIndex(i)); + ASSERT_NE(anim, nullptr); + + // The animation accessors in Draco are relative to the Animation object. + // While in glTF the animation accessors are relative to the global + // accessors. + std::unordered_set seen_accessors; + + for (int j = 0; j < anim->NumSamplers(); ++j) { + const AnimationSampler *const sampler = anim->GetSampler(j); + ASSERT_NE(sampler, nullptr); + + if (seen_accessors.find(sampler->input_index) == seen_accessors.end()) { + seen_accessors.insert(sampler->input_index); + num_input_accessors++; + } + if (seen_accessors.find(sampler->output_index) == + seen_accessors.end()) { + seen_accessors.insert(sampler->output_index); + num_output_accessors++; + } + } + } + + EXPECT_EQ(expected_num_input_accessors, num_input_accessors); + EXPECT_EQ(expected_num_output_accessors, num_output_accessors); + } + + void CompareMeshes(const Mesh *mesh0, const Mesh *mesh1) { + ASSERT_EQ(mesh0->num_faces(), mesh1->num_faces()); + ASSERT_EQ(mesh0->num_attributes(), mesh1->num_attributes()); + for (int att_id = 0; att_id < mesh0->num_attributes(); ++att_id) { + const GeometryAttribute::Type att_type = + mesh0->attribute(att_id)->attribute_type(); + const PointAttribute *const att = mesh1->GetNamedAttribute(att_type); + ASSERT_EQ(mesh0->attribute(att_id)->size(), att->size()) + << "Attribute id:" << att_id << " is not equal."; + } + + // Check materials are the same. + if (mesh0->GetMaterialLibrary().NumMaterials() == 0) { + // We add a default material if the source had no materials. + ASSERT_EQ(mesh1->GetMaterialLibrary().NumMaterials(), 1); + } else if (mesh1->GetMaterialLibrary().NumMaterials() == 0) { + // We add a default material if the source had no materials. + ASSERT_EQ(mesh0->GetMaterialLibrary().NumMaterials(), 1); + } else { + ASSERT_EQ(mesh0->GetMaterialLibrary().NumMaterials(), + mesh1->GetMaterialLibrary().NumMaterials()); + for (int i = 0; i < mesh0->GetMaterialLibrary().NumMaterials(); ++i) { + ASSERT_EQ(mesh0->GetMaterialLibrary().GetMaterial(i)->NumTextureMaps(), + mesh1->GetMaterialLibrary().GetMaterial(i)->NumTextureMaps()); + ASSERT_EQ(mesh0->GetMaterialLibrary().GetMaterial(i)->GetName(), + mesh1->GetMaterialLibrary().GetMaterial(i)->GetName()); + } + } + } + + void CompareScenes(const Scene *scene0, const Scene *scene1) { + ASSERT_EQ(scene0->NumMeshes(), scene1->NumMeshes()); + ASSERT_EQ(scene0->NumMeshGroups(), scene1->NumMeshGroups()); + ASSERT_EQ(scene0->NumNodes(), scene1->NumNodes()); + ASSERT_EQ(scene0->GetMaterialLibrary().NumMaterials(), + scene1->GetMaterialLibrary().NumMaterials()); + ASSERT_EQ(scene0->NumAnimations(), scene1->NumAnimations()); + ASSERT_EQ(scene0->NumSkins(), scene1->NumSkins()); + ASSERT_EQ(scene0->NumLights(), scene1->NumLights()); + + // Check materials are the same. + for (int i = 0; i < scene0->GetMaterialLibrary().NumMaterials(); ++i) { + ASSERT_EQ(scene0->GetMaterialLibrary().GetMaterial(i)->NumTextureMaps(), + scene1->GetMaterialLibrary().GetMaterial(i)->NumTextureMaps()); + ASSERT_EQ(scene0->GetMaterialLibrary().GetMaterial(i)->GetName(), + scene1->GetMaterialLibrary().GetMaterial(i)->GetName()); + } + + // Check that materials variants names are the same. + ASSERT_EQ(scene0->GetMaterialLibrary().NumMaterialsVariants(), + scene1->GetMaterialLibrary().NumMaterialsVariants()); + for (int i = 0; i < scene0->GetMaterialLibrary().NumMaterialsVariants(); + i++) { + ASSERT_EQ(scene0->GetMaterialLibrary().GetMaterialsVariantName(i), + scene1->GetMaterialLibrary().GetMaterialsVariantName(i)); + } + + // Check Nodes are the same. + for (draco::SceneNodeIndex i(0); i < scene0->NumNodes(); ++i) { + const SceneNode *const scene_node0 = scene0->GetNode(i); + const SceneNode *const scene_node1 = scene1->GetNode(i); + ASSERT_NE(scene_node0, nullptr); + ASSERT_NE(scene_node1, nullptr); + ASSERT_EQ(scene_node0->GetName(), scene_node1->GetName()); + ASSERT_EQ(scene_node0->GetLightIndex(), scene_node1->GetLightIndex()); + } + + // Check MeshGroups are the same. + for (draco::MeshGroupIndex i(0); i < scene0->NumMeshGroups(); ++i) { + const MeshGroup *const mesh_group0 = scene0->GetMeshGroup(i); + const MeshGroup *const mesh_group1 = scene1->GetMeshGroup(i); + ASSERT_NE(mesh_group0, nullptr); + ASSERT_NE(mesh_group1, nullptr); + ASSERT_EQ(mesh_group0->GetName(), mesh_group1->GetName()); + ASSERT_EQ(mesh_group0->NumMeshInstances(), + mesh_group1->NumMeshInstances()); + + // Check that mesh instanes are the same. + for (int j = 0; j < mesh_group1->NumMeshInstances(); j++) { + const MeshGroup::MeshInstance &instance0 = + mesh_group0->GetMeshInstance(j); + const MeshGroup::MeshInstance &instance1 = + mesh_group1->GetMeshInstance(j); + ASSERT_EQ(instance0.mesh_index, instance1.mesh_index); + ASSERT_EQ(instance0.material_index, instance1.material_index); + ASSERT_EQ(instance0.materials_variants_mappings.size(), + instance1.materials_variants_mappings.size()); + + // Check that materials variants mappings are the same. + for (int k = 0; k < instance0.materials_variants_mappings.size(); k++) { + const MeshGroup::MaterialsVariantsMapping &mapping0 = + instance0.materials_variants_mappings[k]; + const MeshGroup::MaterialsVariantsMapping &mapping1 = + instance1.materials_variants_mappings[k]; + ASSERT_EQ(mapping0.material, mapping1.material); + ASSERT_EQ(mapping0.variants.size(), mapping1.variants.size()); + for (int l = 0; l < mapping0.variants.size(); l++) { + ASSERT_EQ(mapping0.variants[l], mapping1.variants[l]); + } + } + } + } + + // Check Animations are the same. + for (draco::AnimationIndex i(0); i < scene0->NumAnimations(); ++i) { + const Animation *const animation0 = scene0->GetAnimation(i); + const Animation *const animation1 = scene1->GetAnimation(i); + ASSERT_NE(animation0, nullptr); + ASSERT_NE(animation1, nullptr); + ASSERT_EQ(animation0->NumSamplers(), animation1->NumSamplers()); + ASSERT_EQ(animation0->NumChannels(), animation1->NumChannels()); + ASSERT_EQ(animation0->NumNodeAnimationData(), + animation1->NumNodeAnimationData()); + } + + // Check that lights are the same. + for (draco::LightIndex i(0); i < scene0->NumLights(); ++i) { + const Light *const light0 = scene0->GetLight(i); + const Light *const light1 = scene1->GetLight(i); + ASSERT_NE(light0, nullptr); + ASSERT_NE(light1, nullptr); + ASSERT_EQ(light0->GetName(), light1->GetName()); + ASSERT_EQ(light0->GetColor(), light1->GetColor()); + ASSERT_EQ(light0->GetIntensity(), light1->GetIntensity()); + ASSERT_EQ(light0->GetType(), light1->GetType()); + ASSERT_EQ(light0->GetRange(), light1->GetRange()); + if (light0->GetType() == Light::SPOT) { + ASSERT_EQ(light0->GetInnerConeAngle(), light1->GetInnerConeAngle()); + ASSERT_EQ(light0->GetOuterConeAngle(), light1->GetOuterConeAngle()); + } + } + } + + void EncodeMeshToFile(const Mesh &mesh, + const std::string &gltf_file_full_path) { + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + ASSERT_TRUE( + gltf_encoder.EncodeToFile(mesh, gltf_file_full_path, folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + } + + void EncodeSceneToFile(const Scene &scene, + const std::string &gltf_file_full_path) { + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeToFile(scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + } + + // Encode |mesh| to a temporary glTF file. Then decode the glTF file and + // return the mesh in |mesh_gltf|. + void MeshToDecodedGltfMesh(const Mesh &mesh, + std::unique_ptr *mesh_gltf) { + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("test.gltf"); + EncodeMeshToFile(mesh, gltf_file_full_path); + *mesh_gltf = std::move(ReadMeshFromFile(gltf_file_full_path)).value(); + ASSERT_NE(*mesh_gltf, nullptr); + } + + // Encode |mesh| to a temporary glTF file. Then decode the glTF file as a + // scene and return it in |scene_gltf|. + void MeshToDecodedGltfScene(const Mesh &mesh, + std::unique_ptr *scene_gltf) { + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("test.gltf"); + EncodeMeshToFile(mesh, gltf_file_full_path); + *scene_gltf = std::move(ReadSceneFromFile(gltf_file_full_path)).value(); + ASSERT_NE(*scene_gltf, nullptr); + } + + // Encode |scene| to a temporary glTF file. Then decode the glTF file and + // return the scene in |scene_gltf|. + void SceneToDecodedGltfScene(const Scene &scene, + const std::string &temp_basename, + std::unique_ptr *scene_gltf) { + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath(temp_basename); + EncodeSceneToFile(scene, gltf_file_full_path); + + *scene_gltf = DecodeFullPathGltfFileToScene(gltf_file_full_path); + if (SceneUtils::IsDracoCompressionEnabled(scene)) { + // Two occurrences of the Draco compression string is the least amount for + // a valid Draco compressed glTF file. + const std::string khr_draco_compression = "KHR_draco_mesh_compression"; + CheckGltfFileAtLeastStringCount(gltf_file_full_path, + khr_draco_compression, 2); + } + ASSERT_NE((*scene_gltf).get(), nullptr); + } + + void SceneToDecodedGltfScene(const Scene &scene, + std::unique_ptr *scene_gltf) { + SceneToDecodedGltfScene(scene, "test.gltf", scene_gltf); + } + + void EncodeMeshToGltfAndCompare(Mesh *mesh) { + ASSERT_GT(mesh->num_faces(), 0); + + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + + mesh->DeduplicatePointIds(); + ASSERT_TRUE(mesh->DeduplicateAttributeValues()); + CompareMeshes(mesh, mesh_from_gltf.get()); + } + + void EncodeSceneToGltfAndCompare(Scene *scene) { + std::unique_ptr scene_from_gltf; + SceneToDecodedGltfScene(*scene, &scene_from_gltf); + if (!SceneUtils::IsDracoCompressionEnabled(*scene)) { + CompareScenes(scene, scene_from_gltf.get()); + } + } + + void test_encoding(const std::string &file_name) { + const std::unique_ptr mesh(ReadMeshFromTestFile(file_name, true)); + + ASSERT_NE(mesh, nullptr) << "Failed to load test model " << file_name; + EncodeMeshToGltfAndCompare(mesh.get()); + } +}; + +TEST_F(GltfEncoderTest, TestGltfEncodingAll) { + // Test decoded mesh from encoded glTF file stays the same. + test_encoding("test_nm.obj.edgebreaker.cl4.2.2.drc"); + test_encoding("cube_att.drc"); + test_encoding("car.drc"); + test_encoding("bunny_gltf.drc"); +} + +TEST_F(GltfEncoderTest, ImportTangentAttribute) { + auto mesh = draco::ReadMeshFromTestFile("sphere.gltf"); + ASSERT_NE(mesh, nullptr); + + const draco::PointAttribute *const tangent_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::TANGENT); + ASSERT_NE(tangent_att, nullptr); + + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + ASSERT_EQ(mesh->num_attributes(), mesh_from_gltf->num_attributes()); +} + +TEST_F(GltfEncoderTest, EncodeColorTexture) { + const std::string tex_file_name = draco::GetTestFileFullPath("test.png"); + std::unique_ptr texture = + draco::ReadTextureFromFile(tex_file_name).value(); + ASSERT_NE(texture, nullptr); + + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + mesh->GetMaterialLibrary().MutableMaterial(0)->SetTextureMap( + std::move(texture), draco::TextureMap::COLOR, 0); + + EncodeMeshToGltfAndCompare(mesh.get()); +} + +TEST_F(GltfEncoderTest, EncodeColors) { + auto mesh = draco::ReadMeshFromTestFile("test_pos_color.ply"); + ASSERT_NE(mesh, nullptr); + + const draco::PointAttribute *const color_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::COLOR); + ASSERT_NE(color_att, nullptr); + + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + + ASSERT_EQ(mesh->num_faces(), mesh_from_gltf->num_faces()); + ASSERT_EQ(mesh->num_attributes(), mesh_from_gltf->num_attributes()); + ASSERT_EQ( + mesh->NumNamedAttributes(draco::GeometryAttribute::COLOR), + mesh_from_gltf->NumNamedAttributes(draco::GeometryAttribute::COLOR)); +} + +TEST_F(GltfEncoderTest, EncodeNamedGenericAttribute) { + // Load some base mesh. + auto mesh = draco::ReadMeshFromTestFile("test_generic.ply"); + ASSERT_NE(mesh, nullptr); + const draco::PointAttribute *const pos_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::POSITION); + ASSERT_NE(pos_att, nullptr); + int num_vertices = pos_att->size(); + + // Add two new scalar attributes where each value corresponds to the position + // value index (vertex). The first attribute will have metadata, the second + // attribute won't. + std::unique_ptr pa_0(new draco::PointAttribute()); + std::unique_ptr pa_1(new draco::PointAttribute()); + pa_0->Init(draco::GeometryAttribute::GENERIC, /* scalar */ 1, + draco::DT_FLOAT32, false, + /* one value per position value */ num_vertices); + pa_1->Init(draco::GeometryAttribute::GENERIC, /* scalar */ 1, + draco::DT_FLOAT32, false, + /* one value per position value */ num_vertices); + + // Set the values for the new attributes. + for (draco::AttributeValueIndex avi(0); avi < num_vertices; ++avi) { + const float att_value = avi.value(); + pa_0->SetAttributeValue(avi, &att_value); + pa_1->SetAttributeValue(avi, &att_value); + } + + // Add the attribute to the existing mesh. + const int new_att_id_0 = mesh->AddPerVertexAttribute(std::move(pa_0)); + const int new_att_id_1 = mesh->AddPerVertexAttribute(std::move(pa_1)); + ASSERT_NE(new_att_id_0, -1); + ASSERT_NE(new_att_id_1, -1); + + // Set metadata for first attribute so it gets written out by glTF encoder. + std::unique_ptr am(new draco::AttributeMetadata()); + constexpr char kAttributeName[] = "MyAttributeName"; + constexpr char kDracoMetadataGltfAttributeName[] = + "//GLTF/ApplicationSpecificAttributeName"; + am->AddEntryString(kDracoMetadataGltfAttributeName, kAttributeName); + mesh->AddAttributeMetadata(new_att_id_0, std::move(am)); + + // Make sure the GLTF contains a reference to the named attribute. + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("GenericAttribute.gltf"); + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeToFile(*(mesh.get()), + gltf_file_full_path, folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + CheckGltfFileAtLeastStringCount(gltf_file_full_path, kAttributeName, 1); + + // The decoder does not yet support generic attribute names, so instead of + // using the decoder we compare against a golden file. + const std::string gltf_generated_bin_filename = + draco::GetTestTempFileFullPath("buffer0.bin"); + std::vector generated_buffer; + ASSERT_TRUE(ReadFileToBuffer(gltf_generated_bin_filename, &generated_buffer)); + std::string generated_str(generated_buffer.data(), generated_buffer.size()); + + const std::string gltf_expected_bin_filename = + GetTestFileFullPath("test_generic_golden.bin"); + const bool kUpdateGoldens = false; + if (kUpdateGoldens) { + ASSERT_TRUE(WriteBufferToFile(generated_buffer.data(), + generated_buffer.size(), + gltf_expected_bin_filename)); + } + std::vector expected_buffer; + ASSERT_TRUE(ReadFileToBuffer(gltf_expected_bin_filename, &expected_buffer)); + std::string expected_str(expected_buffer.data(), expected_buffer.size()); + + EXPECT_TRUE(generated_str == expected_str); +} + +TEST_F(GltfEncoderTest, EncodeMetallicRoughnessTexture) { + const std::string tex_file_name = draco::GetTestFileFullPath("test.png"); + std::unique_ptr texture = + draco::ReadTextureFromFile(tex_file_name).value(); + ASSERT_NE(texture, nullptr); + + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + mesh->GetMaterialLibrary().MutableMaterial(0)->SetTextureMap( + std::move(texture), draco::TextureMap::METALLIC_ROUGHNESS, 0); + + EncodeMeshToGltfAndCompare(mesh.get()); +} + +TEST_F(GltfEncoderTest, EncodeOcclusionTexture) { + const std::string tex_file_name = draco::GetTestFileFullPath("test.png"); + std::unique_ptr texture = + draco::ReadTextureFromFile(tex_file_name).value(); + ASSERT_NE(texture, nullptr); + + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + mesh->GetMaterialLibrary().MutableMaterial(0)->SetTextureMap( + std::move(texture), draco::TextureMap::AMBIENT_OCCLUSION, 0); + + EncodeMeshToGltfAndCompare(mesh.get()); +} + +TEST_F(GltfEncoderTest, EncodeEmissiveTexture) { + const std::string tex_file_name = draco::GetTestFileFullPath("test.png"); + std::unique_ptr texture = + draco::ReadTextureFromFile(tex_file_name).value(); + ASSERT_NE(texture, nullptr); + + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + mesh->GetMaterialLibrary().MutableMaterial(0)->SetTextureMap( + std::move(texture), draco::TextureMap::EMISSIVE, 0); + + EncodeMeshToGltfAndCompare(mesh.get()); +} + +// Tests splitting the mesh into multiple primitives. +TEST_F(GltfEncoderTest, EncodeSplitMesh) { + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(mesh, nullptr); + const int32_t material_att_id = + mesh->GetNamedAttributeId(draco::GeometryAttribute::MATERIAL); + ASSERT_NE(material_att_id, -1); + EncodeMeshToGltfAndCompare(mesh.get()); +} + +// Tests encoding a scene from a glTF with multiple meshes and primitives, +// including mesh instances. +TEST_F(GltfEncoderTest, EncodeInstancedScene) { + const std::string file_name = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + std::unique_ptr transcoded_scene; + SceneToDecodedGltfScene(*scene, "EncodeInstancedScene.gltf", + &transcoded_scene); + ASSERT_NE(transcoded_scene, nullptr); + CompareScenes(scene.get(), transcoded_scene.get()); + EXPECT_EQ(transcoded_scene->NumAnimations(), 1); + + const int num_input_accessors = 2; + const int num_output_accessors = 2; + CheckAnimationAccessors(*transcoded_scene, num_input_accessors, + num_output_accessors); +} + +// Tests encoding a scene from a glTF with multiple meshes and primitives, +// including mesh instances. +TEST_F(GltfEncoderTest, EncodeBoneAnimation) { + const std::string file_name = "CesiumMan/glTF/CesiumMan.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + std::unique_ptr transcoded_scene; + SceneToDecodedGltfScene(*scene, "EncodeBoneAnimation.gltf", + &transcoded_scene); + ASSERT_NE(transcoded_scene, nullptr); + CompareScenes(scene.get(), transcoded_scene.get()); + EXPECT_EQ(transcoded_scene->NumAnimations(), 1); + + const Animation *anim = scene->GetAnimation(AnimationIndex(0)); + ASSERT_NE(anim, nullptr); + ASSERT_TRUE(anim->GetName().empty()); + + // TODO(b/145703399): Figure out how to test that all of the input accessors + // in animation channels in the encoded glTF file will be the same for this + // test file. + const int num_input_accessors = 57; + const int num_output_accessors = 57; + CheckAnimationAccessors(*transcoded_scene, num_input_accessors, + num_output_accessors); +} + +// Tests encoding a scene from a glTF with nodes that have names. +TEST_F(GltfEncoderTest, EncodeSceneWithNodeNames) { + const std::string file_name = "Lantern/glTF/Lantern.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + EncodeSceneToGltfAndCompare(scene.get()); +} + +// Tests encoding a simple glTF with Draco compression. +TEST_F(GltfEncoderTest, EncodeWithDracoCompression) { + const std::string file_name = "Box/glTF/Box.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + const DracoCompressionOptions options; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + EncodeSceneToGltfAndCompare(scene.get()); +} + +TEST_F(GltfEncoderTest, EncodeWeightsJointsWithDracoCompression) { + const std::string file_name = "CesiumMan/glTF/CesiumMan.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + const DracoCompressionOptions options; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + EncodeSceneToGltfAndCompare(scene.get()); +} + +TEST_F(GltfEncoderTest, EncodeTangentsWithDracoCompression) { + const std::string file_name = "Lantern/glTF/Lantern.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + const DracoCompressionOptions options; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + EncodeSceneToGltfAndCompare(scene.get()); +} + +TEST_F(GltfEncoderTest, TestDracoCompressionWithGeneratedPoints) { + const std::string basename = "test_nm.obj"; + std::unique_ptr mesh = draco::ReadMeshFromTestFile(basename); + ASSERT_NE(mesh, nullptr) << "Failed to load " << basename; + + auto maybe_scene = draco::SceneUtils::MeshToScene(std::move(mesh)); + ASSERT_TRUE(maybe_scene.ok()) << "Failed Mesh to Scene conversion."; + const std::unique_ptr scene = std::move(maybe_scene).value(); + ASSERT_NE(scene, nullptr); + const DracoCompressionOptions options; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + EncodeSceneToGltfAndCompare(scene.get()); +} + +TEST_F(GltfEncoderTest, TestDracoCompressionWithDegenerateFaces) { + const std::string basename = "deg_faces.obj"; + std::unique_ptr mesh = draco::ReadMeshFromTestFile(basename); + ASSERT_NE(mesh, nullptr) << "Failed to load " << basename; + ASSERT_EQ(mesh->num_faces(), 4); + + auto maybe_scene = draco::SceneUtils::MeshToScene(std::move(mesh)); + ASSERT_TRUE(maybe_scene.ok()) << "Failed Mesh to Scene conversion."; + const std::unique_ptr scene = std::move(maybe_scene).value(); + ASSERT_NE(scene, nullptr); + const Mesh &scene_first_mesh = scene->GetMesh(MeshIndex(0)); + ASSERT_EQ(scene_first_mesh.num_faces(), 4); + + std::unique_ptr scene_from_gltf; + const DracoCompressionOptions options; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + SceneToDecodedGltfScene(*scene, &scene_from_gltf); + const Mesh &scene_from_gltf_first_mesh = + scene_from_gltf->GetMesh(MeshIndex(0)); + ASSERT_EQ(scene_from_gltf_first_mesh.num_faces(), 3); + + CompareScenes(scene.get(), scene_from_gltf.get()); +} + +TEST_F(GltfEncoderTest, DracoCompressionCheckOptions) { + const std::string file_name = "CesiumMan/glTF/CesiumMan.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("test.gltf"); + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + DracoCompressionOptions options; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + + const std::string gltf_bin_filename = + draco::GetTestTempFileFullPath("buffer0.bin"); + const size_t default_bin_size = draco::GetFileSize(gltf_bin_filename); + + // Test applying more quantization will make the compressed size smaller. + options.quantization_position.SetQuantizationBits(6); + options.quantization_bits_normal = 6; + options.quantization_bits_tex_coord = 6; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t more_quantization_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_LT(more_quantization_bin_size, default_bin_size); + + // Test setting more weight quantization then the default makes the compressed + // size smaller. + options.quantization_bits_weight = 6; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t more_weight_quantization_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_LT(more_weight_quantization_bin_size, more_quantization_bin_size); + + options.quantization_position.SetQuantizationBits(20); + options.quantization_bits_normal = 20; + options.quantization_bits_tex_coord = 20; + options.quantization_bits_weight = 20; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t less_quantization_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_GT(less_quantization_bin_size, default_bin_size); + + DracoCompressionOptions level_options; + level_options.compression_level = 10; // compression level [0-10]. + SceneUtils::SetDracoCompressionOptions(&level_options, scene.get()); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t most_compression_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_LT(most_compression_bin_size, default_bin_size); + + level_options.compression_level = 4; + SceneUtils::SetDracoCompressionOptions(&level_options, scene.get()); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t less_compression_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_GT(less_compression_bin_size, default_bin_size); + + level_options.compression_level = 0; + SceneUtils::SetDracoCompressionOptions(&level_options, scene.get()); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t least_compression_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_GT(least_compression_bin_size, less_compression_bin_size); +} + +TEST_F(GltfEncoderTest, TestQuantizationPerAttribute) { + const std::string file_name = "sphere.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("test.gltf"); + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + DracoCompressionOptions options; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + + const std::string gltf_bin_filename = + draco::GetTestTempFileFullPath("buffer0.bin"); + const size_t default_bin_size = draco::GetFileSize(gltf_bin_filename); + + // Test setting more position quantization then the default makes the + // compressed size smaller. + options.quantization_position.SetQuantizationBits(6); + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t position_quantization_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_LT(position_quantization_bin_size, default_bin_size); + + // Test setting more normal quantization then the default makes the compressed + // size smaller. + options.quantization_bits_normal = 6; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t normal_quantization_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_LT(normal_quantization_bin_size, position_quantization_bin_size); + + // Test setting more tex_coord quantization then the default makes the + // compressed size smaller. + options.quantization_bits_tex_coord = 6; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t tex_coord_quantization_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_LT(tex_coord_quantization_bin_size, normal_quantization_bin_size); + + // Test setting more tangent quantization then the default makes the + // compressed size smaller. Weight is tested in DracoCompressionCheckOptions. + options.quantization_bits_tangent = 6; + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t tangent_quantization_bin_size = + draco::GetFileSize(gltf_bin_filename); + ASSERT_LT(tangent_quantization_bin_size, tex_coord_quantization_bin_size); +} + +// Tests encoding a glTF with multiple scaled instances with Draco compression +// using grid options for position quantization. +TEST_F(GltfEncoderTest, TestDracoCompressionWithGridOptions) { + const std::string file_name = + "SpheresScaledInstances/glTF/spheres_scaled_instances.gltf"; + std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + const auto bbox = scene->GetMesh(MeshIndex(0)).ComputeBoundingBox(); + const float mesh_size = bbox.Size().MaxCoeff(); + + // All dimensions of the original mesh are between [-1, 1]. Let's move the + // mesh to [0, 2] which will allow us to match grid quantization with the + // regular quantization (grid quantization is always aligned with 0). + Mesh &mesh = scene->GetMesh(MeshIndex(0)); + PointAttribute *pos_att = + mesh.attribute(mesh.GetNamedAttributeId(GeometryAttribute::POSITION)); + for (AttributeValueIndex avi(0); avi < pos_att->size(); ++avi) { + Vector3f pos; + pos_att->GetValue(avi, &pos[0]); + pos += Vector3f(1.f, 1.f, 1.f); + pos_att->SetAttributeValue(avi, &pos[0]); + } + + DracoCompressionOptions options; + + // First quantize the scene with 8 bits and save the result. + options.quantization_position.SetQuantizationBits(8); + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + const std::string gltf_filename = draco::GetTestTempFileFullPath("temp.glb"); + GltfEncoder encoder; + DRACO_ASSERT_OK(encoder.EncodeFile(*scene, gltf_filename)); + // Get the size of the generated file. + const size_t qb_file_size = draco::GetFileSize(gltf_filename); + + // Now set grid quantization and ensure the encoded file size is about the + // same. The max instance scale is 3 and model size is |mesh_size| so the grid + // scale must account for that. + options.quantization_position.SetGrid(mesh_size * 3. / 255.); + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + DRACO_ASSERT_OK(encoder.EncodeFile(*scene, gltf_filename)); + // Get the size of the generated file. + const size_t grid_file_size = draco::GetFileSize(gltf_filename); + + ASSERT_EQ(grid_file_size, qb_file_size); + + // Now set grid quantization to different settings and ensure the encoded size + // changed. We reduce spacing which should increase the size. + options.quantization_position.SetGrid(mesh_size * 3. / 511.); + SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + + DRACO_ASSERT_OK(encoder.EncodeFile(*scene, gltf_filename)); + + // Get the size of the generated file. + const size_t grid_file_size_2 = draco::GetFileSize(gltf_filename); + ASSERT_GT(grid_file_size_2, grid_file_size); +} + +TEST_F(GltfEncoderTest, TestOutputType) { + const std::string file_name = "sphere.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("test.gltf"); + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + + const size_t default_gltf_size = draco::GetFileSize(gltf_file_full_path); + + // Test setting VERBOSE output type will increase the size of the gltf file. + gltf_encoder.set_output_type(GltfEncoder::VERBOSE); + ASSERT_TRUE(gltf_encoder.EncodeToFile(*scene, gltf_file_full_path, + folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + const size_t verbose_gltf_size = draco::GetFileSize(gltf_file_full_path); + ASSERT_GT(verbose_gltf_size, default_gltf_size); +} + +// Tests copying the name of the input texture file to the encoded texture file. +TEST_F(GltfEncoderTest, CopyTextureName) { + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(mesh, nullptr); + + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + const Material *material = mesh->GetMaterialLibrary().GetMaterial(0); + ASSERT_NE(material, nullptr); + const Texture *texture = + mesh->GetMaterialLibrary().GetTextureLibrary().GetTexture(0); + ASSERT_NE(texture, nullptr); + ASSERT_EQ(draco::TextureUtils::GetTargetStem(*texture), "CesiumMilkTruck"); + ASSERT_EQ(draco::TextureUtils::GetTargetFormat(*texture), + draco::ImageFormat::PNG); +} + +TEST_F(GltfEncoderTest, EncodeTexCoord1) { + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("MultiUVTest/glTF/MultiUVTest.gltf"); + + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + ASSERT_EQ(mesh_from_gltf->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ( + mesh_from_gltf->GetMaterialLibrary().GetMaterial(0)->NumTextureMaps(), 2); + ASSERT_EQ( + mesh_from_gltf->GetMaterialLibrary().GetTextureLibrary().NumTextures(), + 2); + const std::vector textures = { + mesh_from_gltf->GetMaterialLibrary().GetTextureLibrary().GetTexture(0), + mesh_from_gltf->GetMaterialLibrary().GetTextureLibrary().GetTexture(1)}; + EXPECT_EQ(draco::TextureUtils::GetTargetStem(*textures[0]), "uv0"); + EXPECT_EQ(draco::TextureUtils::GetTargetStem(*textures[1]), "uv1"); + EXPECT_EQ(draco::TextureUtils::GetTargetFormat(*textures[0]), + draco::ImageFormat::PNG); + EXPECT_EQ(draco::TextureUtils::GetTargetFormat(*textures[1]), + draco::ImageFormat::PNG); + ASSERT_EQ(mesh_from_gltf->NumNamedAttributes(GeometryAttribute::TEX_COORD), + 2); + ASSERT_EQ(mesh_from_gltf->NumNamedAttributes(GeometryAttribute::POSITION), 1); + ASSERT_EQ(mesh_from_gltf->NumNamedAttributes(GeometryAttribute::NORMAL), 1); + ASSERT_EQ(mesh_from_gltf->NumNamedAttributes(GeometryAttribute::TANGENT), 1); +} + +TEST_F(GltfEncoderTest, TestEncodeFileFunctions) { + const std::string file_name = "sphere.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + // Test encoding with only the gltf filename parameter will output the correct + // bin filename and the textures will be in the same directory as the output + // glTF file. + const std::string output_gltf_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(output_gltf_filename, &output_gltf_dir, + &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeFile(*scene, output_gltf_filename).ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + + const std::string output_bin_filename = + draco::GetTestTempFileFullPath("encoded_example.bin"); + const size_t output_bin_size = draco::GetFileSize(output_bin_filename); + ASSERT_GT(output_bin_size, 0); + const std::string output_png_filename = + draco::GetTestTempFileFullPath("sphere_Texture0_Normal.png"); + const size_t output_png_size = draco::GetFileSize(output_png_filename); + ASSERT_GT(output_png_size, 0); + + // Test encoding with the gltf and bin filename parameter, the textures will + // be in the same directory as the output glTF file. + const std::string new_bin_filename = + draco::GetTestTempFileFullPath("different_stem_name.bin"); + ASSERT_TRUE( + gltf_encoder + .EncodeFile(*scene, output_gltf_filename, new_bin_filename) + .ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + + const size_t new_bin_size = draco::GetFileSize(new_bin_filename); + ASSERT_GT(new_bin_size, 0); + ASSERT_EQ(new_bin_size, output_bin_size); + + // Test encoding with the gltf and bin filename and resource_dir parameter, + // the textures will be in the resource_dir directory. + const std::string new_resource_dir = output_gltf_dir + "/textures"; + ASSERT_TRUE(gltf_encoder + .EncodeFile(*scene, output_gltf_filename, + new_bin_filename, new_resource_dir) + .ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + + const std::string new_png_filename = + draco::GetTestTempFileFullPath("textures/sphere_Texture0_Normal.png"); + const size_t newest_bin_size = draco::GetFileSize(new_bin_filename); + ASSERT_GT(new_bin_size, 0); + ASSERT_EQ(new_bin_size, output_bin_size); + ASSERT_EQ(newest_bin_size, new_bin_size); + const size_t new_png_size = draco::GetFileSize(new_png_filename); + ASSERT_GT(new_png_size, 0); + ASSERT_EQ(new_png_size, output_png_size); +} + +TEST_F(GltfEncoderTest, DoubleSidedMaterial) { + const std::string file_name = "TwoSidedPlane/glTF/TwoSidedPlane.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + EXPECT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ(scene->GetMaterialLibrary().GetMaterial(0)->GetDoubleSided(), true); + + std::unique_ptr scene_from_gltf; + SceneToDecodedGltfScene(*scene, &scene_from_gltf); + EXPECT_EQ(scene_from_gltf->GetMaterialLibrary().NumMaterials(), 1); + EXPECT_EQ( + scene_from_gltf->GetMaterialLibrary().GetMaterial(0)->GetDoubleSided(), + true); +} + +TEST_F(GltfEncoderTest, EncodeGlb) { + const std::string file_name = "sphere.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + std::unique_ptr scene_from_gltf; + SceneToDecodedGltfScene(*scene, "temp.gltf", &scene_from_gltf); + + std::unique_ptr scene_from_glb; + SceneToDecodedGltfScene(*scene, "temp.glb", &scene_from_glb); + + CompareScenes(scene_from_gltf.get(), scene_from_glb.get()); +} + +TEST_F(GltfEncoderTest, EncodeVertexColor) { + const std::string file_name = "VertexColorTest/glTF/VertexColorTest.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + EXPECT_EQ(scene->NumMeshes(), 2); + const Mesh &mesh = scene->GetMesh(MeshIndex(1)); + EXPECT_EQ(mesh.NumNamedAttributes(GeometryAttribute::COLOR), 1); + + std::unique_ptr scene_from_gltf; + SceneToDecodedGltfScene(*scene, "temp.gltf", &scene_from_gltf); + EXPECT_EQ(scene_from_gltf->NumMeshes(), 2); + const Mesh &encoded_mesh = scene_from_gltf->GetMesh(MeshIndex(1)); + EXPECT_EQ(encoded_mesh.NumNamedAttributes(GeometryAttribute::COLOR), 1); +} + +TEST_F(GltfEncoderTest, InterpolationTest) { + const std::string file_name = "InterpolationTest/glTF/InterpolationTest.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + std::unique_ptr transcoded_scene; + SceneToDecodedGltfScene(*scene, "InterpolationTest.gltf", &transcoded_scene); + ASSERT_NE(transcoded_scene, nullptr); + CompareScenes(scene.get(), transcoded_scene.get()); + EXPECT_EQ(transcoded_scene->NumAnimations(), 9); + + const std::vector animation_names{ + "Step Scale", "Linear Scale", + "CubicSpline Scale", "Step Rotation", + "CubicSpline Rotation", "Linear Rotation", + "Step Translation", "CubicSpline Translation", + "Linear Translation"}; + for (int i = 0; i < scene->NumAnimations(); ++i) { + const Animation *const anim = scene->GetAnimation(AnimationIndex(i)); + ASSERT_NE(anim, nullptr); + ASSERT_EQ(anim->GetName(), animation_names[i]); + } + + // Currently all animation data is unique. See b/145703399. + const int num_input_accessors = 9; + const int num_output_accessors = 9; + CheckAnimationAccessors(*transcoded_scene, num_input_accessors, + num_output_accessors); +} + +TEST_F(GltfEncoderTest, KhrMaterialUnlit) { + const std::string filename = + "KhronosSampleModels/UnlitTest/glTF/UnlitTest.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene, nullptr); + + const std::string output_gltf_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(output_gltf_filename, &output_gltf_dir, + &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeFile(*scene, output_gltf_filename).ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + // glTF file should have four occurences of "KHR_materials_unlit". Two in the + // materials and one in extensionsUsed and one in extensionsRequired. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "KHR_materials_unlit", + 4); +} + +TEST_F(GltfEncoderTest, OneMaterialUnlitWithFallback) { + const std::string filename = + "UnlitWithFallback/one_material_all_fallback/" + "one_material_all_fallback.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene, nullptr); + + const std::string output_gltf_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(output_gltf_filename, &output_gltf_dir, + &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeFile(*scene, output_gltf_filename).ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + + // glTF file should have two occurences of "KHR_materials_unlit". One in the + // materials and one in extensionsUsed. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "KHR_materials_unlit", + 2); + + // The glTF file should provide a fallback to "KHR_materials_unlit", so there + // should be no "extensionsRequired" element. + CheckGltfFileNoString(output_gltf_filename, "extensionsRequired"); +} + +TEST_F(GltfEncoderTest, MultipleMaterialsUnlitWithFallback) { + std::string filename = + "UnlitWithFallback/three_materials_all_fallback/" + "three_materials_all_fallback.gltf"; + const std::unique_ptr scene_all_fallback( + DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene_all_fallback, nullptr); + + const std::string output_gltf_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(output_gltf_filename, &output_gltf_dir, + &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE( + gltf_encoder.EncodeFile(*scene_all_fallback, output_gltf_filename) + .ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + + // glTF file should have four occurences of "KHR_materials_unlit". Three in + // the materials and one in extensionsUsed. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "KHR_materials_unlit", + 4); + + // The glTF file should provide a fallback to "KHR_materials_unlit", so there + // should be no "extensionsRequired" element. + CheckGltfFileNoString(output_gltf_filename, "extensionsRequired"); + + filename = + "UnlitWithFallback/three_materials_one_fallback/" + "three_materials_one_fallback.gltf"; + const std::unique_ptr scene_one_fallback( + DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene_one_fallback, nullptr); + + ASSERT_TRUE( + gltf_encoder.EncodeFile(*scene_one_fallback, output_gltf_filename) + .ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + + // glTF file should have three occurences of "KHR_materials_unlit". One in the + // materials, one in extensionsUsed, and one in extensionsRequired. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "KHR_materials_unlit", + 3); + + // The glTF file only has one material with a fallback for + // "KHR_materials_unlit". The other two materials have "KHR_materials_unlit" + // set without a fallback, so there should be an "extensionsRequired" element. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "extensionsRequired", + 1); +} + +TEST_F(GltfEncoderTest, KhrMaterialsSheenExtension) { + const std::string filename = + "KhronosSampleModels/SheenCloth/glTF/SheenCloth.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene, nullptr); + + const std::string out_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(out_filename, &output_gltf_dir, &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeFile(*scene, out_filename).ok()) + << "Failed to encode glTF filename:" << out_filename; + + // The "KHR_materials_sheen" should be in material and in extensionsUsed. + CheckGltfFileAtLeastStringCount(out_filename, "KHR_materials_sheen", 2); + CheckGltfFileAtLeastStringCount(out_filename, "sheenColorFactor", 1); + CheckGltfFileAtLeastStringCount(out_filename, "sheenColorTexture", 1); + CheckGltfFileAtLeastStringCount(out_filename, "sheenRoughnessFactor", 1); + CheckGltfFileAtLeastStringCount(out_filename, "sheenRoughnessTexture", 1); +} + +TEST_F(GltfEncoderTest, PbrNextExtensions) { + // Check that a model with PBR material extensions is encoded correctly. This + // is done by encoding an original model with all PBR material extension + // properties and textures, then decoding it and checking that it matches the + // original model. + // TODO(vytyaz): Test multiple materials with various sets of extensions. + + // Read the original model. + const std::string orig_name = "pbr_next/sphere/glTF/sphere.gltf"; + const std::unique_ptr original(DecodeTestGltfFileToScene(orig_name)); + ASSERT_NE(original, nullptr); + const Material &original_mat = *original->GetMaterialLibrary().GetMaterial(0); + + // Check that the original material has PBR extensions. + EXPECT_TRUE(original_mat.HasSheen()); + EXPECT_TRUE(original_mat.HasTransmission()); + EXPECT_TRUE(original_mat.HasClearcoat()); + EXPECT_TRUE(original_mat.HasVolume()); + EXPECT_TRUE(original_mat.HasIor()); + EXPECT_TRUE(original_mat.HasSpecular()); + + // Write the original model to a temporary file. + GltfEncoder encoder; + const std::string tmp_name = draco::GetTestTempFileFullPath("tmp.gltf"); + DRACO_ASSERT_OK(encoder.EncodeFile(*original, tmp_name)); + + // Read model from the temporay file. + GltfDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(auto encoded, decoder.DecodeFromFileToScene(tmp_name)); + ASSERT_NE(encoded, nullptr); +} + +TEST_F(GltfEncoderTest, KhrTextureTransformWithoutFallback) { + // This is the example from Khronos, which should have "KHR_texture_transform" + // listed in the extensionsRequired, but does not for testing out client + // implementations. + const std::string filename = + "KhronosSampleModels/TextureTransformTest/glTF/TextureTransformTest.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene, nullptr); + + const std::string output_gltf_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(output_gltf_filename, &output_gltf_dir, + &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeFile(*scene, output_gltf_filename).ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + // glTF file should have eight occurences of "KHR_materials_unlit". Six in the + // materials and one in extensionsUsed and one in extensionsRequired. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "KHR_texture_transform", + 8); + + // glTF file should still contain only two occurences of '"sampler": 0'. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "\"sampler\": 0", 2); + + // glTF file should have one occurence of "wrapS", "wrapT", "minFilter", and + // "magFilter". + CheckGltfFileAtLeastStringCount(output_gltf_filename, "wrapS", 1); + CheckGltfFileAtLeastStringCount(output_gltf_filename, "wrapT", 1); + CheckGltfFileAtLeastStringCount(output_gltf_filename, "minFilter", 1); + CheckGltfFileAtLeastStringCount(output_gltf_filename, "magFilter", 1); +} + +TEST_F(GltfEncoderTest, KhrTextureTransformWithoutFallbackRequried) { + // This is the example from Khronos, changed to list "KHR_texture_transform" + // in extensionsRequired. + const std::string filename = + "glTF/TextureTransformTestWithRequired/" + "TextureTransformTestWithRequired.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene, nullptr); + + const std::string output_gltf_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(output_gltf_filename, &output_gltf_dir, + &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeFile(*scene, output_gltf_filename).ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + // glTF file should have eight occurences of "KHR_materials_unlit". Six in the + // materials and one in extensionsUsed and one in extensionsRequired. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "KHR_texture_transform", + 8); +} + +TEST_F(GltfEncoderTest, KhrTextureTransformWithFallback) { + // This is an example of "KHR_texture_transform" extension with fallback data. + const std::string filename = + "glTF/KhrTextureTransformWithFallback/" + "KhrTextureTransformWithFallback.gltf"; + const std::unique_ptr scene(DecodeTestGltfFileToScene(filename)); + ASSERT_NE(scene, nullptr); + + const std::string output_gltf_filename = + draco::GetTestTempFileFullPath("encoded_example.gltf"); + std::string output_gltf_dir; + std::string output_gltf_basename; + draco::SplitPath(output_gltf_filename, &output_gltf_dir, + &output_gltf_basename); + + GltfEncoder gltf_encoder; + ASSERT_TRUE(gltf_encoder.EncodeFile(*scene, output_gltf_filename).ok()) + << "Failed to encode glTF filename:" << output_gltf_filename; + // glTF file should have two occurences of "KHR_materials_unlit". One in the + // materials and one in extensionsUsed. + CheckGltfFileAtLeastStringCount(output_gltf_filename, "KHR_texture_transform", + 2); +} + +// Tests if the source file has a node with an identity matrix, that we do not +// output the identiy matrix. +TEST_F(GltfEncoderTest, MeshWithIdentityTransformation) { + const std::string gltf_source_full_path = + GetTestFileFullPath("Triangle/glTF/Triangle_identity_matrix.gltf"); + + // Check that the source file contains one "matrix" and no "translation" + // strings. + CheckGltfFileAtLeastStringCount(gltf_source_full_path, "matrix", 1); + CheckGltfFileNoString(gltf_source_full_path, "translation"); + + std::unique_ptr scene = draco::ReadSceneFromTestFile( + "Triangle/glTF/Triangle_identity_matrix.gltf"); + ASSERT_NE(scene, nullptr); + SceneNode *scene_node = scene->GetNode(SceneNodeIndex(0)); + ASSERT_NE(scene_node, nullptr); + const TrsMatrix &trs_matrix = scene_node->GetTrsMatrix(); + + // gltf_decoder will not set the trs matrix if the matrix is identity. + ASSERT_FALSE(trs_matrix.MatrixSet()); + + // Add the identity matrix. + TrsMatrix trsm; + trsm.SetMatrix(Eigen::Matrix4d::Identity()); + scene_node->SetTrsMatrix(trsm); + + const TrsMatrix &check_trs_matrix = scene_node->GetTrsMatrix(); + ASSERT_TRUE(check_trs_matrix.MatrixSet()); + ASSERT_EQ(check_trs_matrix.IsMatrixIdentity(), true); + + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("MeshWithIdentityTransformation.gltf"); + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + + ASSERT_TRUE(gltf_encoder.EncodeToFile( + *scene.get(), gltf_file_full_path, folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + std::unique_ptr scene_gltf = + std::move(ReadSceneFromFile(gltf_file_full_path)).value(); + ASSERT_NE(scene_gltf, nullptr); + // Check that the output file contains no "matrix" or "translation" strings. + CheckGltfFileNoString(gltf_file_full_path, "matrix"); + CheckGltfFileNoString(gltf_file_full_path, "translation"); +} + +// Tests if the source file has a node with a matrix that only has the +// translation values set. If it does then instead of outputting the full matrix +// we only output the "translation" glTF element. +TEST_F(GltfEncoderTest, MeshWithTranslationOnlyMatrix) { + std::unique_ptr scene = draco::ReadSceneFromTestFile( + "Triangle/glTF/Triangle_translation_only_matrix.gltf"); + ASSERT_NE(scene, nullptr); + SceneNode *scene_node = scene->GetNode(SceneNodeIndex(0)); + ASSERT_NE(scene_node, nullptr); + const TrsMatrix &input_trs_matrix = scene_node->GetTrsMatrix(); + ASSERT_TRUE(input_trs_matrix.MatrixSet()); + ASSERT_FALSE(input_trs_matrix.TranslationSet()); + ASSERT_FALSE(input_trs_matrix.RotationSet()); + ASSERT_FALSE(input_trs_matrix.ScaleSet()); + ASSERT_TRUE(input_trs_matrix.IsMatrixTranslationOnly()); + + const std::string gltf_file_full_path = + draco::GetTestTempFileFullPath("MeshWithTranslationOnlyMatrix.gltf"); + std::string folder_path; + std::string gltf_file_name; + draco::SplitPath(gltf_file_full_path, &folder_path, &gltf_file_name); + GltfEncoder gltf_encoder; + + ASSERT_TRUE(gltf_encoder.EncodeToFile( + *scene.get(), gltf_file_full_path, folder_path)) + << "Failed gltf_file_full_path:" << gltf_file_full_path + << " folder_path:" << folder_path; + std::unique_ptr scene_gltf = + std::move(ReadSceneFromFile(gltf_file_full_path)).value(); + ASSERT_NE(scene_gltf, nullptr); + SceneNode *output_scene_node = scene_gltf->GetNode(SceneNodeIndex(0)); + ASSERT_NE(output_scene_node, nullptr); + const TrsMatrix &output_trs_matrix = output_scene_node->GetTrsMatrix(); + ASSERT_FALSE(output_trs_matrix.MatrixSet()); + ASSERT_TRUE(output_trs_matrix.TranslationSet()); + ASSERT_FALSE(output_trs_matrix.RotationSet()); + ASSERT_FALSE(output_trs_matrix.ScaleSet()); +} + +// Tests that a scene can be encoded to buffer in GLB format. +TEST_F(GltfEncoderTest, EncodeToBuffer) { + // Load scene from file. + const std::string file_name = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + const std::unique_ptr scene = ReadSceneFromTestFile(file_name); + ASSERT_NE(scene, nullptr); + + // Encode scene to buffer in GLB format. + GltfEncoder encoder; + EncoderBuffer buffer; + DRACO_ASSERT_OK(encoder.EncodeToBuffer(*scene, &buffer)); + ASSERT_NE(buffer.size(), 0); + + // Write scene to file in GLB format. + const std::string glb_file_path = draco::GetTestTempFileFullPath("temp.glb"); + std::string folder_path; + std::string glb_file_name; + draco::SplitPath(glb_file_path, &folder_path, &glb_file_name); + encoder.EncodeToFile(*scene, glb_file_path, folder_path); + + // Check that the buffer contents match the GLB file contents. + ASSERT_EQ(buffer.size(), draco::GetFileSize(glb_file_path)); + std::vector file_data; + ASSERT_TRUE(ReadFileToBuffer(glb_file_path, &file_data)); + ASSERT_EQ(std::memcmp(file_data.data(), buffer.data(), buffer.size()), 0); +} + +// Tests that a scene with lights can be encoded into a file. +TEST_F(GltfEncoderTest, EncodeLights) { + const std::string file_name = "sphere_lights.gltf"; + const std::unique_ptr scene = ReadSceneFromTestFile(file_name); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumLights(), 4); + EncodeSceneToGltfAndCompare(scene.get()); +} + +// Helper method for adding mesh group GPU instancing to the milk truck scene. +draco::Status AddGpuInstancingToMilkTruck(draco::Scene *scene) { + // Create an instance and set its transformation TRS vectors. + draco::InstanceArray::Instance instance_0; + instance_0.trs.SetTranslation(Eigen::Vector3d(-0.2, 0.0, 0.0)); + instance_0.trs.SetScale(Eigen::Vector3d(1.0, 1.0, 1.0)); + + // Create another instance. + draco::InstanceArray::Instance instance_1; + instance_1.trs.SetTranslation(Eigen::Vector3d(1.0, 0.0, 0.0)); + instance_1.trs.SetScale(Eigen::Vector3d(2.0, 2.0, 2.0)); + + // Add an empty GPU instancing object to the scene. + const draco::InstanceArrayIndex index = scene->AddInstanceArray(); + draco::InstanceArray *gpu_instancing = scene->GetInstanceArray(index); + + // Add two instances to the GPU instancing object stored in the scene. + DRACO_RETURN_IF_ERROR(gpu_instancing->AddInstance(instance_0)); + DRACO_RETURN_IF_ERROR(gpu_instancing->AddInstance(instance_1)); + + // Assign the GPU instancing object to two mesh groups in two scene nodes. + scene->GetNode(draco::SceneNodeIndex(2))->SetInstanceArrayIndex(index); + scene->GetNode(draco::SceneNodeIndex(4))->SetInstanceArrayIndex(index); + + return draco::OkStatus(); +} + +// Tests that a scene with instance arrays can be encoded into a file. Decoder +// has no GPU instancing support, so we will compare encoded file to a golden +// file. +TEST_F(GltfEncoderTest, EncodeInstanceArrays) { + // Read the milk truck. + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + + // Add GPU instancing to the scene for testing. + DRACO_ASSERT_OK(AddGpuInstancingToMilkTruck(scene.get())); + ASSERT_EQ(scene->NumInstanceArrays(), 1); + ASSERT_EQ(scene->NumNodes(), 5); + + // Prepare file paths. + const std::string temp_path = draco::GetTestTempFileFullPath("Truck.glb"); + const std::string golden_path = + GetTestFileFullPath("CesiumRowingTruckWithGpuInstancing.glb"); + + // Encode scene to a temporary file in GLB format. + std::string folder; + std::string name; + draco::SplitPath(temp_path, &folder, &name); + GltfEncoder encoder; + ASSERT_TRUE(encoder.EncodeToFile(*scene, temp_path, folder)) + << "Failed to encode to temporary file:" << temp_path; + + // Read encoded file to buffer. + std::vector encoded_data; + ASSERT_TRUE(ReadFileToBuffer(temp_path, &encoded_data)); +} + +// Tests that a scene with materials variants can be encoded into a file. +TEST_F(GltfEncoderTest, EncodeMaterialsVariants) { + const std::string file_name = + "KhronosSampleModels/DragonAttenuation/glTF/DragonAttenuation.gltf"; + const std::unique_ptr scene = ReadSceneFromTestFile(file_name); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterialsVariants(), 2); + EncodeSceneToGltfAndCompare(scene.get()); +} + +// Tests encoding of draco::Scene to glTF with various mesh feature ID sets and +// structural metadata property table. +TEST_F(GltfEncoderTest, EncodeSceneWithMeshFeaturesWithStructuralMetadata) { + const std::string file_name = "BoxMeta/glTF/BoxMeta.gltf"; + constexpr bool kHasMeshFeatures = true; + constexpr bool kHasStructuralMetadata = true; + constexpr bool kHasDracoCompression = false; + + // Read test file from file. + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + // Encode the scene to glTF and decode it back to draco::Scene and check. + std::unique_ptr scene_from_gltf; + SceneToDecodedGltfScene(*scene, &scene_from_gltf); + ASSERT_NE(scene_from_gltf, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*scene_from_gltf, + kHasDracoCompression); + GltfTestHelper::CheckBoxMetaStructuralMetadata(*scene_from_gltf); +} + +// Tests encoding of draco::Scene with Draco compression to glTF with various +// mesh feature ID sets. +TEST_F(GltfEncoderTest, EncodeSceneWithMeshFeaturesWithDracoCompression) { + const std::string file_name = "BoxMetaDraco/glTF/BoxMetaDraco.gltf"; + constexpr bool kHasMeshFeatures = true; + constexpr bool kHasStructuralMetadata = false; + constexpr bool kHasDracoCompression = true; + + // Read test file from file. + const std::unique_ptr scene(DecodeTestGltfFileToScene(file_name)); + ASSERT_NE(scene, nullptr); + + // Encode the scene to glTF and decode it back to draco::Scene and check. + std::unique_ptr scene_from_gltf; + SceneToDecodedGltfScene(*scene, &scene_from_gltf); + ASSERT_NE(scene_from_gltf, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*scene_from_gltf, + kHasDracoCompression); +} + +// Tests encoding of draco::Mesh to glTF with various mesh feature ID sets and +// structural metadata property table. +TEST_F(GltfEncoderTest, EncodeMeshWithMeshFeaturesWithStructuralMetadata) { + const std::string file_name = "BoxMeta/glTF/BoxMeta.gltf"; + constexpr bool kHasDracoCompression = false; + + // Read test file from file. + const std::unique_ptr mesh(ReadMeshFromTestFile(file_name)); + ASSERT_NE(mesh, nullptr); + + // Encode the scene to glTF and decode it back to draco::Mesh and check. + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + ASSERT_NE(mesh_from_gltf, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*mesh_from_gltf, + kHasDracoCompression); + GltfTestHelper::CheckBoxMetaStructuralMetadata(*mesh_from_gltf); +} + +// Tests encoding of draco::Mesh with Draco compression to glTF with various +// mesh feature ID sets. +TEST_F(GltfEncoderTest, EncodeMeshWithMeshFeaturesWithDracoCompression) { + constexpr bool kHasDracoCompression = true; + const std::string file_name = "BoxMetaDraco/glTF/BoxMetaDraco.gltf"; + + // Read test file from file. + const std::unique_ptr mesh(ReadMeshFromTestFile(file_name)); + ASSERT_NE(mesh, nullptr); + + // Encode the scene to glTF and decode it back to draco::Mesh and check. + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + ASSERT_NE(mesh_from_gltf, nullptr); + GltfTestHelper::CheckBoxMetaMeshFeatures(*mesh_from_gltf, + kHasDracoCompression); +} + +// Tests encoding of draco::Mesh with mesh features associated with different +// mesh primitives. +TEST_F(GltfEncoderTest, EncodeMeshWithMeshFeaturesWithMultiplePrimitives) { + const std::string file_name = "BoxesMeta/glTF/BoxesMeta.gltf"; + + // Read test file from file. + const std::unique_ptr mesh(ReadMeshFromTestFile(file_name)); + ASSERT_NE(mesh, nullptr); + // All mesh features should share two textures. + ASSERT_EQ(mesh->GetNonMaterialTextureLibrary().NumTextures(), 2); + + // Encode the scene to glTF and decode it back to draco::Mesh and check. + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + ASSERT_NE(mesh_from_gltf, nullptr); + + ASSERT_EQ(mesh_from_gltf->GetMaterialLibrary().NumMaterials(), 2); + ASSERT_EQ(mesh_from_gltf->NumMeshFeatures(), 5); + + // First two mesh features should be used by material 0 and the reamining by + // material 1. + for (draco::MeshFeaturesIndex mfi(0); mfi < 5; ++mfi) { + // Each mesh feature should be used by a single material. + ASSERT_EQ(mesh_from_gltf->NumMeshFeaturesMaterialMasks(mfi), 1); + if (mfi.value() < 2) { + ASSERT_EQ(mesh_from_gltf->GetMeshFeaturesMaterialMask(mfi, 0), 0); + } else { + ASSERT_EQ(mesh_from_gltf->GetMeshFeaturesMaterialMask(mfi, 0), 1); + } + } + // All mesh features should share two textures. + ASSERT_EQ(mesh_from_gltf->GetNonMaterialTextureLibrary().NumTextures(), 2); + + // Ensure it still works correctly when we re-encode the source |mesh| as a + // scene. + std::unique_ptr scene_from_gltf; + MeshToDecodedGltfScene(*mesh, &scene_from_gltf); + ASSERT_NE(scene_from_gltf, nullptr); + + ASSERT_EQ(scene_from_gltf->NumMeshes(), 2); + + // First mesh should have 2 mesh features and the other one 3 mesh features. + ASSERT_EQ(scene_from_gltf->GetMesh(draco::MeshIndex(0)).NumMeshFeatures(), 2); + ASSERT_EQ(scene_from_gltf->GetMesh(draco::MeshIndex(1)).NumMeshFeatures(), 3); + + // All mesh features should share two textures. + ASSERT_EQ(scene_from_gltf->GetNonMaterialTextureLibrary().NumTextures(), 2); +} + +// Tests encoding of draco::Mesh containing a point cloud and two materials. +TEST_F(GltfEncoderTest, EncodePointCloudWithMaterials) { + const std::string file_name = + "SphereTwoMaterials/sphere_two_materials_point_cloud.gltf"; + + // Read test file from file. + const std::unique_ptr mesh(ReadMeshFromTestFile(file_name)); + ASSERT_NE(mesh, nullptr); + + // Input should have no faces. + ASSERT_EQ(mesh->num_faces(), 0); + + // There should be two materials + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 2); + + // Encode the mesh to glTF and decode it back to draco::Mesh and check. + std::unique_ptr mesh_from_gltf; + MeshToDecodedGltfMesh(*mesh, &mesh_from_gltf); + ASSERT_NE(mesh_from_gltf, nullptr); + + ASSERT_EQ(mesh_from_gltf->num_faces(), 0); + ASSERT_EQ(mesh_from_gltf->GetMaterialLibrary().NumMaterials(), 2); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/gltf_test_helper.cc b/contrib/draco/src/draco/io/gltf_test_helper.cc new file mode 100644 index 000000000..13cce6f4e --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_test_helper.cc @@ -0,0 +1,823 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/gltf_test_helper.h" + +#include +#include +#include +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/metadata/property_table.h" +#include "draco/texture/texture_library.h" + +namespace draco { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +void GltfTestHelper::AddBoxMetaMeshFeatures(Scene *scene) { + // Check the scene. + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 1); + TextureLibrary &texture_library = scene->GetNonMaterialTextureLibrary(); + ASSERT_EQ(texture_library.NumTextures(), 0); + + // Check the mesh. + Mesh &mesh = scene->GetMesh(MeshIndex(0)); + ASSERT_EQ(mesh.num_faces(), 12); + ASSERT_EQ(mesh.num_attributes(), 2); + ASSERT_EQ(mesh.num_points(), 24); + + // Get mesh element counts. + const int num_faces = mesh.num_faces(); + const int num_corners = 3 * mesh.num_faces(); + const int num_vertices = + mesh.GetNamedAttribute(GeometryAttribute::POSITION)->size(); + + // Add feature ID set with per-face Uint8 attribute named _FEATURE_ID_0. + { + // Create feature ID attribute. + constexpr DataType kType = DataType::DT_UINT8; + std::unique_ptr pa(new PointAttribute()); + pa->Init(GeometryAttribute::GENERIC, 1, kType, false, mesh.num_faces()); + for (AttributeValueIndex avi(0); avi < num_faces; ++avi) { + const int8_t val = avi.value(); + pa->SetAttributeValue(avi, &val); + } + const int att_id = mesh.AddPerFaceAttribute(std::move(pa)); + std::unique_ptr metadata(new AttributeMetadata()); + metadata->AddEntryString("attribute_name", "_FEATURE_ID_0"); + mesh.AddAttributeMetadata(att_id, std::move(metadata)); + + // Add feature ID set to the mesh. + std::unique_ptr features(new MeshFeatures()); + features->SetLabel("faces"); + features->SetFeatureCount(num_faces); + features->SetNullFeatureId(100); + features->SetPropertyTableIndex(0); + features->SetAttributeIndex(0); + mesh.AddMeshFeatures(std::move(features)); + } + + // Add feature ID set with per-vertex Uint16 attribute named _FEATURE_ID_1. + { + // Create feature ID attribute. + constexpr DataType kType = DataType::DT_UINT16; + std::unique_ptr pa(new PointAttribute()); + pa->Init(GeometryAttribute::GENERIC, 1, kType, false, num_vertices); + for (AttributeValueIndex avi(0); avi < num_vertices; ++avi) { + const uint16_t val = avi.value(); + pa->SetAttributeValue(avi, &val); + } + const int att_id = mesh.AddPerVertexAttribute(std::move(pa)); + std::unique_ptr metadata(new AttributeMetadata()); + metadata->AddEntryString("attribute_name", "_FEATURE_ID_1"); + mesh.AddAttributeMetadata(att_id, std::move(metadata)); + + // Add feature ID set to the mesh. + std::unique_ptr features(new MeshFeatures()); + features->SetLabel("vertices"); + features->SetFeatureCount(num_vertices); + features->SetNullFeatureId(101); + features->SetPropertyTableIndex(1); + features->SetAttributeIndex(1); + mesh.AddMeshFeatures(std::move(features)); + } + + // Add feature ID set with per-corner Float attribute named _FEATURE_ID_2. + { + // Create feature ID attribute. + constexpr DataType kType = DataType::DT_FLOAT32; + std::unique_ptr pa(new PointAttribute()); + pa->Init(GeometryAttribute::GENERIC, 1, kType, false, num_corners); + IndexTypeVector corner_to_value( + num_corners); + for (AttributeValueIndex avi(0); avi < num_corners; ++avi) { + const float val = avi.value(); + pa->SetAttributeValue(avi, &val); + corner_to_value[CornerIndex(avi.value())] = avi; + } + const int att_id = + mesh.AddAttributeWithConnectivity(std::move(pa), corner_to_value); + std::unique_ptr metadata(new AttributeMetadata()); + metadata->AddEntryString("attribute_name", "_FEATURE_ID_2"); + mesh.AddAttributeMetadata(att_id, std::move(metadata)); + + // Add feature ID set to the mesh. + std::unique_ptr features(new MeshFeatures()); + features->SetFeatureCount(num_corners); + features->SetAttributeIndex(2); + mesh.AddMeshFeatures(std::move(features)); + } + + // Add feature ID set with the IDs stored in the R texture channel and + // accessible via the first texture coordinate attribute. + { + // Add the first texture coordinate attribute. + constexpr DataType kType = DataType::DT_FLOAT32; + std::unique_ptr pa(new PointAttribute()); + pa->Init(GeometryAttribute::TEX_COORD, 2, kType, false, num_vertices); + std::vector> uv = { + {0.0000f, 0.0000f}, {0.0000f, 0.5000f}, {0.0000f, 1.0000f}, + {0.5000f, 0.0000f}, {0.5000f, 0.5000f}, {0.5000f, 1.0000f}, + {1.0000f, 0.0000f}, {1.0000f, 0.5000f}}; + for (AttributeValueIndex avi(0); avi < num_vertices; ++avi) { + const int index = avi.value(); + pa->SetAttributeValue(avi, uv[index].data()); + } + mesh.AddPerVertexAttribute(std::move(pa)); + } + + // Add feature ID set with the IDs stored in the GBA texture channels and + // accessible via the second texture coordinate attribute. + { + // Add the second texture coordinate attribute. + constexpr DataType kType = DataType::DT_FLOAT32; + std::unique_ptr pa(new PointAttribute()); + pa->Init(GeometryAttribute::TEX_COORD, 2, kType, false, num_vertices); + std::vector> uv = { + {0.0000f, 0.0000f}, {0.0000f, 0.5000f}, {0.0000f, 1.0000f}, + {0.5000f, 0.0000f}, {0.5000f, 0.5000f}, {0.5000f, 1.0000f}, + {1.0000f, 0.0000f}, {1.0000f, 0.5000f}}; + for (AttributeValueIndex avi(0); avi < num_vertices; ++avi) { + const int index = avi.value(); + pa->SetAttributeValue(avi, uv[index].data()); + } + mesh.AddPerVertexAttribute(std::move(pa)); + ASSERT_EQ(mesh.NumNamedAttributes(GeometryAttribute::TEX_COORD), 2); + } +} + +void GltfTestHelper::AddBoxMetaStructuralMetadata(Scene *scene) { + // Add structural metadata property table schema in the following JSON: + // "schema": { + // "id": "galaxy", + // "classes": { + // "planet": { + // "properties": { + // "color": { + // "componentType": "UINT8", + // "description": "The RGB color.", + // "required": true, + // "type": "VEC3" + // }, + // "name": { + // "description": "The name.", + // "required": true, + // "type": "STRING" + // } + // "sequence": { + // "description": "The number sequence.", + // "required": false, + // "type": "SCALAR" + // } + // } + // } + // }, + // "enums": { + // "classifications": { + // "description": "Classifications of planets.", + // "name": "classifications", + // "values": [ + // { "name": "Unspecified", "value": 0 }, + // { "name": "Gas Giant", "value": 1 }, + // { "name": "Waterworld", "value": 2 }, + // { "name": "Agriworld", "value": 3 }, + // { "name": "Ordnance", "value": 4 } + // ] + // } + // } + // } + typedef PropertyTable::Schema::Object Object; + PropertyTable::Schema schema; + Object &json = schema.json; + json.SetObjects().emplace_back("id", "galaxy"); + json.SetObjects().emplace_back("classes"); + json.SetObjects().back().SetObjects().emplace_back("planet"); + Object &planet = json.SetObjects().back().SetObjects().back(); + planet.SetObjects().emplace_back("properties"); + Object &properties = planet.SetObjects().back(); + + properties.SetObjects().emplace_back("color"); + Object &color = properties.SetObjects().back(); + color.SetObjects().emplace_back("componentType", "UINT8"); + color.SetObjects().emplace_back("description", "The RGB color."); + color.SetObjects().emplace_back("required", true); + color.SetObjects().emplace_back("type", "VEC3"); + + properties.SetObjects().emplace_back("name"); + Object &name = properties.SetObjects().back(); + name.SetObjects().emplace_back("description", "The name."); + name.SetObjects().emplace_back("required", true); + name.SetObjects().emplace_back("type", "STRING"); + + properties.SetObjects().emplace_back("sequence"); + Object &sequence = properties.SetObjects().back(); + sequence.SetObjects().emplace_back("description", "The number sequence."); + sequence.SetObjects().emplace_back("required", false); + sequence.SetObjects().emplace_back("type", "SCALAR"); + + json.SetObjects().emplace_back("enums"); + json.SetObjects().back().SetObjects().emplace_back("classifications"); + Object &classifications = json.SetObjects().back().SetObjects().back(); + classifications.SetObjects().emplace_back("description", + "Classifications of planets."); + classifications.SetObjects().emplace_back("name", "classifications"); + classifications.SetObjects().emplace_back("values"); + Object &values = classifications.SetObjects().back(); + + values.SetArray().emplace_back(); + values.SetArray().back().SetObjects().emplace_back("name", "Unspecified"); + values.SetArray().back().SetObjects().emplace_back("value", 0); + + values.SetArray().emplace_back(); + values.SetArray().back().SetObjects().emplace_back("name", "Gas Giant"); + values.SetArray().back().SetObjects().emplace_back("value", 1); + + values.SetArray().emplace_back(); + values.SetArray().back().SetObjects().emplace_back("name", "Waterworld"); + values.SetArray().back().SetObjects().emplace_back("value", 2); + + values.SetArray().emplace_back(); + values.SetArray().back().SetObjects().emplace_back("name", "Agriworld"); + values.SetArray().back().SetObjects().emplace_back("value", 3); + + values.SetArray().emplace_back(); + values.SetArray().back().SetObjects().emplace_back("name", "Ordnance"); + values.SetArray().back().SetObjects().emplace_back("value", 4); + + // Add property table schema to the scene. + scene->GetStructuralMetadata().SetPropertyTableSchema(schema); + + // Add structural metadata property table. + std::unique_ptr table(new PropertyTable()); + table->SetName("Galaxy far far away."); + table->SetClass("planet"); + table->SetCount(16); + + // Add property describing RGB color components of the planet class. + { + std::unique_ptr property( + new PropertyTable::Property()); + property->SetName("color"); + property->GetData().target = 34962; // ARRAY_BUFFER. + property->GetData().data = {94, 94, 194, // Tatooine + 94, 145, 161, // Corusant + 118, 171, 91, // Naboo + 103, 139, 178, // Alderaan + 83, 98, 154, // Dagobah + 91, 177, 175, // Mandalore + 190, 92, 108, // Corellia + 72, 69, 169, // Kamino + 154, 90, 101, // Kashyyyk + 174, 85, 175, // Dantooine + 184, 129, 96, // Hoth + 185, 91, 180, // Mustafar + 194, 150, 83, // Bespin + 204, 111, 134, // Yavin + 182, 90, 89, // Geonosis + 0, 0, 0}; // UNLABELED + table->AddProperty(std::move(property)); + } + + // Add property that describes names of the planet class. + { + std::unique_ptr property( + new PropertyTable::Property()); + property->SetName("name"); + property->GetData().target = 34963; // ELEMENT_ARRAY_BUFFER. + const std::string data = + "named_class:Tatooine" + "named_class:Corusant" + "named_class:Naboo" + "named_class:Alderaan" + "named_class:Dagobah" + "named_class:Mandalore" + "named_class:Corellia" + "named_class:Kamino" + "named_class:Kashyyyk" + "named_class:Dantooine" + "named_class:Hoth" + "named_class:Mustafar" + "named_class:Bespin" + "named_class:Yavin" + "named_class:Geonosis" + "UNLABELED"; + property->GetData().data.assign(data.begin(), data.end()); + property->GetStringOffsets().type = "UINT32"; + property->GetStringOffsets().data.target = 34963; // ELEMENT_ARRAY_BUFFER. + property->GetStringOffsets().data.data = {0, 0, 0, 0, // Tatooine + 20, 0, 0, 0, // Corusant + 40, 0, 0, 0, // Naboo + 57, 0, 0, 0, // Alderaan + 77, 0, 0, 0, // Dagobah + 96, 0, 0, 0, // Mandalore + 117, 0, 0, 0, // Corellia + 137, 0, 0, 0, // Kamino + 155, 0, 0, 0, // Kashyyyk + 175, 0, 0, 0, // Dantooine + 196, 0, 0, 0, // Hoth + 212, 0, 0, 0, // Mustafar + 232, 0, 0, 0, // Bespin + 250, 0, 0, 0, // Yavin + 12, 1, 0, 0, // Geonosis + 32, 1, 0, 0, // UNLABELED + 41, 1, 0, 0}; + table->AddProperty(std::move(property)); + } + + // Add property that contains variable-length number sequence of the planet + // class. + { + std::unique_ptr property( + new PropertyTable::Property()); + property->SetName("sequence"); + property->GetData().target = 34963; // ELEMENT_ARRAY_BUFFER. + const std::vector data = { + 0.5f, 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, // Tatooine + 6.5f, 7.5f, // Corusant + 8.5f, // Naboo + 9.5f, // Alderaan + 10.5f, 11.5f, // Dagobah + 12.5f, 13.5f, 14.5f, 15.5f, // Mandalore + 16.5f, 17.5f, // Corellia + 18.5f, 19.5f, // Kamino + 20.5f, 21.5f, 22.5f, // Kashyyyk + 23.5f, 24.5f, 25.5f, // Dantooine + 26.5f, 27.5f, // Hoth + 28.5f, 29.5f, // Mustafar + 30.5f, 31.5f, 32.5f, // Bespin + 33.5f, 34.5f, 35.5f, // Yavin + 36.5f, 37.5f, 38.5f, 39.5f, 40.5f // Geonosis + }; // UNLABELED (empty array). + property->GetData().data.resize(4 * data.size()); + memcpy(property->GetData().data.data(), data.data(), 4 * data.size()); + property->GetArrayOffsets().type = "UINT8"; + property->GetArrayOffsets().data.target = 34963; // ELEMENT_ARRAY_BUFFER. + property->GetArrayOffsets().data.data = { + 0 * 4, // Tatooine + 6 * 4, // Corusant + 8 * 4, // Naboo + 9 * 4, // Alderaan + 10 * 4, // Dagobah + 12 * 4, // Mandalore + 16 * 4, // Corellia + 18 * 4, // Kamino + 20 * 4, // Kashyyyk + 23 * 4, // Dantooine + 26 * 4, // Hoth + 28 * 4, // Mustafar + 30 * 4, // Bespin + 33 * 4, // Yavin + 36 * 4, // Geonosis + 41 * 4, // UNLABELED (empty array). + 41 * 4}; + table->AddProperty(std::move(property)); + } + + // Add property table to the scene. + scene->GetStructuralMetadata().AddPropertyTable(std::move(table)); +} + +template <> +void GltfTestHelper::CheckBoxMetaMeshFeatures(const Mesh &geometry, + bool has_draco_compression) { + CheckBoxMetaMeshFeatures(geometry, geometry.GetNonMaterialTextureLibrary(), + has_draco_compression); +} + +template <> +void GltfTestHelper::CheckBoxMetaMeshFeatures(const Scene &geometry, + bool has_draco_compression) { + ASSERT_EQ(geometry.NumMeshes(), 1); + CheckBoxMetaMeshFeatures(geometry.GetMesh(MeshIndex(0)), + geometry.GetNonMaterialTextureLibrary(), + has_draco_compression); +} + +void GltfTestHelper::CheckBoxMetaMeshFeatures(const Mesh &mesh, + const TextureLibrary &texture_lib, + bool has_draco_compression) { + // Check texture library. + ASSERT_EQ(texture_lib.NumTextures(), 2); + + // Check basic mesh properties. + ASSERT_EQ(mesh.NumMeshFeatures(), 5); + ASSERT_EQ(mesh.num_faces(), 12); + ASSERT_EQ(mesh.num_attributes(), 7); + ASSERT_EQ(mesh.num_points(), 36); + ASSERT_EQ(mesh.NumNamedAttributes(GeometryAttribute::GENERIC), 3); + ASSERT_EQ(mesh.NumNamedAttributes(GeometryAttribute::TEX_COORD), 2); + + // Get mesh element counts. + const int num_faces = mesh.num_faces(); + const int num_corners = 3 * mesh.num_faces(); + const int num_vertices = + mesh.GetNamedAttribute(GeometryAttribute::POSITION)->size(); + + // Check mesh feature ID set at index 0. + { + // Check mesh features. + const MeshFeatures &features = mesh.GetMeshFeatures(MeshFeaturesIndex(0)); + ASSERT_EQ(features.GetLabel(), "faces"); + ASSERT_EQ(features.GetFeatureCount(), num_faces); + ASSERT_EQ(features.GetNullFeatureId(), 100); + ASSERT_EQ(features.GetPropertyTableIndex(), 0); + ASSERT_EQ(features.GetAttributeIndex(), 0); + ASSERT_TRUE(features.GetTextureChannels().empty()); + ASSERT_EQ(features.GetTextureMap().texture(), nullptr); + ASSERT_EQ(features.GetTextureMap().tex_coord_index(), -1); + + // Check per-face Uint8 attribute named _FEATURE_ID_0. + const int att_id = + mesh.GetAttributeIdByMetadataEntry("attribute_name", "_FEATURE_ID_0"); + auto att = mesh.GetAttributeByUniqueId(att_id); + ASSERT_NE(att, nullptr); + ASSERT_EQ(att->attribute_type(), GeometryAttribute::GENERIC); + ASSERT_EQ(att->data_type(), DataType::DT_UINT8); + ASSERT_EQ(att->num_components(), 1); + ASSERT_EQ(att->size(), num_faces); + ASSERT_EQ(att->indices_map_size(), num_corners); + + // Check that the values are all the numbers from 0 to 12. + const std::vector expected_values = + has_draco_compression + ? std::vector{7, 11, 10, 3, 2, 5, 4, 1, 6, 9, 8, 0} + : std::vector{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; + for (int i = 0; i < num_faces; i++) { + uint8_t val; + att->GetValue(AttributeValueIndex(i), &val); + ASSERT_EQ(val, expected_values[i]); + } + + // Check that the corners of each face have a common value. + for (int i = 0; i < num_faces; i++) { + const auto face = mesh.face(FaceIndex(i)); + ASSERT_EQ(*att->GetAddressOfMappedIndex(face[0]), + *att->GetAddressOfMappedIndex(face[1])); + ASSERT_EQ(*att->GetAddressOfMappedIndex(face[0]), + *att->GetAddressOfMappedIndex(face[2])); + } + } + + // Check the 2nd mesh feature ID set at index 1. + { + // Check mesh features. + const MeshFeatures &features = mesh.GetMeshFeatures(MeshFeaturesIndex(1)); + ASSERT_EQ(features.GetLabel(), "vertices"); + ASSERT_EQ(features.GetFeatureCount(), num_vertices); + ASSERT_EQ(features.GetNullFeatureId(), 101); + ASSERT_EQ(features.GetPropertyTableIndex(), 1); + ASSERT_EQ(features.GetAttributeIndex(), 1); + ASSERT_TRUE(features.GetTextureChannels().empty()); + ASSERT_EQ(features.GetTextureMap().texture(), nullptr); + ASSERT_EQ(features.GetTextureMap().tex_coord_index(), -1); + + // Check per-vertex Uint16 attribute named _FEATURE_ID_1. + const int att_id = + mesh.GetAttributeIdByMetadataEntry("attribute_name", "_FEATURE_ID_1"); + auto att = mesh.GetAttributeByUniqueId(att_id); + ASSERT_NE(att, nullptr); + ASSERT_EQ(att->attribute_type(), GeometryAttribute::GENERIC); + ASSERT_EQ(att->data_type(), DataType::DT_UINT16); + ASSERT_EQ(att->num_components(), 1); + ASSERT_EQ(att->size(), num_vertices); + ASSERT_EQ(att->indices_map_size(), num_corners); + + // Check that the values are all the numbers from 0 to 7. + const std::vector expected_values = + has_draco_compression ? std::vector{3, 6, 7, 4, 5, 0, 1, 2} + : std::vector{0, 1, 2, 3, 4, 5, 6, 7}; + for (int i = 0; i < num_vertices; i++) { + uint16_t val; + att->GetValue(AttributeValueIndex(i), &val); + ASSERT_EQ(val, expected_values[i]); + } + + // Check that the corners of a face have unique values. + for (int i = 0; i < num_faces; i++) { + const auto face = mesh.face(FaceIndex(i)); + ASSERT_NE(*att->GetAddressOfMappedIndex(face[0]), + *att->GetAddressOfMappedIndex(face[1])); + ASSERT_NE(*att->GetAddressOfMappedIndex(face[1]), + *att->GetAddressOfMappedIndex(face[2])); + ASSERT_NE(*att->GetAddressOfMappedIndex(face[2]), + *att->GetAddressOfMappedIndex(face[0])); + } + } + + // Check the 3rd mesh feature ID set at index 2. + { + // Check mesh features. + const MeshFeatures &features = mesh.GetMeshFeatures(MeshFeaturesIndex(2)); + ASSERT_TRUE(features.GetLabel().empty()); + ASSERT_EQ(features.GetFeatureCount(), num_corners); + ASSERT_EQ(features.GetNullFeatureId(), -1); + ASSERT_EQ(features.GetPropertyTableIndex(), -1); + ASSERT_EQ(features.GetAttributeIndex(), 2); + ASSERT_TRUE(features.GetTextureChannels().empty()); + ASSERT_EQ(features.GetTextureMap().texture(), nullptr); + ASSERT_EQ(features.GetTextureMap().tex_coord_index(), -1); + + // Check per-corner Float attribute named _FEATURE_ID_2. + const int att_id = + mesh.GetAttributeIdByMetadataEntry("attribute_name", "_FEATURE_ID_2"); + auto att = mesh.GetAttributeByUniqueId(att_id); + ASSERT_NE(att, nullptr); + ASSERT_EQ(att->attribute_type(), GeometryAttribute::GENERIC); + ASSERT_EQ(att->data_type(), DataType::DT_FLOAT32); + ASSERT_EQ(att->num_components(), 1); + ASSERT_EQ(att->size(), num_corners); + ASSERT_EQ(att->indices_map_size(), 0); + ASSERT_TRUE(att->is_mapping_identity()); + + // Check that the values are from 0 to 35. + const std::vector expected_values = + has_draco_compression + ? std::vector{23, 21, 22, 33, 34, 35, 31, 32, 30, 9, 10, 11, + 7, 8, 6, 15, 16, 17, 14, 12, 13, 5, 3, 4, + 19, 20, 18, 27, 28, 29, 26, 24, 25, 1, 2, 0} + : std::vector{0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35}; + for (int i = 0; i < num_corners; i++) { + float val; + att->GetValue(AttributeValueIndex(i), &val); + ASSERT_EQ(val, expected_values[i]); + } + + // Check that the corners have unique values. + for (int i = 0; i < num_faces; i++) { + const auto face = mesh.face(FaceIndex(i)); + float v0, v1, v2; + att->GetMappedValue(face[0], &v0); + att->GetMappedValue(face[1], &v1); + att->GetMappedValue(face[2], &v2); + ASSERT_EQ(v0, expected_values[3 * i + 0]); + ASSERT_EQ(v1, expected_values[3 * i + 1]); + ASSERT_EQ(v2, expected_values[3 * i + 2]); + } + } + + // Check mesh feature ID set at index 3. + { + // Check mesh features. + const MeshFeatures &features = mesh.GetMeshFeatures(MeshFeaturesIndex(3)); + ASSERT_TRUE(features.GetLabel().empty()); + ASSERT_EQ(features.GetFeatureCount(), 6); + ASSERT_EQ(features.GetNullFeatureId(), -1); + ASSERT_EQ(features.GetPropertyTableIndex(), -1); + ASSERT_EQ(features.GetAttributeIndex(), -1); + } + + // Check mesh feature ID set at index 4. + { + // Check mesh features. + const MeshFeatures &features = mesh.GetMeshFeatures(MeshFeaturesIndex(4)); + ASSERT_EQ(features.GetLabel(), "water"); + ASSERT_EQ(features.GetFeatureCount(), 2); + ASSERT_EQ(features.GetNullFeatureId(), -1); + ASSERT_EQ(features.GetPropertyTableIndex(), -1); + ASSERT_EQ(features.GetAttributeIndex(), -1); + } +} + +void GltfTestHelper::CheckBoxMetaStructuralMetadata( + const StructuralMetadata &structural_metadata) { + // Check property table schema. + { + const PropertyTable::Schema &schema = + structural_metadata.GetPropertyTableSchema(); + ASSERT_FALSE(schema.Empty()); + const PropertyTable::Schema::Object &json = schema.json; + ASSERT_EQ(json.GetObjects().size(), 3); + ASSERT_EQ(json.GetObjects()[0].GetName(), "classes"); + ASSERT_EQ(json.GetObjects()[0].GetObjects().size(), 1); + ASSERT_EQ(json.GetObjects()[0].GetObjects()[0].GetName(), "planet"); + ASSERT_EQ(json.GetObjects()[0].GetObjects()[0].GetObjects().size(), 1); + + const auto &properties = + json.GetObjects()[0].GetObjects()[0].GetObjects()[0]; + ASSERT_EQ(properties.GetName(), "properties"); + ASSERT_EQ(properties.GetObjects().size(), 3); + + const auto &color = properties.GetObjects()[0]; + ASSERT_EQ(color.GetName(), "color"); + ASSERT_EQ(color.GetObjects().size(), 4); + ASSERT_EQ(color.GetObjects()[0].GetName(), "componentType"); + ASSERT_EQ(color.GetObjects()[1].GetName(), "description"); + ASSERT_EQ(color.GetObjects()[2].GetName(), "required"); + ASSERT_EQ(color.GetObjects()[3].GetName(), "type"); + ASSERT_EQ(color.GetObjects()[0].GetString(), "UINT8"); + ASSERT_EQ(color.GetObjects()[1].GetString(), "The RGB color."); + ASSERT_TRUE(color.GetObjects()[2].GetBoolean()); + ASSERT_EQ(color.GetObjects()[3].GetString(), "VEC3"); + + const auto &name = properties.GetObjects()[1]; + ASSERT_EQ(name.GetName(), "name"); + ASSERT_EQ(name.GetObjects().size(), 3); + ASSERT_EQ(name.GetObjects()[0].GetName(), "description"); + ASSERT_EQ(name.GetObjects()[1].GetName(), "required"); + ASSERT_EQ(name.GetObjects()[2].GetName(), "type"); + ASSERT_EQ(name.GetObjects()[0].GetString(), "The name."); + ASSERT_TRUE(name.GetObjects()[1].GetBoolean()); + ASSERT_EQ(name.GetObjects()[2].GetString(), "STRING"); + + const auto &sequence = properties.GetObjects()[2]; + ASSERT_EQ(sequence.GetName(), "sequence"); + ASSERT_EQ(sequence.GetObjects().size(), 3); + ASSERT_EQ(sequence.GetObjects()[0].GetName(), "description"); + ASSERT_EQ(sequence.GetObjects()[1].GetName(), "required"); + ASSERT_EQ(sequence.GetObjects()[2].GetName(), "type"); + ASSERT_EQ(sequence.GetObjects()[0].GetString(), "The number sequence."); + ASSERT_FALSE(sequence.GetObjects()[1].GetBoolean()); + ASSERT_EQ(sequence.GetObjects()[2].GetString(), "SCALAR"); + + ASSERT_EQ(json.GetObjects()[1].GetName(), "enums"); + const auto &classifications = json.GetObjects()[1].GetObjects()[0]; + ASSERT_EQ(classifications.GetName(), "classifications"); + ASSERT_EQ(classifications.GetObjects()[0].GetName(), "description"); + ASSERT_EQ(classifications.GetObjects()[0].GetString(), + "Classifications of planets."); + ASSERT_EQ(classifications.GetObjects()[1].GetName(), "name"); + ASSERT_EQ(classifications.GetObjects()[1].GetString(), "classifications"); + ASSERT_EQ(classifications.GetObjects()[2].GetName(), "values"); + const auto &values = classifications.GetObjects()[2]; + ASSERT_EQ(values.GetArray()[0].GetObjects()[0].GetName(), "name"); + ASSERT_EQ(values.GetArray()[1].GetObjects()[0].GetName(), "name"); + ASSERT_EQ(values.GetArray()[2].GetObjects()[0].GetName(), "name"); + ASSERT_EQ(values.GetArray()[3].GetObjects()[0].GetName(), "name"); + ASSERT_EQ(values.GetArray()[4].GetObjects()[0].GetName(), "name"); + ASSERT_EQ(values.GetArray()[0].GetObjects()[0].GetString(), "Unspecified"); + ASSERT_EQ(values.GetArray()[1].GetObjects()[0].GetString(), "Gas Giant"); + ASSERT_EQ(values.GetArray()[2].GetObjects()[0].GetString(), "Waterworld"); + ASSERT_EQ(values.GetArray()[3].GetObjects()[0].GetString(), "Agriworld"); + ASSERT_EQ(values.GetArray()[4].GetObjects()[0].GetString(), "Ordnance"); + ASSERT_EQ(values.GetArray()[0].GetObjects()[1].GetName(), "value"); + ASSERT_EQ(values.GetArray()[1].GetObjects()[1].GetName(), "value"); + ASSERT_EQ(values.GetArray()[2].GetObjects()[1].GetName(), "value"); + ASSERT_EQ(values.GetArray()[3].GetObjects()[1].GetName(), "value"); + ASSERT_EQ(values.GetArray()[4].GetObjects()[1].GetName(), "value"); + ASSERT_EQ(values.GetArray()[0].GetObjects()[1].GetInteger(), 0); + ASSERT_EQ(values.GetArray()[1].GetObjects()[1].GetInteger(), 1); + ASSERT_EQ(values.GetArray()[2].GetObjects()[1].GetInteger(), 2); + ASSERT_EQ(values.GetArray()[3].GetObjects()[1].GetInteger(), 3); + ASSERT_EQ(values.GetArray()[4].GetObjects()[1].GetInteger(), 4); + + ASSERT_EQ(json.GetObjects()[2].GetName(), "id"); + ASSERT_EQ(json.GetObjects()[2].GetString(), "galaxy"); + } + + // Check property table. + constexpr int kRows = 16; + ASSERT_EQ(structural_metadata.NumPropertyTables(), 1); + const PropertyTable &table = structural_metadata.GetPropertyTable(0); + ASSERT_EQ(table.GetName(), "Galaxy far far away."); + ASSERT_EQ(table.GetClass(), "planet"); + ASSERT_EQ(table.GetCount(), kRows); + ASSERT_EQ(table.NumProperties(), 3); + + // Check property that describes RGB color components of the planet class. + { + const PropertyTable::Property &property = table.GetProperty(0); + ASSERT_EQ(property.GetName(), "color"); + + ASSERT_EQ(property.GetData().data.size(), kRows * 3); // RGB components. + ASSERT_EQ(property.GetData().target, 34962); // ARRAY_BUFFER. + + ASSERT_EQ(property.GetData().data[0], 94); // Tatooine [94, 94, 194]. + ASSERT_EQ(property.GetData().data[1], 94); + ASSERT_EQ(property.GetData().data[2], 194); + ASSERT_EQ(property.GetData().data[18], 190); // Corellia [190, 92, 108]. + ASSERT_EQ(property.GetData().data[19], 92); + ASSERT_EQ(property.GetData().data[20], 108); + ASSERT_EQ(property.GetData().data[45], 0); // UNLABELED [0, 0, 0]. + ASSERT_EQ(property.GetData().data[46], 0); + ASSERT_EQ(property.GetData().data[47], 0); + + ASSERT_TRUE(property.GetArrayOffsets().type.empty()); + ASSERT_TRUE(property.GetArrayOffsets().data.data.empty()); + ASSERT_EQ(property.GetArrayOffsets().data.target, 0); + ASSERT_TRUE(property.GetStringOffsets().type.empty()); + ASSERT_TRUE(property.GetStringOffsets().data.data.empty()); + ASSERT_EQ(property.GetStringOffsets().data.target, 0); + } + + // Check property that describes names of the planet class. + { + const PropertyTable::Property &property = table.GetProperty(1); + ASSERT_EQ(property.GetName(), "name"); + const std::vector &data = property.GetData().data; + const std::vector &offsets = property.GetStringOffsets().data.data; + + ASSERT_EQ(data.size(), 296); // Concatenated label strings. + ASSERT_EQ(property.GetData().target, 34963); // ELEMENT_ARRAY_BUFFER. + + ASSERT_EQ(property.GetStringOffsets().type, "UINT32"); + ASSERT_EQ(offsets.size(), 4 * (kRows + 1)); + ASSERT_EQ(property.GetStringOffsets().data.target, 34963); + + ASSERT_EQ(offsets[0], 0); // Tatooine 0. + ASSERT_EQ(offsets[1], 0); + ASSERT_EQ(offsets[2], 0); + ASSERT_EQ(offsets[3], 0); + ASSERT_EQ(offsets[60], 32); // UNLABELED 287. + ASSERT_EQ(offsets[61], 1); + ASSERT_EQ(offsets[62], 0); + ASSERT_EQ(offsets[63], 0); + ASSERT_EQ(offsets[64], 41); // Beyond UNLABELED 296. + ASSERT_EQ(offsets[65], 1); + ASSERT_EQ(offsets[66], 0); + ASSERT_EQ(offsets[67], 0); + + struct Name { + static std::string Extract(const std::vector &data, + const std::vector &offsets, int row) { + const int b = offsets[4 * (row + 0)] + 255 * offsets[4 * (row + 0) + 1]; + const int e = offsets[4 * (row + 1)] + 255 * offsets[4 * (row + 1) + 1]; + return std::string(data.begin() + b, data.begin() + e); + } + }; + + // Check that the names can be extracted from the data. + ASSERT_EQ(Name::Extract(data, offsets, 0), "named_class:Tatooine"); + ASSERT_EQ(Name::Extract(data, offsets, 6), "named_class:Corellia"); + ASSERT_EQ(Name::Extract(data, offsets, 15), "UNLABELED"); + + ASSERT_TRUE(property.GetArrayOffsets().type.empty()); + ASSERT_TRUE(property.GetArrayOffsets().data.data.empty()); + ASSERT_EQ(property.GetArrayOffsets().data.target, 0); + } + + // Check property that describes number sequence of the planet class. + { + const PropertyTable::Property &property = table.GetProperty(2); + ASSERT_EQ(property.GetName(), "sequence"); + const std::vector &data = property.GetData().data; + const std::vector &offsets = property.GetArrayOffsets().data.data; + + ASSERT_EQ(data.size(), 41 * 4); // Concatenated float arrays. + ASSERT_EQ(property.GetData().target, 34963); // ELEMENT_ARRAY_BUFFER. + + ASSERT_EQ(property.GetArrayOffsets().type, "UINT8"); + ASSERT_EQ(offsets.size(), 20); // kRows + 1 + padding. + ASSERT_EQ(property.GetArrayOffsets().data.target, 34963); + + ASSERT_EQ(offsets[0], 0 * 4); // Tatooine + ASSERT_EQ(offsets[1], 6 * 4); // Corusant + ASSERT_EQ(offsets[6], 16 * 4); // Corellia + ASSERT_EQ(offsets[14], 36 * 4); // Geonosis + ASSERT_EQ(offsets[15], 41 * 4); // UNLABELED (empty array). + ASSERT_EQ(offsets[16], 41 * 4); // Beyond UNLABELED (empty array). + + struct Sequence { + static std::vector Extract(const std::vector &data, + const std::vector &offsets, + int row) { + const int n = (offsets[row + 1] - offsets[row]) / 4; + std::vector result; + result.reserve(n); + for (int i = 0; i < n; ++i) { + const void *const pointer = &data[offsets[row] + 4 * i]; + result.push_back(*static_cast(pointer)); + } + return result; + } + }; + + // Check that the number sequence arrays can be extracted from the data. + ASSERT_EQ( + Sequence::Extract(data, offsets, 0), + (std::vector{0.5f, 1.5f, 2.5f, 3.5f, 4.5f, 5.5f})); // Tatooine + ASSERT_EQ(Sequence::Extract(data, offsets, 1), + (std::vector{6.5f, 7.5f})); // Corusant + ASSERT_EQ( + Sequence::Extract(data, offsets, 14), + (std::vector{36.5f, 37.5f, 38.5f, 39.5f, 40.5f})); // Geonosis + ASSERT_TRUE(Sequence::Extract(data, offsets, 15) + .empty()); // UNLABELED (empty array). + + ASSERT_TRUE(property.GetStringOffsets().type.empty()); + ASSERT_TRUE(property.GetStringOffsets().data.data.empty()); + ASSERT_EQ(property.GetStringOffsets().data.target, 0); + } +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace draco diff --git a/contrib/draco/src/draco/io/gltf_test_helper.h b/contrib/draco/src/draco/io/gltf_test_helper.h new file mode 100644 index 000000000..91aec9b08 --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_test_helper.h @@ -0,0 +1,61 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_GLTF_DECODER_TEST_HELPER_H_ +#define DRACO_IO_GLTF_DECODER_TEST_HELPER_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/scene/scene.h" + +namespace draco { + +// Helper class for testing Draco glTF encoder and decoder. +class GltfTestHelper { + public: + // Adds various mesh feature ID sets (via attributes and via textures) and + // structural metadata property table and property table schema to the box + // |scene| loaded from the test file testdata/Box/glTF/Box.gltf. + static void AddBoxMetaMeshFeatures(Scene *scene); + static void AddBoxMetaStructuralMetadata(Scene *scene); + + // Checks the box |geometry| (draco::Mesh or draco::Scene) with mesh features + // loaded from one of these test files, with or without Draco compression: + // 1. testdata/BoxMeta/glTF/BoxMeta.gltf + // 2. testdata/BoxMetaDraco/glTF/BoxMetaDraco.gltf + template + static void CheckBoxMetaMeshFeatures(const GeometryT &geometry, + bool has_draco_compression); + + // Checks the box |geometry| (draco::Mesh or draco::Scene) with structural + // metadata that includes property table and property table schema loaded from + // test file testdata/BoxMeta/glTF/BoxMeta.gltf. + template + static void CheckBoxMetaStructuralMetadata(const GeometryT &geometry) { + CheckBoxMetaStructuralMetadata(geometry.GetStructuralMetadata()); + } + + private: + static void CheckBoxMetaMeshFeatures(const Mesh &mesh, + const TextureLibrary &texture_lib, + bool has_draco_compression); + static void CheckBoxMetaStructuralMetadata( + const StructuralMetadata &structural_metadata); +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_GLTF_DECODER_TEST_HELPER_H_ diff --git a/contrib/draco/src/draco/io/gltf_utils.cc b/contrib/draco/src/draco/io/gltf_utils.cc new file mode 100644 index 000000000..bf5c048ef --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_utils.cc @@ -0,0 +1,154 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/gltf_utils.h" + +#include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED +namespace draco { + +std::ostream &operator<<(std::ostream &os, const GltfValue &value) { + if (value.type_ == GltfValue::INT) { + os << value.value_int_; + } else { + os << value.value_double_; + } + return os; +} + +Indent::Indent() : indent_space_count_(2) {} + +void Indent::Increase() { indent_ += std::string(indent_space_count_, ' '); } + +void Indent::Decrease() { indent_.erase(0, indent_space_count_); } + +std::ostream &operator<<(std::ostream &os, const Indent &indent) { + return os << indent.indent_; +} + +std::ostream &operator<<(std::ostream &os, + const JsonWriter::IndentWrapper &indent) { + if (indent.writer.mode_ == JsonWriter::READABLE) { + os << indent.writer.indent_writer_; + } + return os; +} + +std::ostream &operator<<(std::ostream &os, + const JsonWriter::Separator &separator) { + if (separator.writer.mode_ == JsonWriter::READABLE) { + os << " "; + } + return os; +} + +void JsonWriter::Reset() { + last_type_ = START; + o_.clear(); + o_.str(""); +} + +void JsonWriter::BeginObject() { BeginObject(""); } + +void JsonWriter::BeginObject(const std::string &name) { + FinishPreviousLine(BEGIN); + o_ << indent_; + if (!name.empty()) { + o_ << "\"" << name << "\":" << separator_; + } + o_ << "{"; + indent_writer_.Increase(); +} + +void JsonWriter::EndObject() { + FinishPreviousLine(END); + indent_writer_.Decrease(); + o_ << indent_ << "}"; +} + +void JsonWriter::BeginArray(const std::string &name) { + FinishPreviousLine(BEGIN); + o_ << indent_ << "\"" << name << "\":" << separator_ << "["; + indent_writer_.Increase(); +} + +void JsonWriter::EndArray() { + FinishPreviousLine(END); + indent_writer_.Decrease(); + o_ << indent_ << "]"; +} + +void JsonWriter::FinishPreviousLine(OutputType curr_type) { + if (last_type_ != START) { + if ((last_type_ == VALUE && curr_type == VALUE) || + (last_type_ == VALUE && curr_type == BEGIN) || + (last_type_ == END && curr_type == BEGIN) || + (last_type_ == END && curr_type == VALUE)) { + o_ << ","; + } + if (mode_ == READABLE) { + o_ << std::endl; + } + } + last_type_ = curr_type; +} + +std::string JsonWriter::MoveData() { + const std::string str = o_.str(); + o_.str(""); + return str; +} + +std::string JsonWriter::EscapeCharacter(const std::string &str, + const char character) { + size_t start = 0; + if ((start = str.find(character, start)) != std::string::npos) { + std::string s = str; + std::string escaped_character = "\\"; + escaped_character += character; + do { + s.replace(start, 1, escaped_character); + start += escaped_character.length(); + } while ((start = s.find(character, start)) != std::string::npos); + return s; + } + return str; +} + +std::string JsonWriter::EscapeJsonSpecialCharacters(const std::string &str) { + std::string s = str; + const char backspace = '\b'; + const char form_feed = '\f'; + const char newline = '\n'; + const char carriage_return = '\r'; + const char tab = '\t'; + const char double_quote = '\"'; + const char backslash = '\\'; + + // Backslash must come first. + s = EscapeCharacter(s, backslash); + s = EscapeCharacter(s, backspace); + s = EscapeCharacter(s, form_feed); + s = EscapeCharacter(s, newline); + s = EscapeCharacter(s, carriage_return); + s = EscapeCharacter(s, tab); + s = EscapeCharacter(s, double_quote); + return s; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/gltf_utils.h b/contrib/draco/src/draco/io/gltf_utils.h new file mode 100644 index 000000000..2cf12fdc7 --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_utils.h @@ -0,0 +1,186 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_GLTF_UTILS_H_ +#define DRACO_IO_GLTF_UTILS_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include + +namespace draco { + +// Class used to store integer or float values supported by glTF. +class GltfValue { + public: + enum ValueType { INT, DOUBLE }; + + explicit GltfValue(int8_t value) + : type_(INT), value_int_(value), value_double_(-1.0) {} + + explicit GltfValue(uint8_t value) + : type_(INT), value_int_(value), value_double_(-1.0) {} + + explicit GltfValue(int16_t value) + : type_(INT), value_int_(value), value_double_(-1.0) {} + + explicit GltfValue(uint16_t value) + : type_(INT), value_int_(value), value_double_(-1.0) {} + + explicit GltfValue(uint32_t value) + : type_(INT), value_int_(value), value_double_(-1.0) {} + + explicit GltfValue(float value) + : type_(DOUBLE), value_int_(-1), value_double_(value) {} + + friend std::ostream &operator<<(std::ostream &os, const GltfValue &value); + + private: + ValueType type_; + int64_t value_int_; + double value_double_; +}; + +// Utility class used to help with indentation of glTF file. +class Indent { + public: + Indent(); + + void Increase(); + void Decrease(); + + friend std::ostream &operator<<(std::ostream &os, const Indent &indent); + + private: + // Variables used for spacing of the glTF file. + std::string indent_; + const int indent_space_count_; +}; + +// Class used to keep track of the json state. +class JsonWriter { + public: + enum OutputType { START, BEGIN, END, VALUE }; + enum Mode { READABLE, COMPACT }; + + JsonWriter() + : last_type_(START), mode_(READABLE), indent_(*this), separator_(*this) {} + void SetMode(Mode mode) { mode_ = mode; } + + // Clear the stringstream and set last type to START. + void Reset(); + + // Every call to BeginObject should have a matching call to EndObject. + void BeginObject(); + void BeginObject(const std::string &name); + void EndObject(); + + // Every call to BeginArray should have a matching call to EndArray. + void BeginArray(const std::string &name); + void EndArray(); + + template + void OutputValue(const T &value) { + FinishPreviousLine(VALUE); + o_ << indent_ << std::setprecision(17) << value; + } + + void OutputValue(const bool &value) { + FinishPreviousLine(VALUE); + o_ << indent_ << ToString(value); + } + + void OutputValue(const std::string &name) { + const std::string escaped_name = EscapeJsonSpecialCharacters(name); + FinishPreviousLine(VALUE); + o_ << indent_ << "\"" << escaped_name << "\""; + } + + void OutputValue(const std::string &name, const std::string &value) { + const std::string escaped_name = EscapeJsonSpecialCharacters(name); + const std::string escaped_value = EscapeJsonSpecialCharacters(value); + FinishPreviousLine(VALUE); + o_ << indent_ << "\"" << escaped_name << "\":" << separator_ << "\"" + << escaped_value << "\""; + } + + void OutputValue(const std::string &name, const char *value) { + const std::string escaped_name = EscapeJsonSpecialCharacters(name); + const std::string escaped_value = EscapeJsonSpecialCharacters(value); + FinishPreviousLine(VALUE); + o_ << indent_ << "\"" << escaped_name << "\":" << separator_ << "\"" + << escaped_value << "\""; + } + + template + void OutputValue(const std::string &name, const T &value) { + const std::string escaped_name = EscapeJsonSpecialCharacters(name); + FinishPreviousLine(VALUE); + o_ << indent_ << "\"" << escaped_name << "\":" << separator_ << value; + } + + void OutputValue(const std::string &name, const bool &value) { + const std::string escaped_name = EscapeJsonSpecialCharacters(name); + FinishPreviousLine(VALUE); + o_ << indent_ << "\"" << escaped_name << "\":" << separator_ + << ToString(value); + } + + // Return the current output and then clear the stringstream. + std::string MoveData(); + + private: + // Check if a comma needs to be added to the output and then add a new line. + void FinishPreviousLine(OutputType curr_type); + + // Returns a string escaping all instances of |character| in |str|. + std::string EscapeCharacter(const std::string &str, const char character); + + // Returns a string escaping all of the Json special characters in |str|. + // Carriage return is not handled. + std::string EscapeJsonSpecialCharacters(const std::string &str); + + // Returns string representation of a Boolean |value|. + static std::string ToString(bool value) { return value ? "true" : "false"; } + + // Helper struct used for conditional indent writing to the output stream. + struct IndentWrapper { + explicit IndentWrapper(const JsonWriter &writer) : writer(writer) {} + const JsonWriter &writer; + }; + friend std::ostream &operator<<(std::ostream &os, + const IndentWrapper &indent); + + // Helper struct used for conditional separator writing to the output stream. + struct Separator { + explicit Separator(const JsonWriter &writer) : writer(writer) {} + const JsonWriter &writer; + }; + friend std::ostream &operator<<(std::ostream &os, const Separator &separator); + + std::stringstream o_; + Indent indent_writer_; + OutputType last_type_; + Mode mode_; + IndentWrapper indent_; + Separator separator_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_GLTF_UTILS_H_ diff --git a/contrib/draco/src/draco/io/gltf_utils_test.cc b/contrib/draco/src/draco/io/gltf_utils_test.cc new file mode 100644 index 000000000..01a2d144c --- /dev/null +++ b/contrib/draco/src/draco/io/gltf_utils_test.cc @@ -0,0 +1,366 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/gltf_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace draco { + +class GltfUtilsTest : public ::testing::Test { + protected: + void CompareGolden(JsonWriter *json_writer, const std::string &golden_str) { + const std::string json = json_writer->MoveData(); + ASSERT_EQ(golden_str, json); + } +}; + +TEST_F(GltfUtilsTest, TestNoData) { + const std::string golden = ""; + JsonWriter json_writer; + CompareGolden(&json_writer, golden); +} + +TEST_F(GltfUtilsTest, TestValues) { + JsonWriter json_writer; + json_writer.OutputValue(0); + CompareGolden(&json_writer, "0"); + + json_writer.Reset(); + json_writer.OutputValue(1); + CompareGolden(&json_writer, "1"); + + json_writer.Reset(); + json_writer.OutputValue(-1); + CompareGolden(&json_writer, "-1"); + + json_writer.Reset(); + json_writer.OutputValue(0.0); + CompareGolden(&json_writer, "0"); + + json_writer.Reset(); + json_writer.OutputValue(1.0); + CompareGolden(&json_writer, "1"); + + json_writer.Reset(); + json_writer.OutputValue(0.25); + CompareGolden(&json_writer, "0.25"); + + json_writer.Reset(); + json_writer.OutputValue(-0.25); + CompareGolden(&json_writer, "-0.25"); + + json_writer.Reset(); + json_writer.OutputValue(false); + CompareGolden(&json_writer, "false"); + + json_writer.Reset(); + json_writer.OutputValue(true); + CompareGolden(&json_writer, "true"); + + json_writer.Reset(); + json_writer.OutputValue("test int", -1); + CompareGolden(&json_writer, "\"test int\": -1"); + + json_writer.Reset(); + json_writer.OutputValue("test float", -10.25); + CompareGolden(&json_writer, "\"test float\": -10.25"); + + json_writer.Reset(); + json_writer.OutputValue("test char*", "I am the string!"); + CompareGolden(&json_writer, "\"test char*\": \"I am the string!\""); + + json_writer.Reset(); + const std::string value = "I am the string!"; + json_writer.OutputValue("test string", value); + CompareGolden(&json_writer, "\"test string\": \"I am the string!\""); + + json_writer.Reset(); + json_writer.OutputValue("test bool", false); + CompareGolden(&json_writer, "\"test bool\": false"); + + json_writer.Reset(); + json_writer.OutputValue("test bool", true); + CompareGolden(&json_writer, "\"test bool\": true"); +} + +TEST_F(GltfUtilsTest, TestSpecialCharacters) { + JsonWriter json_writer; + const std::string test_double_quote = "I am double quote\""; + json_writer.OutputValue("test double quote", test_double_quote); + CompareGolden(&json_writer, + "\"test double quote\": \"I am double quote\\\"\""); + + json_writer.Reset(); + const std::string test_backspace = "I am backspace\b"; + json_writer.OutputValue("test backspace", test_backspace); + CompareGolden(&json_writer, "\"test backspace\": \"I am backspace\\\b\""); + + json_writer.Reset(); + const std::string test_form_feed = "I am form feed\f"; + json_writer.OutputValue("test form feed", test_form_feed); + CompareGolden(&json_writer, "\"test form feed\": \"I am form feed\\\f\""); + + json_writer.Reset(); + const std::string test_newline = "I am newline\n"; + json_writer.OutputValue("test newline", test_newline); + CompareGolden(&json_writer, "\"test newline\": \"I am newline\\\n\""); + + json_writer.Reset(); + const std::string test_tab = "I am tab\t"; + json_writer.OutputValue("test tab", test_tab); + CompareGolden(&json_writer, "\"test tab\": \"I am tab\\\t\""); + + json_writer.Reset(); + const std::string test_backslash = "I am backslash\\"; + json_writer.OutputValue("test backslash", test_backslash); + CompareGolden(&json_writer, "\"test backslash\": \"I am backslash\\\\\""); + + json_writer.Reset(); + const std::string test_multiple_special_characters = "\"break\"and\\more\"\\"; + json_writer.OutputValue("test multiple_special_characters", + test_multiple_special_characters); + CompareGolden(&json_writer, + "\"test multiple_special_characters\": " + "\"\\\"break\\\"and\\\\more\\\"\\\\\""); +} + +TEST_F(GltfUtilsTest, TestObjects) { + JsonWriter json_writer; + json_writer.BeginObject(); + json_writer.EndObject(); + CompareGolden(&json_writer, "{\n}"); + + json_writer.Reset(); + json_writer.BeginObject("object"); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object\": {\n}"); + + json_writer.Reset(); + json_writer.BeginObject("object"); + json_writer.OutputValue(0); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object\": {\n 0\n}"); + + json_writer.Reset(); + json_writer.BeginObject("object"); + json_writer.OutputValue(0); + json_writer.OutputValue(1); + json_writer.OutputValue(2); + json_writer.OutputValue(3); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object\": {\n 0,\n 1,\n 2,\n 3\n}"); + + json_writer.Reset(); + json_writer.BeginObject("object1"); + json_writer.EndObject(); + json_writer.BeginObject("object2"); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object1\": {\n},\n\"object2\": {\n}"); + + json_writer.Reset(); + json_writer.BeginObject("object1"); + json_writer.BeginObject("object2"); + json_writer.EndObject(); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object1\": {\n \"object2\": {\n }\n}"); +} + +TEST_F(GltfUtilsTest, TestArrays) { + JsonWriter json_writer; + json_writer.BeginArray("array"); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array\": [\n]"); + + json_writer.Reset(); + json_writer.BeginArray("array"); + json_writer.OutputValue(0); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array\": [\n 0\n]"); + + json_writer.Reset(); + json_writer.BeginArray("array"); + json_writer.OutputValue(0); + json_writer.OutputValue(1); + json_writer.OutputValue(2); + json_writer.OutputValue(3); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array\": [\n 0,\n 1,\n 2,\n 3\n]"); + + json_writer.Reset(); + json_writer.BeginArray("array1"); + json_writer.EndArray(); + json_writer.BeginArray("array2"); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array1\": [\n],\n\"array2\": [\n]"); + + json_writer.Reset(); + json_writer.BeginArray("array1"); + json_writer.BeginArray("array2"); + json_writer.EndArray(); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array1\": [\n \"array2\": [\n ]\n]"); +} + +TEST_F(GltfUtilsTest, TestGltfValues) { + JsonWriter json_writer; + const int8_t int8_value_min = std::numeric_limits::min(); + const int8_t int8_value_max = std::numeric_limits::max(); + const GltfValue int8_value_low(int8_value_min); + const GltfValue int8_value_high(int8_value_max); + json_writer.OutputValue(int8_value_low); + json_writer.OutputValue(int8_value_high); + CompareGolden(&json_writer, "-128,\n127"); + + json_writer.Reset(); + const uint8_t uint8_value_min = std::numeric_limits::min(); + const uint8_t uint8_value_max = std::numeric_limits::max(); + const GltfValue uint8_value_low(uint8_value_min); + const GltfValue uint8_value_high(uint8_value_max); + json_writer.OutputValue(uint8_value_low); + json_writer.OutputValue(uint8_value_high); + CompareGolden(&json_writer, "0,\n255"); + + json_writer.Reset(); + const int16_t int16_value_min = std::numeric_limits::min(); + const int16_t int16_value_max = std::numeric_limits::max(); + const GltfValue int16_value_low(int16_value_min); + const GltfValue int16_value_high(int16_value_max); + json_writer.OutputValue(int16_value_low); + json_writer.OutputValue(int16_value_high); + CompareGolden(&json_writer, "-32768,\n32767"); + + json_writer.Reset(); + const uint16_t uint16_value_min = std::numeric_limits::min(); + const uint16_t uint16_value_max = std::numeric_limits::max(); + const GltfValue uint16_value_low(uint16_value_min); + const GltfValue uint16_value_high(uint16_value_max); + json_writer.OutputValue(uint16_value_low); + json_writer.OutputValue(uint16_value_high); + CompareGolden(&json_writer, "0,\n65535"); + + json_writer.Reset(); + const uint32_t uint32_value_min = std::numeric_limits::min(); + const uint32_t uint32_value_max = std::numeric_limits::max(); + const GltfValue uint32_value_low(uint32_value_min); + const GltfValue uint32_value_high(uint32_value_max); + json_writer.OutputValue(uint32_value_low); + json_writer.OutputValue(uint32_value_high); + CompareGolden(&json_writer, "0,\n4294967295"); + + json_writer.Reset(); + const float float_value_min = std::numeric_limits::min(); + const float float_value_max = std::numeric_limits::max(); + const GltfValue float_value_low(float_value_min); + const GltfValue float_value_high(float_value_max); + json_writer.OutputValue(float_value_low); + json_writer.OutputValue(float_value_high); + CompareGolden(&json_writer, + "1.1754943508222875e-38,\n3.4028234663852886e+38"); + + json_writer.Reset(); + const GltfValue float_value_0(0.1f); + const GltfValue float_value_1(1.f); + json_writer.OutputValue(float_value_0); + json_writer.OutputValue(float_value_1); + CompareGolden(&json_writer, "0.10000000149011612,\n1"); +} + +TEST_F(GltfUtilsTest, TestObjectsCompact) { + JsonWriter json_writer; + json_writer.SetMode(JsonWriter::COMPACT); + json_writer.BeginObject(); + json_writer.EndObject(); + CompareGolden(&json_writer, "{}"); + + json_writer.Reset(); + json_writer.BeginObject("object"); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object\":{}"); + + json_writer.Reset(); + json_writer.BeginObject("object"); + json_writer.OutputValue(0); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object\":{0}"); + + json_writer.Reset(); + json_writer.BeginObject("object"); + json_writer.OutputValue(0); + json_writer.OutputValue(1); + json_writer.OutputValue(2); + json_writer.OutputValue(3); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object\":{0,1,2,3}"); + + json_writer.Reset(); + json_writer.BeginObject("object1"); + json_writer.EndObject(); + json_writer.BeginObject("object2"); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object1\":{},\"object2\":{}"); + + json_writer.Reset(); + json_writer.BeginObject("object1"); + json_writer.BeginObject("object2"); + json_writer.EndObject(); + json_writer.EndObject(); + CompareGolden(&json_writer, "\"object1\":{\"object2\":{}}"); +} + +TEST_F(GltfUtilsTest, TestArraysCompact) { + JsonWriter json_writer; + json_writer.SetMode(JsonWriter::COMPACT); + json_writer.BeginArray("array"); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array\":[]"); + + json_writer.Reset(); + json_writer.BeginArray("array"); + json_writer.OutputValue(0); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array\":[0]"); + + json_writer.Reset(); + json_writer.BeginArray("array"); + json_writer.OutputValue(0); + json_writer.OutputValue(1); + json_writer.OutputValue(2); + json_writer.OutputValue(3); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array\":[0,1,2,3]"); + + json_writer.Reset(); + json_writer.BeginArray("array1"); + json_writer.EndArray(); + json_writer.BeginArray("array2"); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array1\":[],\"array2\":[]"); + + json_writer.Reset(); + json_writer.BeginArray("array1"); + json_writer.BeginArray("array2"); + json_writer.EndArray(); + json_writer.EndArray(); + CompareGolden(&json_writer, "\"array1\":[\"array2\":[]]"); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/image_compression_options.h b/contrib/draco/src/draco/io/image_compression_options.h new file mode 100644 index 000000000..722bdbd64 --- /dev/null +++ b/contrib/draco/src/draco/io/image_compression_options.h @@ -0,0 +1,31 @@ +// Copyright 2020 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_IMAGE_COMPRESSION_OPTIONS_H_ +#define DRACO_IO_IMAGE_COMPRESSION_OPTIONS_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +namespace draco { + +// Enum defining image compression formats. +enum class ImageFormat { NONE, PNG, JPEG, BASIS, WEBP }; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_IMAGE_COMPRESSION_OPTIONS_H_ diff --git a/contrib/draco/src/draco/io/mesh_io.cc b/contrib/draco/src/draco/io/mesh_io.cc index e0dc69c6f..4975d9236 100644 --- a/contrib/draco/src/draco/io/mesh_io.cc +++ b/contrib/draco/src/draco/io/mesh_io.cc @@ -18,8 +18,18 @@ #include #include "draco/io/file_utils.h" +#include "draco/io/file_writer_interface.h" #include "draco/io/obj_decoder.h" #include "draco/io/ply_decoder.h" +#include "draco/io/stl_decoder.h" +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/compression/draco_compression_options.h" +#include "draco/compression/encode.h" +#include "draco/io/gltf_decoder.h" +#include "draco/io/gltf_encoder.h" +#include "draco/io/obj_encoder.h" +#include "draco/io/ply_encoder.h" +#endif namespace draco { @@ -46,27 +56,40 @@ StatusOr> ReadMeshFromFile( std::unique_ptr mesh(new Mesh()); // Analyze file extension. const std::string extension = LowercaseFileExtension(file_name); - if (extension != "gltf" && mesh_files) { - // The GLTF decoder will fill |mesh_files|, but for other file types we set - // the root file here to avoid duplicating code. + if (extension != "gltf" && extension != "obj" && mesh_files) { + // The GLTF/OBJ decoder will fill |mesh_files|, but for other file types we + // set the root file here to avoid duplicating code. mesh_files->push_back(file_name); } if (extension == "obj") { // Wavefront OBJ file format. ObjDecoder obj_decoder; obj_decoder.set_use_metadata(options.GetBool("use_metadata", false)); - const Status obj_status = obj_decoder.DecodeFromFile(file_name, mesh.get()); + obj_decoder.set_preserve_polygons(options.GetBool("preserve_polygons")); + const Status obj_status = + obj_decoder.DecodeFromFile(file_name, mesh.get(), mesh_files); if (!obj_status.ok()) { return obj_status; } return std::move(mesh); } if (extension == "ply") { - // Wavefront PLY file format. + // Stanford PLY file format. PlyDecoder ply_decoder; DRACO_RETURN_IF_ERROR(ply_decoder.DecodeFromFile(file_name, mesh.get())); return std::move(mesh); } + if (extension == "stl") { + // STL file format. + StlDecoder stl_decoder; + return stl_decoder.DecodeFromFile(file_name); + } +#ifdef DRACO_TRANSCODER_SUPPORTED + if (extension == "gltf" || extension == "glb") { + GltfDecoder gltf_decoder; + return gltf_decoder.DecodeFromFile(file_name, mesh_files); + } +#endif // Otherwise not an obj file. Assume the file was encoded with one of the // draco encoding methods. diff --git a/contrib/draco/src/draco/io/obj_decoder.cc b/contrib/draco/src/draco/io/obj_decoder.cc index 9b4eab626..c233c2b56 100644 --- a/contrib/draco/src/draco/io/obj_decoder.cc +++ b/contrib/draco/src/draco/io/obj_decoder.cc @@ -14,8 +14,10 @@ // #include "draco/io/obj_decoder.h" +#include #include #include +#include #include "draco/io/file_utils.h" #include "draco/io/parser_utils.h" @@ -36,15 +38,25 @@ ObjDecoder::ObjDecoder() norm_att_id_(-1), material_att_id_(-1), sub_obj_att_id_(-1), + added_edge_att_id_(-1), deduplicate_input_values_(true), last_material_id_(0), use_metadata_(false), + preserve_polygons_(false), + has_polygons_(false), + mesh_files_(nullptr), out_mesh_(nullptr), out_point_cloud_(nullptr) {} Status ObjDecoder::DecodeFromFile(const std::string &file_name, Mesh *out_mesh) { + return DecodeFromFile(file_name, out_mesh, nullptr); +} + +Status ObjDecoder::DecodeFromFile(const std::string &file_name, Mesh *out_mesh, + std::vector *mesh_files) { out_mesh_ = out_mesh; + mesh_files_ = mesh_files; return DecodeFromFile(file_name, static_cast(out_mesh)); } @@ -90,6 +102,10 @@ Status ObjDecoder::DecodeInternal() { return status; } + if (mesh_files_ && !input_file_name_.empty()) { + mesh_files_->push_back(input_file_name_); + } + bool use_identity_mapping = false; if (num_obj_faces_ == 0) { // Mesh has no faces. In this case we try to read the geometry as a point @@ -146,6 +162,24 @@ Status ObjDecoder::DecodeInternal() { norm_att_id_ = out_point_cloud_->AddAttribute(va, use_identity_mapping, num_normals_); } + if (preserve_polygons_ && has_polygons_) { + // Create attribute for polygon reconstruction. + GeometryAttribute va; + va.Init(GeometryAttribute::GENERIC, nullptr, 1, DT_UINT8, false, 1, 0); + PointCloud *const pc = out_point_cloud_; + added_edge_att_id_ = pc->AddAttribute(va, false, 2); + + // Set attribute values to zero and one representing old edge and new edge. + for (const uint8_t i : {0, 1}) { + const AttributeValueIndex avi(i); + pc->attribute(added_edge_att_id_)->SetAttributeValue(avi, &i); + } + + // Add attribute metadata with name. + std::unique_ptr metadata(new draco::AttributeMetadata()); + metadata->AddEntryString("name", "added_edges"); + pc->AddAttributeMetadata(added_edge_att_id_, std::move(metadata)); + } if (num_materials_ > 0 && num_obj_faces_ > 0) { GeometryAttribute va; const auto geometry_attribute_type = GeometryAttribute::GENERIC; @@ -381,6 +415,7 @@ bool ObjDecoder::ParseTexCoord(Status *status) { } bool ObjDecoder::ParseFace(Status *status) { + constexpr int kMaxCorners = 8; char c; if (!buffer()->Peek(&c)) { return false; @@ -391,37 +426,35 @@ bool ObjDecoder::ParseFace(Status *status) { // Face definition found! buffer()->Advance(1); if (!counting_mode_) { - std::array indices[4]; - // Parse face indices (we try to look for up to four to support quads). + std::array indices[kMaxCorners]; + // Parse face indices. int num_valid_indices = 0; - for (int i = 0; i < 4; ++i) { + for (int i = 0; i < kMaxCorners; ++i) { if (!ParseVertexIndices(&indices[i])) { - if (i == 3) { - break; // It's OK if there is no fourth vertex index. + if (i >= 3) { + break; // It's OK if there is no fourth or higher vertex index. } *status = Status(Status::DRACO_ERROR, "Failed to parse vertex indices"); return true; } ++num_valid_indices; } - // Process the first face. - for (int i = 0; i < 3; ++i) { - const PointIndex vert_id(3 * num_obj_faces_ + i); - MapPointToVertexIndices(vert_id, indices[i]); - } - ++num_obj_faces_; - if (num_valid_indices == 4) { - // Add an additional triangle for the quad. - // - // 3----2 - // | / | - // | / | - // 0----1 - // - const PointIndex vert_id(3 * num_obj_faces_); - MapPointToVertexIndices(vert_id, indices[0]); - MapPointToVertexIndices(vert_id + 1, indices[2]); - MapPointToVertexIndices(vert_id + 2, indices[3]); + // Split quads and other n-gons into n - 2 triangles. + const int nt = num_valid_indices - 2; + // Iterate over triangles. + for (int t = 0; t < nt; t++) { + // Iterate over corners. + for (int c = 0; c < 3; c++) { + const PointIndex vert_id(3 * num_obj_faces_ + c); + const int triangulated_index = Triangulate(t, c); + MapPointToVertexIndices(vert_id, indices[triangulated_index]); + // Save info about new edges that will allow us to reconstruct polygons. + if (added_edge_att_id_ >= 0) { + const AttributeValueIndex avi(IsNewEdge(nt, t, c)); + out_point_cloud_->attribute(added_edge_att_id_) + ->SetPointMapEntry(vert_id, avi); + } + } ++num_obj_faces_; } } else { @@ -443,12 +476,14 @@ bool ObjDecoder::ParseFace(Status *status) { } } } - if (num_indices < 3 || num_indices > 4) { - *status = - Status(Status::DRACO_ERROR, "Invalid number of indices on a face"); + if (num_indices > 3) { + has_polygons_ = true; + } + if (num_indices < 3 || num_indices > kMaxCorners) { + *status = ErrorStatus("Invalid number of indices on a face"); return false; } - // Either one or two new triangles. + // Either one or more new triangles. num_obj_faces_ += num_indices - 2; } parser::SkipLine(buffer()); @@ -478,6 +513,9 @@ bool ObjDecoder::ParseMaterialLib(Status *status) { parser::SkipLine(&line_buffer); if (!material_file_name_.empty()) { + if (mesh_files_) { + mesh_files_->push_back(material_file_name_); + } if (!ParseMaterialFile(material_file_name_, status)) { // Silently ignore problems with material files for now. return true; @@ -705,4 +743,44 @@ bool ObjDecoder::ParseMaterialFileDefinition(Status * /* status */) { return true; } +// Methods Triangulate() and IsNewEdge() are used for polygon triangulation and +// representation as an attribute for reconstruction in the decoder. +// +// Polygon reconstruction attribute is associated with every triangle corner and +// has values zero or one. Zero indicates that an edge opposite to the corner is +// present in the original mesh (dashed lines), and one indicates that the +// opposite edge has been added during polygon triangulation (dotted lines). +// +// Polygon triangulation is illustrated below. Pentagon ABCDE is split into +// three triangles ABC, ACD, ADE. It is sufficient to set polygon reconstruction +// attribute at corners ABC and ACD. The attribute at the second corner of all +// triangles except for the last is set to one. +// +// C D +// * --------- * +// /. 1 0 .| +// / . . | +// / . . | +// / 0 . . 0 | +// / . . | +// B * 1 . . | +// \ . . | +// \ 0 . 0 . | +// \ . . | +// \ . . | +// \.. 0 0 | +// *-----------* +// A E +// +inline int ObjDecoder::Triangulate(int tri_index, int tri_corner) { + return tri_corner == 0 ? 0 : tri_index + tri_corner; +} + +inline bool ObjDecoder::IsNewEdge(int tri_count, int tri_index, + int tri_corner) { + // All but the last triangle of the triangulated polygon have an added edge + // opposite of corner 1. + return tri_index != tri_count - 1 && tri_corner == 1; +} + } // namespace draco diff --git a/contrib/draco/src/draco/io/obj_decoder.h b/contrib/draco/src/draco/io/obj_decoder.h index baeab5b0c..18dc9aadd 100644 --- a/contrib/draco/src/draco/io/obj_decoder.h +++ b/contrib/draco/src/draco/io/obj_decoder.h @@ -34,8 +34,12 @@ class ObjDecoder { ObjDecoder(); // Decodes an obj file stored in the input file. - // Returns nullptr if the decoding failed. + // Optional argument |mesh_files| will be populated with all paths to files + // relevant to the loaded mesh. Status DecodeFromFile(const std::string &file_name, Mesh *out_mesh); + Status DecodeFromFile(const std::string &file_name, Mesh *out_mesh, + std::vector *mesh_files); + Status DecodeFromFile(const std::string &file_name, PointCloud *out_point_cloud); @@ -50,6 +54,8 @@ class ObjDecoder { // Flag for whether using metadata to record other information in the obj // file, e.g. material names, object names. void set_use_metadata(bool flag) { use_metadata_ = flag; } + // Enables preservation of polygons. + void set_preserve_polygons(bool flag) { preserve_polygons_ = flag; } protected: Status DecodeInternal(); @@ -88,6 +94,11 @@ class ObjDecoder { bool ParseMaterialFile(const std::string &file_name, Status *status); bool ParseMaterialFileDefinition(Status *status); + // Methods related to polygon triangulation and preservation. + static int Triangulate(int tri_index, int tri_corner); + static bool IsNewEdge(int tri_count, int tri_index, int tri_corner); + + private: // If set to true, the parser will count the number of various definitions // but it will not parse the actual data or add any new entries to the mesh. bool counting_mode_; @@ -102,7 +113,8 @@ class ObjDecoder { int tex_att_id_; int norm_att_id_; int material_att_id_; - int sub_obj_att_id_; // Attribute id for storing sub-objects. + int sub_obj_att_id_; // Attribute id for storing sub-objects. + int added_edge_att_id_; // Attribute id for polygon reconstruction. bool deduplicate_input_values_; @@ -116,6 +128,12 @@ class ObjDecoder { bool use_metadata_; + // Polygon preservation flags. + bool preserve_polygons_; + bool has_polygons_; + + std::vector *mesh_files_; + DecoderBuffer buffer_; // Data structure that stores the decoded data. |out_point_cloud_| must be diff --git a/contrib/draco/src/draco/io/obj_decoder_test.cc b/contrib/draco/src/draco/io/obj_decoder_test.cc index b19fe6e2c..a46a15a8b 100644 --- a/contrib/draco/src/draco/io/obj_decoder_test.cc +++ b/contrib/draco/src/draco/io/obj_decoder_test.cc @@ -54,6 +54,20 @@ class ObjDecoderTest : public ::testing::Test { return geometry; } + template + std::unique_ptr DecodeObjWithPolygons( + const std::string &file_name, bool regularize_quads, + bool store_added_edges_per_vertex) const { + const std::string path = GetTestFileFullPath(file_name); + ObjDecoder decoder; + decoder.set_preserve_polygons(true); + std::unique_ptr geometry(new Geometry()); + if (!decoder.DecodeFromFile(path, geometry.get()).ok()) { + return nullptr; + } + return geometry; + } + void test_decoding(const std::string &file_name) { const std::unique_ptr mesh(DecodeObj(file_name)); ASSERT_NE(mesh, nullptr) << "Failed to load test model " << file_name; @@ -113,7 +127,7 @@ TEST_F(ObjDecoderTest, SubObjectsWithMetadata) { ASSERT_EQ(sub_obj_id, 2); } -TEST_F(ObjDecoderTest, QuadOBJ) { +TEST_F(ObjDecoderTest, QuadTriangulateOBJ) { // Tests loading an Obj with quad faces. const std::string file_name = "cube_quads.obj"; const std::unique_ptr mesh(DecodeObj(file_name)); @@ -124,11 +138,114 @@ TEST_F(ObjDecoderTest, QuadOBJ) { ASSERT_EQ(mesh->num_points(), 4 * 6); // Four points per quad face. } -TEST_F(ObjDecoderTest, ComplexPolyOBJ) { - // Tests that we fail to load an obj with complex polygon (expected failure). - const std::string file_name = "invalid/complex_poly.obj"; +TEST_F(ObjDecoderTest, QuadPreserveOBJ) { + // Tests loading an Obj with quad faces preserved as an attribute. + const std::string file_name = "cube_quads.obj"; + constexpr bool kRegularizeQuads = false; + constexpr bool kStoreAddedEdgesPerVertex = false; + const std::unique_ptr mesh(DecodeObjWithPolygons( + file_name, kRegularizeQuads, kStoreAddedEdgesPerVertex)); + ASSERT_NE(mesh, nullptr) << "Failed to load test model " << file_name; + ASSERT_EQ(mesh->num_faces(), 12); + + ASSERT_EQ(mesh->num_attributes(), 4); + ASSERT_EQ(mesh->num_points(), 4 * 6); // Four points per quad face. + + // Expect a new generic attribute. + ASSERT_EQ(mesh->attribute(3)->attribute_type(), GeometryAttribute::GENERIC); + + // Expect the new attribute to have two values to describe old and new edge. + ASSERT_EQ(mesh->attribute(3)->size(), 2); + const auto new_edge_value = + mesh->attribute(3)->GetValue(AttributeValueIndex(0))[0]; + const auto old_edge_value = + mesh->attribute(3)->GetValue(AttributeValueIndex(1))[0]; + ASSERT_EQ(new_edge_value, 0); + ASSERT_EQ(old_edge_value, 1); + + // Expect one new edge on each of the six cube quads. + for (int i = 0; i < 6; i++) { + ASSERT_EQ(mesh->attribute(3)->mapped_index(PointIndex(4 * i + 0)), 0); + // New edge. + ASSERT_EQ(mesh->attribute(3)->mapped_index(PointIndex(4 * i + 1)), 1); + ASSERT_EQ(mesh->attribute(3)->mapped_index(PointIndex(4 * i + 2)), 0); + ASSERT_EQ(mesh->attribute(3)->mapped_index(PointIndex(4 * i + 3)), 0); + } + + // Expect metadata entry on the new attribute. + const AttributeMetadata *const metadata = + mesh->GetAttributeMetadataByAttributeId(3); + ASSERT_NE(metadata, nullptr); + ASSERT_TRUE(metadata->sub_metadatas().empty()); + ASSERT_EQ(metadata->entries().size(), 1); + std::string name; + metadata->GetEntryString("name", &name); + ASSERT_EQ(name, "added_edges"); +} + +TEST_F(ObjDecoderTest, OctagonTriangulatedOBJ) { + // Tests that we can load an obj with an octagon triangulated. + const std::string file_name = "octagon.obj"; const std::unique_ptr mesh(DecodeObj(file_name)); - ASSERT_EQ(mesh, nullptr); + ASSERT_NE(mesh, nullptr) << "Failed to load test model " << file_name; + + ASSERT_EQ(mesh->num_attributes(), 1); + ASSERT_EQ(mesh->num_points(), 8); + ASSERT_EQ(mesh->attribute(0)->attribute_type(), GeometryAttribute::POSITION); + ASSERT_EQ(mesh->attribute(0)->size(), 8); +} + +TEST_F(ObjDecoderTest, OctagonPreservedOBJ) { + // Tests that we can load an obj with an octagon preserved as an attribute. + const std::string file_name = "octagon.obj"; + constexpr bool kRegularizeQuads = false; + constexpr bool kStoreAddedEdgesPerVertex = false; + const std::unique_ptr mesh(DecodeObjWithPolygons( + file_name, kRegularizeQuads, kStoreAddedEdgesPerVertex)); + ASSERT_NE(mesh, nullptr) << "Failed to load test model " << file_name; + + ASSERT_EQ(mesh->num_attributes(), 2); + ASSERT_EQ(mesh->attribute(0)->attribute_type(), GeometryAttribute::POSITION); + ASSERT_EQ(mesh->attribute(0)->size(), 8); + + // Expect a new generic attribute. + ASSERT_EQ(mesh->attribute(1)->attribute_type(), GeometryAttribute::GENERIC); + + // There are four vertices with both old and new edges in their ring. + ASSERT_EQ(mesh->num_points(), 8 + 4); + + // Expect the new attribute to have two values to describe old and new edge. + ASSERT_EQ(mesh->attribute(1)->size(), 2); + const auto new_edge_value = + mesh->attribute(1)->GetValue(AttributeValueIndex(0))[0]; + const auto old_edge_value = + mesh->attribute(1)->GetValue(AttributeValueIndex(1))[0]; + ASSERT_EQ(new_edge_value, 0); + ASSERT_EQ(old_edge_value, 1); + + // Five new edges are introduced while triangulating as octagon. + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(0)), 0); + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(1)), 1); // New edge. + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(2)), 0); + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(3)), 1); // New edge. + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(4)), 0); + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(5)), 1); // New edge. + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(6)), 0); + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(7)), 1); // New edge. + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(8)), 0); + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(9)), 1); // New edge. + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(10)), 0); + ASSERT_EQ(mesh->attribute(1)->mapped_index(PointIndex(11)), 0); + + // Expect metadata entry on the new attribute. + const AttributeMetadata *const metadata = + mesh->GetAttributeMetadataByAttributeId(1); + ASSERT_NE(metadata, nullptr); + ASSERT_TRUE(metadata->sub_metadatas().empty()); + ASSERT_EQ(metadata->entries().size(), 1); + std::string name; + metadata->GetEntryString("name", &name); + ASSERT_EQ(name, "added_edges"); } TEST_F(ObjDecoderTest, EmptyNameOBJ) { @@ -167,7 +284,6 @@ TEST_F(ObjDecoderTest, WrongAttributeMapping) { TEST_F(ObjDecoderTest, TestObjDecodingAll) { // test if we can read all obj that are currently in test folder. test_decoding("bunny_norm.obj"); - // test_decoding("complex_poly.obj"); // not supported see test above test_decoding("cube_att.obj"); test_decoding("cube_att_partial.obj"); test_decoding("cube_att_sub_o.obj"); diff --git a/contrib/draco/src/draco/io/obj_encoder.cc b/contrib/draco/src/draco/io/obj_encoder.cc index 29c6ca8f0..1ddfd92bd 100644 --- a/contrib/draco/src/draco/io/obj_encoder.cc +++ b/contrib/draco/src/draco/io/obj_encoder.cc @@ -16,8 +16,10 @@ #include +#include "draco/attributes/geometry_attribute.h" #include "draco/io/file_writer_factory.h" #include "draco/io/file_writer_interface.h" +#include "draco/mesh/mesh_misc_functions.h" #include "draco/metadata/geometry_metadata.h" namespace draco { @@ -28,6 +30,7 @@ ObjEncoder::ObjEncoder() normal_att_(nullptr), material_att_(nullptr), sub_obj_att_(nullptr), + added_edges_att_(nullptr), out_buffer_(nullptr), in_point_cloud_(nullptr), in_mesh_(nullptr), @@ -78,11 +81,15 @@ bool ObjEncoder::EncodeInternal() { normal_att_ = nullptr; material_att_ = nullptr; sub_obj_att_ = nullptr; + added_edges_att_ = nullptr; current_sub_obj_id_ = -1; current_material_id_ = -1; if (!GetSubObjects()) { return false; } + if (in_mesh_ && !GetAddedEdges()) { + return false; + } if (!EncodeMaterialFileName()) { return false; } @@ -110,12 +117,38 @@ bool ObjEncoder::ExitAndCleanup(bool return_value) { normal_att_ = nullptr; material_att_ = nullptr; sub_obj_att_ = nullptr; + added_edges_att_ = nullptr; current_sub_obj_id_ = -1; current_material_id_ = -1; file_name_.clear(); return return_value; } +bool ObjEncoder::GetAddedEdges() { + const GeometryMetadata *mesh_metadata = in_mesh_->GetMetadata(); + if (!mesh_metadata) { + return true; + } + + // Try to get a per-corner attribute describing added edges. + { + const AttributeMetadata *att_metadata = + mesh_metadata->GetAttributeMetadataByStringEntry("name", "added_edges"); + if (att_metadata) { + const auto att = + in_mesh_->GetAttributeByUniqueId(att_metadata->att_unique_id()); + if (att->size() == 0 || att->num_components() != 1 || + att->data_type() != DataType::DT_UINT8) { + return false; + } + added_edges_att_ = att; + return true; + } + } + + return true; +} + bool ObjEncoder::GetSubObjects() { const GeometryMetadata *pc_metadata = in_point_cloud_->GetMetadata(); if (!pc_metadata) { @@ -137,7 +170,8 @@ bool ObjEncoder::GetSubObjects() { } sub_obj_att_ = in_point_cloud_->GetAttributeByUniqueId( sub_obj_metadata->att_unique_id()); - if (sub_obj_att_ == nullptr || sub_obj_att_->size() == 0) { + if (sub_obj_att_ == nullptr || sub_obj_att_->size() == 0 || + sub_obj_att_->num_components() != 1) { return false; } return true; @@ -236,17 +270,11 @@ bool ObjEncoder::EncodeNormals() { } bool ObjEncoder::EncodeFaces() { + if (added_edges_att_ != nullptr) { + return EncodePolygonalFaces(); + } for (FaceIndex i(0); i < in_mesh_->num_faces(); ++i) { - if (sub_obj_att_) { - if (!EncodeSubObject(i)) { - return false; - } - } - if (material_att_) { - if (!EncodeMaterial(i)) { - return false; - } - } + EncodeFaceAttributes(i); buffer()->Encode('f'); for (int j = 0; j < 3; ++j) { if (!EncodeFaceCorner(i, j)) { @@ -258,6 +286,56 @@ bool ObjEncoder::EncodeFaces() { return true; } +bool ObjEncoder::EncodePolygonalFaces() { + // TODO(vytyaz): This could be a much smaller set of visited face indices. + std::vector triangle_visited(in_mesh_->num_faces(), false); + PolygonEdges polygon_edges; + std::unique_ptr corner_table = + CreateCornerTableFromPositionAttribute(in_mesh_); + for (FaceIndex fi(0); fi < in_mesh_->num_faces(); ++fi) { + EncodeFaceAttributes(fi); + // Reconstruct polygon from the added edges attribute if available. + polygon_edges.clear(); + FindOriginalFaceEdges(fi, *corner_table, &triangle_visited, &polygon_edges); + + // Polygon edges could be empty if this triangle has been visited as part + // of a polygon discovery that started from an earler face. + if (polygon_edges.empty()) { + continue; + } + + // Traverse a polygon by following its edges. The starting point is not + // guaranteed to be the same as in the original polygon. It is + // deterministic, however, and defined by std::map behavior. + const AttributeValueIndex first_position_index = + polygon_edges.begin()->first; + AttributeValueIndex position_index = first_position_index; + buffer()->Encode('f'); + do { + // Get the next polygon point index by following polygon edge. + const PointIndex pi = polygon_edges[position_index]; + EncodeFaceCorner(pi); + position_index = pos_att_->mapped_index(pi).value(); + } while (position_index != first_position_index); + buffer()->Encode("\n", 1); + } + return true; +} + +bool ObjEncoder::EncodeFaceAttributes(FaceIndex face_id) { + if (sub_obj_att_) { + if (!EncodeSubObject(face_id)) { + return false; + } + } + if (material_att_) { + if (!EncodeMaterial(face_id)) { + return false; + } + } + return true; +} + bool ObjEncoder::EncodeMaterial(FaceIndex face_id) { int material_id = 0; // Pick the first corner, all corners of a face should have same id. @@ -304,8 +382,12 @@ bool ObjEncoder::EncodeSubObject(FaceIndex face_id) { } bool ObjEncoder::EncodeFaceCorner(FaceIndex face_id, int local_corner_id) { - buffer()->Encode(' '); const PointIndex vert_index = in_mesh_->face(face_id)[local_corner_id]; + return EncodeFaceCorner(vert_index); +} + +bool ObjEncoder::EncodeFaceCorner(PointIndex vert_index) { + buffer()->Encode(' '); // Note that in the OBJ format, all indices are encoded starting from index 1. // Encode position index. EncodeInt(pos_att_->mapped_index(vert_index).value() + 1); @@ -343,4 +425,67 @@ void ObjEncoder::EncodeInt(int32_t val) { buffer()->Encode(num_buffer_, strlen(num_buffer_)); } +bool ObjEncoder::IsNewEdge(const CornerTable &ct, CornerIndex ci) const { + const PointIndex pi = in_mesh_->CornerToPointId(ci); + if (added_edges_att_ != nullptr) { + uint8_t value; + added_edges_att_->GetMappedValue(pi, &value); + return value == 1; + } + return false; +} + +void ObjEncoder::FindOriginalFaceEdges(FaceIndex face_index, + const CornerTable &corner_table, + std::vector *triangle_visited, + PolygonEdges *polygon_edges) { + // Do not add any edges if this triangular face has already been visited. + if ((*triangle_visited)[face_index.value()]) { + return; + } + (*triangle_visited)[face_index.value()] = true; + const Mesh::Face &face = in_mesh_->face(face_index); + for (size_t c = 0; c < 3; c++) { + // Check for added edge using this corner. + const CornerIndex ci = corner_table.FirstCorner(face_index) + c; + const CornerIndex co = corner_table.Opposite(ci); + bool is_new_edge = IsNewEdge(corner_table, ci); + + // Check for the new edge using the opposite corner. + if (!is_new_edge && co != kInvalidCornerIndex) { + is_new_edge = IsNewEdge(corner_table, co); + } + // The new edge may become a boundary edge when a degenerate triangle + // created by polygon triangulation is removed by Draco encoder, hence |co| + // is checked below. This can happen when an isolated (boundary) quad only + // has three distinct vertex positions. + // + // TODO(vytyaz): Fix polygon reconstruction with other possible cases of + // degenerate triangles. There are two known sources of degenerate triangles + // that affect polygon reconstruction: + // + // 1. Degenerate triangles created during polygon triangulation are removed + // by Draco encoder, which invalidates the "added_edges" attribute. + // Solution is to discard those triangles before creating the attribute. + // + // 2. Degenerate triangles created by position quantization are encoded and + // decoded by Draco, but not captured into the |corner_table|, causing a + // mismatch between the corner table and the "added_edges" attribute. + // Solution is to use corner table from draco::MeshDecoder here. + // + if (is_new_edge && co != kInvalidCornerIndex) { + // Visit triangle across the new edge. + const FaceIndex opposite_face_index = corner_table.Face(co); + FindOriginalFaceEdges(opposite_face_index, corner_table, triangle_visited, + polygon_edges); + } else { + // Insert the original edge to the map. + const PointIndex point_from = face[(c + 1) % 3]; + const PointIndex point_to = face[(c + 2) % 3]; + polygon_edges->insert( + {PositionIndex(pos_att_->mapped_index(point_from)), point_to}); + } + } +} + } // namespace draco diff --git a/contrib/draco/src/draco/io/obj_encoder.h b/contrib/draco/src/draco/io/obj_encoder.h index 509d39baf..1d67b5306 100644 --- a/contrib/draco/src/draco/io/obj_encoder.h +++ b/contrib/draco/src/draco/io/obj_encoder.h @@ -18,6 +18,7 @@ #include #include "draco/core/encoder_buffer.h" +#include "draco/mesh/corner_table.h" #include "draco/mesh/mesh.h" namespace draco { @@ -44,19 +45,30 @@ class ObjEncoder { bool ExitAndCleanup(bool return_value); private: + typedef AttributeValueIndex PositionIndex; + typedef std::map PolygonEdges; + bool GetAddedEdges(); bool GetSubObjects(); bool EncodeMaterialFileName(); bool EncodePositions(); bool EncodeTextureCoordinates(); bool EncodeNormals(); bool EncodeFaces(); + bool EncodePolygonalFaces(); + bool EncodeFaceAttributes(FaceIndex face_id); bool EncodeSubObject(FaceIndex face_id); bool EncodeMaterial(FaceIndex face_id); bool EncodeFaceCorner(FaceIndex face_id, int local_corner_id); + bool EncodeFaceCorner(PointIndex vert_index); void EncodeFloat(float val); void EncodeFloatList(float *vals, int num_vals); void EncodeInt(int32_t val); + bool IsNewEdge(const CornerTable &ct, CornerIndex ci) const; + void FindOriginalFaceEdges(FaceIndex face_index, + const CornerTable &corner_table, + std::vector *triangle_visited, + PolygonEdges *polygon_edges); // Various attributes used by the encoder. If an attribute is not used, it is // set to nullptr. @@ -66,6 +78,9 @@ class ObjEncoder { const PointAttribute *material_att_; const PointAttribute *sub_obj_att_; + // Stores per-corner triangulation information for polygon reconstruction. + const PointAttribute *added_edges_att_; + // Buffer used for encoding float/int numbers. char num_buffer_[20]; diff --git a/contrib/draco/src/draco/io/obj_encoder_test.cc b/contrib/draco/src/draco/io/obj_encoder_test.cc index 4838e56ca..782983fad 100644 --- a/contrib/draco/src/draco/io/obj_encoder_test.cc +++ b/contrib/draco/src/draco/io/obj_encoder_test.cc @@ -16,10 +16,12 @@ #include +#include "draco/attributes/geometry_attribute.h" #include "draco/core/draco_test_base.h" #include "draco/core/draco_test_utils.h" #include "draco/io/file_reader_factory.h" #include "draco/io/file_reader_interface.h" +#include "draco/io/file_utils.h" #include "draco/io/obj_decoder.h" namespace draco { @@ -27,6 +29,8 @@ namespace draco { class ObjEncoderTest : public ::testing::Test { protected: void CompareMeshes(const Mesh *mesh0, const Mesh *mesh1) { + ASSERT_NE(mesh0, nullptr); + ASSERT_NE(mesh1, nullptr); ASSERT_EQ(mesh0->num_faces(), mesh1->num_faces()); ASSERT_EQ(mesh0->num_attributes(), mesh1->num_attributes()); for (size_t att_id = 0; att_id < mesh0->num_attributes(); ++att_id) { @@ -107,4 +111,34 @@ TEST_F(ObjEncoderTest, TestObjEncodingAll) { test_encoding("two_faces_312.obj"); } +TEST_F(ObjEncoderTest, TestObjOctagonPreserved) { + // Test verifies that OBJ encoder can reconstruct and encode an octagon. + // Decode triangulated octagon and an extra attribute for reconstruction. + std::unique_ptr mesh = + ReadMeshFromTestFile("octagon_preserved.drc"); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->num_faces(), 6); + ASSERT_EQ(mesh->NumNamedAttributes(GeometryAttribute::GENERIC), 1); + ASSERT_NE(mesh->GetMetadata()->GetAttributeMetadataByStringEntry( + "name", "added_edges"), + nullptr); + + // Reconstruct octagon and encode it into an OBJ file. + draco::ObjEncoder obj_encoder; + ASSERT_TRUE(obj_encoder.EncodeToFile( + *mesh, draco::GetTestTempFileFullPath("encoded.obj"))); + + // Read encoded OBJ file and golden OBJ file contents into buffers. + std::vector data_encoded; + std::vector data_golden; + ASSERT_TRUE( + ReadFileToBuffer(GetTestTempFileFullPath("encoded.obj"), &data_encoded)); + ASSERT_TRUE(ReadFileToBuffer(GetTestFileFullPath("octagon_preserved.obj"), + &data_golden)); + + // Check that encoded OBJ file contents are correct. + ASSERT_EQ(data_encoded.size(), data_golden.size()); + ASSERT_EQ(data_encoded, data_golden); +} + } // namespace draco diff --git a/contrib/draco/src/draco/io/parser_utils.cc b/contrib/draco/src/draco/io/parser_utils.cc index 12afacff6..378de7378 100644 --- a/contrib/draco/src/draco/io/parser_utils.cc +++ b/contrib/draco/src/draco/io/parser_utils.cc @@ -203,31 +203,40 @@ void ParseLine(DecoderBuffer *buffer, std::string *out_string) { out_string->clear(); } char c; - bool delim_reached = false; + int num_delims = 0; + char last_delim; while (buffer->Peek(&c)) { - // Check if |c| is a delimeter. We want to parse all delimeters until we - // reach a non-delimeter symbol. (E.g. we want to ignore '\r\n' at the end - // of the line). + // Check if |c| is a delimiter symbol. We want to identify all possible + // delimiters that can occur on different platforms (i.e. we want to detect + // '\r\n', '\r', '\n'). const bool is_delim = (c == '\r' || c == '\n'); - // If |c| is a delimeter or it is a non-delimeter symbol before any - // delimeter was found, we advance the buffer to the next character. - if (is_delim || !delim_reached) { - buffer->Advance(1); + if (is_delim) { + if (num_delims == 0) { + last_delim = c; + } else if (num_delims == 1) { + // We already parsed either '\r' or '\n'. Ensure the new delim symbol is + // '\n' and different from the previous symbol. + if (c == last_delim || c != '\n') { + return; // Same delimiter symbol already processed. + } + } else { + // Too many delimiter symbols. + return; + } + num_delims++; } - if (is_delim) { - // Mark that we found a delimeter symbol. - delim_reached = true; - continue; - } - if (delim_reached) { - // We reached a non-delimeter symbol after a delimeter was already found. + if (!is_delim && num_delims > 0) { + // We reached a non-delimiter symbol after a delimiter was already found. // Stop the parsing. return; } - // Otherwise we put the non-delimeter symbol into the output string. - if (out_string) { + + buffer->Advance(1); + + // We put the non-delimiter symbol into the output string. + if (!is_delim && out_string) { out_string->push_back(c); } } diff --git a/contrib/draco/src/draco/io/ply_decoder_test.cc b/contrib/draco/src/draco/io/ply_decoder_test.cc index 97977c8cc..1dd70d5cb 100644 --- a/contrib/draco/src/draco/io/ply_decoder_test.cc +++ b/contrib/draco/src/draco/io/ply_decoder_test.cc @@ -88,6 +88,7 @@ TEST_F(PlyDecoderTest, TestPlyDecodingAll) { // test_decoding("test_pos_color.ply"); // tested test_decoding("cube_quads.ply"); test_decoding("Box.ply"); + test_decoding("delim_test.ply"); } } // namespace draco diff --git a/contrib/draco/src/draco/io/ply_encoder.cc b/contrib/draco/src/draco/io/ply_encoder.cc index 2f6a1a2a8..0fe611f1c 100644 --- a/contrib/draco/src/draco/io/ply_encoder.cc +++ b/contrib/draco/src/draco/io/ply_encoder.cc @@ -143,7 +143,8 @@ bool PlyEncoder::EncodeInternal() { buffer()->Encode(header_str.data(), header_str.length()); // Store point attributes. - for (PointIndex v(0); v < in_point_cloud_->num_points(); ++v) { + const int num_points = in_point_cloud_->num_points(); + for (PointIndex v(0); v < num_points; ++v) { const auto *const pos_att = in_point_cloud_->attribute(pos_att_id); buffer()->Encode(pos_att->GetAddress(pos_att->mapped_index(v)), pos_att->byte_stride()); @@ -166,9 +167,13 @@ bool PlyEncoder::EncodeInternal() { buffer()->Encode(static_cast(3)); const auto &f = in_mesh_->face(i); - buffer()->Encode(f[0]); - buffer()->Encode(f[1]); - buffer()->Encode(f[2]); + for (int c = 0; c < 3; ++c) { + if (f[c] >= num_points) { + // Invalid point stored on the |in_mesh_| face. + return false; + } + buffer()->Encode(f[c]); + } if (tex_coord_att_id >= 0) { // Two coordinates for every corner -> 6. diff --git a/contrib/draco/src/draco/io/ply_reader_test.cc b/contrib/draco/src/draco/io/ply_reader_test.cc index 05ff63dd4..9612f6377 100644 --- a/contrib/draco/src/draco/io/ply_reader_test.cc +++ b/contrib/draco/src/draco/io/ply_reader_test.cc @@ -39,7 +39,7 @@ TEST_F(PlyReaderTest, TestReader) { buf.Init(data.data(), data.size()); PlyReader reader; Status status = reader.Read(&buf); - ASSERT_TRUE(status.ok()) << status; + DRACO_ASSERT_OK(status); ASSERT_EQ(reader.num_elements(), 2); ASSERT_EQ(reader.element(0).num_properties(), 7); ASSERT_EQ(reader.element(1).num_properties(), 1); @@ -64,14 +64,14 @@ TEST_F(PlyReaderTest, TestReaderAscii) { buf.Init(data.data(), data.size()); PlyReader reader; Status status = reader.Read(&buf); - ASSERT_TRUE(status.ok()) << status; + DRACO_ASSERT_OK(status); const std::string file_name_ascii = "test_pos_color_ascii.ply"; const std::vector data_ascii = ReadPlyFile(file_name_ascii); buf.Init(data_ascii.data(), data_ascii.size()); PlyReader reader_ascii; status = reader_ascii.Read(&buf); - ASSERT_TRUE(status.ok()) << status; + DRACO_ASSERT_OK(status); ASSERT_EQ(reader.num_elements(), reader_ascii.num_elements()); ASSERT_EQ(reader.element(0).num_properties(), reader_ascii.element(0).num_properties()); @@ -96,7 +96,7 @@ TEST_F(PlyReaderTest, TestReaderExtraWhitespace) { buf.Init(data.data(), data.size()); PlyReader reader; Status status = reader.Read(&buf); - ASSERT_TRUE(status.ok()) << status; + DRACO_ASSERT_OK(status); ASSERT_EQ(reader.num_elements(), 2); ASSERT_EQ(reader.element(0).num_properties(), 7); @@ -122,7 +122,7 @@ TEST_F(PlyReaderTest, TestReaderMoreDataTypes) { buf.Init(data.data(), data.size()); PlyReader reader; Status status = reader.Read(&buf); - ASSERT_TRUE(status.ok()) << status; + DRACO_ASSERT_OK(status); ASSERT_EQ(reader.num_elements(), 2); ASSERT_EQ(reader.element(0).num_properties(), 7); diff --git a/contrib/draco/src/draco/io/scene_io.cc b/contrib/draco/src/draco/io/scene_io.cc new file mode 100644 index 000000000..e41d2e1fa --- /dev/null +++ b/contrib/draco/src/draco/io/scene_io.cc @@ -0,0 +1,127 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/scene_io.h" + +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/io/file_utils.h" +#include "draco/io/gltf_decoder.h" +#include "draco/io/gltf_encoder.h" +#include "draco/io/obj_encoder.h" +#include "draco/io/ply_encoder.h" + +namespace draco { + +enum SceneFileFormat { UNKNOWN, GLTF, USD, PLY, OBJ }; + +SceneFileFormat GetSceneFileFormat(const std::string &file_name) { + const std::string extension = LowercaseFileExtension(file_name); + if (extension == "gltf" || extension == "glb") { + return GLTF; + } + if (extension == "usd" || extension == "usda" || extension == "usdc" || + extension == "usdz") { + return USD; + } + if (extension == "obj") { + return OBJ; + } + if (extension == "ply") { + return PLY; + } + return UNKNOWN; +} + +StatusOr> ReadSceneFromFile( + const std::string &file_name) { + return ReadSceneFromFile(file_name, nullptr); +} + +StatusOr> ReadSceneFromFile( + const std::string &file_name, std::vector *scene_files) { + std::unique_ptr scene(new Scene()); + switch (GetSceneFileFormat(file_name)) { + case GLTF: { + GltfDecoder decoder; + return decoder.DecodeFromFileToScene(file_name, scene_files); + } + case USD: { + return Status(Status::DRACO_ERROR, "USD is not supported yet."); + } + default: { + return Status(Status::DRACO_ERROR, "Unknown input file format."); + } + } +} + +Status WriteSceneToFile(const std::string &file_name, const Scene &scene) { + Options options; + return WriteSceneToFile(file_name, scene, options); +} + +Status WriteSceneToFile(const std::string &file_name, const Scene &scene, + const Options &options) { + const std::string extension = LowercaseFileExtension(file_name); + std::string folder_path; + std::string out_file_name; + draco::SplitPath(file_name, &folder_path, &out_file_name); + const auto format = GetSceneFileFormat(file_name); + switch (format) { + case GLTF: { + GltfEncoder encoder; + if (!encoder.EncodeToFile(scene, file_name, folder_path)) { + return Status(Status::DRACO_ERROR, "Failed to encode the scene."); + } + return OkStatus(); + } + case USD: { + return Status(Status::DRACO_ERROR, "USD is not supported yet."); + } + case PLY: + case OBJ: { + // Convert the scene to mesh and save the scene as a mesh. For now we do + // that by converting the scene to GLB and decoding the GLB into a mesh. + GltfEncoder gltf_encoder; + EncoderBuffer buffer; + DRACO_RETURN_IF_ERROR(gltf_encoder.EncodeToBuffer(scene, &buffer)); + GltfDecoder gltf_decoder; + DecoderBuffer dec_buffer; + dec_buffer.Init(buffer.data(), buffer.size()); + DRACO_ASSIGN_OR_RETURN(auto mesh, + gltf_decoder.DecodeFromBuffer(&dec_buffer)); + if (format == PLY) { + PlyEncoder ply_encoder; + if (!ply_encoder.EncodeToFile(*mesh, file_name)) { + return ErrorStatus("Failed to encode the scene as PLY."); + } + } + if (format == OBJ) { + ObjEncoder obj_encoder; + if (!obj_encoder.EncodeToFile(*mesh, file_name)) { + return ErrorStatus("Failed to encode the scene as OBJ."); + } + } + return OkStatus(); + } + default: { + return Status(Status::DRACO_ERROR, "Unknown output file format."); + } + } +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/scene_io.h b/contrib/draco/src/draco/io/scene_io.h new file mode 100644 index 000000000..964faac3c --- /dev/null +++ b/contrib/draco/src/draco/io/scene_io.h @@ -0,0 +1,55 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_SCENE_IO_H_ +#define DRACO_IO_SCENE_IO_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/core/options.h" +#include "draco/core/status_or.h" +#include "draco/scene/scene.h" + +namespace draco { + +// Reads a scene from a file. Currently only GLTF 2.0 scene files are supported. +// The second form returns the files associated with the scene via the +// |scene_files| argument. +StatusOr> ReadSceneFromFile( + const std::string &file_name); +StatusOr> ReadSceneFromFile( + const std::string &file_name, std::vector *scene_files); + +// Writes a scene into a file. +Status WriteSceneToFile(const std::string &file_name, const Scene &scene); + +// Writes a scene into a file, configurable with |options|. +// +// Supported options: +// +// force_usd_vertex_interpolation= - forces implicit vertex +// interpolation while exporting to USD +// (default = false) +// +Status WriteSceneToFile(const std::string &file_name, const Scene &scene, + const Options &options); + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_SCENE_IO_H_ diff --git a/contrib/draco/src/draco/io/scene_io_test.cc b/contrib/draco/src/draco/io/scene_io_test.cc new file mode 100644 index 000000000..828065693 --- /dev/null +++ b/contrib/draco/src/draco/io/scene_io_test.cc @@ -0,0 +1,86 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/scene_io.h" + +#include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/draco_test_utils.h" +#include "draco/io/file_utils.h" +#include "draco/io/mesh_io.h" + +namespace { + +TEST(SceneTest, TestSceneIO) { + // A simple test that verifies that the scene is loaded and saved using the + // scene_io.h API. + const std::string file_name = + draco::GetTestFileFullPath("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + draco::StatusOr> maybe_scene = + draco::ReadSceneFromFile(file_name); + ASSERT_TRUE(maybe_scene.status().ok()); + std::unique_ptr scene = std::move(maybe_scene).value(); + ASSERT_NE(scene, nullptr); + + const std::string out_file_name = + draco::GetTestTempFileFullPath("out_scene.gltf"); + ASSERT_TRUE(draco::WriteSceneToFile(out_file_name, *scene).ok()); + + // Ensure all files related to the scene are saved. + ASSERT_GT(draco::GetFileSize(out_file_name), 0); + ASSERT_GT( + draco::GetFileSize(draco::GetTestTempFileFullPath("CesiumMilkTruck.png")), + 0); + ASSERT_GT(draco::GetFileSize(draco::GetTestTempFileFullPath("buffer0.bin")), + 0); +} + +TEST(SceneTest, TestSaveToPly) { + // A simple test that verifies that a loaded scene can be stored in a PLY file + // format. + const std::string file_name = + draco::GetTestFileFullPath("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr scene, + draco::ReadSceneFromFile(file_name)); + + const std::string out_file_name = + draco::GetTestTempFileFullPath("out_scene.ply"); + DRACO_ASSERT_OK(draco::WriteSceneToFile(out_file_name, *scene)); + + // Verify that we can read the saved mesh. + DRACO_ASSIGN_OR_ASSERT(auto mesh, draco::ReadMeshFromFile(out_file_name)); + ASSERT_NE(mesh, nullptr); +} + +TEST(SceneTest, TestSaveToObj) { + // A simple test that verifies that a loaded scene can be stored in an OBJ + // file format. + const std::string file_name = + draco::GetTestFileFullPath("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr scene, + draco::ReadSceneFromFile(file_name)); + + const std::string out_file_name = + draco::GetTestTempFileFullPath("out_scene.obj"); + DRACO_ASSERT_OK(draco::WriteSceneToFile(out_file_name, *scene)); + + // Verify that we can read the saved mesh. + DRACO_ASSIGN_OR_ASSERT(auto mesh, draco::ReadMeshFromFile(out_file_name)); + ASSERT_NE(mesh, nullptr); +} + +} // namespace +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/stdio_file_reader_test.cc b/contrib/draco/src/draco/io/stdio_file_reader_test.cc index 487819a02..212945f90 100644 --- a/contrib/draco/src/draco/io/stdio_file_reader_test.cc +++ b/contrib/draco/src/draco/io/stdio_file_reader_test.cc @@ -9,7 +9,7 @@ namespace { TEST(StdioFileReaderTest, FailOpen) { EXPECT_EQ(StdioFileReader::Open(""), nullptr); - EXPECT_EQ(StdioFileReader::Open("fake file"), nullptr); + EXPECT_EQ(StdioFileReader::Open("stdio reader fake file"), nullptr); } TEST(StdioFileReaderTest, Open) { diff --git a/contrib/draco/src/draco/io/stl_decoder.cc b/contrib/draco/src/draco/io/stl_decoder.cc new file mode 100644 index 000000000..1e5d3a938 --- /dev/null +++ b/contrib/draco/src/draco/io/stl_decoder.cc @@ -0,0 +1,77 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/stl_decoder.h" + +#include + +#include "draco/core/macros.h" +#include "draco/core/status.h" +#include "draco/core/status_or.h" +#include "draco/io/file_utils.h" +#include "draco/mesh/triangle_soup_mesh_builder.h" + +namespace draco { + +StatusOr> StlDecoder::DecodeFromFile( + const std::string &file_name) { + std::vector data; + if (!ReadFileToBuffer(file_name, &data)) { + return Status(Status::IO_ERROR, "Unable to read input file."); + } + DecoderBuffer buffer; + buffer.Init(data.data(), data.size()); + return DecodeFromBuffer(&buffer); +} + +StatusOr> StlDecoder::DecodeFromBuffer( + DecoderBuffer *buffer) { + if (!strncmp(buffer->data_head(), "solid ", 6)) { + return Status(Status::IO_ERROR, + "Currently only binary STL files are supported."); + } + buffer->Advance(80); + uint32_t face_count; + buffer->Decode(&face_count, 4); + + TriangleSoupMeshBuilder builder; + builder.Start(face_count); + + const int32_t pos_att_id = + builder.AddAttribute(GeometryAttribute::POSITION, 3, DT_FLOAT32); + const int32_t norm_att_id = + builder.AddAttribute(GeometryAttribute::NORMAL, 3, DT_FLOAT32); + + for (uint32_t i = 0; i < face_count; i++) { + float data[48]; + buffer->Decode(data, 48); + uint16_t unused; + buffer->Decode(&unused, 2); + + builder.SetPerFaceAttributeValueForFace( + norm_att_id, draco::FaceIndex(i), + draco::Vector3f(data[0], data[1], data[2]).data()); + + builder.SetAttributeValuesForFace( + pos_att_id, draco::FaceIndex(i), + draco::Vector3f(data[3], data[4], data[5]).data(), + draco::Vector3f(data[6], data[7], data[8]).data(), + draco::Vector3f(data[9], data[10], data[11]).data()); + } + + std::unique_ptr mesh = builder.Finalize(); + return mesh; +} + +} // namespace draco diff --git a/contrib/draco/src/draco/io/stl_decoder.h b/contrib/draco/src/draco/io/stl_decoder.h new file mode 100644 index 000000000..44b35d849 --- /dev/null +++ b/contrib/draco/src/draco/io/stl_decoder.h @@ -0,0 +1,38 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_STL_DECODER_H_ +#define DRACO_IO_STL_DECODER_H_ + +#include + +#include "draco/core/decoder_buffer.h" +#include "draco/core/status.h" +#include "draco/core/status_or.h" +#include "draco/draco_features.h" +#include "draco/mesh/mesh.h" + +namespace draco { + +// Decodes an STL file into draco::Mesh (or draco::PointCloud if the +// connectivity data is not needed). +class StlDecoder { + public: + StatusOr> DecodeFromFile(const std::string &file_name); + StatusOr> DecodeFromBuffer(DecoderBuffer *buffer); +}; + +} // namespace draco + +#endif // DRACO_IO_STL_DECODER_H_ diff --git a/contrib/draco/src/draco/io/stl_decoder_test.cc b/contrib/draco/src/draco/io/stl_decoder_test.cc new file mode 100644 index 000000000..886881925 --- /dev/null +++ b/contrib/draco/src/draco/io/stl_decoder_test.cc @@ -0,0 +1,49 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/stl_decoder.h" + +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace draco { + +class StlDecoderTest : public ::testing::Test { + protected: + void test_decoding(const std::string &file_name) { + const std::string path = GetTestFileFullPath(file_name); + StlDecoder decoder; + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr mesh, + decoder.DecodeFromFile(path)); + ASSERT_GT(mesh->num_faces(), 0); + ASSERT_GT(mesh->num_points(), 0); + } + + void test_decoding_should_fail(const std::string &file_name) { + StlDecoder decoder; + StatusOr> statusOrMesh = + decoder.DecodeFromFile(GetTestFileFullPath(file_name)); + ASSERT_FALSE(statusOrMesh.ok()); + } +}; + +TEST_F(StlDecoderTest, TestStlDecoding) { + test_decoding("STL/bunny.stl"); + test_decoding("STL/test_sphere.stl"); + test_decoding_should_fail("STL/test_sphere_ascii.stl"); +} + +} // namespace draco diff --git a/contrib/draco/src/draco/io/stl_encoder.cc b/contrib/draco/src/draco/io/stl_encoder.cc new file mode 100644 index 000000000..5aa4a0a97 --- /dev/null +++ b/contrib/draco/src/draco/io/stl_encoder.cc @@ -0,0 +1,111 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/stl_encoder.h" + +#include +#include +#include +#include + +#include "draco/io/file_writer_factory.h" +#include "draco/io/file_writer_interface.h" + +namespace draco { + +StlEncoder::StlEncoder() + : out_buffer_(nullptr), in_point_cloud_(nullptr), in_mesh_(nullptr) {} + +Status StlEncoder::EncodeToFile(const Mesh &mesh, + const std::string &file_name) { + in_mesh_ = &mesh; + std::unique_ptr file = + FileWriterFactory::OpenWriter(file_name); + if (!file) { + return Status(Status::IO_ERROR, "File couldn't be opened"); + } + // Encode the mesh into a buffer. + EncoderBuffer buffer; + DRACO_RETURN_IF_ERROR(EncodeToBuffer(mesh, &buffer)); + // Write the buffer into the file. + file->Write(buffer.data(), buffer.size()); + return OkStatus(); +} + +Status StlEncoder::EncodeToBuffer(const Mesh &mesh, EncoderBuffer *out_buffer) { + in_mesh_ = &mesh; + out_buffer_ = out_buffer; + Status s = EncodeInternal(); + in_mesh_ = nullptr; // cleanup + in_point_cloud_ = nullptr; + out_buffer_ = nullptr; + return s; +} + +Status StlEncoder::EncodeInternal() { + // Write STL header. + std::stringstream out; + out << std::left << std::setw(80) + << "generated using Draco"; // header is 80 bytes fixed size. + const std::string header_str = out.str(); + buffer()->Encode(header_str.data(), header_str.length()); + + uint32_t num_faces = in_mesh_->num_faces(); + buffer()->Encode(&num_faces, 4); + + std::vector stl_face; + + const int pos_att_id = + in_mesh_->GetNamedAttributeId(GeometryAttribute::POSITION); + + if (pos_att_id < 0) { + return ErrorStatus("Mesh is missing the position attribute."); + } + + if (in_mesh_->attribute(pos_att_id)->data_type() != DT_FLOAT32) { + return ErrorStatus("Mesh position attribute is not of type float32."); + } + + uint16_t unused = 0; + + if (in_mesh_) { + for (FaceIndex i(0); i < in_mesh_->num_faces(); ++i) { + const auto &f = in_mesh_->face(i); + const auto *const pos_att = in_mesh_->attribute(pos_att_id); + + // The normal attribute can contain arbitrary normals that may not + // correspond to the winding of the face. + // Therefor we simply always calculate them + // using the points of the triangle face: norm(cross(p2-p1, p3-p1)) + + Vector3f pos[3]; + pos_att->GetMappedValue(f[0], &pos[0][0]); + pos_att->GetMappedValue(f[1], &pos[1][0]); + pos_att->GetMappedValue(f[2], &pos[2][0]); + Vector3f norm = CrossProduct(pos[1] - pos[0], pos[2] - pos[0]); + norm.Normalize(); + buffer()->Encode(norm.data(), sizeof(float) * 3); + + for (int c = 0; c < 3; ++c) { + buffer()->Encode(pos_att->GetAddress(pos_att->mapped_index(f[c])), + pos_att->byte_stride()); + } + + buffer()->Encode(&unused, 2); + } + } + return OkStatus(); +} + +} // namespace draco diff --git a/contrib/draco/src/draco/io/stl_encoder.h b/contrib/draco/src/draco/io/stl_encoder.h new file mode 100644 index 000000000..8b185b738 --- /dev/null +++ b/contrib/draco/src/draco/io/stl_encoder.h @@ -0,0 +1,52 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_STL_ENCODER_H_ +#define DRACO_IO_STL_ENCODER_H_ + +#include + +#include "draco/core/encoder_buffer.h" +#include "draco/draco_features.h" +#include "draco/mesh/mesh.h" + +namespace draco { + +// Class for encoding draco::Mesh into the STL file format. +class StlEncoder { + public: + StlEncoder(); + + // Encodes the mesh and saves it into a file. + // Returns false when either the encoding failed or when the file couldn't be + // opened. + Status EncodeToFile(const Mesh &mesh, const std::string &file_name); + + // Encodes the mesh into a buffer. + Status EncodeToBuffer(const Mesh &mesh, EncoderBuffer *out_buffer); + + protected: + Status EncodeInternal(); + EncoderBuffer *buffer() const { return out_buffer_; } + + private: + EncoderBuffer *out_buffer_; + + const PointCloud *in_point_cloud_; + const Mesh *in_mesh_; +}; + +} // namespace draco + +#endif // DRACO_IO_STL_ENCODER_H_ diff --git a/contrib/draco/src/draco/io/stl_encoder_test.cc b/contrib/draco/src/draco/io/stl_encoder_test.cc new file mode 100644 index 000000000..da6298d64 --- /dev/null +++ b/contrib/draco/src/draco/io/stl_encoder_test.cc @@ -0,0 +1,78 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/stl_encoder.h" + +#include +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/io/file_reader_factory.h" +#include "draco/io/file_reader_interface.h" +#include "draco/io/stl_decoder.h" + +namespace draco { + +class StlEncoderTest : public ::testing::Test { + protected: + void CompareMeshes(const Mesh *mesh0, const Mesh *mesh1) { + ASSERT_EQ(mesh0->num_faces(), mesh1->num_faces()); + ASSERT_EQ(mesh0->num_attributes(), mesh1->num_attributes()); + for (size_t att_id = 0; att_id < mesh0->num_attributes(); ++att_id) { + ASSERT_EQ(mesh0->attribute(att_id)->size(), + mesh1->attribute(att_id)->size()); + } + } + + // Encode a mesh using the StlEncoder and then decode to verify the encoding. + std::unique_ptr EncodeAndDecodeMesh(const Mesh *mesh) { + EncoderBuffer encoder_buffer; + StlEncoder encoder; + Status status = encoder.EncodeToBuffer(*mesh, &encoder_buffer); + if (!status.ok()) { + return nullptr; + } + + DecoderBuffer decoder_buffer; + decoder_buffer.Init(encoder_buffer.data(), encoder_buffer.size()); + StlDecoder decoder; + StatusOr> status_or_mesh = + decoder.DecodeFromBuffer(&decoder_buffer); + if (!status_or_mesh.ok()) { + return nullptr; + } + std::unique_ptr decoded_mesh = std::move(status_or_mesh).value(); + return decoded_mesh; + } + + void test_encoding(const std::string &file_name) { + const std::unique_ptr mesh(ReadMeshFromTestFile(file_name, true)); + + ASSERT_NE(mesh, nullptr) << "Failed to load test model " << file_name; + ASSERT_GT(mesh->num_faces(), 0); + + const std::unique_ptr decoded_mesh = EncodeAndDecodeMesh(mesh.get()); + CompareMeshes(mesh.get(), decoded_mesh.get()); + } +}; + +TEST_F(StlEncoderTest, TestStlEncoding) { + // Test decoded mesh from encoded stl file stays the same. + test_encoding("STL/bunny.stl"); + test_encoding("STL/test_sphere.stl"); +} + +} // namespace draco diff --git a/contrib/draco/src/draco/io/texture_io.cc b/contrib/draco/src/draco/io/texture_io.cc new file mode 100644 index 000000000..cbe2915b0 --- /dev/null +++ b/contrib/draco/src/draco/io/texture_io.cc @@ -0,0 +1,94 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/texture_io.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include "draco/io/file_utils.h" + +namespace draco { + +namespace { + +StatusOr> CreateDracoTextureInternal( + const std::vector &image_data, SourceImage *out_source_image) { + std::unique_ptr draco_texture(new Texture()); + out_source_image->MutableEncodedData() = image_data; + return std::move(draco_texture); +} + +} // namespace + +StatusOr> ReadTextureFromFile( + const std::string &file_name) { + std::vector image_data; + if (!ReadFileToBuffer(file_name, &image_data)) { + return Status(Status::IO_ERROR, "Unable to read input texture file."); + } + + SourceImage source_image; + DRACO_ASSIGN_OR_RETURN(auto texture, + CreateDracoTextureInternal(image_data, &source_image)); + source_image.set_filename(file_name); + const std::string extension = LowercaseFileExtension(file_name); + const std::string mime_type = + "image/" + (extension == "jpg" ? "jpeg" : extension); + source_image.set_mime_type(mime_type); + texture->set_source_image(source_image); + return texture; +} + +StatusOr> ReadTextureFromBuffer( + const uint8_t *buffer, size_t buffer_size, const std::string &mime_type) { + SourceImage source_image; + std::vector image_data(buffer, buffer + buffer_size); + DRACO_ASSIGN_OR_RETURN(auto texture, + CreateDracoTextureInternal(image_data, &source_image)); + source_image.set_mime_type(mime_type); + texture->set_source_image(source_image); + return texture; +} + +Status WriteTextureToFile(const std::string &file_name, + const Texture &texture) { + std::vector buffer; + DRACO_RETURN_IF_ERROR(WriteTextureToBuffer(texture, &buffer)); + + if (!WriteBufferToFile(buffer.data(), buffer.size(), file_name)) { + return Status(Status::DRACO_ERROR, "Failed to write image."); + } + + return OkStatus(); +} + +Status WriteTextureToBuffer(const Texture &texture, + std::vector *buffer) { + // Copy data from the encoded source image if possible, otherwise load the + // data from the source file. + if (!texture.source_image().encoded_data().empty()) { + *buffer = texture.source_image().encoded_data(); + } else if (!texture.source_image().filename().empty()) { + if (!ReadFileToBuffer(texture.source_image().filename(), buffer)) { + return Status(Status::IO_ERROR, "Unable to read input texture file."); + } + } else { + return Status(Status::DRACO_ERROR, "Invalid source data for the texture."); + } + return OkStatus(); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/texture_io.h b/contrib/draco/src/draco/io/texture_io.h new file mode 100644 index 000000000..4dbea7554 --- /dev/null +++ b/contrib/draco/src/draco/io/texture_io.h @@ -0,0 +1,56 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_TEXTURE_IO_H_ +#define DRACO_IO_TEXTURE_IO_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +#include "draco/core/draco_types.h" +#include "draco/core/status_or.h" +#include "draco/texture/texture.h" + +namespace draco { + +// Reads a texture from a file. Reads PNG, JPEG and WEBP texture files. +// Returns nullptr with an error status if the decoding failed. +StatusOr> ReadTextureFromFile( + const std::string &file_name); + +// Same as ReadTextureFromFile() but the texture data is parsed from a |buffer|. +// |mime_type| should be set to a type of the texture encoded in |buffer|. +// Supported mime types are "image/jpeg", "image/png" and "image/webp". +// TODO(ostava): We should be able to get the mime type directly from the +// |buffer| but our image decoding library doesn't support this at this time. +StatusOr> ReadTextureFromBuffer( + const uint8_t *buffer, size_t buffer_size, const std::string &mime_type); + +// Writes a texture into a file. Can write PNG, JPEG, WEBP, and KTX2 (with Basis +// compression) texture files depending on the extension specified in +// |file_name| and image format specified in |texture|. Note that images with +// Basis compression can only be saved to files in KTX2 format and not to files +// with "basis" extension. Returns an error status if the writing failed. +Status WriteTextureToFile(const std::string &file_name, const Texture &texture); + +// Writes a |texture| into |buffer|. +Status WriteTextureToBuffer(const Texture &texture, + std::vector *buffer); + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_TEXTURE_IO_H_ diff --git a/contrib/draco/src/draco/io/texture_io_test.cc b/contrib/draco/src/draco/io/texture_io_test.cc new file mode 100644 index 000000000..13f36e44a --- /dev/null +++ b/contrib/draco/src/draco/io/texture_io_test.cc @@ -0,0 +1,55 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/texture_io.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include +#include +#include + +#include "draco/core/draco_test_utils.h" +#include "draco/io/file_utils.h" + +namespace { + +// Tests loading of textures from a buffer. +TEST(TextureIoTest, TestLoadFromBuffer) { + const std::string file_name = draco::GetTestFileFullPath("test.png"); + std::vector image_data; + ASSERT_TRUE(draco::ReadFileToBuffer(file_name, &image_data)); + + DRACO_ASSIGN_OR_ASSERT( + std::unique_ptr texture, + draco::ReadTextureFromBuffer(image_data.data(), image_data.size(), + "image/png")); + ASSERT_NE(texture, nullptr); + + ASSERT_EQ(texture->source_image().mime_type(), "image/png"); + + // Re-encode the texture again to ensure the content hasn't changed. + std::vector encoded_buffer; + DRACO_ASSERT_OK(draco::WriteTextureToBuffer(*texture, &encoded_buffer)); + + ASSERT_EQ(image_data.size(), encoded_buffer.size()); + for (int i = 0; i < encoded_buffer.size(); ++i) { + ASSERT_EQ(image_data[i], encoded_buffer[i]); + } +} + +} // namespace + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/tiny_gltf_utils.cc b/contrib/draco/src/draco/io/tiny_gltf_utils.cc new file mode 100644 index 000000000..d57e1093c --- /dev/null +++ b/contrib/draco/src/draco/io/tiny_gltf_utils.cc @@ -0,0 +1,230 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/io/tiny_gltf_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/animation/animation.h" +#include "draco/animation/node_animation_data.h" +#include "draco/core/status.h" +#include "draco/core/vector_d.h" +#include "tiny_gltf.h" + +namespace draco { + +int TinyGltfUtils::GetNumComponentsForType(int type) { + switch (type) { + case TINYGLTF_TYPE_SCALAR: + return 1; + case TINYGLTF_TYPE_VEC2: + return 2; + case TINYGLTF_TYPE_VEC3: + return 3; + case TINYGLTF_TYPE_VEC4: + case TINYGLTF_TYPE_MAT2: + return 4; + case TINYGLTF_TYPE_MAT3: + return 9; + case TINYGLTF_TYPE_MAT4: + return 16; + } + return 0; +} + +Material::TransparencyMode TinyGltfUtils::TextToMaterialMode( + const std::string &mode) { + if (mode == "MASK") { + return Material::TRANSPARENCY_MASK; + } else if (mode == "BLEND") { + return Material::TRANSPARENCY_BLEND; + } else { + return Material::TRANSPARENCY_OPAQUE; + } +} + +AnimationSampler::SamplerInterpolation +TinyGltfUtils::TextToSamplerInterpolation(const std::string &interpolation) { + if (interpolation == "STEP") { + return AnimationSampler::SamplerInterpolation::STEP; + } else if (interpolation == "CUBICSPLINE") { + return AnimationSampler::SamplerInterpolation::CUBICSPLINE; + } else { + return AnimationSampler::SamplerInterpolation::LINEAR; + } +} + +AnimationChannel::ChannelTransformation +TinyGltfUtils::TextToChannelTransformation(const std::string &path) { + if (path == "rotation") { + return AnimationChannel::ChannelTransformation::ROTATION; + } else if (path == "scale") { + return AnimationChannel::ChannelTransformation::SCALE; + } else if (path == "weights") { + return AnimationChannel::ChannelTransformation::WEIGHTS; + } else { + return AnimationChannel::ChannelTransformation::TRANSLATION; + } +} + +Status TinyGltfUtils::AddChannelToAnimation( + const tinygltf::Model &model, const tinygltf::Animation &input_animation, + const tinygltf::AnimationChannel &channel, int node_index, + Animation *animation) { + std::unique_ptr new_channel(new AnimationChannel()); + + const tinygltf::AnimationSampler &sampler = + input_animation.samplers[channel.sampler]; + // Add the sampler associated with the channel. + DRACO_RETURN_IF_ERROR( + TinyGltfUtils::AddSamplerToAnimation(model, sampler, animation)); + new_channel->sampler_index = animation->NumSamplers() - 1; + new_channel->target_index = node_index; + new_channel->transformation_type = + TinyGltfUtils::TextToChannelTransformation(channel.target_path); + + animation->AddChannel(std::move(new_channel)); + return OkStatus(); +} + +Status TinyGltfUtils::AddSamplerToAnimation( + const tinygltf::Model &model, const tinygltf::AnimationSampler &sampler, + Animation *animation) { + std::unique_ptr node_animation_data( + new NodeAnimationData()); + // TODO(fgalligan): Add support to not copy the accessor data if it is + // referenced more than once. Currently we duplicate all animation data so + // that it is referenced only once in the glTF file. + const tinygltf::Accessor &input_accessor = model.accessors[sampler.input]; + DRACO_RETURN_IF_ERROR(AddAccessorToAnimationData(model, input_accessor, + node_animation_data.get())); + animation->AddNodeAnimationData(std::move(node_animation_data)); + std::unique_ptr new_sampler(new AnimationSampler()); + new_sampler->input_index = animation->NumNodeAnimationData() - 1; + + node_animation_data.reset(new NodeAnimationData()); + const tinygltf::Accessor &output_accessor = model.accessors[sampler.output]; + DRACO_RETURN_IF_ERROR(AddAccessorToAnimationData(model, output_accessor, + node_animation_data.get())); + animation->AddNodeAnimationData(std::move(node_animation_data)); + new_sampler->output_index = animation->NumNodeAnimationData() - 1; + + new_sampler->interpolation_type = + TinyGltfUtils::TextToSamplerInterpolation(sampler.interpolation); + animation->AddSampler(std::move(new_sampler)); + return OkStatus(); +} + +// Specialization for returning the data from |accessor| as a vector of float. +template <> +StatusOr> TinyGltfUtils::CopyDataAsFloat( + const tinygltf::Model &model, const tinygltf::Accessor &accessor) { + const int num_components = GetNumComponentsForType(accessor.type); + if (num_components != 1) { + return Status(Status::DRACO_ERROR, + "Dimension does not equal num components."); + } + return CopyDataAsFloatImpl(model, accessor); +} + +// Specialization for returing the data from |accessor| as a vector of +// Matrix4x4. +template <> +StatusOr> TinyGltfUtils::CopyDataAsFloat( + const tinygltf::Model &model, const tinygltf::Accessor &accessor) { + const int num_components = GetNumComponentsForType(accessor.type); + if (num_components != 16) { + return Status(Status::DRACO_ERROR, + "Dimension does not equal num components."); + } + return CopyDataAsFloatImpl(model, accessor); +} + +Status TinyGltfUtils::AddAccessorToAnimationData( + const tinygltf::Model &model, const tinygltf::Accessor &accessor, + NodeAnimationData *node_animation_data) { + if (accessor.componentType != TINYGLTF_COMPONENT_TYPE_FLOAT) { + return Status(Status::DRACO_ERROR, + "Unsupported ComponentType for NodeAnimationData."); + } + + std::vector *dest_data = node_animation_data->GetMutableData(); + if (accessor.type == TINYGLTF_TYPE_SCALAR) { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAsFloat(model, accessor)); + + for (int i = 0; i < data.size(); ++i) { + dest_data->push_back(data[i]); + } + node_animation_data->SetType(NodeAnimationData::Type::SCALAR); + } else if (accessor.type == TINYGLTF_TYPE_VEC3) { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAsFloat(model, accessor)); + + for (int i = 0; i < data.size(); ++i) { + for (int j = 0; j < 3; ++j) { + dest_data->push_back(data[i][j]); + } + } + node_animation_data->SetType(NodeAnimationData::Type::VEC3); + } else if (accessor.type == TINYGLTF_TYPE_VEC4) { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAsFloat(model, accessor)); + + for (int i = 0; i < data.size(); ++i) { + for (int j = 0; j < 4; ++j) { + dest_data->push_back(data[i][j]); + } + } + node_animation_data->SetType(NodeAnimationData::Type::VEC4); + } else if (accessor.type == TINYGLTF_TYPE_MAT4) { + DRACO_ASSIGN_OR_RETURN(std::vector data, + CopyDataAsFloat(model, accessor)); + + for (int i = 0; i < data.size(); ++i) { + for (int j = 0; j < 16; ++j) { + dest_data->push_back(data[i](j)); + } + } + node_animation_data->SetType(NodeAnimationData::Type::MAT4); + } else { + return Status(Status::DRACO_ERROR, + "Unsupported Type for GltfNodeAnimationData."); + } + node_animation_data->SetCount(accessor.count); + node_animation_data->SetNormalized(accessor.normalized); + return OkStatus(); +} + +template <> +void TinyGltfUtils::SetDataImpl(float value, int index, float *values) { + *values = value; +} + +template <> +void TinyGltfUtils::SetDataImpl(float value, int index, + Eigen::Matrix4f *values) { + (*values)(index) = value; +} + +} // namespace draco + +// Actual definitions needed by the tinygltf library using our configuration. +#define STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_WRITE_IMPLEMENTATION +#define TINYGLTF_ENABLE_DRACO +#define TINYGLTF_IMPLEMENTATION + +#include "tiny_gltf.h" + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/io/tiny_gltf_utils.h b/contrib/draco/src/draco/io/tiny_gltf_utils.h new file mode 100644 index 000000000..a536a70fb --- /dev/null +++ b/contrib/draco/src/draco/io/tiny_gltf_utils.h @@ -0,0 +1,140 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_IO_TINY_GLTF_UTILS_H_ +#define DRACO_IO_TINY_GLTF_UTILS_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "Eigen/Geometry" +#include "draco/animation/animation.h" +#include "draco/core/status.h" +#include "draco/core/status_or.h" +#include "draco/material/material.h" + +#define TINYGLTF_ENCLOSING_NAMESPACE draco +#include "tiny_gltf.h" + +namespace draco { + +class TinyGltfUtils { + public: + TinyGltfUtils() {} + + // Returns the number of components for the attribute type. + static int GetNumComponentsForType(int type); + + // Returns the material transparency mode in |mode|. + static Material::TransparencyMode TextToMaterialMode(const std::string &mode); + + // Returns the animation sampler interpolation in |interpolation|. + static AnimationSampler::SamplerInterpolation TextToSamplerInterpolation( + const std::string &interpolation); + + // Returns the animation channel transformation in |path|. + static AnimationChannel::ChannelTransformation TextToChannelTransformation( + const std::string &path); + + // Adds all of the animation data associated with a channel. + // The channel references a sampler, whose data will be added to the + // |animation|. The sampler references input and output accessors, + // whose data will be added to the |animation|. + static Status AddChannelToAnimation( + const tinygltf::Model &model, const tinygltf::Animation &input_animation, + const tinygltf::AnimationChannel &channel, int node_index, + Animation *animation); + + // Adds all of the sampler data. The sampler references + // input and output accessors, whose data will be added to the |animation|. + static Status AddSamplerToAnimation(const tinygltf::Model &model, + const tinygltf::AnimationSampler &sampler, + Animation *animation); + + // Converts the gltf2 animation accessor and adds it to + // |node_animation_data|. + static Status AddAccessorToAnimationData( + const tinygltf::Model &model, const tinygltf::Accessor &accessor, + NodeAnimationData *node_animation_data); + + // Returns the data from |accessor| as a vector of |T|. + template + static StatusOr> CopyDataAsFloat( + const tinygltf::Model &model, const tinygltf::Accessor &accessor) { + const int num_components = GetNumComponentsForType(accessor.type); + if (num_components != T::dimension) { + return Status(Status::DRACO_ERROR, + "Dimension does not equal num components."); + } + return CopyDataAsFloatImpl(model, accessor); + } + + private: + template + static StatusOr> CopyDataAsFloatImpl( + const tinygltf::Model &model, const tinygltf::Accessor &accessor) { + if (accessor.componentType != TINYGLTF_COMPONENT_TYPE_FLOAT) { + return Status(Status::DRACO_ERROR, + "Non-float data is not supported by CopyDataAsFloat()."); + } + if (accessor.bufferView < 0) { + return Status(Status::DRACO_ERROR, + "Error CopyDataAsFloat() bufferView < 0."); + } + + const tinygltf::BufferView &buffer_view = + model.bufferViews[accessor.bufferView]; + if (buffer_view.buffer < 0) { + return Status(Status::DRACO_ERROR, "Error CopyDataAsFloat() buffer < 0."); + } + + const tinygltf::Buffer &buffer = model.buffers[buffer_view.buffer]; + + const unsigned char *const data_start = + buffer.data.data() + buffer_view.byteOffset + accessor.byteOffset; + const int byte_stride = accessor.ByteStride(buffer_view); + const int component_size = + tinygltf::GetComponentSizeInBytes(accessor.componentType); + + std::vector output; + output.resize(accessor.count); + + const int num_components = GetNumComponentsForType(accessor.type); + const unsigned char *data = data_start; + for (int i = 0; i < accessor.count; ++i) { + T values; + + for (int c = 0; c < num_components; ++c) { + float value = 0.0f; + memcpy(&value, data + (c * component_size), component_size); + SetDataImpl(value, c, &values); + } + + output[i] = values; + data += byte_stride; + } + + return output; + } + + template + static void SetDataImpl(float value, int index, T *values) { + (*values)[index] = value; + } +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_IO_TINY_GLTF_UTILS_H_ diff --git a/contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.cc b/contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.cc deleted file mode 100644 index 7e9e6d15d..000000000 --- a/contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.cc +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2017 The Draco Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -#include "draco/javascript/emscripten/animation_decoder_webidl_wrapper.h" - -#include - -#include "draco/compression/decode.h" -#include "draco/mesh/mesh.h" -#include "draco/mesh/mesh_stripifier.h" - -using draco::DecoderBuffer; -using draco::PointAttribute; -using draco::Status; - -DracoFloat32Array::DracoFloat32Array() {} - -float DracoFloat32Array::GetValue(int index) const { return values_[index]; } - -bool DracoFloat32Array::SetValues(const float *values, int count) { - if (values) { - values_.assign(values, values + count); - } else { - values_.resize(count); - } - return true; -} - -AnimationDecoder::AnimationDecoder() {} - -// Decodes animation data from the provided buffer. -const draco::Status *AnimationDecoder::DecodeBufferToKeyframeAnimation( - draco::DecoderBuffer *in_buffer, draco::KeyframeAnimation *animation) { - draco::DecoderOptions dec_options; - last_status_ = decoder_.Decode(dec_options, in_buffer, animation); - return &last_status_; -} - -bool AnimationDecoder::GetTimestamps(const draco::KeyframeAnimation &animation, - DracoFloat32Array *timestamp) { - if (!timestamp) { - return false; - } - const int num_frames = animation.num_frames(); - const draco::PointAttribute *timestamp_att = animation.timestamps(); - // Timestamp attribute has only 1 component, so the number of components is - // equal to the number of frames. - timestamp->SetValues(nullptr, num_frames); - int entry_id = 0; - float timestamp_value = -1.0; - for (draco::PointIndex i(0); i < num_frames; ++i) { - const draco::AttributeValueIndex val_index = timestamp_att->mapped_index(i); - if (!timestamp_att->ConvertValue(val_index, ×tamp_value)) { - return false; - } - timestamp->SetValue(entry_id++, timestamp_value); - } - return true; -} - -bool AnimationDecoder::GetKeyframes(const draco::KeyframeAnimation &animation, - int keyframes_id, - DracoFloat32Array *animation_data) { - const int num_frames = animation.num_frames(); - // Get animation data. - const draco::PointAttribute *animation_data_att = - animation.keyframes(keyframes_id); - if (!animation_data_att) { - return false; - } - - const int components = animation_data_att->num_components(); - const int num_entries = num_frames * components; - const int kMaxAttributeFloatValues = 4; - - std::vector values(components, -1.0); - int entry_id = 0; - animation_data->SetValues(nullptr, num_entries); - for (draco::PointIndex i(0); i < num_frames; ++i) { - const draco::AttributeValueIndex val_index = - animation_data_att->mapped_index(i); - if (!animation_data_att->ConvertValue(val_index, &values[0])) { - return false; - } - for (int j = 0; j < components; ++j) { - animation_data->SetValue(entry_id++, values[j]); - } - } - return true; -} diff --git a/contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.h b/contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.h deleted file mode 100644 index 7486d1503..000000000 --- a/contrib/draco/src/draco/javascript/emscripten/animation_decoder_webidl_wrapper.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2017 The Draco Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -#ifndef DRACO_JAVASCRIPT_EMSCRIPTEN_ANIMATION_DECODER_WEBIDL_WRAPPER_H_ -#define DRACO_JAVASCRIPT_EMSCRIPTEN_ANIMATION_DECODER_WEBIDL_WRAPPER_H_ - -#include - -#include "draco/animation/keyframe_animation_decoder.h" -#include "draco/attributes/attribute_transform_type.h" -#include "draco/attributes/point_attribute.h" -#include "draco/compression/config/compression_shared.h" -#include "draco/compression/decode.h" -#include "draco/core/decoder_buffer.h" - -typedef draco::AttributeTransformType draco_AttributeTransformType; -typedef draco::GeometryAttribute draco_GeometryAttribute; -typedef draco_GeometryAttribute::Type draco_GeometryAttribute_Type; -typedef draco::EncodedGeometryType draco_EncodedGeometryType; -typedef draco::Status draco_Status; -typedef draco::Status::Code draco_StatusCode; - -class DracoFloat32Array { - public: - DracoFloat32Array(); - float GetValue(int index) const; - - // In case |values| is nullptr, the data is allocated but not initialized. - bool SetValues(const float *values, int count); - - // Directly sets a value for a specific index. The array has to be already - // allocated at this point (using SetValues() method). - void SetValue(int index, float val) { values_[index] = val; } - - int size() const { return values_.size(); } - - private: - std::vector values_; -}; - -// Class used by emscripten WebIDL Binder [1] to wrap calls to decode animation -// data. -class AnimationDecoder { - public: - AnimationDecoder(); - - // Decodes animation data from the provided buffer. - const draco::Status *DecodeBufferToKeyframeAnimation( - draco::DecoderBuffer *in_buffer, draco::KeyframeAnimation *animation); - - static bool GetTimestamps(const draco::KeyframeAnimation &animation, - DracoFloat32Array *timestamp); - - static bool GetKeyframes(const draco::KeyframeAnimation &animation, - int keyframes_id, DracoFloat32Array *animation_data); - - private: - draco::KeyframeAnimationDecoder decoder_; - draco::Status last_status_; -}; - -#endif // DRACO_JAVASCRIPT_EMSCRIPTEN_ANIMATION_DECODER_WEBIDL_WRAPPER_H_ diff --git a/contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.cc b/contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.cc deleted file mode 100644 index 53a10e5e4..000000000 --- a/contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.cc +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2017 The Draco Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -#include "draco/javascript/emscripten/animation_encoder_webidl_wrapper.h" - -#include "draco/animation/keyframe_animation.h" -#include "draco/animation/keyframe_animation_encoder.h" - -DracoInt8Array::DracoInt8Array() {} - -int DracoInt8Array::GetValue(int index) const { return values_[index]; } - -bool DracoInt8Array::SetValues(const char *values, int count) { - values_.assign(values, values + count); - return true; -} - -AnimationBuilder::AnimationBuilder() {} - -bool AnimationBuilder::SetTimestamps(draco::KeyframeAnimation *animation, - long num_frames, const float *timestamps) { - if (!animation || !timestamps) { - return false; - } - std::vector timestamps_arr( - timestamps, timestamps + num_frames); - return animation->SetTimestamps(timestamps_arr); -} - -int AnimationBuilder::AddKeyframes(draco::KeyframeAnimation *animation, - long num_frames, long num_components, - const float *animation_data) { - if (!animation || !animation_data) { - return -1; - } - std::vector keyframes_arr( - animation_data, animation_data + num_frames * num_components); - return animation->AddKeyframes(draco::DT_FLOAT32, num_components, - keyframes_arr); -} - -AnimationEncoder::AnimationEncoder() - : timestamps_quantization_bits_(-1), - keyframes_quantization_bits_(-1), - options_(draco::EncoderOptions::CreateDefaultOptions()) {} - -void AnimationEncoder::SetTimestampsQuantization(long quantization_bits) { - timestamps_quantization_bits_ = quantization_bits; -} - -void AnimationEncoder::SetKeyframesQuantization(long quantization_bits) { - keyframes_quantization_bits_ = quantization_bits; -} - -int AnimationEncoder::EncodeAnimationToDracoBuffer( - draco::KeyframeAnimation *animation, DracoInt8Array *draco_buffer) { - if (!animation) { - return 0; - } - draco::EncoderBuffer buffer; - - if (timestamps_quantization_bits_ > 0) { - options_.SetAttributeInt(0, "quantization_bits", - timestamps_quantization_bits_); - } - if (keyframes_quantization_bits_ > 0) { - for (int i = 1; i <= animation->num_animations(); ++i) { - options_.SetAttributeInt(i, "quantization_bits", - keyframes_quantization_bits_); - } - } - if (!encoder_.EncodeKeyframeAnimation(*animation, options_, &buffer).ok()) { - return 0; - } - - draco_buffer->SetValues(buffer.data(), buffer.size()); - return buffer.size(); -} diff --git a/contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.h b/contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.h deleted file mode 100644 index f2ac733d1..000000000 --- a/contrib/draco/src/draco/javascript/emscripten/animation_encoder_webidl_wrapper.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2017 The Draco Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -#ifndef DRACO_JAVASCRIPT_EMSCRIPTEN_ANIMATION_ENCODER_WEBIDL_WRAPPER_H_ -#define DRACO_JAVASCRIPT_EMSCRIPTEN_ANIMATION_ENCODER_WEBIDL_WRAPPER_H_ - -#include - -#include "draco/animation/keyframe_animation_encoder.h" -#include "draco/attributes/point_attribute.h" -#include "draco/compression/config/compression_shared.h" -#include "draco/compression/config/encoder_options.h" -#include "draco/compression/encode.h" - -class DracoInt8Array { - public: - DracoInt8Array(); - int GetValue(int index) const; - bool SetValues(const char *values, int count); - - size_t size() { return values_.size(); } - - private: - std::vector values_; -}; - -class AnimationBuilder { - public: - AnimationBuilder(); - - bool SetTimestamps(draco::KeyframeAnimation *animation, long num_frames, - const float *timestamps); - - int AddKeyframes(draco::KeyframeAnimation *animation, long num_frames, - long num_components, const float *animation_data); -}; - -class AnimationEncoder { - public: - AnimationEncoder(); - - void SetTimestampsQuantization(long quantization_bits); - // TODO: Use expert encoder to set per attribute quantization. - void SetKeyframesQuantization(long quantization_bits); - int EncodeAnimationToDracoBuffer(draco::KeyframeAnimation *animation, - DracoInt8Array *draco_buffer); - - private: - draco::KeyframeAnimationEncoder encoder_; - long timestamps_quantization_bits_; - long keyframes_quantization_bits_; - draco::EncoderOptions options_; -}; - -#endif // DRACO_JAVASCRIPT_EMSCRIPTEN_ANIMATION_ENCODER_WEBIDL_WRAPPER_H_ diff --git a/contrib/draco/src/draco/javascript/emscripten/decoder_webidl_wrapper.cc b/contrib/draco/src/draco/javascript/emscripten/decoder_webidl_wrapper.cc index 66fe77dbd..034f3c3b4 100644 --- a/contrib/draco/src/draco/javascript/emscripten/decoder_webidl_wrapper.cc +++ b/contrib/draco/src/draco/javascript/emscripten/decoder_webidl_wrapper.cc @@ -221,14 +221,13 @@ bool Decoder::GetAttributeFloatForAllPoints(const PointCloud &pc, const int components = pa.num_components(); const int num_points = pc.num_points(); const int num_entries = num_points * components; - const int kMaxAttributeFloatValues = 4; - float values[kMaxAttributeFloatValues] = {-2.0, -2.0, -2.0, -2.0}; + std::vector values(components, -2.f); int entry_id = 0; out_values->Resize(num_entries); for (draco::PointIndex i(0); i < num_points; ++i) { const draco::AttributeValueIndex val_index = pa.mapped_index(i); - if (!pa.ConvertValue(val_index, values)) { + if (!pa.ConvertValue(val_index, &values[0])) { return false; } for (int j = 0; j < components; ++j) { @@ -249,17 +248,16 @@ bool Decoder::GetAttributeFloatArrayForAllPoints(const PointCloud &pc, return false; } const bool requested_type_is_float = pa.data_type() == draco::DT_FLOAT32; - const int kMaxAttributeFloatValues = 4; - float values[kMaxAttributeFloatValues] = {-2.0, -2.0, -2.0, -2.0}; + std::vector values(components, -2.f); int entry_id = 0; float *const floats = reinterpret_cast(out_values); for (draco::PointIndex i(0); i < num_points; ++i) { const draco::AttributeValueIndex val_index = pa.mapped_index(i); if (requested_type_is_float) { - pa.GetValue(val_index, values); + pa.GetValue(val_index, &values[0]); } else { - if (!pa.ConvertValue(val_index, values)) { + if (!pa.ConvertValue(val_index, &values[0])) { return false; } } diff --git a/contrib/draco/src/draco/javascript/emscripten/draco_animation_decoder_glue_wrapper.cc b/contrib/draco/src/draco/javascript/emscripten/draco_animation_decoder_glue_wrapper.cc deleted file mode 100644 index 83ed98fdc..000000000 --- a/contrib/draco/src/draco/javascript/emscripten/draco_animation_decoder_glue_wrapper.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017 The Draco Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// This file is used by emscripten's WebIDL Binder. -// http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/WebIDL-Binder.html -#include "draco/attributes/attribute_octahedron_transform.h" -#include "draco/attributes/attribute_quantization_transform.h" -#include "draco/attributes/geometry_attribute.h" -#include "draco/attributes/point_attribute.h" -#include "draco/compression/decode.h" -#include "draco/core/decoder_buffer.h" -#include "draco/javascript/emscripten/animation_decoder_webidl_wrapper.h" -#include "draco/mesh/mesh.h" -#include "draco/point_cloud/point_cloud.h" - -// glue_animation_decoder.cpp is generated by Makefile.emcc build_glue target. -#include "glue_animation_decoder.cpp" diff --git a/contrib/draco/src/draco/javascript/emscripten/draco_animation_web_decoder.idl b/contrib/draco/src/draco/javascript/emscripten/draco_animation_web_decoder.idl deleted file mode 100644 index c9fe76b59..000000000 --- a/contrib/draco/src/draco/javascript/emscripten/draco_animation_web_decoder.idl +++ /dev/null @@ -1,52 +0,0 @@ -// Interface exposed to emscripten's WebIDL Binder. -// http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/WebIDL-Binder.html -[Prefix="draco::"] -interface DecoderBuffer { - void DecoderBuffer(); - void Init([Const] byte[] data, unsigned long data_size); -}; - -enum draco_StatusCode { - "draco_Status::OK", - "draco_Status::DRACO_ERROR", - "draco_Status::IO_ERROR", - "draco_Status::INVALID_PARAMETER", - "draco_Status::UNSUPPORTED_VERSION", - "draco_Status::UNKNOWN_VERSION", -}; - -[Prefix="draco::"] -interface Status { - draco_StatusCode code(); - boolean ok(); - [Const] DOMString error_msg(); -}; - -// Draco version of typed arrays. The memory of these arrays is allocated on the -// emscripten heap. -interface DracoFloat32Array { - void DracoFloat32Array(); - float GetValue(long index); - long size(); -}; - -[Prefix="draco::"] -interface KeyframeAnimation { - void KeyframeAnimation(); - long num_frames(); - long num_animations(); -}; - -interface AnimationDecoder { - void AnimationDecoder(); - - [Const] Status DecodeBufferToKeyframeAnimation(DecoderBuffer in_buffer, - KeyframeAnimation animation); - - boolean GetTimestamps([Ref, Const] KeyframeAnimation animation, - DracoFloat32Array timestamp); - - boolean GetKeyframes([Ref, Const] KeyframeAnimation animation, - long keyframes_id, - DracoFloat32Array animation_data); -}; diff --git a/contrib/draco/src/draco/javascript/emscripten/draco_animation_web_encoder.idl b/contrib/draco/src/draco/javascript/emscripten/draco_animation_web_encoder.idl deleted file mode 100644 index e74a4c9e4..000000000 --- a/contrib/draco/src/draco/javascript/emscripten/draco_animation_web_encoder.idl +++ /dev/null @@ -1,34 +0,0 @@ -// Interface exposed to emscripten's WebIDL Binder. -// http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/WebIDL-Binder.html -// Draco version of typed arrays. The memory of these arrays is allocated on the -// emscripten heap. -interface DracoInt8Array { - void DracoInt8Array(); - long GetValue(long index); - long size(); -}; - -[Prefix="draco::"] -interface KeyframeAnimation { - void KeyframeAnimation(); - long num_frames(); -}; - -interface AnimationBuilder { - void AnimationBuilder(); - boolean SetTimestamps(KeyframeAnimation animation, long num_frames, - [Const] float[] timestamps); - - long AddKeyframes(KeyframeAnimation animation, long num_frames, - long num_components, [Const] float[] animation_data); -}; - -interface AnimationEncoder { - void AnimationEncoder(); - - void SetTimestampsQuantization(long quantization_bits); - void SetKeyframesQuantization(long quantization_bits); - - long EncodeAnimationToDracoBuffer(KeyframeAnimation animation, - DracoInt8Array encoded_data); -}; diff --git a/contrib/draco/src/draco/javascript/emscripten/version.js b/contrib/draco/src/draco/javascript/emscripten/version.js index 46fb25271..b21f3b5e2 100644 --- a/contrib/draco/src/draco/javascript/emscripten/version.js +++ b/contrib/draco/src/draco/javascript/emscripten/version.js @@ -19,7 +19,7 @@ function isVersionSupported(versionString) { const version = versionString.split('.'); if (version.length < 2 || version.length > 3) return false; // Unexpected version string. - if (version[0] == 1 && version[1] >= 0 && version[1] <= 4) + if (version[0] == 1 && version[1] >= 0 && version[1] <= 5) return true; if (version[0] != 0 || version[1] > 10) return false; diff --git a/contrib/draco/src/draco/material/material.cc b/contrib/draco/src/draco/material/material.cc new file mode 100644 index 000000000..da854a172 --- /dev/null +++ b/contrib/draco/src/draco/material/material.cc @@ -0,0 +1,258 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/material/material.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +Material::Material() : Material(nullptr) {} + +Material::Material(TextureLibrary *texture_library) + : texture_library_(texture_library) { + Clear(); +} + +void Material::Copy(const Material &src) { + name_ = src.name_; + color_factor_ = src.color_factor_; + metallic_factor_ = src.metallic_factor_; + roughness_factor_ = src.roughness_factor_; + emissive_factor_ = src.emissive_factor_; + transparency_mode_ = src.transparency_mode_; + alpha_cutoff_ = src.alpha_cutoff_; + double_sided_ = src.double_sided_; + normal_texture_scale_ = src.normal_texture_scale_; + + // Copy properties of material extensions. + unlit_ = src.unlit_; + has_sheen_ = src.has_sheen_; + sheen_color_factor_ = src.sheen_color_factor_; + sheen_roughness_factor_ = src.sheen_roughness_factor_; + has_transmission_ = src.has_transmission_; + transmission_factor_ = src.transmission_factor_; + has_clearcoat_ = src.has_clearcoat_; + clearcoat_factor_ = src.clearcoat_factor_; + clearcoat_roughness_factor_ = src.clearcoat_roughness_factor_; + has_volume_ = src.has_volume_; + thickness_factor_ = src.thickness_factor_; + attenuation_distance_ = src.attenuation_distance_; + attenuation_color_ = src.attenuation_color_; + has_ior_ = src.has_ior_; + ior_ = src.ior_; + has_specular_ = src.has_specular_; + specular_factor_ = src.specular_factor_; + specular_color_factor_ = src.specular_color_factor_; + + // Copy texture maps. + texture_map_type_to_index_map_ = src.texture_map_type_to_index_map_; + texture_maps_.resize(src.texture_maps_.size()); + for (int i = 0; i < texture_maps_.size(); ++i) { + texture_maps_[i] = std::unique_ptr(new TextureMap()); + texture_maps_[i]->Copy(*src.texture_maps_[i]); + } +} + +void Material::Clear() { + ClearTextureMaps(); + + // Defaults correspond to the GLTF 2.0 spec. + name_.clear(); + color_factor_ = Vector4f(1.f, 1.f, 1.f, 1.f); + metallic_factor_ = 1.f; + roughness_factor_ = 1.f; + emissive_factor_ = Vector3f(0.f, 0.f, 0.f); + transparency_mode_ = TRANSPARENCY_OPAQUE; + alpha_cutoff_ = 0.5f; + double_sided_ = false; + normal_texture_scale_ = 1.0f; + + // Clear properties of material extensions to glTF 2.0 spec defaults. + unlit_ = false; + has_sheen_ = false; + sheen_color_factor_ = Vector3f(0.f, 0.f, 0.f); + sheen_roughness_factor_ = 0.f; + has_transmission_ = false; + transmission_factor_ = 0.f; + has_clearcoat_ = false; + clearcoat_factor_ = 0.f; + clearcoat_roughness_factor_ = 0.f; + has_volume_ = false; + thickness_factor_ = 0.f; + attenuation_distance_ = std::numeric_limits::max(); // Infinity. + attenuation_color_ = Vector3f(1.f, 1.f, 1.f); + has_ior_ = false; + ior_ = 1.5f; + has_specular_ = false; + specular_factor_ = 1.f; + specular_color_factor_ = Vector3f(1.f, 1.f, 1.f); +} + +void Material::ClearTextureMaps() { + texture_maps_.clear(); + texture_map_type_to_index_map_.clear(); +} + +void Material::SetTextureMap(TextureMap &&texture_map) { + std::unique_ptr new_texture_map(new TextureMap); + *new_texture_map = std::move(texture_map); + SetTextureMap(std::move(new_texture_map)); +} + +void Material::SetTextureMap(std::unique_ptr texture_map) { + const TextureMap::Type type = texture_map->type(); + const auto it = texture_map_type_to_index_map_.find(type); + // Only one texture of a given type is allowed to exist. + if (it == texture_map_type_to_index_map_.end()) { + texture_maps_.push_back(std::move(texture_map)); + texture_map_type_to_index_map_[type] = texture_maps_.size() - 1; + } else { + texture_maps_[it->second] = std::move(texture_map); + } +} + +void Material::SetTextureMap(std::unique_ptr texture, + TextureMap::Type texture_map_type, + int tex_coord_index) { + SetTextureMap(std::move(texture), texture_map_type, + TextureMap::WrappingMode(TextureMap::CLAMP_TO_EDGE), + tex_coord_index); +} + +void Material::SetTextureMap(std::unique_ptr texture, + TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + int tex_coord_index) { + std::unique_ptr texture_map(new TextureMap); + texture_map->SetProperties(texture_map_type, wrapping_mode, tex_coord_index); + + if (texture_library_) { + texture_map->SetTexture(texture.get()); + texture_library_->PushTexture(std::move(texture)); + } else { + texture_map->SetTexture(std::move(texture)); + } + SetTextureMap(std::move(texture_map)); +} + +Status Material::SetTextureMap(Texture *texture, + TextureMap::Type texture_map_type, + int tex_coord_index) { + return SetTextureMap(texture, texture_map_type, + TextureMap::WrappingMode(TextureMap::CLAMP_TO_EDGE), + TextureMap::UNSPECIFIED, TextureMap::UNSPECIFIED, + tex_coord_index); +} + +Status Material::SetTextureMap(Texture *texture, + TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + int tex_coord_index) { + std::unique_ptr texture_map(new TextureMap); + return SetTextureMap(std::move(texture_map), texture, texture_map_type, + wrapping_mode, TextureMap::UNSPECIFIED, + TextureMap::UNSPECIFIED, tex_coord_index); +} + +Status Material::SetTextureMap(Texture *texture, + TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + TextureMap::FilterType min_filter, + TextureMap::FilterType mag_filter, + int tex_coord_index) { + std::unique_ptr texture_map(new TextureMap); + return SetTextureMap(std::move(texture_map), texture, texture_map_type, + wrapping_mode, min_filter, mag_filter, tex_coord_index); +} + +Status Material::SetTextureMap(Texture *texture, + TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + TextureMap::FilterType min_filter, + TextureMap::FilterType mag_filter, + const TextureTransform &transform, + int tex_coord_index) { + std::unique_ptr texture_map(new TextureMap); + texture_map->SetTransform(transform); + return SetTextureMap(std::move(texture_map), texture, texture_map_type, + wrapping_mode, min_filter, mag_filter, tex_coord_index); +} + +Status Material::SetTextureMap(std::unique_ptr texture_map, + Texture *texture, + TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + TextureMap::FilterType min_filter, + TextureMap::FilterType mag_filter, + int tex_coord_index) { + if (!IsTextureOwned(*texture)) { + return Status(Status::DRACO_ERROR, + "Provided texture is not owned by the material."); + } + texture_map->SetProperties(texture_map_type, wrapping_mode, tex_coord_index, + min_filter, mag_filter); + texture_map->SetTexture(texture); + SetTextureMap(std::move(texture_map)); + return OkStatus(); +} + +bool Material::IsTextureOwned(const Texture &texture) { + if (texture_library_) { + // Ensure the texture is owned by the texture library. + for (int ti = 0; ti < texture_library_->NumTextures(); ++ti) { + if (texture_library_->GetTexture(ti) == &texture) { + return true; + } + } + return false; + } + // Else we need to check every texture map of this material. + for (int ti = 0; ti < NumTextureMaps(); ++ti) { + if (GetTextureMapByIndex(ti)->texture() == &texture) { + return true; + } + } + return false; +} + +std::unique_ptr Material::RemoveTextureMapByIndex(int index) { + if (index < 0 || index >= texture_maps_.size()) { + return nullptr; + } + std::unique_ptr ret = std::move(texture_maps_[index]); + texture_maps_.erase(texture_maps_.begin() + index); + // A texture map was removed and we need to update + // |texture_map_type_to_index_map_| to reflect the changes. + for (int i = index; i < texture_maps_.size(); ++i) { + texture_map_type_to_index_map_[texture_maps_[i]->type()] = i; + } + // Delete the removed texture map type. + texture_map_type_to_index_map_.erase( + texture_map_type_to_index_map_.find(ret->type())); + return ret; +} + +std::unique_ptr Material::RemoveTextureMapByType( + TextureMap::Type texture_type) { + const auto it = texture_map_type_to_index_map_.find(texture_type); + if (it == texture_map_type_to_index_map_.end()) { + return nullptr; + } + return RemoveTextureMapByIndex(it->second); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/material/material.h b/contrib/draco/src/draco/material/material.h new file mode 100644 index 000000000..7c405b45c --- /dev/null +++ b/contrib/draco/src/draco/material/material.h @@ -0,0 +1,276 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_MATERIAL_MATERIAL_H_ +#define DRACO_MATERIAL_MATERIAL_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/core/status.h" +#include "draco/core/vector_d.h" +#include "draco/texture/texture_library.h" +#include "draco/texture/texture_map.h" + +namespace draco { + +// Material specification for Draco geometry. Parameters are based on the +// metallic-roughness PBR model adopted by GLTF 2.0 standard: +// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#materials +class Material { + public: + enum TransparencyMode { + TRANSPARENCY_OPAQUE = 0, + TRANSPARENCY_MASK, + TRANSPARENCY_BLEND + }; + + Material(); + explicit Material(TextureLibrary *texture_library); + + // Copies all material data from the |src| material to this material. + void Copy(const Material &src); + + // Deletes all texture maps and resets all material properties to default + // values. + void Clear(); + + // Deletes all texture maps from the material while keeping other material + // properties unchanged. + void ClearTextureMaps(); + + const std::string &GetName() const { return name_; } + void SetName(const std::string &name) { name_ = name; } + Vector4f GetColorFactor() const { return color_factor_; } + void SetColorFactor(const Vector4f &color_factor) { + color_factor_ = color_factor; + } + float GetMetallicFactor() const { return metallic_factor_; } + void SetMetallicFactor(float metallic_factor) { + metallic_factor_ = metallic_factor; + } + float GetRoughnessFactor() const { return roughness_factor_; } + void SetRoughnessFactor(float roughness_factor) { + roughness_factor_ = roughness_factor; + } + Vector3f GetEmissiveFactor() const { return emissive_factor_; } + void SetEmissiveFactor(const Vector3f &emissive_factor) { + emissive_factor_ = emissive_factor; + } + bool GetDoubleSided() const { return double_sided_; } + void SetDoubleSided(bool double_sided) { double_sided_ = double_sided; } + TransparencyMode GetTransparencyMode() const { return transparency_mode_; } + void SetTransparencyMode(TransparencyMode mode) { transparency_mode_ = mode; } + float GetAlphaCutoff() const { return alpha_cutoff_; } + void SetAlphaCutoff(float alpha_cutoff) { alpha_cutoff_ = alpha_cutoff; } + float GetNormalTextureScale() const { return normal_texture_scale_; } + void SetNormalTextureScale(float scale) { normal_texture_scale_ = scale; } + + // Properties of glTF material extension KHR_materials_unlit. + bool GetUnlit() const { return unlit_; } + void SetUnlit(bool unlit) { unlit_ = unlit; } + + // Properties of glTF material extension KHR_materials_sheen. + bool HasSheen() const { return has_sheen_; } + void SetHasSheen(bool value) { has_sheen_ = value; } + Vector3f GetSheenColorFactor() const { return sheen_color_factor_; } + void SetSheenColorFactor(const Vector3f &value) { + sheen_color_factor_ = value; + } + float GetSheenRoughnessFactor() const { return sheen_roughness_factor_; } + void SetSheenRoughnessFactor(float value) { sheen_roughness_factor_ = value; } + + // Properties of glTF material extension KHR_materials_transmission. + bool HasTransmission() const { return has_transmission_; } + void SetHasTransmission(bool value) { has_transmission_ = value; } + float GetTransmissionFactor() const { return transmission_factor_; } + void SetTransmissionFactor(float value) { transmission_factor_ = value; } + + // Properties of glTF material extension KHR_materials_clearcoat. + bool HasClearcoat() const { return has_clearcoat_; } + void SetHasClearcoat(bool value) { has_clearcoat_ = value; } + float GetClearcoatFactor() const { return clearcoat_factor_; } + void SetClearcoatFactor(float value) { clearcoat_factor_ = value; } + float GetClearcoatRoughnessFactor() const { + return clearcoat_roughness_factor_; + } + void SetClearcoatRoughnessFactor(float value) { + clearcoat_roughness_factor_ = value; + } + + // Properties of glTF material extension KHR_materials_volume. + bool HasVolume() const { return has_volume_; } + void SetHasVolume(bool value) { has_volume_ = value; } + float GetThicknessFactor() const { return thickness_factor_; } + void SetThicknessFactor(float value) { thickness_factor_ = value; } + float GetAttenuationDistance() const { return attenuation_distance_; } + void SetAttenuationDistance(float value) { attenuation_distance_ = value; } + Vector3f GetAttenuationColor() const { return attenuation_color_; } + void SetAttenuationColor(const Vector3f &value) { + attenuation_color_ = value; + } + + // Properties of glTF material extension KHR_materials_ior. + bool HasIor() const { return has_ior_; } + void SetHasIor(bool value) { has_ior_ = value; } + float GetIor() const { return ior_; } + void SetIor(float value) { ior_ = value; } + + // Properties of glTF material extension KHR_materials_specular. + bool HasSpecular() const { return has_specular_; } + void SetHasSpecular(bool value) { has_specular_ = value; } + float GetSpecularFactor() const { return specular_factor_; } + void SetSpecularFactor(float value) { specular_factor_ = value; } + Vector3f GetSpecularColorFactor() const { return specular_color_factor_; } + void SetSpecularColorFactor(const Vector3f &value) { + specular_color_factor_ = value; + } + + // Methods for working with texture maps. + size_t NumTextureMaps() const { return texture_maps_.size(); } + const TextureMap *GetTextureMapByIndex(int index) const { + return texture_maps_[index].get(); + } + TextureMap *GetTextureMapByIndex(int index) { + return texture_maps_[index].get(); + } + const TextureMap *GetTextureMapByType(TextureMap::Type texture_type) const { + const auto it = texture_map_type_to_index_map_.find(texture_type); + if (it == texture_map_type_to_index_map_.end()) { + return nullptr; + } + return GetTextureMapByIndex(it->second); + } + TextureMap *GetTextureMapByType(TextureMap::Type texture_type) { + const auto it = texture_map_type_to_index_map_.find(texture_type); + if (it == texture_map_type_to_index_map_.end()) { + return nullptr; + } + return GetTextureMapByIndex(it->second); + } + + // TODO(b/146061359): Refactor the set texture map code. + // Specifies a new texture map using a texture with a given type. + // |tex_coord_index| defines which texture coordinate attribute should be used + // to map the texture on the underlying geometry (e.g. tex_coord_index 0 would + // use the first texture coordinate attribute). + void SetTextureMap(std::unique_ptr texture, + TextureMap::Type texture_map_type, int tex_coord_index); + void SetTextureMap(std::unique_ptr texture, + TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + int tex_coord_index); + + // Sets a new texture map using a |texture| that is already owned by this + // material (that is by one of its texture maps or by the unerlying + // |texture_library_|). |transform| is the texture map's transform if set. + // |min_filter| and |mag_filter| are the texture filter types. Returns error + // status if provided |texture| is not owned by the material. + Status SetTextureMap(Texture *texture, TextureMap::Type texture_map_type, + int tex_coord_index); + Status SetTextureMap(Texture *texture, TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + int tex_coord_index); + Status SetTextureMap(Texture *texture, TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + TextureMap::FilterType min_filter, + TextureMap::FilterType mag_filter, int tex_coord_index); + Status SetTextureMap(Texture *texture, TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + TextureMap::FilterType min_filter, + TextureMap::FilterType mag_filter, + const TextureTransform &transform, int tex_coord_index); + + // Removes a texture map from the material based on its index or texture type. + // The material releases the ownership of the texture map and returns it as + // a unique_ptr to allow the caller to use the texture map for other purposes. + std::unique_ptr RemoveTextureMapByIndex(int index); + std::unique_ptr RemoveTextureMapByType( + TextureMap::Type texture_type); + + private: + void SetTextureMap(TextureMap &&texture_map); + void SetTextureMap(std::unique_ptr texture_map); + Status SetTextureMap(std::unique_ptr texture_map, + Texture *texture, TextureMap::Type texture_map_type, + TextureMap::WrappingMode wrapping_mode, + TextureMap::FilterType min_filter, + TextureMap::FilterType mag_filter, int tex_coord_index); + + // Returns true if the |texture| is owned by the material. + bool IsTextureOwned(const Texture &texture); + + private: + std::string name_; + Vector4f color_factor_; + float metallic_factor_; + float roughness_factor_; + Vector3f emissive_factor_; + bool double_sided_; + TransparencyMode transparency_mode_; + float alpha_cutoff_; + float normal_texture_scale_; + + // Properties of glTF material extension KHR_materials_unlit. + bool unlit_; + + // Properties of glTF material extension KHR_materials_sheen. + bool has_sheen_; + Vector3f sheen_color_factor_; + float sheen_roughness_factor_; + + // Properties of glTF material extension KHR_materials_transmission. + bool has_transmission_; + float transmission_factor_; + + // Properties of glTF material extension KHR_materials_clearcoat. + bool has_clearcoat_; + float clearcoat_factor_; + float clearcoat_roughness_factor_; + + // Properties of glTF material extension KHR_materials_volume. + bool has_volume_; + float thickness_factor_; + float attenuation_distance_; + Vector3f attenuation_color_; + + // Properties of glTF material extension KHR_materials_ior. + bool has_ior_; + float ior_; + + // Properties of glTF material extension KHR_materials_specular. + bool has_specular_; + float specular_factor_; + Vector3f specular_color_factor_; + + // Texture maps. + std::vector> texture_maps_; + + // Map between a texture type to texture index in |texture_maps_|. Allows fast + // retrieval of texture maps based on their type. + std::unordered_map texture_map_type_to_index_map_; + + // Optional pointer to a library that holds ownership of textures used for + // this material. If set to nullptr, the texture ownership will be assigned + // to the newly created TextureMaps directly. + TextureLibrary *texture_library_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_MATERIAL_MATERIAL_H_ diff --git a/contrib/draco/src/draco/material/material_library.cc b/contrib/draco/src/draco/material/material_library.cc new file mode 100644 index 000000000..f2165295f --- /dev/null +++ b/contrib/draco/src/draco/material/material_library.cc @@ -0,0 +1,125 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/material/material_library.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +namespace draco { + +void MaterialLibrary::Copy(const MaterialLibrary &src) { + Clear(); + Append(src); +} + +void MaterialLibrary::Append(const MaterialLibrary &src) { + const size_t old_num_materials = materials_.size(); + materials_.resize(old_num_materials + src.materials_.size()); + for (int i = 0; i < src.materials_.size(); ++i) { + materials_[old_num_materials + i] = + std::unique_ptr(new Material(&texture_library_)); + materials_[old_num_materials + i]->Copy(*src.materials_[i]); + } + + const size_t old_num_textures = texture_library_.NumTextures(); + texture_library_.Append(src.texture_library_); + for (int i = 0; i < src.materials_variants_names_.size(); i++) { + materials_variants_names_.push_back(src.materials_variants_names_[i]); + } + + // Remap all texture maps to the textures in the new texture library. + + // First gather mapping between texture maps and textures in the old material + // library. + const auto texture_map_to_index = + ComputeTextureMapToTextureIndexMapping(src.texture_library_); + + // Remap all texture maps to textures stored in the new texture library. + for (auto it = texture_map_to_index.begin(); it != texture_map_to_index.end(); + ++it) { + TextureMap *const texture_map = it->first; + const int texture_index = old_num_textures + it->second; + texture_map->SetTexture(texture_library_.GetTexture(texture_index)); + } +} + +std::unique_ptr MaterialLibrary::RemoveMaterial(int index) { + std::unique_ptr ret = std::move(materials_[index]); + materials_.erase(materials_.begin() + index); + return ret; +} + +void MaterialLibrary::RemoveUnusedTextures() { + const auto texture_map_to_index = + ComputeTextureMapToTextureIndexMapping(texture_library_); + + // Mark which textures are used. + std::vector is_texture_used(texture_library_.NumTextures(), false); + for (auto it = texture_map_to_index.begin(); it != texture_map_to_index.end(); + ++it) { + is_texture_used[it->second] = true; + } + + // Remove all textures that are not used (from backwards to avoid updating + // entries in the |is_texture_used| vector). + for (int i = texture_library_.NumTextures() - 1; i >= 0; --i) { + if (!is_texture_used[i]) { + texture_library_.RemoveTexture(i); + } + } +} + +std::map +MaterialLibrary::ComputeTextureMapToTextureIndexMapping( + const TextureLibrary &library) const { + std::map map_to_index; + for (int mi = 0; mi < materials_.size(); ++mi) { + for (int ti = 0; ti < materials_[mi]->NumTextureMaps(); ++ti) { + TextureMap *const texture_map = materials_[mi]->GetTextureMapByIndex(ti); + for (int tli = 0; tli < library.NumTextures(); ++tli) { + if (library.GetTexture(tli) != texture_map->texture()) { + continue; + } + map_to_index[texture_map] = tli; + break; + } + } + } + return map_to_index; +} + +void MaterialLibrary::Clear() { + materials_.clear(); + texture_library_.Clear(); + materials_variants_names_.clear(); +} + +Material *MaterialLibrary::MutableMaterial(int index) { + if (index < 0) { + return nullptr; + } + if (materials_.size() <= index) { + const int old_size = materials_.size(); + materials_.resize(index + 1); + // Ensure all newly created materials are valid. + for (int i = old_size; i < index + 1; ++i) { + materials_[i] = + std::unique_ptr(new Material(&texture_library_)); + } + } + return materials_[index].get(); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/material/material_library.h b/contrib/draco/src/draco/material/material_library.h new file mode 100644 index 000000000..574d86b23 --- /dev/null +++ b/contrib/draco/src/draco/material/material_library.h @@ -0,0 +1,104 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_MATERIAL_MATERIAL_LIBRARY_H_ +#define DRACO_MATERIAL_MATERIAL_LIBRARY_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include + +#include "draco/material/material.h" +#include "draco/texture/texture_library.h" + +namespace draco { + +// MaterialLibrary holds an array of materials that are applied to a single +// model. +class MaterialLibrary { + public: + MaterialLibrary() = default; + + // Copies the |src| into this instance. + void Copy(const MaterialLibrary &src); + + // Appends materials from the |src| library to this library. All materials + // and textures are copied over. + void Append(const MaterialLibrary &src); + + // Deletes all materials from the material library. + void Clear(); + + // The number of materials stored in the library. All materials are stored + // with indices <0, num_materials() - 1>. + size_t NumMaterials() const { return materials_.size(); } + + // Returns a material with a given index or nullptr if the index is not valid. + const Material *GetMaterial(int index) const { + if (index < 0 || index >= materials_.size()) { + return nullptr; + } + return materials_[index].get(); + } + + // Returns a mutable pointer to a given material. If the material with the + // specified |index| does not exist, it is automatically created. + Material *MutableMaterial(int index); + + // Removes a material with a given index and returns it. Caller can ignore the + // returned value, in which case the material will be automatically deleted. + // Index of all subsequent materials will be decremented by one. + std::unique_ptr RemoveMaterial(int index); + + const TextureLibrary &GetTextureLibrary() const { return texture_library_; } + TextureLibrary &MutableTextureLibrary() { return texture_library_; } + + // Removes all textures that are not referenced by a TextureMap from the + // texture library. + void RemoveUnusedTextures(); + + // Returns a map between each TextureMap object and associated texture index + // in the texture |library|. + std::map ComputeTextureMapToTextureIndexMapping( + const TextureLibrary &library) const; + + // Creates a named materials variant and returns its index. + int AddMaterialsVariant(const std::string &name) { + materials_variants_names_.push_back(name); + return materials_variants_names_.size() - 1; + } + + // Returns the number of materials variants. + int NumMaterialsVariants() const { return materials_variants_names_.size(); } + + // Returns the name of a materials variant. + const std::string &GetMaterialsVariantName(int index) const { + return materials_variants_names_[index]; + } + + private: + std::vector> materials_; + std::vector materials_variants_names_; + + // Container for storing all textures used by materials of this library. + TextureLibrary texture_library_; +}; + +} // namespace draco + +#endif // DRACO_MATERIAL_MATERIAL_LIBRARY_H_ +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/material/material_library_test.cc b/contrib/draco/src/draco/material/material_library_test.cc new file mode 100644 index 000000000..a110fa4db --- /dev/null +++ b/contrib/draco/src/draco/material/material_library_test.cc @@ -0,0 +1,155 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/material/material_library.h" + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED +TEST(MaterialLibraryTest, TestMaterials) { + // Test verifies that we can modify materials in a library. + draco::MaterialLibrary library; + ASSERT_EQ(library.NumMaterials(), 0); + + // Add a new material to the library. + const draco::Material *const new_mat = library.MutableMaterial(0); + ASSERT_NE(new_mat, nullptr); + ASSERT_EQ(library.NumMaterials(), 1); + + const draco::Material *const new_mat2 = library.MutableMaterial(2); + ASSERT_NE(new_mat2, nullptr); + ASSERT_EQ(library.NumMaterials(), 3); + ASSERT_EQ(library.GetMaterial(2), new_mat2); + + // Ensure that even though we call mutable_material multiple times, it does + // not increase the number of materials associated to the library. + for (int i = 0; i < library.NumMaterials(); ++i) { + ASSERT_NE(library.MutableMaterial(i), nullptr); + } + ASSERT_EQ(library.NumMaterials(), 3); + + // Check that material variants can be added and cleared. + library.AddMaterialsVariant("Milk Truck"); + library.AddMaterialsVariant("Ice Cream Truck"); + ASSERT_EQ(library.NumMaterialsVariants(), 2); + ASSERT_EQ(library.GetMaterialsVariantName(0), "Milk Truck"); + ASSERT_EQ(library.GetMaterialsVariantName(1), "Ice Cream Truck"); + + library.Clear(); + ASSERT_EQ(library.NumMaterials(), 0); + ASSERT_EQ(library.NumMaterialsVariants(), 0); +} + +TEST(MaterialLibraryTest, TestMaterialsCopy) { + // Test verifies that we can copy a material library. + draco::MaterialLibrary library; + library.MutableMaterial(0)->SetMetallicFactor(2.4f); + library.MutableMaterial(3)->SetRoughnessFactor(1.2f); + library.AddMaterialsVariant("Milk Truck"); + library.AddMaterialsVariant("Ice Cream Truck"); + + draco::MaterialLibrary new_library; + new_library.Copy(library); + ASSERT_EQ(library.NumMaterials(), new_library.NumMaterials()); + ASSERT_EQ(library.GetMaterial(0)->GetMetallicFactor(), + new_library.GetMaterial(0)->GetMetallicFactor()); + ASSERT_EQ(library.GetMaterial(3)->GetRoughnessFactor(), + new_library.GetMaterial(3)->GetRoughnessFactor()); + ASSERT_EQ(new_library.NumMaterialsVariants(), 2); + ASSERT_EQ(new_library.GetMaterialsVariantName(0), "Milk Truck"); + ASSERT_EQ(new_library.GetMaterialsVariantName(1), "Ice Cream Truck"); +} + +TEST(MaterialLibraryTest, TestTextureLibrary) { + // Tests that texture library is properly updated when we add new textures + // to a material belonging to the material library. + std::unique_ptr texture_0(new draco::Texture()); + std::unique_ptr texture_1(new draco::Texture()); + + draco::MaterialLibrary library; + library.MutableMaterial(0)->SetTextureMap(std::move(texture_0), + draco::TextureMap::COLOR, 0); + ASSERT_EQ(library.GetTextureLibrary().NumTextures(), 1); + library.MutableMaterial(3)->SetTextureMap(std::move(texture_1), + draco::TextureMap::COLOR, 0); + ASSERT_EQ(library.GetTextureLibrary().NumTextures(), 2); +} + +TEST(MaterialLibraryTest, RemoveUnusedTextures) { + // Test verifies that we can remove unusued textures from the material + // library. + draco::MaterialLibrary library; + + // Create dummy textures. + std::unique_ptr texture_0(new draco::Texture()); + std::unique_ptr texture_1(new draco::Texture()); + std::unique_ptr texture_2(new draco::Texture()); + + // Add them to the materials of the library. + library.MutableMaterial(0)->SetTextureMap(std::move(texture_0), + draco::TextureMap::COLOR, 0); + library.MutableMaterial(0)->SetTextureMap( + std::move(texture_1), draco::TextureMap::METALLIC_ROUGHNESS, 0); + library.MutableMaterial(1)->SetTextureMap(std::move(texture_2), + draco::TextureMap::COLOR, 0); + + ASSERT_EQ(library.GetTextureLibrary().NumTextures(), 3); + + library.RemoveUnusedTextures(); + ASSERT_EQ(library.GetTextureLibrary().NumTextures(), 3); + + // Remove texture map from a material. + library.MutableMaterial(0)->RemoveTextureMapByType( + draco::TextureMap::METALLIC_ROUGHNESS); + library.RemoveUnusedTextures(); + ASSERT_EQ(library.GetTextureLibrary().NumTextures(), 2); + + library.MutableMaterial(1)->RemoveTextureMapByType(draco::TextureMap::COLOR); + library.RemoveUnusedTextures(); + ASSERT_EQ(library.GetTextureLibrary().NumTextures(), 1); + + library.MutableMaterial(0)->RemoveTextureMapByType(draco::TextureMap::COLOR); + library.RemoveUnusedTextures(); + ASSERT_EQ(library.GetTextureLibrary().NumTextures(), 0); +} + +TEST(MaterialLibraryTest, RemoveMaterial) { + // Tests that we can safely remove materials from the material library. + draco::MaterialLibrary library; + library.MutableMaterial(0)->SetMetallicFactor(0.f); + library.MutableMaterial(1)->SetMetallicFactor(1.f); + library.MutableMaterial(2)->SetMetallicFactor(2.f); + library.MutableMaterial(3)->SetMetallicFactor(3.f); + + ASSERT_EQ(library.NumMaterials(), 4); + + ASSERT_EQ(library.RemoveMaterial(0)->GetMetallicFactor(), 0.f); + ASSERT_EQ(library.NumMaterials(), 3); + + ASSERT_EQ(library.RemoveMaterial(1)->GetMetallicFactor(), 2.f); + ASSERT_EQ(library.NumMaterials(), 2); + + ASSERT_EQ(library.RemoveMaterial(1)->GetMetallicFactor(), 3.f); + ASSERT_EQ(library.NumMaterials(), 1); + + ASSERT_EQ(library.RemoveMaterial(0)->GetMetallicFactor(), 1.f); + ASSERT_EQ(library.NumMaterials(), 0); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/material/material_test.cc b/contrib/draco/src/draco/material/material_test.cc new file mode 100644 index 000000000..8c999a532 --- /dev/null +++ b/contrib/draco/src/draco/material/material_test.cc @@ -0,0 +1,320 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/material/material.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/draco_test_utils.h" +#include "draco/io/texture_io.h" + +namespace { + +TEST(MaterialTest, TestMaterialAccess) { + // Tests that we can set and get material properties. + draco::Material material; + + material.SetName("Superalloy"); + ASSERT_EQ(material.GetName(), "Superalloy"); + material.SetColorFactor(draco::Vector4f(1.f, 0.2f, 0.1f, 0.9f)); + ASSERT_EQ(material.GetColorFactor(), draco::Vector4f(1.f, 0.2f, 0.1f, 0.9f)); + material.SetMetallicFactor(0.3f); + ASSERT_EQ(material.GetMetallicFactor(), 0.3f); + material.SetRoughnessFactor(0.2f); + ASSERT_EQ(material.GetRoughnessFactor(), 0.2f); + material.SetEmissiveFactor(draco::Vector3f(0.2f, 0.f, 0.1f)); + ASSERT_EQ(material.GetEmissiveFactor(), draco::Vector3f(0.2f, 0.f, 0.1f)); + + // Set and check the properties of material extensions. + material.SetUnlit(true); + ASSERT_TRUE(material.GetUnlit()); + material.SetHasSheen(true); + ASSERT_TRUE(material.HasSheen()); + material.SetSheenColorFactor(draco::Vector3f(0.4f, 0.2f, 0.8f)); + ASSERT_EQ(material.GetSheenColorFactor(), draco::Vector3f(0.4f, 0.2f, 0.8f)); + material.SetSheenRoughnessFactor(0.428f); + ASSERT_EQ(material.GetSheenRoughnessFactor(), 0.428f); + material.SetHasTransmission(true); + ASSERT_TRUE(material.HasTransmission()); + material.SetTransmissionFactor(0.5f); + ASSERT_EQ(material.GetTransmissionFactor(), 0.5f); + material.SetHasClearcoat(true); + ASSERT_TRUE(material.HasClearcoat()); + material.SetClearcoatFactor(0.6f); + ASSERT_EQ(material.GetClearcoatFactor(), 0.6f); + material.SetClearcoatRoughnessFactor(0.7f); + ASSERT_EQ(material.GetClearcoatRoughnessFactor(), 0.7f); + material.SetHasVolume(true); + ASSERT_TRUE(material.HasVolume()); + material.SetThicknessFactor(0.8f); + ASSERT_EQ(material.GetThicknessFactor(), 0.8f); + material.SetAttenuationDistance(0.9f); + ASSERT_EQ(material.GetAttenuationDistance(), 0.9f); + material.SetAttenuationColor(draco::Vector3f(0.2f, 0.5f, 0.8f)); + ASSERT_EQ(material.GetAttenuationColor(), draco::Vector3f(0.2f, 0.5f, 0.8f)); + material.SetHasIor(true); + ASSERT_TRUE(material.HasIor()); + material.SetIor(1.1f); + ASSERT_EQ(material.GetIor(), 1.1f); + material.SetHasSpecular(true); + ASSERT_TRUE(material.HasSpecular()); + material.SetSpecularFactor(0.01f); + ASSERT_EQ(material.GetSpecularFactor(), 0.01f); + material.SetSpecularColorFactor(draco::Vector3f(0.4f, 1.f, 1.f)); + ASSERT_EQ(material.GetSpecularColorFactor(), draco::Vector3f(0.4f, 1.f, 1.f)); + + ASSERT_EQ(material.GetTextureMapByType(draco::TextureMap::COLOR), nullptr); + ASSERT_EQ(material.NumTextureMaps(), 0); + + std::unique_ptr texture = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + ASSERT_NE(texture, nullptr); + + material.SetTextureMap(std::move(texture), draco::TextureMap::COLOR, 0); + + ASSERT_NE(material.GetTextureMapByType(draco::TextureMap::COLOR), nullptr); + ASSERT_EQ(material.NumTextureMaps(), 1); + ASSERT_EQ(material.GetTextureMapByIndex(0), + material.GetTextureMapByType(draco::TextureMap::COLOR)); + + std::unique_ptr texture2 = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + ASSERT_NE(texture2, nullptr); + material.SetTextureMap(std::move(texture2), draco::TextureMap::EMISSIVE, 1); + + ASSERT_NE(material.GetTextureMapByType(draco::TextureMap::EMISSIVE), nullptr); + ASSERT_EQ(material.GetTextureMapByType(draco::TextureMap::EMISSIVE) + ->tex_coord_index(), + 1); + ASSERT_EQ(material.NumTextureMaps(), 2); + + // Try to add the emissive texture one more time. This should replace the + // previous instance of the emissive texture on the material. + std::unique_ptr texture3 = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + ASSERT_NE(texture3, nullptr); + material.SetTextureMap(std::move(texture2), draco::TextureMap::EMISSIVE, 2); + ASSERT_EQ(material.NumTextureMaps(), 2); + ASSERT_EQ(material.GetTextureMapByType(draco::TextureMap::EMISSIVE) + ->tex_coord_index(), + 2); + + std::unique_ptr texture_map4(new draco::TextureMap()); + std::unique_ptr texture4 = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + material.SetTextureMap(std::move(texture4), draco::TextureMap::ROUGHNESS, 0); + ASSERT_EQ(material.NumTextureMaps(), 3); + ASSERT_NE(material.GetTextureMapByType(draco::TextureMap::ROUGHNESS), + nullptr); + + material.SetTransparencyMode(draco::Material::TRANSPARENCY_BLEND); + ASSERT_EQ(material.GetTransparencyMode(), + draco::Material::TRANSPARENCY_BLEND); + material.SetAlphaCutoff(0.2f); + ASSERT_EQ(material.GetAlphaCutoff(), 0.2f); + material.SetNormalTextureScale(0.75f); + ASSERT_EQ(material.GetNormalTextureScale(), 0.75f); + + material.ClearTextureMaps(); + ASSERT_EQ(material.NumTextureMaps(), 0); + ASSERT_EQ(material.GetTextureMapByType(draco::TextureMap::COLOR), nullptr); + + // Metallic factor should be unchanged. + ASSERT_EQ(material.GetMetallicFactor(), 0.3f); + + material.Clear(); + // Metallic factor should be reset to default. + ASSERT_NE(material.GetMetallicFactor(), 0.3f); + + ASSERT_EQ(material.GetDoubleSided(), false); + material.SetDoubleSided(true); + ASSERT_EQ(material.GetDoubleSided(), true); +} + +TEST(MaterialTest, TestMaterialCopy) { + draco::Material material; + material.SetName("Antimatter"); + material.SetColorFactor(draco::Vector4f(0.3f, 0.2f, 0.4f, 0.9f)); + material.SetMetallicFactor(0.2f); + material.SetRoughnessFactor(0.4f); + material.SetEmissiveFactor(draco::Vector3f(0.3f, 0.1f, 0.2f)); + material.SetTransparencyMode(draco::Material::TRANSPARENCY_MASK); + material.SetAlphaCutoff(0.25f); + material.SetDoubleSided(true); + material.SetNormalTextureScale(0.75f); + + // Set the properties of material extensions. + material.SetUnlit(true); + material.SetHasSheen(true); + material.SetSheenColorFactor(draco::Vector3f(0.4f, 0.2f, 0.8f)); + material.SetSheenRoughnessFactor(0.428f); + material.SetHasTransmission(true); + material.SetTransmissionFactor(0.5f); + material.SetHasClearcoat(true); + material.SetClearcoatFactor(0.6f); + material.SetClearcoatRoughnessFactor(0.7f); + material.SetHasVolume(true); + material.SetThicknessFactor(0.8f); + material.SetAttenuationDistance(0.9f); + material.SetAttenuationColor(draco::Vector3f(0.2f, 0.5f, 0.8f)); + material.SetHasIor(true); + material.SetIor(1.1f); + material.SetHasSpecular(true); + material.SetSpecularFactor(0.01f); + material.SetSpecularColorFactor(draco::Vector3f(0.4f, 1.f, 1.f)); + + std::unique_ptr texture = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + ASSERT_NE(texture, nullptr); + material.SetTextureMap(std::move(texture), draco::TextureMap::EMISSIVE, 2); + + draco::Material new_material; + new_material.Copy(material); + + ASSERT_EQ(material.GetName(), new_material.GetName()); + ASSERT_EQ(material.GetColorFactor(), new_material.GetColorFactor()); + ASSERT_EQ(material.GetMetallicFactor(), new_material.GetMetallicFactor()); + ASSERT_EQ(material.GetRoughnessFactor(), new_material.GetRoughnessFactor()); + ASSERT_EQ(material.GetEmissiveFactor(), new_material.GetEmissiveFactor()); + ASSERT_EQ(material.GetTransparencyMode(), new_material.GetTransparencyMode()); + ASSERT_EQ(material.GetAlphaCutoff(), new_material.GetAlphaCutoff()); + ASSERT_EQ(material.GetDoubleSided(), new_material.GetDoubleSided()); + ASSERT_EQ(material.GetNormalTextureScale(), + new_material.GetNormalTextureScale()); + + // Check that the properties of material extensions have been copied. + ASSERT_EQ(material.GetUnlit(), new_material.GetUnlit()); + ASSERT_EQ(material.HasSheen(), new_material.HasSheen()); + ASSERT_EQ(material.GetSheenColorFactor(), new_material.GetSheenColorFactor()); + ASSERT_EQ(material.GetSheenRoughnessFactor(), + new_material.GetSheenRoughnessFactor()); + ASSERT_TRUE(material.HasTransmission()); + ASSERT_EQ(material.GetTransmissionFactor(), + new_material.GetTransmissionFactor()); + ASSERT_TRUE(material.HasClearcoat()); + ASSERT_EQ(material.GetClearcoatFactor(), new_material.GetClearcoatFactor()); + ASSERT_EQ(material.GetClearcoatRoughnessFactor(), + new_material.GetClearcoatRoughnessFactor()); + ASSERT_TRUE(material.HasVolume()); + ASSERT_EQ(material.GetThicknessFactor(), new_material.GetThicknessFactor()); + ASSERT_EQ(material.GetAttenuationDistance(), + new_material.GetAttenuationDistance()); + ASSERT_EQ(material.GetAttenuationColor(), new_material.GetAttenuationColor()); + ASSERT_TRUE(material.HasIor()); + ASSERT_EQ(material.GetIor(), new_material.GetIor()); + ASSERT_TRUE(material.HasSpecular()); + ASSERT_EQ(material.GetSpecularFactor(), new_material.GetSpecularFactor()); + ASSERT_EQ(material.GetSpecularColorFactor(), + new_material.GetSpecularColorFactor()); + + for (int i = 0; i < draco::TextureMap::TEXTURE_TYPES_COUNT; ++i) { + const draco::TextureMap::Type texture_map_type = + static_cast(i); + if (material.GetTextureMapByType(texture_map_type) == nullptr) { + ASSERT_EQ(new_material.GetTextureMapByType(texture_map_type), nullptr); + continue; + } + if (material.GetTextureMapByType(texture_map_type)->texture() == nullptr) { + ASSERT_EQ(new_material.GetTextureMapByType(texture_map_type)->texture(), + nullptr); + } else { + ASSERT_NE(new_material.GetTextureMapByType(texture_map_type)->texture(), + nullptr); + ASSERT_EQ( + material.GetTextureMapByType(texture_map_type)->tex_coord_index(), + new_material.GetTextureMapByType(texture_map_type) + ->tex_coord_index()); + } + } + + ASSERT_EQ(material.NumTextureMaps(), new_material.NumTextureMaps()); + for (int i = 0; i < material.NumTextureMaps(); ++i) { + const draco::TextureMap *const tm0 = material.GetTextureMapByIndex(i); + const draco::TextureMap *const tm1 = new_material.GetTextureMapByIndex(i); + ASSERT_NE(tm0, nullptr); + ASSERT_NE(tm1, nullptr); + ASSERT_EQ(tm0->type(), tm1->type()); + } +} + +TEST(MaterialTest, RemoveTextureMap) { + // Tests that we can remove existing texture maps from a material. + draco::Material material; + + // Add some dummy textures to the material. + std::unique_ptr texture = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + ASSERT_NE(texture, nullptr); + material.SetTextureMap(std::move(texture), draco::TextureMap::COLOR, 0); + + std::unique_ptr texture_2 = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + + material.SetTextureMap(std::move(texture), draco::TextureMap::EMISSIVE, 0); + + ASSERT_EQ(material.NumTextureMaps(), 2); + + // Try to delete the color texture. + std::unique_ptr removed_texture = + material.RemoveTextureMapByType(draco::TextureMap::COLOR); + ASSERT_NE(removed_texture, nullptr); + ASSERT_EQ(removed_texture->type(), draco::TextureMap::COLOR); + ASSERT_EQ(material.NumTextureMaps(), 1); + ASSERT_NE(material.GetTextureMapByType(draco::TextureMap::EMISSIVE), nullptr); + ASSERT_EQ(material.GetTextureMapByIndex(0)->type(), + draco::TextureMap::EMISSIVE); + ASSERT_EQ(material.GetTextureMapByType(draco::TextureMap::COLOR), nullptr); + + removed_texture = material.RemoveTextureMapByIndex(0); + ASSERT_NE(removed_texture, nullptr); + ASSERT_EQ(removed_texture->type(), draco::TextureMap::EMISSIVE); + ASSERT_EQ(material.NumTextureMaps(), 0); + ASSERT_EQ(material.GetTextureMapByType(draco::TextureMap::EMISSIVE), nullptr); +} + +TEST(MaterialTest, SharedTexture) { + // Tests adding shared textures. + draco::Material material; + + // Add some dummy textures to the material. + std::unique_ptr texture = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + ASSERT_NE(texture, nullptr); + draco::Texture *texture_raw = texture.get(); + material.SetTextureMap(std::move(texture), draco::TextureMap::COLOR, 0); + + DRACO_ASSERT_OK( + material.SetTextureMap(texture_raw, draco::TextureMap::EMISSIVE, 0)); + + ASSERT_EQ(material.NumTextureMaps(), 2); + + // Read a new texture. + texture = draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png")) + .value(); + // Texture is not owned by the material so we expect a failure. + ASSERT_FALSE( + material + .SetTextureMap(texture.get(), draco::TextureMap::AMBIENT_OCCLUSION, 0) + .ok()); +} + +} // namespace +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/material/material_utils.cc b/contrib/draco/src/draco/material/material_utils.cc new file mode 100644 index 000000000..7f9fcb621 --- /dev/null +++ b/contrib/draco/src/draco/material/material_utils.cc @@ -0,0 +1,14 @@ +// Copyright 2020 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// diff --git a/contrib/draco/src/draco/material/material_utils.h b/contrib/draco/src/draco/material/material_utils.h new file mode 100644 index 000000000..7f9fcb621 --- /dev/null +++ b/contrib/draco/src/draco/material/material_utils.h @@ -0,0 +1,14 @@ +// Copyright 2020 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// diff --git a/contrib/draco/src/draco/material/material_utils_test.cc b/contrib/draco/src/draco/material/material_utils_test.cc new file mode 100644 index 000000000..82a1227a2 --- /dev/null +++ b/contrib/draco/src/draco/material/material_utils_test.cc @@ -0,0 +1,24 @@ +// Copyright 2020 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/material/material_utils.h" + +#include +#include +#include + +#include "draco/core/draco_test_utils.h" +#include "draco/io/texture_io.h" + +namespace {} // namespace diff --git a/contrib/draco/src/draco/mesh/corner_table.cc b/contrib/draco/src/draco/mesh/corner_table.cc index 3f92f651a..6494c1572 100644 --- a/contrib/draco/src/draco/mesh/corner_table.cc +++ b/contrib/draco/src/draco/mesh/corner_table.cc @@ -15,6 +15,7 @@ #include "draco/mesh/corner_table.h" #include +#include #include "draco/attributes/geometry_indices.h" #include "draco/mesh/corner_table_iterators.h" diff --git a/contrib/draco/src/draco/mesh/corner_table.h b/contrib/draco/src/draco/mesh/corner_table.h index 3aa720fde..3088931c1 100644 --- a/contrib/draco/src/draco/mesh/corner_table.h +++ b/contrib/draco/src/draco/mesh/corner_table.h @@ -21,6 +21,7 @@ #include "draco/attributes/geometry_indices.h" #include "draco/core/draco_index_type_vector.h" #include "draco/core/macros.h" +#include "draco/draco_features.h" #include "draco/mesh/valence_cache.h" namespace draco { diff --git a/contrib/draco/src/draco/mesh/corner_table_iterators.h b/contrib/draco/src/draco/mesh/corner_table_iterators.h index 7122aa1be..72c70ac32 100644 --- a/contrib/draco/src/draco/mesh/corner_table_iterators.h +++ b/contrib/draco/src/draco/mesh/corner_table_iterators.h @@ -15,15 +15,23 @@ #ifndef DRACO_MESH_CORNER_TABLE_ITERATORS_H_ #define DRACO_MESH_CORNER_TABLE_ITERATORS_H_ +#include + #include "draco/mesh/corner_table.h" namespace draco { // Class for iterating over vertices in a 1-ring around the specified vertex. template -class VertexRingIterator - : public std::iterator { +class VertexRingIterator { public: + // Iterator traits expected by std libraries. + using iterator_category = std::forward_iterator_tag; + using value_type = VertexIndex; + using difference_type = std::ptrdiff_t; + using pointer = VertexIndex *; + using reference = VertexIndex &; + // std::iterator interface requires a default constructor. VertexRingIterator() : corner_table_(nullptr), @@ -111,9 +119,15 @@ class VertexRingIterator // Class for iterating over faces adjacent to the specified input face. template -class FaceAdjacencyIterator - : public std::iterator { +class FaceAdjacencyIterator { public: + // Iterator traits expected by std libraries. + using iterator_category = std::forward_iterator_tag; + using value_type = FaceIndex; + using difference_type = std::ptrdiff_t; + using pointer = FaceIndex *; + using reference = FaceIndex &; + // std::iterator interface requires a default constructor. FaceAdjacencyIterator() : corner_table_(nullptr), @@ -193,9 +207,15 @@ class FaceAdjacencyIterator // Class for iterating over corners attached to a specified vertex. template -class VertexCornersIterator - : public std::iterator { +class VertexCornersIterator { public: + // Iterator traits expected by std libraries. + using iterator_category = std::forward_iterator_tag; + using value_type = CornerIndex; + using difference_type = std::ptrdiff_t; + using pointer = CornerIndex *; + using reference = CornerIndex &; + // std::iterator interface requires a default constructor. VertexCornersIterator() : corner_table_(nullptr), diff --git a/contrib/draco/src/draco/mesh/corner_table_test.cc b/contrib/draco/src/draco/mesh/corner_table_test.cc new file mode 100644 index 000000000..f88d3ec96 --- /dev/null +++ b/contrib/draco/src/draco/mesh/corner_table_test.cc @@ -0,0 +1,126 @@ +#include "draco/mesh/corner_table.h" + +#include + +#include "draco/core/draco_test_utils.h" +#include "draco/io/obj_decoder.h" +#include "draco/mesh/mesh_connected_components.h" +#include "draco/mesh/mesh_misc_functions.h" + +namespace draco { + +class CornerTableTest : public ::testing::Test { + protected: + std::unique_ptr DecodeObj(const std::string &file_name) const { + const std::string path = GetTestFileFullPath(file_name); + ObjDecoder decoder; + std::unique_ptr mesh(new Mesh()); + if (!decoder.DecodeFromFile(path, mesh.get()).ok()) { + return nullptr; + } + return mesh; + } + + void TestEncodingCube() { + // Build a CornerTable looking at the mesh and verify that the caching of + // valences are reasonably correct and within range of expectations. This + // test is built specifically for working with 'cubes' and has expectations + // about the degree of each corner. + const std::string file_name = "cube_att.obj"; + std::unique_ptr in_mesh = DecodeObj(file_name); + ASSERT_NE(in_mesh, nullptr) << "Failed to load test model " << file_name; + draco::Mesh *mesh = nullptr; + mesh = in_mesh.get(); + + std::unique_ptr utable = + draco::CreateCornerTableFromPositionAttribute(mesh); + draco::CornerTable *table = utable.get(); + + table->GetValenceCache().CacheValences(); + table->GetValenceCache().CacheValencesInaccurate(); + + for (VertexIndex index = static_cast(0); + index < static_cast(table->num_vertices()); index++) { + const auto valence = table->Valence(index); + const auto valence2 = table->GetValenceCache().ValenceFromCache(index); + const auto valence3 = + table->GetValenceCache().ValenceFromCacheInaccurate(index); + ASSERT_EQ(valence, valence2); + ASSERT_GE(valence, valence3); // may be clipped. + + // No more than 6 triangles can touch a cube corner. + ASSERT_LE(valence, 6); + ASSERT_LE(valence2, 6); + ASSERT_LE(valence3, 6); + + // No less than 3 triangles can touch a cube corner. + ASSERT_GE(valence, 3); + ASSERT_GE(valence2, 3); + ASSERT_GE(valence3, 3); + } + + for (CornerIndex index = static_cast(0); + index < static_cast(table->num_corners()); index++) { + const auto valence = table->Valence(index); + const auto valence2 = table->GetValenceCache().ValenceFromCache(index); + const auto valence3 = + table->GetValenceCache().ValenceFromCacheInaccurate(index); + ASSERT_EQ(valence, valence2); + ASSERT_GE(valence, valence3); // may be clipped. + + // No more than 6 triangles can touch a cube corner, 6 edges result. + ASSERT_LE(valence, 6); + ASSERT_LE(valence2, 6); + ASSERT_LE(valence3, 6); + + // No less than 3 triangles can touch a cube corner, 3 edges result. + ASSERT_GE(valence, 3); + ASSERT_GE(valence2, 3); + ASSERT_GE(valence3, 3); + } + + table->GetValenceCache().ClearValenceCache(); + table->GetValenceCache().ClearValenceCacheInaccurate(); + } +}; + +TEST_F(CornerTableTest, NormalWithSeams) { TestEncodingCube(); } + +TEST_F(CornerTableTest, TestNonManifoldEdges) { + std::unique_ptr mesh = DecodeObj("non_manifold_wrap.obj"); + ASSERT_NE(mesh, nullptr); + std::unique_ptr ct = + draco::CreateCornerTableFromPositionAttribute(mesh.get()); + ASSERT_NE(ct, nullptr); + + MeshConnectedComponents connected_components; + connected_components.FindConnectedComponents(ct.get()); + ASSERT_EQ(connected_components.NumConnectedComponents(), 2); +} + +TEST_F(CornerTableTest, TestNewFace) { + // Tests that we can add a new face to the corner table. + const std::string file_name = "cube_att.obj"; + std::unique_ptr mesh = DecodeObj(file_name); + ASSERT_NE(mesh, nullptr); + + std::unique_ptr ct = + draco::CreateCornerTableFromPositionAttribute(mesh.get()); + ASSERT_NE(ct, nullptr); + ASSERT_EQ(ct->num_faces(), 12); + ASSERT_EQ(ct->num_corners(), 3 * 12); + ASSERT_EQ(ct->num_vertices(), 8); + + const VertexIndex new_vi = ct->AddNewVertex(); + ASSERT_EQ(ct->num_vertices(), 9); + + ASSERT_EQ(ct->AddNewFace({VertexIndex(6), VertexIndex(7), new_vi}), 12); + ASSERT_EQ(ct->num_faces(), 13); + ASSERT_EQ(ct->num_corners(), 3 * 13); + + ASSERT_EQ(ct->Vertex(CornerIndex(3 * 12 + 0)), 6); + ASSERT_EQ(ct->Vertex(CornerIndex(3 * 12) + 1), 7); + ASSERT_EQ(ct->Vertex(CornerIndex(3 * 12) + 2), new_vi); +} + +} // namespace draco diff --git a/contrib/draco/src/draco/mesh/mesh.cc b/contrib/draco/src/draco/mesh/mesh.cc index 3be4b1494..b287ecb45 100644 --- a/contrib/draco/src/draco/mesh/mesh.cc +++ b/contrib/draco/src/draco/mesh/mesh.cc @@ -15,6 +15,10 @@ #include "draco/mesh/mesh.h" #include +#include +#include +#include +#include namespace draco { @@ -22,7 +26,436 @@ namespace draco { template using conditional_t = typename std::conditional::type; +#ifdef DRACO_TRANSCODER_SUPPORTED +Mesh::Mesh() : compression_enabled_(false) {} +#else Mesh::Mesh() {} +#endif + +#ifdef DRACO_TRANSCODER_SUPPORTED +void Mesh::Copy(const Mesh &src) { + PointCloud::Copy(src); + name_ = src.name_; + faces_ = src.faces_; + attribute_data_ = src.attribute_data_; + material_library_.Copy(src.material_library_); + compression_enabled_ = src.compression_enabled_; + compression_options_ = src.compression_options_; + + // Copy mesh feature ID sets. + mesh_features_.clear(); + for (MeshFeaturesIndex i(0); i < src.NumMeshFeatures(); i++) { + std::unique_ptr mesh_features(new MeshFeatures()); + mesh_features->Copy(src.GetMeshFeatures(i)); + AddMeshFeatures(std::move(mesh_features)); + } + mesh_features_material_mask_ = src.mesh_features_material_mask_; + + // Copy non-material textures. + non_material_texture_library_.Copy(src.non_material_texture_library_); + + // Update pointers to non-material textures in mesh feature ID sets. + if (non_material_texture_library_.NumTextures() != 0) { + const auto texture_to_index_map = + src.non_material_texture_library_.ComputeTextureToIndexMap(); + for (MeshFeaturesIndex j(0); j < NumMeshFeatures(); ++j) { + Mesh::UpdateMeshFeaturesTexturePointer(texture_to_index_map, + &non_material_texture_library_, + &GetMeshFeatures(j)); + } + } + + // Copy structural metadata. + structural_metadata_.Copy(src.structural_metadata_); +} + +namespace { +// A helper struct that augments a point index with an attribute value index. +// A unique combination of |point_index| and |attribute_value_index| +// corresponds to a unique point on the mesh. Used to identify unique points +// after a new attribute is added to the mesh. +struct AugmentedPointData { + PointIndex point_index; + AttributeValueIndex attribute_value_index; + bool operator<(const AugmentedPointData &pd) const { + if (point_index < pd.point_index) { + return true; + } + if (point_index > pd.point_index) { + return false; + } + return attribute_value_index < pd.attribute_value_index; + } +}; +} // namespace + +int32_t Mesh::AddAttributeWithConnectivity( + std::unique_ptr att, + const IndexTypeVector &corner_to_value) { + // Map between augmented point and new point indices (one augmented point + // corresponds to one PointIndex). + std::map old_to_new_point_map; + + // Map between corners and the new point indices. + IndexTypeVector corner_to_point(num_faces() * 3, + kInvalidPointIndex); + + // Flag whether a given existing point index has been used. Used to ensure + // that mapping between existing and new point indices that are smaller + // than num_points() is identity. In other words, we want to keep indices of + // the existing points intact and add new points to end. + IndexTypeVector is_point_used(num_points(), false); + + int new_num_points = num_points(); + for (CornerIndex ci(0); ci < num_faces() * 3; ++ci) { + AugmentedPointData apd; + apd.point_index = CornerToPointId(ci); + apd.attribute_value_index = corner_to_value[ci]; + const auto it = old_to_new_point_map.find(apd); + if (it != old_to_new_point_map.end()) { + // Augmented point is already mapped to a point index. Reuse it. + corner_to_point[ci] = it->second; + } else { + // New combination of point index + attribute value index. Map it to a + // unique point index. + PointIndex new_point_index; + if (!is_point_used[apd.point_index]) { + // Reuse the existing (old) point index. + new_point_index = apd.point_index; + is_point_used[apd.point_index] = true; + } else { + // Add a new point index to the end. + new_point_index = PointIndex(new_num_points++); + } + old_to_new_point_map[apd] = new_point_index; + corner_to_point[ci] = new_point_index; + } + } + + // Update point to attribute value mapping for the new attribute. + att->SetExplicitMapping(new_num_points); + for (CornerIndex ci(0); ci < num_faces() * 3; ++ci) { + att->SetPointMapEntry(corner_to_point[ci], corner_to_value[ci]); + } + + // Update point to attribute value mapping on the remaining attributes if + // needed. + if (new_num_points > num_points()) { + set_num_points(new_num_points); + + // Setup attributes for the new number of points. + for (int ai = 0; ai < num_attributes(); ++ai) { + const bool mapping_was_identity = attribute(ai)->is_mapping_identity(); + attribute(ai)->SetExplicitMapping(new_num_points); + if (mapping_was_identity) { + // Convert all old points from identity to explicit mapping. + for (AttributeValueIndex avi(0); avi < attribute(ai)->size(); ++avi) { + attribute(ai)->SetPointMapEntry(PointIndex(avi.value()), avi); + } + } + } + + for (CornerIndex ci(0); ci < num_faces() * 3; ++ci) { + const PointIndex old_point_index = CornerToPointId(ci); + const PointIndex new_point_index = corner_to_point[ci]; + if (old_point_index == new_point_index) { + continue; + } + // Update point to value mapping for all existing attributes. + for (int ai = 0; ai < num_attributes(); ++ai) { + attribute(ai)->SetPointMapEntry( + new_point_index, attribute(ai)->mapped_index(old_point_index)); + } + // Update mapping between the corner and the new point index. + faces_[FaceIndex(ci.value() / 3)][ci.value() % 3] = new_point_index; + } + } + + // If any of the old points have not been used, initialize dummy mapping for + // the new attribute. + for (PointIndex pi(0); pi < is_point_used.size(); ++pi) { + if (!is_point_used[pi]) { + att->SetPointMapEntry(pi, AttributeValueIndex(0)); + } + } + + return PointCloud::AddAttribute(std::move(att)); +} + +int32_t Mesh::AddPerVertexAttribute(std::unique_ptr att) { + const PointAttribute *const pos_att = + GetNamedAttribute(GeometryAttribute::POSITION); + if (pos_att == nullptr) { + return -1; + } + if (att->size() != pos_att->size()) { + return -1; // Number of values must be same as in the position attribute. + } + + if (pos_att->is_mapping_identity()) { + att->SetIdentityMapping(); + } else { + // Copy point to attribute value mapping from the position attribute to + // |att|. + att->SetExplicitMapping(num_points()); + for (PointIndex pi(0); pi < num_points(); ++pi) { + att->SetPointMapEntry(pi, pos_att->mapped_index(pi)); + } + } + + return PointCloud::AddAttribute(std::move(att)); +} + +void Mesh::RemoveIsolatedPoints() { + // For each point, check if it is mapped to a face. + IndexTypeVector is_point_used(num_points(), false); + int num_used_points = 0; + for (FaceIndex fi(0); fi < num_faces(); ++fi) { + const auto &f = face(fi); + for (int c = 0; c < 3; ++c) { + if (!is_point_used[f[c]]) { + num_used_points++; + is_point_used[f[c]] = true; + } + } + } + if (num_used_points == num_points()) { + return; // All points are used. + } + + // Create mapping between the old and new point indices. + IndexTypeVector old_to_new_point_map( + num_points(), kInvalidPointIndex); + PointIndex new_point_index(0); + for (PointIndex pi(0); pi < num_points(); ++pi) { + if (is_point_used[pi]) { + old_to_new_point_map[pi] = new_point_index++; + } + } + + // Update point to attribute value index map for all attributes. + for (int ai = 0; ai < num_attributes(); ++ai) { + PointAttribute *att = attribute(ai); + if (att->is_mapping_identity()) { + // When the attribute uses identity mapping we need to reorder to the + // attribute values to match the new point indices. + for (PointIndex pi(0); pi < num_points(); ++pi) { + const PointIndex new_pi = old_to_new_point_map[pi]; + if (new_pi == pi || new_pi == kInvalidPointIndex) { + continue; + } + att->SetAttributeValue( + AttributeValueIndex(new_pi.value()), + att->GetAddress(AttributeValueIndex(pi.value()))); + } + att->Resize(num_used_points); + } else { + // For explicitly mapped attributes, we first update the point to + // attribute value mapping and then we remove all unused values from the + // attribute. + for (PointIndex pi(0); pi < num_points(); ++pi) { + const PointIndex new_pi = old_to_new_point_map[pi]; + if (new_pi == pi || new_pi == kInvalidPointIndex) { + continue; + } + att->SetPointMapEntry(new_pi, att->mapped_index(pi)); + } + att->SetExplicitMapping(num_used_points); + + att->RemoveUnusedValues(); + } + } + + // Update the mapping between faces and point indices. + for (FaceIndex fi(0); fi < num_faces(); ++fi) { + auto &f = faces_[fi]; + for (int c = 0; c < 3; ++c) { + f[c] = old_to_new_point_map[f[c]]; + } + } + + set_num_points(num_used_points); +} + +void Mesh::RemoveUnusedMaterials() { RemoveUnusedMaterials(true); } + +void Mesh::RemoveUnusedMaterials(bool remove_unused_material_indices) { + const int mat_att_index = GetNamedAttributeId(GeometryAttribute::MATERIAL); + if (mat_att_index == -1) { + // Remove all materials except for the first one. + while (GetMaterialLibrary().NumMaterials() > 1) { + GetMaterialLibrary().RemoveMaterial(1); + } + GetMaterialLibrary().RemoveUnusedTextures(); + return; + } + auto mat_att = attribute(mat_att_index); + + // Deduplicate attribute values in the material attribute to ensure that one + // attribute value index corresponds to one unique material index. + // Note that this does not remove unused material indices. + mat_att->DeduplicateValues(*mat_att); + + // Gather all material indices that are referenced by faces of the mesh. + const int num_materials = GetMaterialLibrary().NumMaterials(); + std::vector is_material_used(num_materials, false); + int num_used_materials = 0; + + // Helper function that updates |is_material_used| for the processed mesh. + auto update_used_materials = [&is_material_used, &num_used_materials, mat_att, + num_materials](PointIndex pi) { + uint32_t mat_index = 0; + mat_att->GetMappedValue(pi, &mat_index); + if (mat_index < num_materials) { + if (!is_material_used[mat_index]) { + is_material_used[mat_index] = true; + num_used_materials++; + } + } + }; + + if (num_faces() > 0) { + for (FaceIndex fi(0); fi < num_faces(); ++fi) { + update_used_materials(faces_[fi][0]); + } + } else { + // Handle the mesh as a point cloud and check materials used by points. + for (PointIndex pi(0); pi < num_points(); ++pi) { + update_used_materials(pi); + } + } + + // Check if any of the (unused) materials is used by mesh features. If so, + // user should remove unused mesh features first. + for (MeshFeaturesIndex mfi(0); mfi < NumMeshFeatures(); ++mfi) { + for (int mask_index = 0; mask_index < NumMeshFeaturesMaterialMasks(mfi); + ++mask_index) { + const int mat_index = GetMeshFeaturesMaterialMask(mfi, mask_index); + if (mat_index < num_materials && !is_material_used[mat_index]) { + is_material_used[mat_index] = true; + num_used_materials++; + } + } + } + + if (num_used_materials == num_materials) { + return; // All materials are used, don't do anything. + } + + // Remove unused materials from the material library or replace them with + // default materials if we do not remove unused material indices. + for (int mi = num_materials - 1; mi >= 0; --mi) { + if (!is_material_used[mi] && mi < GetMaterialLibrary().NumMaterials()) { + if (remove_unused_material_indices) { + GetMaterialLibrary().RemoveMaterial(mi); + } else { + GetMaterialLibrary().MutableMaterial(mi)->Clear(); + } + } + } + GetMaterialLibrary().RemoveUnusedTextures(); + + if (!remove_unused_material_indices) { + // All the code below handles updating of material indices. Since we do not + // want to update them, we can return early. + return; + } + + // Compute map between old and new material indices. + std::vector old_to_new_material_index_map(num_materials, -1); + for (int mi = 0, new_material_index = 0; mi < num_materials; ++mi) { + if (is_material_used[mi]) { + old_to_new_material_index_map[mi] = new_material_index; + ++new_material_index; + } + } + IndexTypeVector + old_to_new_material_attribute_value_index_map(mat_att->size(), -1); + for (AttributeValueIndex avi(0); avi < mat_att->size(); ++avi) { + uint32_t mat_index = 0; + mat_att->GetValue(avi, &mat_index); + if (mat_index < num_materials && is_material_used[mat_index]) { + old_to_new_material_attribute_value_index_map[avi] = + old_to_new_material_index_map[mat_index]; + } + } + + // Update attribute values with the new number of materials. + mat_att->Reset(num_used_materials); + + // Set identity mapping between AttributeValueIndex and material indices. + for (AttributeValueIndex avi(0); avi < mat_att->size(); ++avi) { + const uint32_t mat_index = avi.value(); + mat_att->SetAttributeValue(avi, &mat_index); + } + + // Update mapping between points and attribute values. + for (PointIndex pi(0); pi < num_points(); ++pi) { + const AttributeValueIndex old_avi = mat_att->mapped_index(pi); + mat_att->SetPointMapEntry( + pi, AttributeValueIndex( + old_to_new_material_attribute_value_index_map[old_avi])); + } + + // Update material indices on mesh features. + for (MeshFeaturesIndex mfi(0); mfi < NumMeshFeatures(); ++mfi) { + for (int mask_index = 0; mask_index < NumMeshFeaturesMaterialMasks(mfi); + ++mask_index) { + const int old_mat_index = GetMeshFeaturesMaterialMask(mfi, mask_index); + if (old_mat_index < num_materials && is_material_used[old_mat_index]) { + mesh_features_material_mask_[mfi][mask_index] = + old_to_new_material_index_map[old_mat_index]; + } + } + } +} + +void Mesh::UpdateMeshFeaturesTexturePointer( + const std::unordered_map &texture_to_index_map, + TextureLibrary *texture_library, MeshFeatures *mesh_features) { + TextureMap &texture_map = mesh_features->GetTextureMap(); + if (texture_map.texture() == nullptr) { + return; + } + const auto it = texture_to_index_map.find(texture_map.texture()); + DRACO_DCHECK(it != texture_to_index_map.end()); + const int texture_index = it->second; + DRACO_DCHECK(texture_index < texture_library->NumTextures()); + texture_map.SetTexture(texture_library->GetTexture(texture_index)); +} + +void Mesh::CopyMeshFeaturesForMaterial(const Mesh &source_mesh, + Mesh *target_mesh, int material_index) { + for (MeshFeaturesIndex mfi(0); mfi < source_mesh.NumMeshFeatures(); ++mfi) { + // Mesh features is used if it doesn't have any material mask or if one + // of the material masks matches |material_index|. + bool is_used = source_mesh.NumMeshFeaturesMaterialMasks(mfi) == 0; + for (int mask_index = 0; + !is_used && mask_index < source_mesh.NumMeshFeaturesMaterialMasks(mfi); + ++mask_index) { + if (source_mesh.GetMeshFeaturesMaterialMask(mfi, mask_index) == + material_index) { + is_used = true; + } + } + if (is_used) { + // Copy over the mesh features to the target mesh. Note that texture + // pointers are not updated at this step. + std::unique_ptr new_mf(new MeshFeatures()); + new_mf->Copy(source_mesh.GetMeshFeatures(mfi)); + target_mesh->AddMeshFeatures(std::move(new_mf)); + } + } +} + +int32_t Mesh::AddPerFaceAttribute(std::unique_ptr att) { + IndexTypeVector corner_map(num_faces() * 3); + for (CornerIndex ci(0); ci < num_faces() * 3; ++ci) { + corner_map[ci] = AttributeValueIndex(ci.value() / 3); + } + return AddAttributeWithConnectivity(std::move(att), corner_map); +} +#endif // DRACO_TRANSCODER_SUPPORTED #ifdef DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED void Mesh::ApplyPointIdDeduplication( diff --git a/contrib/draco/src/draco/mesh/mesh.h b/contrib/draco/src/draco/mesh/mesh.h index f4506da81..652c2c010 100644 --- a/contrib/draco/src/draco/mesh/mesh.h +++ b/contrib/draco/src/draco/mesh/mesh.h @@ -16,12 +16,20 @@ #define DRACO_MESH_MESH_H_ #include +#include #include "draco/attributes/geometry_indices.h" #include "draco/core/hash_utils.h" #include "draco/core/macros.h" #include "draco/core/status.h" #include "draco/draco_features.h" +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/compression/draco_compression_options.h" +#include "draco/material/material_library.h" +#include "draco/mesh/mesh_features.h" +#include "draco/mesh/mesh_indices.h" +#include "draco/metadata/structural_metadata.h" +#endif #include "draco/point_cloud/point_cloud.h" namespace draco { @@ -47,6 +55,11 @@ class Mesh : public PointCloud { Mesh(); +#ifdef DRACO_TRANSCODER_SUPPORTED + // Copies all data from the |src| mesh. + void Copy(const Mesh &src); +#endif + void AddFace(const Face &face) { faces_.push_back(face); } void SetFace(FaceIndex face_id, const Face &face) { @@ -83,6 +96,38 @@ class Mesh : public PointCloud { } } +#ifdef DRACO_TRANSCODER_SUPPORTED + // Adds a point attribute |att| to the mesh and returns the index of the + // newly inserted attribute. Attribute connectivity data is specified in + // |corner_to_value| array that contains mapping between face corners and + // attribute value indices. + // The purpose of this function is to allow users to add attributes with + // arbitrary connectivity to an existing mesh. New points will be + // automatically created if needed. + int32_t AddAttributeWithConnectivity( + std::unique_ptr att, + const IndexTypeVector &corner_to_value); + + // Adds a point attribute |att| to the mesh and returns the index of the + // newly inserted attribute. The inserted attribute must have the same + // connectivity as the position attribute of the mesh (that is, the attribute + // values are defined per-vertex). Each attribute value entry in |att| + // corresponds to the corresponding attribute value entry in the position + // attribute (AttributeValueIndex in both attributes refer to the same + // spatial vertex). + // Returns -1 in case of error. + int32_t AddPerVertexAttribute(std::unique_ptr att); + + // Removes points that are not mapped to any face of the mesh. All attribute + // values are going to be removed as well. + void RemoveIsolatedPoints(); + + // Adds a point attribute |att| to the mesh and returns the index of the + // newly inserted attribute. Attribute values are mapped 1:1 to face indices. + // Returns -1 in case of error. + int32_t AddPerFaceAttribute(std::unique_ptr att); +#endif // DRACO_TRANSCODER_SUPPORTED + MeshAttributeElementType GetAttributeElementType(int att_id) const { return attribute_data_[att_id].element_type; } @@ -109,6 +154,103 @@ class Mesh : public PointCloud { MeshAttributeElementType element_type; }; +#ifdef DRACO_TRANSCODER_SUPPORTED + void SetName(const std::string &name) { name_ = name; } + const std::string &GetName() const { return name_; } + const MaterialLibrary &GetMaterialLibrary() const { + return material_library_; + } + MaterialLibrary &GetMaterialLibrary() { return material_library_; } + + // Removes all materials that are not referenced by any face of the mesh. + // Optional argument |remove_unused_material_indices| can be used to control + // whether unusued material indices are removed as well (default = true). + // If material indices are not removed, the unused material indices will + // point to empty (default) materials. + void RemoveUnusedMaterials(); + void RemoveUnusedMaterials(bool remove_unused_material_indices); + + // Enables or disables Draco geometry compression for this mesh. + void SetCompressionEnabled(bool enabled) { compression_enabled_ = enabled; } + bool IsCompressionEnabled() const { return compression_enabled_; } + + // Sets |options| that configure Draco geometry compression. This does not + // enable or disable compression. + void SetCompressionOptions(const DracoCompressionOptions &options) { + compression_options_ = options; + } + const DracoCompressionOptions &GetCompressionOptions() const { + return compression_options_; + } + DracoCompressionOptions &GetCompressionOptions() { + return compression_options_; + } + + // Library that contains non-material textures. + const TextureLibrary &GetNonMaterialTextureLibrary() const { + return non_material_texture_library_; + } + TextureLibrary &GetNonMaterialTextureLibrary() { + return non_material_texture_library_; + } + + // Mesh feature ID sets as defined by EXT_mesh_features glTF extension. + MeshFeaturesIndex AddMeshFeatures( + std::unique_ptr mesh_features) { + mesh_features_.push_back(std::move(mesh_features)); + mesh_features_material_mask_.push_back({}); + return MeshFeaturesIndex(mesh_features_.size() - 1); + } + int NumMeshFeatures() const { return mesh_features_.size(); } + const MeshFeatures &GetMeshFeatures(MeshFeaturesIndex index) const { + return *mesh_features_[index]; + } + MeshFeatures &GetMeshFeatures(MeshFeaturesIndex index) { + return *mesh_features_[index]; + } + void RemoveMeshFeatures(MeshFeaturesIndex index) { + mesh_features_.erase(mesh_features_.begin() + index.value()); + mesh_features_material_mask_.erase(mesh_features_material_mask_.begin() + + index.value()); + } + + // Restricts given mesh features to faces mapped to a material with + // |material_index|. Note that single mesh features can be restricted to + // multiple materials. + void AddMeshFeaturesMaterialMask(MeshFeaturesIndex index, + int material_index) { + mesh_features_material_mask_[index].push_back(material_index); + } + + size_t NumMeshFeaturesMaterialMasks(MeshFeaturesIndex index) const { + return mesh_features_material_mask_[index].size(); + } + int GetMeshFeaturesMaterialMask(MeshFeaturesIndex index, + int mask_index) const { + return mesh_features_material_mask_[index][mask_index]; + } + + // Updates mesh features texture pointer to point to a new |texture_library|. + // The current texture pointer is used to determine the texture index in the + // new texture library via a given |texture_to_index_map|. + static void UpdateMeshFeaturesTexturePointer( + const std::unordered_map &texture_to_index_map, + TextureLibrary *texture_library, MeshFeatures *mesh_features); + + // Copies over mesh features from |source_mesh| and stores them in + // |target_mesh| as long as the mesh features material mask is valid for + // given |material_index|. + static void CopyMeshFeaturesForMaterial(const Mesh &source_mesh, + Mesh *target_mesh, + int material_index); + + // Structural metadata. + const StructuralMetadata &GetStructuralMetadata() const { + return structural_metadata_; + } + StructuralMetadata &GetStructuralMetadata() { return structural_metadata_; } +#endif // DRACO_TRANSCODER_SUPPORTED + protected: #ifdef DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED // Extends the point deduplication to face corners. This method is called from @@ -119,6 +261,10 @@ class Mesh : public PointCloud { const std::vector &unique_point_ids) override; #endif + // Exposes |faces_|. Use |faces_| at your own risk. DO NOT store the + // reference: the |faces_| object is destroyed with the mesh. + IndexTypeVector &faces() { return faces_; } + private: // Mesh specific per-attribute data. std::vector attribute_data_; @@ -127,6 +273,40 @@ class Mesh : public PointCloud { // that converts vertex indices into attribute indices. IndexTypeVector faces_; +#ifdef DRACO_TRANSCODER_SUPPORTED + // Mesh name. + std::string name_; + + // Materials applied to to this mesh. + MaterialLibrary material_library_; + + // Compression options for this mesh. + // TODO(vytyaz): Store encoded bitstream that this mesh compresses into. + bool compression_enabled_; + DracoCompressionOptions compression_options_; + + // Sets of feature IDs as defined by EXT_mesh_features glTF extension. + IndexTypeVector> + mesh_features_; + + // When the Mesh contains multiple materials, |mesh_features_material_mask_| + // can be used to limit specific MeshFeaturesIndex to a vector of material + // indices. If for a given mesh feature index, the material indices are empty, + // the corresponding mesh features are applied to the entire mesh. + IndexTypeVector> + mesh_features_material_mask_; + + // Texture library for storing non-material textures used by this mesh, e.g., + // textures containing mesh feature IDs of EXT_mesh_features glTF extension. + // If the mesh is part of the scene then the textures are stored in the scene. + // Note that mesh features contain pointers to non-material textures. It is + // responsibility of class user to update these pointers when updating the + // textures. See Mesh::Copy() for example. + TextureLibrary non_material_texture_library_; + + // Structural metadata defined by the EXT_structural_metadata glTF extension. + StructuralMetadata structural_metadata_; +#endif // DRACO_TRANSCODER_SUPPORTED friend struct MeshHasher; }; diff --git a/contrib/draco/src/draco/mesh/mesh_are_equivalent.cc b/contrib/draco/src/draco/mesh/mesh_are_equivalent.cc index b832379af..305811f10 100644 --- a/contrib/draco/src/draco/mesh/mesh_are_equivalent.cc +++ b/contrib/draco/src/draco/mesh/mesh_are_equivalent.cc @@ -15,6 +15,9 @@ #include "draco/mesh/mesh_are_equivalent.h" #include +#include + +#include "draco/texture/texture_utils.h" namespace draco { @@ -114,6 +117,55 @@ bool MeshAreEquivalent::operator()(const Mesh &mesh0, const Mesh &mesh1) { // face with respect to lex order. Init(mesh0, mesh1); +#ifdef DRACO_TRANSCODER_SUPPORTED + // Compare geometry compression settings. + if (mesh0.IsCompressionEnabled() != mesh1.IsCompressionEnabled()) { + return false; + } + if (mesh0.GetCompressionOptions() != mesh1.GetCompressionOptions()) { + return false; + } + + // Compare non-material texture library sizes. + if (mesh0.GetNonMaterialTextureLibrary().NumTextures() != + mesh1.GetNonMaterialTextureLibrary().NumTextures()) { + return false; + } + + // Compare mesh feature ID sets. + if (mesh0.NumMeshFeatures() != mesh1.NumMeshFeatures()) { + return false; + } + for (MeshFeaturesIndex i(0); i < mesh0.NumMeshFeatures(); ++i) { + const MeshFeatures &features0 = mesh0.GetMeshFeatures(i); + const MeshFeatures &features1 = mesh1.GetMeshFeatures(i); + if (features0.GetAttributeIndex() != features1.GetAttributeIndex()) { + return false; + } + if (features0.GetFeatureCount() != features1.GetFeatureCount()) { + return false; + } + if (features0.GetLabel() != features1.GetLabel()) { + return false; + } + if (features0.GetNullFeatureId() != features1.GetNullFeatureId()) { + return false; + } + if (features0.GetTextureChannels() != features1.GetTextureChannels()) { + return false; + } + if (features0.GetPropertyTableIndex() != + features1.GetPropertyTableIndex()) { + return false; + } + const TextureMap &map0 = features0.GetTextureMap(); + const TextureMap &map1 = features1.GetTextureMap(); + if (map0.tex_coord_index() != map1.tex_coord_index()) { + return false; + } + } +#endif // DRACO_TRANSCODER_SUPPORTED + // Check for every attribute that is valid that every corner is identical. typedef GeometryAttribute::Type AttributeType; const int att_max = AttributeType::NAMED_ATTRIBUTES_COUNT; diff --git a/contrib/draco/src/draco/mesh/mesh_are_equivalent_test.cc b/contrib/draco/src/draco/mesh/mesh_are_equivalent_test.cc index 74db3f7de..94d8c9c16 100644 --- a/contrib/draco/src/draco/mesh/mesh_are_equivalent_test.cc +++ b/contrib/draco/src/draco/mesh/mesh_are_equivalent_test.cc @@ -15,6 +15,7 @@ #include "draco/mesh/mesh_are_equivalent.h" #include +#include #include "draco/core/draco_test_base.h" #include "draco/core/draco_test_utils.h" @@ -30,6 +31,14 @@ TEST_F(MeshAreEquivalentTest, TestOnIndenticalMesh) { const std::string file_name = "test_nm.obj"; const std::unique_ptr mesh(ReadMeshFromTestFile(file_name)); ASSERT_NE(mesh, nullptr) << "Failed to load test model." << file_name; + +#ifdef DRACO_TRANSCODER_SUPPORTED + // Add mesh feature ID set to the mesh. + std::unique_ptr mesh_features(new MeshFeatures()); + mesh->AddMeshFeatures(std::move(mesh_features)); +#endif + + // Check that mesh is equivalent to itself. MeshAreEquivalent equiv; ASSERT_TRUE(equiv(*mesh, *mesh)); } @@ -95,4 +104,32 @@ TEST_F(MeshAreEquivalentTest, TestOnBigMesh) { ASSERT_TRUE(equiv(*mesh0, *mesh1)); } +#ifdef DRACO_TRANSCODER_SUPPORTED + +TEST_F(MeshAreEquivalentTest, TestMeshFeatures) { + const std::string file_name = "test_nm.obj"; + const std::unique_ptr mesh0(ReadMeshFromTestFile(file_name)); + const std::unique_ptr mesh1(ReadMeshFromTestFile(file_name)); + ASSERT_NE(mesh0, nullptr); + ASSERT_NE(mesh1, nullptr); + + // Add identical mesh feature ID sets to meshes. + mesh0->AddMeshFeatures(std::unique_ptr(new MeshFeatures())); + mesh1->AddMeshFeatures(std::unique_ptr(new MeshFeatures())); + + // Empty feature sets should match. + MeshAreEquivalent equiv; + ASSERT_TRUE(equiv(*mesh0, *mesh1)); + + // Make mesh features different and check that the meshes are not equivalent. + mesh0->GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(5); + mesh1->GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(6); + ASSERT_FALSE(equiv(*mesh0, *mesh1)); + + // Make mesh features identical and check that the meshes are equivalent. + mesh0->GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(1); + mesh1->GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(1); + ASSERT_TRUE(equiv(*mesh0, *mesh1)); +} +#endif // DRACO_TRANSCODER_SUPPORTED } // namespace draco diff --git a/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.cc b/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.cc index 28b68d5fd..54801ce5c 100644 --- a/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.cc +++ b/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.cc @@ -126,18 +126,18 @@ void MeshAttributeCornerTable::AddSeamEdge(CornerIndex c) { } } -void MeshAttributeCornerTable::RecomputeVertices(const Mesh *mesh, +bool MeshAttributeCornerTable::RecomputeVertices(const Mesh *mesh, const PointAttribute *att) { DRACO_DCHECK(GetValenceCache().IsCacheEmpty()); if (mesh != nullptr && att != nullptr) { - RecomputeVerticesInternal(mesh, att); + return RecomputeVerticesInternal(mesh, att); } else { - RecomputeVerticesInternal(nullptr, nullptr); + return RecomputeVerticesInternal(nullptr, nullptr); } } template -void MeshAttributeCornerTable::RecomputeVerticesInternal( +bool MeshAttributeCornerTable::RecomputeVerticesInternal( const Mesh *mesh, const PointAttribute *att) { DRACO_DCHECK(GetValenceCache().IsCacheEmpty()); vertex_to_attribute_entry_id_map_.clear(); @@ -167,6 +167,11 @@ void MeshAttributeCornerTable::RecomputeVerticesInternal( while (act_c != kInvalidCornerIndex) { first_c = act_c; act_c = SwingLeft(act_c); + if (act_c == c) { + // We reached the initial corner which shouldn't happen when we swing + // left from |c|. + return false; + } } } corner_to_vertex_map_[first_c.value()] = VertexIndex(first_vert_id.value()); @@ -189,6 +194,7 @@ void MeshAttributeCornerTable::RecomputeVerticesInternal( act_c = corner_table_->SwingRight(act_c); } } + return true; } int MeshAttributeCornerTable::Valence(VertexIndex v) const { diff --git a/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.h b/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.h index 7dad25cf1..c60be7c86 100644 --- a/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.h +++ b/contrib/draco/src/draco/mesh/mesh_attribute_corner_table.h @@ -40,7 +40,7 @@ class MeshAttributeCornerTable { // whenever the seam edges are updated). // |mesh| and |att| can be null, in which case mapping between vertices and // attribute value ids is set to identity. - void RecomputeVertices(const Mesh *mesh, const PointAttribute *att); + bool RecomputeVertices(const Mesh *mesh, const PointAttribute *att); inline bool IsCornerOppositeToSeamEdge(CornerIndex corner) const { return is_edge_on_seam_[corner.value()]; @@ -130,6 +130,12 @@ class MeshAttributeCornerTable { return false; } + bool IsDegenerated(FaceIndex face) const { + // Introducing seams can't change the degeneracy of the individual faces, + // therefore we can delegate the check to the original |corner_table_|. + return corner_table_->IsDegenerated(face); + } + bool no_interior_seams() const { return no_interior_seams_; } const CornerTable *corner_table() const { return corner_table_; } @@ -166,7 +172,7 @@ class MeshAttributeCornerTable { private: template - void RecomputeVerticesInternal(const Mesh *mesh, const PointAttribute *att); + bool RecomputeVerticesInternal(const Mesh *mesh, const PointAttribute *att); std::vector is_edge_on_seam_; std::vector is_vertex_on_seam_; diff --git a/contrib/draco/src/draco/mesh/mesh_cleanup.cc b/contrib/draco/src/draco/mesh/mesh_cleanup.cc index 75b55f045..a6dc1823e 100644 --- a/contrib/draco/src/draco/mesh/mesh_cleanup.cc +++ b/contrib/draco/src/draco/mesh/mesh_cleanup.cc @@ -14,21 +14,25 @@ // #include "draco/mesh/mesh_cleanup.h" +#include +#include #include +#include +#include #include "draco/core/hash_utils.h" namespace draco { -bool MeshCleanup::operator()(Mesh *mesh, const MeshCleanupOptions &options) { +Status MeshCleanup::Cleanup(Mesh *mesh, const MeshCleanupOptions &options) { if (!options.remove_degenerated_faces && !options.remove_unused_attributes && !options.remove_duplicate_faces && !options.make_geometry_manifold) { - return true; // Nothing to cleanup. + return OkStatus(); // Nothing to cleanup. } const PointAttribute *const pos_att = mesh->GetNamedAttribute(GeometryAttribute::POSITION); if (pos_att == nullptr) { - return false; + return Status(Status::DRACO_ERROR, "Missing position attribute."); } if (options.remove_degenerated_faces) { @@ -43,7 +47,7 @@ bool MeshCleanup::operator()(Mesh *mesh, const MeshCleanupOptions &options) { RemoveUnusedAttributes(mesh); } - return true; + return OkStatus(); } void MeshCleanup::RemoveDegeneratedFaces(Mesh *mesh) { diff --git a/contrib/draco/src/draco/mesh/mesh_cleanup.h b/contrib/draco/src/draco/mesh/mesh_cleanup.h index 09aae2e1c..c6bdfc6c0 100644 --- a/contrib/draco/src/draco/mesh/mesh_cleanup.h +++ b/contrib/draco/src/draco/mesh/mesh_cleanup.h @@ -16,42 +16,38 @@ #define DRACO_MESH_MESH_CLEANUP_H_ #include "draco/core/status.h" +#include "draco/draco_features.h" #include "draco/mesh/mesh.h" namespace draco { // Options used by the MeshCleanup class. struct MeshCleanupOptions { - MeshCleanupOptions() - : remove_degenerated_faces(true), - remove_duplicate_faces(true), - remove_unused_attributes(true), - make_geometry_manifold(false) {} // If true, the cleanup tool removes any face where two or more vertices // share the same position index. - bool remove_degenerated_faces; + bool remove_degenerated_faces = true; // If true, the cleanup tool removes all duplicate faces. A pair of faces is // duplicate if both faces share the same position indices on all vertices // (that is, position values have to be duduplicated). Note that all // non-position properties are currently ignored. - bool remove_duplicate_faces; + bool remove_duplicate_faces = true; // If true, the cleanup tool removes any unused attribute value or unused // point id. For example, it can be used to remove isolated vertices. - bool remove_unused_attributes; + bool remove_unused_attributes = true; // If true, the cleanup tool splits vertices along non-manifold edges and // vertices. This ensures that the connectivity defined by position indices // is manifold. - bool make_geometry_manifold; + bool make_geometry_manifold = false; }; // Tool that can be used for removing bad or unused data from draco::Meshes. class MeshCleanup { public: // Performs in-place cleanup of the input mesh according to the input options. - bool operator()(Mesh *mesh, const MeshCleanupOptions &options); + static Status Cleanup(Mesh *mesh, const MeshCleanupOptions &options); private: static void RemoveDegeneratedFaces(Mesh *mesh); diff --git a/contrib/draco/src/draco/mesh/mesh_cleanup_test.cc b/contrib/draco/src/draco/mesh/mesh_cleanup_test.cc index 89c350e94..76e5206ae 100644 --- a/contrib/draco/src/draco/mesh/mesh_cleanup_test.cc +++ b/contrib/draco/src/draco/mesh/mesh_cleanup_test.cc @@ -15,6 +15,7 @@ #include "draco/mesh/mesh_cleanup.h" #include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" #include "draco/core/vector_d.h" #include "draco/mesh/triangle_soup_mesh_builder.h" @@ -43,9 +44,7 @@ TEST_F(MeshCleanupTest, TestDegneratedFaces) { ASSERT_NE(mesh, nullptr) << "Failed to build the test mesh."; ASSERT_EQ(mesh->num_faces(), 2) << "Wrong number of faces in the input mesh."; MeshCleanupOptions cleanup_options; - MeshCleanup cleanup; - ASSERT_TRUE(cleanup(mesh.get(), cleanup_options)) - << "Failed to cleanup the mesh."; + DRACO_ASSERT_OK(MeshCleanup::Cleanup(mesh.get(), cleanup_options)); ASSERT_EQ(mesh->num_faces(), 1) << "Failed to remove degenerated faces."; } @@ -89,9 +88,7 @@ TEST_F(MeshCleanupTest, TestDegneratedFacesAndIsolatedVertices) { << "Wrong number of point ids in the input mesh."; ASSERT_EQ(mesh->attribute(int_att_id)->size(), 3); const MeshCleanupOptions cleanup_options; - MeshCleanup cleanup; - ASSERT_TRUE(cleanup(mesh.get(), cleanup_options)) - << "Failed to cleanup the mesh."; + DRACO_ASSERT_OK(MeshCleanup::Cleanup(mesh.get(), cleanup_options)); ASSERT_EQ(mesh->num_faces(), 1) << "Failed to remove degenerated faces."; ASSERT_EQ(mesh->num_points(), 3) << "Failed to remove isolated attribute indices."; @@ -133,9 +130,7 @@ TEST_F(MeshCleanupTest, TestAttributes) { ASSERT_EQ(mesh->attribute(1)->size(), 2u) << "Wrong number of generic attribute entries."; const MeshCleanupOptions cleanup_options; - MeshCleanup cleanup; - ASSERT_TRUE(cleanup(mesh.get(), cleanup_options)) - << "Failed to cleanup the mesh."; + DRACO_ASSERT_OK(MeshCleanup::Cleanup(mesh.get(), cleanup_options)); ASSERT_EQ(mesh->num_faces(), 1) << "Failed to remove degenerated faces."; ASSERT_EQ(mesh->num_points(), 3) << "Failed to remove isolated attribute indices."; @@ -184,8 +179,7 @@ TEST_F(MeshCleanupTest, TestDuplicateFaces) { ASSERT_NE(mesh, nullptr); ASSERT_EQ(mesh->num_faces(), 5); const MeshCleanupOptions cleanup_options; - MeshCleanup cleanup; - ASSERT_TRUE(cleanup(mesh.get(), cleanup_options)); + DRACO_ASSERT_OK(MeshCleanup::Cleanup(mesh.get(), cleanup_options)); ASSERT_EQ(mesh->num_faces(), 2); } diff --git a/contrib/draco/src/draco/mesh/mesh_connected_components.h b/contrib/draco/src/draco/mesh/mesh_connected_components.h new file mode 100644 index 000000000..6ee30551e --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_connected_components.h @@ -0,0 +1,161 @@ +// Copyright 2016 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_MESH_MESH_CONNECTED_COMPONENTS_H_ +#define DRACO_MESH_MESH_CONNECTED_COMPONENTS_H_ + +#include + +#include "draco/mesh/corner_table.h" + +namespace draco { + +// Class for detecting connected components on an input mesh defined by a +// corner table. Degenerated faces and their vertices are not assigned to any +// component. +class MeshConnectedComponents { + public: + MeshConnectedComponents() = default; + + // Initializes the class with the component data of the input mesh. No other + // method should be called before this one. + template + void FindConnectedComponents(const CornerTableT *corner_table); + int NumConnectedComponents() const { return components_.size(); } + + struct ConnectedComponent { + std::vector vertices; + std::vector faces; + std::vector boundary_edges; + }; + + const ConnectedComponent &GetConnectedComponent(int index) const { + return components_[index]; + } + + // Returns the id of an component attached to a given vertex. Returns -1 when + // the vertex was not assigned to any component. + int GetConnectedComponentIdAtVertex(int vertex_id) const { + return vertex_to_component_map_[vertex_id]; + } + + // Returns the number of vertices that belong to the input component. + int NumConnectedComponentVertices(int component_id) const { + return components_[component_id].vertices.size(); + } + + // Returns the i-th vertex of the input component. + int GetConnectedComponentVertex(int component_id, int i) const { + return components_[component_id].vertices[i]; + } + + // Returns the id of an component attached to a given face. Returns -1 when + // the face was not assigned to any component. + int GetConnectedComponentIdAtFace(int face_id) const { + return face_to_component_map_[face_id]; + } + + // Returns the number of faces that belong to the input component. + int NumConnectedComponentFaces(int component_id) const { + return components_[component_id].faces.size(); + } + + // Returns the i-th face of the input component. + int GetConnectedComponentFace(int component_id, int i) const { + return components_[component_id].faces[i]; + } + + // Returns the number of boundary edges that belong to the input component. + int NumConnectedComponentBoundaryEdges(int component_id) const { + return components_[component_id].boundary_edges.size(); + } + + // Returns the i-th boundary edge of the input component. + int GetConnectedComponentBoundaryEdge(int component_id, int i) const { + return components_[component_id].boundary_edges[i]; + } + + private: + std::vector vertex_to_component_map_; + std::vector face_to_component_map_; + std::vector boundary_corner_to_component_map_; + std::vector components_; +}; + +template +void MeshConnectedComponents::FindConnectedComponents( + const CornerTableT *corner_table) { + components_.clear(); + vertex_to_component_map_.assign(corner_table->num_vertices(), -1); + face_to_component_map_.assign(corner_table->num_faces(), -1); + boundary_corner_to_component_map_.assign(corner_table->num_corners(), -1); + std::vector is_face_visited(corner_table->num_faces(), false); + std::vector face_stack; + // Go over all faces of the mesh and for each unvisited face, recursively + // traverse its neighborhood and mark all traversed faces as visited. All + // faces visited during one traversal belong to one mesh component. + for (int face_id = 0; face_id < corner_table->num_faces(); ++face_id) { + if (is_face_visited[face_id]) { + continue; + } + if (corner_table->IsDegenerated(FaceIndex(face_id))) { + continue; + } + const int component_id = components_.size(); + components_.push_back(ConnectedComponent()); + face_stack.push_back(face_id); + is_face_visited[face_id] = true; + while (!face_stack.empty()) { + const int act_face_id = face_stack.back(); + if (face_to_component_map_[act_face_id] == -1) { + face_to_component_map_[act_face_id] = component_id; + components_[component_id].faces.push_back(act_face_id); + } + face_stack.pop_back(); + // Gather all neighboring faces. + std::array corners = + corner_table->AllCorners(FaceIndex(act_face_id)); + for (int c = 0; c < 3; ++c) { + // Update vertex to component mapping. + const int vertex_id = corner_table->Vertex(corners[c]).value(); + if (vertex_to_component_map_[vertex_id] == -1) { + vertex_to_component_map_[vertex_id] = component_id; + components_[component_id].vertices.push_back(vertex_id); + } + // Traverse component to neighboring faces (add the faces to the stack). + const CornerIndex opp_corner = corner_table->Opposite(corners[c]); + if (opp_corner == kInvalidCornerIndex) { + if (boundary_corner_to_component_map_[corners[c].value()] == -1) { + boundary_corner_to_component_map_[corners[c].value()] = + component_id; + components_[component_id].boundary_edges.push_back( + corners[c].value()); + } + continue; // Invalid corner (mesh boundary). + } + + const int opp_face_id = corner_table->Face(opp_corner).value(); + if (is_face_visited[opp_face_id]) { + continue; // Opposite face has been already reached. + } + is_face_visited[opp_face_id] = true; + face_stack.push_back(opp_face_id); + } + } + } +} + +} // namespace draco + +#endif // DRACO_MESH_MESH_CONNECTED_COMPONENTS_H_ diff --git a/contrib/draco/src/draco/mesh/mesh_features.cc b/contrib/draco/src/draco/mesh/mesh_features.cc new file mode 100644 index 000000000..f859ae411 --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_features.cc @@ -0,0 +1,98 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/mesh/mesh_features.h" + +#include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +MeshFeatures::MeshFeatures() + : feature_count_(0), + null_feature_id_(-1), + attribute_index_(-1), + property_table_index_(-1) {} + +void MeshFeatures::Copy(const MeshFeatures &src) { + label_ = src.label_; + feature_count_ = src.feature_count_; + null_feature_id_ = src.null_feature_id_; + attribute_index_ = src.attribute_index_; + texture_map_.Copy(src.texture_map_); + texture_channels_ = src.texture_channels_; + property_table_index_ = src.property_table_index_; +} + +void MeshFeatures::SetLabel(const std::string &label) { label_ = label; } + +const std::string &MeshFeatures::GetLabel() const { return label_; } + +void MeshFeatures::SetFeatureCount(int feature_count) { + feature_count_ = feature_count; +} + +int MeshFeatures::GetFeatureCount() const { return feature_count_; } + +void MeshFeatures::SetNullFeatureId(int null_feature_id) { + null_feature_id_ = null_feature_id; +} + +int MeshFeatures::GetNullFeatureId() const { return null_feature_id_; } + +void MeshFeatures::SetAttributeIndex(int attribute_index) { + attribute_index_ = attribute_index; +} + +int MeshFeatures::GetAttributeIndex() const { return attribute_index_; } + +void MeshFeatures::SetTextureMap(const TextureMap &texture_map) { + texture_map_.Copy(texture_map); +} + +void MeshFeatures::SetTextureMap(Texture *texture, int tex_coord_index) { + texture_map_.SetProperties(TextureMap::GENERIC, tex_coord_index); + texture_map_.SetTexture(texture); +} + +const TextureMap &MeshFeatures::GetTextureMap() const { return texture_map_; } + +TextureMap &MeshFeatures::GetTextureMap() { return texture_map_; } + +void MeshFeatures::SetTextureChannels( + const std::vector &texture_channels) { + texture_channels_ = texture_channels; +} + +const std::vector &MeshFeatures::GetTextureChannels() const { + return texture_channels_; +} + +std::vector &MeshFeatures::GetTextureChannels() { + return texture_channels_; +} + +void MeshFeatures::SetPropertyTableIndex(int property_table_index) { + property_table_index_ = property_table_index; +} + +int MeshFeatures::GetPropertyTableIndex() const { + return property_table_index_; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/mesh/mesh_features.h b/contrib/draco/src/draco/mesh/mesh_features.h new file mode 100644 index 000000000..af024013f --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_features.h @@ -0,0 +1,93 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_MESH_MESH_FEATURES_H_ +#define DRACO_MESH_MESH_FEATURES_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/texture/texture_library.h" +#include "draco/texture/texture_map.h" + +namespace draco { + +// Describes a mesh feature ID set according to the EXT_mesh_features glTF +// extension. Feature IDs are either associated with geometry vertices or with +// texture pixels and stored in a geometry attribute or in texture channels, +// respectively. Optionally, the feature ID set may be associated with a +// property table defined in the EXT_structural_metadata glTF extension. +class MeshFeatures { + public: + // Creates an empty feature ID set that is associated neither with vertices, + // nor with texture pixels, nor with property tables. + MeshFeatures(); + + // Copies all data from |src| mesh feature ID set. + void Copy(const MeshFeatures &src); + + // Label assigned to this feature ID set. + void SetLabel(const std::string &label); + const std::string &GetLabel() const; + + // The number of unique features in this feature ID set. + void SetFeatureCount(int feature_count); + int GetFeatureCount() const; + + // Non-negative null feature ID value indicating the absence of an associated + // feature. The value of -1 indicates that the null feature ID is not set. + void SetNullFeatureId(int null_feature_id); + int GetNullFeatureId() const; + + // Index of the feature ID vertex attribute, e.g., 5 for an attribute named + // _FEATURE_ID_5, or -1 if the feature ID is not associated with vertices. + void SetAttributeIndex(int attribute_index); + int GetAttributeIndex() const; + + // Feature ID texture map and texture channels containing feature IDs + // associated with texture pixels. Only used when |attribute_index_| is -1. + // The RGBA channels are numbered from 0 to 3. See the glTF extension + // documentation for reconstruction of feature ID from the channel values. + void SetTextureMap(const TextureMap &texture_map); + void SetTextureMap(Texture *texture, int tex_coord_index); + const TextureMap &GetTextureMap() const; + TextureMap &GetTextureMap(); + void SetTextureChannels(const std::vector &texture_channels); + const std::vector &GetTextureChannels() const; + std::vector &GetTextureChannels(); + + // Non-negative index of the property table this feature ID set is associated + // with. Property tables are defined in the EXT_structural_metadata glTF + // extension. The value of -1 indicates that this feature ID set is not + // associated with any property tables. + void SetPropertyTableIndex(int property_table_index); + int GetPropertyTableIndex() const; + + private: + std::string label_; + int feature_count_; + int null_feature_id_; + int attribute_index_; + TextureMap texture_map_; + std::vector texture_channels_; + int property_table_index_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_MESH_MESH_FEATURES_H_ diff --git a/contrib/draco/src/draco/mesh/mesh_features_test.cc b/contrib/draco/src/draco/mesh/mesh_features_test.cc new file mode 100644 index 000000000..0e67af2b1 --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_features_test.cc @@ -0,0 +1,98 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/mesh/mesh_features.h" + +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/texture/texture_map.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +TEST(MeshFeaturesTest, TestDefaults) { + // Test construction of an empty feature ID set. + draco::MeshFeatures mesh_features; + ASSERT_TRUE(mesh_features.GetLabel().empty()); + ASSERT_EQ(mesh_features.GetFeatureCount(), 0); + ASSERT_EQ(mesh_features.GetNullFeatureId(), -1); + ASSERT_EQ(mesh_features.GetAttributeIndex(), -1); + ASSERT_EQ(mesh_features.GetPropertyTableIndex(), -1); + ASSERT_TRUE(mesh_features.GetTextureChannels().empty()); + ASSERT_EQ(mesh_features.GetTextureMap().texture(), nullptr); + ASSERT_EQ(mesh_features.GetTextureMap().type(), draco::TextureMap::GENERIC); +} + +TEST(MeshFeaturesTest, TestSettersAndGetters) { + // Test setter and getter methods of the feature ID set. + draco::MeshFeatures mesh_features; + mesh_features.SetLabel("continent"); + mesh_features.SetFeatureCount(8); + mesh_features.SetNullFeatureId(0); + mesh_features.SetAttributeIndex(2); + mesh_features.SetPropertyTableIndex(10); + std::vector channels = {2, 3}; + mesh_features.SetTextureChannels({2, 3}); + draco::TextureMap texture_map; + texture_map.SetProperties(draco::TextureMap::GENERIC, 1); + std::unique_ptr texture(new draco::Texture()); + texture_map.SetTexture(texture.get()); + mesh_features.SetTextureMap(texture_map); + + // Check that mesh feature set properties can be accessed via getters. + ASSERT_EQ(mesh_features.GetLabel(), "continent"); + ASSERT_EQ(mesh_features.GetFeatureCount(), 8); + ASSERT_EQ(mesh_features.GetNullFeatureId(), 0); + ASSERT_EQ(mesh_features.GetAttributeIndex(), 2); + ASSERT_EQ(mesh_features.GetPropertyTableIndex(), 10); + ASSERT_EQ(mesh_features.GetTextureChannels(), channels); + ASSERT_EQ(mesh_features.GetTextureMap().texture(), texture.get()); + ASSERT_EQ(mesh_features.GetTextureMap().type(), draco::TextureMap::GENERIC); +} + +TEST(MeshFeaturesTest, TestCopy) { + // Test that feature ID set can be copied. + draco::MeshFeatures mesh_features; + mesh_features.SetLabel("continent"); + mesh_features.SetFeatureCount(8); + mesh_features.SetNullFeatureId(0); + mesh_features.SetAttributeIndex(2); + mesh_features.SetPropertyTableIndex(10); + std::vector channels = {2, 3}; + mesh_features.SetTextureChannels({2, 3}); + std::unique_ptr texture(new draco::Texture()); + mesh_features.SetTextureMap(texture.get(), 1); + + // Make a copy. + draco::MeshFeatures copy; + copy.Copy(mesh_features); + + // Check the copy. + ASSERT_EQ(copy.GetLabel(), "continent"); + ASSERT_EQ(copy.GetFeatureCount(), 8); + ASSERT_EQ(copy.GetNullFeatureId(), 0); + ASSERT_EQ(copy.GetAttributeIndex(), 2); + ASSERT_EQ(copy.GetPropertyTableIndex(), 10); + ASSERT_EQ(copy.GetTextureChannels(), channels); + ASSERT_EQ(copy.GetTextureMap().texture(), texture.get()); + ASSERT_EQ(copy.GetTextureMap().type(), draco::TextureMap::GENERIC); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/mesh/mesh_indices.h b/contrib/draco/src/draco/mesh/mesh_indices.h new file mode 100644 index 000000000..5df28d550 --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_indices.h @@ -0,0 +1,37 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifdef DRACO_TRANSCODER_SUPPORTED +#ifndef DRACO_MESH_MESH_INDICES_H_ +#define DRACO_MESH_MESH_INDICES_H_ + +#include + +#include + +#include "draco/core/draco_index_type.h" + +namespace draco { + +// Index of a mesh feature ID set. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, MeshFeaturesIndex) + +// Constants denoting invalid indices. +static constexpr MeshFeaturesIndex kInvalidMeshFeaturesIndex( + std::numeric_limits::max()); + +} // namespace draco + +#endif // DRACO_MESH_MESH_INDICES_H_ +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/mesh/mesh_misc_functions.h b/contrib/draco/src/draco/mesh/mesh_misc_functions.h index b450bc80c..0a3bcf497 100644 --- a/contrib/draco/src/draco/mesh/mesh_misc_functions.h +++ b/contrib/draco/src/draco/mesh/mesh_misc_functions.h @@ -67,7 +67,6 @@ inline bool IsCornerOppositeToAttributeSeam(CornerIndex ci, // Interpolates an attribute value on a face using given barycentric // coordinates. InterpolatedVectorT should be a VectorD that corresponds to the // values stored in the attribute. -// TODO(ostava): Find a better place for this. template InterpolatedVectorT ComputeInterpolatedAttributeValueOnMeshFace( const Mesh &mesh, const PointAttribute &attribute, FaceIndex fi, diff --git a/contrib/draco/src/draco/mesh/mesh_splitter.cc b/contrib/draco/src/draco/mesh/mesh_splitter.cc new file mode 100644 index 000000000..ac3c4661c --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_splitter.cc @@ -0,0 +1,451 @@ +// Copyright 2017 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/mesh/mesh_splitter.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include + +#include "draco/mesh/mesh_utils.h" +#include "draco/mesh/triangle_soup_mesh_builder.h" +#include "draco/point_cloud/point_cloud_builder.h" + +namespace draco { + +// Helper class that handles splitting of meshes with faces / without faces, +// i.e. point clouds. +template +class MeshSplitterInternal { + public: + struct WorkData : public MeshSplitter::WorkData { + // TriangleSoupMeshBuilder or PointCloudBuilder. + std::vector builders; + }; + + // Computes number of elements (faces or points) for each sub-mesh. + Status InitializeWorkDataNumElements(const Mesh &mesh, int split_attribute_id, + WorkData *work_data) const; + // Initializes a builder for a given sub-mesh. + void InitializeBuilder(int b_index, int num_elements, const Mesh &mesh, + int ignored_attribute_id, WorkData *work_data) const; + // Add all faces or points to the builders. + void AddElementsToBuilder(const Mesh &mesh, + const PointAttribute *split_attribute, + WorkData *work_data) const; + // Builds the meshes from the data accumulated in the builders. + StatusOr BuildMeshes(const Mesh &mesh, + WorkData *work_data) const; +}; + +namespace { + +// Helper functions for copying single element from source |mesh| to a target +// builder |b_index| stored in |work_data|. +void AddElementToBuilder( + int b_index, FaceIndex source_i, FaceIndex target_i, const Mesh &mesh, + MeshSplitterInternal::WorkData *work_data); +void AddElementToBuilder( + int b_index, PointIndex source_i, PointIndex target_i, const Mesh &mesh, + MeshSplitterInternal::WorkData *work_data); +} // namespace + +MeshSplitter::MeshSplitter() + : preserve_materials_(false), + remove_unused_material_indices_(true), + preserve_mesh_features_(false) {} + +StatusOr MeshSplitter::SplitMesh( + const Mesh &mesh, uint32_t split_attribute_id) { + if (mesh.num_attributes() <= split_attribute_id) { + return Status(Status::DRACO_ERROR, "Invalid attribute id."); + } + if (mesh.num_faces() == 0) { + return SplitMeshInternal(mesh, split_attribute_id); + } else { + return SplitMeshInternal(mesh, split_attribute_id); + } +} + +template +StatusOr MeshSplitter::SplitMeshInternal( + const Mesh &mesh, int split_attribute_id) { + const PointAttribute *const split_attribute = + mesh.attribute(split_attribute_id); + + // Preserve the split attribute only if it is the material attribute and the + // |preserve_materials_| flag is set. Othwerwise the split attribute will get + // discarded. + // TODO(ostava): We may revisit this later and add an option to always + // preserve the split attribute. + const bool preserve_split_attribute = + preserve_materials_ && + split_attribute->attribute_type() == GeometryAttribute::MATERIAL; + + const int num_out_meshes = split_attribute->size(); + MeshSplitterInternal splitter_internal; + typename MeshSplitterInternal::WorkData work_data; + work_data.num_sub_mesh_elements.resize(num_out_meshes, 0); + work_data.split_by_materials = + (split_attribute->attribute_type() == GeometryAttribute::MATERIAL); + + DRACO_RETURN_IF_ERROR(splitter_internal.InitializeWorkDataNumElements( + mesh, split_attribute_id, &work_data)); + + // Create the sub-meshes. + work_data.builders.resize(num_out_meshes); + // Map between attribute ids of the input and output meshes. + work_data.att_id_map.resize(mesh.num_attributes(), -1); + const int ignored_att_id = + (!preserve_split_attribute ? split_attribute_id : -1); + for (int mi = 0; mi < num_out_meshes; ++mi) { + if (work_data.num_sub_mesh_elements[mi] == 0) { + continue; // Empty mesh, don't initialize it. + } + + const int num_elements = work_data.num_sub_mesh_elements[mi]; + splitter_internal.InitializeBuilder(mi, num_elements, mesh, ignored_att_id, + &work_data); + + // Reset the element counter for the sub-mesh. It will be used to keep track + // of number of elements added to the sub-mesh. + work_data.num_sub_mesh_elements[mi] = 0; + } + + splitter_internal.AddElementsToBuilder(mesh, split_attribute, &work_data); + + DRACO_ASSIGN_OR_RETURN(MeshVector out_meshes, + splitter_internal.BuildMeshes(mesh, &work_data)); + return FinalizeMeshes(mesh, work_data, std::move(out_meshes)); +} + +template <> +Status +MeshSplitterInternal::InitializeWorkDataNumElements( + const Mesh &mesh, int split_attribute_id, WorkData *work_data) const { + const PointAttribute *const split_attribute = + mesh.attribute(split_attribute_id); + // Verify that the attribute values are defined "per-face", i.e., all points + // on a face are always mapped to the same attribute value. + for (FaceIndex fi(0); fi < mesh.num_faces(); ++fi) { + const auto face = mesh.face(fi); + const AttributeValueIndex avi = split_attribute->mapped_index(face[0]); + for (int c = 1; c < 3; ++c) { + if (split_attribute->mapped_index(face[c]) != avi) { + return Status(Status::DRACO_ERROR, + "Attribute values not consistent on a face."); + } + } + work_data->num_sub_mesh_elements[avi.value()] += 1; + } + return OkStatus(); +} + +template <> +Status MeshSplitterInternal::InitializeWorkDataNumElements( + const Mesh &mesh, int split_attribute_id, WorkData *work_data) const { + const PointAttribute *const split_attribute = + mesh.attribute(split_attribute_id); + // Each point can have a different value. Just accumulate the number of points + // with the same attribute value index. + for (PointIndex pi(0); pi < mesh.num_points(); ++pi) { + const AttributeValueIndex avi = split_attribute->mapped_index(pi); + work_data->num_sub_mesh_elements[avi.value()] += 1; + } + return OkStatus(); +} + +template +void MeshSplitterInternal::InitializeBuilder( + int b_index, int num_elements, const Mesh &mesh, int ignored_attribute_id, + WorkData *work_data) const { + work_data->builders[b_index].Start(num_elements); + + // Add all attributes. + for (int ai = 0; ai < mesh.num_attributes(); ++ai) { + if (ai == ignored_attribute_id) { + continue; + } + const GeometryAttribute *const src_att = mesh.attribute(ai); + work_data->att_id_map[ai] = work_data->builders[b_index].AddAttribute( + src_att->attribute_type(), src_att->num_components(), + src_att->data_type()); + } +} + +template <> +void MeshSplitterInternal::AddElementsToBuilder( + const Mesh &mesh, const PointAttribute *split_attribute, + WorkData *work_data) const { + // Go over all faces of the input mesh and add them to the appropriate + // sub-mesh. + for (FaceIndex fi(0); fi < mesh.num_faces(); ++fi) { + const auto face = mesh.face(fi); + const int sub_mesh_id = split_attribute->mapped_index(face[0]).value(); + const FaceIndex target_fi(work_data->num_sub_mesh_elements[sub_mesh_id]++); + AddElementToBuilder(sub_mesh_id, fi, target_fi, mesh, work_data); + } +} + +template <> +void MeshSplitterInternal::AddElementsToBuilder( + const Mesh &mesh, const PointAttribute *split_attribute, + WorkData *work_data) const { + // Go over all points of the input mesh and add them to the appropriate + // sub-mesh. + for (PointIndex pi(0); pi < mesh.num_points(); ++pi) { + const int sub_mesh_id = split_attribute->mapped_index(pi).value(); + const PointIndex target_pi(work_data->num_sub_mesh_elements[sub_mesh_id]++); + AddElementToBuilder(sub_mesh_id, pi, target_pi, mesh, work_data); + } +} + +namespace { + +void AddElementToBuilder( + int b_index, FaceIndex source_i, FaceIndex target_i, const Mesh &mesh, + MeshSplitterInternal::WorkData *work_data) { + const auto &face = mesh.face(source_i); + for (int ai = 0; ai < mesh.num_attributes(); ++ai) { + const PointAttribute *const src_att = mesh.attribute(ai); + const int target_att_id = work_data->att_id_map[ai]; + if (target_att_id == -1) { + continue; + } + // Add value for each corner of the face. + work_data->builders[b_index].SetAttributeValuesForFace( + target_att_id, target_i, src_att->GetAddressOfMappedIndex(face[0]), + src_att->GetAddressOfMappedIndex(face[1]), + src_att->GetAddressOfMappedIndex(face[2])); + } +} + +void AddElementToBuilder( + int b_index, PointIndex source_i, PointIndex target_i, const Mesh &mesh, + MeshSplitterInternal::WorkData *work_data) { + for (int ai = 0; ai < mesh.num_attributes(); ++ai) { + const PointAttribute *const src_att = mesh.attribute(ai); + const int target_att_id = work_data->att_id_map[ai]; + if (target_att_id == -1) { + continue; + } + // Add value for the point |target_i|. + work_data->builders[b_index].SetAttributeValueForPoint( + target_att_id, target_i, src_att->GetAddressOfMappedIndex(source_i)); + } +} + +} // namespace + +template <> +StatusOr +MeshSplitterInternal::BuildMeshes( + const Mesh &mesh, WorkData *work_data) const { + const int num_out_meshes = work_data->builders.size(); + MeshSplitter::MeshVector out_meshes(num_out_meshes); + for (int mi = 0; mi < num_out_meshes; ++mi) { + if (work_data->num_sub_mesh_elements[mi] == 0) { + continue; + } + out_meshes[mi] = work_data->builders[mi].Finalize(); + if (out_meshes[mi] == nullptr) { + continue; + } + } + return out_meshes; +} + +template <> +StatusOr +MeshSplitterInternal::BuildMeshes( + const Mesh &mesh, WorkData *work_data) const { + const int num_out_meshes = work_data->builders.size(); + MeshSplitter::MeshVector out_meshes(num_out_meshes); + for (int mi = 0; mi < num_out_meshes; ++mi) { + if (work_data->num_sub_mesh_elements[mi] == 0) { + continue; + } + // For point clouds, we first build a point cloud and copy it over into + // a draco::Mesh. + std::unique_ptr pc = work_data->builders[mi].Finalize(true); + if (pc == nullptr) { + continue; + } + std::unique_ptr mesh(new Mesh()); + PointCloud *mesh_pc = mesh.get(); + mesh_pc->Copy(*pc); + out_meshes[mi] = std::move(mesh); + } + return out_meshes; +} + +StatusOr MeshSplitter::FinalizeMeshes( + const Mesh &mesh, const WorkData &work_data, MeshVector out_meshes) const { + // Finalize meshes. + const int num_out_meshes = out_meshes.size(); + + // If we are going to preserve mesh features, we will need to update texture + // pointers for all mesh feature textures. Here we store the mapping between + // the old texture pointers and their indices. + std::unordered_map features_texture_to_index_map; + if (preserve_mesh_features_) { + features_texture_to_index_map = + mesh.GetNonMaterialTextureLibrary().ComputeTextureToIndexMap(); + } + + for (int mi = 0; mi < num_out_meshes; ++mi) { + if (out_meshes[mi] == nullptr) { + continue; + } + out_meshes[mi]->SetName(mesh.GetName()); + if (preserve_materials_) { + out_meshes[mi]->GetMaterialLibrary().Copy(mesh.GetMaterialLibrary()); + } + + // Copy metadata of the original mesh to the output meshes. + if (mesh.GetMetadata() != nullptr) { + const GeometryMetadata &metadata = *mesh.GetMetadata(); + out_meshes[mi]->AddMetadata( + std::unique_ptr(new GeometryMetadata(metadata))); + } + + // Copy over attribute unique ids. + for (int att_id = 0; att_id < mesh.num_attributes(); ++att_id) { + const int mapped_att_id = work_data.att_id_map[att_id]; + if (mapped_att_id == -1) { + continue; + } + const PointAttribute *const src_att = mesh.attribute(att_id); + PointAttribute *const dst_att = out_meshes[mi]->attribute(mapped_att_id); + dst_att->set_unique_id(src_att->unique_id()); + } + + // Copy compression settings of the original mesh to the output meshes. + out_meshes[mi]->SetCompressionEnabled(mesh.IsCompressionEnabled()); + out_meshes[mi]->SetCompressionOptions(mesh.GetCompressionOptions()); + + if (preserve_mesh_features_) { + // Copy mesh features from the source |mesh| to the |out_meshes[mi]|. + for (MeshFeaturesIndex mfi(0); mfi < mesh.NumMeshFeatures(); ++mfi) { + if (work_data.split_by_materials) { + // Copy over only those mesh features that were masked to the material + // corresponding to |mi|. + bool is_used = false; + if (mesh.NumMeshFeaturesMaterialMasks(mfi) == 0) { + is_used = true; + } else { + for (int mask_index = 0; + mask_index < mesh.NumMeshFeaturesMaterialMasks(mfi); + ++mask_index) { + if (mesh.GetMeshFeaturesMaterialMask(mfi, mask_index) == mi) { + is_used = true; + break; + } + } + } + if (!is_used) { + // Ignore this mesh features. + continue; + } + } + // Create a copy of source mesh features. + std::unique_ptr mf(new MeshFeatures()); + mf->Copy(mesh.GetMeshFeatures(mfi)); + const MeshFeaturesIndex new_mfi = + out_meshes[mi]->AddMeshFeatures(std::move(mf)); + if (work_data.split_by_materials && !preserve_materials_) { + // If the input |mesh| was split by materials and we didn't preserve + // the materials, all mesh features must be masked to material 0. + out_meshes[mi]->AddMeshFeaturesMaterialMask(new_mfi, 0); + } else { + // Otherwise mesh features use same masking as the source mesh because + // the material attribute is still present in the split meshes. + // Note that this masking can be later changed in + // RemoveUnusedMaterials() call below. + for (int mask_index = 0; + mask_index < mesh.NumMeshFeaturesMaterialMasks(mfi); + ++mask_index) { + out_meshes[mi]->AddMeshFeaturesMaterialMask( + new_mfi, mesh.GetMeshFeaturesMaterialMask(mfi, mask_index)); + } + } + } + + // Copy over all features textures to the split mesh. + out_meshes[mi]->GetNonMaterialTextureLibrary().Copy( + mesh.GetNonMaterialTextureLibrary()); + + // Update mesh features texture pointers to the new library. + for (MeshFeaturesIndex mfi(0); mfi < out_meshes[mi]->NumMeshFeatures(); + ++mfi) { + Mesh::UpdateMeshFeaturesTexturePointer( + features_texture_to_index_map, + &out_meshes[mi]->GetNonMaterialTextureLibrary(), + &out_meshes[mi]->GetMeshFeatures(mfi)); + } + + // This will remove any mesh features that may not be be actually used + // by this |out_meshes[mi]| (e.g. because corresponding material indices + // were not present in this split mesh). This also removes any unused + // features textures from the non-material texture library. + DRACO_RETURN_IF_ERROR( + MeshUtils::RemoveUnusedMeshFeatures(out_meshes[mi].get())); + } + + // Remove unused materials after we remove mesh features because some of + // the mesh features may have referenced old material indices. + if (preserve_materials_) { + out_meshes[mi]->RemoveUnusedMaterials(remove_unused_material_indices_); + } + + // Copy structural metadata from input mesh to each of the output meshes. + out_meshes[mi]->GetStructuralMetadata().Copy(mesh.GetStructuralMetadata()); + } + return std::move(out_meshes); +} + +StatusOr MeshSplitter::SplitMeshToComponents( + const Mesh &mesh, const MeshConnectedComponents &connected_components) { + // Create the sub-meshes. + const int num_out_meshes = connected_components.NumConnectedComponents(); + MeshSplitterInternal splitter_internal; + typename MeshSplitterInternal::WorkData work_data; + work_data.builders.resize(num_out_meshes); + work_data.num_sub_mesh_elements.resize(num_out_meshes, 0); + work_data.att_id_map.resize(mesh.num_attributes(), -1); + for (int mi = 0; mi < num_out_meshes; ++mi) { + const int num_faces = connected_components.NumConnectedComponentFaces(mi); + work_data.num_sub_mesh_elements[mi] = num_faces; + splitter_internal.InitializeBuilder(mi, num_faces, mesh, -1, &work_data); + } + + // Go over all faces of the input mesh and add them to the appropriate + // sub-mesh. + for (int mi = 0; mi < num_out_meshes; ++mi) { + for (int cfi = 0; cfi < connected_components.NumConnectedComponentFaces(mi); + ++cfi) { + const FaceIndex fi( + connected_components.GetConnectedComponent(mi).faces[cfi]); + const FaceIndex target_fi(cfi); + AddElementToBuilder(mi, fi, target_fi, mesh, &work_data); + } + } + DRACO_ASSIGN_OR_RETURN(auto out_meshes, + splitter_internal.BuildMeshes(mesh, &work_data)); + return FinalizeMeshes(mesh, work_data, std::move(out_meshes)); +} + +} // namespace draco +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/mesh/mesh_splitter.h b/contrib/draco/src/draco/mesh/mesh_splitter.h new file mode 100644 index 000000000..bf5cd9794 --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_splitter.h @@ -0,0 +1,109 @@ +// Copyright 2017 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_MESH_MESH_SPLITTER_H_ +#define DRACO_MESH_MESH_SPLITTER_H_ + +#include +#include + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/status_or.h" +#include "draco/mesh/mesh.h" +#include "draco/mesh/mesh_connected_components.h" +#include "draco/mesh/triangle_soup_mesh_builder.h" + +namespace draco { + +// Class that can be used to split a single mesh into multiple sub-meshes +// according to specified criteria. +class MeshSplitter { + public: + typedef std::vector> MeshVector; + MeshSplitter(); + + // Sets a flag that tells the splitter to preserve all materials on the input + // mesh during mesh splitting. When set, the materials used on sub-meshes are + // going to be copied over. Any redundant materials on sub-meshes are going to + // be deleted but material indices may still be preserved depending on the + // SetRemoveUnusedMaterialIndices() flag. + // Default = false. + void SetPreserveMaterials(bool flag) { preserve_materials_ = flag; } + + // Sets a flag that tells the splitter to delete any unused material indices + // on the generated sub-meshes. This option is currently used only when + // SetPreserveMaterials() was set to true. If this option is set to false, the + // material indices of the MATERIAL attribute will be the same as in the + // source mesh. If the flag is true, then the unused material indices will be + // removed and they may no longer correspond to the source mesh. Note that + // when this flag is false, any unused materials would be replaced with empty + // (default) materials. + // Default = true. + void SetRemoveUnusedMaterialIndices(bool flag) { + remove_unused_material_indices_ = flag; + } + + // Sets a flag that tells the splitter to preserve all mesh features on the + // input mesh during mesh splitting. When set, the mesh features used on + // sub-meshes are going to be copied over. Any redundant mesh features on + // sub-meshes are going to be deleted. + // Default = false. + void SetPreserveMeshFeatures(bool flag) { preserve_mesh_features_ = flag; } + + // Splits the input |mesh| according to attribute values stored in the + // specified attribute. If the |mesh| contains faces, the attribute values + // need to be defined per-face, that is, all points attached to a single face + // must share the same attribute value. Meshes without faces are treated as + // point clouds and the attribute values can be defined per-point. Each + // attribute value (AttributeValueIndex) is mapped to a single output mesh. If + // an AttributeValueIndex is unused, no mesh is created for the given value. + StatusOr SplitMesh(const Mesh &mesh, uint32_t split_attribute_id); + + // Splits the input |mesh| into separate components defined in + // |connected_components|. That is, all faces associated with a given + // component index will be stored in the same mesh. The number of generated + // meshes will correspond to |connected_components.NumConnectedComponents()|. + StatusOr SplitMeshToComponents( + const Mesh &mesh, const MeshConnectedComponents &connected_components); + + private: + struct WorkData { + // Map between attribute ids of the input and output meshes. + std::vector att_id_map; + std::vector num_sub_mesh_elements; + bool split_by_materials = false; + }; + + template + StatusOr SplitMeshInternal(const Mesh &mesh, + int split_attribute_id); + + StatusOr FinalizeMeshes(const Mesh &mesh, + const WorkData &work_data, + MeshVector out_meshes) const; + + bool preserve_materials_; + bool remove_unused_material_indices_; + bool preserve_mesh_features_; + + template + friend class MeshSplitterInternal; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_MESH_MESH_SPLITTER_H_ diff --git a/contrib/draco/src/draco/javascript/emscripten/draco_animation_encoder_glue_wrapper.cc b/contrib/draco/src/draco/mesh/mesh_splitter_test.cc similarity index 51% rename from contrib/draco/src/draco/javascript/emscripten/draco_animation_encoder_glue_wrapper.cc rename to contrib/draco/src/draco/mesh/mesh_splitter_test.cc index 29e7ed3ba..7432c4736 100644 --- a/contrib/draco/src/draco/javascript/emscripten/draco_animation_encoder_glue_wrapper.cc +++ b/contrib/draco/src/draco/mesh/mesh_splitter_test.cc @@ -12,14 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// This file is used by emscripten's WebIDL Binder. -// http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/WebIDL-Binder.html -#include "draco/attributes/geometry_attribute.h" -#include "draco/attributes/point_attribute.h" -#include "draco/compression/encode.h" -#include "draco/javascript/emscripten/animation_encoder_webidl_wrapper.h" -#include "draco/mesh/mesh.h" -#include "draco/point_cloud/point_cloud.h" +#include "draco/mesh/mesh_splitter.h" -// glue_animation_encoder.cpp is generated by Makefile.emcc build_glue target. -#include "glue_animation_encoder.cpp" +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/core/vector_d.h" +#include "draco/io/mesh_io.h" +#include "draco/mesh/mesh_misc_functions.h" + +namespace {} // namespace +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/mesh/mesh_stripifier.h b/contrib/draco/src/draco/mesh/mesh_stripifier.h index 262e3c792..8e8d8d9f2 100644 --- a/contrib/draco/src/draco/mesh/mesh_stripifier.h +++ b/contrib/draco/src/draco/mesh/mesh_stripifier.h @@ -71,8 +71,6 @@ class MeshStripifier { mesh_ = &mesh; num_strips_ = 0; num_encoded_faces_ = 0; - // TODO(ostava): We may be able to avoid computing the corner table if we - // already have it stored somewhere. corner_table_ = CreateCornerTableFromPositionAttribute(mesh_); if (corner_table_ == nullptr) { return false; diff --git a/contrib/draco/src/draco/mesh/mesh_test.cc b/contrib/draco/src/draco/mesh/mesh_test.cc new file mode 100644 index 000000000..7cc046a7e --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_test.cc @@ -0,0 +1,644 @@ +// Copyright 2018 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/mesh/mesh.h" + +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/compression/draco_compression_options.h" +#include "draco/material/material_utils.h" +#include "draco/mesh/mesh_are_equivalent.h" +#include "draco/mesh/mesh_features.h" +#include "draco/mesh/mesh_utils.h" +#include "draco/mesh/triangle_soup_mesh_builder.h" +#endif // DRACO_TRANSCODER_SUPPORTED + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED +// Tests naming of a mesh. +TEST(MeshTest, MeshName) { + draco::Mesh mesh; + ASSERT_TRUE(mesh.GetName().empty()); + mesh.SetName("Bob"); + ASSERT_EQ(mesh.GetName(), "Bob"); +} + +// Tests copying of a mesh. +TEST(MeshTest, MeshCopy) { + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + draco::Mesh mesh_copy; + mesh_copy.Copy(*mesh); + draco::MeshAreEquivalent eq; + ASSERT_TRUE(eq(*mesh, mesh_copy)); +} + +// Tests that we can copy a mesh to a different mesh that already contains some +// data. +TEST(MeshTest, MeshCopyToExistingMesh) { + const std::unique_ptr mesh_0 = + draco::ReadMeshFromTestFile("cube_att.obj"); + const std::unique_ptr mesh_1 = + draco::ReadMeshFromTestFile("test_nm.obj"); + ASSERT_NE(mesh_0, nullptr); + ASSERT_NE(mesh_1, nullptr); + draco::MeshAreEquivalent eq; + ASSERT_FALSE(eq(*mesh_0, *mesh_1)); + + mesh_1->Copy(*mesh_0); + ASSERT_TRUE(eq(*mesh_0, *mesh_1)); +} + +// Tests that we can remove unused materials from a mesh. +TEST(MeshTest, RemoveUnusedMaterials) { + // Input mesh has 29 materials defined in the source file but only 7 are + // actually used. + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("mat_test.obj"); + ASSERT_NE(mesh, nullptr); + + const draco::PointAttribute *const mat_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::MATERIAL); + ASSERT_NE(mat_att, nullptr); + ASSERT_EQ(mat_att->size(), 29); + + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), mat_att->size()); + + // Get materials on all faces. + std::vector face_materials(mesh->num_faces(), + nullptr); + for (draco::FaceIndex fi(0); fi < mesh->num_faces(); ++fi) { + uint32_t mat_index = 0; + mat_att->GetMappedValue(mesh->face(fi)[0], &mat_index); + face_materials[fi.value()] = + mesh->GetMaterialLibrary().GetMaterial(mat_index); + } + + mesh->RemoveUnusedMaterials(); + + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 7); + + // Ensure the material attribute contains material indices in the valid range. + for (draco::AttributeValueIndex avi(0); avi < mat_att->size(); ++avi) { + uint32_t mat_index = 0; + mat_att->GetValue(avi, &mat_index); + ASSERT_LT(mat_index, mesh->GetMaterialLibrary().NumMaterials()); + } + + // Ensure all materials are still the same for all faces. + for (draco::FaceIndex fi(0); fi < mesh->num_faces(); ++fi) { + uint32_t mat_index = 0; + mat_att->GetMappedValue(mesh->face(fi)[0], &mat_index); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(mat_index), + face_materials[fi.value()]); + } +} + +TEST(MeshTest, RemoveUnusedMaterialsOnPointClud) { + // Input mesh has 29 materials defined in the source file but only 7 are + // actually used. Same as above test but we remove all faces and treat the + // model as a point cloud. + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("mat_test.obj"); + ASSERT_NE(mesh, nullptr); + + // Make it a point cloud. + mesh->SetNumFaces(0); + + const draco::PointAttribute *const mat_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::MATERIAL); + ASSERT_NE(mat_att, nullptr); + ASSERT_EQ(mat_att->size(), 29); + + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), mat_att->size()); + + // Get materials on all points. + std::vector point_materials(mesh->num_points(), + nullptr); + for (draco::PointIndex pi(0); pi < mesh->num_points(); ++pi) { + uint32_t mat_index = 0; + mat_att->GetMappedValue(pi, &mat_index); + point_materials[pi.value()] = + mesh->GetMaterialLibrary().GetMaterial(mat_index); + } + + mesh->RemoveUnusedMaterials(); + + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 7); + + // Ensure the material attribute contains material indices in the valid range. + for (draco::AttributeValueIndex avi(0); avi < mat_att->size(); ++avi) { + uint32_t mat_index = 0; + mat_att->GetValue(avi, &mat_index); + ASSERT_LT(mat_index, mesh->GetMaterialLibrary().NumMaterials()); + } + + // Ensure all materials are still the same for all points. + for (draco::PointIndex pi(0); pi < mesh->num_points(); ++pi) { + uint32_t mat_index = 0; + mat_att->GetMappedValue(pi, &mat_index); + ASSERT_EQ(mesh->GetMaterialLibrary().GetMaterial(mat_index), + point_materials[pi.value()]); + } +} + +TEST(MeshTest, RemoveUnusedMaterialsNoIndices) { + // The same as above but we actually want to remove only materials and not + // material indices. Therefore we should end up with the same number of + // materials as source but all unused materials should be "default". + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("mat_test.obj"); + ASSERT_NE(mesh, nullptr); + + const draco::PointAttribute *const mat_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::MATERIAL); + ASSERT_NE(mat_att, nullptr); + ASSERT_EQ(mat_att->size(), 29); + + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), mat_att->size()); + + // Do not remove unused material indices. + mesh->RemoveUnusedMaterials(false); + + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 29); + + // Gether which materials were actually used and check that all remaining + // materials are "default". + std::vector is_mat_used(mesh->GetMaterialLibrary().NumMaterials(), + false); + for (draco::AttributeValueIndex avi(0); avi < mat_att->size(); ++avi) { + uint32_t mat_index = 0; + mat_att->GetValue(avi, &mat_index); + is_mat_used[mat_index] = true; + } + + for (int mi = 0; mi < mesh->GetMaterialLibrary().NumMaterials(); ++mi) { + if (!is_mat_used[mi]) { + ASSERT_TRUE(draco::MaterialUtils::AreMaterialsEquivalent( + *mesh->GetMaterialLibrary().GetMaterial(mi), draco::Material())); + } + } +} + +TEST(MeshTest, TestAddNewAttributeWithConnectivity) { + // Tests that we can add new attributes with arbitrary connectivity to an + // existing mesh. + + // Create a simple quad. See corner indices of the quad on the figure below: + // + // *-------* + // |2\3 5| + // | \ | + // | \ | + // | \ | + // | \4| + // |0 1\| + // *-------* + // + draco::TriangleSoupMeshBuilder mb; + mb.Start(2); + mb.AddAttribute(draco::GeometryAttribute::POSITION, 3, draco::DT_FLOAT32); + mb.SetAttributeValuesForFace( + 0, draco::FaceIndex(0), draco::Vector3f(0, 0, 0).data(), + draco::Vector3f(1, 0, 0).data(), draco::Vector3f(1, 1, 0).data()); + mb.SetAttributeValuesForFace( + 0, draco::FaceIndex(1), draco::Vector3f(1, 1, 0).data(), + draco::Vector3f(1, 0, 0).data(), draco::Vector3f(1, 1, 1).data()); + std::unique_ptr mesh = mb.Finalize(); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->num_points(), 4); + ASSERT_EQ(mesh->GetNamedAttribute(draco::GeometryAttribute::POSITION)->size(), + 4); + + // Create a simple attribute that has a constant value on every corner. + std::unique_ptr pa(new draco::PointAttribute()); + pa->Init(draco::GeometryAttribute::GENERIC, 1 /*One components*/, + draco::DT_UINT8, false, 1); + uint8_t val = 10; + pa->SetAttributeValue(draco::AttributeValueIndex(0), &val); + + // Map all corners to the same value. + draco::IndexTypeVector + corner_to_point(6, draco::AttributeValueIndex(0)); + + // Adding this attribute to the mesh should not increase the number of points. + const int new_att_id_0 = + mesh->AddAttributeWithConnectivity(std::move(pa), corner_to_point); + + ASSERT_EQ(mesh->num_attributes(), 2); + ASSERT_EQ(mesh->num_points(), 4); + + const draco::PointAttribute *const new_att_0 = mesh->attribute(new_att_id_0); + ASSERT_NE(new_att_0, nullptr); + + // All points of the mesh should be mapped to the same attribute value. + for (draco::PointIndex pi(0); pi < mesh->num_points(); ++pi) { + uint8_t att_val = 0; + new_att_0->GetMappedValue(pi, &att_val); + ASSERT_EQ(att_val, 10); + } + + // Add a new attribute with two values and different connectivity. + pa = std::unique_ptr(new draco::PointAttribute()); + pa->Init(draco::GeometryAttribute::GENERIC, 1 /*One components*/, + draco::DT_UINT8, false, 2); + val = 11; + pa->SetAttributeValue(draco::AttributeValueIndex(0), &val); + val = 12; + pa->SetAttributeValue(draco::AttributeValueIndex(1), &val); + + // Map all corners to the value index 0 except for corner 1 that is mapped to + // value index 1. This should result in a new point being created on either + // corner 1 or corner 4 (see figure at the beginning of this test). + corner_to_point.assign(6, draco::AttributeValueIndex(0)); + corner_to_point[draco::CornerIndex(1)] = draco::AttributeValueIndex(1); + + const int new_att_id_1 = + mesh->AddAttributeWithConnectivity(std::move(pa), corner_to_point); + + ASSERT_EQ(mesh->num_attributes(), 3); + + // One new point should have been created by adding the new attribute. + ASSERT_EQ(mesh->num_points(), 5); + + const draco::PointAttribute *const new_att_1 = mesh->attribute(new_att_id_1); + ASSERT_NE(new_att_1, nullptr); + ASSERT_TRUE(mesh->CornerToPointId(1) == draco::PointIndex(4) || + mesh->CornerToPointId(4) == draco::PointIndex(4)); + + new_att_1->GetMappedValue(mesh->CornerToPointId(1), &val); + ASSERT_EQ(val, 12); + + new_att_1->GetMappedValue(mesh->CornerToPointId(4), &val); + ASSERT_EQ(val, 11); + + // Ensure the attribute values of the remaining attributes are well defined + // on the new point. + draco::Vector3f pos; + mesh->attribute(0)->GetMappedValue(draco::PointIndex(4), &pos[0]); + ASSERT_EQ(pos, draco::Vector3f(1, 0, 0)); + + new_att_0->GetMappedValue(draco::PointIndex(4), &val); + ASSERT_EQ(val, 10); + + new_att_0->GetMappedValue(mesh->CornerToPointId(1), &val); + ASSERT_EQ(val, 10); + new_att_0->GetMappedValue(mesh->CornerToPointId(4), &val); + ASSERT_EQ(val, 10); +} + +TEST(MeshTest, TestAddNewAttributeWithConnectivityWithIsolatedVertices) { + // Tests that we can add a new attribute with connectivity to a mesh that + // contains isolated vertices. + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("isolated_vertices.ply"); + ASSERT_NE(mesh, nullptr); + const draco::PointAttribute *const pos_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::POSITION); + ASSERT_NE(pos_att, nullptr); + ASSERT_TRUE(pos_att->is_mapping_identity()); + ASSERT_EQ(pos_att->size(), 5); + ASSERT_EQ(mesh->num_points(), 5); + ASSERT_EQ(mesh->num_faces(), 2); + + // Add a new attribute with two values (one for each face). + auto pa = std::unique_ptr(new draco::PointAttribute()); + pa->Init(draco::GeometryAttribute::GENERIC, 1 /*One component*/, + draco::DT_UINT8, false, 2); + uint8_t val = 11; + pa->SetAttributeValue(draco::AttributeValueIndex(0), &val); + val = 12; + pa->SetAttributeValue(draco::AttributeValueIndex(1), &val); + + draco::IndexTypeVector + corner_to_point(6, draco::AttributeValueIndex(0)); + // All corners on the second face are mapped to the value 1. + for (draco::CornerIndex ci(3); ci < 6; ++ci) { + corner_to_point[ci] = draco::AttributeValueIndex(1); + } + + const draco::PointAttribute *const pa_raw = pa.get(); + mesh->AddAttributeWithConnectivity(std::move(pa), corner_to_point); + + // Two new point should have been added. + ASSERT_EQ(mesh->num_points(), 7); + + for (draco::PointIndex pi(0); pi < mesh->num_points(); ++pi) { + ASSERT_NE(pa_raw->mapped_index(pi), draco::kInvalidAttributeValueIndex); + ASSERT_NE(pos_att->mapped_index(pi), draco::kInvalidAttributeValueIndex); + } +} + +TEST(MeshTest, TestAddPerVertexAttribute) { + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + + ASSERT_NE(mesh, nullptr); + const draco::PointAttribute *const pos_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::POSITION); + ASSERT_NE(pos_att, nullptr); + + // The input mesh should have 8 spatial vertices. + ASSERT_EQ(pos_att->size(), 8); + + // Add a new scalar attribute where each value corresponds to the position + // value index (vertex). + std::unique_ptr pa(new draco::PointAttribute()); + pa->Init(draco::GeometryAttribute::GENERIC, /* scalar */ 1, draco::DT_FLOAT32, + false, /* one value per position value */ 8); + + // Set the value for the new attribute. + for (draco::AttributeValueIndex avi(0); avi < 8; ++avi) { + const float att_value = avi.value(); + pa->SetAttributeValue(avi, &att_value); + } + + // Add the attribute to the existing mesh. + const int new_att_id = mesh->AddPerVertexAttribute(std::move(pa)); + ASSERT_NE(new_att_id, -1); + + // Make sure all the attribute values are set correctly for every point of the + // mesh. + for (draco::PointIndex pi(0); pi < mesh->num_points(); ++pi) { + const draco::AttributeValueIndex pos_avi = pos_att->mapped_index(pi); + const draco::AttributeValueIndex new_att_avi = + mesh->attribute(new_att_id)->mapped_index(pi); + ASSERT_EQ(pos_avi, new_att_avi); + + float new_att_value; + mesh->attribute(new_att_id)->GetValue(new_att_avi, &new_att_value); + ASSERT_EQ(new_att_value, new_att_avi.value()); + } +} + +TEST(MeshTest, TestRemovalOfIsolatedPoints) { + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("isolated_vertices.ply"); + + draco::Mesh mesh_copy; + mesh_copy.Copy(*mesh); + + ASSERT_EQ(mesh_copy.num_points(), 5); + mesh_copy.RemoveIsolatedPoints(); + ASSERT_EQ(mesh_copy.num_points(), 4); + + draco::MeshAreEquivalent eq; + ASSERT_TRUE(eq(*mesh, mesh_copy)); +} + +TEST(MeshTest, TestCompressionSettings) { + // Tests compression settings of a mesh. + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + // Check that compression is disabled and compression settings are default. + ASSERT_FALSE(mesh->IsCompressionEnabled()); + const draco::DracoCompressionOptions default_compression_options; + ASSERT_EQ(mesh->GetCompressionOptions(), default_compression_options); + + // Check that compression options can be set without enabling compression. + draco::DracoCompressionOptions compression_options; + compression_options.quantization_bits_normal = 12; + mesh->SetCompressionOptions(compression_options); + ASSERT_EQ(mesh->GetCompressionOptions(), compression_options); + ASSERT_FALSE(mesh->IsCompressionEnabled()); + + // Check that compression can be enabled. + mesh->SetCompressionEnabled(true); + ASSERT_TRUE(mesh->IsCompressionEnabled()); + + // Check that individual compression options can be updated. + mesh->GetCompressionOptions().compression_level++; + mesh->GetCompressionOptions().compression_level--; + + // Check that compression settings can be copied. + draco::Mesh mesh_copy; + mesh_copy.Copy(*mesh); + ASSERT_TRUE(mesh_copy.IsCompressionEnabled()); + ASSERT_EQ(mesh_copy.GetCompressionOptions(), compression_options); +} + +// Tests adding and removing of mesh features to a mesh. +TEST(MeshTest, TestMeshFeatures) { + // Create a mesh with two feature ID sets. + draco::Mesh mesh; + ASSERT_EQ(mesh.NumMeshFeatures(), 0); + std::unique_ptr oceans(new draco::MeshFeatures()); + std::unique_ptr continents(new draco::MeshFeatures()); + oceans->SetLabel("oceans"); + continents->SetLabel("continents"); + const draco::MeshFeaturesIndex index_0 = + mesh.AddMeshFeatures(std::move(oceans)); + const draco::MeshFeaturesIndex index_1 = + mesh.AddMeshFeatures(std::move(continents)); + ASSERT_EQ(index_0, draco::MeshFeaturesIndex(0)); + ASSERT_EQ(index_1, draco::MeshFeaturesIndex(1)); + + // Check that the mesh has two feature ID sets. + ASSERT_EQ(mesh.NumMeshFeatures(), 2); + ASSERT_EQ(mesh.GetMeshFeatures(index_0).GetLabel(), "oceans"); + ASSERT_EQ(mesh.GetMeshFeatures(index_1).GetLabel(), "continents"); + + // Remove one feature ID set and check the remaining feature ID set. + mesh.RemoveMeshFeatures(draco::MeshFeaturesIndex(1)); + ASSERT_EQ(mesh.NumMeshFeatures(), 1); + ASSERT_EQ(mesh.GetMeshFeatures(draco::MeshFeaturesIndex(0)).GetLabel(), + "oceans"); + + // Remove the remaining feature ID set and check that no sets remain. + mesh.RemoveMeshFeatures(draco::MeshFeaturesIndex(0)); + ASSERT_EQ(mesh.NumMeshFeatures(), 0); +} + +// Tests copying of a mesh with feature ID sets. +TEST(MeshTest, MeshCopyWithMeshFeatures) { + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + // Add two textures to the non-material texture library of the mesh. + std::unique_ptr texture0(new draco::Texture()); + std::unique_ptr texture1(new draco::Texture()); + texture0->Resize(128, 128); + texture1->Resize(256, 256); + texture0->FillImage(draco::RGBA(100, 0, 0, 0)); + texture1->FillImage(draco::RGBA(200, 0, 0, 0)); + draco::TextureLibrary &library = mesh->GetNonMaterialTextureLibrary(); + library.PushTexture(std::move(texture0)); + library.PushTexture(std::move(texture1)); + + // Add feature ID set referring to an attribute. + const draco::MeshFeaturesIndex index_0 = mesh->AddMeshFeatures( + std::unique_ptr(new draco::MeshFeatures())); + mesh->GetMeshFeatures(index_0).SetLabel("planet"); + mesh->GetMeshFeatures(index_0).SetFeatureCount(2); + mesh->GetMeshFeatures(index_0).SetAttributeIndex(1); + + // Add feature ID set referring to texture at index 0. + const draco::MeshFeaturesIndex index_1 = mesh->AddMeshFeatures( + std::unique_ptr(new draco::MeshFeatures())); + mesh->GetMeshFeatures(index_1).SetLabel("continents"); + mesh->GetMeshFeatures(index_1).SetFeatureCount(7); + mesh->GetMeshFeatures(index_1).GetTextureMap().SetTexture( + library.GetTexture(0)); + + // Add feature ID set referring to a texture at index 1. + const draco::MeshFeaturesIndex index_2 = mesh->AddMeshFeatures( + std::unique_ptr(new draco::MeshFeatures())); + mesh->GetMeshFeatures(index_2).SetLabel("oceans"); + mesh->GetMeshFeatures(index_2).SetFeatureCount(5); + mesh->GetMeshFeatures(index_2).GetTextureMap().SetTexture( + library.GetTexture(1)); + + // Check mesh feature ID set texture pointers. + ASSERT_EQ(library.NumTextures(), 2); + ASSERT_EQ(mesh->NumMeshFeatures(), 3); + ASSERT_EQ(mesh->GetMeshFeatures(index_0).GetTextureMap().texture(), nullptr); + ASSERT_EQ(mesh->GetMeshFeatures(index_1).GetTextureMap().texture(), + library.GetTexture(0)); + ASSERT_EQ(mesh->GetMeshFeatures(index_2).GetTextureMap().texture(), + library.GetTexture(1)); + + // Copy the mesh. + draco::Mesh mesh_copy; + mesh_copy.Copy(*mesh); + + // Check that the meshes are equivalent. + draco::MeshAreEquivalent eq; + ASSERT_TRUE(eq(*mesh, mesh_copy)); + + // Also check that the texture pointers have been updated correctly. + const draco::TextureLibrary &library_copy = + mesh_copy.GetNonMaterialTextureLibrary(); + ASSERT_EQ(library_copy.NumTextures(), 2); + ASSERT_EQ(mesh_copy.NumMeshFeatures(), 3); + ASSERT_EQ(mesh_copy.GetMeshFeatures(index_0).GetTextureMap().texture(), + nullptr); + ASSERT_EQ(mesh_copy.GetMeshFeatures(index_1).GetTextureMap().texture(), + library_copy.GetTexture(0)); + ASSERT_EQ(mesh_copy.GetMeshFeatures(index_2).GetTextureMap().texture(), + library_copy.GetTexture(1)); +} + +// Tests copying of a mesh with structural metadata. +TEST(MeshTest, TestCopyWithStructuralMetadata) { + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + // Add structural metadata to the mesh. + draco::PropertyTable::Schema schema; + schema.json.SetString("Data"); + mesh->GetStructuralMetadata().SetPropertyTableSchema(schema); + + // Copy the mesh. + draco::Mesh copy; + copy.Copy(*mesh); + + // Check that the structural metadata has been copied. + ASSERT_EQ( + copy.GetStructuralMetadata().GetPropertyTableSchema().json.GetString(), + "Data"); +} + +// Tests removing of unused materials for a mesh with mesh features. +TEST(MeshTest, RemoveUnusedMaterialsWithMeshFeatures) { + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("BoxesMeta/glTF/BoxesMeta.gltf"); + ASSERT_NE(mesh, nullptr); + + // Input has five mesh features, two associated with material 0 and three with + // material 1. + ASSERT_EQ(mesh->NumMeshFeatures(), 5); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(0), 0), + 0); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(1), 0), + 0); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(2), 0), + 1); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(3), 0), + 1); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(4), 0), + 1); + + // Remove material 0. + draco::PointAttribute *mat_att = mesh->attribute( + mesh->GetNamedAttributeId(draco::GeometryAttribute::MATERIAL)); + // Map mat value 0 to 1. + uint32_t new_mat_index = 1; + mat_att->SetAttributeValue(draco::AttributeValueIndex(0), &new_mat_index); + + // This should not do anything because we still have the material 0 referenced + // by mesh features 0 and 1. + mesh->RemoveUnusedMaterials(); + + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 2); + ASSERT_EQ(mesh->NumMeshFeatures(), 5); + + // Now remove unused mesh features (should be 0 and 1). + DRACO_ASSERT_OK(draco::MeshUtils::RemoveUnusedMeshFeatures(mesh.get())); + + ASSERT_EQ(mesh->NumMeshFeatures(), 3); + // All remaining mesh features should be still mapped to material 1. + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(0), 0), + 1); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(1), 0), + 1); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(2), 0), + 1); + + // Now remove the unused materials (0). + mesh->RemoveUnusedMaterials(); + + // Only one material should be remaining and all the mesh features should now + // be mapped to material 0. + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(0), 0), + 0); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(1), 0), + 0); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(draco::MeshFeaturesIndex(2), 0), + 0); +} +#endif // DRACO_TRANSCODER_SUPPORTED + +// Test bounding box. +TEST(MeshTest, TestMeshBoundingBox) { + const draco::Vector3f max_pt(1, 1, 1); + const draco::Vector3f min_pt(0, 0, 0); + + const std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr) << "Failed in Loading: " + << "cube_att.obj"; + const draco::BoundingBox bounding_box = mesh->ComputeBoundingBox(); + + EXPECT_EQ(max_pt[0], bounding_box.GetMaxPoint()[0]); + EXPECT_EQ(max_pt[1], bounding_box.GetMaxPoint()[1]); + EXPECT_EQ(max_pt[2], bounding_box.GetMaxPoint()[2]); + + EXPECT_EQ(min_pt[0], bounding_box.GetMinPoint()[0]); + EXPECT_EQ(min_pt[1], bounding_box.GetMinPoint()[1]); + EXPECT_EQ(min_pt[2], bounding_box.GetMinPoint()[2]); +} + +} // namespace diff --git a/contrib/draco/src/draco/mesh/mesh_utils.cc b/contrib/draco/src/draco/mesh/mesh_utils.cc new file mode 100644 index 000000000..0fbe366c1 --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_utils.cc @@ -0,0 +1,492 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/mesh/mesh_utils.h" + +#include +#include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/attributes/attribute_quantization_transform.h" +#include "draco/core/quantization_utils.h" + +namespace draco { + +void MeshUtils::TransformMesh(const Eigen::Matrix4d &transform, Mesh *mesh) { + // Transform positions. + PointAttribute *pos_att = + mesh->attribute(mesh->GetNamedAttributeId(GeometryAttribute::POSITION)); + for (AttributeValueIndex avi(0); avi < pos_att->size(); ++avi) { + Vector3f pos_val; + pos_att->GetValue(avi, &pos_val[0]); + Eigen::Vector4d transformed_val(pos_val[0], pos_val[1], pos_val[2], 1); + transformed_val = transform * transformed_val; + pos_val = + Vector3f(transformed_val[0], transformed_val[1], transformed_val[2]); + pos_att->SetAttributeValue(avi, &pos_val[0]); + } + + // Transform normals and tangents. + PointAttribute *normal_att = nullptr; + PointAttribute *tangent_att = nullptr; + if (mesh->NumNamedAttributes(GeometryAttribute::NORMAL) > 0) { + normal_att = + mesh->attribute(mesh->GetNamedAttributeId(GeometryAttribute::NORMAL)); + } + if (mesh->NumNamedAttributes(GeometryAttribute::TANGENT) > 0) { + tangent_att = + mesh->attribute(mesh->GetNamedAttributeId(GeometryAttribute::TANGENT)); + } + + if (normal_att || tangent_att) { + // Use inverse-transpose matrix to transform normals and tangents. + Eigen::Matrix3d it_transform = transform.block<3, 3>(0, 0); + + it_transform = it_transform.inverse().transpose(); + + if (normal_att) { + TransformNormalizedAttribute(it_transform, normal_att); + } + if (tangent_att) { + TransformNormalizedAttribute(it_transform, tangent_att); + } + } +} + +namespace { + +// Merges entries from |src_metadata| to |dst_metadata|. Any metadata entries +// with the same names are left unchanged. +void MergeMetadataInternal(const Metadata &src_metadata, + Metadata *dst_metadata) { + const auto &src_entries = src_metadata.entries(); + const auto &dst_entries = dst_metadata->entries(); + for (const auto &it : src_entries) { + if (dst_entries.find(it.first) != dst_entries.end()) { + // Source entry already exists in the target metadata. + continue; + } + // Copy over the entry (entries don't store the data type so binary copy + // is ok). + dst_metadata->AddEntryBinary(it.first, it.second.data()); + } + + // Merge any sub-metadata. + const auto &src_sub_metadata = src_metadata.sub_metadatas(); + const auto &dst_sub_metadata = dst_metadata->sub_metadatas(); + for (const auto &it : src_sub_metadata) { + if (dst_sub_metadata.find(it.first) == dst_sub_metadata.end()) { + // Source sub-metadata doesn't exists in the target metadata, copy it + // over. + std::unique_ptr sub_metadata(new Metadata(*it.second)); + dst_metadata->AddSubMetadata(it.first, std::move(sub_metadata)); + continue; + } + // Merge entries on the sub-metadata. + MergeMetadataInternal(*it.second, dst_metadata->sub_metadata(it.first)); + } +} + +} // namespace + +void MeshUtils::MergeMetadata(const Mesh &src_mesh, Mesh *dst_mesh) { + const auto *src_metadata = src_mesh.GetMetadata(); + if (src_metadata == nullptr) { + return; // Nothing to merge. + } + if (dst_mesh->GetMetadata() == nullptr) { + // Create new metadata for the |dst_mesh|. We do not copy the metadata + // directly because some of the underlying attribute metadata may need to + // be remapped to the format used by |dst_mesh| (e.g. unique ids of the + // attributes may have changed or some attributes may be missing on the + // |dst_mesh|). + std::unique_ptr new_metadata(new GeometryMetadata()); + dst_mesh->AddMetadata(std::move(new_metadata)); + } + auto *dst_metadata = dst_mesh->metadata(); + + // First go over all entries of the geometry part of |src_metadata|. + MergeMetadataInternal(*src_metadata, dst_metadata); + + // Go over attribute metadata. Merges only metadata for attributes that exist + // both on the source and target meshes. Attribute unique ids are remapped + // if needed. + for (int att_type_i = 0; + att_type_i < GeometryAttribute::NAMED_ATTRIBUTES_COUNT; ++att_type_i) { + const GeometryAttribute::Type att_type = + static_cast(att_type_i); + // TODO(ostava): Handle case when the number of attributes of a given type + // does not match. + if (src_mesh.NumNamedAttributes(att_type) != + dst_mesh->NumNamedAttributes(att_type)) { + continue; + } + for (int j = 0; j < src_mesh.NumNamedAttributes(att_type); ++j) { + // First check if we have a metadata for this attribute. + const PointAttribute *const src_att = + src_mesh.GetNamedAttribute(att_type, j); + const auto *src_metadata = + src_mesh.GetMetadata()->GetAttributeMetadataByUniqueId( + src_att->unique_id()); + if (src_metadata == nullptr) { + // No metadata at the source, ignore the attribute. + continue; + } + // Find target attribute corresponding to the source. + const PointAttribute *const dst_att = + dst_mesh->GetNamedAttribute(att_type, j); + if (dst_att == nullptr) { + // No corresponding attribute found, ignore the source metadata. + continue; + } + auto *dst_metadata = + dst_mesh->metadata()->attribute_metadata(dst_att->unique_id()); + if (dst_metadata == nullptr) { + // Copy over the metadata (with remapped attribute unique id). + std::unique_ptr new_metadata( + new AttributeMetadata(*src_metadata)); + new_metadata->set_att_unique_id(dst_att->unique_id()); + dst_mesh->metadata()->AddAttributeMetadata(std::move(new_metadata)); + continue; + } + // Merge metadata entries. + MergeMetadataInternal(*src_metadata, dst_metadata); + } + } +} + +Status MeshUtils::RemoveUnusedMeshFeatures(Mesh *mesh) { + // Unused mesh features are features that are not used by any face / vertex + // of the |mesh|. Currently, each mesh feature can be "masked" for specific + // materials, in which case we need to check whether the mask materials + // are present in the |mesh|. If not, we can remove the mesh features from the + // mesh. + const PointAttribute *const mat_att = + mesh->GetNamedAttribute(GeometryAttribute::MATERIAL); + // Find which materials are used. + std::unordered_set used_materials; + if (mat_att == nullptr) { + // Only material with index 0 is assumed to be used. + used_materials.insert(0); + } else { + for (AttributeValueIndex avi(0); avi < mat_att->size(); ++avi) { + uint32_t mat_index = 0; + mat_att->GetValue(avi, &mat_index); + used_materials.insert(mat_index); + } + } + + std::vector unused_mesh_features; + for (MeshFeaturesIndex mfi(0); mfi < mesh->NumMeshFeatures(); ++mfi) { + bool is_used = false; + if (mesh->NumMeshFeaturesMaterialMasks(mfi) == 0) { + is_used = true; + } else { + for (int mask_i = 0; mask_i < mesh->NumMeshFeaturesMaterialMasks(mfi); + ++mask_i) { + const int material_index = + mesh->GetMeshFeaturesMaterialMask(mfi, mask_i); + if (used_materials.count(material_index)) { + is_used = true; + break; + } + } + } + if (!is_used) { + unused_mesh_features.push_back(mfi); + } + } + + // Remove the unused mesh features (from back). + for (auto it = unused_mesh_features.rbegin(); + it != unused_mesh_features.rend(); ++it) { + const MeshFeaturesIndex mfi = *it; + mesh->RemoveMeshFeatures(mfi); + } + + // Remove all features textures that are not used anymore. + + // First find which textures are referenced by the mesh features. + std::unordered_set used_textures; + for (MeshFeaturesIndex mfi(0); mfi < mesh->NumMeshFeatures(); ++mfi) { + const Texture *const texture = + mesh->GetMeshFeatures(mfi).GetTextureMap().texture(); + if (texture) { + used_textures.insert(texture); + } + } + + if (!used_textures.empty() && + mesh->GetNonMaterialTextureLibrary().NumTextures() == 0) { + return ErrorStatus( + "Trying to remove mesh features textures that are not owned by the " + "mesh."); + } + + // Remove all unreferenced textures from the non-material texture library. + for (int ti = mesh->GetNonMaterialTextureLibrary().NumTextures() - 1; ti >= 0; + --ti) { + const Texture *const texture = + mesh->GetNonMaterialTextureLibrary().GetTexture(ti); + if (used_textures.count(texture) == 0) { + mesh->GetNonMaterialTextureLibrary().RemoveTexture(ti); + } + } + return OkStatus(); +} + +bool MeshUtils::FlipTextureUvValues(bool flip_u, bool flip_v, + PointAttribute *att) { + if (att->attribute_type() != GeometryAttribute::TEX_COORD) { + return false; + } + if (att->data_type() != DataType::DT_FLOAT32) { + return false; + } + if (att->num_components() != 2) { + return false; + } + + std::array value; + for (AttributeValueIndex avi(0); avi < att->size(); ++avi) { + if (!att->GetValue(avi, &value)) { + return false; + } + if (flip_u) { + value[0] = 1.0 - value[0]; + } + if (flip_v) { + value[1] = 1.0 - value[1]; + } + att->SetAttributeValue(avi, value.data()); + } + return true; +} + +// TODO(fgalligan): Change att_id to be of type const PointAttribute &. +int MeshUtils::CountDegenerateFaces(const Mesh &mesh, int att_id) { + const PointAttribute *const att = mesh.attribute(att_id); + if (att == nullptr) { + return -1; + } + const int num_components = att->num_components(); + switch (num_components) { + case 2: + return MeshUtils::CountDegenerateFaces(mesh, *att); + case 3: + return MeshUtils::CountDegenerateFaces(mesh, *att); + case 4: + return MeshUtils::CountDegenerateFaces(mesh, *att); + default: + break; + } + return -1; +} + +StatusOr MeshUtils::FindLowestTextureQuantization( + const Mesh &mesh, const PointAttribute &pos_att, int pos_quantization_bits, + const PointAttribute &tex_att, int tex_target_quantization_bits) { + if (tex_target_quantization_bits < 0 || tex_target_quantization_bits >= 30) { + return Status(Status::DRACO_ERROR, + "Target texture quantization is out of range."); + } + // The target quantization is no quantization, so return 0. + if (tex_target_quantization_bits == 0) { + return 0; + } + const uint32_t pos_max_quantized_value = (1 << (pos_quantization_bits)) - 1; + AttributeQuantizationTransform pos_transform; + if (!pos_transform.ComputeParameters(pos_att, pos_quantization_bits)) { + return Status(Status::DRACO_ERROR, + "Failed computing position quantization parameters."); + } + + // Get all degenerate faces for positions. If the model already has + // degenerate faces for positions, but valid faces for texture coordinates, + // those will not count as new degenerate faces for texture coordinates, + // because the faces would not have been rendered anyway. + const std::vector pos_degenerate_faces_sorted = + MeshUtils::ListDegenerateQuantizedFaces( + mesh, pos_att, pos_transform.range(), pos_max_quantized_value, false); + + // Initialize return value to zero signifying that it could not find a + // quantization that did not cause any new degenerate faces. + int lowest_quantization_bits = 0; + int min_quantization_bits = tex_target_quantization_bits; + int max_quantization_bits = 29; + while (true) { + const int curr_quantization_bits = + min_quantization_bits + + (max_quantization_bits - min_quantization_bits) / 2; + AttributeQuantizationTransform transform; + if (!transform.ComputeParameters(tex_att, curr_quantization_bits)) { + return Status(Status::DRACO_ERROR, + "Failed computing texture quantization parameters."); + } + + const uint32_t max_quantized_value = (1 << (curr_quantization_bits)) - 1; + + // Get only new degenerate faces for texture coordinates. If the model + // already has degenerate faces for texture coordinates, we don't want to + // take into account those faces in the source, because those faces would + // not have been rendered correctly anyway. + const std::vector tex_degenerate_faces_sorted = + MeshUtils::ListDegenerateQuantizedFaces( + mesh, tex_att, transform.range(), max_quantized_value, true); + + if (tex_degenerate_faces_sorted.size() <= + pos_degenerate_faces_sorted.size()) { + if (std::includes(pos_degenerate_faces_sorted.begin(), + pos_degenerate_faces_sorted.end(), + tex_degenerate_faces_sorted.begin(), + tex_degenerate_faces_sorted.end())) { + // Degenerate texture coordinate faces are a subset of position + // degenerate faces. + lowest_quantization_bits = curr_quantization_bits; + } + } + + if (lowest_quantization_bits == curr_quantization_bits) { + // The lowest quantization is the current quantization, see if lower + // quantization is possible. + max_quantization_bits = curr_quantization_bits - 1; + } else { + min_quantization_bits = curr_quantization_bits + 1; + } + if (min_quantization_bits > max_quantization_bits) { + break; + } + } + return lowest_quantization_bits; +} + +void MeshUtils::TransformNormalizedAttribute(const Eigen::Matrix3d &transform, + PointAttribute *att) { + for (AttributeValueIndex avi(0); avi < att->size(); ++avi) { + // Store up to 4 component values. + Vector4f val(0, 0, 0, 1); + att->GetValue(avi, &val); + // Ignore the last component during transformation. + Eigen::Vector3d transformed_val(val[0], val[1], val[2]); + transformed_val = transform * transformed_val; + transformed_val = transformed_val.normalized(); + // Last component is passed to the transformed value. + val = Vector4f(transformed_val[0], transformed_val[1], transformed_val[2], + val[3]); + + // Set the value to the attribute. Note that in case the attribute is using + // fewer than 4 components, the 4th component is going to be ignored. + att->SetAttributeValue(avi, &val[0]); + } +} + +template +int MeshUtils::CountDegenerateFaces(const Mesh &mesh, + const PointAttribute &att) { + if (att.data_type() != DataType::DT_FLOAT32) { + return -1; + } + std::array values; + int degenerate_values = 0; + for (FaceIndex fi(0); fi < mesh.num_faces(); ++fi) { + const auto &face = mesh.face(fi); + for (int c = 0; c < 3; ++c) { + att.GetMappedValue(face[c], &values[c][0]); + } + if (values[0] == values[1] || values[0] == values[2] || + values[1] == values[2]) { + degenerate_values++; + } + } + return degenerate_values; +} + +std::vector MeshUtils::ListDegenerateQuantizedFaces( + const Mesh &mesh, const PointAttribute &att, float range, + uint32_t max_quantized_value, bool quantized_degenerate_only) { + const int num_components = att.num_components(); + switch (num_components) { + case 2: + return MeshUtils::ListDegenerateQuantizedFaces>( + mesh, att, range, max_quantized_value, quantized_degenerate_only); + case 3: + return MeshUtils::ListDegenerateQuantizedFaces>( + mesh, att, range, max_quantized_value, quantized_degenerate_only); + case 4: + return MeshUtils::ListDegenerateQuantizedFaces>( + mesh, att, range, max_quantized_value, quantized_degenerate_only); + default: + break; + } + return std::vector(); +} + +template +std::vector MeshUtils::ListDegenerateQuantizedFaces( + const Mesh &mesh, const PointAttribute &att, float range, + uint32_t max_quantized_value, bool quantized_degenerate_only) { + std::array values; + std::array quantized_values; + + Quantizer quantizer; + quantizer.Init(range, max_quantized_value); + std::vector degenerate_faces; + + for (FaceIndex fi(0); fi < mesh.num_faces(); ++fi) { + const auto &face = mesh.face(fi); + for (int c = 0; c < 3; ++c) { + att.GetMappedValue(face[c], &values[c][0]); + for (int i = 0; i < att_components_t::dimension; ++i) { + quantized_values[c][i] = quantizer.QuantizeFloat(values[c][i]); + } + } + + if (quantized_degenerate_only && + (values[0] == values[1] || values[0] == values[2] || + values[1] == values[2])) { + continue; + } + if (quantized_values[0] == quantized_values[1] || + quantized_values[0] == quantized_values[2] || + quantized_values[1] == quantized_values[2]) { + degenerate_faces.push_back(fi); + } + } + return degenerate_faces; +} + +bool MeshUtils::HasAutoGeneratedTangents(const Mesh &mesh) { + const int tangent_att_id = + mesh.GetNamedAttributeId(draco::GeometryAttribute::TANGENT); + if (tangent_att_id == -1) { + return false; + } + const auto metadata = mesh.GetAttributeMetadataByAttributeId(tangent_att_id); + if (metadata) { + int is_auto_generated = 0; + if (metadata->GetEntryInt("auto_generated", &is_auto_generated) && + is_auto_generated == 1) { + return true; + } + } + return false; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/mesh/mesh_utils.h b/contrib/draco/src/draco/mesh/mesh_utils.h new file mode 100644 index 000000000..e17dfd8ed --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_utils.h @@ -0,0 +1,102 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_MESH_MESH_UTILS_H_ +#define DRACO_MESH_MESH_UTILS_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "Eigen/Geometry" +#include "draco/core/status_or.h" +#include "draco/mesh/mesh.h" + +namespace draco { + +// Helper class containing various utilities operating on draco::Mesh. +// TODO(ostava): Move scattered functions in this folder here (e.g. corner table +// construction). +class MeshUtils { + public: + // Transforms |mesh| using the |transform| matrix. The mesh is transformed + // in-place. + static void TransformMesh(const Eigen::Matrix4d &transform, Mesh *mesh); + + // Merges metadata from |src_mesh| to |dst_mesh|. Any metadata with the same + // names are left unchanged. + static void MergeMetadata(const Mesh &src_mesh, Mesh *dst_mesh); + + // Removes unused MeshFeatures from |mesh|. If the |mesh| contains any mesh + // feature textures, the textures must be owned by the |mesh| otherwise an + // error is returned. + static Status RemoveUnusedMeshFeatures(Mesh *mesh); + + // Flips the UV values of |att|. + static bool FlipTextureUvValues(bool flip_u, bool flip_v, + PointAttribute *att); + + // Counts the number of degenerate faces in |mesh| for attribute |att_id|. + // Returns < 0 if counting of degenerate faces is not supported for |att_id|. + static int CountDegenerateFaces(const Mesh &mesh, int att_id); + + // Searches for the lowest texture quantization bits for |tex_att| that does + // not introduce any new texture coordinate degenerate faces. The range for + // the search is |tex_target_quantization_bits| - 29, inclusive. The function + // does not count texture coordinate degenerate faces already in the source. + // Nor does it count any new texture coordinate degenerate faces that are a + // subset of new position degenerate faces created from the quantization of + // |pos_att| using |pos_quantization_bits|. Returns the lowest quantization + // bits within the specified range or zero signifying that it could not find a + // quantization that did not cause any new degenerate faces. + static StatusOr FindLowestTextureQuantization( + const Mesh &mesh, const PointAttribute &pos_att, + int pos_quantization_bits, const PointAttribute &tex_att, + int tex_target_quantization_bits); + + // Helper function that checks whether a mesh has auto-generated tangents. + // See go/tangents_and_draco_simplifier. + static bool HasAutoGeneratedTangents(const Mesh &mesh); + + private: + static void TransformNormalizedAttribute(const Eigen::Matrix3d &transform, + PointAttribute *att); + + template + static int CountDegenerateFaces(const Mesh &mesh, const PointAttribute &att); + + // Returns a sorted list of degenerate faces for |att|. |att| must use |mesh| + // for its connectivity. |range| and |max_quantized_value| are the values + // passed into the quantizer. |quantized_degenerate_only|, is true will only + // include degenerate faces caused by the quantization. Otherwise all + // degenerate faces will be included, those made by the quantization and those + // already in the source. + static std::vector ListDegenerateQuantizedFaces( + const Mesh &mesh, const PointAttribute &att, float range, + uint32_t max_quantized_value, bool quantized_degenerate_only); + + // Returns a sorted list of degenerate faces for |att|. |att_components_t| is + // the component count for |att| as a VectorD. E.g. Vector2f, Vector3f, or + // Vector4f. |quantized_components_t| is the quantized component count for + // |att| as a VectorD. E.g. VectorD, VectorD, or + // VectorD. + template + static std::vector ListDegenerateQuantizedFaces( + const Mesh &mesh, const PointAttribute &att, float range, + uint32_t max_quantized_value, bool quantized_degenerate_only); +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_MESH_MESH_UTILS_H_ diff --git a/contrib/draco/src/draco/mesh/mesh_utils_test.cc b/contrib/draco/src/draco/mesh/mesh_utils_test.cc new file mode 100644 index 000000000..022669cb0 --- /dev/null +++ b/contrib/draco/src/draco/mesh/mesh_utils_test.cc @@ -0,0 +1,391 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/mesh/mesh_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace { + +// Compare normal vector rotated by |angle| around the x-axis. +void CompareRotatedNormals(const draco::Mesh &mesh_0, const draco::Mesh &mesh_1, + float angle) { + const draco::PointAttribute *const norm_att_0 = + mesh_0.GetNamedAttribute(draco::GeometryAttribute::NORMAL); + const draco::PointAttribute *const norm_att_1 = + mesh_1.GetNamedAttribute(draco::GeometryAttribute::NORMAL); + ASSERT_EQ(norm_att_0->size(), norm_att_1->size()); + for (draco::AttributeValueIndex avi(0); avi < norm_att_0->size(); ++avi) { + Eigen::Vector3f norm_0, norm_1; + norm_att_0->GetValue(avi, norm_0.data()); + norm_att_1->GetValue(avi, norm_1.data()); + + // Project the normals into yz plane + norm_0[0] = 0.f; + norm_1[0] = 0.f; + + if (norm_0.squaredNorm() < 1e-6f) { + // Normal pointing towards X. Make sure the rotated normal is about the + // same. + ASSERT_NEAR(norm_1.squaredNorm(), 0.f, 1e-6f); + continue; + } + + // Ensure the angle between the normals is as expected. + norm_0.normalize(); + norm_1.normalize(); + const float norm_angle = + std::atan2(norm_0.cross(norm_1).norm(), norm_0.dot(norm_1)); + ASSERT_NEAR(std::abs(norm_angle), angle, 1e-6f); + } +} + +TEST(MeshUtilsTest, TestTransform) { + auto mesh = draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + draco::Mesh transformed_mesh; + transformed_mesh.Copy(*mesh); + Eigen::Matrix4d transform = Eigen::Matrix4d::Identity(); + draco::MeshUtils::TransformMesh(transform, &transformed_mesh); + + // Rotate the mesh by 45 deg around the x-axis. + transform.block<3, 3>(0, 0) = + Eigen::Quaterniond( + Eigen::AngleAxisd(M_PI / 4.f, Eigen::Vector3d::UnitX())) + .normalized() + .toRotationMatrix(); + draco::MeshUtils::TransformMesh(transform, &transformed_mesh); + CompareRotatedNormals(*mesh, transformed_mesh, M_PI / 4.f); + + // Now rotate the cube back. + transform.block<3, 3>(0, 0) = + Eigen::Quaterniond( + Eigen::AngleAxisd(-M_PI / 4.f, Eigen::Vector3d::UnitX())) + .normalized() + .toRotationMatrix(); + + draco::MeshUtils::TransformMesh(transform, &transformed_mesh); + CompareRotatedNormals(*mesh, transformed_mesh, 0.f); +} + +TEST(MeshUtilsTest, TestTextureUvFlips) { + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + ASSERT_NE(mesh, nullptr); + + // Check that FlipTextureUvValues() only works on texture coordinates. + draco::PointAttribute *att = mesh->attribute(0); + ASSERT_EQ(att->attribute_type(), draco::GeometryAttribute::POSITION); + ASSERT_FALSE(draco::MeshUtils::FlipTextureUvValues(false, true, att)); + + att = mesh->attribute(1); + ASSERT_EQ(att->attribute_type(), draco::GeometryAttribute::TEX_COORD); + + // Get the values and flip the V values. + std::vector> check_uv_values; + check_uv_values.resize(att->size()); + for (draco::AttributeValueIndex avi(0); avi < att->size(); ++avi) { + att->GetValue(avi, &check_uv_values[avi.value()]); + check_uv_values[avi.value()][1] = 1.0 - check_uv_values[avi.value()][1]; + } + + ASSERT_TRUE(draco::MeshUtils::FlipTextureUvValues(false, true, att)); + + std::array value; + for (draco::AttributeValueIndex avi(0); avi < att->size(); ++avi) { + att->GetValue(avi, &value); + ASSERT_EQ(value[0], check_uv_values[avi.value()][0]); + ASSERT_EQ(value[1], check_uv_values[avi.value()][1]); + } + + // Flip the U values. + for (int i = 0; i < check_uv_values.size(); ++i) { + check_uv_values[i][0] = 1.0 - check_uv_values[i][0]; + } + + ASSERT_TRUE(draco::MeshUtils::FlipTextureUvValues(true, false, att)); + + for (draco::AttributeValueIndex avi(0); avi < att->size(); ++avi) { + att->GetValue(avi, &value); + ASSERT_EQ(value[0], check_uv_values[avi.value()][0]); + ASSERT_EQ(value[1], check_uv_values[avi.value()][1]); + } +} + +// Tests counting degenerate values for positions and texture coordinates for +// both scene and mesh. +TEST(MeshUtilsTest, CountDegenerateValuesLantern) { + int degenerate_positions_scene = 0; + int degenerate_tex_coords_scene = 0; + std::unique_ptr scene = + draco::ReadSceneFromTestFile("Lantern/glTF/Lantern.gltf"); + ASSERT_NE(scene, nullptr); + + for (int mgi = 0; mgi < scene->NumMeshGroups(); ++mgi) { + const draco::MeshGroup *const mesh_group = + scene->GetMeshGroup(draco::MeshGroupIndex(mgi)); + ASSERT_NE(mesh_group, nullptr); + + for (int mi = 0; mi < mesh_group->NumMeshInstances(); ++mi) { + const draco::MeshIndex mesh_index = + mesh_group->GetMeshInstance(mi).mesh_index; + const draco::Mesh &m = scene->GetMesh(mesh_index); + + for (int i = 0; i < m.num_attributes(); ++i) { + const draco::PointAttribute *const att = m.attribute(i); + ASSERT_NE(att, nullptr); + + if (att->attribute_type() == draco::GeometryAttribute::Type::POSITION) { + degenerate_positions_scene += + draco::MeshUtils::CountDegenerateFaces(m, i); + } else if (att->attribute_type() == + draco::GeometryAttribute::Type::TEX_COORD) { + degenerate_tex_coords_scene += + draco::MeshUtils::CountDegenerateFaces(m, i); + } + } + } + } + EXPECT_EQ(degenerate_positions_scene, 0); + EXPECT_EQ(degenerate_tex_coords_scene, 2); + + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("Lantern/glTF/Lantern.gltf"); + ASSERT_NE(mesh, nullptr); + for (int i = 0; i < mesh->num_attributes(); ++i) { + const draco::PointAttribute *const att = mesh->attribute(i); + ASSERT_NE(att, nullptr); + if (att->attribute_type() == draco::GeometryAttribute::Type::POSITION) { + EXPECT_EQ(draco::MeshUtils::CountDegenerateFaces(*mesh, i), + degenerate_positions_scene); + } else if (att->attribute_type() == + draco::GeometryAttribute::Type::TEX_COORD) { + EXPECT_EQ(draco::MeshUtils::CountDegenerateFaces(*mesh, i), + degenerate_tex_coords_scene); + } + } +} + +// Tests finding the lowest quantization bits for the texture coordinate in a +// mesh. +TEST(MeshUtilsTest, FindLowsetTextureQuantizationLanternMesh) { + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("Lantern/glTF/Lantern.gltf"); + ASSERT_NE(mesh, nullptr); + + const int pos_quantization_bits = 11; + const draco::PointAttribute *const pos_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::Type::POSITION, 0); + ASSERT_NE(pos_att, nullptr); + + const draco::PointAttribute *const tex_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::Type::TEX_COORD, 0); + ASSERT_NE(tex_att, nullptr); + + // Tests target no quantization returns no quantization. + const int target_no_quantization_bits = 0; + DRACO_ASSIGN_OR_ASSERT(const int no_quantization_bits, + draco::MeshUtils::FindLowestTextureQuantization( + *mesh, *pos_att, pos_quantization_bits, *tex_att, + target_no_quantization_bits)); + ASSERT_EQ(no_quantization_bits, 0); + + // Test failures. + const int out_of_range_low = -1; + const auto statusor_low = draco::MeshUtils::FindLowestTextureQuantization( + *mesh, *pos_att, pos_quantization_bits, *tex_att, out_of_range_low); + ASSERT_FALSE(statusor_low.ok()); + + const int out_of_range_high = 30; + const auto statusor_high = draco::MeshUtils::FindLowestTextureQuantization( + *mesh, *pos_att, pos_quantization_bits, *tex_att, out_of_range_high); + ASSERT_FALSE(statusor_high.ok()); + + // Tests finding the lowest quantization bits for the texture coordinate. + const int target_bits = 6; + DRACO_ASSIGN_OR_ASSERT( + const int lowest_bits, + draco::MeshUtils::FindLowestTextureQuantization( + *mesh, *pos_att, pos_quantization_bits, *tex_att, target_bits)); + ASSERT_EQ(lowest_bits, 14); +} + +// Tests finding the lowest quantization bits for the texture coordinates for +// the three meshes in the scene. +TEST(MeshUtilsTest, FindLowsetTextureQuantizationLanternScene) { + std::unique_ptr scene = + draco::ReadSceneFromTestFile("Lantern/glTF/Lantern.gltf"); + ASSERT_NE(scene, nullptr); + + const std::vector expected_mesh_quantization_bits{11, 8, 14}; + for (int mi = 0; mi < scene->NumMeshes(); ++mi) { + const draco::Mesh &mesh = scene->GetMesh(draco::MeshIndex(mi)); + + const int pos_quantization_bits = 11; + const draco::PointAttribute *const pos_att = + mesh.GetNamedAttribute(draco::GeometryAttribute::Type::POSITION, 0); + ASSERT_NE(pos_att, nullptr); + + const draco::PointAttribute *const tex_att = + mesh.GetNamedAttribute(draco::GeometryAttribute::Type::TEX_COORD, 0); + ASSERT_NE(tex_att, nullptr); + + const int target_bits = 8; + DRACO_ASSIGN_OR_ASSERT( + const int lowest_bits, + draco::MeshUtils::FindLowestTextureQuantization( + mesh, *pos_att, pos_quantization_bits, *tex_att, target_bits)); + ASSERT_EQ(lowest_bits, expected_mesh_quantization_bits[mi]); + } +} + +TEST(MeshUtilsTest, CheckAutoGeneratedTangents) { + // Test verifies that MeshUtils::HasAutoGeneratedTangents works as intended. + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("sphere_no_tangents.gltf"); + ASSERT_NE(mesh, nullptr); + + ASSERT_TRUE(draco::MeshUtils::HasAutoGeneratedTangents(*mesh)); +} + +TEST(MeshUtilsTest, CheckMergeMetadata) { + // Test verifies that we can merge metadata using MeshUtils::MergeMetadata(). + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("sphere_no_tangents.gltf"); + ASSERT_NE(mesh, nullptr); + + std::unique_ptr other_mesh = + draco::ReadMeshFromTestFile("cube_att.obj"); + + ASSERT_NE(mesh->GetMetadata(), nullptr); + // One attribute metadata (for the tangent attribute) and no other entries. + ASSERT_EQ(mesh->GetMetadata()->attribute_metadatas().size(), 1); + ASSERT_EQ(mesh->GetMetadata()->num_entries(), 0); + + // No metadata at the other attribute. + ASSERT_EQ(other_mesh->GetMetadata(), nullptr); + + // First try to merge |other_mesh| metadata to |mesh|. This shouldn't do + // anything. + draco::MeshUtils::MergeMetadata(*other_mesh, mesh.get()); + ASSERT_EQ(mesh->GetMetadata()->attribute_metadatas().size(), 1); + ASSERT_EQ(mesh->GetMetadata()->num_entries(), 0); + + // Merge |mesh| metadata to |other_mesh|. This will create empty metadata but + // not any attribute metadata because |other_mesh| doesn't have the tangent + // attribute. + draco::MeshUtils::MergeMetadata(*mesh, other_mesh.get()); + ASSERT_NE(other_mesh->GetMetadata(), nullptr); + ASSERT_EQ(other_mesh->GetMetadata()->attribute_metadatas().size(), 0); + ASSERT_EQ(other_mesh->GetMetadata()->num_entries(), 0); + ASSERT_FALSE(draco::MeshUtils::HasAutoGeneratedTangents(*other_mesh)); + + // Add dummy tangent attribute to the |other_mesh|. + std::unique_ptr tang_att(new draco::PointAttribute()); + draco::PointAttribute *const tang_att_ptr = tang_att.get(); + tang_att->set_attribute_type(draco::GeometryAttribute::TANGENT); + other_mesh->AddAttribute(std::move(tang_att)); + + // Merge |mesh| metadata to |other_mesh|. This time the tangent metadata + // should be copied over. + draco::MeshUtils::MergeMetadata(*mesh, other_mesh.get()); + ASSERT_NE(other_mesh->GetMetadata(), nullptr); + ASSERT_EQ(other_mesh->GetMetadata()->attribute_metadatas().size(), 1); + ASSERT_EQ(other_mesh->GetMetadata()->num_entries(), 0); + ASSERT_NE(other_mesh->GetMetadata()->GetAttributeMetadataByUniqueId( + tang_att_ptr->unique_id()), + nullptr); + ASSERT_TRUE(draco::MeshUtils::HasAutoGeneratedTangents(*other_mesh)); + + // Now add some entries to the geometry metadata and merge again. + mesh->metadata()->AddEntryInt("test_int_0", 0); + mesh->metadata()->AddEntryInt("test_int_1", 1); + mesh->metadata()->AddEntryInt("test_int_shared", 2); + other_mesh->metadata()->AddEntryInt("test_int_shared", 3); + + // "test_int_0" and "test_int_1" should be copied over while + // "test_entry_shared" should stay unchanged. + draco::MeshUtils::MergeMetadata(*mesh, other_mesh.get()); + ASSERT_NE(other_mesh->GetMetadata(), nullptr); + // Attribute metadata should stay unchanged. + ASSERT_EQ(other_mesh->GetMetadata()->attribute_metadatas().size(), 1); + ASSERT_NE(other_mesh->GetMetadata()->GetAttributeMetadataByUniqueId( + tang_att_ptr->unique_id()), + nullptr); + ASSERT_EQ(other_mesh->GetMetadata() + ->GetAttributeMetadataByUniqueId(tang_att_ptr->unique_id()) + ->num_entries(), + 1); + + // Check the geometry metadata entries. + ASSERT_EQ(other_mesh->GetMetadata()->num_entries(), 3); + int metadata_value; + ASSERT_TRUE( + other_mesh->GetMetadata()->GetEntryInt("test_int_0", &metadata_value)); + ASSERT_EQ(metadata_value, 0); + ASSERT_TRUE( + other_mesh->GetMetadata()->GetEntryInt("test_int_1", &metadata_value)); + ASSERT_EQ(metadata_value, 1); + + // The shared entry should have an unchanged value. + ASSERT_TRUE(other_mesh->GetMetadata()->GetEntryInt("test_int_shared", + &metadata_value)); + ASSERT_EQ(metadata_value, 3); +} + +TEST(MeshUtilsTest, RemoveUnusedMeshFeatures) { + // Test verifies that MeshUtils::RemoveUnusedMeshFeatures works as intended. + std::unique_ptr mesh = + draco::ReadMeshFromTestFile("BoxesMeta/glTF/BoxesMeta.gltf"); + ASSERT_NE(mesh, nullptr); + + // The input mesh should have five mesh features and two features textures. + ASSERT_EQ(mesh->NumMeshFeatures(), 5); + ASSERT_EQ(mesh->GetNonMaterialTextureLibrary().NumTextures(), 2); + + // All of those features and textures should be used so calling the method + // below shouldn't do anything. + draco::MeshUtils::RemoveUnusedMeshFeatures(mesh.get()); + ASSERT_EQ(mesh->NumMeshFeatures(), 5); + ASSERT_EQ(mesh->GetNonMaterialTextureLibrary().NumTextures(), 2); + + // Now remove material 1 that is mapped to first two mesh features. + draco::PointAttribute *mat_att = mesh->attribute( + mesh->GetNamedAttributeId(draco::GeometryAttribute::MATERIAL)); + + // This basically remaps all faces from material 1 to material 0. + uint32_t mat_index = 0; + mat_att->SetAttributeValue(draco::AttributeValueIndex(1), &mat_index); + + // Try to remove the mesh features again. + draco::MeshUtils::RemoveUnusedMeshFeatures(mesh.get()); + + // Three of the mesh features should have been removed as well as one mesh + // features texture. + ASSERT_EQ(mesh->NumMeshFeatures(), 2); + ASSERT_EQ(mesh->GetNonMaterialTextureLibrary().NumTextures(), 1); + + // Ensure the remaining mesh features are mapped to the correct material. + for (draco::MeshFeaturesIndex mfi(0); mfi < mesh->NumMeshFeatures(); ++mfi) { + ASSERT_EQ(mesh->NumMeshFeaturesMaterialMasks(mfi), 1); + ASSERT_EQ(mesh->GetMeshFeaturesMaterialMask(mfi, 0), 0); + } +} + +} // namespace + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.cc b/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.cc index 60b0c50b8..2af94a052 100644 --- a/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.cc +++ b/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.cc @@ -23,11 +23,23 @@ void TriangleSoupMeshBuilder::Start(int num_faces) { attribute_element_types_.clear(); } +#ifdef DRACO_TRANSCODER_SUPPORTED +void TriangleSoupMeshBuilder::SetName(const std::string &name) { + mesh_->SetName(name); +} +#endif // DRACO_TRANSCODER_SUPPORTED + int TriangleSoupMeshBuilder::AddAttribute( GeometryAttribute::Type attribute_type, int8_t num_components, DataType data_type) { + return AddAttribute(attribute_type, num_components, data_type, false); +} + +int TriangleSoupMeshBuilder::AddAttribute( + GeometryAttribute::Type attribute_type, int8_t num_components, + DataType data_type, bool normalized) { GeometryAttribute va; - va.Init(attribute_type, nullptr, num_components, data_type, false, + va.Init(attribute_type, nullptr, num_components, data_type, normalized, DataTypeLength(data_type) * num_components, 0); attribute_element_types_.push_back(-1); return mesh_->AddAttribute(va, true, mesh_->num_points()); @@ -41,8 +53,6 @@ void TriangleSoupMeshBuilder::SetAttributeValuesForFace( att->SetAttributeValue(AttributeValueIndex(start_index), corner_value_0); att->SetAttributeValue(AttributeValueIndex(start_index + 1), corner_value_1); att->SetAttributeValue(AttributeValueIndex(start_index + 2), corner_value_2); - // TODO(ostava): The below code should be called only for one attribute. - // It will work OK even for multiple attributes, but it's redundant. mesh_->SetFace(face_id, {{PointIndex(start_index), PointIndex(start_index + 1), PointIndex(start_index + 2)}}); diff --git a/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.h b/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.h index 89466e1d8..503fe84c5 100644 --- a/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.h +++ b/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder.h @@ -15,7 +15,14 @@ #ifndef DRACO_MESH_TRIANGLE_SOUP_MESH_BUILDER_H_ #define DRACO_MESH_TRIANGLE_SOUP_MESH_BUILDER_H_ +#include +#include + #include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/status.h" +#endif #include "draco/mesh/mesh.h" namespace draco { @@ -25,15 +32,25 @@ namespace draco { // deduplicated. class TriangleSoupMeshBuilder { public: + // Index type of the inserted element. + typedef FaceIndex ElementIndex; + // Starts mesh building for a given number of faces. // TODO(ostava): Currently it's necessary to select the correct number of // faces upfront. This should be generalized, but it will require us to // rewrite our attribute resizing functions. void Start(int num_faces); +#ifdef DRACO_TRANSCODER_SUPPORTED + // Sets mesh name. + void SetName(const std::string &name); +#endif // DRACO_TRANSCODER_SUPPORTED + // Adds an empty attribute to the mesh. Returns the new attribute's id. int AddAttribute(GeometryAttribute::Type attribute_type, int8_t num_components, DataType data_type); + int AddAttribute(GeometryAttribute::Type attribute_type, + int8_t num_components, DataType data_type, bool normalized); // Sets values for a given attribute on all corners of a given face. void SetAttributeValuesForFace(int att_id, FaceIndex face_id, @@ -41,12 +58,34 @@ class TriangleSoupMeshBuilder { const void *corner_value_1, const void *corner_value_2); +#ifdef DRACO_TRANSCODER_SUPPORTED + // Converts input values of type T into internal representation used by + // |att_id|. Each input value needs to have |input_num_components| entries. + template + Status ConvertAndSetAttributeValuesForFace(int att_id, FaceIndex face_id, + int input_num_components, + const T *corner_value_0, + const T *corner_value_1, + const T *corner_value_2); +#endif + // Sets value for a per-face attribute. If all faces of a given attribute are // set with this method, the attribute will be marked as per-face, otherwise // it will be marked as per-corner attribute. void SetPerFaceAttributeValueForFace(int att_id, FaceIndex face_id, const void *value); + // Add metadata. + void AddMetadata(std::unique_ptr metadata) { + mesh_->AddMetadata(std::move(metadata)); + } + + // Add metadata for an attribute. + void AddAttributeMetadata(int32_t att_id, + std::unique_ptr metadata) { + mesh_->AddAttributeMetadata(att_id, std::move(metadata)); + } + // Finalizes the mesh or returns nullptr on error. // Once this function is called, the builder becomes invalid and cannot be // used until the method Start() is called again. @@ -58,6 +97,30 @@ class TriangleSoupMeshBuilder { std::unique_ptr mesh_; }; +#ifdef DRACO_TRANSCODER_SUPPORTED +template +Status TriangleSoupMeshBuilder::ConvertAndSetAttributeValuesForFace( + int att_id, FaceIndex face_id, int input_num_components, + const T *corner_value_0, const T *corner_value_1, const T *corner_value_2) { + const int start_index = 3 * face_id.value(); + PointAttribute *const att = mesh_->attribute(att_id); + DRACO_RETURN_IF_ERROR( + att->ConvertAndSetAttributeValue(AttributeValueIndex(start_index + 0), + input_num_components, corner_value_0)); + DRACO_RETURN_IF_ERROR( + att->ConvertAndSetAttributeValue(AttributeValueIndex(start_index + 1), + input_num_components, corner_value_1)); + DRACO_RETURN_IF_ERROR( + att->ConvertAndSetAttributeValue(AttributeValueIndex(start_index + 2), + input_num_components, corner_value_2)); + mesh_->SetFace(face_id, + {{PointIndex(start_index), PointIndex(start_index + 1), + PointIndex(start_index + 2)}}); + attribute_element_types_[att_id] = MESH_CORNER_ATTRIBUTE; + return OkStatus(); +} +#endif // DRACO_TRANSCODER_SUPPORTED + } // namespace draco #endif // DRACO_MESH_TRIANGLE_SOUP_MESH_BUILDER_H_ diff --git a/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder_test.cc b/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder_test.cc index 171f8fe24..b23641760 100644 --- a/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder_test.cc +++ b/contrib/draco/src/draco/mesh/triangle_soup_mesh_builder_test.cc @@ -14,7 +14,11 @@ // #include "draco/mesh/triangle_soup_mesh_builder.h" +#include +#include + #include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" #include "draco/core/vector_d.h" namespace draco { @@ -26,6 +30,9 @@ TEST_F(TriangleSoupMeshBuilderTest, CubeTest) { // of the provided triangle soup data. TriangleSoupMeshBuilder mb; mb.Start(12); +#ifdef DRACO_TRANSCODER_SUPPORTED + mb.SetName("Cube"); +#endif const int pos_att_id = mb.AddAttribute(GeometryAttribute::POSITION, 3, DT_FLOAT32); // clang-format off @@ -92,6 +99,9 @@ TEST_F(TriangleSoupMeshBuilderTest, CubeTest) { std::unique_ptr mesh = mb.Finalize(); ASSERT_NE(mesh, nullptr) << "Failed to build the cube mesh."; +#ifdef DRACO_TRANSCODER_SUPPORTED + EXPECT_EQ(mesh->GetName(), "Cube"); +#endif EXPECT_EQ(mesh->num_points(), 8) << "Unexpected number of vertices."; EXPECT_EQ(mesh->num_faces(), 12) << "Unexpected number of faces."; } @@ -139,7 +149,7 @@ TEST_F(TriangleSoupMeshBuilderTest, TestPerFaceAttribs) { Vector3f(0.f, 1.f, 0.f).data(), Vector3f(1.f, 1.f, 0.f).data(), Vector3f(0.f, 1.f, 1.f).data()); - mb.SetPerFaceAttributeValueForFace(gen_att_id, FaceIndex(4), &bool_false);; + mb.SetPerFaceAttributeValueForFace(gen_att_id, FaceIndex(4), &bool_false); mb.SetAttributeValuesForFace(pos_att_id, FaceIndex(5), Vector3f(0.f, 1.f, 1.f).data(), @@ -189,9 +199,69 @@ TEST_F(TriangleSoupMeshBuilderTest, TestPerFaceAttribs) { std::unique_ptr mesh = mb.Finalize(); ASSERT_NE(mesh, nullptr) << "Failed to build the cube mesh."; +#ifdef DRACO_TRANSCODER_SUPPORTED + EXPECT_TRUE(mesh->GetName().empty()); +#endif EXPECT_EQ(mesh->num_faces(), 12) << "Unexpected number of faces."; EXPECT_EQ(mesh->GetAttributeElementType(gen_att_id), MESH_FACE_ATTRIBUTE) << "Unexpected attribute element type."; } +#ifdef DRACO_TRANSCODER_SUPPORTED +TEST_F(TriangleSoupMeshBuilderTest, NormalizedColor) { + // This tests, verifies that the mesh builder constructs a valid model with + // normalized integer colors using floating points as input. + TriangleSoupMeshBuilder mb; + mb.Start(2); + const int pos_att_id = + mb.AddAttribute(GeometryAttribute::POSITION, 3, DT_FLOAT32); + const int color_att_id = + mb.AddAttribute(GeometryAttribute::COLOR, 3, DT_UINT8, true); + + mb.SetAttributeValuesForFace( + pos_att_id, FaceIndex(0), Vector3f(0.f, 0.f, 0.f).data(), + Vector3f(1.f, 0.f, 0.f).data(), Vector3f(0.f, 1.f, 0.f).data()); + DRACO_ASSERT_OK(mb.ConvertAndSetAttributeValuesForFace( + color_att_id, FaceIndex(0), 4, Vector4f(0.f, 0.f, 0.f, 1.f).data(), + Vector4f(1.f, 1.f, 1.f, 1.f).data(), + Vector4f(0.5f, 0.5f, 0.5f, 1.f).data())); + mb.SetAttributeValuesForFace( + pos_att_id, FaceIndex(1), Vector3f(0.f, 1.f, 0.f).data(), + Vector3f(1.f, 0.f, 0.f).data(), Vector3f(1.f, 1.f, 0.f).data()); + + DRACO_ASSERT_OK(mb.ConvertAndSetAttributeValuesForFace( + color_att_id, FaceIndex(1), 4, Vector4f(0.5f, 0.5f, 0.5f, 1.f).data(), + Vector4f(1.f, 1.f, 1.f, 1.f).data(), + Vector4f(0.25f, 0.0f, 1.f, 1.f).data())); + + std::unique_ptr mesh = mb.Finalize(); + ASSERT_NE(mesh, nullptr) << "Failed to build the test mesh."; + + EXPECT_EQ(mesh->num_points(), 4) << "Unexpected number of vertices."; + EXPECT_EQ(mesh->num_faces(), 2) << "Unexpected number of faces."; + + const auto *col_att = + mesh->GetNamedAttribute(draco::GeometryAttribute::COLOR); + ASSERT_NE(col_att, nullptr) << "Missing color attribute."; + ASSERT_EQ(col_att->size(), 4); + + // All colors should be in range 0-255. + uint8_t max_val = 0, min_val = 255; + for (draco::AttributeValueIndex avi(0); avi < col_att->size(); ++avi) { + VectorD cval; + col_att->GetValue(avi, &cval); + const uint8_t max = cval.MaxCoeff(); + const uint8_t min = cval.MinCoeff(); + if (max > max_val) { + max_val = max; + } + if (min < min_val) { + min_val = min; + } + } + ASSERT_EQ(max_val, 255); + ASSERT_EQ(min_val, 0); +} +#endif + } // namespace draco diff --git a/contrib/draco/src/draco/metadata/geometry_metadata.cc b/contrib/draco/src/draco/metadata/geometry_metadata.cc index b83898140..b6a882c0b 100644 --- a/contrib/draco/src/draco/metadata/geometry_metadata.cc +++ b/contrib/draco/src/draco/metadata/geometry_metadata.cc @@ -18,6 +18,19 @@ namespace draco { +AttributeMetadata::AttributeMetadata(const AttributeMetadata &metadata) + : Metadata(metadata) { + att_unique_id_ = metadata.att_unique_id_; +} + +GeometryMetadata::GeometryMetadata(const GeometryMetadata &metadata) + : Metadata(metadata) { + for (size_t i = 0; i < metadata.att_metadatas_.size(); ++i) { + att_metadatas_.push_back(std::unique_ptr( + new AttributeMetadata(*metadata.att_metadatas_[i]))); + } +} + const AttributeMetadata *GeometryMetadata::GetAttributeMetadataByStringEntry( const std::string &entry_name, const std::string &entry_value) const { for (auto &&att_metadata : att_metadatas_) { @@ -35,7 +48,7 @@ const AttributeMetadata *GeometryMetadata::GetAttributeMetadataByStringEntry( bool GeometryMetadata::AddAttributeMetadata( std::unique_ptr att_metadata) { - if (!att_metadata.get()) { + if (!att_metadata) { return false; } att_metadatas_.push_back(std::move(att_metadata)); diff --git a/contrib/draco/src/draco/metadata/geometry_metadata.h b/contrib/draco/src/draco/metadata/geometry_metadata.h index ec7ecb9ee..531bdef25 100644 --- a/contrib/draco/src/draco/metadata/geometry_metadata.h +++ b/contrib/draco/src/draco/metadata/geometry_metadata.h @@ -25,6 +25,7 @@ namespace draco { class AttributeMetadata : public Metadata { public: AttributeMetadata() : att_unique_id_(0) {} + AttributeMetadata(const AttributeMetadata &metadata); explicit AttributeMetadata(const Metadata &metadata) : Metadata(metadata), att_unique_id_(0) {} @@ -57,6 +58,7 @@ struct AttributeMetadataHasher { class GeometryMetadata : public Metadata { public: GeometryMetadata() {} + GeometryMetadata(const GeometryMetadata &metadata); explicit GeometryMetadata(const Metadata &metadata) : Metadata(metadata) {} const AttributeMetadata *GetAttributeMetadataByStringEntry( diff --git a/contrib/draco/src/draco/metadata/metadata.cc b/contrib/draco/src/draco/metadata/metadata.cc index 9141907ed..51b4e93a3 100644 --- a/contrib/draco/src/draco/metadata/metadata.cc +++ b/contrib/draco/src/draco/metadata/metadata.cc @@ -122,6 +122,14 @@ const Metadata *Metadata::GetSubMetadata(const std::string &name) const { return sub_ptr->second.get(); } +Metadata *Metadata::sub_metadata(const std::string &name) { + auto sub_ptr = sub_metadatas_.find(name); + if (sub_ptr == sub_metadatas_.end()) { + return nullptr; + } + return sub_ptr->second.get(); +} + void Metadata::RemoveEntry(const std::string &name) { // Actually just remove "name", no need to check if it exists. auto entry_ptr = entries_.find(name); diff --git a/contrib/draco/src/draco/metadata/metadata.h b/contrib/draco/src/draco/metadata/metadata.h index 56d05e46a..12c1ba974 100644 --- a/contrib/draco/src/draco/metadata/metadata.h +++ b/contrib/draco/src/draco/metadata/metadata.h @@ -147,6 +147,7 @@ class Metadata { bool AddSubMetadata(const std::string &name, std::unique_ptr sub_metadata); const Metadata *GetSubMetadata(const std::string &name) const; + Metadata *sub_metadata(const std::string &name); void RemoveEntry(const std::string &name); diff --git a/contrib/draco/src/draco/metadata/metadata_decoder.cc b/contrib/draco/src/draco/metadata/metadata_decoder.cc index a8e66f854..6468e3207 100644 --- a/contrib/draco/src/draco/metadata/metadata_decoder.cc +++ b/contrib/draco/src/draco/metadata/metadata_decoder.cc @@ -59,18 +59,25 @@ bool MetadataDecoder::DecodeGeometryMetadata(DecoderBuffer *in_buffer, } bool MetadataDecoder::DecodeMetadata(Metadata *metadata) { - struct MetadataPair { + // Limit metadata nesting depth to avoid stack overflow in destructor. + constexpr int kMaxSubmetadataLevel = 1000; + + struct MetadataTuple { Metadata *parent_metadata; Metadata *decoded_metadata; + int level; }; - std::vector metadata_stack; - metadata_stack.push_back({nullptr, metadata}); + std::vector metadata_stack; + metadata_stack.push_back({nullptr, metadata, 0}); while (!metadata_stack.empty()) { - const MetadataPair mp = metadata_stack.back(); + const MetadataTuple mp = metadata_stack.back(); metadata_stack.pop_back(); metadata = mp.decoded_metadata; if (mp.parent_metadata != nullptr) { + if (mp.level > kMaxSubmetadataLevel) { + return false; + } std::string sub_metadata_name; if (!DecodeName(&sub_metadata_name)) { return false; @@ -105,7 +112,8 @@ bool MetadataDecoder::DecodeMetadata(Metadata *metadata) { return false; } for (uint32_t i = 0; i < num_sub_metadata; ++i) { - metadata_stack.push_back({metadata, nullptr}); + metadata_stack.push_back( + {metadata, nullptr, mp.parent_metadata ? mp.level + 1 : mp.level}); } } return true; @@ -123,6 +131,9 @@ bool MetadataDecoder::DecodeEntry(Metadata *metadata) { if (data_size == 0) { return false; } + if (data_size > buffer_->remaining_size()) { + return false; + } std::vector entry_value(data_size); if (!buffer_->Decode(&entry_value[0], data_size)) { return false; diff --git a/contrib/draco/src/draco/metadata/metadata_test.cc b/contrib/draco/src/draco/metadata/metadata_test.cc index cf7ae6eee..03104e03e 100644 --- a/contrib/draco/src/draco/metadata/metadata_test.cc +++ b/contrib/draco/src/draco/metadata/metadata_test.cc @@ -104,12 +104,16 @@ TEST_F(MetadataTest, TestNestedMetadata) { sub_metadata->AddEntryInt("int", 100); metadata.AddSubMetadata("sub0", std::move(sub_metadata)); - const auto sub_metadata_ptr = metadata.GetSubMetadata("sub0"); + const auto sub_metadata_ptr = metadata.sub_metadata("sub0"); ASSERT_NE(sub_metadata_ptr, nullptr); int32_t int_value = 0; ASSERT_TRUE(sub_metadata_ptr->GetEntryInt("int", &int_value)); ASSERT_EQ(int_value, 100); + + sub_metadata_ptr->AddEntryInt("new_entry", 20); + ASSERT_TRUE(sub_metadata_ptr->GetEntryInt("new_entry", &int_value)); + ASSERT_EQ(int_value, 20); } TEST_F(MetadataTest, TestHardCopyMetadata) { diff --git a/contrib/draco/src/draco/metadata/property_table.cc b/contrib/draco/src/draco/metadata/property_table.cc new file mode 100644 index 000000000..c6a5fd984 --- /dev/null +++ b/contrib/draco/src/draco/metadata/property_table.cc @@ -0,0 +1,183 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/metadata/property_table.h" + +#include +#include +#include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +bool PropertyTable::Schema::Object::operator==(const Object& other) const { + if (type_ != other.type_ || name_ != other.name_) { + return false; + } + switch (type_) { + case OBJECT: + if (objects_.size() != other.objects_.size()) { + return false; + } + for (int i = 0; i < objects_.size(); ++i) { + if (objects_[i] != other.objects_[i]) { + return false; + } + } + break; + case ARRAY: + if (array_.size() != other.array_.size()) { + return false; + } + for (int i = 0; i < array_.size(); ++i) { + if (array_[i] != other.array_[i]) { + return false; + } + } + break; + case STRING: + return string_ == other.string_; + case INTEGER: + return integer_ == other.integer_; + case BOOLEAN: + return boolean_ == other.boolean_; + } + return true; +} + +void PropertyTable::Schema::Object::Copy(const Object& src) { + name_ = src.name_; + type_ = src.type_; + objects_.reserve(src.objects_.size()); + for (const Object& obj : src.objects_) { + objects_.emplace_back(); + objects_.back().Copy(obj); + } + array_.reserve(src.array_.size()); + for (const Object& obj : src.array_) { + array_.emplace_back(); + array_.back().Copy(obj); + } + string_ = src.string_; + integer_ = src.integer_; + boolean_ = src.boolean_; +} + +PropertyTable::Property::Property() {} + +bool PropertyTable::Property::Data::operator==(const Data& other) const { + return data == other.data && target == other.target; +} + +bool PropertyTable::Property::Offsets::operator==(const Offsets& other) const { + return data == other.data && type == other.type; +} + +bool PropertyTable::Property::operator==(const Property& other) const { + return name_ == other.name_ && data_ == other.data_ && + array_offsets_ == other.array_offsets_ && + string_offsets_ == other.string_offsets_; +} + +void PropertyTable::Property::Copy(const Property& src) { + name_ = src.name_; + data_ = src.data_; + array_offsets_ = src.array_offsets_; + string_offsets_ = src.string_offsets_; +} + +void PropertyTable::Property::SetName(const std::string& name) { name_ = name; } +const std::string& PropertyTable::Property::GetName() const { return name_; } + +PropertyTable::Property::Data& PropertyTable::Property::GetData() { + return data_; +} +const PropertyTable::Property::Data& PropertyTable::Property::GetData() const { + return data_; +} + +const PropertyTable::Property::Offsets& +PropertyTable::Property::GetArrayOffsets() const { + return array_offsets_; +} +PropertyTable::Property::Offsets& PropertyTable::Property::GetArrayOffsets() { + return array_offsets_; +} + +const PropertyTable::Property::Offsets& +PropertyTable::Property::GetStringOffsets() const { + return string_offsets_; +} +PropertyTable::Property::Offsets& PropertyTable::Property::GetStringOffsets() { + return string_offsets_; +} + +PropertyTable::PropertyTable() : count_(0) {} + +bool PropertyTable::operator==(const PropertyTable& other) const { + if (name_ != other.name_ || class_ != other.class_ || + count_ != other.count_ || + properties_.size() != other.properties_.size()) { + return false; + } + for (int i = 0; i < properties_.size(); ++i) { + if (*properties_[i] != *other.properties_[i]) { + return false; + } + } + return true; +} + +void PropertyTable::Copy(const PropertyTable& src) { + name_ = src.name_; + class_ = src.class_; + count_ = src.count_; + properties_.clear(); + properties_.reserve(src.properties_.size()); + for (int i = 0; i < src.properties_.size(); ++i) { + std::unique_ptr property(new Property()); + property->Copy(src.GetProperty(i)); + properties_.push_back(std::move(property)); + } +} + +void PropertyTable::SetName(const std::string& value) { name_ = value; } +const std::string& PropertyTable::GetName() const { return name_; } + +void PropertyTable::SetClass(const std::string& value) { class_ = value; } +const std::string& PropertyTable::GetClass() const { return class_; } + +void PropertyTable::SetCount(int count) { count_ = count; } +int PropertyTable::GetCount() const { return count_; } + +int PropertyTable::AddProperty(std::unique_ptr property) { + properties_.push_back(std::move(property)); + return properties_.size() - 1; +} +int PropertyTable::NumProperties() const { return properties_.size(); } +const PropertyTable::Property& PropertyTable::GetProperty(int index) const { + return *properties_[index]; +} +PropertyTable::Property& PropertyTable::GetProperty(int index) { + return *properties_[index]; +} +void PropertyTable::RemoveProperty(int index) { + properties_.erase(properties_.begin() + index); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/metadata/property_table.h b/contrib/draco/src/draco/metadata/property_table.h new file mode 100644 index 000000000..41efb0163 --- /dev/null +++ b/contrib/draco/src/draco/metadata/property_table.h @@ -0,0 +1,243 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_METADATA_PROPERTY_TABLE_H_ +#define DRACO_METADATA_PROPERTY_TABLE_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include +#include +#include + +namespace draco { + +// Describes a property table as defined in the EXT_structural_metadata glTF +// extension, including property table schema and table properties (columns). +class PropertyTable { + public: + // Describes property table schema in the form of a JSON object. + struct Schema { + // JSON object of the schema. + // TODO(vytyaz): Consider using a third_party/json library. Currently there + // is a conflict between Filament's assert_invariant() macro and JSON + // library's assert_invariant() method that causes compile errors in Draco + // visualization library. + class Object { + public: + enum Type { OBJECT, ARRAY, STRING, INTEGER, BOOLEAN }; + + // Constructors. + Object() : Object("") {} + explicit Object(const std::string& name) + : name_(name), type_(OBJECT), integer_(0), boolean_(false) {} + Object(const std::string& name, const std::string& value) : Object(name) { + SetString(value); + } + Object(const std::string& name, const char* value) : Object(name) { + SetString(value); + } + Object(const std::string& name, int value) : Object(name) { + SetInteger(value); + } + Object(const std::string& name, bool value) : Object(name) { + SetBoolean(value); + } + + // Methods for comparing two objects. + bool operator==(const Object& other) const; + bool operator!=(const Object& other) const { return !(*this == other); } + + // Method for copying the object. + void Copy(const Object& src); + + // Methods for getting object name and type. + const std::string& GetName() const { return name_; } + Type GetType() const { return type_; } + + // Methods for getting object value. + const std::vector& GetObjects() const { return objects_; } + const std::vector& GetArray() const { return array_; } + const std::string& GetString() const { return string_; } + int GetInteger() const { return integer_; } + bool GetBoolean() const { return boolean_; } + + // Methods for setting object value. + std::vector& SetObjects() { + type_ = OBJECT; + return objects_; + } + std::vector& SetArray() { + type_ = ARRAY; + return array_; + } + void SetString(const std::string& value) { + type_ = STRING; + string_ = value; + } + void SetInteger(int value) { + type_ = INTEGER; + integer_ = value; + } + void SetBoolean(bool value) { + type_ = BOOLEAN; + boolean_ = value; + } + + private: + std::string name_; + Type type_; + std::vector objects_; + std::vector array_; + std::string string_; + int integer_; + bool boolean_; + }; + + // Valid schema top-level JSON object name is "schema". + Schema() : json("schema") {} + + // Methods for comparing two schemas. + bool operator==(const Schema& other) const { return json == other.json; } + bool operator!=(const Schema& other) const { return !(*this == other); } + + // Valid schema top-level JSON object is required to have child objects. + bool Empty() const { return json.GetObjects().empty(); } + + // Top-level JSON object of the schema. + Object json; + }; + + // Describes a property (column) of a property table. + class Property { + public: + // Describes glTF buffer view data. + struct Data { + // Methods for comparing two data objects. + bool operator==(const Data& other) const; + bool operator!=(const Data& other) const { return !(*this == other); } + + // Buffer view data. + std::vector data; + + // Data target corresponds to the target property of the glTF bufferView + // object and classifies the type or nature of the data. + int target = 0; + }; + + // Describes offsets of the entries in property data when the data + // represents an array of strings or an array of variable-length number + // arrays. + struct Offsets { + // Methods for comparing two offsets. + bool operator==(const Offsets& other) const; + bool operator!=(const Offsets& other) const { return !(*this == other); } + + // Data containing the offset entries. + Data data; + + // Data type of the offset entries. + std::string type; + }; + + // Creates an empty property. + Property(); + + // Methods for comparing two properties. + bool operator==(const Property& other) const; + bool operator!=(const Property& other) const { return !(*this == other); } + + // Copies all data from |src| property. + void Copy(const Property& src); + + // Name of this property. + void SetName(const std::string& name); + const std::string& GetName() const; + + // Property data stores one table column worth of data. For example, when + // the data of type UINT8 is [11, 22] then the property values are 11 and 22 + // for the first and second table rows. See EXT_structural_metadata glTF + // extension documentation for more details. + Data& GetData(); + const Data& GetData() const; + + // Array offsets are used when property data contains a variable-length + // number arrays. For example, when the data is [0, 1, 2, 3, 4] and the + // array offsets are [0, 2, 5] for a two-row table, then the property value + // arrays are [0, 1] and [2, 3, 4] for the first and second table rows, + // respectively. See EXT_structural_metadata glTF extension documentation + // for more details. + const Offsets& GetArrayOffsets() const; + Offsets& GetArrayOffsets(); + + // String offsets are used when property data contains strings. For example, + // when the data is "SeaLand" and the array offsets are [0, 3, 7] for a + // two-row table, then the property strings are "Sea" and "Land" for the + // first and second table rows, respectively. See EXT_structural_metadata + // glTF extension documentation for more details. + const Offsets& GetStringOffsets() const; + Offsets& GetStringOffsets(); + + private: + std::string name_; + Data data_; + Offsets array_offsets_; + Offsets string_offsets_; + // TODO(vytyaz): Support property value modifiers min, max, offset, scale. + }; + + // Creates an empty property table. + PropertyTable(); + + // Methods for comparing two property tables. + bool operator==(const PropertyTable& other) const; + bool operator!=(const PropertyTable& other) const { + return !(*this == other); + } + + // Copies all data from |src| property table. + void Copy(const PropertyTable& src); + + // Name of this property table. + void SetName(const std::string& value); + const std::string& GetName() const; + + // Class of this property table. + void SetClass(const std::string& value); + const std::string& GetClass() const; + + // Number of rows in this property table. + void SetCount(int count); + int GetCount() const; + + // Table properties (columns). + int AddProperty(std::unique_ptr property); + int NumProperties() const; + const Property& GetProperty(int index) const; + Property& GetProperty(int index); + void RemoveProperty(int index); + + private: + std::string name_; + std::string class_; + int count_; + std::vector> properties_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_METADATA_PROPERTY_TABLE_H_ diff --git a/contrib/draco/src/draco/metadata/property_table_test.cc b/contrib/draco/src/draco/metadata/property_table_test.cc new file mode 100644 index 000000000..4d5ee2d2c --- /dev/null +++ b/contrib/draco/src/draco/metadata/property_table_test.cc @@ -0,0 +1,624 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/metadata/property_table.h" + +#include +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +TEST(PropertyTableTest, TestPropertyDataDefaults) { + // Test construction of an empty property data. + draco::PropertyTable::Property::Data data; + ASSERT_TRUE(data.data.empty()); + ASSERT_EQ(data.target, 0); +} + +TEST(PropertyTableTest, TestPropertyDefaults) { + // Test construction of an empty property table property. + draco::PropertyTable::Property property; + ASSERT_TRUE(property.GetName().empty()); + ASSERT_TRUE(property.GetData().data.empty()); + { + const auto &offsets = property.GetArrayOffsets(); + ASSERT_TRUE(offsets.type.empty()); + ASSERT_TRUE(offsets.data.data.empty()); + ASSERT_EQ(offsets.data.target, 0); + } + { + const auto &offsets = property.GetStringOffsets(); + ASSERT_TRUE(offsets.type.empty()); + ASSERT_TRUE(offsets.data.data.empty()); + ASSERT_EQ(offsets.data.target, 0); + } +} + +TEST(PropertyTableTest, TestPropertyTableDefaults) { + // Test construction of an empty property table. + draco::PropertyTable table; + ASSERT_TRUE(table.GetName().empty()); + ASSERT_TRUE(table.GetClass().empty()); + ASSERT_EQ(table.GetCount(), 0); + ASSERT_EQ(table.NumProperties(), 0); +} + +TEST(PropertyTableTest, TestSchemaDefaults) { + // Test construction of an empty property table schema. + draco::PropertyTable::Schema schema; + ASSERT_TRUE(schema.Empty()); + ASSERT_EQ(schema.json.GetName(), "schema"); + ASSERT_EQ(schema.json.GetType(), + draco::PropertyTable::Schema::Object::OBJECT); + ASSERT_TRUE(schema.json.GetObjects().empty()); + ASSERT_TRUE(schema.json.GetArray().empty()); + ASSERT_TRUE(schema.json.GetString().empty()); + ASSERT_EQ(schema.json.GetInteger(), 0); + ASSERT_FALSE(schema.json.GetBoolean()); +} + +TEST(PropertyTableTest, TestSchemaObjectDefaultConstructor) { + // Test construction of an empty property table schema object. + draco::PropertyTable::Schema::Object object; + ASSERT_TRUE(object.GetName().empty()); + ASSERT_EQ(object.GetType(), draco::PropertyTable::Schema::Object::OBJECT); + ASSERT_TRUE(object.GetObjects().empty()); + ASSERT_TRUE(object.GetArray().empty()); + ASSERT_TRUE(object.GetString().empty()); + ASSERT_EQ(object.GetInteger(), 0); + ASSERT_FALSE(object.GetBoolean()); +} + +TEST(PropertyTableTest, TestSchemaObjectNamedConstructor) { + // Test construction of a named property table schema object. + draco::PropertyTable::Schema::Object object("Flexible Demeanour"); + ASSERT_EQ(object.GetName(), "Flexible Demeanour"); + ASSERT_EQ(object.GetType(), draco::PropertyTable::Schema::Object::OBJECT); + ASSERT_TRUE(object.GetObjects().empty()); +} + +TEST(PropertyTableTest, TestSchemaObjectStringConstructor) { + // Test construction of property table schema object storing a string. + draco::PropertyTable::Schema::Object object("Flexible Demeanour", "GCU"); + ASSERT_EQ(object.GetName(), "Flexible Demeanour"); + ASSERT_EQ(object.GetType(), draco::PropertyTable::Schema::Object::STRING); + ASSERT_EQ(object.GetString(), "GCU"); +} + +TEST(PropertyTableTest, TestSchemaObjectIntegerConstructor) { + // Test construction of property table schema object storing an integer. + draco::PropertyTable::Schema::Object object("Flexible Demeanour", 12); + ASSERT_EQ(object.GetName(), "Flexible Demeanour"); + ASSERT_EQ(object.GetType(), draco::PropertyTable::Schema::Object::INTEGER); + ASSERT_EQ(object.GetInteger(), 12); +} + +TEST(PropertyTableTest, TestSchemaObjectBooleanConstructor) { + // Test construction of property table schema object storing a boolean. + draco::PropertyTable::Schema::Object object("Flexible Demeanour", true); + ASSERT_EQ(object.GetName(), "Flexible Demeanour"); + ASSERT_EQ(object.GetType(), draco::PropertyTable::Schema::Object::BOOLEAN); + ASSERT_TRUE(object.GetBoolean()); +} + +TEST(PropertyTableTest, TestSchemaObjectSettersAndGetters) { + // Test value setters and getters of property table schema object. + typedef draco::PropertyTable::Schema::Object Object; + Object object; + ASSERT_EQ(object.GetType(), Object::OBJECT); + + object.SetArray().push_back(Object("entry", 12)); + ASSERT_EQ(object.GetType(), Object::ARRAY); + ASSERT_EQ(object.GetArray().size(), 1); + ASSERT_EQ(object.GetArray()[0].GetName(), "entry"); + ASSERT_EQ(object.GetArray()[0].GetInteger(), 12); + + object.SetObjects().push_back(Object("object", 9)); + ASSERT_EQ(object.GetType(), Object::OBJECT); + ASSERT_EQ(object.GetObjects().size(), 1); + ASSERT_EQ(object.GetObjects()[0].GetName(), "object"); + ASSERT_EQ(object.GetObjects()[0].GetInteger(), 9); + + object.SetString("matter"); + ASSERT_EQ(object.GetType(), Object::STRING); + ASSERT_EQ(object.GetString(), "matter"); + + object.SetInteger(5); + ASSERT_EQ(object.GetType(), Object::INTEGER); + ASSERT_EQ(object.GetInteger(), 5); + + object.SetBoolean(true); + ASSERT_EQ(object.GetType(), Object::BOOLEAN); + ASSERT_EQ(object.GetBoolean(), true); +} + +TEST(PropertyTableTest, TestSchemaCompare) { + typedef draco::PropertyTable::Schema Schema; + // Test comparison of two schema objects. + { + // Compare the same empty schema object. + Schema a; + ASSERT_TRUE(a == a); + ASSERT_FALSE(a != a); + } + { + // Compare two empty schema objects. + Schema a; + Schema b; + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two schema objects with different JSON objects. + Schema a; + Schema b; + a.json.SetBoolean(true); + b.json.SetBoolean(false); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } +} + +TEST(PropertyTableTest, TestSchemaObjectCompare) { + // Test comparison of two schema JSON objects. + typedef draco::PropertyTable::Schema::Object Object; + { + // Compare the same object. + Object a; + ASSERT_TRUE(a == a); + ASSERT_FALSE(a != a); + } + { + // Compare two default objects. + Object a; + Object b; + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two objects with different names. + Object a("one"); + Object b("two"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two objects with different types. + Object a; + Object b; + a.SetInteger(1); + b.SetString("one"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two identical string-type objects. + Object a; + Object b; + a.SetString("one"); + b.SetString("one"); + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two different string-type objects. + Object a; + Object b; + a.SetString("one"); + b.SetString("two"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two identical integer-type objects. + Object a; + Object b; + a.SetInteger(1); + b.SetInteger(1); + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two different integer-type objects. + Object a; + Object b; + a.SetInteger(1); + b.SetInteger(2); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two identical boolean-type objects. + Object a; + Object b; + a.SetBoolean(true); + b.SetBoolean(true); + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two different boolean-type objects. + Object a; + Object b; + a.SetBoolean(true); + b.SetBoolean(false); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two identical object-type objects. + Object a; + Object b; + a.SetObjects().emplace_back("one"); + b.SetObjects().emplace_back("one"); + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two different object-type objects. + Object a; + Object b; + a.SetObjects().emplace_back("one"); + b.SetObjects().emplace_back("two"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two object-type objects with different counts. + Object a; + Object b; + a.SetObjects().emplace_back("one"); + b.SetObjects().emplace_back("one"); + b.SetObjects().emplace_back("two"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two identical array-type objects. + Object a; + Object b; + a.SetArray().emplace_back("", 1); + b.SetArray().emplace_back("", 1); + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two different array-type objects. + Object a; + Object b; + a.SetArray().emplace_back("", 1); + b.SetArray().emplace_back("", 2); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two array-type objects with different counts. + Object a; + Object b; + a.SetArray().emplace_back("", 1); + b.SetArray().emplace_back("", 1); + b.SetArray().emplace_back("", 2); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } +} + +TEST(PropertyTableTest, TestPropertySettersAndGetters) { + // Test setter and getter methods of the property table property. + draco::PropertyTable::Property property; + property.SetName("Unfortunate Conflict Of Evidence"); + property.GetData().data.push_back(2); + + // Check that property members can be accessed via getters. + ASSERT_EQ(property.GetName(), "Unfortunate Conflict Of Evidence"); + ASSERT_EQ(property.GetData().data.size(), 1); + ASSERT_EQ(property.GetData().data[0], 2); +} + +TEST(PropertyTableTest, TestPropertyTableSettersAndGetters) { + // Test setter and getter methods of the property table. + draco::PropertyTable table; + table.SetName("Just Read The Instructions"); + table.SetClass("General Contact Unit"); + table.SetCount(456); + { + std::unique_ptr property( + new draco::PropertyTable::Property()); + property->SetName("Determinist"); + ASSERT_EQ(table.AddProperty(std::move(property)), 0); + } + { + std::unique_ptr property( + new draco::PropertyTable::Property()); + property->SetName("Revisionist"); + ASSERT_EQ(table.AddProperty(std::move(property)), 1); + } + + // Check that property table members can be accessed via getters. + ASSERT_EQ(table.GetName(), "Just Read The Instructions"); + ASSERT_EQ(table.GetClass(), "General Contact Unit"); + ASSERT_EQ(table.GetCount(), 456); + ASSERT_EQ(table.NumProperties(), 2); + ASSERT_EQ(table.GetProperty(0).GetName(), "Determinist"); + ASSERT_EQ(table.GetProperty(1).GetName(), "Revisionist"); + + // Check that proeprties can be removed. + table.RemoveProperty(0); + ASSERT_EQ(table.NumProperties(), 1); + ASSERT_EQ(table.GetProperty(0).GetName(), "Revisionist"); + table.RemoveProperty(0); + ASSERT_EQ(table.NumProperties(), 0); +} + +TEST(PropertyTableTest, TestPropertyCopy) { + // Test that property table property can be copied. + draco::PropertyTable::Property property; + property.SetName("Unfortunate Conflict Of Evidence"); + property.GetData().data.push_back(2); + + // Make a copy. + draco::PropertyTable::Property copy; + copy.Copy(property); + + // Check the copy. + ASSERT_EQ(copy.GetName(), "Unfortunate Conflict Of Evidence"); + ASSERT_EQ(copy.GetData().data.size(), 1); + ASSERT_EQ(copy.GetData().data[0], 2); +} + +TEST(PropertyTableTest, TestPropertyTableCopy) { + // Test that property table can be copied. + draco::PropertyTable table; + table.SetName("Just Read The Instructions"); + table.SetClass("General Contact Unit"); + table.SetCount(456); + { + std::unique_ptr property( + new draco::PropertyTable::Property()); + property->SetName("Determinist"); + table.AddProperty(std::move(property)); + } + { + std::unique_ptr property( + new draco::PropertyTable::Property()); + property->SetName("Revisionist"); + table.AddProperty(std::move(property)); + } + + // Make a copy. + draco::PropertyTable copy; + copy.Copy(table); + + // Check the copy. + ASSERT_EQ(copy.GetName(), "Just Read The Instructions"); + ASSERT_EQ(copy.GetClass(), "General Contact Unit"); + ASSERT_EQ(copy.GetCount(), 456); + ASSERT_EQ(copy.NumProperties(), 2); + ASSERT_EQ(copy.GetProperty(0).GetName(), "Determinist"); + ASSERT_EQ(copy.GetProperty(1).GetName(), "Revisionist"); +} + +TEST(PropertyTableTest, TestPropertyDataCompare) { + // Test comparison of two property data objects. + typedef draco::PropertyTable::Property::Data Data; + { + // Compare the same data object. + Data a; + ASSERT_TRUE(a == a); + ASSERT_FALSE(a != a); + } + { + // Compare two default data objects. + Data a; + Data b; + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two data objects with different targets. + Data a; + Data b; + a.target = 1; + b.target = 2; + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two data objects with different data vectors. + Data a; + Data b; + a.data = {1}; + a.data = {2}; + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } +} + +TEST(PropertyTableTest, TestPropertyOffsets) { + // Test comparison of two property offsets. + typedef draco::PropertyTable::Property::Offsets Offsets; + { + // Compare the same offsets object. + Offsets a; + ASSERT_TRUE(a == a); + ASSERT_FALSE(a != a); + } + { + // Compare two default offsets objects. + Offsets a; + Offsets b; + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two offsets objects with different types. + Offsets a; + Offsets b; + a.type = 1; + b.type = 2; + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two offsets objects with different data objects. + Offsets a; + Offsets b; + a.data.target = 1; + b.data.target = 2; + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } +} + +TEST(PropertyTableTest, TestPropertyCompare) { + // Test comparison of two properties. + typedef draco::PropertyTable::Property Property; + { + // Compare the same property object. + Property a; + ASSERT_TRUE(a == a); + ASSERT_FALSE(a != a); + } + { + // Compare two default property objects. + Property a; + Property b; + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two property objects with different names. + Property a; + Property b; + a.SetName("one"); + b.SetName("two"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two property objects with different data. + Property a; + Property b; + a.GetData().target = 1; + b.GetData().target = 2; + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two property objects with different array offsets. + Property a; + Property b; + a.GetArrayOffsets().data.target = 1; + b.GetArrayOffsets().data.target = 2; + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two property objects with different string offsets. + Property a; + Property b; + a.GetStringOffsets().data.target = 1; + b.GetStringOffsets().data.target = 2; + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } +} + +TEST(PropertyTableTest, TestPropertyTableCompare) { + // Test comparison of two property tables. + typedef draco::PropertyTable PropertyTable; + typedef draco::PropertyTable::Property Property; + { + // Compare the same property table object. + PropertyTable a; + ASSERT_TRUE(a == a); + ASSERT_FALSE(a != a); + } + { + // Compare two default property tables. + PropertyTable a; + PropertyTable b; + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two property tables with different names. + PropertyTable a; + PropertyTable b; + a.SetName("one"); + b.SetName("two"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two property tables with different classes. + PropertyTable a; + PropertyTable b; + a.SetClass("one"); + b.SetClass("two"); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two property tables with different counts. + PropertyTable a; + PropertyTable b; + a.SetCount(1); + b.SetCount(2); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two property tables with identical properties. + PropertyTable a; + PropertyTable b; + a.AddProperty(std::unique_ptr(new Property)); + b.AddProperty(std::unique_ptr(new Property)); + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two property tables with different number of properties. + PropertyTable a; + PropertyTable b; + a.AddProperty(std::unique_ptr(new Property)); + b.AddProperty(std::unique_ptr(new Property)); + b.AddProperty(std::unique_ptr(new Property)); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two property tables with different properties. + PropertyTable a; + PropertyTable b; + std::unique_ptr p1(new Property); + std::unique_ptr p2(new Property); + p1->SetName("one"); + p2->SetName("two"); + a.AddProperty(std::move(p1)); + b.AddProperty(std::move(p2)); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/metadata/structural_metadata.cc b/contrib/draco/src/draco/metadata/structural_metadata.cc new file mode 100644 index 000000000..48fff2b25 --- /dev/null +++ b/contrib/draco/src/draco/metadata/structural_metadata.cc @@ -0,0 +1,74 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/metadata/structural_metadata.h" + +#include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +StructuralMetadata::StructuralMetadata() {} + +bool StructuralMetadata::operator==(const StructuralMetadata &other) const { + return property_table_schema_ == other.property_table_schema_ && + property_tables_ == other.property_tables_; +} + +void StructuralMetadata::Copy(const StructuralMetadata &src) { + property_table_schema_.json.Copy(src.property_table_schema_.json); + property_tables_.resize(src.property_tables_.size()); + for (int i = 0; i < property_tables_.size(); ++i) { + property_tables_[i] = std::unique_ptr(new PropertyTable()); + property_tables_[i]->Copy(*src.property_tables_[i]); + } +} + +void StructuralMetadata::SetPropertyTableSchema( + const PropertyTable::Schema &schema) { + property_table_schema_ = schema; +} + +const PropertyTable::Schema &StructuralMetadata::GetPropertyTableSchema() + const { + return property_table_schema_; +} + +int StructuralMetadata::AddPropertyTable( + std::unique_ptr property_table) { + property_tables_.push_back(std::move(property_table)); + return property_tables_.size() - 1; +} + +int StructuralMetadata::NumPropertyTables() const { + return property_tables_.size(); +} + +const PropertyTable &StructuralMetadata::GetPropertyTable(int index) const { + return *property_tables_[index]; +} + +PropertyTable &StructuralMetadata::GetPropertyTable(int index) { + return *property_tables_[index]; +} + +void StructuralMetadata::RemovePropertyTable(int index) { + property_tables_.erase(property_tables_.begin() + index); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/metadata/structural_metadata.h b/contrib/draco/src/draco/metadata/structural_metadata.h new file mode 100644 index 000000000..24756c70c --- /dev/null +++ b/contrib/draco/src/draco/metadata/structural_metadata.h @@ -0,0 +1,64 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_METADATA_STRUCTURAL_METADATA_H_ +#define DRACO_METADATA_STRUCTURAL_METADATA_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include +#include +#include + +#include "draco/metadata/property_table.h" + +namespace draco { + +// Holds data associated with EXT_structural_metadata glTF extension. +class StructuralMetadata { + public: + StructuralMetadata(); + + // Methods for comparing two structural metadata objects. + bool operator==(const StructuralMetadata &other) const; + bool operator!=(const StructuralMetadata &other) const { + return !(*this == other); + } + + // Copies |src| structural metadata into this object. + void Copy(const StructuralMetadata &src); + + // Property table schema. + void SetPropertyTableSchema(const PropertyTable::Schema &schema); + const PropertyTable::Schema &GetPropertyTableSchema() const; + + // Property tables. + int AddPropertyTable(std::unique_ptr property_table); + int NumPropertyTables() const; + const PropertyTable &GetPropertyTable(int index) const; + PropertyTable &GetPropertyTable(int index); + void RemovePropertyTable(int index); + + private: + // Property table schema and property tables. + PropertyTable::Schema property_table_schema_; + std::vector> property_tables_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_METADATA_STRUCTURAL_METADATA_H_ diff --git a/contrib/draco/src/draco/metadata/structural_metadata_test.cc b/contrib/draco/src/draco/metadata/structural_metadata_test.cc new file mode 100644 index 000000000..d0429a568 --- /dev/null +++ b/contrib/draco/src/draco/metadata/structural_metadata_test.cc @@ -0,0 +1,170 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/metadata/structural_metadata.h" + +#include +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +TEST(StructuralMetadataTest, TestCopy) { + // Tests copying of structural metadata. + draco::StructuralMetadata structural_metadata; + + // Add property table schema to structural metadata. + draco::PropertyTable::Schema schema; + schema.json.SetString("Culture"); + structural_metadata.SetPropertyTableSchema(schema); + + // Add property table to structural metadata. + std::unique_ptr table(new draco::PropertyTable()); + table->SetName("Just Read The Instructions"); + table->SetClass("General Contact Unit"); + table->SetCount(456); + { + std::unique_ptr property( + new draco::PropertyTable::Property()); + property->SetName("Determinist"); + table->AddProperty(std::move(property)); + } + { + std::unique_ptr property( + new draco::PropertyTable::Property()); + property->SetName("Revisionist"); + table->AddProperty(std::move(property)); + } + ASSERT_EQ(structural_metadata.AddPropertyTable(std::move(table)), 0); + + // Copy the structural metadata. + draco::StructuralMetadata copy; + copy.Copy(structural_metadata); + + // Check that the structural metadata property table schema has been copied. + ASSERT_EQ(copy.GetPropertyTableSchema().json.GetString(), "Culture"); + + // Check that the structural metadata property table has been copied. + ASSERT_EQ(copy.NumPropertyTables(), 1); + ASSERT_EQ(copy.GetPropertyTable(0).GetName(), "Just Read The Instructions"); + ASSERT_EQ(copy.GetPropertyTable(0).GetClass(), "General Contact Unit"); + ASSERT_EQ(copy.GetPropertyTable(0).GetCount(), 456); + ASSERT_EQ(copy.GetPropertyTable(0).NumProperties(), 2); + ASSERT_EQ(copy.GetPropertyTable(0).GetProperty(0).GetName(), "Determinist"); + ASSERT_EQ(copy.GetPropertyTable(0).GetProperty(1).GetName(), "Revisionist"); +} + +TEST(StructuralMetadataTest, TestPropertyTables) { + // Tests adding and removing of property tables to structural metadata. + draco::StructuralMetadata structural_metadata; + + // Check that property tables can be added. + { + std::unique_ptr table(new draco::PropertyTable()); + table->SetName("Just Read The Instructions"); + ASSERT_EQ(structural_metadata.AddPropertyTable(std::move(table)), 0); + } + { + std::unique_ptr table(new draco::PropertyTable()); + table->SetName("So Much For Subtlety"); + ASSERT_EQ(structural_metadata.AddPropertyTable(std::move(table)), 1); + } + { + std::unique_ptr table(new draco::PropertyTable()); + table->SetName("Of Course I Still Love You"); + ASSERT_EQ(structural_metadata.AddPropertyTable(std::move(table)), 2); + } + draco::StructuralMetadata &sm = structural_metadata; + + // Check that the property tables can be removed. + ASSERT_EQ(sm.NumPropertyTables(), 3); + ASSERT_EQ(sm.GetPropertyTable(0).GetName(), "Just Read The Instructions"); + ASSERT_EQ(sm.GetPropertyTable(1).GetName(), "So Much For Subtlety"); + ASSERT_EQ(sm.GetPropertyTable(2).GetName(), "Of Course I Still Love You"); + + sm.RemovePropertyTable(1); + ASSERT_EQ(sm.NumPropertyTables(), 2); + ASSERT_EQ(sm.GetPropertyTable(0).GetName(), "Just Read The Instructions"); + ASSERT_EQ(sm.GetPropertyTable(1).GetName(), "Of Course I Still Love You"); + + sm.RemovePropertyTable(1); + ASSERT_EQ(sm.NumPropertyTables(), 1); + ASSERT_EQ(sm.GetPropertyTable(0).GetName(), "Just Read The Instructions"); + + sm.RemovePropertyTable(0); + ASSERT_EQ(sm.NumPropertyTables(), 0); +} + +TEST(StructuralMetadataTest, TestCompare) { + // Test comparison of two structural metadata objects. + typedef draco::PropertyTable PropertyTable; + { + // Compare the same structural metadata object. + draco::StructuralMetadata a; + ASSERT_TRUE(a == a); + ASSERT_FALSE(a != a); + } + { + // Compare two identical structural metadata objects. + draco::StructuralMetadata a; + draco::StructuralMetadata b; + ASSERT_TRUE(a == b); + ASSERT_FALSE(a != b); + } + { + // Compare two structural metadata objects with different schemas. + draco::StructuralMetadata a; + draco::StructuralMetadata b; + PropertyTable::Schema s1; + PropertyTable::Schema s2; + s1.json.SetString("one"); + s2.json.SetString("two"); + a.SetPropertyTableSchema(s1); + b.SetPropertyTableSchema(s2); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two objects with different number of proeprty tables. + draco::StructuralMetadata a; + draco::StructuralMetadata b; + a.AddPropertyTable(std::unique_ptr(new PropertyTable())); + b.AddPropertyTable(std::unique_ptr(new PropertyTable())); + b.AddPropertyTable(std::unique_ptr(new PropertyTable())); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } + { + // Compare two objects with different proeprty tables. + draco::StructuralMetadata a; + draco::StructuralMetadata b; + auto p1 = std::unique_ptr(new PropertyTable()); + auto p2 = std::unique_ptr(new PropertyTable()); + p1->SetName("one"); + p2->SetName("two"); + a.AddPropertyTable(std::move(p1)); + b.AddPropertyTable(std::move(p2)); + ASSERT_FALSE(a == b); + ASSERT_TRUE(a != b); + } +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/point_cloud/point_cloud.cc b/contrib/draco/src/draco/point_cloud/point_cloud.cc index a9f9ea2af..039c4f201 100644 --- a/contrib/draco/src/draco/point_cloud/point_cloud.cc +++ b/contrib/draco/src/draco/point_cloud/point_cloud.cc @@ -16,11 +16,41 @@ #include #include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/attributes/point_attribute.h" +#endif namespace draco { PointCloud::PointCloud() : num_points_(0) {} +#ifdef DRACO_TRANSCODER_SUPPORTED +void PointCloud::Copy(const PointCloud &src) { + num_points_ = src.num_points_; + for (int i = 0; i < GeometryAttribute::NAMED_ATTRIBUTES_COUNT; ++i) { + named_attribute_index_[i] = src.named_attribute_index_[i]; + } + attributes_.resize(src.attributes_.size()); + for (int i = 0; i < src.attributes_.size(); ++i) { + attributes_[i] = std::unique_ptr(new PointAttribute()); + attributes_[i]->CopyFrom(*src.attributes_[i]); + } + CopyMetadata(src); +} + +void PointCloud::CopyMetadata(const PointCloud &src) { + if (src.metadata_ == nullptr) { + metadata_ = nullptr; + } else { + // Copy base metadata. + const GeometryMetadata *const metadata = src.metadata_.get(); + metadata_.reset(new GeometryMetadata(*metadata)); + } +} +#endif + int32_t PointCloud::NumNamedAttributes(GeometryAttribute::Type type) const { if (type == GeometryAttribute::INVALID || type >= GeometryAttribute::NAMED_ATTRIBUTES_COUNT) { @@ -253,11 +283,16 @@ bool PointCloud::DeduplicateAttributeValues() { } #endif -// TODO(xiaoxumeng): Consider to cash the BBox. +// TODO(b/199760503): Consider to cache the BBox. BoundingBox PointCloud::ComputeBoundingBox() const { BoundingBox bounding_box; auto pc_att = GetNamedAttribute(GeometryAttribute::POSITION); - // TODO(xiaoxumeng): Make the BoundingBox a template type, it may not be easy + if (pc_att == nullptr) { + // Return default invalid bounding box. + return bounding_box; + } + + // TODO(b/199760503): Make the BoundingBox a template type, it may not be easy // because PointCloud is not a template. // Or simply add some preconditioning here to make sure the position attribute // is valid, because the current code works only if the position attribute is diff --git a/contrib/draco/src/draco/point_cloud/point_cloud.h b/contrib/draco/src/draco/point_cloud/point_cloud.h index d11bd47a3..17d0bc392 100644 --- a/contrib/draco/src/draco/point_cloud/point_cloud.h +++ b/contrib/draco/src/draco/point_cloud/point_cloud.h @@ -31,6 +31,11 @@ class PointCloud { PointCloud(); virtual ~PointCloud() = default; +#ifdef DRACO_TRANSCODER_SUPPORTED + // Copies all data from the |src| point cloud. + void Copy(const PointCloud &src); +#endif + // Returns the number of named attributes of a given type. int32_t NumNamedAttributes(GeometryAttribute::Type type) const; @@ -185,6 +190,11 @@ class PointCloud { void set_num_points(PointIndex::ValueType num) { num_points_ = num; } protected: +#ifdef DRACO_TRANSCODER_SUPPORTED + // Copies metadata from the |src| point cloud. + void CopyMetadata(const PointCloud &src); +#endif + #ifdef DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED // Applies id mapping of deduplicated points (called by DeduplicatePointIds). virtual void ApplyPointIdDeduplication( diff --git a/contrib/draco/src/draco/point_cloud/point_cloud_builder.cc b/contrib/draco/src/draco/point_cloud/point_cloud_builder.cc index 431ae505f..90ec37962 100644 --- a/contrib/draco/src/draco/point_cloud/point_cloud_builder.cc +++ b/contrib/draco/src/draco/point_cloud/point_cloud_builder.cc @@ -14,6 +14,8 @@ // #include "draco/point_cloud/point_cloud_builder.h" +#include + namespace draco { PointCloudBuilder::PointCloudBuilder() {} diff --git a/contrib/draco/src/draco/point_cloud/point_cloud_builder.h b/contrib/draco/src/draco/point_cloud/point_cloud_builder.h index cf55a728b..512b0f71f 100644 --- a/contrib/draco/src/draco/point_cloud/point_cloud_builder.h +++ b/contrib/draco/src/draco/point_cloud/point_cloud_builder.h @@ -15,6 +15,8 @@ #ifndef DRACO_POINT_CLOUD_POINT_CLOUD_BUILDER_H_ #define DRACO_POINT_CLOUD_POINT_CLOUD_BUILDER_H_ +#include + #include "draco/point_cloud/point_cloud.h" namespace draco { @@ -37,6 +39,9 @@ namespace draco { class PointCloudBuilder { public: + // Index type of the inserted element. + typedef PointIndex ElementIndex; + PointCloudBuilder(); // Starts collecting point cloud data. @@ -71,6 +76,12 @@ class PointCloudBuilder { // used until the method Start() is called again. std::unique_ptr Finalize(bool deduplicate_points); + // Add metadata for an attribute. + void AddAttributeMetadata(int32_t att_id, + std::unique_ptr metadata) { + point_cloud_->AddAttributeMetadata(att_id, std::move(metadata)); + } + private: std::unique_ptr point_cloud_; }; diff --git a/contrib/draco/src/draco/point_cloud/point_cloud_test.cc b/contrib/draco/src/draco/point_cloud/point_cloud_test.cc index 4e9460370..1cd780db2 100644 --- a/contrib/draco/src/draco/point_cloud/point_cloud_test.cc +++ b/contrib/draco/src/draco/point_cloud/point_cloud_test.cc @@ -14,6 +14,9 @@ // #include "draco/point_cloud/point_cloud.h" +#include +#include + #include "draco/core/draco_test_base.h" #include "draco/core/draco_test_utils.h" #include "draco/metadata/geometry_metadata.h" @@ -25,6 +28,57 @@ class PointCloudTest : public ::testing::Test { PointCloudTest() {} }; +#ifdef DRACO_TRANSCODER_SUPPORTED +TEST_F(PointCloudTest, PointCloudCopy) { + // Tests that we can copy a point cloud. + std::unique_ptr pc = + draco::ReadPointCloudFromTestFile("pc_kd_color.drc"); + ASSERT_NE(pc, nullptr); + + // Add metadata to the point cloud. + std::unique_ptr metadata( + new draco::GeometryMetadata()); + metadata->AddEntryInt("speed", 1050); + metadata->AddEntryString("code", "YT-1300f"); + + // Add attribute metadata. + std::unique_ptr a_metadata( + new draco::AttributeMetadata()); + a_metadata->set_att_unique_id(pc->attribute(0)->unique_id()); + a_metadata->AddEntryInt("attribute_test", 3); + metadata->AddAttributeMetadata(std::move(a_metadata)); + pc->AddMetadata(std::move(metadata)); + + // Create a copy of the point cloud. + draco::PointCloud pc_copy; + pc_copy.Copy(*pc); + + // Check the point cloud data. + ASSERT_EQ(pc->num_points(), pc_copy.num_points()); + ASSERT_EQ(pc->num_attributes(), pc_copy.num_attributes()); + for (int i = 0; i < pc->num_attributes(); ++i) { + ASSERT_EQ(pc->attribute(i)->attribute_type(), + pc_copy.attribute(i)->attribute_type()); + } + + // Check the point cloud metadata. + int speed; + std::string code; + ASSERT_NE(pc->GetMetadata(), nullptr); + ASSERT_TRUE(pc->GetMetadata()->GetEntryInt("speed", &speed)); + ASSERT_TRUE(pc->GetMetadata()->GetEntryString("code", &code)); + ASSERT_EQ(speed, 1050); + ASSERT_EQ(code, "YT-1300f"); + + const auto *const att_metadata_copy = + pc->GetMetadata()->GetAttributeMetadataByUniqueId(0); + ASSERT_NE(att_metadata_copy, nullptr); + int att_test; + ASSERT_TRUE(att_metadata_copy->GetEntryInt("attribute_test", &att_test)); + ASSERT_EQ(att_test, 3); +} +#endif + TEST_F(PointCloudTest, TestAttributeDeletion) { draco::PointCloud pc; // Test whether we can correctly delete an attribute from a point cloud. diff --git a/contrib/draco/src/draco/scene/instance_array.cc b/contrib/draco/src/draco/scene/instance_array.cc new file mode 100644 index 000000000..bcd49996a --- /dev/null +++ b/contrib/draco/src/draco/scene/instance_array.cc @@ -0,0 +1,45 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/instance_array.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include + +namespace draco { + +void InstanceArray::Copy(const InstanceArray &other) { + instances_.resize(other.instances_.size()); + for (int i = 0; i < instances_.size(); i++) { + instances_[i].trs.Copy(other.instances_[i].trs); + } +} + +Status InstanceArray::AddInstance(const Instance &instance) { + // Check that the |instance.trs| does not have the transformation matrix set, + // because the EXT_mesh_gpu_instancing glTF extension dictates that only the + // individual TRS vectors are stored. + if (instance.trs.MatrixSet()) { + return ErrorStatus("Instance must have no matrix set."); + } + + // Move the |instance| to the end of the instances vector. + instances_.push_back(instance); + return OkStatus(); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/instance_array.h b/contrib/draco/src/draco/scene/instance_array.h new file mode 100644 index 000000000..fb1fbde1e --- /dev/null +++ b/contrib/draco/src/draco/scene/instance_array.h @@ -0,0 +1,61 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_SCENE_INSTANCE_ARRAY_H_ +#define DRACO_SCENE_INSTANCE_ARRAY_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/core/vector_d.h" +#include "draco/scene/trs_matrix.h" + +namespace draco { + +// Describes a mesh group instancing array that includes TRS transformation +// for multiple instance positions and possibly other custom instance attributes +// (not yet supported), following the EXT_mesh_gpu_instancing glTF extension. +class InstanceArray { + public: + struct Instance { + // Translation, rotation, and scale vectors. + TrsMatrix trs; + // TODO(vytyaz): Support custom instance attributes, e.g., _ID, _COLOR, etc. + }; + + InstanceArray() = default; + + void Copy(const InstanceArray &other); + + // Adds one |instance| into this mesh group instance array where the + // |instance.trs| may have optional translation, rotation, and scale set. + Status AddInstance(const Instance &instance); + + // Returns the count of instances in this mesh group instance array. + int NumInstances() const { return instances_.size(); } + + // Returns an instance from this mesh group instance array. + const Instance &GetInstance(int index) const { return instances_[index]; } + + private: + std::vector instances_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_SCENE_INSTANCE_ARRAY_H_ diff --git a/contrib/draco/src/draco/scene/instance_array_test.cc b/contrib/draco/src/draco/scene/instance_array_test.cc new file mode 100644 index 000000000..d3802f901 --- /dev/null +++ b/contrib/draco/src/draco/scene/instance_array_test.cc @@ -0,0 +1,179 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/instance_array.h" + +#include +#include + +#include "draco/core/constants.h" +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +TEST(InstanceArrayTest, TestInstance) { + // Test construction of an empty draco::InstanceArray::Instance struct. + const draco::InstanceArray::Instance instance; + ASSERT_FALSE(instance.trs.TranslationSet()); + ASSERT_FALSE(instance.trs.RotationSet()); + ASSERT_FALSE(instance.trs.ScaleSet()); + ASSERT_FALSE(instance.trs.MatrixSet()); +} + +TEST(InstanceArrayTest, TestDefaults) { + // Test construction of an empty draco::InstanceArray object. + const draco::InstanceArray array; + ASSERT_EQ(array.NumInstances(), 0); +} + +TEST(InstanceArrayTest, TestAddInstance) { + // Test population of draco::InstanceArray object with instances. + draco::InstanceArray array; + + // Create an instance and set its transformation TRS vectors. + const Eigen::Vector3d translation_0(1.0, 2.0, 3.0); + const Eigen::Quaterniond rotation_0(4.0, 5.0, 6.0, 7.0); + const Eigen::Vector3d scale_0(8.0, 9.0, 10.0); + draco::InstanceArray::Instance instance_0; + instance_0.trs.SetTranslation(translation_0); + instance_0.trs.SetRotation(rotation_0); + instance_0.trs.SetScale(scale_0); + + // Create another instance. + const Eigen::Vector3d translation_1(1.1, 2.1, 3.1); + const Eigen::Quaterniond rotation_1(4.1, 5.1, 6.1, 7.1); + const Eigen::Vector3d scale_1(8.1, 9.1, 10.1); + draco::InstanceArray::Instance instance_1; + instance_1.trs.SetTranslation(translation_1); + instance_1.trs.SetRotation(rotation_1); + instance_1.trs.SetScale(scale_1); + + // Add two instances to instance array. + DRACO_ASSERT_OK(array.AddInstance(instance_0)); + DRACO_ASSERT_OK(array.AddInstance(instance_1)); + + // Check that the instances have been added. + ASSERT_EQ(array.NumInstances(), 2); + + // Check transformation of the first instance. + const draco::TrsMatrix &trs_0 = array.GetInstance(0).trs; + ASSERT_TRUE(trs_0.TranslationSet()); + ASSERT_TRUE(trs_0.RotationSet()); + ASSERT_TRUE(trs_0.ScaleSet()); + ASSERT_FALSE(trs_0.MatrixSet()); + ASSERT_EQ(trs_0.Translation().value(), translation_0); + ASSERT_EQ(trs_0.Rotation().value(), rotation_0); + ASSERT_EQ(trs_0.Scale().value(), scale_0); + + // Check transformation of the second instance. + const draco::TrsMatrix &trs_1 = array.GetInstance(1).trs; + ASSERT_TRUE(trs_1.TranslationSet()); + ASSERT_TRUE(trs_1.RotationSet()); + ASSERT_TRUE(trs_1.ScaleSet()); + ASSERT_FALSE(trs_1.MatrixSet()); + ASSERT_EQ(trs_1.Translation().value(), translation_1); + ASSERT_EQ(trs_1.Rotation().value(), rotation_1); + ASSERT_EQ(trs_1.Scale().value(), scale_1); +} + +TEST(InstanceArrayTest, TestAddInstanceWithoutTransform) { + // Test that instance without any transformation can be added. + draco::InstanceArray array; + + // Do not set any transformation. + draco::InstanceArray::Instance instance; + + // Check that such instance can be added. + DRACO_ASSERT_OK(array.AddInstance(instance)); +} + +TEST(InstanceArrayTest, TestAddInstanceWithoutScale) { + // Test that instance without scale can be added. + draco::InstanceArray array; + + // Set only instance translation and rotation. + draco::InstanceArray::Instance instance; + instance.trs.SetTranslation(Eigen::Vector3d(1.0, 2.0, 3.0)); + instance.trs.SetRotation(Eigen::Quaterniond(4.0, 5.0, 6.0, 7.0)); + + // Check that such instance can be added. + DRACO_ASSERT_OK(array.AddInstance(instance)); +} + +TEST(InstanceArrayTest, TestAddInstanceWithMatrixFails) { + // Test that instance without scale cannot be added. + draco::InstanceArray array; + + // Set TRS vectors, as well as the matrix. + draco::InstanceArray::Instance instance; + instance.trs.SetTranslation(Eigen::Vector3d(1.0, 2.0, 3.0)); + instance.trs.SetRotation(Eigen::Quaterniond(4.0, 5.0, 6.0, 7.0)); + instance.trs.SetScale(Eigen::Vector3d(8.0, 9.0, 10.0)); + // clang-format off + Eigen::Matrix4d matrix; + matrix << 1.0, 2.0, 3.0, 4.0, + 5.0, 6.0, 7.0, 8.0, + 9.0, 10.0, 11.0, 12.0, + 13.0, 14.0, 15.0, 16.0; + // clang-format on + instance.trs.SetMatrix(matrix); + + // Check that such instance cannot be added. + const draco::Status status = array.AddInstance(instance); + ASSERT_FALSE(status.ok()); + ASSERT_EQ(status.error_msg_string(), "Instance must have no matrix set."); +} + +TEST(InstanceArrayTest, TestCopy) { + // Test copying of draco::InstanceArray object. + draco::InstanceArray array; + + // Create an instance and set its transformation TRS vectors. + const Eigen::Vector3d translation_0(1.0, 2.0, 3.0); + const Eigen::Quaterniond rotation_0(4.0, 5.0, 6.0, 7.0); + const Eigen::Vector3d scale_0(8.0, 9.0, 10.0); + draco::InstanceArray::Instance instance_0; + instance_0.trs.SetTranslation(translation_0); + instance_0.trs.SetRotation(rotation_0); + instance_0.trs.SetScale(scale_0); + + // Create another instance. + const Eigen::Vector3d translation_1(1.1, 2.1, 3.1); + const Eigen::Quaterniond rotation_1(4.1, 5.1, 6.1, 7.1); + const Eigen::Vector3d scale_1(8.1, 9.1, 10.1); + draco::InstanceArray::Instance instance_1; + instance_1.trs.SetTranslation(translation_1); + instance_1.trs.SetRotation(rotation_1); + instance_1.trs.SetScale(scale_1); + + // Add two instances to the instance array. + DRACO_ASSERT_OK(array.AddInstance(instance_0)); + DRACO_ASSERT_OK(array.AddInstance(instance_1)); + + // Create a copy of the populated instance array object. + draco::InstanceArray copy; + copy.Copy(array); + + // Check that the instances have been copied. + ASSERT_EQ(copy.NumInstances(), 2); + ASSERT_EQ(copy.GetInstance(0).trs, instance_0.trs); + ASSERT_EQ(copy.GetInstance(1).trs, instance_1.trs); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/scene/light.cc b/contrib/draco/src/draco/scene/light.cc new file mode 100644 index 000000000..1fef98c0c --- /dev/null +++ b/contrib/draco/src/draco/scene/light.cc @@ -0,0 +1,45 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/light.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include + +#include "draco/core/constants.h" + +namespace draco { + +Light::Light() + : color_(1.0f, 1.0f, 1.0f), + intensity_(1.0), + type_(POINT), + range_(std::numeric_limits::max()), // Infinity. + inner_cone_angle_(0.0), + outer_cone_angle_(DRACO_PI / 4.0) {} + +void Light::Copy(const Light &light) { + name_ = light.name_; + color_ = light.color_; + intensity_ = light.intensity_; + type_ = light.type_; + range_ = light.range_; + inner_cone_angle_ = light.inner_cone_angle_; + outer_cone_angle_ = light.outer_cone_angle_; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/light.h b/contrib/draco/src/draco/scene/light.h new file mode 100644 index 000000000..5ff0d4a6b --- /dev/null +++ b/contrib/draco/src/draco/scene/light.h @@ -0,0 +1,81 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_SCENE_LIGHT_H_ +#define DRACO_SCENE_LIGHT_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +#include "draco/core/vector_d.h" + +namespace draco { + +// Describes a light in a scene according to the KHR_lights_punctual extension. +class Light { + public: + enum Type { DIRECTIONAL, POINT, SPOT }; + + Light(); + + void Copy(const Light &light); + + // Name. + void SetName(const std::string &name) { name_ = name; } + const std::string &GetName() const { return name_; } + + // Color. + void SetColor(const Vector3f &color) { color_ = color; } + const Vector3f &GetColor() const { return color_; } + + // Intensity. + void SetIntensity(double intensity) { intensity_ = intensity; } + double GetIntensity() const { return intensity_; } + + // Type. + void SetType(Type type) { type_ = type; } + Type GetType() const { return type_; } + + // Range. + void SetRange(double range) { range_ = range; } + double GetRange() const { return range_; } + + // Inner cone angle. + void SetInnerConeAngle(double angle) { inner_cone_angle_ = angle; } + double GetInnerConeAngle() const { return inner_cone_angle_; } + + // Outer cone angle. + void SetOuterConeAngle(double angle) { outer_cone_angle_ = angle; } + double GetOuterConeAngle() const { return outer_cone_angle_; } + + private: + std::string name_; + Vector3f color_; + double intensity_; + Type type_; + + // The range is only applicable to lights with Type::POINT or Type::SPOT. + double range_; + + // The cone angles are only applicable to lights with Type::SPOT. + double inner_cone_angle_; + double outer_cone_angle_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_SCENE_LIGHT_H_ diff --git a/contrib/draco/src/draco/scene/light_test.cc b/contrib/draco/src/draco/scene/light_test.cc new file mode 100644 index 000000000..bc24a14ad --- /dev/null +++ b/contrib/draco/src/draco/scene/light_test.cc @@ -0,0 +1,64 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/light.h" + +#include + +#include "draco/core/constants.h" +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +TEST(LightTest, TestDefaults) { + // Text constructing draco::Light object with default properties. + const draco::Light light; + ASSERT_EQ(light.GetName(), ""); + ASSERT_EQ(light.GetColor(), draco::Vector3f(1.0f, 1.0f, 1.0f)); + ASSERT_EQ(light.GetIntensity(), 1.0); + ASSERT_EQ(light.GetType(), draco::Light::POINT); + ASSERT_EQ(light.GetRange(), std::numeric_limits::max()); + ASSERT_EQ(light.GetInnerConeAngle(), 0.0); + ASSERT_EQ(light.GetOuterConeAngle(), DRACO_PI / 4.0); +} + +TEST(LightTest, TestCopy) { + // Test copying of draco::Light object. + draco::Light light; + light.SetName("The Star of Earendil"); + light.SetColor(draco::Vector3f(0.90, 0.97, 1.00)); + light.SetIntensity(5.0); + light.SetType(draco::Light::SPOT); + light.SetRange(1000.0); + light.SetInnerConeAngle(DRACO_PI / 8.0); + light.SetOuterConeAngle(DRACO_PI / 2.0); + + // Create a copy of the initialized light and check all properties. + draco::Light copy; + copy.Copy(light); + ASSERT_EQ(copy.GetName(), "The Star of Earendil"); + ASSERT_EQ(copy.GetColor(), draco::Vector3f(0.90, 0.97, 1.00)); + ASSERT_EQ(copy.GetIntensity(), 5.0); + ASSERT_EQ(copy.GetType(), draco::Light::SPOT); + ASSERT_EQ(copy.GetRange(), 1000.0); + ASSERT_EQ(copy.GetInnerConeAngle(), DRACO_PI / 8.0); + ASSERT_EQ(copy.GetOuterConeAngle(), DRACO_PI / 2.0); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/scene/mesh_group.h b/contrib/draco/src/draco/scene/mesh_group.h new file mode 100644 index 000000000..852318f16 --- /dev/null +++ b/contrib/draco/src/draco/scene/mesh_group.h @@ -0,0 +1,138 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_SCENE_MESH_GROUP_H_ +#define DRACO_SCENE_MESH_GROUP_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/core/macros.h" +#include "draco/scene/scene_indices.h" + +namespace draco { + +// This class is used to hold ordered mesh instances that refer to one or more +// base meshes, materials, and materials variants mappings. +class MeshGroup { + public: + // Stores a mapping from material index to materials variant indices. Each + // mesh instance may have multiple such mappings associated with it. See glTF + // extension KHR_materials_variants for more details. + struct MaterialsVariantsMapping { + MaterialsVariantsMapping() = delete; + MaterialsVariantsMapping(int material, const std::vector &variants) + : material(material), variants(variants) {} + bool operator==(const MaterialsVariantsMapping &other) const { + if (material != other.material) { + return false; + } + if (variants != other.variants) { + return false; + } + return true; + } + bool operator!=(const MaterialsVariantsMapping &other) const { + return !(*this == other); + } + int material; + std::vector variants; + }; + + // Describes mesh instance stored in a mesh group, including base mesh index, + // material index, and materials variants mappings. + struct MeshInstance { + MeshInstance() = delete; + MeshInstance(MeshIndex mesh_index, int material_index) + : MeshInstance(mesh_index, material_index, {}) {} + MeshInstance(MeshIndex mesh_index, int material_index, + const std::vector + &materials_variants_mappings) + : mesh_index(mesh_index), + material_index(material_index), + materials_variants_mappings(materials_variants_mappings) {} + bool operator==(const MeshInstance &other) const { + if (mesh_index != other.mesh_index) { + return false; + } + if (material_index != other.material_index) { + return false; + } + if (materials_variants_mappings.size() != + other.materials_variants_mappings.size()) { + return false; + } + if (materials_variants_mappings != other.materials_variants_mappings) { + return false; + } + return true; + } + bool operator!=(const MeshInstance &other) const { + return !(*this == other); + } + MeshIndex mesh_index; + int material_index; + std::vector materials_variants_mappings; + }; + + MeshGroup() {} + + void Copy(const MeshGroup &mg) { + name_ = mg.name_; + mesh_instances_ = mg.mesh_instances_; + } + + const std::string &GetName() const { return name_; } + void SetName(const std::string &name) { name_ = name; } + + void AddMeshInstance(const MeshInstance &instance) { + mesh_instances_.push_back(instance); + } + + void SetMeshInstance(int index, const MeshInstance &instance) { + mesh_instances_[index] = instance; + } + + const MeshInstance &GetMeshInstance(int index) const { + return mesh_instances_[index]; + } + + MeshInstance &GetMeshInstance(int index) { return mesh_instances_[index]; } + + int NumMeshInstances() const { return mesh_instances_.size(); } + + // Removes all mesh instances referring to base mesh at |mesh_index|. + void RemoveMeshInstances(MeshIndex mesh_index) { + int i = 0; + while (i != mesh_instances_.size()) { + if (mesh_instances_[i].mesh_index == mesh_index) { + mesh_instances_.erase(mesh_instances_.begin() + i); + } else { + i++; + } + } + } + + private: + std::string name_; + std::vector mesh_instances_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_SCENE_MESH_GROUP_H_ diff --git a/contrib/draco/src/draco/scene/mesh_group_test.cc b/contrib/draco/src/draco/scene/mesh_group_test.cc new file mode 100644 index 000000000..76f1bf33e --- /dev/null +++ b/contrib/draco/src/draco/scene/mesh_group_test.cc @@ -0,0 +1,196 @@ +// Copyright 2020 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/mesh_group.h" + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/scene/scene_indices.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +using draco::MeshGroup; +using draco::MeshIndex; + +// Test helper method generates materials variants mappings based on a |seed|. +std::vector MakeMappings(int seed) { + MeshGroup::MaterialsVariantsMapping a(10 * seed + 0, {seed + 0, seed + 1}); + MeshGroup::MaterialsVariantsMapping b(10 * seed + 1, {seed + 2, seed + 3}); + return {a, b}; +} + +TEST(MeshGroupTest, TestMeshInstanceTwoArgumentConstructor) { + MeshGroup::MeshInstance instance(MeshIndex(2), 3); + ASSERT_EQ(instance.mesh_index, MeshIndex(2)); + ASSERT_EQ(instance.material_index, 3); + ASSERT_EQ(instance.materials_variants_mappings.size(), 0); +} + +TEST(MeshGroupTest, TestMeshInstanceThreeArgumentConstructor) { + const auto mappings = MakeMappings(4); + MeshGroup::MeshInstance instance(MeshIndex(2), 3, mappings); + ASSERT_EQ(instance.mesh_index, MeshIndex(2)); + ASSERT_EQ(instance.material_index, 3); + ASSERT_EQ(instance.materials_variants_mappings, mappings); +} + +TEST(MeshGroupTest, TestMeshInstanceEqualsOperator) { + MeshGroup::MeshInstance instance_a(MeshIndex(2), 3, MakeMappings(4)); + MeshGroup::MeshInstance instance_b(MeshIndex(2), 3, MakeMappings(4)); + ASSERT_TRUE(instance_a == instance_b); + ASSERT_FALSE(instance_a != instance_b); + + MeshGroup::MeshInstance instance_c(MeshIndex(1), 3, MakeMappings(4)); + MeshGroup::MeshInstance instance_d(MeshIndex(2), 1, MakeMappings(4)); + MeshGroup::MeshInstance instance_e(MeshIndex(2), 3, MakeMappings(1)); + ASSERT_FALSE(instance_a == instance_c); + ASSERT_FALSE(instance_a == instance_d); + ASSERT_FALSE(instance_a == instance_e); + ASSERT_TRUE(instance_a != instance_c); + ASSERT_TRUE(instance_a != instance_d); + ASSERT_TRUE(instance_a != instance_e); +} + +TEST(MeshGroupTest, TestRemoveMeshInstanceWithNoOccurrences) { + // Test that no mesh instances are removed from mesh group when removing the + // instances by the base mesh index that is not in the mesh group. + + // Create test mesh group. + MeshGroup mesh_group; + mesh_group.AddMeshInstance({MeshIndex(1), 0, {}}); + mesh_group.AddMeshInstance({MeshIndex(3), 0, {}}); + + // Try to remove mesh that is not in the mesh group. + mesh_group.RemoveMeshInstances(MeshIndex(2)); + + // Check result. + ASSERT_EQ(mesh_group.NumMeshInstances(), 2); + ASSERT_EQ(mesh_group.GetMeshInstance(0).mesh_index, MeshIndex(1)); + ASSERT_EQ(mesh_group.GetMeshInstance(1).mesh_index, MeshIndex(3)); +} + +TEST(MeshGroupTest, TestRemoveTheOnlyMeshInstance) { + // Test that the only mesh instance can be removed from mesh group. + + // Create test mesh group. + MeshGroup mesh_group; + MeshGroup::MaterialsVariantsMapping mapping(70, {0, 1}); + mesh_group.AddMeshInstance({MeshIndex(7), 70, {mapping}}); + + // Remove a mesh instance. + mesh_group.RemoveMeshInstances(MeshIndex(7)); + + // Check result. + ASSERT_EQ(mesh_group.NumMeshInstances(), 0); +} + +TEST(MeshGroupTest, TestRemoveOneMeshInstances) { + // Test a mesh instance can be removed from mesh group. + + // Create test mesh group. + MeshGroup mesh_group; + mesh_group.AddMeshInstance({MeshIndex(1), 0, {}}); + mesh_group.AddMeshInstance({MeshIndex(3), 0, {}}); + mesh_group.AddMeshInstance({MeshIndex(5), 0, {}}); + mesh_group.AddMeshInstance({MeshIndex(7), 0, {}}); + + // Remove a mesh. + mesh_group.RemoveMeshInstances(MeshIndex(3)); + + // Check result. + ASSERT_EQ(mesh_group.NumMeshInstances(), 3); + ASSERT_EQ(mesh_group.GetMeshInstance(0).mesh_index, MeshIndex(1)); + ASSERT_EQ(mesh_group.GetMeshInstance(1).mesh_index, MeshIndex(5)); + ASSERT_EQ(mesh_group.GetMeshInstance(2).mesh_index, MeshIndex(7)); +} + +TEST(MeshGroupTest, TestRemoveThreeMeshInstances) { + // Test that multiple mesh instances can be removed from a mesh group. + + // Create test mesh group. + MeshGroup mesh_group; + mesh_group.AddMeshInstance({MeshIndex(1), 10, MakeMappings(1)}); + mesh_group.AddMeshInstance({MeshIndex(3), 30, MakeMappings(3)}); + mesh_group.AddMeshInstance({MeshIndex(5), 50, MakeMappings(5)}); + mesh_group.AddMeshInstance({MeshIndex(1), 10, MakeMappings(1)}); + mesh_group.AddMeshInstance({MeshIndex(7), 70, MakeMappings(7)}); + mesh_group.AddMeshInstance({MeshIndex(1), 10, MakeMappings(1)}); + + // Remove mesh instances. + mesh_group.RemoveMeshInstances(MeshIndex(1)); + + // Check result. + ASSERT_EQ(mesh_group.NumMeshInstances(), 3); + const MeshGroup::MeshInstance mi0 = mesh_group.GetMeshInstance(0); + const MeshGroup::MeshInstance mi1 = mesh_group.GetMeshInstance(1); + const MeshGroup::MeshInstance mi2 = mesh_group.GetMeshInstance(2); + ASSERT_EQ(mi0.mesh_index, MeshIndex(3)); + ASSERT_EQ(mi1.mesh_index, MeshIndex(5)); + ASSERT_EQ(mi2.mesh_index, MeshIndex(7)); + ASSERT_EQ(mi0.material_index, 30); + ASSERT_EQ(mi1.material_index, 50); + ASSERT_EQ(mi2.material_index, 70); + ASSERT_EQ(mi0.materials_variants_mappings, MakeMappings(3)); + ASSERT_EQ(mi1.materials_variants_mappings, MakeMappings(5)); + ASSERT_EQ(mi2.materials_variants_mappings, MakeMappings(7)); +} + +TEST(MeshGroupTest, TestCopy) { + // Tests that a mesh group can be copied. + + // Create test mesh group. + MeshGroup mesh_group; + mesh_group.SetName("Mesh-1-3-5-7"); + mesh_group.AddMeshInstance({MeshIndex(1), 10, MakeMappings(1)}); + mesh_group.AddMeshInstance({MeshIndex(3), 30, MakeMappings(3)}); + mesh_group.AddMeshInstance({MeshIndex(5), 50, MakeMappings(5)}); + mesh_group.AddMeshInstance({MeshIndex(7), 70, MakeMappings(7)}); + + // Verify source MeshGroup. + ASSERT_EQ(mesh_group.GetName(), "Mesh-1-3-5-7"); + ASSERT_EQ(mesh_group.NumMeshInstances(), 4); + const MeshGroup::MeshInstance mi0 = mesh_group.GetMeshInstance(0); + const MeshGroup::MeshInstance mi1 = mesh_group.GetMeshInstance(1); + const MeshGroup::MeshInstance mi2 = mesh_group.GetMeshInstance(2); + const MeshGroup::MeshInstance mi3 = mesh_group.GetMeshInstance(3); + ASSERT_EQ(mi0.mesh_index, MeshIndex(1)); + ASSERT_EQ(mi1.mesh_index, MeshIndex(3)); + ASSERT_EQ(mi2.mesh_index, MeshIndex(5)); + ASSERT_EQ(mi3.mesh_index, MeshIndex(7)); + ASSERT_EQ(mi0.material_index, 10); + ASSERT_EQ(mi1.material_index, 30); + ASSERT_EQ(mi2.material_index, 50); + ASSERT_EQ(mi3.material_index, 70); + ASSERT_EQ(mi0.materials_variants_mappings, MakeMappings(1)); + ASSERT_EQ(mi1.materials_variants_mappings, MakeMappings(3)); + ASSERT_EQ(mi2.materials_variants_mappings, MakeMappings(5)); + ASSERT_EQ(mi3.materials_variants_mappings, MakeMappings(7)); + + MeshGroup copy; + copy.Copy(mesh_group); + + // Verify that Copy worked. + ASSERT_EQ(mesh_group.GetName(), copy.GetName()); + ASSERT_EQ(mesh_group.NumMeshInstances(), copy.NumMeshInstances()); + ASSERT_EQ(mesh_group.GetMeshInstance(0), copy.GetMeshInstance(0)); + ASSERT_EQ(mesh_group.GetMeshInstance(1), copy.GetMeshInstance(1)); + ASSERT_EQ(mesh_group.GetMeshInstance(2), copy.GetMeshInstance(2)); + ASSERT_EQ(mesh_group.GetMeshInstance(3), copy.GetMeshInstance(3)); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/scene/scene.cc b/contrib/draco/src/draco/scene/scene.cc new file mode 100644 index 000000000..9ad574835 --- /dev/null +++ b/contrib/draco/src/draco/scene/scene.cc @@ -0,0 +1,174 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/scene.h" + +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/macros.h" +#include "draco/scene/scene_indices.h" + +namespace draco { + +void Scene::Copy(const Scene &s) { + meshes_.resize(s.meshes_.size()); + for (MeshIndex i(0); i < meshes_.size(); ++i) { + meshes_[i] = std::unique_ptr(new Mesh()); + meshes_[i]->Copy(*s.meshes_[i]); + } + + mesh_groups_.resize(s.mesh_groups_.size()); + for (MeshGroupIndex i(0); i < mesh_groups_.size(); ++i) { + mesh_groups_[i] = std::unique_ptr(new MeshGroup()); + mesh_groups_[i]->Copy(*s.mesh_groups_[i]); + } + + nodes_.resize(s.nodes_.size()); + for (SceneNodeIndex i(0); i < nodes_.size(); ++i) { + nodes_[i] = std::unique_ptr(new SceneNode()); + nodes_[i]->Copy(*s.nodes_[i]); + } + + root_node_indices_ = s.root_node_indices_; + + animations_.resize(s.animations_.size()); + for (AnimationIndex i(0); i < animations_.size(); ++i) { + animations_[i] = std::unique_ptr(new Animation()); + animations_[i]->Copy(*s.animations_[i]); + } + + skins_.resize(s.skins_.size()); + for (SkinIndex i(0); i < skins_.size(); ++i) { + skins_[i] = std::unique_ptr(new Skin()); + skins_[i]->Copy(*s.skins_[i]); + } + + lights_.resize(s.lights_.size()); + for (LightIndex i(0); i < lights_.size(); ++i) { + lights_[i] = std::unique_ptr(new Light()); + lights_[i]->Copy(*s.lights_[i]); + } + + instance_arrays_.resize(s.instance_arrays_.size()); + for (InstanceArrayIndex i(0); i < instance_arrays_.size(); ++i) { + instance_arrays_[i] = std::unique_ptr(new InstanceArray()); + instance_arrays_[i]->Copy(*s.instance_arrays_[i]); + } + + material_library_.Copy(s.material_library_); + +#ifdef DRACO_TRANSCODER_SUPPORTED + // Copy non-material textures. + non_material_texture_library_.Copy(s.non_material_texture_library_); + + // Update pointers to non-material textures in mesh feature ID sets of all + // scene meshes. + if (non_material_texture_library_.NumTextures() != 0) { + const auto texture_to_index_map = + s.non_material_texture_library_.ComputeTextureToIndexMap(); + for (MeshIndex i(0); i < NumMeshes(); ++i) { + for (MeshFeaturesIndex j(0); j < GetMesh(i).NumMeshFeatures(); ++j) { + Mesh::UpdateMeshFeaturesTexturePointer(texture_to_index_map, + &non_material_texture_library_, + &GetMesh(i).GetMeshFeatures(j)); + } + } + } +#endif // DRACO_TRANSCODER_SUPPORTED + + // Copy structural metadata. + structural_metadata_.Copy(s.structural_metadata_); +} + +Status Scene::RemoveMesh(MeshIndex index) { + // Remove base mesh at |index| from |meshes_| and corresponding material index + // from |mesh_material_indices_|. + const int new_num_meshes = meshes_.size() - 1; + for (MeshIndex i(index); i < new_num_meshes; i++) { + meshes_[i] = std::move(meshes_[i + 1]); + } + meshes_.resize(new_num_meshes); + + // Remove references to removed base mesh and corresponding materials from + // mesh groups, and update references to remaining base meshes in mesh groups. + for (MeshGroupIndex mgi(0); mgi < NumMeshGroups(); ++mgi) { + MeshGroup *const mesh_group = GetMeshGroup(mgi); + if (!mesh_group) { + return Status(Status::DRACO_ERROR, "MeshGroup is null."); + } + mesh_group->RemoveMeshInstances(index); + for (int i = 0; i < mesh_group->NumMeshInstances(); ++i) { + MeshGroup::MeshInstance &mesh_instance = mesh_group->GetMeshInstance(i); + if (mesh_instance.mesh_index > index && + mesh_instance.mesh_index != kInvalidMeshIndex) { + mesh_instance.mesh_index--; + } + } + } + return OkStatus(); +} + +Status Scene::RemoveMeshGroup(MeshGroupIndex index) { + // Remove mesh group at |index| from |mesh_groups_| vector. + const int new_num_mesh_groups = mesh_groups_.size() - 1; + for (MeshGroupIndex i(index); i < new_num_mesh_groups; i++) { + mesh_groups_[i] = std::move(mesh_groups_[i + 1]); + } + mesh_groups_.resize(new_num_mesh_groups); + + // Invalidate references to removed mesh group in scene nodes, and update + // references to remaining mesh groups in scene nodes. + for (SceneNodeIndex sni(0); sni < NumNodes(); ++sni) { + SceneNode *node = GetNode(sni); + if (!node) { + return Status(Status::DRACO_ERROR, "Node is null."); + } + const MeshGroupIndex mgi = node->GetMeshGroupIndex(); + if (mgi == index) { + // TODO(vytyaz): Remove the node if possible, e.g., when node has no + // geometry, no child nodes, no skins, no lights, and no mesh group + // instance arrays. + node->SetMeshGroupIndex(kInvalidMeshGroupIndex); + } else if (mgi > index && mgi != kInvalidMeshGroupIndex) { + node->SetMeshGroupIndex(mgi - 1); + } + } + return OkStatus(); +} + +Status Scene::RemoveMaterial(int index) { + if (index < 0 || index >= material_library_.NumMaterials()) { + return Status(Status::DRACO_ERROR, "Material index is out of range."); + } + material_library_.RemoveMaterial(index); + + // Update material indices of mesh instances. + for (MeshGroupIndex mgi(0); mgi < NumMeshGroups(); ++mgi) { + MeshGroup *const mesh_group = GetMeshGroup(mgi); + for (int i = 0; i < mesh_group->NumMeshInstances(); i++) { + MeshGroup::MeshInstance &mesh_instance = mesh_group->GetMeshInstance(i); + if (mesh_instance.material_index > index) { + mesh_instance.material_index--; + } else if (mesh_instance.material_index == index) { + return Status(Status::DRACO_ERROR, "Removed material has references."); + } + } + } + return OkStatus(); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/scene.h b/contrib/draco/src/draco/scene/scene.h new file mode 100644 index 000000000..3c76ead7a --- /dev/null +++ b/contrib/draco/src/draco/scene/scene.h @@ -0,0 +1,258 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_SCENE_SCENE_H_ +#define DRACO_SCENE_SCENE_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +#include "draco/animation/animation.h" +#include "draco/animation/skin.h" +#include "draco/mesh/mesh.h" +#include "draco/metadata/structural_metadata.h" +#include "draco/scene/instance_array.h" +#include "draco/scene/light.h" +#include "draco/scene/mesh_group.h" +#include "draco/scene/scene_indices.h" +#include "draco/scene/scene_node.h" + +namespace draco { + +// Class used to hold all of the geometry to create a scene. A scene is +// comprised of one or more meshes, one or more scene nodes, one or more +// mesh groups, and a material library. The meshes are defined in their +// local space. A mesh group is a list of meshes. The scene nodes create +// a scene hierarchy to transform meshes in their local space into scene space. +// The material library contains all of the materials and textures used by the +// meshes in this scene. +class Scene { + public: + Scene() {} + + void Copy(const Scene &s); + + // Adds a Draco |mesh| to the scene. Returns the index to the stored mesh or + // |kInvalidMeshIndex| if the mesh is a nullptr. + MeshIndex AddMesh(std::unique_ptr mesh) { + if (mesh == nullptr) { + return kInvalidMeshIndex; + } + meshes_.push_back(std::move(mesh)); + return MeshIndex(meshes_.size() - 1); + } + + // Removes base mesh and corresponding material at |index|, removes references + // to removed base mesh and corresponding materials from mesh groups, and + // updates references to remaining base meshes in mesh groups. + Status RemoveMesh(MeshIndex index); + + // Returns the number of meshes in a scene before instancing is applied. + int NumMeshes() const { return meshes_.size(); } + + // Returns a mesh in the scene before instancing is applied. The mesh + // coordinates are local to the mesh. + Mesh &GetMesh(MeshIndex index) { return *meshes_[index]; } + const Mesh &GetMesh(MeshIndex index) const { return *meshes_[index]; } + + // Creates a mesh group and returns the index to the mesh group. + MeshGroupIndex AddMeshGroup() { + std::unique_ptr mesh(new MeshGroup()); + mesh_groups_.push_back(std::move(mesh)); + return MeshGroupIndex(mesh_groups_.size() - 1); + } + + // Removes mesh group at |index|, invalidates references to removed mesh group + // in scene nodes, and updates references to remaining mesh groups in scene + // nodes. + Status RemoveMeshGroup(MeshGroupIndex index); + + // Removes unused material at |index| and updates references to materials at + // indices greater than |index|. Returns error status when |index| is out of + // valid range and when material at |index| is used in the scene. + Status RemoveMaterial(int index); + + // Returns the number of mesh groups in a scene. + int NumMeshGroups() const { return mesh_groups_.size(); } + + // Returns a mesh group in the scene. + MeshGroup *GetMeshGroup(MeshGroupIndex index) { + return mesh_groups_[index].get(); + } + const MeshGroup *GetMeshGroup(MeshGroupIndex index) const { + return mesh_groups_[index].get(); + } + + // Creates a scene node and returns the index to the node. + SceneNodeIndex AddNode() { + std::unique_ptr node(new SceneNode()); + nodes_.push_back(std::move(node)); + return SceneNodeIndex(nodes_.size() - 1); + } + + // Returns the number of nodes in a scene. + int NumNodes() const { return nodes_.size(); } + + // Returns a node in the scene. + SceneNode *GetNode(SceneNodeIndex index) { return nodes_[index].get(); } + const SceneNode *GetNode(SceneNodeIndex index) const { + return nodes_[index].get(); + } + + // Either allocates new nodes or removes existing nodes that are beyond + // |num_nodes|. + void ResizeNodes(int num_nodes) { + const size_t old_num_nodes = nodes_.size(); + nodes_.resize(num_nodes); + for (SceneNodeIndex i(old_num_nodes); i < num_nodes; ++i) { + nodes_[i].reset(new SceneNode()); + } + } + + // Returns the number of root node indices in a scene. + int NumRootNodes() const { return root_node_indices_.size(); } + SceneNodeIndex GetRootNodeIndex(int i) const { return root_node_indices_[i]; } + const std::vector &GetRootNodeIndices() const { + return root_node_indices_; + } + void AddRootNodeIndex(SceneNodeIndex index) { + root_node_indices_.push_back(index); + } + void SetRootNodeIndex(int i, SceneNodeIndex index) { + root_node_indices_[i] = index; + } + void RemoveAllRootNodeIndices() { root_node_indices_.clear(); } + + const MaterialLibrary &GetMaterialLibrary() const { + return material_library_; + } + MaterialLibrary &GetMaterialLibrary() { return material_library_; } + + // Library that contains non-material textures. + const TextureLibrary &GetNonMaterialTextureLibrary() const { + return non_material_texture_library_; + } + TextureLibrary &GetNonMaterialTextureLibrary() { + return non_material_texture_library_; + } + + // Structural metadata. + const StructuralMetadata &GetStructuralMetadata() const { + return structural_metadata_; + } + StructuralMetadata &GetStructuralMetadata() { return structural_metadata_; } + + // Creates an animation and returns the index to the animation. + AnimationIndex AddAnimation() { + std::unique_ptr animation(new Animation()); + animations_.push_back(std::move(animation)); + return AnimationIndex(animations_.size() - 1); + } + + // Returns the number of animations in a scene. + int NumAnimations() const { return animations_.size(); } + + // Returns an animation in the scene. + Animation *GetAnimation(AnimationIndex index) { + return animations_[index].get(); + } + const Animation *GetAnimation(AnimationIndex index) const { + return animations_[index].get(); + } + + // Creates a skin and returns the index to the skin. + SkinIndex AddSkin() { + std::unique_ptr skin(new Skin()); + skins_.push_back(std::move(skin)); + return SkinIndex(skins_.size() - 1); + } + + // Returns the number of skins in a scene. + int NumSkins() const { return skins_.size(); } + + // Returns a skin in the scene. + Skin *GetSkin(SkinIndex index) { return skins_[index].get(); } + const Skin *GetSkin(SkinIndex index) const { return skins_[index].get(); } + + // Creates a light and returns the index to the light. + LightIndex AddLight() { + std::unique_ptr light(new Light()); + lights_.push_back(std::move(light)); + return LightIndex(lights_.size() - 1); + } + + // Returns the number of lights in a scene. + int NumLights() const { return lights_.size(); } + + // Returns a light in the scene. + Light *GetLight(LightIndex index) { return lights_[index].get(); } + const Light *GetLight(LightIndex index) const { return lights_[index].get(); } + + // Creates a mesh group instance array and returns the index to it. This array + // is used for storing the attributes of the EXT_mesh_gpu_instancing glTF + // extension. + InstanceArrayIndex AddInstanceArray() { + std::unique_ptr array(new InstanceArray()); + instance_arrays_.push_back(std::move(array)); + return InstanceArrayIndex(instance_arrays_.size() - 1); + } + + // Returns the number of mesh group instance arrays in a scene. + int NumInstanceArrays() const { return instance_arrays_.size(); } + + // Returns a mesh group instance array in the scene. + InstanceArray *GetInstanceArray(InstanceArrayIndex index) { + return instance_arrays_[index].get(); + } + const InstanceArray *GetInstanceArray(InstanceArrayIndex index) const { + return instance_arrays_[index].get(); + } + + private: + IndexTypeVector> meshes_; + IndexTypeVector> mesh_groups_; + IndexTypeVector> nodes_; + std::vector root_node_indices_; + IndexTypeVector> animations_; + IndexTypeVector> skins_; + + // The lights will be written to the output scene but not used for internal + // rendering in Draco, e.g, while computing distortion metric. + IndexTypeVector> lights_; + + // The mesh group instance array information will be written to the output + // scene but not processed by Draco simplifier modules. + IndexTypeVector> + instance_arrays_; + + // Materials used by this scene. + MaterialLibrary material_library_; + + // Texture library for storing non-material textures used by this scene, e.g., + // textures containing mesh feature IDs of EXT_mesh_features glTF extension. + // Note that scene meshes contain pointers to non-material textures. It is + // responsibility of class user to update these pointers when updating the + // textures. See Scene::Copy() for example. + TextureLibrary non_material_texture_library_; + + // Structural metadata defined by the EXT_structural_metadata glTF extension. + StructuralMetadata structural_metadata_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_SCENE_SCENE_H_ diff --git a/contrib/draco/src/draco/scene/scene_are_equivalent.cc b/contrib/draco/src/draco/scene/scene_are_equivalent.cc new file mode 100644 index 000000000..7d0663e08 --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_are_equivalent.cc @@ -0,0 +1,109 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/scene_are_equivalent.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/mesh/mesh_are_equivalent.h" + +namespace draco { + +bool SceneAreEquivalent::operator()(const Scene &scene0, const Scene &scene1) { + // Check scene component sizes. + if (scene0.NumAnimations() != scene1.NumAnimations()) { + return false; + } + if (scene0.NumMeshGroups() != scene1.NumMeshGroups()) { + return false; + } + if (scene0.NumSkins() != scene1.NumSkins()) { + return false; + } + + // Check equivalence of each mesh. + if (scene0.NumMeshes() != scene1.NumMeshes()) { + return false; + } + for (MeshIndex i(0); i < scene0.NumMeshes(); i++) { + if (!AreEquivalent(scene0.GetMesh(i), scene1.GetMesh(i))) { + return false; + } + } + + // Check eqiuvalence of each node. + if (scene0.NumNodes() != scene1.NumNodes()) { + return false; + } + for (SceneNodeIndex i(0); i < scene0.NumNodes(); i++) { + if (!AreEquivalent(*scene0.GetNode(i), *scene1.GetNode(i))) { + return false; + } + } + + // Check non-material texture library sizes. + if (scene0.GetNonMaterialTextureLibrary().NumTextures() != + scene1.GetNonMaterialTextureLibrary().NumTextures()) { + return false; + } + + // TODO(vytyaz): Check remaining scene properties like animations and skins. + return true; +} + +bool SceneAreEquivalent::AreEquivalent(const Mesh &mesh0, const Mesh &mesh1) { + MeshAreEquivalent eq; + return eq(mesh0, mesh1); +} + +bool SceneAreEquivalent::AreEquivalent(const SceneNode &node0, + const SceneNode &node1) { + // Check equivalence of node indices. + if (node0.GetMeshGroupIndex() != node1.GetMeshGroupIndex()) { + return false; + } + if (node0.GetSkinIndex() != node1.GetSkinIndex()) { + return false; + } + + // Check equivalence of node transformations. + if (node0.GetTrsMatrix().ComputeTransformationMatrix() != + node1.GetTrsMatrix().ComputeTransformationMatrix()) { + return false; + } + + // Check equivalence of node children. + if (node0.NumChildren() != node1.NumChildren()) { + return false; + } + for (int i = 0; i < node0.NumChildren(); i++) { + if (node0.Child(i) != node1.Child(i)) { + return false; + } + } + + // Check equivalence of node parents. + if (node0.NumParents() != node1.NumParents()) { + return false; + } + for (int i = 0; i < node0.NumParents(); i++) { + if (node0.Parent(i) != node1.Parent(i)) { + return false; + } + } + return true; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/scene_are_equivalent.h b/contrib/draco/src/draco/scene/scene_are_equivalent.h new file mode 100644 index 000000000..b309c0338 --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_are_equivalent.h @@ -0,0 +1,42 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef DRACO_SCENE_SCENE_ARE_EQUIVALENT_H_ +#define DRACO_SCENE_SCENE_ARE_EQUIVALENT_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/scene/scene.h" + +namespace draco { + +// A functor to compare two scenes for equivalency up to permutation of mesh +// vertices. +class SceneAreEquivalent { + public: + // Returns true if both scenes are equivalent up to permutation of + // the internal order of mesh vertices. This includes all attributes. + bool operator()(const Scene &scene0, const Scene &scene1); + + private: + static bool AreEquivalent(const Mesh &mesh0, const Mesh &mesh1); + static bool AreEquivalent(const SceneNode &node0, const SceneNode &node1); +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_SCENE_SCENE_ARE_EQUIVALENT_H_ diff --git a/contrib/draco/src/draco/scene/scene_are_equivalent_test.cc b/contrib/draco/src/draco/scene/scene_are_equivalent_test.cc new file mode 100644 index 000000000..3a9edc6c3 --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_are_equivalent_test.cc @@ -0,0 +1,86 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/scene_are_equivalent.h" + +#include +#include +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/io/scene_io.h" +#include "draco/scene/scene.h" + +namespace draco { + +#ifdef DRACO_TRANSCODER_SUPPORTED +class SceneAreEquivalentTest : public ::testing::Test {}; + +TEST_F(SceneAreEquivalentTest, TestOnIndenticalScenes) { + const std::string file_name = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + const std::unique_ptr scene(ReadSceneFromTestFile(file_name)); + ASSERT_NE(scene, nullptr) << "Failed to load test scene: " << file_name; + + // Add mesh feature ID set to a scene mesh. + std::unique_ptr mesh_features(new MeshFeatures()); + scene->GetMesh(MeshIndex(2)).AddMeshFeatures(std::move(mesh_features)); + + SceneAreEquivalent equiv; + ASSERT_TRUE(equiv(*scene, *scene)); +} + +TEST_F(SceneAreEquivalentTest, TestOnDifferentScenes) { + const std::string file_name0 = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + const std::string file_name1 = "Lantern/glTF/Lantern.gltf"; + const std::unique_ptr scene0(ReadSceneFromTestFile(file_name0)); + const std::unique_ptr scene1(ReadSceneFromTestFile(file_name1)); + ASSERT_NE(scene0, nullptr) << "Failed to load test scene: " << file_name0; + ASSERT_NE(scene1, nullptr) << "Failed to load test scene: " << file_name1; + SceneAreEquivalent equiv; + ASSERT_FALSE(equiv(*scene0, *scene1)); +} + +TEST_F(SceneAreEquivalentTest, TestMeshFeatures) { + const std::string file_name = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + const std::unique_ptr scene0(ReadSceneFromTestFile(file_name)); + const std::unique_ptr scene1(ReadSceneFromTestFile(file_name)); + ASSERT_NE(scene0, nullptr); + ASSERT_NE(scene1, nullptr); + + // Add identical mesh feature ID sets to mesh at index 0. + Mesh &mesh0 = scene0->GetMesh(MeshIndex(0)); + Mesh &mesh1 = scene1->GetMesh(MeshIndex(0)); + mesh0.AddMeshFeatures(std::unique_ptr(new MeshFeatures())); + mesh1.AddMeshFeatures(std::unique_ptr(new MeshFeatures())); + + // Empty feature sets should match. + SceneAreEquivalent equiv; + ASSERT_TRUE(equiv(*scene0, *scene1)); + + // Make mesh features different and check that the meshes are not equivalent. + mesh0.GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(5); + mesh1.GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(6); + ASSERT_FALSE(equiv(*scene0, *scene1)); + + // Make mesh features identical and check that the meshes are equivalent. + mesh0.GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(1); + mesh1.GetMeshFeatures(MeshFeaturesIndex(0)).SetFeatureCount(1); + ASSERT_TRUE(equiv(*scene0, *scene1)); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace draco diff --git a/contrib/draco/src/draco/scene/scene_indices.h b/contrib/draco/src/draco/scene/scene_indices.h new file mode 100644 index 000000000..7b57e3e4a --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_indices.h @@ -0,0 +1,72 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifdef DRACO_TRANSCODER_SUPPORTED +#ifndef DRACO_SCENE_SCENE_INDICES_H_ +#define DRACO_SCENE_SCENE_INDICES_H_ + +#include + +#include + +#include "draco/core/draco_index_type.h" + +namespace draco { + +// Index of a mesh in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, MeshIndex) + +// Index of a mesh instance in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, MeshInstanceIndex) + +// Index of a mesh group in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, MeshGroupIndex) + +// Index of a node in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, SceneNodeIndex) + +// Index of an animation in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, AnimationIndex) + +// Index of a skin in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, SkinIndex) + +// Index of a light in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, LightIndex) + +// Index of a mesh group GPU instancing in a scene. +DEFINE_NEW_DRACO_INDEX_TYPE(uint32_t, InstanceArrayIndex) + +// Constants denoting invalid indices. +static constexpr MeshIndex kInvalidMeshIndex( + std::numeric_limits::max()); +static constexpr MeshInstanceIndex kInvalidMeshInstanceIndex( + std::numeric_limits::max()); +static constexpr MeshGroupIndex kInvalidMeshGroupIndex( + std::numeric_limits::max()); +static constexpr SceneNodeIndex kInvalidSceneNodeIndex( + std::numeric_limits::max()); +static constexpr AnimationIndex kInvalidAnimationIndex( + std::numeric_limits::max()); +static constexpr SkinIndex kInvalidSkinIndex( + std::numeric_limits::max()); +static constexpr LightIndex kInvalidLightIndex( + std::numeric_limits::max()); +static constexpr InstanceArrayIndex kInvalidInstanceArrayIndex( + std::numeric_limits::max()); + +} // namespace draco + +#endif // DRACO_SCENE_SCENE_INDICES_H_ +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/scene_node.h b/contrib/draco/src/draco/scene/scene_node.h new file mode 100644 index 000000000..6cfe04e2e --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_node.h @@ -0,0 +1,105 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifdef DRACO_TRANSCODER_SUPPORTED +#ifndef DRACO_SCENE_SCENE_NODE_H_ +#define DRACO_SCENE_SCENE_NODE_H_ + +#include "draco/scene/scene_indices.h" +#include "draco/scene/trs_matrix.h" + +namespace draco { + +// This class is used to create a scene hierarchy from meshes in their local +// space transformed into scene space. +class SceneNode { + public: + SceneNode() + : mesh_group_index_(-1), + skin_index_(-1), + light_index_(-1), + instance_array_index_(-1) {} + + void Copy(const SceneNode &sn) { + name_ = sn.name_; + trs_matrix_.Copy(sn.trs_matrix_); + mesh_group_index_ = sn.mesh_group_index_; + skin_index_ = sn.skin_index_; + parents_ = sn.parents_; + children_ = sn.children_; + light_index_ = sn.light_index_; + instance_array_index_ = sn.instance_array_index_; + } + + // Sets a name. + void SetName(const std::string &name) { name_ = name; } + + // Returns the name. + const std::string &GetName() const { return name_; } + + // Set transformation from mesh local space to scene space. + void SetTrsMatrix(const TrsMatrix &trsm) { trs_matrix_.Copy(trsm); } + const TrsMatrix &GetTrsMatrix() const { return trs_matrix_; } + + // Set the index to the mesh group in the scene. + void SetMeshGroupIndex(MeshGroupIndex index) { mesh_group_index_ = index; } + MeshGroupIndex GetMeshGroupIndex() const { return mesh_group_index_; } + + // Set the index to the skin in the scene. + void SetSkinIndex(SkinIndex index) { skin_index_ = index; } + SkinIndex GetSkinIndex() const { return skin_index_; } + + // Set the index to the light in the scene. + void SetLightIndex(LightIndex index) { light_index_ = index; } + LightIndex GetLightIndex() const { return light_index_; } + + // Set the index to the mesh group instance array in the scene. Note that + // according to EXT_mesh_gpu_instancing glTF extension there is no defined + // behavior for a node with instance array and without a mesh group. + void SetInstanceArrayIndex(InstanceArrayIndex index) { + instance_array_index_ = index; + } + InstanceArrayIndex GetInstanceArrayIndex() const { + return instance_array_index_; + } + + // Functions to set and get zero or more parent nodes of this node. + SceneNodeIndex Parent(int index) const { return parents_[index]; } + const std::vector &Parents() const { return parents_; } + void AddParentIndex(SceneNodeIndex index) { parents_.push_back(index); } + int NumParents() const { return parents_.size(); } + void RemoveAllParents() { parents_.clear(); } + + // Functions to set and get zero or more child nodes of this node. + SceneNodeIndex Child(int index) const { return children_[index]; } + const std::vector &Children() const { return children_; } + void AddChildIndex(SceneNodeIndex index) { children_.push_back(index); } + int NumChildren() const { return children_.size(); } + void RemoveAllChildren() { children_.clear(); } + + private: + std::string name_; + TrsMatrix trs_matrix_; + draco::MeshGroupIndex mesh_group_index_; + draco::SkinIndex skin_index_; + std::vector parents_; + std::vector children_; + LightIndex light_index_; + InstanceArrayIndex instance_array_index_; +}; + +} // namespace draco + +#endif // DRACO_SCENE_SCENE_NODE_H_ +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/scene_test.cc b/contrib/draco/src/draco/scene/scene_test.cc new file mode 100644 index 000000000..d639614c7 --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_test.cc @@ -0,0 +1,295 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/scene.h" + +#include +#include +#include + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/core/status.h" +#include "draco/mesh/mesh_are_equivalent.h" +#include "draco/scene/scene_are_equivalent.h" +#include "draco/scene/scene_indices.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +// Helper method for adding mesh group GPU instancing to the milk truck scene. +draco::Status AddGpuInstancingToMilkTruck(draco::Scene *scene) { + // Create an instance and set its transformation TRS vectors. + draco::InstanceArray::Instance instance_0; + instance_0.trs.SetTranslation(Eigen::Vector3d(1.0, 2.0, 3.0)); + instance_0.trs.SetRotation(Eigen::Quaterniond(4.0, 5.0, 6.0, 7.0)); + instance_0.trs.SetScale(Eigen::Vector3d(8.0, 9.0, 10.0)); + + // Create another instance. + draco::InstanceArray::Instance instance_1; + instance_1.trs.SetTranslation(Eigen::Vector3d(1.1, 2.1, 3.1)); + instance_1.trs.SetRotation(Eigen::Quaterniond(4.1, 5.1, 6.1, 7.1)); + instance_1.trs.SetScale(Eigen::Vector3d(8.1, 9.1, 10.1)); + + // Add an empty GPU instancing object to the scene. + const draco::InstanceArrayIndex index = scene->AddInstanceArray(); + draco::InstanceArray *gpu_instancing = scene->GetInstanceArray(index); + + // Add two instances to the GPU instancing object stored in the scene. + DRACO_RETURN_IF_ERROR(gpu_instancing->AddInstance(instance_0)); + DRACO_RETURN_IF_ERROR(gpu_instancing->AddInstance(instance_1)); + + // Assign the GPU instancing object to two mesh groups in two scene nodes. + scene->GetNode(draco::SceneNodeIndex(2))->SetInstanceArrayIndex(index); + scene->GetNode(draco::SceneNodeIndex(4))->SetInstanceArrayIndex(index); + + return draco::OkStatus(); +} + +TEST(SceneTest, TestCopy) { + // Test copying of scene data. + auto src_scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(src_scene, nullptr); + + // Add GPU instancing to the scene for testing. + DRACO_ASSERT_OK(AddGpuInstancingToMilkTruck(src_scene.get())); + ASSERT_EQ(src_scene->NumInstanceArrays(), 1); + ASSERT_EQ(src_scene->NumNodes(), 5); + ASSERT_EQ( + src_scene->GetNode(draco::SceneNodeIndex(0))->GetInstanceArrayIndex(), + draco::kInvalidInstanceArrayIndex); + ASSERT_EQ( + src_scene->GetNode(draco::SceneNodeIndex(1))->GetInstanceArrayIndex(), + draco::kInvalidInstanceArrayIndex); + ASSERT_EQ( + src_scene->GetNode(draco::SceneNodeIndex(2))->GetInstanceArrayIndex(), + draco::InstanceArrayIndex(0)); + ASSERT_EQ( + src_scene->GetNode(draco::SceneNodeIndex(3))->GetInstanceArrayIndex(), + draco::kInvalidInstanceArrayIndex); + ASSERT_EQ( + src_scene->GetNode(draco::SceneNodeIndex(4))->GetInstanceArrayIndex(), + draco::InstanceArrayIndex(0)); + + // Make a copy of the scene. + draco::Scene dst_scene; + dst_scene.Copy(*src_scene); + + ASSERT_EQ(src_scene->NumMeshes(), dst_scene.NumMeshes()); + ASSERT_EQ(src_scene->NumMeshGroups(), dst_scene.NumMeshGroups()); + ASSERT_EQ(src_scene->NumNodes(), dst_scene.NumNodes()); + ASSERT_EQ(src_scene->NumAnimations(), dst_scene.NumAnimations()); + ASSERT_EQ(src_scene->NumSkins(), dst_scene.NumSkins()); + ASSERT_EQ(src_scene->NumLights(), dst_scene.NumLights()); + ASSERT_EQ(src_scene->NumInstanceArrays(), dst_scene.NumInstanceArrays()); + + for (draco::MeshIndex i(0); i < src_scene->NumMeshes(); ++i) { + draco::MeshAreEquivalent eq; + ASSERT_TRUE(eq(src_scene->GetMesh(i), dst_scene.GetMesh(i))); + } + for (draco::MeshGroupIndex i(0); i < src_scene->NumMeshGroups(); ++i) { + ASSERT_EQ(src_scene->GetMeshGroup(i)->NumMeshInstances(), + dst_scene.GetMeshGroup(i)->NumMeshInstances()); + for (int j = 0; j < src_scene->GetMeshGroup(i)->NumMeshInstances(); ++j) { + ASSERT_EQ(src_scene->GetMeshGroup(i)->GetMeshInstance(j).mesh_index, + dst_scene.GetMeshGroup(i)->GetMeshInstance(j).mesh_index); + ASSERT_EQ(src_scene->GetMeshGroup(i)->GetMeshInstance(j).material_index, + dst_scene.GetMeshGroup(i)->GetMeshInstance(j).material_index); + ASSERT_EQ(src_scene->GetMeshGroup(i) + ->GetMeshInstance(j) + .materials_variants_mappings.size(), + dst_scene.GetMeshGroup(i) + ->GetMeshInstance(j) + .materials_variants_mappings.size()); + } + } + for (draco::SceneNodeIndex i(0); i < src_scene->NumNodes(); ++i) { + ASSERT_EQ(src_scene->GetNode(i)->NumParents(), + dst_scene.GetNode(i)->NumParents()); + for (int j = 0; j < src_scene->GetNode(i)->NumParents(); ++j) { + ASSERT_EQ(src_scene->GetNode(i)->Parent(j), + dst_scene.GetNode(i)->Parent(j)); + } + ASSERT_EQ(src_scene->GetNode(i)->NumChildren(), + dst_scene.GetNode(i)->NumChildren()); + for (int j = 0; j < src_scene->GetNode(i)->NumChildren(); ++j) { + ASSERT_EQ(src_scene->GetNode(i)->Child(j), + dst_scene.GetNode(i)->Child(j)); + } + ASSERT_EQ(src_scene->GetNode(i)->GetMeshGroupIndex(), + dst_scene.GetNode(i)->GetMeshGroupIndex()); + ASSERT_EQ(src_scene->GetNode(i)->GetSkinIndex(), + dst_scene.GetNode(i)->GetSkinIndex()); + ASSERT_EQ(src_scene->GetNode(i)->GetLightIndex(), + dst_scene.GetNode(i)->GetLightIndex()); + ASSERT_EQ(src_scene->GetNode(i)->GetInstanceArrayIndex(), + dst_scene.GetNode(i)->GetInstanceArrayIndex()); + } +} + +TEST(SceneTest, TestRemoveMesh) { + // Test that a base mesh can be removed from scene. + auto src_scene_ptr = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(src_scene_ptr, nullptr); + const draco::Scene &src_scene = *src_scene_ptr; + + // Copy scene. + draco::Scene dst_scene; + dst_scene.Copy(src_scene); + ASSERT_EQ(dst_scene.NumMeshes(), 4); + draco::MeshAreEquivalent eq; + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(0)), + src_scene.GetMesh(draco::MeshIndex(0)))); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(1)), + src_scene.GetMesh(draco::MeshIndex(1)))); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(2)), + src_scene.GetMesh(draco::MeshIndex(2)))); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(3)), + src_scene.GetMesh(draco::MeshIndex(3)))); + + // Remove base mesh from scene. + dst_scene.RemoveMesh(draco::MeshIndex(2)); + ASSERT_EQ(dst_scene.NumMeshes(), 3); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(0)), + src_scene.GetMesh(draco::MeshIndex(0)))); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(1)), + src_scene.GetMesh(draco::MeshIndex(1)))); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(2)), + src_scene.GetMesh(draco::MeshIndex(3)))); + + // Remove another base mesh from scene. + dst_scene.RemoveMesh(draco::MeshIndex(1)); + ASSERT_EQ(dst_scene.NumMeshes(), 2); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(0)), + src_scene.GetMesh(draco::MeshIndex(0)))); + ASSERT_TRUE(eq(dst_scene.GetMesh(draco::MeshIndex(1)), + src_scene.GetMesh(draco::MeshIndex(3)))); +} + +TEST(SceneTest, TestRemoveMeshGroup) { + // Test that a mesh group can be removed from scene. + auto src_scene_ptr = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(src_scene_ptr, nullptr); + const draco::Scene &src_scene = *src_scene_ptr; + + // Copy scene. + draco::Scene dst_scene; + dst_scene.Copy(src_scene); + ASSERT_EQ(dst_scene.NumMeshGroups(), 2); + ASSERT_EQ(dst_scene.NumNodes(), 5); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(0))->GetMeshGroupIndex(), + draco::MeshGroupIndex(0)); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(2))->GetMeshGroupIndex(), + draco::MeshGroupIndex(1)); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(4))->GetMeshGroupIndex(), + draco::MeshGroupIndex(1)); + + // Remove mesh group from scene. + dst_scene.RemoveMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(dst_scene.NumMeshGroups(), 1); + ASSERT_EQ(dst_scene.NumNodes(), 5); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(0))->GetMeshGroupIndex(), + draco::kInvalidMeshGroupIndex); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(2))->GetMeshGroupIndex(), + draco::MeshGroupIndex(0)); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(4))->GetMeshGroupIndex(), + draco::MeshGroupIndex(0)); + + // Remove another mesh group from scene. + dst_scene.RemoveMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(dst_scene.NumMeshGroups(), 0); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(0))->GetMeshGroupIndex(), + draco::kInvalidMeshGroupIndex); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(2))->GetMeshGroupIndex(), + draco::kInvalidMeshGroupIndex); + ASSERT_EQ(dst_scene.GetNode(draco::SceneNodeIndex(4))->GetMeshGroupIndex(), + draco::kInvalidMeshGroupIndex); +} + +void CheckMeshMaterials(const draco::Scene &scene, + const std::vector &expected_material_indices) { + ASSERT_EQ(scene.NumMeshes(), expected_material_indices.size()); + std::vector scene_material_indices; + for (draco::MeshGroupIndex i(0); i < scene.NumMeshGroups(); i++) { + const auto mg = scene.GetMeshGroup(i); + for (int mi = 0; mi < mg->NumMeshInstances(); ++mi) { + scene_material_indices.push_back(mg->GetMeshInstance(mi).material_index); + } + } + ASSERT_EQ(scene_material_indices, expected_material_indices); +} + +TEST(SceneTest, TestRemoveMaterial) { + // Test that materials can be removed from a scene. + auto src_scene_ptr = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(src_scene_ptr, nullptr); + const draco::Scene &src_scene = *src_scene_ptr; + ASSERT_EQ(src_scene.GetMaterialLibrary().NumMaterials(), 4); + CheckMeshMaterials(src_scene, {0, 1, 2, 3}); + + // Copy scene. + draco::Scene dst_scene; + dst_scene.Copy(src_scene); + + // Check that referenced material cannot be removed from the scene. + ASSERT_FALSE(dst_scene.RemoveMaterial(2).ok()); + + // Copy scene again, since failed material removal corrupts the scene. + dst_scene.Copy(src_scene); + + // Remove base mesh from scene. Material at index 2 becomes unreferenced. + DRACO_ASSERT_OK(dst_scene.RemoveMesh(draco::MeshIndex(2))); + ASSERT_EQ(dst_scene.GetMaterialLibrary().NumMaterials(), 4); + CheckMeshMaterials(dst_scene, {0, 1, 3}); + + // Check that unreferenced material can be removed from the scene. + DRACO_ASSERT_OK(dst_scene.RemoveMaterial(2)); + ASSERT_EQ(dst_scene.GetMaterialLibrary().NumMaterials(), 3); + CheckMeshMaterials(dst_scene, {0, 1, 2}); + + // Check that material cannot be removed when material index is out of range. + ASSERT_FALSE(dst_scene.RemoveMaterial(-1).ok()); + ASSERT_FALSE(dst_scene.RemoveMaterial(3).ok()); +} + +TEST(SceneTest, TestCopyWithStructuralMetadata) { + // Tests copying of a scene with structural metadata. + auto scene_ptr = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene_ptr, nullptr); + draco::Scene &scene = *scene_ptr; + + // Add structural metadata to the scene. + draco::PropertyTable::Schema schema; + schema.json.SetString("Data"); + scene.GetStructuralMetadata().SetPropertyTableSchema(schema); + + // Copy the scene. + draco::Scene copy; + copy.Copy(scene); + + // Check that the structural metadata has been copied. + ASSERT_EQ( + copy.GetStructuralMetadata().GetPropertyTableSchema().json.GetString(), + "Data"); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/scene/scene_utils.cc b/contrib/draco/src/draco/scene/scene_utils.cc new file mode 100644 index 000000000..a7bf1dcb9 --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_utils.cc @@ -0,0 +1,962 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "draco/scene/scene_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include +#include +#include +#include + +#include "draco/core/draco_index_type_vector.h" +#include "draco/core/hash_utils.h" +#include "draco/core/vector_d.h" +#include "draco/mesh/mesh_splitter.h" +#include "draco/mesh/mesh_utils.h" +#include "draco/scene/scene_indices.h" +#include "draco/texture/texture_utils.h" + +namespace draco { + +IndexTypeVector +SceneUtils::ComputeAllInstances(const Scene &scene) { + IndexTypeVector instances; + + // Traverse the scene assuming multiple root nodes. + const Eigen::Matrix4d transform = Eigen::Matrix4d::Identity(); + + struct Node { + const SceneNodeIndex scene_node_index; + Eigen::Matrix4d transform; + }; + std::vector nodes; + nodes.reserve(scene.NumRootNodes()); + for (int i = 0; i < scene.NumRootNodes(); ++i) { + nodes.push_back({scene.GetRootNodeIndex(i), transform}); + } + + while (!nodes.empty()) { + const Node node = nodes.back(); + nodes.pop_back(); + const SceneNode &scene_node = *scene.GetNode(node.scene_node_index); + const Eigen::Matrix4d combined_transform = + node.transform * + scene_node.GetTrsMatrix().ComputeTransformationMatrix(); + + // Create instances from node meshes. + const MeshGroupIndex mesh_group_index = scene_node.GetMeshGroupIndex(); + if (mesh_group_index != kInvalidMeshGroupIndex) { + const MeshGroup &mesh_group = *scene.GetMeshGroup(mesh_group_index); + for (int i = 0; i < mesh_group.NumMeshInstances(); i++) { + const MeshIndex mesh_index = mesh_group.GetMeshInstance(i).mesh_index; + if (mesh_index != kInvalidMeshIndex) { + instances.push_back( + {mesh_index, node.scene_node_index, i, combined_transform}); + } + } + } + + // Traverse children nodes. + for (int i = 0; i < scene_node.NumChildren(); i++) { + nodes.push_back({scene_node.Child(i), combined_transform}); + } + } + return instances; +} + +Eigen::Matrix4d SceneUtils::ComputeGlobalNodeTransform(const Scene &scene, + SceneNodeIndex index) { + Eigen::Matrix4d transform = Eigen::Matrix4d::Identity(); + while (index != kInvalidSceneNodeIndex) { + const SceneNode *const node = scene.GetNode(index); + transform = node->GetTrsMatrix().ComputeTransformationMatrix() * transform; + index = node->NumParents() == 1 ? node->Parent(0) : kInvalidSceneNodeIndex; + } + return transform; +} + +IndexTypeVector SceneUtils::NumMeshInstances( + const Scene &scene) { + const auto instances = ComputeAllInstances(scene); + IndexTypeVector num_mesh_instances(scene.NumMeshes(), 0); + for (MeshInstanceIndex i(0); i < instances.size(); i++) { + const MeshInstance &instance = instances[i]; + num_mesh_instances[instance.mesh_index]++; + } + return num_mesh_instances; +} + +int SceneUtils::GetMeshInstanceMaterialIndex(const Scene &scene, + const MeshInstance &instance) { + const auto *const node = scene.GetNode(instance.scene_node_index); + return scene.GetMeshGroup(node->GetMeshGroupIndex()) + ->GetMeshInstance(instance.mesh_group_mesh_index) + .material_index; +} + +int SceneUtils::NumFacesOnBaseMeshes(const Scene &scene) { + int num_faces = 0; + for (MeshIndex i(0); i < scene.NumMeshes(); ++i) { + num_faces += scene.GetMesh(i).num_faces(); + } + return num_faces; +} + +int SceneUtils::NumFacesOnInstancedMeshes(const Scene &scene) { + const auto instances = ComputeAllInstances(scene); + int num_faces = 0; + for (MeshInstanceIndex i(0); i < instances.size(); i++) { + const MeshInstance &instance = instances[i]; + num_faces += scene.GetMesh(instance.mesh_index).num_faces(); + } + return num_faces; +} + +int SceneUtils::NumPointsOnBaseMeshes(const Scene &scene) { + int num_points = 0; + for (MeshIndex i(0); i < scene.NumMeshes(); ++i) { + num_points += scene.GetMesh(i).num_points(); + } + return num_points; +} + +int SceneUtils::NumPointsOnInstancedMeshes(const Scene &scene) { + const auto instances = ComputeAllInstances(scene); + int num_points = 0; + for (MeshInstanceIndex i(0); i < instances.size(); i++) { + const MeshInstance &instance = instances[i]; + num_points += scene.GetMesh(instance.mesh_index).num_points(); + } + return num_points; +} + +int SceneUtils::NumAttEntriesOnBaseMeshes(const Scene &scene, + GeometryAttribute::Type att_type) { + int num_att_entries = 0; + for (MeshIndex i(0); i < scene.NumMeshes(); ++i) { + const Mesh &mesh = scene.GetMesh(i); + const PointAttribute *att = mesh.GetNamedAttribute(att_type); + if (att != nullptr) { + num_att_entries += att->size(); + } + } + return num_att_entries; +} + +int SceneUtils::NumAttEntriesOnInstancedMeshes( + const Scene &scene, GeometryAttribute::Type att_type) { + const auto instances = ComputeAllInstances(scene); + int num_att_entries = 0; + for (MeshInstanceIndex i(0); i < instances.size(); i++) { + const MeshInstance &instance = instances[i]; + const Mesh &mesh = scene.GetMesh(instance.mesh_index); + const PointAttribute *att = mesh.GetNamedAttribute(att_type); + if (att != nullptr) { + num_att_entries += att->size(); + } + } + return num_att_entries; +} + +BoundingBox SceneUtils::ComputeBoundingBox(const Scene &scene) { + // Compute bounding box that includes all scene mesh instances. + const auto instances = ComputeAllInstances(scene); + BoundingBox scene_bbox; + for (MeshInstanceIndex i(0); i < instances.size(); i++) { + const MeshInstance &instance = instances[i]; + const BoundingBox mesh_bbox = + ComputeMeshInstanceBoundingBox(scene, instance); + scene_bbox.Update(mesh_bbox); + } + return scene_bbox; +} + +BoundingBox SceneUtils::ComputeMeshInstanceBoundingBox( + const Scene &scene, const MeshInstance &instance) { + const Mesh &mesh = scene.GetMesh(instance.mesh_index); + BoundingBox mesh_bbox; + auto pc_att = mesh.GetNamedAttribute(GeometryAttribute::POSITION); + Eigen::Vector4d position; + position[3] = 1.0; + for (AttributeValueIndex i(0); i < pc_att->size(); ++i) { + pc_att->ConvertValue(i, &position[0]); + const Eigen::Vector4d transformed = instance.transform * position; + mesh_bbox.Update({static_cast(transformed[0]), + static_cast(transformed[1]), + static_cast(transformed[2])}); + } + return mesh_bbox; +} + +namespace { + +// Updates texture pointers in mesh features of |mesh| to texture pointers +// stored in |new_texture_library|. |texture_to_index_map| stores texture +// indices of the old texture pointers within |mesh|. +void UpdateMeshFeaturesTexturesOnMesh( + const std::unordered_map &texture_to_index_map, + TextureLibrary *new_texture_library, Mesh *mesh) { + for (MeshFeaturesIndex mfi(0); mfi < mesh->NumMeshFeatures(); ++mfi) { + mesh->UpdateMeshFeaturesTexturePointer( + texture_to_index_map, new_texture_library, &mesh->GetMeshFeatures(mfi)); + } +} + +} // namespace + +StatusOr> SceneUtils::MeshToScene( + std::unique_ptr mesh) { + const size_t num_mesh_materials = mesh->GetMaterialLibrary().NumMaterials(); + std::unique_ptr scene(new Scene()); + if (num_mesh_materials > 0) { + scene->GetMaterialLibrary().Copy(mesh->GetMaterialLibrary()); + mesh->GetMaterialLibrary().Clear(); + } else { + // Create a default material for the scene. + scene->GetMaterialLibrary().MutableMaterial(0); + } + + // Copy mesh feature textures. + scene->GetNonMaterialTextureLibrary().Copy( + mesh->GetNonMaterialTextureLibrary()); + + const auto old_texture_to_index_map = + mesh->GetNonMaterialTextureLibrary().ComputeTextureToIndexMap(); + + const SceneNodeIndex scene_node_index = scene->AddNode(); + SceneNode *const scene_node = scene->GetNode(scene_node_index); + const MeshGroupIndex mesh_group_index = scene->AddMeshGroup(); + MeshGroup *const mesh_group = scene->GetMeshGroup(mesh_group_index); + + if (num_mesh_materials <= 1) { + const MeshIndex mesh_index = scene->AddMesh(std::move(mesh)); + if (mesh_index == kInvalidMeshIndex) { + // No idea whether this can happen. It's not covered by any unit test. + return Status(Status::DRACO_ERROR, "Could not add Draco mesh to scene."); + } + mesh_group->AddMeshInstance({mesh_index, 0, {}}); + + UpdateMeshFeaturesTexturesOnMesh(old_texture_to_index_map, + &scene->GetNonMaterialTextureLibrary(), + &scene->GetMesh(mesh_index)); + + } else { + const int32_t mat_att_id = + mesh->GetNamedAttributeId(GeometryAttribute::MATERIAL); + if (mat_att_id == -1) { + // Probably dead code, not covered by any unit test. + return Status(Status::DRACO_ERROR, + "Internal error in MeshToScene: " + "GetNamedAttributeId(MATERIAL) returned -1"); + } + const PointAttribute *const mat_att = + mesh->GetNamedAttribute(GeometryAttribute::MATERIAL); + if (mat_att == nullptr) { + // Probably dead code, not covered by any unit test. + return Status(Status::DRACO_ERROR, + "Internal error in MeshToScene: " + "GetNamedAttribute(MATERIAL) returned nullptr"); + } + + MeshSplitter splitter; + DRACO_ASSIGN_OR_RETURN(MeshSplitter::MeshVector split_meshes, + splitter.SplitMesh(*mesh, mat_att_id)); + // Note: cannot clear mesh here, since mat_att points into it. + for (size_t i = 0; i < split_meshes.size(); ++i) { + if (split_meshes[i] == nullptr) { + // Probably dead code, not covered by any unit test. + continue; + } + const MeshIndex mesh_index = scene->AddMesh(std::move(split_meshes[i])); + if (mesh_index == kInvalidMeshIndex) { + // No idea whether this can happen. It's not covered by any unit test. + return Status(Status::DRACO_ERROR, + "Could not add Draco mesh to scene."); + } + + int material_index = 0; + mat_att->GetValue(AttributeValueIndex(i), &material_index); + mesh_group->AddMeshInstance({mesh_index, material_index, {}}); + + // Copy over mesh features that were associated with the |material_index|. + Mesh &scene_mesh = scene->GetMesh(mesh_index); + Mesh::CopyMeshFeaturesForMaterial(*mesh, &scene_mesh, material_index); + UpdateMeshFeaturesTexturesOnMesh(old_texture_to_index_map, + &scene->GetNonMaterialTextureLibrary(), + &scene_mesh); + } + } + + scene_node->SetMeshGroupIndex(mesh_group_index); + scene->AddRootNodeIndex(scene_node_index); + return scene; +} + +void SceneUtils::PrintInfo(const Scene &input, const Scene &simplified, + bool verbose) { + struct Printer { + Printer(const Scene &input, const Scene &simplified) + : input(input), simplified(simplified), print_instanced_info(false) { + // Info about the instanced meshes is printed if some of the meshes have + // multiple instances and also if the number of base meshes has changed. + auto input_instances = SceneUtils::NumMeshInstances(input); + auto simplified_instances = SceneUtils::NumMeshInstances(simplified); + if (input_instances.size() != simplified_instances.size()) { + print_instanced_info = true; + return; + } + for (MeshIndex i(0); i < input_instances.size(); i++) { + if (input_instances[i] != 1 || simplified_instances[i] != 1) { + print_instanced_info = true; + return; + } + } + } + + void PrintInfoHeader() const { + printf("\n"); + printf("%21s | geometry: base", ""); + if (print_instanced_info) { + printf(" instanced"); + } + printf("\n"); + } + + void PrintInfoRow(const std::string &label, int count_input_base, + int count_input_instanced, int count_simplified_base, + int count_simplified_instanced) const { + // Do not clutter the printout with empty info. + if (count_input_base == 0 && count_input_instanced == 0) { + return; + } + printf(" ----------------------------------------------"); + if (print_instanced_info) { + printf("-------------"); + } + printf("\n"); + printf("%21s | input: %12d", label.c_str(), count_input_base); + if (print_instanced_info) { + printf(" %12d", count_input_instanced); + } + printf("\n"); + printf("%21s | simplified: %12d", "", count_simplified_base); + if (print_instanced_info) { + printf(" %12d", count_simplified_instanced); + } + printf("\n"); + } + + void PrintAttInfoRow(const std::string &label, const draco::Scene &input, + const draco::Scene &simplified, + draco::GeometryAttribute::Type att_type) const { + PrintInfoRow(label, NumAttEntriesOnBaseMeshes(input, att_type), + NumAttEntriesOnInstancedMeshes(input, att_type), + NumAttEntriesOnBaseMeshes(simplified, att_type), + NumAttEntriesOnInstancedMeshes(simplified, att_type)); + } + + const Scene &input; + const Scene &simplified; + bool print_instanced_info; + }; + + // Print information about input and simplified scenes. + const Printer printer(input, simplified); + printer.PrintInfoHeader(); + if (verbose) { + const int num_meshes_input_base = input.NumMeshes(); + const int num_meshes_simplified_base = simplified.NumMeshes(); + const int num_meshes_input_instanced = ComputeAllInstances(input).size(); + const int num_meshes_simplified_instanced = + ComputeAllInstances(simplified).size(); + printer.PrintInfoRow("Number of meshes", num_meshes_input_base, + num_meshes_input_instanced, num_meshes_simplified_base, + num_meshes_simplified_instanced); + } + printer.PrintInfoRow("Number of faces", NumFacesOnBaseMeshes(input), + NumFacesOnInstancedMeshes(input), + NumFacesOnBaseMeshes(simplified), + NumFacesOnInstancedMeshes(simplified)); + if (verbose) { + printer.PrintInfoRow("Number of points", NumPointsOnBaseMeshes(input), + NumPointsOnInstancedMeshes(input), + NumPointsOnBaseMeshes(simplified), + NumPointsOnInstancedMeshes(simplified)); + printer.PrintAttInfoRow("Number of positions", input, simplified, + draco::GeometryAttribute::POSITION); + printer.PrintAttInfoRow("Number of normals", input, simplified, + draco::GeometryAttribute::NORMAL); + printer.PrintAttInfoRow("Number of colors", input, simplified, + draco::GeometryAttribute::COLOR); + printer.PrintInfoRow("Number of materials", + input.GetMaterialLibrary().NumMaterials(), + simplified.GetMaterialLibrary().NumMaterials(), + input.GetMaterialLibrary().NumMaterials(), + simplified.GetMaterialLibrary().NumMaterials()); + } +} + +StatusOr> SceneUtils::InstantiateMesh( + const Scene &scene, const MeshInstance &instance) { + // Check if the |scene| has base mesh corresponding to mesh |instance|. + if (scene.NumMeshes() <= instance.mesh_index.value()) { + Status(Status::DRACO_ERROR, "Scene has no corresponding base mesh."); + } + + // Check that mesh has valid positions. + const Mesh &base_mesh = scene.GetMesh(instance.mesh_index); + const int32_t pos_id = + base_mesh.GetNamedAttributeId(GeometryAttribute::POSITION); + const PointAttribute *const pos_att = base_mesh.attribute(pos_id); + if (pos_att == nullptr) { + return Status(Status::DRACO_ERROR, "Mesh has no positions."); + } + if (pos_att->data_type() != DT_FLOAT32 || pos_att->num_components() != 3) { + return Status(Status::DRACO_ERROR, "Mesh has invalid positions."); + } + + // Copy the base mesh from |scene|. + std::unique_ptr mesh(new Mesh()); + mesh->Copy(base_mesh); + + // Apply transformation to mesh unless transformation is identity. + if (instance.transform != Eigen::Matrix4d::Identity()) { + MeshUtils::TransformMesh(instance.transform, mesh.get()); + } + return mesh; +} + +namespace { + +// Helper class for deleting unused nodes from the scene. +class SceneUnusedNodeRemover { + public: + // Removes unused nodes from the |scene|. + void RemoveUnusedNodes(Scene *scene) { + // Finds all unused nodes and initializes |node_map_| that maps old node + // indices to new node indices. + const int num_unused_nodes = FindUnusedNodes(*scene); + if (num_unused_nodes == 0) { + return; // All nodes are used. + } + + // Update indices of all scene elements accounting for nodes that are going + // to be removed from the scene. + UpdateNodeIndices(scene); + RemoveUnusedNodesFromScene(scene); + } + + private: + // Returns the number of unused nodes. + int FindUnusedNodes(const Scene &scene) { + // First all nodes are considered unused (mapped to invalid index). + // Initially if a node is used, we just map it to its own index. The final + // mapping will be updated once we know all used nodes. + node_map_.resize(scene.NumNodes(), kInvalidSceneNodeIndex); + for (SceneNodeIndex sni(0); sni < scene.NumNodes(); ++sni) { + // If the scene node has a valid mesh group, mark it as used. + if (scene.GetNode(sni)->GetMeshGroupIndex() != kInvalidMeshGroupIndex) { + node_map_[sni] = sni; + } + } + + // Preserve nodes used by animations. + for (AnimationIndex i(0); i < scene.NumAnimations(); i++) { + const Animation &animation = *scene.GetAnimation(i); + for (int channel_i = 0; channel_i < animation.NumChannels(); + channel_i++) { + const SceneNodeIndex node_index( + animation.GetChannel(channel_i)->target_index); + node_map_[node_index] = node_index; + } + } + for (SkinIndex i(0); i < scene.NumSkins(); i++) { + const Skin &skin = *scene.GetSkin(i); + for (int j = 0; j < skin.NumJoints(); j++) { + const SceneNodeIndex node_index = skin.GetJoint(j); + node_map_[node_index] = node_index; + } + const SceneNodeIndex root_index = skin.GetJointRoot(); + if (root_index != kInvalidSceneNodeIndex) { + node_map_[root_index] = root_index; + } + } + + // Ensure that "unused" nodes with used child nodes are marked as used + // (a node can't be deleted as long as it has a used child node). + for (int r = 0; r < scene.NumRootNodes(); ++r) { + UpdateUsedNodesFromSceneGraph(scene, scene.GetRootNodeIndex(r)); + } + + // All used / unused nodes are known. Find new indices for all scene nodes. + int num_valid_nodes = 0; + for (SceneNodeIndex sni(0); sni < scene.NumNodes(); ++sni) { + if (node_map_[sni] != kInvalidSceneNodeIndex) { + node_map_[sni] = SceneNodeIndex(num_valid_nodes++); + } + } + // Return the number of nodes that were unused. + return scene.NumNodes() - num_valid_nodes; + } + + // Recursively traverse node |sni| and mark it as used as long as it has a + // used child node. The function returns true when |sni| is a used node. + bool UpdateUsedNodesFromSceneGraph(const Scene &scene, SceneNodeIndex sni) { + const auto &node = scene.GetNode(sni); + bool is_any_child_node_used = false; + for (int c = 0; c < node->NumChildren(); ++c) { + const SceneNodeIndex cni = node->Child(c); + // Check if the child node is used. + const bool is_c_used = UpdateUsedNodesFromSceneGraph(scene, cni); + if (is_c_used) { + is_any_child_node_used = true; + } + } + if (is_any_child_node_used) { + // The node must be used even if it was previously marked as unused. + node_map_[sni] = sni; + } + // Returns whether this node is used or not. + return node_map_[sni] != kInvalidSceneNodeIndex; + } + + // Remaps existing node indices at various scene elements to new node indices + // defined by |node_map_|. + void UpdateNodeIndices(Scene *scene) const { + // Update node indices on child / parent nodes. + std::vector indices; + for (SceneNodeIndex sni(0); sni < scene->NumNodes(); ++sni) { + indices = scene->GetNode(sni)->Children(); + scene->GetNode(sni)->RemoveAllChildren(); + for (int j = 0; j < indices.size(); ++j) { + const SceneNodeIndex new_sni = node_map_[indices[j]]; + if (new_sni != kInvalidSceneNodeIndex) { + scene->GetNode(sni)->AddChildIndex(new_sni); + } + } + indices = scene->GetNode(sni)->Parents(); + scene->GetNode(sni)->RemoveAllParents(); + for (int j = 0; j < indices.size(); ++j) { + const SceneNodeIndex new_sni = node_map_[indices[j]]; + if (new_sni != kInvalidSceneNodeIndex) { + scene->GetNode(sni)->AddParentIndex(new_sni); + } + } + } + + // Update root node indices. + indices = scene->GetRootNodeIndices(); + scene->RemoveAllRootNodeIndices(); + for (int ri = 0; ri < indices.size(); ++ri) { + const SceneNodeIndex new_rni = node_map_[indices[ri]]; + if (new_rni != kInvalidSceneNodeIndex) { + scene->AddRootNodeIndex(new_rni); + } + } + + // Update node indices used by animations. + for (AnimationIndex i(0); i < scene->NumAnimations(); i++) { + Animation &animation = *scene->GetAnimation(i); + for (int i = 0; i < animation.NumChannels(); i++) { + const SceneNodeIndex node_index(animation.GetChannel(i)->target_index); + animation.GetChannel(i)->target_index = node_map_[node_index].value(); + } + } + for (SkinIndex i(0); i < scene->NumSkins(); i++) { + Skin &skin = *scene->GetSkin(i); + for (int j = 0; j < skin.NumJoints(); j++) { + const SceneNodeIndex node_index = skin.GetJoint(j); + skin.GetJoint(j) = node_map_[node_index]; + } + const SceneNodeIndex root_index = skin.GetJointRoot(); + if (root_index != kInvalidSceneNodeIndex) { + skin.SetJointRoot(node_map_[root_index]); + } + } + } + + // Removes all unused nodes from the scene. + void RemoveUnusedNodesFromScene(Scene *scene) const { + int num_valid_nodes = 0; + // Copy over nodes to their new position in the nodes array. + for (SceneNodeIndex sni(0); sni < scene->NumNodes(); ++sni) { + const SceneNodeIndex new_sni = node_map_[sni]; + if (new_sni == kInvalidSceneNodeIndex) { + continue; + } + num_valid_nodes++; + if (sni != new_sni) { + // Copy over the |sni| node to the new location (|new_sni| is lower than + // |sni|). + scene->GetNode(new_sni)->Copy(*scene->GetNode(sni)); + } + } + // Resize the nodes in the scene to account for the unused ones. This will + // delete all unused nodes. + scene->ResizeNodes(num_valid_nodes); + } + + IndexTypeVector node_map_; +}; + +} // namespace + +void SceneUtils::Cleanup(Scene *scene) { Cleanup(scene, CleanupOptions()); } + +void SceneUtils::Cleanup(Scene *scene, const CleanupOptions &options) { + // Remove invalid mesh indices from mesh groups. + if (options.remove_invalid_mesh_instances) { + for (MeshGroupIndex i(0); i < scene->NumMeshGroups(); i++) { + scene->GetMeshGroup(i)->RemoveMeshInstances(kInvalidMeshIndex); + } + } + + // Find references to mesh groups. + std::vector is_mesh_group_referenced(scene->NumMeshGroups(), false); + for (SceneNodeIndex i(0); i < scene->NumNodes(); i++) { + const SceneNode &node = *scene->GetNode(i); + const MeshGroupIndex mesh_group_index = node.GetMeshGroupIndex(); + if (mesh_group_index != kInvalidMeshGroupIndex) { + is_mesh_group_referenced[mesh_group_index.value()] = true; + } + } + + // Find references to base meshes from referenced mesh groups and find mesh + // groups that have no valid references to base meshes. + std::vector is_base_mesh_referenced(scene->NumMeshes(), false); + std::vector is_mesh_group_empty(scene->NumMeshGroups(), false); + for (MeshGroupIndex i(0); i < scene->NumMeshGroups(); i++) { + if (!is_mesh_group_referenced[i.value()]) { + continue; + } + const MeshGroup &mesh_group = *scene->GetMeshGroup(i); + bool mesh_group_is_empty = true; + for (int j = 0; j < mesh_group.NumMeshInstances(); j++) { + const MeshIndex mesh_index = mesh_group.GetMeshInstance(j).mesh_index; + mesh_group_is_empty = false; + is_base_mesh_referenced[mesh_index.value()] = true; + } + if (mesh_group_is_empty) { + is_mesh_group_empty[i.value()] = true; + } + } + + if (options.remove_unused_meshes) { + // Remove base meshes with no references to them. + for (int i = scene->NumMeshes() - 1; i >= 0; i--) { + const MeshIndex mi(i); + if (!is_base_mesh_referenced[mi.value()]) { + scene->RemoveMesh(mi); + } + } + } + + if (options.remove_unused_mesh_groups) { + // Remove empty mesh groups with no geometry or no references to them. + for (int i = scene->NumMeshGroups() - 1; i >= 0; i--) { + const MeshGroupIndex mgi(i); + if (is_mesh_group_empty[mgi.value()] || + !is_mesh_group_referenced[mgi.value()]) { + scene->RemoveMeshGroup(mgi); + } + } + } + + // Find materials that reference a texture. + MaterialLibrary &material_library = scene->GetMaterialLibrary(); + std::vector materials_with_textures(material_library.NumMaterials(), + false); + for (int i = 0; i < material_library.NumMaterials(); ++i) { + if (material_library.GetMaterial(i)->NumTextureMaps() > 0) { + materials_with_textures[i] = true; + } + } + + // Maps material index to a set of meshes that use that material. + std::vector> material_meshes( + material_library.NumMaterials()); + + // Maps mesh index to a set of materials used by that mesh. + IndexTypeVector> mesh_materials( + scene->NumMeshes()); + + // Maps mesh index to a set of tex coord indices referenced by materials. + IndexTypeVector> tex_coord_referenced( + scene->NumMeshes()); + + // Populate the maps that will be used to remove unused texture coordinates. + for (int mgi = 0; mgi < scene->NumMeshGroups(); ++mgi) { + const MeshGroup *const mesh_group = + scene->GetMeshGroup(MeshGroupIndex(mgi)); + for (int mi = 0; mi < mesh_group->NumMeshInstances(); ++mi) { + const MeshIndex mesh_index = mesh_group->GetMeshInstance(mi).mesh_index; + const int material_index = mesh_group->GetMeshInstance(mi).material_index; + if (material_index == -1) { + continue; + } + + // Populate mesh-material mapping. + material_meshes[material_index].insert(mesh_index); + mesh_materials[mesh_index].insert(material_index); + + // Populate texture coordinate indices referenced by material textures. + const auto material = material_library.GetMaterial(material_index); + for (int i = 0; i < material->NumTextureMaps(); i++) { + const TextureMap *const texture_map = material->GetTextureMapByIndex(i); + const int tex_coord_index = texture_map->tex_coord_index(); + tex_coord_referenced[mesh_index].insert(tex_coord_index); + } + } + } + + // From each mesh, remove texture coordinate attributes that are not + // referenced by any materials and decrement texture coordinate indices in + // texture maps of the mesh materials accordingly. + if (options.remove_unused_tex_coords) { + for (MeshIndex mi(0); mi < scene->NumMeshes(); ++mi) { + // Do not remove unreferenced texture coordinates when the mesh materials + // are used by any other meshes to avoid corrupting those other meshes. + // TODO(vytyaz): Consider removing this limitation. + bool remove_tex_coord = true; + for (const int material_index : mesh_materials[mi]) { + if (material_meshes[material_index].size() != 1) { + // Materials of this mesh are used by other meshes. + remove_tex_coord = false; + break; + } + } + if (!remove_tex_coord) { + continue; + } + + // Remove unreferenced texture coordinate sets from this mesh. + Mesh &mesh = scene->GetMesh(mi); + const int tex_coord_count = + mesh.NumNamedAttributes(GeometryAttribute::TEX_COORD); + for (int tci = tex_coord_count - 1; tci >= 0; tci--) { + if (tex_coord_referenced[mi].count(tci) != 0) { + // Texture coordinate set is referenced. + continue; + } + mesh.DeleteAttribute( + mesh.GetNamedAttributeId(GeometryAttribute::TEX_COORD, tci)); + + // Decrement texture coordinate indices in all materials of this mesh. + for (const int material_index : mesh_materials[mi]) { + auto material = material_library.MutableMaterial(material_index); + for (int i = 0; i < material->NumTextureMaps(); i++) { + auto texture_map = material->GetTextureMapByIndex(i); + // Decrement the indices that are greater than the removed index. + if (texture_map->tex_coord_index() > tci) { + texture_map->SetProperties(texture_map->type(), + texture_map->tex_coord_index() - 1); + } + } + } + } + } + } + + if (options.remove_unused_materials) { + // Remove materials that are not used by any mesh. + for (int i = material_library.NumMaterials() - 1; i >= 0; --i) { + if (material_meshes[i].empty()) { + // Material |i| is not used. + scene->RemoveMaterial(i); + } + } + } + + if (options.remove_unused_nodes) { + SceneUnusedNodeRemover node_remover; + node_remover.RemoveUnusedNodes(scene); + } +} + +void SceneUtils::RemoveMeshInstances(const std::vector &instances, + Scene *scene) { + // Remove mesh instances from the scene. + for (const SceneUtils::MeshInstance &instance : instances) { + const MeshGroupIndex mgi = + scene->GetNode(instance.scene_node_index)->GetMeshGroupIndex(); + + // Create a new mesh group with removed instance (we can't just delete the + // instance from the mesh group directly, because the same mesh group may + // be used by multiple scene nodes). + const MeshGroupIndex new_mesh_group_index = scene->AddMeshGroup(); + MeshGroup &new_mesh_group = *scene->GetMeshGroup(new_mesh_group_index); + + new_mesh_group.Copy(*scene->GetMeshGroup(mgi)); + new_mesh_group.RemoveMeshInstances(instance.mesh_index); + + // Assign the new mesh group to the scene node. Unused mesh groups will be + // automatically removed later during a scene cleanup operation. + scene->GetNode(instance.scene_node_index) + ->SetMeshGroupIndex(new_mesh_group_index); + } + + // Remove duplicate mesh groups that may have been created during the instance + // removal process. + DeduplicateMeshGroups(scene); +} + +void SceneUtils::DeduplicateMeshGroups(Scene *scene) { + if (scene->NumMeshGroups() <= 1) { + return; + } + + // Signature of a mesh group used for detecting duplicates. + struct MeshGroupSignature { + const MeshGroupIndex mesh_group_index; + const MeshGroup &mesh_group; + MeshGroupSignature(MeshGroupIndex mgi, const MeshGroup &mesh_group) + : mesh_group_index(mgi), mesh_group(mesh_group) {} + + bool operator==(const MeshGroupSignature &signature) const { + if (mesh_group.GetName() != signature.mesh_group.GetName()) { + return false; + } + if (mesh_group.NumMeshInstances() != + signature.mesh_group.NumMeshInstances()) { + return false; + } + // TODO(ostava): We may consider sorting meshes within a mesh group to + // make the order of meshes irrelevant. This should be done only for + // meshes with opaque materials though, because for transparent + // geometries, the order matters. + for (int i = 0; i < mesh_group.NumMeshInstances(); ++i) { + if (mesh_group.GetMeshInstance(i) != + signature.mesh_group.GetMeshInstance(i)) { + return false; + } + } + return true; + } + struct Hash { + size_t operator()(const MeshGroupSignature &signature) const { + size_t hash = 79; // Magic number. + const MeshGroup &group = signature.mesh_group; + hash = HashCombine(group.GetName(), hash); + hash = HashCombine(group.NumMeshInstances(), hash); + for (int i = 0; i < group.NumMeshInstances(); ++i) { + const MeshGroup::MeshInstance &instance = group.GetMeshInstance(i); + hash = HashCombine(instance.mesh_index, hash); + hash = HashCombine(instance.material_index, hash); + hash = HashCombine(instance.materials_variants_mappings.size(), hash); + for (const MeshGroup::MaterialsVariantsMapping &mapping : + instance.materials_variants_mappings) { + hash = HashCombine(mapping.material, hash); + hash = HashCombine(mapping.variants.size(), hash); + for (const int &variant : mapping.variants) { + hash = HashCombine(variant, hash); + } + } + } + return hash; + } + }; + }; + + // Set holding unique mesh groups. + std::unordered_set + unique_mesh_groups; + IndexTypeVector parent_mesh_group( + scene->NumMeshGroups()); + for (MeshGroupIndex mgi(0); mgi < scene->NumMeshGroups(); ++mgi) { + const MeshGroup *mg = scene->GetMeshGroup(mgi); + const MeshGroupSignature signature(mgi, *mg); + auto it = unique_mesh_groups.find(signature); + if (it != unique_mesh_groups.end()) { + parent_mesh_group[mgi] = it->mesh_group_index; + } else { + parent_mesh_group[mgi] = kInvalidMeshGroupIndex; + unique_mesh_groups.insert(signature); + } + } + + // Go over all nodes and update mesh groups if needed. + for (SceneNodeIndex sni(0); sni < scene->NumNodes(); ++sni) { + const MeshGroupIndex mgi = scene->GetNode(sni)->GetMeshGroupIndex(); + if (mgi == kInvalidMeshGroupIndex || + parent_mesh_group[mgi] == kInvalidMeshGroupIndex) { + continue; // Nothing to update. + } + scene->GetNode(sni)->SetMeshGroupIndex(parent_mesh_group[mgi]); + } + + // Remove any unused mesh groups. + Cleanup(scene); +} + +void SceneUtils::SetDracoCompressionOptions( + const DracoCompressionOptions *options, Scene *scene) { + for (MeshIndex i(0); i < scene->NumMeshes(); ++i) { + Mesh &mesh = scene->GetMesh(i); + if (options == nullptr) { + mesh.SetCompressionEnabled(false); + } else { + mesh.SetCompressionEnabled(true); + mesh.SetCompressionOptions(*options); + } + } +} + +bool SceneUtils::IsDracoCompressionEnabled(const Scene &scene) { + for (MeshIndex i(0); i < scene.NumMeshes(); ++i) { + if (scene.GetMesh(i).IsCompressionEnabled()) { + return true; + } + } + return false; +} + +IndexTypeVector +SceneUtils::FindLargestBaseMeshTransforms(const Scene &scene) { + IndexTypeVector transforms( + scene.NumMeshes(), Eigen::Matrix4d::Identity()); + + // In case a mesh has multiple instances we want to use the instance with + // the largest scale. + IndexTypeVector transform_scale(scene.NumMeshes(), 0.f); + + const auto instances = SceneUtils::ComputeAllInstances(scene); + for (MeshInstanceIndex i(0); i < instances.size(); ++i) { + const auto &instance = instances[i]; + + // Compute the scale of the transform. + const Vector3f scale_vec(instance.transform.col(0).norm(), + instance.transform.col(1).norm(), + instance.transform.col(2).norm()); + + // In our framework we support uniform scale only. For now, just take the + // maximum scale across all axes. + // TODO(ostava): Investigate how to properly support non-uniform scaling. + const float max_scale = scale_vec.MaxCoeff(); + + if (transform_scale[instance.mesh_index] < max_scale) { + transform_scale[instance.mesh_index] = max_scale; + transforms[instance.mesh_index] = instance.transform; + } + } + + return transforms; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/scene_utils.h b/contrib/draco/src/draco/scene/scene_utils.h new file mode 100644 index 000000000..5b978c3c5 --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_utils.h @@ -0,0 +1,150 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_SCENE_SCENE_UTILS_H_ +#define DRACO_SCENE_SCENE_UTILS_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/attributes/geometry_attribute.h" +#include "draco/scene/scene.h" + +namespace draco { + +// Helper class containing various utility functions operating on draco::Scene. +class SceneUtils { + public: + // Helper struct holding instanced meshes and their transformations. + struct MeshInstance { + // Index of the parent mesh in the draco::Scene. + MeshIndex mesh_index; + // Index of the node in the draco::Scene. + SceneNodeIndex scene_node_index; + // Index of the mesh in the mesh group. + int mesh_group_mesh_index; + // Transform of the instance from the mesh local space to the global space + // of the scene. + Eigen::Matrix4d transform; + }; + + // Computes all mesh instances in the |scene|. + static IndexTypeVector ComputeAllInstances( + const Scene &scene); + + // Computes global transform matrix of a |scene| node given by its |index|. + static Eigen::Matrix4d ComputeGlobalNodeTransform(const Scene &scene, + SceneNodeIndex index); + + // Returns a vector of mesh instance counts for all base meshes. + static IndexTypeVector NumMeshInstances(const Scene &scene); + + // Returns the material index of the given |instance| or -1 if the mesh + // |instance| has a default material. + static int GetMeshInstanceMaterialIndex(const Scene &scene, + const MeshInstance &instance); + + // Returns the total number of faces on all base meshes of the scene (not + // counting instances). + static int NumFacesOnBaseMeshes(const Scene &scene); + + // Returns the total number of faces on all meshes of the scenes, including + // all instances of the same mesh. + static int NumFacesOnInstancedMeshes(const Scene &scene); + + // Returns the total number of points on all base meshes of the scene (not + // counting instances). + static int NumPointsOnBaseMeshes(const Scene &scene); + + // Returns the total number of points on all meshes of the scenes, including + // all instances of the same mesh. + static int NumPointsOnInstancedMeshes(const Scene &scene); + + // Returns the total number of attribute entries on all base meshes of the + // scene (not counting instances) for the first attribute of |att_type|. + static int NumAttEntriesOnBaseMeshes(const Scene &scene, + GeometryAttribute::Type att_type); + + // Returns the total number of attribute ent on all meshes of the scenes, + // including all instances of the same mesh for the first attribute of + // |att_type|. + static int NumAttEntriesOnInstancedMeshes(const Scene &scene, + GeometryAttribute::Type att_type); + + // Returns the bounding box of the scene. + static BoundingBox ComputeBoundingBox(const Scene &scene); + + // Returns the bounding box of a mesh instance. + static BoundingBox ComputeMeshInstanceBoundingBox( + const Scene &scene, const MeshInstance &instance); + + // Prints info about input and simplified scenes. + static void PrintInfo(const Scene &input, const Scene &simplified, + bool verbose); + + // Converts a draco::Mesh into a draco::Scene. If the passed-in `mesh` has + // multiple materials, the returned scene will contain multiple meshes, one + // for each of the source mesh's materials; if `mesh` has no material, one + // will be created for it. + static StatusOr> MeshToScene( + std::unique_ptr mesh); + + // Creates a mesh according to mesh |instance| in |scene|. Error is returned + // if there is no corresponding base mesh in the |scene| or the base mesh has + // no valid positions. + static StatusOr> InstantiateMesh( + const Scene &scene, const MeshInstance &instance); + + // Cleans up a |scene| by removing unused base meshes, unused and empty mesh + // groups, unused materials, unused texture coordinates and unused scene + // nodes. The actual behavior of the cleanup operation can be controller via + // the user provided |options|. + struct CleanupOptions { + bool remove_invalid_mesh_instances = true; + bool remove_unused_mesh_groups = true; + bool remove_unused_meshes = true; + bool remove_unused_nodes = false; + bool remove_unused_tex_coords = false; + bool remove_unused_materials = true; + }; + static void Cleanup(Scene *scene); + static void Cleanup(Scene *scene, const CleanupOptions &options); + + // Removes mesh |instances| from |scene|. + static void RemoveMeshInstances(const std::vector &instances, + Scene *scene); + + // Removes duplicate mesh groups that have the same name and that contain + // exactly the same meshes and materials. + static void DeduplicateMeshGroups(Scene *scene); + + // Enables geometry compression and sets compression |options| to all meshes + // in the |scene|. If |options| is nullptr then geometry compression is + // disabled for all meshes in the |scene|. + static void SetDracoCompressionOptions(const DracoCompressionOptions *options, + Scene *scene); + + // Returns true if geometry compression is eabled for any of |scene| meshes. + static bool IsDracoCompressionEnabled(const Scene &scene); + + // Returns a single tranformation matrix for each base mesh of the |scene| + // corresponding to the instance with the maximum scale. + static IndexTypeVector + FindLargestBaseMeshTransforms(const Scene &scene); +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_SCENE_SCENE_UTILS_H_ diff --git a/contrib/draco/src/draco/scene/scene_utils_test.cc b/contrib/draco/src/draco/scene/scene_utils_test.cc new file mode 100644 index 000000000..4d6bd731d --- /dev/null +++ b/contrib/draco/src/draco/scene/scene_utils_test.cc @@ -0,0 +1,763 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/scene_utils.h" + +#include +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/bounding_box.h" +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/io/texture_io.h" +#include "draco/scene/scene_indices.h" + +namespace { + +using draco::MeshIndex; +using draco::MeshInstanceIndex; + +void AssertMatrixNear(const Eigen::Matrix4d &a, const Eigen::Matrix4d &b, + float tolerance) { + Eigen::Matrix4d diff = a - b; + ASSERT_NEAR(diff.norm(), 0.f, tolerance) << a << " vs " << b; +} + +// TODO(fgalligan): Re-factor this code with gltf_encoder_test. +void CompareScenes(const draco::Scene *scene0, const draco::Scene *scene1) { + ASSERT_EQ(scene0->NumMeshGroups(), scene1->NumMeshGroups()); + ASSERT_EQ(scene0->NumMeshes(), scene1->NumMeshes()); + ASSERT_EQ(scene0->GetMaterialLibrary().NumMaterials(), + scene1->GetMaterialLibrary().NumMaterials()); + ASSERT_EQ(scene0->NumAnimations(), scene1->NumAnimations()); + ASSERT_EQ(scene0->NumSkins(), scene1->NumSkins()); + for (draco::AnimationIndex i(0); i < scene0->NumAnimations(); ++i) { + const draco::Animation *const animation0 = scene0->GetAnimation(i); + const draco::Animation *const animation1 = scene1->GetAnimation(i); + ASSERT_NE(animation0, nullptr); + ASSERT_NE(animation1, nullptr); + ASSERT_EQ(animation0->NumSamplers(), animation1->NumSamplers()); + ASSERT_EQ(animation0->NumChannels(), animation1->NumChannels()); + ASSERT_EQ(animation0->NumNodeAnimationData(), + animation1->NumNodeAnimationData()); + } +} + +TEST(SceneUtilsTest, TestComputeAllInstances) { + // Tests that we can compute all instances in an input scene along with their + // transformations. + + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 4); + + // Compute mesh instances. + const auto instances = draco::SceneUtils::ComputeAllInstances(*scene); + ASSERT_EQ(instances.size(), 5); + + // Check base mesh indices. + ASSERT_EQ(instances[MeshInstanceIndex(0)].mesh_index, 0); + ASSERT_EQ(instances[MeshInstanceIndex(1)].mesh_index, 1); + ASSERT_EQ(instances[MeshInstanceIndex(2)].mesh_index, 2); + ASSERT_EQ(instances[MeshInstanceIndex(3)].mesh_index, 3); + ASSERT_EQ(instances[MeshInstanceIndex(4)].mesh_index, 3); + + // Check scene node indices. + ASSERT_EQ(instances[MeshInstanceIndex(0)].scene_node_index, 0); + ASSERT_EQ(instances[MeshInstanceIndex(1)].scene_node_index, 0); + ASSERT_EQ(instances[MeshInstanceIndex(2)].scene_node_index, 0); + ASSERT_EQ(instances[MeshInstanceIndex(3)].scene_node_index, 4); + ASSERT_EQ(instances[MeshInstanceIndex(4)].scene_node_index, 2); + + // Check indices of meshes in mesh group. + ASSERT_EQ(instances[MeshInstanceIndex(0)].mesh_group_mesh_index, 0); + ASSERT_EQ(instances[MeshInstanceIndex(1)].mesh_group_mesh_index, 1); + ASSERT_EQ(instances[MeshInstanceIndex(2)].mesh_group_mesh_index, 2); + ASSERT_EQ(instances[MeshInstanceIndex(3)].mesh_group_mesh_index, 0); + ASSERT_EQ(instances[MeshInstanceIndex(4)].mesh_group_mesh_index, 0); + + // The first three instances should have identity transformation. + for (MeshInstanceIndex i(0); i < 3; ++i) { + AssertMatrixNear(instances[i].transform, Eigen::Matrix4d::Identity(), + 1e-6f); + } + + // Fourth and fifth instances are transformed. + Eigen::Matrix4d expected_transform = Eigen::Matrix4d::Identity(); + // Expected translation. + expected_transform(0, 3) = -1.352329969406128; + expected_transform(1, 3) = 0.4277220070362091; + expected_transform(2, 3) = -2.98022992950564e-8; + + // Expected rotation. + Eigen::Matrix4d expected_rotation = Eigen::Matrix4d::Identity(); + expected_rotation.block<3, 3>(0, 0) = + Eigen::Quaterniond(-0.9960774183273317, -0.0, -0.0, 0.08848590403795243) + .normalized() + .toRotationMatrix(); + expected_transform = expected_transform * expected_rotation; + + AssertMatrixNear(instances[MeshInstanceIndex(3)].transform, + expected_transform, 1e-6f); + + // Last instance differs only in the translation part in X axis. + expected_transform(0, 3) = 1.432669997215271; + + AssertMatrixNear(instances[MeshInstanceIndex(4)].transform, + expected_transform, 1e-6f); +} + +TEST(SceneUtilsTest, TestComputeAllInstancesWithShiftedGeometryRoot) { + // Tests that we can compute all instances in an input scene along with their + // transformations. This scene has light and camera nodes before the geometry + // node. + auto scene = draco::ReadSceneFromTestFile( + "SphereWithCircleTexture/sphere_with_circle_texture.gltf"); + ASSERT_NE(scene, nullptr); + + // There is one base mesh. + ASSERT_EQ(scene->NumMeshes(), 1); + + // There is a single mesh instance. + const auto instances = draco::SceneUtils::ComputeAllInstances(*scene); + ASSERT_EQ(instances.size(), 1); + ASSERT_EQ(instances[MeshInstanceIndex(0)].mesh_index, 0); + + // There is no transformation. + AssertMatrixNear(instances[MeshInstanceIndex(0)].transform, + Eigen::Matrix4d::Identity(), 1e-6); +} + +TEST(SceneUtilsTest, TestNumMeshInstances) { + // Tests that we can compute mesh instance counts for all base meshes in an + // input scene. + + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 4); + + const auto num_mesh_instances = draco::SceneUtils::NumMeshInstances(*scene); + ASSERT_EQ(num_mesh_instances.size(), 4); + ASSERT_EQ(num_mesh_instances[draco::MeshIndex(0)], 1); + ASSERT_EQ(num_mesh_instances[draco::MeshIndex(1)], 1); + ASSERT_EQ(num_mesh_instances[draco::MeshIndex(2)], 1); + ASSERT_EQ(num_mesh_instances[draco::MeshIndex(3)], 2); +} + +TEST(SceneUtilsTest, TestNumFacesOnScene) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(draco::SceneUtils::NumFacesOnBaseMeshes(*scene), 2856); + ASSERT_EQ(draco::SceneUtils::NumFacesOnInstancedMeshes(*scene), 3624); +} + +TEST(SceneUtilsTest, TestNumPointsOnScene) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(draco::SceneUtils::NumPointsOnBaseMeshes(*scene), 2978); + ASSERT_EQ(draco::SceneUtils::NumPointsOnInstancedMeshes(*scene), 3564); +} + +TEST(SceneUtilsTest, TestNumPositionsOnScene) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(draco::SceneUtils::NumAttEntriesOnBaseMeshes( + *scene, draco::GeometryAttribute::POSITION), + 1572); + ASSERT_EQ(draco::SceneUtils::NumAttEntriesOnInstancedMeshes( + *scene, draco::GeometryAttribute::POSITION), + 1960); +} + +TEST(SceneUtilsTest, TestNumNormalsOnScene) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(draco::SceneUtils::NumAttEntriesOnBaseMeshes( + *scene, draco::GeometryAttribute::NORMAL), + 1252); + ASSERT_EQ(draco::SceneUtils::NumAttEntriesOnInstancedMeshes( + *scene, draco::GeometryAttribute::NORMAL), + 1612); +} + +TEST(SceneUtilsTest, TestNumColorsOnScene) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(draco::SceneUtils::NumAttEntriesOnBaseMeshes( + *scene, draco::GeometryAttribute::COLOR), + 0); + ASSERT_EQ(draco::SceneUtils::NumAttEntriesOnInstancedMeshes( + *scene, draco::GeometryAttribute::COLOR), + 0); +} + +TEST(SceneUtilsTest, TestComputeBoundingBox) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + const draco::BoundingBox bbox = draco::SceneUtils::ComputeBoundingBox(*scene); + const draco::Vector3f min_point = bbox.GetMinPoint(); + const draco::Vector3f max_point = bbox.GetMaxPoint(); + constexpr float tolerance = 1e-4f; + EXPECT_NEAR(min_point[0], -2.43091, tolerance); + EXPECT_NEAR(min_point[1], +0.00145, tolerance); + EXPECT_NEAR(min_point[2], -1.39600, tolerance); + EXPECT_NEAR(max_point[0], +2.43800, tolerance); + EXPECT_NEAR(max_point[1], +2.58437, tolerance); + EXPECT_NEAR(max_point[2], +1.39600, tolerance); +} + +TEST(SceneUtilsTest, TestComputeMeshInstanceBoundingBox) { + auto scene = draco::ReadSceneFromTestFile( + "SphereWithCircleTexture/sphere_with_circle_texture.gltf"); + ASSERT_NE(scene, nullptr); + const draco::BoundingBox scene_bbox = + draco::SceneUtils::ComputeBoundingBox(*scene); + const auto instances = draco::SceneUtils::ComputeAllInstances(*scene); + ASSERT_EQ(instances.size(), 1); + const draco::BoundingBox mesh_bbox = + draco::SceneUtils::ComputeMeshInstanceBoundingBox( + *scene, instances[draco::MeshInstanceIndex(0)]); + ASSERT_EQ(scene_bbox.GetMinPoint(), mesh_bbox.GetMinPoint()); + ASSERT_EQ(scene_bbox.GetMaxPoint(), mesh_bbox.GetMaxPoint()); +} + +TEST(SceneUtilsTest, TestMeshToSceneZeroMaterials) { + const std::string filename = "cube_att.obj"; + std::unique_ptr mesh = draco::ReadMeshFromTestFile(filename); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 0); + + DRACO_ASSIGN_OR_ASSERT(const std::unique_ptr scene_from_mesh, + draco::SceneUtils::MeshToScene(std::move(mesh))); + ASSERT_NE(scene_from_mesh, nullptr); + ASSERT_EQ(scene_from_mesh->NumMeshes(), 1); + ASSERT_EQ(scene_from_mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(scene_from_mesh->NumMeshGroups(), 1); + const draco::MeshGroup *const mesh_group = + scene_from_mesh->GetMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(mesh_group->NumMeshInstances(), 1); +} + +TEST(SceneUtilsTest, TestMeshToSceneOneMaterial) { + const std::string filename = + "SphereWithCircleTexture/sphere_with_circle_texture.gltf"; + auto scene = draco::ReadSceneFromTestFile(filename); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->GetMaterialLibrary().NumMaterials(), 1); + + std::unique_ptr mesh = draco::ReadMeshFromTestFile(filename); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 1); + + DRACO_ASSIGN_OR_ASSERT(const std::unique_ptr scene_from_mesh, + draco::SceneUtils::MeshToScene(std::move(mesh))); + ASSERT_NE(scene_from_mesh, nullptr); + ASSERT_EQ(scene_from_mesh->NumMeshes(), 1); + ASSERT_EQ(scene_from_mesh->GetMaterialLibrary().NumMaterials(), 1); + ASSERT_EQ(scene_from_mesh->NumMeshGroups(), 1); + const draco::MeshGroup *const mesh_group = + scene_from_mesh->GetMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(mesh_group->NumMeshInstances(), 1); + + CompareScenes(scene.get(), scene_from_mesh.get()); +} + +TEST(SceneUtilsTest, TestMeshToSceneMultipleMaterials) { + const std::string filename = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + auto scene = draco::ReadSceneFromTestFile(filename); + ASSERT_NE(scene, nullptr); + + std::unique_ptr mesh = draco::ReadMeshFromTestFile(filename); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 4); + + DRACO_ASSIGN_OR_ASSERT(const std::unique_ptr scene_from_mesh, + draco::SceneUtils::MeshToScene(std::move(mesh))); + ASSERT_NE(scene_from_mesh, nullptr); + ASSERT_EQ(scene_from_mesh->NumMeshes(), 4); + ASSERT_EQ(scene_from_mesh->GetMaterialLibrary().NumMaterials(), 4); + ASSERT_EQ(scene_from_mesh->NumMeshGroups(), 1); + const draco::MeshGroup *const mesh_group = + scene_from_mesh->GetMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(mesh_group->NumMeshInstances(), 4); + + // Unfortunately we can't CompareScenes(scene.get(), scene_from_mesh.get()), + // because scene has two mesh groups and scene_from_mesh has only one. +} + +TEST(SceneUtilsTest, TestMeshToSceneMultipleMeshFeatures) { + const std::string filename = "BoxesMeta/glTF/BoxesMeta.gltf"; + std::unique_ptr scene = draco::ReadSceneFromTestFile(filename); + ASSERT_NE(scene, nullptr); + std::unique_ptr mesh = draco::ReadMeshFromTestFile(filename); + ASSERT_NE(mesh, nullptr); + ASSERT_EQ(mesh->GetMaterialLibrary().NumMaterials(), 2); + ASSERT_EQ(mesh->NumMeshFeatures(), 5); + + DRACO_ASSIGN_OR_ASSERT(const std::unique_ptr scene_from_mesh, + draco::SceneUtils::MeshToScene(std::move(mesh))); + ASSERT_NE(scene_from_mesh, nullptr); + ASSERT_EQ(scene_from_mesh->NumMeshes(), 2); + ASSERT_EQ(scene_from_mesh->GetMaterialLibrary().NumMaterials(), 2); + ASSERT_EQ(scene_from_mesh->NumMeshGroups(), 1); + const draco::MeshGroup *const mesh_group = + scene_from_mesh->GetMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(mesh_group->NumMeshInstances(), 2); + + // Meshes of the new scene should have the same properties as meshes loaded + // directly into |scene|. + for (draco::MeshIndex mi(0); mi < scene->NumMeshes(); ++mi) { + ASSERT_EQ(scene->GetMesh(mi).NumMeshFeatures(), + scene_from_mesh->GetMesh(mi).NumMeshFeatures()); + for (draco::MeshFeaturesIndex mfi(0); + mfi < scene->GetMesh(mi).NumMeshFeatures(); ++mfi) { + const auto &scene_mf = scene->GetMesh(mi).GetMeshFeatures(mfi); + const auto &scene_from_mesh_mf = + scene_from_mesh->GetMesh(mi).GetMeshFeatures(mfi); + ASSERT_EQ(scene_mf.GetAttributeIndex(), + scene_from_mesh_mf.GetAttributeIndex()); + ASSERT_EQ(scene_mf.GetPropertyTableIndex(), + scene_from_mesh_mf.GetPropertyTableIndex()); + ASSERT_EQ(scene_mf.GetLabel(), scene_from_mesh_mf.GetLabel()); + ASSERT_EQ(scene_mf.GetNullFeatureId(), + scene_from_mesh_mf.GetNullFeatureId()); + ASSERT_EQ(scene_mf.GetFeatureCount(), + scene_from_mesh_mf.GetFeatureCount()); + ASSERT_EQ(scene_mf.GetTextureChannels(), + scene_from_mesh_mf.GetTextureChannels()); + ASSERT_EQ(scene_mf.GetTextureMap().texture() != nullptr, + scene_from_mesh_mf.GetTextureMap().texture() != nullptr); + } + } +} + +TEST(SceneUtilsTest, TestInstantiateMeshWithIdentityTransformation) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + + // Compute scene mesh instances. + const auto instances = draco::SceneUtils::ComputeAllInstances(*scene); + ASSERT_EQ(instances.size(), 5); + + // Check instantiation of mesh with identity transformation. + const draco::SceneUtils::MeshInstance instance = + instances[MeshInstanceIndex(0)]; + ASSERT_EQ(instance.transform, Eigen::Matrix4d::Identity()); + + // Instantiate this mesh instance. + DRACO_ASSIGN_OR_ASSERT(auto mesh, + draco::SceneUtils::InstantiateMesh(*scene, instance)); + const draco::Mesh &base_mesh = scene->GetMesh(instance.mesh_index); + + // Check that bounding box of the instanced mesh is same as box of base mesh. + const draco::BoundingBox instanced_bbox = mesh->ComputeBoundingBox(); + const draco::BoundingBox base_bbox = base_mesh.ComputeBoundingBox(); + ASSERT_EQ(instanced_bbox.GetMinPoint()[0], base_bbox.GetMinPoint()[0]); + ASSERT_EQ(instanced_bbox.GetMinPoint()[1], base_bbox.GetMinPoint()[1]); + ASSERT_EQ(instanced_bbox.GetMinPoint()[2], base_bbox.GetMinPoint()[2]); + ASSERT_EQ(instanced_bbox.GetMaxPoint()[0], base_bbox.GetMaxPoint()[0]); + ASSERT_EQ(instanced_bbox.GetMaxPoint()[1], base_bbox.GetMaxPoint()[1]); + ASSERT_EQ(instanced_bbox.GetMaxPoint()[2], base_bbox.GetMaxPoint()[2]); +} + +TEST(SceneUtilsTest, TestInstantiateMesh) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + + // Compute scene mesh instances. + const auto instances = draco::SceneUtils::ComputeAllInstances(*scene); + ASSERT_EQ(instances.size(), 5); + + // Check instantiation of mesh with identity transformation. + const draco::SceneUtils::MeshInstance instance = + instances[MeshInstanceIndex(3)]; + ASSERT_NE(instance.transform, Eigen::Matrix4d::Identity()); + + // Instantiate this mesh instance. + DRACO_ASSIGN_OR_ASSERT(auto mesh, + draco::SceneUtils::InstantiateMesh(*scene, instance)); + const draco::Mesh &base_mesh = scene->GetMesh(instance.mesh_index); + + // Check bounding box of the base mesh. + constexpr float tolerance = 1e-4f; + const draco::BoundingBox base_bbox = base_mesh.ComputeBoundingBox(); + EXPECT_NEAR(base_bbox.GetMinPoint()[0], -0.42780, tolerance); + EXPECT_NEAR(base_bbox.GetMinPoint()[1], -0.42780, tolerance); + EXPECT_NEAR(base_bbox.GetMinPoint()[2], -1.05800, tolerance); + EXPECT_NEAR(base_bbox.GetMaxPoint()[0], +0.42780, tolerance); + EXPECT_NEAR(base_bbox.GetMaxPoint()[1], +0.42780, tolerance); + EXPECT_NEAR(base_bbox.GetMaxPoint()[2], +1.05800, tolerance); + + // Check bounding box of the instanced mesh. It should differ. + const draco::BoundingBox instanced_bbox = mesh->ComputeBoundingBox(); + EXPECT_NEAR(instanced_bbox.GetMinPoint()[0], -1.77860, tolerance); + EXPECT_NEAR(instanced_bbox.GetMinPoint()[1], +0.00145, tolerance); + EXPECT_NEAR(instanced_bbox.GetMinPoint()[2], -1.05800, tolerance); + EXPECT_NEAR(instanced_bbox.GetMaxPoint()[0], -0.92606, tolerance); + EXPECT_NEAR(instanced_bbox.GetMaxPoint()[1], +0.85399, tolerance); + EXPECT_NEAR(instanced_bbox.GetMaxPoint()[2], +1.05800, tolerance); +} + +TEST(SceneUtilsTest, TestCleanupEmptyMeshGroup) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 4); + ASSERT_EQ(scene->NumMeshGroups(), 2); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 5); + ASSERT_EQ(scene->GetNode(draco::SceneNodeIndex(0))->GetMeshGroupIndex(), + draco::MeshGroupIndex(0)); + + // Invalidate references to the three truck body parts in mesh group. + draco::MeshGroup &mesh_group = *scene->GetMeshGroup(draco::MeshGroupIndex(0)); + mesh_group.SetMeshInstance(0, {draco::kInvalidMeshIndex, 0}); + mesh_group.SetMeshInstance(1, {draco::kInvalidMeshIndex, 0}); + mesh_group.SetMeshInstance(2, {draco::kInvalidMeshIndex, 0}); + + // Cleanup scene. + draco::SceneUtils::Cleanup(scene.get()); + + // Check cleaned up scene. + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 1); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 2); + ASSERT_EQ(scene->GetNode(draco::SceneNodeIndex(0))->GetMeshGroupIndex(), + draco::kInvalidMeshGroupIndex); +} + +TEST(SceneUtilsTest, TestCleanupUnreferencedMeshGroup) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 4); + ASSERT_EQ(scene->NumMeshGroups(), 2); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 5); + + // Invalidate references to truck axle mesh group. + scene->GetNode(draco::SceneNodeIndex(2)) + ->SetMeshGroupIndex(draco::kInvalidMeshGroupIndex); + scene->GetNode(draco::SceneNodeIndex(4)) + ->SetMeshGroupIndex(draco::kInvalidMeshGroupIndex); + + // Cleanup scene. + draco::SceneUtils::Cleanup(scene.get()); + + // Check cleaned up scene. + ASSERT_EQ(scene->NumMeshes(), 3); + ASSERT_EQ(scene->NumMeshGroups(), 1); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 3); +} + +TEST(SceneUtilsTest, TestCleanupInvalidMeshIndex) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 4); + ASSERT_EQ(scene->NumMeshGroups(), 2); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 5); + ASSERT_EQ(scene->GetNode(draco::SceneNodeIndex(0))->GetMeshGroupIndex(), + draco::MeshGroupIndex(0)); + + // Invalidate references to two truck body parts in mesh group. + draco::MeshGroup &mesh_group = *scene->GetMeshGroup(draco::MeshGroupIndex(0)); + ASSERT_EQ(mesh_group.NumMeshInstances(), 3); + mesh_group.SetMeshInstance(0, {draco::kInvalidMeshIndex, 0}); + mesh_group.SetMeshInstance(2, {draco::kInvalidMeshIndex, 0}); + + // Cleanup scene. + draco::SceneUtils::Cleanup(scene.get()); + + // Check cleaned up scene. + ASSERT_EQ(scene->NumMeshes(), 2); + ASSERT_EQ(scene->NumMeshGroups(), 2); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 3); + ASSERT_EQ(scene->GetMeshGroup(draco::MeshGroupIndex(0))->NumMeshInstances(), + 1); +} + +TEST(SceneUtilsTest, TestCleanupUnusedNodes) { + auto scene = + draco::ReadSceneFromTestFile("CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumNodes(), 5); + + draco::SceneUtils::CleanupOptions options; + options.remove_unused_nodes = true; + + // Delete mesh on node 2 and try to remove unused nodes. + // Node 2 is connected to node 1 that has no mesh as well. But node 2 is also + // used in an animation so we don't actually expect anything to be deleted. + scene->GetNode(draco::SceneNodeIndex(2)) + ->SetMeshGroupIndex(draco::kInvalidMeshGroupIndex); + draco::SceneUtils::Cleanup(scene.get(), options); + + ASSERT_EQ(scene->NumNodes(), 5); + + // Now remove the animation channel that used the node and try it again. This + // time, we expect two nodes to be deleted (node 1 and node 2). Node 1 will be + // deleted because it doesn't contain a mesh and all its children are unused. + ASSERT_EQ(scene->GetAnimation(draco::AnimationIndex(0)) + ->GetChannel(0) + ->target_index, + 2); + // Change the mapped node to node 4 (we can't actually remove channel as of + // the time this test was written). + scene->GetAnimation(draco::AnimationIndex(0))->GetChannel(0)->target_index = + 4; + + // Cleanup again. + draco::SceneUtils::Cleanup(scene.get(), options); + ASSERT_EQ(scene->NumNodes(), 3); // Two nodes should be deleted. + + // Ensure all node indices are remapped to the new values. + for (draco::SceneNodeIndex sni(0); sni < scene->NumNodes(); ++sni) { + const auto *node = scene->GetNode(sni); + for (int i = 0; i < node->NumChildren(); ++i) { + ASSERT_LT(node->Child(i).value(), 3); + } + for (int i = 0; i < node->NumParents(); ++i) { + ASSERT_LT(node->Parent(i).value(), 3); + } + } + + // Ensure the animation channels are mapped to the updated node indices (node + // 4 should be new node 2 because two nodes were removed). + ASSERT_EQ(scene->GetAnimation(draco::AnimationIndex(0)) + ->GetChannel(0) + ->target_index, + 2); +} + +TEST(SceneUtilsTest, TestDeduplicateMeshGroups) { + // Input scene has four different mesh groups but only two of them should + // contain unique set of meshes. + auto scene = + draco::ReadSceneFromTestFile("DuplicateMeshes/duplicate_meshes.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 4); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 7); + + draco::SceneUtils::DeduplicateMeshGroups(scene.get()); + + // Check deduplicated scene. + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(scene->NumMeshGroups(), 2); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 7); +} + +TEST(SceneUtilsTest, TestCleanupUnusedTexCoordsNoTextures) { + // The glTF file has two tex coords that are unused because the materials do + // not reference any textures. + auto scene = draco::ReadSceneFromTestFile("UnusedTexCoords/NoTextures.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->GetMesh(draco::MeshIndex(0)) + .NumNamedAttributes(draco::GeometryAttribute::TEX_COORD), + 2); + + // Cleanup scene and check that unused UV are not removed by default. + draco::SceneUtils::Cleanup(scene.get()); + ASSERT_EQ(scene->GetMesh(draco::MeshIndex(0)) + .NumNamedAttributes(draco::GeometryAttribute::TEX_COORD), + 2); + + // Cleanup scene and check that unused UV are removed when requested. + draco::SceneUtils::CleanupOptions options; + options.remove_unused_tex_coords = true; + draco::SceneUtils::Cleanup(scene.get(), options); + ASSERT_EQ(scene->GetMesh(draco::MeshIndex(0)) + .NumNamedAttributes(draco::GeometryAttribute::TEX_COORD), + 0); +} + +TEST(SceneUtilsTest, TestCleanupUnusedTexCoords0NoReferences) { + auto scene = draco::ReadSceneFromTestFile( + "UnusedTexCoords/TexCoord0InvalidTexCoord1Valid.gltf"); + ASSERT_NE(scene, nullptr); + typedef draco::GeometryAttribute Att; + + draco::Mesh &mesh = scene->GetMesh(draco::MeshIndex(0)); + ASSERT_EQ(mesh.NumNamedAttributes(Att::TEX_COORD), 2); + ASSERT_EQ(mesh.GetNamedAttribute(Att::TEX_COORD, 0)->size(), 14); + ASSERT_EQ(mesh.GetNamedAttribute(Att::TEX_COORD, 1)->size(), 4); + auto &ml = scene->GetMaterialLibrary(); + ASSERT_EQ(ml.NumMaterials(), 1); + ASSERT_EQ(ml.GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(ml.GetMaterial(0)->GetTextureMapByIndex(0)->tex_coord_index(), 1); + + // Cleanup unused texture coordinate attributes. + draco::SceneUtils::CleanupOptions options; + options.remove_unused_tex_coords = true; + draco::SceneUtils::Cleanup(scene.get(), options); + + // Check that the unreferenced attribute was removed. + ASSERT_EQ(mesh.NumNamedAttributes(Att::TEX_COORD), 1); + ASSERT_EQ(mesh.GetNamedAttribute(Att::TEX_COORD, 0)->size(), 4); + ASSERT_EQ(ml.NumMaterials(), 1); + ASSERT_EQ(ml.GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(ml.GetMaterial(0)->GetTextureMapByIndex(0)->tex_coord_index(), 0); +} + +TEST(SceneUtilsTest, TestCleanupUnusedTexCoords1NoReferences) { + auto scene = draco::ReadSceneFromTestFile( + "UnusedTexCoords/TexCoord0ValidTexCoord1Invalid.gltf"); + ASSERT_NE(scene, nullptr); + typedef draco::GeometryAttribute Att; + + draco::Mesh &mesh = scene->GetMesh(draco::MeshIndex(0)); + ASSERT_EQ(mesh.NumNamedAttributes(Att::TEX_COORD), 2); + ASSERT_EQ(mesh.GetNamedAttribute(Att::TEX_COORD, 0)->size(), 14); + ASSERT_EQ(mesh.GetNamedAttribute(Att::TEX_COORD, 1)->size(), 4); + auto &ml = scene->GetMaterialLibrary(); + ASSERT_EQ(ml.NumMaterials(), 1); + ASSERT_EQ(ml.GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(ml.GetMaterial(0)->GetTextureMapByIndex(0)->tex_coord_index(), 0); + + // Cleanup unused texture coordinate attributes. + draco::SceneUtils::CleanupOptions options; + options.remove_unused_tex_coords = true; + draco::SceneUtils::Cleanup(scene.get(), options); + + // Check that the unreferenced attribute was removed. + ASSERT_EQ(mesh.NumNamedAttributes(Att::TEX_COORD), 1); + ASSERT_EQ(mesh.GetNamedAttribute(Att::TEX_COORD, 0)->size(), 14); + ASSERT_EQ(ml.NumMaterials(), 1); + ASSERT_EQ(ml.GetMaterial(0)->NumTextureMaps(), 1); + ASSERT_EQ(ml.GetMaterial(0)->GetTextureMapByIndex(0)->tex_coord_index(), 0); +} + +TEST(SceneUtilsTest, TestComputeGlobalNodeTransform) { + // Tests that we can compute global transformation of scene nodes. + + auto scene = draco::ReadSceneFromTestFile("simple_skin.gltf"); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumNodes(), 3); + + // Compute and check global node transforms. + constexpr float kTolerance = 1e-6; + // clang-format off + AssertMatrixNear(draco::SceneUtils::ComputeGlobalNodeTransform( + *scene, draco::SceneNodeIndex(0)), + Eigen::Matrix4d::Identity(), + kTolerance); + AssertMatrixNear(draco::SceneUtils::ComputeGlobalNodeTransform( + *scene, draco::SceneNodeIndex(1)), + Eigen::Matrix4d{{1.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 1.0}, + {0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 1.0}}, + kTolerance); + AssertMatrixNear(draco::SceneUtils::ComputeGlobalNodeTransform( + *scene, draco::SceneNodeIndex(2)), + Eigen::Matrix4d{{1.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 1.0}, + {0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 1.0}}, + kTolerance); + // clang-format on +} + +TEST(SceneUtilsTest, TestIsDracoCompressionEnabled) { + // Tests that we can determine whether any of the scene meshes have geometry + // compression enabled. + const std::string file = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + auto scene = draco::ReadSceneFromTestFile(file); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 4); + + // Check that the scene has geometry compression disabled by default. + ASSERT_FALSE(draco::SceneUtils::IsDracoCompressionEnabled(*scene)); + + // Check that geometry compression can be enabled. + scene->GetMesh(MeshIndex(2)).SetCompressionEnabled(true); + ASSERT_TRUE(draco::SceneUtils::IsDracoCompressionEnabled(*scene)); +} + +TEST(SceneUtilsTest, TestSetDracoCompressionOptions) { + // Tests that geometry compression settings can be set for all scene meshes. + const std::string file = "CesiumMilkTruck/glTF/CesiumMilkTruck.gltf"; + auto scene = draco::ReadSceneFromTestFile(file); + ASSERT_NE(scene, nullptr); + ASSERT_EQ(scene->NumMeshes(), 4); + + // Check that compression is initially disabled for all scene meshes. + ASSERT_FALSE(scene->GetMesh(MeshIndex(0)).IsCompressionEnabled()); + ASSERT_FALSE(scene->GetMesh(MeshIndex(1)).IsCompressionEnabled()); + ASSERT_FALSE(scene->GetMesh(MeshIndex(2)).IsCompressionEnabled()); + ASSERT_FALSE(scene->GetMesh(MeshIndex(3)).IsCompressionEnabled()); + + // Check that initially all scene meshes have default compression options. + draco::DracoCompressionOptions defaults; + ASSERT_EQ(scene->GetMesh(MeshIndex(0)).GetCompressionOptions(), defaults); + ASSERT_EQ(scene->GetMesh(MeshIndex(1)).GetCompressionOptions(), defaults); + ASSERT_EQ(scene->GetMesh(MeshIndex(2)).GetCompressionOptions(), defaults); + ASSERT_EQ(scene->GetMesh(MeshIndex(3)).GetCompressionOptions(), defaults); + + // Check geometry compression options can be set to all scene meshes and that + // this also enables compression for all scnene meshes. + draco::DracoCompressionOptions options; + options.compression_level = 10; + options.quantization_bits_normal = 12; + draco::SceneUtils::SetDracoCompressionOptions(&options, scene.get()); + ASSERT_TRUE(scene->GetMesh(MeshIndex(0)).IsCompressionEnabled()); + ASSERT_TRUE(scene->GetMesh(MeshIndex(1)).IsCompressionEnabled()); + ASSERT_TRUE(scene->GetMesh(MeshIndex(2)).IsCompressionEnabled()); + ASSERT_TRUE(scene->GetMesh(MeshIndex(3)).IsCompressionEnabled()); + ASSERT_EQ(scene->GetMesh(MeshIndex(0)).GetCompressionOptions(), options); + ASSERT_EQ(scene->GetMesh(MeshIndex(1)).GetCompressionOptions(), options); + ASSERT_EQ(scene->GetMesh(MeshIndex(2)).GetCompressionOptions(), options); + ASSERT_EQ(scene->GetMesh(MeshIndex(3)).GetCompressionOptions(), options); + + // Check that geometry compression can be disabled for all scene meshes. + draco::SceneUtils::SetDracoCompressionOptions(nullptr, scene.get()); + ASSERT_FALSE(scene->GetMesh(MeshIndex(0)).IsCompressionEnabled()); + ASSERT_FALSE(scene->GetMesh(MeshIndex(1)).IsCompressionEnabled()); + ASSERT_FALSE(scene->GetMesh(MeshIndex(2)).IsCompressionEnabled()); + ASSERT_FALSE(scene->GetMesh(MeshIndex(3)).IsCompressionEnabled()); +} + +TEST(SceneUtilsTest, TestFindLargestBaseMeshTransforms) { + // Tests that FindLargestBaseMeshTransforms() works as expected. + auto scene = + draco::ReadSceneFromTestFile("CubeScaledInstances/glTF/cube_att.gltf"); + ASSERT_NE(scene, nullptr); + + // There should be one base mesh with four instances. + ASSERT_EQ(scene->NumMeshes(), 1); + ASSERT_EQ(draco::SceneUtils::ComputeAllInstances(*scene).size(), 4); + + const auto transforms = + draco::SceneUtils::FindLargestBaseMeshTransforms(*scene); + + ASSERT_EQ(transforms.size(), 1); // One transform for the single base mesh. + + // The largest instance should have a uniform scale 4. + const draco::MeshIndex mi(0); + ASSERT_EQ(transforms[mi].diagonal(), Eigen::Vector4d(4, 4, 4, 1)); +} + +} // namespace + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/trs_matrix.cc b/contrib/draco/src/draco/scene/trs_matrix.cc new file mode 100644 index 000000000..6e6dac251 --- /dev/null +++ b/contrib/draco/src/draco/scene/trs_matrix.cc @@ -0,0 +1,102 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/trs_matrix.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +void TrsMatrix::Copy(const TrsMatrix &tm) { + matrix_ = tm.matrix_; + translation_ = tm.translation_; + rotation_ = tm.rotation_; + scale_ = tm.scale_; + matrix_set_ = tm.matrix_set_; + translation_set_ = tm.translation_set_; + rotation_set_ = tm.rotation_set_; + scale_set_ = tm.scale_set_; +} + +Eigen::Matrix4d TrsMatrix::ComputeTransformationMatrix() const { + // Return transformation matrix if it has been set. + if (matrix_set_) { + return matrix_; + } + + // Populate translation matrix. + Eigen::Matrix4d translation_matrix = Eigen::Matrix4d::Identity(); + translation_matrix(0, 3) = translation_[0]; + translation_matrix(1, 3) = translation_[1]; + translation_matrix(2, 3) = translation_[2]; + + // Populate rotation matrix using rotation quaternion. + Eigen::Matrix3d rotation_matrix_3 = rotation_.normalized().toRotationMatrix(); + + // Convert the 3x3 matrix to a 4x4 matrix that can be multiplied with the + // other TRS matrices. + Eigen::Matrix4d rotation_matrix = Eigen::Matrix4d::Identity(); + rotation_matrix.block<3, 3>(0, 0) = rotation_matrix_3; + + // Populate scale matrix. + const Eigen::Matrix4d scale_matrix( + Eigen::Vector4d(scale_.x(), scale_.y(), scale_.z(), 1.0).asDiagonal()); + + // Return transformation matrix computed by combining TRS matrices. + return translation_matrix * rotation_matrix * scale_matrix; +} + +bool TrsMatrix::IsMatrixIdentity() const { + if (!matrix_set_) { + return true; + } + return matrix_ == Eigen::Matrix4d::Identity(); +} + +bool TrsMatrix::IsMatrixTranslationOnly() const { + if (!matrix_set_) { + return false; + } + Eigen::Matrix4d translation_check = matrix_; + translation_check(0, 3) = 0.0; + translation_check(1, 3) = 0.0; + translation_check(2, 3) = 0.0; + return translation_check == Eigen::Matrix4d::Identity(); +} + +bool TrsMatrix::operator==(const TrsMatrix &trs_matrix) const { + if (matrix_set_ != trs_matrix.matrix_set_ || + translation_set_ != trs_matrix.translation_set_ || + rotation_set_ != trs_matrix.rotation_set_ || + scale_set_ != trs_matrix.scale_set_) { + return false; + } + if (matrix_set_ && matrix_ != trs_matrix.matrix_) { + return false; + } + if (translation_set_ && translation_ != trs_matrix.translation_) { + return false; + } + if (rotation_set_ && rotation_ != trs_matrix.rotation_) { + return false; + } + if (scale_set_ && scale_set_ != trs_matrix.scale_set_) { + return false; + } + return true; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/scene/trs_matrix.h b/contrib/draco/src/draco/scene/trs_matrix.h new file mode 100644 index 000000000..6c2ab7388 --- /dev/null +++ b/contrib/draco/src/draco/scene/trs_matrix.h @@ -0,0 +1,124 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_SCENE_TRS_MATRIX_H_ +#define DRACO_SCENE_TRS_MATRIX_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "Eigen/Geometry" +#include "draco/core/status_or.h" + +namespace draco { + +// This class is used to store one or more of a translation, rotation, scale +// vectors or a transformation matrix. +class TrsMatrix { + public: + TrsMatrix() + : matrix_(Eigen::Matrix4d::Identity()), + translation_(0.0, 0.0, 0.0), + rotation_(1.0, 0.0, 0.0, 0.0), // (w, x, y, z) + scale_(1.0, 1.0, 1.0), + matrix_set_(false), + translation_set_(false), + rotation_set_(false), + scale_set_(false) {} + + void Copy(const TrsMatrix &tm); + + void SetMatrix(const Eigen::Matrix4d &matrix) { + matrix_ = matrix; + matrix_set_ = true; + } + bool MatrixSet() const { return matrix_set_; } + StatusOr Matrix() const { + if (!matrix_set_) { + return Status(Status::DRACO_ERROR, "Matrix is not set."); + } + return matrix_; + } + + void SetTranslation(const Eigen::Vector3d &translation) { + translation_ = translation; + translation_set_ = true; + } + bool TranslationSet() const { return translation_set_; } + StatusOr Translation() const { + if (!translation_set_) { + return Status(Status::DRACO_ERROR, "Translation is not set."); + } + return translation_; + } + + void SetRotation(const Eigen::Quaterniond &rotation) { + rotation_ = rotation; + rotation_set_ = true; + } + bool RotationSet() const { return rotation_set_; } + StatusOr Rotation() const { + if (!rotation_set_) { + return Status(Status::DRACO_ERROR, "Rotation is not set."); + } + return rotation_; + } + + void SetScale(const Eigen::Vector3d &scale) { + scale_ = scale; + scale_set_ = true; + } + bool ScaleSet() const { return scale_set_; } + StatusOr Scale() const { + if (!scale_set_) { + return Status(Status::DRACO_ERROR, "Scale is not set."); + } + return scale_; + } + + // Returns true if the matrix is not set or if matrix is set and is equal to + // identity. + bool IsMatrixIdentity() const; + + // Returns true if matrix is set and only the translation elements may differ + // from identity. Returns false if matrix is not set. + bool IsMatrixTranslationOnly() const; + + // Returns transformation matrix if it has been set. Otherwise, computes + // transformation matrix from TRS vectors and returns it. + Eigen::Matrix4d ComputeTransformationMatrix() const; + + // Returns a boolean indicating whether any of the transforms have been set. + // Can be used to check whether this object represents a default transform. + bool TransformSet() const { + return matrix_set_ || translation_set_ || rotation_set_ || scale_set_; + } + + bool operator==(const TrsMatrix &trs_matrix) const; + + private: + Eigen::Matrix4d matrix_; + Eigen::Vector3d translation_; + Eigen::Quaterniond rotation_; + Eigen::Vector3d scale_; + bool matrix_set_; + bool translation_set_; + bool rotation_set_; + bool scale_set_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_SCENE_TRS_MATRIX_H_ diff --git a/contrib/draco/src/draco/scene/trs_matrix_test.cc b/contrib/draco/src/draco/scene/trs_matrix_test.cc new file mode 100644 index 000000000..d7938e974 --- /dev/null +++ b/contrib/draco/src/draco/scene/trs_matrix_test.cc @@ -0,0 +1,79 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/scene/trs_matrix.h" + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" + +namespace { + +#ifdef DRACO_TRANSCODER_SUPPORTED + +TEST(TrsMatrixTest, TestIsMatrixIdentity) { + draco::TrsMatrix trs; + ASSERT_EQ(trs.MatrixSet(), false); + ASSERT_EQ(trs.IsMatrixIdentity(), true); + + // clang-format off + Eigen::Matrix4d matrix; + matrix << 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16; + // clang-format on + trs.SetMatrix(matrix); + ASSERT_EQ(trs.MatrixSet(), true); + ASSERT_EQ(trs.IsMatrixIdentity(), false); + + trs.SetMatrix(Eigen::Matrix4d::Identity()); + ASSERT_EQ(trs.MatrixSet(), true); + ASSERT_EQ(trs.IsMatrixIdentity(), true); +} + +TEST(TrsMatrixTest, TestIsMatrixTranslationOnly) { + draco::TrsMatrix trs; + ASSERT_EQ(trs.MatrixSet(), false); + ASSERT_EQ(trs.IsMatrixTranslationOnly(), false); + + trs.SetMatrix(Eigen::Matrix4d::Identity()); + ASSERT_EQ(trs.MatrixSet(), true); + ASSERT_EQ(trs.IsMatrixTranslationOnly(), true); + + // clang-format off + Eigen::Matrix4d matrix; + matrix << 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16; + // clang-format on + trs.SetMatrix(matrix); + ASSERT_EQ(trs.MatrixSet(), true); + ASSERT_EQ(trs.IsMatrixTranslationOnly(), false); + + // clang-format off + Eigen::Matrix4d translation; + translation << 1, 0, 0, 1, + 0, 1, 0, 2, + 0, 0, 1, 3, + 0, 0, 0, 1; + // clang-format on + trs.SetMatrix(translation); + ASSERT_EQ(trs.MatrixSet(), true); + ASSERT_EQ(trs.IsMatrixTranslationOnly(), true); +} + +#endif // DRACO_TRANSCODER_SUPPORTED + +} // namespace diff --git a/contrib/draco/src/draco/texture/source_image.cc b/contrib/draco/src/draco/texture/source_image.cc new file mode 100644 index 000000000..b4d493250 --- /dev/null +++ b/contrib/draco/src/draco/texture/source_image.cc @@ -0,0 +1,29 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/texture/source_image.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +void SourceImage::Copy(const SourceImage &src) { + mime_type_ = src.mime_type_; + filename_ = src.filename_; + encoded_data_ = src.encoded_data_; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/texture/source_image.h b/contrib/draco/src/draco/texture/source_image.h new file mode 100644 index 000000000..5827918e4 --- /dev/null +++ b/contrib/draco/src/draco/texture/source_image.h @@ -0,0 +1,72 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_TEXTURE_SOURCE_IMAGE_H_ +#define DRACO_TEXTURE_SOURCE_IMAGE_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include + +#include "draco/core/status.h" + +namespace draco { + +// This class is used to hold the encoded and decoded data and characteristics +// for an image. In order for the image to contain "valid" encoded data, either +// the |filename_| must point to a valid image file or the |mime_type_| and +// |encoded_data_| must contain valid image data. +class SourceImage { + public: + SourceImage() {} + + // No copy constructors. + SourceImage(const SourceImage &) = delete; + SourceImage &operator=(const SourceImage &) = delete; + // No move constructors. + SourceImage(SourceImage &&) = delete; + SourceImage &operator=(SourceImage &&) = delete; + + void Copy(const SourceImage &src); + + // Sets the name of the source image file. + void set_filename(const std::string &filename) { filename_ = filename; } + const std::string &filename() const { return filename_; } + + void set_mime_type(const std::string &mime_type) { mime_type_ = mime_type; } + const std::string &mime_type() const { return mime_type_; } + + std::vector &MutableEncodedData() { return encoded_data_; } + const std::vector &encoded_data() const { return encoded_data_; } + + private: + // The filename of the image. This field can be empty as long as |mime_type_| + // and |encoded_data_| is not empty. + std::string filename_; + + // The mimetype of the |encoded_data_|. + std::string mime_type_; + + // The encoded data of the image. This field can be empty as long as + // |filename_| is not empty. + std::vector encoded_data_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_TEXTURE_SOURCE_IMAGE_H_ diff --git a/contrib/draco/src/draco/texture/texture.h b/contrib/draco/src/draco/texture/texture.h new file mode 100644 index 000000000..1d3b6e382 --- /dev/null +++ b/contrib/draco/src/draco/texture/texture.h @@ -0,0 +1,46 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_TEXTURE_TEXTURE_H_ +#define DRACO_TEXTURE_TEXTURE_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +#include "draco/io/image_compression_options.h" +#include "draco/texture/source_image.h" + +namespace draco { + +// Texture class storing the source image data. +class Texture { + public: + void Copy(Texture &other) { source_image_.Copy(other.source_image_); } + + void set_source_image(const SourceImage &image) { source_image_.Copy(image); } + const SourceImage &source_image() const { return source_image_; } + SourceImage &source_image() { return source_image_; } + + private: + // If set this is the image that this texture is based from. + SourceImage source_image_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_TEXTURE_TEXTURE_H_ diff --git a/contrib/draco/src/draco/texture/texture_library.cc b/contrib/draco/src/draco/texture/texture_library.cc new file mode 100644 index 000000000..221ff28d4 --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_library.cc @@ -0,0 +1,61 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/texture/texture_library.h" + +#include + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +void TextureLibrary::Copy(const TextureLibrary &src) { + Clear(); + Append(src); +} + +void TextureLibrary::Append(const TextureLibrary &src) { + const size_t old_num_textures = textures_.size(); + textures_.resize(old_num_textures + src.textures_.size()); + for (int i = 0; i < src.textures_.size(); ++i) { + textures_[old_num_textures + i] = std::unique_ptr(new Texture()); + textures_[old_num_textures + i]->Copy(*src.textures_[i]); + } +} + +void TextureLibrary::Clear() { textures_.clear(); } + +int TextureLibrary::PushTexture(std::unique_ptr texture) { + textures_.push_back(std::move(texture)); + return textures_.size() - 1; +} + +std::unordered_map +TextureLibrary::ComputeTextureToIndexMap() const { + std::unordered_map ret; + for (int i = 0; i < textures_.size(); ++i) { + ret[textures_[i].get()] = i; + } + return ret; +} + +std::unique_ptr TextureLibrary::RemoveTexture(int index) { + std::unique_ptr ret = std::move(textures_[index]); + textures_.erase(textures_.begin() + index); + return ret; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/texture/texture_library.h b/contrib/draco/src/draco/texture/texture_library.h new file mode 100644 index 000000000..a377d8fbc --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_library.h @@ -0,0 +1,67 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_TEXTURE_TEXTURE_LIBRARY_H_ +#define DRACO_TEXTURE_TEXTURE_LIBRARY_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include + +#include "draco/texture/texture.h" + +namespace draco { + +// Container class for storing draco::Texture objects in an indexed list. +class TextureLibrary { + public: + // Copies textures from the source library to this library. Order of the + // copied textures is preserved. + void Copy(const TextureLibrary &src); + + // Appends all textures from the source library to this library. All textures + // are copied over. + void Append(const TextureLibrary &src); + + // Removes all textures from the library. + void Clear(); + + // Pushes a new texture into the library. Returns an index of the newly + // inserted texture. + int PushTexture(std::unique_ptr texture); + + size_t NumTextures() const { return textures_.size(); } + + Texture *GetTexture(int index) { return textures_[index].get(); } + const Texture *GetTexture(int index) const { return textures_[index].get(); } + + // Returns a map from texture pointer to texture index for all textures. + std::unordered_map ComputeTextureToIndexMap() const; + + // Removes and returns a texture from the library. The returned texture can be + // either used by the caller or ignored in which case it would be + // automatically deleted. + std::unique_ptr RemoveTexture(int index); + + private: + std::vector> textures_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_TEXTURE_TEXTURE_LIBRARY_H_ diff --git a/contrib/draco/src/draco/texture/texture_library_test.cc b/contrib/draco/src/draco/texture/texture_library_test.cc new file mode 100644 index 000000000..4d681fdd2 --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_library_test.cc @@ -0,0 +1,22 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/texture/texture_library.h" + +#include + +#include "draco/core/draco_test_utils.h" +#include "draco/io/texture_io.h" + +namespace {} // namespace diff --git a/contrib/draco/src/draco/texture/texture_map.cc b/contrib/draco/src/draco/texture/texture_map.cc new file mode 100644 index 000000000..459d3f600 --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_map.cc @@ -0,0 +1,86 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/texture/texture_map.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +TextureMap::TextureMap() + : type_(TextureMap::GENERIC), + wrapping_mode_(CLAMP_TO_EDGE), + tex_coord_index_(-1), + min_filter_(UNSPECIFIED), + mag_filter_(UNSPECIFIED), + texture_(nullptr) {} + +void TextureMap::Copy(const TextureMap &src) { + type_ = src.type_; + wrapping_mode_ = src.wrapping_mode_; + tex_coord_index_ = src.tex_coord_index_; + min_filter_ = src.min_filter_; + mag_filter_ = src.mag_filter_; + if (src.owned_texture_ == nullptr) { + owned_texture_ = nullptr; + texture_ = src.texture_; + } else { + std::unique_ptr new_texture(new Texture()); + new_texture->Copy(*src.owned_texture_); + owned_texture_ = std::move(new_texture); + texture_ = owned_texture_.get(); + } + texture_transform_.Copy(src.texture_transform_); +} + +void TextureMap::SetProperties(Type type) { + SetProperties(type, WrappingMode(CLAMP_TO_EDGE), 0); +} + +void TextureMap::SetProperties(TextureMap::Type type, int tex_coord_index) { + SetProperties(type, WrappingMode(CLAMP_TO_EDGE), tex_coord_index); +} + +void TextureMap::SetProperties(Type type, WrappingMode wrapping_mode, + int tex_coord_index) { + SetProperties(type, wrapping_mode, tex_coord_index, UNSPECIFIED, UNSPECIFIED); +} + +void TextureMap::SetProperties(Type type, WrappingMode wrapping_mode, + int tex_coord_index, FilterType min_filter, + FilterType mag_filter) { + type_ = type; + wrapping_mode_ = wrapping_mode; + tex_coord_index_ = tex_coord_index; + min_filter_ = min_filter; + mag_filter_ = mag_filter; +} + +void TextureMap::SetTexture(std::unique_ptr texture) { + owned_texture_ = std::move(texture); + texture_ = owned_texture_.get(); +} + +void TextureMap::SetTexture(Texture *texture) { + owned_texture_ = nullptr; + texture_ = texture; +} + +void TextureMap::SetTransform(const TextureTransform &transform) { + texture_transform_.Copy(transform); +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/texture/texture_map.h b/contrib/draco/src/draco/texture/texture_map.h new file mode 100644 index 000000000..f3a95b501 --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_map.h @@ -0,0 +1,175 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_TEXTURE_TEXTURE_MAP_H_ +#define DRACO_TEXTURE_TEXTURE_MAP_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +#include "draco/texture/texture.h" +#include "draco/texture/texture_transform.h" + +namespace draco { + +// Class representing mapping of one texture to a mesh. A texture map +// specifies the mesh attribute that contains texture coordinates used by the +// texture. The class also defines an intended use of the texture as a so called +// mapping type (COLOR, NORMAL_TANGENT_SPACE, etc..). Mapping types are roughly +// based on GLTF 2.0 material spec that describes a metallic-roughness PBR +// material model. More details can be found here: +// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#materials +class TextureMap { + public: + enum Type { + // Generic purpose texture (not GLTF compliant). + GENERIC = 0, + // Color data with optional alpha channel for transparency (GLTF compliant). + COLOR = 1, + // Dedicated texture for storing transparency (not GLTF compliant). + OPACITY = 2, + // Dedicated texture for storing metallic property (not GLTF compliant). + METALLIC = 3, + // Dedicated texture for storing roughness property (not GLTF compliant). + ROUGHNESS = 4, + // Combined texture for storing metallic and roughness properties. + // B == metallic, G == roughness (GLTF compliant). + METALLIC_ROUGHNESS = 5, + // Normal map defined in the object space of the mesh (not GLTF compliant). + NORMAL_OBJECT_SPACE = 6, + // Normal map defined in the tangent space of the mesh (GLTF compliant). + NORMAL_TANGENT_SPACE = 7, + // Precomputed ambient occlusion on the surface (GLTF compliant). + AMBIENT_OCCLUSION = 8, + // Emissive color (GLTF compliant). + EMISSIVE = 9, + // Texture types of glTF material extension KHR_materials_sheen. + SHEEN_COLOR = 10, + SHEEN_ROUGHNESS = 11, + // Texture types of glTF material extension KHR_materials_transmission. + TRANSMISSION = 12, + // Texture types of glTF material extension KHR_materials_clearcoat. + CLEARCOAT = 13, + CLEARCOAT_ROUGHNESS = 14, + CLEARCOAT_NORMAL = 15, + // Texture types of glTF material extension KHR_materials_volume. + THICKNESS = 16, + // Texture types of glTF material extension KHR_materials_specular. + SPECULAR = 17, + SPECULAR_COLOR = 18, + // The number of texture types. + TEXTURE_TYPES_COUNT + }; + + enum AxisWrappingMode { + // Out of bounds access along a texture axis should be clamped to the + // nearest edge (default). + CLAMP_TO_EDGE = 0, + // Texture is repeated along a texture axis in a mirrored pattern. + MIRRORED_REPEAT, + // Texture is repeated along a texture axis (tiled textures). + REPEAT + }; + + struct WrappingMode { + explicit WrappingMode(AxisWrappingMode mode) : WrappingMode(mode, mode) {} + WrappingMode(AxisWrappingMode s, AxisWrappingMode t) : s(s), t(t) {} + AxisWrappingMode s; + AxisWrappingMode t; + }; + + // Filter types are roughly based on glTF 2.0 samplers spec. + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#samplers + enum FilterType { + UNSPECIFIED = 0, + NEAREST, + LINEAR, + NEAREST_MIPMAP_NEAREST, + LINEAR_MIPMAP_NEAREST, + NEAREST_MIPMAP_LINEAR, + LINEAR_MIPMAP_LINEAR + }; + + TextureMap(); + TextureMap(TextureMap &&) = default; + + // Copies texture map data from the |src| texture map to this texture map. + void Copy(const TextureMap &src); + + // Sets the mapping information between the texture and the target mesh. + // |tex_coord_index| is the local index of the texture coordinates that is + // used to map the texture on the mesh. + void SetProperties(Type type); + void SetProperties(Type type, int tex_coord_index); + void SetProperties(Type type, WrappingMode wrapping_mode, + int tex_coord_index); + void SetProperties(Type type, WrappingMode wrapping_mode, int tex_coord_index, + FilterType min_filter, FilterType mag_filter); + + // Set texture and transfer its ownership to the TextureMap object. + // + // Note that this should not be used if this TextureMap is part of a + // MaterialLibrary. For such cases, the TextureMap's texture should refer to + // an entry in the MaterialLibrary's TextureLibrary. + void SetTexture(std::unique_ptr texture); + + // Set texture and without transferring the ownership. The caller needs to + // ensure the texture is valid during the lifetime of the TextureMap object. + void SetTexture(Texture *texture); + + void SetTransform(const TextureTransform &transform); + const TextureTransform &texture_transform() const { + return texture_transform_; + } + + const Texture *texture() const { return texture_; } + Texture *texture() { return texture_; } + Type type() const { return type_; } + WrappingMode wrapping_mode() const { return wrapping_mode_; } + int tex_coord_index() const { return tex_coord_index_; } + FilterType min_filter() const { return min_filter_; } + FilterType mag_filter() const { return mag_filter_; } + + TextureMap &operator=(TextureMap &&) = default; + + private: + Type type_; + WrappingMode wrapping_mode_; + + // Local index of the texture coordinates that is used to map the texture on + // the mesh. For example, |tex_coord_index_ == 0| would correspond to the + // first TEX_COORD attribute of the mesh. + int tex_coord_index_; + + FilterType min_filter_; + FilterType mag_filter_; + + // Used when the texture object is owned by TextureMap, otherwise set to + // nullptr. + std::unique_ptr owned_texture_; + + // Either raw pointer owned by |owned_texture_| or a pointer to a user + // specified texture in case |owned_texture_| is nullptr. + Texture *texture_; + + // Transformation values of the texture map. + TextureTransform texture_transform_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_TEXTURE_TEXTURE_MAP_H_ diff --git a/contrib/draco/src/draco/texture/texture_map_test.cc b/contrib/draco/src/draco/texture/texture_map_test.cc new file mode 100644 index 000000000..e69de29bb diff --git a/contrib/draco/src/draco/texture/texture_transform.cc b/contrib/draco/src/draco/texture/texture_transform.cc new file mode 100644 index 000000000..ccb00d59f --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_transform.cc @@ -0,0 +1,79 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/texture/texture_transform.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED + +namespace draco { + +TextureTransform::TextureTransform() { Clear(); } + +void TextureTransform::Clear() { + offset_ = TextureTransform::GetDefaultOffset(); + rotation_ = TextureTransform::GetDefaultRotation(); + scale_ = TextureTransform::GetDefaultScale(); + tex_coord_ = TextureTransform::GetDefaultTexCoord(); +} + +void TextureTransform::Copy(const TextureTransform &src) { + offset_ = src.offset_; + rotation_ = src.rotation_; + scale_ = src.scale_; + tex_coord_ = src.tex_coord_; +} + +bool TextureTransform::IsDefault(const TextureTransform &tt) { + const TextureTransform defaults; + if (tt == defaults) { + return true; + } + return false; +} + +bool TextureTransform::IsOffsetSet() const { + return offset_ != TextureTransform::GetDefaultOffset(); +} + +bool TextureTransform::IsRotationSet() const { + return rotation_ != TextureTransform::GetDefaultRotation(); +} + +bool TextureTransform::IsScaleSet() const { + return scale_ != TextureTransform::GetDefaultScale(); +} + +bool TextureTransform::IsTexCoordSet() const { + return tex_coord_ != TextureTransform::GetDefaultTexCoord(); +} + +bool TextureTransform::operator==(const TextureTransform &tt) const { + if (tex_coord_ != tt.tex_coord_) { + return false; + } + if (rotation_ != tt.rotation_) { + return false; + } + if (offset_ != tt.offset_) { + return false; + } + if (scale_ != tt.scale_) { + return false; + } + return true; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/texture/texture_transform.h b/contrib/draco/src/draco/texture/texture_transform.h new file mode 100644 index 000000000..b2ec47f2e --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_transform.h @@ -0,0 +1,75 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_TEXTURE_TEXTURE_TRANSFORM_H_ +#define DRACO_TEXTURE_TEXTURE_TRANSFORM_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include + +namespace draco { + +// Class to hold texture transformations. Parameters are based on the glTF 2.0 +// extension KHR_texture_transform: +// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform +class TextureTransform { + public: + TextureTransform(); + + // Resets the values back to defaults. + void Clear(); + + // Copies texture transform data from the |src| texture transform to this + // texture transform. + void Copy(const TextureTransform &src); + + // Returns true if |tt| contains all default values. + static bool IsDefault(const TextureTransform &tt); + + bool IsOffsetSet() const; + bool IsRotationSet() const; + bool IsScaleSet() const; + bool IsTexCoordSet() const; + + void set_offset(const std::array &offset) { offset_ = offset; } + const std::array &offset() const { return offset_; } + void set_scale(const std::array &scale) { scale_ = scale; } + const std::array &scale() const { return scale_; } + + void set_rotation(double rotation) { rotation_ = rotation; } + double rotation() const { return rotation_; } + void set_tex_coord(int tex_coord) { tex_coord_ = tex_coord; } + int tex_coord() const { return tex_coord_; } + + bool operator==(const TextureTransform &tt) const; + + private: + static std::array GetDefaultOffset() { return {0.0, 0.0}; } + static float GetDefaultRotation() { return 0.0; } + static std::array GetDefaultScale() { return {0.0, 0.0}; } + static int GetDefaultTexCoord() { return -1; } + + std::array offset_; + double rotation_; + std::array scale_; + int tex_coord_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_TEXTURE_TEXTURE_TRANSFORM_H_ diff --git a/contrib/draco/src/draco/texture/texture_transform_test.cc b/contrib/draco/src/draco/texture/texture_transform_test.cc new file mode 100644 index 000000000..e69de29bb diff --git a/contrib/draco/src/draco/texture/texture_utils.cc b/contrib/draco/src/draco/texture/texture_utils.cc new file mode 100644 index 000000000..7598ac780 --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_utils.cc @@ -0,0 +1,144 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/texture/texture_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include +#include +#include +#include +#include +#include +#include + +namespace draco { + +std::string TextureUtils::GetTargetStem(const Texture &texture) { + // Return stem of the source image if there is one. + if (!texture.source_image().filename().empty()) { + const std::string &full_path = texture.source_image().filename(); + std::string folder_path; + std::string filename; + SplitPath(full_path, &folder_path, &filename); + return RemoveFileExtension(filename); + } + + // Return an empty stem. + return ""; +} + +std::string TextureUtils::GetOrGenerateTargetStem(const Texture &texture, + int index, + const std::string &suffix) { + // Return target stem from |texture| if there is one. + const std::string name = GetTargetStem(texture); + if (!name.empty()) { + return name; + } + + // Return target stem generated from |index| and |suffix|. + return "Texture" + std::to_string(index) + suffix; +} + +ImageFormat TextureUtils::GetTargetFormat(const Texture &texture) { + // Return format based on source image mime type. + return GetSourceFormat(texture); +} + +std::string TextureUtils::GetTargetExtension(const Texture &texture) { + return GetExtension(GetTargetFormat(texture)); +} + +ImageFormat TextureUtils::GetSourceFormat(const Texture &texture) { + // Try to get the extension based on source image mime type. + std::string extension = + LowercaseMimeTypeExtension(texture.source_image().mime_type()); + if (extension.empty() && !texture.source_image().filename().empty()) { + // Try to get the extension from the source image filename. + extension = LowercaseFileExtension(texture.source_image().filename()); + } + if (extension.empty()) { + // Default to png. + extension = "png"; + } + return GetFormat(extension); +} + +ImageFormat TextureUtils::GetFormat(const std::string &extension) { + if (extension == "png") { + return ImageFormat::PNG; + } else if (extension == "jpg" || extension == "jpeg") { + return ImageFormat::JPEG; + } else if (extension == "basis" || extension == "ktx2") { + return ImageFormat::BASIS; + } else if (extension == "webp") { + return ImageFormat::WEBP; + } + return ImageFormat::NONE; +} + +std::string TextureUtils::GetExtension(ImageFormat format) { + switch (format) { + case ImageFormat::PNG: + return "png"; + case ImageFormat::JPEG: + return "jpg"; + case ImageFormat::BASIS: + return "ktx2"; + case ImageFormat::WEBP: + return "webp"; + case ImageFormat::NONE: + default: + return ""; + } +} + +int TextureUtils::ComputeRequiredNumChannels( + const Texture &texture, const MaterialLibrary &material_library) { + // TODO(vytyaz): Consider a case where |texture| is not only used in OMR but + // also in other texture map types. + const auto mr_textures = TextureUtils::FindTextures( + TextureMap::METALLIC_ROUGHNESS, &material_library); + if (std::find(mr_textures.begin(), mr_textures.end(), &texture) == + mr_textures.end()) { + // Occlusion-only texture. + return 1; + } + // Occlusion-metallic-roughness texture. + return 3; +} + +std::vector TextureUtils::FindTextures( + const TextureMap::Type texture_type, + const MaterialLibrary *material_library) { + // Find textures with no duplicates. + std::unordered_set textures; + for (int i = 0; i < material_library->NumMaterials(); ++i) { + const TextureMap *const texture_map = + material_library->GetMaterial(i)->GetTextureMapByType(texture_type); + if (texture_map != nullptr && texture_map->texture() != nullptr) { + textures.insert(texture_map->texture()); + } + } + + // Return the textures as a vector. + std::vector result; + result.insert(result.end(), textures.begin(), textures.end()); + return result; +} + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/texture/texture_utils.h b/contrib/draco/src/draco/texture/texture_utils.h new file mode 100644 index 000000000..18d29950a --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_utils.h @@ -0,0 +1,78 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_TEXTURE_TEXTURE_UTILS_H_ +#define DRACO_TEXTURE_TEXTURE_UTILS_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/status.h" +#include "draco/core/status_or.h" +#include "draco/io/file_utils.h" +#include "draco/material/material_library.h" +#include "draco/texture/texture_library.h" +#include "draco/texture/texture_map.h" + +namespace draco { + +// Helper class implementing various utilities operating on draco::Texture. +class TextureUtils { + public: + // Returns |texture| image stem (file basename without extension) based on the + // source image filename or an empty string when source image is not set. + static std::string GetTargetStem(const Texture &texture); + + // Returns |texture| image stem (file basename without extension) based on the + // source image filename or a name generated from |index| and |suffix| like + // "Texture5_BaseColor" when source image is not set. + static std::string GetOrGenerateTargetStem(const Texture &texture, int index, + const std::string &suffix); + + // Returns |texture| format based on compression settings, the source image + // mime type or the source image filename. + static ImageFormat GetTargetFormat(const Texture &texture); + + // Returns |texture| image file extension based on compression settings, the + // source image mime type or the source image filename. + static std::string GetTargetExtension(const Texture &texture); + + // Returns |texture| format based on source image mime type or the source + // image filename. + static ImageFormat GetSourceFormat(const Texture &texture); + + // Returns image format corresponding to a given image file |extension|. NONE + // is returned when |extension| is empty or unknown. + static ImageFormat GetFormat(const std::string &extension); + + // Returns image file extension corresponding to a given image |format|. Empty + // extension is returned when the |format| is NONE. + static std::string GetExtension(ImageFormat format); + + // Returns the number of channels required for encoding a |texture| from a + // given |material_library|, taking into account texture opacity and assuming + // that occlusion and metallic-roughness texture maps may share a texture. + // TODO(vytyaz): Move this and FindTextures() to MaterialLibrary class. + static int ComputeRequiredNumChannels( + const Texture &texture, const MaterialLibrary &material_library); + + static std::vector FindTextures( + const TextureMap::Type texture_type, + const MaterialLibrary *material_library); +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_TEXTURE_TEXTURE_UTILS_H_ diff --git a/contrib/draco/src/draco/texture/texture_utils_test.cc b/contrib/draco/src/draco/texture/texture_utils_test.cc new file mode 100644 index 000000000..45873ea7a --- /dev/null +++ b/contrib/draco/src/draco/texture/texture_utils_test.cc @@ -0,0 +1,163 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/texture/texture_utils.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +#include "draco/core/draco_test_utils.h" +#include "draco/io/texture_io.h" +#include "draco/texture/color_utils.h" + +namespace { + +TEST(TextureUtilsTest, TestGetTargetNameForTextureLoadedFromFile) { + // Tests that correct target stem and format are returned by texture utils for + // texture loaded from image file (stem and format from source file). + std::unique_ptr texture = + draco::ReadTextureFromFile(draco::GetTestFileFullPath("fast.jpg")) + .value(); + ASSERT_NE(texture, nullptr); + ASSERT_EQ(draco::TextureUtils::GetTargetStem(*texture), "fast"); + ASSERT_EQ(draco::TextureUtils::GetTargetExtension(*texture), "jpg"); + ASSERT_EQ(draco::TextureUtils::GetTargetFormat(*texture), + draco::ImageFormat::JPEG); + ASSERT_EQ(draco::TextureUtils::GetOrGenerateTargetStem(*texture, 5, "_Color"), + "fast"); +} + +TEST(TextureUtilsTest, TestGetTargetNameForNewTexture) { + // Tests that correct target stem and format are returned by texture utils for + // a newly created texture (empty stem and PNG image type by default). + std::unique_ptr texture(new draco::Texture()); + ASSERT_NE(texture, nullptr); + ASSERT_EQ(draco::TextureUtils::GetTargetStem(*texture), ""); + ASSERT_EQ(draco::TextureUtils::GetOrGenerateTargetStem(*texture, 5, "_Color"), + "Texture5_Color"); + ASSERT_EQ(draco::TextureUtils::GetTargetExtension(*texture), "png"); + ASSERT_EQ(draco::TextureUtils::GetTargetFormat(*texture), + draco::ImageFormat::PNG); +} + +TEST(TextureUtilsTest, TestGetSourceFormat) { + // Tests that the source format is determined correctly for new textures and + // for textures loaded from file. + std::unique_ptr new_texture(new draco::Texture()); + DRACO_ASSIGN_OR_ASSERT( + std::unique_ptr png_texture, + draco::ReadTextureFromFile(draco::GetTestFileFullPath("test.png"))); + DRACO_ASSIGN_OR_ASSERT( + std::unique_ptr jpg_texture, + draco::ReadTextureFromFile(draco::GetTestFileFullPath("fast.jpg"))); + + // Check source formats. + ASSERT_EQ(draco::TextureUtils::GetSourceFormat(*new_texture), + draco::ImageFormat::PNG); + ASSERT_EQ(draco::TextureUtils::GetSourceFormat(*png_texture), + draco::ImageFormat::PNG); + ASSERT_EQ(draco::TextureUtils::GetSourceFormat(*jpg_texture), + draco::ImageFormat::JPEG); + + // Remove the mime-type from the jpeg texture and ensure the source format is + // still detected properly based on the filename. + jpg_texture->source_image().set_mime_type(""); + ASSERT_EQ(draco::TextureUtils::GetSourceFormat(*jpg_texture), + draco::ImageFormat::JPEG); +} + +TEST(TextureUtilsTest, TestGetFormat) { + typedef draco::ImageFormat ImageFormat; + ASSERT_EQ(draco::TextureUtils::GetFormat("png"), ImageFormat::PNG); + ASSERT_EQ(draco::TextureUtils::GetFormat("jpg"), ImageFormat::JPEG); + ASSERT_EQ(draco::TextureUtils::GetFormat("jpeg"), ImageFormat::JPEG); + ASSERT_EQ(draco::TextureUtils::GetFormat("basis"), ImageFormat::BASIS); + ASSERT_EQ(draco::TextureUtils::GetFormat("ktx2"), ImageFormat::BASIS); + ASSERT_EQ(draco::TextureUtils::GetFormat("webp"), ImageFormat::WEBP); + ASSERT_EQ(draco::TextureUtils::GetFormat(""), ImageFormat::NONE); + ASSERT_EQ(draco::TextureUtils::GetFormat("bmp"), ImageFormat::NONE); +} + +TEST(TextureUtilsTest, TestGetExtension) { + typedef draco::ImageFormat ImageFormat; + ASSERT_EQ(draco::TextureUtils::GetExtension(ImageFormat::PNG), "png"); + ASSERT_EQ(draco::TextureUtils::GetExtension(ImageFormat::JPEG), "jpg"); + ASSERT_EQ(draco::TextureUtils::GetExtension(ImageFormat::BASIS), "ktx2"); + ASSERT_EQ(draco::TextureUtils::GetExtension(ImageFormat::WEBP), "webp"); + ASSERT_EQ(draco::TextureUtils::GetExtension(ImageFormat::NONE), ""); +} + +TEST(TextureUtilsTest, TestComputeRequiredNumChannels) { + // Tests that the number of texture channels can be computed. Material library + // under test is created programmatically. + + // Load textures. + DRACO_ASSIGN_OR_ASSERT( + auto texture0, draco::ReadTextureFromFile( + draco::GetTestFileFullPath("fully_transparent.png"))); + ASSERT_NE(texture0, nullptr); + draco::Texture *texture0_ptr = texture0.get(); + DRACO_ASSIGN_OR_ASSERT( + auto texture1, + draco::ReadTextureFromFile(draco::GetTestFileFullPath("squares.png"))); + ASSERT_NE(texture1, nullptr); + const draco::Texture *texture1_ptr = texture1.get(); + DRACO_ASSIGN_OR_ASSERT( + auto texture2, draco::ReadTextureFromFile( + draco::GetTestFileFullPath("fully_transparent.png"))); + ASSERT_NE(texture2, nullptr); + const draco::Texture *texture2_ptr = texture2.get(); + + // Compute number of channels for occlusion-only texture. + draco::MaterialLibrary library; + draco::Material *const material0 = library.MutableMaterial(0); + material0->SetTextureMap(std::move(texture0), + draco::TextureMap::AMBIENT_OCCLUSION, 0); + ASSERT_EQ( + draco::TextureUtils::ComputeRequiredNumChannels(*texture0_ptr, library), + 1); + + // Compute number of channels for occlusion-only texture with MR present but + // not using the same texture. + draco::Material *const material1 = library.MutableMaterial(1); + material1->SetTextureMap(std::move(texture1), + draco::TextureMap::METALLIC_ROUGHNESS, 0); + ASSERT_EQ( + draco::TextureUtils::ComputeRequiredNumChannels(*texture0_ptr, library), + 1); + + // Compute number of channels for metallic-roughness texture. + ASSERT_EQ( + draco::TextureUtils::ComputeRequiredNumChannels(*texture1_ptr, library), + 3); + + // Compute number of channels texture that is used for occlusin map in one + // material and also shared with metallic-roughness map in another material. + draco::Material *const material2 = library.MutableMaterial(2); + DRACO_ASSERT_OK(material2->SetTextureMap( + texture0_ptr, draco::TextureMap::METALLIC_ROUGHNESS, 0)); + ASSERT_EQ( + draco::TextureUtils::ComputeRequiredNumChannels(*texture0_ptr, library), + 3); + + // Compute number of channels for non-opaque texture. + material0->SetTextureMap(std::move(texture2), draco::TextureMap::COLOR, 0); + ASSERT_EQ( + draco::TextureUtils::ComputeRequiredNumChannels(*texture2_ptr, library), + 4); +} + +} // namespace + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/tools/draco_decoder.cc b/contrib/draco/src/draco/tools/draco_decoder.cc index 610709d62..cf5f18094 100644 --- a/contrib/draco/src/draco/tools/draco_decoder.cc +++ b/contrib/draco/src/draco/tools/draco_decoder.cc @@ -20,6 +20,7 @@ #include "draco/io/obj_encoder.h" #include "draco/io/parser_utils.h" #include "draco/io/ply_encoder.h" +#include "draco/io/stl_encoder.h" namespace { @@ -126,7 +127,6 @@ int main(int argc, char **argv) { } // Save the decoded geometry into a file. - // TODO(fgalligan): Change extension code to look for '.'. const std::string extension = draco::parser::ToLower( options.output.size() >= 4 ? options.output.substr(options.output.size() - 4) @@ -140,7 +140,7 @@ int main(int argc, char **argv) { return -1; } } else { - if (!obj_encoder.EncodeToFile(*pc.get(), options.output)) { + if (!obj_encoder.EncodeToFile(*pc, options.output)) { printf("Failed to store the decoded point cloud as OBJ.\n"); return -1; } @@ -153,13 +153,25 @@ int main(int argc, char **argv) { return -1; } } else { - if (!ply_encoder.EncodeToFile(*pc.get(), options.output)) { + if (!ply_encoder.EncodeToFile(*pc, options.output)) { printf("Failed to store the decoded point cloud as PLY.\n"); return -1; } } + } else if (extension == ".stl") { + draco::StlEncoder stl_encoder; + if (mesh) { + draco::Status s = stl_encoder.EncodeToFile(*mesh, options.output); + if (s.code() != draco::Status::OK) { + printf("Failed to store the decoded mesh as STL.\n"); + return -1; + } + } else { + printf("Can't store a point cloud as STL.\n"); + return -1; + } } else { - printf("Invalid extension of the output file. Use either .ply or .obj.\n"); + printf("Invalid output file extension. Use .obj .ply or .stl.\n"); return -1; } printf("Decoded geometry saved to %s (%" PRId64 " ms to decode)\n", diff --git a/contrib/draco/src/draco/tools/draco_encoder.cc b/contrib/draco/src/draco/tools/draco_encoder.cc index 7e3632d7d..ec639453b 100644 --- a/contrib/draco/src/draco/tools/draco_encoder.cc +++ b/contrib/draco/src/draco/tools/draco_encoder.cc @@ -15,7 +15,9 @@ #include #include +#include "draco/compression/config/compression_shared.h" #include "draco/compression/encode.h" +#include "draco/compression/expert_encode.h" #include "draco/core/cycle_timer.h" #include "draco/io/file_utils.h" #include "draco/io/mesh_io.h" @@ -35,6 +37,7 @@ struct Options { int generic_quantization_bits; bool generic_deleted; int compression_level; + bool preserve_polygons; bool use_metadata; std::string input; std::string output; @@ -50,6 +53,7 @@ Options::Options() generic_quantization_bits(8), generic_deleted(false), compression_level(7), + preserve_polygons(false), use_metadata(false) {} void Usage() { @@ -83,6 +87,11 @@ void Usage() { printf( " --metadata use metadata to encode extra information in " "mesh files.\n"); + // Mesh with polygonal faces loaded from OBJ format is converted to triangular + // mesh and polygon reconstruction information is encoded into a new generic + // attribute. + printf(" -preserve_polygons encode polygon info as an attribute.\n"); + printf( "\nUse negative quantization values to skip the specified attribute\n"); } @@ -138,12 +147,12 @@ void PrintOptions(const draco::PointCloud &pc, const Options &options) { } int EncodePointCloudToFile(const draco::PointCloud &pc, const std::string &file, - draco::Encoder *encoder) { + draco::ExpertEncoder *encoder) { draco::CycleTimer timer; // Encode the geometry. draco::EncoderBuffer buffer; timer.Start(); - const draco::Status status = encoder->EncodePointCloudToBuffer(pc, &buffer); + const draco::Status status = encoder->EncodeToBuffer(&buffer); if (!status.ok()) { printf("Failed to encode the point cloud.\n"); printf("%s\n", status.error_msg()); @@ -162,12 +171,12 @@ int EncodePointCloudToFile(const draco::PointCloud &pc, const std::string &file, } int EncodeMeshToFile(const draco::Mesh &mesh, const std::string &file, - draco::Encoder *encoder) { + draco::ExpertEncoder *encoder) { draco::CycleTimer timer; // Encode the geometry. draco::EncoderBuffer buffer; timer.Start(); - const draco::Status status = encoder->EncodeMeshToBuffer(mesh, &buffer); + const draco::Status status = encoder->EncodeToBuffer(&buffer); if (!status.ok()) { printf("Failed to encode the mesh.\n"); printf("%s\n", status.error_msg()); @@ -249,6 +258,8 @@ int main(int argc, char **argv) { ++i; } else if (!strcmp("--metadata", argv[i])) { options.use_metadata = true; + } else if (!strcmp("-preserve_polygons", argv[i])) { + options.preserve_polygons = true; } } if (argc < 3 || options.input.empty()) { @@ -259,8 +270,10 @@ int main(int argc, char **argv) { std::unique_ptr pc; draco::Mesh *mesh = nullptr; if (!options.is_point_cloud) { - auto maybe_mesh = - draco::ReadMeshFromFile(options.input, options.use_metadata); + draco::Options load_options; + load_options.SetBool("use_metadata", options.use_metadata); + load_options.SetBool("preserve_polygons", options.preserve_polygons); + auto maybe_mesh = draco::ReadMeshFromFile(options.input, load_options); if (!maybe_mesh.ok()) { printf("Failed loading the input mesh: %s.\n", maybe_mesh.status().error_msg()); @@ -350,14 +363,36 @@ int main(int argc, char **argv) { options.output = options.input + ".drc"; } - PrintOptions(*pc.get(), options); + PrintOptions(*pc, options); + + const bool input_is_mesh = mesh && mesh->num_faces() > 0; + + // Convert to ExpertEncoder that allows us to set per-attribute options. + std::unique_ptr expert_encoder; + if (input_is_mesh) { + expert_encoder.reset(new draco::ExpertEncoder(*mesh)); + } else { + expert_encoder.reset(new draco::ExpertEncoder(*pc)); + } + expert_encoder->Reset(encoder.CreateExpertEncoderOptions(*pc)); + + // Check if there is an attribute that stores polygon edges. If so, we disable + // the default prediction scheme for the attribute as it actually makes the + // compression worse. + const int poly_att_id = + pc->GetAttributeIdByMetadataEntry("name", "added_edges"); + if (poly_att_id != -1) { + expert_encoder->SetAttributePredictionScheme( + poly_att_id, draco::PredictionSchemeMethod::PREDICTION_NONE); + } int ret = -1; - const bool input_is_mesh = mesh && mesh->num_faces() > 0; - if (input_is_mesh) - ret = EncodeMeshToFile(*mesh, options.output, &encoder); - else - ret = EncodePointCloudToFile(*pc.get(), options.output, &encoder); + + if (input_is_mesh) { + ret = EncodeMeshToFile(*mesh, options.output, expert_encoder.get()); + } else { + ret = EncodePointCloudToFile(*pc, options.output, expert_encoder.get()); + } if (ret != -1 && options.compression_level < 10) { printf( diff --git a/contrib/draco/src/draco/tools/draco_transcoder.cc b/contrib/draco/src/draco/tools/draco_transcoder.cc new file mode 100644 index 000000000..ad0f27714 --- /dev/null +++ b/contrib/draco/src/draco/tools/draco_transcoder.cc @@ -0,0 +1,130 @@ +// Copyright 2019 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include +#include + +#include "draco/core/cycle_timer.h" +#include "draco/core/status.h" +#include "draco/draco_features.h" +#include "draco/texture/texture_utils.h" +#include "draco/tools/draco_transcoder_lib.h" + +namespace { + +// TODO(fgalligan): Add support for no compression to the transcoder lib. +void Usage() { + // TODO(b/204212351): Revisit using a raw string literal here for readability. + printf("Usage: draco_transcoder [options] -i input -o output\n\n"); + printf("Main options:\n"); + printf(" -h | -? show help.\n"); + printf(" -i input file name.\n"); + printf(" -o output file name.\n"); + printf(" -qp quantization bits for the position attribute, "); + printf("default=11.\n"); + printf(" -qt quantization bits for the texture coordinate "); + printf("attribute, default=10.\n"); + printf(" -qn quantization bits for the normal vector attribute"); + printf(", default=8.\n"); + printf(" -qc quantization bits for the color attribute, "); + printf("default=8.\n"); + printf(" -qtg quantization bits for the tangent attribute, "); + printf("default=8.\n"); + printf(" -qw quantization bits for the weight attribute, "); + printf("default=8.\n"); + printf(" -qg quantization bits for any generic attribute, "); + printf("default=8.\n"); + + printf("\nBoolean options may be negated by prefixing 'no'.\n"); +} + +int StringToInt(const std::string &s) { + char *end; + return strtol(s.c_str(), &end, 10); // NOLINT +} + +bool MatchesBooleanOption(const std::string &option, const std::string &value) { + const std::string opt = "-" + option; + const std::string noopt = "-no" + option; + return value == opt || value == noopt; +} + +draco::Status TranscodeFile( + const draco::DracoTranscoder::FileOptions &file_options, + const draco::DracoTranscodingOptions &transcode_options) { + draco::CycleTimer timer; + timer.Start(); + DRACO_ASSIGN_OR_RETURN(std::unique_ptr dt, + draco::DracoTranscoder::Create(transcode_options)); + + DRACO_RETURN_IF_ERROR(dt->Transcode(file_options)); + timer.Stop(); + printf("Transcode\t%s\t%" PRId64 "\n", file_options.input_filename.c_str(), + timer.GetInMs()); + + return draco::OkStatus(); +} + +} // anonymous namespace + +int main(int argc, char **argv) { + draco::DracoTranscoder::FileOptions file_options; + draco::DracoTranscodingOptions transcode_options; + const int argc_check = argc - 1; + + for (int i = 1; i < argc; ++i) { + if (!strcmp("-h", argv[i]) || !strcmp("-?", argv[i])) { + Usage(); + return 0; + } else if (!strcmp("-i", argv[i]) && i < argc_check) { + file_options.input_filename = argv[++i]; + } else if (!strcmp("-o", argv[i]) && i < argc_check) { + file_options.output_filename = argv[++i]; + } else if (!strcmp("-qp", argv[i]) && i < argc_check) { + transcode_options.geometry.quantization_position.SetQuantizationBits( + StringToInt(argv[++i])); + } else if (!strcmp("-qt", argv[i]) && i < argc_check) { + transcode_options.geometry.quantization_bits_tex_coord = + StringToInt(argv[++i]); + } else if (!strcmp("-qn", argv[i]) && i < argc_check) { + transcode_options.geometry.quantization_bits_normal = + StringToInt(argv[++i]); + } else if (!strcmp("-qc", argv[i]) && i < argc_check) { + transcode_options.geometry.quantization_bits_color = + StringToInt(argv[++i]); + } else if (!strcmp("-qtg", argv[i]) && i < argc_check) { + transcode_options.geometry.quantization_bits_tangent = + StringToInt(argv[++i]); + } else if (!strcmp("-qw", argv[i]) && i < argc_check) { + transcode_options.geometry.quantization_bits_weight = + StringToInt(argv[++i]); + } else if (!strcmp("-qg", argv[i]) && i < argc_check) { + transcode_options.geometry.quantization_bits_generic = + StringToInt(argv[++i]); + } + } + if (argc < 3 || file_options.input_filename.empty() || + file_options.output_filename.empty()) { + Usage(); + return -1; + } + + const draco::Status status = TranscodeFile(file_options, transcode_options); + if (!status.ok()) { + printf("Failed\t%s\t%s\n", file_options.input_filename.c_str(), + status.error_msg()); + return -1; + } + return 0; +} diff --git a/contrib/draco/src/draco/tools/draco_transcoder_lib.cc b/contrib/draco/src/draco/tools/draco_transcoder_lib.cc new file mode 100644 index 000000000..b0bc43843 --- /dev/null +++ b/contrib/draco/src/draco/tools/draco_transcoder_lib.cc @@ -0,0 +1,86 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "draco/tools/draco_transcoder_lib.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include "draco/core/status_or.h" +#include "draco/io/file_utils.h" +#include "draco/io/scene_io.h" +#include "draco/scene/scene_utils.h" +#include "draco/texture/texture_utils.h" + +namespace draco { + +DracoTranscoder::DracoTranscoder() {} + +StatusOr> DracoTranscoder::Create( + const DracoTranscodingOptions &options) { + DRACO_RETURN_IF_ERROR(options.geometry.Check()); + std::unique_ptr dt(new DracoTranscoder()); + dt->transcoding_options_ = options; + return dt; +} + +StatusOr> DracoTranscoder::Create( + const DracoCompressionOptions &options) { + DracoTranscodingOptions new_options; + new_options.geometry = options; + return Create(new_options); +} + +Status DracoTranscoder::Transcode(const FileOptions &file_options) { + DRACO_RETURN_IF_ERROR(ReadScene(file_options)); + DRACO_RETURN_IF_ERROR(CompressScene()); + DRACO_RETURN_IF_ERROR(WriteScene(file_options)); + return OkStatus(); +} + +Status DracoTranscoder::ReadScene(const FileOptions &file_options) { + if (file_options.input_filename.empty()) { + return Status(Status::DRACO_ERROR, "Input filename is empty."); + } else if (file_options.output_filename.empty()) { + return Status(Status::DRACO_ERROR, "Output filename is empty."); + } + DRACO_ASSIGN_OR_RETURN(scene_, + ReadSceneFromFile(file_options.input_filename)); + return OkStatus(); +} + +Status DracoTranscoder::WriteScene(const FileOptions &file_options) { + if (!file_options.output_bin_filename.empty() && + !file_options.output_resource_directory.empty()) { + DRACO_RETURN_IF_ERROR(gltf_encoder_.EncodeFile( + *scene_, file_options.output_filename, file_options.output_bin_filename, + file_options.output_resource_directory)); + } else if (!file_options.output_bin_filename.empty()) { + DRACO_RETURN_IF_ERROR( + gltf_encoder_.EncodeFile(*scene_, file_options.output_filename, + file_options.output_bin_filename)); + } else { + DRACO_RETURN_IF_ERROR( + gltf_encoder_.EncodeFile(*scene_, file_options.output_filename)); + } + return OkStatus(); +} + +Status DracoTranscoder::CompressScene() { + // Apply geometry compression settings to all scene meshes. + SceneUtils::SetDracoCompressionOptions(&transcoding_options_.geometry, + scene_.get()); + return OkStatus(); +} + +} // namespace draco +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/tools/draco_transcoder_lib.h b/contrib/draco/src/draco/tools/draco_transcoder_lib.h new file mode 100644 index 000000000..c94d19de7 --- /dev/null +++ b/contrib/draco/src/draco/tools/draco_transcoder_lib.h @@ -0,0 +1,103 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_TOOLS_DRACO_TRANSCODER_LIB_H_ +#define DRACO_TOOLS_DRACO_TRANSCODER_LIB_H_ + +#include "draco/draco_features.h" + +#ifdef DRACO_TRANSCODER_SUPPORTED +#include + +#include "draco/compression/draco_compression_options.h" +#include "draco/core/options.h" +#include "draco/io/gltf_encoder.h" +#include "draco/io/image_compression_options.h" + +namespace draco { + +// Struct to hold Draco transcoding options. +struct DracoTranscodingOptions { + DracoTranscodingOptions() {} + + // Options used when geometry compression optimization is disabled. + DracoCompressionOptions geometry; +}; + +// Class that supports input of glTF (and some simple USD) files, encodes +// them with Draco compression, and outputs glTF Draco compressed files. +// +// glTF supported extensions: +// Input and Output: +// KHR_draco_mesh_compression. http://shortn/_L5tPQqdwWf +// KHR_materials_unlit. http://shortn/_3eaDLoIGam +// KHR_texture_transform. http://shortn/_PORWgVTEe8 +// +// glTF unsupported features: +// Input and Output: +// Morph targets. http://shortn/_zE5DLw8a9B +// Sparse accessors. http://shortn/_h3FwbzQl4f +// KHR_lights_punctual. http://shortn/_nzGk80wKtK +// KHR_materials_pbrSpecularGlossiness. http://shortn/_iz0VC6dIKe +// All vendor extensions. +class DracoTranscoder { + public: + struct FileOptions { + std::string input_filename; // Must be non-empty. + std::string output_filename; // Must be non-empty. + std::string output_bin_filename = ""; + std::string output_resource_directory = ""; + }; + + DracoTranscoder(); + + // Creates a DracoTranscoder object. |options| sets the compression options + // used in the Encode function. + static StatusOr> Create( + const DracoTranscodingOptions &options); + + // Deprecated. + // TODO(fgalligan): Remove when function is not being used anymore. + static StatusOr> Create( + const DracoCompressionOptions &options); + + // Encodes the input with Draco compression using the compression options + // passed in the Create function. The recommended use case is to create a + // transcoder once and call Transcode for multiple files. + Status Transcode(const FileOptions &file_options); + + private: + // Read scene from file. + Status ReadScene(const FileOptions &file_options); + + // Write scene to file. + Status WriteScene(const FileOptions &file_options); + + // Apply compression settings to the scene. + Status CompressScene(); + + private: + GltfEncoder gltf_encoder_; + + // The scene being transcoded. + std::unique_ptr scene_; + + // Copy of the transcoding options passed into the Create function. + DracoTranscodingOptions transcoding_options_; +}; + +} // namespace draco + +#endif // DRACO_TRANSCODER_SUPPORTED +#endif // DRACO_TOOLS_DRACO_TRANSCODER_LIB_H_ diff --git a/contrib/draco/src/draco/tools/draco_transcoder_lib_test.cc b/contrib/draco/src/draco/tools/draco_transcoder_lib_test.cc new file mode 100644 index 000000000..a87a158e0 --- /dev/null +++ b/contrib/draco/src/draco/tools/draco_transcoder_lib_test.cc @@ -0,0 +1,172 @@ +// Copyright 2021 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifdef DRACO_TRANSCODER_SUPPORTED + +#include "draco/tools/draco_transcoder_lib.h" + +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/io/file_utils.h" + +// Tests encoding a .gltf file with default Draco compression. +TEST(DracoTranscoderTest, DefaultDracoCompression) { + const std::string input_name = "sphere.gltf"; + const std::string input_filename = draco::GetTestFileFullPath(input_name); + const std::string output_filename = + draco::GetTestTempFileFullPath("test.gltf"); + + const draco::DracoTranscodingOptions options; + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr dt, + draco::DracoTranscoder::Create(options)); + + draco::DracoTranscoder::FileOptions file_options; + file_options.input_filename = input_filename; + file_options.output_filename = output_filename; + DRACO_ASSERT_OK(dt->Transcode(file_options)); + + const std::string output_bin_filename = + draco::GetTestTempFileFullPath("test.bin"); + const size_t output_bin_size = draco::GetFileSize(output_bin_filename); + ASSERT_GT(output_bin_size, 0); +} + +// Tests setting the output glTF .bin name. +TEST(DracoTranscoderTest, TestBinName) { + const std::string input_name = "sphere.gltf"; + const std::string input_filename = draco::GetTestFileFullPath(input_name); + const std::string output_filename = + draco::GetTestTempFileFullPath("test.gltf"); + const std::string output_bin_filename = + draco::GetTestTempFileFullPath("different_name.bin"); + + const draco::DracoTranscodingOptions options; + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr dt, + draco::DracoTranscoder::Create(options)); + + draco::DracoTranscoder::FileOptions file_options; + file_options.input_filename = input_filename; + file_options.output_filename = output_filename; + file_options.output_bin_filename = output_bin_filename; + DRACO_ASSERT_OK(dt->Transcode(file_options)); + + const size_t output_bin_size = draco::GetFileSize(output_bin_filename); + ASSERT_GT(output_bin_size, 0); +} + +// Tests setting the output glTF resource directory. +TEST(DracoTranscoderTest, TestResourceDirName) { + const std::string input_name = "sphere.gltf"; + const std::string input_filename = draco::GetTestFileFullPath(input_name); + const std::string output_filename = + draco::GetTestTempFileFullPath("test.gltf"); + const std::string output_bin_filename = + draco::GetTestTempFileFullPath("another_name.bin"); + const std::string output_resource_directory = + draco::GetTestTempFileFullPath("res/other_files"); + + const draco::DracoTranscodingOptions options; + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr dt, + draco::DracoTranscoder::Create(options)); + + draco::DracoTranscoder::FileOptions file_options; + file_options.input_filename = input_filename; + file_options.output_filename = output_filename; + file_options.output_bin_filename = output_bin_filename; + file_options.output_resource_directory = output_resource_directory; + DRACO_ASSERT_OK(dt->Transcode(file_options)); + + const size_t output_bin_size = draco::GetFileSize(output_bin_filename); + ASSERT_GT(output_bin_size, 0); + + const std::string res_dir_png_filename = draco::GetTestTempFileFullPath( + "res/other_files/sphere_Texture0_Normal.png"); + const size_t output_png_size = draco::GetFileSize(res_dir_png_filename); + ASSERT_GT(output_png_size, 0); +} + +// Tests creating one transcoder to encode multiple files. +TEST(DracoTranscoderTest, EncodeMultipleFiles) { + const draco::DracoTranscodingOptions options; + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr dt, + draco::DracoTranscoder::Create(options)); + + draco::DracoTranscoder::FileOptions file_options; + file_options.input_filename = draco::GetTestFileFullPath("sphere.gltf"); + file_options.output_filename = draco::GetTestTempFileFullPath("first.gltf"); + DRACO_ASSERT_OK(dt->Transcode(file_options)); + const size_t first_bin_size = + draco::GetFileSize(draco::GetTestTempFileFullPath("first.bin")); + ASSERT_GT(first_bin_size, 0); + + file_options.input_filename = + draco::GetTestFileFullPath("CesiumMan/glTF/CesiumMan.gltf"); + file_options.output_filename = draco::GetTestTempFileFullPath("second.gltf"); + DRACO_ASSERT_OK(dt->Transcode(file_options)); + const size_t second_bin_size = + draco::GetFileSize(draco::GetTestTempFileFullPath("second.bin")); + ASSERT_GT(second_bin_size, 0); +} + +// Tests using glTF binary as input. +TEST(DracoTranscoderTest, SimpleGlbInput) { + const std::string input_name = "Box/glTF_Binary/Box.glb"; + const std::string input_filename = draco::GetTestFileFullPath(input_name); + const std::string output_filename = + draco::GetTestTempFileFullPath("test.gltf"); + + const draco::DracoTranscodingOptions options; + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr dt, + draco::DracoTranscoder::Create(options)); + + draco::DracoTranscoder::FileOptions file_options; + file_options.input_filename = input_filename; + file_options.output_filename = output_filename; + DRACO_ASSERT_OK(dt->Transcode(file_options)); + + const std::string output_bin_filename = + draco::GetTestTempFileFullPath("test.bin"); + const size_t output_bin_size = draco::GetFileSize(output_bin_filename); + ASSERT_GT(output_bin_size, 0); +} + +// Simple test to check glb input and setting smaller position quantizations +// outputs a smaller file overall. +TEST(DracoTranscoderTest, TestPositionQuantization) { + const std::string input_name = + "KhronosSampleModels/Duck/glTF_Binary/Duck.glb"; + const std::string input_filename = draco::GetTestFileFullPath(input_name); + + draco::DracoTranscodingOptions options; + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr dt, + draco::DracoTranscoder::Create(options)); + + draco::DracoTranscoder::FileOptions file_options; + file_options.input_filename = input_filename; + file_options.output_filename = draco::GetTestTempFileFullPath("first.glb"); + DRACO_ASSERT_OK(dt->Transcode(file_options)); + const size_t first_glb_size = + draco::GetFileSize(draco::GetTestTempFileFullPath("first.glb")); + + options.geometry.quantization_position.SetQuantizationBits(10); + DRACO_ASSIGN_OR_ASSERT(std::unique_ptr dt2, + draco::DracoTranscoder::Create(options)); + file_options.output_filename = draco::GetTestTempFileFullPath("second.glb"); + DRACO_ASSERT_OK(dt2->Transcode(file_options)); + const size_t second_glb_size = + draco::GetFileSize(draco::GetTestTempFileFullPath("second.glb")); + ASSERT_GT(first_glb_size, second_glb_size); +} + +#endif // DRACO_TRANSCODER_SUPPORTED diff --git a/contrib/draco/src/draco/tools/fuzz/build.sh b/contrib/draco/src/draco/tools/fuzz/build.sh index bbeb10591..3e48409fc 100644 --- a/contrib/draco/src/draco/tools/fuzz/build.sh +++ b/contrib/draco/src/draco/tools/fuzz/build.sh @@ -19,7 +19,7 @@ cmake $SRC/draco # The draco_decoder and draco_encoder binaries don't build nicely with OSS-Fuzz # options, so just build the Draco shared libraries. -make -j$(nproc) draco +make -j$(nproc) # build fuzzers for fuzzer in $(find $SRC/draco/src/draco/tools/fuzz -name '*.cc'); do diff --git a/contrib/draco/src/draco/tools/install_test/CMakeLists.txt b/contrib/draco/src/draco/tools/install_test/CMakeLists.txt new file mode 100644 index 000000000..800dc9c9b --- /dev/null +++ b/contrib/draco/src/draco/tools/install_test/CMakeLists.txt @@ -0,0 +1,25 @@ +# Copyright 2022 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +cmake_minimum_required(VERSION 3.12) +project(install_test C CXX) + +include(GNUInstallDirs) + +find_package(draco REQUIRED CONFIG) + +add_executable(install_check main.cc) +target_link_libraries(install_check PRIVATE draco::draco) + +install(TARGETS install_check DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/contrib/draco/src/draco/tools/install_test/main.cc b/contrib/draco/src/draco/tools/install_test/main.cc new file mode 100644 index 000000000..e76793b64 --- /dev/null +++ b/contrib/draco/src/draco/tools/install_test/main.cc @@ -0,0 +1,44 @@ +// Copyright 2022 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// This program is used to test the installed version of Draco. It does just +// enough to confirm that an application using Draco can compile and link +// against an installed version of Draco without errors. It does not perform +// any sort of library tests. + +#include +#include + +#include "draco/core/decoder_buffer.h" + +#if defined DRACO_TRANSCODER_SUPPORTED +#include "draco/scene/scene.h" +#include "draco/scene/scene_utils.h" +#endif + +int main(int /*argc*/, char** /*argv*/) { + std::vector empty_buffer; + draco::DecoderBuffer buffer; + buffer.Init(empty_buffer.data(), empty_buffer.size()); + +#if defined DRACO_TRANSCODER_SUPPORTED + draco::Scene empty_scene; + const int num_meshes = empty_scene.NumMeshes(); + (void)num_meshes; +#endif + + printf("Partial sanity test passed.\n"); + return 0; +} diff --git a/contrib/draco/src/draco/tools/install_test/test.py b/contrib/draco/src/draco/tools/install_test/test.py new file mode 100644 index 000000000..8612e70b5 --- /dev/null +++ b/contrib/draco/src/draco/tools/install_test/test.py @@ -0,0 +1,456 @@ +#!/usr/bin/python3 +# +# Copyright 2022 The Draco Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests installations of the Draco library. + +Builds the library in shared and static configurations on the current host +system, and then confirms that a simple test application can link in both +configurations. +""" + +import argparse +import multiprocessing +import os +import pathlib +import shlex +import shutil +import subprocess +import sys + +# CMake executable. +CMAKE = shutil.which('cmake') + +# List of generators available in the current CMake executable. +CMAKE_AVAILABLE_GENERATORS = [] + +# List of variable defs to be passed through to CMake via its -D argument. +CMAKE_DEFINES = [] + +# CMake builds use the specified generator. +CMAKE_GENERATOR = None + +# Enable the transcoder before running tests (sets DRACO_TRANSCODER_SUPPORTED +# and builds transcoder support dependencies). +ENABLE_TRANSCODER = False + +# The Draco tree that this script uses. +DRACO_SOURCES_PATH = os.path.abspath(os.path.join('..', '..', '..', '..')) + +# Path to this script and the rest of the test project files. +TEST_SOURCES_PATH = os.path.dirname(os.path.abspath(__file__)) + +# The Draco build directories. +DRACO_SHARED_BUILD_PATH = os.path.join(TEST_SOURCES_PATH, '_draco_build_shared') +DRACO_STATIC_BUILD_PATH = os.path.join(TEST_SOURCES_PATH, '_draco_build_static') + +# The Draco install roots. +DRACO_SHARED_INSTALL_PATH = os.path.join(TEST_SOURCES_PATH, + '_draco_install_shared') +DRACO_STATIC_INSTALL_PATH = os.path.join(TEST_SOURCES_PATH, + '_draco_install_static') + +DRACO_SHARED_INSTALL_BIN_PATH = os.path.join(DRACO_SHARED_INSTALL_PATH, 'bin') + +DRACO_SHARED_INSTALL_LIB_PATH = os.path.join(DRACO_SHARED_INSTALL_PATH, 'lib') + +# Argument for -j when using make, or -m when using Visual Studio. Number of +# build jobs. +NUM_PROCESSES = multiprocessing.cpu_count() - 1 + +# The test project build directories. +TEST_SHARED_BUILD_PATH = os.path.join(TEST_SOURCES_PATH, '_test_build_shared') +TEST_STATIC_BUILD_PATH = os.path.join(TEST_SOURCES_PATH, '_test_build_static') + +# The test project install directories. +TEST_SHARED_INSTALL_PATH = os.path.join(TEST_SOURCES_PATH, + '_test_install_shared') +TEST_STATIC_INSTALL_PATH = os.path.join(TEST_SOURCES_PATH, + '_test_install_static') + +# Show configuration and build output. +VERBOSE = False + + +def cmake_get_available_generators(): + """Returns list of generators available in current CMake executable.""" + result = run_process_and_capture_output(f'{CMAKE} --help') + + if result[0] != 0: + raise Exception(f'cmake --help failed, exit code: {result[0]}\n{result[1]}') + + help_text = result[1].splitlines() + generators_start_index = help_text.index('Generators') + 3 + generators_text = help_text[generators_start_index::] + + generators = [] + for gen in generators_text: + gen = gen.split('=')[0].strip().replace('* ', '') + + if gen and gen[0] != '=': + generators.append(gen) + + return generators + + +def cmake_get_generator(): + """Returns the CMake generator from CMakeCache.txt in the current dir.""" + cmake_cache_file_path = os.path.join(os.getcwd(), 'CMakeCache.txt') + cmake_cache_text = '' + with open(cmake_cache_file_path, 'r') as cmake_cache_file: + cmake_cache_text = cmake_cache_file.read() + + if not cmake_cache_text: + raise FileNotFoundError(f'{cmake_cache_file_path} missing or empty.') + + generator = '' + for line in cmake_cache_text.splitlines(): + if line.startswith('CMAKE_GENERATOR:INTERNAL='): + generator = line.split('=')[1] + + return generator + + +def run_process_and_capture_output(cmd, env=None): + """Runs |cmd| as a child process. + + Returns process exit code and output. Streams process output to stdout when + VERBOSE is true. + + Args: + cmd: String containing the command to execute. + env: Optional dict of environment variables. + + Returns: + Tuple of exit code and output. + """ + if not cmd: + raise ValueError('run_process_and_capture_output requires cmd argument.') + + if os.name == 'posix': + # On posix systems subprocess.Popen will treat |cmd| as the program name + # when it is passed as a string. Unconditionally split the command so + # callers don't need to care about this detail. + cmd = shlex.split(cmd) + + proc = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env) + + if VERBOSE: + print('COMMAND output:') + + stdout = '' + for line in iter(proc.stdout.readline, b''): + decoded_line = line.decode('utf-8') + if VERBOSE: + sys.stdout.write(decoded_line) + sys.stdout.flush() + stdout += decoded_line + + # Wait for the process to exit so that the exit code is available. + proc.wait() + return [proc.returncode, stdout] + + +def create_output_directories(): + """Creates the build output directores for the test.""" + pathlib.Path(DRACO_SHARED_BUILD_PATH).mkdir(parents=True, exist_ok=True) + pathlib.Path(DRACO_STATIC_BUILD_PATH).mkdir(parents=True, exist_ok=True) + pathlib.Path(TEST_SHARED_BUILD_PATH).mkdir(parents=True, exist_ok=True) + pathlib.Path(TEST_STATIC_BUILD_PATH).mkdir(parents=True, exist_ok=True) + + +def cleanup(): + """Removes the build output directories from the test.""" + shutil.rmtree(DRACO_SHARED_BUILD_PATH) + shutil.rmtree(DRACO_STATIC_BUILD_PATH) + shutil.rmtree(DRACO_SHARED_INSTALL_PATH) + shutil.rmtree(DRACO_STATIC_INSTALL_PATH) + shutil.rmtree(TEST_SHARED_BUILD_PATH) + shutil.rmtree(TEST_STATIC_BUILD_PATH) + shutil.rmtree(TEST_SHARED_INSTALL_PATH) + shutil.rmtree(TEST_STATIC_INSTALL_PATH) + + +def cmake_configure(source_path, cmake_args=None): + """Configures a CMake build.""" + command = f'{CMAKE} {source_path}' + + if CMAKE_GENERATOR: + if ' ' in CMAKE_GENERATOR: + command += f' -G "{CMAKE_GENERATOR}"' + else: + command += f' -G {CMAKE_GENERATOR}' + + if cmake_args: + for arg in cmake_args: + command += f' {arg}' + + if CMAKE_DEFINES: + for arg in CMAKE_DEFINES: + command += f' -D{arg}' + + if VERBOSE: + print(f'CONFIGURE command:\n{command}') + + result = run_process_and_capture_output(command) + + if result[0] != 0: + raise Exception(f'CONFIGURE failed!\nexit_code: {result[0]}\n{result[1]}') + + +def cmake_build(cmake_args=None, build_args=None): + """Runs a CMake build.""" + command = f'{CMAKE} --build .' + + if cmake_args: + for arg in cmake_args: + command += f' {arg}' + + if not build_args: + build_args = [] + + generator = cmake_get_generator() + if generator.endswith('Makefiles'): + build_args.append(f'-j {NUM_PROCESSES}') + elif generator.startswith('Visual'): + build_args.append(f'-m:{NUM_PROCESSES}') + + if build_args: + command += ' --' + for arg in build_args: + command += f' {arg}' + + if VERBOSE: + print(f'BUILD command:\n{command}') + + result = run_process_and_capture_output(f'{command}') + + if result[0] != 0: + raise Exception(f'BUILD failed!\nexit_code: {result[0]}\n{result[1]}') + + +def run_install_check(install_path): + """Runs the install_check program.""" + cmd = os.path.join(install_path, 'bin', 'install_check') + if VERBOSE: + print(f'RUN command: {cmd}') + + result = run_process_and_capture_output( + cmd, + # On Windows, add location of draco.dll into PATH env var + {'PATH': DRACO_SHARED_INSTALL_BIN_PATH + os.pathsep + os.environ['PATH']}, + ) + if result[0] != 0: + raise Exception( + f'install_check run failed!\nexit_code: {result[0]}\n{result[1]}') + + +def build_and_install_transcoder_dependencies(): + """Builds and installs Draco dependencies for transcoder enabled builds.""" + orig_dir = os.getcwd() + + # The Eigen CMake build in the release Draco has pinned is, to put it mildly, + # user unfriendly. Instead of wasting time trying to integrate it here, just + # shutil.copytree() everything in $eigen_submodule_path to + # $CMAKE_INSTALL_PREFIX/include/Eigen. + # Eigen claims to be header-only, so this should be adequate for Draco's + # needs here. + eigen_submodule_path = os.path.join( + DRACO_SOURCES_PATH, 'third_party', 'eigen', 'Eigen') + + # "Install" Eigen for the shared install root. + eigen_install_path = os.path.join( + DRACO_SHARED_INSTALL_PATH, 'include', 'Eigen') + shutil.copytree(src=eigen_submodule_path, dst=eigen_install_path) + + # "Install" Eigen for the static install root. + eigen_install_path = os.path.join( + DRACO_STATIC_INSTALL_PATH, 'include', 'Eigen') + shutil.copytree(src=eigen_submodule_path, dst=eigen_install_path) + + # Build and install gulrak/filesystem for shared and static configurations. + # Note that this is basically running gulrak/filesystem's CMake build as an + # install script. + fs_submodule_path = os.path.join( + DRACO_SOURCES_PATH, 'third_party', 'filesystem') + + # Install gulrak/filesystem in the shared draco install root. + fs_shared_build = os.path.join(DRACO_SHARED_BUILD_PATH, '_fs') + pathlib.Path(fs_shared_build).mkdir(parents=True, exist_ok=True) + os.chdir(fs_shared_build) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={DRACO_SHARED_INSTALL_PATH}') + cmake_args.append('-DBUILD_SHARED_LIBS=ON') + cmake_args.append('-DGHC_FILESYSTEM_BUILD_TESTING=OFF') + cmake_args.append('-DGHC_FILESYSTEM_BUILD_EXAMPLES=OFF') + cmake_configure(source_path=fs_submodule_path, cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + + # Install gulrak/filesystem in the shared draco install root. + fs_static_build = os.path.join(DRACO_STATIC_BUILD_PATH, '_fs') + pathlib.Path(fs_static_build).mkdir(parents=True, exist_ok=True) + os.chdir(fs_static_build) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={DRACO_SHARED_INSTALL_PATH}') + cmake_args.append('-DBUILD_SHARED_LIBS=OFF') + cmake_args.append('-DGHC_FILESYSTEM_BUILD_TESTING=OFF') + cmake_args.append('-DGHC_FILESYSTEM_BUILD_EXAMPLES=OFF') + cmake_configure(source_path=fs_submodule_path, cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + + # Build and install TinyGLTF for shared and static configurations. + # Note, as above, that this is basically running TinyGLTF's CMake build as an + # install script. + tinygltf_submodule_path = os.path.join( + DRACO_SOURCES_PATH, 'third_party', 'tinygltf') + + # Install TinyGLTF in the shared draco install root. + tinygltf_shared_build = os.path.join(DRACO_SHARED_BUILD_PATH, '_TinyGLTF') + pathlib.Path(tinygltf_shared_build).mkdir(parents=True, exist_ok=True) + os.chdir(tinygltf_shared_build) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={DRACO_SHARED_INSTALL_PATH}') + cmake_args.append('-DTINYGLTF_BUILD_EXAMPLES=OFF') + cmake_configure(source_path=tinygltf_submodule_path, cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + + # Install TinyGLTF in the static draco install root. + tinygltf_static_build = os.path.join(DRACO_STATIC_BUILD_PATH, '_TinyGLTF') + pathlib.Path(tinygltf_static_build).mkdir(parents=True, exist_ok=True) + os.chdir(tinygltf_static_build) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={DRACO_STATIC_INSTALL_PATH}') + cmake_args.append('-DTINYGLTF_BUILD_EXAMPLES=OFF') + cmake_configure(source_path=tinygltf_submodule_path, cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + + os.chdir(orig_dir) + + +def build_and_install_draco(): + """Builds Draco in shared and static configurations.""" + orig_dir = os.getcwd() + + if ENABLE_TRANSCODER: + build_and_install_transcoder_dependencies() + + # Build and install Draco in shared library config for the current host + # machine. + os.chdir(DRACO_SHARED_BUILD_PATH) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={DRACO_SHARED_INSTALL_PATH}') + cmake_args.append('-DBUILD_SHARED_LIBS=ON') + if ENABLE_TRANSCODER: + cmake_args.append('-DDRACO_TRANSCODER_SUPPORTED=ON') + cmake_configure(source_path=DRACO_SOURCES_PATH, cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + + # Build and install Draco in the static config for the current host machine. + os.chdir(DRACO_STATIC_BUILD_PATH) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={DRACO_STATIC_INSTALL_PATH}') + cmake_args.append('-DBUILD_SHARED_LIBS=OFF') + if ENABLE_TRANSCODER: + cmake_args.append('-DDRACO_TRANSCODER_SUPPORTED=ON') + cmake_configure(source_path=DRACO_SOURCES_PATH, cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + + os.chdir(orig_dir) + + +def build_test_project(): + """Builds the test application in shared and static configurations.""" + orig_dir = os.getcwd() + + # Configure the test project against draco shared and build it. + os.chdir(TEST_SHARED_BUILD_PATH) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={TEST_SHARED_INSTALL_PATH}') + cmake_args.append(f'-DCMAKE_PREFIX_PATH={DRACO_SHARED_INSTALL_PATH}') + cmake_args.append(f'-DCMAKE_INSTALL_RPATH={DRACO_SHARED_INSTALL_LIB_PATH}') + cmake_configure(source_path=f'{TEST_SOURCES_PATH}', cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + run_install_check(TEST_SHARED_INSTALL_PATH) + + # Configure the test project against draco static and build it. + os.chdir(TEST_STATIC_BUILD_PATH) + cmake_args = [] + cmake_args.append(f'-DCMAKE_INSTALL_PREFIX={TEST_STATIC_INSTALL_PATH}') + cmake_args.append(f'-DCMAKE_PREFIX_PATH={DRACO_STATIC_INSTALL_PATH}') + cmake_configure(source_path=f'{TEST_SOURCES_PATH}', cmake_args=cmake_args) + cmake_build(cmake_args=['--target install']) + run_install_check(TEST_STATIC_INSTALL_PATH) + + os.chdir(orig_dir) + + +def test_draco_install(): + create_output_directories() + build_and_install_draco() + build_test_project() + cleanup() + + +if __name__ == '__main__': + CMAKE_AVAILABLE_GENERATORS = cmake_get_available_generators() + + parser = argparse.ArgumentParser() + parser.add_argument( + '-G', '--generator', help='CMake builds use the specified generator.') + parser.add_argument( + '-D', '--cmake_define', + action='append', + help='Passes argument through to CMake as a CMake variable via cmake -D.') + parser.add_argument( + '-t', '--with_transcoder', + action='store_true', + help='Run tests with Draco transcoder support enabled.') + parser.add_argument( + '-v', + '--verbose', + action='store_true', + help='Show configuration and build output.') + args = parser.parse_args() + + if args.cmake_define: + CMAKE_DEFINES = args.cmake_define + if args.generator: + CMAKE_GENERATOR = args.generator + if args.verbose: + VERBOSE = True + if args.with_transcoder: + ENABLE_TRANSCODER = True + + if VERBOSE: + print(f'CMAKE={CMAKE}') + print(f'CMAKE_DEFINES={CMAKE_DEFINES}') + print(f'CMAKE_GENERATOR={CMAKE_GENERATOR}') + print(f'CMAKE_AVAILABLE_GENERATORS={CMAKE_AVAILABLE_GENERATORS}') + print(f'ENABLE_TRANSCODER={ENABLE_TRANSCODER}') + print(f'DRACO_SOURCES_PATH={DRACO_SOURCES_PATH}') + print(f'DRACO_SHARED_BUILD_PATH={DRACO_SHARED_BUILD_PATH}') + print(f'DRACO_STATIC_BUILD_PATH={DRACO_STATIC_BUILD_PATH}') + print(f'DRACO_SHARED_INSTALL_PATH={DRACO_SHARED_INSTALL_PATH}') + print(f'DRACO_STATIC_INSTALL_PATH={DRACO_STATIC_INSTALL_PATH}') + print(f'NUM_PROCESSES={NUM_PROCESSES}') + print(f'TEST_SHARED_BUILD_PATH={TEST_SHARED_BUILD_PATH}') + print(f'TEST_STATIC_BUILD_PATH={TEST_STATIC_BUILD_PATH}') + print(f'TEST_SOURCES_PATH={TEST_SOURCES_PATH}') + print(f'VERBOSE={VERBOSE}') + + if CMAKE_GENERATOR and CMAKE_GENERATOR not in CMAKE_AVAILABLE_GENERATORS: + raise ValueError(f'CMake generator unavailable: {CMAKE_GENERATOR}.') + + test_draco_install() From f7f54036f20547b446600476abf1cae902d8148d Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:10:03 +0800 Subject: [PATCH 102/232] bugfix the three vertices are collinear when converting a polygon to a triangle. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/PostProcessing/TriangulateProcess.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/code/PostProcessing/TriangulateProcess.cpp b/code/PostProcessing/TriangulateProcess.cpp index 52e760361..8ba6456b7 100644 --- a/code/PostProcessing/TriangulateProcess.cpp +++ b/code/PostProcessing/TriangulateProcess.cpp @@ -468,6 +468,21 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) continue; } + // Skip when three point is in a line + aiVector2D left = *pnt0 - *pnt1; + aiVector2D right = *pnt2 - *pnt1; + + left.Normalize(); + right.Normalize(); + auto mul = left * right; + + // if the angle is 0 or 180 + if (std::abs(mul - 1.f) < ai_epsilon || std::abs(mul + 1.f) < ai_epsilon) { + // skip this ear + ASSIMP_LOG_WARN("Skip a ear, due to its angle is near 0 or 180."); + continue; + } + // and no other point may be contained in this triangle for ( tmp = 0; tmp < max; ++tmp) { From 09dd0d0c2e137ad6bbb8a80782bcee1bb99fa945 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 1 Mar 2023 15:08:02 +0800 Subject: [PATCH 103/232] Fix build error when building SimpleTexturedDirectx11 with VS2022. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- samples/SimpleTexturedDirectx11/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/samples/SimpleTexturedDirectx11/CMakeLists.txt b/samples/SimpleTexturedDirectx11/CMakeLists.txt index 007ada3af..b05c3b6ae 100644 --- a/samples/SimpleTexturedDirectx11/CMakeLists.txt +++ b/samples/SimpleTexturedDirectx11/CMakeLists.txt @@ -8,6 +8,9 @@ if ( MSVC ) ADD_DEFINITIONS( -D_SCL_SECURE_NO_WARNINGS ) ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS ) REMOVE_DEFINITIONS( -DUNICODE -D_UNICODE ) + if ( MSVC_VERSION GREATER_EQUAL 1930 ) + ADD_DEFINITIONS( -D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING=1 ) + endif () endif () ADD_COMPILE_DEFINITIONS(SHADER_PATH="${CMAKE_CURRENT_SOURCE_DIR}/SimpleTexturedDirectx11/") From 1092f0d94e4cf60a28ce96a51334c9f243b997e0 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 Mar 2023 21:40:45 +0100 Subject: [PATCH 104/232] Fix:Use correct encoding --- include/assimp/Base64.hpp | 14 ++- samples/SharedCode/UTFConverter.cpp | 52 --------- samples/SharedCode/UTFConverter.h | 103 ------------------ .../SimpleTexturedDirectx11/CMakeLists.txt | 2 - .../SimpleTexturedDirectx11/main.cpp | 19 +++- samples/SimpleTexturedOpenGL/CMakeLists.txt | 2 - tools/assimp_view/AnimEvaluator.cpp | 6 - tools/assimp_view/AnimEvaluator.h | 2 +- tools/assimp_view/AssetHelper.h | 17 ++- tools/assimp_view/Material.cpp | 22 ++-- tools/assimp_view/assimp_view.cpp | 9 +- tools/assimp_view/assimp_view.h | 6 + 12 files changed, 49 insertions(+), 205 deletions(-) delete mode 100644 samples/SharedCode/UTFConverter.cpp delete mode 100644 samples/SharedCode/UTFConverter.h diff --git a/include/assimp/Base64.hpp b/include/assimp/Base64.hpp index 403723857..10288713c 100644 --- a/include/assimp/Base64.hpp +++ b/include/assimp/Base64.hpp @@ -43,6 +43,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_BASE64_HPP_INC #define AI_BASE64_HPP_INC +#include + #include #include #include @@ -54,35 +56,35 @@ namespace Base64 { /// @param in The UTF-64 buffer. /// @param inLength The size of the buffer /// @param out The encoded ASCII string. -void Encode(const uint8_t *in, size_t inLength, std::string &out); +ASSIMP_API void Encode(const uint8_t *in, size_t inLength, std::string &out); /// @brief Will encode the given character buffer from UTF64 to ASCII. /// @param in A vector, which contains the buffer for encoding. /// @param out The encoded ASCII string. -void Encode(const std::vector& in, std::string &out); +ASSIMP_API void Encode(const std::vector &in, std::string &out); /// @brief Will encode the given character buffer from UTF64 to ASCII. /// @param in A vector, which contains the buffer for encoding. /// @return The encoded ASCII string. -std::string Encode(const std::vector& in); +ASSIMP_API std::string Encode(const std::vector &in); /// @brief Will decode the given character buffer from ASCII to UTF64. /// @param in The ASCII buffer to decode. /// @param inLength The size of the buffer. /// @param out The decoded buffer. /// @return The new buffer size. -size_t Decode(const char *in, size_t inLength, uint8_t *&out); +ASSIMP_API size_t Decode(const char *in, size_t inLength, uint8_t *&out); /// @brief Will decode the given character buffer from ASCII to UTF64. /// @param in The ASCII buffer to decode as a std::string. /// @param out The decoded buffer. /// @return The new buffer size. -size_t Decode(const std::string& in, std::vector& out); +ASSIMP_API size_t Decode(const std::string &in, std::vector &out); /// @brief Will decode the given character buffer from ASCII to UTF64. /// @param in The ASCII string. /// @return The decoded buffer in a vector. -std::vector Decode(const std::string& in); +ASSIMP_API std::vector Decode(const std::string &in); } // namespace Base64 } // namespace Assimp diff --git a/samples/SharedCode/UTFConverter.cpp b/samples/SharedCode/UTFConverter.cpp deleted file mode 100644 index e6c07e946..000000000 --- a/samples/SharedCode/UTFConverter.cpp +++ /dev/null @@ -1,52 +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. ---------------------------------------------------------------------------- -*/ - -#include "UTFConverter.h" - -namespace AssimpSamples { -namespace SharedCode { - -//typename UTFConverter::UTFConverterImpl UTFConverter::impl_; - -} -} diff --git a/samples/SharedCode/UTFConverter.h b/samples/SharedCode/UTFConverter.h deleted file mode 100644 index 34b2293de..000000000 --- a/samples/SharedCode/UTFConverter.h +++ /dev/null @@ -1,103 +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 ASSIMP_SAMPLES_SHARED_CODE_UTFCONVERTER_H -#define ASSIMP_SAMPLES_SHARED_CODE_UTFCONVERTER_H - -#include -#include - -#ifdef ASSIMP_USE_HUNTER -#include -#else -#include "../contrib/utf8cpp/source/utf8.h" -#endif - -namespace AssimpSamples { -namespace SharedCode { - -// Used to convert between multibyte and unicode strings. -class UTFConverter { -public: - //utf8::utf16to8(start, end, back_inserter(str)); - - UTFConverter(const char* s) : s_(s), ws_() { - std::vector str; - utf8::utf8to16(s, s + std::strlen(s) + 1, back_inserter(str)); - } - - UTFConverter(const wchar_t* s) : s_(),ws_(s) { - std::vector str; - utf8::utf16to8(s, s + ws_.size() + 1, back_inserter(str)); - } - - UTFConverter(const std::string& s) : s_(s), ws_() { - std::vector str; - utf8::utf8to16(s.c_str(), s.c_str() + s.size() + 1, back_inserter(str)); - } - - UTFConverter(const std::wstring& s) : s_(), ws_(s) { - std::vector str; - utf8::utf16to8(s.c_str(), s.c_str() + ws_.size() + 1, back_inserter(str)); - } - - inline const char* c_str() const { - return s_.c_str(); - } - - inline const std::string& str() const { - return s_; - } - - inline const wchar_t* c_wstr() const { - return ws_.c_str(); - } -private: - std::string s_; - std::wstring ws_; -}; - -} -} - -#endif // ASSIMP_SAMPLES_SHARED_CODE_UTFCONVERTER_H diff --git a/samples/SimpleTexturedDirectx11/CMakeLists.txt b/samples/SimpleTexturedDirectx11/CMakeLists.txt index 007ada3af..f1e03888c 100644 --- a/samples/SimpleTexturedDirectx11/CMakeLists.txt +++ b/samples/SimpleTexturedDirectx11/CMakeLists.txt @@ -33,8 +33,6 @@ ADD_EXECUTABLE( assimp_simpletextureddirectx11 WIN32 #SimpleTexturedDirectx11/VertexShader.hlsl SimpleTexturedDirectx11/main.cpp SimpleTexturedDirectx11/SafeRelease.hpp - ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.cpp - ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.h ) TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_simpletextureddirectx11) diff --git a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp index f7b35024b..7f0d0c84e 100644 --- a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp +++ b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp @@ -21,8 +21,12 @@ #include #include #include +#ifdef ASSIMP_USE_HUNTER +#include +#else +#include "../contrib/utf8cpp/source/utf8.h" +#endif #include "ModelLoader.h" -#include "UTFConverter.h" #include "SafeRelease.hpp" #ifdef _MSC_VER @@ -33,7 +37,6 @@ #endif // _MSC_VER using namespace DirectX; -using namespace AssimpSamples::SharedCode; #define VERTEX_SHADER_FILE L"VertexShader.hlsl" #define PIXEL_SHADER_FILE L"PixelShader.hlsl" @@ -154,8 +157,14 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, } // Retrieve the model file path. - g_ModelPath = UTFConverter(argv[1]).str(); + std::wstring filename(argv[1]); + + char *targetStart = new char[filename.size()+1]; + memset(targetStart, '\0', filename.size() + 1); + utf8::utf16to8(filename.c_str(), filename.c_str() + filename.size(), targetStart); + g_ModelPath = targetStart; + delete[] targetStart; free_command_line_allocated_memory(); WNDCLASSEX wc; @@ -511,9 +520,9 @@ void InitPipeline() { ID3DBlob *VS, *PS; if(FAILED(CompileShaderFromFile(SHADER_PATH VERTEX_SHADER_FILE, 0, "main", "vs_4_0", &VS))) - Throwanerror(UTFConverter(L"Failed to compile shader from file " VERTEX_SHADER_FILE).c_str()); + Throwanerror("Failed to compile shader from file"); if(FAILED(CompileShaderFromFile(SHADER_PATH PIXEL_SHADER_FILE, 0, "main", "ps_4_0", &PS))) - Throwanerror(UTFConverter(L"Failed to compile shader from file " PIXEL_SHADER_FILE).c_str()); + Throwanerror("Failed to compile shader from file "); dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), nullptr, &pVS); dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), nullptr, &pPS); diff --git a/samples/SimpleTexturedOpenGL/CMakeLists.txt b/samples/SimpleTexturedOpenGL/CMakeLists.txt index 1837af033..70837e87c 100644 --- a/samples/SimpleTexturedOpenGL/CMakeLists.txt +++ b/samples/SimpleTexturedOpenGL/CMakeLists.txt @@ -30,8 +30,6 @@ LINK_DIRECTORIES( ADD_EXECUTABLE( assimp_simpletexturedogl WIN32 SimpleTexturedOpenGL/src/model_loading.cpp - ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.cpp - ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.h ) TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_simpletexturedogl) diff --git a/tools/assimp_view/AnimEvaluator.cpp b/tools/assimp_view/AnimEvaluator.cpp index ad8e7f5b2..4f8d1bda8 100644 --- a/tools/assimp_view/AnimEvaluator.cpp +++ b/tools/assimp_view/AnimEvaluator.cpp @@ -55,12 +55,6 @@ AnimEvaluator::AnimEvaluator(const aiAnimation *pAnim) : mLastPositions.resize(pAnim->mNumChannels, std::make_tuple(0, 0, 0)); } -// ------------------------------------------------------------------------------------------------ -// Destructor. -AnimEvaluator::~AnimEvaluator() { - // empty -} - // ------------------------------------------------------------------------------------------------ // Evaluates the animation tracks for a given time stamp. void AnimEvaluator::Evaluate(double pTime) { diff --git a/tools/assimp_view/AnimEvaluator.h b/tools/assimp_view/AnimEvaluator.h index 76b22ea8a..aa44ab211 100644 --- a/tools/assimp_view/AnimEvaluator.h +++ b/tools/assimp_view/AnimEvaluator.h @@ -66,7 +66,7 @@ public: AnimEvaluator(const aiAnimation *pAnim); /// @brief The class destructor. - ~AnimEvaluator(); + ~AnimEvaluator() = default; /// @brief Evaluates the animation tracks for a given time stamp. /// The calculated pose can be retrieved as an array of transformation diff --git a/tools/assimp_view/AssetHelper.h b/tools/assimp_view/AssetHelper.h index 1ae469f85..8661d875f 100644 --- a/tools/assimp_view/AssetHelper.h +++ b/tools/assimp_view/AssetHelper.h @@ -77,6 +77,13 @@ public: pcScene = NULL; } + // set the normal set to be used + void SetNormalSet(unsigned int iSet); + + // flip all normal vectors + void FlipNormals(); + void FlipNormalsInt(); + //--------------------------------------------------------------- // default vertex data structure // (even if tangents, bitangents or normals aren't @@ -221,16 +228,8 @@ public: // Specifies the normal set to be used unsigned int iNormalSet; - - // ------------------------------------------------------------------ - // set the normal set to be used - void SetNormalSet(unsigned int iSet); - - // ------------------------------------------------------------------ - // flip all normal vectors - void FlipNormals(); - void FlipNormalsInt(); }; + } // namespace AssimpView #endif // !! IG diff --git a/tools/assimp_view/Material.cpp b/tools/assimp_view/Material.cpp index e3c023bd9..c28231332 100644 --- a/tools/assimp_view/Material.cpp +++ b/tools/assimp_view/Material.cpp @@ -175,33 +175,29 @@ VOID WINAPI FillFunc(D3DXVECTOR4* pOut, pOut->x = pOut->y = 1.0f; pOut->z = 0.0f; } - return; } //------------------------------------------------------------------------------- -int CMaterialManager::UpdateSpecularMaterials() - { - if (g_pcAsset && g_pcAsset->pcScene) - { - for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i) - { - if (aiShadingMode_Phong == g_pcAsset->apcMeshes[i]->eShadingMode) - { +int CMaterialManager::UpdateSpecularMaterials() { + if (g_pcAsset && g_pcAsset->pcScene) { + for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i) { + if (aiShadingMode_Phong == g_pcAsset->apcMeshes[i]->eShadingMode) { this->DeleteMaterial(g_pcAsset->apcMeshes[i]); this->CreateMaterial(g_pcAsset->apcMeshes[i],g_pcAsset->pcScene->mMeshes[i]); - } } } - return 1; } + return 1; +} + //------------------------------------------------------------------------------- -int CMaterialManager::SetDefaultTexture(IDirect3DTexture9** p_ppiOut) -{ +int CMaterialManager::SetDefaultTexture(IDirect3DTexture9** p_ppiOut) { if (sDefaultTexture) { sDefaultTexture->AddRef(); *p_ppiOut = sDefaultTexture; return 1; } + if(FAILED(g_piDevice->CreateTexture( 256, 256, diff --git a/tools/assimp_view/assimp_view.cpp b/tools/assimp_view/assimp_view.cpp index c5c48fd93..e00c6e39d 100644 --- a/tools/assimp_view/assimp_view.cpp +++ b/tools/assimp_view/assimp_view.cpp @@ -145,9 +145,7 @@ float g_fLoadTime = 0.0f; // The loader thread loads the asset while the progress dialog displays the // smart progress bar //------------------------------------------------------------------------------- -DWORD WINAPI LoadThreadProc(LPVOID lpParameter) { - UNREFERENCED_PARAMETER(lpParameter); - +DWORD WINAPI LoadThreadProc(LPVOID) { // get current time double fCur = (double)timeGetTime(); @@ -367,7 +365,7 @@ int CalculateBounds(aiNode *piNode, aiVector3D *p_avOut, const aiMatrix4x4 &piMa // The function calculates the boundaries of the mesh and modifies the // global world transformation matrix according to the aset AABB //------------------------------------------------------------------------------- -int ScaleAsset(void) { +int ScaleAsset() { aiVector3D aiVecs[2] = { aiVector3D(1e10f, 1e10f, 1e10f), aiVector3D(-1e10f, -1e10f, -1e10f) }; @@ -521,8 +519,7 @@ int CreateAssetData() { } } else { // create 16 bit index buffer - if (FAILED(g_piDevice->CreateIndexBuffer(2 * -numIndices, + if (FAILED(g_piDevice->CreateIndexBuffer(2 * numIndices, D3DUSAGE_WRITEONLY | dwUsage, D3DFMT_INDEX16, D3DPOOL_DEFAULT, diff --git a/tools/assimp_view/assimp_view.h b/tools/assimp_view/assimp_view.h index cbcee3cac..e67cc9fd0 100644 --- a/tools/assimp_view/assimp_view.h +++ b/tools/assimp_view/assimp_view.h @@ -98,6 +98,12 @@ namespace AssimpView { //------------------------------------------------------------------------------- // Function prototypes //------------------------------------------------------------------------------- +class AssimpVew { +public: + AssimpVew(); + ~AssimpVew(); +}; + int InitD3D(void); int ShutdownD3D(void); int CreateDevice(bool p_bMultiSample, bool p_bSuperSample, bool bHW = true); From 02a427692481e340a051a3e56504748e5a05fb06 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Thu, 2 Mar 2023 09:11:54 +0800 Subject: [PATCH 105/232] upgrade stb_image to v2.28. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- contrib/stb/stb_image.h | 427 +++++++++++++++++++++++++++++++--------- 1 file changed, 329 insertions(+), 98 deletions(-) diff --git a/contrib/stb/stb_image.h b/contrib/stb/stb_image.h index 8d173c66a..5e807a0a6 100644 --- a/contrib/stb/stb_image.h +++ b/contrib/stb/stb_image.h @@ -1,4 +1,4 @@ -/* stb_image - v2.26 - public domain image loader - http://nothings.org/stb +/* stb_image - v2.28 - public domain image loader - http://nothings.org/stb no warranty implied; use at your own risk Do this: @@ -48,6 +48,8 @@ LICENSE RECENT REVISION HISTORY: + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes 2.26 (2020-07-13) many minor fixes 2.25 (2020-02-02) fix warnings 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically @@ -89,7 +91,7 @@ RECENT REVISION HISTORY: Jeremy Sawicki (handle all ImageNet JPGs) Optimizations & bugfixes Mikhail Morozov (1-bit BMP) Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) - Arseny Kapoulkine + Arseny Kapoulkine Simon Breuss (16-bit PNM) John-Mark Allen Carmelo J Fdez-Aguera @@ -102,19 +104,21 @@ RECENT REVISION HISTORY: Thomas Ruf Ronny Chevalier github:rlyeh Janez Zemva John Bartholomew Michal Cichon github:romigrou Jonathan Blow Ken Hamada Tero Hanninen github:svdijk - Laurent Gomila Cort Stratton github:snagar + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex Cass Everitt Ryamond Barbiero github:grim210 Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus - Josh Tobin Matthew Gregan github:poppolopoppo + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo Julian Raschke Gregory Mullen Christian Floisand github:darealshinji Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 - Brad Weinberger Matvey Cherevko [reserved] + Brad Weinberger Matvey Cherevko github:mosra Luca Sas Alexander Veselov Zack Middleton [reserved] Ryan C. Gordon [reserved] [reserved] DO NOT ADD YOUR NAME HERE + Jacko Dirks + To add your name to the credits, pick a random blank space in the middle and fill it. 80% of merge conflicts on stb PRs are due to people adding their name at the end of the credits. @@ -137,7 +141,7 @@ RECENT REVISION HISTORY: // // ... x = width, y = height, n = # 8-bit components per pixel ... // // ... replace '0' with '1'..'4' to force that many components per pixel // // ... but 'n' will always be the number that it would have been if you said 0 -// stbi_image_free(data) +// stbi_image_free(data); // // Standard parameters: // int *x -- outputs image width in pixels @@ -176,6 +180,32 @@ RECENT REVISION HISTORY: // // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. // +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// // =========================================================================== // // UNICODE: @@ -281,11 +311,10 @@ RECENT REVISION HISTORY: // // iPhone PNG support: // -// By default we convert iphone-formatted PNGs back to RGB, even though -// they are internally encoded differently. You can disable this conversion -// by calling stbi_convert_iphone_png_to_rgb(0), in which case -// you will always just get the native iphone "format" through (which -// is BGR stored in RGB). +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). // // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per // pixel to remove any premultiplied alpha *only* if the image file explicitly @@ -489,6 +518,8 @@ STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); // as above, but only applies to images loaded on the thread that calls the function // this function is only available if your compiler supports thread-local variables; // calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); // ZLIB client - used by PNG, available for other purposes @@ -605,7 +636,7 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch #endif #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(__SYMBIAN32__) typedef unsigned short stbi__uint16; typedef signed short stbi__int16; typedef unsigned int stbi__uint32; @@ -634,7 +665,7 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #ifdef STBI_HAS_LROTL #define stbi_lrot(x,y) _lrotl(x,y) #else - #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) #endif #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) @@ -748,9 +779,12 @@ static int stbi__sse2_available(void) #ifdef STBI_NEON #include -// assume GCC or Clang on ARM targets +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) #endif +#endif #ifndef STBI_SIMD_ALIGN #define STBI_SIMD_ALIGN(type, name) type name @@ -924,6 +958,7 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); static int stbi__pnm_test(stbi__context *s); static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); #endif static @@ -998,7 +1033,7 @@ static int stbi__mad3sizes_valid(int a, int b, int c, int add) } // returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) { return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && @@ -1021,7 +1056,7 @@ static void *stbi__malloc_mad3(int a, int b, int c, int add) return stbi__malloc(a*b*c + add); } -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) { if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; @@ -1029,6 +1064,23 @@ static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) } #endif +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two signed shorts is valid, 0 on overflow. +static int stbi__mul2shorts_valid(short a, short b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + // stbi__err - error // stbi__errpf - error returning pointer to float // stbi__errpuc - error returning pointer to unsigned char @@ -1087,9 +1139,8 @@ static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int re ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order ri->num_channels = 0; - #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); - #endif + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) #ifndef STBI_NO_PNG if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); #endif @@ -1107,6 +1158,13 @@ static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int re #ifndef STBI_NO_PIC if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif #ifndef STBI_NO_PNM if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); #endif @@ -1262,12 +1320,12 @@ static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, in #ifndef STBI_NO_STDIO -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); #endif -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) { return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); @@ -1277,16 +1335,16 @@ STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wch static FILE *stbi__fopen(char const *filename, char const *mode) { FILE *f; -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) wchar_t wMode[64]; wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) return 0; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) return 0; -#if _MSC_VER >= 1400 +#if defined(_MSC_VER) && _MSC_VER >= 1400 if (0 != _wfopen_s(&f, wFilename, wMode)) f = 0; #else @@ -1662,7 +1720,8 @@ static int stbi__get16le(stbi__context *s) static stbi__uint32 stbi__get32le(stbi__context *s) { stbi__uint32 z = stbi__get16le(s); - return z + (stbi__get16le(s) << 16); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; } #endif @@ -1944,9 +2003,12 @@ static int stbi__build_huffman(stbi__huffman *h, int *count) int i,j,k=0; unsigned int code; // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) - for (j=0; j < count[i]; ++j) + for (i=0; i < 16; ++i) { + for (j=0; j < count[i]; ++j) { h->size[k++] = (stbi_uc) (i+1); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } h->size[k] = 0; // compute actual symbols (from jpeg spec) @@ -2071,6 +2133,8 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) // convert the huffman code to the symbol id c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); // convert the id to a symbol @@ -2089,14 +2153,14 @@ stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n) unsigned int k; int sgn; if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing - sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) k = stbi_lrot(j->code_buffer, n); - if (n < 0 || n >= (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))) return 0; j->code_buffer = k & ~stbi__bmask[n]; k &= stbi__bmask[n]; j->code_bits -= n; - return k + (stbi__jbias[n] & ~sgn); + return k + (stbi__jbias[n] & (sgn - 1)); } // get some unsigned bits @@ -2104,6 +2168,7 @@ stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) { unsigned int k; if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing k = stbi_lrot(j->code_buffer, n); j->code_buffer = k & ~stbi__bmask[n]; k &= stbi__bmask[n]; @@ -2115,6 +2180,7 @@ stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) { unsigned int k; if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing k = j->code_buffer; j->code_buffer <<= 1; --j->code_bits; @@ -2146,14 +2212,16 @@ static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); // 0 all the ac values now so we can do it 32-bits at a time memset(data,0,64*sizeof(data[0])); diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); dc = j->img_comp[b].dc_pred + diff; j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); data[0] = (short) (dc * dequant[0]); // decode AC components, see JPEG spec @@ -2167,6 +2235,7 @@ static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman if (r) { // fast-AC path k += (r >> 4) & 15; // run s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); j->code_buffer <<= s; j->code_bits -= s; // decode into unzigzag'd location @@ -2203,12 +2272,14 @@ static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__ // first scan for DC coefficient, must be first memset(data,0,64*sizeof(data[0])); // 0 all the ac values now t = stbi__jpeg_huff_decode(j, hdc); - if (t == -1) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); dc = j->img_comp[b].dc_pred + diff; j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc << j->succ_low); + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << j->succ_low)); } else { // refinement scan for DC coefficient if (stbi__jpeg_get_bit(j)) @@ -2242,10 +2313,11 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__ if (r) { // fast-AC path k += (r >> 4) & 15; // run s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); j->code_buffer <<= s; j->code_bits -= s; zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) << shift); + data[zig] = (short) ((r >> 8) * (1 << shift)); } else { int rs = stbi__jpeg_huff_decode(j, hac); if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); @@ -2263,7 +2335,7 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__ } else { k += r; zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) << shift); + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); } } } while (k <= j->spec_end); @@ -3062,6 +3134,7 @@ static int stbi__process_marker(stbi__jpeg *z, int m) sizes[i] = stbi__get8(z->s); n += sizes[i]; } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! L -= 17; if (tc == 0) { if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; @@ -3227,6 +3300,13 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; } + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + // compute interleaved mcu info z->img_h_max = h_max; z->img_v_max = v_max; @@ -3304,6 +3384,28 @@ static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) return 1; } +static int stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + while (x == 255) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + // decode image to YCbCr format static int stbi__decode_jpeg_image(stbi__jpeg *j) { @@ -3320,25 +3422,22 @@ static int stbi__decode_jpeg_image(stbi__jpeg *j) if (!stbi__process_scan_header(j)) return 0; if (!stbi__parse_entropy_coded_data(j)) return 0; if (j->marker == STBI__MARKER_none ) { - // handle 0s at the end of image data from IP Kamera 9060 - while (!stbi__at_eof(j->s)) { - int x = stbi__get8(j->s); - if (x == 255) { - j->marker = stbi__get8(j->s); - break; - } - } + j->marker = stbi__skip_jpeg_junk_at_end(j); // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); } else if (stbi__DNL(m)) { int Ld = stbi__get16be(j->s); stbi__uint32 NL = stbi__get16be(j->s); if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); } else { - if (!stbi__process_marker(j, m)) return 0; + if (!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); } - m = stbi__get_marker(j); } if (j->progressive) stbi__jpeg_finish(j); @@ -3782,6 +3881,10 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp else decode_n = z->s->img_n; + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + // resample and color-convert { int k; @@ -3924,6 +4027,8 @@ static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int re { unsigned char* result; stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); STBI_NOTUSED(ri); j->s = s; stbi__setup_jpeg(j); @@ -3936,6 +4041,8 @@ static int stbi__jpeg_test(stbi__context *s) { int r; stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); j->s = s; stbi__setup_jpeg(j); r = stbi__decode_jpeg_header(j, STBI__SCAN_type); @@ -3960,6 +4067,8 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) { int result; stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); j->s = s; result = stbi__jpeg_info_raw(j, x, y, comp); STBI_FREE(j); @@ -3979,6 +4088,7 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) // fast-way is faster to check than jpeg huffman, but slow way is slower #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet // zlib-style huffman encoding // (jpegs packs from left, zlib from right, so can't share code) @@ -3988,8 +4098,8 @@ typedef struct stbi__uint16 firstcode[16]; int maxcode[17]; stbi__uint16 firstsymbol[16]; - stbi_uc size[288]; - stbi__uint16 value[288]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; } stbi__zhuffman; stbi_inline static int stbi__bitreverse16(int n) @@ -4120,7 +4230,7 @@ static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) if (s >= 16) return -1; // invalid code! // code size is s, so: b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - if ((unsigned int)b >= sizeof (z->size)) return -1; // some data was corrupt somewhere! + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. a->code_buffer >>= s; a->num_bits -= s; @@ -4201,11 +4311,12 @@ static int stbi__parse_huffman_block(stbi__zbuf *a) a->zout = zout; return 1; } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data z -= 257; len = stbi__zlength_base[z]; if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data dist = stbi__zdist_base[z]; if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); @@ -4317,7 +4428,7 @@ static int stbi__parse_zlib_header(stbi__zbuf *a) return 1; } -static const stbi_uc stbi__zdefault_length[288] = +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = { 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, @@ -4363,7 +4474,7 @@ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) } else { if (type == 1) { // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; } else { if (!stbi__compute_huffman_codes(a)) return 0; @@ -4759,6 +4870,7 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint3 // de-interlacing final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); for (p=0; p < 7; ++p) { int xorig[] = { 0,4,0,2,0,1,0 }; int yorig[] = { 0,0,4,0,2,0,1 }; @@ -4879,19 +4991,46 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int return 1; } -static int stbi__unpremultiply_on_load = 0; -static int stbi__de_iphone_flag = 0; +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) { - stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; } STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) { - stbi__de_iphone_flag = flag_true_if_should_convert; + stbi__de_iphone_flag_global = flag_true_if_should_convert; } +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + static void stbi__de_iphone(stbi__png *z) { stbi__context *s = z->s; @@ -4941,7 +5080,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) { stbi_uc palette[1024], pal_img_n=0; stbi_uc has_trans=0, tc[3]={0}; - stbi__uint16 tc16[3]={0}; + stbi__uint16 tc16[3]; stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; int first=1,k,interlace=0, color=0, is_iphone=0; stbi__context *s = z->s; @@ -4981,14 +5120,13 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!pal_img_n) { s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - if (scan == STBI__SCAN_header) return 1; } else { // if paletted, then pal_n is our final components, and // img_n is # components to decompress/filter. s->img_n = 1; if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); - // if SCAN_header, have to scan to see if we have a tRNS } + // even with SCAN_header, have to scan to see if we have a tRNS break; } @@ -5020,6 +5158,8 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } if (z->depth == 16) { for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is } else { @@ -5032,7 +5172,13 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) case STBI__PNG_TYPE('I','D','A','T'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); if ((int)(ioff + c.length) < (int)ioff) return 0; if (ioff + c.length > idata_limit) { stbi__uint32 idata_limit_old = idata_limit; @@ -5272,6 +5418,32 @@ typedef struct int extra_read; } stbi__bmp_data; +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) { int hsz; @@ -5299,6 +5471,8 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) if (hsz != 12) { int compress = stbi__get32le(s); if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel stbi__get32le(s); // discard sizeof stbi__get32le(s); // discard hres stbi__get32le(s); // discard vres @@ -5313,17 +5487,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) } if (info->bpp == 16 || info->bpp == 32) { if (compress == 0) { - if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } + stbi__bmp_set_mask_defaults(info, compress); } else if (compress == 3) { info->mr = stbi__get32le(s); info->mg = stbi__get32le(s); @@ -5338,6 +5502,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) return stbi__errpuc("bad BMP", "bad BMP"); } } else { + // V4/V5 header int i; if (hsz != 108 && hsz != 124) return stbi__errpuc("bad BMP", "bad BMP"); @@ -5345,6 +5510,8 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) info->mg = stbi__get32le(s); info->mb = stbi__get32le(s); info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); stbi__get32le(s); // discard color space for (i=0; i < 12; ++i) stbi__get32le(s); // discard color space parameters @@ -5394,9 +5561,22 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req psize = (info.offset - info.extra_read - info.hsz) >> 2; } if (psize == 0) { - STBI_ASSERT(info.offset == s->callback_already_read + (int) (s->img_buffer - s->img_buffer_original)); - if (info.offset != s->callback_already_read + (s->img_buffer - s->buffer_start)) { - return stbi__errpuc("bad offset", "Corrupt BMP"); + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); } } @@ -6342,6 +6522,7 @@ static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_c // intermediate buffer is RGBA result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); memset(result, 0xff, x*y*4); if (!stbi__pic_load_core(s,x,y,comp, result)) { @@ -6457,6 +6638,7 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) { stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); if (!stbi__gif_header(s, g, comp, 1)) { STBI_FREE(g); stbi__rewind( s ); @@ -6766,6 +6948,17 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i } } +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) { if (stbi__gif_test(s)) { @@ -6775,6 +6968,12 @@ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, stbi_uc *two_back = 0; stbi__gif g; int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + memset(&g, 0, sizeof(g)); if (delays) { *delays = 0; @@ -6791,24 +6990,31 @@ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, stride = g.w * g.h * 4; if (out) { - void *tmp = (stbi_uc*) STBI_REALLOC( out, layers * stride ); - if (NULL == tmp) { - STBI_FREE(g.out); - STBI_FREE(g.history); - STBI_FREE(g.background); - return stbi__errpuc("outofmem", "Out of memory"); - } + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); else { out = (stbi_uc*) tmp; + out_size = layers * stride; } if (delays) { - *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); } } else { out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; if (delays) { *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); } } memcpy( out + ((layers - 1) * stride), u, stride ); @@ -7058,12 +7264,12 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re // Run value = stbi__get8(s); count -= 128; - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value; } else { // Dump - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = stbi__get8(s); } @@ -7132,9 +7338,10 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) info.all_a = 255; p = stbi__bmp_parse_header(s, &info); - stbi__rewind( s ); - if (p == NULL) + if (p == NULL) { + stbi__rewind( s ); return 0; + } if (x) *x = s->img_x; if (y) *y = s->img_y; if (comp) { @@ -7200,8 +7407,8 @@ static int stbi__psd_is16(stbi__context *s) stbi__rewind( s ); return 0; } - (void) stbi__get32be(s); - (void) stbi__get32be(s); + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); depth = stbi__get16be(s); if (depth != 16) { stbi__rewind( s ); @@ -7280,7 +7487,6 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) // Known limitations: // Does not support comments in the header section // Does not support ASCII image data (formats P2 and P3) -// Does not support 16-bit-per-channel #ifndef STBI_NO_PNM @@ -7301,7 +7507,8 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req stbi_uc *out; STBI_NOTUSED(ri); - if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) return 0; if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); @@ -7311,15 +7518,22 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req *y = s->img_y; if (comp) *comp = s->img_n; - if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) return stbi__errpuc("too large", "PNM too large"); - out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); if (!out) return stbi__errpuc("outofmem", "Out of memory"); - stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } if (req_comp && req_comp != s->img_n) { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } if (out == NULL) return out; // stbi__convert_format frees input on failure } return out; @@ -7356,6 +7570,8 @@ static int stbi__pnm_getinteger(stbi__context *s, char *c) while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { value = value*10 + (*c - '0'); *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); } return value; @@ -7386,17 +7602,29 @@ static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) stbi__pnm_skip_whitespace(s, &c); *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); stbi__pnm_skip_whitespace(s, &c); *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); stbi__pnm_skip_whitespace(s, &c); maxv = stbi__pnm_getinteger(s, &c); // read max value - - if (maxv > 255) - return stbi__err("max value > 255", "PPM image not 8-bit"); + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; else - return 1; + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; } #endif @@ -7452,6 +7680,9 @@ static int stbi__is_16_main(stbi__context *s) if (stbi__psd_is16(s)) return 1; #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif return 0; } From a0c29202befa73137f6b74f3b60860bb9171ac15 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Thu, 2 Mar 2023 21:12:35 +0800 Subject: [PATCH 106/232] Add build options to fix issues with clang 15. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 66 ++++++++++++++++++++++++++++++++++++- contrib/zlib/CMakeLists.txt | 10 +++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index a098f3e85..d8e03bca4 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1188,7 +1188,71 @@ TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp) IF (ASSIMP_WARNINGS_AS_ERRORS) MESSAGE(STATUS "Treating all warnings as errors (for assimp library only)") IF (MSVC) - TARGET_COMPILE_OPTIONS(assimp PRIVATE /W4 /WX) + + IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) # clang-cl + TARGET_COMPILE_OPTIONS(assimp PRIVATE -Wall -Werror + -Wno-unused-function + -Wno-microsoft-enum-value + -Wno-switch-enum + -Wno-covered-switch-default + -Wno-reserved-identifier + -Wno-c++98-compat-pedantic + -Wno-c++98-compat + -Wno-documentation + -Wno-documentation-unknown-command + -Wno-deprecated-dynamic-exception-spec + -Wno-undef + -Wno-suggest-destructor-override + -Wno-suggest-override + -Wno-inconsistent-missing-destructor-override + -Wno-zero-as-null-pointer-constant + -Wno-global-constructors + -Wno-exit-time-destructors + -Wno-extra-semi-stmt + -Wno-missing-prototypes + -Wno-old-style-cast + -Wno-cast-align + -Wno-cast-qual + -Wno-float-equal + -Wno-implicit-int-float-conversion + -Wno-sign-conversion + -Wno-implicit-float-conversion + -Wno-implicit-int-conversion + -Wno-float-conversion + -Wno-double-promotion + -Wno-unused-macros + -Wno-disabled-macro-expansion + -Wno-shadow-field-in-constructor + -Wno-shadow-field + -Wno-shadow + -Wno-language-extension-token + -Wno-header-hygiene + -Wno-tautological-value-range-compare + -Wno-tautological-type-limit-compare + -Wno-missing-noreturn + -Wno-missing-variable-declarations + -Wno-extra-semi + -Wno-nonportable-system-include-path + -Wno-undefined-reinterpret-cast + -Wno-shift-sign-overflow + -Wno-deprecated-copy-with-user-provided-dtor + -Wno-deprecated-copy-with-dtor + -Wno-deprecated + -Wno-format-nonliteral + -Wno-format-non-iso + -Wno-comma + -Wno-unreachable-code-break + -Wno-unreachable-code-return + -Wno-unreachable-code + -Wno-implicit-fallthrough + -Wno-unused-template + -Wno-undefined-func-template + -Wno-nested-anon-types + -Wno-declaration-after-statement + ) + ELSE() + TARGET_COMPILE_OPTIONS(assimp PRIVATE /W4 /WX) + ENDIF() ELSE() TARGET_COMPILE_OPTIONS(assimp PRIVATE -Wall -Werror) ENDIF() diff --git a/contrib/zlib/CMakeLists.txt b/contrib/zlib/CMakeLists.txt index 469151ff6..5bc2d6065 100644 --- a/contrib/zlib/CMakeLists.txt +++ b/contrib/zlib/CMakeLists.txt @@ -76,7 +76,15 @@ if(MSVC) set(CMAKE_DEBUG_POSTFIX "d") add_definitions(-D_CRT_SECURE_NO_DEPRECATE) add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) # clang-cl + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-non-prototype") + endif() + include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +else() + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) # clang-cl + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-non-prototype") + endif() endif() if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) @@ -88,7 +96,7 @@ if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) message(STATUS "to 'zconf.h.included' because this file is included with zlib") message(STATUS "but CMake generates it automatically in the build directory.") file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included) - endif() + endif() endif() set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc) From 011382424b9bea9984f294a2cf7ec43f378c4e6c Mon Sep 17 00:00:00 2001 From: Urs Hanselmann Date: Fri, 3 Mar 2023 19:31:50 +0100 Subject: [PATCH 107/232] remove debug message from MemoryIOStream (used by public Importer::ReadFileFromMemory method) --- include/assimp/MemoryIOWrapper.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index 77071e96f..1b986ff1b 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -150,7 +150,6 @@ public: // ------------------------------------------------------------------- /// @brief Tests for the existence of a file at the given path. bool Exists(const char* pFile) const override { - printf("Exists\n"); if (0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) { return true; } From 424f53b4d6055abb582741377f900cbf5b7bdf9a Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:08:40 +0800 Subject: [PATCH 108/232] bugfix remove duplicated data. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/FBX/FBXConverter.cpp | 33 ++++++++++++++++----------- code/AssetLib/FBX/FBXDeformer.cpp | 12 ++++++---- code/AssetLib/FBX/FBXDocument.h | 9 ++++---- code/AssetLib/FBX/FBXMeshGeometry.cpp | 7 ++++-- code/AssetLib/FBX/FBXMeshGeometry.h | 9 ++++---- 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index d45919e10..e77dd2fc6 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -1176,15 +1176,23 @@ unsigned int FBXConverter::ConvertMeshSingleMaterial(const MeshGeometry &mesh, c std::vector animMeshes; for (const BlendShape *blendShape : mesh.GetBlendShapes()) { for (const BlendShapeChannel *blendShapeChannel : blendShape->BlendShapeChannels()) { - const std::vector &shapeGeometries = blendShapeChannel->GetShapeGeometries(); - for (size_t i = 0; i < shapeGeometries.size(); i++) { + const auto& shapeGeometries = blendShapeChannel->GetShapeGeometries(); + for (const ShapeGeometry *shapeGeometry : shapeGeometries) { aiAnimMesh *animMesh = aiCreateAnimMesh(out_mesh); - const ShapeGeometry *shapeGeometry = shapeGeometries.at(i); - const std::vector &curVertices = shapeGeometry->GetVertices(); - const std::vector &curNormals = shapeGeometry->GetNormals(); - const std::vector &curIndices = shapeGeometry->GetIndices(); + const auto &curVertices = shapeGeometry->GetVertices(); + const auto &curNormals = shapeGeometry->GetNormals(); + const auto &curIndices = shapeGeometry->GetIndices(); //losing channel name if using shapeGeometry->Name() - animMesh->mName.Set(FixAnimMeshName(blendShapeChannel->Name())); + // if blendShapeChannel Name is empty or don't have a ".", add geoMetryName; + auto aniName = FixAnimMeshName(blendShapeChannel->Name()); + auto geoMetryName = FixAnimMeshName(shapeGeometry->Name()); + if (aniName.empty()) { + aniName = geoMetryName; + } + else if (aniName.find('.') == aniName.npos) { + aniName += "." + geoMetryName; + } + animMesh->mName.Set(aniName); for (size_t j = 0; j < curIndices.size(); j++) { const unsigned int curIndex = curIndices.at(j); aiVector3D vertex = curVertices.at(j); @@ -1406,13 +1414,12 @@ unsigned int FBXConverter::ConvertMeshMultiMaterial(const MeshGeometry &mesh, co std::vector animMeshes; for (const BlendShape *blendShape : mesh.GetBlendShapes()) { for (const BlendShapeChannel *blendShapeChannel : blendShape->BlendShapeChannels()) { - const std::vector &shapeGeometries = blendShapeChannel->GetShapeGeometries(); - for (size_t i = 0; i < shapeGeometries.size(); i++) { + const auto& shapeGeometries = blendShapeChannel->GetShapeGeometries(); + for (const ShapeGeometry *shapeGeometry : shapeGeometries) { aiAnimMesh *animMesh = aiCreateAnimMesh(out_mesh); - const ShapeGeometry *shapeGeometry = shapeGeometries.at(i); - const std::vector &curVertices = shapeGeometry->GetVertices(); - const std::vector &curNormals = shapeGeometry->GetNormals(); - const std::vector &curIndices = shapeGeometry->GetIndices(); + const auto& curVertices = shapeGeometry->GetVertices(); + const auto& curNormals = shapeGeometry->GetNormals(); + const auto& curIndices = shapeGeometry->GetIndices(); animMesh->mName.Set(FixAnimMeshName(shapeGeometry->Name())); for (size_t j = 0; j < curIndices.size(); j++) { unsigned int curIndex = curIndices.at(j); diff --git a/code/AssetLib/FBX/FBXDeformer.cpp b/code/AssetLib/FBX/FBXDeformer.cpp index df134a401..1aab55ea9 100644 --- a/code/AssetLib/FBX/FBXDeformer.cpp +++ b/code/AssetLib/FBX/FBXDeformer.cpp @@ -154,8 +154,10 @@ BlendShape::BlendShape(uint64_t id, const Element& element, const Document& doc, for (const Connection* con : conns) { const BlendShapeChannel* const bspc = ProcessSimpleConnection(*con, false, "BlendShapeChannel -> BlendShape", element); if (bspc) { - blendShapeChannels.push_back(bspc); - continue; + auto pr = blendShapeChannels.insert(bspc); + if (!pr.second) { + FBXImporter::LogWarn("there is the same blendShapeChannel id ", bspc->ID()); + } } } } @@ -179,8 +181,10 @@ BlendShapeChannel::BlendShapeChannel(uint64_t id, const Element& element, const for (const Connection* con : conns) { const ShapeGeometry* const sg = ProcessSimpleConnection(*con, false, "Shape -> BlendShapeChannel", element); if (sg) { - shapeGeometries.push_back(sg); - continue; + auto pr = shapeGeometries.insert(sg); + if (!pr.second) { + FBXImporter::LogWarn("there is the same shapeGeometrie id ", sg->ID()); + } } } } diff --git a/code/AssetLib/FBX/FBXDocument.h b/code/AssetLib/FBX/FBXDocument.h index 8873d65fd..821d4d5cb 100644 --- a/code/AssetLib/FBX/FBXDocument.h +++ b/code/AssetLib/FBX/FBXDocument.h @@ -46,6 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define INCLUDED_AI_FBX_DOCUMENT_H #include +#include #include #include #include "FBXProperties.h" @@ -855,14 +856,14 @@ public: return fullWeights; } - const std::vector& GetShapeGeometries() const { + const std::unordered_set& GetShapeGeometries() const { return shapeGeometries; } private: float percent; WeightArray fullWeights; - std::vector shapeGeometries; + std::unordered_set shapeGeometries; }; /** DOM class for BlendShape deformers */ @@ -872,12 +873,12 @@ public: virtual ~BlendShape(); - const std::vector& BlendShapeChannels() const { + const std::unordered_set& BlendShapeChannels() const { return blendShapeChannels; } private: - std::vector blendShapeChannels; + std::unordered_set blendShapeChannels; }; /** DOM class for skin deformer clusters (aka sub-deformers) */ diff --git a/code/AssetLib/FBX/FBXMeshGeometry.cpp b/code/AssetLib/FBX/FBXMeshGeometry.cpp index ace4ad749..fcbaac169 100644 --- a/code/AssetLib/FBX/FBXMeshGeometry.cpp +++ b/code/AssetLib/FBX/FBXMeshGeometry.cpp @@ -69,13 +69,16 @@ Geometry::Geometry(uint64_t id, const Element& element, const std::string& name, } const BlendShape* const bsp = ProcessSimpleConnection(*con, false, "BlendShape -> Geometry", element); if (bsp) { - blendShapes.push_back(bsp); + auto pr = blendShapes.insert(bsp); + if (!pr.second) { + FBXImporter::LogWarn("there is the same blendShape id ", bsp->ID()); + } } } } // ------------------------------------------------------------------------------------------------ -const std::vector& Geometry::GetBlendShapes() const { +const std::unordered_set& Geometry::GetBlendShapes() const { return blendShapes; } diff --git a/code/AssetLib/FBX/FBXMeshGeometry.h b/code/AssetLib/FBX/FBXMeshGeometry.h index f4a1a2673..3d67ec567 100644 --- a/code/AssetLib/FBX/FBXMeshGeometry.h +++ b/code/AssetLib/FBX/FBXMeshGeometry.h @@ -62,7 +62,7 @@ public: /// @param name The name instance /// @param doc The document instance Geometry( uint64_t id, const Element& element, const std::string& name, const Document& doc ); - + /// @brief The class destructor, default. virtual ~Geometry() = default; @@ -72,11 +72,12 @@ public: /// @brief Get the BlendShape attached to this geometry or nullptr /// @return The blendshape arrays. - const std::vector& GetBlendShapes() const; + const std::unordered_set& GetBlendShapes() const; private: const Skin* skin; - std::vector blendShapes; + std::unordered_set blendShapes; + }; typedef std::vector MatIndexArray; @@ -112,7 +113,7 @@ public: /// @return The binomal vector. const std::vector& GetBinormals() const; - /// @brief Return list of faces - each entry denotes a face and specifies how many vertices it has. + /// @brief Return list of faces - each entry denotes a face and specifies how many vertices it has. /// Vertices are taken from the vertex data arrays in sequential order. /// @return The face indices vector. const std::vector& GetFaceIndexCounts() const; From 74c406dd262e3c92229760683ce814d12116ada5 Mon Sep 17 00:00:00 2001 From: Urs Hanselmann Date: Sat, 4 Mar 2023 14:27:58 +0100 Subject: [PATCH 109/232] add ci script to scan for unexpected printf statements --- .github/workflows/sanitizer.yml | 10 ++++++++++ scripts/scan_printf.sh | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100755 scripts/scan_printf.sh diff --git a/.github/workflows/sanitizer.yml b/.github/workflows/sanitizer.yml index 57d6e78f1..b23f4520f 100644 --- a/.github/workflows/sanitizer.yml +++ b/.github/workflows/sanitizer.yml @@ -57,3 +57,13 @@ jobs: - name: test run: cd build/bin && ./unit shell: bash + + job3: + name: printf-sanitizer + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: run scan_printf script + run: ./scripts/scan_printf.sh + shell: bash diff --git a/scripts/scan_printf.sh b/scripts/scan_printf.sh new file mode 100755 index 000000000..b507e6438 --- /dev/null +++ b/scripts/scan_printf.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +PATHS="include code" +FILTER_INCLUDE='\*.{c,cpp,h}' +FILTER_EXCLUDE="{include/assimp/Compiler/pstdint.h,code/AssetLib/M3D/m3d.h}" + +PATTERN='^\s*printf' + +grep \ + --include=\*.{c,cpp,h} \ + --exclude={include/assimp/Compiler/pstdint.h,code/AssetLib/M3D/m3d.h} \ + -rnw include code \ + -e '^\s*printf' + +if [ $? ] +then + echo "Debug statement(s) detected. Please remove, or manually add to exclude filter, if appropriate" + exit 1 +fi + From 1520aff68027047d3c86d64c26f6ee3148af3423 Mon Sep 17 00:00:00 2001 From: Urs Hanselmann Date: Sat, 4 Mar 2023 14:41:10 +0100 Subject: [PATCH 110/232] fix scan_printf script in linux bash --- scripts/scan_printf.sh | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/scripts/scan_printf.sh b/scripts/scan_printf.sh index b507e6438..90ab7c870 100755 --- a/scripts/scan_printf.sh +++ b/scripts/scan_printf.sh @@ -1,14 +1,8 @@ -#!/bin/sh - -PATHS="include code" -FILTER_INCLUDE='\*.{c,cpp,h}' -FILTER_EXCLUDE="{include/assimp/Compiler/pstdint.h,code/AssetLib/M3D/m3d.h}" - -PATTERN='^\s*printf' +#!/bin/bash grep \ --include=\*.{c,cpp,h} \ - --exclude={include/assimp/Compiler/pstdint.h,code/AssetLib/M3D/m3d.h} \ + --exclude={pstdint,m3d}.h \ -rnw include code \ -e '^\s*printf' From 4fa433c8ff9839ac466c4c4bb333d7113db33d78 Mon Sep 17 00:00:00 2001 From: Urs Hanselmann Date: Sat, 4 Mar 2023 14:52:49 +0100 Subject: [PATCH 111/232] improve scan_printf ci script error message --- scripts/scan_printf.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/scan_printf.sh b/scripts/scan_printf.sh index 90ab7c870..a71fab756 100755 --- a/scripts/scan_printf.sh +++ b/scripts/scan_printf.sh @@ -8,7 +8,7 @@ grep \ if [ $? ] then - echo "Debug statement(s) detected. Please remove, or manually add to exclude filter, if appropriate" + echo "Debug statement(s) detected. Please uncomment (using single-line comment), remove, or manually add to exclude filter, if appropriate" exit 1 fi From 2efd48dee2208a255ca4bfa3a821bfd3615e6924 Mon Sep 17 00:00:00 2001 From: Urs Hanselmann Date: Sat, 4 Mar 2023 14:53:48 +0100 Subject: [PATCH 112/232] disable another debug print message --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index cd9d6dcc2..623f2961e 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -490,7 +490,7 @@ bool OgreXmlSerializer::ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *me OgreXmlSerializer serializer(xmlParser.get()); XmlNode root = xmlParser->getRootNode(); if (std::string(root.name()) != nnSkeleton) { - printf("\nSkeleton is not a valid root: %s\n", root.name()); + // printf("\nSkeleton is not a valid root: %s\n", root.name()); for (auto &a : root.children()) { if (std::string(a.name()) == nnSkeleton) { root = a; From dcb89cf1070ed8cc7676f8f00cf8951906d5b2b6 Mon Sep 17 00:00:00 2001 From: Urs Hanselmann Date: Sat, 4 Mar 2023 15:00:43 +0100 Subject: [PATCH 113/232] fix scan_printf script error code handling --- scripts/scan_printf.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/scan_printf.sh b/scripts/scan_printf.sh index a71fab756..f8c902941 100755 --- a/scripts/scan_printf.sh +++ b/scripts/scan_printf.sh @@ -6,8 +6,7 @@ grep \ -rnw include code \ -e '^\s*printf' -if [ $? ] -then +if [ $? -eq 0 ]; then echo "Debug statement(s) detected. Please uncomment (using single-line comment), remove, or manually add to exclude filter, if appropriate" exit 1 fi From c089f117680c4f99f02b4a1e6771fe348acda2dd Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 Mar 2023 19:56:11 +0100 Subject: [PATCH 114/232] Update utf82utf16. --- include/assimp/types.h | 6 + .../SimpleTexturedDirectx11/main.cpp | 14 +- .../src/model_loading.cpp | 155 ++++++------------ 3 files changed, 64 insertions(+), 111 deletions(-) diff --git a/include/assimp/types.h b/include/assimp/types.h index a41363b8a..be2aad18b 100644 --- a/include/assimp/types.h +++ b/include/assimp/types.h @@ -57,6 +57,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#ifdef ASSIMP_USE_HUNTER +#include +#else +#include "../contrib/utf8cpp/source/utf8.h" +#endif + // Our compile configuration #include diff --git a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp index 7f0d0c84e..4da5820a1 100644 --- a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp +++ b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp @@ -13,6 +13,8 @@ // Written by IAS. :) // --------------------------------------------------------------------------- +#include + #include #include #include @@ -21,11 +23,7 @@ #include #include #include -#ifdef ASSIMP_USE_HUNTER -#include -#else -#include "../contrib/utf8cpp/source/utf8.h" -#endif + #include "ModelLoader.h" #include "SafeRelease.hpp" @@ -53,10 +51,10 @@ struct ConstantBuffer { // ------------------------------------------------------------ // Window Variables // ------------------------------------------------------------ -#define SCREEN_WIDTH 800 -#define SCREEN_HEIGHT 600 +static constexpr uint32_t SCREEN_WIDTH = 800; +static constexpr uint32_t SCREEN_HEIGHT = 600; -const char g_szClassName[] = "directxWindowClass"; +constexpr char g_szClassName[] = "directxWindowClass"; static std::string g_ModelPath; diff --git a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp index 48066f189..2eb73b403 100644 --- a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp +++ b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp @@ -41,15 +41,14 @@ #include #include #include -#include "UTFConverter.h" // The default hard-coded path. Can be overridden by supplying a path through the command line. static std::string modelpath = "../../test/models/OBJ/spider.obj"; -HGLRC hRC=nullptr; // Permanent Rendering Context -HDC hDC=nullptr; // Private GDI Device Context -HWND g_hWnd=nullptr; // Holds Window Handle -HINSTANCE g_hInstance=nullptr; // Holds The Instance Of The Application +HGLRC hRC = nullptr; // Permanent Rendering Context +HDC hDC = nullptr; // Private GDI Device Context +HWND g_hWnd = nullptr; // Holds Window Handle +HINSTANCE g_hInstance = nullptr; // Holds The Instance Of The Application bool keys[256]; // Array used for Keyboard Routine; bool active=TRUE; // Window Active Flag Set To TRUE by Default @@ -69,8 +68,6 @@ GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightPosition[]= { 0.0f, 0.0f, 15.0f, 1.0f }; - - // the global Assimp scene object const aiScene* g_scene = nullptr; GLuint scene_list = 0; @@ -83,12 +80,8 @@ GLuint* textureIds; // pointer to texture Array // Create an instance of the Importer class Assimp::Importer importer; -using namespace AssimpSamples::SharedCode; - -void createAILogger() -{ - // Change this line to normal if you not want to analyse the import process - //Assimp::Logger::LogSeverity severity = Assimp::Logger::NORMAL; +void createAILogger() { + // Change this line to normal if you not want to analyze the import process Assimp::Logger::LogSeverity severity = Assimp::Logger::VERBOSE; // Create a logger instance for Console Output @@ -101,62 +94,52 @@ void createAILogger() Assimp::DefaultLogger::get()->info("this is my info-call"); } -void destroyAILogger() -{ - // Kill it after the work is done +void destroyAILogger() { Assimp::DefaultLogger::kill(); } -void logInfo(std::string logString) -{ - // Will add message to File with "info" Tag +void logInfo(const std::string &logString) { Assimp::DefaultLogger::get()->info(logString.c_str()); } -void logDebug(const char* logString) -{ - // Will add message to File with "debug" Tag +void logDebug(const char* logString) { Assimp::DefaultLogger::get()->debug(logString); } -bool Import3DFromFile( const std::string& pFile) -{ +bool Import3DFromFile( const std::string &filename) { // Check if file exists - std::ifstream fin(pFile.c_str()); - if(!fin.fail()) - { - fin.close(); + std::ifstream fin(filename.c_str()); + if(fin.fail()) { + std::string message = "Couldn't open file: " + filename; + std::wstring targetMessage; + //utf8::utf8to16(message.c_str(), message.c_str() + message.size(), targetMessage); + ::MessageBox(nullptr, targetMessage.c_str(), L"Error", MB_OK | MB_ICONEXCLAMATION); + logInfo(importer.GetErrorString()); + return false; } - else - { - MessageBox(nullptr, UTFConverter("Couldn't open file: " + pFile).c_wstr() , TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); - logInfo( importer.GetErrorString()); - return false; - } - - g_scene = importer.ReadFile(pFile, aiProcessPreset_TargetRealtime_Quality); + + fin.close(); + + g_scene = importer.ReadFile(filename, aiProcessPreset_TargetRealtime_Quality); // If the import failed, report it - if(!g_scene) - { + if (g_scene == nullptr) { logInfo( importer.GetErrorString()); return false; } // Now we can access the file's contents. - logInfo("Import of scene " + pFile + " succeeded."); + logInfo("Import of scene " + filename + " succeeded."); // We're done. Everything will be cleaned up by the importer destructor return true; } // Resize And Initialize The GL Window -void ReSizeGLScene(GLsizei width, GLsizei height) -{ +void ReSizeGLScene(GLsizei width, GLsizei height) { // Prevent A Divide By Zero By - if (height==0) - { + if (height == 0) { // Making Height Equal One height=1; } @@ -174,43 +157,26 @@ void ReSizeGLScene(GLsizei width, GLsizei height) } -std::string getBasePath(const std::string& path) -{ +std::string getBasePath(const std::string& path) { size_t pos = path.find_last_of("\\/"); return (std::string::npos == pos) ? "" : path.substr(0, pos + 1); } -void freeTextureIds() -{ - textureIdMap.clear(); //no need to delete pointers in it manually here. (Pointers point to textureIds deleted in next step) +void freeTextureIds() { + // no need to delete pointers in it manually here. (Pointers point to textureIds deleted in next step) + textureIdMap.clear(); - if (textureIds) - { + if (textureIds) { delete[] textureIds; textureIds = nullptr; } } -int LoadGLTextures(const aiScene* scene) -{ +int LoadGLTextures(const aiScene* scene) { freeTextureIds(); - //ILboolean success; - - /* Before calling ilInit() version should be checked. */ - /*if (ilGetInteger(IL_VERSION_NUM) < IL_VERSION) - { - /// wrong DevIL version /// - std::string err_msg = "Wrong DevIL version. Old devil.dll in system32/SysWow64?"; - char* cErr_msg = (char *) err_msg.c_str(); - abortGLInit(cErr_msg); - return -1; - }*/ - - //ilInit(); /* Initialization of DevIL */ - - if (scene->HasTextures()) return 1; - //abortGLInit("Support for meshes with embedded textures is not implemented"); + if (scene->HasTextures()) + return 1; /* getTexture Filenames and Numb of Textures */ for (unsigned int m=0; mmNumMaterials; m++) @@ -230,14 +196,6 @@ int LoadGLTextures(const aiScene* scene) const size_t numTextures = textureIdMap.size(); - - /* array with DevIL image IDs */ - //ILuint* imageIds = NULL; -// imageIds = new ILuint[numTextures]; - - /* generate DevIL Image IDs */ -// ilGenImages(numTextures, imageIds); /* Generation of numTextures image names */ - /* create and fill array with GL texture ids */ textureIds = new GLuint[numTextures]; glGenTextures(static_cast(numTextures), textureIds); /* Texture name generation */ @@ -248,29 +206,17 @@ int LoadGLTextures(const aiScene* scene) std::string basepath = getBasePath(modelpath); for (size_t i=0; i 1) { std::wstring modelpathW(argv[1]); - modelpath = UTFConverter(modelpathW).str(); + utf8::utf16to8(modelpathW.c_str(), modelpathW.c_str() + modelpathW.size(), back_inserter(modelpath)); } if (!Import3DFromFile(modelpath)) From 8171e041fafea7432b397ef30f7576e0b6156178 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 Mar 2023 20:56:09 +0100 Subject: [PATCH 115/232] Update utf82utf16. --- .../src/model_loading.cpp | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp index 2eb73b403..89731bd9b 100644 --- a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp +++ b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp @@ -233,13 +233,15 @@ int LoadGLTextures(const aiScene* scene) { glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); stbi_image_free(data); - } - else - { - /* Error occurred */ + } else { + /* Error occurred */ const std::string message = "Couldn't load Image: " + fileloc; std::wstring targetMessage; - utf8::utf8to16(message.c_str(), message.c_str() + message.size(), back_inserter(targetMessage)); + wchar_t *tmp = new wchar_t[message.size() + 1]; + memset(tmp, L'\0', sizeof(wchar_t) *(message.size() + 1)); + utf8::utf8to16(message.c_str(), message.c_str() + message.size(), tmp); + targetMessage = tmp; + delete [] tmp; MessageBox(nullptr, targetMessage.c_str(), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); } } @@ -535,7 +537,12 @@ GLboolean abortGLInit(const char* abortMessage) KillGLWindow(); const std::string message = abortMessage; std::wstring targetMessage; - utf8::utf8to16(message.c_str(), message.c_str() + message.size(), back_inserter(targetMessage)); + const size_t len = std::strlen(abortMessage) + 1; + wchar_t *tmp = new wchar_t[len]; + memset(tmp, L'\0', len); + utf8::utf8to16(message.c_str(), message.c_str() + message.size(), tmp); + targetMessage = tmp; + delete [] tmp; MessageBox(nullptr, targetMessage.c_str(), TEXT("ERROR"), MB_OK|MB_ICONEXCLAMATION); return FALSE; // quit and return False @@ -587,7 +594,8 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { // If The Mode Fails, Offer Two Options. Quit Or Run In A Window. - if (MessageBox(nullptr,TEXT("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"),TEXT("NeHe GL"),MB_YESNO|MB_ICONEXCLAMATION)==IDYES) + if (MessageBox(nullptr,TEXT("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"), + TEXT("NeHe GL"),MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { fullscreen = FALSE; // Select Windowed Mode (Fullscreen = FALSE) } @@ -618,7 +626,7 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful std::wstring targetMessage; utf8::utf8to16(message.c_str(), message.c_str() + message.size(), back_inserter(targetMessage)); - if (nullptr == (g_hWnd=CreateWindowEx(dwExStyle, // Extended Style For The Window + if (nullptr == (g_hWnd = CreateWindowEx(dwExStyle, // Extended Style For The Window TEXT("OpenGL"), // Class Name targetMessage.c_str(), // Window Title WS_CLIPSIBLINGS | // Required Window Style @@ -792,7 +800,11 @@ int WINAPI WinMain( HINSTANCE /*hInstance*/, // The instance if (argv != nullptr && argc > 1) { std::wstring modelpathW(argv[1]); - utf8::utf16to8(modelpathW.c_str(), modelpathW.c_str() + modelpathW.size(), back_inserter(modelpath)); + char *tmp = new char[modelpathW.size() + 1]; + memset(tmp, '\0', modelpathW.size() + 1); + utf8::utf16to8(modelpathW.c_str(), modelpathW.c_str() + modelpathW.size(), tmp); + modelpath = tmp; + delete[]tmp; } if (!Import3DFromFile(modelpath)) @@ -820,7 +832,7 @@ int WINAPI WinMain( HINSTANCE /*hInstance*/, // The instance { if (msg.message==WM_QUIT) { - done=TRUE; + done = TRUE; } else { From 5082c940d0d76871288024ba406864f36bcc8eb8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 Mar 2023 21:13:40 +0100 Subject: [PATCH 116/232] Fix: Replace back_inserter usage. --- .../SimpleTexturedOpenGL/src/model_loading.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp index 89731bd9b..7d730a630 100644 --- a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp +++ b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp @@ -622,9 +622,12 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size - const std::string message = title; - std::wstring targetMessage; - utf8::utf8to16(message.c_str(), message.c_str() + message.size(), back_inserter(targetMessage)); + const size_t len = std::strlen(title) + 1; + wchar_t *tmp = new wchar_t[len]; + memset(tmp, L'\0', sizeof(wchar_t) * len); + utf8::utf8to16(title, title+len, tmp); + std::wstring targetMessage = tmp; + delete[] tmp; if (nullptr == (g_hWnd = CreateWindowEx(dwExStyle, // Extended Style For The Window TEXT("OpenGL"), // Class Name From 44c2785663d38f79614138bfa87d91d0b0ad69c7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 7 Mar 2023 17:01:08 +0100 Subject: [PATCH 117/232] Make debug message more professional. --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 623f2961e..a8faaec34 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -490,7 +490,7 @@ bool OgreXmlSerializer::ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *me OgreXmlSerializer serializer(xmlParser.get()); XmlNode root = xmlParser->getRootNode(); if (std::string(root.name()) != nnSkeleton) { - // printf("\nSkeleton is not a valid root: %s\n", root.name()); + ASSIMP_LOG_VERBOSE_DEBUG("nSkeleton is not a valid root: ", root.name(), "."); for (auto &a : root.children()) { if (std::string(a.name()) == nnSkeleton) { root = a; From 069b3ecdf814784f8f80f3858863222184f15172 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Tue, 7 Mar 2023 17:44:48 +0100 Subject: [PATCH 118/232] After Kim's addition to meta data types, use it in the FBX converter --- code/AssetLib/FBX/FBXConverter.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index d45919e10..37654746e 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -873,8 +873,12 @@ void FBXConverter::SetupNodeMetadata(const Model &model, aiNode &nd) { data->Set(index++, prop.first, interpretedBool->Value()); } else if (const TypedProperty *interpretedInt = prop.second->As>()) { data->Set(index++, prop.first, interpretedInt->Value()); + } else if (const TypedProperty *interpretedUInt = prop.second->As>()) { + data->Set(index++, prop.first, interpretedUInt->Value()); } else if (const TypedProperty *interpretedUint64 = prop.second->As>()) { data->Set(index++, prop.first, interpretedUint64->Value()); + } else if (const TypedProperty *interpretedint64 = prop.second->As>()) { + data->Set(index++, prop.first, interpretedint64->Value()); } else if (const TypedProperty *interpretedFloat = prop.second->As>()) { data->Set(index++, prop.first, interpretedFloat->Value()); } else if (const TypedProperty *interpretedString = prop.second->As>()) { From 4f48348af8f2d0b046788edab8f952af9bf2d52b Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 7 Mar 2023 18:55:18 +0100 Subject: [PATCH 119/232] Fix: Move c++ include to c++ section --- include/assimp/types.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/assimp/types.h b/include/assimp/types.h index be2aad18b..605dc590f 100644 --- a/include/assimp/types.h +++ b/include/assimp/types.h @@ -57,12 +57,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#ifdef ASSIMP_USE_HUNTER -#include -#else -#include "../contrib/utf8cpp/source/utf8.h" -#endif - // Our compile configuration #include @@ -79,6 +73,12 @@ typedef uint32_t ai_uint32; #ifdef __cplusplus +#ifdef ASSIMP_USE_HUNTER +# include +#else +# include "../contrib/utf8cpp/source/utf8.h" +#endif + #include #include // for std::nothrow_t #include // for aiString::Set(const std::string&) From b5345841989a53979260e136c5ca53b181676e13 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Wed, 8 Mar 2023 16:10:40 +0200 Subject: [PATCH 120/232] Improve unit tests which load subdivision models --- test/unit/utACImportExport.cpp | 23 +++++++++++++++++++++++ test/unit/utBlenderImportExport.cpp | 22 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/test/unit/utACImportExport.cpp b/test/unit/utACImportExport.cpp index 9615a3a3e..c844603cf 100644 --- a/test/unit/utACImportExport.cpp +++ b/test/unit/utACImportExport.cpp @@ -43,6 +43,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include + using namespace Assimp; @@ -68,6 +70,27 @@ TEST(utACImportExport, importSampleSubdiv) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/sample_subdiv.ac", aiProcess_ValidateDataStructure); ASSERT_NE(nullptr, scene); + + // check approximate shape by averaging together all vertices + ASSERT_EQ(scene->mNumMeshes, 1u); + aiVector3D vertexAvg(0.0, 0.0, 0.0); + for (unsigned int i = 0; i < scene->mNumMeshes; i++) { + const aiMesh *mesh = scene->mMeshes[i]; + ASSERT_NE(mesh, nullptr); + + ai_real invVertexCount = 1.0 / mesh->mNumVertices; + for (unsigned int j = 0; j < mesh->mNumVertices; j++) { + vertexAvg += mesh->mVertices[j] * invVertexCount; + } + } + + // must not be inf or nan + ASSERT_TRUE(std::isfinite(vertexAvg.x)); + ASSERT_TRUE(std::isfinite(vertexAvg.y)); + ASSERT_TRUE(std::isfinite(vertexAvg.z)); + EXPECT_NEAR(vertexAvg.x, 0.079997420310974121, 0.0001); + EXPECT_NEAR(vertexAvg.y, 0.099498569965362549, 0.0001); + EXPECT_NEAR(vertexAvg.z, -0.10344827175140381, 0.0001); } TEST(utACImportExport, importSphereWithLight) { diff --git a/test/unit/utBlenderImportExport.cpp b/test/unit/utBlenderImportExport.cpp index c9cce72b4..c220b7daa 100644 --- a/test/unit/utBlenderImportExport.cpp +++ b/test/unit/utBlenderImportExport.cpp @@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include using namespace Assimp; @@ -156,6 +157,27 @@ TEST(utBlenderImporter, importSuzanneSubdiv_252) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/SuzanneSubdiv_252.blend", aiProcess_ValidateDataStructure); ASSERT_NE(nullptr, scene); + + // check approximate shape by averaging together all vertices + ASSERT_EQ(scene->mNumMeshes, 1u); + aiVector3D vertexAvg(0.0, 0.0, 0.0); + for (unsigned int i = 0; i < scene->mNumMeshes; i++) { + const aiMesh *mesh = scene->mMeshes[i]; + ASSERT_NE(mesh, nullptr); + + ai_real invVertexCount = 1.0 / mesh->mNumVertices; + for (unsigned int j = 0; j < mesh->mNumVertices; j++) { + vertexAvg += mesh->mVertices[j] * invVertexCount; + } + } + + // must not be inf or nan + ASSERT_TRUE(std::isfinite(vertexAvg.x)); + ASSERT_TRUE(std::isfinite(vertexAvg.y)); + ASSERT_TRUE(std::isfinite(vertexAvg.z)); + EXPECT_NEAR(vertexAvg.x, 6.4022515289252624e-08, 0.0001); + EXPECT_NEAR(vertexAvg.y, 0.060569953173398972, 0.0001); + EXPECT_NEAR(vertexAvg.z, 0.31429031491279602, 0.0001); } TEST(utBlenderImporter, importTexturedCube_ImageGlob_248) { From f3767a4eb21f2f272102d0fe4020d4e4ca3154bc Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Wed, 8 Mar 2023 16:18:10 +0200 Subject: [PATCH 121/232] Use unordered_map for subdivision process edge map --- code/Common/Subdivision.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/Common/Subdivision.cpp b/code/Common/Subdivision.cpp index 705ea3fb3..ac4078b47 100644 --- a/code/Common/Subdivision.cpp +++ b/code/Common/Subdivision.cpp @@ -50,6 +50,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include + using namespace Assimp; void mydummy() {} @@ -78,7 +80,7 @@ public: }; typedef std::vector UIntVector; - typedef std::map EdgeMap; + typedef std::unordered_map EdgeMap; // --------------------------------------------------------------------------- // Hashing function to derive an index into an #EdgeMap from two given From dfd70b5c10cd45ef9d80c96ee08fe4e7393520a9 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Thu, 9 Mar 2023 19:06:58 +0100 Subject: [PATCH 122/232] GLTF Importer: Build a list of the actual vertices so it works well with shared attribute lists --- code/AssetLib/glTF2/glTF2Asset.h | 2 +- code/AssetLib/glTF2/glTF2Asset.inl | 19 ++--- code/AssetLib/glTF2/glTF2Importer.cpp | 100 +++++++++++++++++--------- 3 files changed, 78 insertions(+), 43 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 1d7cff325..cf9c8f11c 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -565,7 +565,7 @@ struct Accessor : public Object { inline size_t GetMaxByteSize(); template - void ExtractData(T *&outData); + size_t ExtractData(T *&outData, const std::vector *remappingIndices = nullptr); void WriteData(size_t count, const void *src_buffer, size_t src_stride); void WriteSparseValues(size_t count, const void *src_data, size_t src_dataStride); diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 0e2998357..4e4497e1f 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -962,14 +962,15 @@ inline size_t Accessor::GetMaxByteSize() { } template -void Accessor::ExtractData(T *&outData) { +size_t Accessor::ExtractData(T *&outData, const std::vector *remappingIndices) { uint8_t *data = GetPointer(); if (!data) { throw DeadlyImportError("GLTF2: data is null when extracting data from ", getContextForErrorMessages(id, name)); } + const size_t usedCount = (remappingIndices != nullptr) ? remappingIndices->size() : count; const size_t elemSize = GetElementSize(); - const size_t totalSize = elemSize * count; + const size_t totalSize = elemSize * usedCount; const size_t stride = GetStride(); @@ -980,18 +981,20 @@ void Accessor::ExtractData(T *&outData) { } const size_t maxSize = GetMaxByteSize(); - if (count * stride > maxSize) { - throw DeadlyImportError("GLTF: count*stride ", (count * stride), " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); + if (usedCount * stride > maxSize) { + throw DeadlyImportError("GLTF: count*stride ", (usedCount * stride), " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); } - outData = new T[count]; - if (stride == elemSize && targetElemSize == elemSize) { + outData = new T[usedCount]; + if (remappingIndices == nullptr && stride == elemSize && targetElemSize == elemSize) { memcpy(outData, data, totalSize); } else { - for (size_t i = 0; i < count; ++i) { - memcpy(outData + i, data + i * stride, elemSize); + for (size_t i = 0; i < usedCount; ++i) { + size_t srcIdx = remappingIndices != nullptr ? static_cast((*remappingIndices)[i]) : i; + memcpy(outData + i, data + srcIdx * stride, elemSize); } } + return usedCount; } inline void Accessor::WriteData(size_t _count, const void *src_buffer, size_t src_stride) { diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index d30556806..f0dc284c3 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -453,6 +453,12 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { unsigned int k = 0; meshOffsets.clear(); + + const unsigned int unusedIndex = ~0; + std::vector usedVertexIndices; + std::vector reverseMappingIndices; + std::vector indexBuffer; + for (unsigned int m = 0; m < r.meshes.Size(); ++m) { Mesh &mesh = r.meshes[m]; @@ -462,6 +468,36 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { for (unsigned int p = 0; p < mesh.primitives.size(); ++p) { Mesh::Primitive &prim = mesh.primitives[p]; + // extract used vertices: + bool useIndexBuffer = prim.indices; + std::vector* usedVertexIndicesPtr = nullptr; + if (useIndexBuffer) { + size_t count = prim.indices->count; + indexBuffer.resize(count); + usedVertexIndices.clear(); + reverseMappingIndices.clear(); + usedVertexIndices.reserve(count / 3); // this is a very rough heuristic to reduce re-allocations + usedVertexIndicesPtr = &usedVertexIndices; + Accessor::Indexer data = prim.indices->GetIndexer(); + if (!data.IsValid()) { + throw DeadlyImportError("GLTF: Invalid accessor without data in mesh ", getContextForErrorMessages(mesh.id, mesh.name)); + } + + // Build the vertex remapping table and the modified index buffer (used later instead of the original one) + // In case no index buffer is used, the original vertex arrays are being used so no remapping is required in the first place. + for (unsigned int i = 0; i < count; ++i) { + unsigned int index = data.GetUInt(i); + if (index >= reverseMappingIndices.size()) { + reverseMappingIndices.resize(index + 1, unusedIndex); + } + if (reverseMappingIndices[index] == unusedIndex) { + reverseMappingIndices[index] = static_cast(usedVertexIndices.size()); + usedVertexIndices.push_back(index); + } + indexBuffer[i] = reverseMappingIndices[index]; + } + } + aiMesh *aim = new aiMesh(); meshes.push_back(std::unique_ptr(aim)); @@ -493,26 +529,27 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { Mesh::Primitive::Attributes &attr = prim.attributes; + size_t numAllVertices = 0; if (!attr.position.empty() && attr.position[0]) { - aim->mNumVertices = static_cast(attr.position[0]->count); - attr.position[0]->ExtractData(aim->mVertices); + numAllVertices = attr.position[0]->count; + aim->mNumVertices = static_cast(attr.position[0]->ExtractData(aim->mVertices, usedVertexIndicesPtr)); } if (!attr.normal.empty() && attr.normal[0]) { - if (attr.normal[0]->count != aim->mNumVertices) { + if (attr.normal[0]->count != numAllVertices) { DefaultLogger::get()->warn("Normal count in mesh \"", mesh.name, "\" does not match the vertex count, normals ignored."); } else { - attr.normal[0]->ExtractData(aim->mNormals); + attr.normal[0]->ExtractData(aim->mNormals, usedVertexIndicesPtr); // only extract tangents if normals are present if (!attr.tangent.empty() && attr.tangent[0]) { - if (attr.tangent[0]->count != aim->mNumVertices) { + if (attr.tangent[0]->count != numAllVertices) { DefaultLogger::get()->warn("Tangent count in mesh \"", mesh.name, "\" does not match the vertex count, tangents ignored."); } else { // generate bitangents from normals and tangents according to spec Tangent *tangents = nullptr; - attr.tangent[0]->ExtractData(tangents); + attr.tangent[0]->ExtractData(tangents, usedVertexIndicesPtr); aim->mTangents = new aiVector3D[aim->mNumVertices]; aim->mBitangents = new aiVector3D[aim->mNumVertices]; @@ -529,7 +566,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } for (size_t c = 0; c < attr.color.size() && c < AI_MAX_NUMBER_OF_COLOR_SETS; ++c) { - if (attr.color[c]->count != aim->mNumVertices) { + if (attr.color[c]->count != numAllVertices) { DefaultLogger::get()->warn("Color stream size in mesh \"", mesh.name, "\" does not match the vertex count"); continue; @@ -537,7 +574,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { auto componentType = attr.color[c]->componentType; if (componentType == glTF2::ComponentType_FLOAT) { - attr.color[c]->ExtractData(aim->mColors[c]); + attr.color[c]->ExtractData(aim->mColors[c], usedVertexIndicesPtr); } else { if (componentType == glTF2::ComponentType_UNSIGNED_BYTE) { aim->mColors[c] = GetVertexColorsForType(attr.color[c]); @@ -552,13 +589,13 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { continue; } - if (attr.texcoord[tc]->count != aim->mNumVertices) { + if (attr.texcoord[tc]->count != numAllVertices) { DefaultLogger::get()->warn("Texcoord stream size in mesh \"", mesh.name, "\" does not match the vertex count"); continue; } - attr.texcoord[tc]->ExtractData(aim->mTextureCoords[tc]); + attr.texcoord[tc]->ExtractData(aim->mTextureCoords[tc], usedVertexIndicesPtr); aim->mNumUVComponents[tc] = attr.texcoord[tc]->GetNumComponents(); aiVector3D *values = aim->mTextureCoords[tc]; @@ -583,11 +620,11 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { Mesh::Primitive::Target &target = targets[i]; if (needPositions) { - if (target.position[0]->count != aim->mNumVertices) { + if (target.position[0]->count != numAllVertices) { ASSIMP_LOG_WARN("Positions of target ", i, " in mesh \"", mesh.name, "\" does not match the vertex count"); } else { aiVector3D *positionDiff = nullptr; - target.position[0]->ExtractData(positionDiff); + target.position[0]->ExtractData(positionDiff, usedVertexIndicesPtr); for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) { aiAnimMesh.mVertices[vertexId] += positionDiff[vertexId]; } @@ -595,11 +632,11 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } } if (needNormals) { - if (target.normal[0]->count != aim->mNumVertices) { + if (target.normal[0]->count != numAllVertices) { ASSIMP_LOG_WARN("Normals of target ", i, " in mesh \"", mesh.name, "\" does not match the vertex count"); } else { aiVector3D *normalDiff = nullptr; - target.normal[0]->ExtractData(normalDiff); + target.normal[0]->ExtractData(normalDiff, usedVertexIndicesPtr); for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) { aiAnimMesh.mNormals[vertexId] += normalDiff[vertexId]; } @@ -610,14 +647,14 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { if (!aiAnimMesh.HasNormals()) { // prevent nullptr access to aiAnimMesh.mNormals below when no normals are available ASSIMP_LOG_WARN("Bitangents of target ", i, " in mesh \"", mesh.name, "\" can't be computed, because mesh has no normals."); - } else if (target.tangent[0]->count != aim->mNumVertices) { + } else if (target.tangent[0]->count != numAllVertices) { ASSIMP_LOG_WARN("Tangents of target ", i, " in mesh \"", mesh.name, "\" does not match the vertex count"); } else { Tangent *tangent = nullptr; - attr.tangent[0]->ExtractData(tangent); + attr.tangent[0]->ExtractData(tangent, usedVertexIndicesPtr); aiVector3D *tangentDiff = nullptr; - target.tangent[0]->ExtractData(tangentDiff); + target.tangent[0]->ExtractData(tangentDiff, usedVertexIndicesPtr); for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; ++vertexId) { tangent[vertexId].xyz += tangentDiff[vertexId]; @@ -641,20 +678,15 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { aiFace *facePtr = nullptr; size_t nFaces = 0; - if (prim.indices) { - size_t count = prim.indices->count; - - Accessor::Indexer data = prim.indices->GetIndexer(); - if (!data.IsValid()) { - throw DeadlyImportError("GLTF: Invalid accessor without data in mesh ", getContextForErrorMessages(mesh.id, mesh.name)); - } + if (useIndexBuffer) { + size_t count = indexBuffer.size(); switch (prim.mode) { case PrimitiveMode_POINTS: { nFaces = count; facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; ++i) { - SetFaceAndAdvance1(facePtr, aim->mNumVertices, data.GetUInt(i)); + SetFaceAndAdvance1(facePtr, aim->mNumVertices, indexBuffer[i]); } break; } @@ -667,7 +699,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 2) { - SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1)); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, indexBuffer[i], indexBuffer[i + 1]); } break; } @@ -676,12 +708,12 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_LINE_STRIP: { nFaces = count - ((prim.mode == PrimitiveMode_LINE_STRIP) ? 1 : 0); facePtr = faces = new aiFace[nFaces]; - SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1)); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, indexBuffer[0], indexBuffer[1]); for (unsigned int i = 2; i < count; ++i) { - SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(i - 1), data.GetUInt(i)); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, indexBuffer[i - 1], indexBuffer[i]); } if (prim.mode == PrimitiveMode_LINE_LOOP) { // close the loop - SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(static_cast(count) - 1), faces[0].mIndices[0]); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, indexBuffer[static_cast(count) - 1], faces[0].mIndices[0]); } break; } @@ -694,7 +726,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 3) { - SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, indexBuffer[i], indexBuffer[i + 1], indexBuffer[i + 2]); } break; } @@ -705,10 +737,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { // The ordering is to ensure that the triangles are all drawn with the same orientation if ((i + 1) % 2 == 0) { // For even n, vertices n + 1, n, and n + 2 define triangle n - SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(i + 1), data.GetUInt(i), data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, indexBuffer[i + 1], indexBuffer[i], indexBuffer[i + 2]); } else { // For odd n, vertices n, n+1, and n+2 define triangle n - SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, indexBuffer[i], indexBuffer[i + 1], indexBuffer[i + 2]); } } break; @@ -716,9 +748,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_TRIANGLE_FAN: nFaces = count - 2; facePtr = faces = new aiFace[nFaces]; - SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, indexBuffer[0], indexBuffer[1], indexBuffer[2]); for (unsigned int i = 1; i < nFaces; ++i) { - SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(i + 1), data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, indexBuffer[0], indexBuffer[i + 1], indexBuffer[i + 2]); } break; } From c82a6d05b0be9cdd5e16420ff06bd28190508ea7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 10 Mar 2023 08:43:12 +0100 Subject: [PATCH 123/232] Code cleanup --- code/CApi/CInterfaceIOWrapper.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/CApi/CInterfaceIOWrapper.cpp b/code/CApi/CInterfaceIOWrapper.cpp index 579545ecc..f0e46cd08 100644 --- a/code/CApi/CInterfaceIOWrapper.cpp +++ b/code/CApi/CInterfaceIOWrapper.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -47,14 +45,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { +// ------------------------------------------------------------------------------------------------ CIOStreamWrapper::~CIOStreamWrapper() { - /* Various places depend on this destructor to close the file */ - if (mFile) { + // Various places depend on this destructor to close the file + if (mFile != nullptr) { + mIO->mFileSystem->CloseProc(mIO->mFileSystem, mFile); } } -// ................................................................... +// ------------------------------------------------------------------------------------------------ size_t CIOStreamWrapper::Read(void *pvBuffer, size_t pSize, size_t pCount) { @@ -62,7 +62,7 @@ size_t CIOStreamWrapper::Read(void *pvBuffer, return mFile->ReadProc(mFile, (char *)pvBuffer, pSize, pCount); } -// ................................................................... +// ------------------------------------------------------------------------------------------------ size_t CIOStreamWrapper::Write(const void *pvBuffer, size_t pSize, size_t pCount) { @@ -70,23 +70,23 @@ size_t CIOStreamWrapper::Write(const void *pvBuffer, return mFile->WriteProc(mFile, (const char *)pvBuffer, pSize, pCount); } -// ................................................................... +// ------------------------------------------------------------------------------------------------ aiReturn CIOStreamWrapper::Seek(size_t pOffset, aiOrigin pOrigin) { return mFile->SeekProc(mFile, pOffset, pOrigin); } -// ................................................................... +// ------------------------------------------------------------------------------------------------ size_t CIOStreamWrapper::Tell() const { return mFile->TellProc(mFile); } -// ................................................................... +// ------------------------------------------------------------------------------------------------ size_t CIOStreamWrapper::FileSize() const { return mFile->FileSizeProc(mFile); } -// ................................................................... +// ------------------------------------------------------------------------------------------------ void CIOStreamWrapper::Flush() { return mFile->FlushProc(mFile); } From 63dae0a7f24c0bc965f936e5b3b96b8d83a93e5f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 10 Mar 2023 08:48:11 +0100 Subject: [PATCH 124/232] Fix: Add security asserts. --- code/CApi/CInterfaceIOWrapper.h | 55 ++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/code/CApi/CInterfaceIOWrapper.h b/code/CApi/CInterfaceIOWrapper.h index 768be3746..28d4c3e75 100644 --- a/code/CApi/CInterfaceIOWrapper.h +++ b/code/CApi/CInterfaceIOWrapper.h @@ -47,48 +47,59 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include namespace Assimp { class CIOSystemWrapper; // ------------------------------------------------------------------------------------------------ -// Custom IOStream implementation for the C-API -class CIOStreamWrapper : public IOStream { +/// @brief Custom IOStream implementation for the C-API- +// ------------------------------------------------------------------------------------------------ +class CIOStreamWrapper final : public IOStream { public: - explicit CIOStreamWrapper(aiFile *pFile, CIOSystemWrapper *io) : - mFile(pFile), - mIO(io) {} - ~CIOStreamWrapper(void); - - size_t Read(void *pvBuffer, size_t pSize, size_t pCount); - size_t Write(const void *pvBuffer, size_t pSize, size_t pCount); - aiReturn Seek(size_t pOffset, aiOrigin pOrigin); - size_t Tell(void) const; - size_t FileSize() const; - void Flush(); + explicit CIOStreamWrapper(aiFile *pFile, CIOSystemWrapper *io); + ~CIOStreamWrapper() override; + size_t Read(void *pvBuffer, size_t pSize, size_t pCount) override; + size_t Write(const void *pvBuffer, size_t pSize, size_t pCount) override; + aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override; + size_t Tell(void) const override; + size_t FileSize() const override; + void Flush() override; private: aiFile *mFile; CIOSystemWrapper *mIO; }; -class CIOSystemWrapper : public IOSystem { +inline CIOStreamWrapper::CIOStreamWrapper(aiFile *pFile, CIOSystemWrapper *io) : + mFile(pFile), + mIO(io) { + ai_assert(io != nullptr); +} + +// ------------------------------------------------------------------------------------------------ +/// @brief Custom IO-System wrapper implementation for the C-API. +// ------------------------------------------------------------------------------------------------ +class CIOSystemWrapper final : public IOSystem { friend class CIOStreamWrapper; public: - explicit CIOSystemWrapper(aiFileIO *pFile) : - mFileSystem(pFile) {} - - bool Exists(const char *pFile) const; - char getOsSeparator() const; - IOStream *Open(const char *pFile, const char *pMode = "rb"); - void Close(IOStream *pFile); + explicit CIOSystemWrapper(aiFileIO *pFile); + ~CIOSystemWrapper() override = default; + bool Exists(const char *pFile) const override; + char getOsSeparator() const override; + IOStream *Open(const char *pFile, const char *pMode = "rb") override; + void Close(IOStream *pFile) override; private: aiFileIO *mFileSystem; }; +inline CIOSystemWrapper::CIOSystemWrapper(aiFileIO *pFile) : mFileSystem(pFile) { + ai_assert(pFile != nullptr); +} + } // namespace Assimp -#endif +#endif // AI_CIOSYSTEM_H_INCLUDED From 2f7882cb8d42e41d5330b154316da3d5617f5769 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 10 Mar 2023 08:49:58 +0100 Subject: [PATCH 125/232] Update: Small code cleanup --- code/CApi/AssimpCExport.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/CApi/AssimpCExport.cpp b/code/CApi/AssimpCExport.cpp index 5e43958d0..e3d85504d 100644 --- a/code/CApi/AssimpCExport.cpp +++ b/code/CApi/AssimpCExport.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -52,7 +50,7 @@ Assimp C export interface. See Exporter.cpp for some notes. #include #include -using namespace Assimp; +namespace Assimp { // ------------------------------------------------------------------------------------------------ ASSIMP_API size_t aiGetExportFormatCount(void) { @@ -141,4 +139,6 @@ ASSIMP_API C_STRUCT void aiReleaseExportBlob(const aiExportDataBlob *pData) { delete pData; } +} // namespace Assimp + #endif // !ASSIMP_BUILD_NO_EXPORT From ffd222334f647f8d65762343a9ebc4ff6247c272 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 10 Mar 2023 09:00:37 +0100 Subject: [PATCH 126/232] Fix: Remove buggy namespace declaration --- code/CApi/AssimpCExport.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/CApi/AssimpCExport.cpp b/code/CApi/AssimpCExport.cpp index e3d85504d..21e40205c 100644 --- a/code/CApi/AssimpCExport.cpp +++ b/code/CApi/AssimpCExport.cpp @@ -50,7 +50,7 @@ Assimp C export interface. See Exporter.cpp for some notes. #include #include -namespace Assimp { +using namespace Assimp; // ------------------------------------------------------------------------------------------------ ASSIMP_API size_t aiGetExportFormatCount(void) { @@ -139,6 +139,4 @@ ASSIMP_API C_STRUCT void aiReleaseExportBlob(const aiExportDataBlob *pData) { delete pData; } -} // namespace Assimp - #endif // !ASSIMP_BUILD_NO_EXPORT From 60cefdd54927e79515563907887a1d9813d0b9b3 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Fri, 10 Mar 2023 12:10:38 +0100 Subject: [PATCH 127/232] Jan's fedback --- code/AssetLib/glTF2/glTF2Asset.inl | 25 ++++++++++++++++++------- code/AssetLib/glTF2/glTF2Importer.cpp | 24 ++++++++++++------------ 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 4e4497e1f..b4ea77c79 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -981,18 +981,29 @@ size_t Accessor::ExtractData(T *&outData, const std::vector *remap } const size_t maxSize = GetMaxByteSize(); - if (usedCount * stride > maxSize) { - throw DeadlyImportError("GLTF: count*stride ", (usedCount * stride), " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); - } outData = new T[usedCount]; - if (remappingIndices == nullptr && stride == elemSize && targetElemSize == elemSize) { - memcpy(outData, data, totalSize); - } else { + + if (remappingIndices != nullptr) { + const unsigned int maxIndex = static_cast(maxSize / stride - 1); for (size_t i = 0; i < usedCount; ++i) { - size_t srcIdx = remappingIndices != nullptr ? static_cast((*remappingIndices)[i]) : i; + size_t srcIdx = (*remappingIndices)[i]; + if (srcIdx > maxIndex) { + throw DeadlyImportError("GLTF: index*stride ", (srcIdx * stride), " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); + } memcpy(outData + i, data + srcIdx * stride, elemSize); } + } else { // non-indexed cases + if (usedCount * stride > maxSize) { + throw DeadlyImportError("GLTF: count*stride ", (usedCount * stride), " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); + } + if (stride == elemSize && targetElemSize == elemSize) { + memcpy(outData, data, totalSize); + } else { + for (size_t i = 0; i < usedCount; ++i) { + memcpy(outData + i, data + i * stride, elemSize); + } + } } return usedCount; } diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index f0dc284c3..ed9b1ca85 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -454,7 +454,6 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { meshOffsets.clear(); - const unsigned int unusedIndex = ~0; std::vector usedVertexIndices; std::vector reverseMappingIndices; std::vector indexBuffer; @@ -470,14 +469,14 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { // extract used vertices: bool useIndexBuffer = prim.indices; - std::vector* usedVertexIndicesPtr = nullptr; + std::vector* vertexRemappingTable = nullptr; if (useIndexBuffer) { size_t count = prim.indices->count; indexBuffer.resize(count); usedVertexIndices.clear(); reverseMappingIndices.clear(); usedVertexIndices.reserve(count / 3); // this is a very rough heuristic to reduce re-allocations - usedVertexIndicesPtr = &usedVertexIndices; + vertexRemappingTable = &usedVertexIndices; Accessor::Indexer data = prim.indices->GetIndexer(); if (!data.IsValid()) { throw DeadlyImportError("GLTF: Invalid accessor without data in mesh ", getContextForErrorMessages(mesh.id, mesh.name)); @@ -485,6 +484,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { // Build the vertex remapping table and the modified index buffer (used later instead of the original one) // In case no index buffer is used, the original vertex arrays are being used so no remapping is required in the first place. + const unsigned int unusedIndex = ~0u; for (unsigned int i = 0; i < count; ++i) { unsigned int index = data.GetUInt(i); if (index >= reverseMappingIndices.size()) { @@ -532,14 +532,14 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { size_t numAllVertices = 0; if (!attr.position.empty() && attr.position[0]) { numAllVertices = attr.position[0]->count; - aim->mNumVertices = static_cast(attr.position[0]->ExtractData(aim->mVertices, usedVertexIndicesPtr)); + aim->mNumVertices = static_cast(attr.position[0]->ExtractData(aim->mVertices, vertexRemappingTable)); } if (!attr.normal.empty() && attr.normal[0]) { if (attr.normal[0]->count != numAllVertices) { DefaultLogger::get()->warn("Normal count in mesh \"", mesh.name, "\" does not match the vertex count, normals ignored."); } else { - attr.normal[0]->ExtractData(aim->mNormals, usedVertexIndicesPtr); + attr.normal[0]->ExtractData(aim->mNormals, vertexRemappingTable); // only extract tangents if normals are present if (!attr.tangent.empty() && attr.tangent[0]) { @@ -549,7 +549,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { // generate bitangents from normals and tangents according to spec Tangent *tangents = nullptr; - attr.tangent[0]->ExtractData(tangents, usedVertexIndicesPtr); + attr.tangent[0]->ExtractData(tangents, vertexRemappingTable); aim->mTangents = new aiVector3D[aim->mNumVertices]; aim->mBitangents = new aiVector3D[aim->mNumVertices]; @@ -574,7 +574,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { auto componentType = attr.color[c]->componentType; if (componentType == glTF2::ComponentType_FLOAT) { - attr.color[c]->ExtractData(aim->mColors[c], usedVertexIndicesPtr); + attr.color[c]->ExtractData(aim->mColors[c], vertexRemappingTable); } else { if (componentType == glTF2::ComponentType_UNSIGNED_BYTE) { aim->mColors[c] = GetVertexColorsForType(attr.color[c]); @@ -595,7 +595,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { continue; } - attr.texcoord[tc]->ExtractData(aim->mTextureCoords[tc], usedVertexIndicesPtr); + attr.texcoord[tc]->ExtractData(aim->mTextureCoords[tc], vertexRemappingTable); aim->mNumUVComponents[tc] = attr.texcoord[tc]->GetNumComponents(); aiVector3D *values = aim->mTextureCoords[tc]; @@ -624,7 +624,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_WARN("Positions of target ", i, " in mesh \"", mesh.name, "\" does not match the vertex count"); } else { aiVector3D *positionDiff = nullptr; - target.position[0]->ExtractData(positionDiff, usedVertexIndicesPtr); + target.position[0]->ExtractData(positionDiff, vertexRemappingTable); for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) { aiAnimMesh.mVertices[vertexId] += positionDiff[vertexId]; } @@ -636,7 +636,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_WARN("Normals of target ", i, " in mesh \"", mesh.name, "\" does not match the vertex count"); } else { aiVector3D *normalDiff = nullptr; - target.normal[0]->ExtractData(normalDiff, usedVertexIndicesPtr); + target.normal[0]->ExtractData(normalDiff, vertexRemappingTable); for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; vertexId++) { aiAnimMesh.mNormals[vertexId] += normalDiff[vertexId]; } @@ -651,10 +651,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_WARN("Tangents of target ", i, " in mesh \"", mesh.name, "\" does not match the vertex count"); } else { Tangent *tangent = nullptr; - attr.tangent[0]->ExtractData(tangent, usedVertexIndicesPtr); + attr.tangent[0]->ExtractData(tangent, vertexRemappingTable); aiVector3D *tangentDiff = nullptr; - target.tangent[0]->ExtractData(tangentDiff, usedVertexIndicesPtr); + target.tangent[0]->ExtractData(tangentDiff, vertexRemappingTable); for (unsigned int vertexId = 0; vertexId < aim->mNumVertices; ++vertexId) { tangent[vertexId].xyz += tangentDiff[vertexId]; From 8176c6a0e47c18317267b00e579cb0217fb2ccc3 Mon Sep 17 00:00:00 2001 From: Florian Born Date: Fri, 10 Mar 2023 18:36:43 +0100 Subject: [PATCH 128/232] Adjusting the unit tests to pass new gltf --- code/AssetLib/glTF2/glTF2Importer.cpp | 21 +++++++++++++++------ test/unit/utglTF2ImportExport.cpp | 14 +++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index ed9b1ca85..428763798 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -467,7 +467,15 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { for (unsigned int p = 0; p < mesh.primitives.size(); ++p) { Mesh::Primitive &prim = mesh.primitives[p]; - // extract used vertices: + Mesh::Primitive::Attributes &attr = prim.attributes; + + // Find out the maximum number of vertices: + size_t numAllVertices = 0; + if (!attr.position.empty() && attr.position[0]) { + numAllVertices = attr.position[0]->count; + } + + // Extract used vertices: bool useIndexBuffer = prim.indices; std::vector* vertexRemappingTable = nullptr; if (useIndexBuffer) { @@ -487,6 +495,11 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { const unsigned int unusedIndex = ~0u; for (unsigned int i = 0; i < count; ++i) { unsigned int index = data.GetUInt(i); + if (index >= numAllVertices) { + // Out-of-range indices will be filtered out when adding the faces and then lead to a warning. At this stage, we just keep them. + indexBuffer[i] = index; + continue; + } if (index >= reverseMappingIndices.size()) { reverseMappingIndices.resize(index + 1, unusedIndex); } @@ -527,12 +540,8 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { break; } - Mesh::Primitive::Attributes &attr = prim.attributes; - - size_t numAllVertices = 0; if (!attr.position.empty() && attr.position[0]) { - numAllVertices = attr.position[0]->count; - aim->mNumVertices = static_cast(attr.position[0]->ExtractData(aim->mVertices, vertexRemappingTable)); + aim->mNumVertices = static_cast(attr.position[0]->ExtractData(aim->mVertices, vertexRemappingTable)); } if (!attr.normal.empty() && attr.normal[0]) { diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index ef3fc4137..957a94b15 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -380,7 +380,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLines) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array l1 = { { 0u, 3u, 2u, 1u, 0u } }; + std::array l1 = { { 0u, 1u, 2u, 3u, 0u } }; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); @@ -394,7 +394,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineLoop) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array l1 = { { 0, 3u, 2u, 1u, 0u } }; + std::array l1 = { { 0, 1u, 2u, 3u, 0u } }; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); @@ -408,7 +408,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineStrip) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array l1 = { { 0u, 3u, 2u, 1u, 0u } }; + std::array l1 = { { 0u, 1u, 2u, 3u, 0u } }; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); @@ -423,13 +423,13 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesStrip) { EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array f1 = { { 0u, 3u, 1u } }; + std::array f1 = { { 0u, 1u, 2u } }; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = { { 1u, 3u, 2u } }; + std::array f2 = { { 2u, 1u, 3u } }; EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); @@ -443,13 +443,13 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFan) { EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); - std::array f1 = { { 0u, 3u, 2u } }; + std::array f1 = { { 0u, 1u, 2u } }; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = { { 0u, 2u, 1u } }; + std::array f2 = { { 0u, 2u, 3u } }; EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); From 4b4cb55f22c28af5637819d7b2a3ecffd48fc372 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Sat, 11 Mar 2023 16:25:04 -0500 Subject: [PATCH 129/232] Fix HL1MDLLoader flattened bone hierarchy. --- code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp | 43 ++++++++++++++++++--- code/AssetLib/MDL/HalfLife/HL1MDLLoader.h | 9 +++++ 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp index 93d37536c..237ccf3d8 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp @@ -472,12 +472,13 @@ void HL1MDLLoader::read_bones() { aiNode *bones_node = new aiNode(AI_MDL_HL1_NODE_BONES); rootnode_children_.push_back(bones_node); - bones_node->mNumChildren = static_cast(header_->numbones); - bones_node->mChildren = new aiNode *[bones_node->mNumChildren]; + + // Store roots bones IDs temporarily. + std::vector roots; // Create bone matrices in local space. for (int i = 0; i < header_->numbones; ++i) { - aiNode *bone_node = temp_bones_[i].node = bones_node->mChildren[i] = new aiNode(unique_bones_names[i]); + aiNode *bone_node = temp_bones_[i].node = new aiNode(unique_bones_names[i]); aiVector3D angles(pbone[i].value[3], pbone[i].value[4], pbone[i].value[5]); temp_bones_[i].absolute_transform = bone_node->mTransformation = @@ -485,9 +486,11 @@ void HL1MDLLoader::read_bones() { aiVector3D(pbone[i].value[0], pbone[i].value[1], pbone[i].value[2])); if (pbone[i].parent == -1) { - bone_node->mParent = scene_->mRootNode; + bone_node->mParent = bones_node; + roots.push_back(i); // This bone has no parent. Add it to the roots list. } else { - bone_node->mParent = bones_node->mChildren[pbone[i].parent]; + bone_node->mParent = temp_bones_[pbone[i].parent].node; + temp_bones_[pbone[i].parent].children.push_back(i); // Add this bone to the parent bone's children list. temp_bones_[i].absolute_transform = temp_bones_[pbone[i].parent].absolute_transform * bone_node->mTransformation; @@ -496,6 +499,36 @@ void HL1MDLLoader::read_bones() { temp_bones_[i].offset_matrix = temp_bones_[i].absolute_transform; temp_bones_[i].offset_matrix.Inverse(); } + + // Create the 'bones' root node that will contain all bone nodes. + bones_node->mNumChildren = static_cast(roots.size()); + bones_node->mChildren = new aiNode *[bones_node->mNumChildren]; + + // Build all bones children hierarchy starting from each root bone. + for (size_t i = 0; i < roots.size(); ++i) + { + const TempBone &root_bone = temp_bones_[roots[i]]; + bones_node->mChildren[i] = root_bone.node; + build_bone_children_hierarchy(root_bone); + } +} + +void HL1MDLLoader::build_bone_children_hierarchy(const TempBone &bone) +{ + if (bone.children.size() > 0) + { + aiNode* bone_node = bone.node; + bone_node->mNumChildren = static_cast(bone.children.size()); + bone_node->mChildren = new aiNode *[bone_node->mNumChildren]; + + // Build each child bone's hierarchy recursively. + for (size_t i = 0; i < bone.children.size(); ++i) + { + const TempBone &child_bone = temp_bones_[bone.children[i]]; + bone_node->mChildren[i] = child_bone.node; + build_bone_children_hierarchy(child_bone); + } + } } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h index 0dba5099d..3fc84c1be 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h @@ -143,6 +143,14 @@ private: */ static bool get_num_blend_controllers(const int num_blend_animations, int &num_blend_controllers); + /** + * \brief Build a bone's node children hierarchy. + * + * \param[in] bone The bone for which we must build all children hierarchy. + */ + struct TempBone; + void build_bone_children_hierarchy(const TempBone& bone); + /** Output scene to be filled */ aiScene *scene_; @@ -203,6 +211,7 @@ private: aiNode *node; aiMatrix4x4 absolute_transform; aiMatrix4x4 offset_matrix; + std::vector children; // Bone children }; std::vector temp_bones_; From 3c2a42586925115df891df4146181e8d08563e31 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Sat, 11 Mar 2023 20:46:42 -0500 Subject: [PATCH 130/232] Added a test to validate HL1 MDL bone hierarchy. --- test/models/MDL/MDL (HL1)/multiple_roots.mdl | Bin 0 -> 15372 bytes .../MDL/utMDLImporter_HL1_Nodes.cpp | 67 ++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 test/models/MDL/MDL (HL1)/multiple_roots.mdl diff --git a/test/models/MDL/MDL (HL1)/multiple_roots.mdl b/test/models/MDL/MDL (HL1)/multiple_roots.mdl new file mode 100644 index 0000000000000000000000000000000000000000..f8fc1eed708c8b3f95c5faf7c55e78cb07434771 GIT binary patch literal 15372 zcmeI2dz2LQmB;VAV0cOMRAa!xNq7pj!iYjo|0?kTL_|i6Z=t{$5_AxR0R*Cy7$d#_ zqY)p8R3aF&W{m-c5S-~MV>S#P8A~I&oDg1Z!g82*QH8nQOn!li-v1#!s^OrO=&s*5k zIBU^@1aKf^vSmea2j#MUbx{d)d)T_(HG{Ug__RoM?+M^mqU^~L5>@4l_`YdLbgu^*~+ zXrQC{rR(|HHwW8!+PwDn?~wI8{ZRP>xH3T<)bsy1>IPew&YH6 zRV)3zczAyNJL&M)L9d~4?rgr`9t`}Q(BkGL4f7WK_2TJzJ*D4W8|OAIYP|01BP{e0 zi>anRNaO*m!wu$!ULyLT+5vu`|A*5nldCGZ%95)*xhj&YOLA2wSGVNqo?JbWt7mc@ zlU%)$E0bJ(ldDg1bxp3`$#t;9w6n^}w706Nv^$RMfh+B>q9X0FOP93E>gu%5Zr##O zyLV4}?a?Fcwr9_@-(!wRJMPsh?KzW4yYAaJ?YmE(wDYcA)82b?gI)Kd-EBID?yo)C z2ChqRo%)J32DWkK#{MlvW9oN*&0_4M7N>lT>-dN(d)wcyjJJaGiGEIf#Toc_LkIAY~#vR&aHo{*WT*XPq5C*Vjb5pjqAAf z5bM;`Y3&4~Q)4yberjwF%2mIv`z7So*xUqDtENtI%1Vv7Z&T493 z>T6uN>Ob`0W$3K4eI{5rHlFe|u6*qy*3@-A(6jAR;~LYx6Kv=8?Cv$%Cu>{Nmf*bh ztvKZ;n7RjYb-&W}VZUn9J=MDDUMF>Z)zR}nU5hyn%Ji$>uA7j7M zXl{zNf5mD4igjFT>6p${=aAsM`ieD{<|tSF_C80-Pd{tQPjK#?`W^QCJUQu&Hn2U1 z;5zkHUt{VgIN|t4V{xvT_1?`lz2`^j=@#B=XM{#1@%>5W9lcEd(@J;{!dOa z8q?ea=asKG&QmpkA>--MEf7SjzIVt{|AztSgtER?N{R9`vCCeW} zepoIKYy)r8`x1EE{^`5&TVCjAuADJ4Y~(fSg?{0f3wIUXx^QGz^rhZp}xFK$c z=hx2Im46ma1LNQV*nkau13!eHN3(!th^EEf+wx<9N!3La%Z~K97&itU#x3HeC z?3fh3y>n7{GW_4&vo!y8@V;O4GxZym=7}5PhIrxi2bLDDqi)j=CxzfV*nkau13!dc zKr@eKh^E3VCEEZ@J;6 z0`ZWzA)asMwV2+rZ;dmhB`+0jq@Uq$j|<_4@I&}{Gz(~kXmXw$TUXE02c zAHomOG-!rs<|`*(YwK35*?v0M)&*~OzO%gTd3yfS!s+2MUUT4Aet&u0ec+4H+_`ai z9dSe45N~_;+soT-hclOPa2?oy4SWMXgx`i{9hxDUrklSfB$*k^zfSf)5F>1p4B`v=ai<04fJ!?bjsGy*w>^;-zWfXzKoO+^)9C z;QiG4{fJ#{#0_ynyl&;#U3Jf)zlU*f8`yvid;>p(Ux#KJnjxCzz0z;&d48YIZ~64s z?RhSfGitYdyKd(%Ik#_hsSm$VRUdwn+-`q#C+xuQi{?8yGl94vZiw%^sb%ucnat%_ zxZnw312*st{1E<5G$)`LqRD(uwClXTR8hOP^n1I`AC$(|p4elW=|}Eu-{_gYdt=Xh zH|qYh$F%U55BJO$soSgPw2*j#xFK#FUggxi7V z9;$Gk%nm-i{J8Dg?K+=PyM66|!RFWK|3_FI{<2UVzCzsx2Mi9^;Ga+Ynt_8gZipM= z=3!pF;cR9c9D)tlz&G$i_y)}o%@9pf5&S~;l+RPpQs#`b^Ti)~>N7M7GQXl@N ztUhdo|DA_NcgevZhL+}>&?`i%3Nj)7}!eO5I4kgf8IMF z*9*<};e%Vj25jIP_#ylpnyq@jLeuOit+Mld@3(JpfBv;%voD-dd(L~)!ztuG*Zc0) z(f#gj{daQLyf@t}F5acstOpa%DJC91$m?}DC;a}dRSmsu7W%v%Blov8yW3s?e+kX69k;uUxFK$c*FDvHcb)$3 z_$lMyHvN48Ht-Gn5Plt+ZD@vQno?<)t*dr_sboJ#rP9qU+qUJxm#JI!m&OnUX13@%KGpe zUPGz-=*ay~-$>oF(A*sDdz!c*Zir7j@#TFJ^{oDiy5Oh525jIP_#ym>Xg-Z*h^Bdq zb9~<*JSBq(Zug;iponh-Z0fR*jb>+7;h{)eYZav=U#RYgXWAl6>_v zUln@`4|c#k7*)ldL{zbx^u^1{G13R$f!Pn=kzPbpu^Oa`alRz^s(7pnw2J-Y6EKYQ zm*cHsANeF+meCWeVqY1A@5lf-&MIceRK+-7sHgd=cp@zA@dWu4?*^S3{4Bad@v<^l zK8^3dABOLsdlG&I-68myBwvzzRU9TGtzwOgfnm@cZ54;0riw%56svfWoQm(Df3j6{ zWE6fT$rt+2d{sO}I40mxat7}PzCL5l$_SZ&mxXsGzC+!K_zv~-nRiBpOD%pT$(JNw z6~~Kyu{JVRKFhm7|1(zcR5=?jOa56_@iaLH-$BR4&oH9wOp-52zA74-48zdDRLjZ9 zdH7j6n}(mI-ud_r9bbU&NS%DnDxM)z@b!FXz9jjoI7u$VH*|6_?}pAkkDsN}OYyRD zu3UoeFoVnR9Xh=TKSQT8@H0uiB>Ad%fm~@7&l3-Zq0?Dbaf-~r%hKs=tN1y&8sDMg znO1SKT!o)W^7(gho3DzO$Xu&9L#}~g=wO~ztd}OdES+C#6)%+e_zpApqE(zOU%<~K z`9jBAeiK)!4huaz}040FBB zD$bKT@Un89+-?=Gkvs7n=Kd9{_(i!DKa=DOYoqz9xJ=e!4Rie}?}oYGgP&zi_u*xk z`@Q%MbNw2=!y2r|&#+eO@H0uiB>Aei%06W_%;D=W40C$eDlV5t@UpDMH>~0c*@*A3 zCJ$M~8{|R!Op?!Y7@Mz(x5>9)7`a6r zX7t5ZjXqc%$=G+poxFd-7|7jT83XuHjs93=9*d1NKEd5w8OLLFW!nj+~5D<|){iahl{T<5aAUWUK7-W}7pvoEVPnR*Qg0dOV0Gkd ztTHEIW5(y?a?6;4)se|qWuAwP8Pm9*X&>ifbz~}5nHOMV#)aJ1lu?h>k?B}v&cMcu zi@CEYtFSt9C03cUurXtf++Z2A zu{z>mm3cKbX3Ul4meGjSkp`?XzkrPy*T`zin1|JoFJhH>EjDIc$6ZAGn2*(wCaf|S zU}MH2?k38(9;+h@vC3SGjTuY1pD1GqR!5q#%3Owx87sJ7C}TNRM{d9>b0s!r+{7J2 z88>2e07%~&1rvC6y!8#BHl-?WTdu{!c)tTJ!I#*91UA1vc`td6X~ zD)UZk%vdW=SjOF09k~mu%yrn9@m1Mo8TVjyWIa}y_hMtl{nBC?U&HFieOP5~z$!!J z{MpToi{{O48Z&2p`j6d2kM44z>r4MXLcKof|Bva6cdkI^3UsbO=L&SLK<5f{u0ZDs zbgn?>3UsbO=L&SLK<5hl|5*VZ0r>XiTjS&Te#G^!(PPiO>pJ2&;yV&J5;;6&^G>p17WPp7@>wobgASO zUBBoCMK>zC#iA>^y2$ySE{`ARr2V4!teWF!ZO`$2#}6Doa{Qv>i_S(H^0XZ)Qv^Mq z^>sY$((`=Z^8?S1Jiq86Nj5}cdIi28`F_#&*$F4`nU6;(@PojQ0>2peY>yN9OwxlF z`9b7Ikzb5__RJ~z%-kcn=m$kVD*DBuFM2MR9=i>RJ!HGs8Qn$4(Y5d#RScXca-yQc z=CBXCK%T2*0$m> Hierarchy; + public: /** * @note The following tests require a basic understanding @@ -63,6 +69,49 @@ public: * (Valve Developer Community). */ + // Given a model, verify that the bones nodes hierarchy is correctly formed. + void checkBoneHierarchy() { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "multiple_roots.mdl", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mRootNode); + + const aiNode* node_MDL_root = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_ROOT); + ASSERT_NE(nullptr, node_MDL_root); + + const aiNode *node_MDL_bones = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BONES); + ASSERT_NE(nullptr, node_MDL_bones); + ASSERT_NE(nullptr, node_MDL_bones->mParent); + ASSERT_EQ(node_MDL_root, node_MDL_bones->mParent); + + const Hierarchy expected_hierarchy = { + { 0, AI_MDL_HL1_NODE_BONES }, + { 1, "root1_bone1" }, + { 2, "root1_bone2" }, + { 3, "root1_bone4" }, + { 3, "root1_bone5" }, + { 2, "root1_bone3" }, + { 3, "root1_bone6" }, + { 1, "root2_bone1" }, + { 2, "root2_bone2" }, + { 2, "root2_bone3" }, + { 3, "root2_bone5" }, + { 2, "root2_bone4" }, + { 3, "root2_bone6" }, + { 1, "root3_bone1" }, + { 2, "root3_bone2" }, + { 2, "root3_bone3" }, + { 2, "root3_bone4" }, + { 3, "root3_bone5" }, + { 4, "root3_bone6" }, + { 4, "root3_bone7" }, + }; + + Hierarchy actual_hierarchy; + flatten_hierarchy(node_MDL_bones, actual_hierarchy); + ASSERT_EQ(expected_hierarchy, actual_hierarchy); + } + /* Given a model with bones that have empty names, verify that all the bones of the imported model have unique and no empty names. @@ -416,8 +465,26 @@ private: EXPECT_NEAR(expected[i][j], actual[i][j], abs_error); } } + + void flatten_hierarchy(const aiNode *node, Hierarchy &hierarchy) + { + flatten_hierarchy(node, hierarchy, 0); + } + + void flatten_hierarchy(const aiNode *node, Hierarchy &hierarchy, unsigned int level) + { + hierarchy.push_back({ level, node->mName.C_Str() }); + for (size_t i = 0; i < node->mNumChildren; ++i) + { + flatten_hierarchy(node->mChildren[i], hierarchy, level + 1); + } + } }; +TEST_F(utMDLImporter_HL1_Nodes, checkBoneHierarchy) { + checkBoneHierarchy(); +} + TEST_F(utMDLImporter_HL1_Nodes, emptyBonesNames) { emptyBonesNames(); } From d500f604903d982c321851d3f108098ab8ff2608 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Sat, 11 Mar 2023 20:48:17 -0500 Subject: [PATCH 131/232] Adjust emptyBonesNames test. --- .../ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp index d2984477b..c94fa3f3f 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp @@ -143,7 +143,9 @@ public: "Bone_7" }; - expect_named_children(scene, AI_MDL_HL1_NODE_BONES, expected_bones_names); + std::vector actual_bones_names; + get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BONES), actual_bones_names); + ASSERT_EQ(expected_bones_names, actual_bones_names); } /* Given a model with bodyparts that have empty names, @@ -479,6 +481,15 @@ private: flatten_hierarchy(node->mChildren[i], hierarchy, level + 1); } } + + void get_node_children_names(const aiNode *node, std::vector &names) + { + for (size_t i = 0; i < node->mNumChildren; ++i) + { + names.push_back(node->mChildren[i]->mName.C_Str()); + get_node_children_names(node->mChildren[i], names); + } + } }; TEST_F(utMDLImporter_HL1_Nodes, checkBoneHierarchy) { From 7bc4c12956a60e563df7cd08b8677f7b8ef8c355 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Sat, 11 Mar 2023 22:03:29 -0500 Subject: [PATCH 132/232] Simplified HL1 MDL nodes tests. --- .../MDL/utMDLImporter_HL1_Nodes.cpp | 98 ++++++++++++------- 1 file changed, 63 insertions(+), 35 deletions(-) diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp index c94fa3f3f..af6512c87 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp @@ -61,6 +61,11 @@ class utMDLImporter_HL1_Nodes : public ::testing::Test { */ typedef std::vector> Hierarchy; + /** + * @note A vector of strings. Used for symplifying syntax. + */ + typedef std::vector StringVector; + public: /** * @note The following tests require a basic understanding @@ -131,7 +136,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_bones.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector expected_bones_names = { + const StringVector expected_bones_names = { "Bone", "Bone_0", "Bone_1", @@ -143,7 +148,7 @@ public: "Bone_7" }; - std::vector actual_bones_names; + StringVector actual_bones_names; get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BONES), actual_bones_names); ASSERT_EQ(expected_bones_names, actual_bones_names); } @@ -167,7 +172,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_bodyparts.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector expected_bodyparts_names = { + const StringVector expected_bodyparts_names = { "Bodypart", "Bodypart_1", "Bodypart_5", @@ -179,7 +184,10 @@ public: "Bodypart_7" }; - expect_named_children(scene, AI_MDL_HL1_NODE_BODYPARTS, expected_bodyparts_names); + StringVector actual_bodyparts_names; + // Get the bodyparts names "without" the submodels. + get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BODYPARTS), actual_bodyparts_names, 0); + ASSERT_EQ(expected_bodyparts_names, actual_bodyparts_names); } /* Given a model with bodyparts that have duplicate names, @@ -201,7 +209,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_bodyparts.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector expected_bodyparts_names = { + const StringVector expected_bodyparts_names = { "Bodypart", "Bodypart_1", "Bodypart_2", @@ -213,7 +221,10 @@ public: "Bodypart_4" }; - expect_named_children(scene, AI_MDL_HL1_NODE_BODYPARTS, expected_bodyparts_names); + StringVector actual_bodyparts_names; + // Get the bodyparts names "without" the submodels. + get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BODYPARTS), actual_bodyparts_names, 0); + ASSERT_EQ(expected_bodyparts_names, actual_bodyparts_names); } /* Given a model with several bodyparts that contains multiple @@ -243,7 +254,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_submodels.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector> expected_bodypart_sub_models_names = { + const std::vector expected_bodypart_sub_models_names = { { "triangle", "triangle_0", @@ -261,9 +272,13 @@ public: const aiNode *bodyparts_node = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BODYPARTS); EXPECT_NE(nullptr, bodyparts_node); EXPECT_EQ(3u, bodyparts_node->mNumChildren); - for (unsigned int i = 0; i < bodyparts_node->mNumChildren; ++i) { - expect_named_children(bodyparts_node->mChildren[i], - expected_bodypart_sub_models_names[i]); + + StringVector actual_submodels_names; + for (unsigned int i = 0; i < bodyparts_node->mNumChildren; ++i) + { + actual_submodels_names.clear(); + get_node_children_names(bodyparts_node->mChildren[i], actual_submodels_names); + ASSERT_EQ(expected_bodypart_sub_models_names[i], actual_submodels_names); } } @@ -286,7 +301,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_sequences.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector expected_sequence_names = { + const StringVector expected_sequence_names = { "idle_1", "idle", "idle_2", @@ -298,7 +313,9 @@ public: "idle_7" }; - expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_INFOS, expected_sequence_names); + StringVector actual_sequence_names; + get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_INFOS), actual_sequence_names); + ASSERT_EQ(expected_sequence_names, actual_sequence_names); } /* Given a model with sequences that have empty names, verify @@ -320,7 +337,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_sequences.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector expected_sequence_names = { + const StringVector expected_sequence_names = { "Sequence", "Sequence_1", "Sequence_0", @@ -332,7 +349,9 @@ public: "Sequence_6" }; - expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_INFOS, expected_sequence_names); + StringVector actual_sequence_names; + get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_INFOS), actual_sequence_names); + ASSERT_EQ(expected_sequence_names, actual_sequence_names); } /* Given a model with sequence groups that have duplicate names, @@ -355,7 +374,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_sequence_groups/duplicate_sequence_groups.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector expected_sequence_names = { + const StringVector expected_sequence_names = { "default", "SequenceGroup", "SequenceGroup_1", @@ -368,7 +387,9 @@ public: "SequenceGroup_2" }; - expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_GROUPS, expected_sequence_names); + StringVector actual_sequence_names; + get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_GROUPS), actual_sequence_names); + ASSERT_EQ(expected_sequence_names, actual_sequence_names); } /* Given a model with sequence groups that have empty names, @@ -391,7 +412,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_sequence_groups/unnamed_sequence_groups.mdl", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - const std::vector expected_sequence_names = { + const StringVector expected_sequence_names = { "default", "SequenceGroup", "SequenceGroup_2", @@ -404,7 +425,9 @@ public: "SequenceGroup_4" }; - expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_GROUPS, expected_sequence_names); + StringVector actual_sequence_names; + get_node_children_names(scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_GROUPS), actual_sequence_names); + ASSERT_EQ(expected_sequence_names, actual_sequence_names); } /* Verify that mOffsetMatrix applies the correct @@ -449,18 +472,6 @@ public: } private: - void expect_named_children(const aiNode *parent_node, const std::vector &expected_names) { - EXPECT_NE(nullptr, parent_node); - EXPECT_EQ(expected_names.size(), parent_node->mNumChildren); - - for (unsigned int i = 0; i < parent_node->mNumChildren; ++i) - EXPECT_EQ(expected_names[i], parent_node->mChildren[i]->mName.C_Str()); - } - - void expect_named_children(const aiScene *scene, const char *node_name, const std::vector &expected_names) { - expect_named_children(scene->mRootNode->FindNode(node_name), expected_names); - } - void expect_equal_matrices(const aiMatrix4x4 &expected, const aiMatrix4x4 &actual, float abs_error) { for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) @@ -468,26 +479,43 @@ private: } } + /** Get a flattened representation of a node's hierarchy. + * \param[in] node The node. + * \param[out] hierarchy The flattened node's hierarchy. + */ void flatten_hierarchy(const aiNode *node, Hierarchy &hierarchy) { - flatten_hierarchy(node, hierarchy, 0); + flatten_hierarchy_impl(node, hierarchy, 0); } - void flatten_hierarchy(const aiNode *node, Hierarchy &hierarchy, unsigned int level) + void flatten_hierarchy_impl(const aiNode *node, Hierarchy &hierarchy, unsigned int level) { hierarchy.push_back({ level, node->mName.C_Str() }); for (size_t i = 0; i < node->mNumChildren; ++i) { - flatten_hierarchy(node->mChildren[i], hierarchy, level + 1); + flatten_hierarchy_impl(node->mChildren[i], hierarchy, level + 1); } } - void get_node_children_names(const aiNode *node, std::vector &names) + /** Get all node's children names beneath max_level. + * \param[in] node The parent node from which to get all children names. + * \param[out] names The list of children names. + * \param[in] max_level If set to -1, all children names will be collected. + */ + void get_node_children_names(const aiNode *node, StringVector &names, const int max_level = -1) + { + get_node_children_names_impl(node, names, 0, max_level); + } + + void get_node_children_names_impl(const aiNode *node, StringVector &names, int level, const int max_level = -1) { for (size_t i = 0; i < node->mNumChildren; ++i) { names.push_back(node->mChildren[i]->mName.C_Str()); - get_node_children_names(node->mChildren[i], names); + if (max_level == -1 || level < max_level) + { + get_node_children_names_impl(node->mChildren[i], names, level + 1, max_level); + } } } }; From 054dacd0687cb2c2bca6fe14b61b8063ec7ba6ac Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Sat, 11 Mar 2023 22:32:48 -0500 Subject: [PATCH 133/232] Improved comments. --- code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp | 5 +++-- test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp index 237ccf3d8..f3a383e8e 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp @@ -470,6 +470,7 @@ void HL1MDLLoader::read_bones() { temp_bones_.resize(header_->numbones); + // Create the main 'bones' node that will contain all MDL root bones. aiNode *bones_node = new aiNode(AI_MDL_HL1_NODE_BONES); rootnode_children_.push_back(bones_node); @@ -500,11 +501,11 @@ void HL1MDLLoader::read_bones() { temp_bones_[i].offset_matrix.Inverse(); } - // Create the 'bones' root node that will contain all bone nodes. + // Allocate memory for each MDL root bone. bones_node->mNumChildren = static_cast(roots.size()); bones_node->mChildren = new aiNode *[bones_node->mNumChildren]; - // Build all bones children hierarchy starting from each root bone. + // Build all bones children hierarchy starting from each MDL root bone. for (size_t i = 0; i < roots.size(); ++i) { const TempBone &root_bone = temp_bones_[roots[i]]; diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp index af6512c87..5a258d0a4 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp @@ -81,6 +81,7 @@ public: ASSERT_NE(nullptr, scene); ASSERT_NE(nullptr, scene->mRootNode); + // First, check that "" and "" are linked. const aiNode* node_MDL_root = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_ROOT); ASSERT_NE(nullptr, node_MDL_root); @@ -89,6 +90,7 @@ public: ASSERT_NE(nullptr, node_MDL_bones->mParent); ASSERT_EQ(node_MDL_root, node_MDL_bones->mParent); + // Second, verify "" hierarchy. const Hierarchy expected_hierarchy = { { 0, AI_MDL_HL1_NODE_BONES }, { 1, "root1_bone1" }, From 4c015077b840ddf87d42e70300f51161cd77c415 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Sun, 12 Mar 2023 13:26:50 -0400 Subject: [PATCH 134/232] Add missing member initializer. --- code/AssetLib/MDL/HalfLife/HL1MDLLoader.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h index 3fc84c1be..286b6e64c 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h @@ -206,7 +206,8 @@ private: TempBone() : node(nullptr), absolute_transform(), - offset_matrix() {} + offset_matrix(), + children() {} aiNode *node; aiMatrix4x4 absolute_transform; From 25ab05eb49c901b54b8f8695dbcc05ab1376ac09 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Tue, 14 Mar 2023 09:17:39 -0400 Subject: [PATCH 135/232] Replace typedef by using. --- test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp index 5a258d0a4..712f4da11 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp @@ -59,12 +59,12 @@ class utMDLImporter_HL1_Nodes : public ::testing::Test { * @note Represents a flattened node hierarchy where each item is a pair * containing the node level and it's name. */ - typedef std::vector> Hierarchy; + using Hierarchy = std::vector>; /** * @note A vector of strings. Used for symplifying syntax. */ - typedef std::vector StringVector; + using StringVector = std::vector; public: /** From eb3b48e5239fc0dfab9d97ec2224aa65e1712dad Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Tue, 14 Mar 2023 09:21:45 -0400 Subject: [PATCH 136/232] Invert logic in build_bone_children_hierarchy. --- code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp index f3a383e8e..a8141fcc1 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp @@ -516,19 +516,19 @@ void HL1MDLLoader::read_bones() { void HL1MDLLoader::build_bone_children_hierarchy(const TempBone &bone) { - if (bone.children.size() > 0) - { - aiNode* bone_node = bone.node; - bone_node->mNumChildren = static_cast(bone.children.size()); - bone_node->mChildren = new aiNode *[bone_node->mNumChildren]; + if (bone.children.empty()) + return; - // Build each child bone's hierarchy recursively. - for (size_t i = 0; i < bone.children.size(); ++i) - { - const TempBone &child_bone = temp_bones_[bone.children[i]]; - bone_node->mChildren[i] = child_bone.node; - build_bone_children_hierarchy(child_bone); - } + aiNode* bone_node = bone.node; + bone_node->mNumChildren = static_cast(bone.children.size()); + bone_node->mChildren = new aiNode *[bone_node->mNumChildren]; + + // Build each child bone's hierarchy recursively. + for (size_t i = 0; i < bone.children.size(); ++i) + { + const TempBone &child_bone = temp_bones_[bone.children[i]]; + bone_node->mChildren[i] = child_bone.node; + build_bone_children_hierarchy(child_bone); } } From 2acfc125c3dfc295136b81050425ac3e23d37654 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 14 Mar 2023 20:03:14 +0100 Subject: [PATCH 137/232] Refactoring: Make GeoUtils reusable --- code/CMakeLists.txt | 7 ++++ code/Common/Subdivision.cpp | 1 + code/Geometry/GeometryUtils.cpp | 40 +++++++++++++++++++ code/Geometry/GeometryUtils.h | 13 ++++++ code/PostProcessing/FindDegenerates.cpp | 38 +----------------- code/PostProcessing/FindDegenerates.h | 14 +++---- code/PostProcessing/FindInstancesProcess.cpp | 4 -- code/PostProcessing/FindInstancesProcess.h | 10 ++--- .../PostProcessing/FindInvalidDataProcess.cpp | 4 -- code/PostProcessing/FindInvalidDataProcess.h | 2 +- code/PostProcessing/FixNormalsStep.cpp | 15 +------ code/PostProcessing/FixNormalsStep.h | 7 ++-- .../GenBoundingBoxesProcess.cpp | 4 -- code/PostProcessing/GenBoundingBoxesProcess.h | 11 ++--- code/PostProcessing/GenFaceNormalsProcess.cpp | 8 ---- code/PostProcessing/GenFaceNormalsProcess.h | 17 ++++---- .../GenVertexNormalsProcess.cpp | 13 +++--- code/PostProcessing/GenVertexNormalsProcess.h | 2 +- 18 files changed, 96 insertions(+), 114 deletions(-) create mode 100644 code/Geometry/GeometryUtils.cpp create mode 100644 code/Geometry/GeometryUtils.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index a098f3e85..ba5415fe0 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -218,6 +218,12 @@ SET( CApi_SRCS ) SOURCE_GROUP(CApi FILES ${CApi_SRCS}) +SET(Geometry_SRCS + Geometry/GeometryUtils.h + Geometry/GeometryUtils.cpp +) +SOURCE_GROUP(Geometry FILES ${Geometry_SRCS}) + SET( STEPParser_SRCS AssetLib/STEPParser/STEPFileReader.h AssetLib/STEPParser/STEPFileReader.cpp @@ -1129,6 +1135,7 @@ SET( assimp_src ${Core_SRCS} ${CApi_SRCS} ${Common_SRCS} + ${Geometry_SRCS} ${Logging_SRCS} ${Exporter_SRCS} ${PostProcessing_SRCS} diff --git a/code/Common/Subdivision.cpp b/code/Common/Subdivision.cpp index ac4078b47..3aea5d4c5 100644 --- a/code/Common/Subdivision.cpp +++ b/code/Common/Subdivision.cpp @@ -53,6 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include using namespace Assimp; + void mydummy() {} #ifdef _MSC_VER diff --git a/code/Geometry/GeometryUtils.cpp b/code/Geometry/GeometryUtils.cpp new file mode 100644 index 000000000..9b29af1dd --- /dev/null +++ b/code/Geometry/GeometryUtils.cpp @@ -0,0 +1,40 @@ +#include "GeometryUtils.h" + +#include + +namespace Assimp { + +ai_real GeometryUtils::heron( ai_real a, ai_real b, ai_real c ) { + ai_real s = (a + b + c) / 2; + ai_real area = pow((s * ( s - a ) * ( s - b ) * ( s - c ) ), (ai_real)0.5 ); + return area; +} + +ai_real GeometryUtils::distance3D( const aiVector3D &vA, aiVector3D &vB ) { + const ai_real lx = ( vB.x - vA.x ); + const ai_real ly = ( vB.y - vA.y ); + const ai_real lz = ( vB.z - vA.z ); + ai_real a = lx*lx + ly*ly + lz*lz; + ai_real d = pow( a, (ai_real)0.5 ); + + return d; +} + + + +ai_real GeometryUtils::calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh ) { + ai_real area = 0; + + aiVector3D vA( mesh->mVertices[ face.mIndices[ 0 ] ] ); + aiVector3D vB( mesh->mVertices[ face.mIndices[ 1 ] ] ); + aiVector3D vC( mesh->mVertices[ face.mIndices[ 2 ] ] ); + + ai_real a( distance3D( vA, vB ) ); + ai_real b( distance3D( vB, vC ) ); + ai_real c( distance3D( vC, vA ) ); + area = heron( a, b, c ); + + return area; +} + +} // namespace Assimp diff --git a/code/Geometry/GeometryUtils.h b/code/Geometry/GeometryUtils.h new file mode 100644 index 000000000..2eb96926d --- /dev/null +++ b/code/Geometry/GeometryUtils.h @@ -0,0 +1,13 @@ +#include +#include + +namespace Assimp { + +class GeometryUtils { +public: + static ai_real heron( ai_real a, ai_real b, ai_real c ); + static ai_real distance3D( const aiVector3D &vA, aiVector3D &vB ); + static ai_real calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh ); +}; + +} // namespace Assimp diff --git a/code/PostProcessing/FindDegenerates.cpp b/code/PostProcessing/FindDegenerates.cpp index 344979949..5874c17d2 100644 --- a/code/PostProcessing/FindDegenerates.cpp +++ b/code/PostProcessing/FindDegenerates.cpp @@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "ProcessHelper.h" #include "FindDegenerates.h" +#include "Geometry/GeometryUtils.h" #include @@ -63,10 +64,6 @@ FindDegeneratesProcess::FindDegeneratesProcess() : // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -FindDegeneratesProcess::~FindDegeneratesProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool FindDegeneratesProcess::IsActive( unsigned int pFlags) const { @@ -132,37 +129,6 @@ static void updateSceneGraph(aiNode* pNode, const std::unordered_mapmVertices[ face.mIndices[ 0 ] ] ); - aiVector3D vB( mesh->mVertices[ face.mIndices[ 1 ] ] ); - aiVector3D vC( mesh->mVertices[ face.mIndices[ 2 ] ] ); - - ai_real a( distance3D( vA, vB ) ); - ai_real b( distance3D( vB, vC ) ); - ai_real c( distance3D( vC, vA ) ); - area = heron( a, b, c ); - - return area; -} - // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported mesh bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { @@ -218,7 +184,7 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { if ( mConfigCheckAreaOfTriangle ) { if ( face.mNumIndices == 3 ) { - ai_real area = calculateAreaOfTriangle( face, mesh ); + ai_real area = GeometryUtils::calculateAreaOfTriangle( face, mesh ); if (area < ai_epsilon) { if ( mConfigRemoveDegenerates ) { remove_me[ a ] = true; diff --git a/code/PostProcessing/FindDegenerates.h b/code/PostProcessing/FindDegenerates.h index 6fe1e929b..55a9dd981 100644 --- a/code/PostProcessing/FindDegenerates.h +++ b/code/PostProcessing/FindDegenerates.h @@ -59,7 +59,7 @@ namespace Assimp { class ASSIMP_API FindDegeneratesProcess : public BaseProcess { public: FindDegeneratesProcess(); - ~FindDegeneratesProcess(); + ~FindDegeneratesProcess() = default; // ------------------------------------------------------------------- // Check whether step is active @@ -105,23 +105,19 @@ private: bool mConfigCheckAreaOfTriangle; }; -inline -void FindDegeneratesProcess::EnableInstantRemoval(bool enabled) { +inline void FindDegeneratesProcess::EnableInstantRemoval(bool enabled) { mConfigRemoveDegenerates = enabled; } -inline -bool FindDegeneratesProcess::IsInstantRemoval() const { +inline bool FindDegeneratesProcess::IsInstantRemoval() const { return mConfigRemoveDegenerates; } -inline -void FindDegeneratesProcess::EnableAreaCheck( bool enabled ) { +inline void FindDegeneratesProcess::EnableAreaCheck( bool enabled ) { mConfigCheckAreaOfTriangle = enabled; } -inline -bool FindDegeneratesProcess::isAreaCheckEnabled() const { +inline bool FindDegeneratesProcess::isAreaCheckEnabled() const { return mConfigCheckAreaOfTriangle; } diff --git a/code/PostProcessing/FindInstancesProcess.cpp b/code/PostProcessing/FindInstancesProcess.cpp index 07a0f66db..55974b1c3 100644 --- a/code/PostProcessing/FindInstancesProcess.cpp +++ b/code/PostProcessing/FindInstancesProcess.cpp @@ -58,10 +58,6 @@ FindInstancesProcess::FindInstancesProcess() : configSpeedFlag (false) {} -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -FindInstancesProcess::~FindInstancesProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool FindInstancesProcess::IsActive( unsigned int pFlags) const diff --git a/code/PostProcessing/FindInstancesProcess.h b/code/PostProcessing/FindInstancesProcess.h index b501d88d5..d1daeb1f4 100644 --- a/code/PostProcessing/FindInstancesProcess.h +++ b/code/PostProcessing/FindInstancesProcess.h @@ -107,14 +107,11 @@ inline bool CompareArrays(const aiColor4D* first, const aiColor4D* second, // --------------------------------------------------------------------------- /** @brief A post-processing steps to search for instanced meshes */ -class FindInstancesProcess : public BaseProcess -{ +class FindInstancesProcess : public BaseProcess { public: - FindInstancesProcess(); - ~FindInstancesProcess(); + ~FindInstancesProcess() = default; -public: // ------------------------------------------------------------------- // Check whether step is active in given flags combination bool IsActive( unsigned int pFlags) const; @@ -128,10 +125,9 @@ public: void SetupProperties(const Importer* pImp); private: - bool configSpeedFlag; - }; // ! end class FindInstancesProcess + } // ! end namespace Assimp #endif // !! AI_FINDINSTANCES_H_INC diff --git a/code/PostProcessing/FindInvalidDataProcess.cpp b/code/PostProcessing/FindInvalidDataProcess.cpp index c65208cbd..bb8e365a1 100644 --- a/code/PostProcessing/FindInvalidDataProcess.cpp +++ b/code/PostProcessing/FindInvalidDataProcess.cpp @@ -60,10 +60,6 @@ FindInvalidDataProcess::FindInvalidDataProcess() : // nothing to do here } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -FindInvalidDataProcess::~FindInvalidDataProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool FindInvalidDataProcess::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/FindInvalidDataProcess.h b/code/PostProcessing/FindInvalidDataProcess.h index 5ea895c59..c5c7067a6 100644 --- a/code/PostProcessing/FindInvalidDataProcess.h +++ b/code/PostProcessing/FindInvalidDataProcess.h @@ -65,7 +65,7 @@ namespace Assimp { class ASSIMP_API FindInvalidDataProcess : public BaseProcess { public: FindInvalidDataProcess(); - ~FindInvalidDataProcess(); + ~FindInvalidDataProcess() = default; // ------------------------------------------------------------------- // diff --git a/code/PostProcessing/FixNormalsStep.cpp b/code/PostProcessing/FixNormalsStep.cpp index 3791bd35a..54ac05cc8 100644 --- a/code/PostProcessing/FixNormalsStep.cpp +++ b/code/PostProcessing/FixNormalsStep.cpp @@ -56,26 +56,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; - -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -FixInfacingNormalsProcess::FixInfacingNormalsProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -FixInfacingNormalsProcess::~FixInfacingNormalsProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool FixInfacingNormalsProcess::IsActive( unsigned int pFlags) const -{ +bool FixInfacingNormalsProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_FixInfacingNormals) != 0; } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void FixInfacingNormalsProcess::Execute( aiScene* pScene) -{ +void FixInfacingNormalsProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("FixInfacingNormalsProcess begin"); bool bHas( false ); diff --git a/code/PostProcessing/FixNormalsStep.h b/code/PostProcessing/FixNormalsStep.h index b7d3ba386..ec546c987 100644 --- a/code/PostProcessing/FixNormalsStep.h +++ b/code/PostProcessing/FixNormalsStep.h @@ -49,8 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. struct aiMesh; -namespace Assimp -{ +namespace Assimp { // --------------------------------------------------------------------------- /** The FixInfacingNormalsProcess tries to determine whether the normal @@ -59,8 +58,8 @@ namespace Assimp */ class FixInfacingNormalsProcess : public BaseProcess { public: - FixInfacingNormalsProcess(); - ~FixInfacingNormalsProcess(); + FixInfacingNormalsProcess() = default; + ~FixInfacingNormalsProcess() = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/GenBoundingBoxesProcess.cpp b/code/PostProcessing/GenBoundingBoxesProcess.cpp index 52a0861e5..ca8e4d6d0 100644 --- a/code/PostProcessing/GenBoundingBoxesProcess.cpp +++ b/code/PostProcessing/GenBoundingBoxesProcess.cpp @@ -48,10 +48,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { -GenBoundingBoxesProcess::GenBoundingBoxesProcess() = default; - -GenBoundingBoxesProcess::~GenBoundingBoxesProcess() = default; - bool GenBoundingBoxesProcess::IsActive(unsigned int pFlags) const { return 0 != ( pFlags & aiProcess_GenBoundingBoxes ); } diff --git a/code/PostProcessing/GenBoundingBoxesProcess.h b/code/PostProcessing/GenBoundingBoxesProcess.h index 0b7591b6d..a880a0638 100644 --- a/code/PostProcessing/GenBoundingBoxesProcess.h +++ b/code/PostProcessing/GenBoundingBoxesProcess.h @@ -19,7 +19,7 @@ conditions are met: copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - +s * 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 @@ -54,15 +54,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { -/** Post-processing process to find axis-aligned bounding volumes for amm meshes - * used in a scene +/** + * @brief Post-processing process to find axis-aligned bounding volumes for amm meshes + * used in a scene. */ class ASSIMP_API GenBoundingBoxesProcess : public BaseProcess { public: /// The class constructor. - GenBoundingBoxesProcess(); + GenBoundingBoxesProcess() = default; /// The class destructor. - ~GenBoundingBoxesProcess(); + ~GenBoundingBoxesProcess() = default; /// Will return true, if aiProcess_GenBoundingBoxes is defined. bool IsActive(unsigned int pFlags) const override; /// The execution callback. diff --git a/code/PostProcessing/GenFaceNormalsProcess.cpp b/code/PostProcessing/GenFaceNormalsProcess.cpp index d3520d4b2..1d259ce22 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.cpp +++ b/code/PostProcessing/GenFaceNormalsProcess.cpp @@ -54,14 +54,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -GenFaceNormalsProcess::GenFaceNormalsProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -GenFaceNormalsProcess::~GenFaceNormalsProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool GenFaceNormalsProcess::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/GenFaceNormalsProcess.h b/code/PostProcessing/GenFaceNormalsProcess.h index c2f157e20..68e3fee0b 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.h +++ b/code/PostProcessing/GenFaceNormalsProcess.h @@ -47,20 +47,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "Common/BaseProcess.h" #include -namespace Assimp -{ +namespace Assimp { // --------------------------------------------------------------------------- -/** The GenFaceNormalsProcess computes face normals for all faces of all meshes -*/ -class ASSIMP_API_WINONLY GenFaceNormalsProcess : public BaseProcess -{ +/** + * @brief The GenFaceNormalsProcess computes face normals for all faces of all meshes + */ +class ASSIMP_API_WINONLY GenFaceNormalsProcess : public BaseProcess { public: + GenFaceNormalsProcess() = default; + ~GenFaceNormalsProcess() = default; - GenFaceNormalsProcess(); - ~GenFaceNormalsProcess(); - -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise diff --git a/code/PostProcessing/GenVertexNormalsProcess.cpp b/code/PostProcessing/GenVertexNormalsProcess.cpp index 5b9033383..c8afac297 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.cpp +++ b/code/PostProcessing/GenVertexNormalsProcess.cpp @@ -60,10 +60,6 @@ GenVertexNormalsProcess::GenVertexNormalsProcess() : // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -GenVertexNormalsProcess::~GenVertexNormalsProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool GenVertexNormalsProcess::IsActive(unsigned int pFlags) const { @@ -109,10 +105,10 @@ void GenVertexNormalsProcess::Execute(aiScene *pScene) { // Executes the post processing step on the given imported data. bool GenVertexNormalsProcess::GenMeshVertexNormals(aiMesh *pMesh, unsigned int meshIndex) { if (nullptr != pMesh->mNormals) { - if (force_) - delete[] pMesh->mNormals; - else + if (!force_) { return false; + } + delete[] pMesh->mNormals; } // If the mesh consists of lines and/or points but not of @@ -144,8 +140,9 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals(aiMesh *pMesh, unsigned int m const aiVector3D *pV3 = &pMesh->mVertices[face.mIndices[face.mNumIndices - 1]]; // Boolean XOR - if either but not both of these flags is set, then the winding order has // changed and the cross product to calculate the normal needs to be reversed - if (flippedWindingOrder_ != leftHanded_) + if (flippedWindingOrder_ != leftHanded_) { std::swap(pV2, pV3); + } const aiVector3D vNor = ((*pV2 - *pV1) ^ (*pV3 - *pV1)).NormalizeSafe(); for (unsigned int i = 0; i < face.mNumIndices; ++i) { diff --git a/code/PostProcessing/GenVertexNormalsProcess.h b/code/PostProcessing/GenVertexNormalsProcess.h index 370bf42b1..3a15bf4a8 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.h +++ b/code/PostProcessing/GenVertexNormalsProcess.h @@ -61,7 +61,7 @@ namespace Assimp { class ASSIMP_API GenVertexNormalsProcess : public BaseProcess { public: GenVertexNormalsProcess(); - ~GenVertexNormalsProcess(); + ~GenVertexNormalsProcess() = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. From 1147f0c8bde73b8e86adf24d1ef986cd841e80f1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 14 Mar 2023 21:04:43 +0100 Subject: [PATCH 138/232] Refactoring: Code cleanup post-processing. --- code/PostProcessing/DeboneProcess.cpp | 79 +++----- code/PostProcessing/DeboneProcess.h | 2 +- .../PostProcessing/DropFaceNormalsProcess.cpp | 8 - code/PostProcessing/DropFaceNormalsProcess.h | 4 +- code/PostProcessing/EmbedTexturesProcess.cpp | 4 - code/PostProcessing/EmbedTexturesProcess.h | 4 +- code/PostProcessing/FindDegenerates.h | 2 +- code/PostProcessing/FindInstancesProcess.h | 2 +- code/PostProcessing/FindInvalidDataProcess.h | 24 +-- code/PostProcessing/FixNormalsStep.h | 4 +- code/PostProcessing/GenBoundingBoxesProcess.h | 14 +- code/PostProcessing/GenFaceNormalsProcess.h | 4 +- code/PostProcessing/GenVertexNormalsProcess.h | 4 +- code/PostProcessing/ImproveCacheLocality.cpp | 4 - code/PostProcessing/ImproveCacheLocality.h | 13 +- code/PostProcessing/JoinVerticesProcess.h | 12 +- .../LimitBoneWeightsProcess.cpp | 8 +- code/PostProcessing/LimitBoneWeightsProcess.h | 4 +- code/PostProcessing/MakeVerboseFormat.cpp | 4 - code/PostProcessing/MakeVerboseFormat.h | 13 +- code/PostProcessing/OptimizeGraph.cpp | 4 - code/PostProcessing/OptimizeGraph.h | 4 +- code/PostProcessing/OptimizeMeshes.cpp | 4 - code/PostProcessing/OptimizeMeshes.h | 7 +- code/PostProcessing/PretransformVertices.cpp | 4 - code/PostProcessing/PretransformVertices.h | 4 +- .../RemoveRedundantMaterials.cpp | 4 - .../PostProcessing/RemoveRedundantMaterials.h | 7 +- code/PostProcessing/RemoveVCProcess.cpp | 4 - code/PostProcessing/RemoveVCProcess.h | 7 +- code/PostProcessing/ScaleProcess.cpp | 43 ++-- code/PostProcessing/ScaleProcess.h | 7 +- code/PostProcessing/SortByPTypeProcess.cpp | 4 - code/PostProcessing/SortByPTypeProcess.h | 4 +- .../SplitByBoneCountProcess.cpp | 184 ++++++------------ code/PostProcessing/SplitByBoneCountProcess.h | 37 ++-- code/PostProcessing/SplitLargeMeshes.cpp | 6 - code/PostProcessing/SplitLargeMeshes.h | 23 +-- code/PostProcessing/TextureTransform.cpp | 34 +--- code/PostProcessing/TextureTransform.h | 17 +- code/PostProcessing/TriangulateProcess.cpp | 9 - code/PostProcessing/TriangulateProcess.h | 6 +- code/PostProcessing/ValidateDataStructure.cpp | 7 +- code/PostProcessing/ValidateDataStructure.h | 6 +- 44 files changed, 235 insertions(+), 414 deletions(-) diff --git a/code/PostProcessing/DeboneProcess.cpp b/code/PostProcessing/DeboneProcess.cpp index 22a4397bf..2a8499dc5 100644 --- a/code/PostProcessing/DeboneProcess.cpp +++ b/code/PostProcessing/DeboneProcess.cpp @@ -43,42 +43,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /// @file DeboneProcess.cpp /** Implementation of the DeboneProcess post processing step */ - - // internal headers of the post-processing framework #include "ProcessHelper.h" #include "DeboneProcess.h" #include - using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -DeboneProcess::DeboneProcess() -{ - mNumBones = 0; - mNumBonesCanDoWithout = 0; - - mThreshold = AI_DEBONE_THRESHOLD; - mAllOrNone = false; -} - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -DeboneProcess::~DeboneProcess() = default; +DeboneProcess::DeboneProcess() : mNumBones(0), mNumBonesCanDoWithout(0), mThreshold(AI_DEBONE_THRESHOLD), mAllOrNone(false) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool DeboneProcess::IsActive( unsigned int pFlags) const -{ +bool DeboneProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_Debone) != 0; } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void DeboneProcess::SetupProperties(const Importer* pImp) -{ +void DeboneProcess::SetupProperties(const Importer* pImp) { // get the current value of the property mAllOrNone = pImp->GetPropertyInteger(AI_CONFIG_PP_DB_ALL_OR_NONE,0)?true:false; mThreshold = pImp->GetPropertyFloat(AI_CONFIG_PP_DB_THRESHOLD,AI_DEBONE_THRESHOLD); @@ -86,8 +70,7 @@ void DeboneProcess::SetupProperties(const Importer* pImp) // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void DeboneProcess::Execute( aiScene* pScene) -{ +void DeboneProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("DeboneProcess begin"); if(!pScene->mNumMeshes) { @@ -117,10 +100,8 @@ void DeboneProcess::Execute( aiScene* pScene) // build a new array of meshes for the scene std::vector meshes; - for(unsigned int a=0;amNumMeshes;a++) - { + for (unsigned int a=0;amNumMeshes; ++a) { aiMesh* srcMesh = pScene->mMeshes[a]; - std::vector > newMeshes; if(splitList[a]) { @@ -150,8 +131,7 @@ void DeboneProcess::Execute( aiScene* pScene) // and destroy the source mesh. It should be completely contained inside the new submeshes delete srcMesh; - } - else { + } else { // Mesh is kept unchanged - store it's new place in the mesh array mSubMeshIndices[a].emplace_back(static_cast(meshes.size()), (aiNode *)nullptr); meshes.push_back(srcMesh); @@ -173,8 +153,7 @@ void DeboneProcess::Execute( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Counts bones total/removable in a given mesh. -bool DeboneProcess::ConsiderMesh(const aiMesh* pMesh) -{ +bool DeboneProcess::ConsiderMesh(const aiMesh* pMesh) { if(!pMesh->HasBones()) { return false; } @@ -193,25 +172,23 @@ bool DeboneProcess::ConsiderMesh(const aiMesh* pMesh) for(unsigned int i=0;imNumBones;i++) { for(unsigned int j=0;jmBones[i]->mNumWeights;j++) { float w = pMesh->mBones[i]->mWeights[j].mWeight; - - if(w==0.0f) { + if (w == 0.0f) { continue; } unsigned int vid = pMesh->mBones[i]->mWeights[j].mVertexId; - if(w>=mThreshold) { - - if(vertexBones[vid]!=cUnowned) { - if(vertexBones[vid]==i) //double entry - { + if (w >= mThreshold) { + if (vertexBones[vid] != cUnowned) { + //double entry + if(vertexBones[vid]==i) { ASSIMP_LOG_WARN("Encountered double entry in bone weights"); - } - else //TODO: track attraction in order to break tie - { + } else { + //TODO: track attraction in order to break tie vertexBones[vid] = cCoowned; } - } - else vertexBones[vid] = i; + } else { + vertexBones[vid] = i; + } } if(!isBoneNecessary[i]) { @@ -227,13 +204,16 @@ bool DeboneProcess::ConsiderMesh(const aiMesh* pMesh) if(isInterstitialRequired) { for(unsigned int i=0;imNumFaces;i++) { unsigned int v = vertexBones[pMesh->mFaces[i].mIndices[0]]; - - for(unsigned int j=1;jmFaces[i].mNumIndices;j++) { + for (unsigned int j=1;jmFaces[i].mNumIndices;j++) { unsigned int w = vertexBones[pMesh->mFaces[i].mIndices[j]]; - if(v!=w) { - if(vmNumBones) isBoneNecessary[v] = true; - if(wmNumBones) isBoneNecessary[w] = true; + if (v != w) { + if(vmNumBones) { + isBoneNecessary[v] = true; + } + if (wmNumBones) { + isBoneNecessary[w] = true; + } } } } @@ -252,8 +232,7 @@ bool DeboneProcess::ConsiderMesh(const aiMesh* pMesh) // ------------------------------------------------------------------------------------------------ // Splits the given mesh by bone count. -void DeboneProcess::SplitMesh( const aiMesh* pMesh, std::vector< std::pair< aiMesh*,const aiBone* > >& poNewMeshes) const -{ +void DeboneProcess::SplitMesh( const aiMesh* pMesh, std::vector< std::pair< aiMesh*,const aiBone* > >& poNewMeshes) const { // same deal here as ConsiderMesh basically std::vector isBoneNecessary(pMesh->mNumBones,false); @@ -371,8 +350,7 @@ void DeboneProcess::SplitMesh( const aiMesh* pMesh, std::vector< std::pair< aiMe // ------------------------------------------------------------------------------------------------ // Recursively updates the node's mesh list to account for the changed mesh list -void DeboneProcess::UpdateNode(aiNode* pNode) const -{ +void DeboneProcess::UpdateNode(aiNode* pNode) const { // rebuild the node's mesh index list std::vector newMeshList; @@ -430,8 +408,7 @@ void DeboneProcess::UpdateNode(aiNode* pNode) const // ------------------------------------------------------------------------------------------------ // Apply the node transformation to a mesh -void DeboneProcess::ApplyTransform(aiMesh* mesh, const aiMatrix4x4& mat)const -{ +void DeboneProcess::ApplyTransform(aiMesh* mesh, const aiMatrix4x4& mat)const { // Check whether we need to transform the coordinates at all if (!mat.IsIdentity()) { diff --git a/code/PostProcessing/DeboneProcess.h b/code/PostProcessing/DeboneProcess.h index cb072b7eb..080bc30d1 100644 --- a/code/PostProcessing/DeboneProcess.h +++ b/code/PostProcessing/DeboneProcess.h @@ -70,7 +70,7 @@ namespace Assimp { class DeboneProcess : public BaseProcess { public: DeboneProcess(); - ~DeboneProcess(); + ~DeboneProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. diff --git a/code/PostProcessing/DropFaceNormalsProcess.cpp b/code/PostProcessing/DropFaceNormalsProcess.cpp index f85daa588..223482374 100644 --- a/code/PostProcessing/DropFaceNormalsProcess.cpp +++ b/code/PostProcessing/DropFaceNormalsProcess.cpp @@ -54,14 +54,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -DropFaceNormalsProcess::DropFaceNormalsProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -DropFaceNormalsProcess::~DropFaceNormalsProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool DropFaceNormalsProcess::IsActive( unsigned int pFlags) const { diff --git a/code/PostProcessing/DropFaceNormalsProcess.h b/code/PostProcessing/DropFaceNormalsProcess.h index 50abdc727..719c98dc7 100644 --- a/code/PostProcessing/DropFaceNormalsProcess.h +++ b/code/PostProcessing/DropFaceNormalsProcess.h @@ -55,8 +55,8 @@ namespace Assimp { */ class ASSIMP_API_WINONLY DropFaceNormalsProcess : public BaseProcess { public: - DropFaceNormalsProcess(); - ~DropFaceNormalsProcess(); + DropFaceNormalsProcess() = default; + ~DropFaceNormalsProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/EmbedTexturesProcess.cpp b/code/PostProcessing/EmbedTexturesProcess.cpp index dc7e54ac1..d5d2ef872 100644 --- a/code/PostProcessing/EmbedTexturesProcess.cpp +++ b/code/PostProcessing/EmbedTexturesProcess.cpp @@ -49,10 +49,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -EmbedTexturesProcess::EmbedTexturesProcess() = default; - -EmbedTexturesProcess::~EmbedTexturesProcess() = default; - bool EmbedTexturesProcess::IsActive(unsigned int pFlags) const { return (pFlags & aiProcess_EmbedTextures) != 0; } diff --git a/code/PostProcessing/EmbedTexturesProcess.h b/code/PostProcessing/EmbedTexturesProcess.h index c3e63612c..e09fa0896 100644 --- a/code/PostProcessing/EmbedTexturesProcess.h +++ b/code/PostProcessing/EmbedTexturesProcess.h @@ -62,10 +62,10 @@ namespace Assimp { class ASSIMP_API EmbedTexturesProcess : public BaseProcess { public: /// The default class constructor. - EmbedTexturesProcess(); + EmbedTexturesProcess() = default; /// The class destructor. - virtual ~EmbedTexturesProcess(); + ~EmbedTexturesProcess() override = default; /// Overwritten, @see BaseProcess virtual bool IsActive(unsigned int pFlags) const; diff --git a/code/PostProcessing/FindDegenerates.h b/code/PostProcessing/FindDegenerates.h index 55a9dd981..d1eb81615 100644 --- a/code/PostProcessing/FindDegenerates.h +++ b/code/PostProcessing/FindDegenerates.h @@ -59,7 +59,7 @@ namespace Assimp { class ASSIMP_API FindDegeneratesProcess : public BaseProcess { public: FindDegeneratesProcess(); - ~FindDegeneratesProcess() = default; + ~FindDegeneratesProcess() override = default; // ------------------------------------------------------------------- // Check whether step is active diff --git a/code/PostProcessing/FindInstancesProcess.h b/code/PostProcessing/FindInstancesProcess.h index d1daeb1f4..b6c61527a 100644 --- a/code/PostProcessing/FindInstancesProcess.h +++ b/code/PostProcessing/FindInstancesProcess.h @@ -110,7 +110,7 @@ inline bool CompareArrays(const aiColor4D* first, const aiColor4D* second, class FindInstancesProcess : public BaseProcess { public: FindInstancesProcess(); - ~FindInstancesProcess() = default; + ~FindInstancesProcess() override = default; // ------------------------------------------------------------------- // Check whether step is active in given flags combination diff --git a/code/PostProcessing/FindInvalidDataProcess.h b/code/PostProcessing/FindInvalidDataProcess.h index c5c7067a6..14746864f 100644 --- a/code/PostProcessing/FindInvalidDataProcess.h +++ b/code/PostProcessing/FindInvalidDataProcess.h @@ -64,35 +64,37 @@ namespace Assimp { * which have zero normal vectors. */ class ASSIMP_API FindInvalidDataProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. FindInvalidDataProcess(); - ~FindInvalidDataProcess() = default; + ~FindInvalidDataProcess() override = default; // ------------------------------------------------------------------- - // + /// Returns active state. bool IsActive(unsigned int pFlags) const; // ------------------------------------------------------------------- - // Setup import settings + /// Setup import settings void SetupProperties(const Importer *pImp); // ------------------------------------------------------------------- - // Run the step + /// Run the step void Execute(aiScene *pScene); // ------------------------------------------------------------------- - /** Executes the post-processing step on the given mesh - * @param pMesh The mesh to process. - * @return 0 - nothing, 1 - removed sth, 2 - please delete me */ + /// Executes the post-processing step on the given mesh + /// @param pMesh The mesh to process. + /// @return 0 - nothing, 1 - removed sth, 2 - please delete me */ int ProcessMesh(aiMesh *pMesh); // ------------------------------------------------------------------- - /** Executes the post-processing step on the given animation - * @param anim The animation to process. */ + /// Executes the post-processing step on the given animation + /// @param anim The animation to process. */ void ProcessAnimation(aiAnimation *anim); // ------------------------------------------------------------------- - /** Executes the post-processing step on the given anim channel - * @param anim The animation channel to process.*/ + /// Executes the post-processing step on the given anim channel + /// @param anim The animation channel to process.*/ void ProcessAnimationChannel(aiNodeAnim *anim); private: diff --git a/code/PostProcessing/FixNormalsStep.h b/code/PostProcessing/FixNormalsStep.h index ec546c987..e5f5c8a1f 100644 --- a/code/PostProcessing/FixNormalsStep.h +++ b/code/PostProcessing/FixNormalsStep.h @@ -58,8 +58,10 @@ namespace Assimp { */ class FixInfacingNormalsProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. FixInfacingNormalsProcess() = default; - ~FixInfacingNormalsProcess() = default; + ~FixInfacingNormalsProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/GenBoundingBoxesProcess.h b/code/PostProcessing/GenBoundingBoxesProcess.h index a880a0638..0cf8514f4 100644 --- a/code/PostProcessing/GenBoundingBoxesProcess.h +++ b/code/PostProcessing/GenBoundingBoxesProcess.h @@ -60,13 +60,17 @@ namespace Assimp { */ class ASSIMP_API GenBoundingBoxesProcess : public BaseProcess { public: - /// The class constructor. + // ------------------------------------------------------------------- + /// The default class constructor / destructor. GenBoundingBoxesProcess() = default; - /// The class destructor. - ~GenBoundingBoxesProcess() = default; - /// Will return true, if aiProcess_GenBoundingBoxes is defined. + ~GenBoundingBoxesProcess() override = default; + + // ------------------------------------------------------------------- + /// @brief Will return true, if aiProcess_GenBoundingBoxes is defined. bool IsActive(unsigned int pFlags) const override; - /// The execution callback. + + // ------------------------------------------------------------------- + /// @brief The execution callback. void Execute(aiScene* pScene) override; }; diff --git a/code/PostProcessing/GenFaceNormalsProcess.h b/code/PostProcessing/GenFaceNormalsProcess.h index 68e3fee0b..b1babca28 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.h +++ b/code/PostProcessing/GenFaceNormalsProcess.h @@ -55,8 +55,10 @@ namespace Assimp { */ class ASSIMP_API_WINONLY GenFaceNormalsProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. GenFaceNormalsProcess() = default; - ~GenFaceNormalsProcess() = default; + ~GenFaceNormalsProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/GenVertexNormalsProcess.h b/code/PostProcessing/GenVertexNormalsProcess.h index 3a15bf4a8..3999fc3e9 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.h +++ b/code/PostProcessing/GenVertexNormalsProcess.h @@ -60,8 +60,10 @@ namespace Assimp { */ class ASSIMP_API GenVertexNormalsProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. GenVertexNormalsProcess(); - ~GenVertexNormalsProcess() = default; + ~GenVertexNormalsProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. diff --git a/code/PostProcessing/ImproveCacheLocality.cpp b/code/PostProcessing/ImproveCacheLocality.cpp index 197856171..9336d6b17 100644 --- a/code/PostProcessing/ImproveCacheLocality.cpp +++ b/code/PostProcessing/ImproveCacheLocality.cpp @@ -68,10 +68,6 @@ ImproveCacheLocalityProcess::ImproveCacheLocalityProcess() // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -ImproveCacheLocalityProcess::~ImproveCacheLocalityProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool ImproveCacheLocalityProcess::IsActive( unsigned int pFlags) const { diff --git a/code/PostProcessing/ImproveCacheLocality.h b/code/PostProcessing/ImproveCacheLocality.h index b2074a17c..34a3883da 100644 --- a/code/PostProcessing/ImproveCacheLocality.h +++ b/code/PostProcessing/ImproveCacheLocality.h @@ -51,8 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. struct aiMesh; -namespace Assimp -{ +namespace Assimp { // --------------------------------------------------------------------------- /** The ImproveCacheLocalityProcess reorders all faces for improved vertex @@ -61,14 +60,12 @@ namespace Assimp * * @note This step expects triagulated input data. */ -class ImproveCacheLocalityProcess : public BaseProcess -{ +class ImproveCacheLocalityProcess : public BaseProcess { public: - + // ------------------------------------------------------------------- + /// The default class constructor / destructor. ImproveCacheLocalityProcess(); - ~ImproveCacheLocalityProcess(); - -public: + ~ImproveCacheLocalityProcess() override = default; // ------------------------------------------------------------------- // Check whether the pp step is active diff --git a/code/PostProcessing/JoinVerticesProcess.h b/code/PostProcessing/JoinVerticesProcess.h index b05d74ef5..de8cea691 100644 --- a/code/PostProcessing/JoinVerticesProcess.h +++ b/code/PostProcessing/JoinVerticesProcess.h @@ -51,8 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. struct aiMesh; -namespace Assimp -{ +namespace Assimp { // --------------------------------------------------------------------------- /** The JoinVerticesProcess unites identical vertices in all imported meshes. @@ -65,12 +64,9 @@ namespace Assimp class ASSIMP_API JoinVerticesProcess : public BaseProcess { public: // ------------------------------------------------------------------- - /// @brief The default class constructor. - JoinVerticesProcess() = default; - - // ------------------------------------------------------------------- - /// @brief The default class destructor. - ~JoinVerticesProcess() = default; + /// The default class constructor / destructor. + JoinVerticesProcess() = default; + ~JoinVerticesProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/LimitBoneWeightsProcess.cpp b/code/PostProcessing/LimitBoneWeightsProcess.cpp index 51fb43dfc..7047ec0f1 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.cpp +++ b/code/PostProcessing/LimitBoneWeightsProcess.cpp @@ -53,11 +53,9 @@ namespace Assimp { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -LimitBoneWeightsProcess::LimitBoneWeightsProcess() : mMaxWeights(AI_LMW_MAX_WEIGHTS) {} - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -LimitBoneWeightsProcess::~LimitBoneWeightsProcess() = default; +LimitBoneWeightsProcess::LimitBoneWeightsProcess() : mMaxWeights(AI_LMW_MAX_WEIGHTS) { + // empty +} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/LimitBoneWeightsProcess.h b/code/PostProcessing/LimitBoneWeightsProcess.h index 22d286b68..855c8628a 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.h +++ b/code/PostProcessing/LimitBoneWeightsProcess.h @@ -74,8 +74,10 @@ namespace Assimp { */ class ASSIMP_API LimitBoneWeightsProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. LimitBoneWeightsProcess(); - ~LimitBoneWeightsProcess(); + ~LimitBoneWeightsProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. diff --git a/code/PostProcessing/MakeVerboseFormat.cpp b/code/PostProcessing/MakeVerboseFormat.cpp index 0f5276cf3..1cc2fdc02 100644 --- a/code/PostProcessing/MakeVerboseFormat.cpp +++ b/code/PostProcessing/MakeVerboseFormat.cpp @@ -49,10 +49,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -// ------------------------------------------------------------------------------------------------ -MakeVerboseFormatProcess::MakeVerboseFormatProcess() = default; -// ------------------------------------------------------------------------------------------------ -MakeVerboseFormatProcess::~MakeVerboseFormatProcess() = default; // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. void MakeVerboseFormatProcess::Execute(aiScene *pScene) { diff --git a/code/PostProcessing/MakeVerboseFormat.h b/code/PostProcessing/MakeVerboseFormat.h index 6b81da622..b7ac10019 100644 --- a/code/PostProcessing/MakeVerboseFormat.h +++ b/code/PostProcessing/MakeVerboseFormat.h @@ -66,15 +66,12 @@ namespace Assimp { * The step has been added because it was required by the viewer, however * it has been moved to the main library since others might find it * useful, too. */ -class ASSIMP_API_WINONLY MakeVerboseFormatProcess : public BaseProcess -{ -public: - - - MakeVerboseFormatProcess(); - ~MakeVerboseFormatProcess(); - +class ASSIMP_API_WINONLY MakeVerboseFormatProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. + MakeVerboseFormatProcess() = default; + ~MakeVerboseFormatProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/OptimizeGraph.cpp b/code/PostProcessing/OptimizeGraph.cpp index 26b06e9b6..bcd654634 100644 --- a/code/PostProcessing/OptimizeGraph.cpp +++ b/code/PostProcessing/OptimizeGraph.cpp @@ -78,10 +78,6 @@ OptimizeGraphProcess::OptimizeGraphProcess() : // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -OptimizeGraphProcess::~OptimizeGraphProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool OptimizeGraphProcess::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/OptimizeGraph.h b/code/PostProcessing/OptimizeGraph.h index f5caa139c..23e59e67d 100644 --- a/code/PostProcessing/OptimizeGraph.h +++ b/code/PostProcessing/OptimizeGraph.h @@ -71,8 +71,10 @@ namespace Assimp { */ class OptimizeGraphProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. OptimizeGraphProcess(); - ~OptimizeGraphProcess(); + ~OptimizeGraphProcess() override = default; // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const override; diff --git a/code/PostProcessing/OptimizeMeshes.cpp b/code/PostProcessing/OptimizeMeshes.cpp index a8c01e2d7..0fd597808 100644 --- a/code/PostProcessing/OptimizeMeshes.cpp +++ b/code/PostProcessing/OptimizeMeshes.cpp @@ -69,10 +69,6 @@ OptimizeMeshesProcess::OptimizeMeshesProcess() // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -OptimizeMeshesProcess::~OptimizeMeshesProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool OptimizeMeshesProcess::IsActive( unsigned int pFlags) const diff --git a/code/PostProcessing/OptimizeMeshes.h b/code/PostProcessing/OptimizeMeshes.h index b80f98d5d..1109a30e7 100644 --- a/code/PostProcessing/OptimizeMeshes.h +++ b/code/PostProcessing/OptimizeMeshes.h @@ -68,11 +68,10 @@ namespace Assimp { */ class OptimizeMeshesProcess : public BaseProcess { public: - /// @brief The class constructor. + // ------------------------------------------------------------------- + /// The default class constructor / destructor. OptimizeMeshesProcess(); - - /// @brief The class destructor. - ~OptimizeMeshesProcess(); + ~OptimizeMeshesProcess() override = default; /** @brief Internal utility to store additional mesh info */ diff --git a/code/PostProcessing/PretransformVertices.cpp b/code/PostProcessing/PretransformVertices.cpp index 9ac90d277..b6bb6155e 100644 --- a/code/PostProcessing/PretransformVertices.cpp +++ b/code/PostProcessing/PretransformVertices.cpp @@ -68,10 +68,6 @@ PretransformVertices::PretransformVertices() : // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -PretransformVertices::~PretransformVertices() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool PretransformVertices::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/PretransformVertices.h b/code/PostProcessing/PretransformVertices.h index 14e5139ec..7c2b5e99e 100644 --- a/code/PostProcessing/PretransformVertices.h +++ b/code/PostProcessing/PretransformVertices.h @@ -68,8 +68,10 @@ namespace Assimp { */ class ASSIMP_API PretransformVertices : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. PretransformVertices(); - ~PretransformVertices(); + ~PretransformVertices() override = default; // ------------------------------------------------------------------- // Check whether step is active diff --git a/code/PostProcessing/RemoveRedundantMaterials.cpp b/code/PostProcessing/RemoveRedundantMaterials.cpp index 3c3cd59e0..dbc3c8822 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.cpp +++ b/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -62,10 +62,6 @@ RemoveRedundantMatsProcess::RemoveRedundantMatsProcess() // nothing to do here } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -RemoveRedundantMatsProcess::~RemoveRedundantMatsProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool RemoveRedundantMatsProcess::IsActive( unsigned int pFlags) const diff --git a/code/PostProcessing/RemoveRedundantMaterials.h b/code/PostProcessing/RemoveRedundantMaterials.h index e8c1478fd..0fbf33c1b 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.h +++ b/code/PostProcessing/RemoveRedundantMaterials.h @@ -59,11 +59,10 @@ namespace Assimp { */ class ASSIMP_API RemoveRedundantMatsProcess : public BaseProcess { public: - /// The default class constructor. + // ------------------------------------------------------------------- + /// The default class constructor / destructor. RemoveRedundantMatsProcess(); - - /// The class destructor. - ~RemoveRedundantMatsProcess(); + ~RemoveRedundantMatsProcess() override = default; // ------------------------------------------------------------------- // Check whether step is active diff --git a/code/PostProcessing/RemoveVCProcess.cpp b/code/PostProcessing/RemoveVCProcess.cpp index 8bbe791f6..35047dc0a 100644 --- a/code/PostProcessing/RemoveVCProcess.cpp +++ b/code/PostProcessing/RemoveVCProcess.cpp @@ -56,10 +56,6 @@ using namespace Assimp; RemoveVCProcess::RemoveVCProcess() : configDeleteFlags(), mScene() {} -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -RemoveVCProcess::~RemoveVCProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool RemoveVCProcess::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/RemoveVCProcess.h b/code/PostProcessing/RemoveVCProcess.h index cf1086882..dfd9b59ff 100644 --- a/code/PostProcessing/RemoveVCProcess.h +++ b/code/PostProcessing/RemoveVCProcess.h @@ -58,11 +58,10 @@ namespace Assimp { */ class ASSIMP_API RemoveVCProcess : public BaseProcess { public: - /// The default class constructor. + // ------------------------------------------------------------------- + /// The default class constructor / destructor. RemoveVCProcess(); - - /// The class destructor. - ~RemoveVCProcess(); + ~RemoveVCProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 34f68539a..665f28a7e 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -47,25 +47,27 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { -ScaleProcess::ScaleProcess() -: BaseProcess() -, mScale( AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT ) { +// ------------------------------------------------------------------------------------------------ +ScaleProcess::ScaleProcess() : BaseProcess(), mScale( AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT ) { + // empty } -ScaleProcess::~ScaleProcess() = default; - +// ------------------------------------------------------------------------------------------------ void ScaleProcess::setScale( ai_real scale ) { mScale = scale; } +// ------------------------------------------------------------------------------------------------ ai_real ScaleProcess::getScale() const { return mScale; } +// ------------------------------------------------------------------------------------------------ bool ScaleProcess::IsActive( unsigned int pFlags ) const { return ( pFlags & aiProcess_GlobalScale ) != 0; } +// ------------------------------------------------------------------------------------------------ void ScaleProcess::SetupProperties( const Importer* pImp ) { // User scaling mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 1.0f ); @@ -78,6 +80,7 @@ void ScaleProcess::SetupProperties( const Importer* pImp ) { mScale *= importerScale; } +// ------------------------------------------------------------------------------------------------ void ScaleProcess::Execute( aiScene* pScene ) { if(mScale == 1.0f) { return; // nothing to scale @@ -96,37 +99,30 @@ void ScaleProcess::Execute( aiScene* pScene ) { } // Process animations and update position transform to new unit system - for( unsigned int animationID = 0; animationID < pScene->mNumAnimations; animationID++ ) - { + for( unsigned int animationID = 0; animationID < pScene->mNumAnimations; animationID++ ) { aiAnimation* animation = pScene->mAnimations[animationID]; - for( unsigned int animationChannel = 0; animationChannel < animation->mNumChannels; animationChannel++) - { + for( unsigned int animationChannel = 0; animationChannel < animation->mNumChannels; animationChannel++) { aiNodeAnim* anim = animation->mChannels[animationChannel]; - for( unsigned int posKey = 0; posKey < anim->mNumPositionKeys; posKey++) - { + for( unsigned int posKey = 0; posKey < anim->mNumPositionKeys; posKey++) { aiVectorKey& vectorKey = anim->mPositionKeys[posKey]; vectorKey.mValue *= mScale; } } } - for( unsigned int meshID = 0; meshID < pScene->mNumMeshes; meshID++) - { + for( unsigned int meshID = 0; meshID < pScene->mNumMeshes; meshID++) { aiMesh *mesh = pScene->mMeshes[meshID]; // Reconstruct mesh vertices to the new unit system - for( unsigned int vertexID = 0; vertexID < mesh->mNumVertices; vertexID++) - { + for( unsigned int vertexID = 0; vertexID < mesh->mNumVertices; vertexID++) { aiVector3D& vertex = mesh->mVertices[vertexID]; vertex *= mScale; } - // bone placement / scaling - for( unsigned int boneID = 0; boneID < mesh->mNumBones; boneID++) - { + for( unsigned int boneID = 0; boneID < mesh->mNumBones; boneID++) { // Reconstruct matrix by transform rather than by scale // This prevent scale values being changed which can // be meaningful in some cases @@ -152,12 +148,10 @@ void ScaleProcess::Execute( aiScene* pScene ) { // animation mesh processing // convert by position rather than scale. - for( unsigned int animMeshID = 0; animMeshID < mesh->mNumAnimMeshes; animMeshID++) - { + for( unsigned int animMeshID = 0; animMeshID < mesh->mNumAnimMeshes; animMeshID++) { aiAnimMesh * animMesh = mesh->mAnimMeshes[animMeshID]; - for( unsigned int vertexID = 0; vertexID < animMesh->mNumVertices; vertexID++) - { + for( unsigned int vertexID = 0; vertexID < animMesh->mNumVertices; vertexID++) { aiVector3D& vertex = animMesh->mVertices[vertexID]; vertex *= mScale; } @@ -167,16 +161,17 @@ void ScaleProcess::Execute( aiScene* pScene ) { traverseNodes( pScene->mRootNode ); } +// ------------------------------------------------------------------------------------------------ void ScaleProcess::traverseNodes( aiNode *node, unsigned int nested_node_id ) { applyScaling( node ); - for( size_t i = 0; i < node->mNumChildren; i++) - { + for( size_t i = 0; i < node->mNumChildren; i++) { // recurse into the tree until we are done! traverseNodes( node->mChildren[i], nested_node_id+1 ); } } +// ------------------------------------------------------------------------------------------------ void ScaleProcess::applyScaling( aiNode *currentNode ) { if ( nullptr != currentNode ) { // Reconstruct matrix by transform rather than by scale diff --git a/code/PostProcessing/ScaleProcess.h b/code/PostProcessing/ScaleProcess.h index b6eb75de7..4d706bfc3 100644 --- a/code/PostProcessing/ScaleProcess.h +++ b/code/PostProcessing/ScaleProcess.h @@ -62,11 +62,10 @@ namespace Assimp { */ class ASSIMP_API ScaleProcess : public BaseProcess { public: - /// The default class constructor. + // ------------------------------------------------------------------- + /// The default class constructor / destructor. ScaleProcess(); - - /// The class destructor. - virtual ~ScaleProcess(); + ~ScaleProcess() override = default; /// Will set the scale manually. void setScale( ai_real scale ); diff --git a/code/PostProcessing/SortByPTypeProcess.cpp b/code/PostProcessing/SortByPTypeProcess.cpp index 6312fa173..1be75fc48 100644 --- a/code/PostProcessing/SortByPTypeProcess.cpp +++ b/code/PostProcessing/SortByPTypeProcess.cpp @@ -59,10 +59,6 @@ SortByPTypeProcess::SortByPTypeProcess() : // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -SortByPTypeProcess::~SortByPTypeProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool SortByPTypeProcess::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/SortByPTypeProcess.h b/code/PostProcessing/SortByPTypeProcess.h index e30342a86..c004e0549 100644 --- a/code/PostProcessing/SortByPTypeProcess.h +++ b/code/PostProcessing/SortByPTypeProcess.h @@ -60,8 +60,10 @@ namespace Assimp { */ class ASSIMP_API SortByPTypeProcess : public BaseProcess { public: + // ------------------------------------------------------------------- + /// The default class constructor / destructor. SortByPTypeProcess(); - ~SortByPTypeProcess(); + ~SortByPTypeProcess() override = default; // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const; diff --git a/code/PostProcessing/SplitByBoneCountProcess.cpp b/code/PostProcessing/SplitByBoneCountProcess.cpp index a501d3bd6..5324160d4 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.cpp +++ b/code/PostProcessing/SplitByBoneCountProcess.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ - /// @file SplitByBoneCountProcess.cpp /// Implementation of the SplitByBoneCount postprocessing step @@ -59,47 +58,36 @@ using namespace Assimp::Formatter; // ------------------------------------------------------------------------------------------------ // Constructor -SplitByBoneCountProcess::SplitByBoneCountProcess() -{ - // set default, might be overridden by importer config - mMaxBoneCount = AI_SBBC_DEFAULT_MAX_BONES; +SplitByBoneCountProcess::SplitByBoneCountProcess() : mMaxBoneCount(AI_SBBC_DEFAULT_MAX_BONES) { + // empty } -// ------------------------------------------------------------------------------------------------ -// Destructor -SplitByBoneCountProcess::~SplitByBoneCountProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag. -bool SplitByBoneCountProcess::IsActive( unsigned int pFlags) const -{ +bool SplitByBoneCountProcess::IsActive( unsigned int pFlags) const { return !!(pFlags & aiProcess_SplitByBoneCount); } // ------------------------------------------------------------------------------------------------ // Updates internal properties -void SplitByBoneCountProcess::SetupProperties(const Importer* pImp) -{ +void SplitByBoneCountProcess::SetupProperties(const Importer* pImp) { mMaxBoneCount = pImp->GetPropertyInteger(AI_CONFIG_PP_SBBC_MAX_BONES,AI_SBBC_DEFAULT_MAX_BONES); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void SplitByBoneCountProcess::Execute( aiScene* pScene) -{ +void SplitByBoneCountProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("SplitByBoneCountProcess begin"); // early out bool isNecessary = false; for( unsigned int a = 0; a < pScene->mNumMeshes; ++a) - if( pScene->mMeshes[a]->mNumBones > mMaxBoneCount ) - { + if( pScene->mMeshes[a]->mNumBones > mMaxBoneCount ) { isNecessary = true; break; } - if( !isNecessary ) - { + if( !isNecessary ) { ASSIMP_LOG_DEBUG("SplitByBoneCountProcess early-out: no meshes with more than ", mMaxBoneCount, " bones." ); return; } @@ -111,28 +99,23 @@ void SplitByBoneCountProcess::Execute( aiScene* pScene) // build a new array of meshes for the scene std::vector meshes; - for( unsigned int a = 0; a < pScene->mNumMeshes; ++a) - { + for( unsigned int a = 0; a < pScene->mNumMeshes; ++a) { aiMesh* srcMesh = pScene->mMeshes[a]; std::vector newMeshes; SplitMesh( pScene->mMeshes[a], newMeshes); // mesh was split - if( !newMeshes.empty() ) - { + if( !newMeshes.empty() ) { // store new meshes and indices of the new meshes - for( unsigned int b = 0; b < newMeshes.size(); ++b) - { + for( unsigned int b = 0; b < newMeshes.size(); ++b) { mSubMeshIndices[a].push_back( static_cast(meshes.size())); meshes.push_back( newMeshes[b]); } // and destroy the source mesh. It should be completely contained inside the new submeshes delete srcMesh; - } - else - { + } else { // Mesh is kept unchanged - store it's new place in the mesh array mSubMeshIndices[a].push_back( static_cast(meshes.size())); meshes.push_back( srcMesh); @@ -153,11 +136,9 @@ void SplitByBoneCountProcess::Execute( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Splits the given mesh by bone count. -void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector& poNewMeshes) const -{ +void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector& poNewMeshes) const { // skip if not necessary - if( pMesh->mNumBones <= mMaxBoneCount ) - { + if( pMesh->mNumBones <= mMaxBoneCount ) { return; } @@ -165,27 +146,22 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector BoneWeight; std::vector< std::vector > vertexBones( pMesh->mNumVertices); - for( unsigned int a = 0; a < pMesh->mNumBones; ++a) - { + for( unsigned int a = 0; a < pMesh->mNumBones; ++a) { const aiBone* bone = pMesh->mBones[a]; - for( unsigned int b = 0; b < bone->mNumWeights; ++b) - { - if (bone->mWeights[b].mWeight > 0.0f) - { - int vertexId = bone->mWeights[b].mVertexId; - vertexBones[vertexId].emplace_back(a, bone->mWeights[b].mWeight); - if (vertexBones[vertexId].size() > mMaxBoneCount) - { - throw DeadlyImportError("SplitByBoneCountProcess: Single face requires more bones than specified max bone count!"); + for( unsigned int b = 0; b < bone->mNumWeights; ++b) { + if (bone->mWeights[b].mWeight > 0.0f) { + int vertexId = bone->mWeights[b].mVertexId; + vertexBones[vertexId].emplace_back(a, bone->mWeights[b].mWeight); + if (vertexBones[vertexId].size() > mMaxBoneCount) { + throw DeadlyImportError("SplitByBoneCountProcess: Single face requires more bones than specified max bone count!"); + } } - } } } unsigned int numFacesHandled = 0; std::vector isFaceHandled( pMesh->mNumFaces, false); - while( numFacesHandled < pMesh->mNumFaces ) - { + while( numFacesHandled < pMesh->mNumFaces ) { // which bones are used in the current submesh unsigned int numBones = 0; std::vector isBoneUsed( pMesh->mNumBones, false); @@ -196,11 +172,9 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormNumFaces; ++a) - { + for( unsigned int a = 0; a < pMesh->mNumFaces; ++a) { // skip if the face is already stored in a submesh - if( isFaceHandled[a] ) - { + if( isFaceHandled[a] ) { continue; } // a small local set of new bones for the current face. State of all used bones for that face @@ -209,33 +183,27 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormFaces[a]; // check every vertex if its bones would still fit into the current submesh - for( unsigned int b = 0; b < face.mNumIndices; ++b ) - { - const std::vector& vb = vertexBones[face.mIndices[b]]; - for( unsigned int c = 0; c < vb.size(); ++c) - { - unsigned int boneIndex = vb[c].first; - if( !isBoneUsed[boneIndex] ) - { - newBonesAtCurrentFace.insert(boneIndex); + for( unsigned int b = 0; b < face.mNumIndices; ++b ) { + const std::vector& vb = vertexBones[face.mIndices[b]]; + for( unsigned int c = 0; c < vb.size(); ++c) { + unsigned int boneIndex = vb[c].first; + if( !isBoneUsed[boneIndex] ) { + newBonesAtCurrentFace.insert(boneIndex); + } } - } } // leave out the face if the new bones required for this face don't fit the bone count limit anymore - if( numBones + newBonesAtCurrentFace.size() > mMaxBoneCount ) - { + if( numBones + newBonesAtCurrentFace.size() > mMaxBoneCount ) { continue; } // mark all new bones as necessary - for (std::set::iterator it = newBonesAtCurrentFace.begin(); it != newBonesAtCurrentFace.end(); ++it) - { - if (!isBoneUsed[*it]) - { - isBoneUsed[*it] = true; - numBones++; - } + for (std::set::iterator it = newBonesAtCurrentFace.begin(); it != newBonesAtCurrentFace.end(); ++it) { + if (!isBoneUsed[*it]) { + isBoneUsed[*it] = true; + numBones++; + } } // store the face index and the vertex count @@ -261,27 +229,21 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormNumVertices = numSubMeshVertices; newMesh->mNumFaces = static_cast(subMeshFaces.size()); newMesh->mVertices = new aiVector3D[newMesh->mNumVertices]; - if( pMesh->HasNormals() ) - { + if( pMesh->HasNormals() ) { newMesh->mNormals = new aiVector3D[newMesh->mNumVertices]; } - if( pMesh->HasTangentsAndBitangents() ) - { + if( pMesh->HasTangentsAndBitangents() ) { newMesh->mTangents = new aiVector3D[newMesh->mNumVertices]; newMesh->mBitangents = new aiVector3D[newMesh->mNumVertices]; } - for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a ) - { - if( pMesh->HasTextureCoords( a) ) - { + for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a ) { + if( pMesh->HasTextureCoords( a) ) { newMesh->mTextureCoords[a] = new aiVector3D[newMesh->mNumVertices]; } newMesh->mNumUVComponents[a] = pMesh->mNumUVComponents[a]; } - for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a ) - { - if( pMesh->HasVertexColors( a) ) - { + for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a ) { + if( pMesh->HasVertexColors( a) ) { newMesh->mColors[a] = new aiColor4D[newMesh->mNumVertices]; } } @@ -290,41 +252,33 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormFaces = new aiFace[subMeshFaces.size()]; unsigned int nvi = 0; // next vertex index std::vector previousVertexIndices( numSubMeshVertices, std::numeric_limits::max()); // per new vertex: its index in the source mesh - for( unsigned int a = 0; a < subMeshFaces.size(); ++a ) - { + for( unsigned int a = 0; a < subMeshFaces.size(); ++a ) { const aiFace& srcFace = pMesh->mFaces[subMeshFaces[a]]; aiFace& dstFace = newMesh->mFaces[a]; dstFace.mNumIndices = srcFace.mNumIndices; dstFace.mIndices = new unsigned int[dstFace.mNumIndices]; // accumulate linearly all the vertices of the source face - for( unsigned int b = 0; b < dstFace.mNumIndices; ++b ) - { + for( unsigned int b = 0; b < dstFace.mNumIndices; ++b ) { unsigned int srcIndex = srcFace.mIndices[b]; dstFace.mIndices[b] = nvi; previousVertexIndices[nvi] = srcIndex; newMesh->mVertices[nvi] = pMesh->mVertices[srcIndex]; - if( pMesh->HasNormals() ) - { + if( pMesh->HasNormals() ) { newMesh->mNormals[nvi] = pMesh->mNormals[srcIndex]; } - if( pMesh->HasTangentsAndBitangents() ) - { + if( pMesh->HasTangentsAndBitangents() ) { newMesh->mTangents[nvi] = pMesh->mTangents[srcIndex]; newMesh->mBitangents[nvi] = pMesh->mBitangents[srcIndex]; } - for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++c ) - { - if( pMesh->HasTextureCoords( c) ) - { + for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++c ) { + if( pMesh->HasTextureCoords( c) ) { newMesh->mTextureCoords[c][nvi] = pMesh->mTextureCoords[c][srcIndex]; } } - for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_COLOR_SETS; ++c ) - { - if( pMesh->HasVertexColors( c) ) - { + for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_COLOR_SETS; ++c ) { + if( pMesh->HasVertexColors( c) ) { newMesh->mColors[c][nvi] = pMesh->mColors[c][srcIndex]; } } @@ -340,10 +294,8 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormBones = new aiBone*[numBones]; std::vector mappedBoneIndex( pMesh->mNumBones, std::numeric_limits::max()); - for( unsigned int a = 0; a < pMesh->mNumBones; ++a ) - { - if( !isBoneUsed[a] ) - { + for( unsigned int a = 0; a < pMesh->mNumBones; ++a ) { + if( !isBoneUsed[a] ) { continue; } @@ -360,24 +312,20 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormNumBones == numBones ); // iterate over all new vertices and count which bones affected its old vertex in the source mesh - for( unsigned int a = 0; a < numSubMeshVertices; ++a ) - { + for( unsigned int a = 0; a < numSubMeshVertices; ++a ) { unsigned int oldIndex = previousVertexIndices[a]; const std::vector& bonesOnThisVertex = vertexBones[oldIndex]; - for( unsigned int b = 0; b < bonesOnThisVertex.size(); ++b ) - { + for( unsigned int b = 0; b < bonesOnThisVertex.size(); ++b ) { unsigned int newBoneIndex = mappedBoneIndex[ bonesOnThisVertex[b].first ]; - if( newBoneIndex != std::numeric_limits::max() ) - { + if( newBoneIndex != std::numeric_limits::max() ) { newMesh->mBones[newBoneIndex]->mNumWeights++; } } } // allocate all bone weight arrays accordingly - for( unsigned int a = 0; a < newMesh->mNumBones; ++a ) - { + for( unsigned int a = 0; a < newMesh->mNumBones; ++a ) { aiBone* bone = newMesh->mBones[a]; ai_assert( bone->mNumWeights > 0 ); bone->mWeights = new aiVertexWeight[bone->mNumWeights]; @@ -385,16 +333,14 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector& bonesOnThisVertex = vertexBones[previousIndex]; // all of the bones affecting it should be present in the new submesh, or else // the face it comprises shouldn't be present - for( unsigned int b = 0; b < bonesOnThisVertex.size(); ++b) - { + for( unsigned int b = 0; b < bonesOnThisVertex.size(); ++b) { unsigned int newBoneIndex = mappedBoneIndex[ bonesOnThisVertex[b].first ]; ai_assert( newBoneIndex != std::numeric_limits::max() ); aiVertexWeight* dstWeight = newMesh->mBones[newBoneIndex]->mWeights + newMesh->mBones[newBoneIndex]->mNumWeights; @@ -450,14 +396,11 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormNumMeshes > 0 ) - { + if( pNode->mNumMeshes == 0 ) { std::vector newMeshList; - for( unsigned int a = 0; a < pNode->mNumMeshes; ++a) - { + for( unsigned int a = 0; a < pNode->mNumMeshes; ++a) { unsigned int srcIndex = pNode->mMeshes[a]; const std::vector& replaceMeshes = mSubMeshIndices[srcIndex]; newMeshList.insert( newMeshList.end(), replaceMeshes.begin(), replaceMeshes.end()); @@ -470,8 +413,7 @@ void SplitByBoneCountProcess::UpdateNode( aiNode* pNode) const } // do that also recursively for all children - for( unsigned int a = 0; a < pNode->mNumChildren; ++a ) - { + for( unsigned int a = 0; a < pNode->mNumChildren; ++a ) { UpdateNode( pNode->mChildren[a]); } } diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index 938b00c7f..e2377a995 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -51,9 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -namespace Assimp -{ - +namespace Assimp { /** Postprocessing filter to split meshes with many bones into submeshes * so that each submesh has a certain max bone count. @@ -61,33 +59,28 @@ namespace Assimp * Applied BEFORE the JoinVertices-Step occurs. * Returns NON-UNIQUE vertices, splits by bone count. */ -class SplitByBoneCountProcess : public BaseProcess -{ +class SplitByBoneCountProcess : public BaseProcess { public: - + // ------------------------------------------------------------------- + /// The default class constructor / destructor. SplitByBoneCountProcess(); - ~SplitByBoneCountProcess(); + ~SplitByBoneCountProcess() override = default; -public: - /** Returns whether the processing step is present in the given flag. - * @param pFlags The processing flags the importer was called with. A - * bitwise combination of #aiPostProcessSteps. - * @return true if the process is present in this flag fields, - * false if not. - */ + /// @brief Returns whether the processing step is present in the given flag. + /// @param pFlags The processing flags the importer was called with. A + /// bitwise combination of #aiPostProcessSteps. + /// @return true if the process is present in this flag fields, false if not. bool IsActive( unsigned int pFlags) const; - /** Called prior to ExecuteOnScene(). - * The function is a request to the process to update its configuration - * basing on the Importer's configuration property list. - */ + /// @brief Called prior to ExecuteOnScene(). + /// The function is a request to the process to update its configuration + /// basing on the Importer's configuration property list. virtual void SetupProperties(const Importer* pImp); protected: - /** Executes the post processing step on the given imported data. - * At the moment a process is not supposed to fail. - * @param pScene The imported data to work at. - */ + /// Executes the post processing step on the given imported data. + /// At the moment a process is not supposed to fail. + /// @param pScene The imported data to work at. void Execute( aiScene* pScene); /// Splits the given mesh by bone count. diff --git a/code/PostProcessing/SplitLargeMeshes.cpp b/code/PostProcessing/SplitLargeMeshes.cpp index 151ac4991..73e0cc5d8 100644 --- a/code/PostProcessing/SplitLargeMeshes.cpp +++ b/code/PostProcessing/SplitLargeMeshes.cpp @@ -55,9 +55,6 @@ SplitLargeMeshesProcess_Triangle::SplitLargeMeshesProcess_Triangle() { LIMIT = AI_SLM_DEFAULT_MAX_TRIANGLES; } -// ------------------------------------------------------------------------------------------------ -SplitLargeMeshesProcess_Triangle::~SplitLargeMeshesProcess_Triangle() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool SplitLargeMeshesProcess_Triangle::IsActive( unsigned int pFlags) const { @@ -329,9 +326,6 @@ SplitLargeMeshesProcess_Vertex::SplitLargeMeshesProcess_Vertex() { LIMIT = AI_SLM_DEFAULT_MAX_VERTICES; } -// ------------------------------------------------------------------------------------------------ -SplitLargeMeshesProcess_Vertex::~SplitLargeMeshesProcess_Vertex() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool SplitLargeMeshesProcess_Vertex::IsActive( unsigned int pFlags) const { diff --git a/code/PostProcessing/SplitLargeMeshes.h b/code/PostProcessing/SplitLargeMeshes.h index e5a8d4c1b..605f0477d 100644 --- a/code/PostProcessing/SplitLargeMeshes.h +++ b/code/PostProcessing/SplitLargeMeshes.h @@ -83,16 +83,15 @@ class SplitLargeMeshesProcess_Vertex; * Applied BEFORE the JoinVertices-Step occurs. * Returns NON-UNIQUE vertices, splits by triangle number. */ -class ASSIMP_API SplitLargeMeshesProcess_Triangle : public BaseProcess -{ +class ASSIMP_API SplitLargeMeshesProcess_Triangle : public BaseProcess { friend class SplitLargeMeshesProcess_Vertex; public: - + // ------------------------------------------------------------------- + /// The default class constructor / destructor. SplitLargeMeshesProcess_Triangle(); - ~SplitLargeMeshesProcess_Triangle(); + ~SplitLargeMeshesProcess_Triangle() override = default; -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. A @@ -102,14 +101,12 @@ public: */ bool IsActive( unsigned int pFlags) const; - // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - virtual void SetupProperties(const Importer* pImp); - + void SetupProperties(const Importer* pImp) override; //! Set the split limit - needed for unit testing inline void SetLimit(unsigned int l) @@ -119,8 +116,6 @@ public: inline unsigned int GetLimit() const {return LIMIT;} -public: - // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. @@ -144,21 +139,17 @@ public: unsigned int LIMIT; }; - // --------------------------------------------------------------------------- /** Post-processing filter to split large meshes into sub-meshes * * Applied AFTER the JoinVertices-Step occurs. * Returns UNIQUE vertices, splits by vertex number. */ -class ASSIMP_API SplitLargeMeshesProcess_Vertex : public BaseProcess -{ +class ASSIMP_API SplitLargeMeshesProcess_Vertex : public BaseProcess { public: - SplitLargeMeshesProcess_Vertex(); - ~SplitLargeMeshesProcess_Vertex(); + ~SplitLargeMeshesProcess_Vertex() override = default; -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise diff --git a/code/PostProcessing/TextureTransform.cpp b/code/PostProcessing/TextureTransform.cpp index efbf4d2c6..2ed17f390 100644 --- a/code/PostProcessing/TextureTransform.cpp +++ b/code/PostProcessing/TextureTransform.cpp @@ -56,33 +56,24 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -TextureTransformStep::TextureTransformStep() : - configFlags() -{ +TextureTransformStep::TextureTransformStep() : configFlags() { // nothing to do here } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -TextureTransformStep::~TextureTransformStep() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool TextureTransformStep::IsActive( unsigned int pFlags) const -{ +bool TextureTransformStep::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_TransformUVCoords) != 0; } // ------------------------------------------------------------------------------------------------ // Setup properties -void TextureTransformStep::SetupProperties(const Importer* pImp) -{ +void TextureTransformStep::SetupProperties(const Importer* pImp) { configFlags = pImp->GetPropertyInteger(AI_CONFIG_PP_TUV_EVALUATE,AI_UVTRAFO_ALL); } // ------------------------------------------------------------------------------------------------ -void TextureTransformStep::PreProcessUVTransform(STransformVecInfo& info) -{ +void TextureTransformStep::PreProcessUVTransform(STransformVecInfo& info) { /* This function tries to simplify the input UV transformation. * That's very important as it allows us to reduce the number * of output UV channels. The order in which the transformations @@ -90,7 +81,7 @@ void TextureTransformStep::PreProcessUVTransform(STransformVecInfo& info) */ int rounded; - char szTemp[512]; + char szTemp[512] = {}; /* Optimize the rotation angle. That's slightly difficult as * we have an inprecise floating-point number (when comparing @@ -98,12 +89,10 @@ void TextureTransformStep::PreProcessUVTransform(STransformVecInfo& info) * an epsilon of 5 degrees). If there is a rotation value, we can't * perform any further optimizations. */ - if (info.mRotation) - { + if (info.mRotation) { float out = info.mRotation; rounded = static_cast((info.mRotation / static_cast(AI_MATH_TWO_PI))); - if (rounded) - { + if (rounded) { out -= rounded * static_cast(AI_MATH_PI); ASSIMP_LOG_INFO("Texture coordinate rotation ", info.mRotation, " can be simplified to ", out); } @@ -187,8 +176,7 @@ void TextureTransformStep::PreProcessUVTransform(STransformVecInfo& info) } // ------------------------------------------------------------------------------------------------ -void UpdateUVIndex(const std::list& l, unsigned int n) -{ +void UpdateUVIndex(const std::list& l, unsigned int n) { // Don't set if == 0 && wasn't set before for (std::list::const_iterator it = l.begin();it != l.end(); ++it) { const TTUpdateInfo& info = *it; @@ -203,8 +191,7 @@ void UpdateUVIndex(const std::list& l, unsigned int n) } // ------------------------------------------------------------------------------------------------ -inline const char* MappingModeToChar(aiTextureMapMode map) -{ +inline static const char* MappingModeToChar(aiTextureMapMode map) { if (aiTextureMapMode_Wrap == map) return "-w"; @@ -215,8 +202,7 @@ inline const char* MappingModeToChar(aiTextureMapMode map) } // ------------------------------------------------------------------------------------------------ -void TextureTransformStep::Execute( aiScene* pScene) -{ +void TextureTransformStep::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("TransformUVCoordsProcess begin"); diff --git a/code/PostProcessing/TextureTransform.h b/code/PostProcessing/TextureTransform.h index c1cccf8ef..873789f3e 100644 --- a/code/PostProcessing/TextureTransform.h +++ b/code/PostProcessing/TextureTransform.h @@ -193,14 +193,12 @@ struct STransformVecInfo : public aiUVTransform { /** Helper step to compute final UV coordinate sets if there are scalings * or rotations in the original data read from the file. */ -class TextureTransformStep : public BaseProcess -{ +class TextureTransformStep : public BaseProcess { public: - + // ------------------------------------------------------------------- + /// The default class constructor / destructor. TextureTransformStep(); - ~TextureTransformStep(); - -public: + ~TextureTransformStep() override = default; // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const; @@ -213,8 +211,6 @@ public: protected: - - // ------------------------------------------------------------------- /** Preprocess a specific UV transformation setup * @@ -223,10 +219,9 @@ protected: void PreProcessUVTransform(STransformVecInfo& info); private: - unsigned int configFlags; }; - -} + +} // namespace Assimp #endif //! AI_TEXTURE_TRANSFORM_H_INCLUDED diff --git a/code/PostProcessing/TriangulateProcess.cpp b/code/PostProcessing/TriangulateProcess.cpp index 8ba6456b7..52cfa66bf 100644 --- a/code/PostProcessing/TriangulateProcess.cpp +++ b/code/PostProcessing/TriangulateProcess.cpp @@ -156,15 +156,6 @@ namespace { } - -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -TriangulateProcess::TriangulateProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -TriangulateProcess::~TriangulateProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool TriangulateProcess::IsActive( unsigned int pFlags) const diff --git a/code/PostProcessing/TriangulateProcess.h b/code/PostProcessing/TriangulateProcess.h index ed5f4a587..fefeac61c 100644 --- a/code/PostProcessing/TriangulateProcess.h +++ b/code/PostProcessing/TriangulateProcess.h @@ -61,8 +61,10 @@ namespace Assimp { */ class ASSIMP_API TriangulateProcess : public BaseProcess { public: - TriangulateProcess(); - ~TriangulateProcess(); + // ------------------------------------------------------------------- + /// The default class constructor / destructor. + TriangulateProcess() = default; + ~TriangulateProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index d234e220b..cae35b895 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -60,12 +60,7 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -ValidateDSProcess::ValidateDSProcess() : - mScene() {} - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -ValidateDSProcess::~ValidateDSProcess() = default; +ValidateDSProcess::ValidateDSProcess() : mScene(nullptr) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. diff --git a/code/PostProcessing/ValidateDataStructure.h b/code/PostProcessing/ValidateDataStructure.h index 077a47b70..87c88669f 100644 --- a/code/PostProcessing/ValidateDataStructure.h +++ b/code/PostProcessing/ValidateDataStructure.h @@ -72,11 +72,11 @@ namespace Assimp { class ValidateDSProcess : public BaseProcess { public: - + // ------------------------------------------------------------------- + /// The default class constructor / destructor. ValidateDSProcess(); - ~ValidateDSProcess(); + ~ValidateDSProcess() override = default; -public: // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const; From 31ae9cde1ca1bd1df71c38fd39c2dab6a4ecba1a Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 14 Mar 2023 23:32:03 +0100 Subject: [PATCH 139/232] Refactoring: Code cleanup post-processing. --- code/PostProcessing/CalcTangentsProcess.cpp | 4 --- code/PostProcessing/CalcTangentsProcess.h | 15 ++++------- .../ComputeUVMappingProcess.cpp | 8 ------ code/PostProcessing/ComputeUVMappingProcess.h | 19 +++++-------- code/PostProcessing/ConvertToLHProcess.cpp | 16 ----------- code/PostProcessing/ConvertToLHProcess.h | 27 +++++++------------ code/PostProcessing/DeboneProcess.h | 4 +-- code/PostProcessing/DropFaceNormalsProcess.h | 5 ++-- code/PostProcessing/EmbedTexturesProcess.h | 6 ++--- code/PostProcessing/FindDegenerates.h | 6 ++--- code/PostProcessing/FindInstancesProcess.h | 15 +++++------ code/PostProcessing/FindInvalidDataProcess.h | 6 ++--- code/PostProcessing/FixNormalsStep.h | 4 +-- code/PostProcessing/GenFaceNormalsProcess.h | 5 ++-- code/PostProcessing/GenVertexNormalsProcess.h | 7 +++-- code/PostProcessing/ImproveCacheLocality.h | 6 ++--- code/PostProcessing/JoinVerticesProcess.h | 4 +-- code/PostProcessing/LimitBoneWeightsProcess.h | 18 ++++++------- code/PostProcessing/MakeVerboseFormat.h | 4 +-- code/PostProcessing/OptimizeMeshes.h | 8 +++--- .../PostProcessing/RemoveRedundantMaterials.h | 6 ++--- code/PostProcessing/RemoveVCProcess.h | 12 ++++----- code/PostProcessing/ScaleProcess.h | 6 ++--- code/PostProcessing/SortByPTypeProcess.h | 6 ++--- code/PostProcessing/SplitByBoneCountProcess.h | 2 +- code/PostProcessing/SplitLargeMeshes.h | 4 +-- code/PostProcessing/TextureTransform.h | 7 +++-- code/PostProcessing/TriangulateProcess.h | 4 +-- code/PostProcessing/ValidateDataStructure.h | 8 +++--- 29 files changed, 93 insertions(+), 149 deletions(-) diff --git a/code/PostProcessing/CalcTangentsProcess.cpp b/code/PostProcessing/CalcTangentsProcess.cpp index efc457766..a23ac856b 100644 --- a/code/PostProcessing/CalcTangentsProcess.cpp +++ b/code/PostProcessing/CalcTangentsProcess.cpp @@ -60,10 +60,6 @@ CalcTangentsProcess::CalcTangentsProcess() : // nothing to do here } -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -CalcTangentsProcess::~CalcTangentsProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool CalcTangentsProcess::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/CalcTangentsProcess.h b/code/PostProcessing/CalcTangentsProcess.h index 018789bae..94be99cd6 100644 --- a/code/PostProcessing/CalcTangentsProcess.h +++ b/code/PostProcessing/CalcTangentsProcess.h @@ -59,14 +59,11 @@ namespace Assimp * because the joining of vertices also considers tangents and bitangents for * uniqueness. */ -class ASSIMP_API_WINONLY CalcTangentsProcess : public BaseProcess -{ +class ASSIMP_API_WINONLY CalcTangentsProcess : public BaseProcess { public: - CalcTangentsProcess(); - ~CalcTangentsProcess(); + ~CalcTangentsProcess() override = default; -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. @@ -74,19 +71,17 @@ public: * @return true if the process is present in this flag fields, * false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - void SetupProperties(const Importer* pImp); - + void SetupProperties(const Importer* pImp) override; // setter for configMaxAngle - inline void SetMaxSmoothAngle(float f) - { + void SetMaxSmoothAngle(float f) { configMaxAngle =f; } diff --git a/code/PostProcessing/ComputeUVMappingProcess.cpp b/code/PostProcessing/ComputeUVMappingProcess.cpp index 237409f02..a5472668b 100644 --- a/code/PostProcessing/ComputeUVMappingProcess.cpp +++ b/code/PostProcessing/ComputeUVMappingProcess.cpp @@ -57,14 +57,6 @@ namespace { const static ai_real angle_epsilon = ai_real( 0.95 ); } -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -ComputeUVMappingProcess::ComputeUVMappingProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -ComputeUVMappingProcess::~ComputeUVMappingProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool ComputeUVMappingProcess::IsActive( unsigned int pFlags) const diff --git a/code/PostProcessing/ComputeUVMappingProcess.h b/code/PostProcessing/ComputeUVMappingProcess.h index 74744be7f..c4158f402 100644 --- a/code/PostProcessing/ComputeUVMappingProcess.h +++ b/code/PostProcessing/ComputeUVMappingProcess.h @@ -59,13 +59,10 @@ namespace Assimp { /** ComputeUVMappingProcess - converts special mappings, such as spherical, * cylindrical or boxed to proper UV coordinates for rendering. */ -class ComputeUVMappingProcess : public BaseProcess -{ -public: - ComputeUVMappingProcess(); - ~ComputeUVMappingProcess(); - +class ComputeUVMappingProcess : public BaseProcess { public: + ComputeUVMappingProcess() = default; + ~ComputeUVMappingProcess() override = default; // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. @@ -73,14 +70,14 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; protected: @@ -125,8 +122,7 @@ protected: private: // temporary structure to describe a mapping - struct MappingInfo - { + struct MappingInfo { explicit MappingInfo(aiTextureMapping _type) : type (_type) , axis (0.f,1.f,0.f) @@ -137,8 +133,7 @@ private: aiVector3D axis; unsigned int uv; - bool operator== (const MappingInfo& other) - { + bool operator== (const MappingInfo& other) { return type == other.type && axis == other.axis; } }; diff --git a/code/PostProcessing/ConvertToLHProcess.cpp b/code/PostProcessing/ConvertToLHProcess.cpp index 359c5a284..08e3fe48a 100644 --- a/code/PostProcessing/ConvertToLHProcess.cpp +++ b/code/PostProcessing/ConvertToLHProcess.cpp @@ -79,14 +79,6 @@ void flipUVs(aiMeshType *pMesh) { } // namespace -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -MakeLeftHandedProcess::MakeLeftHandedProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -MakeLeftHandedProcess::~MakeLeftHandedProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool MakeLeftHandedProcess::IsActive(unsigned int pFlags) const { @@ -305,14 +297,6 @@ void FlipUVsProcess::ProcessMesh(aiMesh *pMesh) { #ifndef ASSIMP_BUILD_NO_FLIPWINDING_PROCESS // # FlipWindingOrderProcess -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -FlipWindingOrderProcess::FlipWindingOrderProcess() = default; - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -FlipWindingOrderProcess::~FlipWindingOrderProcess() = default; - // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. bool FlipWindingOrderProcess::IsActive(unsigned int pFlags) const { diff --git a/code/PostProcessing/ConvertToLHProcess.h b/code/PostProcessing/ConvertToLHProcess.h index 474056c3a..d0532277d 100644 --- a/code/PostProcessing/ConvertToLHProcess.h +++ b/code/PostProcessing/ConvertToLHProcess.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -72,22 +71,18 @@ namespace Assimp { * * @note RH-LH and LH-RH is the same, so this class can be used for both */ -class MakeLeftHandedProcess : public BaseProcess -{ - - +class MakeLeftHandedProcess : public BaseProcess { public: - MakeLeftHandedProcess(); - ~MakeLeftHandedProcess(); + MakeLeftHandedProcess() = default; + ~MakeLeftHandedProcess() override = default; // ------------------------------------------------------------------- - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; protected: - // ------------------------------------------------------------------- /** Recursively converts a node and all of its children */ @@ -120,24 +115,22 @@ protected: // --------------------------------------------------------------------------- /** Postprocessing step to flip the face order of the imported data */ -class FlipWindingOrderProcess : public BaseProcess -{ +class FlipWindingOrderProcess : public BaseProcess { friend class Importer; public: /** Constructor to be privately used by Importer */ - FlipWindingOrderProcess(); + FlipWindingOrderProcess() = default; /** Destructor, private as well */ - ~FlipWindingOrderProcess(); + ~FlipWindingOrderProcess() override = default; // ------------------------------------------------------------------- - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; -public: /** Some other types of post-processing require winding order flips */ static void ProcessMesh( aiMesh* pMesh); }; diff --git a/code/PostProcessing/DeboneProcess.h b/code/PostProcessing/DeboneProcess.h index 080bc30d1..6e55ce238 100644 --- a/code/PostProcessing/DeboneProcess.h +++ b/code/PostProcessing/DeboneProcess.h @@ -79,14 +79,14 @@ public: * @return true if the process is present in this flag fields, * false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; protected: // ------------------------------------------------------------------- diff --git a/code/PostProcessing/DropFaceNormalsProcess.h b/code/PostProcessing/DropFaceNormalsProcess.h index 719c98dc7..df542f2ba 100644 --- a/code/PostProcessing/DropFaceNormalsProcess.h +++ b/code/PostProcessing/DropFaceNormalsProcess.h @@ -64,15 +64,14 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); - + void Execute( aiScene* pScene) override; private: bool DropMeshFaceNormals(aiMesh* pcMesh); diff --git a/code/PostProcessing/EmbedTexturesProcess.h b/code/PostProcessing/EmbedTexturesProcess.h index e09fa0896..77d4d9c72 100644 --- a/code/PostProcessing/EmbedTexturesProcess.h +++ b/code/PostProcessing/EmbedTexturesProcess.h @@ -68,13 +68,13 @@ public: ~EmbedTexturesProcess() override = default; /// Overwritten, @see BaseProcess - virtual bool IsActive(unsigned int pFlags) const; + bool IsActive(unsigned int pFlags) const override; /// Overwritten, @see BaseProcess - virtual void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; /// Overwritten, @see BaseProcess - virtual void Execute(aiScene* pScene); + virtual void Execute(aiScene* pScene) override; private: // Resolve the path and add the file content to the scene as a texture. diff --git a/code/PostProcessing/FindDegenerates.h b/code/PostProcessing/FindDegenerates.h index d1eb81615..6b37a47cf 100644 --- a/code/PostProcessing/FindDegenerates.h +++ b/code/PostProcessing/FindDegenerates.h @@ -63,15 +63,15 @@ public: // ------------------------------------------------------------------- // Check whether step is active - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- // Execute step on a given scene - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- // Setup import settings - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; // ------------------------------------------------------------------- // Execute step on a given mesh diff --git a/code/PostProcessing/FindInstancesProcess.h b/code/PostProcessing/FindInstancesProcess.h index b6c61527a..6927301ca 100644 --- a/code/PostProcessing/FindInstancesProcess.h +++ b/code/PostProcessing/FindInstancesProcess.h @@ -50,7 +50,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "PostProcessing/ProcessHelper.h" class FindInstancesProcessTest; -namespace Assimp { + +namespace Assimp { // ------------------------------------------------------------------------------- /** @brief Get a pseudo(!)-hash representing a mesh. @@ -60,8 +61,7 @@ namespace Assimp { * @param in Input mesh * @return Hash. */ -inline -uint64_t GetMeshHash(aiMesh* in) { +inline uint64_t GetMeshHash(aiMesh* in) { ai_assert(nullptr != in); // ... get an unique value representing the vertex format of the mesh @@ -83,8 +83,7 @@ uint64_t GetMeshHash(aiMesh* in) { * @param e Epsilon * @return true if the arrays are identical */ -inline -bool CompareArrays(const aiVector3D* first, const aiVector3D* second, +inline bool CompareArrays(const aiVector3D* first, const aiVector3D* second, unsigned int size, float e) { for (const aiVector3D* end = first+size; first != end; ++first,++second) { if ( (*first - *second).SquareLength() >= e) @@ -114,15 +113,15 @@ public: // ------------------------------------------------------------------- // Check whether step is active in given flags combination - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- // Execute step on a given scene - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- // Setup properties prior to executing the process - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; private: bool configSpeedFlag; diff --git a/code/PostProcessing/FindInvalidDataProcess.h b/code/PostProcessing/FindInvalidDataProcess.h index 14746864f..024eb9b1e 100644 --- a/code/PostProcessing/FindInvalidDataProcess.h +++ b/code/PostProcessing/FindInvalidDataProcess.h @@ -71,15 +71,15 @@ public: // ------------------------------------------------------------------- /// Returns active state. - bool IsActive(unsigned int pFlags) const; + bool IsActive(unsigned int pFlags) const override; // ------------------------------------------------------------------- /// Setup import settings - void SetupProperties(const Importer *pImp); + void SetupProperties(const Importer *pImp) override; // ------------------------------------------------------------------- /// Run the step - void Execute(aiScene *pScene); + void Execute(aiScene *pScene) override; // ------------------------------------------------------------------- /// Executes the post-processing step on the given mesh diff --git a/code/PostProcessing/FixNormalsStep.h b/code/PostProcessing/FixNormalsStep.h index e5f5c8a1f..20be1958b 100644 --- a/code/PostProcessing/FixNormalsStep.h +++ b/code/PostProcessing/FixNormalsStep.h @@ -69,14 +69,14 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; protected: diff --git a/code/PostProcessing/GenFaceNormalsProcess.h b/code/PostProcessing/GenFaceNormalsProcess.h index b1babca28..94794631e 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.h +++ b/code/PostProcessing/GenFaceNormalsProcess.h @@ -66,15 +66,14 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); - + void Execute( aiScene* pScene) override; private: bool GenMeshFaceNormals(aiMesh* pcMesh); diff --git a/code/PostProcessing/GenVertexNormalsProcess.h b/code/PostProcessing/GenVertexNormalsProcess.h index 3999fc3e9..b7db9c4f2 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.h +++ b/code/PostProcessing/GenVertexNormalsProcess.h @@ -72,22 +72,21 @@ public: * @return true if the process is present in this flag fields, * false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); - + void Execute( aiScene* pScene) override; // setter for configMaxAngle inline void SetMaxSmoothAngle(ai_real f) { diff --git a/code/PostProcessing/ImproveCacheLocality.h b/code/PostProcessing/ImproveCacheLocality.h index 34a3883da..6f4d55719 100644 --- a/code/PostProcessing/ImproveCacheLocality.h +++ b/code/PostProcessing/ImproveCacheLocality.h @@ -69,15 +69,15 @@ public: // ------------------------------------------------------------------- // Check whether the pp step is active - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- // Executes the pp step on a given scene - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- // Configures the pp step - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; protected: // ------------------------------------------------------------------- diff --git a/code/PostProcessing/JoinVerticesProcess.h b/code/PostProcessing/JoinVerticesProcess.h index de8cea691..aa8dc5794 100644 --- a/code/PostProcessing/JoinVerticesProcess.h +++ b/code/PostProcessing/JoinVerticesProcess.h @@ -74,14 +74,14 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- /** Unites identical vertices in the given mesh. diff --git a/code/PostProcessing/LimitBoneWeightsProcess.h b/code/PostProcessing/LimitBoneWeightsProcess.h index 855c8628a..b19d536cf 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.h +++ b/code/PostProcessing/LimitBoneWeightsProcess.h @@ -86,27 +86,27 @@ public: * @return true if the process is present in this flag fields, * false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - void SetupProperties(const Importer* pImp); - - // ------------------------------------------------------------------- - /** Limits the bone weight count for all vertices in the given mesh. - * @param pMesh The mesh to process. - */ - void ProcessMesh( aiMesh* pMesh); + void SetupProperties(const Importer* pImp) override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; + + // ------------------------------------------------------------------- + /** Limits the bone weight count for all vertices in the given mesh. + * @param pMesh The mesh to process. + */ + void ProcessMesh( aiMesh* pMesh); // ------------------------------------------------------------------- /** Describes a bone weight on a vertex */ diff --git a/code/PostProcessing/MakeVerboseFormat.h b/code/PostProcessing/MakeVerboseFormat.h index b7ac10019..f21f5919e 100644 --- a/code/PostProcessing/MakeVerboseFormat.h +++ b/code/PostProcessing/MakeVerboseFormat.h @@ -78,7 +78,7 @@ public: * @param pFlags The processing flags the importer was called with. A bitwise * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not */ - bool IsActive( unsigned int /*pFlags*/ ) const + bool IsActive( unsigned int /*pFlags*/ ) const override { // NOTE: There is no direct flag that corresponds to // this postprocess step. @@ -89,7 +89,7 @@ public: /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; public: diff --git a/code/PostProcessing/OptimizeMeshes.h b/code/PostProcessing/OptimizeMeshes.h index 1109a30e7..0b062959a 100644 --- a/code/PostProcessing/OptimizeMeshes.h +++ b/code/PostProcessing/OptimizeMeshes.h @@ -93,16 +93,14 @@ public: unsigned int output_id; }; -public: // ------------------------------------------------------------------- - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- - void SetupProperties(const Importer* pImp); - + void SetupProperties(const Importer* pImp) override; // ------------------------------------------------------------------- /** @brief Specify whether you want meshes with different diff --git a/code/PostProcessing/RemoveRedundantMaterials.h b/code/PostProcessing/RemoveRedundantMaterials.h index 0fbf33c1b..1b42bea55 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.h +++ b/code/PostProcessing/RemoveRedundantMaterials.h @@ -66,15 +66,15 @@ public: // ------------------------------------------------------------------- // Check whether step is active - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- // Execute step on a given scene - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- // Setup import settings - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; // ------------------------------------------------------------------- /** @brief Set list of fixed (inmutable) materials diff --git a/code/PostProcessing/RemoveVCProcess.h b/code/PostProcessing/RemoveVCProcess.h index dfd9b59ff..45c0b3a71 100644 --- a/code/PostProcessing/RemoveVCProcess.h +++ b/code/PostProcessing/RemoveVCProcess.h @@ -69,37 +69,35 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - virtual void SetupProperties(const Importer* pImp); + virtual void SetupProperties(const Importer* pImp) override; // ------------------------------------------------------------------- /** Manually setup the configuration flags for the step * * @param Bitwise combination of the #aiComponent enumerated values. */ - void SetDeleteFlags(unsigned int f) - { + void SetDeleteFlags(unsigned int f) { configDeleteFlags = f; } // ------------------------------------------------------------------- /** Query the current configuration. */ - unsigned int GetDeleteFlags() const - { + unsigned int GetDeleteFlags() const { return configDeleteFlags; } diff --git a/code/PostProcessing/ScaleProcess.h b/code/PostProcessing/ScaleProcess.h index 4d706bfc3..ae1c3ed00 100644 --- a/code/PostProcessing/ScaleProcess.h +++ b/code/PostProcessing/ScaleProcess.h @@ -74,13 +74,13 @@ public: ai_real getScale() const; /// Overwritten, @see BaseProcess - virtual bool IsActive( unsigned int pFlags ) const; + virtual bool IsActive( unsigned int pFlags ) const override; /// Overwritten, @see BaseProcess - virtual void SetupProperties( const Importer* pImp ); + virtual void SetupProperties( const Importer* pImp ) override; /// Overwritten, @see BaseProcess - virtual void Execute( aiScene* pScene ); + virtual void Execute( aiScene* pScene ) override; private: void traverseNodes( aiNode *currentNode, unsigned int nested_node_id = 0 ); diff --git a/code/PostProcessing/SortByPTypeProcess.h b/code/PostProcessing/SortByPTypeProcess.h index c004e0549..ce4f7da62 100644 --- a/code/PostProcessing/SortByPTypeProcess.h +++ b/code/PostProcessing/SortByPTypeProcess.h @@ -66,13 +66,13 @@ public: ~SortByPTypeProcess() override = default; // ------------------------------------------------------------------- - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; private: int mConfigRemoveMeshes; diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index e2377a995..e8a36140d 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -75,7 +75,7 @@ public: /// @brief Called prior to ExecuteOnScene(). /// The function is a request to the process to update its configuration /// basing on the Importer's configuration property list. - virtual void SetupProperties(const Importer* pImp); + virtual void SetupProperties(const Importer* pImp) override; protected: /// Executes the post processing step on the given imported data. diff --git a/code/PostProcessing/SplitLargeMeshes.h b/code/PostProcessing/SplitLargeMeshes.h index 605f0477d..955b03aa6 100644 --- a/code/PostProcessing/SplitLargeMeshes.h +++ b/code/PostProcessing/SplitLargeMeshes.h @@ -99,7 +99,7 @@ public: * @return true if the process is present in this flag fields, * false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). @@ -121,7 +121,7 @@ public: * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- //! Apply the algorithm to a given mesh diff --git a/code/PostProcessing/TextureTransform.h b/code/PostProcessing/TextureTransform.h index 873789f3e..c9f0480ba 100644 --- a/code/PostProcessing/TextureTransform.h +++ b/code/PostProcessing/TextureTransform.h @@ -201,14 +201,13 @@ public: ~TextureTransformStep() override = default; // ------------------------------------------------------------------- - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- - void SetupProperties(const Importer* pImp); - + void SetupProperties(const Importer* pImp) override; protected: // ------------------------------------------------------------------- diff --git a/code/PostProcessing/TriangulateProcess.h b/code/PostProcessing/TriangulateProcess.h index fefeac61c..ac31e4377 100644 --- a/code/PostProcessing/TriangulateProcess.h +++ b/code/PostProcessing/TriangulateProcess.h @@ -72,14 +72,14 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- /** Triangulates the given mesh. diff --git a/code/PostProcessing/ValidateDataStructure.h b/code/PostProcessing/ValidateDataStructure.h index 87c88669f..9cfd4ced1 100644 --- a/code/PostProcessing/ValidateDataStructure.h +++ b/code/PostProcessing/ValidateDataStructure.h @@ -69,8 +69,7 @@ namespace Assimp { /** Validates the whole ASSIMP scene data structure for correctness. * ImportErrorException is thrown of the scene is corrupt.*/ // -------------------------------------------------------------------------------------- -class ValidateDSProcess : public BaseProcess -{ +class ValidateDSProcess : public BaseProcess { public: // ------------------------------------------------------------------- /// The default class constructor / destructor. @@ -78,13 +77,12 @@ public: ~ValidateDSProcess() override = default; // ------------------------------------------------------------------- - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; protected: - // ------------------------------------------------------------------- /** Report a validation error. This will throw an exception, * control won't return. From 45c1da26b3916a49478ed196b80ba9b5dc9590d2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 14 Mar 2023 23:34:31 +0100 Subject: [PATCH 140/232] Refactoring: Code cleanup post-processing. --- code/PostProcessing/DeboneProcess.h | 2 +- code/PostProcessing/SplitByBoneCountProcess.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/PostProcessing/DeboneProcess.h b/code/PostProcessing/DeboneProcess.h index 6e55ce238..ae4448e0e 100644 --- a/code/PostProcessing/DeboneProcess.h +++ b/code/PostProcessing/DeboneProcess.h @@ -94,7 +94,7 @@ protected: * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- /** Counts bones total/removable in a given mesh. diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index e8a36140d..270e00c49 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -81,7 +81,7 @@ protected: /// Executes the post processing step on the given imported data. /// At the moment a process is not supposed to fail. /// @param pScene The imported data to work at. - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; /// Splits the given mesh by bone count. /// @param pMesh the Mesh to split. Is not changed at all, but might be superfluous in case it was split. From 59d97119283aac5f4404c4badcc17618279b7e89 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 14 Mar 2023 23:37:10 +0100 Subject: [PATCH 141/232] Refactoring: Code cleanup post-processing. --- code/PostProcessing/SplitLargeMeshes.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/code/PostProcessing/SplitLargeMeshes.h b/code/PostProcessing/SplitLargeMeshes.h index 955b03aa6..4e0d764c1 100644 --- a/code/PostProcessing/SplitLargeMeshes.h +++ b/code/PostProcessing/SplitLargeMeshes.h @@ -156,15 +156,14 @@ public: * combination of #aiPostProcessSteps. * @return true if the process is present in this flag fields, false if not. */ - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; // ------------------------------------------------------------------- /** Called prior to ExecuteOnScene(). * The function is a request to the process to update its configuration * basing on the Importer's configuration property list. */ - virtual void SetupProperties(const Importer* pImp); - + void SetupProperties(const Importer* pImp) override; //! Set the split limit - needed for unit testing inline void SetLimit(unsigned int l) @@ -174,14 +173,12 @@ public: inline unsigned int GetLimit() const {return LIMIT;} -public: - // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; // ------------------------------------------------------------------- //! Apply the algorithm to a given mesh From c537bd78d0f3c80d0048845a427adc2dd3b1f2c7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 14 Mar 2023 23:39:36 +0100 Subject: [PATCH 142/232] Refactoring: Code cleanup post-processing. --- code/PostProcessing/CalcTangentsProcess.h | 4 +--- code/PostProcessing/SplitByBoneCountProcess.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/code/PostProcessing/CalcTangentsProcess.h b/code/PostProcessing/CalcTangentsProcess.h index 94be99cd6..aaccb5307 100644 --- a/code/PostProcessing/CalcTangentsProcess.h +++ b/code/PostProcessing/CalcTangentsProcess.h @@ -86,7 +86,6 @@ public: } protected: - // ------------------------------------------------------------------- /** Calculates tangents and bitangents for a specific mesh. * @param pMesh The mesh to process. @@ -98,10 +97,9 @@ protected: /** Executes the post processing step on the given imported data. * @param pScene The imported data to work at. */ - void Execute( aiScene* pScene); + void Execute( aiScene* pScene) override; private: - /** Configuration option: maximum smoothing angle, in radians*/ float configMaxAngle; unsigned int configSourceUV; diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index 270e00c49..98ca6a61e 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -70,7 +70,7 @@ public: /// @param pFlags The processing flags the importer was called with. A /// bitwise combination of #aiPostProcessSteps. /// @return true if the process is present in this flag fields, false if not. - bool IsActive( unsigned int pFlags) const; + bool IsActive( unsigned int pFlags) const override; /// @brief Called prior to ExecuteOnScene(). /// The function is a request to the process to update its configuration From 7e5a178637ff4dbac91e55937035af0434d86bb0 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 14 Mar 2023 23:49:41 +0100 Subject: [PATCH 143/232] Update: Add missing geo doc. --- code/Geometry/GeometryUtils.cpp | 43 ++++++++++++++- code/Geometry/GeometryUtils.h | 54 +++++++++++++++++++ code/PostProcessing/SplitByBoneCountProcess.h | 1 - 3 files changed, 95 insertions(+), 3 deletions(-) diff --git a/code/Geometry/GeometryUtils.cpp b/code/Geometry/GeometryUtils.cpp index 9b29af1dd..ab735aa6e 100644 --- a/code/Geometry/GeometryUtils.cpp +++ b/code/Geometry/GeometryUtils.cpp @@ -1,3 +1,44 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2022, 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. + +---------------------------------------------------------------------- +*/ + #include "GeometryUtils.h" #include @@ -20,8 +61,6 @@ ai_real GeometryUtils::distance3D( const aiVector3D &vA, aiVector3D &vB ) { return d; } - - ai_real GeometryUtils::calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh ) { ai_real area = 0; diff --git a/code/Geometry/GeometryUtils.h b/code/Geometry/GeometryUtils.h index 2eb96926d..ab49380de 100644 --- a/code/Geometry/GeometryUtils.h +++ b/code/Geometry/GeometryUtils.h @@ -1,12 +1,66 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2022, 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. + +---------------------------------------------------------------------- +*/ + #include #include namespace Assimp { +// --------------------------------------------------------------------------- +/// @brief This helper class supports some basic geometry algorithms. +// --------------------------------------------------------------------------- class GeometryUtils { public: static ai_real heron( ai_real a, ai_real b, ai_real c ); + + /// @brief Will compute the distance between 2 3D-vectors + /// @param vA Vector a. + /// @param vB Vector b. + /// @return The distance. static ai_real distance3D( const aiVector3D &vA, aiVector3D &vB ); + + /// @brief Will calculate the area of a triangle described by a aiFace. + /// @param face The face + /// @param mesh The mesh containing the face + /// @return The area. static ai_real calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh ); }; diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index 98ca6a61e..625019e0c 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, From 16f9ba4935c2b1c83e13cc4081a92294c792c9f0 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 15 Mar 2023 13:26:24 +0100 Subject: [PATCH 144/232] Remove alarm badge --- Readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Readme.md b/Readme.md index 917b8e8aa..1af71fad8 100644 --- a/Readme.md +++ b/Readme.md @@ -14,7 +14,6 @@ A library to import and export various 3d-model-formats including scene-post-pro [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/assimp/assimp.svg)](http://isitmaintained.com/project/assimp/assimp "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/assimp/assimp.svg)](http://isitmaintained.com/project/assimp/assimp "Percentage of issues still open") -[![Total alerts](https://img.shields.io/lgtm/alerts/g/assimp/assimp.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/assimp/assimp/alerts/)
APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS. From 95616cf5b56af37df8d299a89a99450643e688aa Mon Sep 17 00:00:00 2001 From: Steve M Date: Fri, 17 Mar 2023 22:13:40 -0700 Subject: [PATCH 145/232] Add UTF-8 versions of UTF-16LE files Also duplicate missing textures for local model access --- test/models-nonbsd/BLEND/guard1_body.png | Bin 0 -> 233429 bytes test/models-nonbsd/BLEND/guard1_face.png | Bin 0 -> 121149 bytes test/models-nonbsd/BLEND/guard1_helmet.png | Bin 0 -> 47481 bytes test/models-nonbsd/BLEND/iron_grill.png | Bin 0 -> 65146 bytes test/models-nonbsd/BLEND/round_grill.png | Bin 0 -> 48671 bytes test/models-nonbsd/IRR/skybox.xml | Bin 23794 -> 11642 bytes test/models-nonbsd/IRR/skybox_UTF16LE.xml | Bin 0 -> 23794 bytes test/models/IRR/1.png | Bin 0 -> 28975 bytes .../IRR/EpisodeII_TheDwarfesStrikeBack.irr | Bin 95946 -> 46924 bytes ...EpisodeII_TheDwarfesStrikeBack_UTF16LE.irr | Bin 0 -> 95946 bytes test/models/IRR/EpisodeI_ANewDwarf.irr | Bin 72612 -> 35514 bytes .../models/IRR/EpisodeI_ANewDwarf_UTF16LE.irr | Bin 0 -> 72612 bytes test/models/IRR/animMesh.irr | Bin 12938 -> 6324 bytes test/models/IRR/animMesh_UTF16LE.irr | Bin 0 -> 12938 bytes test/models/IRR/box.irr | Bin 5368 -> 2618 bytes test/models/IRR/box_UTF16LE.irr | Bin 0 -> 5368 bytes test/models/IRR/brownground_1-1.jpg | Bin 0 -> 66623 bytes test/models/IRR/crackedground_1-6.jpg | Bin 0 -> 41455 bytes .../models/IRR/dawfInCellar_ChildOfCellar.irr | Bin 21892 -> 10707 bytes .../dawfInCellar_ChildOfCellar_UTF16LE.irr | Bin 0 -> 21892 bytes .../models/IRR/dawfInCellar_SameHierarchy.irr | Bin 21630 -> 10576 bytes .../dawfInCellar_SameHierarchy_UTF16LE.irr | Bin 0 -> 21630 bytes test/models/IRR/multipleAnimators.irr | Bin 6654 -> 3244 bytes test/models/IRR/multipleAnimators_UTF16LE.irr | Bin 0 -> 6654 bytes test/models/IRR/scenegraphAnim.irr | Bin 47716 -> 23306 bytes test/models/IRR/scenegraphAnim_UTF16LE.irr | Bin 0 -> 47716 bytes test/models/IRR/sphere.irr | Bin 5588 -> 2726 bytes test/models/IRR/sphere_UTF16LE.irr | Bin 0 -> 5588 bytes test/models/IRRMesh/cellar.irrmesh | Bin 188818 -> 93467 bytes test/models/IRRMesh/cellar_UTF16LE.irrmesh | Bin 0 -> 188818 bytes test/models/IRRMesh/spider.irrmesh | Bin 293192 -> 144852 bytes test/models/IRRMesh/spider_UTF16LE.irrmesh | Bin 0 -> 293192 bytes test/models/IRRMesh/testFormatDetection.xml | Bin 53842 -> 26504 bytes .../IRRMesh/testFormatDetection_UTF16LE.xml | Bin 0 -> 53842 bytes 34 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/models-nonbsd/BLEND/guard1_body.png create mode 100644 test/models-nonbsd/BLEND/guard1_face.png create mode 100644 test/models-nonbsd/BLEND/guard1_helmet.png create mode 100644 test/models-nonbsd/BLEND/iron_grill.png create mode 100644 test/models-nonbsd/BLEND/round_grill.png create mode 100644 test/models-nonbsd/IRR/skybox_UTF16LE.xml create mode 100644 test/models/IRR/1.png create mode 100644 test/models/IRR/EpisodeII_TheDwarfesStrikeBack_UTF16LE.irr create mode 100644 test/models/IRR/EpisodeI_ANewDwarf_UTF16LE.irr create mode 100644 test/models/IRR/animMesh_UTF16LE.irr create mode 100644 test/models/IRR/box_UTF16LE.irr create mode 100644 test/models/IRR/brownground_1-1.jpg create mode 100644 test/models/IRR/crackedground_1-6.jpg create mode 100644 test/models/IRR/dawfInCellar_ChildOfCellar_UTF16LE.irr create mode 100644 test/models/IRR/dawfInCellar_SameHierarchy_UTF16LE.irr create mode 100644 test/models/IRR/multipleAnimators_UTF16LE.irr create mode 100644 test/models/IRR/scenegraphAnim_UTF16LE.irr create mode 100644 test/models/IRR/sphere_UTF16LE.irr create mode 100644 test/models/IRRMesh/cellar_UTF16LE.irrmesh create mode 100644 test/models/IRRMesh/spider_UTF16LE.irrmesh create mode 100644 test/models/IRRMesh/testFormatDetection_UTF16LE.xml diff --git a/test/models-nonbsd/BLEND/guard1_body.png b/test/models-nonbsd/BLEND/guard1_body.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb3f2caaddd89d6c69c10983e5df684ca339aae GIT binary patch literal 233429 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

P#Z!*8z+dW{BJKx?@gG{%doq$!csU#TE_I=B$A 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 literal 0 HcmV?d00001 diff --git a/test/models-nonbsd/BLEND/guard1_face.png b/test/models-nonbsd/BLEND/guard1_face.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e17d37598ba766b5535b44dd32ba59a0c7038d GIT binary patch literal 121149 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 literal 0 HcmV?d00001 diff --git a/test/models-nonbsd/BLEND/guard1_helmet.png b/test/models-nonbsd/BLEND/guard1_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..166d790fd4f30e332a422d61434bd6a4a1eff5f3 GIT binary patch literal 47481 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®|n?^N>qUHr6C2YrAHp#7-q0@K4 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 z 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 Z{U1?;VVMpbh8X|=002ovPDHLkV1nGxqoV)- literal 0 HcmV?d00001 diff --git a/test/models-nonbsd/BLEND/iron_grill.png b/test/models-nonbsd/BLEND/iron_grill.png new file mode 100644 index 0000000000000000000000000000000000000000..53a3bbbcc2893daded718aa58051eb7d173c0668 GIT binary patch literal 65146 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 M07*qoM6N<$f;iJ4T>t<8 literal 0 HcmV?d00001 diff --git a/test/models-nonbsd/IRR/skybox.xml b/test/models-nonbsd/IRR/skybox.xml index a572e473f27f5d25ab1829395068acb74215dd2b..a2be5b785eb0e191c1cab65400fa6b5f22bd00fc 100644 GIT binary patch literal 11642 zcmeHN-A>yu6uwTMqRRC~3+yt0=zs}nVrWG};s&{?Qw&ZV`KN-t+Aj7;dxg3AJ5Exk zX45X1+>0tv&v$%2`<(M7u7Cab8J#?*biBq~5SAT<`+L*y^$>p*!c)wr&95c#zQdyj) z3xYHGnXDc(zH&C*n--sUKjJVq2&N-uOZx&5mqj0Iz~ z;_;0LvM}(HEA6aU=^(_@km!XGz05K~w+&X7LO!)andL)E!~kxHrPM z6ovhl#iO3)t-iaN5JWm0%!wX;la{>51Zh2 z7=GAdXyoB7;W*JV1FO`^?;tX4KQYCTTFxKP(kuwGf?D=P7c?#HuJ3L+k@!4AW@&cJ zq15hXDoHS8ijh%9xHA+#B`C(-0=C9`!B)c&7|yR4PZ1^Gad`n**a_Nz%!uwI81V~2 zbsa;pSmS8}AT=BTkRpx%NEIvKhFeJ3X?Gw%!x;iZoFPEP4mr(;V3M<(#N8!%1;~X@ zZzLB+J&=`?p;}cZy5%T060B@b_c29jUVcN<*bW9(Rhz279OoFxU1*^9Cura~gl@~D z*Tc7`hx=X+%}2?Wbb39kACs&CYP2Zh5xzBxZ2>j9k{iHiL^eQ2+@R;$6{G_J8qN?P z;tT;Qc1TZfT-fwLE_`|*7e+mhmD6@f12%10DO7Qnq5-Qm*z2MBHtF9F>#kL0$*bNE zr(O@e9{TsgX1~I&R2>O*QI8J9svXATMo(}+LF}RRK%gA20J$*gjb!EI_0aE^hHvlv z@X+g_*F&#|UJo(%dZ;%z+kfztd%ByAUeNuacT>M#8bs#*fp1R_Rqh4R3!)c9FNj_c zixV(j5UUe4uzPLp#{TyQYL=N7L@$V55WOIJLHq}T7){Irr_p3{5?P-;jwa@r>fd&} B@`eBa literal 23794 zcmeHPQE%He5Wd$A*ncScyscTY$81Hiv_pZRD;8q~`Vu&f?WK#8K(>o)KYrWyi83Tw zN7AC{q7Mhdh$7K<$NP@Q`$S6r{d*!WnjXx&_?V9z~%$1Bf0X*ZCt+LH4|uIrYcAg`72E&9^`{RDDv@vUUGCFK-$ zU7;83<4S(T(Omv)Z15!?)jm3cpWNpgNXk9uTX=%rhW)wm_#N!OhMiAg-QV)i_-rYE z;lDFndqlsx7^P8SiyWNzn=yR30&)+q$Jubz*x+MF9s8k235?hY^bx^hc)^dTcR0^z zUg67#?nhP`oLpqbZTTG*&^up(Ef??^$Hr9gh#T>nSUwU)^DgK7$aNke@*H12Dt`bC zqH-0mfZ2m1Uz5nuxW>rzC7$9OV_?zvcOpOI%q>2Qu({I9S>69-K#LZa=V;4}Hkb2S z%UDwVVBYMC0}sVI6pDh-!y(`Gc>P1( znheypdRa%pO_Q6uS=`BMGx0XI-8|fvJ45E~e)>LVk3!PV;Q{`74gYJSp(~lk!=%50 zry1*vc4mjZ_3b!wN5kY_)Y*Pg$2#+FU;b|P&oEN%Yt((;Utq@LSm2lQ_)^iZok8^; zgfzT^)(YQ6Gdss;)?C>yvh8O5@`zEmhLxOQyY>2kEkRjvnGDD(G|{=F6Zcy zf5BKF-bCtJI0nY}8=6VNvla7>uA!|aLsIiB{~+&SH|w3LysBe0G{>go)2{8h`U9%T zb)79aa}a+&+O_#E?1M9Sb%Gj|mXJxLX6zh4zXp=?Jw2f#_!g3@dLCts@el0pp3(AT z%Hz78Ge~z;%oKjAHSt*=r2Uv|7rq zRxW|+E!r;7x_hiwB|~&;n8kFn2H`yya;E*YYbbs`?HaE6+T(0=!y}DrZtimK#??Yh z*0|;-qKs?CxhC)C8Q0WvwO)lA*X-ZLHLmI34Kl9j)}uCASRYBoHMds;!gomG98jx~ z^LR{Lk5&&KLXTGY9zu^+fyc%MHwyx=C89#PLxSQ3kd20D__jOIK4jb3hX9~SSHm+%0 z({ZRUGcc}cT$35R60JJs%9p->E*w#D4yermd7LS(N2`Yqp{E>wiT6iCC$B$go>UH_ zw61bErFE6VDy=IAuOWO-!^p41x@(!;W4(eHqFci(rrWrtaZP`g4Xr#H*EFsf+r8{( znZt3-W8<3Gfuhe8#x?tUs&${(x~4xujcfX|pdK~0u4(I}dvQY?DuK>J_f7Y;M2fXyon6+dL_&-9_+g z;O;8&C3c3yo>sM8w0<>WE1R~m`6aAuUgNC>#x{*@8ruxN(QlQp>(SOW{kyKVw%L7S zY)(YQ*XXqUe|hX8uBRM}iR&rHVB&hTDmTw>X;xMaqqMGaIHh%!!z!&S2d^QFPs1q2 ldhD6aGH)l+aEo)KYrWyi83Tw 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 literal 0 HcmV?d00001 diff --git a/test/models/IRR/EpisodeII_TheDwarfesStrikeBack.irr b/test/models/IRR/EpisodeII_TheDwarfesStrikeBack.irr index 1f0916d4d9e64229b276098dd3a83315a29f4370..94d0bae6f2c454bc6d66ac4cddbad8798a9400a5 100644 GIT binary patch literal 46924 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 diff --git a/test/models/IRR/EpisodeI_ANewDwarf_UTF16LE.irr b/test/models/IRR/EpisodeI_ANewDwarf_UTF16LE.irr new file mode 100644 index 0000000000000000000000000000000000000000..39d99e440925950cf4460a8794aeb968a445ef30 GIT binary patch literal 72612 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 literal 0 HcmV?d00001 diff --git a/test/models/IRR/animMesh.irr b/test/models/IRR/animMesh.irr index d1c9e10183ae5671b19e5b50b4de56393f03b1b0..c1c247ff2274d0d3a03e0ed897cf9cbd04fd0020 100644 GIT binary patch literal 6324 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 B5!nC$ literal 5368 zcmc&&T~8W86uqxD>3=Xjx0TjD(i*7Rm^9WDQxjhZtbnwzm}N1xKfdibGpoD9+}(u{ zYzVUM%$|GaocjfT|1{-L?qwYVAbavw-be$Vhw@Qg$_r^?Ey1gc zT@iN2c-s}O?qIzqDP9To^<{yp0e0FQJ7#^Jt;RBf#Tfgi*h5=q+4Y|Bqz8`{*-8R` zW_XS(`wrR|2Be}_ZaFH8^ zqXu}guU9|{z2|z^#A(aNBb<|p9pKb%1fAnPqc_Ey5$s3OW^}QUTCyC&KF-X1a#i^bHK{}ocUBnjdF$Sg?zmbW$ z3Gf+VBjuFz>|V8?#pDsZVf7lxk+IN|x-+mw`th#waSAqa3twUBM;6t-Izyw?yo8-0 zPCPRny8Lv&!|&{wWwn~fPR>gca<|ewv zS$!{d0*jYdbC(admixFvRR7{@nUiYtBQU_H7tmG9up%}yL{7~AR5wv8VhBrBHndu@X&YK?*|ZI<)`Zx&0PpK5 z5~h2#9Zi*O*wK{Ph8<0vFgqyaO>6IH|=z= YZ@MUL_}@19{KGF``7e>YTlGujKaRB&;Q#;t diff --git a/test/models/IRR/box_UTF16LE.irr b/test/models/IRR/box_UTF16LE.irr new file mode 100644 index 0000000000000000000000000000000000000000..efc165d934a0dfede0a168772740e9c8cc57f088 GIT binary patch literal 5368 zcmc&&T~8W86uqxD>3=Xjx0TjD(i*7Rm^9WDQxjhZtbnwzm}N1xKfdibGpoD9+}(u{ zYzVUM%$|GaocjfT|1{-L?qwYVAbavw-be$Vhw@Qg$_r^?Ey1gc zT@iN2c-s}O?qIzqDP9To^<{yp0e0FQJ7#^Jt;RBf#Tfgi*h5=q+4Y|Bqz8`{*-8R` zW_XS(`wrR|2Be}_ZaFH8^ zqXu}guU9|{z2|z^#A(aNBb<|p9pKb%1fAnPqc_Ey5$s3OW^}QUTCyC&KF-X1a#i^bHK{}ocUBnjdF$Sg?zmbW$ z3Gf+VBjuFz>|V8?#pDsZVf7lxk+IN|x-+mw`th#waSAqa3twUBM;6t-Izyw?yo8-0 zPCPRny8Lv&!|&{wWwn~fPR>gca<|ewv zS$!{d0*jYdbC(admixFvRR7{@nUiYtBQU_H7tmG9up%}yL{7~AR5wv8VhBrBHndu@X&YK?*|ZI<)`Zx&0PpK5 z5~h2#9Zi*O*wK{Ph8<0vFgqyaO>6IH|=z= YZ@MUL_}@19{KGF``7e>YTlGujKaRB&;Q#;t literal 0 HcmV?d00001 diff --git a/test/models/IRR/brownground_1-1.jpg b/test/models/IRR/brownground_1-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fda7d45c6e9b1b1d36d37b9cc16c8776693d030a GIT binary patch literal 66623 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

DsW;M~OSyXw=|Do>DsW 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 Yg&ixoukO6~VPpBD%;w6S;~#7O1N6d`kpKVy literal 21892 zcmeHPYj4{&6y?_r*ncScc}??d7a&{FuI&(DeV{Scp=w)vtc&z z{?zUUC0se)rOx0`U^< zFVKcqZ|3I@3QdO4=yrZ*3Vp8dIo^5XNIQds*^-caW5N&DHP#z4hC(wD=|TA4AXk(C%+@ zJ+~RHdIOCgIQ+yJVv7`xT+J=l-PoZf9FZgRiwy0cm+pvphwB`zGaMYT)WPLu58UjT z@69&Y-vTS-hGTjU=R0N>f1ecB9^$_Z9OY}fHdf-=yoV06f-j#oc}9h`ZP+qLuo_4I zMA(G=-$&1PVV5nOl{P8IFW=QQ#qcru%o*hJ@+W}%ju8-K0g0~xwb^J5)H9leI`|=#v0N;D3oLqiN6H z19gab`4%jk!~480tjAU4Y~GJHJ#6CdXk|MJswj&UhWGtGlXJ(;A3e?na}QeAnj_7w z07SpW3V4ATR38JxU#u$2qqw@J)GOXkiPX1A`a*c{v%`sV*-%S4#jKiy91h}?8!dl3g&x14NMj+5XKPlD*+ZWvf zAHqAJPH|kotJbw&_Wh}{?aJh?a?NBj7Q2J@yoHvG7OJt=z`3XN*IwipvaZZukab#| z-QsMFxv^y!Z*9QOUC+I9HEy#ru(>{}&sra1UKiSE`!>hi5gc}vY5j%EotCNBkq;QX zs*N3i{O-B!Bux0M~ zHRq>e#4qKcV^?4H+ay0NCG)+V^gcf=M^~SpR(HARUm0~zFly^L>f=5~H3QgYu`i(f zp`M94%jt8}`hIwyqgMBt`W)3hxhws(o=1I-y8H~nzqb_59aU_dmj8rtR201m92GCG z0!OU`X*luxDj!F2tb9DhvGQ>h$4cR=O_r!QO3#!yo7%DPTs0{~ z@Xy;a6DMEpb4vUC_BVK%F`gguNzVy5Ruwz`KIE-FAx^yB&iaOsceE|y{*HLQ70}l4 z)vd;Tem)(u6^_f^ff9YYZ*DzfU2>D^ije#!yL%&OSH9E?4#|)2@39AauuOThMQB!m z67xdrgKr0}X$?vjjP6w^p&l%xt9YzQ9SWtpu}fMd3O&aV{$c{J;jc1jho<`E8%53g zpkl}FQdLaold4yM?mKm~u9lszp2UyQwW7o?InRC_<*SuFt*XSYZO*z9KT7vqJHPB| zB}tCj5h47_b1d^xzWd^6UvAwjH{C^US{`i?`rLFedVSgTmzA4VceVQb z)PBR)H|li`+2^Oe?7GiS>oqogeyVnZ^~?%o!8#_(odxU2D>sUcuToILS!2$eCyb=n zNzJapNQ$A=ASsqok>XiZPOjo;Ir)mC<>V}mmd0C~{7`Y#B|mDLA1e0NiLdxvC%$61 z3x1!UGH&7bDBWjXU&^!7&EmW7{B0Cpr0&ar`~39l$WMK|y0h9HodfLYExsS1d}4R0 z%F}h1s{EHvs*aTV9JJ3to99)14%*ySeGaOA|H{^mX(H;J{tqu%p<)04 diff --git a/test/models/IRR/dawfInCellar_ChildOfCellar_UTF16LE.irr b/test/models/IRR/dawfInCellar_ChildOfCellar_UTF16LE.irr new file mode 100644 index 0000000000000000000000000000000000000000..698530d3ae82b215d0e886047e6cfaca47d60871 GIT binary patch literal 21892 zcmeHPYj4{&6y?_r*ncScc}??d7a&{FuI&(DeV{Scp=w)vtc&z z{?zUUC0se)rOx0`U^< zFVKcqZ|3I@3QdO4=yrZ*3Vp8dIo^5XNIQds*^-caW5N&DHP#z4hC(wD=|TA4AXk(C%+@ zJ+~RHdIOCgIQ+yJVv7`xT+J=l-PoZf9FZgRiwy0cm+pvphwB`zGaMYT)WPLu58UjT z@69&Y-vTS-hGTjU=R0N>f1ecB9^$_Z9OY}fHdf-=yoV06f-j#oc}9h`ZP+qLuo_4I zMA(G=-$&1PVV5nOl{P8IFW=QQ#qcru%o*hJ@+W}%ju8-K0g0~xwb^J5)H9leI`|=#v0N;D3oLqiN6H z19gab`4%jk!~480tjAU4Y~GJHJ#6CdXk|MJswj&UhWGtGlXJ(;A3e?na}QeAnj_7w z07SpW3V4ATR38JxU#u$2qqw@J)GOXkiPX1A`a*c{v%`sV*-%S4#jKiy91h}?8!dl3g&x14NMj+5XKPlD*+ZWvf zAHqAJPH|kotJbw&_Wh}{?aJh?a?NBj7Q2J@yoHvG7OJt=z`3XN*IwipvaZZukab#| z-QsMFxv^y!Z*9QOUC+I9HEy#ru(>{}&sra1UKiSE`!>hi5gc}vY5j%EotCNBkq;QX zs*N3i{O-B!Bux0M~ zHRq>e#4qKcV^?4H+ay0NCG)+V^gcf=M^~SpR(HARUm0~zFly^L>f=5~H3QgYu`i(f zp`M94%jt8}`hIwyqgMBt`W)3hxhws(o=1I-y8H~nzqb_59aU_dmj8rtR201m92GCG z0!OU`X*luxDj!F2tb9DhvGQ>h$4cR=O_r!QO3#!yo7%DPTs0{~ z@Xy;a6DMEpb4vUC_BVK%F`gguNzVy5Ruwz`KIE-FAx^yB&iaOsceE|y{*HLQ70}l4 z)vd;Tem)(u6^_f^ff9YYZ*DzfU2>D^ije#!yL%&OSH9E?4#|)2@39AauuOThMQB!m z67xdrgKr0}X$?vjjP6w^p&l%xt9YzQ9SWtpu}fMd3O&aV{$c{J;jc1jho<`E8%53g zpkl}FQdLaold4yM?mKm~u9lszp2UyQwW7o?InRC_<*SuFt*XSYZO*z9KT7vqJHPB| zB}tCj5h47_b1d^xzWd^6UvAwjH{C^US{`i?`rLFedVSgTmzA4VceVQb z)PBR)H|li`+2^Oe?7GiS>oqogeyVnZ^~?%o!8#_(odxU2D>sUcuToILS!2$eCyb=n zNzJapNQ$A=ASsqok>XiZPOjo;Ir)mC<>V}mmd0C~{7`Y#B|mDLA1e0NiLdxvC%$61 z3x1!UGH&7bDBWjXU&^!7&EmW7{B0Cpr0&ar`~39l$WMK|y0h9HodfLYExsS1d}4R0 z%F}h1s{EHvs*aTV9JJ3to99)14%*ySeGaOA|H{^mX(H;J{tqu%p<)04 literal 0 HcmV?d00001 diff --git a/test/models/IRR/dawfInCellar_SameHierarchy.irr b/test/models/IRR/dawfInCellar_SameHierarchy.irr index 83d4ab93268633be3fddabd308b869bf098b73e6..5fbfbe6553b75d091ae91b7565e37d3bcb4497e3 100644 GIT binary patch literal 10576 zcmeHN+iu%95Pep@!tiq<%a(Hk)D+F8T?E)(kOZ5eF9t194!e?QP*R%q*Y;sQX@6m< z8;7DqnGUc;TSx)|*_kuq84l-=1ONN?Ki6-lz%a-b@}NA96wiJjuRp`JiH)K1>T9Dv=>3 z^)M}On1bLK#y1JHl8R#C2NQzh8gmQ5K#<6s0hhRyMvZ=DJBB+n!zD+!SBU zd>loH**vYwY-o5$ue!k~c%MXH-=YjN!rvg=$gflL%KiI4M$8udnmVC?B_gw z1Kz`kqGr9{K9GbYIE4^8_UUo)3K+X={{b-+^TMF4`vK#{fN_SOvYg>Mig(o~@Gd3A zn$a)GhS59;R`a8|{dvo?x5{wK>vaR~mE6qjZISkaKvxWShapdfIt*YaW$8U(IONfS znUk}V=bvQzJIxu&gWCrb$m>#G$SwP_`pTAi*Preg$?)q0=_-U=H$PqGVTd7l8VP8R z_7eGjg~-Qh8PN{+4c#aM(2w^WWig7#H(WhHV(KB6gjX|+*c%e@1rGV69ZwqonPLcl z3^4>irf30oOhZCXTY&%#V+as2h5!{koj9STeZ=+V$o2<6k6x9i7D@}Wo`VK{&p`vx zA+)NM-b_AZdb6UpQTAnim?p=$?K#L#@CC8ZhOUc5 z@q2eSQW_E7^=r<=^8Tyt^@(%taHpcXTl34S-*;!X7KX<`arc||^flU9VtI0(qOY$p zWdFVU8Xsrq3GcNtgRs=~sNFSzVzKYhI**A7AL|b+2S~UGFxyrUShsw4J)Ly^g zQ6M1k#t=w#V+bU@9@5$Bn6T-9O!#y_CX6~DEvIoOwr79;$5Fs#P~1?MWikHc6tLO@ z?bFGJz>FHm`*LIFUhGV@3e|33K%q4RK#|n~6hSjl4FzJN843i5=mkxI02Mu?BQhpz zIv^819gqp54oJ&s)WDxs1CO2JhEo5lY9KJ|6*E{wI}Bmr>@bAI0*2$sPc%NHP>d(P m@#I(iN^TFSgax|?2o~=iAXvx>XjHxO=ZyV5cyA{EQu04u@Q~pE literal 21630 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 literal 47716 zcmeHQZF3Yi64uvT)%}MQpAWFTHsC7mQoMvKQc0k|NeEvkzpRaO#-{8wNAAbp-Sdog zJfoRM(u`KS7*I{EcRf4X-RhQF{U+&u|GjU%Gat=6b7HjE;fqW)c*M^~d*st%jF5bI|XWS=Md&1Pb01dNBWI#l?1(9R# z664T?_@L4&XSmO?ag5eI!krUb>}yA&m89&W#GrcTV^Blgbz~k_7Bj)&2sdgl;Y4$&9RD%rU`=Lzn9fR5~AC#DUvRcV9?#-wVY59$NRlUkQLN<(h6 z&tw$j*O(Khl@vAHMk1V}-MNwd&qwiV^TY#nGM92#-b3ak;@`!1Jf4qJO1*6f*zZHO zLd;&+na_58-q2p?YT>rsU?GQlY+RGGCvLPx1xHJ_cdC0zQlWX?Qp+cN+@w5eE5NnJ z>btIOKuuX&GwtVx$Ry1&c!?20nKX9PgL!KdH0BVcC9uHp5nBCs0fA(-!QP zZTw~LqPAMEF4`_@ur2PGd${=B2A<-78`bZ&@a{8~?` zuWyHFJ*5eGuRF&pec-3@F*MmBu1m}wq>YEwWEZrOzUG z0m=@*OY*TV-}P#i3)=+LA==)31laT@U&4PTmNWBjiDkSe(99-&TcDnKx-u&^3}Y@n z8-{a5ebpm(^XiVaHotTmhE{{MOqzbz?NuBF#d>jl*wooU@iuJN6)UA!DSitewI3?0 zK=sXHrPMP9-xb%?J;lkd&q`_LmM%Yr*ePTE|0!ZJ?_rTK61E!u{}F7zW7xk3<{7MY z##U55=X%VZ>+q4SpH1KT-c?`T#9iCNX$jegJtM!=E9=#hynjzd;==RRuvk-fbPdsG z-QH9@{dl$@9CKIJT@%e8nlaE8wDzC!N{LEp5Kq}DoKrrBF4u`JdU_g#oq2fFEC0sfp)09sqSc| zCfSB2VLosTpYGvPfAq#_TBRI2pv&;sjYXlr499@~O$Y`2f0%^!aDVepM3Mol>m_+l-UiqCc}!Lc}=qd&4v=pE*u zehczJ-&g=TE6F}$v|m;>h}%zhobOZ{80)-+>o(@#$B0Bf0Y6z0bAda*pfX{nYX2$z zKg4J`2PX)V7EA2=r+D@Vkl#Z-w)UiJiExAsr(W^MC(q$fZQX%8dKZVfDdg#cs^{n5 zAP3r%hZX->3E1y{A$#2FO%3~>)eOOYeF@!HXCF9@REC zHtTneBHT#j_s{cj&zbqy{0D7l-%(mO71P5?_gH;Sy=!$5<$NynZyK*cSd@;*k45R6 z{8*F@O2e{KjW4xf?bu8VVeY1UP(SGe;N9D%P+p%@U z17+#aUyDT3302R_2~xX246>W`i_gDlD+T(RXmKrc9W_vl zrd4X67%i*OJo&XwK8-_txXcxV$};ltBbSy5jn8J(cXK{Aiv9`~`~m8?86`P{{iu1P zXOSPlOY60djl}vm@&Y=FmF3T1kI{1fspnfztGJeFXb$n)x=+wvdZN^c&++#hab?=2 zXTYphom;DvD+{%49kw)UJs-;*#&xlO_Vs%~;k@B;vxa`?Lvn`ukVt*?=M(b6m+_2e z3>h=uf~@P;IQYZzg|!dEcMad~i{;4{`bWUxxxyi^RaBJ!bZF8LZ?lk z+5SMZN$2&Jk<}XmQ$>yz<%x<0X_#8KFP_iy>G*uvJRgQdb9p|vc`|w03Qo)8`6$hq z#q;4IFznQ!Lb7?jMW^u z@^(Ich4Cngu*b?AdW} z_0rb1&tEP6BzvpR8*Y46r9W2dPqw3F#i!K0y!e#eY8Ia@T71g(&Y{JptRuyC_SWO5 z_>|op@=|@UeEv$<*Hg1rnqL&gqwL#d;8B)r8lJd6lut%+T>0b_$CXc3aa<|#Dn4a* zzgq3lDmkWmb<|{IIIkp|j=lJlZl39SFqEeZMbM{Kn!p>fEZ*`f2`L*gsV> zK^mU8&r|$Hn*;LegE$XU}t%d4!e?UI`+8V$S3?O1^I2g zYN5UQ!MBTzzn=1<$P z=jJJ5>j%nO2KGGeL6g3M$`{`mzj}(^lCIZZ-l{2I9_u=+Wq6AHNMB&hfL-Tw8@1t6 z_)T`N{#&Rj<9TXv8@`7ktf7|L=RR)-OX zt?aU4uw4trjhO5}8#L8$ihjFhpsPjppfz~X1=l$76Za}Sz}Q&FIfFclWO+3pnjYfx z?@?CP9r*NkS$CkUg0k+wt^%~@*4iBdbL|}F>xrQ_oYG4(=$#Vl>+j^Hec1853dgLJ zMABkbVLWQqTLvB#cUT4_hoR_ig zU{(I<0qW4}m-df*9^MfDw1&+0anOr@YBL%`)(NN?VVDp3x%sF2unz5>z1+F2@1yd3 z`r@OueSbC6>5*9KQQZ81KbKhQQA#~Z@llJ9I#geTec^n5PZ*Dy35t)})?{(NF`umB zxKiX*eAMEj_I=d6^(Z_Oeh>MjRqd_$1MqPdbw>1$sxvw)_I^%V#r((Y`x~nW8M5au zJ&-L_sIW5SE-vogyiw)OHgWGBKCj_r_j%@dV!X>U_O|ifx65M`l^T^&qoVz`d^IY* z7{N=7NS-*uUhD3eVNaK>v+k;P;5t`^e7-w=#H%TMvAnM(+7{}QLsw9JxzV=OpE5V5 zft;-0X z9Ntv*`*sS6pWkKUg-UaFt0&YMZ0ero;!sMIUS+({<)@7(4!gS;Jxcc~yql87?vsnr zqIB~Fk<>nKx_HU2A?F2#V^Y@AT~M@p$?+BK2Hz zO8vtV{wDZKs_x_M5*jrAL8!= zA%?YW?caZzwV@>gpt3sc9>>ppEk?W6mtnXr>p|PC&@J%UykEn5(2@b*+Bn@WhG!L& zt*T+_`L<*LN(P{00Nk2_l&E&e0CfF2e@%NhGOuDJX_4$O9u)yu1|AjJSOy+76QtpZ zN3ZkAD2^+ioZ`6h$tsR3MP4NXP%;3YQwD(hy3DFItH=0s>aljiG3#MjE;fqW)c*M^~d*st%jF5bI|XWS=Md&1Pb01dNBWI#l?1(9R# z664T?_@L4&XSmO?ag5eI!krUb>}yA&m89&W#GrcTV^Blgbz~k_7Bj)&2sdgl;Y4$&9RD%rU`=Lzn9fR5~AC#DUvRcV9?#-wVY59$NRlUkQLN<(h6 z&tw$j*O(Khl@vAHMk1V}-MNwd&qwiV^TY#nGM92#-b3ak;@`!1Jf4qJO1*6f*zZHO zLd;&+na_58-q2p?YT>rsU?GQlY+RGGCvLPx1xHJ_cdC0zQlWX?Qp+cN+@w5eE5NnJ z>btIOKuuX&GwtVx$Ry1&c!?20nKX9PgL!KdH0BVcC9uHp5nBCs0fA(-!QP zZTw~LqPAMEF4`_@ur2PGd${=B2A<-78`bZ&@a{8~?` zuWyHFJ*5eGuRF&pec-3@F*MmBu1m}wq>YEwWEZrOzUG z0m=@*OY*TV-}P#i3)=+LA==)31laT@U&4PTmNWBjiDkSe(99-&TcDnKx-u&^3}Y@n z8-{a5ebpm(^XiVaHotTmhE{{MOqzbz?NuBF#d>jl*wooU@iuJN6)UA!DSitewI3?0 zK=sXHrPMP9-xb%?J;lkd&q`_LmM%Yr*ePTE|0!ZJ?_rTK61E!u{}F7zW7xk3<{7MY z##U55=X%VZ>+q4SpH1KT-c?`T#9iCNX$jegJtM!=E9=#hynjzd;==RRuvk-fbPdsG z-QH9@{dl$@9CKIJT@%e8nlaE8wDzC!N{LEp5Kq}DoKrrBF4u`JdU_g#oq2fFEC0sfp)09sqSc| zCfSB2VLosTpYGvPfAq#_TBRI2pv&;sjYXlr499@~O$Y`2f0%^!aDVepM3Mol>m_+l-UiqCc}!Lc}=qd&4v=pE*u zehczJ-&g=TE6F}$v|m;>h}%zhobOZ{80)-+>o(@#$B0Bf0Y6z0bAda*pfX{nYX2$z zKg4J`2PX)V7EA2=r+D@Vkl#Z-w)UiJiExAsr(W^MC(q$fZQX%8dKZVfDdg#cs^{n5 zAP3r%hZX->3E1y{A$#2FO%3~>)eOOYeF@!HXCF9@REC zHtTneBHT#j_s{cj&zbqy{0D7l-%(mO71P5?_gH;Sy=!$5<$NynZyK*cSd@;*k45R6 z{8*F@O2e{KjW4xf?bu8VVeY1UP(SGe;N9D%P+p%@U z17+#aUyDT3302R_2~xX246>W`i_gDlD+T(RXmKrc9W_vl zrd4X67%i*OJo&XwK8-_txXcxV$};ltBbSy5jn8J(cXK{Aiv9`~`~m8?86`P{{iu1P zXOSPlOY60djl}vm@&Y=FmF3T1kI{1fspnfztGJeFXb$n)x=+wvdZN^c&++#hab?=2 zXTYphom;DvD+{%49kw)UJs-;*#&xlO_Vs%~;k@B;vxa`?Lvn`ukVt*?=M(b6m+_2e z3>h=uf~@P;IQYZzg|!dEcMad~i{;4{`bWUxxxyi^RaBJ!bZF8LZ?lk z+5SMZN$2&Jk<}XmQ$>yz<%x<0X_#8KFP_iy>G*uvJRgQdb9p|vc`|w03Qo)8`6$hq z#q;4IFznQ!Lb7?jMW^u z@^(Ich4Cngu*b?AdW} z_0rb1&tEP6BzvpR8*Y46r9W2dPqw3F#i!K0y!e#eY8Ia@T71g(&Y{JptRuyC_SWO5 z_>|op@=|@UeEv$<*Hg1rnqL&gqwL#d;8B)r8lJd6lut%+T>0b_$CXc3aa<|#Dn4a* zzgq3lDmkWmb<|{IIIkp|j=lJlZl39SFqEeZMbM{Kn!p>fEZ*`f2`L*gsV> zK^mU8&r|$Hn*;LegE$XU}t%d4!e?UI`+8V$S3?O1^I2g zYN5UQ!MBTzzn=1<$P z=jJJ5>j%nO2KGGeL6g3M$`{`mzj}(^lCIZZ-l{2I9_u=+Wq6AHNMB&hfL-Tw8@1t6 z_)T`N{#&Rj<9TXv8@`7ktf7|L=RR)-OX zt?aU4uw4trjhO5}8#L8$ihjFhpsPjppfz~X1=l$76Za}Sz}Q&FIfFclWO+3pnjYfx z?@?CP9r*NkS$CkUg0k+wt^%~@*4iBdbL|}F>xrQ_oYG4(=$#Vl>+j^Hec1853dgLJ zMABkbVLWQqTLvB#cUT4_hoR_ig zU{(I<0qW4}m-df*9^MfDw1&+0anOr@YBL%`)(NN?VVDp3x%sF2unz5>z1+F2@1yd3 z`r@OueSbC6>5*9KQQZ81KbKhQQA#~Z@llJ9I#geTec^n5PZ*Dy35t)})?{(NF`umB zxKiX*eAMEj_I=d6^(Z_Oeh>MjRqd_$1MqPdbw>1$sxvw)_I^%V#r((Y`x~nW8M5au zJ&-L_sIW5SE-vogyiw)OHgWGBKCj_r_j%@dV!X>U_O|ifx65M`l^T^&qoVz`d^IY* z7{N=7NS-*uUhD3eVNaK>v+k;P;5t`^e7-w=#H%TMvAnM(+7{}QLsw9JxzV=OpE5V5 zft;-0X z9Ntv*`*sS6pWkKUg-UaFt0&YMZ0ero;!sMIUS+({<)@7(4!gS;Jxcc~yql87?vsnr zqIB~Fk<>nKx_HU2A?F2#V^Y@AT~M@p$?+BK2Hz zO8vtV{wDZKs_x_M5*jrAL8!= zA%?YW?caZzwV@>gpt3sc9>>ppEk?W6mtnXr>p|PC&@J%UykEn5(2@b*+Bn@WhG!L& zt*T+_`L<*LN(P{00Nk2_l&E&e0CfF2e@%NhGOuDJX_4$O9u)yu1|AjJSOy+76QtpZ zN3ZkAD2^+ioZ`6h$tsR3MP4NXP%;3YQwD(hy3DFItH=0s>aljiG3#MDYeW@XaK_}&^$Qe9Wd*rjXu$rs{ySon@wh^qCLzJ8ydldK z#8=5i-l#bC+`h9iU*OvufpW?g*p+V?kP_Jnb3DwIw59ZEsfap3zYr%_<47_-SyWo4 zOb`jh)H){KBtH)J+_8699DDA5{iD81E6W3usFCI48i2Z1l39ePX%6(Zs^{jJrV%nm zDiU+$p`megY)4;^I97RaswwJ6UnWEdvNrJ2 zA|u_4CY4!+BSjJK$!<4ewjwD>u`vCpU2M49_$lHjfeq1G06pM?9#;&L_1mj;3P@m?};blsP&ISq*qfD_I31K^h}Kx-)G zgyR@WW!lyl2q&fj)07A%Im<}YZpkNtcG0tOr(G0n z1a)e%o}blbnsby{1}oRqb3{>+J#(C4B+b&;9&Kb*YwA literal 5588 zcmcgw+fLg+5S>>l^&b$=1p;aNlok;#6;ca`M5W~gkt=CKf*c!#etg?=b{*`E$Cns` zEaPQ&Ju`dG+?;=Z8?q;Jxs$Q1%Y*dAlbMWUDiir68?qx?Qp0mkKFeEqBMq#1xUR9Q zi`^64c7>~JSicb;mxp~F2{7tor`@q;)@R}BM265f!Tvk!p{~<#ykRW4fki>M;=!IN z-s8%)BW(l;{*s&%>6x7mkQd3=#95N>cOiF-+mpePlzrIM!6|q~U%p~Al-tk-S8~l@ zR0B@-dIw2m=UfXLIBhzf3&ba|zXvfp0ATOO13z#Dq-@TtkKNHAY@Jz%wwp z@P{IO2eDLM;?IH-i{wKxU_FGnZxkXKRUodX=Tyd(jV;{=+hK-H;yW`qjl$X!uToZC zRB2q++&Yt#J3wWMUrCgCqBQA;K!9)4C$u~em(1~M(vN^NqnvThT$Hpvo=-SlO@7N% zvo5S3gELQ&U(Eirh-slh(&u@zPtoFLIbZ81NYij`>}HQ+yAQWARV8~@L8h2&_Gfcs z(*WqQgNXNIZD&ohe+xNf8@DTDGccpT>7P|ib6A=xu^mfhDM*dL$K@@P3dO-Q%>oy{D_ z=6|y5sTs8lN?AIzTvD|TEw@yyL(4T~bhJ%$t-?q--m~>+th|ICjhUCwqp?#?&pz@N zJ2HNS@>dhq;I8CF%}eR3j;H){RmWAnt}=Y3eNV*uFV-%0PFkR>sQ$S DdUQ3y diff --git a/test/models/IRR/sphere_UTF16LE.irr b/test/models/IRR/sphere_UTF16LE.irr new file mode 100644 index 0000000000000000000000000000000000000000..ab42192680779a9f3f98321fcf9788a22ee6138a GIT binary patch literal 5588 zcmcgw+fLg+5S>>l^&b$=1p;aNlok;#6;ca`M5W~gkt=CKf*c!#etg?=b{*`E$Cns` zEaPQ&Ju`dG+?;=Z8?q;Jxs$Q1%Y*dAlbMWUDiir68?qx?Qp0mkKFeEqBMq#1xUR9Q zi`^64c7>~JSicb;mxp~F2{7tor`@q;)@R}BM265f!Tvk!p{~<#ykRW4fki>M;=!IN z-s8%)BW(l;{*s&%>6x7mkQd3=#95N>cOiF-+mpePlzrIM!6|q~U%p~Al-tk-S8~l@ zR0B@-dIw2m=UfXLIBhzf3&ba|zXvfp0ATOO13z#Dq-@TtkKNHAY@Jz%wwp z@P{IO2eDLM;?IH-i{wKxU_FGnZxkXKRUodX=Tyd(jV;{=+hK-H;yW`qjl$X!uToZC zRB2q++&Yt#J3wWMUrCgCqBQA;K!9)4C$u~em(1~M(vN^NqnvThT$Hpvo=-SlO@7N% zvo5S3gELQ&U(Eirh-slh(&u@zPtoFLIbZ81NYij`>}HQ+yAQWARV8~@L8h2&_Gfcs z(*WqQgNXNIZD&ohe+xNf8@DTDGccpT>7P|ib6A=xu^mfhDM*dL$K@@P3dO-Q%>oy{D_ z=6|y5sTs8lN?AIzTvD|TEw@yyL(4T~bhJ%$t-?q--m~>+th|ICjhUCwqp?#?&pz@N zJ2HNS@>dhq;I8CF%}eR3j;H){RmWAnt}=Y3eNV*uFV-%0PFkR>sQ$S DdUQ3y literal 0 HcmV?d00001 diff --git a/test/models/IRRMesh/cellar.irrmesh b/test/models/IRRMesh/cellar.irrmesh index d8d3a661bd05d9c37e5c8ffc2f281e3a7061eb68..0278c9239513164d67efc07781ee05b033381a27 100644 GIT binary patch literal 93467 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%0Ar%LjP&YQDFR4^ytDZc@| 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 P5ywbg9T#tY{>T3Tm)Ue} literal 293192 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 diff --git a/test/models/IRRMesh/spider_UTF16LE.irrmesh b/test/models/IRRMesh/spider_UTF16LE.irrmesh new file mode 100644 index 0000000000000000000000000000000000000000..c6ad9291fb02b6b146175de86cd123e4fbc509f1 GIT binary patch literal 293192 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 literal 0 HcmV?d00001 diff --git a/test/models/IRRMesh/testFormatDetection.xml b/test/models/IRRMesh/testFormatDetection.xml index aa73560d4cf064032536838245ab23fa27cdf2f0..0986eaf61b274476bab5dafa5c0eff42e30a7675 100644 GIT binary patch literal 26504 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 literal 53842 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 Date: Fri, 17 Mar 2023 22:42:17 -0700 Subject: [PATCH 146/232] Revert to commit 13 May 2014 (08bacc7) Changes were introduced to the binary portion of this file at some point --- test/models/PLY/pond.0.ply | Bin 2171788 -> 2171857 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/models/PLY/pond.0.ply b/test/models/PLY/pond.0.ply index 02b7683cee063655c5b93ade29bc14b3f04e15dd..a45e0322d856bbef01c46b7a5a45a0570fae69be 100644 GIT binary patch delta 600 zcmWmBU1(Ba7zc2U?x^S3d#1~DXFKY!hJv+nyC_;s`h?oDY|NmWE{cL$Y~8hrsLZ-) z6h`e-td%qwG2F(2S7N2mQqWAI#`m{s zsX|*Q!~Vtf!FzT z?p?5ARV8oW`_Zt9M#Jj-Zam8+HI+-6<9ks5w~1RXLi>JhsuO;`$6cs_haYn7n2QdE zxYmO(R^e_}>z?g=mVstBzwCr{XZXrFs9fL|v@l=bH_pS_xVF9x+J9>^X}I)y)#5Su z%|glpm?0$-nvw-Ak8Ca^d>3GJN}zVw_eD6bgNsE$(Tm<=sNn5*%LZjb*206 z>K~clkLUWQO7sLGdYn2Mh^+2=f_%wiV7zd7#2_c&;K?;R-=Z(;G}5fov|>Y+_L!0i zWI?Zq2EFyZpU4UwV&W9`9tn%p-}5dk(zR&ur$p*cHEj5ZY;w5q#b$V7u90)Wvnq-1 zh3gJT1`clVNiVm;Uw5QetqMYhCf-O#apz{GiPJFJVorBM|21=Sb@Z`-nT`c4v!lp* Yoz_d$wHMl~>O-iN{Z?A`Hw};c2fN+ZF8}}l delta 471 zcmV;|0Vw{_$Akfl$Akf}+)T6GOuWsvni>Hpl83{r0k^}f0{nZIz$gPAx8EoOJP3yz zF$0GjF$A|9F$F=Ew_e8uO9q#!%?0V zhsve~x5}mm;6#V3>j$^1>j+~-w+}H1EE%^vN(r$`x9*h*dIYy=nh84yx22*9GEcYI z@d=Mhw`e^I&jGhMKMM6Lw=Qc6@o~2x-3r|cxBln~FW0v&zzY~Nw@32}&C9nHzYOPJ zxBVUs?|Fyqm<_k>m<|gHxA~$D;|{mou@1KJ9>IhY?l}w-HtlK5(~C z#tx~925z+b5 zI=3#79KAA^?ZX^ew@AbsuWGmWE*;BLx5R=SB?E`*g&nu*g&xGEx34Q7d|0 NhctvAw={$xou8R9&XoWF From 92409a821d2582f6735fe875dd6e3b51294edde3 Mon Sep 17 00:00:00 2001 From: Steve M Date: Sat, 18 Mar 2023 22:44:20 -0700 Subject: [PATCH 147/232] Provide dwarf textures for COB model Duped from B3D and X dwarf folders --- test/models/COB/axe.jpg | Bin 0 -> 65191 bytes test/models/COB/dwarf.jpg | Bin 0 -> 84158 bytes test/models/COB/dwarf2.jpg | Bin 0 -> 83046 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/models/COB/axe.jpg create mode 100644 test/models/COB/dwarf.jpg create mode 100644 test/models/COB/dwarf2.jpg diff --git a/test/models/COB/axe.jpg b/test/models/COB/axe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba14ae0eaaa746f1a4ad49a1e13cbde0c27bbddf GIT binary patch literal 65191 zcmbrlby!?i4RjT0Z)F z&ikC_obP)7dMCMN&suxUJ@>3Fx%TX=r=_Rw09-{`1z7+BA^>3d`~f_j0PtiyE$n>& z2moXN0HFTdbp~L5W9e*e1+e`5+=GAwAVNk$#l!&s_;mmPQ%wLMuL%J7Q~IOiT<6?EfhUNJvO1$S4@7s2Dg{7+5$j zUp&jpm;Vgs)F06cU=03rYh0S|zPhk%5K@YD~u0z5NALO?)xPT;=; z1qm4u6%8E$ZWfP z`1pwgUP%)(O1T8)qmkhK^+ZBL#X?0wK|@ADc%DN zvOTVy|HVNgb8%}(U`8cfz(eE^{-v4QaC@wU{QJM+A~aCLZHnZ-aF0gy2n$pJTzo-d zy+8;HsJUD&Z)J1r{H4t=G%f6+ue$opht7d^GpL+JRpzECgpaVcymGd&_PNm>&)GPF4K(=%Rm zpUT{ZXpVDlSMf+`ZZ@k{qzqiAcT}D=ZiQJ?P&!2Z8p_Vuq2eLkMQgybvpXa859y4J z*=gm*a30n>3;LDEgGIS;IDXbJcRN~(|%>09mJvsc$B1F7?(kVw&e}1ejCYyj+iwz`sqys2x#D>}^z%|#NheBkY}Fbfq3*?&!koCI zgK(!dhw><6-=@lLuF;te0nDauT@}WE@Q+TeuMaS;8`?(STAFLVX0QI$$lJc-!|S!M z&@9)^@U@IF;#9#MZ9J=5Tc4E0S`#0uC**WH2Z`3^6j1Socl}$@B4;+LudqNHYsQOvf%+s1eul zTjkZOF?J*o*akxr9wz%cg6*)1<=A4Ua|2;cm0%+5jvXh>BVxOxhMFv=iqdsSIrbf& zT=eG{I9=Qn{JXk?a-f^cqT$rFVRP^NPUFovWxaVXqCCu~d{7Z?Y znBznW14%G&Hf^tQ5hs)%-a1la)yS}uG2@t8EW6TCY#)|Vqvc+c0jpH0#M*`N2R>i5 zS-#R&8w?t0O)aTWttO=dRx|g*><5v)k1{!5?4#7)W_l}hThzFvF{R8k_pLbb6hSwS zXYhf_j7C9uD~{0DtK^FnK3%TLYN6D_Hqsu^TCkGKa$n`G&}=lz>IQ;j z!sKS^c{Im(_aN*{&@PUCreJzRhSVR=^W(vPi_=%NZUxN*VOT;I1W38j>-GI9vvJQ< z*`2*fO9XzAUmnMrI^62>@(ORcy!TS5>B^hs-*05pu_G~X0a?O-LS6-OPuep{Yhi*lpz%JiW>#Yhcz_D!wP2)vYcuX%vo zu*?CCPL)6}n`6=P>w6SBO%H)#WqSq7!~m?M3-#8v^nt>i<#gV}cZC@oZ2Rl?p8?{p zzDkE%@D#4l@x?^o=zJ4o5Vg#HEuw%wdO)w<(w? z(xy*@Wieh&wV5b3e}zoxszFeTIRSq`$MSw+K7(Q)m0N{ zmo-J55Lo8hIFwP(epn(RpOJ^7M@7&mjoG$g!ZaPDUv+k>vwtF(6uSzP_wCAyLN+5Y zcZ)jFp0poJ6H}{qBqL5ztV@sN818OzxU1u|1CJSM00ri%q?l?OjXsE2;xf8=twgvf4$pcPHc)MI!q$M zF;80v~G%=M|Y|6CXFqYgX+E?#)H6-MUVotING-X=7qT^9UWw&hu+LJKP z^`MV!6(Sw^^aZ#KpH=;^qmNGE4bw1Pp8s<1I|QqUTPy6L`X!BgZePU?iTPkdBB`WMUPD_>d_&CnL zA~(&LK3uWuSDL0AV}FuV^7f?tvPKU*Ef^-StH{DiLw-zl>SG(Fm0wj@WT@~afZ57| zuHrYTV%n%ea}Cp*^74?oJoj&TBPV6zg?cOcSUP4?bHmfeIm8+@77+<4@oI1bGJS{1 zy*6@{ToyY@Fl1qhr~=_thKc5cr^BsjQz*uij)q2Usa)UDPU_c>;9)aNV6Y?mb)gUu z(RlLY`>P$_H}TRSP!bO~)ZJ86`o5w`)58wCV8zrtwdt;w%W=NA&>S}n4D7Pwq_cv_ z%#?%XUoYx@wZ@Xy%tf&#z|h(}$BxPuFe$myS4y@ujAC$=mTF_k_1=H*%oK}UNSel0 z)djP>wI95d5>lqWr>iH5x>YuAJWZd)vW#-+l${sRC9F2)#;<5Hv=NxUT8^3~EPJaj z6D-p|Ou|@>1R8I|I&^b5B9i?Q5)@FDC$#VKDgVBI45u|=L@L$XD9nCDG$THym$YV| zk?4klhE2uFV#^jxU+-IMXC@6vY1IRgWK29CKFcN)wrS!wv;?= zB0_lydwJgbZ=bxA7exkTy!Drj>DjA;uZ*2xv4M7)pp^#8@sebEaRoULV-ovVbv241 zcUr1CFv?5=%g97Lv*KFQ13awAsI06Ulh)uz$}y1W(k5sX69{EjjJ|pOt49(t=`WWv z2X8~%v<#oAm}-e5nxA)yMBI=iQf`W|G|(eCoK`H1cCAp7G5}`fH%CpC>on?kFVJ8h!fCm|-nN=Nnl&{K8gh8=(wenB{Vw=jUv$w74uSz4P zw~Vla>kwAys03N)C5~2riic>veX6&Ss2p!^-?eT!IxQd9IQ4mF>u{4*{+xk#}@* z=_*khn3W^q!>nz33%4w_75grkLOhsQGs|ed<%nP8_`w_In(J-bJ0M;==kx7~Vo9D$ z9K&Xug4z1lBb)nfqq)ZxA zcCt(bIvU&r_Fmd9MiJ)6&Bf#{<|CO7;5tX;&Pwr?&V4;4b~sZu_h?hBy?z~oayghC z!4HNx$io__Trp6>RH&lXF<3-a#s7KH7v{$=RsEPI0dCX@UkK1z*tDtT4CzD%Je5%35s&}7pnoy65xJfUyoNJyhF z8vbP@O3zRM>?Rwxz>Ba|stCyG@I&bRG3W)Xkt!VEjASw%&Ji^cOn1QlB1)P{G;+Zx zAI)9tv>lB=>3@mx&xbBd%QKbKBoHerEaICd$%q&#ZqF;G z5HMu_2t+F(yH1Q09kLg0boVE`&D4YTS03umy ze9Ms_;^i6UG9xP@1c#9FBb61F$NZwVRNHuB|H1 zx)LKxTu{~klyUEb94#`r7-0ZYf5rodW*xPix?v>~MZAaJWH{ zXs6PUuX#uza~1#cxGcF=CE#zi&(h2_Jl|%oPgXZZTU=r@#YZoJn?y!Dju|@3+TW>N zQ5=@(0sx%+CXDr39iE4l65H!%xsrXIG!{|mR;?Sy+A;D_El3z2&e#1H97lGS1f)Ti zCvb#`kx#RmG;smNvc~i+DNz)n6#&rWd+$LoV|$}s$UlSUi`OVe!p1!Au%B_$6y2yW zuVo)OjHPpQdzJhtBM<<1`69>&vqdxv3@uc=AhiBunNg=-etIWmrcr|DsgabZT$6R( zo-GAH@cYSo=23u8&L(S(k0HvK&1{p?te3-WpxOnsfhm8{fP!)1v5K%4tm=qw?SL!t&^M|#@Jd=DPtXe^VBi76Zk8Dl ziL`XB#y8Z}D|gbLWcLQ04}0=7MeeJfOIHXy-;VtR5Ho#MN@z;;EwkwF?G2V0&+y+e zA&4&oA5u724dmX$rfqd;wy4z@0SK}adluhTm+7Jx(F+@J+A+}aBuzWG`C-NwXzMg+ zu_cZeF2$+EKUB2^jRKL%`Y;cXPA#gU$^wo*=uh#MQ7vd2%2r{Cqr;+jzdioLIJ`KtHPIjs@p&)D0tsdE zRfw1E6?*kxZ_<_@>9FvF3s&>qbeSK#CG{UZ|2EO=;;JbSFQA)(*50H=Ru%?dt;vqt zRE|hUv8q&Dl?>n4JNV^*e7^tN;Xe)P;PF$<`*2l@H!~BVB&kG#?;%;moNf8zkRhx3 zr6UD~G2$=(IsV@^a(G$Y)t{_Wl-Y(6$hhwJQb!D(p~$XTjV__&kRiT*?kxWv{BNU9 z+8p4Zu)u83MZBPYG-@rN)0eWR(NFmA0sq@TnDHz((^wpU8_S~f#SL-(UvU4ry)2z^ z+%8-J3pD0dzxv-e|F3PN=h7kibEOmk1@Q?`)a%vV>}}s>cRIW+Qhd6xu=MVPKDL%2 zUs7^!u#fU*N#szYT*Oe)ql9<>u+NQ>`BndU#-K&NMMw{cX%C5cHeOtDMm8#U|Mu+W z#oVK;h#(Dh_RF}UEuN~rsCw^5S#i1W!FC5(p2f|JR6hxk0AQ~muy=kEI4I`)K%t}* zeR%HQOe{ufRtHq%WMldhF^KvEf4%wUFZ!xQ41kl zVn#?N|DN|nhuwe;MhrM3=Nd}d-8;c5pWk=<3hkj0BiS6EGF@M~km1nLul=-gBWXFcF>&!_v%4i@mE3g9qi_43+E@mC$i|aQMIUk$W}pA z%s7-+A7CBP-bE}(;zL%Sn{4M){XJ^xUA#yhmoYNEAD_!&2OSka}fxhm_EDR$}x6aazMgOr;CHEAhLBl=u zUEXP&KeE499*!RBjg1y5d^r1tXFAe;@emDId~-Py{bO@quNUct79YH^K03$j1Twj*|AG)2{R;aWL3LwY6$V^)flSz7X()D6mI1 zg~`Rn$y^5ch|h0cQqO? z8UMh5)IMMqcTjzr^$Hq<)z}cz3~2BCko0)bdf$+q2KTyaEwJ|Nor)Nu+V|Y#SbPHH ze;yXQU7C-xAxqL`l1MPKT3_NGk?P>SiPGn18&fw75_v;mKbWkp6#DtdAtJDmh?+rT zR3;{K_NWp(7xOC(^>W!dg_aNIc^WPOoK zVq!x1sqd}IQ^iY_`2g1pHQxS6MOjT75AKvc)g=;}Hx4y?*z&T%J5bS*`7*4Z@nc-175O-*dg*xN}c~Y16Hoz)$*EZLVXziB4JN%?) zelfBKD^|7Jy3*X!+*5|9b%KF!LlVh1NAOIAs?%Xe*1|@mB3aj+`VW2yi>`pWq6IU5 z1&fhZBJT%0zQ&hs0sD8-ycsp`-_pI{gV(H_Ef*EY_)?21Vs~>*&?2;(7noeMoJ8m~ zloiY+@w@zFnjMN;nB2lXSqS1~4qkHLxJ{Ei9B_1y(xU1bHuTB%mt`8%J*9i+I;k2H ztvpl^c+-h|a!cej1H5H6?~LsS;xKZSWQ>MIw6?Gvw#Ap=v>J6ZDnjO~Ud%vn$UcUC zL?yjt%aOKhxw{v|_;-BL2sWS&xgJuHLOyk*3hOngh^4iCfS&h4<~j*6&xKM!)@Y4RGhx5#vck4$ zdy;`qaY95?K<>zm)#cs-8y4Jicku@MUW}~5B@x}}5 zXN*JJkDV+GN=U0A483U$8p-XXX|n~fdvWN7vt7Bt-6Mv(rJ?ZP>CQ4YH2hY~mo6*f zlfYF?+tFK_mF6%XtFBK{ho)4ppefO$EF*V*k%50`gGUirj=7^ z+4o9zJE#N3hoj%QO3CUL6%E(~P}-s*aI(I0>89tdaqe5UHgwR}4Xh=Fw>a;_{eoXk zcebt$vYs%#Y8o(1=`)ka&hec5*pxwO?)#HZOXwIt7#=ndWAC_3AQrUHp%5I!i>8rC z>*z>|OEtgV4P4mTGq?|~k-p)`Csaq9An~^-ElL}li0%m5YzjMa@63{oo9-#yw(aWh zTovTDmax|1@iseKD=^r4AF#vF$Q}-If$Ep4FxC{LghH$+kvkIfxcJ1Pwzjnhlf~*M z!z@5N^l6Gsjclqvz)g!%;e4K?YkO|^MQy_beVpr#HP>as+AkTH)7ul)Ysj)WX~z<7 z>RNsHn~S9Jgkf7A8r78iW$}<1(`w80_Z^jnoU!ve_hdz|ay=;Jbxh*zz%pjCagiOH zE4neN5?ab2PUw_D_1OCmIYN#5%o;3$)d_-OMTrI>{l`x`KQ3YohJqYigmDM9E}h=) zdNje0t@yF595{>5Ia6M7=5Zpjwl>MrR$LyNAyZ-!zGBNSriLRC?OP8mW1FfsGr?y< z*OLePSBM8oNh>y~%LLdo+TNld|3)hof1CmJ7%%%)Vd zrwEE7^lz#r{b*IsRO@N#0vtzWXml0}^F*|mRo5s!_DGl(IlY|g`=Xk^?=YOH72~*> z+8XWJ=6q*d^J1XN;fo3q)eMIIl=2z8e|9xLXxX9J0xmvzI_4vf2z-Txi)Q8YLxntf zU^7OYr*h3R_3rD6=35S`fuzB%QaO@j^XBb(B2o)v8&JX-rDMhL{@IV;%91B0uy(5* z8lBm|7VVRsMgiU4E}U5qKJkSglQXU-q*9<5wDRfhgvoqGK(;qtCO9CoiTC$8fcpImU5oz?#9 zr53z;iJ>Jtl+3YNkTgA2@GTo=oGcRp0hUpySlX@9aad?6>E^o(0=|OtQhvtrZgcz! zNkrcQ{+*id&8=h|?{RoPHFKtPwY>u>TU{&khtG!pj_>!idUI3#5Fmu{km*Mz>XeF4 z4K;=zHSHLF$`-=#sjRKLu505^Nf<&+Lm+%BGkB6crTpbKSvbvnkDbyhk}-+SMft|i z2uYkxt~~nVw1B=iK^AkRnCP^&{4lKbV6^;OOoepO2ufQ~W2kwys@B#zZ^6UDZ>Ad- zllAmoN#=v+JhQUPeNTP-u(I8f|E8&mx;Sn!_!(n2i=SkeOKLX7DNE%gqzp|5_e^Qc zM}eC+v60~1W_r8jmE{hrJc&MNQdclXq_L5+i}fgDE-v>s>a{r&8=G+9_gwQQfc=G2 zW`e)1M5bhvLvFG)$Y{KR;r`B*Ab5O(e z=ssyeMKOaTZ%}rxEO^AMO4kO2gvdoY5*sy?0mJWTr%H>~#K58JVo^e>%F1V>n%ftG z70JN~iS3C5RVJqd9-{{mO*ASGrJ%(NmGNX+b?&J2Y|oWzhOH+6hG^>k@&kvNPYpeS zwHJtrIDu(*2c-rU6U1MvL{?!Z2EP<)wZjAhgsb=R-}U#~`bIilz=xXZCkWLe{8cf6 z)}a*=h2LW`6T#qVF_^-1G8<;Zy6E7avF+c_N3-BTZ4oHZqu>$FypMPX^Jy_EQ@X6U zQ(73kI!PALbzE{PYw}VnCkdS$(8eR+4ECaBRzbreV}OTAC;8Blhxq9gnV?q8j89JJ z)mR}|q=8fs74C(3*yQ>+JvuskStBzQWNg>TS@gawJsOm1(?Dp7ei!fgo4kDEMkuac z80==?=QGWU6)EuJ~SXdsuWt~%Y4)*)!eD&NZ1d^@`c?w0nasRb%HO)(Hyrek?H`roLSGc#y7f zL!;Zb6plk)`V`lQy|)}q{HLh-du`HXwDYu1s__sbh6cB!%!b2%sJ429H2 zC!*$9#xskLmxat<2V=mvxtr2kX0jySQ2P~S>mwFXaC%rAhw8{kx%_&fsQ2Hf@!Gb@ zRo>rP1b2Zn)i0+d+&oGChD~7Jqg>XBxPJn?=ZZgiJyfddIPZDOo;7&u6!5!RO!Nsr zTok(G1&tC%*Gox2G>dC>nfck^Y`my|hk`0w?M;Z^$c#s;Iys4;>tjhc3t#i5EAzk+ zN70Rmi@6bL_f|bfWW!_8djj-OJC15gLS7cyK1648M;9F;udQZz*#BC-CYTPd^0iX= z8cyZrMS|q-r?a2-$Vw>!@EM62#p5jzY#6P|6ZX_07aSSdVhYRM=;^q;up~Gs_vY~ z?)=M4p}DqSD67-QV=_+w&JlYXLk;qU7A@5;4L_}@@hYYp@51|Ipu1%4acrb;1q}IJ zMd4^W?;@n>pUTnNj#zlFZWzLY8VY%2A|?4`N9My%$X+U!OH|j+CemnKUE^~lsEj1L z-N|NbzO)Bjsi#pGYFs0)-odbpWJkBjl?rz{Ssh+KcZ=@1;XiXSvRs|FDpY91pwi z$xpmQ9@cWZQ~0`VGt2t|?u4Je?|!S)IOh0Qsr%@pURUWbP+8~gys=5w zdVQp_BUZ8RJ<9%mwGtftsiVPd%a!C79>#-y%7y*OaUrlWmZJUePVbJDDzlA_9#Zkj z<5SEo1~x62k5vA5JMP z@>?8v`?1?mc9>P6O&TsnljP?YGYQwy^jWgBaiI1CWfjtkMf!+NZe7S5VS8|qM6771 zAscN>EbW2XjO}zoaum~q-k*^c0w=q4S1jsN_}=mv8#zedQ%t@bn#5v}&!1wQY{Zz~ z6qTeSo2aRxlbvN_2c$^7Z%QrJPS#${)Aw?iBx$~&oR%)`v|-suZEbLO#rIJe#`q?N z)y>R%-miM_T842xB$TgFOip%o+gBtgGPz^A;&^amL$UD)S@V2OIx-`XuYt$LyojfR zL2hW;;uo{ZG?1p!{<>H;JG<;!l6L2tW)9g0JA?4s#=};PtAI@1L1(y82RkVBa{}SJjHxK}+LYOi${c&njaa3Z2qZ};LE`=W z>^cB_Vyy@!BF38?oyF)!aMkcTqQUHZl+|EwC44jiFPut(p749dJ7GF%Y-(|8VnPkD zA|aIo`>V}YtV07ueXP|$*C#+smDM|EB!jr+<9CM#=*v^Df*1NPz;P>pysr%Aw{7Ts zArA9o0t!U@YD{=IB#6pL^1T(Jx`YbL6i{WSkw;EQqs*#@shwht>cM)Zy!r6*buv5m z5~fq6y1#*13BAOJr7oNiOsAeB*4EeY;NMj#Yeh$Q^4U4x><;s6yU$SB);Vn(r4W9a_^KUWo9_JB`5NieMpIb22g!k?9$QybQAJ9+s*n z>_!j^&5lAKjL4&?vTWb#7xFqU?F0OiB8Ww||Gv}&VDjxdYcBqu1w|)~p6E@MLTC6j z#M^2%0bgMuRk(SrC#NagCpn6%S%B^H7ZXdP_dQ|FQHfA*vWW33VV!)n!IfE^R&<)2MMc%wQDr3lE`U&vW^{#EcKiC!` zpyOt3IIpKAUy$;q!CdH$Hd)Ew+`uV&@Uv?Jeq!bhzF_J!-&|BYmF@08Q@a3*M*qm> z#c*>SOe9qUOu%BLD%ewJr_Vo8s-TbjNpRA7MPyZGRuG=ve_6fTKF_A@)=Vus-#KTO z`FcFhy5?AC#=2@&0MSY8RKXg02HUM}DXQbnVyjRsvMFJ$Xs*C2lwe>^4fYm1qj)*6 zSAaY-ZC`X`p|c~Z%4t8g7G+*lB&#t!^ro!BZ6?-kE<;~&UWlB5SdH98hF?y+wXD0v z${O+`gN)yzREm&(7490gEGudiG{+D;A+6iDNd zLehz`W5w~nu|mDvh{kHH?--aQ!*V7vng@m?-z9wM?8x3m6ccy?%s3z>C~SFeQ`u8Y z6(x?W8Z?1u6AdSH+RMRWbtAh9W@Z~I6<5wqMdd*W0j>aKpN=HC4_*Qrj&gEHqlyAV zdo?xLeeB^q1y8}KZ|PQ^pe2on9V!^%jmvbK$q)M3)WH1K`gS`!d50{hK=WWaM$C}b zv>lO-vWG#4<5qtAh&Q$1h>17O?;q#ee@^pL9h4O4Qn7iRmixF?`+#X=I^&h*kdv{u z!QgrzX>k#V$*Wj}Fxpy1oqRdb;4K52X(}@Qoa1hBonjV-JqNEqPwC{&$(gIS*$3!r zyoBM<^=Wz9IM>)P^ORs%*-Cn6y+uO3T}EacEHhX73lzVwycG+JtGUGS;@y%Q(^~7X zb@znHw-3~kX9E>afCWn$ov(-KXsNu!*Z5v#`93Y&QT(IpbG4s+;@OgK4E@Vs%lf)8 z!x9LZC32ZmTVEPE`G1>B4*L2t5GY*qY=PbqY_&$fzQgXWQP1;_iHm)ude~#;# z{laYMl0NLz`5GaBksjMH%YCah0&QS>f|mXK7DQEgo{=I1qP0{G&5c-8s&dxkN9Ml# z+?xqUeIOm{^vn)u`|PgxbIk*u_xg_nJ3E`=ABtcXjpXD3X*;9xx4gEQc>;M6ZnvJo zF)U2Zt{|xIoF62bJFR8F;M*>DgWTiPNF(j8Z8o2jUw%7fHrBwJ3I&O4BaF`=`m*v8 zcG+x_W|H#!N!-2{dYdw%mQmr*MRBS4x)1Sj)Nic)@mJya(TCBCWbQVSN*l8EwE=7| zFDAkULa%Dwpey6#Cqs4rz_l7V~>|l0O7NqiPF12 zwLoi=5R*`o2&=mky>;N$thuBPnJR{3MRTB=@-b@wx&W!Nh>-;=}W>u zbKB^6Rc4I=d(><28Z{HL>aM5%3$B$vf3_K1s$7NAk5*eazN-+b$8C0CP!P9 z8hbrnu-K5?oL;p2gswK#;23yq0N1fy`x#@&xG<}ldB0~QQ?N*oALVtY7y7dvy@-*(2sxgG#ESZ&!c1}=%yPpnbiN!2Ko#4K~BTFte&py%R!ljG%lI_WOf*od>0p0aI}k3MB# z3-nj{*=8*Eg}gHJ#I_n))LLOjOV|TjfiM%vj85iWQ1#Wj`xF`8h-MNZUBlTZW;t!u zT(B!-Rz5h+XtI#j62HI2T-CH0lbrRsyu2D%Sj`usmfi^k9S_mKd7Z?~^I`$#R z9^W32!DdB`j;=xM2(}5QtoMrbbl29TXVJ}MJxN&y3BByg1n^%Al9?MZFBslFtEM}6yX!z+JZM#GDh zZJ(kGxBJ1dnA>RVHsRADvzQiHTQzH`k3_+e@^b^uB}tr;crn!|XbQr44Ry zdr%y-@Mh~>PZ*mbK~uYZ1gE3^oC_cGd6}nT;kl5zO3f|qTDlRQJZl7*U>g(ecO&(* zP&>4YtUcK{o`^u^b9SH3iBAacu0_vS^(=2ep@++A7O#csF2O1Te1{g?FCa#1VLX+- zQBgP7t8aTjV~)cUo#UU8NK-y~zHaC&@|<41Tv(A)uh}7Ae$RrI`Py>Rl`?PwEUQUf z*q#hsiX5+ZG+61N-%a>%H>EMJpuqmQ>a?>-*Nt$9b%;#SH+AHl*!$qLtO9@bHtOfM z8&;-#66yoXN|K}-m8~T!LmWN_ow7$RKAfi$Fa{sei;LHxp00Ixa&^oQg7%yn31X6{ z@lX2Uq2AhY3mapnC!4%>`2_2DwnMLX9E&S%UGa!=ejAE>JaTWv{B<5aB z990vJ2j9yp>zd?Z~*2{}k>qQS)m${F57jO=$`1>t5_xy~K5A!s4CP zElj1T&Q~g)OsNS={amV3{o3uBRnI8DOTYVFH~1Kxo(xFokdoanTYyr@Ruv5 z7-uZrOmB08UI6blC@Cs!O#=<7rleW*Grg%bYW8kDG)Is_&eRTvzKIt!%CQOybBbp7 z4_hXtZMGBBONpujSeNW_CSu;68i*ZMjV|2IT;vI_Yw$7SOQQyAOgKA{scy0Tt{*Yj zNZ~O`L3Bc!TclhD$L;R_%%IU4jaSxp0j%JnPPh(Ft=s!da^c-DW5eNi+ zSf~d+*dGhQftANCtvF{$?*li!3;jPBAHmN8`>X!9=sp2ZZU4^4X{j@~>*Z*%9CWLzHIrp?=FdSJ)FD@GyB*o+IdNx8ZrY+*Rf?JETGP z^&AH3fsx{Gsu?EwE^6yxVn5$*GLv^(XSCEC}{_HSl=KrF5F;kF&9GvKr z!lCLpG^xXyCM;y0eT0Jx^*IIxy0013R&ACZ$VkJy;Q1&*SFCw;&|rA&y2+M17uwbH zm%X|~{W$o0)w+vr#>(U`pa*bFlcC%vE+NG3wHxgvG@@@_z02S%lyvS_fl{@km3F?0 zEWDB~;4Go?dtdZJcE=pH8C>V6vgC^$~>0ctZ<&W+!ofp?+01) zICXV6jC(4u83E*IpXRb(w$ER2{~Fr^;!y0$m{;;nav^=j+q1#mGB}5GH_cz43XDbAHU2%IBex;pc_jchVc&!PzKr4V zl(>xl0d@J zo4d@FcwtBA=IQZ^LtHYWp8~a@8e0%Qqjbu9oPM8*OJr`?!7<`Z$>L}rlKxC~CJE_i zfaTzMd9tLH@_E@--A`M88P%KEO4x?S1JRNlxY%i~^!Uw)$)A#Mscp!K5cPJ`5F4T| znUHMXO@;Lm3^F@}sTWJIg_2O=cg9|{y-h!oO$k?&0n$%^cUL4t6yWkBoi_#vAn8{+ zsp1DvZ61&E7!d6exh~{a!cS@`x`3@bq9q+E!R?%-*2wg{cQ5JGhiG6_L5c^ zrxWucp$QV{2e%mK_p`cd$HBAe82~)9suQsFLrRF;#w)Cb&q;hFqW(Cno_D||*)-fU zS4K&@n9`$a8uGXKJUH{{iYL5mbFg+%^#z4mZiCX zA`Dt3_4VMTn35vJ_Q45f(oq0imw8fRq#%O;w3(kBtT2i%b4_bBUc6dvw5#J*9%o6+ zee#@>JgbfaHOD1UpQHgagd|>1gP8rxS3Q=xo!B~1z*(bN$aDv_}p>@S|LIB4EenXXb@{$!fd1gJXTxfUVp1~ zM+&l-rpB!qLdf^yFZ3n#qYpDc_AZS9N4)~wvb!muFp6qSh9uw+puf#D5}DtZvQ?ktt1?-7{CJmgys**r z!oT1h1%N>#d&cQ<_JJPE_jwS~ zvB9EkQ;c~-B|DeRgFSm4f85J*^aRIFEmiv=j~A2+v@4E1#`%phJ4Nanm72~>#4}W> z1Rc93w=r*jAas3nZ?xf%aSQd5rMJi3i(5ol6*?JN$L#s7)Why34-;mE-K7^`C}XhF zH^Vv-m5tA3CN%>cwo082pf3j}lA{~pOL(id&=Hx(~u z`EDY*WJWIaFn-MzyLXp@lNr_Sc!Rl^!|9XO?75~=FQcbjEeO2%W=$Sl(7cC!R=N0Y zvP3aj$Ryh10EPiod(K?r(n; zO={RO|1sxlH)i^kB}>FQ=LoUU%PNR8`^e5y>okO3j!0Xn;YU3>!9h=!L(H29&*M3L z9aNwwf++?smrA7@4<~LY99k*dm!cf0+tHw`08waY4HH#xqMv=vR}UQNv?f#l&d1Q8 zJ*OBzo6!|U@xlttX3NRRO81BqDh^Vt4((-*IKaHyhIW{Z*R&Z^zAZr{bSI*q3<0yP zsPR6)esezoJXz?JGpJb|^+YX4n&>5_C9JxaTNd!e2z(o{*8H-Pqw}u>XF~!PQGShX z=}en_t;QFs=xDd@VqGjhnDhJ?Hq%`%U0hMuaDJy0WT3TcN;!u7IL}J_dlA@>Iq_%C z_(1Uc8eR*(G zf#31Nl0jaBg3fOCG318KDAi=iE_dx77flp`g5}*J^fj}#R(MuC<`In&CB=5?UVcZ1 zJCG})C&2iaXQ+2(z&@3_7oa!TY85focnC+WBcDLlLq1ueGF)=p@@pg(L5u*AYNedr z$Lww-D6)Ru>yf!bQNra7o%wv)!RV&LX#PSu9FbVav<2vPPh>C4Na(By{VpnFg471< zWmu`0^4mTyd+ozO5Re0>)Qpv1imn6i_YLr7ZDLJa==G-%ka-?x>qIMZ*Iw6a_w$(* zvsk7}Po_(r<>W+vA_KCT_966b<9lNoa%V(ytwdZpfu*Qsc2C~Y)oOb^oP3@@449U8 z2O~F6pLwzxk7|d)P(rWwi@bM4FRF)>6WbRZvK)|tmek!12=cDMSD=CR!h*SuOs%!| z&{JnA<;WO5FB$P@q_Pq}D0oogl%(~%+Z@14OpY~dAX@)ZJl z?}QE6?WY5cn6$%=Vpyh~2IUdQu6c)bLXD`)cQ+JtQY4Ee7Tqc-SE|%k)<130w}2v3 zEDfbGAG{qr zAysNxx;kD}i%cFdhpkZR7K$rCwn|cSGnC3#*9L?C%Sb-C%6IPTBUNej4rlko>Ota<*@F(aAFzF_F|Fh%GaZcg4%C?90 zneacdMIXl5e}lFkzm(kw#b04Q0l?mWwbsA%hbzVOIbg@*?7qoSD(MHk`>F7SqYvU6 zp4?T7lKUN#J#+S-uGDg!e@j0{<}dhg%!O<%phyw`|BwUz_G|3x{eaAG@Z=LfK)BU>Nn`DOD-oIx8(9I@F@z4I zzghm?;}iXHT~p6bvg)T#`WX-MI@PK>LOv@XG90m<__dQZN-cS8CBe1g*FTkqwc?;3 z#wmVL>(5IckMA)9NJuB)ANzZosAvz>es?_@Bd&gyY1zUoxsB>_$y^-GF_PDGkMl=2 zaxFjUU!rZ#B2+rk7N39R_a@-S5iPi4WVSbs_}D8q>Sl_;X`Y5W_Paotcug!ORW45O z>?kZ&?XirT9;i^HxqB{nhv4{!nD)Tz;@yYVs&9w3pSn+}Jr}x)s$kan5wD}pci0Dc z-w>EV1DgRd8V{kem>KF){1%=+5sm6yI37BW$2Sx`MM zA(E`zR2k}2+4#kOijfgzv0n8Rl6_5trj;VV8pJY;E?3OC&;$Kbc6j|T`-k0|>dv$_ zD)sR56QG}3z3|sOYPjSCiZ_NrN;d|f!n>{_#po)pP%km9?oXk9(4M^tTk1(gN&Cy3 zqD|IVnF7`kel9Q!sxtgoWKQnpMjJO?y%eWxbJ#Pm$@fy}^~Q4%p>4DzymYnI7avJ= zzRjuG3(wtOI);9o6KGKKZZ3t&9F@JwgDc2qQc#L^oUbUP?`%p!$PFeVY$Ju|V;HeN>V~_hKXor3y6RY&DPl4L% z)ypoF0kVBV%3cZxLp>52NE#V?Qw%E*wxCl#e`@b#$C_lWJR-vCUpuNX{IXRGPAEYc z_P~!is`v!eS>dx zZcHf|SMIXW-1{C-kCT6`;=^#WK*8|z z-<8`5%|UO5Vpr7rB*q3mqv}VWL+$jG>J@|*%M18`K+HNM*nt9fi)K1H+D7O69PEx+ zF{c&~0>su6jIZI|q-jc=5{90%1C7RATkpn$2GnH#Jp5ftenRMXoIj7YjYZsJz zj0*ojO>9HaDCE~KyK&DtzOO0E#VN4M6w|MivHz`cg6sSO+gP?3hUPC>-Y_d*o_~wi zHu(YElui@&KZ-Uam=PoUyq4+YeDVRLJRKm|D3Ber-Ob9}yw@+~!#z$cY%TVO^>vuW z+2HwZNKMzQ>KM8+<0=N2qhCXIdIZIi;RU;%$~b=Avz%9pboXIL`&zAaG=J@l>O+(f z@aO<4z8NJxaqME(E_O__M-cxh9%~%VnWmX>!D^7pMj)xHW>{n~e?)wIUe0@4fyj+) zQ-{l~ve+cKRtU_u`!Z?(yYqd^9tjj3QRSXImuY}dYI~fbS^LHHRBb{T92C7zR;v0W zXS=7cwk<%*EYV88oY{>1@!mqj`id>@!?a9nBNrP~#PAec#K7T~lN=nWk?5$JbYT;J zC`oC#FJY+TJ=FCUUWs*R#22n^zf2W2)i@7P)M-MnxYN3Ap|Ts27278&WTiPYz9wFG zPf?b6pQ@0*ezjG_Q1P9`#?3gqviP39^sbf~m?^VE--$nXaq@3qT@5Rw<6#1UaTJ- z*d`z~dm5l(u=r>CWRRsh`I>lu_{~}(S_fBEuoCX6QXUbDYm1Z&JL|DpD}Vho%};OK zDp&6m^@rY}k7tkWm72$NPyHb$j6#Bzl9oSGNpfBb$R|D=n4mn7+6_Kk86akg{eFXU z_VhEAo`GDQ7zey;hjbslwb0hYtF0k-uW!qDFjoS7>IYorYeeMd8`2`mFFjvBmkzwz zlN^95L$leIQA}W!mR1Z>6qMYBrATz|RYZIn<%T+zLn`tz@W8k2p)mcLx* zaQLF-h8lK4*ACqL`f+4B$syG{bDzk)nj+lCAP!m`I1i+ltg79ZL@2138da() ziNmf(cn(1L<#HTEMeD`*76zQ}n%)R~WzCyZAG1~INpA0!q5&<6ZrmR#Z!B{DJmS-N zJN&}fheElW_<^M0yO6o7Sf<2OCOk#$2VCgb=5CN{^b|+tnP|b;#Hu)9v zyQA&i>?|zKcaRDW=c(Ik2gY^ju#R#GOw$^R z(kE&R17hS5N)(e9ksqSuri%8pvrC!EnV+%rNajrK&zj}f2xdHTt-G>LQxYR!6=2*u zFcu3a%6u98R$$N+m;~c|Qa-@qh`Q&MG``ry$S^#W*rw`G!F&tlPr{5*)Izn_#5Hg1 zxmRgpp=A?bnLfH&l}OQ?>}CPe_ZPK9C8>|!=0m06%1w0=r9QQ!p-1E}Kp%bE*!xzF z9AlkWvLTbksqb!9!HK&O7ksSn&7snP!$9XFpyd{(raN#ZA9c!ucT~5WFVyi&ckq27 zK$Hs_MTG@Yo++khX@REZ`O1mw{>)V#>ZT*!^SpL$FXjLjZ!yJnbT3(cX_cz|}lMrP(|qLap$&3E87k8T!?`1yUO}(8J{S{mQlAa!W}*X>-7kL+@GIPgNJ3TSRqyut#rk9kF2Sb8ZvaMMysNtEm@^0iei$g$Mu?4+-{g{+gD-t{RA>KbS zoW|nlQ~kE+Y%vNjY@a^o^Elz3YW_eSwr!%j7%b6`Jl@f?Qf;^NAmLj~WsXw^<>uPD zrpEG7)-)3*h*UhwU5X3kA1VqN@9@pF-eL=gO?CELrjgdW6|JIsjPNaC$TS%o%CUJL z8f;565ubMbzjB-np7#?onToRJTk`%WOtYQ+ADoV9F?d7Aox;_r4c=XR!|K$1P0Qr& z6mr>mk;N91h1^BsNq>$RzzI3*o>(gN@F+f4Yd>b*EP3Tu)*QQ}Y*D}S{$J(-M zx+r)EkEvf0Bei`9|W z993J&q6^yimY@zLoSlh}*V+?3HsV*7JQ-)B+ZaE_hrsW--72?Dd>ZUl3q6&%eW(wc zi}oRO-+wGJ&Tgd_DDGvR#y15ki5`7?GiSpcTK{XWmfnuiJet;&nWelR-^%QX0GfYS zpU_pZQz4pWn}b8ImbA%A30|P){%NDy&P1o-4n^zEuqQfOIUv?5lZJRIhG#Wd{ozlF zw3pdvz@I`k^Wv2zrYdBpim!>y{1QRuT0~A#%wWl@61_$2phwdtU2K71-jv&d8^rM~v;|6a?TzyIG=*jbolX|H%TS@D+A zfIe1xRC~1g-&a*5nHRa>KZbcti=7vFazsmJHq-!Jpg0lkuI!%P0qLow=BbZ}?yCNW?jaW?C(t zhr8;1QS&T2ljuXie6bq-0U!cOrq6ZxL<{0uajiV)g&p𝔧}1BLvP4$ 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 literal 0 HcmV?d00001 diff --git a/test/models/COB/dwarf.jpg b/test/models/COB/dwarf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c07e003892d360d3fcc3dcb157cd30d38710d2f GIT binary patch literal 84158 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

XI7%{?`>pG`+%O+1>HmVt@w15}xFmC)N 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�kzP*&$>v$bJ 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 literal 0 HcmV?d00001 diff --git a/test/models/COB/dwarf2.jpg b/test/models/COB/dwarf2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf54b06573e22d1374561885b6d39458c55f7997 GIT binary patch literal 83046 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%0A1U_T8*G#DVd8hiEfg- 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 ZA}bP7;RDQ-@*>k3_v+IW>34 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 DIc1Ox literal 0 HcmV?d00001 From 3a69e353f3ca5cc831797b61cd54bb50d5018114 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Mon, 13 Mar 2023 13:40:16 +0200 Subject: [PATCH 148/232] Make Blender MVert no field optional --- code/AssetLib/Blender/BlenderScene.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Blender/BlenderScene.cpp b/code/AssetLib/Blender/BlenderScene.cpp index 3a9a02fd0..ac10d7302 100644 --- a/code/AssetLib/Blender/BlenderScene.cpp +++ b/code/AssetLib/Blender/BlenderScene.cpp @@ -569,7 +569,7 @@ void Structure ::Convert( const FileDatabase &db) const { ReadFieldArray(dest.co, "co", db); - ReadFieldArray(dest.no, "no", db); + ReadFieldArray(dest.no, "no", db); ReadField(dest.flag, "flag", db); //ReadField(dest.mat_nr,"mat_nr",db); ReadField(dest.bweight, "bweight", db); From cdfdd75a66e2323bd834f923798d3043ad3deaf8 Mon Sep 17 00:00:00 2001 From: Inho Lee Date: Tue, 21 Mar 2023 10:35:24 +0100 Subject: [PATCH 149/232] FBXConverter : import FbxCamera correctly FbxCamera's default value is correct but its transformed values are described in each NodeProperties. --- code/AssetLib/FBX/FBXConverter.cpp | 30 +++++++++++++++++++++--------- code/AssetLib/FBX/FBXConverter.h | 9 ++++++--- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index 37654746e..416a73d9b 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -152,7 +152,7 @@ void FBXConverter::ConvertRootNode() { mSceneOut->mRootNode->mName.Set(unique_name); // root has ID 0 - ConvertNodes(0L, mSceneOut->mRootNode, mSceneOut->mRootNode); + ConvertNodes(0L, mSceneOut->mRootNode, mSceneOut->mRootNode, aiMatrix4x4()); } static std::string getAncestorBaseName(const aiNode *node) { @@ -196,7 +196,7 @@ struct FBXConverter::PotentialNode { /// todo: get bone from stack /// todo: make map of aiBone* to aiNode* /// then update convert clusters to the new format -void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node) { +void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node, const aiMatrix4x4 &globalTransform) { const std::vector &conns = doc.GetConnectionsByDestinationSequenced(id, "Model"); std::vector nodes; @@ -290,14 +290,15 @@ void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node) } // recursion call - child nodes - ConvertNodes(model->ID(), last_parent, root_node); + aiMatrix4x4 newGlobalMatrix = globalTransform * nodes_chain.front().mNode->mTransformation; + ConvertNodes(model->ID(), last_parent, root_node, newGlobalMatrix); if (doc.Settings().readLights) { ConvertLights(*model, node_name); } if (doc.Settings().readCameras) { - ConvertCameras(*model, node_name); + ConvertCameras(*model, node_name, newGlobalMatrix); } nodes.push_back(std::move(nodes_chain.front())); @@ -327,12 +328,14 @@ void FBXConverter::ConvertLights(const Model &model, const std::string &orig_nam } } -void FBXConverter::ConvertCameras(const Model &model, const std::string &orig_name) { +void FBXConverter::ConvertCameras(const Model &model, + const std::string &orig_name, + const aiMatrix4x4 &transform) { const std::vector &node_attrs = model.GetAttributes(); for (const NodeAttribute *attr : node_attrs) { const Camera *const cam = dynamic_cast(attr); if (cam) { - ConvertCamera(*cam, orig_name); + ConvertCamera(*cam, orig_name, transform); } } } @@ -413,7 +416,9 @@ void FBXConverter::ConvertLight(const Light &light, const std::string &orig_name } } -void FBXConverter::ConvertCamera(const Camera &cam, const std::string &orig_name) { +void FBXConverter::ConvertCamera(const Camera &cam, + const std::string &orig_name, + aiMatrix4x4 transform) { cameras.push_back(new aiCamera()); aiCamera *const out_camera = cameras.back(); @@ -421,9 +426,16 @@ void FBXConverter::ConvertCamera(const Camera &cam, const std::string &orig_name out_camera->mAspect = cam.AspectWidth() / cam.AspectHeight(); + aiVector3D pos = cam.Position(); + out_camera->mLookAt = cam.InterestPosition(); + out_camera->mUp = pos + cam.UpVector(); + transform.Inverse(); + pos *= transform; + out_camera->mLookAt *= transform; + out_camera->mUp *= transform; + out_camera->mLookAt -= pos; + out_camera->mUp -= pos; out_camera->mPosition = aiVector3D(0.0f); - out_camera->mLookAt = aiVector3D(1.0f, 0.0f, 0.0f); - out_camera->mUp = aiVector3D(0.0f, 1.0f, 0.0f); out_camera->mHorizontalFOV = AI_DEG_TO_RAD(cam.FieldOfView()); diff --git a/code/AssetLib/FBX/FBXConverter.h b/code/AssetLib/FBX/FBXConverter.h index 41acb6ffe..b9b6c46b0 100644 --- a/code/AssetLib/FBX/FBXConverter.h +++ b/code/AssetLib/FBX/FBXConverter.h @@ -134,19 +134,22 @@ private: // ------------------------------------------------------------------------------------------------ // collect and assign child nodes - void ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node); + void ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node, + const aiMatrix4x4 &globalTransform); // ------------------------------------------------------------------------------------------------ void ConvertLights(const Model& model, const std::string &orig_name ); // ------------------------------------------------------------------------------------------------ - void ConvertCameras(const Model& model, const std::string &orig_name ); + void ConvertCameras(const Model& model, const std::string &orig_name, + const aiMatrix4x4 &transform); // ------------------------------------------------------------------------------------------------ void ConvertLight( const Light& light, const std::string &orig_name ); // ------------------------------------------------------------------------------------------------ - void ConvertCamera( const Camera& cam, const std::string &orig_name ); + void ConvertCamera(const Camera& cam, const std::string &orig_name, + aiMatrix4x4 transform); // ------------------------------------------------------------------------------------------------ void GetUniqueName( const std::string &name, std::string& uniqueName ); From 48d89622ee436bf30e7bf9e799802e51674c9e2e Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Thu, 9 Mar 2023 13:38:06 +0200 Subject: [PATCH 150/232] Use ASSERT_NE to check that scene has loaded EXPECT_NE tries to continue so it ended up dereferencing null pointers and crashed. --- .../MDL/utMDLImporter_HL1_ImportSettings.cpp | 2 +- .../MDL/utMDLImporter_HL1_Materials.cpp | 16 +++++++-------- .../MDL/utMDLImporter_HL1_Nodes.cpp | 20 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp index 4614066e6..d50c2b35a 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp @@ -190,7 +190,7 @@ private: Assimp::Importer importer; importer.SetPropertyBool(setting_key, setting_value); const aiScene *scene = importer.ReadFile(file_path, aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); func(scene); } diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp index 2389c0ffc..f733893ca 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp @@ -61,8 +61,8 @@ public: void flatShadeTexture() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "chrome_sphere.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); - EXPECT_NE(nullptr, scene->mMaterials); + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMaterials); aiShadingMode shading_mode = aiShadingMode_Flat; scene->mMaterials[0]->Get(AI_MATKEY_SHADING_MODEL, shading_mode); @@ -74,8 +74,8 @@ public: void chromeTexture() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "chrome_sphere.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); - EXPECT_NE(nullptr, scene->mMaterials); + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMaterials); int chrome; scene->mMaterials[0]->Get(AI_MDL_HL1_MATKEY_CHROME(aiTextureType_DIFFUSE, 0), chrome); @@ -87,8 +87,8 @@ public: void additiveBlendTexture() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "blend_additive.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); - EXPECT_NE(nullptr, scene->mMaterials); + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMaterials); aiBlendMode blend_mode = aiBlendMode_Default; scene->mMaterials[0]->Get(AI_MATKEY_BLEND_FUNC, blend_mode); @@ -101,8 +101,8 @@ public: void textureWithColorMask() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "alpha_test.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); - EXPECT_NE(nullptr, scene->mMaterials); + ASSERT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene->mMaterials); int texture_flags = 0; scene->mMaterials[0]->Get(AI_MATKEY_TEXFLAGS_DIFFUSE(0), texture_flags); diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp index 712f4da11..49ae8a16c 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp @@ -136,7 +136,7 @@ public: void emptyBonesNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_bones.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const StringVector expected_bones_names = { "Bone", @@ -172,7 +172,7 @@ public: void emptyBodypartsNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_bodyparts.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const StringVector expected_bodyparts_names = { "Bodypart", @@ -209,7 +209,7 @@ public: void duplicateBodypartsNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_bodyparts.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const StringVector expected_bodyparts_names = { "Bodypart", @@ -254,7 +254,7 @@ public: void duplicateSubModelsNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_submodels.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const std::vector expected_bodypart_sub_models_names = { { @@ -272,7 +272,7 @@ public: }; const aiNode *bodyparts_node = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BODYPARTS); - EXPECT_NE(nullptr, bodyparts_node); + ASSERT_NE(nullptr, bodyparts_node); EXPECT_EQ(3u, bodyparts_node->mNumChildren); StringVector actual_submodels_names; @@ -301,7 +301,7 @@ public: void duplicateSequenceNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_sequences.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const StringVector expected_sequence_names = { "idle_1", @@ -337,7 +337,7 @@ public: void emptySequenceNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_sequences.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const StringVector expected_sequence_names = { "Sequence", @@ -374,7 +374,7 @@ public: void duplicateSequenceGroupNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_sequence_groups/duplicate_sequence_groups.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const StringVector expected_sequence_names = { "default", @@ -412,7 +412,7 @@ public: void emptySequenceGroupNames() { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_sequence_groups/unnamed_sequence_groups.mdl", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); const StringVector expected_sequence_names = { "default", @@ -440,7 +440,7 @@ public: Assimp::Importer importer; const aiScene *scene = importer.ReadFile(MDL_HL1_FILE_MAN, aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene); + ASSERT_NE(nullptr, scene); aiNode *scene_bones_node = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BONES); From ea3cc378903f698f81a93612f646100e0477c014 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Thu, 9 Mar 2023 14:31:29 +0200 Subject: [PATCH 151/232] Check node parents in ValidateDataStructure --- code/PostProcessing/ValidateDataStructure.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index cae35b895..e31054972 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -911,7 +911,12 @@ void ValidateDSProcess::Validate(const aiNode *pNode) { nodeName, pNode->mNumChildren); } for (unsigned int i = 0; i < pNode->mNumChildren; ++i) { - Validate(pNode->mChildren[i]); + const aiNode *pChild = pNode->mChildren[i]; + Validate(pChild); + if (pChild->mParent != pNode) { + const char *parentName = (pChild->mParent != nullptr) ? pChild->mParent->mName.C_Str() : "null"; + ReportError("aiNode \"%s\" child %i \"%s\" parent is someone else: \"%s\"", pNode->mName.C_Str(), i, pChild->mName.C_Str(), parentName); + } } } } From 65440f17a1d25a098d1f754a0b8f6fa7fc48303f Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Mon, 20 Mar 2023 15:22:05 +0200 Subject: [PATCH 152/232] Add more ASE model unit tests --- test/unit/utASEImportExport.cpp | 110 ++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/test/unit/utASEImportExport.cpp b/test/unit/utASEImportExport.cpp index 8014cbbc7..af05a2fe5 100644 --- a/test/unit/utASEImportExport.cpp +++ b/test/unit/utASEImportExport.cpp @@ -44,6 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include using namespace Assimp; @@ -63,3 +64,112 @@ public: TEST_F(utASEImportExport, importACFromFileTest) { EXPECT_TRUE(importerTest()); } + + +TEST_F(utASEImportExport, importAnim1) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/anim.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importAnim2) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/anim2.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importCameraRollAnim) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/CameraRollAnim.ase", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importMotionCaptureROM) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/MotionCaptureROM.ase", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importRotatingCube) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/RotatingCube.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importTargetCameraAnim) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/TargetCameraAnim.ase", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importTestFormatDetection) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/TestFormatDetection", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importThreeCubesGreen) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/ThreeCubesGreen.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); + + ::Assimp::Importer importerLE; + const aiScene *sceneLE = importerLE.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/ThreeCubesGreen_UTF16LE.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, sceneLE); + + ::Assimp::Importer importerBE; + const aiScene *sceneBE = importerBE.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/ThreeCubesGreen_UTF16BE.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, sceneBE); + + // TODO: these scenes should probably be identical + // verify that is the case and then add tests to check it +} + + +TEST_F(utASEImportExport, importUVTransform_Normal) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/TestUVTransform/UVTransform_Normal.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importUVTransform_ScaleUV1_2_OffsetUV0_0_9_Rotate_72_mirrorU) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/TestUVTransform/UVTransform_ScaleUV1-2_OffsetUV0-0.9_Rotate-72_mirrorU.ase", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importUVTransform_ScaleUV2x) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/TestUVTransform/UVTransform_ScaleUV2x.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utASEImportExport, importUVTransform_ScaleUV2x_Rotate45) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/TestUVTransform/UVTransform_ScaleUV2x_Rotate45.ASE", aiProcess_ValidateDataStructure); + + ASSERT_NE(nullptr, scene); +} From 5ddd18d1c7707c1dd7e93e4d7b443c9f9fe91501 Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Wed, 22 Mar 2023 12:00:55 +0200 Subject: [PATCH 153/232] Add more AMF unit tests --- code/AssetLib/AMF/AMFImporter_Postprocess.cpp | 1 + test/unit/utAMFImportExport.cpp | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/code/AssetLib/AMF/AMFImporter_Postprocess.cpp b/code/AssetLib/AMF/AMFImporter_Postprocess.cpp index a65f9260e..d5160870a 100644 --- a/code/AssetLib/AMF/AMFImporter_Postprocess.cpp +++ b/code/AssetLib/AMF/AMFImporter_Postprocess.cpp @@ -815,6 +815,7 @@ nl_clean_loop: for (; next_it != nodeArray.end(); ++next_it) { if ((*next_it)->FindNode((*nl_it)->mName) != nullptr) { // if current top node(nl_it) found in another top node then erase it from node_list and restart search loop. + // FIXME: this leaks memory on test models test8.amf and test9.amf nodeArray.erase(nl_it); goto nl_clean_loop; diff --git a/test/unit/utAMFImportExport.cpp b/test/unit/utAMFImportExport.cpp index 78309a105..7319320cf 100644 --- a/test/unit/utAMFImportExport.cpp +++ b/test/unit/utAMFImportExport.cpp @@ -60,6 +60,81 @@ TEST_F(utAMFImportExport, importAMFFromFileTest) { EXPECT_TRUE(importerTest()); } + +// TODO: test models-nonbsd/AMF/3_bananas.amf.7z +// requires uncompressing it in memory and we don't currently have 7z decompressor + + +TEST_F(utAMFImportExport, importTest2) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test2.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utAMFImportExport, importTest3) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test3.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utAMFImportExport, importTest4) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test4.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utAMFImportExport, importTest5) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test5.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utAMFImportExport, importTest5a) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test5a.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utAMFImportExport, importTest6) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test6.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utAMFImportExport, importTest7) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test7.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +#if 0 +// FIXME: these tests are disabled because they leak memory in AMFImporter_Postprocess.cpp + + +TEST_F(utAMFImportExport, importTest8) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test8.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utAMFImportExport, importTest9) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test9.amf", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +#endif // 0 + + TEST_F(utAMFImportExport, importAMFWithMatFromFileTest) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test_with_mat.amf", aiProcess_ValidateDataStructure); From c32f4b71b7013a80947e8b8a047d8f225da1c9fe Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 22 Mar 2023 20:00:09 +0100 Subject: [PATCH 154/232] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..18c914718 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From 0e657b575b266df8bc696dea08f277f702fbaaff Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Thu, 23 Mar 2023 14:56:31 +0200 Subject: [PATCH 155/232] Add more 3D files to unit tests --- test/unit/ut3DImportExport.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/unit/ut3DImportExport.cpp b/test/unit/ut3DImportExport.cpp index 5ff1d7940..32b77ddf8 100644 --- a/test/unit/ut3DImportExport.cpp +++ b/test/unit/ut3DImportExport.cpp @@ -65,3 +65,24 @@ TEST(ut3DImportExport, importBoxUC) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3D/box.uc", aiProcess_ValidateDataStructure); ASSERT_NE(nullptr, scene); } + + +TEST(ut3DImportExport, importMarRifle) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3D/mar_rifle.uc", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST(ut3DImportExport, importMarRifleA) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3D/mar_rifle_a.3d", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST(ut3DImportExport, importMarRifleD) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3D/mar_rifle_d.3d", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} From e8d4a11af539f454b05eeaf4ed48ed515c5d1f4a Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Thu, 23 Mar 2023 15:06:19 +0200 Subject: [PATCH 156/232] Add more 3DS files to unit tests --- test/unit/ut3DSImportExport.cpp | 112 ++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/test/unit/ut3DSImportExport.cpp b/test/unit/ut3DSImportExport.cpp index 01406362d..7279227fc 100644 --- a/test/unit/ut3DSImportExport.cpp +++ b/test/unit/ut3DSImportExport.cpp @@ -70,3 +70,115 @@ TEST_F(ut3DSImportExport, import3DSformatdetection) { EXPECT_NE(nullptr, scene); } + + +TEST_F(ut3DSImportExport, importCameraRollAnim) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/CameraRollAnim.3ds", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importCameraRollAnimWithChildObject) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/CameraRollAnimWithChildObject.3ds", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importCubesWithAlpha) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/cubes_with_alpha.3DS", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importCubeWithDiffuseTexture) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/cube_with_diffuse_texture.3DS", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importCubeWithSpecularTexture) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/cube_with_specular_texture.3DS", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importRotatingCube) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/RotatingCube.3DS", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importTargetCameraAnim) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/TargetCameraAnim.3ds", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importTest1) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/test1.3ds", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importCartWheel) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3DS/cart_wheel.3DS", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importGranate) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3DS/Granate.3DS", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importJeep1) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3DS/jeep1.3ds", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importMarRifle) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3DS/mar_rifle.3ds", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importMp5Sil) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3DS/mp5_sil.3ds", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} + + +TEST_F(ut3DSImportExport, importPyramob) { + ::Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/3DS/pyramob.3DS", aiProcess_ValidateDataStructure); + + EXPECT_NE(nullptr, scene); +} From bed2cf1a23d485c4c92940899058a00a7dafbe3e Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Thu, 23 Mar 2023 15:18:17 +0200 Subject: [PATCH 157/232] Add more BVH files to unit tests --- test/unit/utBVHImportExport.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/unit/utBVHImportExport.cpp b/test/unit/utBVHImportExport.cpp index d69ac7987..5a0ff1e10 100644 --- a/test/unit/utBVHImportExport.cpp +++ b/test/unit/utBVHImportExport.cpp @@ -55,6 +55,20 @@ public: } }; -TEST_F(utBVHImportExport, importBlenFromFileTest) { +TEST_F(utBVHImportExport, import01_01) { EXPECT_TRUE(importerTest()); } + + +TEST_F(utBVHImportExport, import01_03) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BVH/01_03.bvh", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + + +TEST_F(utBVHImportExport, importBoxingToes) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BVH/Boxing_Toes.bvh", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} From 6832aa227ab5d22f3ae4703097f12a814e9fad3e Mon Sep 17 00:00:00 2001 From: Turo Lamminen Date: Thu, 23 Mar 2023 15:23:30 +0200 Subject: [PATCH 158/232] Add more DXF files to unit tests --- test/unit/utDXFImporterExporter.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/unit/utDXFImporterExporter.cpp b/test/unit/utDXFImporterExporter.cpp index 9193946b5..53c5328e4 100644 --- a/test/unit/utDXFImporterExporter.cpp +++ b/test/unit/utDXFImporterExporter.cpp @@ -71,3 +71,17 @@ TEST_F(utDXFImporterExporter, issue2229) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/DXF/issue_2229.dxf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); } + + +TEST_F(utDXFImporterExporter, importWuson) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/DXF/wuson.dxf", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); +} + + +TEST_F(utDXFImporterExporter, importRifle) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/DXF/rifle.dxf", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); +} From d8201bdb6f43ca396b5cdcacfbda67870397554b Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 25 Mar 2023 16:00:29 +0100 Subject: [PATCH 159/232] Update Readme.md --- Readme.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Readme.md b/Readme.md index 1af71fad8..c8fe3f43f 100644 --- a/Readme.md +++ b/Readme.md @@ -22,6 +22,9 @@ Additionally, assimp features various __mesh post processing tools__: normals an ### Latest Doc's ### Please check the latest documents at [Asset-Importer-Lib-Doc](https://assimp-docs.readthedocs.io/en/latest/). +### Prebuild binaries ### +Please check our [Itchi Projectspace](https://kimkulling.itch.io/the-asset-importer-lib) + ### Get involved ### This is the development repo containing the latest features and bugfixes. For productive use though, we recommend one of the stable releases available from [Github Assimp Releases](https://github.com/assimp/assimp/releases).
From f4e9930e509ca92718cb65f980d38cefdd0a8065 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 28 Mar 2023 13:45:09 +0200 Subject: [PATCH 160/232] Update Readme.md --- Readme.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Readme.md b/Readme.md index 1af71fad8..5cfcbee8c 100644 --- a/Readme.md +++ b/Readme.md @@ -1,6 +1,8 @@ Open Asset Import Library (assimp) ================================== -A library to import and export various 3d-model-formats including scene-post-processing to generate missing render data. + +Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export. + ### Current project status ### [![Financial Contributors on Open Collective](https://opencollective.com/assimp/all/badge.svg?label=financial+contributors)](https://opencollective.com/assimp) ![C/C++ CI](https://github.com/assimp/assimp/workflows/C/C++%20CI/badge.svg) @@ -65,26 +67,27 @@ Open Asset Import Library is implemented in C++. The directory structure looks l /port Ports to other languages and scripts to maintain those. /test Unit- and regression tests, test suite of models /tools Tools (old assimp viewer, command line `assimp`) - /samples A small number of samples to illustrate possible - use cases for Assimp + /samples A small number of samples to illustrate possible use-cases for Assimp The source code is organized in the following way: code/Common The base implementation for importers and the infrastructure + code/CApi Special implementations which are only used for the C-API + code/Geometry A collection of geometry tools + code/Material The material system + code/PBR An exporter for physical based models code/PostProcessing The post-processing steps code/AssetLib/ Implementation for import and export for the format ### Where to get help ### To find our documentation, visit [our website](https://assimp.org/) or check out [Wiki](https://github.com/assimp/assimp/wiki) -If the docs don't solve your problem, you can: -- Ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). -- Ask on [Assimp-Community on Reddit](https://www.reddit.com/r/Assimp/) +### Communities ### - Ask a question at [The Assimp-Discussion Board](https://github.com/assimp/assimp/discussions) +- Ask on [Assimp-Community on Reddit](https://www.reddit.com/r/Assimp/) +- Ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). - Nothing has worked? File a question or an issue-report at [The Assimp-Issue Tracker](https://github.com/assimp/assimp/issues) -Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export. - And we also have a Gitter-channel:Gitter [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
### Contributing ### From 55fa3d4251438806d11865d84b06ec638f42fc27 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 28 Mar 2023 15:19:33 +0200 Subject: [PATCH 161/232] Update Readme.md --- Readme.md | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/Readme.md b/Readme.md index 5cfcbee8c..c680cd834 100644 --- a/Readme.md +++ b/Readme.md @@ -24,15 +24,16 @@ Additionally, assimp features various __mesh post processing tools__: normals an ### Latest Doc's ### Please check the latest documents at [Asset-Importer-Lib-Doc](https://assimp-docs.readthedocs.io/en/latest/). -### Get involved ### -This is the development repo containing the latest features and bugfixes. For productive use though, we recommend one of the stable releases available from [Github Assimp Releases](https://github.com/assimp/assimp/releases). -
-You find a bug in the docs? Use [Doc-Repo](https://github.com/assimp/assimp-docs). -
-Please check our Wiki as well: https://github.com/assimp/assimp/wiki - If you want to check our Model-Database, use the following repo: https://github.com/assimp/assimp-mdb +### Communities ### +- Ask a question at [The Assimp-Discussion Board](https://github.com/assimp/assimp/discussions) +- Ask on [Assimp-Community on Reddit](https://www.reddit.com/r/Assimp/) +- Ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). +- Nothing has worked? File a question or an issue-report at [The Assimp-Issue Tracker](https://github.com/assimp/assimp/issues) + +And we also have a Gitter-channel:Gitter [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+ #### Supported file formats #### You can find the complete list of supported file-formats [here](https://github.com/assimp/assimp/blob/master/doc/Fileformats.md) @@ -79,17 +80,6 @@ The source code is organized in the following way: code/PostProcessing The post-processing steps code/AssetLib/ Implementation for import and export for the format -### Where to get help ### -To find our documentation, visit [our website](https://assimp.org/) or check out [Wiki](https://github.com/assimp/assimp/wiki) - -### Communities ### -- Ask a question at [The Assimp-Discussion Board](https://github.com/assimp/assimp/discussions) -- Ask on [Assimp-Community on Reddit](https://www.reddit.com/r/Assimp/) -- Ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). -- Nothing has worked? File a question or an issue-report at [The Assimp-Issue Tracker](https://github.com/assimp/assimp/issues) - -And we also have a Gitter-channel:Gitter [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
- ### Contributing ### Contributions to assimp are highly appreciated. The easiest way to get involved is to submit a pull request with your changes against the main repository's `master` branch. From 4438b3ecc9aae5156f888ecd5a9604d8e1ce638e Mon Sep 17 00:00:00 2001 From: aniongithub Date: Wed, 29 Mar 2023 18:36:18 +0000 Subject: [PATCH 162/232] Fix Issue #4486 using the fix described by @jianliang79 --- code/AssetLib/FBX/FBXConverter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index f1f57c10b..257845384 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -640,7 +640,7 @@ void FBXConverter::GetRotationMatrix(Model::RotOrder mode, const aiVector3D &rot bool FBXConverter::NeedsComplexTransformationChain(const Model &model) { const PropertyTable &props = model.Props(); - const auto zero_epsilon = ai_epsilon; + const auto zero_epsilon = Math::getEpsilon(); const aiVector3D all_ones(1.0f, 1.0f, 1.0f); for (size_t i = 0; i < TransformationComp_MAXIMUM; ++i) { const TransformationComp comp = static_cast(i); From 6d65e9c393e99cc703dc61f6b2d75e5f359d9910 Mon Sep 17 00:00:00 2001 From: Sven Liedtke Date: Thu, 30 Mar 2023 09:21:30 +0200 Subject: [PATCH 163/232] Fix link issue in UWP builds without functional replacement --- contrib/unzip/crypt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/unzip/crypt.c b/contrib/unzip/crypt.c index 4cc731b3e..cc6650630 100644 --- a/contrib/unzip/crypt.c +++ b/contrib/unzip/crypt.c @@ -103,7 +103,7 @@ int cryptrand(unsigned char *buf, unsigned int len) unsigned __int64 pentium_tsc[1]; int result = 0; - + #if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { result = CryptGenRandom(provider, len, buf); @@ -111,6 +111,7 @@ int cryptrand(unsigned char *buf, unsigned int len) if (result) return len; } + #endif for (rlen = 0; rlen < (int)len; ++rlen) { From 5cf9d3abf7d7f6debbab1e491313249b805bd2f3 Mon Sep 17 00:00:00 2001 From: Sven Liedtke Date: Sat, 1 Apr 2023 01:02:21 +0200 Subject: [PATCH 164/232] std::getenv is not supported using uwp --- code/Common/ImporterRegistry.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/Common/ImporterRegistry.cpp b/code/Common/ImporterRegistry.cpp index 78c02d96d..ac4f5e544 100644 --- a/code/Common/ImporterRegistry.cpp +++ b/code/Common/ImporterRegistry.cpp @@ -214,7 +214,12 @@ void GetImporterInstanceList(std::vector &out) { // Some importers may be unimplemented or otherwise unsuitable for general use // in their current state. Devs can set ASSIMP_ENABLE_DEV_IMPORTERS in their // local environment to enable them, otherwise they're left out of the registry. +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP + // not supported under uwp const char *envStr = std::getenv("ASSIMP_ENABLE_DEV_IMPORTERS"); +#else + const char *envStr = { "0" }; +#endif bool devImportersEnabled = envStr && strcmp(envStr, "0"); // Ensure no unused var warnings if all uses are #ifndef'd away below: @@ -378,7 +383,7 @@ void GetImporterInstanceList(std::vector &out) { out.push_back(new IQMImporter()); #endif //#ifndef ASSIMP_BUILD_NO_STEP_IMPORTER - // out.push_back(new StepFile::StepFileImporter()); + // out.push_back(new StepFile::StepFileImporter()); //#endif } From 6b547613106cce7513806426c05a75f7bba92cfc Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 10:30:10 +0800 Subject: [PATCH 165/232] Fix warning related to nested-anon-types. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/glTF/glTFAsset.h | 27 ++++++++++++++------------- code/CMakeLists.txt | 1 - 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/code/AssetLib/glTF/glTFAsset.h b/code/AssetLib/glTF/glTFAsset.h index d2ae84b49..b5e6375ad 100644 --- a/code/AssetLib/glTF/glTFAsset.h +++ b/code/AssetLib/glTF/glTFAsset.h @@ -513,21 +513,22 @@ struct Camera : public Object { }; Type type; + struct Perspective { + float aspectRatio; //! Date: Sat, 1 Apr 2023 12:19:20 +0800 Subject: [PATCH 166/232] Fix warning related to format-non-iso. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - include/assimp/StringUtils.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..3f5b8e936 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1246,7 +1246,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-deprecated-copy-with-dtor -Wno-deprecated -Wno-format-nonliteral - -Wno-format-non-iso -Wno-comma -Wno-unreachable-code-break -Wno-unreachable-code-return diff --git a/include/assimp/StringUtils.h b/include/assimp/StringUtils.h index 59c6e9ead..cd8726785 100644 --- a/include/assimp/StringUtils.h +++ b/include/assimp/StringUtils.h @@ -56,7 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #define AI_SIZEFMT "%Iu" #else #define AI_SIZEFMT "%zu" From 1dcb5da1cd0e40e65bdeabb118d9a9fec3aa9e8a Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 13:01:22 +0800 Subject: [PATCH 167/232] Fix warning related to unreachable-code. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/B3D/B3DImporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/B3D/B3DImporter.cpp b/code/AssetLib/B3D/B3DImporter.cpp index e87744603..bf8145798 100644 --- a/code/AssetLib/B3D/B3DImporter.cpp +++ b/code/AssetLib/B3D/B3DImporter.cpp @@ -418,7 +418,6 @@ void B3DImporter::ReadTRIS(int v0) { ASSIMP_LOG_ERROR("Bad triangle index: i0=", i0, ", i1=", i1, ", i2=", i2); #endif Fail("Bad triangle index"); - continue; } face->mNumIndices = 3; face->mIndices = new unsigned[3]; From 04066ece8e5c1f1f5fed6167ab0e1fd9564f333e Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 13:02:04 +0800 Subject: [PATCH 168/232] Fix warning related to unreachable-code. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/LWO/LWOMaterial.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/LWO/LWOMaterial.cpp b/code/AssetLib/LWO/LWOMaterial.cpp index 50bac884b..8d83dfb67 100644 --- a/code/AssetLib/LWO/LWOMaterial.cpp +++ b/code/AssetLib/LWO/LWOMaterial.cpp @@ -345,7 +345,7 @@ void LWOImporter::ConvertMaterial(const LWO::Surface &surf, aiMaterial *pcMat) { // (the diffuse value is just a scaling factor) // If a diffuse texture is set, we set this value to 1.0 - clr = (b && false ? aiColor3D(1.0, 1.0, 1.0) : surf.mColor); + clr = (b ? aiColor3D(1.0, 1.0, 1.0) : surf.mColor); clr.r *= surf.mDiffuseValue; clr.g *= surf.mDiffuseValue; clr.b *= surf.mDiffuseValue; From 4d2512dcae8b181a8f61e2d068f3f331ea0e935a Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 13:03:02 +0800 Subject: [PATCH 169/232] Fix warning related to unreachable-code. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- contrib/poly2tri/poly2tri/sweep/sweep.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/poly2tri/poly2tri/sweep/sweep.cc b/contrib/poly2tri/poly2tri/sweep/sweep.cc index 8e3d794c0..565a198d8 100644 --- a/contrib/poly2tri/poly2tri/sweep/sweep.cc +++ b/contrib/poly2tri/poly2tri/sweep/sweep.cc @@ -118,8 +118,8 @@ void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangl Point* p1 = triangle->PointCCW(point); Orientation o1 = Orient2d(eq, *p1, ep); if (o1 == COLLINEAR) { - // ASSIMP_CHANGE (aramis_acg) - throw std::runtime_error("EdgeEvent - collinear points not supported"); + + if( triangle->Contains(&eq, p1)) { triangle->MarkConstrainedEdge(&eq, p1 ); // We are modifying the constraint maybe it would be better to @@ -137,8 +137,8 @@ void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangl Point* p2 = triangle->PointCW(point); Orientation o2 = Orient2d(eq, *p2, ep); if (o2 == COLLINEAR) { - // ASSIMP_CHANGE (aramis_acg) - throw std::runtime_error("EdgeEvent - collinear points not supported"); + + if( triangle->Contains(&eq, p2)) { triangle->MarkConstrainedEdge(&eq, p2 ); From 20b2f857c592ea5594a9c53b45a75333e8ae49ca Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 13:04:13 +0800 Subject: [PATCH 170/232] Remove -Wno-unreachable-code Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..aead2d1a0 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1250,7 +1250,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-comma -Wno-unreachable-code-break -Wno-unreachable-code-return - -Wno-unreachable-code -Wno-implicit-fallthrough -Wno-unused-template -Wno-undefined-func-template From e1678f11e6feabe2166304d0f44aea7865a7460a Mon Sep 17 00:00:00 2001 From: Steve M Date: Fri, 31 Mar 2023 22:17:50 -0700 Subject: [PATCH 171/232] Replace relative paths with local assets/textures Relative paths can easily contain typos, lower/upper case errors, and in general are brittle --- test/models-nonbsd/ASE/Rifle.ase | 2 +- test/models-nonbsd/ASE/Rifle2.ase | 2 +- test/models-nonbsd/ASE/m_rifl.bmp | Bin 0 -> 196662 bytes test/models-nonbsd/ASE/mp5sil.bmp | Bin 0 -> 196662 bytes test/models-nonbsd/OBJ/m_rifl.bmp | Bin 0 -> 196662 bytes test/models-nonbsd/OBJ/rifle.mtl | 2 +- test/models/AC/SphereWithLight.ac | 2 +- test/models/AC/SphereWithLightUvScaling4X.ac | 2 +- test/models/AC/SphereWithLight_UTF16LE.ac | Bin 38538 -> 38484 bytes test/models/AC/SphereWithLight_UTF8BOM.ac | 2 +- test/models/AC/earthSpherical.jpg | Bin 0 -> 422120 bytes .../IRR/EpisodeII_TheDwarfesStrikeBack.irr | 24 +- ...EpisodeII_TheDwarfesStrikeBack_UTF16LE.irr | Bin 95946 -> 95826 bytes test/models/IRR/EpisodeI_ANewDwarf.irr | 40 +- .../models/IRR/EpisodeI_ANewDwarf_UTF16LE.irr | Bin 72612 -> 72352 bytes test/models/IRR/SpiderTex.jpg | Bin 0 -> 15750 bytes test/models/IRR/UVTransformTestImg.png | Bin 0 -> 16301 bytes test/models/IRR/animMesh.irr | 6 +- test/models/IRR/animMesh_UTF16LE.irr | Bin 12938 -> 12908 bytes test/models/IRR/axe.jpg | Bin 0 -> 65191 bytes test/models/IRR/cellar.irrmesh | 945 + .../models/IRR/dawfInCellar_ChildOfCellar.irr | 16 +- .../dawfInCellar_ChildOfCellar_UTF16LE.irr | Bin 21892 -> 21752 bytes .../models/IRR/dawfInCellar_SameHierarchy.irr | 16 +- .../dawfInCellar_SameHierarchy_UTF16LE.irr | Bin 21630 -> 21490 bytes test/models/IRR/drkwood2.jpg | Bin 0 -> 203856 bytes test/models/IRR/dwarf.jpg | Bin 0 -> 84158 bytes test/models/IRR/dwarf.x | 18480 ++++++++++++++++ test/models/IRR/earthSpherical.jpg | Bin 0 -> 422120 bytes test/models/IRR/engineflare1.jpg | Bin 0 -> 3630 bytes test/models/IRR/instancing.irr | 36 +- test/models/IRR/scenegraphAnim.irr | 22 +- test/models/IRR/scenegraphAnim_UTF16LE.irr | Bin 47716 -> 47408 bytes test/models/IRR/sphere.irr | 2 +- test/models/IRR/sphere_UTF16LE.irr | Bin 5588 -> 5538 bytes test/models/IRR/spider.mtl | 38 + test/models/IRR/wal67ar_small.jpg | Bin 0 -> 9287 bytes test/models/IRR/wal69ar_small.jpg | Bin 0 -> 7929 bytes test/models/IRRMesh/SpiderTex.jpg | Bin 0 -> 15750 bytes test/models/IRRMesh/drkwood2.jpg | Bin 0 -> 203856 bytes test/models/IRRMesh/engineflare1.jpg | Bin 0 -> 3630 bytes test/models/IRRMesh/spider.irrmesh | 8 +- test/models/IRRMesh/spider_UTF16LE.irrmesh | Bin 293192 -> 293134 bytes test/models/IRRMesh/wal67ar_small.jpg | Bin 0 -> 9287 bytes test/models/IRRMesh/wal69ar_small.jpg | Bin 0 -> 7929 bytes test/models/NFF/NFF/ManyEarthsNotJustOne.nff | 4 +- test/models/NFF/NFF/cone.nff | 4 +- test/models/NFF/NFF/cylinder.nff | 2 +- test/models/NFF/NFF/earthCylindric.jpg | Bin 0 -> 624832 bytes test/models/NFF/NFF/earthSpherical.jpg | Bin 0 -> 422120 bytes test/models/NFF/NFF/spheres.nff | 2 +- 51 files changed, 19560 insertions(+), 97 deletions(-) create mode 100644 test/models-nonbsd/ASE/m_rifl.bmp create mode 100644 test/models-nonbsd/ASE/mp5sil.bmp create mode 100644 test/models-nonbsd/OBJ/m_rifl.bmp create mode 100644 test/models/AC/earthSpherical.jpg create mode 100644 test/models/IRR/SpiderTex.jpg create mode 100644 test/models/IRR/UVTransformTestImg.png create mode 100644 test/models/IRR/axe.jpg create mode 100644 test/models/IRR/cellar.irrmesh create mode 100644 test/models/IRR/drkwood2.jpg create mode 100644 test/models/IRR/dwarf.jpg create mode 100644 test/models/IRR/dwarf.x create mode 100644 test/models/IRR/earthSpherical.jpg create mode 100644 test/models/IRR/engineflare1.jpg create mode 100644 test/models/IRR/spider.mtl create mode 100644 test/models/IRR/wal67ar_small.jpg create mode 100644 test/models/IRR/wal69ar_small.jpg create mode 100644 test/models/IRRMesh/SpiderTex.jpg create mode 100644 test/models/IRRMesh/drkwood2.jpg create mode 100644 test/models/IRRMesh/engineflare1.jpg create mode 100644 test/models/IRRMesh/wal67ar_small.jpg create mode 100644 test/models/IRRMesh/wal69ar_small.jpg create mode 100644 test/models/NFF/NFF/earthCylindric.jpg create mode 100644 test/models/NFF/NFF/earthSpherical.jpg diff --git a/test/models-nonbsd/ASE/Rifle.ase b/test/models-nonbsd/ASE/Rifle.ase index b896b5bd8..91ce5446c 100644 --- a/test/models-nonbsd/ASE/Rifle.ase +++ b/test/models-nonbsd/ASE/Rifle.ase @@ -32,7 +32,7 @@ *MAP_CLASS "Bitmap" *MAP_SUBNO 1 *MAP_AMOUNT 1.0000 - *BITMAP "../3DS/MP5SIL.BMP" + *BITMAP "mp5sil.bmp" *MAP_TYPE Screen *UVW_U_OFFSET 0.000000 *UVW_V_OFFSET 0.000000 diff --git a/test/models-nonbsd/ASE/Rifle2.ase b/test/models-nonbsd/ASE/Rifle2.ase index 98bbcb621..445cc14fe 100644 --- a/test/models-nonbsd/ASE/Rifle2.ase +++ b/test/models-nonbsd/ASE/Rifle2.ase @@ -32,7 +32,7 @@ *MAP_CLASS "Bitmap" *MAP_SUBNO 1 *MAP_AMOUNT 1.0000 - *BITMAP "../3DS/m_rifl.bmp" + *BITMAP "m_rifl.bmp" *MAP_TYPE Screen *UVW_U_OFFSET 0.000000 *UVW_V_OFFSET 0.000000 diff --git a/test/models-nonbsd/ASE/m_rifl.bmp b/test/models-nonbsd/ASE/m_rifl.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fc1d8c2819c1e0233782a2abd624a37e3e2cf56d GIT binary patch literal 196662 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
MpOEnO0#R!YTcr3lyxWLCXi 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%0Dh!G#gvF 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 - + @@ -345,7 +345,7 @@ - + @@ -384,7 +384,7 @@ - + @@ -468,7 +468,7 @@ - + @@ -484,7 +484,7 @@ - + @@ -523,7 +523,7 @@ - + @@ -723,7 +723,7 @@ - + @@ -739,7 +739,7 @@ - + @@ -778,7 +778,7 @@ - + @@ -920,7 +920,7 @@ - + @@ -936,7 +936,7 @@ - + @@ -975,7 +975,7 @@ - + diff --git a/test/models/IRR/EpisodeII_TheDwarfesStrikeBack_UTF16LE.irr b/test/models/IRR/EpisodeII_TheDwarfesStrikeBack_UTF16LE.irr index 1f0916d4d9e64229b276098dd3a83315a29f4370..9321cf93f828f5b6f28b5d216b4851838324d0c6 100644 GIT binary patch delta 103 zcmX^0mi5vb)(sBj+y5~!USZjOhn;a9-{uEh1#)NtAyS)pUW+kqj=C{R3!9V+<8~b* R#wB8Ca#m8)SCug;004??EVcju delta 219 zcmccghV|52)(sBjoO%p;4EhWa4Emc5S6*d7aJP4}Gp^@D@HZdqDwIRw5>y>3wfVv; gF~-euH)d&(tj~pU`z1rhC1Rv#w3eD~RK} - + @@ -33,8 +33,8 @@ - - + + @@ -72,8 +72,8 @@ - - + + @@ -117,7 +117,7 @@ - + @@ -131,7 +131,7 @@ - + @@ -170,7 +170,7 @@ - + @@ -254,7 +254,7 @@ - + @@ -268,7 +268,7 @@ - + @@ -307,7 +307,7 @@ - + @@ -391,7 +391,7 @@ - + @@ -405,7 +405,7 @@ - + @@ -444,7 +444,7 @@ - + @@ -528,7 +528,7 @@ - + @@ -542,7 +542,7 @@ - + @@ -581,7 +581,7 @@ - + @@ -665,7 +665,7 @@ - + @@ -679,7 +679,7 @@ - + @@ -718,7 +718,7 @@ - + diff --git a/test/models/IRR/EpisodeI_ANewDwarf_UTF16LE.irr b/test/models/IRR/EpisodeI_ANewDwarf_UTF16LE.irr index 39d99e440925950cf4460a8794aeb968a445ef30..5e5a68f2d4a3423f2815f96ef391101763080857 100644 GIT binary patch delta 153 zcmZ3oon^sRmJLr>H~(TaV43W|RW&(4on`YCt~kEQ9+GuX4jcFM0BJ^(%`ssLjFT7W zuq}2_W8Pf!PK;&qq)+SkHY?er$f0nfq&FYx;6POpBfXhpmk@?n#A^XmF)OL*Ez*n% E0M;Ws3IG5A delta 391 zcmZ3mm1W6xmJLr>MfDi;81xxD8G?Y&mm!s*m?48ffAeEjLl*2(lZCmevCC}kOeE>rT<}VW6h~Q0O>dB5Q~&_RF;(FJ diff --git a/test/models/IRR/SpiderTex.jpg b/test/models/IRR/SpiderTex.jpg new file mode 100644 index 0000000000000000000000000000000000000000..397e684346a915869e3a12ddb343e3b185c2d77c GIT binary patch literal 15750 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 pZnVE{-8& literal 0 HcmV?d00001 diff --git a/test/models/IRR/UVTransformTestImg.png b/test/models/IRR/UVTransformTestImg.png new file mode 100644 index 0000000000000000000000000000000000000000..1701d737b46c9ad50602ed584247d83582f389f0 GIT binary patch literal 16301 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 H<+J| - + @@ -35,7 +35,7 @@ - + @@ -73,7 +73,7 @@ - + diff --git a/test/models/IRR/animMesh_UTF16LE.irr b/test/models/IRR/animMesh_UTF16LE.irr index d1c9e10183ae5671b19e5b50b4de56393f03b1b0..c041565ea04e980dd967ddf0e5d1293d6bc215cb 100644 GIT binary patch delta 21 dcmeB5eUq}`1ncHYtXEhzZ{Tv{+a%c~2>^6~2~Ge2 delta 52 pcmaEp(v`a51S_W=gC2uELj;5V=HskaS&+E1x!n1XxDO?|B>{q14PyWR diff --git a/test/models/IRR/axe.jpg b/test/models/IRR/axe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba14ae0eaaa746f1a4ad49a1e13cbde0c27bbddf GIT binary patch literal 65191 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𝔧}1BLvP4$ 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 literal 0 HcmV?d00001 diff --git a/test/models/IRR/cellar.irrmesh b/test/models/IRR/cellar.irrmesh new file mode 100644 index 000000000..0278c9239 --- /dev/null +++ b/test/models/IRR/cellar.irrmesh @@ -0,0 +1,945 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4.789692 35.887604 -0.000001 -0.433884 -0.900969 0.000000 64ffffff 0.047897 0.000000 0.005859 0.015859 +18.379868 29.342920 -20.000002 -0.433884 -0.900969 0.000000 64ffffff 0.183799 -0.200000 0.012654 0.005859 +18.379868 29.342920 -0.000001 -0.433884 -0.900969 0.000000 64ffffff 0.183799 0.000000 0.012654 0.015859 +4.789692 35.887604 -20.000002 -0.433884 -0.900969 0.000000 64ffffff 0.047897 -0.200000 0.005859 0.021484 +18.379868 29.342920 -20.000002 -0.433884 -0.900969 0.000000 64ffffff 0.183799 -0.200000 0.012654 0.021484 +4.789692 35.887604 -0.000001 -0.433884 -0.900969 0.000000 64ffffff 0.047897 0.000000 0.005859 0.031484 +18.379868 29.342920 -0.000001 -0.781832 -0.623490 0.000000 64ffffff 0.293429 0.000000 0.011756 0.047109 +27.784555 17.549807 -20.000002 -0.781832 -0.623490 0.000000 64ffffff 0.175498 -0.200000 0.005859 0.037109 +27.784555 17.549807 -0.000001 -0.781832 -0.623490 0.000000 64ffffff 0.175498 0.000000 0.005859 0.047109 +18.379868 29.342920 -20.000002 -0.781832 -0.623490 0.000000 64ffffff 0.293429 -0.200000 0.011756 0.052734 +27.784555 17.549807 -20.000002 -0.781832 -0.623490 0.000000 64ffffff 0.175498 -0.200000 0.005859 0.052734 +18.379868 29.342920 -0.000001 -0.781832 -0.623490 0.000000 64ffffff 0.293429 0.000000 0.011756 0.062734 +27.784555 17.549807 -0.000001 -0.974928 -0.222521 0.000000 64ffffff 0.175498 0.000000 0.024931 0.015859 +31.141052 2.844038 -20.000002 -0.974928 -0.222521 0.000000 64ffffff 0.028440 -0.200000 0.017578 0.005859 +31.141052 2.844038 -0.000001 -0.974928 -0.222521 0.000000 64ffffff 0.028440 0.000000 0.017578 0.015859 +27.784555 17.549807 -20.000002 -0.974928 -0.222521 0.000000 64ffffff 0.175498 -0.200000 0.024931 0.021484 +31.141052 2.844038 -20.000002 -0.974928 -0.222521 0.000000 64ffffff 0.028440 -0.200000 0.017578 0.021484 +27.784555 17.549807 -0.000001 -0.974928 -0.222521 0.000000 64ffffff 0.175498 0.000000 0.024931 0.031484 +31.141052 2.844038 -0.000001 -0.999999 0.001242 0.000000 64ffffff 0.028440 0.000000 0.052892 0.015859 +31.087307 -40.439766 -19.999994 -0.999999 0.001242 0.000000 64ffffff -0.404398 -0.200000 0.031250 0.005859 +31.087307 -40.439766 0.000006 -0.999999 0.001242 0.000000 64ffffff -0.404398 0.000000 0.031250 0.015859 +31.141052 2.844038 -20.000002 -0.999999 0.001242 0.000000 64ffffff 0.028440 -0.200000 0.080236 0.005859 +31.087307 -40.439766 -19.999994 -0.999999 0.001242 0.000000 64ffffff -0.404398 -0.200000 0.058594 0.005859 +31.141052 2.844038 -0.000001 -0.999999 0.001242 0.000000 64ffffff 0.028440 0.000000 0.080236 0.015859 +31.087307 -40.439766 0.000006 0.015564 -0.999879 0.000000 64ffffff 0.310873 0.000000 0.005859 0.078359 +39.664268 -40.306259 -19.999994 0.015564 -0.999879 0.000000 64ffffff 0.396643 -0.200000 0.010148 0.068359 +39.664268 -40.306259 0.000006 0.015564 -0.999879 0.000000 64ffffff 0.396643 0.000000 0.010148 0.078359 +31.087307 -40.439766 -19.999994 0.015564 -0.999879 0.000000 64ffffff 0.310873 -0.200000 0.005859 0.083984 +39.664268 -40.306259 -19.999994 0.015564 -0.999879 0.000000 64ffffff 0.396643 -0.200000 0.010148 0.083984 +31.087307 -40.439766 0.000006 0.015564 -0.999879 0.000000 64ffffff 0.310873 0.000000 0.005859 0.093984 +39.664268 -40.306259 0.000006 0.999998 0.002128 0.000000 64ffffff -0.403063 0.000000 0.085938 0.015859 +39.468590 51.635353 -20.000002 0.999998 0.002128 0.000000 64ffffff 0.516354 -0.200000 0.131908 0.005859 +39.468590 51.635353 -0.000002 0.999998 0.002128 0.000000 64ffffff 0.516354 0.000000 0.131908 0.015859 +39.664268 -40.306259 -19.999994 0.999998 0.002128 0.000000 64ffffff -0.403063 -0.200000 0.138672 0.005859 +39.468590 51.635353 -20.000002 0.999998 0.002128 0.000000 64ffffff 0.516354 -0.200000 0.184643 0.005859 +39.664268 -40.306259 0.000006 0.999998 0.002128 0.000000 64ffffff -0.403063 0.000000 0.138672 0.015859 +39.468590 51.635353 -0.000002 0.000000 1.000000 0.000000 64ffffff 0.394686 0.000000 0.234269 0.015859 +-46.257572 51.635345 -20.000004 0.000000 1.000000 0.000000 64ffffff -0.462576 -0.200000 0.191406 0.005859 +-46.257572 51.635345 -0.000002 0.000000 1.000000 0.000000 64ffffff -0.462576 0.000000 0.191406 0.015859 +39.468590 51.635353 -20.000002 0.000000 1.000000 0.000000 64ffffff 0.394686 -0.200000 0.283097 0.005859 +-46.257572 51.635345 -20.000004 0.000000 1.000000 0.000000 64ffffff -0.462576 -0.200000 0.240234 0.005859 +39.468590 51.635353 -0.000002 0.000000 1.000000 0.000000 64ffffff 0.394686 0.000000 0.283097 0.015859 +-46.257572 51.635345 -0.000002 -0.999998 0.002123 0.000000 64ffffff 0.516353 0.000000 0.335148 0.015859 +-46.453247 -40.535561 -20.000004 -0.999998 0.002123 0.000000 64ffffff -0.405356 -0.200000 0.289063 0.005859 +-46.453247 -40.535561 -0.000003 -0.999998 0.002123 0.000000 64ffffff -0.405356 0.000000 0.289063 0.015859 +-46.257572 51.635345 -20.000004 -0.999998 0.002123 0.000000 64ffffff 0.516353 -0.200000 0.387882 0.005859 +-46.453247 -40.535561 -20.000004 -0.999998 0.002123 0.000000 64ffffff -0.405356 -0.200000 0.341797 0.005859 +-46.257572 51.635345 -0.000002 -0.999998 0.002123 0.000000 64ffffff 0.516353 0.000000 0.387882 0.015859 +-46.453247 -40.535561 -0.000003 0.005069 -0.999987 0.000000 64ffffff -0.464532 0.000000 0.394531 0.015859 +-36.591885 -40.485573 -20.000002 0.005069 -0.999987 0.000000 64ffffff -0.365919 -0.200000 0.399462 0.005859 +-36.591885 -40.485573 -0.000002 0.005069 -0.999987 0.000000 64ffffff -0.365919 0.000000 0.399462 0.015859 +-46.453247 -40.535561 -20.000004 0.005069 -0.999987 0.000000 64ffffff -0.464532 -0.200000 0.406250 0.005859 +-36.591885 -40.485573 -20.000002 0.005069 -0.999987 0.000000 64ffffff -0.365919 -0.200000 0.411181 0.005859 +-46.453247 -40.535561 -0.000003 0.005069 -0.999987 0.000000 64ffffff -0.464532 0.000000 0.406250 0.015859 +-36.591885 -40.485573 -0.000002 0.999999 0.001240 0.000000 64ffffff -0.404856 0.000000 0.417969 0.015859 +-36.645630 2.844041 -20.000002 0.999999 0.001240 0.000000 64ffffff 0.028440 -0.200000 0.439634 0.005859 +-36.645630 2.844041 -0.000001 0.999999 0.001240 0.000000 64ffffff 0.028440 0.000000 0.439634 0.015859 +-36.591885 -40.485573 -20.000002 0.999999 0.001240 0.000000 64ffffff -0.404856 -0.200000 0.445313 0.005859 +-36.645630 2.844041 -20.000002 0.999999 0.001240 0.000000 64ffffff 0.028440 -0.200000 0.466977 0.005859 +-36.591885 -40.485573 -0.000002 0.999999 0.001240 0.000000 64ffffff -0.404856 0.000000 0.445313 0.015859 +-36.645630 2.844041 -0.000001 0.974928 -0.222521 0.000000 64ffffff 0.028440 0.000000 0.472656 0.015859 +-33.289131 17.549809 -20.000002 0.974928 -0.222521 0.000000 64ffffff 0.175498 -0.200000 0.480009 0.005859 +-33.289131 17.549809 -0.000001 0.974928 -0.222521 0.000000 64ffffff 0.175498 0.000000 0.480009 0.015859 +-36.645630 2.844041 -20.000002 0.974928 -0.222521 0.000000 64ffffff 0.028440 -0.200000 0.486328 0.005859 +-33.289131 17.549809 -20.000002 0.974928 -0.222521 0.000000 64ffffff 0.175498 -0.200000 0.493681 0.005859 +-36.645630 2.844041 -0.000001 0.974928 -0.222521 0.000000 64ffffff 0.028440 0.000000 0.486328 0.015859 +-33.289131 17.549809 -0.000001 0.781832 -0.623490 0.000000 64ffffff 0.175498 0.000000 0.500000 0.015859 +-23.884441 29.342920 -20.000002 0.781832 -0.623490 0.000000 64ffffff 0.293429 -0.200000 0.505897 0.005859 +-23.884441 29.342920 -0.000001 0.781832 -0.623490 0.000000 64ffffff 0.293429 0.000000 0.505897 0.015859 +-33.289131 17.549809 -20.000002 0.781832 -0.623490 0.000000 64ffffff 0.175498 -0.200000 0.511719 0.005859 +-23.884441 29.342920 -20.000002 0.781832 -0.623490 0.000000 64ffffff 0.293429 -0.200000 0.517615 0.005859 +-33.289131 17.549809 -0.000001 0.781832 -0.623490 0.000000 64ffffff 0.175498 0.000000 0.511719 0.015859 +-23.884441 29.342920 -0.000001 0.433884 -0.900969 0.000000 64ffffff -0.238844 0.000000 0.523438 0.015859 +-10.294267 35.887604 -20.000002 0.433884 -0.900969 0.000000 64ffffff -0.102943 -0.200000 0.530233 0.005859 +-10.294267 35.887604 -0.000001 0.433884 -0.900969 0.000000 64ffffff -0.102943 0.000000 0.530233 0.015859 +-23.884441 29.342920 -20.000002 0.433884 -0.900969 0.000000 64ffffff -0.238844 -0.200000 0.535156 0.005859 +-10.294267 35.887604 -20.000002 0.433884 -0.900969 0.000000 64ffffff -0.102943 -0.200000 0.541951 0.005859 +-23.884441 29.342920 -0.000001 0.433884 -0.900969 0.000000 64ffffff -0.238844 0.000000 0.535156 0.015859 +-10.294267 35.887604 -0.000001 0.000000 -1.000000 0.000000 64ffffff -0.102943 0.000000 0.546875 0.015859 +4.789692 35.887604 -20.000002 0.000000 -1.000000 0.000000 64ffffff 0.047897 -0.200000 0.554417 0.005859 +4.789692 35.887604 -0.000001 0.000000 -1.000000 0.000000 64ffffff 0.047897 0.000000 0.554417 0.015859 +-10.294267 35.887604 -20.000002 0.000000 -1.000000 0.000000 64ffffff -0.102943 -0.200000 0.560547 0.005859 +4.789692 35.887604 -20.000002 0.000000 -1.000000 0.000000 64ffffff 0.047897 -0.200000 0.568089 0.005859 +-10.294267 35.887604 -0.000001 0.000000 -1.000000 0.000000 64ffffff -0.102943 0.000000 0.560547 0.015859 +-10.294267 35.887604 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.102943 0.358876 0.592200 0.005859 +39.468590 51.635353 -0.000002 0.000000 0.000000 1.000000 64ffffff 0.394686 0.516354 0.617082 0.013733 +-46.257572 51.635345 -0.000002 0.000000 0.000000 1.000000 64ffffff -0.462576 0.516353 0.574219 0.013733 +-46.257572 51.635345 -20.000004 0.000000 0.000000 -1.000000 64ffffff -0.462576 0.516353 0.623047 0.013733 +39.468590 51.635353 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.394686 0.516354 0.665910 0.013733 +-10.294267 35.887604 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.102943 0.358876 0.641029 0.005859 +-36.645630 2.844041 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.366456 0.028440 0.022482 0.058799 +-46.453247 -40.535561 -0.000003 0.000000 0.000000 1.000000 64ffffff -0.464532 -0.405356 0.017578 0.037109 +-36.591885 -40.485573 -0.000002 0.000000 0.000000 1.000000 64ffffff -0.365919 -0.404856 0.022509 0.037134 +-36.591885 -40.485573 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.365919 -0.404856 0.022509 0.064478 +-46.453247 -40.535561 -20.000004 0.000000 0.000000 -1.000000 64ffffff -0.464532 -0.405356 0.017578 0.064453 +-36.645630 2.844041 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.366456 0.028440 0.022482 0.086143 +39.468590 51.635353 -0.000002 0.000000 0.000000 1.000000 64ffffff 0.394686 0.516354 0.048589 0.032631 +4.789692 35.887604 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.047897 0.358876 0.031250 0.024757 +18.379868 29.342920 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.183799 0.293429 0.038045 0.021484 +18.379868 29.342920 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.183799 0.293429 0.061483 0.021484 +4.789692 35.887604 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.047897 0.358876 0.054688 0.024757 +39.468590 51.635353 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.394686 0.516354 0.072027 0.032631 +31.141052 2.844038 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.311411 0.028440 0.019256 0.091797 +39.468590 51.635353 -0.000002 0.000000 0.000000 1.000000 64ffffff 0.394686 0.516354 0.023420 0.116193 +27.784555 17.549807 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.277846 0.175498 0.017578 0.099150 +27.784555 17.549807 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.277846 0.175498 0.017578 0.128447 +39.468590 51.635353 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.394686 0.516354 0.023420 0.145489 +31.141052 2.844038 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.311411 0.028440 0.019256 0.121094 +39.664268 -40.306259 0.000006 0.000000 0.000000 1.000000 64ffffff 0.396643 -0.403063 0.010121 0.099609 +39.468590 51.635353 -0.000002 0.000000 0.000000 1.000000 64ffffff 0.394686 0.516354 0.010023 0.145580 +31.141052 2.844038 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.311411 0.028440 0.005859 0.121185 +31.141052 2.844038 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.311411 0.028440 0.005859 0.173919 +39.468590 51.635353 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.394686 0.516354 0.010023 0.198315 +39.664268 -40.306259 -19.999994 0.000000 0.000000 -1.000000 64ffffff 0.396643 -0.403063 0.010121 0.152344 +31.087307 -40.439766 0.000006 0.000000 0.000000 1.000000 64ffffff 0.310873 -0.404398 0.005859 0.205078 +39.664268 -40.306259 0.000006 0.000000 0.000000 1.000000 64ffffff 0.396643 -0.403063 0.010148 0.205145 +31.141052 2.844038 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.311411 0.028440 0.005886 0.226720 +31.141052 2.844038 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.311411 0.028440 0.005886 0.254064 +39.664268 -40.306259 -19.999994 0.000000 0.000000 -1.000000 64ffffff 0.396643 -0.403063 0.010148 0.232489 +31.087307 -40.439766 -19.999994 0.000000 0.000000 -1.000000 64ffffff 0.310873 -0.404398 0.005859 0.232422 +27.784555 17.549807 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.277846 0.175498 0.035952 0.039063 +39.468590 51.635353 -0.000002 0.000000 0.000000 1.000000 64ffffff 0.394686 0.516354 0.041794 0.056105 +18.379868 29.342920 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.183799 0.293429 0.031250 0.044959 +18.379868 29.342920 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.183799 0.293429 0.031250 0.068397 +39.468590 51.635353 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.394686 0.516354 0.041794 0.079543 +27.784555 17.549807 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.277846 0.175498 0.035952 0.062500 +-46.453247 -40.535561 -0.000003 0.000000 0.000000 1.000000 64ffffff -0.464532 -0.405356 0.017578 0.150391 +-36.645630 2.844041 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.366456 0.028440 0.022482 0.172080 +-46.257572 51.635345 -0.000002 0.000000 0.000000 1.000000 64ffffff -0.462576 0.516353 0.017676 0.196476 +-46.257572 51.635345 -20.000004 0.000000 0.000000 -1.000000 64ffffff -0.462576 0.516353 0.017676 0.249210 +-36.645630 2.844041 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.366456 0.028440 0.022482 0.224815 +-46.453247 -40.535561 -20.000004 0.000000 0.000000 -1.000000 64ffffff -0.464532 -0.405356 0.017578 0.203125 +-36.645630 2.844041 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.366456 0.028440 0.022384 0.255859 +-33.289131 17.549809 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.332891 0.175498 0.024062 0.263212 +-46.257572 51.635345 -0.000002 0.000000 0.000000 1.000000 64ffffff -0.462576 0.516353 0.017578 0.280255 +-46.257572 51.635345 -20.000004 0.000000 0.000000 -1.000000 64ffffff -0.462576 0.516353 0.017578 0.309552 +-33.289131 17.549809 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.332891 0.175498 0.024062 0.292509 +-36.645630 2.844041 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.366456 0.028440 0.022384 0.285156 +-33.289131 17.549809 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.332891 0.175498 0.053359 0.039063 +-23.884441 29.342920 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.238844 0.293429 0.058062 0.044959 +-46.257572 51.635345 -0.000002 0.000000 0.000000 1.000000 64ffffff -0.462576 0.516353 0.046875 0.056105 +-46.257572 51.635345 -20.000004 0.000000 0.000000 -1.000000 64ffffff -0.462576 0.516353 0.046875 0.079543 +-23.884441 29.342920 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.238844 0.293429 0.058062 0.068397 +-33.289131 17.549809 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.332891 0.175498 0.053359 0.062500 +-23.884441 29.342920 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.238844 0.293429 0.089312 0.021484 +-10.294267 35.887604 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.102943 0.358876 0.096107 0.024757 +-46.257572 51.635345 -0.000002 0.000000 0.000000 1.000000 64ffffff -0.462576 0.516353 0.078125 0.032631 +-46.257572 51.635345 -20.000004 0.000000 0.000000 -1.000000 64ffffff -0.462576 0.516353 0.101563 0.032631 +-10.294267 35.887604 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.102943 0.358876 0.119544 0.024757 +-23.884441 29.342920 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.238844 0.293429 0.112749 0.021484 +39.468590 51.635353 -0.000002 0.000000 0.000000 1.000000 64ffffff 0.394686 0.516354 0.696756 0.013733 +-10.294267 35.887604 -0.000001 0.000000 0.000000 1.000000 64ffffff -0.102943 0.358876 0.671875 0.005859 +4.789692 35.887604 -0.000001 0.000000 0.000000 1.000000 64ffffff 0.047897 0.358876 0.679417 0.005859 +4.789692 35.887604 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.047897 0.358876 0.710667 0.005859 +-10.294267 35.887604 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.102943 0.358876 0.703125 0.005859 +39.468590 51.635353 -20.000002 0.000000 0.000000 -1.000000 64ffffff 0.394686 0.516354 0.728006 0.013733 +90.391273 35.887596 -0.000017 -0.433884 -0.900969 0.000000 64ffffff 0.903913 0.000000 0.017578 0.324453 +103.981445 29.342913 -20.000017 -0.433884 -0.900969 0.000000 64ffffff 1.039814 -0.200000 0.024373 0.314453 +103.981445 29.342913 -0.000017 -0.433884 -0.900969 0.000000 64ffffff 1.039814 0.000000 0.024373 0.324453 +90.391273 35.887596 -20.000017 -0.433884 -0.900969 0.000000 64ffffff 0.903913 -0.200000 0.017578 0.330078 +103.981445 29.342913 -20.000017 -0.433884 -0.900969 0.000000 64ffffff 1.039814 -0.200000 0.024373 0.330078 +90.391273 35.887596 -0.000017 -0.433884 -0.900969 0.000000 64ffffff 0.903913 0.000000 0.017578 0.340078 +103.981445 29.342913 -0.000017 -0.781832 -0.623490 0.000000 64ffffff 0.293429 0.000000 0.023475 0.355703 +113.386139 17.549799 -20.000017 -0.781832 -0.623490 0.000000 64ffffff 0.175498 -0.200000 0.017578 0.345703 +113.386139 17.549799 -0.000017 -0.781832 -0.623490 0.000000 64ffffff 0.175498 0.000000 0.017578 0.355703 +103.981445 29.342913 -20.000017 -0.781832 -0.623490 0.000000 64ffffff 0.293429 -0.200000 0.023475 0.361328 +113.386139 17.549799 -20.000017 -0.781832 -0.623490 0.000000 64ffffff 0.175498 -0.200000 0.017578 0.361328 +103.981445 29.342913 -0.000017 -0.781832 -0.623490 0.000000 64ffffff 0.293429 0.000000 0.023475 0.371328 +113.386139 17.549799 -0.000017 -0.974928 -0.222521 0.000000 64ffffff 0.175498 0.000000 0.038603 0.095937 +116.742630 2.844030 -20.000017 -0.974928 -0.222521 0.000000 64ffffff 0.028440 -0.200000 0.031250 0.085938 +116.742630 2.844030 -0.000017 -0.974928 -0.222521 0.000000 64ffffff 0.028440 0.000000 0.031250 0.095937 +113.386139 17.549799 -20.000017 -0.974928 -0.222521 0.000000 64ffffff 0.175498 -0.200000 0.038603 0.101563 +116.742630 2.844030 -20.000017 -0.974928 -0.222521 0.000000 64ffffff 0.028440 -0.200000 0.031250 0.101563 +113.386139 17.549799 -0.000017 -0.974928 -0.222521 0.000000 64ffffff 0.175498 0.000000 0.038603 0.111562 +116.742630 2.844030 -0.000017 -0.999999 0.001242 0.000000 64ffffff 0.028440 0.000000 0.146642 0.031484 +116.688889 -40.439770 -20.000010 -0.999999 0.001242 0.000000 64ffffff -0.404398 -0.200000 0.125000 0.021484 +116.688889 -40.439770 -0.000010 -0.999999 0.001242 0.000000 64ffffff -0.404398 0.000000 0.125000 0.031484 +116.742630 2.844030 -20.000017 -0.999999 0.001242 0.000000 64ffffff 0.028440 -0.200000 0.173986 0.021484 +116.688889 -40.439770 -20.000010 -0.999999 0.001242 0.000000 64ffffff -0.404398 -0.200000 0.152344 0.021484 +116.742630 2.844030 -0.000017 -0.999999 0.001242 0.000000 64ffffff 0.028440 0.000000 0.173986 0.031484 +116.688889 -40.439770 -0.000010 0.015564 -0.999879 0.000000 64ffffff 1.166889 0.000000 0.005859 0.269766 +125.265854 -40.306263 -20.000010 0.015564 -0.999879 0.000000 64ffffff 1.252658 -0.200000 0.010148 0.259766 +125.265854 -40.306263 -0.000010 0.015564 -0.999879 0.000000 64ffffff 1.252658 0.000000 0.010148 0.269766 +116.688889 -40.439770 -20.000010 0.015564 -0.999879 0.000000 64ffffff 1.166889 -0.200000 0.005859 0.275391 +125.265854 -40.306263 -20.000010 0.015564 -0.999879 0.000000 64ffffff 1.252658 -0.200000 0.010148 0.275391 +116.688889 -40.439770 -0.000010 0.015564 -0.999879 0.000000 64ffffff 1.166889 0.000000 0.005859 0.285391 +125.265854 -40.306263 -0.000010 0.999998 0.002128 0.000000 64ffffff -0.403063 0.000000 0.179688 0.031484 +125.070175 51.635345 -20.000017 0.999998 0.002128 0.000000 64ffffff 0.516353 -0.200000 0.225658 0.021484 +125.070175 51.635345 -0.000018 0.999998 0.002128 0.000000 64ffffff 0.516353 0.000000 0.225658 0.031484 +125.265854 -40.306263 -20.000010 0.999998 0.002128 0.000000 64ffffff -0.403063 -0.200000 0.232422 0.021484 +125.070175 51.635345 -20.000017 0.999998 0.002128 0.000000 64ffffff 0.516353 -0.200000 0.278393 0.021484 +125.265854 -40.306263 -0.000010 0.999998 0.002128 0.000000 64ffffff -0.403063 0.000000 0.232422 0.031484 +125.070175 51.635345 -0.000018 0.000000 1.000000 0.000000 64ffffff 1.250702 0.000000 0.328019 0.031484 +39.344009 51.635338 -20.000019 0.000000 1.000000 0.000000 64ffffff 0.393440 -0.200000 0.285156 0.021484 +39.344009 51.635338 -0.000018 0.000000 1.000000 0.000000 64ffffff 0.393440 0.000000 0.285156 0.031484 +125.070175 51.635345 -20.000017 0.000000 1.000000 0.000000 64ffffff 1.250702 -0.200000 0.376847 0.021484 +39.344009 51.635338 -20.000019 0.000000 1.000000 0.000000 64ffffff 0.393440 -0.200000 0.333984 0.021484 +125.070175 51.635345 -0.000018 0.000000 1.000000 0.000000 64ffffff 1.250702 0.000000 0.376847 0.031484 +39.344009 51.635338 -0.000018 -0.999998 0.002123 0.000000 64ffffff 0.516353 0.000000 0.428898 0.031484 +39.148335 -40.535568 -20.000019 -0.999998 0.002123 0.000000 64ffffff -0.405356 -0.200000 0.382813 0.021484 +39.148335 -40.535568 -0.000019 -0.999998 0.002123 0.000000 64ffffff -0.405356 0.000000 0.382813 0.031484 +39.344009 51.635338 -20.000019 -0.999998 0.002123 0.000000 64ffffff 0.516353 -0.200000 0.481632 0.021484 +39.148335 -40.535568 -20.000019 -0.999998 0.002123 0.000000 64ffffff -0.405356 -0.200000 0.435547 0.021484 +39.344009 51.635338 -0.000018 -0.999998 0.002123 0.000000 64ffffff 0.516353 0.000000 0.481632 0.031484 +39.148335 -40.535568 -0.000019 0.005069 -0.999987 0.000000 64ffffff 0.391483 0.000000 0.017578 0.386953 +49.009697 -40.485580 -20.000017 0.005069 -0.999987 0.000000 64ffffff 0.490097 -0.200000 0.022509 0.376953 +49.009697 -40.485580 -0.000018 0.005069 -0.999987 0.000000 64ffffff 0.490097 0.000000 0.022509 0.386953 +39.148335 -40.535568 -20.000019 0.005069 -0.999987 0.000000 64ffffff 0.391483 -0.200000 0.017578 0.392578 +49.009697 -40.485580 -20.000017 0.005069 -0.999987 0.000000 64ffffff 0.490097 -0.200000 0.022509 0.392578 +39.148335 -40.535568 -0.000019 0.005069 -0.999987 0.000000 64ffffff 0.391483 0.000000 0.017578 0.402578 +49.009697 -40.485580 -0.000018 0.999999 0.001240 0.000000 64ffffff -0.404856 0.000000 0.488281 0.031484 +48.955952 2.844034 -20.000017 0.999999 0.001240 0.000000 64ffffff 0.028440 -0.200000 0.509946 0.021484 +48.955952 2.844034 -0.000017 0.999999 0.001240 0.000000 64ffffff 0.028440 0.000000 0.509946 0.031484 +49.009697 -40.485580 -20.000017 0.999999 0.001240 0.000000 64ffffff -0.404856 -0.200000 0.515625 0.021484 +48.955952 2.844034 -20.000017 0.999999 0.001240 0.000000 64ffffff 0.028440 -0.200000 0.537290 0.021484 +49.009697 -40.485580 -0.000018 0.999999 0.001240 0.000000 64ffffff -0.404856 0.000000 0.515625 0.031484 +48.955952 2.844034 -0.000017 0.974928 -0.222521 0.000000 64ffffff 0.028440 0.000000 0.542969 0.031484 +52.312447 17.549803 -20.000017 0.974928 -0.222521 0.000000 64ffffff 0.175498 -0.200000 0.550322 0.021484 +52.312447 17.549803 -0.000017 0.974928 -0.222521 0.000000 64ffffff 0.175498 0.000000 0.550322 0.031484 +48.955952 2.844034 -20.000017 0.974928 -0.222521 0.000000 64ffffff 0.028440 -0.200000 0.556641 0.021484 +52.312447 17.549803 -20.000017 0.974928 -0.222521 0.000000 64ffffff 0.175498 -0.200000 0.563994 0.021484 +48.955952 2.844034 -0.000017 0.974928 -0.222521 0.000000 64ffffff 0.028440 0.000000 0.556641 0.031484 +52.312447 17.549803 -0.000017 0.781831 -0.623490 0.000000 64ffffff 0.175498 0.000000 0.570313 0.031484 +61.717140 29.342913 -20.000017 0.781831 -0.623490 0.000000 64ffffff 0.293429 -0.200000 0.576209 0.021484 +61.717140 29.342913 -0.000017 0.781831 -0.623490 0.000000 64ffffff 0.293429 0.000000 0.576209 0.031484 +52.312447 17.549803 -20.000017 0.781831 -0.623490 0.000000 64ffffff 0.175498 -0.200000 0.582031 0.021484 +61.717140 29.342913 -20.000017 0.781831 -0.623490 0.000000 64ffffff 0.293429 -0.200000 0.587928 0.021484 +52.312447 17.549803 -0.000017 0.781831 -0.623490 0.000000 64ffffff 0.175498 0.000000 0.582031 0.031484 +61.717140 29.342913 -0.000017 0.433884 -0.900969 0.000000 64ffffff 0.617171 0.000000 0.593750 0.031484 +75.307312 35.887596 -20.000017 0.433884 -0.900969 0.000000 64ffffff 0.753073 -0.200000 0.600545 0.021484 +75.307312 35.887596 -0.000017 0.433884 -0.900969 0.000000 64ffffff 0.753073 0.000000 0.600545 0.031484 +61.717140 29.342913 -20.000017 0.433884 -0.900969 0.000000 64ffffff 0.617171 -0.200000 0.605469 0.021484 +75.307312 35.887596 -20.000017 0.433884 -0.900969 0.000000 64ffffff 0.753073 -0.200000 0.612264 0.021484 +61.717140 29.342913 -0.000017 0.433884 -0.900969 0.000000 64ffffff 0.617171 0.000000 0.605469 0.031484 +75.307312 35.887596 -0.000017 0.000000 -1.000000 0.000000 64ffffff 0.753073 0.000000 0.617188 0.031484 +90.391273 35.887596 -20.000017 0.000000 -1.000000 0.000000 64ffffff 0.903913 -0.200000 0.624729 0.021484 +90.391273 35.887596 -0.000017 0.000000 -1.000000 0.000000 64ffffff 0.903913 0.000000 0.624729 0.031484 +75.307312 35.887596 -20.000017 0.000000 -1.000000 0.000000 64ffffff 0.753073 -0.200000 0.630859 0.021484 +90.391273 35.887596 -20.000017 0.000000 -1.000000 0.000000 64ffffff 0.903913 -0.200000 0.638401 0.021484 +75.307312 35.887596 -0.000017 0.000000 -1.000000 0.000000 64ffffff 0.753073 0.000000 0.630859 0.031484 +75.307312 35.887596 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.753073 0.358876 0.752357 0.005859 +125.070175 51.635345 -0.000018 0.000000 0.000000 1.000000 64ffffff 1.250702 0.516353 0.777238 0.013733 +39.344009 51.635338 -0.000018 0.000000 0.000000 1.000000 64ffffff 0.393440 0.516353 0.734375 0.013733 +39.344009 51.635338 -20.000019 0.000000 0.000000 -1.000000 64ffffff 0.393440 0.516353 0.783203 0.013733 +125.070175 51.635345 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.250702 0.516353 0.826066 0.013733 +75.307312 35.887596 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.753073 0.358876 0.801185 0.005859 +48.955952 2.844034 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.489560 0.028440 0.022482 0.429893 +39.148335 -40.535568 -0.000019 0.000000 0.000000 1.000000 64ffffff 0.391483 -0.405356 0.017578 0.408203 +49.009697 -40.485580 -0.000018 0.000000 0.000000 1.000000 64ffffff 0.490097 -0.404856 0.022509 0.408228 +49.009697 -40.485580 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.490097 -0.404856 0.022509 0.435572 +39.148335 -40.535568 -20.000019 0.000000 0.000000 -1.000000 64ffffff 0.391483 -0.405356 0.017578 0.435547 +48.955952 2.844034 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.489560 0.028440 0.022482 0.457237 +125.070175 51.635345 -0.000018 0.000000 0.000000 1.000000 64ffffff 1.250702 0.516353 0.081793 0.050209 +90.391273 35.887596 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.903913 0.358876 0.064453 0.042335 +103.981445 29.342913 -0.000017 0.000000 0.000000 1.000000 64ffffff 1.039814 0.293429 0.071248 0.039063 +103.981445 29.342913 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.039814 0.293429 0.094686 0.039063 +90.391273 35.887596 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.903913 0.358876 0.087891 0.042335 +125.070175 51.635345 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.250702 0.516353 0.105230 0.050209 +116.742630 2.844030 -0.000017 0.000000 0.000000 1.000000 64ffffff 1.167426 0.028440 0.019256 0.462891 +125.070175 51.635345 -0.000018 0.000000 0.000000 1.000000 64ffffff 1.250702 0.516353 0.023420 0.487286 +113.386139 17.549799 -0.000017 0.000000 0.000000 1.000000 64ffffff 1.133861 0.175498 0.017578 0.470244 +113.386139 17.549799 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.133861 0.175498 0.017578 0.499540 +125.070175 51.635345 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.250702 0.516353 0.023420 0.516583 +116.742630 2.844030 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.167426 0.028440 0.019256 0.492188 +125.265854 -40.306263 -0.000010 0.000000 0.000000 1.000000 64ffffff 1.252658 -0.403063 0.021840 0.521484 +125.070175 51.635345 -0.000018 0.000000 0.000000 1.000000 64ffffff 1.250702 0.516353 0.021742 0.567455 +116.742630 2.844030 -0.000017 0.000000 0.000000 1.000000 64ffffff 1.167426 0.028440 0.017578 0.543059 +116.742630 2.844030 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.167426 0.028440 0.017578 0.595794 +125.070175 51.635345 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.250702 0.516353 0.021742 0.620190 +125.265854 -40.306263 -20.000010 0.000000 0.000000 -1.000000 64ffffff 1.252658 -0.403063 0.021840 0.574219 +116.688889 -40.439770 -0.000010 0.000000 0.000000 1.000000 64ffffff 1.166889 -0.404398 0.017578 0.626953 +125.265854 -40.306263 -0.000010 0.000000 0.000000 1.000000 64ffffff 1.252658 -0.403063 0.021867 0.627020 +116.742630 2.844030 -0.000017 0.000000 0.000000 1.000000 64ffffff 1.167426 0.028440 0.017605 0.648595 +116.742630 2.844030 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.167426 0.028440 0.017605 0.675939 +125.265854 -40.306263 -20.000010 0.000000 0.000000 -1.000000 64ffffff 1.252658 -0.403063 0.021867 0.654364 +116.688889 -40.439770 -20.000010 0.000000 0.000000 -1.000000 64ffffff 1.166889 -0.404398 0.017578 0.654297 +113.386139 17.549799 -0.000017 0.000000 0.000000 1.000000 64ffffff 1.133861 0.175498 0.051577 0.085938 +125.070175 51.635345 -0.000018 0.000000 0.000000 1.000000 64ffffff 1.250702 0.516353 0.057419 0.102980 +103.981445 29.342913 -0.000017 0.000000 0.000000 1.000000 64ffffff 1.039814 0.293429 0.046875 0.091834 +103.981445 29.342913 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.039814 0.293429 0.046875 0.115272 +125.070175 51.635345 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.250702 0.516353 0.057419 0.126418 +113.386139 17.549799 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.133861 0.175498 0.051577 0.109375 +39.148335 -40.535568 -0.000019 0.000000 0.000000 1.000000 64ffffff 0.391483 -0.405356 0.031250 0.117188 +48.955952 2.844034 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.489560 0.028440 0.036154 0.138877 +39.344009 51.635338 -0.000018 0.000000 0.000000 1.000000 64ffffff 0.393440 0.516353 0.031348 0.163273 +39.344009 51.635338 -20.000019 0.000000 0.000000 -1.000000 64ffffff 0.393440 0.516353 0.031348 0.216007 +48.955952 2.844034 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.489560 0.028440 0.036154 0.191612 +39.148335 -40.535568 -20.000019 0.000000 0.000000 -1.000000 64ffffff 0.391483 -0.405356 0.031250 0.169922 +48.955952 2.844034 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.489560 0.028440 0.036056 0.222656 +52.312447 17.549803 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.523124 0.175498 0.037734 0.230009 +39.344009 51.635338 -0.000018 0.000000 0.000000 1.000000 64ffffff 0.393440 0.516353 0.031250 0.247052 +39.344009 51.635338 -20.000019 0.000000 0.000000 -1.000000 64ffffff 0.393440 0.516353 0.031250 0.276349 +52.312447 17.549803 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.523124 0.175498 0.037734 0.259306 +48.955952 2.844034 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.489560 0.028440 0.036056 0.251953 +52.312447 17.549803 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.523124 0.175498 0.070937 0.056641 +61.717140 29.342913 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.617171 0.293429 0.075640 0.062537 +39.344009 51.635338 -0.000018 0.000000 0.000000 1.000000 64ffffff 0.393440 0.516353 0.064453 0.073683 +39.344009 51.635338 -20.000019 0.000000 0.000000 -1.000000 64ffffff 0.393440 0.516353 0.064453 0.097121 +61.717140 29.342913 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.617171 0.293429 0.075640 0.085975 +52.312447 17.549803 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.523124 0.175498 0.070937 0.080078 +61.717140 29.342913 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.617171 0.293429 0.122515 0.039063 +75.307312 35.887596 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.753073 0.358876 0.129310 0.042335 +39.344009 51.635338 -0.000018 0.000000 0.000000 1.000000 64ffffff 0.393440 0.516353 0.111328 0.050209 +39.344009 51.635338 -20.000019 0.000000 0.000000 -1.000000 64ffffff 0.393440 0.516353 0.134766 0.050209 +75.307312 35.887596 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.753073 0.358876 0.152747 0.042335 +61.717140 29.342913 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.617171 0.293429 0.145952 0.039063 +125.070175 51.635345 -0.000018 0.000000 0.000000 1.000000 64ffffff 1.250702 0.516353 0.856913 0.013733 +75.307312 35.887596 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.753073 0.358876 0.832031 0.005859 +90.391273 35.887596 -0.000017 0.000000 0.000000 1.000000 64ffffff 0.903913 0.358876 0.839573 0.005859 +90.391273 35.887596 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.903913 0.358876 0.870823 0.005859 +75.307312 35.887596 -20.000017 0.000000 0.000000 -1.000000 64ffffff 0.753073 0.358876 0.863281 0.005859 +125.070175 51.635345 -20.000017 0.000000 0.000000 -1.000000 64ffffff 1.250702 0.516353 0.888163 0.013733 +-80.279335 35.631195 -0.000009 -0.433884 -0.900969 0.000000 64ffffff -0.802793 0.000000 0.644531 0.031484 +-66.689163 29.086510 -20.000010 -0.433884 -0.900969 0.000000 64ffffff -0.666892 -0.200000 0.651326 0.021484 +-66.689163 29.086510 -0.000009 -0.433884 -0.900969 0.000000 64ffffff -0.666892 0.000000 0.651326 0.031484 +-80.279335 35.631195 -20.000010 -0.433884 -0.900969 0.000000 64ffffff -0.802793 -0.200000 0.656250 0.021484 +-66.689163 29.086510 -20.000010 -0.433884 -0.900969 0.000000 64ffffff -0.666892 -0.200000 0.663045 0.021484 +-80.279335 35.631195 -0.000009 -0.433884 -0.900969 0.000000 64ffffff -0.802793 0.000000 0.656250 0.031484 +-66.689163 29.086510 -0.000009 -0.781832 -0.623490 0.000000 64ffffff 0.290865 0.000000 0.673865 0.031484 +-57.284470 17.293396 -20.000010 -0.781832 -0.623490 0.000000 64ffffff 0.172934 -0.200000 0.667969 0.021484 +-57.284470 17.293396 -0.000009 -0.781832 -0.623490 0.000000 64ffffff 0.172934 0.000000 0.667969 0.031484 +-66.689163 29.086510 -20.000010 -0.781832 -0.623490 0.000000 64ffffff 0.290865 -0.200000 0.685584 0.021484 +-57.284470 17.293396 -20.000010 -0.781832 -0.623490 0.000000 64ffffff 0.172934 -0.200000 0.679688 0.021484 +-66.689163 29.086510 -0.000009 -0.781832 -0.623490 0.000000 64ffffff 0.290865 0.000000 0.685584 0.031484 +-57.284470 17.293396 -0.000009 -0.974928 -0.222521 0.000000 64ffffff 0.172934 0.000000 0.698759 0.031484 +-53.927975 2.587628 -20.000010 -0.974928 -0.222521 0.000000 64ffffff 0.025876 -0.200000 0.691406 0.021484 +-53.927975 2.587628 -0.000009 -0.974928 -0.222521 0.000000 64ffffff 0.025876 0.000000 0.691406 0.031484 +-57.284470 17.293396 -20.000010 -0.974928 -0.222521 0.000000 64ffffff 0.172934 -0.200000 0.712431 0.021484 +-53.927975 2.587628 -20.000010 -0.974928 -0.222521 0.000000 64ffffff 0.025876 -0.200000 0.705078 0.021484 +-57.284470 17.293396 -0.000009 -0.974928 -0.222521 0.000000 64ffffff 0.172934 0.000000 0.712431 0.031484 +-53.927975 2.587628 -0.000009 -0.999999 0.001242 0.000000 64ffffff 0.025876 0.000000 0.740392 0.031484 +-53.981720 -40.696175 -20.000002 -0.999999 0.001242 0.000000 64ffffff -0.406962 -0.200000 0.718750 0.021484 +-53.981720 -40.696175 -0.000002 -0.999999 0.001242 0.000000 64ffffff -0.406962 0.000000 0.718750 0.031484 +-53.927975 2.587628 -20.000010 -0.999999 0.001242 0.000000 64ffffff 0.025876 -0.200000 0.767736 0.021484 +-53.981720 -40.696175 -20.000002 -0.999999 0.001242 0.000000 64ffffff -0.406962 -0.200000 0.746094 0.021484 +-53.927975 2.587628 -0.000009 -0.999999 0.001242 0.000000 64ffffff 0.025876 0.000000 0.767736 0.031484 +-53.981720 -40.696175 -0.000002 0.015564 -0.999879 0.000000 64ffffff -0.539817 0.000000 0.017578 0.691641 +-45.404758 -40.562668 -20.000002 0.015564 -0.999879 0.000000 64ffffff -0.454048 -0.200000 0.021867 0.681641 +-45.404758 -40.562668 -0.000003 0.015564 -0.999879 0.000000 64ffffff -0.454048 0.000000 0.021867 0.691641 +-53.981720 -40.696175 -20.000002 0.015564 -0.999879 0.000000 64ffffff -0.539817 -0.200000 0.017578 0.697266 +-45.404758 -40.562668 -20.000002 0.015564 -0.999879 0.000000 64ffffff -0.454048 -0.200000 0.021867 0.697266 +-53.981720 -40.696175 -0.000002 0.015564 -0.999879 0.000000 64ffffff -0.539817 0.000000 0.017578 0.707266 +-45.404758 -40.562668 -0.000003 0.999998 0.002128 0.000000 64ffffff -0.405627 0.000000 0.773438 0.031484 +-45.600437 51.378941 -20.000010 0.999998 0.002128 0.000000 64ffffff 0.513789 -0.200000 0.819408 0.021484 +-45.600437 51.378941 -0.000010 0.999998 0.002128 0.000000 64ffffff 0.513789 0.000000 0.819408 0.031484 +-45.404758 -40.562668 -20.000002 0.999998 0.002128 0.000000 64ffffff -0.405627 -0.200000 0.826172 0.021484 +-45.600437 51.378941 -20.000010 0.999998 0.002128 0.000000 64ffffff 0.513789 -0.200000 0.872143 0.021484 +-45.404758 -40.562668 -0.000003 0.999998 0.002128 0.000000 64ffffff -0.405627 0.000000 0.826172 0.031484 +-45.600437 51.378941 -0.000010 0.000000 1.000000 0.000000 64ffffff -0.456004 0.000000 0.921769 0.031484 +-131.326599 51.378933 -20.000011 0.000000 1.000000 0.000000 64ffffff -1.313266 -0.200000 0.878906 0.021484 +-131.326599 51.378933 -0.000010 0.000000 1.000000 0.000000 64ffffff -1.313266 0.000000 0.878906 0.031484 +-45.600437 51.378941 -20.000010 0.000000 1.000000 0.000000 64ffffff -0.456004 -0.200000 0.970597 0.021484 +-131.326599 51.378933 -20.000011 0.000000 1.000000 0.000000 64ffffff -1.313266 -0.200000 0.927734 0.021484 +-45.600437 51.378941 -0.000010 0.000000 1.000000 0.000000 64ffffff -0.456004 0.000000 0.970597 0.031484 +-131.326599 51.378933 -0.000010 -0.999998 0.002123 0.000000 64ffffff 0.513789 0.000000 0.204289 0.049063 +-131.522278 -40.791973 -20.000011 -0.999998 0.002123 0.000000 64ffffff -0.407920 -0.200000 0.158203 0.039063 +-131.522278 -40.791973 -0.000011 -0.999998 0.002123 0.000000 64ffffff -0.407920 0.000000 0.158203 0.049063 +-131.326599 51.378933 -20.000011 -0.999998 0.002123 0.000000 64ffffff 0.513789 -0.200000 0.257023 0.039063 +-131.522278 -40.791973 -20.000011 -0.999998 0.002123 0.000000 64ffffff -0.407920 -0.200000 0.210938 0.039063 +-131.326599 51.378933 -0.000010 -0.999998 0.002123 0.000000 64ffffff 0.513789 0.000000 0.257023 0.049063 +-131.522278 -40.791973 -0.000011 0.005069 -0.999987 0.000000 64ffffff -1.315223 0.000000 0.976562 0.031484 +-121.660912 -40.741985 -20.000010 0.005069 -0.999987 0.000000 64ffffff -1.216609 -0.200000 0.981493 0.021484 +-121.660912 -40.741985 -0.000010 0.005069 -0.999987 0.000000 64ffffff -1.216609 0.000000 0.981493 0.031484 +-131.522278 -40.791973 -20.000011 0.005069 -0.999987 0.000000 64ffffff -1.315223 -0.200000 0.988281 0.021484 +-121.660912 -40.741985 -20.000010 0.005069 -0.999987 0.000000 64ffffff -1.216609 -0.200000 0.993212 0.021484 +-131.522278 -40.791973 -0.000011 0.005069 -0.999987 0.000000 64ffffff -1.315223 0.000000 0.988281 0.031484 +-121.660912 -40.741985 -0.000010 0.999999 0.001240 0.000000 64ffffff -0.407420 0.000000 0.263672 0.049063 +-121.714661 2.587631 -20.000010 0.999999 0.001240 0.000000 64ffffff 0.025876 -0.200000 0.285337 0.039063 +-121.714661 2.587631 -0.000009 0.999999 0.001240 0.000000 64ffffff 0.025876 0.000000 0.285337 0.049063 +-121.660912 -40.741985 -20.000010 0.999999 0.001240 0.000000 64ffffff -0.407420 -0.200000 0.291016 0.039063 +-121.714661 2.587631 -20.000010 0.999999 0.001240 0.000000 64ffffff 0.025876 -0.200000 0.312680 0.039063 +-121.660912 -40.741985 -0.000010 0.999999 0.001240 0.000000 64ffffff -0.407420 0.000000 0.291016 0.049063 +-121.714661 2.587631 -0.000009 0.974928 -0.222521 0.000000 64ffffff 0.025876 0.000000 0.318359 0.049063 +-118.358162 17.293400 -20.000010 0.974928 -0.222521 0.000000 64ffffff 0.172934 -0.200000 0.325712 0.039063 +-118.358162 17.293400 -0.000009 0.974928 -0.222521 0.000000 64ffffff 0.172934 0.000000 0.325712 0.049063 +-121.714661 2.587631 -20.000010 0.974928 -0.222521 0.000000 64ffffff 0.025876 -0.200000 0.332031 0.039063 +-118.358162 17.293400 -20.000010 0.974928 -0.222521 0.000000 64ffffff 0.172934 -0.200000 0.339384 0.039063 +-121.714661 2.587631 -0.000009 0.974928 -0.222521 0.000000 64ffffff 0.025876 0.000000 0.332031 0.049063 +-118.358162 17.293400 -0.000009 0.781831 -0.623490 0.000000 64ffffff 0.172934 0.000000 0.031250 0.291250 +-108.953468 29.086510 -20.000010 0.781831 -0.623490 0.000000 64ffffff 0.290865 -0.200000 0.037147 0.281250 +-108.953468 29.086510 -0.000009 0.781831 -0.623490 0.000000 64ffffff 0.290865 0.000000 0.037147 0.291250 +-118.358162 17.293400 -20.000010 0.781831 -0.623490 0.000000 64ffffff 0.172934 -0.200000 0.031250 0.296875 +-108.953468 29.086510 -20.000010 0.781831 -0.623490 0.000000 64ffffff 0.290865 -0.200000 0.037147 0.296875 +-118.358162 17.293400 -0.000009 0.781831 -0.623490 0.000000 64ffffff 0.172934 0.000000 0.031250 0.306875 +-108.953468 29.086510 -0.000009 0.433884 -0.900969 0.000000 64ffffff -1.089535 0.000000 0.031250 0.322500 +-95.363297 35.631195 -20.000010 0.433884 -0.900969 0.000000 64ffffff -0.953633 -0.200000 0.038045 0.312500 +-95.363297 35.631195 -0.000009 0.433884 -0.900969 0.000000 64ffffff -0.953633 0.000000 0.038045 0.322500 +-108.953468 29.086510 -20.000010 0.433884 -0.900969 0.000000 64ffffff -1.089535 -0.200000 0.031250 0.328125 +-95.363297 35.631195 -20.000010 0.433884 -0.900969 0.000000 64ffffff -0.953633 -0.200000 0.038045 0.328125 +-108.953468 29.086510 -0.000009 0.433884 -0.900969 0.000000 64ffffff -1.089535 0.000000 0.031250 0.338125 +-95.363297 35.631195 -0.000009 0.000000 -1.000000 0.000000 64ffffff -0.953633 0.000000 0.345703 0.049063 +-80.279335 35.631195 -20.000010 0.000000 -1.000000 0.000000 64ffffff -0.802793 -0.200000 0.353245 0.039063 +-80.279335 35.631195 -0.000009 0.000000 -1.000000 0.000000 64ffffff -0.802793 0.000000 0.353245 0.049063 +-95.363297 35.631195 -20.000010 0.000000 -1.000000 0.000000 64ffffff -0.953633 -0.200000 0.359375 0.039063 +-80.279335 35.631195 -20.000010 0.000000 -1.000000 0.000000 64ffffff -0.802793 -0.200000 0.366917 0.039063 +-95.363297 35.631195 -0.000009 0.000000 -1.000000 0.000000 64ffffff -0.953633 0.000000 0.359375 0.049063 +-95.363297 35.631195 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.953633 0.356312 0.912513 0.005859 +-45.600437 51.378941 -0.000010 0.000000 0.000000 1.000000 64ffffff -0.456004 0.513789 0.937394 0.013733 +-131.326599 51.378933 -0.000010 0.000000 0.000000 1.000000 64ffffff -1.313266 0.513789 0.894531 0.013733 +-131.326599 51.378933 -20.000011 0.000000 0.000000 -1.000000 64ffffff -1.313266 0.513789 0.943359 0.013733 +-45.600437 51.378941 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.456004 0.513789 0.986223 0.013733 +-95.363297 35.631195 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.953633 0.356312 0.961341 0.005859 +-121.714661 2.587631 -0.000009 0.000000 0.000000 1.000000 64ffffff -1.217147 0.025876 0.036154 0.365440 +-131.522278 -40.791973 -0.000011 0.000000 0.000000 1.000000 64ffffff -1.315223 -0.407920 0.031250 0.343750 +-121.660912 -40.741985 -0.000010 0.000000 0.000000 1.000000 64ffffff -1.216609 -0.407420 0.036181 0.343775 +-121.660912 -40.741985 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.216609 -0.407420 0.036181 0.371119 +-131.522278 -40.791973 -20.000011 0.000000 0.000000 -1.000000 64ffffff -1.315223 -0.407920 0.031250 0.371094 +-121.714661 2.587631 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.217147 0.025876 0.036154 0.392784 +-45.600437 51.378941 -0.000010 0.000000 0.000000 1.000000 64ffffff -0.456004 0.513789 0.099371 0.067787 +-80.279335 35.631195 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.802793 0.356312 0.082031 0.059913 +-66.689163 29.086510 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.666892 0.290865 0.088826 0.056641 +-66.689163 29.086510 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.666892 0.290865 0.112264 0.056641 +-80.279335 35.631195 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.802793 0.356312 0.105469 0.059913 +-45.600437 51.378941 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.456004 0.513789 0.122808 0.067787 +-53.927975 2.587628 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.539280 0.025876 0.032928 0.398438 +-45.600437 51.378941 -0.000010 0.000000 0.000000 1.000000 64ffffff -0.456004 0.513789 0.037092 0.422833 +-57.284470 17.293396 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.572845 0.172934 0.031250 0.405790 +-57.284470 17.293396 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.572845 0.172934 0.031250 0.435087 +-45.600437 51.378941 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.456004 0.513789 0.037092 0.452130 +-53.927975 2.587628 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.539280 0.025876 0.032928 0.427734 +-45.404758 -40.562668 -0.000003 0.000000 0.000000 1.000000 64ffffff -0.454048 -0.405627 0.021840 0.712891 +-45.600437 51.378941 -0.000010 0.000000 0.000000 1.000000 64ffffff -0.456004 0.513789 0.021742 0.758861 +-53.927975 2.587628 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.539280 0.025876 0.017578 0.734466 +-53.927975 2.587628 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.539280 0.025876 0.017578 0.787200 +-45.600437 51.378941 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.456004 0.513789 0.021742 0.811596 +-45.404758 -40.562668 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.454048 -0.405627 0.021840 0.765625 +-53.981720 -40.696175 -0.000002 0.000000 0.000000 1.000000 64ffffff -0.539817 -0.406962 0.017578 0.818359 +-45.404758 -40.562668 -0.000003 0.000000 0.000000 1.000000 64ffffff -0.454048 -0.405627 0.021867 0.818426 +-53.927975 2.587628 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.539280 0.025876 0.017605 0.840001 +-53.927975 2.587628 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.539280 0.025876 0.017605 0.867345 +-45.404758 -40.562668 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.454048 -0.405627 0.021867 0.845770 +-53.981720 -40.696175 -20.000002 0.000000 0.000000 -1.000000 64ffffff -0.539817 -0.406962 0.017578 0.845703 +-57.284470 17.293396 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.572845 0.172934 0.051577 0.132813 +-45.600437 51.378941 -0.000010 0.000000 0.000000 1.000000 64ffffff -0.456004 0.513789 0.057419 0.149855 +-66.689163 29.086510 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.666892 0.290865 0.046875 0.138709 +-66.689163 29.086510 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.666892 0.290865 0.046875 0.162147 +-45.600437 51.378941 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.456004 0.513789 0.057419 0.173293 +-57.284470 17.293396 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.572845 0.172934 0.051577 0.156250 +-131.522278 -40.791973 -0.000011 0.000000 0.000000 1.000000 64ffffff -1.315223 -0.407920 0.031250 0.457031 +-121.714661 2.587631 -0.000009 0.000000 0.000000 1.000000 64ffffff -1.217147 0.025876 0.036154 0.478721 +-131.326599 51.378933 -0.000010 0.000000 0.000000 1.000000 64ffffff -1.313266 0.513789 0.031348 0.503117 +-131.326599 51.378933 -20.000011 0.000000 0.000000 -1.000000 64ffffff -1.313266 0.513789 0.031348 0.555851 +-121.714661 2.587631 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.217147 0.025876 0.036154 0.531455 +-131.522278 -40.791973 -20.000011 0.000000 0.000000 -1.000000 64ffffff -1.315223 -0.407920 0.031250 0.509766 +-121.714661 2.587631 -0.000009 0.000000 0.000000 1.000000 64ffffff -1.217147 0.025876 0.036056 0.562500 +-118.358162 17.293400 -0.000009 0.000000 0.000000 1.000000 64ffffff -1.183582 0.172934 0.037734 0.569853 +-131.326599 51.378933 -0.000010 0.000000 0.000000 1.000000 64ffffff -1.313266 0.513789 0.031250 0.586896 +-131.326599 51.378933 -20.000011 0.000000 0.000000 -1.000000 64ffffff -1.313266 0.513789 0.031250 0.616193 +-118.358162 17.293400 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.183582 0.172934 0.037734 0.599150 +-121.714661 2.587631 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.217147 0.025876 0.036056 0.591797 +-118.358162 17.293400 -0.000009 0.000000 0.000000 1.000000 64ffffff -1.183582 0.172934 0.070937 0.103516 +-108.953468 29.086510 -0.000009 0.000000 0.000000 1.000000 64ffffff -1.089535 0.290865 0.075640 0.109412 +-131.326599 51.378933 -0.000010 0.000000 0.000000 1.000000 64ffffff -1.313266 0.513789 0.064453 0.120558 +-131.326599 51.378933 -20.000011 0.000000 0.000000 -1.000000 64ffffff -1.313266 0.513789 0.064453 0.143996 +-108.953468 29.086510 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.089535 0.290865 0.075640 0.132850 +-118.358162 17.293400 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.183582 0.172934 0.070937 0.126953 +-108.953468 29.086510 -0.000009 0.000000 0.000000 1.000000 64ffffff -1.089535 0.290865 0.140093 0.056641 +-95.363297 35.631195 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.953633 0.356312 0.146888 0.059913 +-131.326599 51.378933 -0.000010 0.000000 0.000000 1.000000 64ffffff -1.313266 0.513789 0.128906 0.067787 +-131.326599 51.378933 -20.000011 0.000000 0.000000 -1.000000 64ffffff -1.313266 0.513789 0.152344 0.067787 +-95.363297 35.631195 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.953633 0.356312 0.170325 0.059913 +-108.953468 29.086510 -20.000010 0.000000 0.000000 -1.000000 64ffffff -1.089535 0.290865 0.163530 0.056641 +-45.600437 51.378941 -0.000010 0.000000 0.000000 1.000000 64ffffff -0.456004 0.513789 0.397928 0.046936 +-95.363297 35.631195 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.953633 0.356312 0.373047 0.039063 +-80.279335 35.631195 -0.000009 0.000000 0.000000 1.000000 64ffffff -0.802793 0.356312 0.380589 0.039063 +-80.279335 35.631195 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.802793 0.356312 0.411839 0.039063 +-95.363297 35.631195 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.953633 0.356312 0.404297 0.039063 +-45.600437 51.378941 -20.000010 0.000000 0.000000 -1.000000 64ffffff -0.456004 0.513789 0.429178 0.046936 +-150.432678 35.631111 41.344543 0.000000 -0.900969 -0.433884 64ffffff -1.504327 0.413445 0.435547 0.039063 +-130.432663 29.086428 54.934700 0.000000 -0.900969 -0.433884 64ffffff -1.304327 0.549347 0.445547 0.045858 +-150.432663 29.086428 54.934723 0.000000 -0.900969 -0.433884 64ffffff -1.504327 0.549347 0.435547 0.045858 +-130.432678 35.631111 41.344521 0.000000 -0.900969 -0.433884 64ffffff -1.304327 0.413445 0.461172 0.039063 +-130.432663 29.086428 54.934700 0.000000 -0.900969 -0.433884 64ffffff -1.304327 0.549347 0.461172 0.045858 +-150.432678 35.631111 41.344543 0.000000 -0.900969 -0.433884 64ffffff -1.504327 0.413445 0.451172 0.039063 +-150.432663 29.086428 54.934723 -0.000001 -0.623489 -0.781832 64ffffff -1.504327 0.290864 0.466797 0.044959 +-130.432648 17.293314 64.339386 -0.000001 -0.623489 -0.781832 64ffffff -1.304326 0.172933 0.476797 0.039063 +-150.432663 17.293314 64.339409 -0.000001 -0.623489 -0.781832 64ffffff -1.504327 0.172933 0.466797 0.039063 +-130.432663 29.086428 54.934700 -0.000001 -0.623489 -0.781832 64ffffff -1.304327 0.290864 0.492422 0.044959 +-130.432648 17.293314 64.339386 -0.000001 -0.623489 -0.781832 64ffffff -1.304326 0.172933 0.492422 0.039063 +-150.432663 29.086428 54.934723 -0.000001 -0.623489 -0.781832 64ffffff -1.504327 0.290864 0.482422 0.044959 +-150.432663 17.293314 64.339409 -0.000001 -0.222521 -0.974928 64ffffff -1.504327 0.172933 0.046875 0.187040 +-130.432648 2.587545 67.695885 -0.000001 -0.222521 -0.974928 64ffffff -1.304326 0.025875 0.056875 0.179688 +-150.432648 2.587545 67.695908 -0.000001 -0.222521 -0.974928 64ffffff -1.504326 0.025875 0.046875 0.179688 +-130.432648 17.293314 64.339386 -0.000001 -0.222521 -0.974928 64ffffff -1.304326 0.172933 0.056875 0.200712 +-130.432648 2.587545 67.695885 -0.000001 -0.222521 -0.974928 64ffffff -1.304326 0.025875 0.056875 0.193359 +-150.432663 17.293314 64.339409 -0.000001 -0.222521 -0.974928 64ffffff -1.504327 0.172933 0.046875 0.200712 +-150.432648 2.587545 67.695908 -0.000002 0.001242 -0.999999 64ffffff -1.504326 0.025875 0.046875 0.228673 +-130.432663 -40.696259 67.642136 -0.000002 0.001242 -0.999999 64ffffff -1.304327 -0.406963 0.056875 0.207031 +-150.432663 -40.696259 67.642166 -0.000002 0.001242 -0.999999 64ffffff -1.504327 -0.406963 0.046875 0.207031 +-130.432648 2.587545 67.695885 -0.000001 0.001242 -0.999999 64ffffff -1.304326 0.025875 0.056875 0.256017 +-130.432663 -40.696259 67.642136 -0.000001 0.001242 -0.999999 64ffffff -1.304327 -0.406963 0.056875 0.234375 +-150.432648 2.587545 67.695908 -0.000001 0.001242 -0.999999 64ffffff -1.504326 0.025875 0.046875 0.256017 +-150.432663 -40.696259 67.642166 0.000000 -0.999879 0.015564 64ffffff -1.504327 0.676422 0.498047 0.039063 +-130.432648 -40.562752 76.219101 0.000000 -0.999879 0.015564 64ffffff -1.304326 0.762191 0.508047 0.043351 +-150.432648 -40.562752 76.219124 0.000000 -0.999879 0.015564 64ffffff -1.504326 0.762191 0.498047 0.043351 +-130.432663 -40.696259 67.642136 0.000000 -0.999879 0.015564 64ffffff -1.304327 0.676421 0.523672 0.039063 +-130.432648 -40.562752 76.219101 0.000000 -0.999879 0.015564 64ffffff -1.304326 0.762191 0.523672 0.043351 +-150.432663 -40.696259 67.642166 0.000000 -0.999879 0.015564 64ffffff -1.504327 0.676422 0.513672 0.039063 +-150.432648 -40.562752 76.219124 0.000001 0.002128 0.999998 64ffffff -1.504326 -0.405628 0.046875 0.261719 +-130.432648 51.378860 76.023422 0.000001 0.002128 0.999998 64ffffff -1.304326 0.513789 0.056875 0.307690 +-150.432648 51.378860 76.023445 0.000001 0.002128 0.999998 64ffffff -1.504326 0.513789 0.046875 0.307690 +-130.432648 -40.562752 76.219101 0.000001 0.002128 0.999998 64ffffff -1.304326 -0.405628 0.056875 0.314453 +-130.432648 51.378860 76.023422 0.000001 0.002128 0.999998 64ffffff -1.304326 0.513789 0.056875 0.360424 +-150.432648 -40.562752 76.219124 0.000001 0.002128 0.999998 64ffffff -1.504326 -0.405628 0.046875 0.314453 +-150.432648 51.378860 76.023445 0.000000 1.000000 0.000000 64ffffff -1.504326 0.760234 0.046875 0.410051 +-130.432739 51.378853 -9.702749 0.000000 1.000000 0.000000 64ffffff -1.304327 -0.097027 0.056875 0.367188 +-150.432739 51.378853 -9.702725 0.000000 1.000000 0.000000 64ffffff -1.504327 -0.097027 0.046875 0.367188 +-130.432648 51.378860 76.023422 0.000000 1.000000 0.000000 64ffffff -1.304326 0.760234 0.056875 0.458879 +-130.432739 51.378853 -9.702749 0.000000 1.000000 0.000000 64ffffff -1.304327 -0.097027 0.056875 0.416016 +-150.432648 51.378860 76.023445 0.000000 1.000000 0.000000 64ffffff -1.504326 0.760234 0.046875 0.458879 +-150.432739 51.378853 -9.702725 -0.000001 0.002123 -0.999998 64ffffff -1.504327 0.513789 0.046875 0.510929 +-130.432739 -40.792053 -9.898424 -0.000001 0.002123 -0.999998 64ffffff -1.304327 -0.407921 0.056875 0.464844 +-150.432739 -40.792053 -9.898400 -0.000001 0.002123 -0.999998 64ffffff -1.504327 -0.407921 0.046875 0.464844 +-130.432739 51.378853 -9.702749 -0.000001 0.002123 -0.999998 64ffffff -1.304327 0.513789 0.056875 0.563664 +-130.432739 -40.792053 -9.898424 -0.000001 0.002123 -0.999998 64ffffff -1.304327 -0.407921 0.056875 0.517578 +-150.432739 51.378853 -9.702725 -0.000001 0.002123 -0.999998 64ffffff -1.504327 0.513789 0.046875 0.563664 +-150.432739 -40.792053 -9.898400 0.000000 -0.999987 0.005069 64ffffff -1.504327 -0.098984 0.046875 0.570313 +-130.432724 -40.742065 -0.037060 0.000000 -0.999987 0.005069 64ffffff -1.304327 -0.000371 0.056875 0.575243 +-150.432739 -40.742065 -0.037037 0.000000 -0.999987 0.005069 64ffffff -1.504327 -0.000370 0.046875 0.575243 +-130.432739 -40.792053 -9.898424 0.000000 -0.999987 0.005069 64ffffff -1.304327 -0.098984 0.056875 0.582031 +-130.432724 -40.742065 -0.037060 0.000000 -0.999987 0.005069 64ffffff -1.304327 -0.000371 0.056875 0.586962 +-150.432739 -40.792053 -9.898400 0.000000 -0.999987 0.005069 64ffffff -1.504327 -0.098984 0.046875 0.582031 +-150.432739 -40.742065 -0.037037 0.000001 0.001240 0.999999 64ffffff -1.504327 -0.407421 0.046875 0.593750 +-130.432724 2.587548 -0.090806 0.000001 0.001240 0.999999 64ffffff -1.304327 0.025875 0.056875 0.615415 +-150.432739 2.587548 -0.090782 0.000001 0.001240 0.999999 64ffffff -1.504327 0.025875 0.046875 0.615415 +-130.432724 -40.742065 -0.037060 0.000001 0.001240 0.999999 64ffffff -1.304327 -0.407421 0.056875 0.621094 +-130.432724 2.587548 -0.090806 0.000001 0.001240 0.999999 64ffffff -1.304327 0.025875 0.056875 0.642759 +-150.432739 -40.742065 -0.037037 0.000001 0.001240 0.999999 64ffffff -1.504327 -0.407421 0.046875 0.621094 +-150.432739 2.587548 -0.090782 0.000001 -0.222521 0.974928 64ffffff -1.504327 0.025875 0.046875 0.648438 +-130.432724 17.293316 3.265692 0.000001 -0.222521 0.974928 64ffffff -1.304327 0.172933 0.056875 0.655790 +-150.432724 17.293316 3.265715 0.000001 -0.222521 0.974928 64ffffff -1.504327 0.172933 0.046875 0.655790 +-130.432724 2.587548 -0.090806 0.000001 -0.222521 0.974928 64ffffff -1.304327 0.025875 0.056875 0.662109 +-130.432724 17.293316 3.265692 0.000001 -0.222521 0.974928 64ffffff -1.304327 0.172933 0.056875 0.669462 +-150.432739 2.587548 -0.090782 0.000001 -0.222521 0.974928 64ffffff -1.504327 0.025875 0.046875 0.662109 +-150.432724 17.293316 3.265715 0.000001 -0.623490 0.781831 64ffffff -1.504327 0.172933 0.046875 0.675781 +-130.432709 29.086428 12.670384 0.000001 -0.623490 0.781831 64ffffff -1.304327 0.290864 0.056875 0.681678 +-150.432724 29.086428 12.670407 0.000001 -0.623490 0.781831 64ffffff -1.504327 0.290864 0.046875 0.681678 +-130.432724 17.293316 3.265692 0.000001 -0.623490 0.781831 64ffffff -1.304327 0.172933 0.056875 0.687500 +-130.432709 29.086428 12.670384 0.000001 -0.623490 0.781831 64ffffff -1.304327 0.290864 0.056875 0.693397 +-150.432724 17.293316 3.265715 0.000001 -0.623490 0.781831 64ffffff -1.504327 0.172933 0.046875 0.687500 +-150.432724 29.086428 12.670407 0.000001 -0.900969 0.433884 64ffffff -1.504327 0.126704 0.046875 0.699219 +-130.432693 35.631111 26.260561 0.000001 -0.900969 0.433884 64ffffff -1.304327 0.262606 0.056875 0.706014 +-150.432709 35.631111 26.260584 0.000001 -0.900969 0.433884 64ffffff -1.504327 0.262606 0.046875 0.706014 +-130.432709 29.086428 12.670384 0.000000 -0.900969 0.433884 64ffffff -1.304327 0.126704 0.056875 0.710938 +-130.432693 35.631111 26.260561 0.000000 -0.900969 0.433884 64ffffff -1.304327 0.262606 0.056875 0.717733 +-150.432724 29.086428 12.670407 0.000000 -0.900969 0.433884 64ffffff -1.504327 0.126704 0.046875 0.710938 +-150.432709 35.631111 26.260584 0.000000 -1.000000 0.000000 64ffffff -1.504327 0.262606 0.046875 0.722656 +-130.432678 35.631111 41.344521 0.000000 -1.000000 0.000000 64ffffff -1.304327 0.413445 0.056875 0.730198 +-150.432678 35.631111 41.344543 0.000000 -1.000000 0.000000 64ffffff -1.504327 0.413445 0.046875 0.730198 +-130.432693 35.631111 26.260561 0.000000 -1.000000 0.000000 64ffffff -1.304327 0.262606 0.056875 0.736328 +-130.432678 35.631111 41.344521 0.000000 -1.000000 0.000000 64ffffff -1.304327 0.413445 0.056875 0.743870 +-150.432709 35.631111 26.260584 0.000000 -1.000000 0.000000 64ffffff -1.504327 0.262606 0.046875 0.736328 +-150.432709 35.631111 26.260584 -1.000000 0.000001 0.000001 64ffffff 0.356311 0.262606 0.046875 0.767982 +-150.432648 51.378860 76.023445 -1.000000 0.000001 0.000001 64ffffff 0.513789 0.760234 0.054749 0.792863 +-150.432739 51.378853 -9.702725 -1.000000 0.000001 0.000001 64ffffff 0.513789 -0.097027 0.054749 0.750000 +-130.432739 51.378853 -9.702749 1.000000 0.000000 -0.000001 64ffffff 0.513789 -0.097027 0.054749 0.798828 +-130.432648 51.378860 76.023422 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.760234 0.054749 0.841691 +-130.432693 35.631111 26.260561 1.000000 0.000000 -0.000001 64ffffff 0.356311 0.262606 0.046875 0.816810 +-150.432739 2.587548 -0.090782 -1.000000 0.000000 0.000000 64ffffff 0.025875 -0.000908 0.197471 0.061544 +-150.432739 -40.792053 -9.898400 -1.000000 0.000000 0.000000 64ffffff -0.407921 -0.098984 0.175781 0.056641 +-150.432739 -40.742065 -0.037037 -1.000000 0.000000 0.000000 64ffffff -0.407421 -0.000370 0.175806 0.061571 +-130.432724 -40.742065 -0.037060 1.000000 0.000000 -0.000002 64ffffff -0.407421 -0.000371 0.203150 0.061571 +-130.432739 -40.792053 -9.898424 1.000000 0.000000 -0.000002 64ffffff -0.407921 -0.098984 0.203125 0.056641 +-130.432724 2.587548 -0.090806 1.000000 0.000000 -0.000002 64ffffff 0.025875 -0.000908 0.224815 0.061544 +-150.432648 51.378860 76.023445 -1.000000 0.000000 0.000001 64ffffff 0.513789 0.760234 0.075599 0.167730 +-150.432678 35.631111 41.344543 -1.000000 0.000000 0.000001 64ffffff 0.356311 0.413445 0.067725 0.150391 +-150.432663 29.086428 54.934723 -1.000000 0.000000 0.000001 64ffffff 0.290864 0.549347 0.064453 0.157186 +-130.432663 29.086428 54.934700 1.000000 0.000000 -0.000001 64ffffff 0.290864 0.549347 0.064453 0.180623 +-130.432678 35.631111 41.344521 1.000000 0.000000 -0.000001 64ffffff 0.356311 0.413445 0.067725 0.173828 +-130.432648 51.378860 76.023422 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.760234 0.075599 0.191168 +-150.432648 2.587545 67.695908 -1.000000 0.000000 0.000003 64ffffff 0.025875 0.676959 0.230469 0.058319 +-150.432648 51.378860 76.023445 -1.000000 0.000000 0.000003 64ffffff 0.513789 0.760234 0.254864 0.062483 +-150.432663 17.293314 64.339409 -1.000000 0.000000 0.000003 64ffffff 0.172933 0.643394 0.237822 0.056641 +-130.432648 17.293314 64.339386 1.000000 0.000000 0.000000 64ffffff 0.172933 0.643394 0.267119 0.056641 +-130.432648 51.378860 76.023422 1.000000 0.000000 0.000000 64ffffff 0.513789 0.760234 0.284161 0.062483 +-130.432648 2.587545 67.695885 1.000000 0.000000 0.000000 64ffffff 0.025875 0.676959 0.259766 0.058319 +-150.432648 -40.562752 76.219124 -1.000000 0.000000 0.000000 64ffffff -0.405628 0.762191 0.529297 0.043324 +-150.432648 51.378860 76.023445 -1.000000 0.000000 0.000000 64ffffff 0.513789 0.760234 0.575268 0.043226 +-150.432648 2.587545 67.695908 -1.000000 0.000000 0.000000 64ffffff 0.025875 0.676959 0.550872 0.039063 +-130.432648 2.587545 67.695885 1.000000 0.000000 0.000000 64ffffff 0.025875 0.676959 0.603606 0.039063 +-130.432648 51.378860 76.023422 1.000000 0.000000 0.000000 64ffffff 0.513789 0.760234 0.628002 0.043226 +-130.432648 -40.562752 76.219101 1.000000 0.000000 0.000000 64ffffff -0.405628 0.762191 0.582031 0.043324 +-150.432663 -40.696259 67.642166 -1.000000 0.000000 0.000002 64ffffff -0.406963 0.676422 0.634766 0.039063 +-150.432648 -40.562752 76.219124 -1.000000 0.000000 0.000002 64ffffff -0.405628 0.762191 0.634832 0.043351 +-150.432648 2.587545 67.695908 -1.000000 0.000000 0.000002 64ffffff 0.025875 0.676959 0.656408 0.039089 +-130.432648 2.587545 67.695885 1.000000 0.000000 -0.000002 64ffffff 0.025875 0.676959 0.683751 0.039089 +-130.432648 -40.562752 76.219101 1.000000 0.000000 -0.000002 64ffffff -0.405628 0.762191 0.662176 0.043351 +-130.432663 -40.696259 67.642136 1.000000 0.000000 -0.000002 64ffffff -0.406963 0.676421 0.662109 0.039063 +-150.432663 17.293314 64.339409 -1.000000 0.000000 0.000000 64ffffff 0.172933 0.643394 0.082031 0.078921 +-150.432648 51.378860 76.023445 -1.000000 0.000000 0.000000 64ffffff 0.513789 0.760234 0.099074 0.084763 +-150.432663 29.086428 54.934723 -1.000000 0.000000 0.000000 64ffffff 0.290864 0.549347 0.087928 0.074219 +-130.432663 29.086428 54.934700 1.000000 0.000000 -0.000001 64ffffff 0.290864 0.549347 0.111365 0.074219 +-130.432648 51.378860 76.023422 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.760234 0.122512 0.084763 +-130.432648 17.293314 64.339386 1.000000 0.000000 -0.000001 64ffffff 0.172933 0.643394 0.105469 0.078921 +-150.432739 -40.792053 -9.898400 -1.000000 0.000000 0.000000 64ffffff -0.407921 -0.098984 0.289063 0.056641 +-150.432739 2.587548 -0.090782 -1.000000 0.000000 0.000000 64ffffff 0.025875 -0.000908 0.310752 0.061544 +-150.432739 51.378853 -9.702725 -1.000000 0.000000 0.000000 64ffffff 0.513789 -0.097027 0.335148 0.056738 +-130.432739 51.378853 -9.702749 1.000000 0.000000 -0.000002 64ffffff 0.513789 -0.097027 0.387882 0.056738 +-130.432724 2.587548 -0.090806 1.000000 0.000000 -0.000002 64ffffff 0.025875 -0.000908 0.363487 0.061544 +-130.432739 -40.792053 -9.898424 1.000000 0.000000 -0.000002 64ffffff -0.407921 -0.098984 0.341797 0.056641 +-150.432739 2.587548 -0.090782 -1.000000 0.000000 0.000002 64ffffff 0.025875 -0.000908 0.394531 0.061447 +-150.432724 17.293316 3.265715 -1.000000 0.000000 0.000002 64ffffff 0.172933 0.032657 0.401884 0.063125 +-150.432739 51.378853 -9.702725 -1.000000 0.000000 0.000002 64ffffff 0.513789 -0.097027 0.418927 0.056641 +-130.432739 51.378853 -9.702749 1.000000 0.000000 -0.000001 64ffffff 0.513789 -0.097027 0.448224 0.056641 +-130.432724 17.293316 3.265692 1.000000 0.000000 -0.000001 64ffffff 0.172933 0.032657 0.431181 0.063125 +-130.432724 2.587548 -0.090806 1.000000 0.000000 -0.000001 64ffffff 0.025875 -0.000908 0.423828 0.061447 +-150.432724 17.293316 3.265715 -1.000000 0.000000 0.000000 64ffffff 0.172933 0.032657 0.082031 0.096328 +-150.432724 29.086428 12.670407 -1.000000 0.000000 0.000000 64ffffff 0.290864 0.126704 0.087928 0.101030 +-150.432739 51.378853 -9.702725 -1.000000 0.000000 0.000000 64ffffff 0.513789 -0.097027 0.099074 0.089844 +-130.432739 51.378853 -9.702749 1.000000 0.000000 -0.000001 64ffffff 0.513789 -0.097027 0.122512 0.089844 +-130.432709 29.086428 12.670384 1.000000 0.000000 -0.000001 64ffffff 0.290864 0.126704 0.111365 0.101030 +-130.432724 17.293316 3.265692 1.000000 0.000000 -0.000001 64ffffff 0.172933 0.032657 0.105469 0.096328 +-150.432724 29.086428 12.670407 -1.000000 0.000000 0.000001 64ffffff 0.290864 0.126704 0.064453 0.208452 +-150.432709 35.631111 26.260584 -1.000000 0.000000 0.000001 64ffffff 0.356311 0.262606 0.067725 0.215247 +-150.432739 51.378853 -9.702725 -1.000000 0.000000 0.000001 64ffffff 0.513789 -0.097027 0.075599 0.197266 +-130.432739 51.378853 -9.702749 1.000000 0.000000 -0.000001 64ffffff 0.513789 -0.097027 0.075599 0.220703 +-130.432693 35.631111 26.260561 1.000000 0.000000 -0.000001 64ffffff 0.356311 0.262606 0.067725 0.238685 +-130.432709 29.086428 12.670384 1.000000 0.000000 -0.000001 64ffffff 0.290864 0.126704 0.064453 0.231890 +-150.432648 51.378860 76.023445 -1.000000 -0.000003 0.000002 64ffffff 0.513789 0.760234 0.054749 0.872538 +-150.432709 35.631111 26.260584 -1.000000 -0.000003 0.000002 64ffffff 0.356311 0.262606 0.046875 0.847656 +-150.432678 35.631111 41.344543 -1.000000 -0.000003 0.000002 64ffffff 0.356311 0.413445 0.046875 0.855198 +-130.432678 35.631111 41.344521 1.000000 0.000000 -0.000001 64ffffff 0.356311 0.413445 0.046875 0.886448 +-130.432693 35.631111 26.260561 1.000000 0.000000 -0.000001 64ffffff 0.356311 0.262606 0.046875 0.878906 +-130.432648 51.378860 76.023422 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.760234 0.054749 0.903788 +-150.426575 35.631123 127.238884 0.000000 -0.900969 -0.433884 64ffffff -1.504266 1.272389 0.453125 0.056641 +-130.426559 29.086437 140.829041 0.000000 -0.900969 -0.433884 64ffffff -1.304266 1.408290 0.463125 0.063436 +-150.426559 29.086437 140.829056 0.000000 -0.900969 -0.433884 64ffffff -1.504266 1.408291 0.453125 0.063436 +-130.426575 35.631123 127.238861 0.000000 -0.900969 -0.433884 64ffffff -1.304266 1.272389 0.478750 0.056641 +-130.426559 29.086437 140.829041 0.000000 -0.900969 -0.433884 64ffffff -1.304266 1.408290 0.478750 0.063436 +-150.426575 35.631123 127.238884 0.000000 -0.900969 -0.433884 64ffffff -1.504266 1.272389 0.468750 0.056641 +-150.426559 29.086437 140.829056 -0.000001 -0.623490 -0.781832 64ffffff -1.504266 0.290864 0.484375 0.062537 +-130.426544 17.293324 150.233734 -0.000001 -0.623490 -0.781832 64ffffff -1.304265 0.172933 0.494375 0.056641 +-150.426559 17.293324 150.233749 -0.000001 -0.623490 -0.781832 64ffffff -1.504266 0.172933 0.484375 0.056641 +-130.426559 29.086437 140.829041 -0.000001 -0.623490 -0.781832 64ffffff -1.304266 0.290864 0.510000 0.062537 +-130.426544 17.293324 150.233734 -0.000001 -0.623490 -0.781832 64ffffff -1.304265 0.172933 0.510000 0.056641 +-150.426559 29.086437 140.829056 -0.000001 -0.623490 -0.781832 64ffffff -1.504266 0.290864 0.500000 0.062537 +-150.426559 17.293324 150.233749 -0.000001 -0.222522 -0.974928 64ffffff -1.504266 0.172933 0.064453 0.251494 +-130.426544 2.587555 153.590225 -0.000001 -0.222522 -0.974928 64ffffff -1.304265 0.025876 0.074453 0.244141 +-150.426544 2.587555 153.590256 -0.000001 -0.222522 -0.974928 64ffffff -1.504265 0.025876 0.064453 0.244141 +-130.426544 17.293324 150.233734 -0.000001 -0.222521 -0.974928 64ffffff -1.304265 0.172933 0.074453 0.265165 +-130.426544 2.587555 153.590225 -0.000001 -0.222521 -0.974928 64ffffff -1.304265 0.025876 0.074453 0.257813 +-150.426559 17.293324 150.233749 -0.000001 -0.222521 -0.974928 64ffffff -1.504266 0.172933 0.064453 0.265165 +-150.426544 2.587555 153.590256 -0.000001 0.001242 -0.999999 64ffffff -1.504265 0.025876 0.064453 0.293126 +-130.426559 -40.696247 153.536484 -0.000001 0.001242 -0.999999 64ffffff -1.304266 -0.406962 0.074453 0.271484 +-150.426559 -40.696247 153.536499 -0.000001 0.001242 -0.999999 64ffffff -1.504266 -0.406962 0.064453 0.271484 +-130.426544 2.587555 153.590225 -0.000002 0.001242 -0.999999 64ffffff -1.304265 0.025876 0.074453 0.320470 +-130.426559 -40.696247 153.536484 -0.000002 0.001242 -0.999999 64ffffff -1.304266 -0.406962 0.074453 0.298828 +-150.426544 2.587555 153.590256 -0.000002 0.001242 -0.999999 64ffffff -1.504265 0.025876 0.064453 0.320470 +-150.426559 -40.696247 153.536499 0.000000 -0.999879 0.015564 64ffffff -1.504266 1.535365 0.689453 0.039063 +-130.426544 -40.562740 162.113449 0.000000 -0.999879 0.015564 64ffffff -1.304265 1.621134 0.699453 0.043351 +-150.426544 -40.562740 162.113464 0.000000 -0.999879 0.015564 64ffffff -1.504265 1.621135 0.689453 0.043351 +-130.426559 -40.696247 153.536484 0.000000 -0.999879 0.015564 64ffffff -1.304266 1.535365 0.715078 0.039063 +-130.426544 -40.562740 162.113449 0.000000 -0.999879 0.015564 64ffffff -1.304265 1.621134 0.715078 0.043351 +-150.426559 -40.696247 153.536499 0.000000 -0.999879 0.015564 64ffffff -1.504266 1.535365 0.705078 0.039063 +-150.426544 -40.562740 162.113464 0.000001 0.002128 0.999998 64ffffff -1.504265 -0.405627 0.064453 0.326172 +-130.426544 51.378868 161.917770 0.000001 0.002128 0.999998 64ffffff -1.304265 0.513789 0.074453 0.372143 +-150.426544 51.378868 161.917786 0.000001 0.002128 0.999998 64ffffff -1.504265 0.513789 0.064453 0.372143 +-130.426544 -40.562740 162.113449 0.000001 0.002128 0.999998 64ffffff -1.304265 -0.405627 0.074453 0.378906 +-130.426544 51.378868 161.917770 0.000001 0.002128 0.999998 64ffffff -1.304265 0.513789 0.074453 0.424877 +-150.426544 -40.562740 162.113464 0.000001 0.002128 0.999998 64ffffff -1.504265 -0.405627 0.064453 0.378906 +-150.426544 51.378868 161.917786 0.000000 1.000000 0.000000 64ffffff -1.504265 1.619178 0.064453 0.474504 +-130.426636 51.378860 76.191589 0.000000 1.000000 0.000000 64ffffff -1.304266 0.761916 0.074453 0.431641 +-150.426636 51.378860 76.191612 0.000000 1.000000 0.000000 64ffffff -1.504266 0.761916 0.064453 0.431641 +-130.426544 51.378868 161.917770 0.000000 1.000000 0.000000 64ffffff -1.304265 1.619178 0.074453 0.523332 +-130.426636 51.378860 76.191589 0.000000 1.000000 0.000000 64ffffff -1.304266 0.761916 0.074453 0.480469 +-150.426544 51.378868 161.917786 0.000000 1.000000 0.000000 64ffffff -1.504265 1.619178 0.064453 0.523332 +-150.426636 51.378860 76.191612 -0.000001 0.002123 -0.999998 64ffffff -1.504266 0.513789 0.064453 0.575382 +-130.426636 -40.792046 75.995918 -0.000001 0.002123 -0.999998 64ffffff -1.304266 -0.407920 0.074453 0.529297 +-150.426636 -40.792046 75.995941 -0.000001 0.002123 -0.999998 64ffffff -1.504266 -0.407920 0.064453 0.529297 +-130.426636 51.378860 76.191589 -0.000001 0.002123 -0.999998 64ffffff -1.304266 0.513789 0.074453 0.628117 +-130.426636 -40.792046 75.995918 -0.000001 0.002123 -0.999998 64ffffff -1.304266 -0.407920 0.074453 0.582031 +-150.426636 51.378860 76.191612 -0.000001 0.002123 -0.999998 64ffffff -1.504266 0.513789 0.064453 0.628117 +-150.426636 -40.792046 75.995941 0.000000 -0.999987 0.005069 64ffffff -1.504266 0.759959 0.515625 0.056641 +-130.426620 -40.742058 85.857277 0.000000 -0.999987 0.005069 64ffffff -1.304266 0.858573 0.525625 0.061571 +-150.426636 -40.742058 85.857300 0.000000 -0.999987 0.005069 64ffffff -1.504266 0.858573 0.515625 0.061571 +-130.426636 -40.792046 75.995918 0.000000 -0.999987 0.005069 64ffffff -1.304266 0.759959 0.541250 0.056641 +-130.426620 -40.742058 85.857277 0.000000 -0.999987 0.005069 64ffffff -1.304266 0.858573 0.541250 0.061571 +-150.426636 -40.792046 75.995941 0.000000 -0.999987 0.005069 64ffffff -1.504266 0.759959 0.531250 0.056641 +-150.426636 -40.742058 85.857300 0.000001 0.001240 0.999999 64ffffff -1.504266 -0.407421 0.064453 0.634766 +-130.426620 2.587559 85.803535 0.000001 0.001240 0.999999 64ffffff -1.304266 0.025876 0.074453 0.656430 +-150.426636 2.587559 85.803558 0.000001 0.001240 0.999999 64ffffff -1.504266 0.025876 0.064453 0.656430 +-130.426620 -40.742058 85.857277 0.000001 0.001240 0.999999 64ffffff -1.304266 -0.407421 0.074453 0.662109 +-130.426620 2.587559 85.803535 0.000001 0.001240 0.999999 64ffffff -1.304266 0.025876 0.074453 0.683774 +-150.426636 -40.742058 85.857300 0.000001 0.001240 0.999999 64ffffff -1.504266 -0.407421 0.064453 0.662109 +-150.426636 2.587559 85.803558 0.000001 -0.222521 0.974928 64ffffff -1.504266 0.025876 0.064453 0.689453 +-130.426620 17.293327 89.160034 0.000001 -0.222521 0.974928 64ffffff -1.304266 0.172933 0.074453 0.696806 +-150.426620 17.293327 89.160057 0.000001 -0.222521 0.974928 64ffffff -1.504266 0.172933 0.064453 0.696806 +-130.426620 2.587559 85.803535 0.000001 -0.222521 0.974928 64ffffff -1.304266 0.025876 0.074453 0.703125 +-130.426620 17.293327 89.160034 0.000001 -0.222521 0.974928 64ffffff -1.304266 0.172933 0.074453 0.710478 +-150.426636 2.587559 85.803558 0.000001 -0.222521 0.974928 64ffffff -1.504266 0.025876 0.064453 0.703125 +-150.426620 17.293327 89.160057 0.000001 -0.623490 0.781831 64ffffff -1.504266 0.172933 0.064453 0.716797 +-130.426605 29.086437 98.564728 0.000001 -0.623490 0.781831 64ffffff -1.304266 0.290864 0.074453 0.722693 +-150.426620 29.086437 98.564751 0.000001 -0.623490 0.781831 64ffffff -1.504266 0.290864 0.064453 0.722693 +-130.426620 17.293327 89.160034 0.000001 -0.623490 0.781831 64ffffff -1.304266 0.172933 0.074453 0.728516 +-130.426605 29.086437 98.564728 0.000001 -0.623490 0.781831 64ffffff -1.304266 0.290864 0.074453 0.734412 +-150.426620 17.293327 89.160057 0.000001 -0.623490 0.781831 64ffffff -1.504266 0.172933 0.064453 0.728516 +-150.426620 29.086437 98.564751 0.000000 -0.900969 0.433884 64ffffff -1.504266 0.985647 0.064453 0.740234 +-130.426590 35.631123 112.154900 0.000000 -0.900969 0.433884 64ffffff -1.304266 1.121549 0.074453 0.747029 +-150.426605 35.631123 112.154922 0.000000 -0.900969 0.433884 64ffffff -1.504266 1.121549 0.064453 0.747029 +-130.426605 29.086437 98.564728 0.000000 -0.900969 0.433884 64ffffff -1.304266 0.985647 0.074453 0.751953 +-130.426590 35.631123 112.154900 0.000000 -0.900969 0.433884 64ffffff -1.304266 1.121549 0.074453 0.758748 +-150.426620 29.086437 98.564751 0.000000 -0.900969 0.433884 64ffffff -1.504266 0.985647 0.064453 0.751953 +-150.426605 35.631123 112.154922 0.000000 -1.000000 0.000000 64ffffff -1.504266 1.121549 0.064453 0.763672 +-130.426575 35.631123 127.238861 0.000000 -1.000000 0.000000 64ffffff -1.304266 1.272389 0.074453 0.771214 +-150.426575 35.631123 127.238884 0.000000 -1.000000 0.000000 64ffffff -1.504266 1.272389 0.064453 0.771214 +-130.426590 35.631123 112.154900 0.000000 -1.000000 0.000000 64ffffff -1.304266 1.121549 0.074453 0.777344 +-130.426575 35.631123 127.238861 0.000000 -1.000000 0.000000 64ffffff -1.304266 1.272389 0.074453 0.784886 +-150.426605 35.631123 112.154922 0.000000 -1.000000 0.000000 64ffffff -1.504266 1.121549 0.064453 0.777344 +-150.426605 35.631123 112.154922 -1.000000 0.000001 0.000001 64ffffff 0.356311 1.121549 0.046875 0.928138 +-150.426544 51.378868 161.917786 -1.000000 0.000001 0.000001 64ffffff 0.513789 1.619178 0.054749 0.953019 +-150.426636 51.378860 76.191612 -1.000000 0.000001 0.000001 64ffffff 0.513789 0.761916 0.054749 0.910156 +-130.426636 51.378860 76.191589 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.761916 0.072327 0.791016 +-130.426544 51.378868 161.917770 1.000000 0.000000 -0.000001 64ffffff 0.513789 1.619178 0.072327 0.833879 +-130.426590 35.631123 112.154900 1.000000 0.000000 -0.000001 64ffffff 0.356311 1.121549 0.064453 0.808997 +-150.426636 2.587559 85.803558 -1.000000 0.000000 0.000000 64ffffff 0.025876 0.858036 0.568565 0.061544 +-150.426636 -40.792046 75.995941 -1.000000 0.000000 0.000000 64ffffff -0.407920 0.759959 0.546875 0.056641 +-150.426636 -40.742058 85.857300 -1.000000 0.000000 0.000000 64ffffff -0.407421 0.858573 0.546900 0.061571 +-130.426620 -40.742058 85.857277 1.000000 0.000000 -0.000002 64ffffff -0.407421 0.858573 0.574244 0.061571 +-130.426636 -40.792046 75.995918 1.000000 0.000000 -0.000002 64ffffff -0.407920 0.759959 0.574219 0.056641 +-130.426620 2.587559 85.803535 1.000000 0.000000 -0.000002 64ffffff 0.025876 0.858035 0.595909 0.061544 +-150.426544 51.378868 161.917786 -1.000000 0.000000 0.000001 64ffffff 0.513789 1.619178 0.093177 0.124761 +-150.426575 35.631123 127.238884 -1.000000 0.000000 0.000001 64ffffff 0.356311 1.272389 0.085304 0.107422 +-150.426559 29.086437 140.829056 -1.000000 0.000000 0.000001 64ffffff 0.290864 1.408291 0.082031 0.114217 +-130.426559 29.086437 140.829041 1.000000 0.000000 -0.000001 64ffffff 0.290864 1.408290 0.082031 0.137654 +-130.426575 35.631123 127.238861 1.000000 0.000000 -0.000001 64ffffff 0.356311 1.272389 0.085304 0.130859 +-130.426544 51.378868 161.917770 1.000000 0.000000 -0.000001 64ffffff 0.513789 1.619178 0.093177 0.148199 +-150.426544 2.587555 153.590256 -1.000000 0.000000 0.000003 64ffffff 0.025876 1.535903 0.601563 0.058319 +-150.426544 51.378868 161.917786 -1.000000 0.000000 0.000003 64ffffff 0.513789 1.619178 0.625958 0.062483 +-150.426559 17.293324 150.233749 -1.000000 0.000000 0.000003 64ffffff 0.172933 1.502337 0.608915 0.056641 +-130.426544 17.293324 150.233734 1.000000 0.000000 0.000000 64ffffff 0.172933 1.502337 0.638212 0.056641 +-130.426544 51.378868 161.917770 1.000000 0.000000 0.000000 64ffffff 0.513789 1.619178 0.655255 0.062483 +-130.426544 2.587555 153.590225 1.000000 0.000000 0.000000 64ffffff 0.025876 1.535902 0.630859 0.058319 +-150.426544 -40.562740 162.113464 -1.000000 0.000000 0.000000 64ffffff -0.405627 1.621135 0.720703 0.043324 +-150.426544 51.378868 161.917786 -1.000000 0.000000 0.000000 64ffffff 0.513789 1.619178 0.766674 0.043226 +-150.426544 2.587555 153.590256 -1.000000 0.000000 0.000000 64ffffff 0.025876 1.535903 0.742278 0.039063 +-130.426544 2.587555 153.590225 1.000000 0.000000 0.000000 64ffffff 0.025876 1.535902 0.795013 0.039063 +-130.426544 51.378868 161.917770 1.000000 0.000000 0.000000 64ffffff 0.513789 1.619178 0.819408 0.043226 +-130.426544 -40.562740 162.113449 1.000000 0.000000 0.000000 64ffffff -0.405627 1.621134 0.773438 0.043324 +-150.426559 -40.696247 153.536499 -1.000000 0.000000 0.000002 64ffffff -0.406962 1.535365 0.826172 0.039063 +-150.426544 -40.562740 162.113464 -1.000000 0.000000 0.000002 64ffffff -0.405627 1.621135 0.826239 0.043351 +-150.426544 2.587555 153.590256 -1.000000 0.000000 0.000002 64ffffff 0.025876 1.535903 0.847814 0.039089 +-130.426544 2.587555 153.590225 1.000000 0.000000 -0.000002 64ffffff 0.025876 1.535902 0.875158 0.039089 +-130.426544 -40.562740 162.113449 1.000000 0.000000 -0.000002 64ffffff -0.405627 1.621134 0.853582 0.043351 +-130.426559 -40.696247 153.536484 1.000000 0.000000 -0.000002 64ffffff -0.406962 1.535365 0.853516 0.039063 +-150.426559 17.293324 150.233749 -1.000000 0.000000 0.000000 64ffffff 0.172933 1.502337 0.128906 0.078921 +-150.426544 51.378868 161.917786 -1.000000 0.000000 0.000000 64ffffff 0.513789 1.619178 0.145949 0.084763 +-150.426559 29.086437 140.829056 -1.000000 0.000000 0.000000 64ffffff 0.290864 1.408291 0.134803 0.074219 +-130.426559 29.086437 140.829041 1.000000 0.000000 -0.000001 64ffffff 0.290864 1.408290 0.158240 0.074219 +-130.426544 51.378868 161.917770 1.000000 0.000000 -0.000001 64ffffff 0.513789 1.619178 0.169387 0.084763 +-130.426544 17.293324 150.233734 1.000000 0.000000 -0.000001 64ffffff 0.172933 1.502337 0.152344 0.078921 +-150.426636 -40.792046 75.995941 -1.000000 0.000000 0.000000 64ffffff -0.407920 0.759959 0.660156 0.056641 +-150.426636 2.587559 85.803558 -1.000000 0.000000 0.000000 64ffffff 0.025876 0.858036 0.681846 0.061544 +-150.426636 51.378860 76.191612 -1.000000 0.000000 0.000000 64ffffff 0.513789 0.761916 0.706242 0.056738 +-130.426636 51.378860 76.191589 1.000000 0.000000 -0.000002 64ffffff 0.513789 0.761916 0.758976 0.056738 +-130.426620 2.587559 85.803535 1.000000 0.000000 -0.000002 64ffffff 0.025876 0.858035 0.734580 0.061544 +-130.426636 -40.792046 75.995918 1.000000 0.000000 -0.000002 64ffffff -0.407920 0.759959 0.712891 0.056641 +-150.426636 2.587559 85.803558 -1.000000 0.000000 0.000002 64ffffff 0.025876 0.858036 0.765625 0.061447 +-150.426620 17.293327 89.160057 -1.000000 0.000000 0.000002 64ffffff 0.172933 0.891601 0.772978 0.063125 +-150.426636 51.378860 76.191612 -1.000000 0.000000 0.000002 64ffffff 0.513789 0.761916 0.790021 0.056641 +-130.426636 51.378860 76.191589 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.761916 0.819318 0.056641 +-130.426620 17.293327 89.160034 1.000000 0.000000 -0.000001 64ffffff 0.172933 0.891600 0.802275 0.063125 +-130.426620 2.587559 85.803535 1.000000 0.000000 -0.000001 64ffffff 0.025876 0.858035 0.794922 0.061447 +-150.426620 17.293327 89.160057 -1.000000 0.000000 0.000000 64ffffff 0.172933 0.891601 0.128906 0.096328 +-150.426620 29.086437 98.564751 -1.000000 0.000000 0.000000 64ffffff 0.290864 0.985647 0.134803 0.101030 +-150.426636 51.378860 76.191612 -1.000000 0.000000 0.000000 64ffffff 0.513789 0.761916 0.145949 0.089844 +-130.426636 51.378860 76.191589 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.761916 0.169387 0.089844 +-130.426605 29.086437 98.564728 1.000000 0.000000 -0.000001 64ffffff 0.290864 0.985647 0.158240 0.101030 +-130.426620 17.293327 89.160034 1.000000 0.000000 -0.000001 64ffffff 0.172933 0.891600 0.152344 0.096328 +-150.426620 29.086437 98.564751 -1.000000 0.000000 0.000001 64ffffff 0.290864 0.985647 0.082031 0.165483 +-150.426605 35.631123 112.154922 -1.000000 0.000000 0.000001 64ffffff 0.356311 1.121549 0.085304 0.172279 +-150.426636 51.378860 76.191612 -1.000000 0.000000 0.000001 64ffffff 0.513789 0.761916 0.093177 0.154297 +-130.426636 51.378860 76.191589 1.000000 0.000000 -0.000001 64ffffff 0.513789 0.761916 0.093177 0.177734 +-130.426590 35.631123 112.154900 1.000000 0.000000 -0.000001 64ffffff 0.356311 1.121549 0.085304 0.195716 +-130.426605 29.086437 98.564728 1.000000 0.000000 -0.000001 64ffffff 0.290864 0.985647 0.082031 0.188921 +-150.426544 51.378868 161.917786 -1.000000 -0.000003 0.000002 64ffffff 0.513789 1.619178 0.054749 0.983866 +-150.426605 35.631123 112.154922 -1.000000 -0.000003 0.000002 64ffffff 0.356311 1.121549 0.046875 0.958984 +-150.426575 35.631123 127.238884 -1.000000 -0.000003 0.000002 64ffffff 0.356311 1.272389 0.046875 0.966526 +-130.426575 35.631123 127.238861 1.000000 0.000000 -0.000001 64ffffff 0.356311 1.272389 0.064453 0.847386 +-130.426590 35.631123 112.154900 1.000000 0.000000 -0.000001 64ffffff 0.356311 1.121549 0.064453 0.839844 +-130.426544 51.378868 161.917770 1.000000 0.000000 -0.000001 64ffffff 0.513789 1.619178 0.072327 0.864725 + + +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 +25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 +50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 +75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 +100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 +125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 +150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 +175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 +200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 +225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 +250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 +275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 +300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 +325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 +350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 +375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 +400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 +425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 +450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 +475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 +500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 +525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 +550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 +575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 +600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 +625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 +650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 +675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 +700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 +725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 +750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 +775 776 777 778 779 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-198.610870 -39.363640 162.326416 0.000000 0.000000 -1.000000 64ffffff -1.986109 -0.393636 0.099609 0.107422 +129.228073 51.333405 162.326492 0.000000 0.000000 -1.000000 64ffffff 1.292281 0.513334 0.263529 0.152770 +129.228073 -39.363445 162.326492 0.000000 0.000000 -1.000000 64ffffff 1.292281 -0.393634 0.263529 0.107422 +-198.610870 51.333210 162.326431 0.000000 0.000000 -1.000000 64ffffff -1.986109 0.513332 0.269531 0.152770 +129.228073 51.333405 162.326492 0.000000 0.000000 -1.000000 64ffffff 1.292281 0.513334 0.433451 0.152770 +-198.610870 -39.363640 162.326416 0.000000 0.000000 -1.000000 64ffffff -1.986109 -0.393636 0.269531 0.107422 +129.228058 -39.363445 -61.869892 0.000000 0.000000 1.000000 64ffffff 1.292281 -0.393634 0.603373 0.107422 +-198.610886 51.333210 -61.869953 0.000000 0.000000 1.000000 64ffffff -1.986109 0.513332 0.439453 0.152770 +-198.610886 -39.363640 -61.869953 0.000000 0.000000 1.000000 64ffffff -1.986109 -0.393636 0.439453 0.107422 +129.228058 51.333405 -61.869884 0.000000 0.000000 1.000000 64ffffff 1.292281 0.513334 0.773295 0.152770 +-198.610886 51.333210 -61.869953 0.000000 0.000000 1.000000 64ffffff -1.986109 0.513332 0.609375 0.152770 +129.228058 -39.363445 -61.869892 0.000000 0.000000 1.000000 64ffffff 1.292281 -0.393634 0.773295 0.107422 +129.228073 -39.363445 162.326492 -1.000000 0.000000 0.000000 64ffffff -0.393634 1.623265 0.099609 0.270301 +129.228058 51.333405 -61.869884 -1.000000 0.000000 0.000000 64ffffff 0.513334 -0.618699 0.144958 0.158203 +129.228058 -39.363445 -61.869892 -1.000000 0.000000 0.000000 64ffffff -0.393634 -0.618699 0.099609 0.158203 +129.228073 51.333405 162.326492 -1.000000 0.000000 0.000000 64ffffff 0.513334 1.623265 0.144958 0.387489 +129.228058 51.333405 -61.869884 -1.000000 0.000000 0.000000 64ffffff 0.513334 -0.618699 0.144958 0.275391 +129.228073 -39.363445 162.326492 -1.000000 0.000000 0.000000 64ffffff -0.393634 1.623265 0.099609 0.387489 +-198.610870 51.333210 162.326431 0.000001 -1.000000 0.000000 64ffffff -1.986109 1.623264 0.150391 0.270301 +129.228058 51.333405 -61.869884 0.000001 -1.000000 0.000000 64ffffff 1.292281 -0.618699 0.314310 0.158203 +129.228073 51.333405 162.326492 0.000001 -1.000000 0.000000 64ffffff 1.292281 1.623265 0.314310 0.270301 +-198.610886 51.333210 -61.869953 0.000001 -1.000000 0.000000 64ffffff -1.986109 -0.618699 0.320313 0.158203 +129.228058 51.333405 -61.869884 0.000001 -1.000000 0.000000 64ffffff 1.292281 -0.618699 0.484232 0.158203 +-198.610870 51.333210 162.326431 0.000001 -1.000000 0.000000 64ffffff -1.986109 1.623264 0.320313 0.270301 +-198.610870 -39.363640 162.326416 1.000000 0.000000 0.000000 64ffffff -0.393636 1.623264 0.099609 0.504676 +-198.610886 51.333210 -61.869953 1.000000 0.000000 0.000000 64ffffff 0.513332 -0.618699 0.144958 0.392578 +-198.610870 51.333210 162.326431 1.000000 0.000000 0.000000 64ffffff 0.513332 1.623264 0.144958 0.504676 +-198.610886 -39.363640 -61.869953 1.000000 0.000000 0.000000 64ffffff -0.393636 -0.618699 0.099609 0.509766 +-198.610886 51.333210 -61.869953 1.000000 0.000000 0.000000 64ffffff 0.513332 -0.618699 0.144958 0.509766 +-198.610870 -39.363640 162.326416 1.000000 0.000000 0.000000 64ffffff -0.393636 1.623264 0.099609 0.621864 +-198.610870 -39.363640 162.326416 -0.000001 1.000000 0.000000 64ffffff -1.986109 1.623264 0.490234 0.270301 +129.228058 -39.363445 -61.869892 -0.000001 1.000000 0.000000 64ffffff 1.292281 -0.618699 0.654154 0.158203 +-198.610886 -39.363640 -61.869953 -0.000001 1.000000 0.000000 64ffffff -1.986109 -0.618699 0.490234 0.158203 +129.228073 -39.363445 162.326492 -0.000001 1.000000 0.000000 64ffffff 1.292281 1.623265 0.824076 0.270301 +129.228058 -39.363445 -61.869892 -0.000001 1.000000 0.000000 64ffffff 1.292281 -0.618699 0.824076 0.158203 +-198.610870 -39.363640 162.326416 -0.000001 1.000000 0.000000 64ffffff -1.986109 1.623264 0.660156 0.270301 + + +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 +25 26 27 28 29 30 31 32 33 34 35 + + + \ No newline at end of file diff --git a/test/models/IRR/dawfInCellar_ChildOfCellar.irr b/test/models/IRR/dawfInCellar_ChildOfCellar.irr index fd2c80ae7..b9fa20c6a 100644 --- a/test/models/IRR/dawfInCellar_ChildOfCellar.irr +++ b/test/models/IRR/dawfInCellar_ChildOfCellar.irr @@ -19,7 +19,7 @@ - + @@ -33,8 +33,8 @@ - - + + @@ -71,8 +71,8 @@ - - + + @@ -113,7 +113,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -165,7 +165,7 @@ - + diff --git a/test/models/IRR/dawfInCellar_ChildOfCellar_UTF16LE.irr b/test/models/IRR/dawfInCellar_ChildOfCellar_UTF16LE.irr index 698530d3ae82b215d0e886047e6cfaca47d60871..aba42e94ded98bf46ee6e502a12083bd34211ee0 100644 GIT binary patch delta 60 zcmZo!&G=&_ - + @@ -33,8 +33,8 @@ - - + + @@ -71,8 +71,8 @@ - - + + @@ -115,7 +115,7 @@ - + @@ -129,7 +129,7 @@ - + @@ -167,7 +167,7 @@ - + diff --git a/test/models/IRR/dawfInCellar_SameHierarchy_UTF16LE.irr b/test/models/IRR/dawfInCellar_SameHierarchy_UTF16LE.irr index 83d4ab93268633be3fddabd308b869bf098b73e6..a4e7cc951533a80a69b7ba566102245d0527ebb4 100644 GIT binary patch delta 103 zcmeyjg7MRG#tlzcH~(TaV43W|Rkis7*Dv154L_KyHpr*xKljjASY`&vxz`_Y}O$5*d+#2G@TtyvsJ|x+6t8PgEk2ooM diff --git a/test/models/IRR/drkwood2.jpg b/test/models/IRR/drkwood2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ca470306cd6b18ae65e9d718cd2183a6ffa9a10 GIT binary patch literal 203856 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

W_ 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

t9NFC`n)ZvmTzNl_P+Bs^uKfK?5ApAc; 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�Ytf^|v=9cvoNIe)7AW09UMQ*K5_+>yOF4xI` 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Ÿ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 MWB@!P-kaV3+4ZIGmjD0& literal 0 HcmV?d00001 diff --git a/test/models/IRR/dwarf.jpg b/test/models/IRR/dwarf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c07e003892d360d3fcc3dcb157cd30d38710d2f GIT binary patch literal 84158 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

XI7%{?`>pG`+%O+1>HmVt@w15}xFmC)N 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�kzP*&$>v$bJ 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 literal 0 HcmV?d00001 diff --git a/test/models/IRR/dwarf.x b/test/models/IRR/dwarf.x new file mode 100644 index 000000000..0fb7be0d2 --- /dev/null +++ b/test/models/IRR/dwarf.x @@ -0,0 +1,18480 @@ +xof 0303txt 0032 + +// DirectX - from MilkShape3D + +template XSkinMeshHeader +{ + <3CF169CE-FF7C-44AB-93C0-F78F62D172E2> + WORD nMaxSkinWeightsPerVertex; + WORD nMaxSkinWeightsPerFace; + WORD nBones; +} + +template VertexDuplicationIndices +{ + + DWORD nIndices; + DWORD nOriginalVertices; + array DWORD indices[nIndices]; +} + +template SkinWeights +{ + <6F0D123B-BAD2-4167-A0D0-80224F25FABB> + CSTRING transformNodeName; + DWORD nWeights; + array DWORD vertexIndices[nWeights]; + array FLOAT weights[nWeights]; + Matrix4x4 matrixOffset; +} + +Frame base +{ + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.011608,-0.015192,0.000000,1.000000;; + } + + Frame middle + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.173034,30.221760,0.000000,1.000000;; + } + + Frame lhip + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -5.191007,-3.469861,0.000000,1.000000;; + } + + Frame lknee + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -1.903369,-8.817497,0.000000,1.000000;; + } + + Frame lankle + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -1.557302,-12.873290,3.507543,1.000000;; + } + + Frame ltoe + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.083542,-2.837912,-5.268192,1.000000;; + } + } + } + } + } + + Frame rhip + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 5.883141,-2.951185,0.000000,1.000000;; + } + + Frame rknee + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 1.557302,-9.681957,0.000000,1.000000;; + } + + Frame rankle + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 1.038201,-13.046183,3.507543,1.000000;; + } + + Frame rtoe + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.161076,-2.268395,-5.055357,1.000000;; + } + } + } + } + } + + Frame spine2 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.008257,4.071795,0.000000,1.000000;; + } + + Frame Joint75 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.007980,5.843795,0.000000,1.000000;; + } + + Frame Joint76 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.033215,5.642583,0.000000,1.000000;; + } + + Frame spine1 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.057544,3.129822,0.000000,1.000000;; + } + + Frame head + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.000000,4.183402,0.000000,1.000000;; + } + + Frame Joint36 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 2.351048,-2.969238,-5.128667,1.000000;; + } + + Frame Joint39 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 2.521163,-4.102684,-2.779583,1.000000;; + } + + Frame Joint40 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 1.543145,-3.721243,-0.884647,1.000000;; + } + + Frame Joint41 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.857303,-3.157324,-0.940437,1.000000;; + } + } + } + } + } + + Frame Joint37 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -2.844125,-3.130046,-5.128667,1.000000;; + } + + Frame Joint38 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -2.314107,-4.198860,-2.779583,1.000000;; + } + + Frame Joint42 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -1.200224,-3.209697,-0.885387,1.000000;; + } + + Frame Joint43 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -1.285954,-3.696030,-0.939697,1.000000;; + } + } + } + } + } + + Frame top + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.311274,14.438549,-1.107615,1.000000;; + } + } + } + + Frame pad2 + { + FrameTransformMatrix + { + 0.986286,0.165048,0.000000,0.000000, + -0.159424,0.952679,0.258819,0.000000, + 0.042717,-0.255270,0.965926,0.000000, + -6.280235,3.399014,0.000000,1.000000;; + } + } + + Frame pad1 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 5.233529,3.529747,0.000000,1.000000;; + } + } + + Frame lsholda + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -10.711074,-1.732187,3.529744,1.000000;; + } + + Frame lelbo + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -6.541911,-5.098517,0.705949,1.000000;; + } + + Frame lwrist + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -7.850295,-6.405833,0.000000,1.000000;; + } + + Frame Joint17 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -3.663469,-3.660475,0.000000,1.000000;; + } + + Frame Joint18 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -1.046706,-2.091701,0.000000,1.000000;; + } + + Frame Joint19 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.130838,-3.137549,0.000000,1.000000;; + } + } + } + } + + Frame Joint20 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.261676,-4.314132,-3.481931,1.000000;; + } + + Frame Joint21 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -1.046704,-2.483894,0.000000,1.000000;; + } + } + } + } + } + } + + Frame rsholda + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 9.986465,-1.438042,3.529744,1.000000;; + } + + Frame relbo + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 6.803588,-5.359982,0.705949,1.000000;; + } + + Frame rwrist + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 8.373647,-6.798027,0.000000,1.000000;; + } + + Frame Joint25 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 3.663469,-3.137551,0.000000,1.000000;; + } + + Frame Joint26 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 1.046706,-2.353162,0.000000,1.000000;; + } + + Frame Joint27 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.261676,-2.876088,0.000000,1.000000;; + } + } + } + } + + Frame Joint28 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.785030,-4.183402,-2.034320,1.000000;; + } + + Frame Joint29 + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.261676,-2.483894,0.000000,1.000000;; + } + } + } + + Frame weapon + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 1.700897,-4.837056,0.000000,1.000000;; + } + + Frame end + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.179647,0.498486,-36.421711,1.000000;; + } + + Frame hit + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 9.751877,-17.324219,-0.896412,1.000000;; + } + } + } + } + } + } + } + } + } + } + } + } + + Frame Body + { + FrameTransformMatrix + { + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 0.000000,0.000000,0.000000,1.000000;; + } + + Mesh test2Mesh + { + 1479; + 9.163393;52.592094;5.311051;, + 9.238389;48.717903;7.829298;, + 4.414237;48.688927;8.841169;, + 3.635573;52.340664;5.854128;, + 9.163393;53.140781;0.434684;, + 4.689968;52.717564;0.392938;, + 9.088393;49.163322;-4.030602;, + 4.688091;48.439060;-3.863904;, + 9.163393;53.331882;5.609362;, + 9.238389;49.283154;8.325875;, + 11.722147;50.016842;7.103333;, + 14.414900;52.402100;5.129919;, + 9.163393;53.906952;0.104077;, + 14.609170;52.948395;0.154898;, + 9.088393;49.657726;-4.596818;, + 12.538961;51.131771;-3.441837;, + 11.743780;49.455685;6.606065;, + 3.657926;53.078899;6.152925;, + 4.392604;49.250080;9.338439;, + 14.392547;51.663868;4.831122;, + 4.714078;53.482971;0.062556;, + 14.585064;52.182983;0.485280;, + 4.665834;48.929771;-4.430783;, + 12.561217;50.641060;-2.874957;, + -3.841073;48.688927;8.841169;, + -8.665230;48.717903;7.829298;, + -8.590232;52.592094;5.311051;, + -3.062412;52.340664;5.854128;, + -8.590232;53.140781;0.434684;, + -4.116807;52.717564;0.392938;, + -8.515234;49.163322;-4.030602;, + -4.114926;48.439060;-3.863904;, + -11.148983;50.016842;7.103333;, + -8.665230;49.283154;8.325875;, + -8.590232;53.331882;5.609362;, + -13.841740;52.402100;5.129919;, + -8.590232;53.906952;0.104077;, + -14.036011;52.948395;0.154898;, + -8.515234;49.657726;-4.596818;, + -11.965799;51.131771;-3.441837;, + -11.170617;49.455685;6.606065;, + -3.084766;53.078899;6.152925;, + -3.819439;49.250080;9.338439;, + -13.819386;51.663868;4.831122;, + -4.140916;53.482971;0.062556;, + -14.011902;52.182983;0.485280;, + -4.092670;48.929771;-4.430783;, + -11.988054;50.641060;-2.874957;, + 4.242009;58.884743;2.570855;, + 1.719232;58.884743;4.326951;, + 1.719237;56.180134;3.868141;, + 4.136295;56.180134;2.112046;, + 4.610723;58.899246;1.076627;, + 4.437895;58.255383;1.427657;, + 5.073560;57.831852;-0.831290;, + 5.188532;58.921978;-0.146142;, + 2.365810;57.220150;-5.311353;, + 2.389302;57.854408;-5.411583;, + 3.446397;57.361095;-4.919837;, + 1.418339;57.462894;-5.428807;, + 1.960295;58.125488;-6.407607;, + 3.297620;58.189804;-5.624568;, + 0.916452;57.514851;-5.702876;, + 0.196953;57.775261;-6.329302;, + 0.196953;58.155617;-6.759973;, + 0.564816;57.560535;-6.329302;, + 0.196953;56.507580;-7.229795;, + 0.708737;56.429287;-6.994888;, + 4.421278;57.862228;-4.019349;, + 1.112585;56.335316;-6.608064;, + 0.196953;55.849838;-7.151498;, + 0.582964;55.818516;-6.994890;, + 0.896177;55.674747;-6.525379;, + 1.417937;56.238544;-6.527757;, + 1.563801;56.421631;-5.875276;, + 1.501053;55.516430;-5.925784;, + 1.252991;55.717010;-6.405910;, + 1.410475;56.510334;-5.864188;, + 3.431264;58.838142;-5.428817;, + 4.623211;58.867786;-3.862747;, + 1.890343;58.877293;-6.329304;, + 0.196953;58.892124;-6.759975;, + 0.196953;55.386570;-6.432980;, + 1.338982;55.451138;-5.933945;, + 0.777895;55.360485;-5.945277;, + 1.571026;56.366024;-5.339862;, + 1.571026;55.436707;-5.446356;, + 1.861757;55.585438;-5.471374;, + 1.884718;56.220394;-5.389740;, + 2.329635;56.396385;-5.213789;, + 2.469955;55.050526;-5.128000;, + 3.372011;56.456528;-4.812878;, + 3.374272;54.561684;-4.943109;, + 4.306293;56.502014;-3.484852;, + 3.994818;55.254379;-3.108994;, + 4.901477;58.929310;-2.285047;, + 4.795761;57.729420;-2.282111;, + 4.617773;56.512859;-2.432453;, + 1.247561;54.160404;-6.036166;, + 1.628837;53.851963;-5.425615;, + 1.488684;53.503712;-5.567427;, + 1.076976;53.568111;-6.080726;, + 0.196953;54.323627;-6.546213;, + 0.196953;53.731537;-6.538884;, + 0.196953;55.284870;-6.817455;, + 0.951778;55.293880;-6.407505;, + 1.324306;54.522755;-6.402828;, + 0.196953;54.639961;-6.854869;, + 1.651121;55.311077;-5.924803;, + 1.872430;54.120838;-6.092515;, + 2.486549;54.906082;-5.613785;, + 1.896263;53.393780;-5.016593;, + 3.004211;54.377865;-5.643836;, + 2.416372;53.485512;-6.018716;, + 4.294228;53.059486;-5.110569;, + 4.603637;53.194355;-4.556661;, + 3.353439;52.269436;-6.323624;, + 3.164008;52.026455;-5.518155;, + 2.831037;52.120289;-6.667702;, + 1.427815;53.126896;-6.581466;, + 0.196953;53.319347;-7.071489;, + 4.258074;51.279964;-6.929201;, + 0.196953;51.218552;-7.671501;, + 1.286211;51.037498;-7.819720;, + 0.196953;48.516830;-4.831125;, + 0.906312;47.223148;-6.323102;, + 2.390713;50.135826;-8.501509;, + 5.147715;49.761192;-2.113228;, + 5.483280;49.024506;-7.912204;, + 3.519759;47.640644;-8.922348;, + 2.230943;45.983410;-6.837262;, + 5.862195;46.566502;-7.827096;, + 6.063165;47.270485;-4.336467;, + 5.817128;46.143192;-6.768289;, + 4.771815;46.200104;-8.748175;, + 4.112585;45.550518;-7.827313;, + 5.082815;53.401516;-0.452015;, + 5.082815;55.802074;-0.757885;, + 6.278196;45.850166;-8.067322;, + 6.233131;45.426857;-7.008514;, + 5.187818;45.483761;-8.988400;, + 4.528587;44.834175;-8.067539;, + 7.751843;45.219013;-8.465691;, + 7.664405;44.397705;-6.411367;, + 5.636263;44.508118;-10.252790;, + 4.357210;43.247772;-8.466115;, + 7.991459;42.205650;-8.873802;, + 7.938428;41.592506;-7.636380;, + 6.708311;41.659477;-9.966291;, + 5.932536;40.895046;-8.882633;, + 7.677983;38.542618;-9.851732;, + 0.196953;58.884743;4.326951;, + 0.196953;56.180134;3.868141;, + 4.401065;56.646732;1.280575;, + 4.430346;55.772125;0.639352;, + 0.196953;53.862251;5.027995;, + 2.420499;53.751408;4.068233;, + 4.104025;53.089230;2.761263;, + 4.926210;51.548302;1.105534;, + 0.196953;51.306179;5.766455;, + 2.537956;50.579800;4.794079;, + 4.280571;49.732357;3.256207;, + 5.337671;48.582260;0.821585;, + 5.337671;47.371635;-1.636148;, + 0.196953;59.059555;4.940836;, + 1.877897;59.059555;4.940958;, + 5.022821;59.059555;2.991112;, + 5.431325;59.075630;1.332422;, + 6.073157;59.100891;-0.026047;, + 5.753413;59.109047;-2.406004;, + 5.444712;59.040668;-4.160086;, + 4.124426;59.007809;-5.896048;, + 2.070525;59.051250;-6.894945;, + 0.196953;59.067738;-7.373756;, + 0.196953;60.034519;4.932486;, + 1.875382;60.034519;4.933323;, + 5.012119;60.034527;2.990359;, + 5.413950;60.050449;1.339854;, + 6.055133;60.075699;-0.018468;, + 5.730547;60.083881;-2.419671;, + 5.424481;60.015327;-4.181113;, + 4.127413;59.982983;-5.894018;, + 2.082769;60.026131;-6.883855;, + 0.196953;60.042675;-7.364650;, + 0.196953;61.891335;4.474140;, + 2.119642;61.891335;4.476328;, + 4.312335;61.891335;2.701971;, + 4.631948;61.891903;1.199314;, + 5.159706;61.892818;-0.050380;, + 4.883253;61.893120;-2.302159;, + 4.635466;61.890621;-3.937706;, + 3.606839;61.889484;-5.468257;, + 2.316901;61.891026;-6.361181;, + 0.196953;61.891628;-6.807594;, + 0.196953;63.485386;2.934556;, + 1.273063;63.485386;2.936174;, + 2.932324;63.485386;1.646364;, + 3.173945;63.485817;0.554150;, + 3.573367;63.486504;-0.354457;, + 3.363917;63.486732;-1.992494;, + 3.176482;63.484837;-3.181942;, + 2.398919;63.483986;-4.293848;, + 1.422985;63.485149;-4.942707;, + 0.196953;63.485607;-5.267362;, + 0.196953;64.502686;-1.390165;, + -1.325331;58.884743;4.326951;, + -3.848105;58.884743;2.570855;, + -3.742393;56.180134;2.112046;, + -1.325334;56.180134;3.868141;, + -4.043993;58.255383;1.427657;, + -4.216822;58.899246;1.076627;, + -4.794626;58.921978;-0.146142;, + -4.679657;57.831852;-0.831290;, + -3.052497;57.361095;-4.919837;, + -1.995399;57.854408;-5.411583;, + -1.971910;57.220150;-5.311353;, + -1.024434;57.462894;-5.428807;, + -2.903716;58.189804;-5.624568;, + -1.566390;58.125488;-6.407607;, + -0.522547;57.514851;-5.702876;, + -0.170911;57.560535;-6.329302;, + -0.314837;56.429287;-6.994888;, + -4.027374;57.862228;-4.019349;, + -0.718680;56.335316;-6.608064;, + -0.189061;55.818516;-6.994890;, + -0.502274;55.674747;-6.525379;, + -1.169898;56.421631;-5.875276;, + -1.024032;56.238544;-6.527757;, + -0.859088;55.717010;-6.405910;, + -1.107148;55.516430;-5.925784;, + -1.016574;56.510334;-5.864188;, + -4.229308;58.867786;-3.862747;, + -3.037360;58.838142;-5.428817;, + -1.496442;58.877293;-6.329304;, + -0.383995;55.360485;-5.945277;, + -0.945081;55.451138;-5.933945;, + -1.177125;55.436707;-5.446356;, + -1.177123;56.366024;-5.339862;, + -1.490817;56.220394;-5.389740;, + -1.467852;55.585438;-5.471374;, + -1.935732;56.396385;-5.213789;, + -2.076050;55.050526;-5.128000;, + -2.978111;56.456528;-4.812878;, + -2.980371;54.561684;-4.943109;, + -3.912392;56.502014;-3.484852;, + -3.600917;55.254379;-3.108994;, + -4.507572;58.929310;-2.285047;, + -4.401859;57.729420;-2.282111;, + -4.223874;56.512859;-2.432453;, + -1.234934;53.851963;-5.425615;, + -0.853661;54.160404;-6.036166;, + -0.683076;53.568111;-6.080726;, + -1.094784;53.503712;-5.567427;, + -0.557873;55.293880;-6.407505;, + -0.930401;54.522755;-6.402828;, + -1.257221;55.311077;-5.924803;, + -1.478527;54.120838;-6.092515;, + -2.092644;54.906082;-5.613785;, + -1.502358;53.393780;-5.016593;, + -2.022469;53.485512;-6.018716;, + -2.610310;54.377865;-5.643836;, + -3.900326;53.059486;-5.110569;, + -4.209735;53.194355;-4.556661;, + -2.959539;52.269436;-6.323624;, + -2.770105;52.026455;-5.518155;, + -1.033910;53.126896;-6.581466;, + -2.437134;52.120289;-6.667702;, + -3.864171;51.279964;-6.929201;, + -0.892305;51.037498;-7.819720;, + -0.512412;47.223148;-6.323102;, + -1.996812;50.135826;-8.501509;, + -4.753813;49.761192;-2.113228;, + -5.089376;49.024506;-7.912204;, + -3.125859;47.640644;-8.922348;, + -1.837040;45.983410;-6.837262;, + -5.468292;46.566502;-7.827096;, + -5.423228;46.143192;-6.768289;, + -5.669262;47.270485;-4.336467;, + -4.377913;46.200104;-8.748175;, + -3.718686;45.550518;-7.827313;, + -4.688914;53.401516;-0.452015;, + -4.688914;55.802074;-0.757885;, + -5.884295;45.850166;-8.067322;, + -5.839230;45.426857;-7.008514;, + -4.793914;45.483761;-8.988400;, + -4.134687;44.834175;-8.067539;, + -7.357939;45.219013;-8.465691;, + -7.270504;44.397705;-6.411367;, + -5.242361;44.508118;-10.252790;, + -3.963310;43.247772;-8.466115;, + -7.597560;42.205650;-8.873802;, + -7.544526;41.592506;-7.636380;, + -6.314410;41.659477;-9.966291;, + -5.538635;40.895046;-8.882633;, + -7.284081;38.542618;-9.851732;, + -4.036447;55.772125;0.639352;, + -4.007164;56.646732;1.280575;, + -2.026598;53.751408;4.068233;, + -4.532308;51.548302;1.105534;, + -3.710120;53.089230;2.761263;, + -2.144051;50.579800;4.794079;, + -3.886670;49.732357;3.256207;, + -4.943766;48.582260;0.821585;, + -4.943766;47.371635;-1.636148;, + -1.483993;59.059555;4.940958;, + -4.628918;59.059555;2.991112;, + -5.037425;59.075630;1.332422;, + -5.679255;59.100891;-0.026047;, + -5.359512;59.109047;-2.406004;, + -5.050810;59.040668;-4.160086;, + -3.730523;59.007809;-5.896048;, + -1.676620;59.051250;-6.894945;, + -1.481479;60.034519;4.933323;, + -4.618215;60.034527;2.990359;, + -5.020047;60.050449;1.339854;, + -5.661230;60.075699;-0.018468;, + -5.336645;60.083881;-2.419671;, + -5.030577;60.015327;-4.181113;, + -3.733512;59.982983;-5.894018;, + -1.688867;60.026131;-6.883855;, + -1.725740;61.891335;4.476328;, + -3.918436;61.891335;2.701971;, + -4.238046;61.891903;1.199314;, + -4.765804;61.892818;-0.050380;, + -4.489351;61.893120;-2.302159;, + -4.241562;61.890621;-3.937706;, + -3.212934;61.889484;-5.468257;, + -1.923000;61.891026;-6.361181;, + -0.879161;63.485386;2.936174;, + -2.538420;63.485386;1.646364;, + -2.780046;63.485817;0.554150;, + -3.179467;63.486504;-0.354457;, + -2.970013;63.486732;-1.992494;, + -2.782579;63.484837;-3.181942;, + -2.005019;63.483986;-4.293848;, + -1.029080;63.485149;-4.942707;, + -0.192284;65.158386;-0.267689;, + -0.617771;65.158386;-1.004657;, + -0.014429;64.035477;-1.004657;, + 0.109390;64.035477;-0.790199;, + 0.234013;67.669022;-1.022976;, + 0.658695;65.158386;-0.267689;, + 0.357023;64.035477;-0.790199;, + 1.084181;65.158386;-1.004657;, + 0.480839;64.035477;-1.004657;, + 0.658695;65.158386;-1.741625;, + 0.357023;64.035477;-1.219115;, + -0.192284;65.158386;-1.741625;, + 0.109390;64.035477;-1.219115;, + 7.321572;63.560955;-0.055478;, + 7.050604;63.754948;-1.851895;, + 2.748468;63.025620;-1.582111;, + 2.822511;62.793049;0.228580;, + 7.863518;62.050617;0.503212;, + 2.702447;60.765869;0.971560;, + 8.134492;60.734272;-0.734516;, + 2.776194;59.416355;-0.247001;, + 7.863518;60.928257;-2.530933;, + 2.702447;59.647991;-2.050448;, + 7.321572;62.438591;-3.089625;, + 2.822511;61.670685;-2.805565;, + 9.181485;64.333855;-2.066042;, + 9.632345;64.462769;-1.100490;, + 10.534081;64.061180;-0.951941;, + 10.984941;63.530704;-1.768948;, + 10.534077;63.401791;-2.734500;, + 9.632351;63.803379;-2.883049;, + 10.870568;67.072159;-2.811351;, + 11.125603;67.210205;-2.340091;, + 11.635665;67.146370;-2.316478;, + 11.890695;66.944496;-2.764128;, + 11.635665;66.806458;-3.235387;, + 11.125603;66.870285;-3.259001;, + 10.770185;70.864441;-4.091156;, + -2.175307;63.025620;-1.582111;, + -6.477442;63.754936;-1.851895;, + -6.748413;63.560955;-0.055478;, + -2.249351;62.793049;0.228580;, + -7.290359;62.050617;0.503212;, + -2.129283;60.765858;0.971560;, + -7.561328;60.734272;-0.734516;, + -2.203030;59.416344;-0.247001;, + -7.290359;60.928257;-2.530933;, + -2.129283;59.647991;-2.050448;, + -6.748413;62.438591;-3.089625;, + -2.249351;61.670685;-2.805565;, + -8.608323;64.333855;-2.066042;, + -9.059186;64.462769;-1.100490;, + -9.960917;64.061180;-0.951941;, + -10.411779;63.530704;-1.768948;, + -9.960917;63.401791;-2.734500;, + -9.059186;63.803379;-2.883049;, + -10.297409;67.072159;-2.811351;, + -10.552441;67.210205;-2.340091;, + -11.062504;67.146370;-2.316479;, + -11.317535;66.944496;-2.764129;, + -11.062504;66.806458;-3.235389;, + -10.552441;66.870285;-3.259001;, + -10.197022;70.864441;-4.091156;, + 9.278677;42.422218;6.029630;, + 3.269274;42.720932;10.305261;, + 3.727235;37.106018;10.305261;, + 8.567321;37.947166;6.627038;, + 3.076538;53.204800;4.651457;, + 0.063876;53.173985;0.844661;, + 1.636344;53.091850;6.132280;, + 10.371579;42.720932;0.675551;, + 10.590998;38.832512;-0.519268;, + 4.213577;53.047283;0.988064;, + 8.567321;42.720932;-4.893595;, + 8.567321;40.015377;-5.275937;, + 3.118487;52.304691;-0.871308;, + 3.269272;42.644463;-8.265944;, + 3.269272;40.303337;-8.724752;, + 1.678248;51.885815;-2.496562;, + 0.063876;40.303337;-8.724752;, + 0.063876;42.644463;-8.265944;, + 8.092727;46.706837;7.085848;, + 4.030234;47.533649;9.387641;, + 7.498330;46.932663;-3.808702;, + 9.269650;46.553898;-0.745430;, + 2.860954;47.304241;-6.201300;, + 0.063876;47.304241;-6.201299;, + 6.308704;51.898582;5.810977;, + 2.260517;51.022770;7.858276;, + 6.308704;51.061012;-1.528991;, + 7.708933;51.749233;0.002558;, + 2.260515;49.875748;-3.830782;, + 0.063876;53.091850;6.132280;, + 0.063876;51.405113;7.858276;, + 0.063876;42.720932;10.305261;, + 0.063876;37.106018;10.305261;, + 0.063876;51.885815;-2.496561;, + 0.063876;47.533646;9.378681;, + 0.063876;49.952217;-4.021954;, + 9.563355;51.572124;5.130688;, + 10.424463;51.137897;0.771196;, + -3.599484;37.106018;10.305261;, + -3.141526;42.720932;10.305261;, + -9.150930;42.422218;6.029630;, + -8.439575;37.947166;6.627038;, + -1.508598;53.091850;6.132280;, + -2.948791;53.204800;4.651457;, + -10.243833;42.720932;0.675551;, + -10.463250;38.832512;-0.519268;, + -4.085828;53.047283;0.988064;, + -8.439575;42.720932;-4.893595;, + -8.439575;40.015377;-5.275937;, + -2.990738;52.304691;-0.871308;, + -3.141523;42.644463;-8.265944;, + -3.141523;40.303337;-8.724752;, + -1.550497;51.885815;-2.496562;, + -3.902486;47.533649;9.387641;, + -7.964980;46.706837;7.085848;, + -9.141901;46.553898;-0.745430;, + -7.370583;46.932663;-3.808702;, + -2.733205;47.304241;-6.201300;, + -2.132767;51.022770;7.858276;, + -6.180955;51.898582;5.810977;, + -7.581183;51.749233;0.002558;, + -6.180955;51.061012;-1.528991;, + -2.132767;49.875748;-3.830782;, + -9.435607;51.572124;5.130688;, + -10.296713;51.137897;0.771196;, + 26.442608;31.439417;2.804749;, + 27.750952;33.479103;1.464946;, + 28.644909;31.793991;1.543602;, + 27.650051;30.546118;1.966592;, + 27.962191;30.422531;4.730635;, + 25.291662;35.616783;6.993527;, + 23.804535;33.790108;6.865523;, + 28.113920;30.947910;7.563584;, + 29.418135;32.175655;7.563584;, + 26.276403;37.035873;5.267626;, + 29.144712;26.626286;4.498936;, + 30.605154;26.898275;4.811452;, + 30.184065;26.943773;6.619426;, + 29.278811;26.812195;6.619426;, + 23.970884;33.278522;4.380921;, + 26.921537;36.568802;3.461252;, + 25.464495;35.399422;1.973382;, + 29.121349;26.822264;2.423525;, + 29.903082;27.052881;2.157598;, + 23.995649;32.729515;1.987316;, + 25.637072;33.964241;0.536960;, + 25.396690;32.550930;-0.123384;, + 24.000338;31.858027;1.237716;, + 24.161800;33.391464;3.241510;, + 29.999184;32.499008;5.227734;, + 26.998781;32.694099;1.064689;, + 25.652718;30.935171;2.198134;, + 25.432625;28.413658;0.334064;, + 26.032991;29.244349;-0.349298;, + 26.852461;29.841438;0.779249;, + 26.386019;28.977617;1.267885;, + 26.512205;31.188791;1.184134;, + 25.206884;31.094601;-0.305392;, + 23.991529;30.626995;0.930952;, + 30.933636;29.712465;5.072928;, + 30.310335;29.777977;7.264207;, + 28.988699;28.980301;7.299366;, + 28.432882;29.246729;4.638216;, + 29.648125;29.915192;1.703345;, + 28.309542;29.520292;2.073250;, + 6.755167;0.046006;8.013719;, + 5.431096;0.088037;3.223917;, + 12.250779;0.088037;3.300384;, + 5.309235;0.894232;2.923214;, + 12.009439;0.731735;2.923214;, + 4.846424;0.413626;-6.580339;, + 7.194882;0.034675;-8.202744;, + 10.442262;0.175008;-8.276375;, + 5.897818;0.168155;0.023152;, + 11.833355;0.047754;-6.787080;, + 12.240962;0.175049;0.374328;, + 6.753324;1.573865;7.859301;, + 5.310324;1.516512;3.522007;, + 10.324868;0.327974;8.243123;, + 10.323023;1.855839;8.088705;, + 12.010524;1.354014;3.522007;, + 7.195130;0.874356;-8.201875;, + 10.442509;1.014684;-8.275504;, + 4.846746;1.253311;-6.580090;, + 11.833675;0.887438;-6.786831;, + 5.898684;1.007790;0.014234;, + 12.241827;1.014688;0.365411;, + 8.078106;3.698104;-7.581497;, + 11.428559;3.021991;-6.440265;, + 5.468536;3.167656;-5.998088;, + 5.238337;3.089141;-2.541014;, + 11.932255;2.791543;-3.152129;, + 8.602904;5.932668;-0.505548;, + 11.133778;5.817454;1.389889;, + 8.140334;4.399764;-4.469068;, + 8.224634;5.036399;-2.774021;, + 11.898876;5.830766;3.514578;, + 5.863575;5.809277;1.057280;, + 4.953313;5.817947;3.744911;, + 5.601276;5.822373;6.464175;, + 7.258355;5.792872;6.393783;, + 10.561975;5.836313;6.220846;, + 3.714457;19.327164;5.891222;, + 2.395580;19.017778;1.623937;, + 2.663392;17.355799;1.982380;, + 3.977465;17.241997;5.800620;, + 6.098813;19.432480;7.503632;, + 6.110166;17.147745;7.382187;, + 9.150031;20.134617;6.603466;, + 9.390180;17.139515;5.800619;, + 12.296237;20.290672;1.623937;, + 12.022444;17.723486;1.982380;, + 9.151049;19.982052;-2.746684;, + 9.045196;17.139517;-1.835862;, + 6.099829;19.279917;-4.705683;, + 6.618869;17.147745;-3.417428;, + 3.568517;19.174599;-2.746683;, + 3.743971;17.241997;-1.835860;, + 2.744522;21.981775;7.255371;, + 0.781750;21.713270;1.998527;, + 5.311180;23.393459;9.200554;, + 8.947892;24.840387;7.668663;, + 12.009036;25.446686;1.982380;, + 8.947892;24.362463;-3.649055;, + 5.311180;22.915539;-6.179790;, + 2.633436;21.656416;-3.632905;, + 1.563167;23.850784;8.223292;, + 0.063876;23.353767;1.793407;, + 9.435429;28.020374;7.743168;, + 8.477934;28.887068;-4.569030;, + 11.027375;30.391527;0.493318;, + 3.810796;27.047464;-6.897249;, + 0.063876;24.272585;-4.193496;, + 13.090539;50.522636;1.384549;, + 13.041045;50.467754;5.078930;, + 15.039926;48.268642;5.106739;, + 15.654872;48.436718;2.094133;, + 9.371727;37.438923;7.067486;, + 4.033619;36.444157;10.870089;, + 11.587032;38.454742;-0.613277;, + 9.381097;39.704651;-5.891787;, + 3.585032;40.004971;-9.656940;, + 0.063876;40.004971;-9.656940;, + 8.947521;33.780930;6.792171;, + 4.207292;33.892616;11.120209;, + 11.152753;32.194057;-0.597313;, + 9.604399;31.258600;-5.890305;, + 3.468354;30.257090;-9.461814;, + 0.063876;30.257090;-9.461814;, + 8.336151;33.208889;6.506425;, + 3.972105;33.252815;10.523578;, + 10.880808;31.578617;-0.480340;, + 8.391865;30.899374;-5.411129;, + 3.229546;29.783400;-8.733105;, + 0.063876;29.783400;-8.733105;, + 8.763739;31.230478;7.043343;, + 0.063876;25.862223;-6.032537;, + 0.063876;36.444157;10.870090;, + 0.063876;33.892616;11.120211;, + 0.063876;33.252815;10.523581;, + 0.063876;24.095449;8.763750;, + 0.063876;25.246412;10.275227;, + 0.063876;31.503160;10.970792;, + 4.717443;31.494150;10.284621;, + 0.063876;27.969845;11.631809;, + 5.059318;27.174917;10.768083;, + 3.292733;13.614117;8.688048;, + 2.012897;13.266646;2.479012;, + 7.391886;13.045812;9.537921;, + 9.592052;13.108393;8.535723;, + 13.927161;13.699846;2.063019;, + 11.253488;12.661762;-3.185383;, + 7.687788;12.915033;-4.890432;, + 3.292731;13.091016;-3.337706;, + 4.909685;14.315273;6.833395;, + 3.449045;14.019177;2.395389;, + 7.335181;13.898731;7.254448;, + 8.640161;14.192272;6.638759;, + 12.054080;14.385403;1.847208;, + 10.983072;13.852963;-1.636501;, + 7.731716;13.866605;-2.741714;, + 4.956770;13.926673;-1.904490;, + 4.622008;12.070519;7.351222;, + 3.704210;12.065571;2.885277;, + 7.193317;12.063840;7.696905;, + 9.864344;12.084161;6.936748;, + 12.660480;12.906409;2.302423;, + 11.551223;11.698577;-0.567342;, + 7.725829;10.867992;-1.832680;, + 5.002745;10.862820;-0.929778;, + 12.585479;45.664989;7.008708;, + 12.874625;45.344864;-1.512470;, + 15.109089;43.486977;7.253585;, + 13.087454;40.435127;5.464614;, + 13.795866;40.778912;1.743529;, + 15.452188;43.225502;-0.514091;, + 16.849886;45.784691;5.345008;, + 17.423424;46.063019;2.332403;, + 16.609575;42.436638;6.842184;, + 14.607471;39.414421;5.619863;, + 15.315888;39.758205;1.898780;, + 16.952673;42.175163;0.809246;, + 18.329708;44.705509;5.492955;, + 18.903246;44.983837;2.480351;, + 18.144800;40.845119;8.897065;, + 14.914027;35.968437;6.910757;, + 16.068686;36.528782;0.845695;, + 18.704021;40.418938;-0.936131;, + 20.914110;44.495216;6.691762;, + 21.848928;44.948868;1.781464;, + 18.167065;40.766296;8.049853;, + 15.450755;36.687752;6.384915;, + 16.415583;37.133137;1.422668;, + 18.616444;40.429634;-0.082681;, + 20.535810;43.903175;6.157079;, + 21.299704;44.256214;2.222467;, + 20.548147;39.083851;7.840796;, + 18.160057;35.498848;6.365007;, + 19.018757;35.895241;1.948607;, + 20.948095;38.784222;0.303311;, + 22.625053;41.832062;6.150033;, + 23.304918;42.146267;2.648228;, + 23.432049;37.018097;6.817175;, + 21.932474;34.767567;5.880031;, + 23.302208;36.315411;2.154666;, + 22.480751;35.020664;3.060161;, + 24.731340;38.735447;5.732314;, + 25.165438;38.936066;3.496411;, + 23.626654;36.826782;1.797030;, + -28.517160;31.793991;1.543602;, + -27.623203;33.479103;1.464946;, + -26.314863;31.439417;2.804749;, + -27.522303;30.546118;1.966592;, + -27.834438;30.422531;4.730635;, + -27.986174;30.947910;7.563584;, + -23.676790;33.790108;6.865523;, + -25.163914;35.616783;6.993527;, + -29.290388;32.175655;7.563584;, + -26.148655;37.035873;5.267626;, + -30.056318;26.943773;6.619426;, + -30.477406;26.898275;4.811452;, + -29.016966;26.626286;4.498936;, + -29.151058;26.812195;6.619426;, + -23.843136;33.278522;4.380921;, + -25.336742;35.399422;1.973382;, + -26.793785;36.568802;3.461252;, + -29.775337;27.052881;2.157598;, + -28.993601;26.822264;2.423525;, + -25.268938;32.550930;-0.123384;, + -25.509323;33.964241;0.536960;, + -23.867901;32.729515;1.987316;, + -23.872589;31.858027;1.237716;, + -24.034052;33.391464;3.241510;, + -29.871441;32.499008;5.227734;, + -26.871038;32.694099;1.064689;, + -25.524969;30.935171;2.198134;, + -26.724709;29.841438;0.779249;, + -25.905239;29.244349;-0.349298;, + -25.304882;28.413658;0.334064;, + -26.258276;28.977617;1.267885;, + -25.079140;31.094601;-0.305392;, + -26.384459;31.188791;1.184134;, + -23.863787;30.626995;0.930952;, + -30.805887;29.712465;5.072928;, + -30.182587;29.777977;7.264207;, + -28.860950;28.980301;7.299366;, + -28.305138;29.246729;4.638216;, + -29.520382;29.915192;1.703345;, + -28.181793;29.520292;2.073250;, + -12.123036;0.088037;3.300384;, + -5.303345;0.088037;3.223917;, + -6.627419;0.046006;8.013719;, + -11.881689;0.731735;2.923214;, + -5.181487;0.894232;2.923214;, + -10.314516;0.175008;-8.276375;, + -7.067134;0.034675;-8.202744;, + -4.718675;0.413626;-6.580339;, + -11.705606;0.047754;-6.787080;, + -5.770067;0.168155;0.023152;, + -12.113213;0.175049;0.374328;, + -5.182574;1.516512;3.522007;, + -6.625576;1.573865;7.859301;, + -10.195277;1.855839;8.088705;, + -10.197120;0.327974;8.243123;, + -11.882777;1.354014;3.522007;, + -10.314760;1.014684;-8.275504;, + -7.067381;0.874356;-8.201875;, + -4.718995;1.253311;-6.580090;, + -11.705929;0.887438;-6.786831;, + -5.770934;1.007790;0.014234;, + -12.114079;1.014688;0.365411;, + -11.300814;3.021991;-6.440265;, + -7.950356;3.698104;-7.581497;, + -5.340785;3.167656;-5.998088;, + -5.110586;3.089141;-2.541014;, + -11.804509;2.791543;-3.152129;, + -11.006028;5.817454;1.389889;, + -8.475157;5.932668;-0.505548;, + -8.096884;5.036399;-2.774021;, + -8.012587;4.399764;-4.469068;, + -11.771126;5.830766;3.514578;, + -5.735826;5.809277;1.057280;, + -4.825563;5.817947;3.744911;, + -5.473527;5.822373;6.464175;, + -7.130609;5.792872;6.393783;, + -10.434228;5.836313;6.220846;, + -2.535641;17.355799;1.982380;, + -2.267831;19.017778;1.623937;, + -3.586708;19.327164;5.891222;, + -3.849715;17.241997;5.800620;, + -5.971066;19.432480;7.503632;, + -5.982419;17.147745;7.382187;, + -9.022285;20.134617;6.603466;, + -9.262430;17.139515;5.800619;, + -12.168489;20.290672;1.623937;, + -11.894694;17.723486;1.982380;, + -9.023302;19.982052;-2.746684;, + -8.917446;17.139517;-1.835862;, + -5.972082;19.279917;-4.705683;, + -6.491119;17.147745;-3.417428;, + -3.440768;19.174599;-2.746683;, + -3.616219;17.241997;-1.835860;, + -0.653999;21.713270;1.998527;, + -2.616775;21.981775;7.255371;, + -5.183431;23.393459;9.200554;, + -8.820147;24.840387;7.668663;, + -11.881289;25.446686;1.982380;, + -8.820147;24.362463;-3.649055;, + -5.183429;22.915539;-6.179790;, + -2.505685;21.656416;-3.632905;, + -1.435419;23.850784;8.223292;, + -9.307683;28.020374;7.743168;, + -10.899626;30.391527;0.493318;, + -8.350187;28.887068;-4.569030;, + -3.683043;27.047464;-6.897249;, + -14.912179;48.268642;5.106739;, + -12.913298;50.467754;5.078930;, + -12.962790;50.522636;1.384549;, + -15.527129;48.436718;2.094133;, + -9.243979;37.438923;7.067486;, + -3.905869;36.444157;10.870089;, + -11.459283;38.454742;-0.613277;, + -9.253351;39.704651;-5.891787;, + -3.457279;40.004971;-9.656940;, + -8.819773;33.780930;6.792171;, + -4.079543;33.892616;11.120209;, + -11.025005;32.194057;-0.597313;, + -9.476652;31.258600;-5.890305;, + -3.340604;30.257090;-9.461814;, + -8.208400;33.208889;6.506425;, + -3.844355;33.252815;10.523578;, + -10.753060;31.578617;-0.480340;, + -8.264114;30.899374;-5.411129;, + -3.101796;29.783400;-8.733105;, + -8.635990;31.230478;7.043343;, + -4.589693;31.494150;10.284621;, + -4.931572;27.174917;10.768083;, + -3.164983;13.614117;8.688048;, + -1.885150;13.266646;2.479012;, + -7.264134;13.045812;9.537921;, + -9.464302;13.108393;8.535723;, + -13.799416;13.699846;2.063019;, + -11.125739;12.661762;-3.185383;, + -7.560040;12.915033;-4.890432;, + -3.164983;13.091016;-3.337706;, + -4.781938;14.315273;6.833395;, + -3.321296;14.019177;2.395389;, + -7.207436;13.898731;7.254448;, + -8.512415;14.192272;6.638759;, + -11.926332;14.385403;1.847208;, + -10.855326;13.852963;-1.636501;, + -7.603969;13.866605;-2.741714;, + -4.829021;13.926673;-1.904490;, + -4.494260;12.070519;7.351222;, + -3.576463;12.065571;2.885277;, + -7.065567;12.063840;7.696905;, + -9.736598;12.084161;6.936748;, + -12.532731;12.906409;2.302423;, + -11.423474;11.698577;-0.567342;, + -7.598082;10.867992;-1.832680;, + -4.874997;10.862820;-0.929778;, + -12.457731;45.664989;7.008708;, + -12.746877;45.344864;-1.512470;, + -14.981347;43.486977;7.253585;, + -12.959704;40.435127;5.464614;, + -13.668120;40.778912;1.743529;, + -15.324445;43.225502;-0.514091;, + -16.722143;45.784691;5.345008;, + -17.295679;46.063019;2.332403;, + -16.481831;42.436638;6.842184;, + -14.479725;39.414421;5.619863;, + -15.188142;39.758205;1.898780;, + -16.824930;42.175163;0.809246;, + -18.201963;44.705509;5.492955;, + -18.775501;44.983837;2.480351;, + -18.017056;40.845119;8.897065;, + -14.786280;35.968437;6.910757;, + -15.940937;36.528782;0.845695;, + -18.576277;40.418938;-0.936131;, + -20.786366;44.495216;6.691762;, + -21.721182;44.948868;1.781464;, + -18.039320;40.766296;8.049853;, + -15.323012;36.687752;6.384915;, + -16.287840;37.133137;1.422668;, + -18.488697;40.429634;-0.082681;, + -20.408064;43.903175;6.157079;, + -21.171957;44.256214;2.222467;, + -20.420401;39.083851;7.840796;, + -18.032312;35.498848;6.365007;, + -18.891008;35.895241;1.948607;, + -20.820349;38.784222;0.303311;, + -22.497307;41.832062;6.150033;, + -23.177174;42.146267;2.648228;, + -23.304302;37.018097;6.817175;, + -21.804729;34.767567;5.880031;, + -22.353006;35.020664;3.060161;, + -23.174463;36.315411;2.154666;, + -24.603598;38.735447;5.732314;, + -25.037689;38.936066;3.496411;, + -23.498907;36.826782;1.797030;, + 32.573399;20.998508;-13.993474;, + 31.347282;21.510612;-18.896196;, + 32.212158;19.942856;-22.086969;, + 34.386311;17.725908;-19.577688;, + 32.721909;19.000187;-25.473017;, + 35.309505;16.038933;-24.075357;, + 32.861069;18.711260;-28.951471;, + 35.487915;15.668485;-28.535112;, + 32.625397;19.084837;-32.416637;, + 35.185760;16.147453;-32.977818;, + 32.022045;20.109577;-35.763229;, + 34.412201;17.461275;-37.268509;, + 31.069363;21.754337;-38.889565;, + 33.190762;19.570044;-41.276810;, + 30.172787;23.316404;-40.686150;, + 30.727213;23.864517;-46.026169;, + 26.799459;29.484686;-23.919806;, + 26.588755;29.721081;-34.907444;, + 28.314373;26.659443;-35.908363;, + 28.665804;26.196402;-23.140169;, + 29.684425;24.219271;-37.460514;, + 30.009434;23.747953;-29.136843;, + 30.314682;23.305275;-21.319128;, + 33.628345;20.744303;-22.096889;, + 32.763477;22.312052;-18.906120;, + 34.138103;19.801640;-25.482931;, + 34.277260;19.512701;-28.961386;, + 34.041592;19.886280;-32.426556;, + 33.438240;20.911032;-35.773148;, + 32.485558;22.555790;-38.899498;, + 31.588987;24.117847;-40.696075;, + 29.730568;27.460878;-35.918262;, + 28.004946;30.522528;-34.917355;, + 28.215664;30.286123;-23.929716;, + 30.082003;26.997847;-23.150089;, + 31.425623;24.549398;-29.146767;, + 31.100611;25.020727;-37.470440;, + 31.730875;24.106718;-21.329044;, + 28.887688;30.497171;16.516956;, + 28.264534;31.576502;16.538700;, + 27.273039;30.284517;16.527586;, + 28.868330;30.531387;14.265285;, + 28.245173;31.610723;14.287043;, + 28.430216;31.305752;-36.706051;, + 26.815575;31.093081;-36.695400;, + 27.807066;32.385075;-36.684288;, + 28.565001;29.293274;16.501442;, + 28.545649;29.327480;14.249776;, + 28.107540;30.101837;-36.721565;, + 27.485502;28.670019;16.501251;, + 27.466146;28.704229;14.249575;, + 27.028032;29.478594;-36.721748;, + 26.281548;28.992525;16.516499;, + 26.262192;29.026735;14.264828;, + 25.824083;29.801088;-36.706490;, + 25.658390;30.071863;16.538246;, + 25.639032;30.106077;14.286580;, + 25.200922;30.880438;-36.684742;, + 25.981071;31.275770;16.553751;, + 25.961720;31.309975;14.302090;, + 25.523605;32.084339;-36.669224;, + 27.060581;31.899025;16.553940;, + 27.041225;31.933235;14.302281;, + 26.603115;32.707592;-36.669060;, + 28.548414;31.096832;-22.954752;, + 27.925262;32.176163;-22.932991;, + 28.111961;31.846174;-1.211521;, + 28.735117;30.766836;-1.233276;, + 28.225733;29.892931;-22.970266;, + 28.412436;29.562933;-1.248788;, + 27.146231;29.269676;-22.970453;, + 27.332933;28.939684;-1.248984;, + 25.942278;29.592182;-22.955206;, + 26.128983;29.262184;-1.233739;, + 25.319118;30.671524;-22.933453;, + 25.505823;30.341524;-1.211982;, + 25.641800;31.875427;-22.917944;, + 25.828506;31.545427;-1.196465;, + 26.721312;32.498676;-22.917738;, + 26.908014;32.168686;-1.196282;, + 29.272268;30.830444;-0.798965;, + 28.443258;32.266331;-0.770020;, + 28.568949;32.044174;13.852868;, + 29.397957;30.608292;13.823928;, + 28.842997;29.228819;-0.819599;, + 28.968679;29.006672;13.803288;, + 27.406893;28.399687;-0.819852;, + 27.532579;28.177542;13.803031;, + 25.805210;28.828726;-0.799567;, + 25.930891;28.606585;13.823323;, + 24.976185;30.264614;-0.770632;, + 25.101870;30.042463;13.852263;, + 25.405474;31.866238;-0.749988;, + 25.531157;31.644094;13.872904;, + 26.841581;32.695370;-0.749732;, + 26.967262;32.473228;13.873165;, + 27.815252;32.370605;-35.731056;, + 28.438414;31.291262;-35.752815;, + 28.115726;30.087366;-35.768326;, + 27.036226;29.464113;-35.768520;, + 25.832272;29.786617;-35.753273;, + 25.209120;30.865946;-35.731510;, + 25.531799;32.069855;-35.715992;, + 26.611311;32.693104;-35.715794;, + 29.151377;31.385166;-35.757492;, + 28.253050;32.941086;-35.726151;, + 28.363062;32.746647;-22.928093;, + 29.261381;31.190737;-22.959444;, + 28.686214;29.649672;-35.779873;, + 28.796217;29.455244;-22.981829;, + 27.130047;28.751215;-35.780151;, + 27.240047;28.556789;-22.982094;, + 25.394470;29.216141;-35.758179;, + 25.504477;29.021709;-22.960121;, + 24.496161;30.772045;-35.726803;, + 24.606161;30.577616;-22.928751;, + 24.961311;32.507545;-35.704453;, + 25.071318;32.313114;-22.906395;, + 26.517492;33.405987;-35.704166;, + 26.627487;33.211575;-22.906115;, + 4.623211;58.867786;-3.862747;, + 4.421278;57.862228;-4.019349;, + 4.306293;56.502014;-3.484852;, + 3.994818;55.254379;-3.108994;, + 5.147715;49.761192;-2.113228;, + 6.278196;45.850166;-8.067322;, + 6.233131;45.426857;-7.008514;, + 7.751843;45.219013;-8.465691;, + 4.528587;44.834175;-8.067539;, + 5.187818;45.483761;-8.988400;, + 5.636263;44.508118;-10.252790;, + 7.664405;44.397705;-6.411367;, + 4.357210;43.247772;-8.466115;, + 7.991459;42.205650;-8.873802;, + 6.708311;41.659477;-9.966291;, + 7.938428;41.592506;-7.636380;, + 5.932536;40.895046;-8.882633;, + 7.677983;38.542618;-9.851732;, + 7.677983;38.542618;-9.851732;, + 4.401065;56.646732;1.280575;, + 4.437895;58.255383;1.427657;, + 4.430346;55.772125;0.639352;, + 5.337671;47.371635;-1.636148;, + 4.610723;58.899246;1.076627;, + 0.196953;58.884743;4.326951;, + 1.719232;58.884743;4.326951;, + 4.242009;58.884743;2.570855;, + 4.610723;58.899246;1.076627;, + 5.188532;58.921978;-0.146142;, + 4.901477;58.929310;-2.285047;, + 4.623211;58.867786;-3.862747;, + 3.431264;58.838142;-5.428817;, + 1.890343;58.877293;-6.329304;, + 0.196953;58.892124;-6.759975;, + 0.196953;61.891335;4.474140;, + 2.119642;61.891335;4.476328;, + 4.312335;61.891335;2.701971;, + 4.631948;61.891903;1.199314;, + 5.159706;61.892818;-0.050380;, + 4.883253;61.893120;-2.302159;, + 4.635466;61.890621;-3.937706;, + 3.606839;61.889484;-5.468257;, + 2.316901;61.891026;-6.361181;, + 0.196953;61.891628;-6.807594;, + -4.753813;49.761192;-2.113228;, + -5.884295;45.850166;-8.067322;, + -5.839230;45.426857;-7.008514;, + -7.357939;45.219013;-8.465691;, + -4.134687;44.834175;-8.067539;, + -5.242361;44.508118;-10.252790;, + -4.793914;45.483761;-8.988400;, + -7.270504;44.397705;-6.411367;, + -3.963310;43.247772;-8.466115;, + -7.597560;42.205650;-8.873802;, + -6.314410;41.659477;-9.966291;, + -7.544526;41.592506;-7.636380;, + -5.538635;40.895046;-8.882633;, + -7.284081;38.542618;-9.851732;, + -7.284081;38.542618;-9.851732;, + -4.043993;58.255383;1.427657;, + -4.007164;56.646732;1.280575;, + -4.036447;55.772125;0.639352;, + -4.943766;47.371635;-1.636148;, + -4.216822;58.899246;1.076627;, + 0.196953;58.884743;4.326951;, + 0.196953;59.059555;4.940836;, + -1.325331;58.884743;4.326951;, + -3.848105;58.884743;2.570855;, + -4.216822;58.899246;1.076627;, + -4.794626;58.921978;-0.146142;, + -4.507572;58.929310;-2.285047;, + -4.229308;58.867786;-3.862747;, + -3.037360;58.838142;-5.428817;, + -1.496442;58.877293;-6.329304;, + 0.196953;60.034519;4.932486;, + 0.196953;61.891335;4.474140;, + -1.725740;61.891335;4.476328;, + -3.918436;61.891335;2.701971;, + -4.238046;61.891903;1.199314;, + -4.765804;61.892818;-0.050380;, + -4.489351;61.893120;-2.302159;, + -4.241562;61.890621;-3.937706;, + -3.212934;61.889484;-5.468257;, + -1.923000;61.891026;-6.361181;, + -0.192284;65.158386;-0.267689;, + 0.109390;64.035477;-0.790199;, + 0.234013;67.669022;-1.022976;, + 0.658695;65.158386;-0.267689;, + 0.357023;64.035477;-0.790199;, + 0.658695;65.158386;-1.741625;, + 0.357023;64.035477;-1.219115;, + -0.192284;65.158386;-1.741625;, + 0.234013;67.669022;-1.022976;, + 7.050604;63.754948;-1.851895;, + 2.748468;63.025620;-1.582111;, + 9.181485;64.333855;-2.066042;, + 10.870568;67.072159;-2.811351;, + -6.477442;63.754936;-1.851895;, + -2.175307;63.025620;-1.582111;, + -8.608323;64.333855;-2.066042;, + -10.297409;67.072159;-2.811351;, + 9.278677;42.422218;6.029630;, + 8.567321;37.947166;6.627038;, + 10.371579;42.720932;0.675551;, + 10.590998;38.832512;-0.519268;, + 0.063876;53.173985;0.844661;, + 4.213577;53.047283;0.988064;, + 9.269650;46.553898;-0.745430;, + 6.308704;51.061012;-1.528991;, + 7.708933;51.749233;0.002558;, + 7.708933;51.749233;0.002558;, + 6.308704;51.898582;5.810977;, + 8.092727;46.706837;7.085848;, + 0.063876;53.173985;0.844661;, + -8.439575;37.947166;6.627038;, + -9.150930;42.422218;6.029630;, + -10.463250;38.832512;-0.519268;, + -10.243833;42.720932;0.675551;, + -4.085828;53.047283;0.988064;, + -9.141901;46.553898;-0.745430;, + -6.180955;51.061012;-1.528991;, + 0.063876;51.405113;7.858276;, + 0.063876;53.091850;6.132280;, + -7.581183;51.749233;0.002558;, + -7.581183;51.749233;0.002558;, + 0.063876;42.720932;10.305261;, + 0.063876;37.106018;10.305261;, + 0.063876;47.533646;9.378681;, + -7.964980;46.706837;7.085848;, + -6.180955;51.898582;5.810977;, + 26.442608;31.439417;2.804749;, + 28.644909;31.793991;1.543602;, + 27.650051;30.546118;1.966592;, + 29.418135;32.175655;7.563584;, + 25.291662;35.616783;6.993527;, + 28.113920;30.947910;7.563584;, + 23.804535;33.790108;6.865523;, + 23.995649;32.729515;1.987316;, + 24.161800;33.391464;3.241510;, + 25.464495;35.399422;1.973382;, + 30.310335;29.777977;7.264207;, + 28.988699;28.980301;7.299366;, + 29.648125;29.915192;1.703345;, + 28.309542;29.520292;2.073250;, + 30.184065;26.943773;6.619426;, + 29.278811;26.812195;6.619426;, + 29.121349;26.822264;2.423525;, + 29.903082;27.052881;2.157598;, + 6.755167;0.046006;8.013719;, + 12.250779;0.088037;3.300384;, + 12.009439;0.731735;2.923214;, + 5.309235;0.894232;2.923214;, + 5.431096;0.088037;3.223917;, + 7.194882;0.034675;-8.202744;, + 4.846424;0.413626;-6.580339;, + 10.442262;0.175008;-8.276375;, + 5.897818;0.168155;0.023152;, + 11.833355;0.047754;-6.787080;, + 12.240962;0.175049;0.374328;, + 10.442509;1.014684;-8.275504;, + 4.846746;1.253311;-6.580090;, + 7.195130;0.874356;-8.201875;, + 5.468536;3.167656;-5.998088;, + 4.846746;1.253311;-6.580090;, + 11.428559;3.021991;-6.440265;, + 12.241827;1.014688;0.365411;, + 11.833675;0.887438;-6.786831;, + 11.932255;2.791543;-3.152129;, + 11.133778;5.817454;1.389889;, + 12.010524;1.354014;3.522007;, + 5.898684;1.007790;0.014234;, + 5.310324;1.516512;3.522007;, + 6.753324;1.573865;7.859301;, + 5.601276;5.822373;6.464175;, + 10.323023;1.855839;8.088705;, + 5.238337;3.089141;-2.541014;, + 5.863575;5.809277;1.057280;, + 2.395580;19.017778;1.623937;, + 2.663392;17.355799;1.982380;, + 0.781750;21.713270;1.998527;, + 0.063876;23.353767;1.793407;, + 8.567321;37.947166;6.627038;, + 3.727235;37.106018;10.305261;, + 10.590998;38.832512;-0.519268;, + 8.567321;40.015377;-5.275937;, + 3.269272;40.303337;-8.724752;, + 0.063876;40.303337;-8.724752;, + 10.880808;31.578617;-0.480340;, + 8.336151;33.208889;6.506425;, + 8.391865;30.899374;-5.411129;, + 3.229546;29.783400;-8.733105;, + 0.063876;29.783400;-8.733105;, + 0.063876;37.106018;10.305261;, + 3.972105;33.252815;10.523578;, + 0.063876;33.252815;10.523581;, + 3.977465;17.241997;5.800620;, + 2.663392;17.355799;1.982380;, + 6.110166;17.147745;7.382187;, + 9.390180;17.139515;5.800619;, + 6.110166;17.147745;7.382187;, + 7.391886;13.045812;9.537921;, + 12.022444;17.723486;1.982380;, + 9.045196;17.139517;-1.835862;, + 6.618869;17.147745;-3.417428;, + 3.743971;17.241997;-1.835860;, + 3.743971;17.241997;-1.835860;, + 3.292731;13.091016;-3.337706;, + 7.335181;13.898731;7.254448;, + 4.956770;13.926673;-1.904490;, + 4.909685;14.315273;6.833395;, + 3.449045;14.019177;2.395389;, + 7.335181;13.898731;7.254448;, + 4.909685;14.315273;6.833395;, + 4.622008;12.070519;7.351222;, + 8.640161;14.192272;6.638759;, + 12.054080;14.385403;1.847208;, + 8.640161;14.192272;6.638759;, + 9.864344;12.084161;6.936748;, + 10.983072;13.852963;-1.636501;, + 7.731716;13.866605;-2.741714;, + 10.983072;13.852963;-1.636501;, + 11.551223;11.698577;-0.567342;, + 4.956770;13.926673;-1.904490;, + 4.956770;13.926673;-1.904490;, + 5.002745;10.862820;-0.929778;, + 5.601276;5.822373;6.464175;, + 7.258355;5.792872;6.393783;, + 10.561975;5.836313;6.220846;, + 11.898876;5.830766;3.514578;, + 11.133778;5.817454;1.389889;, + 8.602904;5.932668;-0.505548;, + 4.953313;5.817947;3.744911;, + 8.078106;3.698104;-7.581497;, + 5.468536;3.167656;-5.998088;, + 10.323023;1.855839;8.088705;, + 10.561975;5.836313;6.220846;, + 11.428559;3.021991;-6.440265;, + 10.324868;0.327974;8.243123;, + 11.833675;0.887438;-6.786831;, + 6.753324;1.573865;7.859301;, + 5.601276;5.822373;6.464175;, + 10.561975;5.836313;6.220846;, + 11.133778;5.817454;1.389889;, + 10.371579;42.720932;0.675551;, + 9.278677;42.422218;6.029630;, + 10.371579;42.720932;0.675551;, + 13.795866;40.778912;1.743529;, + 15.315888;39.758205;1.898780;, + 16.609575;42.436638;6.842184;, + 14.607471;39.414421;5.619863;, + 15.315888;39.758205;1.898780;, + 16.952673;42.175163;0.809246;, + 14.914027;35.968437;6.910757;, + 14.607471;39.414421;5.619863;, + 18.329708;44.705509;5.492955;, + 18.144800;40.845119;8.897065;, + 18.903246;44.983837;2.480351;, + 15.450755;36.687752;6.384915;, + 18.167065;40.766296;8.049853;, + 18.160057;35.498848;6.365007;, + 21.932474;34.767567;5.880031;, + 25.291662;35.616783;6.993527;, + 23.804535;33.790108;6.865523;, + 23.970884;33.278522;4.380921;, + 23.804535;33.790108;6.865523;, + 26.276403;37.035873;5.267626;, + 26.921537;36.568802;3.461252;, + -25.163914;35.616783;6.993527;, + -29.290388;32.175655;7.563584;, + -23.676790;33.790108;6.865523;, + -27.986174;30.947910;7.563584;, + -25.336742;35.399422;1.973382;, + -24.034052;33.391464;3.241510;, + -23.867901;32.729515;1.987316;, + -30.182587;29.777977;7.264207;, + -28.860950;28.980301;7.299366;, + -30.056318;26.943773;6.619426;, + -29.151058;26.812195;6.619426;, + -6.627419;0.046006;8.013719;, + -12.123036;0.088037;3.300384;, + -11.881689;0.731735;2.923214;, + -5.303345;0.088037;3.223917;, + -5.181487;0.894232;2.923214;, + -7.067134;0.034675;-8.202744;, + -4.718675;0.413626;-6.580339;, + -10.314516;0.175008;-8.276375;, + -5.770067;0.168155;0.023152;, + -11.705606;0.047754;-6.787080;, + -12.113213;0.175049;0.374328;, + -10.314760;1.014684;-8.275504;, + -7.067381;0.874356;-8.201875;, + -4.718995;1.253311;-6.580090;, + -4.718995;1.253311;-6.580090;, + -5.340785;3.167656;-5.998088;, + -12.114079;1.014688;0.365411;, + -11.300814;3.021991;-6.440265;, + -11.705929;0.887438;-6.786831;, + -11.804509;2.791543;-3.152129;, + -11.882777;1.354014;3.522007;, + -11.006028;5.817454;1.389889;, + -5.770934;1.007790;0.014234;, + -5.182574;1.516512;3.522007;, + -5.473527;5.822373;6.464175;, + -6.625576;1.573865;7.859301;, + -10.195277;1.855839;8.088705;, + -5.735826;5.809277;1.057280;, + -5.110586;3.089141;-2.541014;, + -2.267831;19.017778;1.623937;, + -2.535641;17.355799;1.982380;, + -0.653999;21.713270;1.998527;, + -3.599484;37.106018;10.305261;, + -8.439575;37.947166;6.627038;, + -10.463250;38.832512;-0.519268;, + -8.439575;40.015377;-5.275937;, + -3.141523;40.303337;-8.724752;, + -8.208400;33.208889;6.506425;, + -10.753060;31.578617;-0.480340;, + -8.264114;30.899374;-5.411129;, + -3.101796;29.783400;-8.733105;, + -3.844355;33.252815;10.523578;, + -2.535641;17.355799;1.982380;, + -3.849715;17.241997;5.800620;, + -5.982419;17.147745;7.382187;, + -5.982419;17.147745;7.382187;, + -9.262430;17.139515;5.800619;, + -7.264134;13.045812;9.537921;, + -11.894694;17.723486;1.982380;, + -8.917446;17.139517;-1.835862;, + -6.491119;17.147745;-3.417428;, + -3.616219;17.241997;-1.835860;, + -3.616219;17.241997;-1.835860;, + -3.164983;13.091016;-3.337706;, + -7.207436;13.898731;7.254448;, + -4.829021;13.926673;-1.904490;, + -3.321296;14.019177;2.395389;, + -4.781938;14.315273;6.833395;, + -4.781938;14.315273;6.833395;, + -7.207436;13.898731;7.254448;, + -4.494260;12.070519;7.351222;, + -8.512415;14.192272;6.638759;, + -8.512415;14.192272;6.638759;, + -11.926332;14.385403;1.847208;, + -9.736598;12.084161;6.936748;, + -10.855326;13.852963;-1.636501;, + -10.855326;13.852963;-1.636501;, + -7.603969;13.866605;-2.741714;, + -11.423474;11.698577;-0.567342;, + -4.829021;13.926673;-1.904490;, + -4.829021;13.926673;-1.904490;, + -4.874997;10.862820;-0.929778;, + -5.473527;5.822373;6.464175;, + -7.130609;5.792872;6.393783;, + -10.434228;5.836313;6.220846;, + -11.771126;5.830766;3.514578;, + -11.006028;5.817454;1.389889;, + -8.475157;5.932668;-0.505548;, + -4.825563;5.817947;3.744911;, + -5.340785;3.167656;-5.998088;, + -7.950356;3.698104;-7.581497;, + -10.434228;5.836313;6.220846;, + -10.195277;1.855839;8.088705;, + -11.300814;3.021991;-6.440265;, + -10.197120;0.327974;8.243123;, + -11.705929;0.887438;-6.786831;, + -6.625576;1.573865;7.859301;, + -5.473527;5.822373;6.464175;, + -10.434228;5.836313;6.220846;, + -11.006028;5.817454;1.389889;, + -10.243833;42.720932;0.675551;, + -9.150930;42.422218;6.029630;, + -10.243833;42.720932;0.675551;, + -13.668120;40.778912;1.743529;, + -15.188142;39.758205;1.898780;, + -14.479725;39.414421;5.619863;, + -16.481831;42.436638;6.842184;, + -16.824930;42.175163;0.809246;, + -15.188142;39.758205;1.898780;, + -14.479725;39.414421;5.619863;, + -14.786280;35.968437;6.910757;, + -18.201963;44.705509;5.492955;, + -18.017056;40.845119;8.897065;, + -18.775501;44.983837;2.480351;, + -15.323012;36.687752;6.384915;, + -18.039320;40.766296;8.049853;, + -18.032312;35.498848;6.365007;, + -21.804729;34.767567;5.880031;, + -25.163914;35.616783;6.993527;, + -23.676790;33.790108;6.865523;, + -23.676790;33.790108;6.865523;, + -23.843136;33.278522;4.380921;, + -26.148655;37.035873;5.267626;, + -26.793785;36.568802;3.461252;, + 32.763477;22.312052;-18.906120;, + 31.347282;21.510612;-18.896196;, + 32.573399;20.998508;-13.993474;, + 31.588987;24.117847;-40.696075;, + 30.727213;23.864517;-46.026169;, + 30.172787;23.316404;-40.686150;, + 28.004946;30.522528;-34.917355;, + 26.588755;29.721081;-34.907444;, + 26.799459;29.484686;-23.919806;, + 28.215664;30.286123;-23.929716;, + 29.730568;27.460878;-35.918262;, + 28.314373;26.659443;-35.908363;, + 28.665804;26.196402;-23.140169;, + 30.082003;26.997847;-23.150089;, + 31.100611;25.020727;-37.470440;, + 29.684425;24.219271;-37.460514;, + 30.314682;23.305275;-21.319128;, + 31.730875;24.106718;-21.329044;, + 28.264534;31.576502;16.538700;, + 28.887688;30.497171;16.516956;, + 28.565001;29.293274;16.501442;, + 27.485502;28.670019;16.501251;, + 26.281548;28.992525;16.516499;, + 25.658390;30.071863;16.538246;, + 25.981071;31.275770;16.553751;, + 25.961720;31.309975;14.302090;, + 25.981071;31.275770;16.553751;, + 27.060581;31.899025;16.553940;, + 25.641800;31.875427;-22.917944;, + 25.828506;31.545427;-1.196465;, + 25.405474;31.866238;-0.749988;, + 25.531157;31.644094;13.872904;, + 28.430216;31.305752;-36.706051;, + 27.807066;32.385075;-36.684288;, + 28.107540;30.101837;-36.721565;, + 27.028032;29.478594;-36.721748;, + 25.824083;29.801088;-36.706490;, + 25.200922;30.880438;-36.684742;, + 25.523605;32.084339;-36.669224;, + 26.603115;32.707592;-36.669060;, + 25.523605;32.084339;-36.669224;, + 25.531799;32.069855;-35.715992;, + 24.961311;32.507545;-35.704453;, + 25.071318;32.313114;-22.906395;, + 29.151377;31.385166;-35.757492;, + 28.438414;31.291262;-35.752815;, + 27.815252;32.370605;-35.731056;, + 28.253050;32.941086;-35.726151;, + 28.363062;32.746647;-22.928093;, + 27.925262;32.176163;-22.932991;, + 28.548414;31.096832;-22.954752;, + 29.261381;31.190737;-22.959444;, + 28.686214;29.649672;-35.779873;, + 28.115726;30.087366;-35.768326;, + 28.225733;29.892931;-22.970266;, + 28.796217;29.455244;-22.981829;, + 27.130047;28.751215;-35.780151;, + 27.036226;29.464113;-35.768520;, + 27.146231;29.269676;-22.970453;, + 27.240047;28.556789;-22.982094;, + 25.394470;29.216141;-35.758179;, + 25.832272;29.786617;-35.753273;, + 25.942278;29.592182;-22.955206;, + 25.504477;29.021709;-22.960121;, + 24.496161;30.772045;-35.726803;, + 25.209120;30.865946;-35.731510;, + 25.319118;30.671524;-22.933453;, + 24.606161;30.577616;-22.928751;, + 24.961311;32.507545;-35.704453;, + 25.531799;32.069855;-35.715992;, + 25.641800;31.875427;-22.917944;, + 25.071318;32.313114;-22.906395;, + 26.517492;33.405987;-35.704166;, + 26.611311;32.693104;-35.715794;, + 26.721312;32.498676;-22.917738;, + 26.627487;33.211575;-22.906115;, + 29.272268;30.830444;-0.798965;, + 28.735117;30.766836;-1.233276;, + 28.111961;31.846174;-1.211521;, + 28.443258;32.266331;-0.770020;, + 28.568949;32.044174;13.852868;, + 28.245173;31.610723;14.287043;, + 28.868330;30.531387;14.265285;, + 29.397957;30.608292;13.823928;, + 28.842997;29.228819;-0.819599;, + 28.412436;29.562933;-1.248788;, + 28.545649;29.327480;14.249776;, + 28.968679;29.006672;13.803288;, + 27.406893;28.399687;-0.819852;, + 27.332933;28.939684;-1.248984;, + 27.466146;28.704229;14.249575;, + 27.532579;28.177542;13.803031;, + 25.805210;28.828726;-0.799567;, + 26.128983;29.262184;-1.233739;, + 26.262192;29.026735;14.264828;, + 25.930891;28.606585;13.823323;, + 24.976185;30.264614;-0.770632;, + 25.505823;30.341524;-1.211982;, + 25.639032;30.106077;14.286580;, + 25.101870;30.042463;13.852263;, + 25.405474;31.866238;-0.749988;, + 25.828506;31.545427;-1.196465;, + 25.961720;31.309975;14.302090;, + 25.531157;31.644094;13.872904;, + 26.841581;32.695370;-0.749732;, + 26.908014;32.168686;-1.196282;, + 27.041225;31.933235;14.302281;, + 26.967262;32.473228;13.873165;; + 1896; + 3;0,1,2;, + 3;3,0,2;, + 3;4,0,3;, + 3;5,4,3;, + 3;6,4,5;, + 3;7,6,5;, + 3;8,9,10;, + 3;11,8,10;, + 3;12,8,11;, + 3;13,12,11;, + 3;14,12,13;, + 3;15,14,13;, + 3;9,1,16;, + 3;10,9,16;, + 3;17,3,2;, + 3;18,17,2;, + 3;10,16,19;, + 3;11,10,19;, + 3;20,5,3;, + 3;17,20,3;, + 3;11,19,21;, + 3;13,11,21;, + 3;22,7,5;, + 3;20,22,5;, + 3;14,6,7;, + 3;22,14,7;, + 3;13,21,23;, + 3;15,13,23;, + 3;19,16,1;, + 3;0,19,1;, + 3;21,19,0;, + 3;4,21,0;, + 3;23,21,4;, + 3;6,23,4;, + 3;17,18,9;, + 3;8,17,9;, + 3;20,17,8;, + 3;12,20,8;, + 3;22,20,12;, + 3;14,22,12;, + 3;18,2,1;, + 3;9,18,1;, + 3;15,23,6;, + 3;14,15,6;, + 3;24,25,26;, + 3;24,26,27;, + 3;27,26,28;, + 3;27,28,29;, + 3;29,28,30;, + 3;29,30,31;, + 3;32,33,34;, + 3;32,34,35;, + 3;35,34,36;, + 3;35,36,37;, + 3;37,36,38;, + 3;37,38,39;, + 3;40,25,33;, + 3;40,33,32;, + 3;24,27,41;, + 3;24,41,42;, + 3;43,40,32;, + 3;43,32,35;, + 3;27,29,44;, + 3;27,44,41;, + 3;45,43,35;, + 3;45,35,37;, + 3;29,31,46;, + 3;29,46,44;, + 3;31,30,38;, + 3;31,38,46;, + 3;47,45,37;, + 3;47,37,39;, + 3;25,40,43;, + 3;25,43,26;, + 3;26,43,45;, + 3;26,45,28;, + 3;28,45,47;, + 3;28,47,30;, + 3;33,42,41;, + 3;33,41,34;, + 3;34,41,44;, + 3;34,44,36;, + 3;36,44,46;, + 3;36,46,38;, + 3;25,24,42;, + 3;25,42,33;, + 3;30,47,39;, + 3;30,39,38;, + 3;48,49,50;, + 3;51,48,50;, + 3;52,53,54;, + 3;55,52,54;, + 3;56,57,58;, + 3;59,57,56;, + 3;57,60,61;, + 3;62,60,57;, + 3;59,62,57;, + 3;63,64,65;, + 3;65,60,62;, + 3;64,60,65;, + 3;66,63,65;, + 3;67,66,65;, + 3;61,68,58;, + 3;67,65,62;, + 3;69,67,62;, + 3;70,66,67;, + 3;71,70,67;, + 3;67,69,72;, + 3;71,67,72;, + 3;73,74,75;, + 3;76,73,75;, + 3;62,77,69;, + 3;78,79,68;, + 3;61,78,68;, + 3;80,78,61;, + 3;60,80,61;, + 3;64,81,80;, + 3;71,72,82;, + 3;70,71,82;, + 3;83,84,82;, + 3;72,83,82;, + 3;72,69,73;, + 3;76,72,73;, + 3;69,77,74;, + 3;73,69,74;, + 3;85,86,87;, + 3;88,85,87;, + 3;86,83,75;, + 3;87,86,75;, + 3;59,56,89;, + 3;85,59,89;, + 3;85,89,90;, + 3;86,85,90;, + 3;89,56,58;, + 3;91,89,58;, + 3;90,89,91;, + 3;92,90,91;, + 3;74,88,87;, + 3;75,74,87;, + 3;59,85,77;, + 3;62,59,77;, + 3;84,83,86;, + 3;77,85,88;, + 3;74,77,88;, + 3;83,72,76;, + 3;75,83,76;, + 3;91,58,68;, + 3;93,91,68;, + 3;92,91,93;, + 3;94,92,93;, + 3;979,95,96;, + 3;980,979,96;, + 3;980,96,97;, + 3;981,980,97;, + 3;981,97,982;, + 3;61,58,57;, + 3;98,99,100;, + 3;101,98,100;, + 3;102,98,101;, + 3;103,102,101;, + 3;104,105,106;, + 3;107,104,106;, + 3;105,108,109;, + 3;106,105,109;, + 3;108,110,109;, + 3;100,99,111;, + 3;109,110,112;, + 3;113,109,112;, + 3;104,82,84;, + 3;105,104,84;, + 3;106,98,102;, + 3;107,106,102;, + 3;105,84,86;, + 3;108,105,86;, + 3;109,99,98;, + 3;106,109,98;, + 3;108,86,90;, + 3;110,108,90;, + 3;110,90,92;, + 3;112,110,92;, + 3;113,111,99;, + 3;109,113,99;, + 3;114,112,92;, + 3;115,114,92;, + 3;116,113,112;, + 3;114,116,112;, + 3;117,111,113;, + 3;116,117,113;, + 3;92,94,115;, + 3;111,117,118;, + 3;119,111,118;, + 3;100,111,119;, + 3;101,100,119;, + 3;103,101,119;, + 3;120,103,119;, + 3;117,116,121;, + 3;118,117,121;, + 3;122,120,119;, + 3;123,122,119;, + 3;124,122,123;, + 3;125,124,123;, + 3;119,118,123;, + 3;126,123,118;, + 3;121,126,118;, + 3;125,123,126;, + 3;114,115,127;, + 3;116,114,127;, + 3;121,116,127;, + 3;128,121,127;, + 3;126,121,128;, + 3;129,126,128;, + 3;125,126,129;, + 3;130,125,129;, + 3;131,128,132;, + 3;133,131,132;, + 3;134,129,128;, + 3;131,134,128;, + 3;135,130,129;, + 3;134,135,129;, + 3;133,132,130;, + 3;135,133,130;, + 3;127,132,128;, + 3;127,115,94;, + 3;136,983,982;, + 3;95,55,54;, + 3;96,95,54;, + 3;96,54,137;, + 3;97,96,137;, + 3;97,137,136;, + 3;982,97,136;, + 3;138,131,133;, + 3;139,138,133;, + 3;140,134,131;, + 3;138,140,131;, + 3;141,135,134;, + 3;140,141,134;, + 3;139,133,135;, + 3;141,139,135;, + 3;142,984,985;, + 3;143,142,985;, + 3;144,140,138;, + 3;986,144,138;, + 3;145,987,988;, + 3;989,145,988;, + 3;990,139,141;, + 3;991,990,141;, + 3;146,142,143;, + 3;147,146,143;, + 3;148,144,986;, + 3;992,148,986;, + 3;149,145,989;, + 3;993,149,989;, + 3;994,990,991;, + 3;995,994,991;, + 3;150,146,147;, + 3;996,148,992;, + 3;997,149,993;, + 3;996,994,995;, + 3;50,49,151;, + 3;152,50,151;, + 3;153,154,137;, + 3;54,153,137;, + 3;998,999,48;, + 3;51,998,48;, + 3;51,50,155;, + 3;156,51,155;, + 3;156,1000,51;, + 3;136,137,157;, + 3;158,136,157;, + 3;983,136,158;, + 3;50,152,155;, + 3;156,155,159;, + 3;160,156,159;, + 3;157,156,160;, + 3;161,157,160;, + 3;158,157,161;, + 3;162,158,161;, + 3;983,158,162;, + 3;163,983,162;, + 3;132,127,1001;, + 3;999,1002,48;, + 3;1000,998,51;, + 3;53,153,54;, + 3;157,137,154;, + 3;156,157,1000;, + 3;164,1003,1004;, + 3;165,164,1004;, + 3;165,1004,1005;, + 3;166,165,1005;, + 3;166,1005,1006;, + 3;167,166,1006;, + 3;167,1006,1007;, + 3;168,167,1007;, + 3;168,1007,1008;, + 3;169,168,1008;, + 3;169,1008,1009;, + 3;170,169,1009;, + 3;170,1009,1010;, + 3;171,170,1010;, + 3;171,1010,1011;, + 3;172,171,1011;, + 3;172,1011,1012;, + 3;173,172,1012;, + 3;174,164,165;, + 3;175,174,165;, + 3;175,165,166;, + 3;176,175,166;, + 3;176,166,167;, + 3;177,176,167;, + 3;177,167,168;, + 3;178,177,168;, + 3;178,168,169;, + 3;179,178,169;, + 3;179,169,170;, + 3;180,179,170;, + 3;180,170,171;, + 3;181,180,171;, + 3;181,171,172;, + 3;182,181,172;, + 3;182,172,173;, + 3;183,182,173;, + 3;184,174,175;, + 3;185,184,175;, + 3;185,175,176;, + 3;186,185,176;, + 3;186,176,177;, + 3;187,186,177;, + 3;187,177,178;, + 3;188,187,178;, + 3;188,178,179;, + 3;189,188,179;, + 3;189,179,180;, + 3;190,189,180;, + 3;190,180,181;, + 3;191,190,181;, + 3;191,181,182;, + 3;192,191,182;, + 3;192,182,183;, + 3;193,192,183;, + 3;194,1013,1014;, + 3;195,194,1014;, + 3;195,1014,1015;, + 3;196,195,1015;, + 3;196,1015,1016;, + 3;197,196,1016;, + 3;197,1016,1017;, + 3;198,197,1017;, + 3;198,1017,1018;, + 3;199,198,1018;, + 3;199,1018,1019;, + 3;200,199,1019;, + 3;200,1019,1020;, + 3;201,200,1020;, + 3;201,1020,1021;, + 3;202,201,1021;, + 3;202,1021,1022;, + 3;203,202,1022;, + 3;204,194,195;, + 3;204,195,196;, + 3;204,196,197;, + 3;204,197,198;, + 3;204,198,199;, + 3;204,199,200;, + 3;204,200,201;, + 3;204,201,202;, + 3;204,202,203;, + 3;80,60,64;, + 3;205,206,207;, + 3;208,205,207;, + 3;209,210,211;, + 3;212,209,211;, + 3;213,214,215;, + 3;215,214,216;, + 3;217,218,214;, + 3;218,219,216;, + 3;214,218,216;, + 3;220,64,63;, + 3;219,218,220;, + 3;220,218,64;, + 3;63,66,221;, + 3;220,63,221;, + 3;213,222,217;, + 3;220,221,223;, + 3;219,220,223;, + 3;66,70,224;, + 3;221,66,224;, + 3;223,221,224;, + 3;225,223,224;, + 3;226,227,228;, + 3;229,226,228;, + 3;223,230,219;, + 3;231,232,217;, + 3;222,231,217;, + 3;232,233,218;, + 3;217,232,218;, + 3;233,81,64;, + 3;82,225,224;, + 3;82,224,70;, + 3;234,235,225;, + 3;82,234,225;, + 3;223,225,228;, + 3;227,223,228;, + 3;230,223,227;, + 3;226,230,227;, + 3;236,237,238;, + 3;239,236,238;, + 3;235,236,239;, + 3;229,235,239;, + 3;215,216,237;, + 3;240,215,237;, + 3;240,237,236;, + 3;241,240,236;, + 3;215,240,242;, + 3;213,215,242;, + 3;240,241,243;, + 3;242,240,243;, + 3;238,226,229;, + 3;239,238,229;, + 3;230,237,216;, + 3;230,216,219;, + 3;236,235,234;, + 3;237,230,226;, + 3;238,237,226;, + 3;225,235,229;, + 3;228,225,229;, + 3;213,242,244;, + 3;222,213,244;, + 3;242,243,245;, + 3;244,242,245;, + 3;246,231,222;, + 3;247,246,222;, + 3;247,222,244;, + 3;248,247,244;, + 3;245,248,244;, + 3;214,213,217;, + 3;249,250,251;, + 3;252,249,251;, + 3;250,102,103;, + 3;251,250,103;, + 3;253,104,107;, + 3;254,253,107;, + 3;255,253,254;, + 3;256,255,254;, + 3;256,257,255;, + 3;258,249,252;, + 3;257,256,259;, + 3;260,257,259;, + 3;82,104,253;, + 3;234,82,253;, + 3;250,254,107;, + 3;102,250,107;, + 3;234,253,255;, + 3;236,234,255;, + 3;249,256,254;, + 3;250,249,254;, + 3;236,255,257;, + 3;241,236,257;, + 3;241,257,260;, + 3;243,241,260;, + 3;258,259,256;, + 3;249,258,256;, + 3;260,261,262;, + 3;243,260,262;, + 3;259,263,261;, + 3;260,259,261;, + 3;258,264,263;, + 3;259,258,263;, + 3;262,245,243;, + 3;264,258,265;, + 3;266,264,265;, + 3;265,258,252;, + 3;265,252,251;, + 3;251,103,120;, + 3;265,251,120;, + 3;267,263,264;, + 3;267,264,266;, + 3;120,122,268;, + 3;265,120,268;, + 3;122,124,269;, + 3;268,122,269;, + 3;268,266,265;, + 3;268,270,267;, + 3;266,268,267;, + 3;270,268,269;, + 3;271,262,261;, + 3;261,263,267;, + 3;271,261,267;, + 3;271,267,272;, + 3;267,270,273;, + 3;272,267,273;, + 3;270,269,274;, + 3;273,270,274;, + 3;272,275,276;, + 3;277,272,276;, + 3;273,278,275;, + 3;272,273,275;, + 3;274,279,278;, + 3;273,274,278;, + 3;277,276,279;, + 3;274,277,279;, + 3;272,277,271;, + 3;1023,280,245;, + 3;245,262,271;, + 3;211,246,247;, + 3;212,211,247;, + 3;212,247,248;, + 3;281,212,248;, + 3;281,248,245;, + 3;280,281,245;, + 3;275,282,283;, + 3;276,275,283;, + 3;278,284,282;, + 3;275,278,282;, + 3;279,285,284;, + 3;278,279,284;, + 3;276,283,285;, + 3;279,276,285;, + 3;1024,286,287;, + 3;1025,1024,287;, + 3;284,288,1026;, + 3;282,284,1026;, + 3;1027,289,1028;, + 3;1029,1027,1028;, + 3;283,1030,1031;, + 3;285,283,1031;, + 3;286,290,291;, + 3;287,286,291;, + 3;288,292,1032;, + 3;1026,288,1032;, + 3;289,293,1033;, + 3;1028,289,1033;, + 3;1030,1034,1035;, + 3;1031,1030,1035;, + 3;291,290,294;, + 3;1032,292,1036;, + 3;1033,293,1037;, + 3;1035,1034,1036;, + 3;205,208,152;, + 3;151,205,152;, + 3;295,296,212;, + 3;281,295,212;, + 3;1038,1039,207;, + 3;206,1038,207;, + 3;208,207,297;, + 3;155,208,297;, + 3;207,1040,297;, + 3;281,280,298;, + 3;299,281,298;, + 3;298,280,1023;, + 3;155,152,208;, + 3;155,297,300;, + 3;159,155,300;, + 3;297,299,301;, + 3;300,297,301;, + 3;299,298,302;, + 3;301,299,302;, + 3;302,298,1023;, + 3;302,1023,303;, + 3;1041,271,277;, + 3;206,1042,1038;, + 3;207,1039,1040;, + 3;212,296,209;, + 3;295,281,299;, + 3;1040,299,297;, + 3;1043,1044,304;, + 3;1045,1043,304;, + 3;1045,304,305;, + 3;1046,1045,305;, + 3;1046,305,306;, + 3;1047,1046,306;, + 3;1047,306,307;, + 3;1048,1047,307;, + 3;1048,307,308;, + 3;1049,1048,308;, + 3;1049,308,309;, + 3;1050,1049,309;, + 3;1050,309,310;, + 3;1051,1050,310;, + 3;1051,310,311;, + 3;1052,1051,311;, + 3;1052,311,173;, + 3;1012,1052,173;, + 3;1044,1053,312;, + 3;304,1044,312;, + 3;304,312,313;, + 3;305,304,313;, + 3;305,313,314;, + 3;306,305,314;, + 3;306,314,315;, + 3;307,306,315;, + 3;307,315,316;, + 3;308,307,316;, + 3;308,316,317;, + 3;309,308,317;, + 3;309,317,318;, + 3;310,309,318;, + 3;310,318,319;, + 3;311,310,319;, + 3;311,319,183;, + 3;173,311,183;, + 3;1053,1054,320;, + 3;312,1053,320;, + 3;312,320,321;, + 3;313,312,321;, + 3;313,321,322;, + 3;314,313,322;, + 3;314,322,323;, + 3;315,314,323;, + 3;315,323,324;, + 3;316,315,324;, + 3;316,324,325;, + 3;317,316,325;, + 3;317,325,326;, + 3;318,317,326;, + 3;318,326,327;, + 3;319,318,327;, + 3;319,327,193;, + 3;183,319,193;, + 3;1013,194,328;, + 3;1055,1013,328;, + 3;1055,328,329;, + 3;1056,1055,329;, + 3;1056,329,330;, + 3;1057,1056,330;, + 3;1057,330,331;, + 3;1058,1057,331;, + 3;1058,331,332;, + 3;1059,1058,332;, + 3;1059,332,333;, + 3;1060,1059,333;, + 3;1060,333,334;, + 3;1061,1060,334;, + 3;1061,334,335;, + 3;1062,1061,335;, + 3;1062,335,203;, + 3;1022,1062,203;, + 3;328,194,204;, + 3;329,328,204;, + 3;330,329,204;, + 3;331,330,204;, + 3;332,331,204;, + 3;333,332,204;, + 3;334,333,204;, + 3;335,334,204;, + 3;203,335,204;, + 3;64,218,233;, + 3;336,337,338;, + 3;339,336,338;, + 3;336,340,337;, + 3;341,1063,1064;, + 3;342,341,1064;, + 3;341,1065,1063;, + 3;343,1066,1067;, + 3;344,343,1067;, + 3;343,340,1066;, + 3;345,343,344;, + 3;346,345,344;, + 3;345,340,343;, + 3;347,1068,1069;, + 3;348,1070,346;, + 3;347,1071,1068;, + 3;337,1070,348;, + 3;338,337,348;, + 3;337,340,1070;, + 3;349,350,351;, + 3;352,349,351;, + 3;353,349,352;, + 3;354,353,352;, + 3;355,353,354;, + 3;356,355,354;, + 3;357,355,356;, + 3;358,357,356;, + 3;359,357,358;, + 3;360,359,358;, + 3;1072,359,360;, + 3;1073,1072,360;, + 3;361,350,349;, + 3;362,361,349;, + 3;362,349,353;, + 3;363,362,353;, + 3;363,353,355;, + 3;364,363,355;, + 3;364,355,357;, + 3;365,364,357;, + 3;365,357,359;, + 3;366,365,359;, + 3;366,359,1072;, + 3;1074,366,1072;, + 3;367,361,362;, + 3;368,367,362;, + 3;368,362,363;, + 3;369,368,363;, + 3;369,363,364;, + 3;370,369,364;, + 3;370,364,365;, + 3;371,370,365;, + 3;371,365,366;, + 3;372,371,366;, + 3;372,366,1074;, + 3;1075,372,1074;, + 3;373,367,368;, + 3;373,368,369;, + 3;373,369,370;, + 3;373,370,371;, + 3;373,371,372;, + 3;373,372,1075;, + 3;374,375,376;, + 3;374,376,377;, + 3;377,376,378;, + 3;377,378,379;, + 3;379,378,380;, + 3;379,380,381;, + 3;381,380,382;, + 3;381,382,383;, + 3;383,382,384;, + 3;383,384,385;, + 3;385,384,1076;, + 3;385,1076,1077;, + 3;376,375,386;, + 3;376,386,387;, + 3;378,376,387;, + 3;378,387,388;, + 3;380,378,388;, + 3;380,388,389;, + 3;382,380,389;, + 3;382,389,390;, + 3;384,382,390;, + 3;384,390,391;, + 3;1076,384,391;, + 3;1076,391,1078;, + 3;387,386,392;, + 3;387,392,393;, + 3;388,387,393;, + 3;388,393,394;, + 3;389,388,394;, + 3;389,394,395;, + 3;390,389,395;, + 3;390,395,396;, + 3;391,390,396;, + 3;391,396,397;, + 3;1078,391,397;, + 3;1078,397,1079;, + 3;393,392,398;, + 3;394,393,398;, + 3;395,394,398;, + 3;396,395,398;, + 3;397,396,398;, + 3;1079,397,398;, + 3;399,400,401;, + 3;402,399,401;, + 3;403,404,405;, + 3;406,1080,1081;, + 3;407,406,1081;, + 3;408,404,403;, + 3;409,1082,1083;, + 3;410,409,1083;, + 3;411,1084,1085;, + 3;412,409,410;, + 3;413,412,410;, + 3;414,1084,411;, + 3;415,416,412;, + 3;413,415,412;, + 3;417,418,400;, + 3;399,417,400;, + 3;419,420,1082;, + 3;409,419,1082;, + 3;421,419,409;, + 3;412,421,409;, + 3;416,422,421;, + 3;412,416,421;, + 3;423,424,418;, + 3;417,423,418;, + 3;425,426,1086;, + 3;419,1087,420;, + 3;427,1087,419;, + 3;421,427,419;, + 3;428,429,424;, + 3;405,428,424;, + 3;405,424,423;, + 3;403,405,423;, + 3;403,423,1088;, + 3;408,403,1088;, + 3;1085,1089,1087;, + 3;411,1085,1087;, + 3;411,1087,427;, + 3;414,411,427;, + 3;401,400,430;, + 3;431,401,430;, + 3;404,428,405;, + 3;432,1084,414;, + 3;400,418,433;, + 3;430,400,433;, + 3;418,424,429;, + 3;433,418,429;, + 3;434,432,414;, + 3;427,434,414;, + 3;422,434,427;, + 3;421,422,427;, + 3;435,1090,1091;, + 3;436,426,1090;, + 3;435,436,1090;, + 3;437,438,439;, + 3;437,439,440;, + 3;441,1092,442;, + 3;1093,1094,443;, + 3;1093,443,444;, + 3;442,1092,445;, + 3;1095,1096,446;, + 3;1095,446,447;, + 3;1097,1084,448;, + 3;447,446,449;, + 3;447,449,450;, + 3;448,1084,451;, + 3;449,416,415;, + 3;449,415,450;, + 3;438,452,453;, + 3;438,453,439;, + 3;1096,454,455;, + 3;1096,455,446;, + 3;446,455,456;, + 3;446,456,449;, + 3;456,422,416;, + 3;456,416,449;, + 3;452,457,458;, + 3;452,458,453;, + 3;1098,459,460;, + 3;454,1099,455;, + 3;455,1099,461;, + 3;455,461,456;, + 3;457,1100,1101;, + 3;457,1101,441;, + 3;458,457,441;, + 3;458,441,442;, + 3;1102,458,442;, + 3;1102,442,445;, + 3;1099,1103,1097;, + 3;1099,1097,448;, + 3;461,1099,448;, + 3;461,448,451;, + 3;1104,438,437;, + 3;1104,437,1105;, + 3;441,1101,1092;, + 3;451,1084,432;, + 3;1106,452,438;, + 3;1106,438,1104;, + 3;1100,457,452;, + 3;1100,452,1106;, + 3;451,432,434;, + 3;451,434,461;, + 3;461,434,422;, + 3;461,422,456;, + 3;1107,1108,462;, + 3;1108,459,463;, + 3;1108,463,462;, + 3;463,459,1098;, + 3;464,465,466;, + 3;467,1109,1110;, + 3;468,464,1111;, + 3;469,470,471;, + 3;472,469,471;, + 3;1112,473,1113;, + 3;474,475,476;, + 3;477,474,476;, + 3;1114,1115,478;, + 3;468,1114,478;, + 3;479,465,480;, + 3;481,482,475;, + 3;474,481,475;, + 3;483,484,485;, + 3;486,483,485;, + 3;478,487,464;, + 3;468,478,464;, + 3;488,466,465;, + 3;479,488,465;, + 3;484,489,485;, + 3;1116,1117,1118;, + 3;487,490,464;, + 3;490,489,465;, + 3;464,490,465;, + 3;480,465,489;, + 3;484,480,489;, + 3;483,486,490;, + 3;487,483,490;, + 3;491,492,493;, + 3;494,491,493;, + 3;495,496,485;, + 3;489,495,485;, + 3;496,497,486;, + 3;485,496,486;, + 3;486,497,490;, + 3;490,495,489;, + 3;493,492,496;, + 3;495,493,496;, + 3;492,491,497;, + 3;496,492,497;, + 3;491,494,490;, + 3;497,491,490;, + 3;494,493,495;, + 3;490,494,495;, + 3;498,488,1112;, + 3;499,498,1112;, + 3;500,1114,468;, + 3;501,500,468;, + 3;1119,472,471;, + 3;1120,1119,471;, + 3;502,466,488;, + 3;498,502,488;, + 3;503,467,1110;, + 3;1121,503,1110;, + 3;501,468,1111;, + 3;1122,501,1111;, + 3;475,498,499;, + 3;476,475,499;, + 3;477,500,501;, + 3;474,477,501;, + 3;1123,1119,1120;, + 3;1124,1123,1120;, + 3;482,502,498;, + 3;475,482,498;, + 3;1125,503,1121;, + 3;1126,1125,1121;, + 3;474,501,1122;, + 3;481,474,1122;, + 3;504,505,506;, + 3;507,508,506;, + 3;509,510,511;, + 3;512,509,513;, + 3;507,512,514;, + 3;1127,515,516;, + 3;517,518,515;, + 3;1128,519,518;, + 3;1128,1129,519;, + 3;1130,1131,516;, + 3;1132,520,521;, + 3;1133,522,520;, + 3;1134,521,523;, + 3;1135,524,522;, + 3;1136,523,525;, + 3;1130,516,524;, + 3;1137,525,519;, + 3;1138,526,527;, + 3;1139,528,1140;, + 3;529,1141,1142;, + 3;1143,530,1144;, + 3;1138,527,1145;, + 3;1146,531,532;, + 3;533,534,1146;, + 3;1147,535,1148;, + 3;530,1147,1144;, + 3;1149,536,529;, + 3;537,536,1149;, + 3;538,537,1150;, + 3;1151,539,1152;, + 3;535,540,1153;, + 3;1154,1155,531;, + 3;541,542,543;, + 3;544,541,543;, + 3;545,541,544;, + 3;546,545,544;, + 3;547,545,546;, + 3;548,547,546;, + 3;549,547,548;, + 3;550,549,548;, + 3;551,549,550;, + 3;552,551,550;, + 3;553,551,552;, + 3;554,553,552;, + 3;555,553,554;, + 3;556,555,554;, + 3;1156,555,556;, + 3;1157,1156,556;, + 3;557,558,542;, + 3;541,557,542;, + 3;559,557,541;, + 3;545,559,541;, + 3;560,559,545;, + 3;547,560,545;, + 3;561,560,547;, + 3;549,561,547;, + 3;562,561,549;, + 3;551,562,549;, + 3;563,562,551;, + 3;553,563,551;, + 3;564,563,553;, + 3;555,564,553;, + 3;1158,564,555;, + 3;1156,1158,555;, + 3;565,566,558;, + 3;557,565,558;, + 3;561,567,560;, + 3;568,569,561;, + 3;562,568,561;, + 3;570,568,562;, + 3;563,570,562;, + 3;571,570,563;, + 3;1159,571,564;, + 3;1158,1159,564;, + 3;572,573,574;, + 3;575,572,574;, + 3;436,435,573;, + 3;572,436,573;, + 3;576,1160,1161;, + 3;577,576,1161;, + 3;578,1162,1160;, + 3;576,578,1160;, + 3;579,1163,1162;, + 3;578,579,1162;, + 3;580,1164,1163;, + 3;579,580,1163;, + 3;581,1165,1164;, + 3;580,581,1164;, + 3;582,576,577;, + 3;583,582,577;, + 3;584,578,576;, + 3;582,584,576;, + 3;585,579,578;, + 3;584,585,578;, + 3;586,580,579;, + 3;585,586,579;, + 3;587,581,580;, + 3;586,587,580;, + 3;588,582,583;, + 3;589,588,583;, + 3;590,584,582;, + 3;588,590,582;, + 3;591,585,584;, + 3;590,591,584;, + 3;592,586,585;, + 3;591,592,585;, + 3;593,587,586;, + 3;592,593,586;, + 3;569,1166,1167;, + 3;594,569,1167;, + 3;568,1168,1166;, + 3;569,568,1166;, + 3;570,1169,1168;, + 3;568,570,1168;, + 3;595,1170,1169;, + 3;570,595,1169;, + 3;571,595,570;, + 3;577,1161,1171;, + 3;596,577,1171;, + 3;583,577,596;, + 3;597,583,596;, + 3;589,583,597;, + 3;598,589,597;, + 3;566,565,599;, + 3;599,565,600;, + 3;1172,1173,601;, + 3;602,1172,601;, + 3;1167,1172,602;, + 3;594,1167,602;, + 3;557,559,565;, + 3;602,601,603;, + 3;604,602,603;, + 3;569,594,567;, + 3;561,569,567;, + 3;594,602,604;, + 3;567,594,604;, + 3;560,567,604;, + 3;559,604,565;, + 3;604,603,600;, + 3;605,1174,1175;, + 3;606,605,1175;, + 3;607,1176,1174;, + 3;605,607,1174;, + 3;608,1177,1178;, + 3;1179,608,1178;, + 3;609,1180,1177;, + 3;608,609,1177;, + 3;610,1181,1180;, + 3;609,610,1180;, + 3;611,1182,1181;, + 3;610,611,1181;, + 3;612,1183,1182;, + 3;611,612,1182;, + 3;606,1175,1184;, + 3;1185,606,1184;, + 3;613,605,606;, + 3;614,613,606;, + 3;615,607,605;, + 3;613,615,605;, + 3;616,608,1179;, + 3;1186,616,1179;, + 3;617,609,608;, + 3;616,617,608;, + 3;618,610,609;, + 3;617,618,609;, + 3;619,611,610;, + 3;618,619,610;, + 3;620,612,611;, + 3;619,620,611;, + 3;614,606,1185;, + 3;1187,614,1185;, + 3;621,1188,1189;, + 3;622,621,1189;, + 3;623,1190,1191;, + 3;1192,623,1191;, + 3;624,1193,1190;, + 3;623,624,1190;, + 3;625,1194,1195;, + 3;1196,625,1195;, + 3;626,1197,1194;, + 3;625,626,1194;, + 3;627,1198,1199;, + 3;1200,627,1199;, + 3;628,1201,1198;, + 3;627,628,1198;, + 3;622,1189,1202;, + 3;1203,622,1202;, + 3;1204,621,622;, + 3;1205,623,1192;, + 3;1206,624,623;, + 3;1207,625,1196;, + 3;1208,626,625;, + 3;1209,627,1200;, + 3;1155,628,627;, + 3;1210,622,1203;, + 3;564,571,563;, + 3;565,604,600;, + 3;533,1211,1212;, + 3;1213,1214,539;, + 3;1151,1213,539;, + 3;531,534,1154;, + 3;1140,528,526;, + 3;1138,1140,526;, + 3;534,533,1154;, + 3;1211,533,1215;, + 3;531,1146,534;, + 3;1216,504,506;, + 3;505,507,506;, + 3;513,509,511;, + 3;514,512,513;, + 3;508,507,514;, + 3;1131,1127,516;, + 3;1127,517,515;, + 3;517,1128,518;, + 3;1134,1132,521;, + 3;1132,1133,520;, + 3;1136,1134,523;, + 3;1133,1135,522;, + 3;1137,1136,525;, + 3;1135,1130,524;, + 3;1129,1137,519;, + 3;1149,529,1142;, + 3;1217,1143,1144;, + 3;1215,533,1146;, + 3;1144,1147,1148;, + 3;1150,537,1149;, + 3;1218,538,1150;, + 3;1148,535,1153;, + 3;1210,1204,622;, + 3;1219,1205,1192;, + 3;1205,1206,623;, + 3;1220,1207,1196;, + 3;1207,1208,625;, + 3;1221,1209,1200;, + 3;1209,1155,627;, + 3;1155,1210,1203;, + 3;1154,533,1212;, + 3;604,559,560;, + 3;573,629,574;, + 3;1086,630,1222;, + 3;573,435,1091;, + 3;436,572,1086;, + 3;1091,1223,629;, + 3;573,1091,629;, + 3;572,575,630;, + 3;1086,572,630;, + 3;631,629,1223;, + 3;632,631,1223;, + 3;633,1222,630;, + 3;634,633,630;, + 3;632,1223,1224;, + 3;1225,632,1224;, + 3;635,574,629;, + 3;631,635,629;, + 3;636,575,574;, + 3;635,636,574;, + 3;634,630,575;, + 3;636,634,575;, + 3;637,631,632;, + 3;638,637,632;, + 3;639,633,634;, + 3;640,639,634;, + 3;638,632,1225;, + 3;1226,638,1225;, + 3;641,635,631;, + 3;637,641,631;, + 3;642,636,635;, + 3;641,642,635;, + 3;640,634,636;, + 3;642,640,636;, + 3;643,1227,1228;, + 3;644,643,1228;, + 3;645,1229,1230;, + 3;646,645,1230;, + 3;1231,1232,1229;, + 3;645,1231,1229;, + 3;647,1233,1227;, + 3;1234,647,1227;, + 3;648,1235,1233;, + 3;647,648,1233;, + 3;646,1230,1235;, + 3;648,646,1235;, + 3;649,643,644;, + 3;650,649,644;, + 3;651,645,646;, + 3;652,651,646;, + 3;1236,1231,645;, + 3;651,1236,645;, + 3;653,647,1234;, + 3;1237,653,1234;, + 3;654,648,647;, + 3;653,654,647;, + 3;652,646,648;, + 3;654,652,648;, + 3;655,649,650;, + 3;656,655,650;, + 3;657,651,652;, + 3;658,657,652;, + 3;1238,1236,651;, + 3;657,1238,651;, + 3;659,653,1237;, + 3;655,659,1237;, + 3;660,654,653;, + 3;659,660,653;, + 3;658,652,654;, + 3;660,658,654;, + 3;661,655,656;, + 3;662,661,656;, + 3;657,663,664;, + 3;1239,1238,657;, + 3;664,1239,657;, + 3;665,659,655;, + 3;661,665,655;, + 3;666,660,659;, + 3;665,666,659;, + 3;667,658,660;, + 3;666,667,660;, + 3;1240,661,662;, + 3;1241,1240,662;, + 3;1118,663,667;, + 3;1239,1242,1243;, + 3;1244,665,661;, + 3;1240,1244,661;, + 3;1245,666,665;, + 3;1244,1245,665;, + 3;1118,667,666;, + 3;1245,1118,666;, + 3;1086,426,436;, + 3;488,479,473;, + 3;1112,488,473;, + 3;658,667,663;, + 3;657,658,663;, + 3;1117,664,663;, + 3;1118,1117,663;, + 3;664,1117,1242;, + 3;1239,664,1242;, + 3;484,483,480;, + 3;668,669,670;, + 3;668,670,671;, + 3;671,670,672;, + 3;673,674,675;, + 3;673,675,676;, + 3;1246,677,1247;, + 3;678,679,680;, + 3;678,680,681;, + 3;682,1248,1249;, + 3;682,1249,672;, + 3;683,669,684;, + 3;679,685,686;, + 3;679,686,680;, + 3;687,688,689;, + 3;687,689,690;, + 3;670,691,682;, + 3;670,682,672;, + 3;669,668,692;, + 3;669,692,684;, + 3;687,693,688;, + 3;1250,1251,1252;, + 3;670,694,691;, + 3;669,693,694;, + 3;669,694,670;, + 3;693,669,683;, + 3;693,683,688;, + 3;694,690,689;, + 3;694,689,691;, + 3;695,696,697;, + 3;695,697,698;, + 3;687,699,700;, + 3;687,700,693;, + 3;690,701,699;, + 3;690,699,687;, + 3;694,701,690;, + 3;693,700,694;, + 3;699,696,695;, + 3;699,695,700;, + 3;701,697,696;, + 3;701,696,699;, + 3;694,698,697;, + 3;694,697,701;, + 3;700,695,698;, + 3;700,698,694;, + 3;1247,692,702;, + 3;1247,702,703;, + 3;672,1249,704;, + 3;672,704,705;, + 3;673,676,1253;, + 3;673,1253,1254;, + 3;692,668,706;, + 3;692,706,702;, + 3;668,671,707;, + 3;668,707,706;, + 3;671,672,705;, + 3;671,705,707;, + 3;703,702,679;, + 3;703,679,678;, + 3;705,704,681;, + 3;705,681,680;, + 3;1254,1253,1255;, + 3;1254,1255,1256;, + 3;702,706,685;, + 3;702,685,679;, + 3;706,707,686;, + 3;706,686,685;, + 3;707,705,680;, + 3;707,680,686;, + 3;708,709,710;, + 3;708,711,712;, + 3;713,714,715;, + 3;716,715,717;, + 3;718,717,712;, + 3;719,720,1257;, + 3;720,721,722;, + 3;721,723,1258;, + 3;723,1259,1258;, + 3;719,1260,1261;, + 3;724,725,1262;, + 3;725,726,1263;, + 3;727,724,1264;, + 3;726,728,1265;, + 3;729,727,1266;, + 3;728,719,1261;, + 3;723,729,1267;, + 3;730,731,1268;, + 3;1269,732,1270;, + 3;1271,1272,733;, + 3;1273,734,1274;, + 3;1275,730,1268;, + 3;735,736,1276;, + 3;1276,737,738;, + 3;1277,739,1278;, + 3;1273,1278,734;, + 3;733,740,1279;, + 3;1279,740,741;, + 3;1280,741,742;, + 3;1281,743,1282;, + 3;1283,744,739;, + 3;736,1284,1285;, + 3;745,746,747;, + 3;745,747,748;, + 3;748,747,749;, + 3;748,749,750;, + 3;750,749,751;, + 3;750,751,752;, + 3;752,751,753;, + 3;752,753,754;, + 3;754,753,755;, + 3;754,755,756;, + 3;756,755,757;, + 3;756,757,758;, + 3;758,757,759;, + 3;758,759,760;, + 3;760,759,1286;, + 3;760,1286,1287;, + 3;746,761,762;, + 3;746,762,747;, + 3;747,762,763;, + 3;747,763,749;, + 3;749,763,764;, + 3;749,764,751;, + 3;751,764,765;, + 3;751,765,753;, + 3;753,765,766;, + 3;753,766,755;, + 3;755,766,767;, + 3;755,767,757;, + 3;757,767,768;, + 3;757,768,759;, + 3;759,768,1288;, + 3;759,1288,1286;, + 3;761,566,769;, + 3;761,769,762;, + 3;764,770,765;, + 3;765,771,772;, + 3;765,772,766;, + 3;766,772,773;, + 3;766,773,767;, + 3;767,773,571;, + 3;768,571,1159;, + 3;768,1159,1288;, + 3;774,775,776;, + 3;774,776,777;, + 3;775,462,463;, + 3;775,463,776;, + 3;1289,1290,778;, + 3;1289,778,779;, + 3;1290,1291,780;, + 3;1290,780,778;, + 3;1291,1292,781;, + 3;1291,781,780;, + 3;1292,1293,782;, + 3;1292,782,781;, + 3;1293,1165,581;, + 3;1293,581,782;, + 3;779,778,783;, + 3;779,783,784;, + 3;778,780,785;, + 3;778,785,783;, + 3;780,781,786;, + 3;780,786,785;, + 3;781,782,787;, + 3;781,787,786;, + 3;782,581,587;, + 3;782,587,787;, + 3;784,783,788;, + 3;784,788,789;, + 3;783,785,790;, + 3;783,790,788;, + 3;785,786,791;, + 3;785,791,790;, + 3;786,787,792;, + 3;786,792,791;, + 3;787,587,593;, + 3;787,593,792;, + 3;1294,1295,771;, + 3;1294,771,793;, + 3;1295,1296,772;, + 3;1295,772,771;, + 3;1296,1297,773;, + 3;1296,773,772;, + 3;1297,1170,595;, + 3;1297,595,773;, + 3;773,595,571;, + 3;1171,1289,779;, + 3;1171,779,596;, + 3;596,779,784;, + 3;596,784,597;, + 3;597,784,789;, + 3;597,789,598;, + 3;599,769,566;, + 3;600,769,599;, + 3;601,1173,1298;, + 3;601,1298,794;, + 3;794,1298,1294;, + 3;794,1294,793;, + 3;769,763,762;, + 3;603,601,794;, + 3;603,794,795;, + 3;770,793,771;, + 3;770,771,765;, + 3;795,794,793;, + 3;795,793,770;, + 3;795,770,764;, + 3;769,795,763;, + 3;600,603,795;, + 3;1299,1300,796;, + 3;1299,796,797;, + 3;1300,1301,798;, + 3;1300,798,796;, + 3;1302,1303,799;, + 3;1302,799,1304;, + 3;1303,1305,800;, + 3;1303,800,799;, + 3;1305,1306,801;, + 3;1305,801,800;, + 3;1306,1307,802;, + 3;1306,802,801;, + 3;1307,1308,803;, + 3;1307,803,802;, + 3;1309,1299,797;, + 3;1309,797,1310;, + 3;797,796,804;, + 3;797,804,805;, + 3;796,798,806;, + 3;796,806,804;, + 3;1304,799,807;, + 3;1304,807,1311;, + 3;799,800,808;, + 3;799,808,807;, + 3;800,801,809;, + 3;800,809,808;, + 3;801,802,810;, + 3;801,810,809;, + 3;802,803,811;, + 3;802,811,810;, + 3;1310,797,805;, + 3;1310,805,1312;, + 3;1313,1314,812;, + 3;1313,812,813;, + 3;1315,1316,814;, + 3;1315,814,1317;, + 3;1316,1318,815;, + 3;1316,815,814;, + 3;1319,1320,816;, + 3;1319,816,1321;, + 3;1320,1322,817;, + 3;1320,817,816;, + 3;1323,1324,818;, + 3;1323,818,1325;, + 3;1324,1326,819;, + 3;1324,819,818;, + 3;1327,1313,813;, + 3;1327,813,1328;, + 3;813,812,1329;, + 3;1317,814,1330;, + 3;814,815,1331;, + 3;1321,816,1332;, + 3;816,817,1333;, + 3;1325,818,1334;, + 3;818,819,1284;, + 3;1328,813,1335;, + 3;767,571,768;, + 3;600,795,769;, + 3;1336,1337,738;, + 3;743,1338,1339;, + 3;743,1339,1282;, + 3;1285,737,736;, + 3;731,732,1269;, + 3;731,1269,1268;, + 3;1285,738,737;, + 3;1340,738,1337;, + 3;737,1276,736;, + 3;708,710,1341;, + 3;708,712,709;, + 3;713,715,716;, + 3;716,717,718;, + 3;718,712,711;, + 3;719,1257,1260;, + 3;720,722,1257;, + 3;721,1258,722;, + 3;724,1262,1264;, + 3;725,1263,1262;, + 3;727,1264,1266;, + 3;726,1265,1263;, + 3;729,1266,1267;, + 3;728,1261,1265;, + 3;723,1267,1259;, + 3;1271,733,1279;, + 3;1273,1274,1342;, + 3;1276,738,1340;, + 3;1277,1278,1273;, + 3;1279,741,1280;, + 3;1280,742,1343;, + 3;1283,739,1277;, + 3;813,1329,1335;, + 3;1317,1330,1344;, + 3;814,1331,1330;, + 3;1321,1332,1345;, + 3;816,1333,1332;, + 3;1325,1334,1346;, + 3;818,1284,1334;, + 3;1328,1335,1284;, + 3;1336,738,1285;, + 3;764,763,795;, + 3;774,820,775;, + 3;1347,821,1098;, + 3;1107,462,775;, + 3;1098,776,463;, + 3;820,1348,1107;, + 3;820,1107,775;, + 3;821,777,776;, + 3;821,776,1098;, + 3;1348,820,822;, + 3;1348,822,823;, + 3;821,1347,824;, + 3;821,824,825;, + 3;1349,1348,823;, + 3;1349,823,1350;, + 3;820,774,826;, + 3;820,826,822;, + 3;774,777,827;, + 3;774,827,826;, + 3;777,821,825;, + 3;777,825,827;, + 3;823,822,828;, + 3;823,828,829;, + 3;825,824,830;, + 3;825,830,831;, + 3;1350,823,829;, + 3;1350,829,1351;, + 3;822,826,832;, + 3;822,832,828;, + 3;826,827,833;, + 3;826,833,832;, + 3;827,825,831;, + 3;827,831,833;, + 3;1352,1353,834;, + 3;1352,834,835;, + 3;1354,1355,836;, + 3;1354,836,837;, + 3;1355,1356,1357;, + 3;1355,1357,836;, + 3;1353,1358,838;, + 3;1353,838,1359;, + 3;1358,1360,839;, + 3;1358,839,838;, + 3;1360,1354,837;, + 3;1360,837,839;, + 3;835,834,840;, + 3;835,840,841;, + 3;837,836,842;, + 3;837,842,843;, + 3;836,1357,1361;, + 3;836,1361,842;, + 3;1359,838,844;, + 3;1359,844,1362;, + 3;838,839,845;, + 3;838,845,844;, + 3;839,837,843;, + 3;839,843,845;, + 3;841,840,846;, + 3;841,846,847;, + 3;843,842,848;, + 3;843,848,849;, + 3;842,1361,1363;, + 3;842,1363,848;, + 3;1362,844,850;, + 3;1362,850,846;, + 3;844,845,851;, + 3;844,851,850;, + 3;845,843,849;, + 3;845,849,851;, + 3;847,846,852;, + 3;847,852,853;, + 3;854,855,848;, + 3;848,1363,1364;, + 3;848,1364,854;, + 3;846,850,856;, + 3;846,856,852;, + 3;850,851,857;, + 3;850,857,856;, + 3;851,849,858;, + 3;851,858,857;, + 3;853,852,1365;, + 3;853,1365,1366;, + 3;858,855,1250;, + 3;1367,1368,1364;, + 3;852,856,1369;, + 3;852,1369,1365;, + 3;856,857,1370;, + 3;856,1370,1369;, + 3;857,858,1250;, + 3;857,1250,1370;, + 3;677,684,692;, + 3;677,692,1247;, + 3;855,858,849;, + 3;855,849,848;, + 3;855,854,1251;, + 3;855,1251,1250;, + 3;1368,1251,854;, + 3;1368,854,1364;, + 3;683,689,688;, + 3;859,860,861;, + 3;862,859,861;, + 3;862,861,863;, + 3;864,862,863;, + 3;864,863,865;, + 3;866,864,865;, + 3;866,865,867;, + 3;868,866,867;, + 3;868,867,869;, + 3;870,868,869;, + 3;870,869,871;, + 3;872,870,871;, + 3;872,871,873;, + 3;874,872,873;, + 3;875,876,877;, + 3;878,875,877;, + 3;879,880,877;, + 3;880,881,878;, + 3;880,878,877;, + 3;880,863,861;, + 3;879,873,871;, + 3;879,871,869;, + 3;880,879,869;, + 3;880,869,867;, + 3;880,867,865;, + 3;880,865,863;, + 3;880,861,881;, + 3;881,861,860;, + 3;882,883,859;, + 3;862,882,859;, + 3;884,882,862;, + 3;864,884,862;, + 3;885,884,864;, + 3;866,885,864;, + 3;886,885,866;, + 3;868,886,866;, + 3;887,886,868;, + 3;870,887,868;, + 3;888,887,870;, + 3;872,888,870;, + 3;889,888,872;, + 3;874,889,872;, + 3;890,891,892;, + 3;893,890,892;, + 3;890,894,895;, + 3;893,896,894;, + 3;890,893,894;, + 3;882,884,894;, + 3;888,889,895;, + 3;887,888,895;, + 3;894,887,895;, + 3;886,887,894;, + 3;885,886,894;, + 3;884,885,894;, + 3;896,882,894;, + 3;883,882,896;, + 3;1371,1372,1373;, + 3;1374,1375,1376;, + 3;1377,1378,1379;, + 3;1380,1377,1379;, + 3;1381,1382,1378;, + 3;1377,1381,1378;, + 3;1380,1379,1383;, + 3;1384,1380,1383;, + 3;1385,1386,1382;, + 3;1381,1385,1382;, + 3;1384,1383,1387;, + 3;1388,1384,1387;, + 3;1374,1376,1386;, + 3;1385,1374,1386;, + 3;1388,1387,1372;, + 3;1371,1388,1372;, + 3;897,898,899;, + 3;900,901,1389;, + 3;1390,900,1389;, + 3;902,903,904;, + 3;905,897,899;, + 3;906,900,1390;, + 3;1391,906,1390;, + 3;907,903,902;, + 3;908,905,899;, + 3;909,906,1391;, + 3;1392,909,1391;, + 3;910,903,907;, + 3;911,908,899;, + 3;912,909,1392;, + 3;1393,912,1392;, + 3;913,903,910;, + 3;914,911,899;, + 3;915,912,1393;, + 3;1394,915,1393;, + 3;916,903,913;, + 3;917,914,899;, + 3;918,915,1394;, + 3;1395,918,1394;, + 3;919,903,916;, + 3;920,917,899;, + 3;921,1396,1397;, + 3;1398,921,1397;, + 3;922,903,919;, + 3;898,920,899;, + 3;901,921,1398;, + 3;1389,901,1398;, + 3;904,903,922;, + 3;923,924,925;, + 3;926,923,925;, + 3;927,923,926;, + 3;928,927,926;, + 3;929,927,928;, + 3;930,929,928;, + 3;931,929,930;, + 3;932,931,930;, + 3;933,931,932;, + 3;934,933,932;, + 3;935,933,934;, + 3;936,935,934;, + 3;937,1399,1400;, + 3;938,937,1400;, + 3;924,937,938;, + 3;925,924,938;, + 3;939,940,941;, + 3;942,939,941;, + 3;943,939,942;, + 3;944,943,942;, + 3;945,943,944;, + 3;946,945,944;, + 3;947,945,946;, + 3;948,947,946;, + 3;949,947,948;, + 3;950,949,948;, + 3;951,949,950;, + 3;952,951,950;, + 3;953,1401,1402;, + 3;954,953,1402;, + 3;940,953,954;, + 3;941,940,954;, + 3;1403,1404,955;, + 3;956,1403,955;, + 3;1405,1403,956;, + 3;957,1405,956;, + 3;1406,1405,957;, + 3;958,1406,957;, + 3;1407,1406,958;, + 3;959,1407,958;, + 3;1408,1407,959;, + 3;960,1408,959;, + 3;1409,1408,960;, + 3;961,1409,960;, + 3;1410,1411,1412;, + 3;962,1410,1412;, + 3;1404,1410,962;, + 3;955,1404,962;, + 3;963,964,965;, + 3;966,963,965;, + 3;967,963,966;, + 3;968,967,966;, + 3;969,967,968;, + 3;970,969,968;, + 3;971,969,970;, + 3;972,971,970;, + 3;973,971,972;, + 3;974,973,972;, + 3;975,973,974;, + 3;976,975,974;, + 3;977,1413,1414;, + 3;978,977,1414;, + 3;964,977,978;, + 3;965,964,978;, + 3;1415,1416,1417;, + 3;1418,1415,1417;, + 3;1419,1420,1421;, + 3;1422,1419,1421;, + 3;1423,1424,1416;, + 3;1415,1423,1416;, + 3;1422,1421,1425;, + 3;1426,1422,1425;, + 3;1427,1428,1424;, + 3;1423,1427,1424;, + 3;1426,1425,1429;, + 3;1430,1426,1429;, + 3;1431,1432,1428;, + 3;1427,1431,1428;, + 3;1430,1429,1433;, + 3;1434,1430,1433;, + 3;1435,1436,1432;, + 3;1431,1435,1432;, + 3;1434,1433,1437;, + 3;1438,1434,1437;, + 3;1439,1440,1436;, + 3;1435,1439,1436;, + 3;1438,1437,1441;, + 3;1442,1438,1441;, + 3;1443,1444,1440;, + 3;1439,1443,1440;, + 3;1442,1441,1445;, + 3;1446,1442,1445;, + 3;1418,1417,1444;, + 3;1443,1418,1444;, + 3;1446,1445,1420;, + 3;1419,1446,1420;, + 3;1447,1448,1449;, + 3;1450,1447,1449;, + 3;1451,1452,1453;, + 3;1454,1451,1453;, + 3;1455,1456,1448;, + 3;1447,1455,1448;, + 3;1454,1453,1457;, + 3;1458,1454,1457;, + 3;1459,1460,1456;, + 3;1455,1459,1456;, + 3;1458,1457,1461;, + 3;1462,1458,1461;, + 3;1463,1464,1460;, + 3;1459,1463,1460;, + 3;1462,1461,1465;, + 3;1466,1462,1465;, + 3;1467,1468,1464;, + 3;1463,1467,1464;, + 3;1466,1465,1469;, + 3;1470,1466,1469;, + 3;1471,1472,1468;, + 3;1467,1471,1468;, + 3;1470,1469,1473;, + 3;1474,1470,1473;, + 3;1475,1476,1472;, + 3;1471,1475,1472;, + 3;1474,1473,1477;, + 3;1478,1474,1477;, + 3;1450,1449,1476;, + 3;1475,1450,1476;, + 3;1478,1477,1452;, + 3;1451,1478,1452;; + + MeshNormals + { + 979; + -0.129816;-0.852990;-0.505525;, + 0.036964;-0.991876;-0.121718;, + -0.698699;-0.688078;-0.195877;, + -0.708337;-0.651960;-0.270567;, + -0.006954;-0.960460;0.278330;, + -0.700324;-0.650018;0.294997;, + 0.302430;-0.952051;0.046201;, + -0.276584;-0.929242;-0.244971;, + 0.094428;0.853934;0.511742;, + 0.336283;-0.009104;0.941717;, + 0.556489;-0.055914;0.828972;, + 0.759730;0.498962;0.416950;, + 0.034747;0.947415;-0.318114;, + 0.731470;0.541587;-0.414288;, + 0.105400;0.061590;-0.992521;, + 0.621131;-0.303408;-0.722592;, + 0.541167;-0.749736;0.380833;, + -0.709843;0.544304;0.447052;, + -0.207902;-0.308447;0.928244;, + 0.546967;-0.813260;-0.198582;, + -0.735620;0.642658;-0.214135;, + 0.607416;-0.793959;-0.025956;, + -0.702457;0.230287;-0.673440;, + 0.609483;-0.790811;-0.056108;, + 0.698700;-0.688078;-0.195877;, + -0.036964;-0.991876;-0.121718;, + 0.129816;-0.852990;-0.505525;, + 0.708337;-0.651961;-0.270567;, + 0.006954;-0.960460;0.278330;, + 0.700323;-0.650018;0.294997;, + -0.302430;-0.952051;0.046201;, + 0.276584;-0.929242;-0.244970;, + -0.556488;-0.055914;0.828972;, + -0.336283;-0.009104;0.941717;, + -0.094428;0.853934;0.511742;, + -0.759730;0.498962;0.416950;, + -0.034747;0.947415;-0.318114;, + -0.731472;0.541585;-0.414288;, + -0.105400;0.061590;-0.992521;, + -0.621131;-0.303409;-0.722592;, + -0.541168;-0.749736;0.380833;, + 0.709843;0.544305;0.447052;, + 0.207903;-0.308447;0.928244;, + -0.546967;-0.813260;-0.198581;, + 0.735620;0.642658;-0.214134;, + -0.607415;-0.793960;-0.025956;, + 0.702458;0.230287;-0.673439;, + -0.609482;-0.790812;-0.056107;, + 0.715168;-0.546642;0.435566;, + 0.174589;-0.765639;0.619125;, + 0.311507;-0.029519;0.949785;, + 0.802549;-0.063801;0.593165;, + 0.674954;-0.705769;0.215238;, + 0.965425;-0.079199;0.248359;, + 0.989682;-0.086167;0.114472;, + 0.589572;-0.802548;0.091222;, + 0.222087;-0.142281;-0.964590;, + 0.239432;-0.628781;-0.739802;, + 0.451846;-0.276668;-0.848110;, + 0.400719;-0.107309;-0.909895;, + 0.345620;-0.589510;-0.730086;, + 0.552622;-0.313025;-0.772414;, + 0.714052;-0.151501;-0.683504;, + -0.111976;0.059755;-0.991913;, + 0.000000;-0.303073;-0.952967;, + 0.408905;-0.168156;-0.896951;, + -0.008987;0.245821;-0.969274;, + 0.637596;0.116274;-0.761545;, + 0.862761;-0.168404;-0.476742;, + 0.607110;0.434795;-0.665110;, + 0.093622;-0.452750;-0.886709;, + 0.454447;-0.542535;-0.706493;, + 0.433850;-0.537110;-0.723386;, + 0.668027;-0.011998;-0.744040;, + 0.770806;0.495623;-0.400270;, + 0.695970;-0.572016;-0.434078;, + 0.452755;-0.608582;-0.651645;, + 0.678173;0.659980;-0.323276;, + 0.561443;-0.626268;-0.540898;, + 0.695491;-0.680703;-0.230080;, + 0.320057;-0.465858;-0.824948;, + 0.015522;-0.721373;-0.692373;, + 0.025936;-0.639799;-0.768104;, + 0.267999;-0.896130;-0.353734;, + 0.429871;0.677744;-0.596552;, + 0.870887;0.286101;-0.399627;, + 0.899576;0.029925;-0.435739;, + 0.877351;-0.421108;0.230049;, + 0.727191;0.647472;0.227974;, + 0.251564;-0.085554;-0.964052;, + 0.443688;0.461641;-0.768133;, + 0.574683;-0.083305;-0.814125;, + 0.736077;0.391009;-0.552541;, + 0.899391;-0.211232;-0.382723;, + 0.958834;0.021238;-0.283171;, + 0.746330;-0.655766;-0.113851;, + 0.972458;-0.091984;-0.214160;, + 0.939346;-0.154664;-0.306116;, + 0.394895;-0.519206;-0.757947;, + 0.079536;-0.698997;-0.710688;, + 0.793478;0.264078;-0.548321;, + 0.593612;0.315377;-0.740379;, + 0.122186;-0.410372;-0.903696;, + -0.025452;0.456614;-0.889301;, + 0.117224;0.694033;-0.710336;, + 0.364145;0.733069;-0.574464;, + 0.345959;-0.296498;-0.890169;, + -0.135622;-0.348879;-0.927303;, + 0.466699;0.709807;-0.527604;, + 0.226468;-0.163193;-0.960250;, + 0.506498;0.620402;-0.598799;, + 0.485375;0.342365;-0.804486;, + 0.470753;0.400109;-0.786323;, + -0.507537;-0.402332;-0.761929;, + 0.800830;0.191458;-0.567463;, + 0.889577;0.287018;-0.355350;, + 0.266019;0.013318;-0.963876;, + -0.642198;0.006037;-0.766515;, + 0.425486;0.746189;-0.512018;, + 0.409779;0.681736;-0.606067;, + -0.058171;0.604638;-0.794374;, + 0.508624;0.701385;-0.499359;, + 0.286727;-0.054946;-0.956435;, + -0.316097;0.145690;-0.937474;, + -0.114483;-0.612880;-0.781838;, + -0.732130;-0.218041;-0.645325;, + -0.077040;0.341658;-0.936662;, + 0.982790;0.168633;-0.075412;, + 0.736791;0.340065;-0.584375;, + -0.327315;-0.220940;-0.918722;, + -0.356933;-0.916762;-0.179292;, + 0.858059;0.295560;-0.419974;, + 0.982755;-0.116030;0.143980;, + 0.686546;-0.436660;0.581362;, + -0.114684;-0.032216;-0.992880;, + -0.610499;-0.792017;0.000055;, + 0.997650;0.023444;-0.064385;, + 0.994914;-0.019735;0.098779;, + 0.607825;0.764607;-0.214302;, + 0.169187;0.272448;0.947179;, + -0.308242;0.468162;-0.828137;, + -0.945384;-0.259556;0.197182;, + 0.724385;0.622190;-0.296892;, + 0.338665;0.069750;0.938318;, + -0.281176;0.325935;-0.902611;, + -0.944702;-0.225837;0.237773;, + 0.943751;0.081290;-0.320510;, + 0.309733;-0.452451;0.836274;, + 0.122451;-0.025404;-0.992149;, + -0.820495;-0.556147;-0.132241;, + 0.521386;-0.621684;-0.584522;, + 0.000004;-0.667404;0.744696;, + 0.000000;0.082569;0.996585;, + 0.955176;-0.093355;0.280935;, + 0.907373;-0.032566;0.419063;, + 0.017997;0.304606;0.952308;, + 0.611072;0.197838;0.766453;, + 0.839507;0.190096;0.509010;, + 0.969844;0.099854;0.222331;, + 0.141318;0.262440;0.954544;, + 0.596370;0.185083;0.781081;, + 0.866160;0.114817;0.486400;, + 0.988906;0.103392;0.106655;, + 0.988842;0.100552;0.109915;, + 0.000104;-0.599228;0.800578;, + 0.173663;-0.620057;0.765095;, + 0.570753;-0.654192;0.496260;, + 0.741579;-0.628361;0.234997;, + 0.750948;-0.640212;0.161879;, + 0.775887;-0.622672;-0.101386;, + 0.726861;-0.637107;-0.256451;, + 0.518488;-0.628231;-0.580083;, + 0.282637;-0.599455;-0.748846;, + 0.039464;-0.606899;-0.793799;, + 0.000173;0.124733;0.992190;, + 0.273998;0.111428;0.955253;, + 0.810070;0.159410;0.564247;, + 0.923389;0.204059;0.325134;, + 0.963267;0.228823;0.140559;, + 0.961478;0.230312;-0.150056;, + 0.893601;0.214711;-0.394178;, + 0.628384;0.178155;-0.757228;, + 0.365227;0.121643;-0.922937;, + -0.008183;0.142392;-0.989776;, + 0.000103;0.483720;0.875223;, + 0.277107;0.511871;0.813142;, + 0.698315;0.579992;0.419483;, + 0.784868;0.562838;0.259223;, + 0.803441;0.586284;0.103699;, + 0.816344;0.565091;-0.119395;, + 0.765667;0.558811;-0.318567;, + 0.582400;0.519613;-0.625150;, + 0.339503;0.496872;-0.798658;, + -0.010072;0.503689;-0.863826;, + -0.000170;0.838829;0.544394;, + 0.209122;0.860779;0.464035;, + 0.472183;0.850685;0.231037;, + 0.524210;0.831400;0.184332;, + 0.548334;0.835391;0.038098;, + 0.560725;0.823931;-0.082001;, + 0.493044;0.839080;-0.229897;, + 0.356599;0.845126;-0.398246;, + 0.193906;0.838344;-0.509490;, + -0.030005;0.838012;-0.544826;, + 0.000000;0.999889;-0.014920;, + -0.247610;-0.617187;0.746839;, + -0.640144;-0.698513;0.319837;, + -0.845216;-0.109792;0.523025;, + -0.332309;0.120583;0.935431;, + -0.951232;-0.100313;0.291711;, + -0.607708;-0.765854;0.210140;, + -0.794975;-0.601716;0.077149;, + -0.992358;-0.084286;0.090118;, + -0.540786;-0.310747;-0.781657;, + -0.243635;-0.604159;-0.758705;, + -0.239575;-0.129408;-0.962215;, + -0.457699;-0.311417;-0.832785;, + -0.601820;-0.346641;-0.719481;, + -0.372432;-0.542919;-0.752685;, + -0.727575;-0.138985;-0.671802;, + -0.462077;-0.172950;-0.869812;, + -0.526055;0.267394;-0.807321;, + -0.889688;-0.200487;-0.410196;, + -0.661906;0.183020;-0.726900;, + -0.482780;-0.428287;-0.763868;, + -0.368326;-0.722170;-0.585497;, + -0.844542;0.459938;-0.274236;, + -0.681525;0.387393;-0.620847;, + -0.605303;-0.397304;-0.689752;, + -0.673388;-0.491201;-0.552514;, + -0.657816;0.645924;-0.387376;, + -0.662135;-0.671377;-0.332913;, + -0.486791;-0.582794;-0.650681;, + -0.258785;-0.568614;-0.780839;, + -0.513083;0.131989;-0.848130;, + -0.297505;-0.905023;-0.304014;, + -0.895981;0.262607;-0.358127;, + -0.675033;0.466963;-0.571206;, + -0.901019;0.266881;0.341965;, + -0.680425;-0.732688;-0.013786;, + -0.259518;-0.023921;-0.965442;, + -0.514018;0.532502;-0.672478;, + -0.645404;-0.118674;-0.754566;, + -0.641496;0.340399;-0.687468;, + -0.875472;-0.233593;-0.423064;, + -0.941780;-0.006383;-0.336169;, + -0.729762;-0.674587;-0.111267;, + -0.974729;-0.092161;-0.203496;, + -0.948685;-0.159768;-0.272894;, + -0.413516;-0.551069;-0.724795;, + -0.452430;-0.424111;-0.784497;, + -0.633631;0.387785;-0.669429;, + -0.759347;0.388122;-0.522258;, + -0.349670;0.699505;-0.623236;, + -0.367983;-0.326177;-0.870745;, + -0.426287;0.691018;-0.583758;, + 0.024608;-0.361630;-0.931997;, + -0.506095;0.593595;-0.625710;, + 0.205299;-0.327376;-0.922321;, + -0.019213;0.001677;-0.999814;, + -0.592122;0.499030;-0.632740;, + -0.705863;0.322617;-0.630616;, + -0.858342;0.333085;-0.390262;, + 0.520378;-0.115323;-0.846113;, + -0.098311;0.739985;-0.665400;, + -0.505485;0.718564;-0.477651;, + -0.429291;0.753222;-0.498363;, + -0.436628;0.579844;-0.687850;, + -0.018955;0.315468;-0.948747;, + 0.628680;-0.297343;-0.718574;, + 0.340473;0.081313;-0.936732;, + -0.987372;0.150062;-0.050767;, + -0.879193;0.307819;-0.363685;, + -0.071334;0.098893;-0.992538;, + 0.552973;-0.594293;-0.583984;, + -0.838304;0.391818;-0.379111;, + -0.660024;-0.355125;0.662008;, + -0.878202;-0.379715;0.290821;, + 0.063977;0.037528;-0.997245;, + 0.565936;-0.819042;-0.094270;, + -0.991440;0.023648;-0.128400;, + -0.999073;0.010052;0.041867;, + -0.576121;0.786004;-0.224237;, + -0.253102;0.252826;0.933819;, + 0.335569;0.443367;-0.831155;, + 0.943943;-0.232201;0.234638;, + -0.746213;0.592914;-0.302686;, + -0.189845;0.217076;0.957516;, + 0.237934;0.300377;-0.923667;, + 0.932614;-0.306696;0.190181;, + -0.854338;0.099672;-0.510071;, + -0.759448;-0.294301;0.580194;, + 0.213648;-0.150954;-0.965177;, + 0.739086;-0.584441;0.334935;, + -0.521385;-0.621686;-0.584521;, + -0.921296;-0.000592;0.388863;, + -0.962588;-0.092104;0.254837;, + -0.643832;0.151144;0.750091;, + -0.980272;0.070344;0.184714;, + -0.849418;0.188211;0.493017;, + -0.517473;0.220460;0.826812;, + -0.775120;0.146862;0.614508;, + -0.979260;0.103055;0.174438;, + -0.988842;0.100551;0.109916;, + -0.257131;-0.613480;0.746677;, + -0.655025;-0.643192;0.396543;, + -0.729698;-0.628342;0.269680;, + -0.767211;-0.638569;0.060144;, + -0.773397;-0.623118;-0.116540;, + -0.694093;-0.641310;-0.327041;, + -0.455929;-0.638307;-0.620236;, + -0.253991;-0.603628;-0.755726;, + -0.290181;0.120439;0.949363;, + -0.790874;0.202403;0.577539;, + -0.923458;0.210735;0.320651;, + -0.959298;0.234558;0.157257;, + -0.963277;0.224319;-0.147576;, + -0.900844;0.202218;-0.384172;, + -0.646321;0.146493;-0.748871;, + -0.336180;0.122826;-0.933754;, + -0.268545;0.501480;0.822436;, + -0.701566;0.531626;0.474529;, + -0.791663;0.556265;0.252664;, + -0.805765;0.578042;0.128881;, + -0.812528;0.571712;-0.113773;, + -0.760729;0.577526;-0.296236;, + -0.589180;0.554444;-0.587757;, + -0.331045;0.502521;-0.798675;, + -0.118111;0.855986;0.503326;, + -0.413323;0.856582;0.308919;, + -0.532739;0.831452;0.157727;, + -0.535078;0.837140;0.113529;, + -0.562623;0.823042;-0.077821;, + -0.522170;0.835158;-0.172769;, + -0.396124;0.843506;-0.362744;, + -0.243647;0.844427;-0.477053;, + -0.585560;-0.168913;0.792836;, + -0.979025;-0.171040;-0.110706;, + -0.868505;-0.466650;0.167143;, + -0.289501;-0.466650;0.835720;, + 0.000148;0.999994;-0.003359;, + 0.394045;-0.169028;0.903414;, + 0.579005;-0.466650;0.668574;, + 0.979037;-0.171271;0.110238;, + 0.868506;-0.466648;-0.167143;, + 0.584817;-0.173401;-0.792415;, + 0.289503;-0.466649;-0.835719;, + -0.393644;-0.173286;-0.902783;, + -0.579003;-0.466649;-0.668576;, + -0.130098;0.890443;0.436104;, + -0.236889;0.850100;-0.470334;, + -0.175642;0.968564;-0.176161;, + -0.060805;0.637960;0.767665;, + 0.235836;0.103418;0.966274;, + 0.172266;-0.360525;0.916704;, + 0.503507;-0.734161;0.455509;, + 0.250506;-0.953163;0.169488;, + 0.379678;-0.782095;-0.494138;, + 0.086510;-0.635228;-0.767464;, + -0.026852;0.043388;-0.998697;, + -0.120815;0.369417;-0.921377;, + -0.615710;0.743650;-0.260549;, + -0.318016;0.682023;0.658567;, + 0.454590;0.074146;0.887610;, + 0.872061;-0.456119;0.177383;, + 0.544687;-0.374159;-0.750547;, + -0.205593;0.244510;-0.947600;, + -0.947918;0.318514;-0.000749;, + -0.382719;0.448240;0.807841;, + 0.611759;0.246959;0.751507;, + 0.993888;-0.069640;-0.085659;, + 0.432662;-0.176959;-0.884019;, + -0.548317;0.022330;-0.835973;, + -0.007283;0.942541;-0.334010;, + 0.175641;0.968564;-0.176163;, + 0.236889;0.850100;-0.470334;, + 0.130099;0.890443;0.436103;, + 0.060805;0.637960;0.767665;, + -0.235836;0.103418;0.966274;, + -0.172267;-0.360525;0.916704;, + -0.503507;-0.734161;0.455508;, + -0.250507;-0.953164;0.169486;, + -0.379678;-0.782095;-0.494138;, + -0.086509;-0.635227;-0.767465;, + 0.026852;0.043389;-0.998697;, + 0.120815;0.369418;-0.921376;, + 0.615711;0.743650;-0.260548;, + 0.318016;0.682023;0.658567;, + -0.454590;0.074146;0.887609;, + -0.872061;-0.456119;0.177385;, + -0.544687;-0.374159;-0.750547;, + 0.205595;0.244511;-0.947600;, + 0.947918;0.318513;-0.000749;, + 0.382720;0.448240;0.807841;, + -0.611758;0.246959;0.751507;, + -0.993888;-0.069640;-0.085659;, + -0.432660;-0.176959;-0.884020;, + 0.548319;0.022332;-0.835971;, + 0.007296;0.942541;-0.334010;, + 0.326102;-0.301915;0.895826;, + 0.290390;0.081714;0.953413;, + 0.282586;0.359266;0.889423;, + 0.732955;0.505070;0.455721;, + 0.196255;0.976233;0.091942;, + 0.000000;0.983658;-0.180048;, + 0.092154;0.912052;0.399586;, + 0.685876;-0.491759;-0.536421;, + 0.803250;0.595471;-0.014278;, + 0.173689;0.943714;-0.281490;, + 0.755928;0.238778;-0.609556;, + 0.573852;0.647817;-0.501026;, + 0.218078;0.832084;-0.509980;, + 0.273387;0.254330;-0.927672;, + 0.177185;0.758963;-0.626563;, + 0.152142;0.771846;-0.617338;, + 0.000000;0.507928;-0.861399;, + -0.000000;0.336033;-0.941850;, + 0.302092;0.176073;0.936877;, + 0.240533;0.336563;0.910422;, + 0.663467;0.421496;-0.618184;, + 0.427727;0.228952;-0.874432;, + 0.230252;0.500003;-0.834854;, + 0.000000;0.578617;-0.815600;, + 0.307879;0.805978;0.505580;, + 0.145346;0.598582;0.787765;, + 0.405591;0.657823;-0.634638;, + 0.402621;0.826286;-0.393887;, + 0.226398;0.640557;-0.733779;, + 0.000000;0.846676;0.532109;, + 0.000000;0.512865;0.858469;, + 0.000000;0.063273;0.997996;, + 0.000000;0.457798;0.889057;, + -0.000000;0.804821;-0.593518;, + -0.000000;0.248350;0.968670;, + 0.000000;0.609069;-0.793118;, + 0.227767;0.807947;0.543456;, + 0.281507;0.877647;-0.387930;, + -0.282586;0.359266;0.889423;, + -0.290390;0.081714;0.953413;, + -0.326102;-0.301915;0.895826;, + -0.732955;0.505070;0.455721;, + -0.092154;0.912052;0.399586;, + -0.196255;0.976233;0.091942;, + -0.685876;-0.491759;-0.536421;, + -0.803250;0.595471;-0.014278;, + -0.173689;0.943714;-0.281490;, + -0.755928;0.238778;-0.609556;, + -0.573852;0.647817;-0.501026;, + -0.218077;0.832084;-0.509980;, + -0.273387;0.254330;-0.927672;, + -0.177185;0.758963;-0.626563;, + -0.152141;0.771846;-0.617338;, + -0.240533;0.336564;0.910422;, + -0.302092;0.176073;0.936877;, + -0.427727;0.228952;-0.874432;, + -0.663467;0.421497;-0.618184;, + -0.230252;0.500003;-0.834854;, + -0.145346;0.598582;0.787765;, + -0.307879;0.805978;0.505580;, + -0.402622;0.826286;-0.393887;, + -0.405591;0.657823;-0.634638;, + -0.226397;0.640557;-0.733779;, + -0.227767;0.807947;0.543456;, + -0.281507;0.877647;-0.387931;, + -0.519282;-0.801856;-0.295590;, + 0.628811;0.048486;-0.776045;, + 0.075597;0.061964;-0.995211;, + -0.768733;-0.464430;-0.439722;, + -0.776444;-0.621408;0.104819;, + -0.008636;0.241742;0.970302;, + -0.519681;-0.462756;0.718184;, + -0.392286;-0.395655;0.830403;, + 0.606488;0.362636;0.707578;, + 0.634201;0.590890;0.498637;, + -0.532226;-0.846074;0.029908;, + 0.733299;-0.679627;0.019472;, + 0.395655;-0.688028;0.608338;, + -0.626298;-0.623654;0.467767;, + -0.615564;-0.788001;-0.011651;, + 0.737398;0.614678;-0.280025;, + -0.020657;0.352402;-0.935621;, + -0.283460;-0.739558;-0.610496;, + 0.671011;-0.430239;-0.603853;, + -0.978692;0.134618;-0.155050;, + -0.093467;0.573633;-0.813763;, + -0.077464;0.247205;-0.965862;, + -0.990913;0.025340;-0.132096;, + -0.772378;-0.597866;-0.214449;, + 0.872971;0.472486;-0.121157;, + 0.815150;0.020096;-0.578901;, + -0.017212;-0.667549;0.744367;, + -0.025443;-0.997470;0.066387;, + 0.063832;-0.326004;-0.943211;, + 0.938699;-0.157979;-0.306408;, + 0.658994;-0.420980;0.623300;, + 0.999001;-0.033016;-0.030116;, + 0.005130;0.183809;-0.982949;, + -0.933054;-0.303730;-0.192764;, + 0.991412;0.128365;-0.025012;, + 0.649195;-0.068635;0.757519;, + -0.555420;-0.356113;0.751460;, + -0.937074;-0.338487;0.085549;, + 0.447515;0.045262;-0.893130;, + -0.705682;-0.354669;-0.613370;, + -0.592644;-0.622931;0.510618;, + -0.752771;-0.619673;-0.222128;, + 0.720371;-0.617368;-0.316104;, + -0.683253;-0.627919;-0.372670;, + 0.769514;-0.558111;-0.310419;, + -0.562589;-0.760251;-0.324828;, + -0.204878;-0.344714;-0.916077;, + 0.446447;-0.607871;-0.656642;, + -0.711056;-0.698405;0.081424;, + 0.643951;-0.736522;-0.207031;, + 0.686779;-0.713298;0.139789;, + -0.413593;0.147648;0.898410;, + -0.990075;-0.050814;0.131034;, + 0.321552;-0.282128;0.903885;, + 0.624392;0.208123;0.752874;, + 0.996072;0.072527;0.050800;, + -0.386575;0.167860;-0.906853;, + 0.318836;0.181672;-0.930236;, + -0.965362;0.116386;-0.233516;, + 0.885875;0.093258;-0.454453;, + -0.998737;-0.000577;-0.050239;, + 0.997215;0.069558;-0.026922;, + -0.059927;0.707805;-0.703861;, + 0.750455;0.543429;-0.376168;, + -0.617940;0.665192;-0.419130;, + -0.803206;0.582659;-0.123972;, + 0.704325;0.662368;-0.255334;, + 0.082622;0.499858;-0.862158;, + 0.931934;0.103939;-0.347414;, + -0.027959;0.981500;-0.189407;, + -0.050360;0.933873;-0.354042;, + 0.981209;0.015725;0.192306;, + -0.827387;-0.039311;-0.560255;, + -0.986340;-0.131712;-0.098922;, + -0.787094;-0.082947;0.611231;, + -0.006351;0.094118;0.995541;, + 0.498810;0.079278;0.863078;, + -0.740122;-0.312903;0.595240;, + -0.938230;-0.345002;0.026413;, + -0.993493;0.048503;0.103045;, + -0.673953;0.185181;0.715189;, + -0.108392;-0.207274;0.972260;, + 0.051154;0.195171;0.979434;, + 0.639562;-0.102929;0.761818;, + 0.704736;0.180554;0.686111;, + 0.998869;-0.047538;-0.000576;, + 0.958935;0.173981;-0.223994;, + 0.698266;-0.181001;-0.692577;, + 0.620972;0.089948;-0.778655;, + 0.016398;-0.443063;-0.896341;, + -0.144390;-0.065290;-0.987365;, + -0.728851;-0.441912;-0.522963;, + -0.871827;-0.033825;-0.488645;, + -0.626805;-0.572093;0.528985;, + -0.871386;-0.490489;0.010370;, + -0.076929;-0.452265;0.888559;, + 0.626649;-0.191510;0.755404;, + 0.998179;0.029379;0.052680;, + 0.721135;-0.035727;-0.691873;, + 0.076054;-0.310273;-0.947600;, + -0.686595;-0.525811;-0.502105;, + -0.330716;-0.736732;0.589791;, + -0.000000;-0.999826;-0.018662;, + 0.814386;0.118924;0.568007;, + 0.793032;-0.131439;-0.594831;, + 0.983958;0.171788;0.048122;, + 0.282352;-0.374795;-0.883066;, + -0.000000;-0.704137;-0.710064;, + 0.479848;0.732180;-0.483382;, + 0.372803;0.739708;0.560223;, + 0.661563;0.611093;0.434626;, + 0.699606;0.569916;-0.430984;, + 0.710696;0.422097;0.562801;, + 0.295926;0.387851;0.872926;, + 0.837365;0.545835;0.029727;, + 0.634042;0.611621;-0.473192;, + 0.202625;0.600191;-0.773766;, + 0.000000;0.760465;-0.649379;, + 0.746427;-0.359817;0.559803;, + 0.315278;-0.350053;0.882078;, + 0.925014;-0.373716;0.068452;, + 0.702484;-0.584123;-0.406592;, + 0.277977;-0.495656;-0.822833;, + 0.000000;-0.326323;-0.945258;, + 0.788118;-0.183645;0.587491;, + 0.253204;-0.328259;0.910019;, + 0.953596;-0.298213;-0.041519;, + 0.649818;-0.613601;-0.448587;, + 0.213921;-0.752172;-0.623277;, + 0.000000;-0.760910;-0.648858;, + 0.750713;0.268051;0.603803;, + 0.000000;-0.632247;-0.774767;, + 0.000000;0.293377;0.955997;, + 0.000000;-0.458024;0.888940;, + 0.000000;-0.247527;0.968881;, + -0.000000;-0.929061;0.369927;, + 0.000000;-0.674749;0.738047;, + 0.000000;0.121068;0.992644;, + 0.413319;0.153508;0.897554;, + 0.000000;-0.048684;0.998814;, + 0.333509;-0.199190;0.921464;, + -0.715206;-0.667542;0.207047;, + -0.578980;-0.808463;-0.105693;, + -0.254152;-0.724281;0.640955;, + 0.350123;-0.705733;0.615918;, + 0.521829;-0.685532;0.507681;, + 0.582105;-0.748288;-0.318149;, + 0.259672;-0.758109;-0.598199;, + -0.324676;-0.788502;-0.522351;, + -0.164580;-0.761217;0.627266;, + -0.489043;-0.865249;0.110364;, + 0.147015;-0.759744;0.633384;, + 0.605120;-0.686438;0.403277;, + 0.602435;-0.766434;-0.222825;, + 0.157318;-0.949324;-0.272095;, + -0.166899;-0.916412;-0.363778;, + -0.427237;-0.891048;-0.153303;, + -0.649900;-0.035036;0.759212;, + -0.985761;-0.163298;-0.040116;, + 0.036046;0.034905;0.998740;, + 0.608077;0.178337;0.773588;, + 0.981662;0.163987;0.097203;, + 0.740908;-0.121535;-0.660519;, + -0.006847;-0.316355;-0.948616;, + -0.687977;-0.293549;-0.663714;, + 0.152727;0.197261;0.968381;, + 0.101821;-0.074160;-0.992035;, + 0.114730;0.027382;0.993019;, + -0.400147;-0.785877;0.471465;, + -0.373140;-0.766605;-0.522573;, + 0.346292;-0.166438;-0.923244;, + 0.519780;0.635299;0.571160;, + 0.747186;0.566650;-0.347307;, + -0.236063;0.200824;0.950760;, + -0.838795;-0.373110;0.396500;, + -0.651438;-0.450605;-0.610396;, + -0.031669;0.154102;-0.987547;, + 0.201281;0.810006;0.550796;, + 0.239147;0.872811;-0.425453;, + 0.299406;-0.276504;0.913182;, + -0.090325;-0.956867;0.276130;, + 0.102216;-0.745525;-0.658593;, + 0.569936;-0.148382;-0.808181;, + 0.711459;0.196812;0.674605;, + 0.934562;0.328093;-0.137656;, + 0.670078;-0.315307;0.671995;, + 0.433905;-0.762868;0.479331;, + 0.392697;-0.891971;-0.224004;, + 0.619791;-0.530830;-0.577995;, + 0.937105;-0.010824;0.348879;, + 0.942842;-0.125596;-0.308665;, + 0.179838;-0.052199;0.982310;, + -0.225765;-0.835864;0.500361;, + -0.124005;-0.775689;-0.618813;, + 0.254434;-0.153439;-0.954840;, + 0.632262;0.479231;0.608755;, + 0.779351;0.507865;-0.366995;, + 0.211083;-0.007310;0.977441;, + -0.425351;-0.766520;0.481169;, + -0.099996;-0.506703;-0.856302;, + -0.397481;-0.777098;-0.487983;, + 0.691760;0.435659;0.575908;, + 0.783622;0.512593;-0.350976;, + 0.312687;-0.071199;-0.947184;, + -0.075596;0.061964;-0.995211;, + -0.628811;0.048486;-0.776045;, + 0.519283;-0.801855;-0.295591;, + 0.768732;-0.464431;-0.439721;, + 0.776443;-0.621410;0.104818;, + 0.392286;-0.395655;0.830403;, + 0.519681;-0.462756;0.718184;, + 0.008636;0.241742;0.970302;, + -0.606488;0.362636;0.707579;, + -0.634201;0.590890;0.498637;, + -0.395655;-0.688028;0.608338;, + -0.733299;-0.679627;0.019472;, + 0.532226;-0.846074;0.029908;, + 0.626299;-0.623654;0.467766;, + 0.615564;-0.788001;-0.011651;, + 0.020657;0.352402;-0.935621;, + -0.737398;0.614678;-0.280026;, + -0.671012;-0.430239;-0.603852;, + 0.283460;-0.739558;-0.610496;, + 0.077465;0.247205;-0.965862;, + 0.093468;0.573633;-0.813762;, + 0.978692;0.134617;-0.155050;, + 0.990913;0.025337;-0.132097;, + 0.772378;-0.597866;-0.214449;, + -0.872971;0.472486;-0.121157;, + -0.815150;0.020096;-0.578901;, + 0.017212;-0.667549;0.744367;, + -0.938699;-0.157978;-0.306411;, + -0.063832;-0.326003;-0.943211;, + 0.025442;-0.997470;0.066384;, + -0.658998;-0.420978;0.623297;, + -0.005131;0.183808;-0.982949;, + -0.999001;-0.033016;-0.030117;, + 0.933054;-0.303731;-0.192763;, + -0.991412;0.128365;-0.025011;, + -0.649195;-0.068635;0.757519;, + 0.555420;-0.356114;0.751459;, + 0.937074;-0.338488;0.085548;, + -0.447516;0.045263;-0.893130;, + 0.705682;-0.354669;-0.613370;, + -0.720371;-0.617367;-0.316106;, + 0.752772;-0.619672;-0.222130;, + 0.592644;-0.622930;0.510618;, + -0.769512;-0.558113;-0.310422;, + 0.683253;-0.627918;-0.372671;, + -0.446447;-0.607871;-0.656642;, + 0.204878;-0.344714;-0.916077;, + 0.562588;-0.760251;-0.324828;, + -0.643951;-0.736523;-0.207031;, + 0.711056;-0.698405;0.081424;, + -0.686777;-0.713299;0.139789;, + 0.990075;-0.050814;0.131033;, + 0.413593;0.147648;0.898410;, + -0.624392;0.208124;0.752874;, + -0.321551;-0.282128;0.903885;, + -0.996072;0.072527;0.050799;, + -0.318836;0.181672;-0.930236;, + 0.386574;0.167859;-0.906854;, + 0.965362;0.116386;-0.233516;, + -0.885875;0.093257;-0.454453;, + 0.998737;-0.000577;-0.050239;, + -0.997215;0.069557;-0.026922;, + -0.750455;0.543429;-0.376168;, + 0.059927;0.707805;-0.703862;, + 0.617939;0.665192;-0.419130;, + 0.803206;0.582659;-0.123972;, + -0.704325;0.662368;-0.255334;, + -0.931934;0.103939;-0.347414;, + -0.082622;0.499858;-0.862158;, + 0.050360;0.933873;-0.354042;, + 0.027959;0.981500;-0.189407;, + -0.981209;0.015725;0.192306;, + 0.827387;-0.039311;-0.560255;, + 0.986340;-0.131712;-0.098922;, + 0.787094;-0.082947;0.611231;, + 0.006351;0.094118;0.995541;, + -0.498810;0.079278;0.863078;, + 0.993493;0.048503;0.103045;, + 0.938231;-0.345001;0.026413;, + 0.740122;-0.312902;0.595241;, + 0.673953;0.185182;0.715189;, + 0.108392;-0.207274;0.972260;, + -0.051154;0.195171;0.979434;, + -0.639562;-0.102930;0.761817;, + -0.704736;0.180553;0.686111;, + -0.998869;-0.047539;-0.000576;, + -0.958935;0.173981;-0.223994;, + -0.698266;-0.181001;-0.692577;, + -0.620972;0.089947;-0.778655;, + -0.016398;-0.443063;-0.896341;, + 0.144390;-0.065289;-0.987365;, + 0.728851;-0.441912;-0.522963;, + 0.871827;-0.033824;-0.488645;, + 0.871385;-0.490489;0.010371;, + 0.626805;-0.572093;0.528985;, + 0.076929;-0.452265;0.888559;, + -0.626649;-0.191510;0.755404;, + -0.998179;0.029379;0.052679;, + -0.721134;-0.035727;-0.691873;, + -0.076054;-0.310273;-0.947600;, + 0.686595;-0.525811;-0.502105;, + 0.330715;-0.736732;0.589791;, + -0.814386;0.118924;0.568007;, + -0.983958;0.171789;0.048122;, + -0.793032;-0.131439;-0.594831;, + -0.282352;-0.374795;-0.883067;, + -0.661563;0.611093;0.434626;, + -0.372803;0.739708;0.560223;, + -0.479848;0.732180;-0.483382;, + -0.699606;0.569916;-0.430984;, + -0.710696;0.422097;0.562801;, + -0.295926;0.387851;0.872926;, + -0.837365;0.545835;0.029728;, + -0.634042;0.611621;-0.473192;, + -0.202625;0.600190;-0.773766;, + -0.746426;-0.359818;0.559803;, + -0.315278;-0.350053;0.882078;, + -0.925014;-0.373716;0.068452;, + -0.702484;-0.584123;-0.406592;, + -0.277977;-0.495656;-0.822833;, + -0.788117;-0.183645;0.587491;, + -0.253204;-0.328259;0.910019;, + -0.953596;-0.298213;-0.041519;, + -0.649818;-0.613601;-0.448587;, + -0.213921;-0.752172;-0.623277;, + -0.750713;0.268052;0.603803;, + -0.413319;0.153508;0.897554;, + -0.333508;-0.199190;0.921464;, + 0.715206;-0.667542;0.207047;, + 0.578979;-0.808463;-0.105693;, + 0.254151;-0.724281;0.640956;, + -0.350122;-0.705733;0.615918;, + -0.521829;-0.685532;0.507682;, + -0.582105;-0.748288;-0.318149;, + -0.259672;-0.758109;-0.598199;, + 0.324675;-0.788502;-0.522351;, + 0.164580;-0.761216;0.627266;, + 0.489043;-0.865250;0.110364;, + -0.147015;-0.759744;0.633384;, + -0.605120;-0.686438;0.403277;, + -0.602435;-0.766434;-0.222825;, + -0.157318;-0.949324;-0.272095;, + 0.166899;-0.916412;-0.363778;, + 0.427237;-0.891048;-0.153303;, + 0.649900;-0.035037;0.759212;, + 0.985761;-0.163298;-0.040116;, + -0.036046;0.034905;0.998740;, + -0.608077;0.178337;0.773588;, + -0.981662;0.163987;0.097202;, + -0.740908;-0.121535;-0.660518;, + 0.006847;-0.316355;-0.948616;, + 0.687977;-0.293549;-0.663714;, + -0.152727;0.197261;0.968381;, + -0.101821;-0.074160;-0.992035;, + -0.114730;0.027382;0.993019;, + 0.400147;-0.785877;0.471465;, + 0.373140;-0.766605;-0.522573;, + -0.346292;-0.166438;-0.923244;, + -0.519779;0.635300;0.571160;, + -0.747186;0.566650;-0.347306;, + 0.236063;0.200824;0.950760;, + 0.838795;-0.373110;0.396500;, + 0.651438;-0.450605;-0.610396;, + 0.031669;0.154102;-0.987547;, + -0.201281;0.810006;0.550796;, + -0.239147;0.872811;-0.425453;, + -0.299406;-0.276504;0.913182;, + 0.090326;-0.956866;0.276132;, + -0.102213;-0.745525;-0.658593;, + -0.569935;-0.148383;-0.808181;, + -0.711459;0.196812;0.674605;, + -0.934562;0.328093;-0.137655;, + -0.670077;-0.315307;0.671995;, + -0.433903;-0.762869;0.479331;, + -0.392695;-0.891971;-0.224004;, + -0.619791;-0.530830;-0.577995;, + -0.937105;-0.010824;0.348879;, + -0.942842;-0.125596;-0.308665;, + -0.179838;-0.052199;0.982310;, + 0.225766;-0.835864;0.500361;, + 0.124006;-0.775689;-0.618813;, + -0.254434;-0.153439;-0.954840;, + -0.632263;0.479231;0.608754;, + -0.779351;0.507865;-0.366995;, + -0.211083;-0.007311;0.977441;, + 0.425351;-0.766520;0.481169;, + 0.397482;-0.777098;-0.487983;, + 0.099996;-0.506703;-0.856302;, + -0.691761;0.435659;0.575907;, + -0.783623;0.512593;-0.350976;, + -0.312688;-0.071199;-0.947184;, + -0.158440;0.272260;0.949090;, + -0.826805;0.300613;0.475422;, + -0.818240;-0.572323;0.054124;, + 0.443455;-0.793006;0.417718;, + -0.807686;-0.588428;0.037363;, + 0.478308;-0.856915;0.192140;, + -0.806374;-0.591350;0.008141;, + 0.485289;-0.872612;-0.055172;, + -0.805965;-0.591697;-0.017746;, + 0.466843;-0.842931;-0.267441;, + -0.819948;-0.571396;-0.034540;, + 0.428416;-0.777562;-0.460280;, + -0.815220;-0.575410;-0.065729;, + 0.362499;-0.663593;-0.654400;, + -0.987557;-0.002703;-0.157237;, + -0.465064;0.808835;-0.359864;, + -0.895193;0.296505;0.332738;, + -0.621376;0.321019;-0.714730;, + -0.823363;-0.179475;-0.538388;, + -0.717959;-0.165741;0.676065;, + -0.954361;0.021745;-0.297862;, + -0.870287;-0.492508;0.006093;, + -0.818024;0.006369;0.575148;, + 0.915007;0.400877;0.045386;, + 0.362063;0.859195;0.361516;, + 0.923704;0.382121;0.027477;, + 0.925341;0.379116;-0.003806;, + 0.925113;0.378382;-0.031514;, + 0.914133;0.402378;-0.049520;, + 0.914701;0.395544;-0.082872;, + 0.318704;0.921135;-0.223467;, + 0.592761;0.573307;-0.565644;, + -0.096115;0.933726;-0.344844;, + 0.336545;0.702533;0.627045;, + 0.486292;0.591434;0.643216;, + 0.870287;0.492508;-0.006093;, + 0.516008;0.743904;-0.424667;, + 0.388701;0.765725;0.512422;, + 0.818479;-0.013906;0.574368;, + 0.583881;0.562753;0.585143;, + 0.008591;-0.015184;0.999848;, + 0.871568;0.231819;0.432006;, + 0.448861;0.775548;0.443902;, + 0.779452;0.224370;-0.584904;, + -0.008598;0.015187;-0.999848;, + 0.397356;0.715862;-0.574151;, + 0.576552;-0.587596;0.567732;, + 0.785924;-0.451591;0.422360;, + 0.702038;-0.393393;-0.593620;, + -0.000186;-0.822252;0.569124;, + 0.242090;-0.874344;0.420613;, + 0.210446;-0.775533;-0.595199;, + -0.573887;-0.580416;0.577729;, + -0.441362;-0.788795;0.427788;, + -0.407347;-0.698201;-0.588713;, + -0.808485;-0.003753;0.588505;, + -0.864073;-0.245059;0.439687;, + -0.789452;-0.206700;-0.577963;, + -0.566558;0.569931;0.595139;, + -0.778428;0.438345;0.449336;, + -0.712039;0.411053;-0.569242;, + 0.010185;0.804586;0.593749;, + -0.234597;0.861095;0.451087;, + -0.220443;0.793196;-0.567667;, + 0.663953;0.169591;0.728289;, + 0.343613;0.581657;0.737296;, + 0.636660;0.638950;-0.431748;, + 0.896190;0.001007;-0.443670;, + 0.599051;-0.348328;0.720975;, + 0.628552;-0.633648;-0.451012;, + 0.186915;-0.668706;0.719650;, + -0.009479;-0.893246;-0.449468;, + -0.331041;-0.603875;0.725084;, + -0.644150;-0.625711;-0.439950;, + -0.651388;-0.191809;0.734100;, + -0.903681;0.012237;-0.428031;, + -0.586482;0.326109;0.741412;, + -0.636045;0.646893;-0.420685;, + -0.174343;0.646491;0.742734;, + 0.001989;0.906490;-0.422223;, + 0.864073;0.245061;-0.439686;, + 0.441363;0.788793;-0.427789;, + 0.644155;0.625710;0.439944;, + 0.903685;-0.012232;0.428023;, + 0.778430;-0.438345;-0.449333;, + 0.636046;-0.646894;0.420683;, + 0.234598;-0.861099;-0.451080;, + -0.001986;-0.906489;0.422225;, + -0.448852;-0.775554;-0.443902;, + -0.636655;-0.638956;0.431746;, + -0.871564;-0.231820;-0.432014;, + -0.896188;-0.001007;0.443673;, + -0.785920;0.451591;-0.422368;, + -0.628551;0.633646;0.451017;, + -0.242090;0.874344;-0.420613;, + 0.009483;0.893244;0.449471;, + 0.479045;0.490319;-0.728082;, + 0.675735;0.006858;-0.737113;, + 0.472902;-0.474122;-0.742679;, + -0.010626;-0.670850;-0.741517;, + -0.491614;-0.468095;-0.734304;, + -0.688295;0.015361;-0.725268;, + -0.485460;0.496332;-0.719711;, + -0.001936;0.693063;-0.720874;, + 0.651394;0.191812;-0.734094;, + 0.331038;0.603871;-0.725089;, + 0.491611;0.468102;0.734302;, + 0.688292;-0.015363;0.725271;, + 0.586489;-0.326107;-0.741407;, + 0.485471;-0.496336;0.719700;, + 0.174344;-0.646489;-0.742736;, + 0.001936;-0.693068;0.720870;, + -0.343609;-0.581653;-0.737301;, + -0.479044;-0.490321;0.728081;, + -0.663957;-0.169592;-0.728286;, + -0.675725;-0.006857;0.737122;, + -0.599047;0.348320;-0.720982;, + -0.472901;0.474118;0.742682;, + -0.186907;0.668699;-0.719658;, + 0.010630;0.670854;0.741513;; + 1896; + 3;0,1,2;, + 3;3,0,2;, + 3;4,0,3;, + 3;5,4,3;, + 3;6,4,5;, + 3;7,6,5;, + 3;8,9,10;, + 3;11,8,10;, + 3;12,8,11;, + 3;13,12,11;, + 3;14,12,13;, + 3;15,14,13;, + 3;9,1,16;, + 3;10,9,16;, + 3;17,3,2;, + 3;18,17,2;, + 3;10,16,19;, + 3;11,10,19;, + 3;20,5,3;, + 3;17,20,3;, + 3;11,19,21;, + 3;13,11,21;, + 3;22,7,5;, + 3;20,22,5;, + 3;14,6,7;, + 3;22,14,7;, + 3;13,21,23;, + 3;15,13,23;, + 3;19,16,1;, + 3;0,19,1;, + 3;21,19,0;, + 3;4,21,0;, + 3;23,21,4;, + 3;6,23,4;, + 3;17,18,9;, + 3;8,17,9;, + 3;20,17,8;, + 3;12,20,8;, + 3;22,20,12;, + 3;14,22,12;, + 3;18,2,1;, + 3;9,18,1;, + 3;15,23,6;, + 3;14,15,6;, + 3;24,25,26;, + 3;24,26,27;, + 3;27,26,28;, + 3;27,28,29;, + 3;29,28,30;, + 3;29,30,31;, + 3;32,33,34;, + 3;32,34,35;, + 3;35,34,36;, + 3;35,36,37;, + 3;37,36,38;, + 3;37,38,39;, + 3;40,25,33;, + 3;40,33,32;, + 3;24,27,41;, + 3;24,41,42;, + 3;43,40,32;, + 3;43,32,35;, + 3;27,29,44;, + 3;27,44,41;, + 3;45,43,35;, + 3;45,35,37;, + 3;29,31,46;, + 3;29,46,44;, + 3;31,30,38;, + 3;31,38,46;, + 3;47,45,37;, + 3;47,37,39;, + 3;25,40,43;, + 3;25,43,26;, + 3;26,43,45;, + 3;26,45,28;, + 3;28,45,47;, + 3;28,47,30;, + 3;33,42,41;, + 3;33,41,34;, + 3;34,41,44;, + 3;34,44,36;, + 3;36,44,46;, + 3;36,46,38;, + 3;25,24,42;, + 3;25,42,33;, + 3;30,47,39;, + 3;30,39,38;, + 3;48,49,50;, + 3;51,48,50;, + 3;52,53,54;, + 3;55,52,54;, + 3;56,57,58;, + 3;59,57,56;, + 3;57,60,61;, + 3;62,60,57;, + 3;59,62,57;, + 3;63,64,65;, + 3;65,60,62;, + 3;64,60,65;, + 3;66,63,65;, + 3;67,66,65;, + 3;61,68,58;, + 3;67,65,62;, + 3;69,67,62;, + 3;70,66,67;, + 3;71,70,67;, + 3;67,69,72;, + 3;71,67,72;, + 3;73,74,75;, + 3;76,73,75;, + 3;62,77,69;, + 3;78,79,68;, + 3;61,78,68;, + 3;80,78,61;, + 3;60,80,61;, + 3;64,81,80;, + 3;71,72,82;, + 3;70,71,82;, + 3;83,84,82;, + 3;72,83,82;, + 3;72,69,73;, + 3;76,72,73;, + 3;69,77,74;, + 3;73,69,74;, + 3;85,86,87;, + 3;88,85,87;, + 3;86,83,75;, + 3;87,86,75;, + 3;59,56,89;, + 3;85,59,89;, + 3;85,89,90;, + 3;86,85,90;, + 3;89,56,58;, + 3;91,89,58;, + 3;90,89,91;, + 3;92,90,91;, + 3;74,88,87;, + 3;75,74,87;, + 3;59,85,77;, + 3;62,59,77;, + 3;84,83,86;, + 3;77,85,88;, + 3;74,77,88;, + 3;83,72,76;, + 3;75,83,76;, + 3;91,58,68;, + 3;93,91,68;, + 3;92,91,93;, + 3;94,92,93;, + 3;79,95,96;, + 3;68,79,96;, + 3;68,96,97;, + 3;93,68,97;, + 3;93,97,94;, + 3;61,58,57;, + 3;98,99,100;, + 3;101,98,100;, + 3;102,98,101;, + 3;103,102,101;, + 3;104,105,106;, + 3;107,104,106;, + 3;105,108,109;, + 3;106,105,109;, + 3;108,110,109;, + 3;100,99,111;, + 3;109,110,112;, + 3;113,109,112;, + 3;104,82,84;, + 3;105,104,84;, + 3;106,98,102;, + 3;107,106,102;, + 3;105,84,86;, + 3;108,105,86;, + 3;109,99,98;, + 3;106,109,98;, + 3;108,86,90;, + 3;110,108,90;, + 3;110,90,92;, + 3;112,110,92;, + 3;113,111,99;, + 3;109,113,99;, + 3;114,112,92;, + 3;115,114,92;, + 3;116,113,112;, + 3;114,116,112;, + 3;117,111,113;, + 3;116,117,113;, + 3;92,94,115;, + 3;111,117,118;, + 3;119,111,118;, + 3;100,111,119;, + 3;101,100,119;, + 3;103,101,119;, + 3;120,103,119;, + 3;117,116,121;, + 3;118,117,121;, + 3;122,120,119;, + 3;123,122,119;, + 3;124,122,123;, + 3;125,124,123;, + 3;119,118,123;, + 3;126,123,118;, + 3;121,126,118;, + 3;125,123,126;, + 3;114,115,127;, + 3;116,114,127;, + 3;121,116,127;, + 3;128,121,127;, + 3;126,121,128;, + 3;129,126,128;, + 3;125,126,129;, + 3;130,125,129;, + 3;131,128,132;, + 3;133,131,132;, + 3;134,129,128;, + 3;131,134,128;, + 3;135,130,129;, + 3;134,135,129;, + 3;133,132,130;, + 3;135,133,130;, + 3;127,132,128;, + 3;127,115,94;, + 3;136,127,94;, + 3;95,55,54;, + 3;96,95,54;, + 3;96,54,137;, + 3;97,96,137;, + 3;97,137,136;, + 3;94,97,136;, + 3;138,131,133;, + 3;139,138,133;, + 3;140,134,131;, + 3;138,140,131;, + 3;141,135,134;, + 3;140,141,134;, + 3;139,133,135;, + 3;141,139,135;, + 3;142,138,139;, + 3;143,142,139;, + 3;144,140,138;, + 3;142,144,138;, + 3;145,141,140;, + 3;144,145,140;, + 3;143,139,141;, + 3;145,143,141;, + 3;146,142,143;, + 3;147,146,143;, + 3;148,144,142;, + 3;146,148,142;, + 3;149,145,144;, + 3;148,149,144;, + 3;147,143,145;, + 3;149,147,145;, + 3;150,146,147;, + 3;150,148,146;, + 3;150,149,148;, + 3;150,147,149;, + 3;50,49,151;, + 3;152,50,151;, + 3;153,154,137;, + 3;54,153,137;, + 3;153,53,48;, + 3;51,153,48;, + 3;51,50,155;, + 3;156,51,155;, + 3;156,154,51;, + 3;136,137,157;, + 3;158,136,157;, + 3;127,136,158;, + 3;50,152,155;, + 3;156,155,159;, + 3;160,156,159;, + 3;157,156,160;, + 3;161,157,160;, + 3;158,157,161;, + 3;162,158,161;, + 3;127,158,162;, + 3;163,127,162;, + 3;132,127,163;, + 3;53,52,48;, + 3;154,153,51;, + 3;53,153,54;, + 3;157,137,154;, + 3;156,157,154;, + 3;164,151,49;, + 3;165,164,49;, + 3;165,49,48;, + 3;166,165,48;, + 3;166,48,52;, + 3;167,166,52;, + 3;167,52,55;, + 3;168,167,55;, + 3;168,55,95;, + 3;169,168,95;, + 3;169,95,79;, + 3;170,169,79;, + 3;170,79,78;, + 3;171,170,78;, + 3;171,78,80;, + 3;172,171,80;, + 3;172,80,81;, + 3;173,172,81;, + 3;174,164,165;, + 3;175,174,165;, + 3;175,165,166;, + 3;176,175,166;, + 3;176,166,167;, + 3;177,176,167;, + 3;177,167,168;, + 3;178,177,168;, + 3;178,168,169;, + 3;179,178,169;, + 3;179,169,170;, + 3;180,179,170;, + 3;180,170,171;, + 3;181,180,171;, + 3;181,171,172;, + 3;182,181,172;, + 3;182,172,173;, + 3;183,182,173;, + 3;184,174,175;, + 3;185,184,175;, + 3;185,175,176;, + 3;186,185,176;, + 3;186,176,177;, + 3;187,186,177;, + 3;187,177,178;, + 3;188,187,178;, + 3;188,178,179;, + 3;189,188,179;, + 3;189,179,180;, + 3;190,189,180;, + 3;190,180,181;, + 3;191,190,181;, + 3;191,181,182;, + 3;192,191,182;, + 3;192,182,183;, + 3;193,192,183;, + 3;194,184,185;, + 3;195,194,185;, + 3;195,185,186;, + 3;196,195,186;, + 3;196,186,187;, + 3;197,196,187;, + 3;197,187,188;, + 3;198,197,188;, + 3;198,188,189;, + 3;199,198,189;, + 3;199,189,190;, + 3;200,199,190;, + 3;200,190,191;, + 3;201,200,191;, + 3;201,191,192;, + 3;202,201,192;, + 3;202,192,193;, + 3;203,202,193;, + 3;204,194,195;, + 3;204,195,196;, + 3;204,196,197;, + 3;204,197,198;, + 3;204,198,199;, + 3;204,199,200;, + 3;204,200,201;, + 3;204,201,202;, + 3;204,202,203;, + 3;80,60,64;, + 3;205,206,207;, + 3;208,205,207;, + 3;209,210,211;, + 3;212,209,211;, + 3;213,214,215;, + 3;215,214,216;, + 3;217,218,214;, + 3;218,219,216;, + 3;214,218,216;, + 3;220,64,63;, + 3;219,218,220;, + 3;220,218,64;, + 3;63,66,221;, + 3;220,63,221;, + 3;213,222,217;, + 3;220,221,223;, + 3;219,220,223;, + 3;66,70,224;, + 3;221,66,224;, + 3;223,221,224;, + 3;225,223,224;, + 3;226,227,228;, + 3;229,226,228;, + 3;223,230,219;, + 3;231,232,217;, + 3;222,231,217;, + 3;232,233,218;, + 3;217,232,218;, + 3;233,81,64;, + 3;82,225,224;, + 3;82,224,70;, + 3;234,235,225;, + 3;82,234,225;, + 3;223,225,228;, + 3;227,223,228;, + 3;230,223,227;, + 3;226,230,227;, + 3;236,237,238;, + 3;239,236,238;, + 3;235,236,239;, + 3;229,235,239;, + 3;215,216,237;, + 3;240,215,237;, + 3;240,237,236;, + 3;241,240,236;, + 3;215,240,242;, + 3;213,215,242;, + 3;240,241,243;, + 3;242,240,243;, + 3;238,226,229;, + 3;239,238,229;, + 3;230,237,216;, + 3;230,216,219;, + 3;236,235,234;, + 3;237,230,226;, + 3;238,237,226;, + 3;225,235,229;, + 3;228,225,229;, + 3;213,242,244;, + 3;222,213,244;, + 3;242,243,245;, + 3;244,242,245;, + 3;246,231,222;, + 3;247,246,222;, + 3;247,222,244;, + 3;248,247,244;, + 3;245,248,244;, + 3;214,213,217;, + 3;249,250,251;, + 3;252,249,251;, + 3;250,102,103;, + 3;251,250,103;, + 3;253,104,107;, + 3;254,253,107;, + 3;255,253,254;, + 3;256,255,254;, + 3;256,257,255;, + 3;258,249,252;, + 3;257,256,259;, + 3;260,257,259;, + 3;82,104,253;, + 3;234,82,253;, + 3;250,254,107;, + 3;102,250,107;, + 3;234,253,255;, + 3;236,234,255;, + 3;249,256,254;, + 3;250,249,254;, + 3;236,255,257;, + 3;241,236,257;, + 3;241,257,260;, + 3;243,241,260;, + 3;258,259,256;, + 3;249,258,256;, + 3;260,261,262;, + 3;243,260,262;, + 3;259,263,261;, + 3;260,259,261;, + 3;258,264,263;, + 3;259,258,263;, + 3;262,245,243;, + 3;264,258,265;, + 3;266,264,265;, + 3;265,258,252;, + 3;265,252,251;, + 3;251,103,120;, + 3;265,251,120;, + 3;267,263,264;, + 3;267,264,266;, + 3;120,122,268;, + 3;265,120,268;, + 3;122,124,269;, + 3;268,122,269;, + 3;268,266,265;, + 3;268,270,267;, + 3;266,268,267;, + 3;270,268,269;, + 3;271,262,261;, + 3;261,263,267;, + 3;271,261,267;, + 3;271,267,272;, + 3;267,270,273;, + 3;272,267,273;, + 3;270,269,274;, + 3;273,270,274;, + 3;272,275,276;, + 3;277,272,276;, + 3;273,278,275;, + 3;272,273,275;, + 3;274,279,278;, + 3;273,274,278;, + 3;277,276,279;, + 3;274,277,279;, + 3;272,277,271;, + 3;271,280,245;, + 3;245,262,271;, + 3;211,246,247;, + 3;212,211,247;, + 3;212,247,248;, + 3;281,212,248;, + 3;281,248,245;, + 3;280,281,245;, + 3;275,282,283;, + 3;276,275,283;, + 3;278,284,282;, + 3;275,278,282;, + 3;279,285,284;, + 3;278,279,284;, + 3;276,283,285;, + 3;279,276,285;, + 3;282,286,287;, + 3;283,282,287;, + 3;284,288,286;, + 3;282,284,286;, + 3;285,289,288;, + 3;284,285,288;, + 3;283,287,289;, + 3;285,283,289;, + 3;286,290,291;, + 3;287,286,291;, + 3;288,292,290;, + 3;286,288,290;, + 3;289,293,292;, + 3;288,289,292;, + 3;287,291,293;, + 3;289,287,293;, + 3;291,290,294;, + 3;290,292,294;, + 3;292,293,294;, + 3;293,291,294;, + 3;205,208,152;, + 3;151,205,152;, + 3;295,296,212;, + 3;281,295,212;, + 3;209,296,207;, + 3;206,209,207;, + 3;208,207,297;, + 3;155,208,297;, + 3;207,295,297;, + 3;281,280,298;, + 3;299,281,298;, + 3;298,280,271;, + 3;155,152,208;, + 3;155,297,300;, + 3;159,155,300;, + 3;297,299,301;, + 3;300,297,301;, + 3;299,298,302;, + 3;301,299,302;, + 3;302,298,271;, + 3;302,271,303;, + 3;303,271,277;, + 3;206,210,209;, + 3;207,296,295;, + 3;212,296,209;, + 3;295,281,299;, + 3;295,299,297;, + 3;151,164,304;, + 3;205,151,304;, + 3;205,304,305;, + 3;206,205,305;, + 3;206,305,306;, + 3;210,206,306;, + 3;210,306,307;, + 3;211,210,307;, + 3;211,307,308;, + 3;246,211,308;, + 3;246,308,309;, + 3;231,246,309;, + 3;231,309,310;, + 3;232,231,310;, + 3;232,310,311;, + 3;233,232,311;, + 3;233,311,173;, + 3;81,233,173;, + 3;164,174,312;, + 3;304,164,312;, + 3;304,312,313;, + 3;305,304,313;, + 3;305,313,314;, + 3;306,305,314;, + 3;306,314,315;, + 3;307,306,315;, + 3;307,315,316;, + 3;308,307,316;, + 3;308,316,317;, + 3;309,308,317;, + 3;309,317,318;, + 3;310,309,318;, + 3;310,318,319;, + 3;311,310,319;, + 3;311,319,183;, + 3;173,311,183;, + 3;174,184,320;, + 3;312,174,320;, + 3;312,320,321;, + 3;313,312,321;, + 3;313,321,322;, + 3;314,313,322;, + 3;314,322,323;, + 3;315,314,323;, + 3;315,323,324;, + 3;316,315,324;, + 3;316,324,325;, + 3;317,316,325;, + 3;317,325,326;, + 3;318,317,326;, + 3;318,326,327;, + 3;319,318,327;, + 3;319,327,193;, + 3;183,319,193;, + 3;184,194,328;, + 3;320,184,328;, + 3;320,328,329;, + 3;321,320,329;, + 3;321,329,330;, + 3;322,321,330;, + 3;322,330,331;, + 3;323,322,331;, + 3;323,331,332;, + 3;324,323,332;, + 3;324,332,333;, + 3;325,324,333;, + 3;325,333,334;, + 3;326,325,334;, + 3;326,334,335;, + 3;327,326,335;, + 3;327,335,203;, + 3;193,327,203;, + 3;328,194,204;, + 3;329,328,204;, + 3;330,329,204;, + 3;331,330,204;, + 3;332,331,204;, + 3;333,332,204;, + 3;334,333,204;, + 3;335,334,204;, + 3;203,335,204;, + 3;64,218,233;, + 3;336,337,338;, + 3;339,336,338;, + 3;336,340,337;, + 3;341,336,339;, + 3;342,341,339;, + 3;341,340,336;, + 3;343,341,342;, + 3;344,343,342;, + 3;343,340,341;, + 3;345,343,344;, + 3;346,345,344;, + 3;345,340,343;, + 3;347,345,346;, + 3;348,347,346;, + 3;347,340,345;, + 3;337,347,348;, + 3;338,337,348;, + 3;337,340,347;, + 3;349,350,351;, + 3;352,349,351;, + 3;353,349,352;, + 3;354,353,352;, + 3;355,353,354;, + 3;356,355,354;, + 3;357,355,356;, + 3;358,357,356;, + 3;359,357,358;, + 3;360,359,358;, + 3;350,359,360;, + 3;351,350,360;, + 3;361,350,349;, + 3;362,361,349;, + 3;362,349,353;, + 3;363,362,353;, + 3;363,353,355;, + 3;364,363,355;, + 3;364,355,357;, + 3;365,364,357;, + 3;365,357,359;, + 3;366,365,359;, + 3;366,359,350;, + 3;361,366,350;, + 3;367,361,362;, + 3;368,367,362;, + 3;368,362,363;, + 3;369,368,363;, + 3;369,363,364;, + 3;370,369,364;, + 3;370,364,365;, + 3;371,370,365;, + 3;371,365,366;, + 3;372,371,366;, + 3;372,366,361;, + 3;367,372,361;, + 3;373,367,368;, + 3;373,368,369;, + 3;373,369,370;, + 3;373,370,371;, + 3;373,371,372;, + 3;373,372,367;, + 3;374,375,376;, + 3;374,376,377;, + 3;377,376,378;, + 3;377,378,379;, + 3;379,378,380;, + 3;379,380,381;, + 3;381,380,382;, + 3;381,382,383;, + 3;383,382,384;, + 3;383,384,385;, + 3;385,384,375;, + 3;385,375,374;, + 3;376,375,386;, + 3;376,386,387;, + 3;378,376,387;, + 3;378,387,388;, + 3;380,378,388;, + 3;380,388,389;, + 3;382,380,389;, + 3;382,389,390;, + 3;384,382,390;, + 3;384,390,391;, + 3;375,384,391;, + 3;375,391,386;, + 3;387,386,392;, + 3;387,392,393;, + 3;388,387,393;, + 3;388,393,394;, + 3;389,388,394;, + 3;389,394,395;, + 3;390,389,395;, + 3;390,395,396;, + 3;391,390,396;, + 3;391,396,397;, + 3;386,391,397;, + 3;386,397,392;, + 3;393,392,398;, + 3;394,393,398;, + 3;395,394,398;, + 3;396,395,398;, + 3;397,396,398;, + 3;392,397,398;, + 3;399,400,401;, + 3;402,399,401;, + 3;403,404,405;, + 3;406,399,402;, + 3;407,406,402;, + 3;408,404,403;, + 3;409,406,407;, + 3;410,409,407;, + 3;411,404,408;, + 3;412,409,410;, + 3;413,412,410;, + 3;414,404,411;, + 3;415,416,412;, + 3;413,415,412;, + 3;417,418,400;, + 3;399,417,400;, + 3;419,420,406;, + 3;409,419,406;, + 3;421,419,409;, + 3;412,421,409;, + 3;416,422,421;, + 3;412,416,421;, + 3;423,424,418;, + 3;417,423,418;, + 3;425,426,420;, + 3;419,425,420;, + 3;427,425,419;, + 3;421,427,419;, + 3;428,429,424;, + 3;405,428,424;, + 3;405,424,423;, + 3;403,405,423;, + 3;403,423,426;, + 3;408,403,426;, + 3;408,426,425;, + 3;411,408,425;, + 3;411,425,427;, + 3;414,411,427;, + 3;401,400,430;, + 3;431,401,430;, + 3;404,428,405;, + 3;432,404,414;, + 3;400,418,433;, + 3;430,400,433;, + 3;418,424,429;, + 3;433,418,429;, + 3;434,432,414;, + 3;427,434,414;, + 3;422,434,427;, + 3;421,422,427;, + 3;435,423,417;, + 3;436,426,423;, + 3;435,436,423;, + 3;437,438,439;, + 3;437,439,440;, + 3;441,404,442;, + 3;440,439,443;, + 3;440,443,444;, + 3;442,404,445;, + 3;444,443,446;, + 3;444,446,447;, + 3;445,404,448;, + 3;447,446,449;, + 3;447,449,450;, + 3;448,404,451;, + 3;449,416,415;, + 3;449,415,450;, + 3;438,452,453;, + 3;438,453,439;, + 3;443,454,455;, + 3;443,455,446;, + 3;446,455,456;, + 3;446,456,449;, + 3;456,422,416;, + 3;456,416,449;, + 3;452,457,458;, + 3;452,458,453;, + 3;454,459,460;, + 3;454,460,455;, + 3;455,460,461;, + 3;455,461,456;, + 3;457,429,428;, + 3;457,428,441;, + 3;458,457,441;, + 3;458,441,442;, + 3;459,458,442;, + 3;459,442,445;, + 3;460,459,445;, + 3;460,445,448;, + 3;461,460,448;, + 3;461,448,451;, + 3;430,438,437;, + 3;430,437,431;, + 3;441,428,404;, + 3;451,404,432;, + 3;433,452,438;, + 3;433,438,430;, + 3;429,457,452;, + 3;429,452,433;, + 3;451,432,434;, + 3;451,434,461;, + 3;461,434,422;, + 3;461,422,456;, + 3;453,458,462;, + 3;458,459,463;, + 3;458,463,462;, + 3;463,459,454;, + 3;464,465,466;, + 3;467,464,466;, + 3;468,464,467;, + 3;469,470,471;, + 3;472,469,471;, + 3;472,473,469;, + 3;474,475,476;, + 3;477,474,476;, + 3;471,470,478;, + 3;468,471,478;, + 3;479,465,480;, + 3;481,482,475;, + 3;474,481,475;, + 3;483,484,485;, + 3;486,483,485;, + 3;478,487,464;, + 3;468,478,464;, + 3;488,466,465;, + 3;479,488,465;, + 3;484,489,485;, + 3;483,487,480;, + 3;487,490,464;, + 3;490,489,465;, + 3;464,490,465;, + 3;480,465,489;, + 3;484,480,489;, + 3;483,486,490;, + 3;487,483,490;, + 3;491,492,493;, + 3;494,491,493;, + 3;495,496,485;, + 3;489,495,485;, + 3;496,497,486;, + 3;485,496,486;, + 3;486,497,490;, + 3;490,495,489;, + 3;493,492,496;, + 3;495,493,496;, + 3;492,491,497;, + 3;496,492,497;, + 3;491,494,490;, + 3;497,491,490;, + 3;494,493,495;, + 3;490,494,495;, + 3;498,488,472;, + 3;499,498,472;, + 3;500,471,468;, + 3;501,500,468;, + 3;499,472,471;, + 3;500,499,471;, + 3;502,466,488;, + 3;498,502,488;, + 3;503,467,466;, + 3;502,503,466;, + 3;501,468,467;, + 3;503,501,467;, + 3;475,498,499;, + 3;476,475,499;, + 3;477,500,501;, + 3;474,477,501;, + 3;476,499,500;, + 3;477,476,500;, + 3;482,502,498;, + 3;475,482,498;, + 3;481,503,502;, + 3;482,481,502;, + 3;474,501,503;, + 3;481,474,503;, + 3;504,505,506;, + 3;507,508,506;, + 3;509,510,511;, + 3;512,509,513;, + 3;507,512,514;, + 3;504,515,516;, + 3;517,518,515;, + 3;506,519,518;, + 3;506,508,519;, + 3;507,505,516;, + 3;510,520,521;, + 3;509,522,520;, + 3;511,521,523;, + 3;512,524,522;, + 3;513,523,525;, + 3;507,516,524;, + 3;514,525,519;, + 3;521,526,527;, + 3;522,528,520;, + 3;529,528,522;, + 3;527,530,525;, + 3;521,527,523;, + 3;530,531,532;, + 3;533,534,530;, + 3;532,535,519;, + 3;530,532,525;, + 3;524,536,529;, + 3;537,536,524;, + 3;538,537,516;, + 3;515,539,538;, + 3;535,540,518;, + 3;529,536,531;, + 3;541,542,543;, + 3;544,541,543;, + 3;545,541,544;, + 3;546,545,544;, + 3;547,545,546;, + 3;548,547,546;, + 3;549,547,548;, + 3;550,549,548;, + 3;551,549,550;, + 3;552,551,550;, + 3;553,551,552;, + 3;554,553,552;, + 3;555,553,554;, + 3;556,555,554;, + 3;542,555,556;, + 3;543,542,556;, + 3;557,558,542;, + 3;541,557,542;, + 3;559,557,541;, + 3;545,559,541;, + 3;560,559,545;, + 3;547,560,545;, + 3;561,560,547;, + 3;549,561,547;, + 3;562,561,549;, + 3;551,562,549;, + 3;563,562,551;, + 3;553,563,551;, + 3;564,563,553;, + 3;555,564,553;, + 3;558,564,555;, + 3;542,558,555;, + 3;565,566,558;, + 3;557,565,558;, + 3;561,567,560;, + 3;568,569,561;, + 3;562,568,561;, + 3;570,568,562;, + 3;563,570,562;, + 3;571,570,563;, + 3;566,571,564;, + 3;558,566,564;, + 3;572,573,574;, + 3;575,572,574;, + 3;436,435,573;, + 3;572,436,573;, + 3;576,402,401;, + 3;577,576,401;, + 3;578,407,402;, + 3;576,578,402;, + 3;579,410,407;, + 3;578,579,407;, + 3;580,413,410;, + 3;579,580,410;, + 3;581,415,413;, + 3;580,581,413;, + 3;582,576,577;, + 3;583,582,577;, + 3;584,578,576;, + 3;582,584,576;, + 3;585,579,578;, + 3;584,585,578;, + 3;586,580,579;, + 3;585,586,579;, + 3;587,581,580;, + 3;586,587,580;, + 3;588,582,583;, + 3;589,588,583;, + 3;590,584,582;, + 3;588,590,582;, + 3;591,585,584;, + 3;590,591,584;, + 3;592,586,585;, + 3;591,592,585;, + 3;593,587,586;, + 3;592,593,586;, + 3;569,590,588;, + 3;594,569,588;, + 3;568,591,590;, + 3;569,568,590;, + 3;570,592,591;, + 3;568,570,591;, + 3;595,593,592;, + 3;570,595,592;, + 3;571,595,570;, + 3;577,401,431;, + 3;596,577,431;, + 3;583,577,596;, + 3;597,583,596;, + 3;589,583,597;, + 3;598,589,597;, + 3;566,565,599;, + 3;599,565,600;, + 3;589,598,601;, + 3;602,589,601;, + 3;588,589,602;, + 3;594,588,602;, + 3;557,559,565;, + 3;602,601,603;, + 3;604,602,603;, + 3;569,594,567;, + 3;561,569,567;, + 3;594,602,604;, + 3;567,594,604;, + 3;560,567,604;, + 3;559,604,565;, + 3;604,603,600;, + 3;605,544,543;, + 3;606,605,543;, + 3;607,546,544;, + 3;605,607,544;, + 3;608,548,546;, + 3;607,608,546;, + 3;609,550,548;, + 3;608,609,548;, + 3;610,552,550;, + 3;609,610,550;, + 3;611,554,552;, + 3;610,611,552;, + 3;612,556,554;, + 3;611,612,554;, + 3;606,543,556;, + 3;612,606,556;, + 3;613,605,606;, + 3;614,613,606;, + 3;615,607,605;, + 3;613,615,605;, + 3;616,608,607;, + 3;615,616,607;, + 3;617,609,608;, + 3;616,617,608;, + 3;618,610,609;, + 3;617,618,609;, + 3;619,611,610;, + 3;618,619,610;, + 3;620,612,611;, + 3;619,620,611;, + 3;614,606,612;, + 3;620,614,612;, + 3;621,613,614;, + 3;622,621,614;, + 3;623,615,613;, + 3;621,623,613;, + 3;624,616,615;, + 3;623,624,615;, + 3;625,617,616;, + 3;624,625,616;, + 3;626,618,617;, + 3;625,626,617;, + 3;627,619,618;, + 3;626,627,618;, + 3;628,620,619;, + 3;627,628,619;, + 3;622,614,620;, + 3;628,622,620;, + 3;538,621,622;, + 3;539,623,621;, + 3;540,624,623;, + 3;535,625,624;, + 3;532,626,625;, + 3;531,627,626;, + 3;536,628,627;, + 3;537,622,628;, + 3;564,571,563;, + 3;565,604,600;, + 3;533,526,528;, + 3;518,540,539;, + 3;515,518,539;, + 3;531,534,529;, + 3;520,528,526;, + 3;521,520,526;, + 3;534,533,529;, + 3;526,533,527;, + 3;531,530,534;, + 3;517,504,506;, + 3;505,507,506;, + 3;513,509,511;, + 3;514,512,513;, + 3;508,507,514;, + 3;505,504,516;, + 3;504,517,515;, + 3;517,506,518;, + 3;511,510,521;, + 3;510,509,520;, + 3;513,511,523;, + 3;509,512,522;, + 3;514,513,525;, + 3;512,507,524;, + 3;508,514,519;, + 3;524,529,522;, + 3;523,527,525;, + 3;527,533,530;, + 3;525,532,519;, + 3;516,537,524;, + 3;515,538,516;, + 3;519,535,518;, + 3;537,538,622;, + 3;538,539,621;, + 3;539,540,623;, + 3;540,535,624;, + 3;535,532,625;, + 3;532,531,626;, + 3;531,536,627;, + 3;536,537,628;, + 3;529,533,528;, + 3;604,559,560;, + 3;573,629,574;, + 3;420,630,406;, + 3;573,435,417;, + 3;436,572,420;, + 3;417,399,629;, + 3;573,417,629;, + 3;572,575,630;, + 3;420,572,630;, + 3;631,629,399;, + 3;632,631,399;, + 3;633,406,630;, + 3;634,633,630;, + 3;632,399,406;, + 3;633,632,406;, + 3;635,574,629;, + 3;631,635,629;, + 3;636,575,574;, + 3;635,636,574;, + 3;634,630,575;, + 3;636,634,575;, + 3;637,631,632;, + 3;638,637,632;, + 3;639,633,634;, + 3;640,639,634;, + 3;638,632,633;, + 3;639,638,633;, + 3;641,635,631;, + 3;637,641,631;, + 3;642,636,635;, + 3;641,642,635;, + 3;640,634,636;, + 3;642,640,636;, + 3;643,637,638;, + 3;644,643,638;, + 3;645,639,640;, + 3;646,645,640;, + 3;644,638,639;, + 3;645,644,639;, + 3;647,641,637;, + 3;643,647,637;, + 3;648,642,641;, + 3;647,648,641;, + 3;646,640,642;, + 3;648,646,642;, + 3;649,643,644;, + 3;650,649,644;, + 3;651,645,646;, + 3;652,651,646;, + 3;650,644,645;, + 3;651,650,645;, + 3;653,647,643;, + 3;649,653,643;, + 3;654,648,647;, + 3;653,654,647;, + 3;652,646,648;, + 3;654,652,648;, + 3;655,649,650;, + 3;656,655,650;, + 3;657,651,652;, + 3;658,657,652;, + 3;656,650,651;, + 3;657,656,651;, + 3;659,653,649;, + 3;655,659,649;, + 3;660,654,653;, + 3;659,660,653;, + 3;658,652,654;, + 3;660,658,654;, + 3;661,655,656;, + 3;662,661,656;, + 3;657,663,664;, + 3;662,656,657;, + 3;664,662,657;, + 3;665,659,655;, + 3;661,665,655;, + 3;666,660,659;, + 3;665,666,659;, + 3;667,658,660;, + 3;666,667,660;, + 3;469,661,662;, + 3;470,469,662;, + 3;480,663,667;, + 3;662,478,470;, + 3;473,665,661;, + 3;469,473,661;, + 3;479,666,665;, + 3;473,479,665;, + 3;480,667,666;, + 3;479,480,666;, + 3;420,426,436;, + 3;488,479,473;, + 3;472,488,473;, + 3;658,667,663;, + 3;657,658,663;, + 3;487,664,663;, + 3;480,487,663;, + 3;664,487,478;, + 3;662,664,478;, + 3;484,483,480;, + 3;668,669,670;, + 3;668,670,671;, + 3;671,670,672;, + 3;673,674,675;, + 3;673,675,676;, + 3;675,677,676;, + 3;678,679,680;, + 3;678,680,681;, + 3;682,674,673;, + 3;682,673,672;, + 3;683,669,684;, + 3;679,685,686;, + 3;679,686,680;, + 3;687,688,689;, + 3;687,689,690;, + 3;670,691,682;, + 3;670,682,672;, + 3;669,668,692;, + 3;669,692,684;, + 3;687,693,688;, + 3;683,691,689;, + 3;670,694,691;, + 3;669,693,694;, + 3;669,694,670;, + 3;693,669,683;, + 3;693,683,688;, + 3;694,690,689;, + 3;694,689,691;, + 3;695,696,697;, + 3;695,697,698;, + 3;687,699,700;, + 3;687,700,693;, + 3;690,701,699;, + 3;690,699,687;, + 3;694,701,690;, + 3;693,700,694;, + 3;699,696,695;, + 3;699,695,700;, + 3;701,697,696;, + 3;701,696,699;, + 3;694,698,697;, + 3;694,697,701;, + 3;700,695,698;, + 3;700,698,694;, + 3;676,692,702;, + 3;676,702,703;, + 3;672,673,704;, + 3;672,704,705;, + 3;673,676,703;, + 3;673,703,704;, + 3;692,668,706;, + 3;692,706,702;, + 3;668,671,707;, + 3;668,707,706;, + 3;671,672,705;, + 3;671,705,707;, + 3;703,702,679;, + 3;703,679,678;, + 3;705,704,681;, + 3;705,681,680;, + 3;704,703,678;, + 3;704,678,681;, + 3;702,706,685;, + 3;702,685,679;, + 3;706,707,686;, + 3;706,686,685;, + 3;707,705,680;, + 3;707,680,686;, + 3;708,709,710;, + 3;708,711,712;, + 3;713,714,715;, + 3;716,715,717;, + 3;718,717,712;, + 3;719,720,710;, + 3;720,721,722;, + 3;721,723,708;, + 3;723,711,708;, + 3;719,709,712;, + 3;724,725,714;, + 3;725,726,715;, + 3;727,724,713;, + 3;726,728,717;, + 3;729,727,716;, + 3;728,719,712;, + 3;723,729,718;, + 3;730,731,724;, + 3;725,732,726;, + 3;726,732,733;, + 3;729,734,730;, + 3;727,730,724;, + 3;735,736,734;, + 3;734,737,738;, + 3;723,739,735;, + 3;729,735,734;, + 3;733,740,728;, + 3;728,740,741;, + 3;719,741,742;, + 3;742,743,720;, + 3;721,744,739;, + 3;736,740,733;, + 3;745,746,747;, + 3;745,747,748;, + 3;748,747,749;, + 3;748,749,750;, + 3;750,749,751;, + 3;750,751,752;, + 3;752,751,753;, + 3;752,753,754;, + 3;754,753,755;, + 3;754,755,756;, + 3;756,755,757;, + 3;756,757,758;, + 3;758,757,759;, + 3;758,759,760;, + 3;760,759,746;, + 3;760,746,745;, + 3;746,761,762;, + 3;746,762,747;, + 3;747,762,763;, + 3;747,763,749;, + 3;749,763,764;, + 3;749,764,751;, + 3;751,764,765;, + 3;751,765,753;, + 3;753,765,766;, + 3;753,766,755;, + 3;755,766,767;, + 3;755,767,757;, + 3;757,767,768;, + 3;757,768,759;, + 3;759,768,761;, + 3;759,761,746;, + 3;761,566,769;, + 3;761,769,762;, + 3;764,770,765;, + 3;765,771,772;, + 3;765,772,766;, + 3;766,772,773;, + 3;766,773,767;, + 3;767,773,571;, + 3;768,571,566;, + 3;768,566,761;, + 3;774,775,776;, + 3;774,776,777;, + 3;775,462,463;, + 3;775,463,776;, + 3;437,440,778;, + 3;437,778,779;, + 3;440,444,780;, + 3;440,780,778;, + 3;444,447,781;, + 3;444,781,780;, + 3;447,450,782;, + 3;447,782,781;, + 3;450,415,581;, + 3;450,581,782;, + 3;779,778,783;, + 3;779,783,784;, + 3;778,780,785;, + 3;778,785,783;, + 3;780,781,786;, + 3;780,786,785;, + 3;781,782,787;, + 3;781,787,786;, + 3;782,581,587;, + 3;782,587,787;, + 3;784,783,788;, + 3;784,788,789;, + 3;783,785,790;, + 3;783,790,788;, + 3;785,786,791;, + 3;785,791,790;, + 3;786,787,792;, + 3;786,792,791;, + 3;787,587,593;, + 3;787,593,792;, + 3;788,790,771;, + 3;788,771,793;, + 3;790,791,772;, + 3;790,772,771;, + 3;791,792,773;, + 3;791,773,772;, + 3;792,593,595;, + 3;792,595,773;, + 3;773,595,571;, + 3;431,437,779;, + 3;431,779,596;, + 3;596,779,784;, + 3;596,784,597;, + 3;597,784,789;, + 3;597,789,598;, + 3;599,769,566;, + 3;600,769,599;, + 3;601,598,789;, + 3;601,789,794;, + 3;794,789,788;, + 3;794,788,793;, + 3;769,763,762;, + 3;603,601,794;, + 3;603,794,795;, + 3;770,793,771;, + 3;770,771,765;, + 3;795,794,793;, + 3;795,793,770;, + 3;795,770,764;, + 3;769,795,763;, + 3;600,603,795;, + 3;745,748,796;, + 3;745,796,797;, + 3;748,750,798;, + 3;748,798,796;, + 3;750,752,799;, + 3;750,799,798;, + 3;752,754,800;, + 3;752,800,799;, + 3;754,756,801;, + 3;754,801,800;, + 3;756,758,802;, + 3;756,802,801;, + 3;758,760,803;, + 3;758,803,802;, + 3;760,745,797;, + 3;760,797,803;, + 3;797,796,804;, + 3;797,804,805;, + 3;796,798,806;, + 3;796,806,804;, + 3;798,799,807;, + 3;798,807,806;, + 3;799,800,808;, + 3;799,808,807;, + 3;800,801,809;, + 3;800,809,808;, + 3;801,802,810;, + 3;801,810,809;, + 3;802,803,811;, + 3;802,811,810;, + 3;803,797,805;, + 3;803,805,811;, + 3;805,804,812;, + 3;805,812,813;, + 3;804,806,814;, + 3;804,814,812;, + 3;806,807,815;, + 3;806,815,814;, + 3;807,808,816;, + 3;807,816,815;, + 3;808,809,817;, + 3;808,817,816;, + 3;809,810,818;, + 3;809,818,817;, + 3;810,811,819;, + 3;810,819,818;, + 3;811,805,813;, + 3;811,813,819;, + 3;813,812,742;, + 3;812,814,743;, + 3;814,815,744;, + 3;815,816,739;, + 3;816,817,735;, + 3;817,818,736;, + 3;818,819,740;, + 3;819,813,741;, + 3;767,571,768;, + 3;600,795,769;, + 3;732,731,738;, + 3;743,744,721;, + 3;743,721,720;, + 3;733,737,736;, + 3;731,732,725;, + 3;731,725,724;, + 3;733,738,737;, + 3;730,738,731;, + 3;737,734,736;, + 3;708,710,722;, + 3;708,712,709;, + 3;713,715,716;, + 3;716,717,718;, + 3;718,712,711;, + 3;719,710,709;, + 3;720,722,710;, + 3;721,708,722;, + 3;724,714,713;, + 3;725,715,714;, + 3;727,713,716;, + 3;726,717,715;, + 3;729,716,718;, + 3;728,712,717;, + 3;723,718,711;, + 3;726,733,728;, + 3;729,730,727;, + 3;734,738,730;, + 3;723,735,729;, + 3;728,741,719;, + 3;719,742,720;, + 3;721,739,723;, + 3;813,742,741;, + 3;812,743,742;, + 3;814,744,743;, + 3;815,739,744;, + 3;816,735,739;, + 3;817,736,735;, + 3;818,740,736;, + 3;819,741,740;, + 3;732,738,733;, + 3;764,763,795;, + 3;774,820,775;, + 3;443,821,454;, + 3;453,462,775;, + 3;454,776,463;, + 3;820,439,453;, + 3;820,453,775;, + 3;821,777,776;, + 3;821,776,454;, + 3;439,820,822;, + 3;439,822,823;, + 3;821,443,824;, + 3;821,824,825;, + 3;443,439,823;, + 3;443,823,824;, + 3;820,774,826;, + 3;820,826,822;, + 3;774,777,827;, + 3;774,827,826;, + 3;777,821,825;, + 3;777,825,827;, + 3;823,822,828;, + 3;823,828,829;, + 3;825,824,830;, + 3;825,830,831;, + 3;824,823,829;, + 3;824,829,830;, + 3;822,826,832;, + 3;822,832,828;, + 3;826,827,833;, + 3;826,833,832;, + 3;827,825,831;, + 3;827,831,833;, + 3;829,828,834;, + 3;829,834,835;, + 3;831,830,836;, + 3;831,836,837;, + 3;830,829,835;, + 3;830,835,836;, + 3;828,832,838;, + 3;828,838,834;, + 3;832,833,839;, + 3;832,839,838;, + 3;833,831,837;, + 3;833,837,839;, + 3;835,834,840;, + 3;835,840,841;, + 3;837,836,842;, + 3;837,842,843;, + 3;836,835,841;, + 3;836,841,842;, + 3;834,838,844;, + 3;834,844,840;, + 3;838,839,845;, + 3;838,845,844;, + 3;839,837,843;, + 3;839,843,845;, + 3;841,840,846;, + 3;841,846,847;, + 3;843,842,848;, + 3;843,848,849;, + 3;842,841,847;, + 3;842,847,848;, + 3;840,844,850;, + 3;840,850,846;, + 3;844,845,851;, + 3;844,851,850;, + 3;845,843,849;, + 3;845,849,851;, + 3;847,846,852;, + 3;847,852,853;, + 3;854,855,848;, + 3;848,847,853;, + 3;848,853,854;, + 3;846,850,856;, + 3;846,856,852;, + 3;850,851,857;, + 3;850,857,856;, + 3;851,849,858;, + 3;851,858,857;, + 3;853,852,675;, + 3;853,675,674;, + 3;858,855,683;, + 3;674,682,853;, + 3;852,856,677;, + 3;852,677,675;, + 3;856,857,684;, + 3;856,684,677;, + 3;857,858,683;, + 3;857,683,684;, + 3;677,684,692;, + 3;677,692,676;, + 3;855,858,849;, + 3;855,849,848;, + 3;855,854,691;, + 3;855,691,683;, + 3;682,691,854;, + 3;682,854,853;, + 3;683,689,688;, + 3;859,860,861;, + 3;862,859,861;, + 3;862,861,863;, + 3;864,862,863;, + 3;864,863,865;, + 3;866,864,865;, + 3;866,865,867;, + 3;868,866,867;, + 3;868,867,869;, + 3;870,868,869;, + 3;870,869,871;, + 3;872,870,871;, + 3;872,871,873;, + 3;874,872,873;, + 3;875,876,877;, + 3;878,875,877;, + 3;879,880,877;, + 3;880,881,878;, + 3;880,878,877;, + 3;880,863,861;, + 3;879,873,871;, + 3;879,871,869;, + 3;880,879,869;, + 3;880,869,867;, + 3;880,867,865;, + 3;880,865,863;, + 3;880,861,881;, + 3;881,861,860;, + 3;882,883,859;, + 3;862,882,859;, + 3;884,882,862;, + 3;864,884,862;, + 3;885,884,864;, + 3;866,885,864;, + 3;886,885,866;, + 3;868,886,866;, + 3;887,886,868;, + 3;870,887,868;, + 3;888,887,870;, + 3;872,888,870;, + 3;889,888,872;, + 3;874,889,872;, + 3;890,891,892;, + 3;893,890,892;, + 3;890,894,895;, + 3;893,896,894;, + 3;890,893,894;, + 3;882,884,894;, + 3;888,889,895;, + 3;887,888,895;, + 3;894,887,895;, + 3;886,887,894;, + 3;885,886,894;, + 3;884,885,894;, + 3;896,882,894;, + 3;883,882,896;, + 3;883,860,859;, + 3;889,874,873;, + 3;891,876,875;, + 3;892,891,875;, + 3;890,877,876;, + 3;891,890,876;, + 3;892,875,878;, + 3;893,892,878;, + 3;895,879,877;, + 3;890,895,877;, + 3;893,878,881;, + 3;896,893,881;, + 3;889,873,879;, + 3;895,889,879;, + 3;896,881,860;, + 3;883,896,860;, + 3;897,898,899;, + 3;900,901,898;, + 3;897,900,898;, + 3;902,903,904;, + 3;905,897,899;, + 3;906,900,897;, + 3;905,906,897;, + 3;907,903,902;, + 3;908,905,899;, + 3;909,906,905;, + 3;908,909,905;, + 3;910,903,907;, + 3;911,908,899;, + 3;912,909,908;, + 3;911,912,908;, + 3;913,903,910;, + 3;914,911,899;, + 3;915,912,911;, + 3;914,915,911;, + 3;916,903,913;, + 3;917,914,899;, + 3;918,915,914;, + 3;917,918,914;, + 3;919,903,916;, + 3;920,917,899;, + 3;921,918,917;, + 3;920,921,917;, + 3;922,903,919;, + 3;898,920,899;, + 3;901,921,920;, + 3;898,901,920;, + 3;904,903,922;, + 3;923,924,925;, + 3;926,923,925;, + 3;927,923,926;, + 3;928,927,926;, + 3;929,927,928;, + 3;930,929,928;, + 3;931,929,930;, + 3;932,931,930;, + 3;933,931,932;, + 3;934,933,932;, + 3;935,933,934;, + 3;936,935,934;, + 3;937,935,936;, + 3;938,937,936;, + 3;924,937,938;, + 3;925,924,938;, + 3;939,940,941;, + 3;942,939,941;, + 3;943,939,942;, + 3;944,943,942;, + 3;945,943,944;, + 3;946,945,944;, + 3;947,945,946;, + 3;948,947,946;, + 3;949,947,948;, + 3;950,949,948;, + 3;951,949,950;, + 3;952,951,950;, + 3;953,951,952;, + 3;954,953,952;, + 3;940,953,954;, + 3;941,940,954;, + 3;902,904,955;, + 3;956,902,955;, + 3;907,902,956;, + 3;957,907,956;, + 3;910,907,957;, + 3;958,910,957;, + 3;913,910,958;, + 3;959,913,958;, + 3;916,913,959;, + 3;960,916,959;, + 3;919,916,960;, + 3;961,919,960;, + 3;922,919,961;, + 3;962,922,961;, + 3;904,922,962;, + 3;955,904,962;, + 3;963,964,965;, + 3;966,963,965;, + 3;967,963,966;, + 3;968,967,966;, + 3;969,967,968;, + 3;970,969,968;, + 3;971,969,970;, + 3;972,971,970;, + 3;973,971,972;, + 3;974,973,972;, + 3;975,973,974;, + 3;976,975,974;, + 3;977,975,976;, + 3;978,977,976;, + 3;964,977,978;, + 3;965,964,978;, + 3;963,956,955;, + 3;964,963,955;, + 3;965,924,923;, + 3;966,965,923;, + 3;967,957,956;, + 3;963,967,956;, + 3;966,923,927;, + 3;968,966,927;, + 3;969,958,957;, + 3;967,969,957;, + 3;968,927,929;, + 3;970,968,929;, + 3;971,959,958;, + 3;969,971,958;, + 3;970,929,931;, + 3;972,970,931;, + 3;973,960,959;, + 3;971,973,959;, + 3;972,931,933;, + 3;974,972,933;, + 3;975,961,960;, + 3;973,975,960;, + 3;974,933,935;, + 3;976,974,935;, + 3;977,962,961;, + 3;975,977,961;, + 3;976,935,937;, + 3;978,976,937;, + 3;964,955,962;, + 3;977,964,962;, + 3;978,937,924;, + 3;965,978,924;, + 3;939,926,925;, + 3;940,939,925;, + 3;941,901,900;, + 3;942,941,900;, + 3;943,928,926;, + 3;939,943,926;, + 3;942,900,906;, + 3;944,942,906;, + 3;945,930,928;, + 3;943,945,928;, + 3;944,906,909;, + 3;946,944,909;, + 3;947,932,930;, + 3;945,947,930;, + 3;946,909,912;, + 3;948,946,912;, + 3;949,934,932;, + 3;947,949,932;, + 3;948,912,915;, + 3;950,948,915;, + 3;951,936,934;, + 3;949,951,934;, + 3;950,915,918;, + 3;952,950,918;, + 3;953,938,936;, + 3;951,953,936;, + 3;952,918,921;, + 3;954,952,921;, + 3;940,925,938;, + 3;953,940,938;, + 3;954,921,901;, + 3;941,954,901;; + } + + MeshTextureCoords + { + 1479; + 0.280615;0.558309;, + 0.352344;0.554924;, + 0.369747;0.634334;, + 0.289371;0.647432;, + 0.201996;0.558309;, + 0.201322;0.630433;, + 0.106905;0.558899;, + 0.111895;0.631083;, + 0.285424;0.558309;, + 0.345657;0.555196;, + 0.330844;0.522226;, + 0.271138;0.475430;, + 0.196666;0.558309;, + 0.197484;0.478011;, + 0.117133;0.559519;, + 0.134823;0.506295;, + 0.334255;0.513986;, + 0.294188;0.647073;, + 0.355995;0.630874;, + 0.277231;0.467783;, + 0.195995;0.630044;, + 0.198470;0.465449;, + 0.120283;0.629581;, + 0.129080;0.494225;, + 0.369747;0.634334;, + 0.352344;0.554924;, + 0.280615;0.558309;, + 0.289371;0.647432;, + 0.201996;0.558309;, + 0.201322;0.630433;, + 0.106905;0.558899;, + 0.111895;0.631083;, + 0.330844;0.522226;, + 0.345657;0.555196;, + 0.285424;0.558309;, + 0.271138;0.475430;, + 0.196666;0.558309;, + 0.197484;0.478011;, + 0.117133;0.559519;, + 0.134823;0.506295;, + 0.334255;0.513986;, + 0.294188;0.647073;, + 0.355995;0.630874;, + 0.277231;0.467783;, + 0.195995;0.630044;, + 0.198470;0.465449;, + 0.120283;0.629581;, + 0.129080;0.494225;, + 0.883088;0.082413;, + 0.952602;0.082413;, + 0.952602;0.124822;, + 0.886670;0.125688;, + 0.845982;0.082413;, + 0.853762;0.092854;, + 0.803697;0.099653;, + 0.818882;0.082413;, + 0.550187;0.108550;, + 0.549541;0.099912;, + 0.521198;0.108242;, + 0.570984;0.105166;, + 0.559898;0.090185;, + 0.524569;0.093462;, + 0.590036;0.104329;, + 0.609816;0.100136;, + 0.609816;0.094012;, + 0.599702;0.103594;, + 0.609816;0.120548;, + 0.595746;0.121809;, + 0.488608;0.098736;, + 0.584643;0.123322;, + 0.609816;0.131139;, + 0.599203;0.131643;, + 0.590592;0.133959;, + 0.576247;0.124880;, + 0.572237;0.121932;, + 0.573963;0.136508;, + 0.580782;0.133278;, + 0.576453;0.120504;, + 0.520895;0.082413;, + 0.488125;0.082413;, + 0.563259;0.082413;, + 0.609816;0.082413;, + 0.609816;0.138599;, + 0.578418;0.137559;, + 0.593845;0.139019;, + 0.572039;0.122828;, + 0.572039;0.137791;, + 0.564045;0.135397;, + 0.563414;0.125172;, + 0.551182;0.122339;, + 0.547324;0.144010;, + 0.522523;0.121370;, + 0.522461;0.151881;, + 0.491771;0.120638;, + 0.485200;0.143898;, + 0.771477;0.082413;, + 0.771542;0.101298;, + 0.768210;0.120830;, + 0.580931;0.158343;, + 0.570449;0.163309;, + 0.574303;0.168917;, + 0.585622;0.167880;, + 0.609816;0.155714;, + 0.609816;0.165248;, + 0.609816;0.140236;, + 0.589064;0.140091;, + 0.578822;0.152508;, + 0.609816;0.150620;, + 0.569837;0.139814;, + 0.563751;0.158980;, + 0.546868;0.146335;, + 0.563096;0.170687;, + 0.532636;0.154841;, + 0.548798;0.169209;, + 0.497169;0.176069;, + 0.488662;0.173898;, + 0.525106;0.183955;, + 0.528242;0.192703;, + 0.537397;0.191192;, + 0.575976;0.174984;, + 0.609816;0.171885;, + 0.502307;0.209559;, + 0.609816;0.205712;, + 0.579870;0.208627;, + 0.609816;0.249215;, + 0.590314;0.270046;, + 0.549502;0.223146;, + 0.443436;0.224306;, + 0.480367;0.239659;, + 0.518461;0.263323;, + 0.553895;0.290008;, + 0.454060;0.280620;, + 0.433337;0.267212;, + 0.451713;0.279666;, + 0.484038;0.286519;, + 0.502163;0.296979;, + 0.812102;0.170782;, + 0.805323;0.132241;, + 0.442623;0.287970;, + 0.444460;0.290005;, + 0.472601;0.298053;, + 0.490726;0.308513;, + 0.820616;0.294451;, + 0.872608;0.298270;, + 0.460271;0.313764;, + 0.865127;0.329289;, + 0.830969;0.345938;, + 0.863058;0.350187;, + 0.430798;0.359632;, + 0.855289;0.369545;, + 0.832614;0.410798;, + 0.977253;0.082413;, + 0.977253;0.124822;, + 0.850503;0.118681;, + 0.836291;0.132722;, + 0.977253;0.162733;, + 0.937459;0.164546;, + 0.893619;0.175809;, + 0.846623;0.200535;, + 0.977253;0.204540;, + 0.934116;0.216421;, + 0.894289;0.229689;, + 0.840330;0.248155;, + 0.785859;0.267591;, + 0.488679;0.064671;, + 0.509745;0.064671;, + 0.558410;0.064671;, + 0.577029;0.064671;, + 0.597051;0.064671;, + 0.629523;0.064671;, + 0.653262;0.064671;, + 0.681827;0.064671;, + 0.711831;0.064671;, + 0.737024;0.064671;, + 0.488679;0.034046;, + 0.509740;0.034046;, + 0.558329;0.034046;, + 0.576834;0.034046;, + 0.596904;0.034046;, + 0.629776;0.034046;, + 0.653633;0.034046;, + 0.681781;0.034046;, + 0.711631;0.034046;, + 0.737024;0.034046;, + 0.488679;0.004105;, + 0.514426;0.004105;, + 0.554945;0.004105;, + 0.573423;0.004093;, + 0.594608;0.004075;, + 0.630847;0.004069;, + 0.656329;0.004118;, + 0.683589;0.004140;, + 0.706125;0.004111;, + 0.737024;0.004098;, + 0.611020;0.319170;, + 0.589653;0.319147;, + 0.556708;0.337698;, + 0.551911;0.353407;, + 0.543980;0.366476;, + 0.548138;0.390036;, + 0.551860;0.407144;, + 0.567299;0.423136;, + 0.586676;0.432468;, + 0.611020;0.437138;, + 0.611020;0.381372;, + 0.952552;0.082413;, + 0.883037;0.082413;, + 0.886620;0.125688;, + 0.952552;0.124822;, + 0.853762;0.092854;, + 0.845982;0.082413;, + 0.818882;0.082413;, + 0.803697;0.099653;, + 0.698437;0.106805;, + 0.668654;0.099194;, + 0.669447;0.108550;, + 0.650225;0.105166;, + 0.695064;0.093462;, + 0.656860;0.093779;, + 0.629597;0.104329;, + 0.619931;0.103594;, + 0.623887;0.121809;, + 0.733040;0.099166;, + 0.634991;0.123322;, + 0.620430;0.131643;, + 0.629041;0.133959;, + 0.647396;0.121932;, + 0.643386;0.124880;, + 0.638851;0.133278;, + 0.645671;0.136508;, + 0.643180;0.120504;, + 0.736511;0.082413;, + 0.698740;0.082413;, + 0.656374;0.082413;, + 0.625788;0.139019;, + 0.641215;0.137559;, + 0.647594;0.137791;, + 0.647594;0.122828;, + 0.656219;0.125172;, + 0.655588;0.135397;, + 0.665576;0.120182;, + 0.672309;0.144010;, + 0.692798;0.120651;, + 0.697172;0.151881;, + 0.731433;0.119786;, + 0.744808;0.142253;, + 0.771477;0.082413;, + 0.771542;0.101298;, + 0.768210;0.120830;, + 0.649184;0.163309;, + 0.638702;0.158343;, + 0.634011;0.167880;, + 0.645330;0.168917;, + 0.630569;0.140091;, + 0.640811;0.152508;, + 0.649796;0.139814;, + 0.655882;0.158980;, + 0.672766;0.146335;, + 0.656537;0.170687;, + 0.670836;0.169209;, + 0.686998;0.154841;, + 0.720784;0.179724;, + 0.729290;0.177552;, + 0.696600;0.188791;, + 0.691392;0.192703;, + 0.643657;0.174984;, + 0.682237;0.191192;, + 0.710804;0.204162;, + 0.639763;0.208627;, + 0.629319;0.270046;, + 0.670131;0.223146;, + 0.774517;0.229178;, + 0.739679;0.241380;, + 0.711278;0.259955;, + 0.665739;0.290008;, + 0.766770;0.280022;, + 0.760151;0.282057;, + 0.771099;0.269284;, + 0.735595;0.286519;, + 0.717471;0.296979;, + 0.812102;0.170782;, + 0.805323;0.132241;, + 0.775600;0.289980;, + 0.771064;0.292089;, + 0.747034;0.300317;, + 0.728909;0.308513;, + 0.820616;0.294451;, + 0.872608;0.298270;, + 0.759362;0.313764;, + 0.865127;0.329289;, + 0.830969;0.345938;, + 0.863058;0.350187;, + 0.788837;0.359632;, + 0.855289;0.369545;, + 0.832614;0.410798;, + 0.836291;0.132722;, + 0.850503;0.118681;, + 0.937408;0.164546;, + 0.846623;0.200535;, + 0.893619;0.175809;, + 0.934066;0.216421;, + 0.894289;0.229689;, + 0.840330;0.248155;, + 0.785859;0.267591;, + 0.964301;0.064671;, + 0.917764;0.064671;, + 0.897016;0.064671;, + 0.876995;0.064671;, + 0.844523;0.064671;, + 0.820785;0.064671;, + 0.792219;0.064671;, + 0.762215;0.064671;, + 0.964306;0.034046;, + 0.917844;0.034046;, + 0.897212;0.034046;, + 0.877141;0.034046;, + 0.844270;0.034046;, + 0.820414;0.034046;, + 0.792265;0.034046;, + 0.762416;0.034046;, + 0.959620;0.004105;, + 0.921228;0.004105;, + 0.900623;0.004093;, + 0.879437;0.004075;, + 0.843198;0.004069;, + 0.817717;0.004118;, + 0.790457;0.004140;, + 0.767920;0.004111;, + 0.632386;0.319147;, + 0.665331;0.337698;, + 0.670129;0.353407;, + 0.678059;0.366476;, + 0.673901;0.390036;, + 0.670179;0.407144;, + 0.654740;0.423136;, + 0.635362;0.432468;, + 0.391029;0.473726;, + 0.369726;0.473726;, + 0.369726;0.506185;, + 0.375924;0.506185;, + 0.369196;0.401156;, + 0.348048;0.473726;, + 0.363152;0.506185;, + 0.369726;0.473726;, + 0.369726;0.506185;, + 0.348424;0.473726;, + 0.363527;0.506185;, + 0.389704;0.473726;, + 0.363527;0.506185;, + 0.371565;0.129504;, + 0.355624;0.129504;, + 0.355624;0.175198;, + 0.368648;0.175198;, + 0.386154;0.129504;, + 0.386565;0.175198;, + 0.401455;0.129504;, + 0.401455;0.175198;, + 0.416757;0.129504;, + 0.416346;0.175198;, + 0.431346;0.129504;, + 0.434263;0.175198;, + 0.355624;0.086776;, + 0.369098;0.086776;, + 0.383421;0.086776;, + 0.397779;0.086776;, + 0.416817;0.086776;, + 0.431140;0.086776;, + 0.355571;0.048160;, + 0.371528;0.048160;, + 0.383328;0.048160;, + 0.398025;0.048160;, + 0.411409;0.048160;, + 0.429026;0.048160;, + 0.400607;0.010969;, + 0.355624;0.175198;, + 0.355624;0.129504;, + 0.371565;0.129504;, + 0.368648;0.175198;, + 0.386154;0.129504;, + 0.386565;0.175198;, + 0.401455;0.129504;, + 0.401455;0.175198;, + 0.416757;0.129504;, + 0.416346;0.175198;, + 0.431346;0.129504;, + 0.434263;0.175198;, + 0.355624;0.086776;, + 0.369098;0.086776;, + 0.383421;0.086776;, + 0.397779;0.086776;, + 0.416817;0.086776;, + 0.431140;0.086776;, + 0.355571;0.048160;, + 0.371528;0.048160;, + 0.383328;0.048160;, + 0.398025;0.048160;, + 0.411409;0.048160;, + 0.429026;0.048160;, + 0.400607;0.010969;, + 0.517951;0.890433;, + 0.427137;0.883950;, + 0.435186;0.982633;, + 0.510383;0.975251;, + 0.415278;0.689727;, + 0.370135;0.659013;, + 0.391969;0.701679;, + 0.572844;0.892869;, + 0.567696;0.972005;, + 0.425793;0.670568;, + 0.625334;0.894379;, + 0.629035;0.955158;, + 0.715766;0.705303;, + 0.712791;0.895888;, + 0.712791;0.942076;, + 0.744180;0.713567;, + 0.777555;0.942076;, + 0.777555;0.895888;, + 0.503275;0.813897;, + 0.440512;0.799365;, + 0.629357;0.811287;, + 0.584542;0.818759;, + 0.720847;0.803956;, + 0.777555;0.803956;, + 0.480556;0.722650;, + 0.402939;0.738043;, + 0.900980;0.491809;, + 0.873420;0.492783;, + 0.732693;0.753223;, + 0.370135;0.701679;, + 0.370135;0.731323;, + 0.370135;0.883950;, + 0.370135;0.982633;, + 0.777555;0.713567;, + 0.370135;0.799365;, + 0.777555;0.751715;, + 0.836156;0.510838;, + 0.873268;0.519740;, + 0.305207;0.982633;, + 0.313256;0.883950;, + 0.222442;0.890433;, + 0.230010;0.975251;, + 0.343249;0.701679;, + 0.325115;0.689727;, + 0.176734;0.894092;, + 0.180046;0.971166;, + 0.314600;0.670568;, + 0.935726;0.894379;, + 0.942692;0.955158;, + 0.838894;0.705303;, + 0.841869;0.895888;, + 0.841869;0.942076;, + 0.810480;0.713567;, + 0.299881;0.799365;, + 0.237118;0.813897;, + 0.970118;0.818759;, + 0.914636;0.811287;, + 0.833813;0.803956;, + 0.332279;0.738043;, + 0.259837;0.722650;, + 0.873420;0.492783;, + 0.900980;0.491809;, + 0.821967;0.753223;, + 0.836156;0.510838;, + 0.873268;0.519740;, + 0.918959;0.405681;, + 0.898498;0.429269;, + 0.894966;0.400969;, + 0.990199;0.426294;, + 0.947165;0.384354;, + 0.971267;0.413782;, + 0.956838;0.417097;, + 0.967154;0.447736;, + 0.978365;0.446699;, + 0.955778;0.486085;, + 0.940586;0.319616;, + 0.944732;0.317124;, + 0.975241;0.318740;, + 0.975564;0.320794;, + 0.943364;0.442528;, + 0.928589;0.476796;, + 0.906900;0.466579;, + 0.904555;0.321383;, + 0.903345;0.321307;, + 0.907629;0.434826;, + 0.885399;0.445480;, + 0.875628;0.426406;, + 0.896440;0.422435;, + 0.926290;0.443429;, + 0.953860;0.405111;, + 0.892791;0.421365;, + 0.910186;0.401974;, + 0.882443;0.367108;, + 0.872030;0.376435;, + 0.888582;0.381286;, + 0.896041;0.370924;, + 0.894747;0.401967;, + 0.872978;0.406447;, + 0.891864;0.404921;, + 0.951217;0.361266;, + 0.986172;0.364345;, + 0.987166;0.358691;, + 0.945619;0.365525;, + 0.896655;0.370095;, + 0.987594;0.438274;, + 0.063348;0.627819;, + 0.077953;0.584320;, + 0.011718;0.584154;, + 0.079060;0.581589;, + 0.013910;0.580729;, + 0.080683;0.486679;, + 0.059355;0.473666;, + 0.029863;0.472997;, + 0.071135;0.548371;, + 0.009488;0.486523;, + 0.010087;0.551560;, + 0.100741;0.470991;, + 0.097934;0.479430;, + 0.107691;0.470245;, + 0.107687;0.470545;, + 0.110970;0.479430;, + 0.101601;0.502242;, + 0.107919;0.502385;, + 0.097032;0.499086;, + 0.110626;0.499488;, + 0.099079;0.486255;, + 0.111420;0.485572;, + 0.106250;0.421203;, + 0.078698;0.426763;, + 0.127709;0.425565;, + 0.172089;0.424328;, + 0.166487;0.427056;, + 0.050569;0.412161;, + 0.035610;0.406526;, + 0.052377;0.444396;, + 0.051832;0.429629;, + 0.227606;0.399193;, + 0.205078;0.399390;, + 0.229717;0.399311;, + 0.254647;0.399270;, + 0.272080;0.399407;, + 0.252416;0.399142;, + 0.070362;0.287393;, + 0.016046;0.293476;, + 0.016046;0.324669;, + 0.072292;0.324669;, + 0.113194;0.285322;, + 0.113279;0.324669;, + 0.158180;0.271515;, + 0.163873;0.324669;, + 0.206640;0.268446;, + 0.206640;0.324669;, + 0.247941;0.274515;, + 0.242835;0.324669;, + 0.283810;0.288322;, + 0.278594;0.324669;, + 0.311221;0.290393;, + 0.315308;0.324669;, + 0.068945;0.235193;, + 0.016046;0.240473;, + 0.108219;0.207433;, + 0.152927;0.178981;, + 0.206640;0.167059;, + 0.252867;0.175304;, + 0.288891;0.212805;, + 0.318162;0.231991;, + 0.065705;0.198441;, + 0.016046;0.208214;, + 0.155878;0.116450;, + 0.260626;0.086608;, + 0.206640;0.069824;, + 0.297131;0.129663;, + 0.334772;0.190121;, + 0.877720;0.549659;, + 0.835118;0.546998;, + 0.835052;0.586744;, + 0.876715;0.589598;, + 0.068252;0.887184;, + 0.089066;0.958830;, + 0.046998;0.832490;, + 0.029357;0.785551;, + 0.023073;0.712469;, + 0.023073;0.674844;, + 0.145853;0.888391;, + 0.143516;0.958116;, + 0.177991;0.831961;, + 0.197564;0.786458;, + 0.213185;0.711950;, + 0.215318;0.674844;, + 0.157821;0.890682;, + 0.156902;0.959254;, + 0.190868;0.832283;, + 0.205079;0.782164;, + 0.223096;0.710534;, + 0.225229;0.674844;, + 0.153638;0.053327;, + 0.334772;0.160303;, + 0.086938;0.892203;, + 0.143516;0.891840;, + 0.156902;0.892732;, + 0.055189;0.189485;, + 0.065223;0.170997;, + 0.067039;0.047965;, + 0.105565;0.048142;, + 0.068508;0.117444;, + 0.107800;0.133075;, + 0.343109;0.380090;, + 0.323832;0.383288;, + 0.355057;0.385320;, + 0.206829;0.384744;, + 0.234567;0.382514;, + 0.257187;0.388855;, + 0.276919;0.382594;, + 0.298064;0.380974;, + 0.344860;0.373637;, + 0.325680;0.376362;, + 0.354260;0.377471;, + 0.204463;0.374769;, + 0.233180;0.376205;, + 0.251611;0.377892;, + 0.277423;0.373836;, + 0.298171;0.373284;, + 0.140035;0.355838;, + 0.100853;0.355882;, + 0.154296;0.355147;, + 0.169423;0.354964;, + 0.097884;0.347432;, + 0.078303;0.359102;, + 0.054330;0.360424;, + 0.076810;0.360458;, + 0.784640;0.576144;, + 0.931041;0.562636;, + 0.783145;0.623006;, + 0.702517;0.610617;, + 0.985871;0.600609;, + 0.931288;0.605739;, + 0.844017;0.627798;, + 0.881038;0.614886;, + 0.782830;0.648292;, + 0.697657;0.637050;, + 0.985871;0.627042;, + 0.929760;0.623529;, + 0.843533;0.654056;, + 0.883177;0.641144;, + 0.454991;0.524293;, + 0.410274;0.510212;, + 0.603777;0.507259;, + 0.564440;0.512230;, + 0.487397;0.524067;, + 0.520078;0.523358;, + 0.455289;0.523505;, + 0.409861;0.511667;, + 0.604047;0.509031;, + 0.564126;0.512622;, + 0.488686;0.521909;, + 0.523239;0.524440;, + 0.449119;0.565596;, + 0.407333;0.554503;, + 0.605049;0.554831;, + 0.569952;0.558712;, + 0.492583;0.572056;, + 0.526891;0.572306;, + 0.436540;0.611713;, + 0.402027;0.604724;, + 0.585826;0.605834;, + 0.606428;0.604934;, + 0.491624;0.615716;, + 0.535771;0.615875;, + 0.577581;0.606189;, + 0.894966;0.400969;, + 0.898498;0.429269;, + 0.918959;0.405681;, + 0.902644;0.387762;, + 0.947165;0.384354;, + 0.969630;0.436914;, + 0.966359;0.469649;, + 0.985675;0.467648;, + 0.988300;0.434689;, + 0.955778;0.486085;, + 0.975241;0.318740;, + 0.944732;0.317124;, + 0.940586;0.319616;, + 0.975564;0.320794;, + 0.943364;0.442528;, + 0.906900;0.466579;, + 0.928589;0.476796;, + 0.903345;0.321307;, + 0.903853;0.322786;, + 0.875628;0.426406;, + 0.885399;0.445480;, + 0.907629;0.434826;, + 0.896440;0.422435;, + 0.926290;0.443429;, + 0.953860;0.405111;, + 0.892791;0.421365;, + 0.910186;0.401974;, + 0.888582;0.381286;, + 0.872030;0.376435;, + 0.882443;0.367108;, + 0.896041;0.370924;, + 0.872978;0.406447;, + 0.894747;0.401967;, + 0.891864;0.404921;, + 0.951217;0.361266;, + 0.986172;0.364345;, + 0.987166;0.358691;, + 0.945619;0.365525;, + 0.896655;0.370095;, + 0.899278;0.370234;, + 0.011718;0.584154;, + 0.077953;0.584320;, + 0.063348;0.627819;, + 0.013910;0.580729;, + 0.079060;0.581589;, + 0.029863;0.472997;, + 0.059355;0.473666;, + 0.080683;0.486679;, + 0.009488;0.486523;, + 0.071135;0.548371;, + 0.010087;0.551560;, + 0.097961;0.479430;, + 0.100768;0.470991;, + 0.107714;0.470545;, + 0.107717;0.470245;, + 0.110997;0.479430;, + 0.107946;0.502385;, + 0.101628;0.502242;, + 0.097059;0.499086;, + 0.110653;0.499488;, + 0.099105;0.486255;, + 0.111447;0.485572;, + 0.078698;0.426763;, + 0.106250;0.421203;, + 0.127709;0.425565;, + 0.172089;0.424328;, + 0.166487;0.427056;, + 0.035610;0.406526;, + 0.050569;0.412161;, + 0.051832;0.429629;, + 0.052377;0.444396;, + 0.227606;0.399193;, + 0.205078;0.399390;, + 0.229717;0.399311;, + 0.254647;0.399270;, + 0.272080;0.399407;, + 0.252416;0.399142;, + 0.016046;0.324669;, + 0.016046;0.293476;, + 0.070362;0.287393;, + 0.072292;0.324669;, + 0.113194;0.285322;, + 0.113279;0.324669;, + 0.158180;0.271515;, + 0.163873;0.324669;, + 0.206640;0.268446;, + 0.206640;0.324669;, + 0.247941;0.274515;, + 0.242835;0.324669;, + 0.283810;0.288322;, + 0.278594;0.324669;, + 0.311221;0.290393;, + 0.315308;0.324669;, + 0.016046;0.240473;, + 0.068945;0.235193;, + 0.108219;0.207433;, + 0.152927;0.178981;, + 0.206640;0.167059;, + 0.252867;0.175304;, + 0.288891;0.212805;, + 0.318162;0.231991;, + 0.065705;0.198441;, + 0.155878;0.116450;, + 0.206640;0.069824;, + 0.260626;0.086608;, + 0.297131;0.129663;, + 0.835052;0.586744;, + 0.835118;0.546998;, + 0.877720;0.549659;, + 0.876715;0.589598;, + 0.068252;0.887184;, + 0.089066;0.958830;, + 0.046998;0.832490;, + 0.029357;0.785551;, + 0.023073;0.712469;, + 0.145853;0.888391;, + 0.143516;0.958116;, + 0.177991;0.831961;, + 0.197564;0.786458;, + 0.213185;0.711950;, + 0.157821;0.890682;, + 0.156902;0.959254;, + 0.190868;0.832283;, + 0.205079;0.782164;, + 0.223096;0.710534;, + 0.153638;0.053327;, + 0.105565;0.048142;, + 0.107800;0.133075;, + 0.343109;0.380090;, + 0.323832;0.383288;, + 0.355057;0.385320;, + 0.206829;0.384744;, + 0.234567;0.382514;, + 0.257187;0.388855;, + 0.276919;0.382594;, + 0.298064;0.380974;, + 0.344860;0.373637;, + 0.325680;0.376362;, + 0.354260;0.377471;, + 0.204463;0.374769;, + 0.233180;0.376205;, + 0.251611;0.377892;, + 0.277423;0.373836;, + 0.298171;0.373284;, + 0.140035;0.355838;, + 0.100853;0.355882;, + 0.154296;0.355147;, + 0.169423;0.354964;, + 0.097884;0.347432;, + 0.078303;0.359102;, + 0.054330;0.360424;, + 0.076810;0.360458;, + 0.784640;0.576144;, + 0.931041;0.562636;, + 0.783145;0.623006;, + 0.702517;0.610617;, + 0.985871;0.600609;, + 0.931288;0.605739;, + 0.844017;0.627798;, + 0.881038;0.614886;, + 0.782830;0.648292;, + 0.697657;0.637050;, + 0.985871;0.627042;, + 0.929760;0.623529;, + 0.843533;0.654056;, + 0.883177;0.641144;, + 0.454991;0.524293;, + 0.410274;0.510212;, + 0.603777;0.507259;, + 0.564440;0.512230;, + 0.487397;0.524067;, + 0.520078;0.523358;, + 0.455289;0.523505;, + 0.409861;0.511667;, + 0.604047;0.509031;, + 0.564126;0.512622;, + 0.488686;0.521909;, + 0.523239;0.524440;, + 0.449119;0.565596;, + 0.407333;0.554503;, + 0.605049;0.554831;, + 0.569952;0.558712;, + 0.492583;0.572056;, + 0.526891;0.572306;, + 0.436540;0.611713;, + 0.402027;0.604724;, + 0.606428;0.604934;, + 0.585826;0.605834;, + 0.491624;0.615716;, + 0.535771;0.615875;, + 0.577581;0.606189;, + 0.225629;0.906647;, + 0.257118;0.770403;, + 0.196806;0.682930;, + 0.100224;0.753850;, + 0.159871;0.589702;, + 0.034839;0.630259;, + 0.147435;0.493553;, + 0.018893;0.506986;, + 0.159871;0.397404;, + 0.034839;0.383712;, + 0.196806;0.304177;, + 0.082196;0.264183;, + 0.257118;0.216703;, + 0.159520;0.152032;, + 0.314932;0.166093;, + 0.318555;0.018152;, + 0.554152;0.626886;, + 0.557998;0.322535;, + 0.442610;0.296521;, + 0.431074;0.650296;, + 0.350303;0.254902;, + 0.336420;0.485623;, + 0.323379;0.702323;, + 0.196806;0.682655;, + 0.257118;0.770128;, + 0.159871;0.589427;, + 0.147435;0.493278;, + 0.159871;0.397130;, + 0.196806;0.303901;, + 0.257118;0.216428;, + 0.314932;0.165818;, + 0.442610;0.296246;, + 0.557998;0.322260;, + 0.554152;0.626611;, + 0.431074;0.650021;, + 0.336420;0.485348;, + 0.350303;0.254627;, + 0.323379;0.702048;, + 0.438450;0.893948;, + 0.393391;0.912613;, + 0.393391;0.848889;, + 0.731679;0.669200;, + 0.682021;0.669200;, + 0.496696;0.202288;, + 0.450065;0.155657;, + 0.450065;0.221604;, + 0.457115;0.848889;, + 0.781335;0.669200;, + 0.516012;0.155657;, + 0.438450;0.803826;, + 0.830993;0.669200;, + 0.496696;0.109022;, + 0.393391;0.785161;, + 0.880650;0.669200;, + 0.450065;0.089706;, + 0.348331;0.803826;, + 0.930304;0.669200;, + 0.403431;0.109022;, + 0.329666;0.848889;, + 0.979961;0.669200;, + 0.384118;0.155657;, + 0.348331;0.893948;, + 0.632365;0.669200;, + 0.403431;0.202288;, + 0.731679;0.199240;, + 0.682021;0.199240;, + 0.682021;0.474517;, + 0.731679;0.474517;, + 0.781335;0.199240;, + 0.781335;0.474517;, + 0.830993;0.199240;, + 0.830993;0.474517;, + 0.880650;0.199240;, + 0.880650;0.474517;, + 0.930304;0.199240;, + 0.930304;0.474517;, + 0.979961;0.199240;, + 0.979961;0.474517;, + 0.632365;0.199240;, + 0.632365;0.474517;, + 0.731679;0.480018;, + 0.682021;0.480018;, + 0.682021;0.663701;, + 0.731679;0.663701;, + 0.781335;0.480018;, + 0.781335;0.663701;, + 0.830993;0.480018;, + 0.830993;0.663701;, + 0.880650;0.480018;, + 0.880650;0.663701;, + 0.930304;0.480018;, + 0.930304;0.663701;, + 0.979961;0.480018;, + 0.979961;0.663701;, + 0.632365;0.480018;, + 0.632365;0.663701;, + 0.682021;0.038480;, + 0.731679;0.038480;, + 0.781335;0.038480;, + 0.830993;0.038480;, + 0.880650;0.038480;, + 0.930304;0.038480;, + 0.979961;0.038480;, + 0.632365;0.038480;, + 0.731679;0.038480;, + 0.682021;0.038480;, + 0.682021;0.199240;, + 0.731679;0.199240;, + 0.781335;0.038480;, + 0.781335;0.199240;, + 0.830993;0.038480;, + 0.830993;0.199240;, + 0.880650;0.038480;, + 0.880650;0.199240;, + 0.930304;0.038480;, + 0.930304;0.199240;, + 0.979961;0.038480;, + 0.979961;0.199240;, + 0.632365;0.038480;, + 0.632365;0.199240;, + 0.736511;0.082413;, + 0.733040;0.099166;, + 0.731433;0.119786;, + 0.744808;0.142253;, + 0.775285;0.229227;, + 0.825553;0.282190;, + 0.852349;0.284159;, + 0.402107;0.302317;, + 0.874543;0.302145;, + 0.852790;0.291030;, + 0.822925;0.307724;, + 0.404511;0.315541;, + 0.495438;0.334057;, + 0.395519;0.350837;, + 0.829692;0.356466;, + 0.396977;0.360710;, + 0.452126;0.371941;, + 0.404138;0.409819;, + 0.832399;0.409796;, + 0.850805;0.118056;, + 0.854157;0.093477;, + 0.836994;0.132361;, + 0.426443;0.264001;, + 0.846071;0.082413;, + 0.488679;0.071330;, + 0.509864;0.071330;, + 0.561990;0.071330;, + 0.574974;0.071330;, + 0.596153;0.071330;, + 0.630507;0.071330;, + 0.655447;0.071330;, + 0.685261;0.071330;, + 0.711741;0.071330;, + 0.737024;0.071330;, + 0.611020;0.297027;, + 0.572843;0.296995;, + 0.529308;0.322515;, + 0.522962;0.344128;, + 0.512484;0.362103;, + 0.517972;0.394490;, + 0.522892;0.418014;, + 0.543315;0.440027;, + 0.568927;0.452870;, + 0.611020;0.459291;, + 0.775285;0.229227;, + 0.825553;0.282190;, + 0.852349;0.284159;, + 0.817527;0.302317;, + 0.874543;0.302145;, + 0.822925;0.307724;, + 0.852790;0.291030;, + 0.815123;0.315541;, + 0.724198;0.334057;, + 0.824114;0.350837;, + 0.829692;0.356466;, + 0.822656;0.360710;, + 0.767508;0.371941;, + 0.815497;0.409819;, + 0.832399;0.409796;, + 0.854106;0.093477;, + 0.850754;0.118056;, + 0.836944;0.132361;, + 0.784785;0.267655;, + 0.846020;0.082413;, + 0.985368;0.071330;, + 0.985368;0.064671;, + 0.964181;0.071330;, + 0.920566;0.071330;, + 0.899072;0.071330;, + 0.877892;0.071330;, + 0.843538;0.071330;, + 0.818598;0.071330;, + 0.788785;0.071330;, + 0.762305;0.071330;, + 0.985368;0.034046;, + 0.985368;0.004105;, + 0.649194;0.296995;, + 0.692732;0.322515;, + 0.699077;0.344128;, + 0.709556;0.362103;, + 0.704068;0.394490;, + 0.699148;0.418014;, + 0.678724;0.440027;, + 0.653112;0.452870;, + 0.348048;0.473726;, + 0.363152;0.506185;, + 0.369880;0.401156;, + 0.391029;0.473726;, + 0.375924;0.506185;, + 0.389704;0.473726;, + 0.374601;0.506185;, + 0.348424;0.473726;, + 0.368932;0.401156;, + 0.452400;0.129504;, + 0.452400;0.175198;, + 0.452400;0.086776;, + 0.452347;0.048160;, + 0.452400;0.129504;, + 0.452400;0.175198;, + 0.452400;0.086776;, + 0.452347;0.048160;, + 0.517436;0.890028;, + 0.510531;0.976844;, + 0.572671;0.894379;, + 0.568342;0.971093;, + 0.777555;0.678284;, + 0.694161;0.680784;, + 0.930651;0.528982;, + 0.636790;0.729840;, + 0.497690;0.695873;, + 0.625202;0.706393;, + 0.829864;0.489448;, + 0.791888;0.522384;, + 0.370258;0.659013;, + 0.230175;0.975238;, + 0.222812;0.890877;, + 0.990199;0.971093;, + 0.985870;0.894379;, + 0.860499;0.680784;, + 0.930651;0.528982;, + 0.917870;0.729840;, + 0.370258;0.731323;, + 0.370258;0.701679;, + 0.242703;0.695873;, + 0.929458;0.706393;, + 0.370258;0.883950;, + 0.370258;0.982633;, + 0.370258;0.799365;, + 0.791888;0.522384;, + 0.829864;0.489448;, + 0.986396;0.412257;, + 0.975310;0.418268;, + 0.902644;0.387762;, + 0.994669;0.402101;, + 0.981890;0.469917;, + 0.995134;0.390231;, + 0.984220;0.450300;, + 0.603782;0.643446;, + 0.609341;0.643446;, + 0.582531;0.643446;, + 0.973521;0.462071;, + 0.963886;0.460904;, + 0.973851;0.440898;, + 0.899278;0.370234;, + 0.961957;0.475718;, + 0.956964;0.472868;, + 0.985692;0.467093;, + 0.973104;0.465610;, + 0.100745;0.470691;, + 0.111438;0.479862;, + 0.110968;0.480595;, + 0.097932;0.480595;, + 0.098169;0.480010;, + 0.101601;0.502243;, + 0.097031;0.499087;, + 0.107919;0.502387;, + 0.099077;0.486238;, + 0.110626;0.499489;, + 0.111419;0.485555;, + 0.086807;0.443269;, + 0.132822;0.441307;, + 0.113511;0.444424;, + 0.140395;0.423608;, + 0.135060;0.441158;, + 0.136342;0.424943;, + 0.198735;0.443346;, + 0.075366;0.444316;, + 0.027868;0.432074;, + 0.208127;0.399315;, + 0.227674;0.440235;, + 0.195515;0.443409;, + 0.227674;0.438745;, + 0.267237;0.439863;, + 0.256190;0.399124;, + 0.269540;0.435635;, + 0.071134;0.428124;, + 0.066616;0.410202;, + 0.367433;0.293476;, + 0.367433;0.324669;, + 0.367433;0.240473;, + 0.367433;0.208214;, + 0.057618;0.889801;, + 0.075217;0.960259;, + 0.039094;0.831536;, + 0.022855;0.783300;, + 0.016830;0.710664;, + 0.016830;0.674844;, + 0.206640;0.029904;, + 0.152154;0.014424;, + 0.263299;0.059838;, + 0.297418;0.072112;, + 0.334772;0.081782;, + 0.073089;0.893078;, + 0.101798;0.013560;, + 0.065925;0.013560;, + 0.339698;0.346140;, + 0.322500;0.345093;, + 0.349771;0.347008;, + 0.206286;0.347083;, + 0.187234;0.346447;, + 0.192520;0.385320;, + 0.233624;0.344280;, + 0.264945;0.347083;, + 0.283942;0.347008;, + 0.302605;0.346140;, + 0.302349;0.346140;, + 0.297808;0.380974;, + 0.191723;0.377471;, + 0.297916;0.373284;, + 0.141389;0.337516;, + 0.096555;0.337516;, + 0.155781;0.337516;, + 0.141143;0.337516;, + 0.139486;0.355087;, + 0.169423;0.337516;, + 0.094962;0.337516;, + 0.139682;0.337516;, + 0.139079;0.356255;, + 0.070832;0.337516;, + 0.059451;0.337516;, + 0.037745;0.337516;, + 0.034063;0.355263;, + 0.069376;0.337516;, + 0.070089;0.337516;, + 0.078341;0.360000;, + 0.140295;0.410202;, + 0.154671;0.410202;, + 0.169423;0.410202;, + 0.106374;0.410202;, + 0.066616;0.410202;, + 0.050267;0.412054;, + 0.108395;0.410202;, + 0.052779;0.459751;, + 0.069646;0.449516;, + 0.301467;0.437159;, + 0.303759;0.398990;, + 0.031124;0.452374;, + 0.027488;0.628182;, + 0.133164;0.444513;, + 0.267437;0.438220;, + 0.140673;0.410202;, + 0.138160;0.410202;, + 0.035715;0.406444;, + 0.983283;0.552269;, + 0.717768;0.549735;, + 0.665848;0.551563;, + 0.665848;0.603961;, + 0.665848;0.624999;, + 0.465080;0.495146;, + 0.416895;0.485971;, + 0.596048;0.486003;, + 0.554443;0.490049;, + 0.648116;0.507207;, + 0.653986;0.485971;, + 0.495199;0.500632;, + 0.453668;0.524293;, + 0.520895;0.500658;, + 0.647703;0.508662;, + 0.453966;0.523505;, + 0.644424;0.554503;, + 0.639118;0.604724;, + 0.427648;0.643446;, + 0.408566;0.643446;, + 0.620138;0.643446;, + 0.645657;0.643446;, + 0.510273;0.643446;, + 0.560244;0.643446;, + 0.981890;0.469917;, + 0.994669;0.402101;, + 0.984220;0.450300;, + 0.995134;0.390231;, + 0.582531;0.643446;, + 0.609341;0.643446;, + 0.603782;0.643446;, + 0.987227;0.416442;, + 0.963436;0.423164;, + 0.960557;0.404342;, + 0.955628;0.408440;, + 0.100772;0.470691;, + 0.111465;0.479862;, + 0.110995;0.480595;, + 0.098196;0.480010;, + 0.097958;0.480595;, + 0.101627;0.502243;, + 0.097058;0.499087;, + 0.107946;0.502387;, + 0.099104;0.486238;, + 0.110652;0.499489;, + 0.111445;0.485555;, + 0.086807;0.443269;, + 0.113511;0.444424;, + 0.132822;0.441307;, + 0.135060;0.441158;, + 0.140395;0.423608;, + 0.198735;0.443346;, + 0.136342;0.424943;, + 0.075366;0.444316;, + 0.027868;0.432074;, + 0.227674;0.440235;, + 0.208127;0.399315;, + 0.195515;0.443409;, + 0.227674;0.438745;, + 0.256190;0.399124;, + 0.267237;0.439863;, + 0.269540;0.435635;, + 0.066616;0.410202;, + 0.071134;0.428124;, + 0.367433;0.293476;, + 0.367433;0.324669;, + 0.367433;0.240473;, + 0.075217;0.960259;, + 0.057618;0.889801;, + 0.039094;0.831536;, + 0.022855;0.783300;, + 0.016830;0.710664;, + 0.152154;0.014424;, + 0.206640;0.029904;, + 0.263299;0.059838;, + 0.297418;0.072112;, + 0.101798;0.013560;, + 0.322500;0.345093;, + 0.339698;0.346140;, + 0.349771;0.347008;, + 0.187234;0.346447;, + 0.206286;0.347083;, + 0.192520;0.385320;, + 0.233624;0.344280;, + 0.264945;0.347083;, + 0.283942;0.347008;, + 0.302605;0.346140;, + 0.302349;0.346140;, + 0.297808;0.380974;, + 0.191723;0.377471;, + 0.297916;0.373284;, + 0.096555;0.337516;, + 0.141389;0.337516;, + 0.141143;0.337516;, + 0.155781;0.337516;, + 0.139486;0.355087;, + 0.169423;0.337516;, + 0.139682;0.337516;, + 0.094962;0.337516;, + 0.139079;0.356255;, + 0.070832;0.337516;, + 0.037745;0.337516;, + 0.059451;0.337516;, + 0.034063;0.355263;, + 0.069376;0.337516;, + 0.070089;0.337516;, + 0.078341;0.360000;, + 0.140295;0.410202;, + 0.154671;0.410202;, + 0.169423;0.410202;, + 0.106374;0.410202;, + 0.066616;0.410202;, + 0.050267;0.412054;, + 0.108395;0.410202;, + 0.069646;0.449516;, + 0.052779;0.459751;, + 0.303759;0.398990;, + 0.301467;0.437159;, + 0.031124;0.452374;, + 0.027488;0.628182;, + 0.133164;0.444513;, + 0.267437;0.438220;, + 0.140673;0.410202;, + 0.138160;0.410202;, + 0.035715;0.406444;, + 0.983283;0.552269;, + 0.717768;0.549735;, + 0.665848;0.551563;, + 0.665848;0.603961;, + 0.665848;0.624999;, + 0.416895;0.485971;, + 0.465080;0.495146;, + 0.554443;0.490049;, + 0.596048;0.486003;, + 0.653986;0.485971;, + 0.648116;0.507207;, + 0.495199;0.500632;, + 0.453668;0.524293;, + 0.520895;0.500658;, + 0.647703;0.508662;, + 0.453966;0.523505;, + 0.644424;0.554503;, + 0.639118;0.604724;, + 0.427648;0.643446;, + 0.408566;0.643446;, + 0.645657;0.643446;, + 0.620138;0.643446;, + 0.510273;0.643446;, + 0.560244;0.643446;, + 0.664199;0.736052;, + 0.664199;0.796555;, + 0.531908;0.770624;, + 0.708835;0.738811;, + 0.532529;0.770158;, + 0.708835;0.799314;, + 0.971027;0.739715;, + 0.971027;0.800221;, + 0.967319;0.797731;, + 0.967319;0.737225;, + 0.859756;0.739928;, + 0.859756;0.800434;, + 0.848628;0.797539;, + 0.848628;0.737033;, + 0.768886;0.740271;, + 0.768886;0.800774;, + 0.716979;0.794925;, + 0.716979;0.734422;, + 0.682021;0.697485;, + 0.731679;0.697485;, + 0.781335;0.697485;, + 0.830993;0.697485;, + 0.880650;0.697485;, + 0.930304;0.697485;, + 0.979961;0.697485;, + 0.582708;0.669200;, + 0.582708;0.697485;, + 0.632365;0.697485;, + 0.582708;0.199240;, + 0.582708;0.474517;, + 0.582708;0.480018;, + 0.582708;0.663701;, + 0.731679;0.028928;, + 0.682021;0.028928;, + 0.781335;0.028928;, + 0.830993;0.028928;, + 0.880650;0.028928;, + 0.930304;0.028928;, + 0.979961;0.028928;, + 0.632365;0.028928;, + 0.582708;0.028928;, + 0.582708;0.038480;, + 0.582708;0.038480;, + 0.582708;0.199240;, + 0.525596;0.231189;, + 0.496696;0.202288;, + 0.450065;0.221604;, + 0.450065;0.262474;, + 0.393391;0.955706;, + 0.393391;0.912613;, + 0.438450;0.893948;, + 0.468922;0.924421;, + 0.556881;0.155657;, + 0.516012;0.155657;, + 0.457115;0.848889;, + 0.500207;0.848889;, + 0.525596;0.080125;, + 0.496696;0.109022;, + 0.438450;0.803826;, + 0.468922;0.773357;, + 0.450065;0.048836;, + 0.450065;0.089706;, + 0.393391;0.785161;, + 0.393391;0.742068;, + 0.374533;0.080125;, + 0.403431;0.109022;, + 0.348331;0.803826;, + 0.317859;0.773357;, + 0.343249;0.155657;, + 0.384118;0.155657;, + 0.329666;0.848889;, + 0.286574;0.848889;, + 0.374533;0.231189;, + 0.403431;0.202288;, + 0.348331;0.893948;, + 0.317859;0.924421;, + 0.519767;0.225363;, + 0.496696;0.202288;, + 0.450065;0.221604;, + 0.450065;0.254234;, + 0.393391;0.947466;, + 0.393391;0.912613;, + 0.438450;0.893948;, + 0.463096;0.918595;, + 0.548641;0.155657;, + 0.516012;0.155657;, + 0.457115;0.848889;, + 0.491967;0.848889;, + 0.519767;0.085951;, + 0.496696;0.109022;, + 0.438450;0.803826;, + 0.463096;0.779183;, + 0.450065;0.057076;, + 0.450065;0.089706;, + 0.393391;0.785161;, + 0.393391;0.750308;, + 0.380359;0.085951;, + 0.403431;0.109022;, + 0.348331;0.803826;, + 0.323688;0.779183;, + 0.351488;0.155657;, + 0.384118;0.155657;, + 0.329666;0.848889;, + 0.294813;0.848889;, + 0.380359;0.225363;, + 0.403431;0.202288;, + 0.348331;0.893948;, + 0.323688;0.918595;; + } + + VertexDuplicationIndices + { + 1479; + 979; + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978; + 79, + 68, + 93, + 94, + 127, + 138, + 139, + 142, + 141, + 140, + 144, + 143, + 145, + 146, + 148, + 147, + 149, + 150, + 150, + 153, + 53, + 154, + 163, + 52, + 151, + 49, + 48, + 52, + 55, + 95, + 79, + 78, + 80, + 81, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 271, + 282, + 283, + 286, + 285, + 288, + 284, + 287, + 289, + 290, + 292, + 291, + 293, + 294, + 294, + 209, + 296, + 295, + 303, + 210, + 151, + 164, + 205, + 206, + 210, + 211, + 246, + 231, + 232, + 233, + 174, + 184, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 336, + 339, + 340, + 341, + 342, + 345, + 346, + 347, + 340, + 350, + 351, + 361, + 367, + 375, + 374, + 386, + 392, + 399, + 402, + 406, + 407, + 404, + 408, + 420, + 425, + 426, + 426, + 423, + 417, + 404, + 440, + 439, + 444, + 443, + 445, + 454, + 460, + 429, + 428, + 459, + 459, + 430, + 431, + 433, + 453, + 458, + 464, + 466, + 467, + 472, + 469, + 471, + 470, + 483, + 487, + 480, + 499, + 500, + 502, + 503, + 476, + 477, + 481, + 482, + 504, + 506, + 508, + 507, + 505, + 510, + 509, + 511, + 512, + 513, + 514, + 521, + 522, + 520, + 528, + 522, + 527, + 525, + 523, + 530, + 532, + 519, + 524, + 516, + 515, + 538, + 518, + 529, + 536, + 542, + 543, + 558, + 566, + 402, + 401, + 407, + 410, + 413, + 415, + 590, + 588, + 591, + 592, + 593, + 431, + 589, + 598, + 544, + 543, + 546, + 548, + 546, + 607, + 550, + 552, + 554, + 556, + 556, + 612, + 615, + 620, + 613, + 614, + 615, + 613, + 621, + 616, + 617, + 616, + 624, + 618, + 619, + 618, + 626, + 620, + 620, + 628, + 538, + 539, + 540, + 535, + 532, + 531, + 537, + 526, + 528, + 518, + 540, + 527, + 517, + 523, + 515, + 538, + 540, + 532, + 406, + 399, + 406, + 633, + 639, + 637, + 638, + 639, + 640, + 644, + 638, + 641, + 643, + 642, + 650, + 649, + 656, + 662, + 469, + 470, + 478, + 470, + 473, + 479, + 675, + 676, + 674, + 673, + 683, + 691, + 689, + 703, + 704, + 678, + 681, + 710, + 708, + 711, + 709, + 712, + 714, + 715, + 713, + 717, + 716, + 718, + 724, + 725, + 726, + 726, + 732, + 729, + 730, + 727, + 734, + 723, + 735, + 728, + 719, + 742, + 720, + 721, + 740, + 733, + 746, + 745, + 761, + 437, + 440, + 444, + 447, + 450, + 788, + 790, + 791, + 792, + 789, + 745, + 748, + 750, + 750, + 752, + 798, + 754, + 756, + 758, + 760, + 760, + 803, + 806, + 811, + 805, + 804, + 804, + 806, + 812, + 807, + 807, + 808, + 815, + 809, + 809, + 810, + 817, + 811, + 811, + 819, + 742, + 743, + 744, + 739, + 735, + 736, + 741, + 732, + 731, + 744, + 721, + 730, + 722, + 727, + 720, + 742, + 744, + 735, + 443, + 439, + 443, + 824, + 830, + 829, + 828, + 831, + 830, + 829, + 835, + 832, + 834, + 833, + 841, + 840, + 847, + 853, + 675, + 674, + 674, + 682, + 677, + 684, + 883, + 860, + 859, + 889, + 874, + 873, + 891, + 876, + 875, + 892, + 890, + 877, + 878, + 893, + 895, + 879, + 881, + 896, + 898, + 897, + 905, + 908, + 911, + 914, + 917, + 918, + 917, + 920, + 935, + 936, + 951, + 952, + 902, + 904, + 907, + 910, + 913, + 916, + 919, + 922, + 919, + 961, + 975, + 976, + 963, + 956, + 955, + 964, + 965, + 924, + 923, + 966, + 967, + 957, + 927, + 968, + 969, + 958, + 929, + 970, + 971, + 959, + 931, + 972, + 973, + 960, + 933, + 974, + 975, + 961, + 935, + 976, + 977, + 962, + 937, + 978, + 939, + 926, + 925, + 940, + 941, + 901, + 900, + 942, + 943, + 928, + 906, + 944, + 945, + 930, + 909, + 946, + 947, + 932, + 912, + 948, + 949, + 934, + 915, + 950, + 951, + 936, + 918, + 952, + 953, + 938, + 921, + 954; + } + + MeshMaterialList + { + 3; + 1896; + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0; + + Material Material0 + { + 0.800000;0.800000;0.800000;1.000000;; + 0.000000; + 0.000000;0.000000;0.000000;; + 0.364706;0.364706;0.364706;; + + TextureFileName + { + "axe.jpg"; + } + } + + Material Material1 + { + 0.800000;0.800000;0.800000;1.000000;; + 0.000000; + 0.000000;0.000000;0.000000;; + 0.305882;0.305882;0.305882;; + + TextureFileName + { + "dwarf.jpg"; + } + } + + Material Material2 + { + 0.800000;0.800000;0.800000;1.000000;; + 0.000000; + 0.000000;0.000000;0.000000;; + 0.317647;0.317647;0.317647;; + + TextureFileName + { + "dwarf2.jpg"; + } + } + } + + XSkinMeshHeader + { + 1; + 3; + 40; + } + + SkinWeights + { + "middle"; + 19; + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 595, + 599, + 600, + 603, + 604, + 769, + 770, + 771, + 772, + 773, + 795, + 1159; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.184641,-30.206568,0.000000,1.000000;; + } + + SkinWeights + { + "lhip"; + 18; + 746, + 747, + 749, + 751, + 753, + 755, + 757, + 759, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 1286, + 1288; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 5.006365,-26.736708,0.000000,1.000000;; + } + + SkinWeights + { + "lknee"; + 85; + 735, + 736, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 748, + 750, + 752, + 754, + 756, + 758, + 760, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 1278, + 1281, + 1284, + 1287, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1338, + 1344, + 1345, + 1346; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 6.909735,-17.919210,0.000000,1.000000;; + } + + SkinWeights + { + "lankle"; + 30; + 708, + 709, + 710, + 711, + 712, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 728, + 729, + 1257, + 1258, + 1259, + 1260, + 1261, + 1265, + 1267, + 1273, + 1277, + 1279, + 1280, + 1282, + 1283, + 1339, + 1341, + 1343; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 8.467036,-5.045920,-3.507543,1.000000;; + } + + SkinWeights + { + "ltoe"; + 32; + 713, + 714, + 715, + 716, + 724, + 725, + 726, + 727, + 730, + 731, + 732, + 733, + 734, + 737, + 738, + 1262, + 1263, + 1264, + 1266, + 1268, + 1269, + 1270, + 1271, + 1272, + 1274, + 1275, + 1276, + 1285, + 1336, + 1337, + 1340, + 1342; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 8.550578,-2.208009,1.760649,1.000000;; + } + + SkinWeights + { + "rhip"; + 37; + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 1156, + 1157, + 1158, + 1174, + 1175, + 1176, + 1177, + 1178, + 1180, + 1181, + 1182, + 1183, + 1184; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -6.067782,-27.255383,0.000000,1.000000;; + } + + SkinWeights + { + "rknee"; + 66; + 531, + 532, + 535, + 536, + 537, + 538, + 539, + 540, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 1147, + 1152, + 1155, + 1179, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1214, + 1219, + 1220, + 1221; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -7.625084,-17.573425,0.000000,1.000000;; + } + + SkinWeights + { + "rankle"; + 30; + 504, + 505, + 506, + 507, + 508, + 512, + 514, + 515, + 516, + 517, + 518, + 519, + 524, + 525, + 1127, + 1128, + 1129, + 1130, + 1131, + 1135, + 1137, + 1144, + 1148, + 1149, + 1150, + 1151, + 1153, + 1213, + 1216, + 1218; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -8.663285,-4.527243,-3.507543,1.000000;; + } + + SkinWeights + { + "rtoe"; + 32; + 509, + 510, + 511, + 513, + 520, + 521, + 522, + 523, + 526, + 527, + 528, + 529, + 530, + 533, + 534, + 1132, + 1133, + 1134, + 1136, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1145, + 1146, + 1154, + 1211, + 1212, + 1215, + 1217; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -8.824361,-2.258848,1.547814,1.000000;; + } + + SkinWeights + { + "spine2"; + 82; + 401, + 402, + 407, + 410, + 413, + 415, + 431, + 437, + 440, + 444, + 447, + 450, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 596, + 597, + 598, + 601, + 602, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 1081, + 1083, + 1093, + 1095, + 1105, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.176384,-34.278362,0.000000,1.000000;; + } + + SkinWeights + { + "Joint76"; + 23; + 399, + 400, + 406, + 409, + 412, + 416, + 430, + 438, + 439, + 443, + 446, + 449, + 1080, + 1082, + 1094, + 1096, + 1104, + 1222, + 1223, + 1224, + 1347, + 1348, + 1349; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.135189,-45.764740,0.000000,1.000000;; + } + + SkinWeights + { + "spine1"; + 58; + 403, + 404, + 405, + 408, + 411, + 414, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 432, + 433, + 434, + 441, + 442, + 445, + 448, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1106, + 1107, + 1108; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.077645,-48.894562,0.000000,1.000000;; + } + + SkinWeights + { + "head"; + 372; + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 127, + 136, + 137, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 271, + 280, + 281, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 979, + 980, + 981, + 982, + 983, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -0.077645,-53.077965,0.000000,1.000000;; + } + + SkinWeights + { + "Joint36"; + 9; + 121, + 122, + 123, + 124, + 125, + 126, + 128, + 129, + 132; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -2.428693,-50.108727,5.128667,1.000000;; + } + + SkinWeights + { + "Joint39"; + 19; + 130, + 131, + 133, + 134, + 135, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 984, + 985, + 986, + 987, + 988, + 989, + 990; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -4.949857,-46.006042,7.908250,1.000000;; + } + + SkinWeights + { + "Joint40"; + 10; + 145, + 146, + 147, + 148, + 149, + 991, + 992, + 993, + 994, + 995; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -6.493002,-42.284798,8.792897,1.000000;; + } + + SkinWeights + { + "Joint41"; + 3; + 150, + 996, + 997; + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -7.350305,-39.127472,9.733334,1.000000;; + } + + SkinWeights + { + "Joint37"; + 6; + 267, + 268, + 269, + 270, + 272, + 277; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 2.766480,-49.947918,5.128667,1.000000;; + } + + SkinWeights + { + "Joint38"; + 20; + 273, + 274, + 275, + 276, + 278, + 279, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 5.080586,-45.749058,7.908250,1.000000;; + } + + SkinWeights + { + "Joint42"; + 10; + 289, + 290, + 291, + 292, + 293, + 1031, + 1032, + 1033, + 1034, + 1035; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 6.280811,-42.539360,8.793637,1.000000;; + } + + SkinWeights + { + "Joint43"; + 3; + 294, + 1036, + 1037; + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 7.566765,-38.843330,9.733334,1.000000;; + } + + SkinWeights + { + "pad2"; + 24; + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 0.986286,-0.159424,0.042717,0.000000, + 0.165048,0.952679,-0.255270,0.000000, + 0.000000,0.258819,0.965926,0.000000, + -2.513408,-50.807816,13.613914,1.000000;; + } + + SkinWeights + { + "pad1"; + 24; + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -5.311174,-52.424309,0.000000,1.000000;; + } + + SkinWeights + { + "lsholda"; + 13; + 774, + 775, + 776, + 777, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 1350; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 10.633429,-47.162376,-3.529744,1.000000;; + } + + SkinWeights + { + "lelbo"; + 62; + 674, + 675, + 677, + 682, + 683, + 684, + 691, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 1246, + 1248, + 1250, + 1251, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 17.175339,-42.063858,-4.235693,1.000000;; + } + + SkinWeights + { + "lwrist"; + 2; + 669, + 670; + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 25.025633,-35.658024,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint17"; + 8; + 668, + 671, + 672, + 673, + 676, + 692, + 1247, + 1249; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 28.689102,-31.997549,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint18"; + 8; + 702, + 703, + 704, + 705, + 706, + 707, + 1253, + 1254; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 29.735809,-29.905848,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint19"; + 8; + 678, + 679, + 680, + 681, + 685, + 686, + 1255, + 1256; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 29.866648,-26.768299,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint20"; + 10; + 687, + 688, + 689, + 690, + 693, + 694, + 699, + 700, + 701, + 1252; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 25.287310,-31.343891,-0.753762,1.000000;; + } + + SkinWeights + { + "Joint21"; + 4; + 695, + 696, + 697, + 698; + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + 26.334013,-28.859997,-0.753762,1.000000;; + } + + SkinWeights + { + "rsholda"; + 15; + 435, + 436, + 572, + 573, + 574, + 575, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 1225; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -10.064111,-47.456520,-3.529744,1.000000;; + } + + SkinWeights + { + "relbo"; + 62; + 469, + 470, + 473, + 478, + 479, + 480, + 487, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 1113, + 1115, + 1117, + 1118, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -16.867699,-42.096539,-4.235693,1.000000;; + } + + SkinWeights + { + "rwrist"; + 3; + 464, + 465, + 1109; + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -25.241344,-35.298512,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint25"; + 10; + 466, + 467, + 468, + 471, + 472, + 488, + 1110, + 1111, + 1112, + 1114; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -28.904814,-32.160961,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint26"; + 10; + 498, + 499, + 500, + 501, + 502, + 503, + 1119, + 1120, + 1121, + 1122; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -29.951521,-29.807800,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint27"; + 10; + 474, + 475, + 476, + 477, + 481, + 482, + 1123, + 1124, + 1125, + 1126; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -29.689844,-26.931713,-4.235693,1.000000;; + } + + SkinWeights + { + "Joint28"; + 7; + 483, + 484, + 485, + 486, + 489, + 490, + 1116; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -24.456314,-31.115110,-2.201373,1.000000;; + } + + SkinWeights + { + "Joint29"; + 7; + 491, + 492, + 493, + 494, + 495, + 496, + 497; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -24.717991,-28.631216,-2.201373,1.000000;; + } + + SkinWeights + { + "weapon"; + 228; + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1441, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 1.000000,0.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000, + -26.942242,-30.461456,-4.235693,1.000000;; + } + } + } +} + +AnimationSet AnimationSet0 +{ + Animation baseAnimation + { + {base} + + AnimationKey + { + 2; + 23; + 0;3;0.011608,-0.015192,0.000000;;, + 1;3;0.011608,-0.015192,0.000000;;, + 2;3;0.011608,-0.015192,0.000000;;, + 3;3;0.011608,-0.015192,0.000000;;, + 4;3;0.011608,-0.015192,0.000000;;, + 5;3;0.011608,-0.015192,0.000000;;, + 12;3;0.011608,-0.015192,0.000000;;, + 14;3;0.011608,-0.015192,0.000000;;, + 15;3;0.011608,-0.015192,0.000000;;, + 16;3;0.011608,-0.015192,0.000000;;, + 17;3;0.011608,-0.015192,0.000000;;, + 18;3;0.011608,-0.015192,0.000000;;, + 19;3;0.011608,-0.015192,0.000000;;, + 20;3;0.011608,-0.015192,0.000000;;, + 27;3;0.011608,-0.015192,0.000000;;, + 33;3;0.011608,-0.015192,0.000000;;, + 34;3;0.011608,-0.015192,0.000000;;, + 35;3;0.011608,-0.015192,0.000000;;, + 41;3;0.011608,-0.015192,0.000000;;, + 43;3;0.011608,-0.015192,0.000000;;, + 50;3;0.011608,-0.015192,0.000000;;, + 53;3;0.011608,-0.015192,0.000000;;, + 55;3;0.011608,-0.015192,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation middleAnimation + { + {middle} + + AnimationKey + { + 2; + 25; + 0;3;0.173034,30.221760,0.000000;;, + 1;3;0.173034,30.221760,0.000000;;, + 2;3;0.173034,27.773420,0.372200;;, + 3;3;0.173034,24.919014,0.806130;;, + 4;3;0.173034,22.482626,1.176512;;, + 5;3;0.173034,22.482626,1.176512;;, + 12;3;0.173034,22.482626,1.176512;;, + 14;3;0.173034,22.482626,1.176512;;, + 15;3;0.173034,22.482626,1.176512;;, + 16;3;0.173034,24.272297,0.904444;;, + 17;3;0.173034,26.344128,0.589482;;, + 18;3;0.173034,28.455601,0.268494;;, + 19;3;0.173034,30.221760,0.000000;;, + 20;3;0.173034,30.221760,0.000000;;, + 24;3;0.173034,29.353209,0.000000;;, + 27;3;0.173034,29.520485,0.000000;;, + 33;3;0.173034,30.221760,0.000000;;, + 34;3;0.173034,30.221760,0.000000;;, + 35;3;0.173034,30.221760,0.000000;;, + 41;3;0.173034,28.753119,0.000000;;, + 43;3;0.173034,28.285614,0.000000;;, + 45;3;0.173034,28.050383,0.000000;;, + 50;3;0.173034,28.889324,0.000000;;, + 53;3;0.173034,29.697077,0.000000;;, + 55;3;0.173034,30.221760,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 25; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 24;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 45;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation lhipAnimation + { + {lhip} + + AnimationKey + { + 2; + 23; + 0;3;-5.191007,-3.469861,0.000000;;, + 1;3;-5.191007,-3.469861,0.000000;;, + 2;3;-5.191007,-3.469861,0.000000;;, + 3;3;-5.191007,-3.469861,0.000000;;, + 4;3;-5.191007,-3.469861,0.000000;;, + 5;3;-5.191007,-3.469861,0.000000;;, + 12;3;-5.191007,-3.469861,0.000000;;, + 14;3;-5.191007,-3.469861,0.000000;;, + 15;3;-5.191007,-3.469861,0.000000;;, + 16;3;-5.191007,-3.469861,0.000000;;, + 17;3;-5.191007,-3.469861,0.000000;;, + 18;3;-5.191007,-3.469861,0.000000;;, + 19;3;-5.191007,-3.469861,0.000000;;, + 20;3;-5.191007,-3.469861,0.000000;;, + 27;3;-5.191007,-3.469861,0.000000;;, + 33;3;-5.191007,-3.469861,0.000000;;, + 34;3;-5.191007,-3.469861,0.000000;;, + 35;3;-5.191007,-3.469861,0.000000;;, + 41;3;-5.191007,-3.469861,0.000000;;, + 43;3;-5.191007,-3.469861,0.000000;;, + 50;3;-5.191007,-3.469861,0.000000;;, + 53;3;-5.191007,-3.469861,0.000000;;, + 55;3;-5.191007,-3.469861,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;0.933591,-0.357025,0.029033,0.009857;;, + 3;4;0.833984,-0.551409,0.020009,0.004259;;, + 4;4;0.751840,-0.659346,0.000000,0.000000;;, + 5;4;0.751840,-0.659346,0.000000,0.000000;;, + 12;4;0.751840,-0.659346,0.000000,0.000000;;, + 14;4;0.751840,-0.659346,0.000000,0.000000;;, + 15;4;0.751840,-0.659346,0.000000,0.000000;;, + 16;4;0.815325,-0.578790,0.015233,0.003854;;, + 17;4;0.880134,-0.473717,0.030180,0.006729;;, + 18;4;0.961855,-0.272346,0.024861,0.006633;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation lkneeAnimation + { + {lknee} + + AnimationKey + { + 2; + 25; + 0;3;-1.903369,-8.817497,0.000000;;, + 1;3;-1.903369,-8.817497,0.000000;;, + 2;3;-1.903369,-8.817497,0.000000;;, + 3;3;-1.903369,-8.817497,0.000000;;, + 4;3;-1.903369,-8.817497,0.000000;;, + 5;3;-1.903369,-8.817497,0.000000;;, + 12;3;-1.903369,-8.817497,0.000000;;, + 14;3;-1.903369,-8.817497,0.000000;;, + 15;3;-1.903369,-8.817497,0.000000;;, + 16;3;-1.903369,-8.817497,0.000000;;, + 17;3;-1.903369,-8.817497,0.000000;;, + 18;3;-1.903369,-8.817497,0.000000;;, + 19;3;-1.903369,-8.817497,0.000000;;, + 20;3;-1.903369,-8.817497,0.000000;;, + 24;3;-1.903369,-8.527980,0.000000;;, + 27;3;-1.903369,-8.583739,0.000000;;, + 33;3;-1.903369,-8.817497,0.000000;;, + 34;3;-1.903369,-8.817497,0.000000;;, + 35;3;-1.903369,-8.817497,0.000000;;, + 41;3;-1.903369,-8.034223,0.000000;;, + 43;3;-1.903369,-7.784886,0.000000;;, + 45;3;-1.903369,-7.659429,0.000000;;, + 50;3;-1.903369,-8.106865,0.000000;;, + 53;3;-1.903369,-8.537666,0.000000;;, + 55;3;-1.903369,-8.817497,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 25; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;0.936175,0.350946,-0.020210,-0.002106;;, + 3;4;0.832879,0.553271,-0.014218,0.001102;;, + 4;4;0.754710,0.656059,0.000000,0.000000;;, + 5;4;0.754710,0.656059,0.000000,0.000000;;, + 12;4;0.754709,0.656059,0.000000,0.000000;;, + 14;4;0.754710,0.656059,0.000000,0.000000;;, + 15;4;0.754710,0.656059,0.000000,0.000000;;, + 16;4;0.817547,0.575786,-0.009196,0.001689;;, + 17;4;0.867357,0.497283,-0.018216,0.008324;;, + 18;4;0.954530,0.297619,-0.015169,0.008102;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 24;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 45;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation lankleAnimation + { + {lankle} + + AnimationKey + { + 2; + 25; + 0;3;-1.557302,-12.873290,3.507543;;, + 1;3;-1.557302,-12.873290,3.507543;;, + 2;3;-1.557302,-12.873290,3.507543;;, + 3;3;-1.557302,-12.873290,3.507543;;, + 4;3;-1.557302,-12.873290,3.507543;;, + 5;3;-1.557302,-12.873290,3.507543;;, + 12;3;-1.557302,-12.873290,3.507543;;, + 14;3;-1.557302,-12.873290,3.507543;;, + 15;3;-1.557302,-12.873290,3.507543;;, + 16;3;-1.557302,-12.873290,3.507543;;, + 17;3;-1.557302,-12.873290,3.507543;;, + 18;3;-1.557302,-12.873290,3.507543;;, + 19;3;-1.557302,-12.873290,3.507543;;, + 20;3;-1.557302,-12.873290,3.507543;;, + 24;3;-1.557302,-12.294256,3.507543;;, + 27;3;-1.557302,-12.405774,3.507543;;, + 33;3;-1.557302,-12.873290,3.507543;;, + 34;3;-1.557302,-12.873290,3.507543;;, + 35;3;-1.557302,-12.873290,3.507543;;, + 41;3;-1.557302,-12.187924,3.507543;;, + 43;3;-1.557302,-11.969755,3.507543;;, + 45;3;-1.557302,-11.859981,3.507543;;, + 50;3;-1.557302,-12.251487,3.507543;;, + 53;3;-1.557302,-12.628438,3.507543;;, + 55;3;-1.557302,-12.873290,3.507543;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 25; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;0.999476,-0.032322,0.001562,-0.000284;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 24;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 45;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation ltoeAnimation + { + {ltoe} + + AnimationKey + { + 2; + 23; + 0;3;-0.083542,-2.837912,-5.268192;;, + 1;3;-0.083542,-2.837912,-5.268192;;, + 2;3;-0.083542,-2.837912,-5.268192;;, + 3;3;-0.083542,-2.837912,-5.268192;;, + 4;3;-0.083542,-2.837912,-5.268192;;, + 5;3;-0.083542,-2.837912,-5.268192;;, + 12;3;-0.083542,-2.837912,-5.268192;;, + 14;3;-0.083542,-2.837912,-5.268192;;, + 15;3;-0.083542,-2.837912,-5.268192;;, + 16;3;-0.083542,-2.837912,-5.268192;;, + 17;3;-0.083542,-2.837912,-5.268192;;, + 18;3;-0.083542,-2.837912,-5.268192;;, + 19;3;-0.083542,-2.837912,-5.268192;;, + 20;3;-0.083542,-2.837912,-5.268192;;, + 27;3;-0.083542,-2.837912,-5.268192;;, + 33;3;-0.083542,-2.837912,-5.268192;;, + 34;3;-0.083542,-2.837912,-5.268192;;, + 35;3;-0.083542,-2.837912,-5.268192;;, + 41;3;-0.083542,-2.837912,-5.268192;;, + 43;3;-0.083542,-2.837912,-5.268192;;, + 50;3;-0.083542,-2.837912,-5.268192;;, + 53;3;-0.083542,-2.837912,-5.268192;;, + 55;3;-0.083542,-2.837912,-5.268192;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation rhipAnimation + { + {rhip} + + AnimationKey + { + 2; + 23; + 0;3;5.883141,-2.951185,0.000000;;, + 1;3;5.883141,-2.951185,0.000000;;, + 2;3;5.883141,-2.951185,0.000000;;, + 3;3;5.883141,-2.951185,0.000000;;, + 4;3;5.883141,-2.951185,0.000000;;, + 5;3;5.883141,-2.951185,0.000000;;, + 12;3;5.883141,-2.951185,0.000000;;, + 14;3;5.883141,-2.951185,0.000000;;, + 15;3;5.883141,-2.951185,0.000000;;, + 16;3;5.883141,-2.951185,0.000000;;, + 17;3;5.883141,-2.951185,0.000000;;, + 18;3;5.883141,-2.951185,0.000000;;, + 19;3;5.883141,-2.951185,0.000000;;, + 20;3;5.883141,-2.951185,0.000000;;, + 27;3;5.883141,-2.951185,0.000000;;, + 33;3;5.883141,-2.951185,0.000000;;, + 34;3;5.883141,-2.951185,0.000000;;, + 35;3;5.883141,-2.951185,0.000000;;, + 41;3;5.883141,-2.951185,0.000000;;, + 43;3;5.883141,-2.951185,0.000000;;, + 50;3;5.883141,-2.951185,0.000000;;, + 53;3;5.883141,-2.951185,0.000000;;, + 55;3;5.883141,-2.951185,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;0.997921,0.064448,0.000411,-0.000559;;, + 3;4;0.990580,0.136931,0.000703,-0.000957;;, + 4;4;0.982450,0.186524,0.000000,0.000000;;, + 5;4;0.982450,0.186524,0.000000,0.000000;;, + 12;4;0.982450,0.186524,0.000000,0.000000;;, + 14;4;0.982450,0.186524,0.000000,0.000000;;, + 15;4;0.982450,0.186524,0.000000,0.000000;;, + 16;4;0.988892,0.148634,-0.000027,-0.001179;;, + 17;4;0.995206,0.097793,-0.000021,-0.000940;;, + 18;4;0.999001,0.044690,-0.000010,-0.000451;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation rkneeAnimation + { + {rknee} + + AnimationKey + { + 2; + 25; + 0;3;1.557302,-9.681957,0.000000;;, + 1;3;1.557302,-9.681957,0.000000;;, + 2;3;1.557302,-9.681957,0.000000;;, + 3;3;1.557302,-9.681957,0.000000;;, + 4;3;1.557302,-9.681957,0.000000;;, + 5;3;1.557302,-9.681957,0.000000;;, + 12;3;1.557302,-9.681957,0.000000;;, + 14;3;1.557302,-9.681957,0.000000;;, + 15;3;1.557302,-9.681957,0.000000;;, + 16;3;1.557302,-9.681957,0.000000;;, + 17;3;1.557302,-9.681957,0.000000;;, + 18;3;1.557302,-9.681957,0.000000;;, + 19;3;1.557302,-9.681957,0.000000;;, + 20;3;1.557302,-9.681957,0.000000;;, + 24;3;1.557302,-9.392440,0.000000;;, + 27;3;1.557302,-9.448199,0.000000;;, + 33;3;1.557302,-9.681957,0.000000;;, + 34;3;1.557302,-9.681957,0.000000;;, + 35;3;1.557302,-9.681957,0.000000;;, + 41;3;1.557302,-8.898683,0.000000;;, + 43;3;1.557302,-8.649346,0.000000;;, + 45;3;1.557302,-8.523890,0.000000;;, + 50;3;1.557302,-8.971325,0.000000;;, + 53;3;1.557302,-9.402126,0.000000;;, + 55;3;1.557302,-9.681957,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 25; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;0.963221,0.268544,0.008625,-0.003828;;, + 3;4;0.881291,0.472453,0.010177,-0.003199;;, + 4;4;0.859406,0.511293,0.000000,0.000000;;, + 5;4;0.859406,0.511293,0.000000,0.000000;;, + 12;4;0.859406,0.511293,0.000000,0.000000;;, + 14;4;0.859406,0.511293,0.000000,0.000000;;, + 15;4;0.859406,0.511293,0.000000,0.000000;;, + 16;4;0.882421,0.470414,0.005475,-0.003796;;, + 17;4;0.936363,0.350938,0.006628,-0.004836;;, + 18;4;0.982689,0.185165,0.005005,-0.003385;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 24;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 45;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation rankleAnimation + { + {rankle} + + AnimationKey + { + 2; + 25; + 0;3;1.038201,-13.046183,3.507543;;, + 1;3;1.038201,-13.046183,3.507543;;, + 2;3;1.038201,-13.046183,3.507543;;, + 3;3;1.038201,-13.046183,3.507543;;, + 4;3;1.038201,-13.046183,3.507543;;, + 5;3;1.038201,-13.046183,3.507543;;, + 12;3;1.038201,-13.046183,3.507543;;, + 14;3;1.038201,-13.046183,3.507543;;, + 15;3;1.038201,-13.046183,3.507543;;, + 16;3;1.038201,-13.046183,3.507543;;, + 17;3;1.038201,-13.046183,3.507543;;, + 18;3;1.038201,-13.046183,3.507543;;, + 19;3;1.038201,-13.046183,3.507543;;, + 20;3;1.038201,-13.046183,3.507543;;, + 24;3;1.038201,-12.467149,3.507543;;, + 27;3;1.038201,-12.578667,3.507543;;, + 33;3;1.038201,-13.046183,3.507543;;, + 34;3;1.038201,-13.046183,3.507543;;, + 35;3;1.038201,-13.046183,3.507543;;, + 41;3;1.038201,-12.360817,3.507543;;, + 43;3;1.038201,-12.142648,3.507543;;, + 45;3;1.038201,-12.032873,3.507543;;, + 50;3;1.038201,-12.424379,3.507543;;, + 53;3;1.038201,-12.801331,3.507543;;, + 55;3;1.038201,-13.046183,3.507543;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 25; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;0.978731,-0.205059,-0.003273,-0.005028;;, + 3;4;0.979297,-0.202354,-0.000456,-0.005571;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;0.981401,-0.191782,-0.008166,-0.002302;;, + 17;4;0.967608,-0.252304,-0.007780,-0.004084;;, + 18;4;0.984134,-0.177321,-0.005444,-0.002966;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 24;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 45;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation rtoeAnimation + { + {rtoe} + + AnimationKey + { + 2; + 23; + 0;3;0.161076,-2.268395,-5.055357;;, + 1;3;0.161076,-2.268395,-5.055357;;, + 2;3;0.161076,-2.268395,-5.055357;;, + 3;3;0.161076,-2.268395,-5.055357;;, + 4;3;0.161076,-2.268395,-5.055357;;, + 5;3;0.161076,-2.268395,-5.055357;;, + 12;3;0.161076,-2.268395,-5.055357;;, + 14;3;0.161076,-2.268395,-5.055357;;, + 15;3;0.161076,-2.268395,-5.055357;;, + 16;3;0.161076,-2.268395,-5.055357;;, + 17;3;0.161076,-2.268395,-5.055357;;, + 18;3;0.161076,-2.268395,-5.055357;;, + 19;3;0.161076,-2.268395,-5.055357;;, + 20;3;0.161076,-2.268395,-5.055357;;, + 27;3;0.161076,-2.268395,-5.055357;;, + 33;3;0.161076,-2.268395,-5.055357;;, + 34;3;0.161076,-2.268395,-5.055357;;, + 35;3;0.161076,-2.268395,-5.055357;;, + 41;3;0.161076,-2.268395,-5.055357;;, + 43;3;0.161076,-2.268395,-5.055357;;, + 50;3;0.161076,-2.268395,-5.055357;;, + 53;3;0.161076,-2.268395,-5.055357;;, + 55;3;0.161076,-2.268395,-5.055357;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation spine2Animation + { + {spine2} + + AnimationKey + { + 2; + 23; + 0;3;-0.008257,4.071795,0.000000;;, + 1;3;-0.008257,4.071795,0.000000;;, + 2;3;-0.008257,4.071795,0.000000;;, + 3;3;-0.008257,4.071795,0.000000;;, + 4;3;-0.008257,4.071795,0.000000;;, + 5;3;-0.008257,4.071795,0.000000;;, + 12;3;-0.008257,4.071795,0.000000;;, + 14;3;-0.008257,4.071795,0.000000;;, + 15;3;-0.008257,4.071795,0.000000;;, + 16;3;-0.008257,4.071795,0.000000;;, + 17;3;-0.008257,4.071795,0.000000;;, + 18;3;-0.008257,4.071795,0.000000;;, + 19;3;-0.008257,4.071795,0.000000;;, + 20;3;-0.008257,4.071795,0.000000;;, + 27;3;-0.008257,4.071795,0.000000;;, + 33;3;-0.008257,4.071795,0.000000;;, + 34;3;-0.008257,4.071795,0.000000;;, + 35;3;-0.008257,4.071795,0.000000;;, + 41;3;-0.008257,4.071795,0.000000;;, + 43;3;-0.008257,4.071795,0.000000;;, + 50;3;-0.008257,4.071795,0.000000;;, + 53;3;-0.008257,4.071795,0.000000;;, + 55;3;-0.008257,4.071795,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.999391,0.000000,0.034899,0.000000;;, + 43;4;0.999406,0.000000,0.034456,0.000000;;, + 50;4;0.999888,0.000000,0.014985,0.000000;;, + 53;4;0.999982,0.000000,0.005995,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint75Animation + { + {Joint75} + + AnimationKey + { + 2; + 23; + 0;3;-0.007980,5.843795,0.000000;;, + 1;3;-0.007980,5.843795,0.000000;;, + 2;3;-0.007980,5.625298,-0.076575;;, + 3;3;-0.007980,5.370562,-0.165850;;, + 4;3;-0.007980,5.153131,-0.242051;;, + 5;3;-0.007980,5.153131,-0.242051;;, + 12;3;-0.007980,5.153131,-0.242051;;, + 14;3;-0.007980,5.153131,-0.242051;;, + 15;3;-0.007980,5.153131,-0.242051;;, + 16;3;-0.007980,5.312847,-0.186077;;, + 17;3;-0.007980,5.497743,-0.121278;;, + 18;3;-0.007980,5.686178,-0.055239;;, + 19;3;-0.007980,5.843795,0.000000;;, + 20;3;-0.007980,5.843795,0.000000;;, + 27;3;-0.007980,5.843795,0.000000;;, + 33;3;-0.007980,5.843795,0.000000;;, + 34;3;-0.007980,5.843795,0.000000;;, + 35;3;-0.007980,5.843795,0.000000;;, + 41;3;-0.007980,5.843795,0.000000;;, + 43;3;-0.007980,5.975956,-0.018574;;, + 50;3;-0.007980,6.482687,-0.089789;;, + 53;3;-0.007980,6.140066,-0.041637;;, + 55;3;-0.007980,5.843795,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.997564,0.069757,0.000000,0.000000;;, + 1;4;0.997564,0.069757,0.000000,0.000000;;, + 2;4;0.997564,0.069755,0.000000,0.000000;;, + 3;4;0.997564,0.069755,0.000000,0.000000;;, + 4;4;0.997564,0.069757,0.000000,0.000000;;, + 5;4;0.997564,0.069757,0.000000,0.000000;;, + 12;4;0.997564,0.069755,0.000000,0.000000;;, + 14;4;0.997564,0.069757,0.000000,0.000000;;, + 15;4;0.997564,0.069757,0.000000,0.000000;;, + 16;4;0.997564,0.069755,0.000000,0.000000;;, + 17;4;0.997564,0.069755,0.000000,0.000000;;, + 18;4;0.997564,0.069755,0.000000,0.000000;;, + 19;4;0.997564,0.069757,0.000000,0.000000;;, + 20;4;0.997564,0.069757,0.000000,0.000000;;, + 27;4;0.990866,0.134849,0.000000,0.000000;;, + 33;4;0.997564,0.069757,0.000000,0.000000;;, + 34;4;0.997564,0.069757,0.000000,0.000000;;, + 35;4;0.997564,0.069757,0.000000,0.000000;;, + 41;4;0.993768,0.069490,0.086944,-0.006080;;, + 43;4;0.995824,0.069634,0.058902,-0.004119;;, + 50;4;0.993213,0.069451,-0.093073,0.006508;;, + 53;4;0.996487,0.069680,-0.046335,0.003240;;, + 55;4;0.997564,0.069757,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint76Animation + { + {Joint76} + + AnimationKey + { + 2; + 23; + 0;3;-0.033215,5.642583,0.000000;;, + 1;3;-0.033215,5.642583,0.000000;;, + 2;3;-0.033215,5.390897,-0.199987;;, + 3;3;-0.033215,5.097469,-0.433143;;, + 4;3;-0.033215,4.847012,-0.632154;;, + 5;3;-0.033215,4.847012,-0.632154;;, + 12;3;-0.033215,4.847012,-0.632154;;, + 14;3;-0.033215,4.847012,-0.632154;;, + 15;3;-0.033215,4.847012,-0.632154;;, + 16;3;-0.033215,5.030987,-0.485969;;, + 17;3;-0.033215,5.243968,-0.316736;;, + 18;3;-0.033215,5.461024,-0.144265;;, + 19;3;-0.033215,5.642583,0.000000;;, + 20;3;-0.033215,5.642583,0.000000;;, + 27;3;-0.033215,5.642583,0.000000;;, + 33;3;-0.033215,5.642583,0.000000;;, + 34;3;-0.033215,5.642583,0.000000;;, + 35;3;-0.033215,5.642583,0.000000;;, + 41;3;-0.033215,5.642583,0.000000;;, + 43;3;-0.033215,5.642583,0.000000;;, + 50;3;-0.033215,5.642583,0.000000;;, + 53;3;-0.033215,5.642583,0.000000;;, + 55;3;-0.033215,5.642583,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.999391,0.034899,0.000000,0.000000;;, + 1;4;0.999391,0.034899,0.000000,0.000000;;, + 2;4;0.999391,0.034899,0.000000,0.000000;;, + 3;4;0.999391,0.034899,0.000000,0.000000;;, + 4;4;0.999391,0.034899,0.000000,0.000000;;, + 5;4;0.999391,0.034899,0.000000,0.000000;;, + 12;4;0.999381,0.034899,0.004361,-0.000152;;, + 14;4;0.999391,0.034899,0.000000,0.000000;;, + 15;4;0.999391,0.034899,0.000000,0.000000;;, + 16;4;0.999391,0.034899,0.000000,0.000000;;, + 17;4;0.999391,0.034899,0.000000,0.000000;;, + 18;4;0.999391,0.034899,0.000000,0.000000;;, + 19;4;0.999391,0.034899,0.000000,0.000000;;, + 20;4;0.999391,0.034899,0.000000,0.000000;;, + 27;4;0.999391,0.034899,0.000000,0.000000;;, + 33;4;0.999391,0.034899,0.000000,0.000000;;, + 34;4;0.999391,0.034899,0.000000,0.000000;;, + 35;4;0.999391,0.034899,0.000000,0.000000;;, + 41;4;0.996956,0.034814,0.069714,-0.002434;;, + 43;4;0.998051,0.034853,0.051723,-0.001806;;, + 50;4;0.997991,0.034850,-0.052875,0.001846;;, + 53;4;0.999025,0.034886,-0.027035,0.000944;;, + 55;4;0.999391,0.034899,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation spine1Animation + { + {spine1} + + AnimationKey + { + 2; + 23; + 0;3;-0.057544,3.129822,0.000000;;, + 1;3;-0.057544,3.129822,0.000000;;, + 2;3;-0.057544,3.129822,0.000000;;, + 3;3;-0.057544,3.129822,0.000000;;, + 4;3;-0.057544,3.129822,0.000000;;, + 5;3;-0.057544,3.129822,0.000000;;, + 12;3;-0.057544,3.129822,0.000000;;, + 14;3;-0.057544,3.129822,0.000000;;, + 15;3;-0.057544,3.129822,0.000000;;, + 16;3;-0.057544,3.129822,0.000000;;, + 17;3;-0.057544,3.129822,0.000000;;, + 18;3;-0.057544,3.129822,0.000000;;, + 19;3;-0.057544,3.129822,0.000000;;, + 20;3;-0.057544,3.129822,0.000000;;, + 27;3;-0.057544,3.129822,0.000000;;, + 33;3;-0.057544,3.129822,0.000000;;, + 34;3;-0.057544,3.129822,0.000000;;, + 35;3;-0.057544,3.129822,0.000000;;, + 41;3;-0.057544,3.129822,0.000000;;, + 43;3;-0.057544,3.129822,0.000000;;, + 50;3;-0.057544,3.129822,0.000000;;, + 53;3;-0.057544,3.129822,0.000000;;, + 55;3;-0.057544,3.129822,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;0.999229,0.039260,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.999229,0.000000,0.039260,0.000000;;, + 43;4;0.999248,0.000000,0.038762,0.000000;;, + 50;4;0.999858,0.000000,0.016858,0.000000;;, + 53;4;0.999977,0.000000,0.006743,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation headAnimation + { + {head} + + AnimationKey + { + 2; + 27; + 0;3;0.000000,4.183402,0.000000;;, + 1;3;0.000000,4.183402,0.000000;;, + 2;3;0.000000,4.191365,-0.387104;;, + 3;3;0.000000,4.200649,-0.838410;;, + 4;3;0.000000,4.208574,-1.223624;;, + 5;3;0.000000,4.208574,-1.223624;;, + 7;3;0.000000,4.208574,-1.223624;;, + 12;3;0.000000,4.208574,-1.223624;;, + 14;3;0.000000,4.208574,-1.223624;;, + 15;3;0.000000,4.208574,-1.223624;;, + 16;3;0.000000,4.202753,-0.940661;;, + 17;3;0.000000,4.196014,-0.613087;;, + 18;3;0.000000,4.189146,-0.279245;;, + 19;3;0.000000,4.183402,0.000000;;, + 20;3;0.000000,4.183402,0.000000;;, + 23;3;0.000000,4.183402,0.000000;;, + 27;3;0.000000,4.183402,0.000000;;, + 29;3;0.000000,4.183402,0.000000;;, + 33;3;0.000000,4.183402,0.000000;;, + 34;3;0.000000,4.183402,0.000000;;, + 35;3;0.000000,4.183402,0.000000;;, + 41;3;0.000000,4.183402,0.000000;;, + 43;3;0.000000,4.183402,0.000000;;, + 45;3;0.000000,4.183402,0.000000;;, + 50;3;0.000000,4.183402,0.000000;;, + 53;3;0.000000,4.183402,0.000000;;, + 55;3;0.000000,4.183402,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 27; + 0;4;0.998392,-0.056693,0.000000,0.000000;;, + 1;4;0.998392,-0.056693,0.000000,0.000000;;, + 2;4;0.998178,-0.056679,0.001174,-0.020671;;, + 3;4;0.997388,-0.056635,0.002542,-0.044758;;, + 4;4;0.996254,-0.056570,0.003708,-0.065298;;, + 5;4;0.996254,-0.056570,0.003708,-0.065298;;, + 7;4;0.995518,-0.058815,0.038474,-0.063284;;, + 12;4;0.996114,-0.057445,0.017139,-0.064530;;, + 14;4;0.996254,-0.056570,0.003708,-0.065298;;, + 15;4;0.996254,-0.056570,0.003708,-0.065298;;, + 16;4;0.997128,-0.056620,0.002851,-0.050213;;, + 17;4;0.997855,-0.056661,0.001859,-0.032735;;, + 18;4;0.998280,-0.056685,0.000847,-0.014912;;, + 19;4;0.998392,-0.056693,0.000000,0.000000;;, + 20;4;0.998392,-0.056693,0.000000,0.000000;;, + 23;4;0.993540,-0.095666,0.060767,0.005851;;, + 27;4;0.992410,-0.122909,0.003406,-0.001945;;, + 29;4;0.992114,-0.123201,-0.022487,-0.005039;;, + 33;4;0.998392,-0.056693,0.000000,0.000000;;, + 34;4;0.998392,-0.056693,0.000000,0.000000;;, + 35;4;0.998392,-0.056693,0.000000,0.000000;;, + 41;4;0.994963,-0.056497,0.082675,0.004695;;, + 43;4;0.996303,-0.056573,0.064552,0.003665;;, + 45;4;0.985311,-0.055949,-0.161087,-0.009147;;, + 50;4;0.997274,-0.056628,-0.047219,-0.002681;;, + 53;4;0.994336,-0.056461,0.089900,0.005105;;, + 55;4;0.998392,-0.056693,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint36Animation + { + {Joint36} + + AnimationKey + { + 2; + 23; + 0;3;2.351048,-2.969238,-5.128667;;, + 1;3;2.351048,-2.969238,-5.128667;;, + 2;3;2.351048,-2.969238,-5.128667;;, + 3;3;2.351048,-2.969238,-5.128667;;, + 4;3;2.351048,-2.969238,-5.128667;;, + 5;3;2.351048,-2.969238,-5.128667;;, + 12;3;2.351048,-2.969238,-5.128667;;, + 14;3;2.351048,-2.969238,-5.128667;;, + 15;3;2.351048,-2.969238,-5.128667;;, + 16;3;2.351048,-2.969238,-5.128667;;, + 17;3;2.351048,-2.969238,-5.128667;;, + 18;3;2.351048,-2.969238,-5.128667;;, + 19;3;2.351048,-2.969238,-5.128667;;, + 20;3;2.351048,-2.969238,-5.128667;;, + 27;3;2.351048,-2.969238,-5.128667;;, + 33;3;2.351048,-2.969238,-5.128667;;, + 34;3;2.351048,-2.969238,-5.128667;;, + 35;3;2.351048,-2.969238,-5.128667;;, + 41;3;2.351048,-2.969238,-5.128667;;, + 43;3;2.351048,-2.969238,-5.128667;;, + 50;3;2.351048,-2.969238,-5.128667;;, + 53;3;2.351048,-2.969238,-5.128667;;, + 55;3;2.351048,-2.969238,-5.128667;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.999936,0.006365,-0.001014,0.009261;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;0.999825,0.002850,-0.006074,0.017471;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint39Animation + { + {Joint39} + + AnimationKey + { + 2; + 23; + 0;3;2.521163,-4.102684,-2.779583;;, + 1;3;2.521163,-4.102684,-2.779583;;, + 2;3;2.521163,-4.102684,-2.779583;;, + 3;3;2.521163,-4.102684,-2.779583;;, + 4;3;2.521163,-4.102684,-2.779583;;, + 5;3;2.521163,-4.102684,-2.779583;;, + 12;3;2.521163,-4.102684,-2.779583;;, + 14;3;2.521163,-4.102684,-2.779583;;, + 15;3;2.521163,-4.102684,-2.779583;;, + 16;3;2.521163,-4.102684,-2.779583;;, + 17;3;2.521163,-4.102684,-2.779583;;, + 18;3;2.521163,-4.102684,-2.779583;;, + 19;3;2.521163,-4.102684,-2.779583;;, + 20;3;2.521163,-4.102684,-2.779583;;, + 27;3;2.521163,-4.102684,-2.779583;;, + 33;3;2.521163,-4.102684,-2.779583;;, + 34;3;2.521163,-4.102684,-2.779583;;, + 35;3;2.521163,-4.102684,-2.779583;;, + 41;3;2.521163,-4.102684,-2.779583;;, + 43;3;2.521163,-4.102684,-2.779583;;, + 50;3;2.521163,-4.102684,-2.779583;;, + 53;3;2.521163,-4.102684,-2.779583;;, + 55;3;2.521163,-4.102684,-2.779583;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.999181,0.023935,-0.000402,0.032630;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;0.993880,0.004998,-0.009988,0.109898;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint40Animation + { + {Joint40} + + AnimationKey + { + 2; + 23; + 0;3;1.543145,-3.721243,-0.884647;;, + 1;3;1.543145,-3.721243,-0.884647;;, + 2;3;1.543145,-3.721243,-0.884647;;, + 3;3;1.543145,-3.721243,-0.884647;;, + 4;3;1.543145,-3.721243,-0.884647;;, + 5;3;1.543145,-3.721243,-0.884647;;, + 12;3;1.543145,-3.721243,-0.884647;;, + 14;3;1.543145,-3.721243,-0.884647;;, + 15;3;1.543145,-3.721243,-0.884647;;, + 16;3;1.543145,-3.721243,-0.884647;;, + 17;3;1.543145,-3.721243,-0.884647;;, + 18;3;1.543145,-3.721243,-0.884647;;, + 19;3;1.543145,-3.721243,-0.884647;;, + 20;3;1.543145,-3.721243,-0.884647;;, + 27;3;1.543145,-3.721243,-0.884647;;, + 33;3;1.543145,-3.721243,-0.884647;;, + 34;3;1.543145,-3.721243,-0.884647;;, + 35;3;1.543145,-3.721243,-0.884647;;, + 41;3;1.543145,-3.721243,-0.884647;;, + 43;3;1.543145,-3.721243,-0.884647;;, + 50;3;1.543145,-3.721243,-0.884647;;, + 53;3;1.543145,-3.721243,-0.884647;;, + 55;3;1.543145,-3.721243,-0.884647;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.997151,0.043421,-0.006512,0.061340;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;0.991531,0.009387,-0.014839,0.128675;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint41Animation + { + {Joint41} + + AnimationKey + { + 2; + 23; + 0;3;0.857303,-3.157324,-0.940437;;, + 1;3;0.857303,-3.157324,-0.940437;;, + 2;3;0.857303,-3.157324,-0.940437;;, + 3;3;0.857303,-3.157324,-0.940437;;, + 4;3;0.857303,-3.157324,-0.940437;;, + 5;3;0.857303,-3.157324,-0.940437;;, + 12;3;0.857303,-3.157324,-0.940437;;, + 14;3;0.857303,-3.157324,-0.940437;;, + 15;3;0.857303,-3.157324,-0.940437;;, + 16;3;0.857303,-3.157324,-0.940437;;, + 17;3;0.857303,-3.157324,-0.940437;;, + 18;3;0.857303,-3.157324,-0.940437;;, + 19;3;0.857303,-3.157324,-0.940437;;, + 20;3;0.857303,-3.157324,-0.940437;;, + 27;3;0.857303,-3.157324,-0.940437;;, + 33;3;0.857303,-3.157324,-0.940437;;, + 34;3;0.857303,-3.157324,-0.940437;;, + 35;3;0.857303,-3.157324,-0.940437;;, + 41;3;0.857303,-3.157324,-0.940437;;, + 43;3;0.857303,-3.157324,-0.940437;;, + 50;3;0.857303,-3.157324,-0.940437;;, + 53;3;0.857303,-3.157324,-0.940437;;, + 55;3;0.857303,-3.157324,-0.940437;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint37Animation + { + {Joint37} + + AnimationKey + { + 2; + 23; + 0;3;-2.844125,-3.130046,-5.128667;;, + 1;3;-2.844125,-3.130046,-5.128667;;, + 2;3;-2.844125,-3.130046,-5.128667;;, + 3;3;-2.844125,-3.130046,-5.128667;;, + 4;3;-2.844125,-3.130046,-5.128667;;, + 5;3;-2.844125,-3.130046,-5.128667;;, + 12;3;-2.844125,-3.130046,-5.128667;;, + 14;3;-2.844125,-3.130046,-5.128667;;, + 15;3;-2.844125,-3.130046,-5.128667;;, + 16;3;-2.844125,-3.130046,-5.128667;;, + 17;3;-2.844125,-3.130046,-5.128667;;, + 18;3;-2.844125,-3.130046,-5.128667;;, + 19;3;-2.844125,-3.130046,-5.128667;;, + 20;3;-2.844125,-3.130046,-5.128667;;, + 27;3;-2.844125,-3.130046,-5.128667;;, + 33;3;-2.844125,-3.130046,-5.128667;;, + 34;3;-2.844125,-3.130046,-5.128667;;, + 35;3;-2.844125,-3.130046,-5.128667;;, + 41;3;-2.844125,-3.130046,-5.128667;;, + 43;3;-2.844125,-3.130046,-5.128667;;, + 50;3;-2.844125,-3.130046,-5.128667;;, + 53;3;-2.844125,-3.130046,-5.128667;;, + 55;3;-2.844125,-3.130046,-5.128667;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.999521,0.014638,-0.017367,0.021010;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;0.996793,0.039942,-0.049084,0.048974;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint38Animation + { + {Joint38} + + AnimationKey + { + 2; + 23; + 0;3;-2.314107,-4.198860,-2.779583;;, + 1;3;-2.314107,-4.198860,-2.779583;;, + 2;3;-2.314107,-4.198860,-2.779583;;, + 3;3;-2.314107,-4.198860,-2.779583;;, + 4;3;-2.314107,-4.198860,-2.779583;;, + 5;3;-2.314107,-4.198860,-2.779583;;, + 12;3;-2.314107,-4.198860,-2.779583;;, + 14;3;-2.314107,-4.198860,-2.779583;;, + 15;3;-2.314107,-4.198860,-2.779583;;, + 16;3;-2.314107,-4.198860,-2.779583;;, + 17;3;-2.314107,-4.198860,-2.779583;;, + 18;3;-2.314107,-4.198860,-2.779583;;, + 19;3;-2.314107,-4.198860,-2.779583;;, + 20;3;-2.314107,-4.198860,-2.779583;;, + 27;3;-2.314107,-4.198860,-2.779583;;, + 33;3;-2.314107,-4.198860,-2.779583;;, + 34;3;-2.314107,-4.198860,-2.779583;;, + 35;3;-2.314107,-4.198860,-2.779583;;, + 41;3;-2.314107,-4.198860,-2.779583;;, + 43;3;-2.314107,-4.198860,-2.779583;;, + 50;3;-2.314107,-4.198860,-2.779583;;, + 53;3;-2.314107,-4.198860,-2.779583;;, + 55;3;-2.314107,-4.198860,-2.779583;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.997118,0.039292,-0.030553,0.057264;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;0.991578,-0.066684,-0.003497,0.110966;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint42Animation + { + {Joint42} + + AnimationKey + { + 2; + 23; + 0;3;-1.200224,-3.209697,-0.885387;;, + 1;3;-1.200224,-3.209697,-0.885387;;, + 2;3;-1.200224,-3.209697,-0.885387;;, + 3;3;-1.200224,-3.209697,-0.885387;;, + 4;3;-1.200224,-3.209697,-0.885387;;, + 5;3;-1.200224,-3.209697,-0.885387;;, + 12;3;-1.200224,-3.209697,-0.885387;;, + 14;3;-1.200224,-3.209697,-0.885387;;, + 15;3;-1.200224,-3.209697,-0.885387;;, + 16;3;-1.200224,-3.209697,-0.885387;;, + 17;3;-1.200224,-3.209697,-0.885387;;, + 18;3;-1.200224,-3.209697,-0.885387;;, + 19;3;-1.200224,-3.209697,-0.885387;;, + 20;3;-1.200224,-3.209697,-0.885387;;, + 27;3;-1.200224,-3.209697,-0.885387;;, + 33;3;-1.200224,-3.209697,-0.885387;;, + 34;3;-1.200224,-3.209697,-0.885387;;, + 35;3;-1.200224,-3.209697,-0.885387;;, + 41;3;-1.200224,-3.209697,-0.885387;;, + 43;3;-1.200224,-3.209697,-0.885387;;, + 50;3;-1.200224,-3.209697,-0.885387;;, + 53;3;-1.200224,-3.209697,-0.885387;;, + 55;3;-1.200224,-3.209697,-0.885387;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint43Animation + { + {Joint43} + + AnimationKey + { + 2; + 23; + 0;3;-1.285954,-3.696030,-0.939697;;, + 1;3;-1.285954,-3.696030,-0.939697;;, + 2;3;-1.285954,-3.696030,-0.939697;;, + 3;3;-1.285954,-3.696030,-0.939697;;, + 4;3;-1.285954,-3.696030,-0.939697;;, + 5;3;-1.285954,-3.696030,-0.939697;;, + 12;3;-1.285954,-3.696030,-0.939697;;, + 14;3;-1.285954,-3.696030,-0.939697;;, + 15;3;-1.285954,-3.696030,-0.939697;;, + 16;3;-1.285954,-3.696030,-0.939697;;, + 17;3;-1.285954,-3.696030,-0.939697;;, + 18;3;-1.285954,-3.696030,-0.939697;;, + 19;3;-1.285954,-3.696030,-0.939697;;, + 20;3;-1.285954,-3.696030,-0.939697;;, + 27;3;-1.285954,-3.696030,-0.939697;;, + 33;3;-1.285954,-3.696030,-0.939697;;, + 34;3;-1.285954,-3.696030,-0.939697;;, + 35;3;-1.285954,-3.696030,-0.939697;;, + 41;3;-1.285954,-3.696030,-0.939697;;, + 43;3;-1.285954,-3.696030,-0.939697;;, + 50;3;-1.285954,-3.696030,-0.939697;;, + 53;3;-1.285954,-3.696030,-0.939697;;, + 55;3;-1.285954,-3.696030,-0.939697;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation topAnimation + { + {top} + + AnimationKey + { + 2; + 23; + 0;3;-0.311274,14.438549,-1.107615;;, + 1;3;-0.311274,14.438549,-1.107615;;, + 2;3;-0.311274,14.438549,-1.107615;;, + 3;3;-0.311274,14.438549,-1.107615;;, + 4;3;-0.311274,14.438549,-1.107615;;, + 5;3;-0.311274,14.438549,-1.107615;;, + 12;3;-0.311274,14.438549,-1.107615;;, + 14;3;-0.311274,14.438549,-1.107615;;, + 15;3;-0.311274,14.438549,-1.107615;;, + 16;3;-0.311274,14.438549,-1.107615;;, + 17;3;-0.311274,14.438549,-1.107615;;, + 18;3;-0.311274,14.438549,-1.107615;;, + 19;3;-0.311274,14.438549,-1.107615;;, + 20;3;-0.311274,14.438549,-1.107615;;, + 27;3;-0.311274,14.438549,-1.107615;;, + 33;3;-0.311274,14.438549,-1.107615;;, + 34;3;-0.311274,14.438549,-1.107615;;, + 35;3;-0.311274,14.438549,-1.107615;;, + 41;3;-0.311274,14.438549,-1.107615;;, + 43;3;-0.311274,14.438549,-1.107615;;, + 50;3;-0.311274,14.438549,-1.107615;;, + 53;3;-0.311274,14.438549,-1.107615;;, + 55;3;-0.311274,14.438549,-1.107615;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation pad2Animation + { + {pad2} + + AnimationKey + { + 2; + 23; + 0;3;-6.280235,3.399014,0.000000;;, + 1;3;-6.280235,3.399014,0.000000;;, + 2;3;-6.280235,3.399014,0.000000;;, + 3;3;-6.280235,3.399014,0.000000;;, + 4;3;-6.280235,3.399014,0.000000;;, + 5;3;-6.280235,3.399014,0.000000;;, + 12;3;-6.280235,3.399014,0.000000;;, + 14;3;-6.280235,3.399014,0.000000;;, + 15;3;-6.280235,3.399014,0.000000;;, + 16;3;-6.280235,3.399014,0.000000;;, + 17;3;-6.280235,3.399014,0.000000;;, + 18;3;-6.280235,3.399014,0.000000;;, + 19;3;-6.280235,3.399014,0.000000;;, + 20;3;-6.280235,3.399014,0.000000;;, + 27;3;-6.280235,3.399014,0.000000;;, + 33;3;-6.280235,3.399014,0.000000;;, + 34;3;-6.280235,3.399014,0.000000;;, + 35;3;-6.280235,3.399014,0.000000;;, + 41;3;-6.280235,3.399014,0.000000;;, + 43;3;-6.280235,3.399014,0.000000;;, + 50;3;-6.280235,3.399014,0.000000;;, + 53;3;-6.280235,3.399014,0.000000;;, + 55;3;-6.280235,3.399014,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 1;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 2;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 3;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 4;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 5;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 12;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 14;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 15;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 16;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 17;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 18;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 19;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 20;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 27;4;0.989850,-0.129750,-0.014210,-0.056208;;, + 33;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 34;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 35;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 41;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 43;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 50;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 53;4;0.988040,-0.130078,-0.010809,-0.082100;;, + 55;4;0.988040,-0.130078,-0.010809,-0.082100;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation pad1Animation + { + {pad1} + + AnimationKey + { + 2; + 23; + 0;3;5.233529,3.529747,0.000000;;, + 1;3;5.233529,3.529747,0.000000;;, + 2;3;5.233529,3.529747,0.000000;;, + 3;3;5.233529,3.529747,0.000000;;, + 4;3;5.233529,3.529747,0.000000;;, + 5;3;5.233529,3.529747,0.000000;;, + 12;3;5.233529,3.529747,0.000000;;, + 14;3;5.233529,3.529747,0.000000;;, + 15;3;5.233529,3.529747,0.000000;;, + 16;3;5.233529,3.529747,0.000000;;, + 17;3;5.233529,3.529747,0.000000;;, + 18;3;5.233529,3.529747,0.000000;;, + 19;3;5.233529,3.529747,0.000000;;, + 20;3;5.233529,3.529747,0.000000;;, + 27;3;5.233529,3.529747,0.000000;;, + 33;3;5.233529,3.529747,0.000000;;, + 34;3;5.233529,3.529747,0.000000;;, + 35;3;5.233529,3.529747,0.000000;;, + 41;3;5.233529,3.529747,0.000000;;, + 43;3;5.233529,3.529747,0.000000;;, + 50;3;5.233529,3.529747,0.000000;;, + 53;3;5.233529,3.529747,0.000000;;, + 55;3;5.233529,3.529747,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;0.998135,0.000000,0.000000,-0.061049;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation lsholdaAnimation + { + {lsholda} + + AnimationKey + { + 2; + 23; + 0;3;-10.711074,-1.732187,3.529744;;, + 1;3;-10.711074,-1.732187,3.529744;;, + 2;3;-10.711074,-1.732187,3.529744;;, + 3;3;-10.711074,-1.732187,3.529744;;, + 4;3;-10.711074,-1.732187,3.529744;;, + 5;3;-10.711074,-1.732187,3.529744;;, + 12;3;-10.711074,-1.732187,3.529744;;, + 14;3;-10.711074,-1.732187,3.529744;;, + 15;3;-10.711074,-1.732187,3.529744;;, + 16;3;-10.711074,-1.732187,3.529744;;, + 17;3;-10.711074,-1.732187,3.529744;;, + 18;3;-10.711074,-1.732187,3.529744;;, + 19;3;-10.711074,-1.732187,3.529744;;, + 20;3;-10.711074,-1.732187,3.529744;;, + 27;3;-10.711074,-1.732187,3.529744;;, + 33;3;-10.711074,-1.732187,3.529744;;, + 34;3;-10.711074,-1.732187,3.529744;;, + 35;3;-10.711074,-1.732187,3.529744;;, + 41;3;-10.711074,-1.732187,3.529744;;, + 43;3;-10.711074,-1.732187,3.529744;;, + 50;3;-10.711074,-1.732187,3.529744;;, + 53;3;-10.711074,-1.732187,3.529744;;, + 55;3;-10.711074,-1.732187,3.529744;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.992262,-0.004035,-0.002900,-0.124058;;, + 1;4;0.992262,-0.004035,-0.002900,-0.124058;;, + 2;4;0.984948,-0.092375,0.080710,-0.121780;;, + 3;4;0.957969,-0.193544,0.176588,-0.116845;;, + 4;4;0.919617,-0.276885,0.255679,-0.110761;;, + 5;4;0.919617,-0.276885,0.255679,-0.110761;;, + 12;4;0.919617,-0.276885,0.255679,-0.110761;;, + 14;4;0.919617,-0.276885,0.255679,-0.110761;;, + 15;4;0.919617,-0.276885,0.255679,-0.110761;;, + 16;4;0.949143,-0.215995,0.197884,-0.115394;;, + 17;4;0.973899,-0.143396,0.129045,-0.119611;;, + 18;4;0.988465,-0.067843,0.057481,-0.122598;;, + 19;4;0.992262,-0.004035,-0.002900,-0.124058;;, + 20;4;0.992262,-0.004035,-0.002900,-0.124058;;, + 27;4;0.980361,0.117258,0.064506,-0.144851;;, + 33;4;0.992262,-0.004035,-0.002900,-0.124058;;, + 34;4;0.992262,-0.004035,-0.002900,-0.124058;;, + 35;4;0.992262,-0.004035,-0.002900,-0.124058;;, + 41;4;0.987041,-0.061321,0.042727,-0.142002;;, + 43;4;0.984145,-0.079780,0.057436,-0.147634;;, + 50;4;0.975443,-0.121280,0.090521,-0.160025;;, + 53;4;0.987695,-0.056533,0.038912,-0.140529;;, + 55;4;0.992262,-0.004035,-0.002900,-0.124058;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation lelboAnimation + { + {lelbo} + + AnimationKey + { + 2; + 23; + 0;3;-6.541911,-5.098517,0.705949;;, + 1;3;-6.541911,-5.098517,0.705949;;, + 2;3;-6.541911,-5.098517,0.705949;;, + 3;3;-6.541911,-5.098517,0.705949;;, + 4;3;-6.541911,-5.098517,0.705949;;, + 5;3;-6.541911,-5.098517,0.705949;;, + 12;3;-6.541911,-5.098517,0.705949;;, + 14;3;-6.541911,-5.098517,0.705949;;, + 15;3;-6.541911,-5.098517,0.705949;;, + 16;3;-6.541911,-5.098517,0.705949;;, + 17;3;-6.541911,-5.098517,0.705949;;, + 18;3;-6.541911,-5.098517,0.705949;;, + 19;3;-6.541911,-5.098517,0.705949;;, + 20;3;-6.541911,-5.098517,0.705949;;, + 27;3;-6.541911,-5.098517,0.705949;;, + 33;3;-6.541911,-5.098517,0.705949;;, + 34;3;-6.541911,-5.098517,0.705949;;, + 35;3;-6.541911,-5.098517,0.705949;;, + 41;3;-6.541911,-5.098517,0.705949;;, + 43;3;-6.541911,-5.098517,0.705949;;, + 50;3;-6.541911,-5.098517,0.705949;;, + 53;3;-6.541911,-5.098517,0.705949;;, + 55;3;-6.541911,-5.098517,0.705949;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.938931,-0.301990,0.116244,-0.117037;;, + 1;4;0.938931,-0.301990,0.116244,-0.117037;;, + 2;4;0.939499,-0.269250,0.068390,-0.200421;;, + 3;4;0.927931,-0.227598,0.011743,-0.294966;;, + 4;4;0.907758,-0.189498,-0.036768,-0.372443;;, + 5;4;0.907758,-0.189498,-0.036768,-0.372443;;, + 12;4;0.907815,-0.196434,-0.033361,-0.369017;;, + 14;4;0.907758,-0.189498,-0.036768,-0.372443;;, + 15;4;0.907758,-0.189498,-0.036768,-0.372443;;, + 16;4;0.923494,-0.217696,-0.001142,-0.315858;;, + 17;4;0.935347,-0.248829,0.040096,-0.248198;;, + 18;4;0.940317,-0.278666,0.081816,-0.177359;;, + 19;4;0.938931,-0.301990,0.116244,-0.117037;;, + 20;4;0.938931,-0.301990,0.116244,-0.117037;;, + 27;4;0.969755,-0.235046,0.020216,-0.062603;;, + 33;4;0.938931,-0.301990,0.116244,-0.117037;;, + 34;4;0.938931,-0.301990,0.116244,-0.117037;;, + 35;4;0.938931,-0.301990,0.116244,-0.117037;;, + 41;4;0.907794,-0.355022,0.176137,-0.137281;;, + 43;4;0.896205,-0.371593,0.195226,-0.143604;;, + 50;4;0.867362,-0.407890,0.237736,-0.157448;;, + 53;4;0.910675,-0.350682,0.171168,-0.135625;;, + 55;4;0.938931,-0.301990,0.116244,-0.117037;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation lwristAnimation + { + {lwrist} + + AnimationKey + { + 2; + 23; + 0;3;-7.850295,-6.405833,0.000000;;, + 1;3;-7.850295,-6.405833,0.000000;;, + 2;3;-7.850295,-6.405833,0.000000;;, + 3;3;-7.850295,-6.405833,0.000000;;, + 4;3;-7.850295,-6.405833,0.000000;;, + 5;3;-7.850295,-6.405833,0.000000;;, + 12;3;-7.850295,-6.405833,0.000000;;, + 14;3;-7.850295,-6.405833,0.000000;;, + 15;3;-7.850295,-6.405833,0.000000;;, + 16;3;-7.850295,-6.405833,0.000000;;, + 17;3;-7.850295,-6.405833,0.000000;;, + 18;3;-7.850295,-6.405833,0.000000;;, + 19;3;-7.850295,-6.405833,0.000000;;, + 20;3;-7.850295,-6.405833,0.000000;;, + 27;3;-7.850295,-6.405833,0.000000;;, + 33;3;-7.850295,-6.405833,0.000000;;, + 34;3;-7.850295,-6.405833,0.000000;;, + 35;3;-7.850295,-6.405833,0.000000;;, + 41;3;-7.850295,-6.405833,0.000000;;, + 43;3;-7.850295,-6.405833,0.000000;;, + 50;3;-7.850295,-6.405833,0.000000;;, + 53;3;-7.850295,-6.405833,0.000000;;, + 55;3;-7.850295,-6.405833,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint17Animation + { + {Joint17} + + AnimationKey + { + 2; + 23; + 0;3;-3.663469,-3.660475,0.000000;;, + 1;3;-3.663469,-3.660475,0.000000;;, + 2;3;-3.663469,-3.660475,0.000000;;, + 3;3;-3.663469,-3.660475,0.000000;;, + 4;3;-3.663469,-3.660475,0.000000;;, + 5;3;-3.663469,-3.660475,0.000000;;, + 12;3;-3.663469,-3.660475,0.000000;;, + 14;3;-3.663469,-3.660475,0.000000;;, + 15;3;-3.663469,-3.660475,0.000000;;, + 16;3;-3.663469,-3.660475,0.000000;;, + 17;3;-3.663469,-3.660475,0.000000;;, + 18;3;-3.663469,-3.660475,0.000000;;, + 19;3;-3.663469,-3.660475,0.000000;;, + 20;3;-3.663469,-3.660475,0.000000;;, + 27;3;-3.663469,-3.660475,0.000000;;, + 33;3;-3.663469,-3.660475,0.000000;;, + 34;3;-3.663469,-3.660475,0.000000;;, + 35;3;-3.663469,-3.660475,0.000000;;, + 41;3;-3.663469,-3.660475,0.000000;;, + 43;3;-3.663469,-3.660475,0.000000;;, + 50;3;-3.663469,-3.660475,0.000000;;, + 53;3;-3.663469,-3.660475,0.000000;;, + 55;3;-3.663469,-3.660475,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint18Animation + { + {Joint18} + + AnimationKey + { + 2; + 23; + 0;3;-1.046706,-2.091701,0.000000;;, + 1;3;-1.046706,-2.091701,0.000000;;, + 2;3;-1.046706,-2.091701,0.000000;;, + 3;3;-1.046706,-2.091701,0.000000;;, + 4;3;-1.046706,-2.091701,0.000000;;, + 5;3;-1.046706,-2.091701,0.000000;;, + 12;3;-1.046706,-2.091701,0.000000;;, + 14;3;-1.046706,-2.091701,0.000000;;, + 15;3;-1.046706,-2.091701,0.000000;;, + 16;3;-1.046706,-2.091701,0.000000;;, + 17;3;-1.046706,-2.091701,0.000000;;, + 18;3;-1.046706,-2.091701,0.000000;;, + 19;3;-1.046706,-2.091701,0.000000;;, + 20;3;-1.046706,-2.091701,0.000000;;, + 27;3;-1.046706,-2.091701,0.000000;;, + 33;3;-1.046706,-2.091701,0.000000;;, + 34;3;-1.046706,-2.091701,0.000000;;, + 35;3;-1.046706,-2.091701,0.000000;;, + 41;3;-1.046706,-2.091701,0.000000;;, + 43;3;-1.046706,-2.091701,0.000000;;, + 50;3;-1.046706,-2.091701,0.000000;;, + 53;3;-1.046706,-2.091701,0.000000;;, + 55;3;-1.046706,-2.091701,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.938191,0.000000,0.000000,-0.346117;;, + 1;4;0.938191,0.000000,0.000000,-0.346117;;, + 2;4;0.938191,0.000000,0.000000,-0.346117;;, + 3;4;0.938191,0.000000,0.000000,-0.346117;;, + 4;4;0.938191,0.000000,0.000000,-0.346117;;, + 5;4;0.938191,0.000000,0.000000,-0.346117;;, + 12;4;0.938191,0.000000,0.000000,-0.346117;;, + 14;4;0.938191,0.000000,0.000000,-0.346117;;, + 15;4;0.938191,0.000000,0.000000,-0.346117;;, + 16;4;0.938191,0.000000,0.000000,-0.346117;;, + 17;4;0.938191,0.000000,0.000000,-0.346117;;, + 18;4;0.938191,0.000000,0.000000,-0.346117;;, + 19;4;0.938191,0.000000,0.000000,-0.346117;;, + 20;4;0.938191,0.000000,0.000000,-0.346117;;, + 27;4;0.938191,0.000000,0.000000,-0.346117;;, + 33;4;0.938191,0.000000,0.000000,-0.346117;;, + 34;4;0.938191,0.000000,0.000000,-0.346117;;, + 35;4;0.938191,0.000000,0.000000,-0.346117;;, + 41;4;0.938191,0.000000,0.000000,-0.346117;;, + 43;4;0.938191,0.000000,0.000000,-0.346117;;, + 50;4;0.938191,0.000000,0.000000,-0.346117;;, + 53;4;0.938191,0.000000,0.000000,-0.346117;;, + 55;4;0.938191,0.000000,0.000000,-0.346117;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint19Animation + { + {Joint19} + + AnimationKey + { + 2; + 23; + 0;3;-0.130838,-3.137549,0.000000;;, + 1;3;-0.130838,-3.137549,0.000000;;, + 2;3;-0.130838,-3.137549,0.000000;;, + 3;3;-0.130838,-3.137549,0.000000;;, + 4;3;-0.130838,-3.137549,0.000000;;, + 5;3;-0.130838,-3.137549,0.000000;;, + 12;3;-0.130838,-3.137549,0.000000;;, + 14;3;-0.130838,-3.137549,0.000000;;, + 15;3;-0.130838,-3.137549,0.000000;;, + 16;3;-0.130838,-3.137549,0.000000;;, + 17;3;-0.130838,-3.137549,0.000000;;, + 18;3;-0.130838,-3.137549,0.000000;;, + 19;3;-0.130838,-3.137549,0.000000;;, + 20;3;-0.130838,-3.137549,0.000000;;, + 27;3;-0.130838,-3.137549,0.000000;;, + 33;3;-0.130838,-3.137549,0.000000;;, + 34;3;-0.130838,-3.137549,0.000000;;, + 35;3;-0.130838,-3.137549,0.000000;;, + 41;3;-0.130838,-3.137549,0.000000;;, + 43;3;-0.130838,-3.137549,0.000000;;, + 50;3;-0.130838,-3.137549,0.000000;;, + 53;3;-0.130838,-3.137549,0.000000;;, + 55;3;-0.130838,-3.137549,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint20Animation + { + {Joint20} + + AnimationKey + { + 2; + 23; + 0;3;-1.416095,-4.359032,-3.203176;;, + 1;3;-1.416095,-4.359032,-3.203176;;, + 2;3;-1.416095,-4.359032,-3.203176;;, + 3;3;-1.416095,-4.359032,-3.203176;;, + 4;3;-1.416095,-4.359032,-3.203176;;, + 5;3;-1.416095,-4.359032,-3.203176;;, + 12;3;-1.416095,-4.359032,-3.203176;;, + 14;3;-1.416095,-4.359032,-3.203176;;, + 15;3;-1.416095,-4.359032,-3.203176;;, + 16;3;-1.416095,-4.359032,-3.203176;;, + 17;3;-1.416095,-4.359032,-3.203176;;, + 18;3;-1.416095,-4.359032,-3.203176;;, + 19;3;-1.416095,-4.359032,-3.203176;;, + 20;3;-1.416095,-4.359032,-3.203176;;, + 27;3;-1.416095,-4.359032,-3.203176;;, + 33;3;-1.416095,-4.359032,-3.203176;;, + 34;3;-1.416095,-4.359032,-3.203176;;, + 35;3;-1.416095,-4.359032,-3.203176;;, + 41;3;-1.416095,-4.359032,-3.203176;;, + 43;3;-1.416095,-4.359032,-3.203176;;, + 50;3;-1.416095,-4.359032,-3.203176;;, + 53;3;-1.416095,-4.359032,-3.203176;;, + 55;3;-1.416095,-4.359032,-3.203176;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint21Animation + { + {Joint21} + + AnimationKey + { + 2; + 23; + 0;3;-1.046704,-2.483894,0.000000;;, + 1;3;-1.046704,-2.483894,0.000000;;, + 2;3;-1.046704,-2.483894,0.000000;;, + 3;3;-1.046704,-2.483894,0.000000;;, + 4;3;-1.046704,-2.483894,0.000000;;, + 5;3;-1.046704,-2.483894,0.000000;;, + 12;3;-1.046704,-2.483894,0.000000;;, + 14;3;-1.046704,-2.483894,0.000000;;, + 15;3;-1.046704,-2.483894,0.000000;;, + 16;3;-1.046704,-2.483894,0.000000;;, + 17;3;-1.046704,-2.483894,0.000000;;, + 18;3;-1.046704,-2.483894,0.000000;;, + 19;3;-1.046704,-2.483894,0.000000;;, + 20;3;-1.046704,-2.483894,0.000000;;, + 27;3;-1.046704,-2.483894,0.000000;;, + 33;3;-1.046704,-2.483894,0.000000;;, + 34;3;-1.046704,-2.483894,0.000000;;, + 35;3;-1.046704,-2.483894,0.000000;;, + 41;3;-1.046704,-2.483894,0.000000;;, + 43;3;-1.046704,-2.483894,0.000000;;, + 50;3;-1.046704,-2.483894,0.000000;;, + 53;3;-1.046704,-2.483894,0.000000;;, + 55;3;-1.046704,-2.483894,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation rsholdaAnimation + { + {rsholda} + + AnimationKey + { + 2; + 23; + 0;3;9.986465,-1.438042,3.529744;;, + 1;3;9.986465,-1.438042,3.529744;;, + 2;3;9.986465,-1.438042,3.529744;;, + 3;3;9.986465,-1.438042,3.529744;;, + 4;3;9.986465,-1.438042,3.529744;;, + 5;3;9.986465,-1.438042,3.529744;;, + 12;3;9.986465,-1.438042,3.529744;;, + 14;3;9.986465,-1.438042,3.529744;;, + 15;3;9.986465,-1.438042,3.529744;;, + 16;3;9.986465,-1.438042,3.529744;;, + 17;3;9.986465,-1.438042,3.529744;;, + 18;3;9.986465,-1.438042,3.529744;;, + 19;3;9.986465,-1.438042,3.529744;;, + 20;3;9.986465,-1.438042,3.529744;;, + 27;3;9.986465,-1.438042,3.529744;;, + 33;3;9.986465,-1.438042,3.529744;;, + 34;3;9.986465,-1.438042,3.529744;;, + 35;3;9.986465,-1.438042,3.529744;;, + 41;3;9.986465,-1.438042,3.529744;;, + 43;3;9.986465,-1.438042,3.529744;;, + 50;3;9.986465,-1.438042,3.529744;;, + 53;3;9.986465,-1.438042,3.529744;;, + 55;3;9.986465,-1.438042,3.529744;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.993880,-0.002269,0.003388,0.110387;;, + 1;4;0.993880,-0.002269,0.003388,0.110387;;, + 2;4;0.993765,-0.003650,0.000223,0.111434;;, + 3;4;0.993637,-0.005031,-0.002942,0.112479;;, + 4;4;0.993496,-0.006413,-0.006107,0.113522;;, + 5;4;0.993496,-0.006413,-0.006107,0.113522;;, + 12;4;0.993496,-0.006413,-0.006107,0.113523;;, + 14;4;0.993496,-0.006413,-0.006107,0.113522;;, + 15;4;0.993496,-0.006413,-0.006107,0.113522;;, + 16;4;0.993603,-0.005377,-0.003733,0.112740;;, + 17;4;0.993703,-0.004341,-0.001359,0.111957;;, + 18;4;0.993795,-0.003305,0.001014,0.111173;;, + 19;4;0.993880,-0.002269,0.003388,0.110387;;, + 20;4;0.993880,-0.002269,0.003388,0.110387;;, + 27;4;0.973729,-0.204525,0.026684,0.096484;;, + 33;4;0.993880,-0.002269,0.003388,0.110387;;, + 34;4;0.993880,-0.002269,0.003388,0.110387;;, + 35;4;0.993880,-0.002269,0.003388,0.110387;;, + 41;4;0.994023,-0.003923,0.001453,0.109093;;, + 43;4;0.993957,-0.002996,-0.000780,0.109727;;, + 50;4;0.993678,0.000249,-0.008594,0.111941;;, + 53;4;0.993801,-0.001051,-0.002101,0.111149;;, + 55;4;0.993880,-0.002269,0.003388,0.110387;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation relboAnimation + { + {relbo} + + AnimationKey + { + 2; + 23; + 0;3;6.803588,-5.359982,0.705949;;, + 1;3;6.803588,-5.359982,0.705949;;, + 2;3;6.803588,-5.359982,0.705949;;, + 3;3;6.803588,-5.359982,0.705949;;, + 4;3;6.803588,-5.359982,0.705949;;, + 5;3;6.803588,-5.359982,0.705949;;, + 12;3;6.803588,-5.359982,0.705949;;, + 14;3;6.803588,-5.359982,0.705949;;, + 15;3;6.803588,-5.359982,0.705949;;, + 16;3;6.803588,-5.359982,0.705949;;, + 17;3;6.803588,-5.359982,0.705949;;, + 18;3;6.803588,-5.359982,0.705949;;, + 19;3;6.803588,-5.359982,0.705949;;, + 20;3;6.803588,-5.359982,0.705949;;, + 27;3;6.803588,-5.359982,0.705949;;, + 33;3;6.803588,-5.359982,0.705949;;, + 34;3;6.803588,-5.359982,0.705949;;, + 35;3;6.803588,-5.359982,0.705949;;, + 41;3;6.803588,-5.359982,0.705949;;, + 43;3;6.803588,-5.359982,0.705949;;, + 50;3;6.803588,-5.359982,0.705949;;, + 53;3;6.803588,-5.359982,0.705949;;, + 55;3;6.803588,-5.359982,0.705949;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.959847,-0.255150,-0.080990,0.083865;;, + 1;4;0.959847,-0.255150,-0.080990,0.083865;;, + 2;4;0.962470,-0.246054,-0.075922,0.085704;;, + 3;4;0.965384,-0.235411,-0.070003,0.087834;;, + 4;4;0.967748,-0.226298,-0.064941,0.089641;;, + 5;4;0.967748,-0.226298,-0.064941,0.089641;;, + 12;4;0.967748,-0.226298,-0.064941,0.089641;;, + 14;4;0.967748,-0.226298,-0.064941,0.089641;;, + 15;4;0.967748,-0.226298,-0.064941,0.089641;;, + 16;4;0.966023,-0.232995,-0.068660,0.088315;;, + 17;4;0.964039,-0.240399,-0.072776,0.086838;;, + 18;4;0.961805,-0.248399,-0.077228,0.085231;;, + 19;4;0.959847,-0.255150,-0.080990,0.083865;;, + 20;4;0.959847,-0.255150,-0.080990,0.083865;;, + 27;4;0.959350,-0.261136,-0.082412,0.068295;;, + 33;4;0.959847,-0.255150,-0.080990,0.083865;;, + 34;4;0.959847,-0.255150,-0.080990,0.083865;;, + 35;4;0.959847,-0.255150,-0.080990,0.083865;;, + 41;4;0.958063,-0.263775,-0.077544,0.080776;;, + 43;4;0.957289,-0.265983,-0.080054,0.080258;;, + 50;4;0.955168,-0.270038,-0.091428,0.079837;;, + 53;4;0.957785,-0.261756,-0.085958,0.082112;;, + 55;4;0.959847,-0.255150,-0.080990,0.083865;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation rwristAnimation + { + {rwrist} + + AnimationKey + { + 2; + 24; + 0;3;8.373647,-6.798027,0.000000;;, + 1;3;8.373647,-6.798027,0.000000;;, + 2;3;8.373647,-6.798027,0.000000;;, + 3;3;8.373647,-6.798027,0.000000;;, + 4;3;8.373647,-6.798027,0.000000;;, + 5;3;8.373647,-6.798027,0.000000;;, + 12;3;8.373647,-6.798027,0.000000;;, + 14;3;8.373647,-6.798027,0.000000;;, + 15;3;8.373647,-6.798027,0.000000;;, + 16;3;8.373647,-6.798027,0.000000;;, + 17;3;8.373647,-6.798027,0.000000;;, + 18;3;8.373647,-6.798027,0.000000;;, + 19;3;8.373647,-6.798027,0.000000;;, + 20;3;8.373647,-6.798027,0.000000;;, + 27;3;8.373647,-6.798027,0.000000;;, + 29;3;8.373647,-6.798027,0.000000;;, + 33;3;8.373647,-6.798027,0.000000;;, + 34;3;8.373647,-6.798027,0.000000;;, + 35;3;8.373647,-6.798027,0.000000;;, + 41;3;8.373647,-6.798027,0.000000;;, + 43;3;8.373647,-6.798027,0.000000;;, + 50;3;8.373647,-6.798027,0.000000;;, + 53;3;8.373647,-6.798027,0.000000;;, + 55;3;8.373647,-6.798027,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 24; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;0.999709,0.020471,0.012692,-0.001586;;, + 3;4;0.998633,0.044321,0.027480,-0.003434;;, + 4;4;0.997090,0.064652,0.040085,-0.005009;;, + 5;4;0.997090,0.064652,0.040085,-0.005009;;, + 12;4;0.997090,0.064652,0.040085,-0.005009;;, + 14;4;0.997090,0.064652,0.040085,-0.005009;;, + 15;4;0.997090,0.064652,0.040085,-0.005009;;, + 16;4;0.998280,0.049721,0.030828,-0.003852;;, + 17;4;0.999269,0.032417,0.020099,-0.002511;;, + 18;4;0.999848,0.014768,0.009157,-0.001144;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;0.996917,0.078459,0.000000,0.000000;;, + 29;4;0.992822,0.119601,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.999329,-0.002870,0.035216,-0.009610;;, + 43;4;0.999253,-0.000181,0.037154,-0.010592;;, + 50;4;0.999533,0.011592,0.026653,-0.009464;;, + 53;4;0.999915,0.005480,0.011096,-0.004044;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint25Animation + { + {Joint25} + + AnimationKey + { + 2; + 23; + 0;3;3.663469,-3.137551,0.000000;;, + 1;3;3.663469,-3.137551,0.000000;;, + 2;3;3.663469,-3.137551,0.000000;;, + 3;3;3.663469,-3.137551,0.000000;;, + 4;3;3.663469,-3.137551,0.000000;;, + 5;3;3.663469,-3.137551,0.000000;;, + 12;3;3.663469,-3.137551,0.000000;;, + 14;3;3.663469,-3.137551,0.000000;;, + 15;3;3.663469,-3.137551,0.000000;;, + 16;3;3.663469,-3.137551,0.000000;;, + 17;3;3.663469,-3.137551,0.000000;;, + 18;3;3.663469,-3.137551,0.000000;;, + 19;3;3.663469,-3.137551,0.000000;;, + 20;3;3.663469,-3.137551,0.000000;;, + 27;3;3.663469,-3.137551,0.000000;;, + 33;3;3.663469,-3.137551,0.000000;;, + 34;3;3.663469,-3.137551,0.000000;;, + 35;3;3.663469,-3.137551,0.000000;;, + 41;3;3.663469,-3.137551,0.000000;;, + 43;3;3.663469,-3.137551,0.000000;;, + 50;3;3.663469,-3.137551,0.000000;;, + 53;3;3.663469,-3.137551,0.000000;;, + 55;3;3.663469,-3.137551,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint26Animation + { + {Joint26} + + AnimationKey + { + 2; + 23; + 0;3;1.046706,-2.353162,0.000000;;, + 1;3;1.046706,-2.353162,0.000000;;, + 2;3;1.046706,-2.353162,0.000000;;, + 3;3;1.046706,-2.353162,0.000000;;, + 4;3;1.046706,-2.353162,0.000000;;, + 5;3;1.046706,-2.353162,0.000000;;, + 12;3;1.046706,-2.353162,0.000000;;, + 14;3;1.046706,-2.353162,0.000000;;, + 15;3;1.046706,-2.353162,0.000000;;, + 16;3;1.046706,-2.353162,0.000000;;, + 17;3;1.046706,-2.353162,0.000000;;, + 18;3;1.046706,-2.353162,0.000000;;, + 19;3;1.046706,-2.353162,0.000000;;, + 20;3;1.046706,-2.353162,0.000000;;, + 27;3;1.046706,-2.353162,0.000000;;, + 33;3;1.046706,-2.353162,0.000000;;, + 34;3;1.046706,-2.353162,0.000000;;, + 35;3;1.046706,-2.353162,0.000000;;, + 41;3;1.046706,-2.353162,0.000000;;, + 43;3;1.046706,-2.353162,0.000000;;, + 50;3;1.046706,-2.353162,0.000000;;, + 53;3;1.046706,-2.353162,0.000000;;, + 55;3;1.046706,-2.353162,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.878817,0.000000,0.000000,0.477159;;, + 1;4;0.878817,0.000000,0.000000,0.477159;;, + 2;4;0.878817,0.000000,0.000000,0.477159;;, + 3;4;0.878817,0.000000,0.000000,0.477159;;, + 4;4;0.878817,0.000000,0.000000,0.477159;;, + 5;4;0.878817,0.000000,0.000000,0.477159;;, + 12;4;0.878817,0.000000,0.000000,0.477159;;, + 14;4;0.878817,0.000000,0.000000,0.477159;;, + 15;4;0.878817,0.000000,0.000000,0.477159;;, + 16;4;0.878817,0.000000,0.000000,0.477159;;, + 17;4;0.878817,0.000000,0.000000,0.477159;;, + 18;4;0.878817,0.000000,0.000000,0.477159;;, + 19;4;0.878817,0.000000,0.000000,0.477159;;, + 20;4;0.878817,0.000000,0.000000,0.477159;;, + 27;4;0.878817,0.000000,0.000000,0.477159;;, + 33;4;0.878817,0.000000,0.000000,0.477159;;, + 34;4;0.878817,0.000000,0.000000,0.477159;;, + 35;4;0.878817,0.000000,0.000000,0.477159;;, + 41;4;0.878817,0.000000,0.000000,0.477159;;, + 43;4;0.878817,0.000000,0.000000,0.477159;;, + 50;4;0.878817,0.000000,0.000000,0.477159;;, + 53;4;0.878817,0.000000,0.000000,0.477159;;, + 55;4;0.878817,0.000000,0.000000,0.477159;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint27Animation + { + {Joint27} + + AnimationKey + { + 2; + 23; + 0;3;-0.261676,-2.876088,0.000000;;, + 1;3;-0.261676,-2.876088,0.000000;;, + 2;3;-0.261676,-2.876088,0.000000;;, + 3;3;-0.261676,-2.876088,0.000000;;, + 4;3;-0.261676,-2.876088,0.000000;;, + 5;3;-0.261676,-2.876088,0.000000;;, + 12;3;-0.261676,-2.876088,0.000000;;, + 14;3;-0.261676,-2.876088,0.000000;;, + 15;3;-0.261676,-2.876088,0.000000;;, + 16;3;-0.261676,-2.876088,0.000000;;, + 17;3;-0.261676,-2.876088,0.000000;;, + 18;3;-0.261676,-2.876088,0.000000;;, + 19;3;-0.261676,-2.876088,0.000000;;, + 20;3;-0.261676,-2.876088,0.000000;;, + 27;3;-0.261676,-2.876088,0.000000;;, + 33;3;-0.261676,-2.876088,0.000000;;, + 34;3;-0.261676,-2.876088,0.000000;;, + 35;3;-0.261676,-2.876088,0.000000;;, + 41;3;-0.261676,-2.876088,0.000000;;, + 43;3;-0.261676,-2.876088,0.000000;;, + 50;3;-0.261676,-2.876088,0.000000;;, + 53;3;-0.261676,-2.876088,0.000000;;, + 55;3;-0.261676,-2.876088,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint28Animation + { + {Joint28} + + AnimationKey + { + 2; + 23; + 0;3;-0.785030,-4.183402,-2.034320;;, + 1;3;-0.785030,-4.183402,-2.034320;;, + 2;3;-0.785030,-4.183402,-2.034320;;, + 3;3;-0.785030,-4.183402,-2.034320;;, + 4;3;-0.785030,-4.183402,-2.034320;;, + 5;3;-0.785030,-4.183402,-2.034320;;, + 12;3;-0.785030,-4.183402,-2.034320;;, + 14;3;-0.785030,-4.183402,-2.034320;;, + 15;3;-0.785030,-4.183402,-2.034320;;, + 16;3;-0.785030,-4.183402,-2.034320;;, + 17;3;-0.785030,-4.183402,-2.034320;;, + 18;3;-0.785030,-4.183402,-2.034320;;, + 19;3;-0.785030,-4.183402,-2.034320;;, + 20;3;-0.785030,-4.183402,-2.034320;;, + 27;3;-0.785030,-4.183402,-2.034320;;, + 33;3;-0.785030,-4.183402,-2.034320;;, + 34;3;-0.785030,-4.183402,-2.034320;;, + 35;3;-0.785030,-4.183402,-2.034320;;, + 41;3;-0.785030,-4.183402,-2.034320;;, + 43;3;-0.785030,-4.183402,-2.034320;;, + 50;3;-0.785030,-4.183402,-2.034320;;, + 53;3;-0.785030,-4.183402,-2.034320;;, + 55;3;-0.785030,-4.183402,-2.034320;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;0.971342,0.000000,0.000000,0.237686;;, + 1;4;0.971342,0.000000,0.000000,0.237686;;, + 2;4;0.971342,0.000000,0.000000,0.237686;;, + 3;4;0.971342,0.000000,0.000000,0.237686;;, + 4;4;0.971342,0.000000,0.000000,0.237686;;, + 5;4;0.971342,0.000000,0.000000,0.237686;;, + 12;4;0.971342,0.000000,0.000000,0.237686;;, + 14;4;0.971342,0.000000,0.000000,0.237686;;, + 15;4;0.971342,0.000000,0.000000,0.237686;;, + 16;4;0.971342,0.000000,0.000000,0.237686;;, + 17;4;0.971342,0.000000,0.000000,0.237686;;, + 18;4;0.971342,0.000000,0.000000,0.237686;;, + 19;4;0.971342,0.000000,0.000000,0.237686;;, + 20;4;0.971342,0.000000,0.000000,0.237686;;, + 27;4;0.971342,0.000000,0.000000,0.237686;;, + 33;4;0.971342,0.000000,0.000000,0.237686;;, + 34;4;0.971342,0.000000,0.000000,0.237686;;, + 35;4;0.971342,0.000000,0.000000,0.237686;;, + 41;4;0.971342,0.000000,0.000000,0.237686;;, + 43;4;0.971342,0.000000,0.000000,0.237686;;, + 50;4;0.971342,0.000000,0.000000,0.237686;;, + 53;4;0.971342,0.000000,0.000000,0.237686;;, + 55;4;0.971342,0.000000,0.000000,0.237686;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation Joint29Animation + { + {Joint29} + + AnimationKey + { + 2; + 23; + 0;3;0.261676,-2.483894,0.000000;;, + 1;3;0.261676,-2.483894,0.000000;;, + 2;3;0.261676,-2.483894,0.000000;;, + 3;3;0.261676,-2.483894,0.000000;;, + 4;3;0.261676,-2.483894,0.000000;;, + 5;3;0.261676,-2.483894,0.000000;;, + 12;3;0.261676,-2.483894,0.000000;;, + 14;3;0.261676,-2.483894,0.000000;;, + 15;3;0.261676,-2.483894,0.000000;;, + 16;3;0.261676,-2.483894,0.000000;;, + 17;3;0.261676,-2.483894,0.000000;;, + 18;3;0.261676,-2.483894,0.000000;;, + 19;3;0.261676,-2.483894,0.000000;;, + 20;3;0.261676,-2.483894,0.000000;;, + 27;3;0.261676,-2.483894,0.000000;;, + 33;3;0.261676,-2.483894,0.000000;;, + 34;3;0.261676,-2.483894,0.000000;;, + 35;3;0.261676,-2.483894,0.000000;;, + 41;3;0.261676,-2.483894,0.000000;;, + 43;3;0.261676,-2.483894,0.000000;;, + 50;3;0.261676,-2.483894,0.000000;;, + 53;3;0.261676,-2.483894,0.000000;;, + 55;3;0.261676,-2.483894,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation weaponAnimation + { + {weapon} + + AnimationKey + { + 2; + 23; + 0;3;1.700897,-4.837056,0.000000;;, + 1;3;1.700897,-4.837056,0.000000;;, + 2;3;1.700897,-4.837056,0.000000;;, + 3;3;1.700897,-4.837056,0.000000;;, + 4;3;1.700897,-4.837056,0.000000;;, + 5;3;1.700897,-4.837056,0.000000;;, + 12;3;1.700897,-4.837056,0.000000;;, + 14;3;1.700897,-4.837056,0.000000;;, + 15;3;1.700897,-4.837056,0.000000;;, + 16;3;1.700897,-4.837056,0.000000;;, + 17;3;1.700897,-4.837056,0.000000;;, + 18;3;1.700897,-4.837056,0.000000;;, + 19;3;1.700897,-4.837056,0.000000;;, + 20;3;1.700897,-4.837056,0.000000;;, + 27;3;1.700897,-4.837056,0.000000;;, + 33;3;1.700897,-4.837056,0.000000;;, + 34;3;1.700897,-4.837056,0.000000;;, + 35;3;1.700897,-4.837056,0.000000;;, + 41;3;1.700897,-4.837056,0.000000;;, + 43;3;1.700897,-4.837056,0.000000;;, + 50;3;1.700897,-4.837056,0.000000;;, + 53;3;1.700897,-4.837056,0.000000;;, + 55;3;1.700897,-4.837056,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;0.999743,0.021683,0.006609,-0.000572;;, + 3;4;0.998794,0.046948,0.014309,-0.001238;;, + 4;4;0.997432,0.068488,0.020874,-0.001806;;, + 5;4;0.997432,0.068488,0.020874,-0.001806;;, + 12;4;0.997432,0.068488,0.020874,-0.001806;;, + 14;4;0.997432,0.068488,0.020874,-0.001806;;, + 15;4;0.997432,0.068488,0.020874,-0.001806;;, + 16;4;0.998482,0.052668,0.016052,-0.001389;;, + 17;4;0.999355,0.034337,0.010465,-0.000906;;, + 18;4;0.999866,0.015644,0.004768,-0.000413;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;0.991577,-0.013382,0.128747,-0.004423;;, + 43;4;0.988533,-0.009191,0.150627,-0.005432;;, + 50;4;0.995744,0.045103,0.080265,-0.004060;;, + 53;4;0.999255,0.021677,0.031875,-0.001700;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation endAnimation + { + {end} + + AnimationKey + { + 2; + 23; + 0;3;0.179647,0.498486,-36.421711;;, + 1;3;0.179647,0.498486,-36.421711;;, + 2;3;0.179647,0.498486,-36.421711;;, + 3;3;0.179647,0.498486,-36.421711;;, + 4;3;0.179647,0.498486,-36.421711;;, + 5;3;0.179647,0.498486,-36.421711;;, + 12;3;0.179647,0.498486,-36.421711;;, + 14;3;0.179647,0.498486,-36.421711;;, + 15;3;0.179647,0.498486,-36.421711;;, + 16;3;0.179647,0.498486,-36.421711;;, + 17;3;0.179647,0.498486,-36.421711;;, + 18;3;0.179647,0.498486,-36.421711;;, + 19;3;0.179647,0.498486,-36.421711;;, + 20;3;0.179647,0.498486,-36.421711;;, + 27;3;0.179647,0.498486,-36.421711;;, + 33;3;0.179647,0.498486,-36.421711;;, + 34;3;0.179647,0.498486,-36.421711;;, + 35;3;0.179647,0.498486,-36.421711;;, + 41;3;0.179647,0.498486,-36.421711;;, + 43;3;0.179647,0.498486,-36.421711;;, + 50;3;0.179647,0.498486,-36.421711;;, + 53;3;0.179647,0.498486,-36.421711;;, + 55;3;0.179647,0.498486,-36.421711;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } + + Animation hitAnimation + { + {hit} + + AnimationKey + { + 2; + 23; + 0;3;9.751877,-17.324219,-0.896412;;, + 1;3;9.751877,-17.324219,-0.896412;;, + 2;3;9.751877,-17.324219,-0.896412;;, + 3;3;9.751877,-17.324219,-0.896412;;, + 4;3;9.751877,-17.324219,-0.896412;;, + 5;3;9.751877,-17.324219,-0.896412;;, + 12;3;9.751877,-17.324219,-0.896412;;, + 14;3;9.751877,-17.324219,-0.896412;;, + 15;3;9.751877,-17.324219,-0.896412;;, + 16;3;9.751877,-17.324219,-0.896412;;, + 17;3;9.751877,-17.324219,-0.896412;;, + 18;3;9.751877,-17.324219,-0.896412;;, + 19;3;9.751877,-17.324219,-0.896412;;, + 20;3;9.751877,-17.324219,-0.896412;;, + 27;3;9.751877,-17.324219,-0.896412;;, + 33;3;9.751877,-17.324219,-0.896412;;, + 34;3;9.751877,-17.324219,-0.896412;;, + 35;3;9.751877,-17.324219,-0.896412;;, + 41;3;9.751877,-17.324219,-0.896412;;, + 43;3;9.751877,-17.324219,-0.896412;;, + 50;3;9.751877,-17.324219,-0.896412;;, + 53;3;9.751877,-17.324219,-0.896412;;, + 55;3;9.751877,-17.324219,-0.896412;;; + } + + AnimationOptions + { + 1; + 1; + } + + AnimationKey + { + 0; + 23; + 0;4;1.000000,0.000000,0.000000,0.000000;;, + 1;4;1.000000,0.000000,0.000000,0.000000;;, + 2;4;1.000000,0.000000,0.000000,0.000000;;, + 3;4;1.000000,0.000000,0.000000,0.000000;;, + 4;4;1.000000,0.000000,0.000000,0.000000;;, + 5;4;1.000000,0.000000,0.000000,0.000000;;, + 12;4;1.000000,0.000000,0.000000,0.000000;;, + 14;4;1.000000,0.000000,0.000000,0.000000;;, + 15;4;1.000000,0.000000,0.000000,0.000000;;, + 16;4;1.000000,0.000000,0.000000,0.000000;;, + 17;4;1.000000,0.000000,0.000000,0.000000;;, + 18;4;1.000000,0.000000,0.000000,0.000000;;, + 19;4;1.000000,0.000000,0.000000,0.000000;;, + 20;4;1.000000,0.000000,0.000000,0.000000;;, + 27;4;1.000000,0.000000,0.000000,0.000000;;, + 33;4;1.000000,0.000000,0.000000,0.000000;;, + 34;4;1.000000,0.000000,0.000000,0.000000;;, + 35;4;1.000000,0.000000,0.000000,0.000000;;, + 41;4;1.000000,0.000000,0.000000,0.000000;;, + 43;4;1.000000,0.000000,0.000000,0.000000;;, + 50;4;1.000000,0.000000,0.000000,0.000000;;, + 53;4;1.000000,0.000000,0.000000,0.000000;;, + 55;4;1.000000,0.000000,0.000000,0.000000;;; + } + + AnimationOptions + { + 1; + 1; + } + } +} diff --git a/test/models/IRR/earthSpherical.jpg b/test/models/IRR/earthSpherical.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3419e807173dfec482eae5a5bf58c3fe1e976451 GIT binary patch literal 422120 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%0Dh!G#gvF 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 TXG~nN3~HYvq#po|AB_JGBv2r3 literal 0 HcmV?d00001 diff --git a/test/models/IRR/instancing.irr b/test/models/IRR/instancing.irr index 6687f4fdb..ba0e710da 100644 --- a/test/models/IRR/instancing.irr +++ b/test/models/IRR/instancing.irr @@ -19,7 +19,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -71,7 +71,7 @@ - + @@ -153,7 +153,7 @@ - + @@ -167,7 +167,7 @@ - + @@ -205,7 +205,7 @@ - + @@ -287,7 +287,7 @@ - + @@ -301,7 +301,7 @@ - + @@ -339,7 +339,7 @@ - + @@ -421,7 +421,7 @@ - + @@ -435,7 +435,7 @@ - + @@ -473,7 +473,7 @@ - + @@ -555,7 +555,7 @@ - + @@ -569,7 +569,7 @@ - + @@ -607,7 +607,7 @@ - + @@ -689,7 +689,7 @@ - + @@ -703,7 +703,7 @@ - + @@ -741,7 +741,7 @@ - + diff --git a/test/models/IRR/scenegraphAnim.irr b/test/models/IRR/scenegraphAnim.irr index ff7a612e0..1c6fd0ef4 100644 --- a/test/models/IRR/scenegraphAnim.irr +++ b/test/models/IRR/scenegraphAnim.irr @@ -126,7 +126,7 @@ - + @@ -197,7 +197,7 @@ - + @@ -213,7 +213,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -347,8 +347,8 @@ - - + + @@ -385,8 +385,8 @@ - - + + @@ -442,7 +442,7 @@ - + @@ -512,7 +512,7 @@ - + diff --git a/test/models/IRR/scenegraphAnim_UTF16LE.irr b/test/models/IRR/scenegraphAnim_UTF16LE.irr index 3cf28a960f441a449c3b718416c53e98a6b369ad..b22aaf4b7906af22e1cb74617cd2cd312887e143 100644 GIT binary patch delta 106 zcmaFzg=xblrVVe@Cikp$m@J^7H~B!Z$m9#oB4D;akj7>K4JEP7Hg;E7HcL6X@omlu zoFcnfB;SB#a#V5EBo>y#yW`L0in%3Yd3Lkwpl2_17zLc F0RZPfD!l*z delta 314 zcmdn+iRsA~rVVe@#Pt~T81xy88C)2G8Qd5$8FCm>8HyS7C-+W~X9SUslQ$@{Y&K9o zCB_L+8o{8y`KRqw79{RjCwD$1u5jQ~Sy6~$Plg~M^aY!l0o1rW&yWSX)a2_$)!1b= w2NwV4#V$43yRja-3{cZzuE_=4uZgr^N{>+04C}Ylj*m0H^m$0{{R3 diff --git a/test/models/IRR/sphere.irr b/test/models/IRR/sphere.irr index f21e8f133..1e548fee5 100644 --- a/test/models/IRR/sphere.irr +++ b/test/models/IRR/sphere.irr @@ -34,7 +34,7 @@ - + diff --git a/test/models/IRR/sphere_UTF16LE.irr b/test/models/IRR/sphere_UTF16LE.irr index ab42192680779a9f3f98321fcf9788a22ee6138a..d0f99a0186c7ad650da623e6487299a8dade9066 100644 GIT binary patch delta 12 Tcmcbjy-0h59oOapt`u$nAxZ>c delta 62 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 Tb+GLQ)@&@}ODD^5d-VSUxkI9p literal 0 HcmV?d00001 diff --git a/test/models/IRR/wal69ar_small.jpg b/test/models/IRR/wal69ar_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4723f9e3f376546615c7e7c6fb328c4602e5390 GIT binary patch literal 7929 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 literal 0 HcmV?d00001 diff --git a/test/models/IRRMesh/SpiderTex.jpg b/test/models/IRRMesh/SpiderTex.jpg new file mode 100644 index 0000000000000000000000000000000000000000..397e684346a915869e3a12ddb343e3b185c2d77c GIT binary patch literal 15750 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 pZnVE{-8& literal 0 HcmV?d00001 diff --git a/test/models/IRRMesh/drkwood2.jpg b/test/models/IRRMesh/drkwood2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ca470306cd6b18ae65e9d718cd2183a6ffa9a10 GIT binary patch literal 203856 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

W_ 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

t9NFC`n)ZvmTzNl_P+Bs^uKfK?5ApAc; z%eao$Td<^DO&S$+F-r^3QJaf=VuU&AvFVX1OU$xcyIZLOUPqinhg1V#4JtPoWnSo1 z(=Od@C0RH}7a_t3)Q04Z`%FRU?SgULK~-4oC$iLT#~>Z}$?35~Uci+gR|SwjN?mr4 zNp7rFm0@7N5gi9W0`)JJM4Mtz$uPat7|Fz_U6dXP$POa4$=3)%E@o>(Z#A)b81(0q4poDBRYqAW+mG(=UkFpsq_+0#O3Q{{Xz8s*?O0p&(%5?^H~YMB1m-ZHP$~ z!FM~Nm0FWt`{ZxaWqP9pq&Bm~adC4r%QS4%PAC|;r44`Ge@0itNT3p-eS2#Toh6Dy zE#X-=JN$JUl|8aii88)wPRN@`<~nDo9FAm`sS26`pbmn)E0xHOB^;e~74-T&n_Q@9 z2^5GLii1GLo&H$Ffg?(JA+4b;sQPadjIlpISxEo|??bg0B_ruk%}`FpOPS-0%k`!y z9L1NA1Af5%&sD)(hx1htsNGv1Ud}V=#Hyx16z)j)hc4L|MC?*ZRc|NN;tM6i2quk$ zY?1P*2kfth&o3hSF%CvaI=EP%kPx77sXaa}ys#aWH`GLaj8AnDd87D@2W_kNst7yf zFz2%(qiJ&-hID|;l1mXQ48Izh8q@i*QjJxh7Mg!T;v3W>l##Rgk($xhVjLaTpXFo2 zVwTWXw>I~WAy|LDKBKV(jY6M^TW!6v$i&C03AHq{gy}K6pbTabJD@+^D5X3xGCWIL zE?CTfENY&c(ZX^xQP!nF*dKgJr9)iJEYrj~n{;v!1wdMpuqSbnhyZ)gQ6}lGEv;pW zB~(JoB$eDAz_mYyLxzb3H)-5QovCWbOtcCVsVaVrm}W89vujg^2o~Ff@=GK)!j*<87KBrVa9{b8A)Vz&}<^%&7AzBTy19665M z`7B$xx|T-nZ;(Sg_{as*XnWG?lK!)Nz&f8P` ztd9jo?Kipx&UBLP#Hl23NTxn7xTDOY_k;(jAW(g zTU=U5s9oI}jlbCga6;s`h$~hf|J3u8MUCn-hQGc3?avhWM|SN@!#_^l&cmu@6J4Dm za*A2KQg)$V0ypu>O>vKNK8QKT)*y|i;~0fX)oVs0yD<1`mPFCps}s7^nr5@~mWyx4 zgTB@4T9SKVAaP$+y_$@AFv5}$QmwO8?0PUA0L1Q1Duj}=I6`QSc@8@U?Z}Ln2t=?$ zaS7YIdVrc9JqR8OIP&{LDY147r z1qxJD#E4;5s)nFyQ*loWjCqumRclpia})Yy*Zb43r};qO-+M}FENrmEAt1Kj2;H|e zEx%l#9rt8}xspWn6@XR*6p#P`Bgeqykq9dGw?3}HLr6yCiZ{$;Wg1XWx`G$C91^5d z6F{xXy~jgboDS$Hs}lrHi&B+~;|;nRccwyiQWdocm69cR%&@zA{50+;GB61(MI0*O zT|aXX0e%usA@+VCd~lLg8ZHt$SwxN!XWf*Vgs#Af^~hC}p=LZ$Y|FHgvhr(!D2Hyu zQ?G!_2YMB?31E9c6Dsb7ofKDyT2NQ^axez%O4~^t(k@67(?iy;!B0wbtwu5m6rH7M zB=r<38YDqT;0H~|P)-$Y&@2;87V<|>Ohe)eO^()Ot;qrXt|FBgktrHr0%&y|H5|mCfa<(TkMrLt;FBu}Pu197ePvY| zdvjA5{oIB#))wTJ5)RZE5q0{~khP`7w8H3ADGlmdkwZ%SJjd+jM-U>I(j42*da|e5o7DwC z0Yh}94J-KMtVJB!j#i4!K^0nKI7yL1vjSV<6zSU%EbrW?oj~xj5Qx1um5I4Pc=J)b zYEUtCV38D!Z@jj^lGp z@I_AT=3?mgOJ^nlh*(ysHF!03i7(Kj#+>()__-)J}(@ZLZs2emlGkC zJ|v?oAf8MQUHV`LWTUv+{c^>Wv`D`QbGR+jWu{lX6uVQlQ+S3jo}qOvsz@~^hQH*R zcE$%~Dk}rM!3JIi)Dz6=uhP&i!fwy|P>cziA%JT^B zWdU7Sngj=L_$*^TR@*5XEVh?WltXZ;v&4~z$QzIV+=cP&jD$wqlv*=W5t%gc9L;Q{ zQ{o1+uKaj`xyWNY_OzF2Rw-*c%`&yztzHyv2%FTBE5E<&;K@EAL(-sAwClTA?IfR^ zYRfrKQ9Bu9VMyue|u2~_%fx3P#t+fp>2_jlRtP!4p zxqP2pg%z^{54^$kESh zF>s|=sb(jnn{IHLH{OLEOqF^xBrG6qE5sHQRjKPtIMk}o975jC+2oRF5BT`CF&}8{+ZmM$wOKUvyN=;wVI)BEjHw1e{V-z^ zs#8iDWKBP;sNrC6S~!_VJ9r;#mP1wEp)!irJ6kR12!sTdt6kXj+j{)6lPi}dT@)uW#MG8MS$64i~&lG~&T-nZhmm$# zagclMwoXvESYi(8@780Q@uDJ0Ey4uk7vMD=RE);qp?zB|0dIL`WmpOU$!M$`I3ORh z#kw}xY@lk`f~5@b{ZXSX5b}OO)cUHm=oktv6BBFEWs9g=iE6Pb%2qXhi{S#RNc*4i zu+N}CK()R2iHVJZu>=AG2j0C8P4awEv{6M_MFfSd%r4gooS71e8`_6zhK=QdY;5&;%M{wkWh+YFi6W0juM=sY6{U!JNV^>@1E>m|JCzdypYK} z2_WPFtM5v&J;}^j0s*HyCdHj}ri3{TT)HYb8w0x<3NzYN5mb@)#_{Gf*t89 zOBAAb+Ps}q9s~AA(~=}o6#xQwjH*>oax^pqlh9vlHGbTNEMbc*ZbsTXqU5Mt?CZnxbXCD$wYB&Sdl%`0?U7kT{IsX7eby%bd zd94{3QoMhLRlhb#eZ{mbaT*y4$STM{s-qvX!kx}oBx#K1bN42Q}POOziDZ^kot4$XB~@y6JJ)Qw2FH^U-wTEGxz?{E53IWoR)gRa?lG{dXRJLd9ll)6VQ~aWxGGtcBL;8@&9LB+*98@x}QlVFWg!jo&9`qt*juCln90(B-7UIdp zw&V7Q>CYkwqkZW~Ek(q0n27Zwko-Ki6+dLxFO?9)BJLr*6UJqQ5tK1m;yXPC{>@Kp zfFia@OmyiWTgaX<`@;h;dTa{y*!`M#Wpldtq$$o)=2en6Y2*NvRpJ>z>s`3-glrW7 zbMRkWU6yBL6$>fo55w5+Ot5kRio8;=^wt%ULL=uQ1PxGj`HYDj>04}*Is_b%>O-r5 zNe8zR(wNAF34{|(VQMFaG`df)70G5sJ;IV{@0E}wXzZRyd-HYbG?#Hw+C-=-;BI>K z>%JIQPG~LIn^-N?W0Jg7mvRqNuuw%h)|=xyB_U4y&H7yWZN@}JD@I*`N^xGxh84rQ z4>V_&ZZ7Shxs0N$EDIKL8R)w=9}KTNK_I3oDR(;A$tYNsF(6Qmo3%%3cgb*zrL}vj zg)es$kg^#OS-5;G;=Sq)<0BEs+Lb$5B`+d8Oj$~-a~>e7_!Zxka#9KwXwY)hMZ5ko1uAzB zsA_vUqfFbztiUSMy3_38957yKd;&C*+N%EmS$Pk`3w#B8(!KK2*SUyK?C33_f;2BB zeR(92M##pk*Y;FqEcxHTm_DJ6It zg7a{wTkSFWa(sdiklhIG3{p!RLDS(-I+j0WsoI_LW;QJr=$6t;8}N~tErXVBHDEu= zsl?cj?_P_4su4&~oqiGl-|0C_?8>c>rU@6Pf)qys0PYAvG4Tc zWhxsa1vHvJRYws7adJqHN{W-P=-5nl?^{a!6_Pe43Q zwvwB6D24g5q;+bRU~5;vBrRzP6l|tZGRPdgObURK!+O-8vy&&e2v4m__c93@LF#VA z3I!vk-7oAOF_#d?_nPl~U~(BAx@8vxp`o0(~(VE~puX}`#`)0K9j_9Fy(1ue9OJBZ{9M`b+J3JvkA2~;+(CA(Eu z;$gsny$4#;BgI8&N+mKQdWb^+S~gv_U8#~Lkl3BgnNjLMgw77=224Hw0GNg`xCWW0pUORGJ$2AD$9SPV3EH z*hXEWGI41VhAB7Vc29E`c84-&H&QdSc2QdJ3|>(}nd z9<+o?rMD*%FQdhTj)0N~?ND+SQo0zGWNhiHNIt^^ibAtH`cXt0jOUr;cCBaz z-SAgcMMV^AB1C28+mX$WCO*`s*~k)kr4KccGV?N%EN7DvO$|Yy70JeXBAbCMlHxLF zW!qs|1wJFjxRPsZw47S8r-0@ro^!U$Se;n1ZvC; zY2e58HXMfh)G1us+cm>W6{~V2iJ9G$gH6aC7-Jb4+@h3Ynno535rw=GGCV67Ah(G$ z*yM=k-m15NM>L+4jp`L=;>*Yt2Xz!9jz$}e)S)E0LlkjKG_0XVuT%%@FJwP;vm;CH@?R$E)&eQMkSkV=F|V3o?EU9TA3hZd#yr#f-<&%|A>VOkgunT`2Q884O2Q$n-RVr4Scx57fo%`8V=`?C$ zk{4bs@sCZtKzND5K+44JP&5W7D<{5ldw-x3Rp6ON+N6 zNf;G!8+4#OSW#B3l}cdHWCC2WM=Vl1);Qu&7_Y)hD60w&=400_sw`Bci5A9D8c4Is z%C58=0*%08E7#|e2i3nMbVM|BTZm_xSY(7p>7;NuNf+B{*XhUt4S{JwNp&0YvzA~} zkZ8=ptxo{se3*|~MW$jnE!)#bo2=lo z;J>_*V&#jZU=AdAE!lsY84{sR)<|DWxQb|b5avW?Bn2KQe`w*5B0z$H$uo>i>%$>n zVY;{C!dCe98xjCKevGKq9`ISD_U$x}czsSzu@!KJu2oLduUx)VDT8+L!6oOd1IY+T zztSqbxc46T$dD+iYi_dIXdG>Y9i-(yD9B?Q8YrVz{tGE4=esV5d+S+5(pEsy`Y9A~ z#5oiWM^pY)a>z(h2u0f2xVySZl22GdVpVZKUYjvtxETpcVed!`e(pKri_;MLGDXBR zyRqT{Q(dXPWJH2_uqcERDqHF#2~kiZHF&y#wE*_Wn%*h%MM*L*r7Nkvj4#IAlsbdh z(2C_?f0~qEr5qM>UPTmx_h-?W2^>u}8`Sj3-H;NO*jij%K@^fdr7}f zWs{Hv045HyCB4PPL&Y#i(u=@>Ux|wETJ*~LfR^F4SuXAFBas?Fh2|3$;sb9|gJMPl zDg-JuVFjAzk=(0P#UgwI;uPc~9rC;B$tiWb5)0psBn%Z+*l{MRPUXPMWOhX=TM-3? z<+KNa8i`ad7UXy1@eTfrjJJ>_Ms9Bh=B^PNT#Um0M zZaes|^vj_u8!;hYNqd6#g$mxu z;g#|5n<=YRwXwX8>e^*M2v&|kQne$#2}}?|Kq`8a!r~cHI1kn;yp@;&KK@BNB>C>SRY8eKFLPe!o1NW-oq-Ay)22w1kmx93)5LU|E%z>=lJ6wnig} z@=4h&fvwe{xpvxTB`T$gqAwCj>{#XI_Y6Y3cd|nV2xeIbZju)0KFMC)G6oiR3A8=a z&HJFt{*m54MSd#v-n)#HX$4Ky<(VMV67e;! zLbW@B8?nniv3!xq8>u`oTuCG`j&uN`uElBb8jZeLP9R94%1LdEw&A%LT17z4NvS8? zQ!*wGdjMbm*Yk=+GpV?U@<5~2p$Y>JZux{r8y8{bt*Bc`^_bJ06rhmuA$C0gAFCsZ zdnQA5Co472Bx13t0Er1^_UtzyVl}35;ch8r|S^bk_8)~*n)fDG4**S z_C%W|jwr&A^GK<|7J<|;>OshH*-a(_(st#=7 z5lR)Se{b5#^8-Kx#WoT{KCdDcQe}+BccBhEE0oa?Wz`C>$ET4T>{-cVjHw(*rFW)I z`1vD~aoqedY62G}>L{!S;BqEE!)d;%v8a|wW0F>uDb}g#4m@%s)e+H9))r6tL(_1w z#JfB6{6}22bM)E(-82wG4cdg0io$nOyAa(s%6N$$_Ee(M#`kl2f!HAwVfH~`L$|gN z3PSs3M)g}_>$09kq%TgG%c4WAAeu>-NJj~W#mV^=KXq}GfCvim1UBkpSqN6*!+M%{ zS0FjEQFn$*wnjk2?vc9qni!JX*N!xuYGn~^O6*7=@AAaiy5y>IT(ow;K(BJiH5YPKiyf** zY#>?RWwrj3da=|}K^u=#e#MoA$De1$%% zBl49B@hcmC9Ja5vSp&@l2X6OkIJA3V>H44F$wm~VMM3^tl&Y@Km|fkcIQjOjjxjN>uUUK?8|XUfuG4PTdjB6doX2H$c*w8Ytg!PJ)Mi znGM+}ED(#)WpYhrky%ml5Hxg}SUIwL8m6CZuk>!p14E*aMC;=?0YZ zLMESSHHFMC3a!LURZ5x~aj0YBGQ%J&qV!H(fy0g>wo*{qI;^rhGu0%JmSrb$2Ha^+weOS5w&4*( z(m3v2UW;!4B{u{fiUHeU^2l=@X+}qL>FHr5xkYKzvKL+}#2RcV)4oo6_o#YeTlm>O#N#HiE zKkJ;X$mBXQQjs8Nq+6CQC6cHJA%^CJ{P2QrWFqZJSz`3SL}S4qn{XI6!djKz{H%nz z6oe+FI9+N+MGZLz)Is(?P`kJnDb6KB#cDU&fT;tfN7Nz(Cu>Am&vSEm zaFG)vtGMK)1!=d%Q<0DW1cZ)d)u6o*v?ZjNm88rVF&}nh4iXq{)}Lt<#%L}9x4ThP zRbt}3`7JiaawBoLP#d???a@n38qSYMRhEW~Sno}lsJNM)i%OS{_PSIWd^Z6Wa?Hg3 z%7RD$5_*BVV2HUH5R=N0wx&}_C5-wpzzn@Pb8YLlMW9vUG7|FdNJUE&vqKW8L^mR= ztc8NmRHZw7O^^nUxhvf{Lv<9fjwC3kbyjv$O~@Z$Q>8F<1yp&WUdWFAj1f1)h_wQ- z?b4Yl*$R4HtQL^7AeLCUDQPMkkmiL&Hm8m`36W4KrMH!y`73+s(ZbL27A50l0 zQ^`<}3KM`(S9+H>mNNZr0%nGwM_O(@@u3-PSDH(v{ZiSMSmKx0Vpd3g(hu^5GW?cy z=)fk{PjvNzc9MN&K>pZsZISAZ3n$u(6xml{TpzkAIaxeF? zPOba372>tnl6%)If%_0pw@Wik6}z}38px`_r~=Vy2if`L<5g%XI)qZB5u{FKAOR=> zq=I_y{4!7?_d!8U@TH_O7M2O&VkJs(B-gDD$1I38dWI!1p6(lXt*p_#c<`A=1LSk8AqpUv}deDPS$N5W#5#Eng zl3NTBNh0mV9EYhjYLU1A`{mM+0e}kE5?e5qSh;dV6?Z*J*nkI)LLlr4O)0>sZ4}&Q zC`t|$BBHy}pRXk^Q5zs^{{a8c^PCQkbj2HlGy#eGCWB$^zF^1@Jl%lit$78}x>TK% z8c`O%tk7+d$05VANH&+<8Jg&G2h>sk3$;M*4}87=R?JT~0RFeCr17l@lX3Lp(v=-` z^`EQ9brIzf8W|(42eHbbS4ENULro8-=-g3VWj;0E=*fv)gb=UATH-`z1*Aeq8-YQv z`Q&e8t%$0-w1A+AI04&{6v9<(WdwqPs)OMmbu{t9c_DfpGsQ0444hgbNvObiQdZ40 zl6v8x9+;PtwJLW#D~JGA{S~%&pPCg22->x#-95%MLaAG%@=Fk)AzO-ru<7HHkpLho zCBqA3MkX~zdX*IgymBTxrqQvVTIxAv21fWxKGk5qWmJ!!#g(0f1fv#WOb(!=f>vUk zD@HZt)Ri4FqB*ilZwjr0VPQa@{t%Lo@8_FLT@b3L;}ZKNuwpAs@|ci$?AH(`-!9!IqkLg_0Z3maC4 ze#XD3;%FKx(PhL!T}cs})H_uXxPaaIVT`IMBX!o2+gvn~P@skB%C+{`_r_qy;-hz8 z-6$yGxNr+hLag+d}5_G#mZ zp`$8_&{mc3ITH=7ZBqW#z86sF9;oGLO%G1EAtaEZnt$(ODRLQHaGfOL#lCBjIX2{q zMZ~e%lK~N`DB~S^fO^n@kS6y^7=iVG6eB|N1ywW*2o5~GFk`%&5(n%u#fG~mpz@pK5o?V{5vxJ}4s&=VyZW-5jUBQhgIaGhG zU%w29DiZN?Aa}XDff5VJ3cO$iBnH}~{{X{fygdQlENw8ovX!o_+T5?G)Fs1Hih<+T zrd0{-ZIKO4ZjW~2c^8y~JW~f{qf(uBp{CeGw%KVa)Geesyv-Wb5)taFR;mWzvFLK> zOVT~;2;CC|)BRH7a8~jVj3izjpW9JN*Lp5Mfna?p3R+dV302$~qne7_mLwRtbK zKa}LWP0_-Kxm(w`g)T~l2oy7P1Gi53D42k02GdES5n1{zA}q#kEI=d;w&Azh-zkZ? zUrJp zg!4St(z`~5!hk|h63S~;@EJIYh+Ewep%u8emCSyhr&o-Z0RTP#{{UQ$ZGcR7RFYU; z`sUs{Av(y0vx)~iMQcN~Z~%BgCYP(Mcd)ck7Y~YGjGwXx`901v`ihQC+n_pp%+U&| zR!JC@W})dybU4WRf{sXQCJ@U#%1qqlOA$aXxIb??5 zQUbNMp8>g8Jy$#%gwpX8+SkVr3-LIz))+a0yyhRl4Uv(79%(nx{F4S7$*hG;uGS4b7MrJ&j4GG`AFaW7X z#PQbQkS8#zjSxoMo~}mhIQtBN9Fm1qn&e!@fJZkzD>+65h+g%fZ@VS1rAw?Nx{5Od z&SbX*e!y_WiP!-^7so7^2XW1aM?cnIPrVQ*U`sNIfvF4NPE-Km7M_SpPf^<0Rsvlk z4nYHTC$o1^lb2o8CelOBf2zv-AZnjM#VcRsZ)~I;taD_g^$t(K0UYoT-MJ()CxOGq z_M(=-Vyk>yO(L_c9T@TyJ`MXr8B5ZjCErj;=5~&9IMt62v_A3iWt?_7B9}>N51}2> zg7T{ZSRKf&)ffbg($YHONzLh1kBf0%h>B5bzWGoBnRP?laWjJ$2h<^2W$DI;Vta4l zl8-IWTd=fOxg z!#r-vqBuaOP0szjvT%*_2qguot-z85kK$HejIa@gHRv}r1K%f#x3ozM1H>*PC65uv z$b@nVy}o9-WPzq3W#2zard25;0s&pc4F=1$7<1&MsUVC%oQo-){w4!@cB1%T65rgk z{{a8d^IR&AgdZW1X z=O_cR(b#n5-=~f^heeW|qsuB7V?LZD@~iZy_sL8Fx#ob~yurOleQ%A808n@zyBSBV zC@UqTaB*Z%t0z!S=h$|_H!8VWHJ8;03J?R6_CbqBBSjG1XKKkGQRJMOz-2mLuuW3kK%InzcG$=v8=*<)@hpUY{~aTJ=98g2e?> zl`YgkBxROAJ>3MIljAdY_-qDFAaUty;-729+0p4$~GSkx@#9+iZ-?Yv7S+ z8@8ElCRtO|C|QG40Mu&NErn2~B^48-^73{-{25Xv6a&B5o70s|je4;iH_PToh#l-k0W89{Xer$u`IYeTCFQa^@7P#lt$NF3@H9|tfK z?I+s~JB7=~(in9`TC5RVlQWq;MC2A5>xMTfMka=Zr+P8GbRu^dqiWB0*vkCB2u@ zSy>2;m`1F?t5UQbH#O}{uZMP4p{+EA2%FQ6NYY?ao3``>15X;{@pJehNN~}*tH}$O zbyoCaVoPG~&I!m;LJHnSL|bzy^;$_8<8T3~ zHQK$u%3Pd>Rv~+}*|UFIFptavB%uL&6`|g~7&g6=(F+ct3~1{q|n-0Gb>&y9ZnNWb#MX;JUxIB#^Lv+jtC6=uGX}`t)01K8v>d;q1 z#nDW*&J-H)MkE9$c3SVt{H%%FkyUA);^G-&SXL`|+tgQZS)17JTI4_g^W7=99@R(e9_Xw3az|rObZ}1($kwALbcuSb#-xV-lC@S9f;} z5tE2Tp%d@Iv@G2$_>cT+&Mb8~Mw z;~Ri|Dkv*fEDuV7*BHc(edBs^Hs zjJ+sFL%tZ0MwKD~RFcPH)ZFsOf=$p$5=N36dyWy9;gQ2Eh{T>C5=ARYjIeG;dK=R; z=`L(;o*6w;v4jVsEq}=(nB<*ET7j}_eQA2yG-Zgm5U5efxWCBz)hdxG6LR)WPbHjz*_1hnC*>IJq9FrJCSrExjgI zh8RLtLU&-Jk*|kU!;77)l;K#`#t3*y&}}am)|?62rkngjBzcq73EweqYbK#22_3vK zA5VxOy;5sKPM`2OO<)sHSa{6O+JXI25`p+iW7%PdlYT2>0g5=#KS z3;zH$WU?ASYf3USx3OIbMZ(DJv7MEXi4>v7AmvIGU`uHt;3Z{vJMT@7Bt5S!4fOYoz zaBQn$gd?jJLRPQIckA2=;!3F8O>*~X*V2}>1n>lQr90%J00=07=-Wc^xD7mXB_#V? zE7rLk$?{Jmy6VzNbs=#HXdeWT(V>78UTw zbqPUUNfZ}Iyh%ccRk;o5C~|NFgcPp+NKMQ^_(}@5B0&nhdLL}Q0Min-*=^Ed(Zs-_ z1v0P&I&MhozhjK-jnEKtB1v-^D-}gj)u7@#kB7r12>}P1BT#0VR=Ao&>A@IKfK+k< zl-s657@ie&!)|I+iFy~?8cXru-oyH+)+ZMMuQLict6quN(ZIK<@|Sm{<_zTLiz zq(qD8P-V88Us{}pM(>aNLK6y=tPoe+>U%$AG1x5u^C|ip%JFWWz^^*>`4kp zB}!+JA_c&83^@?hG^GGN{#h^upsfOVRx=WT#MU+Mw`$|C=BS&a zb1)aI$yWGS5Izz;wj&`L9+aN-k_lDo44m3k59$L-72J#>x~kiv&MstXp>7Svm8m0o zp4efvDOqX}>>L+mqx9+sp*YWJAaX=BvxbgHomn`ltEl2v$FAcd0P34eZX>vf(kd*X zX-oQ*{pBgxpR?_h#Dl+ZWK#V`Hy1KZ$UKe7WQ~T%7MXT4wIHa+bZsQ5g-W2QBXCQN zwmq^&JY7+Avd^0pl(`jRsC+%ChIPpSG?L*WDH$s0MJUQhuW)IY;y1fHS7t+HFjtU3 zgabyP1n;o!G8^#@^z=kVkhP2`%FF1h8k0d&(Ty^)PZ9G^L@Gko_WrzeW%OEN>`i&G zp`f7q^2078N56#?K~M=7PmN=n;FZ8-;sC8Hzm7)75wXd7BVdWv+A|nOCQ6s7+#a;9 zQzO3Yz}X8R_3qj^0Y~O&2~or-`#|=~fvDJGcPN=%Bb$JnGe)2Ub|+vf_JI6y5!`Y~ zRkDuW^5Q`oJaYoFNV|m;6xjRZW=ux>ly0p502EN{qGT-_BklO)M>E`%M6k~gjiiVq zEWBlO-jwKY2?NOPk`=8lE6O(Y6VV}7et?6}`-~Eg+Mugh8Ewb4__D-+q|R!Ngm(wNM8=6*Zgqj@4kVH%fFIr{tyPDO zIGW=UYu>7=jV**#4&0lRPEW)DsZqD#g6c_9o_Sz~*fdHcm3XQ#s0_xZao&TjOaMti zE4?*>J{$lHzNBv>RMejVLxSy4$@P`IiC#f8vhofC1**4Aj!4xZ2P8kekq}iOq-d>I zAQSD=e3k69q3N_SDmnVa%eW>mD5g60HSPXZO6>OpIekWg;Uh@Ga{bhcK*Qqd#Q0(A z6`Mm`fx=OZhmgtq2r=e=@~ z$tanfsY)u*cy2q>`SRF`2rF(PhUVhh+L5AL{7UWKqoF-K21+D=PkIW=n<-_Dqq`y^ zWC$RP6HufNhl#JdVT`Mikc6IoSFdFXGdlBFA>?S;ti7uy+))s)O1H}49gjcp^qWh_KuZ_ieYPSt~m+2)De7 zFG*vMg364fgH#}sPQQ*;AWh#!R+q6Ag-B5eM_($70IP_eo!iYBWl zUPr%*1p7E*D0wPv9mlC_JXaGm)4I5UWZE{M>rvy|DykxxB)U`=7RJ^>p`}?!5zxuO zTm}FGx4vI84Y3L2FQ+hL@pjAx8V~;pvs|zPf|DPFm&dX8)Uvq)(|3FTDv)s*+@nKXj-4M?S$2D zxk8Saslsm@DI$2lRhFL!RsR4ec0Tzjz|w-On#hY(b1?M;f{5dOHSh-_aol!WRl1CQ zVQv@&ENcwa)~>y%nXH6 zP_eXg#>+m=z2X!AgZy$wW3m=%7Jy412CW9_=W+*#7{XgA3)%qd9DDExX%O0lM!Dps6mGC0M8vOzVa z%vQ1lD(fj`D_Ze2s1ydZ`Q?H@lu`oj-6XqJl{pf_i&KwKDx_DS%VR1VF(Y&?qxDs| znWHLR02P;qZiQ6zu1_7%^FgH)NhG)Bv6|ojh{tXK_wm~#NC(Iv4G~$d9x^B@12AsN zH>Gk?+BSjBrfxRVD~2lW6i3l&Iv!(VjcyhH)AMWE+*`;ba3ds_*Pp%e~kmgZ<@yt@i$p_9c+9-z?VWkdjx)S=yx*t0DRY7iQ2&A*$zObS9E zqDL*fat1`@RbXmQ5#V}M$=~P>qsFBD9J$ zR7Q4R+6+&*_R4^=OD>3)fRP)S37Q*^Pl+@I0`2H zNIenqddQK%1fV2kSV^@=9gb2cn<0`C;>uw0(k@b5GnesJ{%@9D8IJz|rHKvPM>W4B znlRPi!G~}*Bjj*IiE>l2VQ(aNHwu=7!mI@iHmdbj%A^cOt9E04Nvv8>0z{aJVwZjm zU5~NMbCaEVA7(@IGBg@s8kw)&OxB;@IS_!SAf)FJruI%8wD8YKv zleR>HNma32`qvTwS>lmR3NhmteY%0YX_7IZwu+M2d`MZCMxe&P5C-574^O8eB$`5M z)<#>9R!`iIg=4PV!22zhVwD6CijG!Lc|gpFp%Nvd5Fe??5$35~)L`DC+leEPNTbz| z1q!{@YhJl*PTQclKCuCvRCxN!)%QC>=F?REy#j- z#4N8Nr>U?sCY0W}5(R;2LB$km>l!Y^hOJL3gH5V8{{UAkB@5a~rM;2;66szcKmwqC z(=e}m6aeO{q_~O+ZHt)S)oOB2wNqZSHN*?GOCz?LO>#+RjJKqu#Oi(#L%m4f@5@O7 z8!@fhn@*nMQzCPQPD<%tih)m2zr~1{0cl^;kl)D--009oqIM!5+k!J zvcFD=q@30jdt|DqV?v;AXjYrx$Y^ujVi#MRdv-~dI+rX|A^4PggN9aiwHqR3hIy{; zBzN>?C>(|*x$)c@gYf*a5g-B7B=cLLYOF4#jvylvRI?qZeb{8PW7^8bN*8y&rOA=x z=G=&AkRC#xw5KH)P(dl4o66Sl=DI9Yq90L#dUD(iyarX1)F?6=BVm>8n97hc+BBZ1 zc5294QAGqA{{XF(k$Yb3o$$#O%S|A6l)A!AW2!E}K_Al|RY-JPEu+0^h=sHX32@&T z1lPd+7*6%(RWpQJdg8Z;Az2ZnuQJ4y0aM|i$ZuSkCJ^7oB%abJzObA`(aL~RsRRN| zat1t)B-&RD=wOgLNo{a0g)R7k+lmSg+Uw(%k-vV-QyV=h=`QYlX)A6h85wajbj659>G%wz;Y zZ7)dUxwm@@tEnNlk%{2-6bvg(`(>PsfP|w@dmC$r;*tlpF@p@R%BbWYg^hbNx>VqkM-Eq|$^zQRa`-4k$ToN|rr##Gy{^+DUGx z#G$PVuGCKZj4_Y_N~5AjKdmH{`zsq0K~D^Y*rchuN`=`SP${7ex!--U*-+YyGmAkd zFHj)`swwajy$`le85c-Al-=X{thU4Ahl!CxP;F1NU$?=5K5kdC28&@hW1 zBq*xI9PT#3Xon+J>A!*84Wn8R}=~qiq!bF{c|P&L~qHg z?yn=f0x0e_UrCToXaPL{9r6HOk=~o629+EJ;2AhIc>t8@w~5PglUp&0id%`HmX4^R zPl%Q@C$$HTNXm#sKmXM8gpWM)$lQH1BGuNERwL*3a|{3jut%diZf9$gFQ-;^r%(pnKJ1W{L<(Bn29e2GF8wnYjMJTV41Z*g6P6M= zG4of6Ws=M+q(|x!RP+>G=|SRq(XB*|Kx%X$YH5O8=|bz`#T82{IHwcD z3Wn@HSTU(Y$`(6mS(lB%NU!O&Xv#nz2_3Qnayyc;=FmwD*Gxn~XzHm(_UdrPbU@~$ zCE|k9ly6x%^Pt@Q-Lmexu}pZya)M%q*IlF`Pc8~KY8a-{Q0WXag+_AHTM~v|p^*Oo zF!srkNBPKAuzG4OY8@0(s&@zHk;pwZqndMXc4dLt<*TXV7#+y@W;CHklVB?~32r2k z6K)EUzrA8AHt`s7fG*HfU=z=J>f|X>N);P}?mP}i(2Dg$pqaI}3sx{AYK|j`rr&-> z#{o}NZ`Kk=kRl#yRg|#m7k|egRGUKj#xPW>#HifjE(0l6--+(0EURL)-bl*PBr%Bj z)JlL53I6~kx3BqF@Q!x2*@7kYVp1KFBGN3BC*tkwaB&`fYf6?jax4g1aO)rxQ?XE@ zlmt_iF`W10kP|qX5fF^r0Q(cYHpq44l&evMi~Z*isWo;LA=aHJHsmt+A5SI+nj=e< zT)W!|1b(Ly%tEmp_9X3*$UD*$^*GW=BZ(XTP4MMCdJJu8e2Zl!mpRV^ddXLjlU zAa(+sHo<+|l>)KB1IA*EE3*>vic}8We_mN+^Fqkbypy0{ZYvTre+zKuUOo0T{Bs&J z49H70i+JF1APVpm;)*CkPzsVk>z87YKK3#QceY!SJ#dJt2;jVmv-dR^c({3YqOAdQ zAQGqUxS|Cki9A}HR-^dk(HnDORf+ZHjf8%bU^Nxj;Go~C_~bbb^z%cvtMzYIILaw* zEL48c>q_*=in=9_L|wFY(=(x0hGVgIG-|1@ZMVwgNb?MW9{zt?>RBUhK#l+~r53$O z$>WUx3JKkQoArc-TeVeWkFQ$RlppJH!Ip^;Sog1WMuU`V{*X%tYSb|6%X|Ruza*pC zBQe|EKB^@W;}y&`+E#H<+UjZj2AC)Z|SPH`c#!-08t!ZRDex;0CvjEX#W6Jm8OW6 z;SuDCqAnNHX&AS}-()g_`w`_kvO-;I7LnaaX$*2sw#3m?(VCl*I`sZrvM?lB>Vi=k zc(K$hr)V6wRjWlK(`6saPNyL|i58=EmbSXD=(!AhAy*-&7QeewLq-`RDDfx;nFXm> zt^^T=kv%#qEA=3JLx~)MitgD#+*>4)64uuM{v+zoyg2uG!ta@_ol*kSc$z2WN>F>rRXIX(E$!29{>N8P3skgkKwW)^3j~_lQOGIwBnDiZ zCA}b`Vw4D^vUKGfOHem{HRwSCwEA)cbxNg$xpyVrJFyWUMvX@4{(oyDGw?`5X^8wT zB#JN(GJ-nMfUixwFy!fI2;nMQ+(#S6egrZz5Ps1#2kFYlu#_ZdB67?t>PRRE-k;~& zBzII6sL`#&tmy1V*;P^&mFZlbF|rD)E4hTYq;b)>0&BO3$akgJQ8Bs<6f{$*BB$a8 zoxQR#JA0I>gE+B6%yJ7x280pgzDI5(^h-4hd1TT8#>(O_?9v~L;XNrzf57GVN9@N{**2plXnkT>V*M zRf;Yg*;o~7Ga=ijT*-~z>PbKY%9Nt5Iv=A92-vBA|JCz^rHt%l__(5-$PU|lJu?h) z+1M1tC37rtOp7}rQO4?^9>5;CK^sunngAG8CZkbhJZaH-*0nqBm+xVM*oDBg5t@ab zK&wN!19EVhzjE|cl?WFT1H?l}!iFRgdhgdF4WAV%$Teto_Q{h-RFK)djYxKx1w@JfRWh~w2#hj#&ZnQ>HqO^0zuk^#iV6CCq147I= zikFpBdQk1uA!;%Y*@gpXJ6p&{g9zoLOFFU&*9>HGNL_9x+7;d z(OSf-Cm7hQA!uo^+%NjQvZ(NqSsPm#q^&zbj2IHU&%(SEbzzb_RiRZsc{FlQGTXvQ zSmA2&V0PtExZ5Ij6a|#8)~%T=AeCM-6kh~!DXAds@pZw5UZNI5Wmk*RvbDOMNr`xZ zsX|9;(;^MXfS!q(+gjT}Smz9>M*@`x#-}JUGCPJvK zVk>{)VoCzg--l^TL1rJ{gGD5NGWg}P5#`Z{wxotfmF14(f~g8ijwg}%_QVhc5VW7^ zb9!<*7(>D+!bs}MSdZhFnMIC!wnU@eW)~LD6spPy*bTO=5B16fb}Y~}{{TuRSsFKl z@@5L4lw-Ew<-Il>*rGKAoA*+}#z|3!3ik&gjE%uek)@R*V$ram({VcCe^5wKOQEDo0tu_+_J79(a9 z1BfRG1W{B)po-gY!8e9%Vd)QTq(G;%2?X%VOhW!kkJ&Q?iHAWSpEslpqNpuF6I z)$87;e4T?6-j1t-s-23ogqH;L3g15*X;9aNm;25!z<3@gwBEk;u1Y^@3v=5znqd(IA4V9O zQnyd~vMkJzEJV|nFj!OHwn}zsLb9}iCrM;MB|t7f<5GK9BCShradl($yEY9ZB#IhT z@jHwlfM~5TyO)yYUq+Ih7r^3=uZADvI#kg_1G2m>Ly5xhWY5OQ=mK z*+J;aC1X$|0tMtGUHXCtPxe_Un+OPth@dhoaz;IGtXJy_2vx4(O+^_O`G!DW*pi99 z)mnFv05y(^^Qqz-uEK~x6v#&%B$TgNv=BH*n~~Y(QVNtb8}0{Ow-m3N83kQgeM{KY zTstIa(l*6;5GzXT*&JI%Wz7jZH!nXoiDu%wgC%)!<*^{-;y@hf1TUKEaEPXn5?-X$ zNdxvk>5&i$N*>`Hz>%t~uOo9+E^EY(+6JBSaXZ=yB0Jcb0dNtcR`m@k7j39J_*Woc zQ)y(^yyKgLQ=5jNrFPg;-!cR$nA$eZ?jNi10#JDIkP3yT(bl`32sc5^kfnmsi#Vh zbCRM*K5D+&TWiSxxJ3q6^wcRT04A(Ob_4z;f#jz^-9q*wdSw&^Roqi_-5(pi69^d5Ta>DnuiA2H{X%^aNV{XoP@GJ-}HV2J7 zI%H1Uj%iJ_t_UKE-Gc~3izD#m#e31%)U9%<_m)8kc+uQ7(kyZiv=PNZgfXGyqk3hL z+K^LCJtX}jFptxFf{7uKPZB{CAd%Om!z+>5A$-?s^;vFSGZdE3S&ME$D~`1LRR*|$ zy?3pmA%<&V1kqdvwvE}#@&NEVf$lfJP3>EyFKO*(y}FtS<+ftH!txCp5x&D>GRhze z-3fxnbv3+hlR1XwGSV#MIw2j!M^9|7z&_-qk?I$bNYIB?wsqq3#WlR>{uITJOcIyjC=N*0b09}yg- ziYOmzfL^~wOzwoPR%2~eQxKe$paGEa+|_GZoVX4B%u-oxW0qu^D~;-;1MtujO}E%) zNRB1;1q1wQ>;TQhC4s*7J#qS*}?DRT7W_idW(J^vpW|I|O`D0cktO zD*#WVb`@s!sjtlCMD8py9FUrdxVD6{kjTV+kf}!S@yX-nQ6dQf~>U_6mXdlJd%yHR82$x;r*g)8)A zrhvWVk!_4*f`pZ*QN1@902Zj5D|fg{R!$MIW&@9pP&PRU%B>(;s$5&7Wdv^5D>XR) zKs9P{$e5Gvq}l)>r16II+E)Rozr$UZ$1T1^iZ$)gt`QnQkir#6qZ3d&(_m|riEZXt zQZi=xw9zoFD*+DnM7^$3+2%I&cIs`kl1 z(cigBw3fxq>@FGJyyFTv9wc@<9ly!QiE=AQXl0&GB-}R@MOU{KE=cT446uMYAvcxh zsD%|-c4m16O<43CYm`I|Y|5SVvpk-im?MlIDjFqL^&Bt)z8hr15X!No z%!ojZIDos<)cgD7`YQAeSkQuGV1ZZwNCUnqp>-TdAc^Qf4Oq#j1%HlCCeT&1+lELA zD*7$I#GJpoXB3qLLzrFPdWC{tP{{U3~01UVttT90(QL~w3=D_k+jY&c9 z{gJ<1ouL_S_tyu}1tW@LizODE-}wvHoN^KXZjo#3g~U;dc_E0TbCroCRxSxAZY0pA z3DMulA%3@S6n7Mz0xEQg&eW##Df>PPk;F+GEP@wTwYT&ZR* zJcvvsK;uO$uG@pQBCdxuLf%NM?Z^j`5V4Aet5>P}^2iUh1sDu(VLWg!4aE{xZicH=@{Xvys^XQe)7vlN-Gw7G%ZK{7w>1!!B*<2Uy{o=emOI~8Q7a_5 zgiK)(`hf!gX+i<Ps_IU=IE{IE~PX)6yGJGf1Lqh`=$qU6rX`=YA(6GEH|RY>l;DP3@vF&i=j1yy&$7 zf$6wEvrL4HZ6#Cd%MvgjivR?B9bNp zkGTWwWO2+ydy+y^aWv8DFtmV6={E@w)k6i?lj3stfx^S9AT0zJL4<06qWS?oX)EbSygNRn>6SWxie&awt)xAZv|RX!CzXWJ~02arHR!EbNt2^AIYqFyRps})=2MySaWYsm?zp5j!v z6FeY9pu0q*5C*_L;I|`{P!!1#q{LR%8RV}OT1g6lxji=hpO!-*-jWq(5hBQ5LraAe z*^|GUnJwwMF%SWm@mY;X9pn;!gZGS;WQK--0lOC+ zE0COcy+x2UvdcIwq>1B_G*Z(8Sy-^C9Eb<`u*iUZ2n%j5VnHOcxJe`UQ3m`+O8)?@ zTrr8{6qKIs868m`sEmQ5bzR9dBjP<-kJ`)PSP+7HOM?-*c!`ZDvc?zyTDwpImI;fb zQe&t!yl}-EM;T&+k*VYlT9P_tFa(xGE4{dAuhwg3DF`dWoVT4~)D8^MT zNsR{+(jrNz$sS4-qeq_V0D)PEEXuo;RTZPE1xhh)QUDjF8kt^X#mjj;v?b${_m3%dsNR(0U!M5z0(b6PrAuh| z-;P9+9bJ=<2Az3wKguvj`cgTfB8Ujx&`lU^<8}as=erVV*C0;)61L<-mrwvp&GrOp z#e)s|5y$Ss8=|Ejrafl3Mp1Do_@ZKX5Idzdp&1N=VbLK}!&aKw+CD-+7)IX<0DL{` zwhQD+RdlUB^5N1-l992B=}4ocI#hSaM11gZj1rnEQsQT zj;Q2Ox3>2-mrr+WiqXFoX5;~8>#+A3TnLb&$n1GH}lLyLdmWDO>>MDqy|(?BYYg zEBaMF`~k;tdt8Nr`jixG{eW{w5xX^SfP!jp)K(i05KgXC@@5B zO({#RZDp0GMs5)>3lKFG0Mzu$qcACn3b%Ir?U=;HBmgYjDmZ{Ppg*r82~pihQHst; z?_`{VE5izu0k;p>p5I1H%ox{sMQ)F`MdFgh13&7qGCBXKpMN9&wir}NIM|6ac(7P zsElKx@&p1Z2HbvF#MLb+#|-|skV#0#!$LPDsj$gdrBT!(_2m#M@cTtv>}n6=lYyaV zE!p~pHn+Iq#l9X@0*%{ohF#%QFRe^-K_s^xgN`UFq|jD}l|kDj6S3I^FSxgb9!K@i zBvKTHNR-o)Z^!;_%OXk@?q`zL=@nCohfoaylj6(RSN2O}K(M8|iDI7JK1oJu`fZ?FW`*8Ls9;O>Bd;U39ELfa?Ia|cipG`(+7425mRH}9ZP#wx zPi(#)Rh9>m73WowBv#|Yj8Zu@YK_^pAG4C-MXZI;yYnq1Y|KQJ_(e?tr&@6skgDFZ z+Q@|h29)}ZA6mNaV0^-Sg-rh>7+ocT&!)}o|$ENM)rZ9Um^Rkdw8Sgj|2RZMH?`hcif zj-ZXs32_Sv6t66H>2BI+c$gOTA~GL{t9ArrK{v#{O6afpK1kg}jRMx)gOEo3J{*bq zz3J$HXyg(pk(yO@6HEvsr*g)f##v}&V9xS1_JfoYq+A4t;!(&|!XDJ$F?Qs6vt4U# z1hW#KnlPuKZroxK@pV?CF(ctFM_utbI+djuW_w$5$v>w$p^U-F zBnOH9UZkIFkrsI&M#E5uG~S33T&N-aL&4RK{6@zN#(V8GmxqX0d=Xd)6zz3K=C^($shtiroRyZw_Ig%>b#XSwt`FTNgfU}xF!J^l!olURRHrua2{DCq^zWb0+rji$f{AO#PQ#} zFEKE21$h7!hb@-B`=A7~QHp8f{q52;Hp68GyRS`#Ta1Cob7D}F%x7jMS7ZxcMM$V8*nBk0 zA}IwOXK?}1jkrqkG?I4!QL9k3JLOY}|kea;aTc1`YG6@1RsUVPPLKqCQ6lhUIoqQ#^fh38PNfL&V zBtP)LV+sd#Ek$hCHd2(5CzVGgUW|T2#|f1bQXkNnqK;V!UM>*UwcoJGaSNb|UvTAb zB{uQ2KAQ1R)Mhm_-@^n(+oe&Uuc$%vfQ%|Pa>H)5A8Q8^(i}(wdUDm6ClyNV$eqv2 z<&&=DE#$OF`4u6L0Dc|+0LsN&vRo{G970Hy%M(CNN4_)_e4!oQPe>ICAJQ9FZOun) z17%wsBbmdmA5l3V0;|%aV}$M%OvX|8Dc!(rzyy8xZBbDAt8X-gdGU2v(Tz_&rj+)` z8n6-_Xad9=p9V%}sOqeCTK)LXnuXVfNQ~OEVY=&5h2a;k_4Q|b55zhqeKcl*o z*a~&ym0^`^MJ7Qlmr#-61_DtLfO#Bp_`TR}GVu-fMWf>vZGKW_CQ_l}3ONclQ{%@g zHN&!cre2CcHQWK@ce)GA!sSTXyoE;jRoDmlsY7aZ5jsIEmp-}S>5gkjTAc{-$>W*d zYEl&Dg=4+4QpBG~GXTKRhQKft_<+I=#R}QZ-53?}#`5X$-bBdG4;e^e;nh!Hi>3f-R9B)lIg7Lj z9BnbLCE&Eb{j5iL-z+)3Joxd{ph3U?_gU!usYBcb%?1Ogb+zeNU0 zG-89z%V?q9izlfgRgv7XkSr;{ff|Xkpm2T)))n-#$gYc6>(}}?{DMBV^k!|Lgl$laGEMWXfYt)|k z7>&S5TC9bY;}6ZZenPyM4uBk*6$y{fRpv-FA()NG6%_ek9Mul-ePJ!4Bq}id*&>8f zuV1usVAYf>q;lI$A>ufg!l177=uX}6SRpED$~hU{sNy=Kc07#*JK;O4NpBcHj#mkx}vkB@wcq529`xkp1kGF~X;*2fz;5ZuG?&eI%ek zY_{x?D{(SNNMg)-tvZ5mM0K>3p6cl*yfCnM;^xjzaL6e{VY#kaBSDHV!=_1V9Eh^A z1I&pkWKzFqEkLSdE>@k8dY!B)_mf5Nz*Slx?Yfo#m8CLpk=P)s-CNGKu%IgOy}GJy zOHgjqA7|*u#EbZ(rE|{`G${mzIOZURsQrOJ#O`U90p7&|ml8xInpUKYtZBCHIYS9mm3U?M#WHC@Pe8@`VnI z$pZfJW4Tst{^KNM5lfodIc)hyFfyrP^{VW9R|gdx!q&(uR+OVC3&bDVU;y#=%Oyw% zyD6_Bwv*ClT7nz8)8|aCafv&m66gfJl1h+LK~_fC0_SdBdQ+woS5~Srz_79*HI#YHlDOYv|f|cL3Ym+EsmJ1clx1!GP%4ruaBVuISCC9G50Fm#$gel$HnsO^;!dU7d8+VEXYTS&^a zw7>q=oLdL}5-cu&5;M@cWE_<#fr~II*#BM$$s}GY~_$CZHNN#(-hS zOt(CcHg3)~x74mCypG+KW+@Zf{h-g%zsrV3;sCW%xk!soJZQ^s&%_R_+-NM%H&ZSkacHp56wAkw(ux+nC_dIp7^8L&RW(gLVzrKF=Z-kYRW750Za1JE zYl9r@)hP&7i6=0_10*bwlC42kBc|ggb!4G@cCGq5mBqk#(EKV0Rt^r}ihOD?8G5z} zt&nq@XxpCvr*S1U%c7m%BBFagNb2kh`%D|DrIvzmnTAYdJUCKEj zqx6GYhD9;C4D0({X_Gg)t4t!2Nf9bj*C&@6IZ!%OWJcd5Q-z^79A|L?N61E5c@TSY z@xpGl-C8#8Ov}u2Bd%xgwD986b5GIR;Vy2gksSncWD4^3$ z@W>k7F1LuhuM|=Sa~bL5UBD+98WvP5#mQjwpmGofCV;oZHm|o_iRWdLmfkYVv7kTQ zuGJxlJdHN4_?dU2mfr%Gk1-02jG(9>wMP9n9k9cdDO<)<>odpAS)7!%%kQ$_f;Uu?+OL1meBFq?&J{tD~bjm25izSo1Us#dmLvGSW z81Y(1ARWlU0j;-E)s@@NZ*2<}S(DU_Cfo{j05vemG)YiXCHmA-TbPflFQmuRknI&Z z@*UfJuVZOc)S+qgdpn5B85x_m?fseov8Vdjz|@FIg6zqC6Oscu?wZe+)o58DOlwV$BOYg7TdmC zjO;foN(tpfSqyGc7N7zL_=5pT@jI0#Ctreu-$Yx#N)g0J{;v*2N|8;;JV@>KROK0} z%P6MT;%}<@VVt~-su7P8d(;v3X_)W=*^~z>#?)kv;R{0qe-kTpC26x|lsIrWnS;4hlq$IcjDQe9A7yvJ7}rFSp>o;z^O2(_~lT zquA_lnI1tDyznxH;seIS#@$nGsoQ$@rVfgvBAa`62w6xkB2}A{S9*5ISmvmWH5rLu z3j9aYui60YSmbgjZtBfeHjd#+tdfOE!~9-6nx6fz!d>0ULrkoTC!*YL4yobu~J6Be5;b?NaU*GR=B6d#DHrV z>0ceGT#Ztw)fSSz>{t&`0Nqz%u{|q{A;f;U$w zUW4$)s49{_)?qx{7EVPc0VkK2u-VMa$kP- z~$McRd=03#aI3f8S%xqp*_HcFK^rIn(R26AmhHc%Uld*L8m^+GXW zOG|r;dx}hvQb1OMwdj5Q##T=e1Ty54yli0-h=4|7L7?m^e(cBxdSH#W6|iX?2NFVv z)rbeTE;(Gjq>fEb89d{fk(6`@2if9w?bB>Q?o}7$ZzhT$tSHnWYAN$O{W&4X601r* zyQRc#p-R+mUHgnTdn!9cxPfmzISr~w*LEQN*K-@$j>mR5g;{RVht(} z&nUzVvyzCuYnWoJg^MK-kHq9sl-L@KJQPuC(HW(^C5)@B5(5|$FNB#~AmG6PfdrdT%ju}{*@+TKfhff02uC`pltCF@Xlnr11HHaywV zFGGg*KT+;S2&fVmm4yIrh?XP6A(Vs3F+)yNt;)k4E!2f_pa8O~RPraN{$rDmOXh`l zc;=oNC6FZkkT9aPR-o=yf|SUOfuyEZ@?1y>;Edo9u0S;ha4I&YR%kLy1-0G2sUb+? zjGhwu2<3@-(6Jr^F5(6(YjxKTs4e8TGrKjj1xF40O>sG|)^TS%-6ZLz5U@9a)XZW;^K5^Zm$kO?Jsfo?-v zlB%yIH#|t~g24GLB5s%+dTs#8$Su6pHQ;*G50~v^2hfwv*NZL0Wh9@RisCd>9-UNf zRZVvz1Wj~OhdN|8ce58H3wSzwEhu6uLHsgaA&B>tq@Kzk_fR@TBohW`{b!)q53|>E zmdxyWu?YJws>gpLRjbA0C5J98N}2`RVUdLOYYqB%us90UqWE0F(F#@#I{26+td*!6D%M%8iBsewnhSt6qK!P zXo`LpnZRFG~Vn%y=UL27r$Z}okDcd6wL`mjUjo<&$ z^M#o_h$<4P>F@`MVb-VLF(&K+ZYQmaaFK`Eqf_>WRRj#9ht$sYLa9Ghm`=djur7<) zoBW^UY@bnF(1)^s2Kvg7>W9aN8g430GIKo;0<1DzCA9bG=&Lgr_`32WF{uM;P+%Yu zBA+xIj^MN=N*I9vig7I6a$t30s>r`p;EG*piOq>nJM=jl-6*j%QBMW2aU(`Rjnx1E zkaPmK->@Cn$lpl$dnp5K2u1g>td8kgVTKX%Sad{zuV+W7IBx4`) zl^H~MNHx17YjojtI^30q)L&dOf=E;Vb&L<&{%kX$Tl7$hjex#L;8OCclUdjn6+aSF z;jb^*$n@PRn)A&ew|POf-If#&$OUbxSGW4u;;rj-lIx2|<+iirjVvopZikTY_?d?+ zM5vV^J7{0fg{R>pYNZk>02BkE*wZMz_GW|BAoVyiOw+qTA%Or;LQ`h1fH^1{`Jl1( z5(`B)5Gy%lSgwPTc>zWwtq&FLnH_d46KyGdSz#*~{n8#Yf_Ro~s_RsROp#b;BLGsa*`Fcv!tvsH)6B8;!gB;4z}M zyxS!L#;T++PE2=hBL@=Fq#m3zvlXnYDezN?G^W+?z;_C*0GvP&Ic-M2DpQIm@h1!rR@*?VeLzH199&e2(C#VN;U!RW*~vZR(X5lJ@sf(8lCS!;+bj~G zg+mwBH2D^5g&^$A6#9pn)`WQAyF8UH)ZRG%0Mdl)k_gr|XC+X#W4BOp$af&Az5f8E zY5U7)=9Wq!xP6rY6T7j&KtFXY2|%@_cm1+@oS2POqRjlruH=~`sRR4%+Wf<;;p#yXM+ zQXRg~uW^Dlg0?XHBWD3Pxe*!?s?_K~+k8r@aI|X~#G}%Ug=1i9dDn4F8`!1jrD17! zvLIk(iT)6Sbu{rK4CE99Z0^?L@s`<)VO0sGP!c+jGO#YUN>5O*MI4F1F*T41@=|(% zm-S+-kt9Yav0yOoyMLC#fnhp`rQp$njaO^wYVhyLsWA z8Z*<7p#i%PF|DYDRJgH)%R*U0Fy|8i@VCi^2+Z?ZL+Rd=MK!eSr4SOo2POn~HcouO z2noKLSM+}tnl|T9tXT9OD%nK-rel)(co8k)p4NC-B6sJ{?D3!^R8-?5y%3-;OUhi@ z-AikSQd@wf*p!o;diq zl}W5y5JfxhnIq{G!>Y6aZc@ryJ9UQIGSPGAL)U+V)8W8&uukbmPTy0$9LWd>2m)1D z9lvD$ISBfKOSLav+f;&B5hD^pR5AYWaW$ufDTWkcK~v3ZUPiIWG9B+i%SQdJx5>ki7qSa?mlM6{fP|FFtt4tdLZBU)fS|9> z7{pbnRW5DC7j3Z|Y*(S0b*%!to%DGW-Ao$FtU zz7@#N>_}QJB!=RCN0UevXrpB<6lyly^;-L5!(b|{ylFGsO0)ViDsrlQj}7VevNAPW zD;|SSmV2nv)@GDUO2)`Q3*D>#01?cSFb6J-0Ax1Et8sB|Ecn4jqd5v#(|UvBn6l&z zvj{^Vw6J3djLN}@;LYivk*TtuVUw;YZjM0?Ewy^g$-&psP_nCj+k8w>N48Gmve8+j z+e%9X1(!c9)u0TiJ`%+|`* zyprHQ6=h-Fw=56s5!)qO@5u^!wuN>*OPNu$1a;y+mlz1$4V2nhBI$8(NhOo(2_Gu2*=~Qb+x5#w5%)3K9Wo?KXtZtt z1d&9|%+#K=9S&4Cwn|s6b$zRwaN;QDjQUZ&+z9Fj{gQCTqYLgq+@Z`?t95M=Jf(y( z1Sjniw!VvTfjB-Y8CSv9kC5NV<^*htT zxk(1YB^aZJ>hm%>{asOicFR`fP09J>$u>LCp)`pdqi`G+P*xDbW4$Urmm~$1E!#h* zZEFOv77_EfkXD-kLAEj$NgvfvhB7-KsR$>Kx2CJ~j+^A`>_c-r>;w`B$mPq_Cwh^v zCjbMQm9xntQ%5iq*bYxpcEb^3kWmx*Q{Jr60qD*Ekf|YgkM*(w#Ax#gJkY+eNgbP? zB6u#~igY#0DHi39MdFlZgvh@MrAGAW)MIH>PfewDS_KTuOOJ=)9SF#tO0wo9iJ@4> zAKd~^yB_`+Vs7n9rM!@YXysP)?g-=;xDDfiK=U0GB1hHI?W0GmWhet~!D@aHPqF@1 zLwZUwONgVpjoLrlNgARne|4~@eulYNi6hN6v2^wf#77%7Nm?}xKUNZ z586-%A?_)&3_Lg0Z4GO67@63VjcLhH0apk1XnxL0QP}{Z^r@$r<%|fuH&sfd0X_TV zGDHN0b(Gvq6I;b1$rNmo%>Mu#3z|0P;pu{?Zk5`4$p~eQoyho1&Gu@|N~s5Jv7YJ^ z8+g`TbP*d}4nGXsdMFe;iKTL~Y8}by?=wqjC5#s<$h=R%LeM`Roj|S}0D?lv8|%Ri zfLaNwJBl7;F|T37?~tNrx_T_rQc0p4K$J@ zGAu~}V@+qVAzw7^pg1sYO@5Qnsa9szCYYFWQz^{4GrXXD(LABIK}%Z(;Zk7Es>_qMC2tra(y2X$4_wrRJF;7Rwos6#x@bY4big zDW06r7p2Uq^79J70Eh#1Szl3dtLF;a-)?1seqm;FW)PeJ6!lgoSW-C#V<*P>Hyal((hC znE@@!WY}yEzCt6tB@Y~8(g|c`s#FlE=xar@|^vBh#iL%Bhd6HOO7Z zAbHXE0>0a1wxlX*;0SG>k#$XsYJS(fMhtyYP&U_56>|g(k^}I7Yt4bL(UutZqSEWR zZ@)%@aMz3tN(;ab+Y_9lprM00U}J*Yn1* zlrqJ2^>!YVAOY}zDorcDER;vVO0CRGBtz7A(#hPXqG$kS9E&+L=)bjqADW>Z;%y(4 zk(OB`saW5M3M<7x0DLqVKjKsdsW7&*iUe6>*;pgEVo2@qj+H$!a28NdcXM3b-aL>+ z@FJ^BDr!^#TGo{rD1Zj&Dl=TiJG`7nuJj=I)u~PCO}5(z6opvcU?a8&+=QfYCvP3R zew>K|nxo@|r!!m2!b*l_2m*mmf9A@`t1qSL2Z<)$Q^&=H36 z@9Gmr$i(aseLf&_Dn8L;w@j~uaVGXkV|kcDj1_=9c)8dDcj?h`;sX>`t!(kn9Hke4 zJQ?FWmZRs8$1SNOBJCxbQ1(eLrRsnXvQv>A1xLe7gn%2QcPaf^X7%H42=FaTbRQ7! zMh6cN*%XAf^(Tf%5;DlY9Bg(m)2$9pTN^+_G-fHl<~RZwnCwnY>?(a{HJq`ylA%HM zBa{UU30eiJ{{S{)ND$05ruxy^TL`0dJmh%|J{AL^40`mVVVzmD1k7A4ZnHA-cPQIz#l*91A#l=&^PiZ!;m2GL-2+_Y|{s&^v4 z^H9ShxZOgYr6f_s3qY*!&opGYE5s-qs4MdLa!?n|1qLo{#rwabNJ$a2tOT5ug+lQM z_HuM-3)zwzLp8z`5|x71K1u)vyqMGVVmCAuFtvg<(j0&oOZ&JDKs-8Bll;4!u1D07 z$tg)KBfRt@;XJ6R@iP=kr-(FjOtgYUp;p%C>lc@{ChLbKkF!)D8dk?2BklO2-0ZwDP=W8|72bjPbIQXgm0Co_gbM~5_wUij{ z0&P%DyLHIcX~^gLq}Y7@VX4!fl;g4XsMQFS7SV43J(Z;C<&$-vf}d$wFiCYYu+ z+?Go?qmm^bY0A<0u&oVAAMlnH7G$(CQUryB zPQ_>oh1~dW?}rGhM3V6pq9wx#1b2!J`UB~IaG^sS|yG^)xHR;a3;i&6CB8nObH z|J3unoYBvB3}}w&2qY=qpMGIX5D%NN2Xx9KaSgr9YZCEyAS(`OUWc#57*{AXNH)n2 zI5u`@i4wGu)#*dWhbj?T{8?c29%wrSx33xWAeu8qkP#ZU!^V`Q4&&lA#sirOTA!4c z7cp_-(V-0Fk?^SKFvnmDl)5M!#T>q&kBd;rLrwki(s!mbjGoHF(oxTL`%a+l-y@I{ zm85{O(d|`aw2^&IL*VrW;k|`%m^{=d`f6>YkCz&5P<9~DgOa__sUOwgx)gS0P_$Zd z?bl=DfY}LjGe;%D8Pv$=<=md=DtqEZ4U`u~0Sh2+h08F7hTj>W1mabzrCOGW%A&ZoV4 z1Cofi?1Fbj7-qYLN=zh;KvZ*1G#xoF?3}K|PbAf;Np9Ajn7WLIb4YzQJX`MRgiDK( z)hOQbbyT<>nFYNwQb?^SUX{ti$ps4{FoETpg3+j?{idZp5GnR@VDGXi8)Yn()*|U) zTFmX~Y(5$dfFAi=#mcRaqY^xN!7$&VFcE5rf(*l27Jim>&~ftgDN7Uyj;$;u;ZLm^@ugeDqMA~EZiD1z$W1p9&Ldho`xgEz* z$ub-_AxY??q%6lyn^1@-oT~DC)*St{v5KFV8*tvV7aT&>54h`;OK`|KXvEj4G(4n=5E;}t1#7?Eh%_jrLrlJsP+637 zm5(UNp`~}H(ccW?NCjD)ga94L1n_EYQb4cK(<57@XpG8usPqOYQO!P(a=4NOvMK`F;UozU?_pG+R(b$I{6@mjlM=-YzMlYeFpa&vV{YRjt zND3;i1SlgOnuKGwJ-D~@I0;a(qlxEuQAestHO6g#cesD)NqrL*BRqZ*+WJQxmbi-!cgAVyz@*R}my! z<_fC>60oAP58g3a9!jE%TmaIde8iE(9ilocPU<3f9x}?vHVm9j-%dvnyGcoW$gx3l zZv(4I6m3>@+N9E)Yg5NA#kjUIN_8t@w=%qEk_s6&_=h9*a>yN+m5U-gu&IxPWFRj6 zDh+y$#|vduPwCEGJ!9}XlpN@GEy*@v{QQk#%u(L9&$xcF)VcU*cNFva)P_;$6 zk8}maIHC1EAbXAJj3u%NN7zeg6}-$ySps}a%6Niy*;vzloie$CNMsR~=(g(}v&$Ps zpgJ-!KWzL!ZMVb!01c2k?vSo-VVvE~M)cj%k+N1r;j-}kSq>5?CeT)JqpiuS-GV3V?K z8*yuE9*+ZyZ%R%|u7i=UUO*Ap_Ezb`n z9%}lmkV!kNkic)9l*bTi9w1kXR-5E;gI#GQDAuh^hB@I@Ym+B5vm`T(x{wa)DVJlF zY5}U)~e=N=O5lw_9NRP33`-` zpa0eK-jyU*GJ0(QRRETpFbq4L&R}H(3%6w*(X+I%SRtaZxFh$ixuteyKjmd{0L$Ey z$q9PCmGp2*rG#7}V724E=i)u`$Zs16Jk@U2N7OB3JQ7v{G=+;+fYXs91a^rDJkj%8 zSw*Sc3+Gi?6NzA~cvNjns7RQO6xQh>m|7&3)H6c$8&m_}b0)aAVRW*@FYJ<=d)|h#KP^cqD4uVyV zUrl%-4i)ZsH~P3OR$If(Ws}vS!5q0^$c&&1| zkdT)dJvfnMMIfp8m+hY4hFw;6Vw=j6LZW+U`9$GK-<3ru%4?Y5gRy3fG3oJH2Zam7 z+sO&9HDlq|E4dkNovA2+;!FN0WR4jtO8g-EHe^T>76Y1TXtwf0Xp&S&C1;63ihaxb?4PnsoRF#!oI>fZb}}J+i?XhyfOtnTuK!jX+|>%hZyfe>Fuq<<+|s z=GpFLw2m1qs?ZKhHIZNFyA%y}_JXsq6x zOC+qks){)PqMPkb{{ZV`G6cmPt=%M%bCCpdB#Mv_s)|UVs}bKJiZqg(UM=MMWU@&A z09s&yNm6N0DpdZ?!zzslcQPn=jH5@k)6F4*@q@u731EsvdUs=zKT$o%=$KsD7I0l5 zg`*Vo%YCMB0<({nRwT-jNSQ6K-Z|U{ibYhm*_6|2)NPiX#>`PhSyagkc81xN!3>mi zVboT=2g@P1eWf$Dxl4;wlbCtFBC6E~bKagAQ51ZWY6e9`xR|#In1DF_pAV-Bs#>)F z09FY!>dG07XaP~tLH4FbReLB#T=Ddp1}H%zo0CfKT4V=$P;r?SaTu&=8WPIi5I+7j zIU~tdg;;{IUgY$~@8E=F5Ug=Rq;XOScT=zfw_4?7*(`z`0?Z{5s-&cV zP?jZye$e)&Pm&Q~C0SKM@Ma+owS00m6?3%hc^q$4^vR>GNZ)UWVHHY+xQYquEO#pu z@kzh~C%)l8{%n{ebV9sS%&cL#L@h!QYw;7~^yEnD5};RkL>$o=+YD;#o65Z@Lz`%GW|wxb)sIL6HS% zLKLcjMN-1Ft`WW={NUKD=B#aYMDS$(4VoEL>}ZV`t)rQuF}HHkjRct zrU3Yg_dNUI;agoA+auduq_PPmxFDl+D_?~|?XW)%_zmtnm3FVH&f2tSu@z;Lkyc=0 z0gX02F@y&Sle!no0nD&Q9Ux@A0F#b5pnnJ-0w%3-@O5xSY zlGHT^-^Q5Tf`xeHxV*WP$vJCy3F8tT6m`IZoe?3Zi_N~ablinBNd{k-+z`@lx?y?Hbk|x z)kqCkBouyXNMhS;M&m04n5U{9_TCu9&(-5~RAnW-Ge8Glh>?U+c);vbgcZL9)FNTE7?*e5O*;MgWWJORX#1rtq=}?n5W9tsi2xB(UYnYD z<#GC{Cz3f9RJo1Ni7nn({{VJK@m5bf#BKE>6SV1Ly)9Ac+H zsoW(RUBpQ|W7KXuf4m1YL=O^1ZWb3Q7z1KGz{;hIbb^(&>=FgI z^_n8+c{lND4qFi&tjfEPxWGB&gUx z?WfG~T+yN`u#yx87&#RJ-NyK*VHQ2Or$m!|CjE}SWg*08+^Ou!KklP?QeY-SUo9_`dsE@ z-9YLXzfM_44erX)*u6QHS>uvMCL_g}N~x)-__|bhWv6YB(*BTpO9q*Kvjs^P9KJ3m zYEfxieKu=kAvMh&;xgvR7T~QMEQE;`y=z{-eoq!b*JY4HS&N4cbpR1uLcC-~CZF(I z@w(Cm9RXQ-Ns|LpVCHn*{T9$=Ons49QS%CR0~ zvXWV=%W&6fvZ+H8gpC0BNFCJo%dr7lF)H`dO3HC4@6FazL{i?%;p zg{6+=~|PBb9+5-XC3A2bvwh1y$rHxD5u zN8?|F?miLQEWT(|zPyfD<7pK7>mXKTBvda?g!CC0LcPjLt<=a)p*&7L4htAGs~xH~ z>M}7ONGUx~9GRc@(gj&baZ0G)ZN&{g;#qIGi*U+PGQnwSBPdj~9PFo}ed5n@e#4GA4FIFqa?@l}TWJL|s zxW*#3x|7o}7?op-nFU%(d}Odb_}!4GC%2B)!M#VJkb+T9!?xi~KK!&w z-Q1H~TUbm5tn8Bl7!kb(5(fVOJd7eJlg%X`rhlhv5=dkJ07tf8O4tTJ6vJc2xe4tb zdPg*VqL0S#nbvTgm}u*|prw8)eY)jv=%pl;t?e}u(8m!|BC|#ZE;Sua+?Oq)LJ<;6 zXZk?8)Wfs7)R0(@vQ=wAmC>Z8h+43#so+l{kuMUp+z#7iMUoaL6D7;31asiguU;Vd z;g-~Z-L0^iAPT5>!LP$fxV1Gr+$y6Lm zEe{qRBd!@(wQAx^Ns$p`X1GAgP*FE;<_GNK8y@8=XIq4Uo7HHfNYy?9IQ6XwHNz4u zO0BX;zr1LQNanke#(-@@^1&h$BSlIm2zj+DAgyXLAu2LG*nfobApND-(N5rl3;BtJnq`Nqa004vOtG@_UQ$CE7}>V?Pe5>yXkBY^v%IpHh>@6aT7aYt{>~;fvY~~< z&2#EYYr;0Den68}Y63X^te+0t*4?RF-9;SbSbBb7sp&$b5l@TT2^^I!5=}MDw9ciEs`3<&acVFnn3{jYvdW-X ztc+cwda$%<6s}0-1xTkFj)H>;uBx?Qh`pLd1;mQ{N>uSv)N*c|NyhoAVXj|Y5{7#? zTmit_DGZ=f?Q#cte$GQ2M?#WV-Q@O3ZyackBSQ6lVuaMxfte8o*p&%p<#5v5lLRhn z$O_Zj2pevN(aUixb3#bs8Ci)+R9CM3F(3tXj3iy8ae`(J>&Q^60yfxhjE>3|+q2u; z!8FhtfR1?@9yJH-?b4VI<6^4%gm%{2iMV+G0Cg!X>5#xFZN}SVU`Z5`p#{@hUMWJ5 zI6T&M8}U86j=#pmaPcx0N*17lwvK*Y1eX;^;jSaIda^7Er$*FrdDf+1oT5sJ2s&k zGxCHghUM@B>8&=d;N*bxpz}izQs%LI3L_*)>)80$?y1T2-3f%BUwaF4Dn_=;>8nja z$dgi_c+)Et#A}-_jiiV4icblP(nq77E$NM@O4qUQz(=Nv^;ETz!fR>x^A0&ERqNKO z!h>&?MnXV^6qh`VwvtB_oRJw`deAW)Hfr)YXdCXuJDXdG*jt-eSny!How<#_nU3|$ zafI<3EcmuZ!Esx1^V|U~c$F$tj}8>d%y-x_35A7}lNzL+jB+J-DLbDU5lpUfq=1sc zbkavIoee~BzxqLHbEiJ42T_-p(c&y`qCbH;#J4a*SYn7IQdE3I_3P7)Rep*ms(Pa) z0U<~rPAtqn(nw8-A&EZQWpO*%WQUq*qPw`br|wY#7iBaQ+_41i)$q$A0RS;dZzPxM zhU$3?w%q+Nq@H7|8Z9VDuUx((dK}o4MYJDT(u7v(hJGSL>Yb!1u-I-K42-2x-6N7! zcOAjEH!6W=LIb>VFyl__tZUOQi5E;td#BvZCB!U|0*?sd>qS0 z`>r6&<$;lia-_giJw!+X%llD+`4>o!74*_Z$Rl}Ns0d_XT5NLQN#FQbm3ug@IU*G(@xWNDVQWFu@6;ay zkeMH9LK5wfH2ZsqPc&x!{{V*r%vOm}{N2tQR@H@@la( z`z5<&aFvo0LKjw&W|zmcyswwQqfB-)mq z?{JaES=b3dSkwa2*0TQXB-|;XS-D64_~9XAwF{Y)V_mX)I1jr;RI>fqNclD1A^{Du|+H=Mw@L z8iE_cEX91vB#T>XyQUIyRTkV7fZuASl-u^Q96~?mCW%Eu!biC+2&@3eb|q+?YTKSg zhCuCG^JKQ-RGUZ>NaRitgp{I>h}CJef7ZhhQ?7_SlBppvLa#ddkxs#wFItb)mxE_+ zj8Rj`SmT~BV~>G|tD2B$QN-jTIwiR7r+Wx^Tm)d;RSRw@w_kiFBKa+$xJmWFamj;+EBLPA9dM@DRDP)3z8JCZv z7ZD*XRwAGu8f4^0R0Yi6SJjcsRP~pPj447#PKT~XoPEjURb=$yfU4|x?!u>YzkRYG zl2t`Q83V@EtI~cf0o-)kCGSSb%GS6&vl4~x zYfPAq)Qd)4*(tS*u}PXEQ6smecs9rTG7*;PAxBGR_=H7;oFE5gqb}9&y+^)Ie`*6$ z%O}=(L=|Hz#x-zgtSAEt{gCyh5H?jui_y7~NyjyADxr6wQ9`vfy-d$k_%Ci;yI*@`e7CzstBPRo3S6OEPxcmsmFD16^HsfavxRd z+(*Jl`!!zuu#idJZCY3^(!@y8J1dWdC989KZX9^fZg2uEDRuWFeQyeKilyrXYDU%M zJD>Jn4p|;Vu`6SeMZG};Wz^IOT+%uP-mFDFj3jNkqt$Mrio)SusVQ}JYAqVQ0r`04 zdu|e!-aoH(Bw<9OpZYV95Efm^wLb>SBd|eB?`@{Nx+RgVr|b206jT1IjGRb_??K%J z?j(!RxI-MV6Z`c5k_Ts|OnD&{8qAOByG1kbC5b1KD-DHzvm$9KG03YYsU$`gUMuQ> zP!_a46*x#jt31%dJTOir`2ASgI->%6kK!-@39=IHOv`zvML*U(SA>P07Zh+$LJ#c> zVL;U>S!mHq5-gBM7)o-LNetq@WR394WF~SVOJyik_#*@e#T)F3jq6Q3Jv-Lm)T&L813Cs80#Ey{7W-#4SYzYDssC#(uD0KiWc?a8Um>X_{UZExFu(ytN zF|0vME~2V@I&EC80C5^g=V z+RCyUal>tfFmPHebw|J2wYnLF9NsuTzka|~aw4Jx;#WH~`xlZ==nWqZ1-+(Kypr`@czEdK0 zzKorF3rwid+)_>-8RNw9-=H<4ZA@TmqLncWO{W<{lJY0U%xPEqEPf;5-z8^?m!bko z3)x{lrPOm6=_1Cg8)g(?&~KKBfO#>bELR$UxJai#BnU^RFAh9G?8jsC$(Y8hBFehn zB3fNXJaA0X6A4u1B@~UEJ$77=4&tpgj!O+aY?IVyt-lzN`Beth=6~AA8Or_Xpoi5b zwT?)co{Q@QAG;!oH>%Ww_HtOkKO_{g=IP|U6GbRi^+AF*rAm!~-z|)2Q9&u+)*2g| zaU49vVb~|ce|lGX`2PUF=06RCyCg=N7o!wXqt#qFRdHH5`#~#AjzfDSHZ>5J3VuI9 zomm9|QB9h(>AnsPyw=p^ylFMXxEAj4xnyG11(b?>H0_cRs8y}*$PyS5!j?+FsiBa4 zpbzr{nBe7V&04;lDqb=wu3T<++>Fae2E`k>ecW%l)A>WB7 zC0?p1v~AX#Z8Ae8x`478H>lM3NT?tK_J%?;BbrD`rqaloDh_^{y(B7BIUmd_R=H@& zvMDXpB8DwHLcE(Ere|CHt!p<)YP5B4&O#%fJFG2 z^Awe7t8>A$+r?Le?a8XZH*Lo2mt?P~Aa^B~7Qa)tdOEEM3%N8SwRahGWyBZ}O83mN zrHuUl0De!UDkvLMp(T&&$ir(L5?5+&?LEv=A3`MJeLcqXpfnv=;Knuwnw7SZyIfmG zXx@WHrKDy%wR`wuBeA{IEi?R2H9`P}5LtO4Vs|W0PNxlYTT&moo6{F6P$~kd2@FZC z1x6lYk`~Pa67oHGqft|kW~tt%#|W22rAQjh>?cc?Ww?y`usvwI_NGQ$LPEJHs&%E@ z+)S{<=+O>EhU&w(I41$fl?6^&%*!IOlv3zP+-^@nk`bg5zGg0jwhHBsr7I;kJ@))Xlc3s z0A-cRR%^|W4%RHleqoKvn8!HPhr$Pk^J9vC=B$EQa6`goX!$oUiCq1_5$%`9oiT1Z zZ?34483|xTAdDU=cdG7dT7K3hTs+pTS{o=Lw~Ol$KdUz?uqtQV6;PH(g4q;SNTpiy1dc^_BY%hmW0C^O5n60lklHlJ zk)y&(I?F=DIH3xp(v--|f>IG$RDV{}ZzWO)F;X&#$oyNHZR3%dxdes2TQWt$dzEMP zMIt1U6?}dlv%iixci1dh0K6zKS?(G{i~%x=o;3SB1uDlV;pEEFxubiHL8nR2#^J;S z6!?hgPK#0FmIFeNr(_~cMrE2e1oAz(1_Sm_M!`F+lqbHdkcGIGLBK{tF}B=++qTA; zjaRcI6~wM@m(wa1h}>&X1$+q`6nT*vQtpG2nnla(@7|eBGFf*jh?n;~gAl4v z?_T7OY%v?DLt4E4uN8#V>deD>o`B@!1t2OvtsJndP6>Bn{QfRg*n^RvLA6p+@xrqW zim};^R+Z>`G%+HnA$}IAp#Y2^aFt!8-3aAqkfW)h2$awU29yKDb;l%B z7Vd81pHN68kdq@P7o}FHPRzR$`QsSSwY7v?TtRio&j*|0aJzgyH0|JU>lAWN>CU2nS0n~mv@jTJZiEYNl%?J z$ir$uDTS5g%#p`qZz~AnB~^IUej&z(tvAZ$5zM3&3oA$@HuVo{3^LMKi*i?L(EOVv zDINN#O?7xIWV+z8Q4x5f#ZF*&(Cpb(GHE4`yjF4Ch<>*B5+i&Qt5Gz9yox^24Zi*vGIs@vfh`mT->E)h<|i;JbN{J<#IQ$NOVyEZsUz=*8`Mpr(inLgkn!6Lm4Mz z56H)M2pa+z1@E>_hrtTyT`Z>|fR){gvl35Epx1ijdZiB(7S4<6u@a~pQ7AbNe}8-= zlp{4JmT2ILIK*-~@O4sGkX_cb*yJI#q^w>M*xXvUWDQ1Qt@cWFmrE<@*2vNVs!U%Arr`8%qbZ3T zMUmvT@_E$UMOezLN~W{~Qj{zHSIZayu~N7|&36sNMWXe%jtx>60lwn3$BSYL)30HM z8JQ%M#L_q-04o}ffYjpxNK)3C3^PkBL@p#MQZX0=RQ$Rea&9W=LSXk1rkQVEYEfun zDa(yXBA)*M>t#YdqRRG6Y_4x()1{W)-D7o9z_#nko4a)1{G6(B22@KRc0t233otGj zh2n;k7~7*AfUjV3!Z+LLViBVDIP9T^n-dY-6ywZ;Q$V}#mGD`%R^0MM_0nWDFEv&U zR0^R7#QpIA*TGP-UkM_UguKL3dQ=90t86L{P(89@6j5px6I?;+Sj`-B##@WRfU5xA zD#x};U>{IG?rM1%3{%O^)F@&|f_yct6dDszOdxbtgv#-)v_)fkiao<9=nDC)_C3SAltg5MmR`85e4Kr7R1#J=#(lw^hk zi7c7JJBM=+Y7zmj5O>J}d7*k-EM_~1zjtdb7FDk$T8eQr{j3HzvF4jhC%U$}K?A8H zq;esnDIM~-#EsKyG@VvhWNT-*FEmZ@dW2P@@dlq2GFdT$y(lTn5UKV3c1DIlSmm$6 z)#)Ra-1b;CLW;%fOiCZVEAQ_I}(DD>UPjcGrS;9>cT#5Svav3qJy<^_(<0KF(GY@ zl=EpfuL`siyLxLWVezOx5Cs1KH?YGw0U>AuX0L5YzNZF_qK=MD3oj}!9s2V9tYa;d zgeAt4D&ES`6t`ZQL^qx@375q zq64!joxE3u)(u=TNhw}3+m1`jc!DqZSKN&8Dv-!d_SM|KiK&m13FwzD-+0SwZsEdVF>j{Ayn%HmBE z-jb(0PZCWs$dVhGfQ&!IP`jTUvQalfxGID*7w0s_lE~FZU{OMkwOW1IB02;jkrquo zE#)9W?#`^+^KTJO*;zF!3Fw#Ju(i07KTr3G$B8xgY3;sS0mK-cm#xTI8KjH?=m3zA zclN+zvf6|n0TVQ;P`F+WH!6COl9u}*DxgtuJaDk|o`5KBrnMB~*CKfWQmr-QZVI#t zYUSLWn~Y+F5!7#yj1PKAQG_ETjVlF5DhiFaRuRq!9RmmXU&Md{p+Hg^(Ggg{n-7@hVXouoKO`YF`*eS4IvW)Gu@stRU=w5P;uMsR1r~; zBV}E7@R^~6MC`A+fPMfEQ_J53M%I#rNUnVl*6y@c^veNO3Jy%yRw|b-Bz$EA2|*l( z6UYx59E?CIDoh=skVwJ7YJe7mgWuzP$(!nNVl zS7A}%hkB({w}KX#y?UUG7}<&B4}Jdth9sVf>xTNJn%mn>73G)h0tw>1eUzLr+}Txo zKdZ-XvQml2@|@L}N#2B0#+AVsm*0m&HncHOw z7gHp6AKwIwh9VHZXailcQ5z{r?tqz#AuG#p8{z@0N)P#~Eso4eVGXMK46-7F8hm9O zZ|z#|*DEsJDRtGfam@trhiPEr@IP+qEABGLov8&dwv|4j(p$kyhsAZ zE$Q&?3wsO^yefz39u7-zT^^4rM5K>P%1O%Qf9 zJus35f`Pg_SFxHnqgfsOM^ag(U`0XewR+`vrU_*rr=9a4z#+^?20tHw~CsLm7-o)}z>Q3M}3`snRuMl?akjD^Z?n&gL z$|F!Bh^iMznU7J#RoIVl?}q!;HCb)vc~&UhO2!05B-^jr#&-b`h*2EJ1<^XK;aa;)Mb%{>;&4RJOdKZd_3z>P5%If z5H>rZFSJ{xogD`hX?`Dw@*d#y%Vku6$n0(IA-y*3FRvWI!*U``(HZ%QWBdxY2MCA>c$i&)2xIFSEF`QmdZldfSYQt&u!?(XDC~^<5FUvEWwQp zYuhNsLA&J4r1$rUaj2wg3I70oOB$6g%x$|7)4v?P5vcQEPVRpmERPk* zYh?$vy-OQel#^_%Lj`Vzz8N7XnGw|#Y1)Fz>OpeKs}#Qj5x70KBOGK=9aO9>VG;yY zGLUzSgG2Ho!y1wDU6iAZWu7RR%g5>f%iR{f*h!#D9L6}WjJD#1T$Dl%+_EAP2Hl8TtQv-x3#mVE-klPua?)3@=?8BzO@Vg`~WGig-G-asR z)2I14J{yt0nlEIcXA`3Q4fTl%gawNV4z=Z(09Uz!F)eIep#9r&0*(=?YByrXu=dLM zrMoH$*LKoHZs?qZa!a^%6shmGP�Ytf^|v=9cvoNIe)7AW09UMQ*K5_+>yOF4xI` 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Ÿ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 MWB@!P-kaV3+4ZIGmjD0& literal 0 HcmV?d00001 diff --git a/test/models/IRRMesh/engineflare1.jpg b/test/models/IRRMesh/engineflare1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07261911360e9d5e0d697f0733731b2d8aa0b2fc GIT binary patch literal 3630 zcmb7Gc{tQv*q+7M#xk2NBQust$QH>uW38sd#8|S8Eo&J>mh4j2ELpN8l{KM+m$H+w z4B10vn^2ZWS@VtF_x;}M`}2E#=lt_K*E!d7-_QNr=Nyb3d8*uw;2gFx6&oKQ~G|2qy^0B}}7C?FIJ6aj$XKrkG5&;~#Q06@rL zw*LhqLuM8bkd?7|1PB0u|IZ?T2?&OOm=8VxIKYfW7#PMlVB3eWTb)~d)2vb$T__~x zH#hnY`Ht~VsBLT7#nmR#+R^!TN}$T7I>F;cOpIie!vH`g5Qs4u)cpw%fKgTm0*=JOP#6(eIc6RloJUDi&LO>BxFY6jaV+K1|B5_*>lxT z>J}I(*80X%qCon3Vuq&QlRWH2WMOUBYziTteCi-nY#)wqhqJru$M}4N1Xxj*&*W55 zDiouM@-igIv^M%w(P+7seG${8XxM|t@dc2yez8VL_O7l8>GXj)-LF&!5Pi#ancp~D z8Xt|ghPZa!5h~QD8_cH&x{1MKcBQt$Tj_S+r3?#u zO_uyKb|gOZpDNhqlX<^Y_J(jTN&iz6aq5DbqZl^hXbTf5B-sin0 z#US~ClnACDu2AXjyD9FYv}lCYyyh)S`JOmQnn3)#eoStwsnl+v-+s82>x-aojkl<^ z{d$me6mz&KMJRI{uVY!~WWBJ>6+Er7dq$wPx0A*|Bl-^-$bSw11i`^fFa(wXMph1Q z^al*+5X{H!O#@@y4JXrCY;xPGzk+nN^WdnYVx{@XW!wLN_5hRyYI4wPL|3Z6AWr+xrRlmpR|t-#-@$AOByhrlp^$MJyOZ9Q5u-KpA;Zv%CzJfyygr?*JKNUHs_~lr_C2Md zYHLSP*~(cFj99C_SgY05tN@=Dtwe))dJz96r$zxgGOWi(Qt)cHvPo~vH_H@@;Qj-^ z(mk`(`Un;^@Y4JMh|imo>SJDeKWoAaYpg3^3g;(RwGhksDkMSvv?=DN=WkB3kxSC1 z)PYAO>~>8(Ox*Z7anNw^>$tFwB~|VT4K5u^Dd^)g z3Xpl*;mFT6wsEgTS?B=J#v!A+A1;OEvsmjimCl-M=+#Y>n@ZSE?Vi7q21_mIX7>SLKt})Vw&lLKE;>m@mSc@LjQ#FLVTTtx&JjT zM=lHxMLe?#hAny4R}bl4s4)2y6StA02r!=(AxBO+q3Y&m@0M z*13x3+n74nY~?Wo^5>BNIMfhqqtDsm>XaGCFu+(J-#>}wz=eh_>f!j^XdwbWLnU1#DiIIw8a{|fgdm)%=B8Jl z|F*A=S{4k3p0pnvLwDEO*>DC0c7jrBj)v$INFSZR^zUeVnwl}o5s&t2A8vzQ;91^I zv*Ogc`|0)ppii6wW~CZA*I+sGFfX#T&g2>RqH4|a%1ad@kF(of?}RX*VBm~L z)}N;O_u4pw0+Ykwjn*jn1AkB)nk;NR9O}GxlrWCI{#B7Yubul@w=Sg&9A^J?bIb6T z?SP|E=T_DaRtZ1(_rg)D-6NMW+rPco5jPt%qU?3aS;@T-d(Y>kOlMggoy^KF{Mn3_ zt1%p0vCs6p#Zz{p;N|4IKmfUW6n3o@3gy=PuhSV9+Q09-zbPggQDB&``~lgdO5DG0 z%gAo0`6i+JB5mpG!X_tGq`Jp>Uc=#x#Rgpa9QAkB?*<(*jMXAilt|+;$TJ6ieC^-Sq^0ZksaCX zA-Ebv$gO}=@~@(fvt;5&@|ADiWVU-K zNK{l+V2rnsXtkyJUynZj^zCU)vzUVG{TdK%uCI3~!eD)!D*op!hL z`I7et##=AQ+4ZU3Wm3(Ppqz7cLd{e0x1z31hsPN^%)8O(ir&)^q|f_RiRw(arbXwX zm2&F!?DB7sF)+(LPYq4Rgb?{+;2_L#z@-{O)sETl=hBkUF^M(SvB-Vyf TXG~nN3~HYvq#po|AB_JGBv2r3 literal 0 HcmV?d00001 diff --git a/test/models/IRRMesh/spider.irrmesh b/test/models/IRRMesh/spider.irrmesh index f956130e1..e446a9ec2 100644 --- a/test/models/IRRMesh/spider.irrmesh +++ b/test/models/IRRMesh/spider.irrmesh @@ -13,7 +13,7 @@ - + @@ -354,7 +354,7 @@ - + @@ -485,7 +485,7 @@ - + @@ -1609,7 +1609,7 @@ - + diff --git a/test/models/IRRMesh/spider_UTF16LE.irrmesh b/test/models/IRRMesh/spider_UTF16LE.irrmesh index c6ad9291fb02b6b146175de86cd123e4fbc509f1..25fda7c276c171a9359e62a4ce372c5030efe5ae 100644 GIT binary patch delta 53 zcmX@{NwDve;D!XY%>`^Q;IF+%}ECPNBCDnk)N$>zid f)t4wpZ}xEZ9l8Y;^+?mgyS9E diff --git a/test/models/IRRMesh/wal67ar_small.jpg b/test/models/IRRMesh/wal67ar_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b07716bc09f9c0577928edfa3b261395c60e5183 GIT binary patch literal 9287 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 Tb+GLQ)@&@}ODD^5d-VSUxkI9p literal 0 HcmV?d00001 diff --git a/test/models/IRRMesh/wal69ar_small.jpg b/test/models/IRRMesh/wal69ar_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4723f9e3f376546615c7e7c6fb328c4602e5390 GIT binary patch literal 7929 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 literal 0 HcmV?d00001 diff --git a/test/models/NFF/NFF/ManyEarthsNotJustOne.nff b/test/models/NFF/NFF/ManyEarthsNotJustOne.nff index de9d06447..1f41dc198 100644 --- a/test/models/NFF/NFF/ManyEarthsNotJustOne.nff +++ b/test/models/NFF/NFF/ManyEarthsNotJustOne.nff @@ -10,10 +10,10 @@ l 4 3 2 l 1 -4 4 l -3 1 5 -f 1 0.9 0.7 0.5 0.5 45.2776 0 1 ./../../LWO/LWo2/MappingModes/EarthSpherical.jpg +f 1 0.9 0.7 0.5 0.5 45.2776 0 1 earthSpherical.jpg s 0 0 0 0.5 -f 1 0.9 0.7 0.5 0.5 45.2776 0 1 ./../../LWO/LWo2/MappingModes/EarthSpherical.jpg +f 1 0.9 0.7 0.5 0.5 45.2776 0 1 earthSpherical.jpg s 0.272166 0.272166 0.544331 0.16665 s 0.643951 0.172546 1.11022e-16 0.16665 s 0.172546 0.643951 1.11022e-16 0.16665 diff --git a/test/models/NFF/NFF/cone.nff b/test/models/NFF/NFF/cone.nff index 7a5e36650..20d02b259 100644 --- a/test/models/NFF/NFF/cone.nff +++ b/test/models/NFF/NFF/cone.nff @@ -12,13 +12,13 @@ c -10 -10 -10 6 -f 1.0 1.0 1.0 0.5 0.5 45.2776 0 1 ./../../LWO/LWo2/MappingModes/EarthSpherical.jpg +f 1.0 1.0 1.0 0.5 0.5 45.2776 0 1 earthSpherical.jpg s -10 -10 -10 2 s 10 10 10 3 #white -f 1.0 1.0 1.0 0.5 0.5 45.2776 0 1 ./../../LWO/LWo2/MappingModes/EarthCylindric.jpg +f 1.0 1.0 1.0 0.5 0.5 45.2776 0 1 earthCylindric.jpg # another cone, closed this time c diff --git a/test/models/NFF/NFF/cylinder.nff b/test/models/NFF/NFF/cylinder.nff index b96ec1cd4..85a8ce79c 100644 --- a/test/models/NFF/NFF/cylinder.nff +++ b/test/models/NFF/NFF/cylinder.nff @@ -1,6 +1,6 @@ #red -f 1 0.9 0.7 0.5 0.5 45.2776 0 1 ./../../LWOFiles/LWo2/MappingModes/EarthCylindric.jpg +f 1 0.9 0.7 0.5 0.5 45.2776 0 1 earthCylindric.jpg tess 4 diff --git a/test/models/NFF/NFF/earthCylindric.jpg b/test/models/NFF/NFF/earthCylindric.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da9688b44ad07495eb8181c983b168420052383f GIT binary patch literal 624832 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 M+Qt&i$2S&?xAYeJ2&G}i1O-z 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

(bYSsM zI?$NC!x+)-7kBi=bF;tOb8UC_aXqiVEzLIX`fmN9Or6)5*39(WW#{{K%3W_?)2=CjDVN4v~@5jc6O<~Y~O#&7j5zDqXD0WmY;yCD7rFg>AaWcH9 zA)@~VpKUqjeAyBGNsuhud(Rtsuqeh7oHr>PzowIZm{%r!Uwc05;r)sYwf9Li=3lXn zLOJrI6$!A0is5gO!PebRAx6&dd|5`RHy6(!e%v4I)!x6YF}jT_6DnvO(N2QZ+*{v^ z^tDm-hom^bIX~Q$e{*4*=x1lgkbUEEb=ea{_kun;xh-wG!cE8Q=Gz+CK7W`8|4#z% zI^Xufl#D)ua_M>sl>gkA&p7Q5kC3Q^&u#8vifonI_mMM4$=tN z>qk$RgL6t>#wT`S#?uFypj;>3_Ade0%HjC3`{h%5miB}oL zR??zlrVxALE23hIhYr8UfSBju#uSeC{{SVt^Y@1`&gFa`T3E@^wCQDQ^28G5@`i{<6r|FwjPLgG)e;ql*^gDJQ1AI(93 zRO>%92fn=GqvBtCyxHC>D-U$)f>&%y|0uRV@2A2k+<#MS2ek0N<@cOlJYJadUQdt3dxIIcoAkV77gMMz7$c5muPGM<;Xbt$B~iB<7&FR+!=>w zL2i5e>ye>>SG>0wMZXl9*Q>eyQ@pYI5Amj?fqb{9)L@EYEzGeGm+Y9uvSfm&+6~@R zPD@XMF)ZDR^p#la;kUgaoK@z>^HyqakyzMY1iI?0TDft(hHi+lL><4g#I*5}VL38d^~k{GgW@zQw(L+?1o`&8&lAzNL~zsXtu5HLCa2$=ZCV0X(6 z0_c4APa@X#vk>^=_={Pm>2u7|7v66vKM8uivCZKBbMo+?6Dh(D|JA<*t>oW=)_=)$ zch#Ta514n z-7A3P*Lc@rtvX+01wKXXymqI&@v6_IzY`Zs8UK@j3<5XM%KCcw6T0lwcm)0mRu2v# zg~;KRu3ok2@ZH}^*QfRPJHJGoe$La!-%lg8yXR)gM(!&1!}ZBJtb5%^!A(qV=1?90 z`d!pbS}bMIM+stiqbnQ|V(*!Hs-&$$lkS+!pY&MgG7-Kpgjt8~DJkh)(w8Ms(vmmF zg_o2~!}|+Z#S|uoeBR7d38UzKX`6kYWHU5jkD5@J%H*56F+t431HLi< z;Jh5SQ4BdcCdh~Dcbz=E=<^r$g{`lE8pITF*l?A2YSIC zaYp%!qs=+wLarGv74iFQVdQyofLgr;Recn%GGyB*UT3||WStg1%4?EOYi${geB2|! z>jv(4=9W+&ML?{oUQFJA_xU|vkM^6aTnqlT*M9kKdc5e^vl_d6yB9}+O(-NJbR>lG zUUt&GB==2cAA>T2bN1&uLAU6oC0fyR4hbF@Z1j8oY@nRu&5#oNNZrV72#ay;t7FJ# z4H!(YC9-%7AK70?XcTL*_wKQmudS3KZ*BF)H?{AQK&P)CpxUn^&%!$w%-a@EW0ER_JyIGocBi&G?wo-j zwEP0%$!3YkaoT%&`Ny0fZ<*f54zq0EGDS0DiG}i%5=0IX>oz`uRLxz2*;)kGwq9yj zeTyz~4PuvbyyJ_d#9Lbs_t5V@#v`P=%V~@c_mtrziCi0>SV!QB&0+) zT$daRUFEti9Ds&LYeqNIunCiDyGv*xRaKis<~JJyh6Lo@nfBTELya?MeWHwPCj7U?I*l;dlyqb_D$i*TH@-fO3uiW(^D0*){^MG zF3My^{;K>2TFS~k?@~b9Wgj{^kDml_`d@~Hl8X6CWt#g%sZAhsGwF0rD(6X!h2xi#b&QC*l@|6`;>jgI?p+*()lFDg5DPykla2GsAKslRtNa3f!|lrpenQ zc-TceI3{8rJ{|Pb!)jYvQah54oYgqdlQ-KqT&wsa2foXd*@Q(TYRlmra818pyr=4Ov2_;Vt=q^5j!S zE4y*cnQ<#FH&~J*hpg|{_$=JTVd=p@g&46v3$*3(B?(qnXLOj%SLO?-NaaCjq{m6= zhkErG{R4oXeuYqa!p@Rxt-b#CY(6F&v7FH?juF{o>Q7(uOS-A2{TcX4I!yN>Kh=CY zJ*(8<&eNs0!iwKnxFpr2?8EzBsfH0s!3{Gu;u_f=Ym4SsM1+4GGr19&V2Nc zCK1>kSWQV^FdOfa%nvosdk~T4)-j6WJ+2p!4q}>jPgjemp4>y?bo37pLI&y9D_@9z z63p3|HoK+`x1zU6>`3kSIS+|%a|V1X`~l@Ha#SG`HF~q)oBarIO(CO`)5r1Z#bIpz z*BS@Q_P54gUQ{RYGQhGSRXk0<2AlD3JjrduFS`4Z^ zKdUK!d+O{OH^o5eB&Ybns)}w|P6zR#fTzSm>I%X`*_2XFO@(4&8`Od`C~hZ3MfxSz zM7c#z<)X>B`{RL~6#hHIQ;19>AfyM565mXASiWl1 z_gfEP_@2P5DE5b2KQsqNBX-I6HjD0|*!h9^;_ISTK;Diqn(qe^r+Uiz-RXg`L#&CvLo?vn-P;2VXFS=Q3jnt>jD=CwAFs&$i&nz;E-5PP)N?aa!tdcXTXJ ze7(Cp(Qc`(X7K2T#+Q5n62I5QkIX+$YSI!(2QnOY;QXt%C@S*0fzvX_=GlvEKcb;q z0v(Zb{drE$wqLr)2i~ve>VH*N!q&SQAb@sAylrMxTRT>%U`?C;>htk2!|e&BsA^@m zj#+F^Iu_CL;Er++t4%Vq$EZ*sGTnJw_sta^g9+hJD?EQy4Q)7JF|ZHvsY1;kzFCBt#S%-`V`hcL}0 zlC5gbizK$^de~R%&l7~7J|3*wTI(RB3$op3|SmOd2MaHBoO?&L+qMK z-mliAQuh}x#jnO!TTSX6h?m*U-r^d4R`d)I-K`A?UsqjM@_*k_vo5Y5lguaF-y^1( z_QJ>^{2km;65nNP(S|uX<)hJ{7H;vPpa#=^vyE=>Wjc^Cmp`EaI(f&+*;?81K(uJ9 zz8*0Ac;t!OQ`Lhn2}5^lQ8U_3H?Lu}!}OOwVpu!%RSEJ4CuE1KKeYGH?))U^!oC<0 zG;@@!Q7F+*Gag&gRW~gg0uAfYt;)Na-#!K2J~fb;o#iP@X*zFAtID*KOdRKIJfd~> zdc9{d_kedJZW)k<#Yhd=ph6@B!?qD$RIf=>h)M>94L!}vno8OY@LM3fdZAO!@3|31 zEzEMUmM?O@uhs+%xVMgrI>%_dcoo%_bS!mpcj(!kkD-gvQ)wI16VFgw4 z5hS+TR0WGBT5Y3%dzV&eEck0?YGqqGJDO&BrJR%OhMRm}-jrLn~S=NmrH0J}4udH%UE?`oeO90K`MBWdq*|deGzV;djrchXrV$*#4fK!-NM`cMALl&- zj$jIP+z^8+QT`Swt91cMWqNr7;urV_9-Q932zQgjUm?lFZl*;cu$ zX$=pQOilatMf1UWy{6=5Z6J=awu@M{yjWk>%G|Yyr-j#TWW3y7lC=mGTR!UIFun>O zZ5bIfi9#z9b7gZ{D)^CK_s`8xTwty%BiJzP@nmfVyTl%>8JG=y+l-j}dP(&Phxqn& zt!=F>9p0>$rZp&mbTU z%N|&Bv#S|CS|wg3dHs>AvYo$vJ@DX}8Df@A<-z#4WYS9E(rN&N8v`|{?{Wb{@NY9d zlnKOV8}95T>J_t^Vv{Rj5MGLn_}!al=06E)X!NEJ`QD`Zon;2s8^4LS8a=v+%9)Br zgAv`aeacB1w+6+ctYOBI2O=G^_)^65ew$P1VED=L55*VF&}KG&n-cw;inrQee#$i1 z_@tbdJNS*-fNS?^M$b;_Mmb)TC%KthHO-NEY?*1292lNyvNK9ra2Cx-1r*k zyZFRI-t(FtpmUcBcJ9$<$O>xr z1)8a8bb*ch62rv&_K>}SR#j;ZM=V|f6elBqA0S&#P>Z^KbV}W3OZ*3T=Idb8jZ&*I z?uTqY_|76$W=zQSt0&^!*IT_run23y9VpT31yyeq$WeWaNd#D*I*B<*YoBD&RA#91 zg<#vnkgwi;!BU4>smvwohlY@}ML?Ahr59JZW7uq?=omdJv!F2bj7dvw&B&K4+)gpb zwC3cy#Vjc?JBdSZU8a*}@$3lKs$Ld6Re9cQL{2r{n&cU*3^F!1_kQ>_ruH<$>$w4J z2{6WaK@A_3|4G37Cc!;zZz_~oybSNTAOhqIg;eQ>2@c(MaG+zpT#@C>+dsC^pXso% zIW<(q=n|tgSc~j-0TuJusi_Qr5%j1V~1lvEJE=7Ea_f2-s z@T}9QZ{~LhEWV`6?BS@SY}ExLT@sG6A!8>jF4*a7P_RfHP{Ux=dMWhhm%+Ix|(5x7mpSJx3s}DV?brU6YV`qy!yz8_=7(muzc-QFrCLcx#CcfN_*^*E9UPjI-kjG({uOtER3 z)!gt-zE41;>OfWFL)pW;F~f~Zi1|w3M`q{9x4u%domOEtMLFr;3hDrulD;J?=Fc?| z|D>}IgzBz6Vsmexh3iU{Ut^j>M_9ZbyGi!QCj;ov9?he4^aOAK;Dyz&z9PQG2~Wy0 z4qLb1lsaxB4-Ij)Lrul|MP3q|wFjCIb=&=z31Zf@^7Qe(bbz+g1@rc<>+8ZWx*L_1 zA^}&nnK?&~RO9%21g_f{KM|n=@a2TjV@$1MZ6vGaW33{hzPNi9#J9(0sU`uOb6c}K zn>u0MiruiwXD(xFm0I-a8=qZuQo9!lk7BV0eu)6$w1@Au<~s1VH+;c9N?Z}SS zbgN~_YkJ*tesL0gG4v>2v^D%!!<5R8&-uAJpq@;ZFj(Jhztubx2yQZ}k?bTTio7ejH}wlEp|;|HaU7i-&gEkDGC-$cRMerEuP|F zoq(O3#z(&TI7}r8$9`(V7&0!v$rg7h-&j~X0-_{!7PpX zezV~-`EEM_Da`vNyq=&{WWzc(Zu~{fl$HeskLC_GX}>Ls|=Z-pi!?_B*r^QIVgH^c$nFncCA1+&!U2VjgLDK4Le zfbzw#7R05&+ovA$(xjyppQqnXc_a7T;-QE_<4BR*Gh%1jxWt%lo>jNCUaet_Fh$gv zRRdhHGYMK{%3%iCBr?Cz>_jHKfM7PVluj0uyU#0e7N3y$rmQK6w>s^`^Bu!o5lu-b zQ>@8unzqF=S;x3ynuCqOrbW+pNObyqV9ovWV&|Ov_=&EE`Ix~d37tdEk|>GfdW_m> z{{9l^o4NaYJ#1ULzo=Tc_O^HMk%-&ezJcB0MjhPyY@MIc@hdlM}dNJO1_2X44S)HO}ys% z9+rHllBNH{+gnDp)wONAP^>_KqAl*lp+IpfQX~`$9;|4K1a~jRo#3v)1C$b6T3m`W z1b4S0#fo?5zMtpS=iBdizaM-5AcG%sjG46<%sJOOkK?+!nBj_-7kRXLOh-aZZZ{%L%ur_}Ft>!4@smi%K)i^PgwA#d?8Ua!M!qwAOtpo(R{s8-?BxgLDsesN&rc+lN4uNn>bymF|4 z553-!a`I%x<53P6SR66>%E-XX#mV*@Pv26NXNBm?cW&#Ld)h@Xi_>d2MII9gI;vE4ii zrg{<5Puo%{9AoY40cC2GSwb*!r%7TfW#JuO^ban#=ImjFRw3F`-B52hROM$X-TeW; z)T3i*DZn?NNzlKeb(8g!kkXc**1|~kCv!Mr!Fvo3h;9Evx4J@!^gVWmM-KC@(-ZfQ z<3%Y&cwB{+H*)^vf)G!hMTU_!eUoAo-BS3Hs*eX}|mh zvfL4cdoBDp))B;XN@bi*4a5et%cYL6KWANC=*VJ9xsyM6cu&}{c?CggdriI-zN6&+ zW~5guQvXy@EmMJ zJz^Ol*ZXH*Ha7o3<7xQ)n6HJu=fQ_dy1_*wTD%Hq7n5`8IB8?t9K}ksBDajIJH?st zJym!=L9H@nL7irU_f_(q&P?gjGp*-u;k13&Y8CMM+-g`ji?_R|Om@a3LxpAGa90-m z68>bcc`&+y&n>N_y0A>xVY7`#vSTS~nA$*dZ|X%0qAbd74i_0?M9|z+Q3Lv-v>QM% zSx?dTxvXYLH6H6#rna#X|0eNoFMbLJR8f{2?FAW%i&s^{$B+J?Ihzb@bulV*TzNQS z@}ZTw`U$OdwT1pB2$6ErTtZ98u3W{VIM>hHWI5`db09Io#VJQ;D5D?V53^pTdwCod z>ICK{iUSb$Qg(5t(kvF4lKJp zu#p=~-)nov6};$nU!eR zm3v%qO?MFPSLv^R&`#jPpkf-qXPG4~m7+_PLPEznfMm}WUcGwxu3n8ZX~h0BjutNM zvR^i;YT`;~sJ{#VYA2DBOEVgFn*yDKxte6+agKp(fA^@huPdGL@Nb0CYt9E$F}?Dn zk0&XCK!fqVE#$5KK{HOi(M5H9V&TAdY0?~yMF0FL)}3CxnO?2GdV78-q-1k?tK{HN z)8j*XTTn(-7LVQMOn|Ae0+uYrBsD5Oe&Wi1_lcYXaZ|ZPq|#w&W1I%o$H~ZKdTL4) zaGB-Pm{xnnpd7$(Ni(Gfccq365lWzHGMTPV;0!;ilVJ#`R4Nm~XrA9EGuleUgo!e; zHSH4m1`u_q`2e)G&A}Z*$^NEDkms*bw)tZ(iX)J2Xf{po5kY#|S^Wa{`Ci1bQHS8R zw;xsfUMJtu`Bu#Vm1KJ1>sF(_*46H3;VbbGpa32YsbTr*`p*e^lZPts#j=f20Ad!s z0XkUtWy`^uQ(5M9Zb8}kc@-72;$ZtCQ>E!v$=U$Pm*&Le-^w@W_jb(BIejzT^PC%n zDT>yuZfjzq-nsf!8_i~%{Zzzpa~Mio!1ef`ypOkFC#v;RUVawIwAXtN$YVBv>ty%! z-OC3E^iA&?Kl~CCH1etV_@35hRQi;BvfM?Nt<^T8t_C+Hg2dE31?o*pZ8&%z3`)L! z#7XR7TX32#U?K38)z;x%d?@CTQmw~lyZJofP12R2UHIZq|TRWh40m@?JzE{hqb_0dkM6kF`JTd z<6dU0)t-jt6%}|MY@9gSD|ob!6Xb>A6s5e>o;k<3phKQ%nh3q9@9cjj>yhhn^0K(` zXD_>W#>eois0MZ`VPX^y{Z)tZD#h~l?Kr0O|dHnUVw!<4goXe4#D$ab|&2ELq z&WR;Y1EpE~9f7z0&k;Cc=syUGf9J0sy8lzC-v18`>Psym*mtH$OO=`$^WP0c@kUqleb4#*m=(!zyr^fe3zRMWXw6RwFQXYjx=gC6EqMnur2O5^qa_ zBu1ng`hWFzpa7Eju{{Z`C01kah<^ekxBmi=0I9(h>V-{WutIANQ~vh%MW6TbE;b2T zN>gWfl~ofhCw*7UExoiStUwtqTffDz)&p?@%2O~n6XwxGFP2d^>l z*lT(rL4R8ABDKW1Fd|sw^|`V;wTJY8@m`u?Cs^=(4XX{n40SnA+X*}Qj5Jg4N8fO zao#{jHr`DHs{{0o(7*LNI11U#=BRwO$G-R*qVWHBh$8FXAquUZRLbYo>>_ar14O)u z%o3hdK(&6Fm>9J%Z}L%ag-T?ZGWCC!o!$~E2H25lJ8>Pn`~QJr^ZK7DHX@MWze<-V zgh%o}5T5^7ZDKFVQHu?UO0i3=UhleEjDbjbP2?2Fa%+X7H6o~e;lX&4``cF4Wa6SH zNy0mX67>HPEzt%X&VI~Ay?I``P^%om-f~G7rpOAd0#`)nwmfC#R6R`@vHZb$EkHAH zCRu#&_UO)TYChx-T6Ik_oB*LV5ScT+?!zmQ&X+S3r;c*Cco4JJ8xNj{08YWz<0z%- zonSi5@$B4+K>WVn=-zqNC{ z-udO2*271C)|kAf`Zotl`QJELrDRs(g~U^(q8tT-A+3ui%=2lUs5kGlc4WZKk1zh9 zp_cJGT@>-hRW=r=dMCEw(`A3UlI~yI{r(Rc*ViDg0hDw55ASs3Z}0R!tlEFIE4dF6 z-u^h)Ls2>ZU(so(P2-<*D~7s^OUmKD#;Xl#iZxM6A*xbwy|eOa$WBKoZJVI0N#(|0G*%Ic#uE99 z#yS|%c{50O;~JCsb*TCo*EP`A-8%i1fvZh%a#2GipM5*$9NqkZufH1p=8I=>5NPB= ztE)e#l(ebrRmWA69v$vEdD^~+J3(UC=1rpRC=qF8@WfPD{SO*`TNzv5Rr}A= zGoL?bF&>t_9+l3hf~mDc5GGYmpMDZwiyGyWikyxiTh`JZOAFy6jL*_Li!)hV&NajU zn08wI4>!9Q6-`+^@kg=@^fe?wmb#_5c*oh=$moz5 zaejhY>K%0*npNFLwoS6&WH)@GNR`OpccI4zL&TWQ(~|84%PYJbFOTPQ?7x*y2E+>~ zjY+>h-DSHS!IR9uHkn{Kp$(EDSiAHX3R|G^z5U zX!HTX7j|4;Pk#!$3aNcORc&n9Vy#<(>NovLJeg)-ZfD2M)8QZbTC__~%08n893NJGc$sbmTyFje=Fwr)`k!QKgx|5`(* zm~9&onfpY?-gT2F4H#)m>hz>m$|zv!kr?mOP?|ONWoTaT%t}I}y=mE#u>?3ol_ zIb5n}fN)1@!QD#4DUgxfg`mCw0K|LrNSTGt@lBu=MG6dy#S!m0^P>LSJGMV)_BiC7 zqz)AKB9E*j#^U2x300c_=A6mA;*Us}pl7MV2+iOWmM6@dUk}V=etCsenGFjaLR)vo z#&Orl4omL(#x1aZ<$v`QCGHpd3{!Pg%xM+>8KaY1W-Dh5)R{isk;P!{Bun1saz+(C zpP?r8$@Kc++obbW0Xx$|H>xeH$BG@GBveMNtTm69#PE*j?(?Bh#5#RwBVV*SaphUb zR#dC{ddqL4M~g~47lYcE*Z{wVVuqJw`I;Z|JIq9tx5?OpA2ZsDUK~As2rupDiaTjB zGzJ5yMWzDY#Xv7X`!K2X-`DxC0~wmFE+JEVSM{lk{&NJ-o+*_f%*~sS8r14=s0n8D zu^ssmThZHoTLp-ooP{_mKNy2)16(-BueO&#g~GNsD3w3H@0Ms1MO@Z{T; zqDQ07=LO$HQ#qA`kiuhQo&xW5u?k}FZQ{?D`#Qi>FdrsFcD&Z#aslckg0|V>VWFdM z9B3Vt`9q=q<}fgb&_fBTbsWc#p0-%o$r#n2X|k*o@ECGS3)1;g9d2*Vza^0zmo?NoTpk)aWV8^PmP&>vmz#jW#jbh!sJ$oLvY_FI0x?v1c2FY*cP=~h+7mwvAr z7LLf@v{773DT6)G{KCp(biN+Rd2}$|nLLPlT201<<9vi`FhsYS0BARcAV*a`%oHgm zt@BiLNIA8Qc=)fqca(=fh!Z%ULaR4Ut~G)NXNGCPm7DefMlNjt&4=|_LVu68_Y%PPDP2HEhkSuT8^{Qe(`gBZaD_#)Q8&7Ifx8~sh5Er zTvIr3v=!44q?=Q$SjCK&$*AxyPrakL|1oApZ0Te5hxVkWN(7c8!vu$?>&X|RqBEbg zN^fcG5_0^1w}nu1I%by@)nhYBO2 zb*kApScqps`1384U_LUGCuIRWY>)l5mIC_4xP_z#jP`e*EIB%Q&oINOT;2xCMPl_< zV8K5=STl0%EjOqAD%qTa=fqGl4spMI*`4qj?len&O^0e)TGKLJt=O^@ZOY|p(yEe7 zUc%?9DGyL)4T?E-zZ*KQ3A!qZ>|pyv>#SfifsBkZqMc23Lks%a59|+mHcuW1U+oIl zCy5(Xb-#2Oxh_likzNTc0wxHER9^`OO`K3>zre3~?f+C+jD=7slnSaqXf-6hrXLd?H83l^}s*ao7sr zz{L(8ki62ULyIMH(4S^s))>{Pd~=*5lkOJQR}>@960S#NPMV4@SYNc&EiJHE60%)3?>zpd=+ z2b^xHjV6bKp_4r3?0i11Ow>?~y#&y*8L33yhob0aJpSou_D3J*qd9`fwBDd;N1X|g zT>052aOi(3$!h-YI-f50VEUq>yvW>MTHVF=WlP2x_{sayd3BE7U*%mVm($k%8&|5^ zf>;f0U0V;LLeKh6-8Oez+lfTz!0oZ;3p)N2q#H0Y)JfqDnI_g>n>Okf)TSy`UT|4J z<3eXs*!+v+o>{-CyM=paGzDy@iF%F>>MRTsQ4}jPU@Nn$dOVPC6kYU7O z32Mo9bawEzb@SRase?Bh@cA+Tk*DvmP&bGFN$`<>d(rkWudS5Ggr!#HE%TMxj*Q^7 z`}*$@k+VCZP`?4kxtZiONhJ|!Q++|N^jAgY=@r4KDT-n@_jPG~5gZ_VZw z#P5iW1-ad5y`dU^DfA<2f2-%-9Q)qUr8Z+hFSV}h2a07ubuZ7?IqY^hM0|nAS4{bK zslf$)Zq51n25fJLvvYvJ{p+X9lzoZ*If&V??-(@`{l4JxiElXMjStTQsk~!;h4o5d z^?*f}h6X{6zr}@;`&vs6KV&TGp&ash|Bst}cAPl_CKU;7rSr&|-3j&f6NnjPv2}_M zAbxhAE%WiTvn(2f|mzk#Y%U6mmSF<%WX)MD>H`b1%I|MAbG)Lka z$;xn8S;5V7a)6fwzK1C2j+-j$t{GMS&1N)i8g@N*hTXvCB0wQwn8e z55$2NYpYRm=0`QZBK7oh5ZG)2Hf6E?7^NiGpcK9NgEo1fS7!eK+oAj$lA$@3rywsI z@_JwD;pDD$+Q^s*L?pI(6*lPLByq`Bq>MoqylDfUu59Q>P^BptjJ9GUMd)+HV$N7{ z3-Vgf*mEDkDe>8bKm6B7OJgMlGW3dOlrTi35(SJcgEAwuK&n{DT$W%a) zsPNl^R^{I4I?!oqfYlvx*RTIyVj?D>8Kw}Owrf=%Uqwdio=!*Dd5c9e zL;jgdlS>X;=6gYWXIs=cjJlH)bZONtLDv<@*Lsf2`hK{ zJpS8h+O$65{g3>68p7RlW~__~XNpJr_whJops2ZKD89DcrcoxRhXerXhQq;)8S6BT z{CQVz=iz7bmViC-``~OEa>QCz3LVF_KCoaz2J}sDVL0B7TY4by8C8m{Y|TLW@>>-i z9{8~s-Xf8l>>i@b_oWQeL^*eZl_F#atWaw!QI|vSigpazKl6j{sygW9Si5d_&In6T zcNI-t$^OKJ#TBGW&c!xns&$~72L?6ZDT^|YE=cF6*#pVA24-lJ#b|&!NPfC|rN$*0 zw?^ajdBc{McRG#X%MMDzi7yFt+J6t?93YBTp4A@-*U*`0gR>SX`RXU*o{{ly8QE(a zbrEhtUsug3mUy;}{NmLRBPMD;58GNc;JO^rq>XruB{MZ|F<0?ZMQtmM))nZ<3P)>5 zYFgOGajGDnhu1>On1>tpW@0OyPLCURzIRafWg|o(RrTt$9>~_g^AAp_3PFBsxRiGX z`+V3Q6247x3;B4mJ}yR}ZgI>b>N*+jKWKmrTGzlNA}^`2drV4XLlR zzf$NrGizoisZbT1#gY)=R6HrCz?b2Zlk|J{_HZ8%iI(%Gy^HaOA6hqgyKWWcO#;KG z6gANrF8k=Tob=H3jNb~))R;%2=L?f!_pLezV;3g&2eoEgDWdz!YL+>pka=T8;F`*= zy5hQ`;LUXE_qwxBsbH6)l#0$`TvRYkvz3^7fvdMPD}7bokq7RU`hy06L$`DF^e4;q z4mCVH=Gu5tuki!;Arp&w+Btqm=GXQgo{cJ}^%m?S0f{9!tbnn{H`5(HW%@5vxqJYj zJF&$U6=Je1e(Pz&5VH?)sP%j65s~)F4QT=*LtxFFoQs+5k}f60M`3SRHCo5HJ0x-Y z4*i1pbnj*wKT1|lqxhBWn=dam?72$;+3dD6c*ffpNaBwPgC7$fr0kty;>nhqGrz@T zxqpp>DUT?pI$5ZT39!68Woew&P)HS>MSp*Ug78xtidE#p@LjM}oE@}i1B)N-IV(f- zN*bUA4TMGq$OQR|Z!(C+UEs`q^lj(4m9ACexEsheP{h#txQFr?yPO=XJ~x?w!>9gx zS_-03G#w;ulSVT}QUjIHosC{Qj?ItYGJ7Ty+w9)`33q+#BR{R3_SYWIBaBF^)ob87 za?%d(h{l%lh^y55>dXw!*dRI3sGA~qrl$3NX?=O~YZrw@Ju>3i!@k7lLb3{_VR{ZW zPTz)^0j#XWc!IB;^?R;o4hA|(OoPKM`yk{(8ErH*h(`7TA2VQocd|lUpTDxD)U(;Q z3^=WmFZTZ6L`GzVqKo)WeWSF&Vyd@lG<0(tpD29LO8!e#idVr{aXE*<)F70r@Mp3%ZC?fL3~+3^M(bE zzRVl)Ahp(dN-slIy-HbC;}X6B9u0}lQX!-aowEaPg@7_Y)2}+){F(0F&E~~9+wpud z;1R|jA$fdKQ@8<-Fdk2pOiu|rmhq7MHmBHm+wc8`j_q5a-aHo&ph_R3l(sgb-Ox5E zd@D0?8}Uue!!^0r-ZLE%+S6>OqAm;m>2#7!QXs2wmfOdMBu)Svk5U#ucd1RShMx&h zgy%uVe9_&6W;m;mb6a*%5PGTI$(QQtFzR>+Otbnh&sO1xV@N8b9@*} z`o0Ix`UUn4jSnve@x(e}qn6o5{yjb}&aqVpI&D3HEpFDect3zR(BWzrz8V*SZ#y7^|ucj+wGAF;3ZON8*{CJ7* z!Vhdml;`94#SWg;*X6vQcnCfpXs*uul+LIEs^3@NOmwB8+?Bm+or>cZm(B<+uY1?r z>z(vbeKGu-@(`LQ=IX=y7a4ZpR7rS?jhdw^?qv+IPj;TupV0)$?-^$g6O#C<$KhQ= zG?M9!peQgf^Fvky$t^C>Smkz@B}Df+BsB=C>YkSxT^^e%sy^ZJQ+%WL9A?R=Pc68g zI0R%Zlvq(6s2n4d9bX?mas!Uh{X!SfgXEv&04G~GDZhy=%0R6OL7cvJZelrdV^u|4 zvNr*(K_SfdB`c3UcQxRw>7Dh2Ef&tP0*pvjP3WW6{Ygh#ab4I48Q;`3p5={|`)1u` z+-dtuEO(NN?)Xo%#&fPNSH~9$Se9?XJ4(dkI}4!iw!3VfE}9HMp}jvFe4Lo zgFx5(50kZ*zP8dLpk_Z9n9zvl?rr;W=H!pHSHQ(3<#gl%`+O3rq&VztnUpdBAz{%8 zT}>bX^lurB-?s$5y*48+d@ka84a;wpruFB%b92F1UFvu}9o^c31yfuAfByghxfk#- zRESZx$G3iZ&?l3!|2cCh6=XLRvw;y|_o=padf^#K!|)xx=Et`-ynQ=`m89Pba(MbA z7fVw@Hw)=3f9RfkiS%dfa-L@G^cb6TiLh_y*fiRf?oRCOt1pRI0KYFn{s2Atx*t+N z`L2@7n4-dP?XMG9qS|)p;L}A5npgoTlQ=G$(&0iA&i^j9C8#( zBN8bt^S$I0I&p8X%)&_lk8yIGoeO>OYC)0m5ff7;t~d-?~hA-6wQs)i^2 zU_>u}nu0Szys86oMRZfU&N6>n`-W_r<6BJ+Mfrdv1|l z(P!g^?Ls~ys+2ZJnW{s>Ixbp~yoz~9grW}3@PMxVs4c2Szi2Ect0e2xE$z)RV@R~l z`htHOc=5(MXzk9Rm3V6YLONqzHwMUFcRvMLY~r!E$20Vi1&kEPjH9jIN75BcKdgmk z{mA*SN|zl~UQ;{PnQgCWnzbjb+n9{Y_Qhnz0`gi_}g%6eaX^aWm*H-4_9 z{Q@V-Nsl$;jN<4Y{Dby5fog(*Nc1s%u)ggGZ;=+y{kB6Mzf!t?!XcUV&@l+jX%+LIuuY)I5` zgRxfcz_EUEuZ{I_PJ_74Cj5n5?gu5Tj!4a)!4S~b2M6CQ4N^7E-PA!>yUnq@VPI%o zyRt(Gd#&icI{EK_$3naWu;sVQuHM2;gjbE7&y681>@8%2F0w>#tQ{%ps~L+(k@s2I z!?)y)7o*}dZ-KE9la5))ulsXgF84y^({sbYeTcf-0)498{qu{x$goe8XB15GVFRob z(?P^I$lr&@h|>8O-F<=p$NJ%>-sptnLVkRgMApt#IqhvfS|4*xO2fV2fCD{vgUxS4 z0qy1=?FLm*pz$s4Fo5|;I)4KlkZzL|&l~J!F)mkfEQ?PUnl~i$q~+_wtM%-c3#t5L zZ~NZ~sBmbr2dob8(cg_~kPua7Io#lZB^3A!#TT?|xG8s885>Oq6~SK-okR8F?5-&% zixRY-PNGMzd?z5UBB--n{RZ=X^1hvkiC^W$$@bx6RXX1JFmPYd6W{ti?2e+r*}UR$lle$| zp|*|H?^c?)ftf~B8w_PNc^eb%JGSZc@MEoOykr}F9yOnATf1#m|7v%J+Mt{u0qv_Q zN4xBEk#lXY$WiZ-_B4di`684Bi^%*_oAi?XfX-BSUp0rEhW28@f$hn;WVlIMeZk^r z1%nTNEN18pTD!GLd)aawpYL3ou|A5$E*|udph$EZ+Dl5Pb+~UA6+N?!&Vbs_>Ft#c9K2E{;o zA=3*neNoY}98j*_(t_a`P3XN$sZz%W$Ct*uJZ7-2mx9^m+&nQrD~>lx4LsrI3FQMLrY8Pd=Zlc@@BR_nK{?PRG~*dGse zNlM;dj9MEv%R87r0SZvzQVM8w=w`j1b_)8zryQcwd%LW7xKrj;XcxCWlEB#&PaISLq}ubx#=1YeV@>D1AH$ zb}^N`<2-Gw3NeX}tMuWJLZfuvL6Tjdh{-+85zkDu(pw%Ec|R)~b%01Hrl_;FMX{J!{FuGhRed1F4a z5RagX)(ekhCVGm#SX3)N@x+Ug?qW*(#e@)RhPu_uiq9aIG;{+(Q8LADB~+;-R8x&8 z!>ou1@N!rmbYUV>YfkY*H}SL{sM|)1`&FVdbvh&@#J2qlfa26gG<^2O9&6X>K-sq> zj$T}n;$~UfhVqT_28hfw|eD)}Abqf>Ba*MiuW}xoeZV9;%)~9E@++t~vBFguy zEatS~hXteup|^OmjT=HRD3tmo6o{{&@Xca$Pj}UjHVX{ns@J3^!vrUr0^Zvnh$1tfUxM;(^O9zvNB}%T0eu6ohnRi zaTdWI}P1`KF-R1gv6vYo{ z?g%8w(1q*e4rSam@JLgBU_aw{c=uYF?p;X%VS(NSoy;@#VO5V2i?dn~zN#Myov?q< zzBDT=irA@?05R9hPbKL(0akybEsHFtd1{o)+VSag?2k)w;f6cwB~hVo_GkR=-<1(? zhYfGz!8ly(vD4wF>pBhbuuce&biy3rdnhz6;B7+g$j^vm5}arf36l!TA*m)q6)w|F zDE*<$2`v!TC~D08%64)t1V@Sd94~%#4Nk}Py~&Zp6QV1a zyqTsA9kN+t*5O=ktU<&s*3q!aVzNEQu!HCbB9DHT62B5}FoCydWb|(z*eW|DYEIhW z@PN;EHH&}BeL?C4h9x+}NZ)dJUPba3K6@^QcI5|f`@mfPJ3NI1zi#iV!@ z8?rXa<9!khgTgDkchR*l&u@FDzfMyX0}p1Ps+s;>-}Uk`vPYL%hMiTjQaDn2-LZVq zZilqhNW?>5%_qF(((WoZY8gw3akqkxedyKTr_ME!ucW~{ZZ0&rt#S;o)2>j+l@FYP z%v7ps7mtC7w{S$fM^7iZUmyJ7Fb9BwQUqc>$-4kw;SW#RvL8NP;9=C3nfVTLCRtB~3Ewde*~=5KLLD8zxGGrk^~$ot9f~+m z-RTR_FP>>Yfg?$2aS>qqq%5I%pXh;uIGF)sO7prby*DHLer;kkA7EtnMXZXg^$bSn z0B2GKr^^z&YG5b{@PsPtEaC-$n=45ZNGA92gPD|F)M)C0AEhVn!t#JYBRu+z<2c@SN@<9HxNG@uZ^Li-S2I4gP3i|B>pU_R+1F_nn*` z<5ffBRdksQ(M#bL^E%(d?Tu2q!^ZB$JS~HOekzIf;eN@IqMY0{Luw4~Z;GZAamD)-*dK@$AAtAbASR5QkoC@gbuI ztb8d5a%1Q35?tAOKf7-wdjJlr%-b$A5`fs8TkN)1mN8n%E39sT9J{<;AEKn2b~i z<6+>Vq)q;GA??_?peBP931?Cb8w;R0435vhlQA=&c(@=ZyI_qACE4d_S7QZ77%tXf zu)o&(3iV*guX%lNsCIrgb9hN9V(JG50|Y{HYcTH0R!U_gk!Ct?RqH8+cnQWhI&Bcj z`{>NGt3hTk!OvX+0hzmH5M7?`vk?Ql#|8|+G77{u7BKOk5krEK-;y#gTFxZ&cCtZ- zGqTUA<-`r|ZfFt%GhY$v??27^yVv9UU@&WA|rL{ zX*-8ynuP1Mm3yCW5blY_g~X_k^y9TIcZHPfI8l##0uPu+%4k4^wTVqLw1f4HsU;-o z@DExbvfQgyBHGsy?mHxO^CFjhGCGukL<#s*Gg=k$r>P-uh|h5|pkljt*O;8xixoT!d^` zFU2H!71o9NK}>Kkez4pCDIvN7fLzV~hp#z@%DXtbXc(vD`YfAkv;BEx@qMu7%8!%e zAVK|aiG?V_Iv85zigWaD9lov{z}uzdanLCt`ofAGDEI%`cC5w2Atd(6%M|{a}b+%$=N6z zEFcP8uMESUPPHsxNR+Y*{s<^ zAlj&^Yba{{$yr5|o}O*bn+>QT^KxEO#h@P0{u2V^_pb;LYGBUPvzMr^V2qB!jWn@Q zaL!*bq9%G7)s0P2uAjMYp?=unq+`g!i){+}r^&=A-*8uEAWV|*DM+JI+r+TGmmZ&Rw z{Z}k%ld*?Nc%M`pAP)YDVb#7h#no|lnsZVQ<&b}=W$6{b=!!@&UfLSvJxGA@BZ{>u zb$&q~+|FcDjq(4WasL&j6CBgFy+?)Vzi3u^hPNG0x8X-Y^XWs7mO`mAP4#x$5n~_i zt&s#iBW{W~;F^J2#QpSXm!y`}u zwk0DpTwmaAHx2MLZ*4Zuiuh?kZsZt}<%zQ^7cGjXoQW91bu)iMrniQLH_ly9A(!e8X|NyF)Pgiz;qWm6!nc%yp~YFOofQF7J$MV|$d=i#I-RyNIWeWD!On zWp@5pq~2P=0sFg@iF5SdEtOc>q_}!<)sYiAA zi8M-hBxr4Tj|U<-E97M6AQHt{7904<(asa(+_+1fmu9PlRe9zd<&j8Eju(_m-lFzO zbB}r=?hD;wXkscPM3$$F+&{SVFU+h66^Q?p>7wTPM@-GP1jk%bm7SrADeeuW(sHg%>`6Iew-Tay&=Ft0S~+Y+1+Zi4rO06%ix`S{ki^lGciu#4%p3 z!wC|B!RTfj;lH`#Ml^v)K#B^G@Qoh66>75oGHI7JlGGix&Wf0mHmTVF`;Zj9jXuo` zWQLV<5H>a>YBrQVA|sSVi~g+E>{EM0!!|Q5rTsxiVaa`}TWXpzm6F7O=;gYJLo?!= zeB|QC6n3(5tEaM1hVAms7k^FlX$YtG_%$t2ht6tX3R^Ag^=`nEhoLx9_jR^zdeV89 z0e^z{Lpl?}b!+!n69V!@&HEeAAGPJ!svyg@R8BY5 zt^!yGXRcI&EY$@z>}(Bpiw}}^#ZgtSV)jgId*T8(yT9W*_}FvilQ(S*sD{=TQG$%T z=6X`OS@PRjtO7QS?aOm1Vir`5_*l;Ht=L$?K1~qsAp@_;Cl>M7HxC>WnhoE2<~6Dr z`(+0UJY$mh=|&|7*%ra>an&gb_JkxV?{aNxrDtMpdU%^mrfAJcVr}&GPX+p^n>tMv z%x#RmnZ_$%DV)jL;$lci^b*H^FjJD#6wjHSy^6aknS3iEsAA@>p3?R~;=6n4t141( zjipwv=#eD72QEH%Mt(y~Oky1F8i5Pf$q+7o_I$AgfGaE6|4sWNfRLQXBKcE;JG$Wo ztgy=6oz~j1X@z@YtuL|4m*=>yH&uM09$28wXS?flIt=hbOB-0!<}Gf2=?UJx^@1&(CF4lQCn0qTqvgy zx%!Uset^dNIt4GyvBYy_5J2LKO)KeW5M<)Cg5d(#t^V_U&7>J6Jgv+Nbbt@rx?Hfm zZ67FY4rO6|tR2I}fIe%Lm%8)^jaK|<$L7kad4XlrEZVPI2{e(I%fEa7BYW|~5eKFvoH**&^n&{RX#Co`>y zn|!;Rv*R>@oaTb4tQ+blUqh7T!HwaFydeNdQZQN-+IIFqT#)m+?p{plV2@75^p#$T zxA$Ot@ORPJ9xJi}G(9TwjuB>8BpI9pN}`>YYVb2n7Q~tBBFjPqs2kFF&G}Qb)HrQk zWxrlV9KLdo1$c#e(z`T7Uq~^;3wSEUSOOs>XQhBuk%ye2j zFe{onE&vHZ+Y9}u4BzQBK9on3`|@%t9#0e0<4RUk;L;p>j|fmc-G7NixE6kSC#i&;=4k`h#`)zR#^Q;mT(!M`OY_U0Ve27sD*Dr-o;m ztf6(j=z~$h#g^kI%~T1ZEC~ zGSK&y5cQc!75>uKQeJB?ifeSZa^tCGLPbqvea(!)PmeY~g;k<jRu~Ez{kb`Ld&) zdSPVS2jgK`v1zGwC`}+4pk7lt>MTmtn^oic45 zSJX*RHVa*}DqW2nwM#0az^cEFVPrT=^)y{$NgphxH}@Qk%-c5`87sCZo_io0BWUFW zLt(bo1yJ-NZAejGJ;by^^K+T$Z0 zedIhd6h(k(CflPDQQ-2{myU6#D%r9s9i%b|N1eQ zI?XvWI3*ShjjV(wx|(8y0mXdR{k{LA*l*N@;$P;$~7i z?IWo3MAo@{$ZUE}wW<~S~CrXCYSaIsCw1tz1 zz+qIW$%yV&(PFrb`^@GQk>U~$2r`_Klv-%cvc{l4P-gn1QKu#fwP00U2tJH!e5EUX zK=oGp`O6w+QOa}E6(y)%+HABGomMhO?NPem$Q5tto0bNWL(aFpI;dswOs~m)clKsPr@wVH0zE#;2M`-qR>;cwdS_xyC^3$f4g*(ivaVAn zQ8VX^%r`a2_#wPYRNK_*axoa?2ysf!@wQ#3}ogB|xdH zkZrzW0C8+v)m9JU1Qv3qCHo#$@}@eLEtvu#o4#_IDEBuVjtvbs!2Qp$N^CU~wY^2M()VZ=RUi@N%HPkj zg%G9223oeXWUClQ$&2rH$c4Y`T^6GKRE~p|682W8;7g$4vDLadJFD3(E`4jlJoN=T z5-+{W{}5Sa@qO%aYShP&fiQxN`C?y2Jg+r$o;wn-*_S{8+*Kl#ZO9=?x#OfW-TqbNh)_$&?Q{$_HhY&Az zKEk=bB(K^z8MYTJZkUfscp><`nJjodzK_o$L`i)$&@cJe$g`49Ps9AZp{1sh$NAJhYI=`Q%MBvx-6NSvMxEv7JkLsfq<1(HoB z2*b-Cg6W+h0roRE3@X_+*|zCug)v5_lrE}D+!bs-*2tt4v{yu1Z5Sl=6O@T}H3pU$q?Cl>>xtql$J!+c@=1FJzcvg+zlSSFP$EIr z4GVZK4KT~J19cc4&NVXjeG5L@bS)kt^t6RM8sgj0q$KqLM(x-*V&fKfl`L7o$5FwO zTf#;ie8;f4F~f1Aw|;%mc~HFo$6i(lKRj&Tz#HqXFCxP^1MdnRB_9GiSx+d~o)&;= zD1=0?51ar!a^h&VtKzQHIBz}rT@uA_^zsyjJUe-9ua7JGhFS^-1*m|+k=FHkIr%%B z+gNOO!8cixt$p4Ar!2G0T|<)!74|dvI1yX7tFd2<+uAQw1!?8g+N;AwM7JkrTIGC0 zFZa1TPXP8?h0hz!;)%G=us3sP-q+r*7v+e+#mf1fu{u27*6`t2{FoTr(Gl=)tWgM? za;Ss9Yr=$bs3`A~@aN^)kNrQ4y=7FJ-@dMmwYUXq@f0WoYk}g$izE~a?xjE}?yjXs zp*X=^f(I*Z1&Ujdpb4e8yS3Q=&02e}{qAwb`Eb57NC?l&Gv{+(zw2Jshi#@zPOXcc zjuy`Sq1`JRYioEl^5&%p1lFX~&x@BFs$AlFt5=a21!8*wf7eUr5au2+zM}RzhzX$AwTUs1pSrkQ1xl?WLze>S zmWm^H;Su;C3OL|?M zt}ARy`I$vuLG^9ta&U2uS~y-14Z96f@bOWe9Sl{&oopAfhXM{q5$R2o+jDV?OaIEt zpaHuQc`^$O_3%I%*5JZpvmHU5DoBwO)I106W_~z?l-ZWItct{I58`?;Zhz}k@U^5m z(ds4fb5TA8!d_z)Romg~Jtd7!uunLSSM_Wb?TlPwxkag{qjnjw!BgDt_n8r=G~u?R z46b!+n!5xBgtv&#F*M$Lg?YOsQ99XMMMr^bVa8hFZSa)TW@R-)VJgwD3T~SD#=&@$ z^SDg^V9nJX0StUI2-pRG%gO6B;1J5>xn>7l*1S?(T!pYTb0~ha$yPt0-Z;m)tA)yN z2fhz2E#R$_Qrsv|e{HG)RR>@X_`i$zdG}r0sF88=wbyG;e}buUUa90BgARqnafNXZ zb_B9`SWe{;H>6gUMJFcy=f1wfO#wo&(qbsis*oG0sW8liirv$~MFH8a;Q|d`A|-Y^ zFZoKTli-fn;>#(P`;$cWrD*dB>M&SkZ$sz;6vw?)J&F7X|IpOlz8t=H#pmv=sB6a9kKGN67m(!rz4dMnmM(7zeF>#Mm5`=fUt*OFCq<-gP0qx zDv|;8M@x|3`>~_WSd#V$*C07E?5m+u>~InCH^p7bzx0AIdYD3{0m%vBpN?sOMiJfS zbnIdEKp~Xyjof-u`n1vc>LtB@RPy$KZjW2l#IPN}G_D^$r{L6#42je<@$5@PI?3TN zTAsHKkO5X&$oqM&Vv(nKJXhJNWo{@i2a)DpN`79)(j>Hj=M-ow-FRKIx($dm7B?I| zW||-V2P^s08iP0e&FR>!?@8V%{N114Kcq8l5!dcchh+_d=q5X4OYi%ZNLUjMW5j^l zu!X%m&0>GQ`|R_QHp~c^TF7vp8HSVPg95rQykAJk!k!mFw6o3{=PdPQ6KsAGQET(fS^n#M@<0!{| zHm!dAT|?bwLw`ix zf&CFJLqyt|+AnjyUE;teyD61^WN!EcLm2ZcjTb%<&~$NTqVK~=+DhO@<0KsU6vjt* zzgcvCUtAMa2mjv4vJu&LOW~@cjIwpK`S_x|Kflrs;9pcOy)0n*sL+$C{^UNk<%w-1 zerN(VsOdVj1#>*-O;#_6%Y@8pO*Sdtu>$TWAk2=ZF*@*Aqg}U?gT8yo)>+= zb)XLTMV`-%+gh?zkG863c-PU`2T4t$nq*H#?SIM}3$(=*LE3(O{o|Q4U;5Fj_2`6Z zBauBjl(H3*QIb*hFQATha>Wj7A&$s2a>N0=q&eL>ERc?H7Nbi`FLi)r&HI}Le-%0!I6UGdA3Qb#EZjSwRKZt z-5zMBwrZpg$fGI*mXAsFIhnh&$$r@dEPOC6O}e_CgVL7#eTPMa1SB4ZkZ;G#i+EVF zBU>{#0=abo_BNM)0l(;f(Ye>vZY#i;J8vlj9=^lfj<0?PaI~HZoUjFU7;UuL&j&p7 z*&k;7}cCs)Yvk-Nl;mR3B z4o*%Sb2x0j3VhM$F`aEyuT3ivU|#EsQV)}mGt)ay?2U8lGIC$g@7|@Hr|bvLA(v(* z;R<;AJJRrl%&L6~7kz5mU!UG3;Uz_E0e$C$8 zb^Jb9@SC3pGFMqrv&HJ>wuect&BIZfdFrUuAMa;L)dh&CK(-OR8fXPuY*tUL?k79; z$?MKf%jHG%;=SfdZ<(`xc@qdio$O&Y>}5@@{g?$Z>v z?IuW4`L{OY&VcbA6F{s$u3;^Kk<^W)M#Y}ieB6|sjIp_`&40i z&a^ukJvU#9V2L3!HX4zqN={C>)!$TBvtPUs87*_Hy<}28?MBtydW}*%ygZm>)g)7JIlDVLcf(q z>;kG%?Y}B>6>=wHAH=t3|8cEPO@>E9`o7M|2R87@L)#eEDELQ{tiDSRkpD7Y`)>B{ zM7s35RX4DpDSJ}0`XvAijp9U>Vfs2VPs(De)>C6R^LLjD^Fnqw_R7xQ9PhtsI0*XG zIC!-hz`kRv654;O5B}1NdusZ*^mDXBSjURVi(?+2p$jbfJ@U^QQHR9$g=o5O`%Vl! zL5%he;YR$-&!q=5PU=uVObMWKMq-}n)_0yLS=pV(lJgjT|Gnsd*Z1F%eIBI5rNSA+0Mj!KF?fUtHlPf^TUTl*BRbat(k~50Vm!y8)B=f)m=`st` z;~?~Y3`Kj((`-2(6)1x5III9NkUwnaF3HLTnU1Z$C#G*~y&Y9K=F!?8xs7~P5A>3% zsw#JzUH`%QqF1}_&=|00EU;v~wU#f&$cJ~9&0+YnmYv;Z&;G;yg}Ios1sR%EJ?gQZ z-uao)W_e?imjlb)Dce0yniw2WGGNrjCdE{!vG1cddSHAI-S*1+7-5M45y@K%|Yjs@S>_!C>%PuGOtx0xknYol!y zy490qgR~7LuY{X&jdH9t+M02OZWp)PQy3G7@ZSkEtz{eEkqPs*g6p&Oqbu*@c(*V7g@z?g0XY7JuI*@T-k9UHJg~b-qWJi5gL=y{jlYC3H4<&`HHA-i` zp(%5p{0#}El{Zqse4Dc5u943?POWpLHSQ}HWElIPHA-4q4&>p&m;U@ze%^GKWv_pX5ZUf<|u^P?MSCPUmawOSB?QBG3f zqVq?`r?Lm7G-KEx8GlwkT8={4x zr=6#D{*oW}`&yq3)J#uVHQj26iSxbie(k}duU;J7ClO?&*Pxf>r+B#|@RdVtRn>O( zZziPI#G2^m+K;R+7ueF5-%LA5WmiIC0n*g8wd+5rBhy+X6XIRE%6_i$4DE5N`pzVX z`IhjZ^N2Pge#E`L9cD-tJNl zcDU93a*eX`(&Rl>`GO9mjKVrr$cj#jx!#Y_4jS8}KOx*pfVhSVTuQcIi&w+A<>Wkvdk|o4HPv$aEsPYuoTOPG zEofTKdb}cT5)Jzu*M3d&H;|myFFMI|CGW=sMWu#XAhD%E_3KvB@07g5@@yPPtfj6~ z`L3~zAa*e+Qe_{PQp3-#={JRG)(Y+xKbPfHKbIZ0@B+;f9)Ejh%3`CTpg3-unvaU3 zk*KyzMB&ASU8=j#e3~KRJf+{8$>!T_CUf3R-+>yrwWb^S{b1%*(YFssxX6-JNm!3- zzyTRh6W@#;GekTP3*F1bjOBbC~8xVoHxZ^b+?cXxI3kb}0 zRyadi(`lah8Q-B8aKOcFvM}d&hyf={ARphRWHP!OBn9A>tT~!t`PSY1mLfBH@mE|dz!S{MKy}~hlZsA+fNsAPp5J@iv;pB1cC6aI3 zg!Ce5&@`X_C|a4M9+btkustqGp_}M)(C+9j2SK5dq!aJhJ$jWpEoGa9Y>+A;wCI-c zqMS7by+0ckjbgPmo8VtUmo!nTkq3sRj|CTH=4e$~k4c^IAMr zs@mWn3kKvSqs5ma+eDXUyjP`nZ_;<8pE@e~C+Uyz^DMvFc=tdV*Zb{oa$)pHU`_QH z=4fkG?v#?y$asB@<9BmiNiVNFX3~6anO?6SQb_F^pU?=jB7f_sC-5hZ=Q-6hLXEe5 z)C;1MWaL}{t0m~ZBm{%;nd%ewwVV;X&!F}7VG>)9Cll)0FGr{|6W!Rp zb|mdVY163XKcPY(ajqBQyMOf*n)Gs^6sjO)cGgWpz2$C88Clu8Pge*}EyW`{iP#Q` z9lf4Xxai9U_6h?HP(!H~Ha-?PR7vfn?*av^p(`RcnT^l@+Kg9qwGyo6GS@7UZn^>=S0{ zxvgiaP)uTTB%0!vH*AXOz_m*-W;7w?pW!jmq~ze|BUCpX`Ic9XE&Wc)8#?Gvk0)x# zqZ&JmN>bNZRQC#%(YUBw@}g?C5+l&Ia|A<8CVamx;UCDdB)}cl<03>x(@@cjWJfBj z#g4Av-q2bs%$({Yo~v=orNY;xy0j_~6Gv$WZ`tLz&uB(W&c0M*ZUJkdkmYaEz4G1v z)DRwIz=pqL+Zi!z_t~k{%$ZE(jTmX#eB7sv5EVH+H$pAhpGg1d98r!Za@HNRC9NC7 z)2UxhtEQ{H4J(>!N2rH2UNyJ=n8nLGLxA*TMl&~@o|&=RO9RzBOgPO_ODO?DXUy71 zh?1mKLkAjwS3v`iP{RsNsIv12^1#;emnX(=arVs^j}SJAQq1B~60DdVWN@S|lza?* zc)D19r;sCQy0Q?lIzwAVI|t~qQg*gdK`6xOz_5sZI0(1eRDLCbMnQ*VoKLRF{=t%6 zo#|=~D(7unym+%WCFPv8$iJ0=%zVCEti`1NB)ks_ndQAfZM>L6%7fIjN3yRS{S8yts*IvRQTHk-?CPhTNw~?1#`#OC9U` zQ1UlxHH)5j%RJsu9!=_L4lO9NH)YAsI!esH?AsA3AQ0@-eB4;!xCye)s;EBw7e2!E zKlsSJchVPJFK-bXeIk2P*`SZA6JcdB#jk&}_-ys;fExba z2^}I0y9(ofrL8?HlozLZCPn%iP%CQ=x)!N92KwtIQ70%7=Uu_itg1f_>UFi* z^U=W%XO^vpGNHdVtCwI(3J^PqEpU2qIT)+OcREiJ3C5NaUkdvazk6tiZ)SQKgaN{C zvqLWU_?+DqZIyw1XKdV78Fos)vE6U`%8Ag0D$C7cD!44uwI>)@zJ|2zzksmae}%XI zid1PfVv4W#(fSqnPx6^}9ym?Kg8NX?b>Dn^^hZhizjko&ORzT}QyEpuj4}JK}*eh2hrKzGMCJpz2^7_OWnkBnXl#y@DJ8=RWgpb zv{6lv87(ZQ0*~=ss08%0u4>R5MfN&oMY~UOrWK8E@;Ms~5}r`oEa<7F4hum|P?63t z2d(i|z>)!-4jgqES+)0YIq;D9PX~WpVcy+6B|qjeHsNh{{fbuLzfx!n?8Ox5(fpAi zH_duZG4s?V$^*6-7cSOHX`D1eM3&ge`phaslYj`FB*&#reMP-Q+un}4ApQCF8=GUq zu}hSD`XG>d3mlCuDXPhc9bSq`Qks<2yGwuo6s?*z7l<&rl>Z$H{}+#e-PAIFt?}v5&#I+LT z=H4ce+FnBxJ)=^gk`gk6Y~kQl&caC35qk`tO2uPr*Y$z-$bAienfdTf-n>vmJv4Qf1~$O?lEj8hJGm()T}X#+TQ z`dVH*Qy?pCcLK_R^><{eovBxmHIAD~!R`lR4LlGSGO?jcL`)k$4DFH7_cX%jMMC;_ zv0syToE)KN=}+!JXptMtMrW>(o7UKsTMkN{L;zJM(kQ@RnHLV)_e}QB-6(f%2VR4r zb8FGC;9w1l1){o`_umYSM^YNNX8ke^f;MzBVJMYdX0p9&v7+9U;}?;fyC)H5N{@BI ziXYQzxFbDfHia8}ga?g(Wj0BbzG+Id?HG!=yLv4_Jfe-g!49{=wAu~(ardou&=|gCk^9vUqm5Z z{R3X}Zq2ID&r#7Ca! z>bX!c#t)Sf{=$DTmAR5-D$%5Ag?;1z8*}bZ}AEp*^ z@nuoC0*uzp{A!VCLTs`Qh6FO{&f&X$*Aq^fD@=LemdrGj>Ed=Nsi3P(1y^C`lx87@ zrowJ&ou60dFkASa)vH!s_V3l(h*`bG|6aXjg7ri&%-ulK_E*>3wfZykD!K+RR(^VT zawwZhF)?(q)(8-khhhN*7Of@Yb*WPTVD=);8n_-0Au#(4JF|SxE;mIJ^ZfZScn80= ze6#hbO$zgNa|sXkqD@ACb}zLdAjZnwbhGGn!)+eid4lu=GF5~SsA&ryFmhEZ(bi~1 z3U3mr$Q~5R?I#`^la7ubO(5;F?G+33hKXDiQ)ljvo&gBC16duP_H^T2>iQVh&>>SG zumg}dm%DQs+TH07oWa32p1##TJH=r-EeaZ1X#C;zI`_{ML=QI@lc$*kT>|GBRc$m) z5c4W0UAq2FL&J{6SR?YfEsWP_YMJutk}1Ex2wlQ0vk&M#WK$ZgW=^>QP)b=2g((&r zk#1yKTlvwMW>mo#!B!!|cM|2Kh}B};J<;t)Qw#*{?`R<0c)v&S95U-3N(mh4A-HDy z4KdH}r2gipo>ZPn!kzTIDM6_m46*Q`uQ6+*z6#?^6&zAZM4x^Z&K@-MccZP!iE}9(VtTY)u#)BTZFlG=n$u{D1Jv@I z2iPcmBkxBoGQ}emv_}pZpSja)SU$3go*ke{!`IBwH0R+8qr5sW=*#3=bP07Ng{QVJr8z9EL~s>_Aq$Z7eL1n#dY+d;6&> z=BK6e6F62HnR*o`HZViYy!gdkYdM|)4OlR1JFTSztOG1u>XPzDVF{RR>3^xZ{)Kg8 zMiiPNF)N?p*GkJ0lXZq0-?^g`XlN(k$@#N(fV@`~1)=pdmcdgwAQ*$hfl8KGF!yaw zKfhJ0#MKWf%@a*x^}S}x^j6C6!Ai3@k9UsSF!yb5Cp_v<>RG_04Ho7FTK=0K!wK;^ zmXC*J*1&zWb}ue&kWzm??*!ip<`I$vU<|MyFZ?^VhWb}jPqrrR&uo+C1tr));P;Z& z?9>Q*9-~m*Nq8x_NAx}4DZu#L^o>C zDdUP)7hh?vqrFp)U+Qu&FlAUfu{|fwJ3(j+8(`FmQJgi-`B6x+y|QUj`QCM4KSj+C zv=i$?i2ha{v#Y*;KV}?ih6QrlnmZU`&`4us^3}++^;fs8D0LQ&N* zUO9aq@dws+%Z)9|9FuLsk}rO*XvYw~xZ_PDi!ntdWt zM@f!JrUd&TB`)Uxa5SRT1m6OQyL}9C#f6T~I*M9GV7T_B+DPW3`VKC**n?@l=Ox;n z80-=xoeDM2{Rc~kP(@W4n>D^acjLM|f9AmUvTe`kvBI#5evQ^7b63|&j>2XC+}reM zBhe<^xbGt}7-28McCHK7DX`(!&hQbL8|}}D^ymJ=5+F*-DuOLeh|M1V7WrKfg$mO2 z+@?-npTOyU%H;QeIo{iCebp;UeAmiXHWGj#{{BqlR;Z}pv(@g-msZ3&@DUC~2)`}m zGw^zitZ!y;m+@i8j{nn+Ihcd0UfGs!GN8>vb;DUUJHHDR_wNZ$&85)zZa!iqA$er; zlcw%o{MBq zpPs3@hUK;>?aGH_RgbXhg?aI9Gk5GYNXiToc*6A-8La*4f;b@3khI#w3uZ`sTO8we zJ>a!{P9xePcB?qAqV65M$6<*1G?Z=R6w-9M>P0BL@~_laV^^9X9nWE?599E@Uy`(I z22?N9bG;}hh~$ivh@yI)4$i;&{Kc<4%cz>4!{1WLy5*dK5QAP!>d@p_bizI#aoeG| z-t!NrK#8Jc^_`7ov-MZ!O6+yp`KLgOFP(O+-4+PIe26O2AEgc=68;r!wBw>lY+4c- zdAymSGl>3)k-wqLA4iQe0q~Sp`*xUz^zT@@;Xs+TNV|nhAz3MSOGUeVOh=Zz*D6g@ zLLm(+48dV@H?p+)v*cpEwu+|)cT+wAli#*PTi94yS#Wd?L3M9H)|_XEQvTk)+hSu> zWkCIJ;?4L|CdW4koT`}c5z(z@?@#ZZG4aSk+J?%1f`rlKd{J+Ia4#0StY zkxL+fc$sn^9a+&xhGW8rPE>gy28DKvMRdeYxYJ#jTl;?~m2iT*H!>$_9NDCRS>eIo z1ySIaD%{SAd~f)=?npfXlls)CCTmD-c>O`YSjqRu&0hjIf_~1oojaGhvv0Uv9tWum~KrBYZYpJ$Y98f z-g9tobK&%J$Sq!uv8l`2HDfJ;X%zW8e(>f@fIDjmDTrpZ59iJQ?bZEkYsk1xy}AxXnQ*ZMA+v zLm~GM7I)zI`;oSRsX6=c2_A?tPiBd{>}z-gQc32S8qehMaBIs(hOy3Xqhd~`ro;sD zJpmKK*>SKMQ-)UTfE_ZvM4;DfW9^zlebgN`LNml|Y^$- zUS8b!F{q?R3(W9T!>pTz#wzIfZsC!0wlbYpa zrP$SRp*hg^`LC0~u9lLsnf};xY8!=C>8bSFSqDP2%y;FPZ|oI1I`z+*!UDImxVX>+ zdm81K=b)8NF4e@E2B2Dvrtse(|8EMBOS#I9fkAu{nv>?#da?fi|zqcznjz|!zZ!$cd2D6p8@tD|k zaX?nP@|(L3J0u;27Q$U%Rbg@#Yw{+$=t#7+R4~z8Fae_6%ZSR}Qyq&UvE?Brc-LrR zdINPo4awE?V;k*ueg}ofkA&>WjHw5{;^TzIll3frVMn+xr<(eg?@0*{X^2R<+mC%R z8ZX;M5U1yhTGW#%BSU9=6Q=;Wuk+$xWmTuqI^nPPX5+#Y2leU>aHyt0Se_qMd35sn z>#rmNM3!7HOD|R|SFvXTg1J&J-=0(j^<7c&=nQU(J z@fS`0Cdk?YlteRVOS6tHl?eHpn?dL7TfBJy(OU2!^kD))cb{)gqIrCUW3+Bg-caoC z*xAS^9V_ZaAT)+dsQb+BJpFTISh`K*Q1X>DiQBj1GNP86&R5>z zK?K)+hmL)^FO=}>3-92)X`AwDTAqwaXrgoug1SjsNjPD;z=t+ zQ!bPC=k*{dg4=T~&Gb7{dM#tTSF1*e!B z?Zx5jRX%FE=oIHj2|x~8=TB3?gj#5kqTYiUPi{!&rCh4f%av=E8jmF2e0H@}YlDTR z>W=@SmcwL@`#U@>9-Kc+G{87|V>Y|^nsqwZ zeBdPIk+5)1zqWT24C*TtT1WO#>T2VIb>EEqT-v{}C^m~67mQ_a12$eZGrGXB`Co8L z_Q>v}JfiulEQ?isl_{U*6t*6PZExkgyN%0QoOp3=bB+k?Z5U2;(ymM`cdL$<6j4oI z0<6KH#h+$M)PuKVAd6KNB}0zbjQuhG96(l5{I&H4>dX5U12lI&n@Y65 zYX67Q+%=kj(Wudl?~gtc9lnb!rxaxTb80;hSex>V1J*GTp?#f@53LcD+mnor>$Gmz zu_qq^E*`iRiFxsTxw!1$IjD|rZ{qW+LAtifb9M9)bZB?U? z=QwF_j=ub`hTrERZlMrO*#+!lli<^@_eqTW$vp`38ZoecyU|gmXAKoO1T1ST$`$3R zI7qR}(YwvZ1JZa8YYL{UX+a16rfJqUcuy$MWq-DXGA22AYE=(ykSJQg0xIkg>>}r) z^}B&nnI$?cV@=BwE5iJ5tbL(?lAj8n6QITU@0i2ruT5U`iPEYI14WVs^xY@WE<^f$ zI&MG5jxy%2rC6+yB0FRaXj6S>wTg{MHei1%lVH&pAp}NfYqAr=G~8R8!YQejuS1!) z)P8uN&t)Xkkl;gc zQ8U@WeM8qY)ml2D9Nt>EgY?)O$ILnL6utwYZ}rS_klGhP1)n_|NBn4d(P!*RfpBUB zym*rvFGx3PDKvYQHssoHz9NQxGunGN5Q#O1vDp+A9|~5Hhxr~cI;tU zJsnc0aZVvge=tF{m-R+U)GKI_fB$3WuWN}`Iqcs(s(ga^-c+Fqc=v?t`rGceVm>K! z;ooU##b;gsE^gh@6G<};@XEEU#1=_-;bu_W0(?Bm>8=r1Vl!}~E9iS7+I67U!7en zXwdpBI-0^9+6(RM(j@HBJMcbu^fBvlXS_v*@GLb!j!(t0Ay3DVK|>w&9s0=r!fyLO z!gdg1#kUJcYMLJt_ry!#%Ize8LY1UuFW{L;n<9FJvF?Gh4P&L=VoPzvATpXq*cgo= zONuX7&&<~q&JSD7=|vb>>Nko5BdzYyeNWQ-*E*Www%pwc7N%!_{9pymzkYFwYwQL| zfGJv^=dV4QMxYIXrKzVqxI92-u`LY~F3x&cDxiP!8=G9fbFt}e4VjS)EJ2)wHb#TYi<)GK42mv}W280NX@yCwlm+IIUh$(vbr;8*BX{MjcV%)E!DNdUC zGvHZ4EB~vcUdUX@NHiD~l3gm!+(+`z@N|6f@SxZC_3((&EQ!-54I3WMZf+jjpw?h~ z{5fwaY~3H43njyMAvgQ8ACH`SJ8v=*6%+B)c0oI#(VYxZyI^R5ftCfo+|6ZjmDENh zT|`;g5gHkdptM3b?#Ej8lpsr>r*bzbSowk7<Q6fqFIi#dN|4K2h8Hr>`qg63!lAk*>-K}N6 zN!%&S4`$N|=dvEp9`OYAv|24)^HG(RoId&HkW6pF$;khzvBg9d40*h1BdKm|pMQwf zGpBk%$0K~C)g(P18~q0wO{+o(k>gNkngpm^592q=w%7;GiUzV~&}O_HOrp0CFfx?P zHG}BEgEH72sEmWv4cXdDE#J8CTc7a|x(bd29OHLQN+`b%Phs~wh_^KMNE#@5zocGe zteO$C-06;>Ehl?P{IdW{kqE?kzd@Zij}6{`&_nvqBg~mJvjr(VgH+WEwz4fQV&GtI zV({H3E*YK7ulBcP?pj8CJ4sQ|3yUWRuFxuVu5mxMH%nJ2%W7u`sxvf}%ZUTSl z;YDA`Pil1gktDB&+^7dW1QvmV#~2-&R*CR^$vEJ6jNzX61yu~m?#}w*_0%Smn@w}8 zf0(q;iT_}cX=se;Xlw7;=MnqleaNxMUVEX}nz&KNRUg^GHb$|A?GT#6#btv>;WhvK zSKRJ%H@lz6jlQL$t3j^vez>U(agK7Y%%aE$T;{x~$b zRjfzlDbc+j`4~NFh70_fF{=h@XdU~gG$E5cnuh;evifMve|>vjy#XU=;xbA6=>(NLAMna+S*}dF!u;5dqhQ=rj&3hTiZjGJJIY| z{CT9zpR4%=ySCq!!g zh>|nIf63?5+kM~%D+@kvYm|sm;+FEwq_N=8D$o|8kywHcys_?y=dJIN8+FZLW%HG8 zVSqsc+A{{<+mT(4e{qLPf#7a1;==~X(kI<_5#8DMiVg%2Z}o0~fvNxstE=pbmL{14 zdU`hR+*wAq2p_J@0ztJ43sSl2)HMu%&H?gCexL8!-RF_f3#I7|Q$E9GH!*wyw#Ky1 z=|k2pno5i#uk1N?s$pD^8<^0^C<7{r|x_m2OPG^Fn=N z`9?0aZIyb1ao=N(b25J4>^4vv&)*^<`LH7D!QCno!J66k*i{Q|+4AfouE5lsM_^lA z4)*L=%&=ml?G4qwN$V&vo>Jz3LDFBFzq8|$t>le7j2*dUG1Fw4kNq80P?zGI<*y3O zl3dGQ03~5-%S$7G1n(E#Zz?f4xAG)?<}w{Xq0Z9Dr`#z5N{t1jXiVC2-QQZ05%wqQ z$%UzP@(V#TV8>s`_#uQ#s|?Y|ypoyr3z|Cm8u~1O5fH(p21&_4bA6ZqkUxP;Rua7# zcEs+Vyp$&C;H=(l&BfpR9Q+F>KD{{MC4MbK+x5P2{f{a{YAjHAS$0v!fHKFrm5lKb zuSA$5{z_3^S+(*SOTV2XTESIshf-&@0<3DRqcc+ufl*^ixzsgF4>o%Ga6ax@bMx3y zww^EWOE54J{jk+&eCSq)xeF0~34P+sja&Z|@{*9VM)4iFCk3f{9*gude9C;`kBy2i z9ktMgy?Q|??uqr|1ge?Zex;Vg!C19^rA)g+DRt$zoY?xXFm@cd{SYA}*~2WkwAKa9 zl?I^?lY#0XT{`T>OG(AJG~%z9pu>wopSQvQF(?#EOVt4{g}DO6!(Nu;gQ~rYv(M)BYCS(?_@b^5}T} zO7ub2JU|p%w6iPi&)#`SNTs~pY{J3)&mWC@aVNMFi!Q+9Ulh9(J0*@ zNIMjFiFa@MKBT&u!HY4AoAbSc`xrsJ$|(FP%^morgxP5h$XhJGgg0X)WbP7+UWUW*~#VA_eW08cGyG3rG*41g8I z4el42r$0LGGoBG8M#s|#N_COeHAVm?7ADt(0fHjMSYCq`#YY3W&93Za$x5AugLB>g zvH*1d2g1PwN6aaCC7zcv5z{s%j%4*?ts<>grPK#j(j>kKzaoK>dIWg2w;?b7JHUDO zA>B6C+j|w6F;C1MPb{KX9f;^Z16*0Yjko}FE#=EDGhJ)9KUF{M4#ki-DR<>B-s`_I za5px){181o$zPun^f;qg+~He+Lm0snjo@22kR3~pBtuZYCCRNmdzF>MS-sJd{_ME& z!Yiv8T}}Qr9G>55-zb=$z&fDQ3P4V~2+9TNL`rOI&dfi-nYTDL@bT+!kd`-Dz@%<% zvj6MP5?TG#+<7wdMMO%uWTTT<%l09~foM`vIij>Y=<0C{5#l^qEo809%T#9SgOl>Er2}WpPWmc4%aM@s^5~;T|70k;L zx*sb)%e>vYEs1Ms=ARcB63iT!r@&?ne`Hg34GFeuEp!yQohyq3>S5LoG3Z&*C z@!~QFxbEEz*7dY9OF5c@@?K^#CJKgx7^ou*al z)J)(lKJ|mOV9_-ThPF;w2Z5YS@&N=yTU-fVq0~3pDt>3j&Xdon_iXLt^a?@CjK2w&KoUV_7S6~YR*j4Brq3iBfMqA z2owci(|Vteg$1O{u*NnR36+mxPtu9|g`6?mAN@}0OoD#ljbH6<*%N8+xQ!$C=A&z7 z)YIw^5|JOIB2q336Y6R__`(Lf>>>XvdHolVMcU$xI5v5;M*3B2w^c(PX%w`|ylI~> z1NL>@6kId0ww3=x1abud*(qFOn2{x!AJu%lRzI|SvkR1Q@tX>o`Ig>hZ1W1BPlREv z26C`vV+w2`5pv8%dfZWdS(q32_cD6)Sm2@pd*-~xps)z5^icWjtg8~Y3$_K3EjJO+ z5Tq&HHF$4d@kg=$>pCfLd>cv;U>KA!2m3CuD7%5O&3XCr8UY; z226uC7W;9PGvQBiUEGj0mhyTWtkE1)7GFVY^kPEZ9D9^*Y&GHqh z{_1FK$Hj6?TMB@EelSVQ%NH&W^k%U4MQgzH-s)CzyCNUzMcPkLUplOF>^sd0M?Aod zz2QV2sY%niM2sH_2GjxgDI_navDvr@iP)2q*}Z=s^iRhP`5m@x;ONmiGuFoUk-t4U zjGt&$FI#h*HyCl$C)`ipP+AD-&B3Dn#w;md*}REmf%z3O8~e#~Md$ovFQ6?gk#aDJ0Lrjm}K$(sGWgPw0is-^2wA6#^MwA~G(jzg!&bfdZLf z$rs~+m7mntyr`E~2IjVwNzIJ3mynLN%}+-wAD)JllL~!mEH1aUW-E2fEUp*1Oh$Xa|;iV+x>;v8pmR$%bOkf z{1RPePS~Yv2%&SS8U}LWBN`^_AMxi~OH7`xuY^Y5s>CsI5x8n)A2nJ4`%8BS{=wP{ zjP<}L_8f}^+i71Dlz#@uK@%9+4&|kHaZxS%hvvW*6OA9D(+FplP4GdU?gNQliaUpT z)3nLN%c(nMq#yr5hMsSI;h5d5#02#dGSExwI$)He1z1}5+jCj&ql8t~P;7!M+u;{* zQn*vwDggwV(|3b~Rb9Rom)Xf<0{(8hJHsccbSUUxD=-<#^p#s^%KDWOdCHuX^rF;N z)$h-rO|BS_CIs`8HZRu@^J391{R!Dj-NpH3xVd3maYb`o1>JXGg{bKVJ({;}*AfEu zrSjS*aPO%*sXvi36Rs~b6gzE|v#o{J-twqA)L-?(Hywcn1e)yLOS&^+CEx!)zRohN zt#|Lz6xw1%3lxf#0)^nvLUGsN!Gjkl?pEC0gSEJYU;zpQx8m*)ytqS)Q>>H!Ip>{u zN3Qvt%`HMmkAuYA+0dPa0e&3Um%EtXi#8#~LoNHlD zL>2h`@mvBp?|6yyX`lcpIFFnZ3_%dSKUphbc@Ef{P7yanv z)UZt!76%43kOKC0QQ${nP5hau&#f)XA4FP|M4Y^a@e16^i{-QeuYr7(ty;oCVEAh>+Vxs7Wmi&iN5K!pFD_zu zk_rc^cVdhJe~f}~vEQH^Oa}k8Cq-?mFzj*RRR&^h9il%N=aY-{cl8bR?VwX7kPRU+ z5Z0T(R}{O6TCqjUC4}O1${!{(&VF^5cO!8be;k@G5Pk+PdsRbpUYlEfQm`!%p)$SJ z7j1Of#C)ELGRqdDHlzQdqN1S=gQmiw_(O$8the&LH8lWLO!+$J5`St))q+E6&zk;{ zwO6*yx&z<+vOCOIdiu6tVwdBv*umN1cZv_=-U)Q>{9-vs*MTG(z~%SARpr!Zw3t1UAVQOHS@11EMUM(pb>!$!BFXJz{6HK>A z9uzamvA>8mfis+vWU#mIGAE?IGpyv(0EO2sDXonKv2csAd&G>0>{y--sExh6&Z2!Y z*L?B5yISFy0R8zQ=61$?NYC=|p%zRmhN*Eq{d*$<3QFj{OVZD-VYAJ0B7VsMY{Dz2 z0G&y6J~(UhI+E3OJkS5;NtVvB?|iWA;RI8ZXJA;nHP5ZeC^YccC|vXf7cJ^}aTG`v z($$}iE*H~R+r6smN`)5GZ{Y zvPOdC9aRpYWLGdRXMMV@A0M#CT43tbN8QY&Xj)x(B#hXm60$Cpur~TB>V5klMz7BU z)yAcYHvBTHt-?JYZ@pKVz*`^kw0@($9HUa`;=%d$b1@;?1RUO|FN;j6V6$Eg{OO_n$)7;_oyBD>*t_t*!Wa!pg8t*cMv|0MlOy1JMxoe^G? znvQK@eR9KIh;w*J8Nd*2X%k*d&!6Qr;~M7CXU+Nw<1Mi{*A*ynQWvvYpno4JhOjiK z3c@Q2b6W{Bo6e`5D%6i3*_nZTe3!1xfK=f=kBkD-=qA14FXD}5gFeMuI7+Hxg_X$| z-!UDJ(&Z%%NP?}HzDqiB-v&V0=F;D6^#~HRJrR+=I((3Quf1;c5{F+XX&8$mr7^#n zsrtvQ$sC?brZqLcKCdjXbh=z8uIc5FTmD4}QwOZ-Qf#VCkP3yY83N%;+)Gg>pyF1d z!!+v*2C{1g*7WI(B(b|pu&T$dT-BQNY~T+d$eU2cBziX_L3@Y0awd+p|AF>iuHdT& zOG?+~GNr*!BlAx{YPl_O@dvrNRDC-s?KE=JI(s|ltR49_tl0Ta{K5siiZPrv+qpqe zcJJ(E0~1U#r=tW_14*^9CT#zj*4is%7 zv;5Ec>HrPP$G>qIw^TLQzPK)Yq0?jVKr4Fr7Y*}QMf=;!wx0^8QAoD4oCI`DSy z*_-N_Qe+d$;l~v$nzM?SCd);xglJt&(Rir@;+hrLB)cK-Dm9z5&HS6=PQSj-fV3xQ z73|_{yAyyO81;F}H0d(@8IE$H_sZu2)Wt9lq4gjAk-jR~Fa~a*a$ns@!K`YcovR*p z$w7z*ZJ<-HmsQWyKcK)mzzIlht>c})c{{R@J-x|xWVZbb1R>5@Goi{Iq4Jl7 z*ffYmx-)#n)>j5E+wY2mKSA>k%*k2P_AMWn@RYUZ{*meeInZJ36wWIb5vvRUH;JNK z4kf?iSx~S$(WThWaz_zn`ET7TE?^Osa2{YHNZ#U;JprBMc_<&~%d(EQQk~z}apLm;8 zSPQ_8qOeCs+SN>>%KflsUeQpfxw*NQH_Esup~h~0uPh}xYTY99p1t8O8gaxXYZVtC zBbqS{w)xjidz! z+ZsyP*6b@z(Q%FZ#7ryhTdX<_@rl+tOisHC;B}N2l*p8e`JD+~VRxN6Xg}E{E-Ix* z(&vljm_~;gC@ExAG%t&O(t}JVGzX#^13G_5FYmiLBrIo1f4NFqk~HlCnb&Pd;-jC1_A`q(Uv0LDH+FaDuHn4`q`iyO(a&D_ zmLOP=w}=iY1#BlFhg&gnd&*XprPh1|%gzNwg0Aij^fN8K#`6_;4*nQ?W4{PVjeo$f ze(=3l>aL~G4rlDs>OC}v*0Nx|;b}F68BiR~THsKKBuuqYvqly}c(eHrtl7uMjj!gc zShEv0JwBJFOv$uF@(F1jJPplb>a`CZvBoFl`bfbhtb*yTO>o8P{CqtRRkRfnF(P5T zuY8a?I9;<@|FY={D(n7z*05es-xH=W)NinMLVFd&wj5{OMKQ8Wk&T*^OyXH_Bco> zjDGWCKBzlCBw#wXi{+?JGqy-Bxf%BsXLC<4RD`)WM|3ckqBk_iiCfq7PbK z^Oq;@-^yH}r%1!axJ)IU&_9!3M1nqgdA!)kUAlbMA61L|+=9)%OeeU~tgaEo30O6n zp}JbylACd?3Yl%lV&&J?bzUf3R;w&ZDY)`^WYYZ2q+{Uj`3!Dr)gt)#mj4c~Dc(G^ zUfwD}$sNrS$@_k~8NSNw^k+aPGUhZodS*eL>P;Rg+@wzafC~)Z7dQtIL_DyciC|Lq z6@KyJUWmcFrZ^KE#)9lGdU``;I_38~X`u>7%_`H~F)7K8))vDliDW4`Eh!2DX|7Lis#Qi_(4i+zXd^g+&^qVQ~tt&F-y*aM^p zDrauB066heC&QZ90tFR#Fl!)mfb&(w}7%7H7wyAX(-K#!ob#HZsT9eapc8v@Wr-C&vNgK z0}#pKNY0QPvEQz8HdEuo>@~*IAKjQ-$a=WCZ4%G$xxc&6{xOwj^qE7Lym6$79}k;r zt%O@w+FLGI(2r?vOcvVjSo-Je4jUh5KTceWa`+4J=Q^z)pZ>|>NOiPS{J~yBGIHn2 z^LE(zN6I#q$0juaqmdR#IHYi7u3}r>9$#y0KR0;N6;}4P7+lkNQdMD5oPLfveoi~3!wxy(f!DwbiTAT7p9g9TJ^IjVTh=Ij2%tW_Ti z7Xg69E*K(#`6eV7&-3S%`@OBgTpGn|deE>zn*;@mR=q83lrEORWxP4@Wx|a=qO-7` zRSam886G*~baM60p{udeNpN^H3xK(QODqOnyNL(}ZFtla@*e2J7QO*gr4jT;N{1=E zqD}O!>jjVn^}9hP>h>J7+i1r!che~7Q95p@U!1&`LV&<(@l@c;mTBtR1lU}okX(R` zOqc!8G+ORbr% zSW2mNgo7J$LHe76b-iU6%eIP&zEJj&!pTRm!9~GkHXU1)*Ri2Gox-UQ|8hCy0)TbV zrr4cR z(-`GMjOLcfd}?xtJ)`!Jl36f+K9QdAO~pbes2`ShUygrtWYRZI94eLttwWb|Jb3veMdVQz--0ux;>6<0m`2qz^a-YFom^^fFCk46o1TN18g^@^YF+ym`8Hzrl_`xA z40nIDtEOqe195P6?kxn~jg6nm2MqvHp4Ga(Z)HW$fnS&Q_ngPiuCY+E1SOA`)^|dS zmSBCD*lQZfu=VON=3SgO%*h9!#N0_*Ffu(1QLtsBEam=roo2N`*cFR^NOnRB`!5Qd zp4EA=m~y*Q-xhRU>UPKKje{$%SZXc(N7rh-eyXyG-X+0t8?JadTV=n@ytZ}C6xN>k zKM!-+*I}=h5bj6f8}7#r!br|<2&NP)|>2yLhoEX z@!$2C7VQJWanEU;;mZqn!Ca(SL5W<>@jLaFxCkW&W+#94K3058^z2U{VwW^S90l!@ zrgI0$h>5bsYJ!Qms~gM>14GW9Z-O4S4*YZFc(v4~;%|jUPjuDC8;4{?fVQ+T!u0l! zUstlYnZ4@|m&dhNd<~Ts%<54X<*N-ygZ;^uZ-&*=GRhx-56(MwOf=;Jl{;&qfu4#^ z@pO`fBTHNrLD z@aCmm28{>UW&+ zf)EpwB%+#68Xn^P_92dP9;(%P`B_t@_;aQ{QL7{qUtqlCkOwuKlsWl?JM=Hw_(f3z zwU9IDmGI)$tKkLrnNl%3n1?`P?1j8yUCQ@)%+ zrc>DR)XWNH68cuC2z5$zQv6LHX_#5NV6dO}tcI`0Dzy6(IKzaq#}y*Tv!?*ke2?S@ zM>M1*WucI$)8lU)eP_6qWV%)L9mfnlKz16~Ze)W9*dunZP`83P(Jux9ik%d@^OvS5 z%H3LpK4|YYq(pR4x(TfqVm;x1v`a=VrjKlBb&2GA=vsE`R}zz_vM~5QUrwUnd2KPf zTM8m#d|VM-+T#w;a}FMd-k1p<`bkH@tGm>~GwC?^YwGgJ$4jWiSiWh%jar#O`om_t z%zXv@AcD#psKt7A^>{P;E@SDKt(r#M7*$}FACCdkezbkp&!|yAPmH&o{(Fihy5Cb@ z-&pj`IEBFu1RclE-6|#K78f_Gs%$b{AV;Y|-z!Z~O@J6DFjzG@l=g)uroDkt!=Sxs zUH_dHL>LNC(`FPc2CeRbQn zeKnQ6WIf@Ov84g?v!4@AxNRniSVxhT$oLr|c-3i^>l(XMIN4{9#o!k>ASX7n(J+0wNRj0K%qosUMvOH29RWO=7;llV70 zd+>`lLRcgCcImY9Zj0W2l#bi7Uv@r_kr+7f8&mPKoj_BMzHLhl!v)%;wrZ-^Vlh|H z5B{3D_<)goQKg*X`f_wte@v@3|ABSb42!0?flE)MGd4bzer8#Hra9yH)^Npck)roF z{=h%_>bn!Q}ivv1BEJazfvVI++yi4ZLQJ^~w%3ZNLJ%lnhr{zsR8bu9E>y8Kr4hQWW+ z<;#>m^P@L2Qm_&>^_ZK}0JDd|=k1Ra7GH*d z`svJ1gVCF!8L0EZFcBXjsyMD52%M*1EYmo2duEgE^I>5xyj9ZPLQqdRXVphRKwQpO z{Q~=8mI!tBpU8irzW;qtj%HooJcq1&V>F)|06A)!JpOGDXYT_|B@;8q7W9gvp-GzY z456cbgfLXPz2w8Rp6&lf;&!tSe{JWz{yi%zqgX^C$m0LV`+95Oal)&7#nMInf)yv3 zZFa9-_@Rf$wpM>EyP?Tpx63T;q2Fzg z$LlOLdF0EN95o%)8q<``;bb!b(&+BLXgQQ_|8{RQ{&)8V@A_k2AtU*y--bT51oM^y`xq@+8o=JUBW9Wap%fG12u(7pKgrH>kF zMAT(Z7Ln659wqWo?)5ughJFV{oA{~Pz~N$`=Gq%b$q1qBbgDpSaWx__B=5vKVB5n} zdCXTaVZ^}9y^Ax#LD4rnYdkewSbO(n0#9MJ3!i(G3yQB&@_z_MsB4hbGQ9BJ7*)4wzUi0 zgmn5%WPJi`oL#*(A4L=fhsVymD$7p=H={ep0EXIBY5!1!{yWj-d8^p$sMB9GBR$UX zMfO)$cFCLLE=YH)7WA#OEX8o)&|sWzx+=4Q5&-oBfLd{@=$!G5XBAsU;NsEs_fI*! zJxi4%uE*E-iczjfbggkmRSvT-dH@Rr1yrw$@xbR_G?!v0Z`2*vnyNV3;NfL2$rB@B z%Vs6(EH0o+61@}6l1V_c@n6kjXR_NmsJ41%5PscS!|%Jfy4)p$_t;KTUFQ@%sYszKi zxPgzsFkQZyY}p;|`YLo5_OknCZ76JuReeeh_mtCH;Usp@?x!$mocHPx-PG%}@A-u- zaedZIpz0zt_u9aZhupe{4xgRQ!AoV!$NlPzc0!Xj#P^dnVgh8Qx)>8zD&$H3i$8hC z-o%q-NGrFLw0fb1w~WRQwxY=e1>pF`^*i;a!vb0>+iH!o8x!#07Dn2ag%Pi=$<5M7 zX>`i}a<}^hK3dyYeEx z`HF%dlHsgIiZzw=imso$%7+Zh|3nT_rwCdyym&+e;S8CrsBeI7)22X)g2!))Aehqy z0n&4!Of;XtuLO;ZU9H|1sQ2RO+e$fBPg8Xbb26GfV^7%@9(mXb#3H}vr#{SRXRg3h zw@y2$NKyP_9zx1l6O0jO{%1hMNgUXoSzg?z^+_rFMFi2asHiAvb}27~#SM=wG=-Co z&n)*d<~)RO-z~T!gqPydL*OKWd74F`q0F>qDDt>r{L7w|uo=!*7ahZovB*)`EE{MG z|4#vGmOS@c?a2*fcW5>qW`DOI4~3dOG%z`hlKjMnwpGjweEXxwAp;_*{`}>yElVc_ zK>x0B{*kYQnY-gvhC7*H#%VcOO>eKRimFO#Q~N76eEBd}zdq!Uer(E`Nx4n!^kx5k z#@K{0-rOEzm~l+Bi@4kehAqiuZ-DU#-!TKhPCwM%^22e5LgOZ1!ztO@KSV!)K(8oD zx%bq4@(dU=FLWYKBVz4#O<8>uY*Om~P?fhtX=fA^hSiP_rty9*vDGwQYUH(R(8o|K z=-!f&kYdsFpfqpKQ(#0k`Sufh+Ki_{b2f5|gMV8LXHFMouVh(XZW^zL=I5nsQ)3$T z1U@;!etJQgSyI_=w36}F{wgzoh02Pm1kVMm7vDvHp2Fj@nbmF^amtU#`PR#_X;>he ze&f-;8f+j8)38UQZ5ab5-+B&+ZNF`o>n;_F8FDjgNrBuCX_h5-ADmv-CV|Hp-#}EJ zyBhTez(3pQz5pZex)}7{n(Iy(SbRexq_tsD&4=4;1EM9oW>iyjRn%1D_$i37XNJc)gaOw4GJw>pVv43n{bVuGQO zJQeAlbq_01u~0-4wSF)ag=Bx3Y9sxdnM}>oU69Sbg8M#JOzlYl7eM@Sj9?4Ekv`$+ zXGgbZpW{I`sFIvGbCFM+ub=j!RtDxYv51DZ_GVr|aBjLJq3U>=r7H4r&34;czvnyQr zU&@>JwAM^-YDqOdH@O*T@~z=N#WY}fdNi;HUxgKqWgoJx2Ppk?OFi3m$o@pu$6@yj zV4E^8$;43Q$hm+Bg_2(|c{s6}*~XFbab#;3HulCmmu9T$ZY>=p5tYP^UVd^y{AB6p z(dlyZpI20yRKV3UP4=>3DX)Z|kBYMRURGNioWDKfuvcRbiry(Hj0vZCKh@SX}yf5(nb6wQ?eK-PJO1~MwY!LY1Oaa@cQhzSB#wWtolHiXy~Mj zX9~+)Fn7MpiqKYSLBSoM= zBte21ny5Eu^yZMRN7=_`1|4ZxgL`y+BF0hoeV}3K&lq4#+T+ZFCvHhCD~o}_d?QuM zbkGh32>jo=HEj!cUBPe9?veIfCQQW_l>gBJ4|UU3RL~YyUD?zPGOFX{3!V88C#rxDcK zfzF1%<$}@=<&?;4riYWxlp=C^bUvS&MK**&$ygQf8yNngowa1QpPrKjbk{vWjV7uR zbC0~8qxi-|PCX-3zoh!!4!%_9syTTb_*I2HB0c1wmQN60XkB#ns$Z>UW$FfoW`TkU zKuu{JxfE#g0Q~o({>rD<1f^!ZHUQ!6mOySVRg*R7Bc>R0|bP1jO+V=X8l*M zHA_yv4$&&mrSrT*Bu_B10C3)HZAC8#GtCfRY=0kk_1s{)9!n#E8KCG?B_u%;NJ@|| zx2;uIW3o8>ibj7>zjfK%UJngT{Jt;1TdD$4E_?IU{*1oQ(vw$!at@J*K+)W{9%Q~; zYSm@zBuMb9?E7U>BnaQfE%&5tNvKICwlbAqimAC}Wqk>( z7!SZUI&zRq-q|A&w4|@v1ub|ZdIxM+E7wOTdPxhswvHb8ItbuL8UMVCLiAidr44zwlfyH7 z1q+}%n`YmPb~KWebKY`=CvTC{1XrdJSGy)Wlua^XJuP~4x40`;(3AZo=o72$4$d;W zpRrwU`2KpsB5SM;$_~fI61B_OY*m~(%6J-JAQcBhV4BqRywCCEL z$hdbqcgpn}l&t3f-Ek!pwhSEKWaqu2N0Q?6ioB@;T@7-@NGTKO=bQ%j z3R2px=vu$zl#l^H$wUnnjF^xtFEGo>48d9aUo`32Oawezek#A&FtM$(%9JwlOA4{- zBtyc)v=PA2%z)e=;)jM6FpHg$VYjqPZ2cA##|+D}xp0}meO8>fr#2KmA>4BZX+_Fr z+x4$dM_ZS%D7!HxUW{ZKBEt1t^DKzc!dOQ()Z+4T$J;E6*?&aZsIoJOfEs*<6qxwQ z?+1#V3mXP`7@iLWH>2m|-O`Se9=I>0lTHeGl)lY)i?Q5Tc8>|2a>$+vW*I6+bMAzgo6q9`(@}w%@ax$#O8{TF`3s05mpBqBX=l^l-0HzFdQ_tmIw5U!g=#RoRL!+O6bWz9B>2fNeoxqUqug& z#DICj^#SVB?7Dt2<@=*M`fJ-NO!pi;_4g9*T|>w}n&d3P6rEXspl{C%^?uy5g4Cy1 zQ#@|i#oEUe2Mmo-I_N{1 zOHzpgVpV!>X}5M={I$LCDq@b@|0^j=-ae?0&J~oTh<`D#6v)LxLn<+*u%A z_V50p(K@#JSUl8eK{z#^^(+0goqvT#JN4?nh!Qdn&IaXy58{)Q8VaT>;QSYKOA?A5fS* zZ_TC2l!KD?Vh%A-b{nnS$59`e;yzt9E|!yK+;0;uD`t0Q>iY9{ z?MrQ8Rlj&RYAvA73tlM5m>;;c=RzCp*MlvFmQiM{4K8t~f@zWH$7e6nU6PS!5;_;f z$&4Spr1^)=6@Vd@7zKh}9V(aDNNx(l1qac<$g5shnViuB_O-h9%iQf=do_5W7`^{u z?B`7iHnYdLT+gi8#gPp#3yv$Mk0A;6{`7VKp&I2@Nu|-Oqv`tSy!Qu)oHP~QO6@l4 zYY^;>fxp6^pH>#3OC5IQWT(&xl~mD|6{0S*@h_u3)df3T+Scy>snSp8kjWu|%4=+Q zKJkly{A8$?MHS9Cu!!IU@iqZP?Re{D1VM<*XjXruPTMnENQ_-t;eok_*ZjwnHQ6eTyr*>g`({HvK{=CKTJ&% z3D^I8%8U_4p8*k>DhxTY&AGIEQTY*V7oalcOV?AQU5yj1FE7C&!UvTfRCVz*YjbC_ zFNS3l9>ok@O@C=i22D{;Yl9>9D1 z;&H0#=-hMTFz}bISqIH@$%mFBW4Num@U*kFGxWn9K+?O=HPR~fir#ro#`pQ0x9oa8 zujV1|-222zZDjguCC}$1(~*n}v@=vb*GIM&uL2tpELSW@(Gp9scT1vPeO8(}M9|Nrjxr?WOt3dwC*h#GR{f5yi3bEP_ zxqaSY6GJ!s={E{e(Ugn!*EGp^7KVX}F^XRvb+^2u&wutjQonX8?6Im40b88pvfY0} zbaH^p_7slhbVdV0+Al0g9bP9WW9Bryf4g@}8AI3bL<5pIa>Q3eG=WLBXIo_e#jNH< zur)V}Rv>k>H-%wD6b6V;cXmb$*O-<0ZIwduM~PztWEY8K%Wrh{)wjuHzcXEJo%`lK z(rvT5073Z^DU5BM32Mj&!;as*0SL*N+e(pQ1s6d^ARe89fW88I;;#u)6nU*uGS1iI zia;uP{+jQ63HLi<(`Yr<(<^cm@tP~K8Wa>1o4Y?%%*P6nYV87!Eq^Ld3x2V?`V5=1 zDtnt;d>n*!Yd*89*!VhpaZWB}cj>Z9ptQLX4DF;nF=KSqHP9%M-C1yI(O99U7gQA z50aj1-)OS47-{{PYi~7B7u97|2jDC}_eQ;Np0DOz!id_ROb?w$Y&OVeaPcsP~M1Q=##J zXnt)$PakK+BA&{DvOqPpGn;cMR!ctGl;RfrEb`BE??u0k?`DiN{nTyf2F_F@iet>2 z96#nxwFTgwS;>v&_DpVaG78S-#Ouw+9Skb33M=Umu!o9G`@gR?Ckhn2LPKthCu9^n zRPmp~ITztocx9a6VE4Y0fq`u$52+YGu|#J@@~ZlPrLf0|j+g#~?YtcK%!4e7i_qqxK7`oD~)x z9GXxn{0QE8u?0ZMa;=Rrc!<^x-d9i>o>G}_YKux3|2n+Yp}n2kzIoPGJb5Z%V$t8t zZV-}`Rzd89$z^t!)>*~7i7VsW#rnflQ7nAN_H(LLhwFYTGBuzPFx%z#o;VcVR>{Cf zt|G3wqwye$@YcFzu3g*^dQL)+-mfnYnUeRgi7EH84PYAC@G23f$M{4jf(MRc&1T=O zPBVX=#SDBx*;?AEEfTbJhf`TIgOyCSI_z{jrCdX20i~-De%v((a2*=|HaWVz3rngG z7j(ZLbxg?+K?wTTN%DRI4JVUrj7M5BRQ+zPpb5Es+$fwlnbZwmf@Or|q&5cHHldL`*$--z`Z5=^N7jJBx(W`ML7SVgplTMju(lA z(`aVbrPf8x<&rMRn#eaHzM5@ZmhXww8|qy)?uP(qMVHi(PwA=8FrgCg+tc}b$xrW( z_`k+-m5jV0%!8q87qRQ!3#=rRh1n6IvnMMqvrnb77xn8U7V)*d$^oE8_3fk~f3{}y zmGu{=n=3wHyQau$S2)NoY?1$pO+nf5Ni7@?SPt?S@e8eV=#Z&$?^NVy0%#x{t! zI>xrUJQvjTxL%ZCf*Pd)X3AeX>80cl#a{tRhG@T}Z?tT*b%e$EHAViCYh2+V@{~g` zibpodgN<|yo<_XfQ8=d_-TYojy1Cm^S$2~=v$0=lUfYC??ZD=wL7nud32{bN9jg0z z!I@5J!G@ejIf2@fGcCsH8<4_YN`iC|TA~OV32b^M`T=h}7kkNRkt=H>+rW`N4qRSx zI)Q~2?b!Wbge15;hTK0COa^@JclzXg?5RCm&7ol3)2N#mD51f+gfJllYRbw0E{m7N z=FB3z&jw5ID#v}uD2@#L4gal+Wc_ct2t7UTAvFA3EJ(gQ@pFf5PEW}=dlYvTe%%H> z$>NktDnSXaotmtlvofH9=k-{>#l7GuU%=}x-dimLiZx)}26p=k7BDCRNl}p5ZBOYRt^t5?&YO8yE zPyyo;F&8Q_T@vQ69|8AB$6d7%j`_(WREcSBl8?zED+wVHjnet5vs1N!iJqFewNn_W zyzQ^YYhN~$s{JRxG`=~B_)hc%Y>Pbzec8U;XBNRYmRtFp097cFB423(u+eZ7wit1? zcI98?DZu)R#y=!4(u|XM(4W#yyZm(v(67$Ovbqr=S+_8kUqB8=uVA2Z2aX*i}XaTF5NWoxP%1n4wRxk?6V={d?Un(DyrUpXkAw z-p@2&Gq%FAW9Gq%r5rpP!4Qwoc-YT#(l76JvohShdm~q;)Ani&{GRoboDFhz?66>C z8>xthg9fgtg=Q26CuUQBAFU@fGa;JB8Jr$0GwC7&E%G)JTmK?vGNc~+arrH zhcOH%I7zSSy?njJ3qa7Nz6`C|_rn3p4{CZeCm4C&)NlA?^he@@Dedd?=d~Mq3iG`> z3!8wq@!fk#hN{IUY>OA?r}W$oy{qO5ENPnzz+ejdt0v_tk=HsR9H`Jj%!{i9WK83E z5%r|7QAdxnYU@(6fnP+@Yw!Jib|7(f_?oX>s}?(_o6n@WW<-A|Ppuf4q9JQNjH* zHs8K^DkF5@Bx3G~UBd84fYdL8!lg4f{8Xkg-^k%;!IZh3-Gv4DYm5EIr=M^#^@%w>5eVby_X0KV53LW|zd_?$IXDRF~kdva$r!m!l%=Pn2*_>3>)7 z;@QZYJz30a@`kQJvn4Ql^+utL4NtBb!$WOv!8xoZ+r0}76IFwC}jQrBioi%5g-!R zS6gdrFl=jAd!v0`(WV=I-Ca7NN+;fZE9FJGV6;-MA`8;wd9Rt`j4zyv&2#M|B_XuH!=?GKk<%k zf9qhaT@?5)RaId96N0?GXlr}d%K)i$lkMDVVo9ocpzmk*OsLu8@K~#g4plFEi!A#u z5cWSIKnxL9F=d;bI;E&->N+r|l|NE+^*kp?x_fdBrQSqhW{8N~;?8%;rKF z>o2Sgi*)oV`pXS`7yLh9FsKH@;I4uiYQ0`FC+iyj{LO+kP+JTJ9{5N}b^HptRJUlc z1nX*O9Nm$c`ZLh1_?`jISs#lJd}`5WX=zXzRwe5DA^_NJ(s8-oAkBEng~GzQ{oAs^ z67sa1b!mEdS||bW1dOtB#9{S!IDtLv8gbaa}aO92f zr}CVffi^K4TmKBT|2a0!(?FX#b#auHlBQ8}?te!2AroqNh_PB%!_|eXk(MW`%%B(+1XA(|rA`~t=IqD{I-w^#j~8epig+p=P)XXV_$)II$*d6YZj4&fC6 zK+z6B_eBU8^rIJ0#u@W3LOc!$# zyrzGq8e4KaWXChzHZhz706NpgDRBj?L~G1zSn06RgP-pb-D$!Q3^Ac{c?Q#*wnT5~ zn%*knSkkyRZ)^Zq2j=N3OwI+h&bFRabAarLA@_2tvA5osueE2N8Awl0Y|q*Nq``eYH}i-^UwfaI&!mP z_uq&Y0IeDlp5$f#!;Po!@r#Fzl&hzAbB7ZKhEsy=!e4;y9+~AwXlDjz)qL4Kq%;xq z&i4aVG0wl98t68FAV>l;T(Cu2y&z|3bL!Ut6!M*2ecnT!ha_!~ZPO;(?#Vne>E-dy zRfKly48i=D?_Bb+8(DrnS)kM=jz-PAwvHiGL^4mj$|}lf!jsGhSj>MHrqCU_K0U$O z;Ud}W<9Si~>`jj{7B;4 z-UrM^6%Ia$ShAR-wpXrl+N%h|NV;4}r~-CslE1bwMHK-Ge>QjnttYBOCr}AFKUQBN z%V{a=|CmP2IP*bwfDXvWC>@ZFt#UNykTdOaPydo5S=ubMFTiA3z0S-Z({*4%m=FG z(woe!+$(?4v{Ck%uzbO4l^wQGnFWRfm4PrL&Z+p!k7dbAebZmUf z5y915=|%+nDUVMpm@1d&VsDa~NcG>WZ`B_H6zG`npQWLyTTM5F1T?=a&eC6rhTT}n+ zlzaB(J7KMD0xj-2d$8kk``*kHQ@Rvvb(&ZhBza*cq_;2qhFZ$zp7&7M_O3myK_$jM ztzNeYG3bZE-{;!s!%WC!lR>jkuO7zD$M+y+o$(B@2G zl&^{4&v3BEKmxA>Dfe#~<_6-_^28D=!hdnOkPku9&~q!%;9XlHK3 z`I48qccB4Wb?n=l6Zh-%rrsRVya*mMH68=u2&u&nf2$pv2z06FIqwMa_qiNDhV-^|w1E z``Fm_Pw>{+>IF>*hAFN)uZo@th^E*dF4kE)#R$5u%mAS3=YC4g!TRZyL?~dlUrEi= zfzigIx*NNOF?oJqeNG{LrO12fCY2$JFgO6)`biOqn+j&*^_ar_!6ZemH$LKG~(`{soQXZEDc4rnRntxH_K?m5wRNA!GY0~zy z<+C5^I|-_nPOwQCD@t%mySU4Mo_sQpX&{$1W!oI6&yq#}yo7o}U*H?-f>a6iv0C#{ z-6ne2|FLlXv*GzyNtlHA#|@eq*T}`kKP5&Di|qJ69f&ztgKT2oc80>TG{U|fK|2iUSm8P`v`@9p{CMHnsSMcA?;ddzM8Zc9I<&}5p41Gj7IE=$n zFfttTE43As_pjZbm1*suAD`>l2z&Wc*bf`%BoUppQssYRvDl`6*Z_n62YYY*5cSse z{SzW3AgMG6NDfLjNW%;{bW3-aASvBlQW67C6NSAa;N_Pp;=y?Xu@m%LT_qp!p zx_`L8KYjm$*`L{aueILq*IJvC&+PX&i6@R2eeg;mvGrZhOgWDC*-m7FJnL%6?t@nf zx(C(dq2Vi7U{lU51_-kQz_RGfp0PrM7Ov5^U(YUW-D`B$yW$N zU_9A!!q1oWf$h^8hG4Q= zHyUl9u8ImzPg)@s2yI>}JIYIPmW-veGon z$}!t9E{eGLdRmURvH9cg`j*CMCL4}*+zRAs9K(dHW@UK%p3Yy9zd0?34L3}bE6lB` zXNNB?_!%z8w$(}VXbjBztg^0G-WIm?+uctYTw0d9=gUVC{iEeQdC9(2^d#uRleMaq zU|GGm90(oyd*#&&(PpUoykYtM53v)Dv|$6N%Y}|0M0+z)(j~Czq4G=TJ;SFVL}`sX zyQs}7X5U}Nui`RLs`*f}opo>5q3~}rG4T-5kMg&d1HW&YKOY-vy z)&bHULF(y7WtFe*{R-RzAn<`)Faekn)BO{ZBaLSd$HeVa%{RZw2Mo4i7DWW{DQI5$ zBPuTtvlyv&cI4Dy;(IcJSx-`Q$$dc3R>-geE1Ine5KX3hreQS4T}}X;w4wRh*B@rP zmqs|@UcPgXaDA;2C0d@~IY~&jK$ETtI~5irrW_$)pq1@gVZLcZeBZ^h zBaOzAJ?~t}Y*2`o(ILlgNW)SQW@tzxYFWjU9ERntS}ry6_K5^rOprFo#H2vgz0Kx8 zN7|yXR*6)VcPS1hArEo=k05}WuatFz_a)-VSwG8(xvkOv2%efw@rm8%(>beL?7 zN(N^}mCr{m^|i25Ej&jXyPdKPFMW+_Dh2XRaQ>)aSu1wldC>& z*XKO~6j)4Vd{nPilAp~(JVve)+~V$oN>e>o4bCoR`Y0m*-KHlmKJFfc`Il-Du%`DL zuH0+4-;kE_uWhw?p3D+U?~tnpCquo^y6mt{{oJFVJTxX>8UT1W%ScJtjUu>WQq$7H zfTzI#vXWd0p)Q!)RMXO|3+MpW72<%jmM4II)_bJex(FR^M!Yf+$tZy1zzquT6|k}1 zM6|>l(^}HaG81#Q=}uIzxzGV*P4rc_vmPN)I{6|Nt_)#Xrp8|K2ag2bTC-TmZSpXa z+L=M5SWjrBe4mSy7TE2)cTj#SL~K!@4BGgVbj!ajprzNjP4viqNf<(?Va_{5URGV)`&82V~&ng}sN~pU* z=?OR!W$m`8_q0zBeNx-!3R3QQ$tZ)75YTYz)KV#U>ES8uP!>HTi?hc3eukEj()SiF z`3+fv{&z))-%7b5wOk-}@!h)mU{&vxt4pZtx;J8=2*_OqVkF4s>EFz_KnNbz8*;Sl0 zw6DXM5q>cm@HeDw^hu6Y;THMh%#I=V4#&{%0Fzav_i->DSoxQg@<*ZhugnIS`y5^P zSXn^gwai{O(s`hrHdNbarzXwR-7*`f{3+;+&;ByV1w>BA&WB6#bl33 z*RXeXa1f|Fep==h8`9F6nI*uK`{5Ktmpud^B)*Gohj#{RgSwl(5h|0G2R?Km!SicT zM!Z$}L9=jmF>P~Oqq`Mo5W7N8K$sOkgok(sT`~@MGF=sYk+4^0Gm~l{8{9L;hv>u} zp^>VM(tk7^y2k4~oD5sk$o+U<*8fF;UYNX$%?R>Ah>mVOLEa`RlDlY&xERd(JKIfl z@u}V$>=3%-5B9hY=winS7k=-)+u9ox72TsKNiL*wi51P}(k^FxulDH?U3Pbgi7JFD zAIIKP3>@_TC^=AoorqnjGFx|NtH+fAR)SvaAvuQOjP=A;(KMic!= zXX6L4fV)Cndk-Cs2cARqGz`TB4*_%DUI8i0SMv4>h0h!=_{^CZPw9icmDzKVZ8_8% z&=@=p4Ko*H5aEcXZL|R#=$?DZZ3|LuSX8lnBGT54-W4}!OZlW~sJ;t)2>X1?&(4Ir zp8#_29&;^V;Uu{bP|Xr|W&spJwB`49#gVnosdf7ub)A3cdwB|-u@x}F2o^a?4jy6C z@m>z|)IA8DH8#`$B;)iAD64Mto)M$2@s`9C(tNmnspQQ?QyaoZ&l{S(6i=iYCuZa@ zt6GS|plhkx<$D$)FZq&T{eo$r9`%fdm8v6sV5*X5{Z;Dh0W8836KEV*i)h=Kk1cin z4Jo9~U39g1GB59a#Qufl)A!m=K4ZlNHa9_hQRPtm`pC7*!Z5>r;ciaEa+>epCa2#etbDb)n@^f3e zRk3i$i`1@0rNB#xe6$DGhu2!Q$1{XCeE50boc`L}{(~RN&$e+dmoejIaWw#XdHW zNp%+|{{W`Vi^Hwi2Y134fVa{R*6F5-5U#9o-LZ^oCwzybf#W^4w0o(OYd({Qx2!iW zcrONs4~*VAKtvUt`@|1ZEUU#M*019-MH30+V#0B;x!j-p0_G~_;k>-&RP=Yf; z>QVq~Dep>=_LUpyiqMVU?u^1?_{#vj1UWBjs_4Uftv-Z;-x$g%Ik^a~Z+&N7*o$UN ze5|%nPl2V1^G$Pdi(fQ@jv5McXEfxV*9dxvCB%09}Zb#%f2!T6O0IVdmQ3lbk zz-b~q&pc~vt9L}m7jIH7OC$JaddQEusELkrN7RH!Zw`Klr*NpwKB(5GK>-Jj(X8=b z&rJF7EDOG`F6}DV>3!xJHY zEWw2JEdU;nOe+?GA@{8$4Dxu+rnti922Iep7!8Asp_(68N%@%v|Ag+)5Wsx$xvFEW zqD(=3(ZbpU9lBva@<1HD2&vIw&eP|1WuDesNtZ)R-17XI4`c2f`p%?f;!{X5qY{70Fxe}-A?O?0aBa>fJFVX`Ij3LcPln@@~Wy3O=u(hWd zO-=6>UU`yeUiaO=Qtp+-UCEcUcsWtN?_K%^d;OjTMmnCRKF0CNOSFAk;DOQ3J02M&&RA`_d?f0tR3QQF1`ecb|7ZBEf(L@LJfXAVa{L6;CH|`{}pxvRRFZ z;^%h~$7{`@ey z8NEA@zx9s8j~-X>M#aqSW~!A}-z0)K7MTFNnjwXWNuQ&0f)S>NuBHC&yhV0&l#X?s zg0n+yvZ*T)8U<6%XCXeka+@b9{A;PN{Mv)5-;jEg7Fx~4G!>-F=MeT{!Y52T z6bjnpxJ@B-88M9cJ^kFT{$J(!R`GP%MOxLyz9Am6AA)1Kgf3txp$;gYCThj0q?nFF zjONhF$XfKdZy%43>(~j_7jS#LgVMg6i}dBaI`;KsB_8(LwmqOiKHgv&iz6(r;mcwi zv&{W;dQv{;tWeI<&`qQ@`2Y1x<_6iW2e2te0wsKkazyTOTsm;707&EB^y5*mFuR8nXrvNH?-A zJ;hygmh`}gOUHN?QFW;lQ@M*{NXP(_m5@-s@SOFo*oLW?9Dh|1ql>3$n2&xh*k}Q= zN5Ii?)WMKMyj#hu(skkC8)GT)aPj{>nMytmKNf!g&@^=7+IJkPYK|Juy0ax%`JEyFYJNK znsG0gD`lfufa~t;c}3E1NQKh{mgLYf31!j?c`o`Lem0WN$)#P>rq9)v6YH^KgT_Gj zuAH}(*0YxafmC&Af;|WCzmsu|M_E~SLGj<7(#I3M2~HSeq|f?JcpzVkb1l-uX-Xd= z#{dGJ=IHtqoH1I7jpu9&CE0yJ)|L90oE%1}*#T5faqK^Mlk($LFU)Gff5_TJpjFp- z@+t#vp;MED?9Ky&XL@_1$#vN4IJUFI;nW)Wq?W zS?x1qTCdx%Q>=*Vr_Eg6F-%R~m9~Smp7w8TzM4H>W?|b&*kX~l6THz6?vrIGMqiYS zh_9~w!N5Cq%k$2Um75LvmUsqLR8WC0LExGFV2N1@!}``Fnjm76SC{wm%v_U}A`ZP& z3;vB@tJ}?33d)PbhXVwu3%In3YgpjvB3#$?2hXmqZ53@zNRDsicg>$kEkFvH0PJ}$ zcsKpi_B(2hu4g=hzUt^Ks3GPgM}5DLfoSAG-9)`m_j10oK0({HFDdN+B|L^Q(8H^< z3ct~v2+*DI2wa9PuU;BMlQ?O&K0CfH>~Lq^p=MQKdv>K6Q|P|?E^Cdr!k^_km+5PX z>p7mC7S%*v5l)?Zbg5Z*K+K)%Dc5bAQdIoS!&UA89_*XjJZjZ8k^=+XTQbOyv^InRh<51ISgPDt_F7&mNKkUh?*m^dzGx z=b}IK@%pH3Ho<~g`p)nhlJ*YE#=v?YaVjt+$AX|R>&NS4jO)mCr!2ETeWMj$9biYH z?kp(RH&SIUXo^VHNQw8Cp~&2Z$CH#LFmo;Cx>J=PZR?X3TPL3Ni5fL7&w( z=ad6XUA!fEl{3iwOsDG&(;C}(iWWti6yFJF2mGaGJvz{F+`Ak4%!V0>V zu~k8zwhN~S7WaQe^k0k5^Y1A=M%b;=3uecZ)|a1{xRfWWFU(*csA0cqA=m+n^W4$J8Ooq)_50qXw1V zKNVkH1Kr}n5eX5_vu|bJIh?EJ3Y8E}2E_0s`;16xL2ufM=0aWP-<=Ey9i4{^cJ>bF z&Vujd)8pxs-U)?iTEbl4=`ENXF}Mu&HxF>pH)LRnKQ_ZSl(Br-_f){pWd)VOl#-P} zg-zv~VXDiROSb3=`_fuHoL>4ty+i6#c?lhJ9pULuX5DUOfgvAOIoA7=zSs$p@D|OK z&DSxU7!=J8{lHB;sN_AnA)K{uBZ}$mbOg>g`Xj&{$2Q#8h

TKuI2lsidT{f>!*wOFf0ND?#l`y9c~3UfC2rVUqr2m;S3l zTYX|-w^}h*FTYarU1{;PpVa#Yo{AkV>~AHVH@j}Y+Bp2$62LULHo>b|;(;cfFANyu z8kKC-xSYZ#F)$;ENfdbM=?APWme2C2)|);7J!@`#7myWjY9*NhtmR0GR!BH49eBs zjYK$t;4+URsT@|G55|UY?p6yZh7TrhYooK8*P4#RD+QW3zR+WkZB+6Ew>YIvb)e)2 z_r&1ibaNO=&JHX%cMk#+0xO@-_HVjn>n&sUijTj?wJ~7n%uDEQkwwdv^>LNzx~k|q z9H~{FLe|Y-RD`QQZN$=p#mEq9vMw%UU^X^^o~8TP`{W5n$aL-^97khqCh?r zzCo%C*x$hAU8RL!v@cORt-D7IHAAWEXK8^(urAn)TS4Z6}AVef~d@-7aUhv+wQTo`}B zJt@p9D{%!65P2MZR4k(TT%_YpnD#pPl52H-{2(FqNmyos0_R$uLQ`3+nhEEIAPMro zto`HDbq#q-F&bt@B1`TiH*7*(lo=M00oSICy(*Y*tnd%#kNl!?WGg zIDw(V%3K9rnv@T60K5EbyFzPkSr~`>WIZ&>p4#^&e+tp_8oMyAcz9w;yTEjkxI4*b z*Iu9AX4HrOU`oE5F9@aUFrW#T;F2{Bu~@+`c}Pga!kupGpqhNLG^_$&kdn%KEYx{O z5o@IR)lQJqM{gqDa5Amun|fP{&&htKw)(s$Pb#s?dhcSGkI+D3Xm#EYNKSRW4QZDi zBh>j?HS0(18t7w{LiH{q`vvoHIX+;=qi+yja%jPV)OobXKvR~viqs{0>5tWu<)cMX zrYSXAH!5X1r8(-=!;KTp z2{WH4*JW4R(r1{TJ~&8Q4b`jvM6gcFR$G>1Yr*-X`NJPKlA~|sw)R|_VU7Ky=d4Gj zCEukWXu5KK=2qDpehcQK#%UtReYISQ%N=^d>Xggj>vN0|!JnTw9B5+uLU-ftaH@&? zaX7nUaQ<~TKLN-7IGoNWlsLDxD~QR9N4YdVsJ|NWZ3K1seA&?dflLaD9W`2Jtd_Cj8oXmzQZ8x@T z&^w)mU7>Z5;z-J^DMP8Y^WJ^S5A!+1EKI1 zu7dcl(>UsYZ@>M=X?*%mr%}o*5wvj?D9&FX@IQ%CiXH+MWni z!;HBcgp15r=7-~&abATbk>ak%CZ}oUHCsHmiaNUud^n_@rS|GCTSN1Yt?{o*8{581 z3Wy){L3E{WXMc}U&a9xOEy{nF~7Gfs!XHP^&J(Dd9#bj*=W%Ds^{)=$L zBofk*JtgiB*hGWu`7TE;xmYVdw?-9WYxMkeYb-8Pz*5KJM8)6JXy?tk?WJZW@6=;@ zoHf5TzsyTLIO%G{00CGT-_Aydmmkp>JMu?+aaw9#qC{^(-=^KI-T7|qV59%{+OZ-= z*%Ym?^-C_8hj+Eg3FdNd$hu zG0XeWV!pAgvNY|f=)Ta(l6o>v3a*WgMC{@v=D%Vl*FVS1Ck(%0=G0x3V#?3leMQ3L zVIa7Xzai@0VbJ2RH0#G?-t5!PEWi{=P_TzVpXomIab$WdqwSS1xU$v6a7!3U|jsRBjSzk zTUnngbi@#{$ggc|RCI_peONXxMKzC(MJ>P2XJ?)G%{chfo<7>ULiztFJ&NhbvVKLv zoN6GoF}ET3;4<}Fvzc*t-sU0UgNAK2_ENg!&(V!aAptIMJsIJvd)p*WYtgFJUng(5 zv(8}J>(j6>DOin;E~pW&i)6tZ_#3TtpYz@)7Z4s!D)m9;r@^za$2~B&6xUyot7-a? zmmo@aT%NBRzrX~mXW*nubq+~OUDpUnO2#Ne@(RN>|Ln%eUth9ZQ*sn*m7dFUMLDZk znNd%r#z}0yCA%2R&ta8;1kvQ8l7ry+*>A)bL#L)-GPeH zj=u7^UrFEH{#vKAMoGaM?4i3IY?PqekLDE&p8GRe zO;aRde_deqIb$O3a%tDep52C`laa6592MCe&L7%0 z`$fN##Bx7LGi8>+~Ln_eB<|Pyby7X2d=-03uP}v7RXbh%@cP2fHY$gRGPJPIlA17iHAi={3la^!@7v&|V^?ebD4+)@pz?{_wIY!t z@#Q~zyCrHqAcZF8Wxd@VtY;D7@-Q?*oAGTBDZas%32d(})BdE_N9f19=WUk3L}sbu zyI?mpJy*dL-H50Y2oLk*b2xs#$}0yQ)t;4^D*8fSjx&fR|8|J8>p)DD8#nGPRR&F* zPeAU1rcz*bzWZTOYxvvLqo+fr8UrG&>l;w!>{r%BIlNnjh`7RhK}g9Sugu0@lVZ1* z)0m1q^k%7OM&Ra~UU2Fm?-tz&T@@t`XAzbCvP&I62?$IItm24w@pQXXJO}}KC)Jl! zuBw97Lg_CgahZ0b^lus*M(h=#R3sF#bRy6DSQ68rcnvA|qk<;}Zj8t1D6&$UwP-T| zO~o1p#X_9=?BUPeop!X284%3=P~D&t&4syrV5i;@@@Spdm!I?`)phTsVcBrv?YeAM z+MFj$p3u2*nTYfStjC(@*?rq|Q(t(^7Q^5YZ{Fu{-pDZ@gwwF1`XzkTQ0<8S&?P0$ zI{IN2WxuZ_ouxr6UQao{K7>`O29W8u7_FMe^r0Zj9?=Fgmpv<|xoy|2g9e^UB#KXb zC-_6>UffBp&2Y-`Xox!EH`N5$0(s)16>tWWFnNdBADtZETq z1B7Kk3K`kJ@9}W8*!+g-W}@fD8!-G8+**c9ge7( z5>FO?)=b<#Yo@GNBQ0KXl8_82H>wt;yibI6Q)p~e@=zK7K^WJP{Rmb}XV*b+Dm5wd zU@WY)f5A5j7E-*|2w$!sBz=c4OhMgVNMMpGE!3?_Mf4 zoXq-aF1h)Bw(Sy3@AJeGF8ol3Gyhzz<4^g)@=ku3YDF;#kx9a_AK=W&+v}@987C|BCs_y~;#aM6Cq(>=9wdK_9)G6(0ZSTTl8jN_vDkvK z*PD?Mr$z~jDYlrI&Kq2`f2>*f_cb@&t=Uqy=f`q57IW8Q5=J+)aYXpstYhUvgwKHV zJk`QZJ(uX>)N_{*`0Bqhs``kRqXVl;S#Qn@Tlw-Kx20QYW^)}y|20?Bz01|mxdR{e zwZC`o!E-<~cK@xu{uM$0ZGFvvsIRU5tgor>>g(r!)Yl~(3B-%*4**;EaZeTN90Lp| z$zV4>;^9)qLp@Qpa?@OND- zoeaK$7BpGXO_$ zN^ElQ-n4yF><#;b9U>z|m-n6~M=(|q`|vN3GHWaK5^6^j#Kt}GU(6lw{{LG14{heZ zt;OBY_=7xZjCc+XJ+f+=i`~BUAGO)m2?4+haA~zjHIB)X0QS^T@SAF6&4o1>(>)Jp za3)E}oltb22ay31{vj0In~!5ooBAX5h5nxU4&J4{+)Rkn7wsK{xh>V8V67|8c*~G=+D2#u4vUh|J2WM+XS+mteud-SuZF zdLL1WhS^2mm7;%BDSnlrQhP>5!pQ%-g*f&nql$HmP@BTl%=SO8Y+G>6ABr&#7&VSim`$g=h?O;iixt|T(Q zD~Y)NS`r;0ZP>x1y-sjcQMz#li}h<4iWM6`^|1N*XWb9#9a9)9JK~t10VF*>5&c!IzYDIS zKgH```q=bZRBB2A>PzFAq)$8245gcB_f`X3!P|d+Bt&liS6%QQKT`gKe^m_`h^hg0 zj1Xo2SuldtA+947jd%QsM9An3P)1B1-(pGI&sw0V46@K!Vmx%fu4gh8cup6Ay77Om zWB6oR{>gi$G^SWicEY2+V5x$@;Ye5W+htV1!!Fyf==eEp$;=N2ucUfjX9S+d0v>m` zn0udC;y$9&YM+>~?G1pptNV&^+$74+qxiJTFAfHvk*V$Dj>| z-;hu@{TCZ&M;H%0wgz=3$BhgyXm0|!3CI6xaQwMl?+lLLx9eYZ)R~t)qQ@Xv=YnV- z-ieCcE0PkvC7r2i`fiX-9ovXk{wErZ?>iPuk*nhKjlHQ~miv31UCFpN!1`(D{mkae z*F)cvDMXsBzU+65@#$3Rg=P*O^_v&#;t1cMxP{S)H8;xZ1zL-i^azseDe}BO@DzET zUNi3}94zmpG^iJXtc~$e`6O^lMD*f0p13MZx@6x|l!(hXAkP}E4Xetivlgy7i(6Ow8c#_+5=oO|dxn0> zp;{q}E8|N}gsTLp^>`Ovn!;Tg!?a&p+g&CI<`C8Bj3x>>yw{qZxyNb6t*O!lOP##O zHLLW>7D!~6)wKxinF2mjI|x*~2`89ydD@xOb8HdMf6Mz5A80BF&bL4O1fHdId~P73#Pt|L|F#75Cw!L<<>Gs zgJFfyWe4Ae>{>9Pc@ksb9D5cQJ6?ix`B;INrX4-I_|@N#aHku$M11C zGR&qkjzQD}ocoSJ?5(qYJ$9s%+j(a2)mOse)<#Tq%g0@QF91+n$Viue7aD&DFZ~ae zx1ZgKn{}N@B=QW(BdhazlL*#JUa|!?DxlS8(X#4hhztCN^h#M@LpVjl!5wzlla}r- zh&kUlms$iMn5JCMJ8o%YFjV~}LWrmb)Jo4`!idDC>(Pu$i+*w%C5rq;!?Db;Q8hBA zfY$r47FR}6#|oWG6I6m?_Kl|?C&UZc-wSLvU8%Rd`H6IaYI}{cqT*`Gx!RXr>^zN# zC&WI(R+8m27^;g&@esn9YSQ_8yM{6p?_ksko;R9__B?%`8iHUNJs>kh#NeKXW+I;E zA5G=dm)~F{^2r*0R8P#cgLLNV<9VBUWgVuz(C;4||5i1Gnl4~9@*@5Mm5l{5UL&YW^Z7ozXq4&BY9NIulUKD@T zMCWf%k<}UV$?J;vMlAKm{jp<0NMOQ7pkA;yL;#E|a!zd%gP?xpWj&30p*zPZ1#zMNihyKtRr;?uq4_t*%v#?uq7fwO? zmY9R$vnbASfn5cU7dOufVsjCk^LOi;dXE65nTHZBt{1NJKfc@Mp0zzBw3#?iv~^NT zOeWiiHSv;{o2xkkHz9P3XVYcYvD`IJw^ONI)ZIYjZ@t#-pRvJlCyU_(JDBM66)@Y0 z7(?4~Tm}bX%)#dt7b_hMk`oVV1cu#$`46{{dbwQ@Z+J`;;fmHh0VYK+Bc@||7V^|^ znKsh0=jZ`D@Uv2I8^uyzzuwwW&Fevsuq-jq7EiI~yW-qTW-{B(Yo z$G)rfGb%N(#EZdPazIhS;Z`ojGGS1+F}T?EwRaftF4xU8&r#$U0DfNdp^i6ncxzlJ za3^qYhVC4ed*)TL!uBL8Oyl*Mg;Hm5Np|n9e93TY3p=2tOJ=}Obr<4}iL@p*@!k6M zt%e1m%Zz}%lr>nG4K1jl!3$GWE$BFY#hHI^tkT!kV2Qs43&c+A`g~6bQp@a1PV+{N z<>I5V@+sMLOIn7aTGXJ=P!6@lqN3|89ksz%lQE0fg?oKiX$&?Ji9w0+StUvPxXOx>=&dyt_3DpHomD2$Wh0t_teREfRV3g$d zWt^9R6Ys<7Bo4Doubx8UJE#)yKdX$U2F79$oqsbc%Wb;nXH#<+?f1kM7z0nv_ei;A z{$L56BI7h+gKrt)F@UVStgAf}irsW?!|lP7qRI&Xt^875=qLm~>xOEecS=KWtf`%v zLruR6rW{noSac%KSiF_frh245)?CQ3<8*u6(OTriwv@eR*q!63GUV{D1OPl zp5}SKc)2Ui_tj-I^6TrDD6U6w-f=cJrQp>Uk}eby5&|{o&jzz#%!t>j&_%zq5L3vS zd=MPS=6TF}nz&FJ^Yg2@?EyVI6YxWJykn4v6fbu?OxD~ zhwItn+wk+UZW|%nq;iGY+u}8J3Y^lE3;1tHK?%9fo}aXfW=4D~x1YJr5bMScSnS4* zb4s9TBbCFl4&O0GtJgDH)lJo3ip`WDaPib!ge0XJnYxC56?8LwJpM&YZtl81{Q0~2 zv_>2E%iG>Bds70cnAGAScq5E+Y1>p!K2G7&0>6qwIUE2`0E3}j-eQ!znEK%eVgND0 zQ8&3TOb-|3@ZxD%z1*0vPr?Is1ve<5NT$njWKcJ2cGBT<(1g2$eU^SiL4&nl?9-;G z(xd{6S9ZpjdXDG|h$re%(pQ*o#X+Je<4{bQ%pg6wjs@rR_IifC{Uti11Mg1?F>4uN zZuTwP;7XuoOTReg85*tjHC!2D1(2m$Db1a_S2BP+FbJV|`Wt!F9@7b3pmvrVdcxH06oQ7#p08~y+;E;LStp`xYmNb9<+!A4J} za9Zu?u}qtLI5wC=Q(}@z2WO?&f3>y+x!2T9Fbp%8e)U z+Q%~UR+q-U;Jn_6rjGd%%|J0@K-gXM^dEjo*7&C!NG5V@FdI=0^V9*wqKDh)p zYzBS2b^2@X@_oMZ%;Wo=9xm6J?4=Wq3v1AGm||X?2rb79@v|lj+F}U9F@$1YZ&w9P zYG%NX-A7FC6=tu%oS3#)soRPDIUd1o(X1DE%Kb`RI!elidaj+l zvFg6nBxBcWdj_+|i#?RA5I3~g8Fm}}$Sw;&J2QE<*U6YuL(;-CXPSgbX1XbjlcO6d z{ussxfAkL~W1dmr$Ab7JX|@W_`y_xyU)kl{9dO^P*+x-YiF5|L&9UZ-Qhbi_9>Y(- zJ!02SH3hhM_F_trvV)LFv~p`D(j^_xzIEg zF!*!~1b)rP)BLKp%U2BLt0e(7ZXbp+ZLx5Suz@a$2X#-r6P9mMT$k;jQjB(gV}Fm0DzLu~ihKIxjcQxtAk>a?>sm`~_A!Rqi+$gKyF%Od?Y$>x2D}Fr|r;0=KS4zsKShp>=KF%_- zWIy;X8{eDh4{dE;H*K$5`_XmLs!G*Mx$(AXs*FmI_r3@�}8wy^Og0+I(yB#f`W? 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%0DUN4=^yB1N?Vx&EAB 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%0Ai0nh9~k)4J4{t{?L-p4~x_&f$IT)dnk$ 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 literal 0 HcmV?d00001 diff --git a/test/models/NFF/NFF/earthSpherical.jpg b/test/models/NFF/NFF/earthSpherical.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3419e807173dfec482eae5a5bf58c3fe1e976451 GIT binary patch literal 422120 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%0Dh!G#gvF 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 Date: Fri, 31 Mar 2023 23:20:24 -0700 Subject: [PATCH 172/232] Fix model broken in commit a8a1ca9 Restored broken binary from 4bbc033 (5 Mar 2009) --- test/models-nonbsd/3D/m_rifl.bmp | Bin 0 -> 196662 bytes test/models-nonbsd/3D/mar_rifle.uc | 4 ++-- test/models-nonbsd/3D/mar_rifle_a.3d | Bin 50494 -> 50524 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 test/models-nonbsd/3D/m_rifl.bmp diff --git a/test/models-nonbsd/3D/m_rifl.bmp b/test/models-nonbsd/3D/m_rifl.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fc1d8c2819c1e0233782a2abd624a37e3e2cf56d GIT binary patch literal 196662 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 delta 159 acmcc9#k{YJdBb<+%?g5(*#;T0fC&KZ1u+f) From 87c309566fd7e32a9c54c18ab8155f412e863f25 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 18:35:57 +0800 Subject: [PATCH 173/232] Fix warning related to missing-noreturn. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/AMF/AMFImporter.hpp | 10 +++++----- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 1 + code/AssetLib/FBX/FBXParser.cpp | 1 + code/AssetLib/HMP/HMPLoader.h | 2 +- code/AssetLib/MD5/MD5Parser.h | 7 ++++--- code/AssetLib/MDL/MDLLoader.h | 2 +- code/AssetLib/MMD/MMDPmxParser.h | 3 ++- code/AssetLib/X3D/X3DImporter.hpp | 12 ++++++++++++ code/CMakeLists.txt | 1 - contrib/Open3DGC/o3dgcArithmeticCodec.cpp | 1 + include/assimp/AssertHandler.h | 2 +- include/assimp/defs.h | 6 ++++++ 12 files changed, 35 insertions(+), 13 deletions(-) diff --git a/code/AssetLib/AMF/AMFImporter.hpp b/code/AssetLib/AMF/AMFImporter.hpp index 601eae4e4..27f733043 100644 --- a/code/AssetLib/AMF/AMFImporter.hpp +++ b/code/AssetLib/AMF/AMFImporter.hpp @@ -282,11 +282,11 @@ public: bool Find_NodeElement(const std::string &pID, const AMFNodeElementBase::EType pType, AMFNodeElementBase **pNodeElement) const; bool Find_ConvertedNode(const std::string &pID, NodeArray &nodeArray, aiNode **pNode) const; bool Find_ConvertedMaterial(const std::string &pID, const SPP_Material **pConvertedMaterial) const; - void Throw_CloseNotFound(const std::string &nodeName); - void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName); - void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName); - void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription); - void Throw_ID_NotFound(const std::string &pID) const; + AI_WONT_RETURN void Throw_CloseNotFound(const std::string &nodeName) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_ID_NotFound(const std::string &pID) const AI_WONT_RETURN_SUFFIX; void XML_CheckNode_MustHaveChildren(pugi::xml_node &node); bool XML_SearchNode(const std::string &nodeName); void ParseHelper_FixTruncatedFloatString(const char *pInStr, std::string &pOutString); diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 8fb700179..4ab73f681 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -139,6 +139,7 @@ size_t Offset(const char* begin, const char* cursor) { } // ------------------------------------------------------------------------------------------------ +AI_WONT_RETURN void TokenizeError(const std::string& message, const char* begin, const char* cursor) AI_WONT_RETURN_SUFFIX; void TokenizeError(const std::string& message, const char* begin, const char* cursor) { TokenizeError(message, Offset(begin, cursor)); } diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index d71321452..c85841f8b 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -88,6 +88,7 @@ namespace { // ------------------------------------------------------------------------------------------------ + AI_WONT_RETURN void ParseError(const std::string& message, TokenPtr token) AI_WONT_RETURN_SUFFIX; void ParseError(const std::string& message, TokenPtr token) { if(token) { diff --git a/code/AssetLib/HMP/HMPLoader.h b/code/AssetLib/HMP/HMPLoader.h index 95ce0a9eb..4d5f5f22f 100644 --- a/code/AssetLib/HMP/HMPLoader.h +++ b/code/AssetLib/HMP/HMPLoader.h @@ -86,7 +86,7 @@ protected: // ------------------------------------------------------------------- /** Import a HMP4 file */ - void InternReadFile_HMP4(); + AI_WONT_RETURN void InternReadFile_HMP4() AI_WONT_RETURN_SUFFIX; // ------------------------------------------------------------------- /** Import a HMP5 file diff --git a/code/AssetLib/MD5/MD5Parser.h b/code/AssetLib/MD5/MD5Parser.h index bb4843cf9..ad7367e2a 100644 --- a/code/AssetLib/MD5/MD5Parser.h +++ b/code/AssetLib/MD5/MD5Parser.h @@ -365,9 +365,7 @@ public: static void ReportWarning (const char* warn, unsigned int line); - void ReportError (const char* error) { - return ReportError(error, lineNumber); - } + AI_WONT_RETURN void ReportError (const char* error) AI_WONT_RETURN_SUFFIX; void ReportWarning (const char* warn) { return ReportWarning(warn, lineNumber); @@ -404,6 +402,9 @@ private: unsigned int lineNumber; }; +inline void MD5Parser::ReportError(const char* error) { + ReportError(error, lineNumber); +} // ------------------------------------------------------------------- inline bool MD5Parser::SkipLine(const char* in, const char** out) { ++lineNumber; diff --git a/code/AssetLib/MDL/MDLLoader.h b/code/AssetLib/MDL/MDLLoader.h index b7d87e88d..433100938 100644 --- a/code/AssetLib/MDL/MDLLoader.h +++ b/code/AssetLib/MDL/MDLLoader.h @@ -139,7 +139,7 @@ protected: // ------------------------------------------------------------------- /** Import a CS:S/HL2 MDL file (not fully implemented) */ - void InternReadFile_HL2( ); + AI_WONT_RETURN void InternReadFile_HL2( ) AI_WONT_RETURN_SUFFIX; // ------------------------------------------------------------------- /** Check whether a given position is inside the valid range diff --git a/code/AssetLib/MMD/MMDPmxParser.h b/code/AssetLib/MMD/MMDPmxParser.h index f2e387975..424fc725a 100644 --- a/code/AssetLib/MMD/MMDPmxParser.h +++ b/code/AssetLib/MMD/MMDPmxParser.h @@ -46,6 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include "MMDCpp14.h" namespace pmx @@ -730,7 +731,7 @@ namespace pmx std::unique_ptr anchers; int pin_vertex_count; std::unique_ptr pin_vertices; - void Read(std::istream *stream, PmxSetting *setting); + AI_WONT_RETURN void Read(std::istream *stream, PmxSetting *setting) AI_WONT_RETURN_SUFFIX; }; class PmxModel diff --git a/code/AssetLib/X3D/X3DImporter.hpp b/code/AssetLib/X3D/X3DImporter.hpp index 8852b71ec..705a2472e 100644 --- a/code/AssetLib/X3D/X3DImporter.hpp +++ b/code/AssetLib/X3D/X3DImporter.hpp @@ -55,6 +55,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include namespace Assimp { +AI_WONT_RETURN inline void Throw_ArgOutOfRange(const std::string &argument) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_CloseNotFound(const std::string &node) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrF(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrD(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrB(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrI(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_DEF_And_USE(const std::string &nodeName) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_TagCountIncorrect(const std::string &pNode) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_USE_NotFound(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; inline void Throw_ArgOutOfRange(const std::string &argument) { throw DeadlyImportError("Argument value is out of range for: \"" + argument + "\"."); diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..f13eadbdf 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1236,7 +1236,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-header-hygiene -Wno-tautological-value-range-compare -Wno-tautological-type-limit-compare - -Wno-missing-noreturn -Wno-missing-variable-declarations -Wno-extra-semi -Wno-nonportable-system-include-path diff --git a/contrib/Open3DGC/o3dgcArithmeticCodec.cpp b/contrib/Open3DGC/o3dgcArithmeticCodec.cpp index 2ae70fa2e..c1935822d 100644 --- a/contrib/Open3DGC/o3dgcArithmeticCodec.cpp +++ b/contrib/Open3DGC/o3dgcArithmeticCodec.cpp @@ -92,6 +92,7 @@ namespace o3dgc // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - Static functions - - - - - - - - - - - - - - - - - - - - - - - - - - - + AI_WONT_RETURN static void AC_Error(const char * msg) AI_WONT_RETURN_SUFFIX; static void AC_Error(const char * msg) { fprintf(stderr, "\n\n -> Arithmetic coding error: "); diff --git a/include/assimp/AssertHandler.h b/include/assimp/AssertHandler.h index 365a924b0..1247ff490 100644 --- a/include/assimp/AssertHandler.h +++ b/include/assimp/AssertHandler.h @@ -66,7 +66,7 @@ ASSIMP_API void setAiAssertHandler(AiAssertHandler handler); * * @brief This issues a message to stderr and calls abort. */ -ASSIMP_API void defaultAiAssertHandler(const char* failedExpression, const char* file, int line); +AI_WONT_RETURN ASSIMP_API void defaultAiAssertHandler(const char* failedExpression, const char* file, int line) AI_WONT_RETURN_SUFFIX; // --------------------------------------------------------------------------- /** diff --git a/include/assimp/defs.h b/include/assimp/defs.h index ddb209bec..34121e385 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -184,6 +184,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef __GNUC__ # define AI_WONT_RETURN_SUFFIX __attribute__((noreturn)) +#elif _MSC_VER +#if defined(__clang__) +# define AI_WONT_RETURN_SUFFIX __attribute__((noreturn)) +#else +# define AI_WONT_RETURN_SUFFIX +#endif #else # define AI_WONT_RETURN_SUFFIX #endif // (defined __clang__) From e36812a449fcdced34bdd0fc2f7af85ce9d0bd59 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 19:07:13 +0800 Subject: [PATCH 174/232] Remove unused -Wno-deprecated-copy-with-user-provided-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..3ee9c0705 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1242,7 +1242,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-nonportable-system-include-path -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow - -Wno-deprecated-copy-with-user-provided-dtor -Wno-deprecated-copy-with-dtor -Wno-deprecated -Wno-format-nonliteral From 7df4efea4460056d530a65201cab0638493fc672 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 21:34:36 +0800 Subject: [PATCH 175/232] Fix warning related to inconsistent-missing-destructor-override. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/3DS/3DSLoader.h | 2 +- code/AssetLib/3MF/3MFTypes.h | 8 ++++---- code/AssetLib/Raw/RawLoader.h | 2 +- code/AssetLib/Unreal/UnrealLoader.h | 2 +- code/AssetLib/glTF2/glTF2Asset.h | 2 +- code/CMakeLists.txt | 1 - code/Common/ZipArchiveIOSystem.cpp | 2 +- include/assimp/DefaultIOStream.h | 2 +- include/assimp/MemoryIOWrapper.h | 10 +++++----- include/assimp/ZipArchiveIOSystem.h | 2 +- 10 files changed, 16 insertions(+), 17 deletions(-) diff --git a/code/AssetLib/3DS/3DSLoader.h b/code/AssetLib/3DS/3DSLoader.h index f47fcfef9..6bd73f412 100644 --- a/code/AssetLib/3DS/3DSLoader.h +++ b/code/AssetLib/3DS/3DSLoader.h @@ -68,7 +68,7 @@ using namespace D3DS; class Discreet3DSImporter : public BaseImporter { public: Discreet3DSImporter(); - ~Discreet3DSImporter(); + ~Discreet3DSImporter() override; // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. diff --git a/code/AssetLib/3MF/3MFTypes.h b/code/AssetLib/3MF/3MFTypes.h index 02238ceab..8207b568b 100644 --- a/code/AssetLib/3MF/3MFTypes.h +++ b/code/AssetLib/3MF/3MFTypes.h @@ -93,7 +93,7 @@ public: // empty } - ~EmbeddedTexture() = default; + ~EmbeddedTexture() override = default; ResourceType getType() const override { return ResourceType::RT_EmbeddedTexture2D; @@ -110,7 +110,7 @@ public: // empty } - ~Texture2DGroup() = default; + ~Texture2DGroup() override = default; ResourceType getType() const override { return ResourceType::RT_Texture2DGroup; @@ -127,7 +127,7 @@ public: // empty } - ~BaseMaterials() = default; + ~BaseMaterials() override = default; ResourceType getType() const override { return ResourceType::RT_BaseMaterials; @@ -152,7 +152,7 @@ public: // empty } - ~Object() = default; + ~Object() override = default; ResourceType getType() const override { return ResourceType::RT_Object; diff --git a/code/AssetLib/Raw/RawLoader.h b/code/AssetLib/Raw/RawLoader.h index 6e4c4d110..54314f728 100644 --- a/code/AssetLib/Raw/RawLoader.h +++ b/code/AssetLib/Raw/RawLoader.h @@ -58,7 +58,7 @@ namespace Assimp { class RAWImporter : public BaseImporter { public: RAWImporter(); - ~RAWImporter(); + ~RAWImporter() override; // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. diff --git a/code/AssetLib/Unreal/UnrealLoader.h b/code/AssetLib/Unreal/UnrealLoader.h index a931a86dd..fda784cfb 100644 --- a/code/AssetLib/Unreal/UnrealLoader.h +++ b/code/AssetLib/Unreal/UnrealLoader.h @@ -56,7 +56,7 @@ namespace Assimp { class UnrealImporter : public BaseImporter { public: UnrealImporter(); - ~UnrealImporter(); + ~UnrealImporter() override; // ------------------------------------------------------------------- /** @brief Returns whether we can handle the format of the given file diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 1d7cff325..166c10038 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -483,7 +483,7 @@ private: public: Buffer(); - ~Buffer(); + ~Buffer() override; void Read(Value &obj, Asset &r); diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..184347145 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1211,7 +1211,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-undef -Wno-suggest-destructor-override -Wno-suggest-override - -Wno-inconsistent-missing-destructor-override -Wno-zero-as-null-pointer-constant -Wno-global-constructors -Wno-exit-time-destructors diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index d0c2f3204..51a250810 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -68,7 +68,7 @@ class ZipFile : public IOStream { public: std::string m_Filename; - virtual ~ZipFile(); + virtual ~ZipFile() override; // IOStream interface size_t Read(void *pvBuffer, size_t pSize, size_t pCount) override; diff --git a/include/assimp/DefaultIOStream.h b/include/assimp/DefaultIOStream.h index e8d9ed329..67cba3c5c 100644 --- a/include/assimp/DefaultIOStream.h +++ b/include/assimp/DefaultIOStream.h @@ -84,7 +84,7 @@ protected: public: /** Destructor public to allow simple deletion to close the file. */ - ~DefaultIOStream (); + ~DefaultIOStream () override; // ------------------------------------------------------------------- /// Read from stream diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index 1b986ff1b..4023f7529 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -65,8 +65,8 @@ namespace Assimp { // ---------------------------------------------------------------------------------- class MemoryIOStream : public IOStream { public: - MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) : - buffer (buff), + MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) : + buffer (buff), length(len), pos(static_cast(0)), own(own) { @@ -145,7 +145,7 @@ public: } /// @brief Destructor. - ~MemoryIOSystem() = default; + ~MemoryIOSystem() override = default; // ------------------------------------------------------------------- /// @brief Tests for the existence of a file at the given path. @@ -190,7 +190,7 @@ public: bool ComparePaths(const char* one, const char* second) const override { return existing_io ? existing_io->ComparePaths(one, second) : false; } - + /// @brief Will push the directory. bool PushDirectory( const std::string &path ) override { return existing_io ? existing_io->PushDirectory(path) : false; @@ -216,7 +216,7 @@ public: bool CreateDirectory( const std::string &path ) override { return existing_io ? existing_io->CreateDirectory(path) : false; } - + /// @brief Will change the directory. bool ChangeDirectory( const std::string &path ) override { return existing_io ? existing_io->ChangeDirectory(path) : false; diff --git a/include/assimp/ZipArchiveIOSystem.h b/include/assimp/ZipArchiveIOSystem.h index dac60b501..9f3a4783b 100644 --- a/include/assimp/ZipArchiveIOSystem.h +++ b/include/assimp/ZipArchiveIOSystem.h @@ -63,7 +63,7 @@ public: //! Open a Zip using the proffered IOSystem ZipArchiveIOSystem(IOSystem* pIOHandler, const char *pFilename, const char* pMode = "r"); ZipArchiveIOSystem(IOSystem* pIOHandler, const std::string& rFilename, const char* pMode = "r"); - virtual ~ZipArchiveIOSystem(); + virtual ~ZipArchiveIOSystem() override; bool Exists(const char* pFilename) const override; char getOsSeparator() const override; IOStream* Open(const char* pFilename, const char* pMode = "rb") override; From bddb4559a18b14494ffa1679e675ebb0580930d3 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 22:46:01 +0800 Subject: [PATCH 176/232] Remove -Wno-deprecated-copy-with-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..a69d1626f 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1243,7 +1243,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow -Wno-deprecated-copy-with-user-provided-dtor - -Wno-deprecated-copy-with-dtor -Wno-deprecated -Wno-format-nonliteral -Wno-format-non-iso From dacaebc0788848157ad6c54e1f10aa0e117fcefb Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 23:49:22 +0800 Subject: [PATCH 177/232] Remove unused -Wno-shadow-field-in-constructor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..e05b4dd7b 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1229,7 +1229,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-double-promotion -Wno-unused-macros -Wno-disabled-macro-expansion - -Wno-shadow-field-in-constructor -Wno-shadow-field -Wno-shadow -Wno-language-extension-token From 9c5ab67b64363ffdd71da939ca9b937b9308aa54 Mon Sep 17 00:00:00 2001 From: Steve M Date: Sat, 1 Apr 2023 09:20:36 -0700 Subject: [PATCH 178/232] Replace provisional image with original historical image --- test/models/IRR/UVTransformTestImg.png | Bin 16301 -> 34368 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/models/IRR/UVTransformTestImg.png b/test/models/IRR/UVTransformTestImg.png index 1701d737b46c9ad50602ed584247d83582f389f0..b8f6f54f1f5e2e3014307c83195238ec5f0a36b1 100644 GIT binary patch literal 34368 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 literal 16301 zcmcJ02UJttw(bg{gMdmCX(}j66%Y|A0i-Eix>O6j_nue)1qGBQy-F`Cy#_%zfx@rNPYI4s!Np6(l;0VQvl!k1s}~Gs5N#nZsSOyJ zPN%5qe|TvT)q(*F%pwedhAp z`7C>IOE*MX>K9j(mg?6ZjVKZ()k#urhWU;b8?rV4HsOB0!JZ%Gj$vgk&}v+Vgm})h zPZ6KjXuuxMTIT}bacBlyk=KHe{XObucIaP$jQxCjbQfz@3#Su*ge zAZDBe{K{f4pagGVAdydnhXhd%EcKu23Xn9nfQ(|qMIqAWQW(m(N>qge)kp@sBaNcz z5taazs36b@xFtz|BInsIIJY`HL!=))SzzHBQlkn3%^h)F3HSQN7;EBs*?hJ)C#Nq= zw>W-MuwuE&U`;i9F(o1S(pl97xOz7&0BnbSUkH+N(F^mlQ}fmfjvKpeSpwg&GCwYwEOv}{% zF3rJCO+&NB`!KUnWF|tEC^qFX84>&kY9(O&H-TFcBC(`7`#Ijt%GtYAH*%qaRN=bw z{=y|fdk7LAd9`m^{FA8wQ}~wAs~YW#8ts0yx^M4X_z^dKW(g^}#TAdIit#xGibJ)U zHLEBpI~<#X*I^_PbVmK&01><+_?nI8Enu(_7xmi*AO?LHh2V#Qu7sQ!02&rqP4i<} z)W1;za3|yGwU6=?v|kvDo9R-%a5OZtkXVu5LD2FvOEV~t&!X6=Gg;&1&*?Qw{UWXW z2xrSUoixQz@#VVYsfEcircYN~S;#F}(^^;?La9jQzf+#Ix*+xP^ux$s7rQB05+g}3 zTB(Y^L*;NUy=2t6*!JB$honHk{;iqnrENiX##?Vp5l7LO@7$u{$Kees*JGc4)`1U_ zcp+-@x!A(LWq9;?iqo5+;P*quZefJi;M`%vmrw2^Z0<@F1k7t(mmuh5;fh*9OC`|)m8lllU0 zw5S@5nu97vRWRp%j%+`JU5fhUm1w6Q6SI_`QN`Q|Z>yu}qqW}QezeY3GfK6+oK~mG z;?d2CJ#+WQ6S+Ck59y)`i5Z1DT?J`_l!Y&)(oNKyGQ72g?}rtf757Tw?Mh}=?8p(! z9_mf9v$5N^6<+eJqx$`vQz@Z0q2FPVVrgON`K}M`snAo;+f^U(opU%Ba4wIv`kZj0 zdM?>OLgIHlkrC1Ji8k-)-@E7=UHfw_km>EuGjURJ264f03x#_69{O@aeuXr8Mf&tb z<_1Bz%KGKnGX+$G%tb>59QySI5~ba`KDtrbJvtWIO&0iPM~_Z@4h>Px2vyD2dsO}H z+?xx`-$b8m87U0A8^Bit9Nud@eDL{jRo$Bmcivk#K>fa=N1=7G^;_%IdABYY-M3GZ zo3}<&?si}3KGhu{2p5zS{4{J|VqFqka&ydotZD4wn)@2_+RE65muo5_RUmaw%1LV9 zi>gkdPNy!U4&&9cEIaUM#czpf@8=%f((gW%J*VC5J(lH-;f+47n7bRQ~A>+q$=3ZL|B-vai%!UJtXGx#7zqYhCQZ{;*hl;>oy!wADj9 zQB2O)oVMAft6i}UN!E3J6$74~o!gWSdF|jl;V(P)im0GIeruJK`Eu}ZiGZc zd;C~@UJ*9aZ@y$t7RClbx`P z(~MD9`>*cZcOJXGdb~=#nzTy3cI%JTAKpJse|k7N+0Sqc-}by6=Fwy+u#z(+ z-dgarpmoX6=Dba&N9xWEmfU;M9cL1}6Ikv$<%Q=tr~7xr&9SZ5^;Zt;Whd7skC%)( z4gT(wX$vaCX$U2s|6$fDvmw8`xo);W`!mz>wK6TKj8?rm;tj%(!9Do?qbHZ0=w z9rN|UWMfBwrIf79lcVk>xa>Dsl63#{u%_Imi&&YaOTojziNO@dX}H@*9r&mN^pxK= z^Oh!=CF~1q4%YaT?P)pO0nSC5Ncw@|2H6|3dU9b}StbQqs#C^X?lCUSEZgS~ABm0I z2qg6}{iIA~GC6-F(s@~(bNF;*Xb&ZpA=oANP<^Shit^>8isQ=~F1vGyEQdjiSFec{ z3N7nY-1l_z+!q)wo;AkVG)8Vk6}+y!jj^wC_qHjvchq%!w3=Llswu2_>Kk^Tw3Tqi z^DGb5+N;^GzrM=6n(-i6a7+?QnN8A*_k2`3H=b3?GQZT_k>(?9e8V_8P%`BGnS{@B zbI-XIw1ru<=JK31IL>arNDk3bYRY<(rSqw}=C1U+`Ba0rKa#(12Pq!ehH5E$eG{Y7 z(&hJid+uHBr5z1}JHr#jJ)>@;g12H*VpFnpPuay+@Q;X8^HpnE^Yh1?n)RD^`guMk z?C1XMr9+P$43lGsdS7;hZmBjMv$}9TzwZOq2fj6`jjAStVpwa!^5G?#XUu_((I2&I zK9>Kg@ipF>yogq+XTB71pT$S$x|wd>V_&bfqQ;V zV`CF{tADPosIKI!I2Z35qs#6#+RG31hHjoJIluL0?!1N5-3iZ3fBU`2u8OXoUGN)L zH`X3>RuyBmGbOVB_@^SxIt=h7Mb%BCm&b;h-JaNpU2Ul3_ce5AR0`U2 z?q7fQJBsb$`8xD`@b4NGAFZ~usDKXv6n~U9R_r}p9LLMh=+9J6x)N_VRi#|#l2I;W z$!keIm98e&=vw6GzFfiP1_sP%FJ^YPj<lq;%!{QXjBuVTS$rwp0Q#*M|- z*{K}n94bxK#NdtVGmpI5Z$ufUWu)@SY#q)%iw|C(EXN|>&dR=|o%s5mi|hO;w#Mzp z-7!;npYzW4{0ufA`mJ~rEnxA}xO+WD$G_Q;nSa|=%4vx1!T?|5-q&D&z@&J5_ z48-ZgK>u?;Qq|P}z@HZY)N=q1iO~BJ0A3;hEL#E~^&S8gmvgNPvP+6yksja6@>Wfj|LX zLJN37gn^6D`@h}{LjXX$1Q37$G!rSIS5mMkM*_XVz;P5n3ABo+53tjP{q;ZgGkd$S zP(sJt8BkHuXFFTBJ{4s;a)b6c5Eq2}MaP_X{T{)#d{iLeUdLyE$QISgc{>z91v)+l zVzu7Qx?aTYd#OF003x)HDor@d?L-q9P@#`8RSSMPj2zwk;aO|m4j2iLfA9GhOVPxJ zr9YniV(C5YGoQSrd;NDU%0`4k2?Lb2Um)}@!cO;`+jpl7ZBjysIID=>z=d7h4zh5g zwY`qD5MVwe&hH$Ki)$QXE8;so94k3iKLEY4-)26EP?3SkG7q2n-jYb>06v_!6^$g1+ zcWkLqBD6ccoL~@rHpxbl6fF09*UJp@-0)G_8^f$}!9CgWGCdu)mSEt9A?~|P6v+6q z9jaI|wy_VmJ=W6)W)IJ0Y@0`WXQO8%4-FeZhD4Wj`Ef1<7*Zknhh=6mYP(37k6r*l{Ub;&Cj!U;!ETB8Fd zzxMZoux=?VA5Qy)hs0i^)$gL;IW#>OAd?qK?$Ruhrg;9vRy?W8TD07z{2ZYyf6w2n zViN{DMev5B>n5b! zY)Bgn*gk&dVR{-4o>Y!HzUbr|5^J;p4BbzMib?gyf8g-uO~3ex=>fu~$PDzB%&Nuc zqV3a_ky8MrI61a(UF}_t)+jh53o6TBvH63OHfw`i zfa?x=klV|%tB!3INEss@Sza}0Fzm;Nk8*$&Z~Fzk;`PLYuV^& zdd0$dirVC4#L4KNfwt{*I?t=0*=V5$h!5$M^BR-K@67Q2J5Vbs0*=Uh zg=ADZtPdjrey4j4$@v~W@62oJ{%rv{*vX5)(%2wPH@*M2A`FrHZDz|+;z5all2yib z{pK>)@lVBD&>Zj-DCl6MEA~H}F1rNGaY)fbO5tYPEup{#^62vfc0rD`w;$bNdDM=u zzG>CJorh@2pkAX?KW-geQOh#P3*&@Oic|Wfz02d+O%_X5j0n$Ct$cDFx<-FN#gCJk z90)ox{IKW^lx-&p>)9HXGaoiVc0qB1@3lKIJZfX-bX3gtR7K%gd@aPh&rZ1Bx_3O# z>=AJAc;eN_%E$dPz?D~)GJ8H*gd=$G1J=Ko4;ow?AgtT+hR+h4NGwHIDJ@2A#aoEQ zPy;MK=?#yX__e)Sc3^5|M&%_>T}3uD_p(T6&HFagu1A5emfH<}O=u)VZHlu3Uyn=q zmD!W{U@ayF&&=Yr_^rcM_XB!%Y9Q0^0#pMr zdyK8h28d|v9DL1QspCx%0EjPyj5=Icax=(qfkod`t}H#&VFxb5Zp<>ZOhO@7-_t-d z04NCxP-ymO=`84G+PtF^OH{I`^{IHq@${q-*sCqR=G*nI5^y+-2Z+6r^CMn6$E2+y zFV1A7$dN)ZbqywxsIERBt|3Mod$qmzuf5RF>8a4jG1I$Til(M zF3kN=&6e+LA`DduSZT@agvZbHWEH-KH3IF%)8Y0il*^JAcIL{sDWUD*AVwdicu4Z` zCr2jq0QmeQmE}Cw0Cz(%DVW{Cumqdqb-G7J2U7^p-qj|!7DqD{qngw~&WII2^qF;C zGbu4BMxET~z4~RDZq&21?}6L}TKJE8JI`ICs#8oy^bhTPp%q@^h=ifWhCH7$emJta zYWu45R1jx~p-M}PC_rR-T@T1Od}3@spy2jGo>kN^9Bct?3j{o9-rL)&{b=iEryQj? z8SbZDPGT|##H%T_*Yu^Iyt&Ty#+`GssbJJGm#~PX2PqiQp)BJ%i6K4r0?0_H%KUb&RIZA6%oW6(`_^mUh=(g!O&y zEr`Qk>7V{~`~L+H{{RAj|35zL~Q zhsfZtf68M25Rv`k-cyKw3%>r%pnne=8!`M#@RcuT%GEaMG6XIG807BwJiJo5ud=e| zZ+sWCHoVh-59SJ;3PxicB}g;O6LZgzewlKWWT(?%)X2LJQ2tBER*}xLr^w-;_oYO# z#yg%c>sg#EEdO52kJ&v7Ux{QGDr+FM%X%iY&$|59P4p)L8X#Wy#S(Hs21P@)TaPPE zAUrkYN(q+x+-s%9i|IySL2USiox@u6$IpJ+y_+k0b+t>~1=Es$g0NLiAlk!@|23{` zuCDZ`K7$Q3?=`pH?Mx~$Rh#S>mR=;Gydq9;912U@uBqXg& z-Xle@w_CCLr;SXFCaiJrN>Bk=Xydiv~&)fhaZb*&?U z4B?_opaeUgS0 zVciualugvPa3;AOxihV7l-5D2!{`<4rmkVw;FrF2pb{fo`9AmRahE=ZtRD_q^g+)K zK-u4WWTs3kB2+#5UVK^CYS(a>s9^OV&53;qX;{Lo5CA;upZnQ?Xq%gU^C}<%)4(3} zh0%^JGnbzy%kOlVvW6~OW^g6TB}EeOaKwC^+EA5x02Qjw76Q65ef_1! z#<#(DJg0JYUtC&UepfnO0AUvnZdIdRRDQNMgzW-^MMQ=dtl3vO-XW{3LO&gFr}yT2 zY!+=?a80{!dP_hLc9j$`4a4fRh|jrI?4@dh(_epQfM1hIoX&0?Y-QQr%rY{L$&-LKZ;7Itb{D~i2;??DB?+1E%RM-7pF&ozO?d7S zEk(YM2Df_sK7J#`C=k0S2(tL@;_@FGv~BU^6#Jj=t0^tgqZP6`!e%z^?IF|7Z-nH` z?;V)SP$lyGaIOw$9I?YxnR2qUUx)FT^cp<*@qrHRFNZg5c#zc;=OV+34m_n z;N9UNwdRmjB3}n;LW?*gjT>qq-m0HiuACjB2Z@G_+ZIkN&Wt`@cXK7dwWiQQ0*+Ok z2ty3ezVEVbpfWYz7W}C2M&re^tkTG5Og_l$_KlrG2zYJpS_FYk>vD6>pgjtpBq+pg zcLv4sa}{rFmTJM+%LcYfbD3Ru&AJJBNo%^|0OcC|Age+Cz%EriL5~i#Dex^~w98Y9 zBdUF#OXG6PsAIehE`LV}H4LKp#|P61MXSWin&>P(-8K6hPL?kdrVH@_)XKla%*sYc zGqicf?JM7vRVC+Mb;+D}{747P?+HZ>&lTvEL|`F9=E+91UAzJ}C}IM90_|>^=c0Mk zmYC@j9HsnB)dzT88AuQ7lfG{)dYcssgBRiCX1TxPGhxiR&#_exfD{brGS64Z4c_a^ zZkBN{?%4I3(g!2Xy4Cv+ciDvICeo{%;J^!Tvpgq3ZC|N&V`uqY*0Y-YOW(J2(7-Hc z{6#pWGs!~2^kjtS^zy8rgOudkljQS!#<13vXxDbQqCT53p|0Bi3{gwz5XCe z{WmWfDS0({6v~2GnUqI7%n@z7QKFY}x@TBTUcYmvdhT6~WZFj#&`(|6yZrhaeT!ZK zwby{56yMI1_h)o-`2Fc4k++wuhFpjX$jJ}+gQNHnaxgM70!8dUE(&j*2KY62T;^5| z*c+5V^uCyv0MT%q7-}`>;5+14b`FSMkyrZAoukGA23e^-Jj@6=3}O1%)Q%3vp}omH z%{Oyzf_^W=UL$v{>q{WcK{W(jvV)VtLxcFG?f*RV+_V+f-NEJ?3v*+tJmU9Lk`Iau zgn~ZA(YEq6%CM0>eRjRqpGLKPUT*9VE8Zoobm~?*9XYsRTWk7L->s~Jhmrlrixg3- zN-Ce>NLwM&Fe6zu(&WbO;D2~eg-9RPdKj2yJnc6o;2@fqFTLwPi_(jKQZlmg+nFVF zDnf{;_U?t%A`aS&YdIZAG|ct&3)8Kox^+j1``%kcr-3ec%CKUXRX%P$D)%IoW%t=i zrFJju3=yxDJeAP6k9R}UgT=5?{|hGw>Z<`OB znD{r~`;q(aiHZLhy8fj#{!`6xAfO7J)c>k*TgD3x&WeER;KDI7@kHJHH?`h>1eRU7 zA?on&X}$lbH~Y(fTkHMXY=8e;Jm+3(D&*E61t1=uYez@^ zTtaS8gcf4{1Ej#^+M8ETj3JrigF#xFEwsZQIWv)bG!@#%;isaq`0TsKBWE0|F%bM$ z>YKWw!x&<<=$AGl37SP-FL|<&e%aa(- z>NEjsRD0qKfd&#y+1>~-Ku9pe>R=wrL)+?a$oedfjF#^+*U;yuJyxG~iELqiH(5@v3d8YE(5HGrig`#e^-Q5+&c`nF=VT|LY8wZ%ff+_0mubThHb+HMMM zmjrn|s{#i9SU>g*kj+wkw^RvYYIi$m;=&&;lLYq$zmR7KA&0*E?q~ zCI{smZm!%Oh>+MOV$`f`&tjJ>Mfjx3i^xF8Fna}NR?!Bvch#pAv6prjPuw)Qy!J>=P8}u697jIhYLeqwr#I~y+xB5c1<1f^@@Tj_m$*4C6dkP zK)5C`o6ml|+`B&YW3up0_JkQX6O4P6Kp`J3cI`xG)SVTt2?D-pBQHukj&vn_a1lTW zXm>0ySi;mwLRfkd<%3%i#)ZF1vDFhmmS1(JNJ^L81W>5w zCF-%;Sfu+h{Y=$%7(s%;8aH9~%PeiLrk`ZA+wFZqs-BF7ynBp*bqa2f+}Q8Z%o~`I z6LV6&=y+% zW!Da{nmu2$&aep#pJ#v!lVsia!M&yKK}Z5TX-E4Fd0~)j{}{7PHTaH{9RKm|NE8;m zbEi-deD@JtS)(6A0?Gn77>aVbw}0jII#iAZTt9)20{7O-%w29$0#`S{*XNt}O6-A^ z!+JmH-F1uo8RGhrB%_Ek#9hZ?t!HqN6y;9O3PXkG6)V7OnQl`Tg-cjG)`tNN?Ds}> zqT#MphmFpHeOQunay~nF;jlYbx_jTwJy{!6R8+i#iQ`obu474l#R3EZ)sA6o-w`o2_+8BXBTZo>2rZo zZw8@p0P5I1qto*h#XJpy*WWGaK(DA42+d z2FHnSwAc!AQ!qY?4AKIw`p2*86?*V|+b()sK;fKioWs=?rIX3{pB&B@BqpzmTJHm_ zmmPkz%ky{u*e+g#${GO+3F^4#beNUVM)C&ak*>AF(MO!XR1~oJzdT8Ce1HU>U9ERH zAsk3SnCl+8$8_+b5+~^}322Eb6g3*4V*|UKpk;PRDbuFoEV2tk{}k^^DNCbXOk^&6#>S3i^?CW9x%6E>- zC{$V)(E!SU#53)nB_^*@&KE*Ih%10$J+RHKxMdt22EIFTXO8V!umIBtVM%8E)0S5X zxHwm6T7z`JkC@k`d4+`(HRZ~;kMuS({9^Hd1yG*4KwV-p*HZJR=PPtwK1AH&3#5|e z8c9$MJK1_WTpBQLEqnL)&&Kh*0&i~rAcrohgd^SyR+`QZBLOY>bLj+l?m$5j8Z88( ztDWER{J7tEsaj!`=luV^?U#iXwh_0KIsO|#CK=Zu9`jx^FH!g^fBoSA6T~Q;mP@j5 zg4^qF0zdHXbgf+GY#1g3OK_EfF;XbVsmWD*y^m?6KyBdc)b9@R(%k3m*@1Q}lrv?W zccf2%a6|``m+wBZDK}2blq)&b$=g!&fc?4s9w#6B6ydVWsNZbLWNT2DjI+xv=QN zd@sdEZhI3;Yg}=af0PzBewa3@X6k^!0ApP*5F5qWEyWxdMVGS-7A1LMLa@}AxaOf*fL1r@PUAU!0@{;J=B@s}$Dp*y!G-$Qa z;|)b4hg@EujaLkyMVVO7-I9X}CG*F^jm-dSsLr%jxsiaBfZZYw7;2wBlJL&#^tyFM#oTryIor^t8Ut6PdfeUTfx&-Shv4obS*vSuJvO8BVXnKGQl93(4D z`E1E^>_?(;GPd$W1C&6*2zKX!UtQ+4`(ei#nm4KD0-)rYa9BSPZ&Xo--4HIK6&I6+ zGA-ClG#-dw!BoxJD(O^U*6MjxBVPE*n_ze%enJVIF`_ID3NSHa`0h=1)Vk zNOeTCcgoe*ac|~?(D7Hx-2JQcLRIWP*IxY7c>F(BZh+=z|6}ClzoC%j?~xmb){h{! zu2_PHK;eKWN(S+#|A9J}zqk(qVlV&ETK}ic*Fl}emxuzbqrQ^s8T!CcBAG{R!tiK0cnF zNlQ=X;^LZ-4EFV{sjtUv&)qX*UF_X&`3{xh-bT0Dil6zG%B=8fXwf2oS)fB|A6^8N z`ZSSbU>F-X@%IIpBbs2%JJMgQDgk%uUfz9z1vW)oa_DJowwRB3_hBah@unHU>UUnzp73F@w-otmr9%v zH|RjSo2ZQ+)7swp?|P^QWKlV3=~&hyi`C}!eH=6Z!8>oIE|tE1>5E~SOO6(>m7+Pt z0dhVI6x{@i5@exPkAwYb@+_PH;@4vFX#fe%l+W7R+f81l@u)G7Mzm!i0Yla82b|tv ztybM-*-*0M0!{tz(#$?&HD=G6Y}|=@`!%6-cgKB81uYNz?)l^1?0PRoYyE_X#OO?=?gE=<5=dLajH>aMj)VXkSW1*k%ans9y z?MQ<;B1FpJ^b=U`SDPDpUq@ZQ;9lRhQ#+jsF&9AeIvJ>*v&2-*NUrRSxuqPB_+uLb zeAY?ut*wf3AR0ZJs{2I}t0&;K<5IsH=$!yI09yNTw#-t##trjcnWNPu$a2Jq;k&ow(+lx z{RQf&{>typ)g50qp%i8esbG|kU>=kusASs=%>1Q+d!3u)p4sAdH_N@z;6b zv1{r8qJ{BLnl)2AU+d=6Ay&WgL>D!6xf7&4>vsk?!B0V*2j}r} zNW$??=JvI13)W}1~dOI)F z(typX{-#Wera(WBlO%3bR8;9o@Bvg8rxzP|$P0aKD4&-`!xZjZ7hF*WqI-gE%17ha zbV)#$*Lmb$rH7CutE;P*9AIwj=?+ky>(h)RzJ}6Z@JODa;(kE2NlD~Acc3jpqXD?p z-UXv6hqb98oZhgk!O}jn<$I(uv-L~7E3|Zy?-W#Cn0$VBz~>8e!qCC^qaHcpI2M~X zLiVC56YoH#^ZlsZt@cRMp&L>*p#i%ppGRgblEAdDleMf917)Gwx|Snu%4egF!`)Q! zE-=@I#bk4adlYz&E~NQu!ij~B4?S*kWa6k%o%hf&KX~Y`0R-Xfyy7GK(wIBKFzxB? zFSXcAJL3LXutWn>DB`l(MWfNgKWh&LWIp=SgW4HP1f&}dm47rZyXV=cVG-OTEdxmg zS{pF&)MpB7bYeq`Pvzxc(M=56yRQcG^77KD$Rd-MPbf(_bhALJWlNSkVFPaMIgMKPiuqGO|F|Hn~c8-3ZyDrvyW zEI#75+$Y8h!J21<;ZQ!=9a9u;BESr|h2fA(vBmsZTU)Dk!9rECRt)W1Gc(zyY=iUl zn~k5E#<%4OpH6Px?SxIJ`Qf!5;CL|)$~AW@{)RG-6UTRNB&yHv_@xcZ_~Y95jxQP& z?r&i8L~3el-Pqf`ena*q5bzJ05f0FlT95qFj@-?Byp$E{U+xm2($9e#6HdJoVDjk5zt%KO6x!GBZ&ER|OmTF`lBY?Bn+c;5$fz1Z zHKU;Y137SiOZ;JAu&v<@ArgrHDp-x%LYyNRjtu;$;RemYHMr#e4)a!p_R^lenH6GpNxv#`JsAEf2NE@p=*HeLMGFl zvt=Z^w7_s-1IF0+mETjpz>O|P2K1NGFP)9jVXQ5EkQLFowgx3p>ozPGVmLswih@|p z<%yRYT%g-2jQMvRqd&C{*)Fz^2*ni$Qb65$dU_zw1#Rbp-KG1%@>L3A39e*up*Y&5M21k6b`L316CK}+x8}&L;Io13H$qZBj2Q-zdsak ztDF|B5J%p>k_}-HsDd=iBheE9#tSy7bekKyAJL+?nD`!@z8C_Z9H$r1qq;WES6a=L zG65v3eTcYymk}=rR7T%A5@wF@;6*@F^9zPhKDhRHs>|B-@Ein;0z9Pfqn2BgZ*gKuUI0t$NYgRicQ#9+uaDY zp-z|uwp-G2auA668)~?DGor2KD7)>Un}^5FTt@=r7E&Be{nq4qDFGK@rL`_k)OPW3 zZgmr9gMqekD6tWeeyM@X8cMrX^PEp2RMVrpb-7cp*4|>Vm_mmgPL#HKd;zq1g)N%& zq|q`GcV5pNK;S`+c-VtQ67gk7{K^KJNa#TlJdjAF^K^R4%tB9kh~_&cdPJMeauR0< z?iA{p@%Pc5(JH6IFdnt(lhmLYq0hVi_r|^-=Usc-eRL40h$lHTp5zP99avg{TR~Ns zJI_O>Hw_hcQu~o}74H|;*M*2ey(=D*H#4_!QE6#uvlbBUoPrMYS_2)nyI7^5qZ*PA zuNm_VhFAoj`CRdi$4;EmsT+?`m$yd7@`eAE#N8GjOzK&vBpS29P^RkfR41nrLXQe@ z8489AS$FB9p-uOzdmceE%u;uEjs@7t(S$4u_sCG**O~jN#zczfxC#|}?wP-aaNwVj z=p+(Enps;N(7ptRHWrdd;2@RnKBH?!5?x!m$_^B!UaW)scOhA12Tc1(=0&dzC+kTN zxU2a!GlS!6*l#c>^6-;DK~5pv_c5xW@e*-_&S!>=GXBp>rqxiy;CJvWo8ERq} z^&TS_mEOcp-7q4r8+C+=FikCv$JU92ee^wxCJkZlprhTZZOsq>e0(P7hQi4)g<@(l zMmCkyQkoMwBML#u*?f?h1z!^kT^gU8;C9d)@lWGBo^9afK11NI_S7PjQ&~L7)jVf= z<%Da^HAN2D4|yID>ef?rX~!ofAh@uXjwIBg(MaEW`}_M#f-p=K=IVjY&c)YKf0b;p z2Oz89X)6T#^3ho?A1JXRU54j2eOV2mHT#r%+x96)q_q<;R@ znDGY5|NWJifA?D}f3f+$|CN~kN+$Eas0IAjlg9qbL<(Rj^4X_+xK|BwctA}_^G>OP H<+J| Date: Mon, 3 Apr 2023 23:35:04 +0200 Subject: [PATCH 179/232] glTF2: Fix incorrect camera position --- code/AssetLib/glTF2/glTF2Importer.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index d30556806..fda89c2a7 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -1172,11 +1172,6 @@ aiNode *ImportNode(aiScene *pScene, glTF2::Asset &r, std::vector & if (node.camera) { pScene->mCameras[node.camera.GetIndex()]->mName = ainode->mName; - if (node.translation.isPresent) { - aiVector3D trans; - CopyValue(node.translation.value, trans); - pScene->mCameras[node.camera.GetIndex()]->mPosition = trans; - } } if (node.light) { From 9d76493ad846256ac3d6126c109380e332eb0066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Suhajda=20Tam=C3=A1s?= Date: Tue, 4 Apr 2023 00:06:09 +0200 Subject: [PATCH 180/232] Fix mLookAt with pretransformed vertices mLookAt is a position vector inside the nodes reference frame, not a direction vector, so translation should be applied to it. --- code/PostProcessing/PretransformVertices.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/PostProcessing/PretransformVertices.cpp b/code/PostProcessing/PretransformVertices.cpp index b6bb6155e..16548f09c 100644 --- a/code/PostProcessing/PretransformVertices.cpp +++ b/code/PostProcessing/PretransformVertices.cpp @@ -577,7 +577,7 @@ void PretransformVertices::Execute(aiScene *pScene) { // multiply all properties of the camera with the absolute // transformation of the corresponding node cam->mPosition = nd->mTransformation * cam->mPosition; - cam->mLookAt = aiMatrix3x3(nd->mTransformation) * cam->mLookAt; + cam->mLookAt = nd->mTransformation * cam->mLookAt; cam->mUp = aiMatrix3x3(nd->mTransformation) * cam->mUp; } From e6f26fc52e93979a999ebf3b1ed083cc9006e294 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 4 Apr 2023 12:54:26 +0200 Subject: [PATCH 181/232] Remove dead code. --- code/Common/ImporterRegistry.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/Common/ImporterRegistry.cpp b/code/Common/ImporterRegistry.cpp index ac4f5e544..c67fee936 100644 --- a/code/Common/ImporterRegistry.cpp +++ b/code/Common/ImporterRegistry.cpp @@ -382,9 +382,6 @@ void GetImporterInstanceList(std::vector &out) { #ifndef ASSIMP_BUILD_NO_IQM_IMPORTER out.push_back(new IQMImporter()); #endif - //#ifndef ASSIMP_BUILD_NO_STEP_IMPORTER - // out.push_back(new StepFile::StepFileImporter()); - //#endif } /** will delete all registered importers. */ From 23a3e8cf2d2670b1511f96927953a680a5346f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Suhajda=20Tam=C3=A1s?= Date: Tue, 4 Apr 2023 19:39:32 +0200 Subject: [PATCH 182/232] ConvertToLHProcess noew inverts viewing direction --- code/PostProcessing/ConvertToLHProcess.cpp | 13 +++++++++++++ code/PostProcessing/ConvertToLHProcess.h | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/code/PostProcessing/ConvertToLHProcess.cpp b/code/PostProcessing/ConvertToLHProcess.cpp index 08e3fe48a..0d5f3dc42 100644 --- a/code/PostProcessing/ConvertToLHProcess.cpp +++ b/code/PostProcessing/ConvertToLHProcess.cpp @@ -113,6 +113,12 @@ void MakeLeftHandedProcess::Execute(aiScene *pScene) { ProcessAnimation(nodeAnim); } } + + // process the cameras accordingly + for( unsigned int a = 0; a < pScene->mNumCameras; ++a) + { + ProcessCamera(pScene->mCameras[a]); + } ASSIMP_LOG_DEBUG("MakeLeftHandedProcess finished"); } @@ -231,6 +237,13 @@ void MakeLeftHandedProcess::ProcessAnimation(aiNodeAnim *pAnim) { } } +// ------------------------------------------------------------------------------------------------ +// Converts a single camera to left handed coordinates. +void MakeLeftHandedProcess::ProcessCamera( aiCamera* pCam) +{ + pCam->mLookAt = 2.0f * pCam->mPosition - pCam->mLookAt; +} + #endif // !! ASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS #ifndef ASSIMP_BUILD_NO_FLIPUVS_PROCESS // # FlipUVsProcess diff --git a/code/PostProcessing/ConvertToLHProcess.h b/code/PostProcessing/ConvertToLHProcess.h index d0532277d..ea001b95b 100644 --- a/code/PostProcessing/ConvertToLHProcess.h +++ b/code/PostProcessing/ConvertToLHProcess.h @@ -58,6 +58,7 @@ struct aiMesh; struct aiNodeAnim; struct aiNode; struct aiMaterial; +struct aiCamera; namespace Assimp { @@ -109,6 +110,14 @@ protected: * @param pAnim The bone animation to transform */ void ProcessAnimation( aiNodeAnim* pAnim); + + // ------------------------------------------------------------------- + /** Converts a single camera to left handed coordinates. + * The camera viewing direction is inverted by reflecting mLookAt + * across mPosition. + * @param pCam The camera to convert + */ + void ProcessCamera( aiCamera* pCam); }; From a87585668d61e69f1d5c09ef47bf0d656dc2dceb Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:45:05 +0800 Subject: [PATCH 183/232] Fix warning related to unreachable-code-return, disable warning. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/3DS/3DSLoader.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/AssetLib/3DS/3DSLoader.cpp b/code/AssetLib/3DS/3DSLoader.cpp index 769e8a6ee..aa29956df 100644 --- a/code/AssetLib/3DS/3DSLoader.cpp +++ b/code/AssetLib/3DS/3DSLoader.cpp @@ -266,8 +266,15 @@ void Discreet3DSImporter::ParseMainChunk() { }; ASSIMP_3DS_END_CHUNK(); +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code-return" +#endif // recursively continue processing this hierarchy level return ParseMainChunk(); +#if defined(__clang__) +#pragma clang diagnostic pop +#endif } // ------------------------------------------------------------------------------------------------ From 502bceb6e82b687d3b70b3f9ec2ba609aa0f1307 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:45:56 +0800 Subject: [PATCH 184/232] Fix warning related to unreachable-code-return, remove redundant return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/ASE/ASEParser.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/code/AssetLib/ASE/ASEParser.cpp b/code/AssetLib/ASE/ASEParser.cpp index 839d308de..8e7ca63d7 100644 --- a/code/AssetLib/ASE/ASEParser.cpp +++ b/code/AssetLib/ASE/ASEParser.cpp @@ -304,7 +304,6 @@ void Parser::Parse() { } AI_ASE_HANDLE_TOP_LEVEL_SECTION(); } - return; } // ------------------------------------------------------------------------------------------------ @@ -734,7 +733,6 @@ void Parser::ParseLV3MapBlock(Texture &map) { } AI_ASE_HANDLE_SECTION("3", "*MAP_XXXXXX"); } - return; } // ------------------------------------------------------------------------------------------------ @@ -859,7 +857,6 @@ void Parser::ParseLV1ObjectBlock(ASE::BaseNode &node) { } AI_ASE_HANDLE_TOP_LEVEL_SECTION(); } - return; } // ------------------------------------------------------------------------------------------------ @@ -883,7 +880,6 @@ void Parser::ParseLV2CameraSettingsBlock(ASE::Camera &camera) { } AI_ASE_HANDLE_SECTION("2", "CAMERA_SETTINGS"); } - return; } // ------------------------------------------------------------------------------------------------ @@ -1189,7 +1185,6 @@ void Parser::ParseLV2NodeTransformBlock(ASE::BaseNode &mesh) { } AI_ASE_HANDLE_SECTION("2", "*NODE_TM"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV2MeshBlock(ASE::Mesh &mesh) { @@ -1310,7 +1305,6 @@ void Parser::ParseLV2MeshBlock(ASE::Mesh &mesh) { } AI_ASE_HANDLE_SECTION("2", "*MESH"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshWeightsBlock(ASE::Mesh &mesh) { @@ -1344,7 +1338,6 @@ void Parser::ParseLV3MeshWeightsBlock(ASE::Mesh &mesh) { } AI_ASE_HANDLE_SECTION("3", "*MESH_WEIGHTS"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV4MeshBones(unsigned int iNumBones, ASE::Mesh &mesh) { @@ -1414,7 +1407,6 @@ void Parser::ParseLV4MeshBonesVertices(unsigned int iNumVertices, ASE::Mesh &mes } AI_ASE_HANDLE_SECTION("4", "*MESH_BONE_VERTEX"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshVertexListBlock( @@ -1443,7 +1435,6 @@ void Parser::ParseLV3MeshVertexListBlock( } AI_ASE_HANDLE_SECTION("3", "*MESH_VERTEX_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) { @@ -1470,7 +1461,6 @@ void Parser::ParseLV3MeshFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) } AI_ASE_HANDLE_SECTION("3", "*MESH_FACE_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshTListBlock(unsigned int iNumVertices, @@ -1503,7 +1493,6 @@ void Parser::ParseLV3MeshTListBlock(unsigned int iNumVertices, } AI_ASE_HANDLE_SECTION("3", "*MESH_TVERT_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshTFaceListBlock(unsigned int iNumFaces, @@ -1532,7 +1521,6 @@ void Parser::ParseLV3MeshTFaceListBlock(unsigned int iNumFaces, } AI_ASE_HANDLE_SECTION("3", "*MESH_TFACE_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MappingChannel(unsigned int iChannel, ASE::Mesh &mesh) { @@ -1567,7 +1555,6 @@ void Parser::ParseLV3MappingChannel(unsigned int iChannel, ASE::Mesh &mesh) { } AI_ASE_HANDLE_SECTION("3", "*MESH_MAPPING_CHANNEL"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshCListBlock(unsigned int iNumVertices, ASE::Mesh &mesh) { @@ -1595,7 +1582,6 @@ void Parser::ParseLV3MeshCListBlock(unsigned int iNumVertices, ASE::Mesh &mesh) } AI_ASE_HANDLE_SECTION("3", "*MESH_CVERTEX_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshCFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) { @@ -1623,7 +1609,6 @@ void Parser::ParseLV3MeshCFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) } AI_ASE_HANDLE_SECTION("3", "*MESH_CFACE_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshNormalListBlock(ASE::Mesh &sMesh) { @@ -1681,7 +1666,6 @@ void Parser::ParseLV3MeshNormalListBlock(ASE::Mesh &sMesh) { } AI_ASE_HANDLE_SECTION("3", "*MESH_NORMALS"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV4MeshFace(ASE::Face &out) { From 55c6eaee0c30594b2dd4be775f37d795e8819559 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:47:37 +0800 Subject: [PATCH 185/232] Fix warning related to unreachable-code-return, remove redundant return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index a8faaec34..7f5940838 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -128,7 +128,6 @@ bool OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char *name) } ThrowAttibuteError(xmlNode.name(), name, "Boolean value is expected to be 'true' or 'false', encountered '" + value + "'"); - return false; } // Mesh XML constants From a7cb3b4dbb3092a15f7c3bfaa4e340f6691557b7 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:48:12 +0800 Subject: [PATCH 186/232] Fix warning related to unreachable-code-return, remove redundant return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index 1bd981656..16268ead5 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -460,14 +460,12 @@ void OpenGEXImporter::handleMetricNode(DDLNode *node, aiScene * /*pScene*/) { void OpenGEXImporter::handleNameNode(DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No current node for name."); - return; } Value *val(node->getValue()); if (nullptr != val) { if (Value::ValueType::ddl_string != val->m_type) { throw DeadlyImportError("OpenGEX: invalid data type for value in node name."); - return; } const std::string name(val->getString()); @@ -508,7 +506,6 @@ static void getRefNames(DDLNode *node, std::vector &names) { void OpenGEXImporter::handleObjectRefNode(DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No parent node for name."); - return; } std::vector objRefNames; @@ -532,7 +529,6 @@ void OpenGEXImporter::handleObjectRefNode(DDLNode *node, aiScene * /*pScene*/) { void OpenGEXImporter::handleMaterialRefNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No parent node for name."); - return; } std::vector matRefNames; @@ -672,14 +668,12 @@ static void setMatrix(aiNode *node, DataArrayList *transformData) { void OpenGEXImporter::handleTransformNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No parent node for name."); - return; } DataArrayList *transformData(node->getDataArrayList()); if (nullptr != transformData) { if (transformData->m_numItems != 16) { throw DeadlyImportError("Invalid number of data for transform matrix."); - return; } setMatrix(m_currentNode, transformData); } @@ -835,7 +829,6 @@ static void copyColor4DArray(size_t numItems, DataArrayList *vaList, aiColor4D * void OpenGEXImporter::handleVertexArrayNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == node) { throw DeadlyImportError("No parent node for name."); - return; } Property *prop = node->getProperties(); @@ -876,12 +869,10 @@ void OpenGEXImporter::handleVertexArrayNode(ODDLParser::DDLNode *node, aiScene * void OpenGEXImporter::handleIndexArrayNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == node) { throw DeadlyImportError("No parent node for name."); - return; } if (nullptr == m_currentMesh) { throw DeadlyImportError("No current mesh for index data found."); - return; } DataArrayList *vaList = node->getDataArrayList(); From 116ceeca31cb5401aacd0af97828c4fe9b9f584f Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:49:35 +0800 Subject: [PATCH 187/232] Remove -Wno-unreachable-code-return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 6f74823df..05e31624a 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1247,7 +1247,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-format-nonliteral -Wno-comma -Wno-unreachable-code-break - -Wno-unreachable-code-return -Wno-implicit-fallthrough -Wno-unused-template -Wno-undefined-func-template From d4c21ba9a86dbba804ee8e972138ac04e545a203 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:43:28 +0800 Subject: [PATCH 188/232] Fix warning related to error=return-type. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /home/runner/work/assimp/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp: In member function ‘T Assimp::Ogre::OgreXmlSerializer::ReadAttribute(Assimp::XmlNode&, const char*) const [with T = bool]’: Error: /home/runner/work/assimp/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp:131:1: error: control reaches end of non-void function [-Werror=return-type] Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 7f5940838..8a1b88510 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -57,7 +57,7 @@ namespace Assimp { namespace Ogre { //AI_WONT_RETURN void ThrowAttibuteError(const XmlParser *reader, const std::string &name, const std::string &error = "") AI_WONT_RETURN_SUFFIX; - +AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::string &name, const std::string &error) AI_WONT_RETURN_SUFFIX; AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::string &name, const std::string &error) { if (!error.empty()) { throw DeadlyImportError(error, " in node '", nodeName, "' and attribute '", name, "'"); From 74509ef8bd271333c96abedf04e62895009ede5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Suhajda=20Tam=C3=A1s?= Date: Wed, 5 Apr 2023 12:19:39 +0200 Subject: [PATCH 189/232] Revert "FBXConverter : import FbxCamera correctly" This reverts commit cdfdd75a66e2323bd834f923798d3043ad3deaf8. --- code/AssetLib/FBX/FBXConverter.cpp | 30 +++++++++--------------------- code/AssetLib/FBX/FBXConverter.h | 9 +++------ 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index d742af447..257845384 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -152,7 +152,7 @@ void FBXConverter::ConvertRootNode() { mSceneOut->mRootNode->mName.Set(unique_name); // root has ID 0 - ConvertNodes(0L, mSceneOut->mRootNode, mSceneOut->mRootNode, aiMatrix4x4()); + ConvertNodes(0L, mSceneOut->mRootNode, mSceneOut->mRootNode); } static std::string getAncestorBaseName(const aiNode *node) { @@ -196,7 +196,7 @@ struct FBXConverter::PotentialNode { /// todo: get bone from stack /// todo: make map of aiBone* to aiNode* /// then update convert clusters to the new format -void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node, const aiMatrix4x4 &globalTransform) { +void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node) { const std::vector &conns = doc.GetConnectionsByDestinationSequenced(id, "Model"); std::vector nodes; @@ -290,15 +290,14 @@ void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node, } // recursion call - child nodes - aiMatrix4x4 newGlobalMatrix = globalTransform * nodes_chain.front().mNode->mTransformation; - ConvertNodes(model->ID(), last_parent, root_node, newGlobalMatrix); + ConvertNodes(model->ID(), last_parent, root_node); if (doc.Settings().readLights) { ConvertLights(*model, node_name); } if (doc.Settings().readCameras) { - ConvertCameras(*model, node_name, newGlobalMatrix); + ConvertCameras(*model, node_name); } nodes.push_back(std::move(nodes_chain.front())); @@ -328,14 +327,12 @@ void FBXConverter::ConvertLights(const Model &model, const std::string &orig_nam } } -void FBXConverter::ConvertCameras(const Model &model, - const std::string &orig_name, - const aiMatrix4x4 &transform) { +void FBXConverter::ConvertCameras(const Model &model, const std::string &orig_name) { const std::vector &node_attrs = model.GetAttributes(); for (const NodeAttribute *attr : node_attrs) { const Camera *const cam = dynamic_cast(attr); if (cam) { - ConvertCamera(*cam, orig_name, transform); + ConvertCamera(*cam, orig_name); } } } @@ -416,9 +413,7 @@ void FBXConverter::ConvertLight(const Light &light, const std::string &orig_name } } -void FBXConverter::ConvertCamera(const Camera &cam, - const std::string &orig_name, - aiMatrix4x4 transform) { +void FBXConverter::ConvertCamera(const Camera &cam, const std::string &orig_name) { cameras.push_back(new aiCamera()); aiCamera *const out_camera = cameras.back(); @@ -426,16 +421,9 @@ void FBXConverter::ConvertCamera(const Camera &cam, out_camera->mAspect = cam.AspectWidth() / cam.AspectHeight(); - aiVector3D pos = cam.Position(); - out_camera->mLookAt = cam.InterestPosition(); - out_camera->mUp = pos + cam.UpVector(); - transform.Inverse(); - pos *= transform; - out_camera->mLookAt *= transform; - out_camera->mUp *= transform; - out_camera->mLookAt -= pos; - out_camera->mUp -= pos; out_camera->mPosition = aiVector3D(0.0f); + out_camera->mLookAt = aiVector3D(1.0f, 0.0f, 0.0f); + out_camera->mUp = aiVector3D(0.0f, 1.0f, 0.0f); out_camera->mHorizontalFOV = AI_DEG_TO_RAD(cam.FieldOfView()); diff --git a/code/AssetLib/FBX/FBXConverter.h b/code/AssetLib/FBX/FBXConverter.h index b9b6c46b0..41acb6ffe 100644 --- a/code/AssetLib/FBX/FBXConverter.h +++ b/code/AssetLib/FBX/FBXConverter.h @@ -134,22 +134,19 @@ private: // ------------------------------------------------------------------------------------------------ // collect and assign child nodes - void ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node, - const aiMatrix4x4 &globalTransform); + void ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node); // ------------------------------------------------------------------------------------------------ void ConvertLights(const Model& model, const std::string &orig_name ); // ------------------------------------------------------------------------------------------------ - void ConvertCameras(const Model& model, const std::string &orig_name, - const aiMatrix4x4 &transform); + void ConvertCameras(const Model& model, const std::string &orig_name ); // ------------------------------------------------------------------------------------------------ void ConvertLight( const Light& light, const std::string &orig_name ); // ------------------------------------------------------------------------------------------------ - void ConvertCamera(const Camera& cam, const std::string &orig_name, - aiMatrix4x4 transform); + void ConvertCamera( const Camera& cam, const std::string &orig_name ); // ------------------------------------------------------------------------------------------------ void GetUniqueName( const std::string &name, std::string& uniqueName ); From 3dd08cdd6066b956496fa99f0a0ba3dea2214b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Suhajda=20Tam=C3=A1s?= Date: Wed, 5 Apr 2023 13:01:38 +0200 Subject: [PATCH 190/232] Added note --- code/AssetLib/FBX/FBXConverter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index 257845384..51ec79583 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -421,6 +421,8 @@ void FBXConverter::ConvertCamera(const Camera &cam, const std::string &orig_name out_camera->mAspect = cam.AspectWidth() / cam.AspectHeight(); + // NOTE: Camera mPosition, mLookAt and mUp must be set to default here. + // All transformations to the camera will be handled by its node in the scenegraph. out_camera->mPosition = aiVector3D(0.0f); out_camera->mLookAt = aiVector3D(1.0f, 0.0f, 0.0f); out_camera->mUp = aiVector3D(0.0f, 1.0f, 0.0f); From 8bc64ec1475e5e9fd9a3b80236727a1ee80f2fa1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 15 Apr 2023 11:53:19 +0200 Subject: [PATCH 191/232] Delete License.txt - closes https://github.com/assimp/assimp/issues/4957 --- test/models/glTF2/textureTransform/License.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/models/glTF2/textureTransform/License.txt diff --git a/test/models/glTF2/textureTransform/License.txt b/test/models/glTF2/textureTransform/License.txt deleted file mode 100644 index e69de29bb..000000000 From 5d841ec9a5889f910fe0ed906056616babefe6cf Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 16 Apr 2023 18:20:14 +0200 Subject: [PATCH 192/232] Refactoring: Cleanup post-processing steps. --- code/AssetLib/3DS/3DSHelper.h | 4 -- code/AssetLib/X3D/X3DExporter.hpp | 2 - code/Geometry/GeometryUtils.cpp | 13 ++++ code/Geometry/GeometryUtils.h | 2 + code/PostProcessing/ArmaturePopulate.cpp | 27 +++------ code/PostProcessing/ArmaturePopulate.h | 8 +-- .../ComputeUVMappingProcess.cpp | 37 ++++-------- code/PostProcessing/ConvertToLHProcess.cpp | 9 --- code/PostProcessing/DeboneProcess.cpp | 12 ++-- code/PostProcessing/FindDegenerates.cpp | 3 +- code/PostProcessing/RemoveVCProcess.cpp | 59 ------------------- code/PostProcessing/ScaleProcess.cpp | 8 +-- code/PostProcessing/SortByPTypeProcess.cpp | 21 +++---- .../SplitByBoneCountProcess.cpp | 18 +++--- code/PostProcessing/SplitByBoneCountProcess.h | 13 +++- include/assimp/Vertex.h | 2 +- 16 files changed, 75 insertions(+), 163 deletions(-) diff --git a/code/AssetLib/3DS/3DSHelper.h b/code/AssetLib/3DS/3DSHelper.h index 06c36bfeb..2279d105c 100644 --- a/code/AssetLib/3DS/3DSHelper.h +++ b/code/AssetLib/3DS/3DSHelper.h @@ -397,10 +397,6 @@ struct Material { Material(const Material &other) = default; - Material(Material &&other) AI_NO_EXCEPT = default; - - Material &operator=(Material &&other) AI_NO_EXCEPT = default; - virtual ~Material() = default; //! Name of the material diff --git a/code/AssetLib/X3D/X3DExporter.hpp b/code/AssetLib/X3D/X3DExporter.hpp index e77aa6877..babf552dd 100644 --- a/code/AssetLib/X3D/X3DExporter.hpp +++ b/code/AssetLib/X3D/X3DExporter.hpp @@ -58,8 +58,6 @@ class X3DExporter { Value(value) { // empty } - - SAttribute(SAttribute &&rhs) AI_NO_EXCEPT = default; }; /***********************************************/ diff --git a/code/Geometry/GeometryUtils.cpp b/code/Geometry/GeometryUtils.cpp index ab735aa6e..92a3aa853 100644 --- a/code/Geometry/GeometryUtils.cpp +++ b/code/Geometry/GeometryUtils.cpp @@ -76,4 +76,17 @@ ai_real GeometryUtils::calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh return area; } +// ------------------------------------------------------------------------------------------------ +// Check whether a ray intersects a plane and find the intersection point +bool GeometryUtils::PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, + const aiVector3D& planeNormal, aiVector3D& pos) { + const ai_real b = planeNormal * (planePos - ray.pos); + ai_real h = ray.dir * planeNormal; + if ((h < 10e-5 && h > -10e-5) || (h = b/h) < 0) + return false; + + pos = ray.pos + (ray.dir * h); + return true; +} + } // namespace Assimp diff --git a/code/Geometry/GeometryUtils.h b/code/Geometry/GeometryUtils.h index ab49380de..bd2038f78 100644 --- a/code/Geometry/GeometryUtils.h +++ b/code/Geometry/GeometryUtils.h @@ -62,6 +62,8 @@ public: /// @param mesh The mesh containing the face /// @return The area. static ai_real calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh ); + + static bool PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, const aiVector3D& planeNormal, aiVector3D& pos); }; } // namespace Assimp diff --git a/code/PostProcessing/ArmaturePopulate.cpp b/code/PostProcessing/ArmaturePopulate.cpp index a05cd91e9..a29735205 100644 --- a/code/PostProcessing/ArmaturePopulate.cpp +++ b/code/PostProcessing/ArmaturePopulate.cpp @@ -47,11 +47,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { -/// The default class constructor. -ArmaturePopulate::ArmaturePopulate() = default; +static bool IsBoneNode(const aiString &bone_name, std::vector &bones) { + for (aiBone *bone : bones) { + if (bone->mName == bone_name) { + return true; + } + } -/// The class destructor. -ArmaturePopulate::~ArmaturePopulate() = default; + return false; +} bool ArmaturePopulate::IsActive(unsigned int pFlags) const { return (pFlags & aiProcess_PopulateArmatureData) != 0; @@ -78,9 +82,8 @@ void ArmaturePopulate::Execute(aiScene *out) { aiBone *bone = kvp.first; aiNode *bone_node = kvp.second; ASSIMP_LOG_VERBOSE_DEBUG("active node lookup: ", bone->mName.C_Str()); + // lcl transform grab - done in generate_nodes :) - - // bone->mOffsetMatrix = bone_node->mTransformation; aiNode *armature = GetArmatureRoot(bone_node, bones); ai_assert(armature); @@ -212,18 +215,6 @@ aiNode *ArmaturePopulate::GetArmatureRoot(aiNode *bone_node, return nullptr; } -// Simple IsBoneNode check if this could be a bone -bool ArmaturePopulate::IsBoneNode(const aiString &bone_name, - std::vector &bones) { - for (aiBone *bone : bones) { - if (bone->mName == bone_name) { - return true; - } - } - - return false; -} - // Pop this node by name from the stack if found // Used in multiple armature situations with duplicate node / bone names // Known flaw: cannot have nodes with bone names, will be fixed in later release diff --git a/code/PostProcessing/ArmaturePopulate.h b/code/PostProcessing/ArmaturePopulate.h index 530932f48..83cbf8cf7 100644 --- a/code/PostProcessing/ArmaturePopulate.h +++ b/code/PostProcessing/ArmaturePopulate.h @@ -69,10 +69,10 @@ namespace Assimp { class ASSIMP_API ArmaturePopulate : public BaseProcess { public: /// The default class constructor. - ArmaturePopulate(); + ArmaturePopulate() = default; /// The class destructor. - virtual ~ArmaturePopulate(); + virtual ~ArmaturePopulate() = default; /// Overwritten, @see BaseProcess virtual bool IsActive( unsigned int pFlags ) const; @@ -86,9 +86,6 @@ public: static aiNode *GetArmatureRoot(aiNode *bone_node, std::vector &bone_list); - static bool IsBoneNode(const aiString &bone_name, - std::vector &bones); - static aiNode *GetNodeFromStack(const aiString &node_name, std::vector &nodes); @@ -108,5 +105,4 @@ public: } // Namespace Assimp - #endif // SCALE_PROCESS_H_ diff --git a/code/PostProcessing/ComputeUVMappingProcess.cpp b/code/PostProcessing/ComputeUVMappingProcess.cpp index a5472668b..e81f63d42 100644 --- a/code/PostProcessing/ComputeUVMappingProcess.cpp +++ b/code/PostProcessing/ComputeUVMappingProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -42,10 +41,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file GenUVCoords step */ - #include "ComputeUVMappingProcess.h" #include "ProcessHelper.h" #include +#include "Geometry/GeometryUtils.h" using namespace Assimp; @@ -59,31 +58,17 @@ namespace { // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool ComputeUVMappingProcess::IsActive( unsigned int pFlags) const -{ +bool ComputeUVMappingProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_GenUVCoords) != 0; } -// ------------------------------------------------------------------------------------------------ -// Check whether a ray intersects a plane and find the intersection point -inline bool PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, - const aiVector3D& planeNormal, aiVector3D& pos) -{ - const ai_real b = planeNormal * (planePos - ray.pos); - ai_real h = ray.dir * planeNormal; - if ((h < 10e-5 && h > -10e-5) || (h = b/h) < 0) - return false; - - pos = ray.pos + (ray.dir * h); - return true; -} - // ------------------------------------------------------------------------------------------------ // Find the first empty UV channel in a mesh -inline unsigned int FindEmptyUVChannel (aiMesh* mesh) -{ +inline unsigned int FindEmptyUVChannel (aiMesh* mesh) { for (unsigned int m = 0; m < AI_MAX_NUMBER_OF_TEXTURECOORDS;++m) - if (!mesh->mTextureCoords[m])return m; + if (!mesh->mTextureCoords[m]) { + return m; + } ASSIMP_LOG_ERROR("Unable to compute UV coordinates, no free UV slot found"); return UINT_MAX; @@ -91,8 +76,7 @@ inline unsigned int FindEmptyUVChannel (aiMesh* mesh) // ------------------------------------------------------------------------------------------------ // Try to remove UV seams -void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) -{ +void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { // TODO: just a very rough algorithm. I think it could be done // much easier, but I don't know how and am currently too tired to // to think about a better solution. @@ -103,10 +87,11 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) const static ai_real LOWER_EPSILON = ai_real( 10e-3 ); const static ai_real UPPER_EPSILON = ai_real( 1.0-10e-3 ); - for (unsigned int fidx = 0; fidx < mesh->mNumFaces;++fidx) - { + for (unsigned int fidx = 0; fidx < mesh->mNumFaces;++fidx) { const aiFace& face = mesh->mFaces[fidx]; - if (face.mNumIndices < 3) continue; // triangles and polygons only, please + if (face.mNumIndices < 3) { + continue; // triangles and polygons only, please + } unsigned int smallV = face.mNumIndices, large = smallV; bool zero = false, one = false, round_to_zero = false; diff --git a/code/PostProcessing/ConvertToLHProcess.cpp b/code/PostProcessing/ConvertToLHProcess.cpp index 08e3fe48a..e67bf030f 100644 --- a/code/PostProcessing/ConvertToLHProcess.cpp +++ b/code/PostProcessing/ConvertToLHProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -219,13 +217,6 @@ void MakeLeftHandedProcess::ProcessAnimation(aiNodeAnim *pAnim) { // rotation keys for (unsigned int a = 0; a < pAnim->mNumRotationKeys; a++) { - /* That's the safe version, but the float errors add up. So we try the short version instead - aiMatrix3x3 rotmat = pAnim->mRotationKeys[a].mValue.GetMatrix(); - rotmat.a3 = -rotmat.a3; rotmat.b3 = -rotmat.b3; - rotmat.c1 = -rotmat.c1; rotmat.c2 = -rotmat.c2; - aiQuaternion rotquat( rotmat); - pAnim->mRotationKeys[a].mValue = rotquat; - */ pAnim->mRotationKeys[a].mValue.x *= -1.0f; pAnim->mRotationKeys[a].mValue.y *= -1.0f; } diff --git a/code/PostProcessing/DeboneProcess.cpp b/code/PostProcessing/DeboneProcess.cpp index 2a8499dc5..e91196ce2 100644 --- a/code/PostProcessing/DeboneProcess.cpp +++ b/code/PostProcessing/DeboneProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -87,7 +86,7 @@ void DeboneProcess::Execute( aiScene* pScene) { if(!!mNumBonesCanDoWithout && (!mAllOrNone||mNumBonesCanDoWithout==mNumBones)) { for(unsigned int a = 0; a < pScene->mNumMeshes; a++) { if(splitList[a]) { - numSplits++; + ++numSplits; } } } @@ -119,8 +118,8 @@ void DeboneProcess::Execute( aiScene* pScene) { aiNode *theNode = find ? pScene->mRootNode->FindNode(*find) : nullptr; std::pair push_pair(static_cast(meshes.size()),theNode); - mSubMeshIndices[a].push_back(push_pair); - meshes.push_back(newMeshes[b].first); + mSubMeshIndices[a].emplace_back(push_pair); + meshes.emplace_back(newMeshes[b].first); out+=newMeshes[b].first->mNumBones; } @@ -360,9 +359,7 @@ void DeboneProcess::UpdateNode(aiNode* pNode) const { unsigned int m = static_cast(pNode->mNumMeshes), n = static_cast(mSubMeshIndices.size()); // first pass, look for meshes which have not moved - for(unsigned int a=0;amMeshes[a]; const std::vector< std::pair< unsigned int,aiNode* > > &subMeshes = mSubMeshIndices[srcIndex]; unsigned int nSubmeshes = static_cast(subMeshes.size()); @@ -376,8 +373,7 @@ void DeboneProcess::UpdateNode(aiNode* pNode) const { // second pass, collect deboned meshes - for(unsigned int a=0;a > &subMeshes = mSubMeshIndices[a]; unsigned int nSubmeshes = static_cast(subMeshes.size()); diff --git a/code/PostProcessing/FindDegenerates.cpp b/code/PostProcessing/FindDegenerates.cpp index 5874c17d2..87ee75601 100644 --- a/code/PostProcessing/FindDegenerates.cpp +++ b/code/PostProcessing/FindDegenerates.cpp @@ -236,8 +236,7 @@ evil_jump_outside: face_src.mNumIndices = 0; face_src.mIndices = nullptr; } - } - else { + } else { // Otherwise delete it if we don't need this face delete[] face_src.mIndices; face_src.mIndices = nullptr; diff --git a/code/PostProcessing/RemoveVCProcess.cpp b/code/PostProcessing/RemoveVCProcess.cpp index 35047dc0a..bcad65423 100644 --- a/code/PostProcessing/RemoveVCProcess.cpp +++ b/code/PostProcessing/RemoveVCProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -74,63 +72,6 @@ inline void ArrayDelete(T **&in, unsigned int &num) { num = 0; } -#if 0 -// ------------------------------------------------------------------------------------------------ -// Updates the node graph - removes all nodes which have the "remove" flag set and the -// "don't remove" flag not set. Nodes with meshes are never deleted. -bool UpdateNodeGraph(aiNode* node,std::list& childsOfParent,bool root) -{ - bool b = false; - - std::list mine; - for (unsigned int i = 0; i < node->mNumChildren;++i) - { - if(UpdateNodeGraph(node->mChildren[i],mine,false)) - b = true; - } - - // somewhat tricky ... mNumMeshes must be originally 0 and MSB2 may not be set, - // so we can do a simple comparison against MSB here - if (!root && AI_RC_UINT_MSB == node->mNumMeshes ) - { - // this node needs to be removed - if(node->mNumChildren) - { - childsOfParent.insert(childsOfParent.end(),mine.begin(),mine.end()); - - // set all children to nullptr to make sure they are not deleted when we delete ourself - for (unsigned int i = 0; i < node->mNumChildren;++i) - node->mChildren[i] = nullptr; - } - b = true; - delete node; - } - else - { - AI_RC_UNMASK(node->mNumMeshes); - childsOfParent.push_back(node); - - if (b) - { - // reallocate the array of our children here - node->mNumChildren = (unsigned int)mine.size(); - aiNode** const children = new aiNode*[mine.size()]; - aiNode** ptr = children; - - for (std::list::iterator it = mine.begin(), end = mine.end(); - it != end; ++it) - { - *ptr++ = *it; - } - delete[] node->mChildren; - node->mChildren = children; - return false; - } - } - return b; -} -#endif - // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. void RemoveVCProcess::Execute(aiScene *pScene) { diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 665f28a7e..00df07090 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -86,9 +86,9 @@ void ScaleProcess::Execute( aiScene* pScene ) { return; // nothing to scale } - ai_assert( mScale != 0 ); - ai_assert( nullptr != pScene ); - ai_assert( nullptr != pScene->mRootNode ); + ai_assert(mScale != 0 ); + ai_assert(nullptr != pScene ); + ai_assert(nullptr != pScene->mRootNode ); if ( nullptr == pScene ) { return; @@ -140,7 +140,7 @@ void ScaleProcess::Execute( aiScene* pScene ) { aiMatrix4x4 scaling; aiMatrix4x4::Scaling( aiVector3D(scale), scaling ); - aiMatrix4x4 RotMatrix = aiMatrix4x4 (rotation.GetMatrix()); + const aiMatrix4x4 RotMatrix = aiMatrix4x4(rotation.GetMatrix()); bone->mOffsetMatrix = translation * RotMatrix * scaling; } diff --git a/code/PostProcessing/SortByPTypeProcess.cpp b/code/PostProcessing/SortByPTypeProcess.cpp index 1be75fc48..394ef15c8 100644 --- a/code/PostProcessing/SortByPTypeProcess.cpp +++ b/code/PostProcessing/SortByPTypeProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -54,10 +52,7 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -SortByPTypeProcess::SortByPTypeProcess() : - mConfigRemoveMeshes(0) { - // empty -} +SortByPTypeProcess::SortByPTypeProcess() : mConfigRemoveMeshes(0) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. @@ -155,7 +150,7 @@ void SortByPTypeProcess::Execute(aiScene *pScene) { if (1 == num) { if (!(mConfigRemoveMeshes & mesh->mPrimitiveTypes)) { *meshIdx = static_cast(outMeshes.size()); - outMeshes.push_back(mesh); + outMeshes.emplace_back(mesh); } else { delete mesh; pScene->mMeshes[i] = nullptr; @@ -311,21 +306,23 @@ void SortByPTypeProcess::Execute(aiScene *pScene) { if (vert) { *vert++ = mesh->mVertices[idx]; - //mesh->mVertices[idx].x = get_qnan(); } - if (nor) *nor++ = mesh->mNormals[idx]; + if (nor) + *nor++ = mesh->mNormals[idx]; if (tan) { *tan++ = mesh->mTangents[idx]; *bit++ = mesh->mBitangents[idx]; } for (unsigned int pp = 0; pp < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++pp) { - if (!uv[pp]) break; + if (!uv[pp]) + break; *uv[pp]++ = mesh->mTextureCoords[pp][idx]; } for (unsigned int pp = 0; pp < AI_MAX_NUMBER_OF_COLOR_SETS; ++pp) { - if (!cols[pp]) break; + if (!cols[pp]) + break; *cols[pp]++ = mesh->mColors[pp][idx]; } @@ -351,7 +348,7 @@ void SortByPTypeProcess::Execute(aiScene *pScene) { } } if (pp == mesh->mNumAnimMeshes) - amIdx++; + ++amIdx; in.mIndices[q] = outIdx++; } diff --git a/code/PostProcessing/SplitByBoneCountProcess.cpp b/code/PostProcessing/SplitByBoneCountProcess.cpp index 5324160d4..e44a55979 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.cpp +++ b/code/PostProcessing/SplitByBoneCountProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -166,7 +165,7 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector isBoneUsed( pMesh->mNumBones, false); // indices of the faces which are going to go into this submesh - std::vector subMeshFaces; + IndexArray subMeshFaces; subMeshFaces.reserve( pMesh->mNumFaces); // accumulated vertex count of all the faces in this submesh unsigned int numSubMeshVertices = 0; @@ -202,7 +201,7 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector::iterator it = newBonesAtCurrentFace.begin(); it != newBonesAtCurrentFace.end(); ++it) { if (!isBoneUsed[*it]) { isBoneUsed[*it] = true; - numBones++; + ++numBones; } } @@ -212,18 +211,17 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormName.length > 0 ) - { + if( pMesh->mName.length > 0 ) { newMesh->mName.Set( format() << pMesh->mName.data << "_sub" << poNewMeshes.size()); } newMesh->mMaterialIndex = pMesh->mMaterialIndex; newMesh->mPrimitiveTypes = pMesh->mPrimitiveTypes; - poNewMeshes.push_back( newMesh); + poNewMeshes.emplace_back( newMesh); // create all the arrays for this mesh if the old mesh contained them newMesh->mNumVertices = numSubMeshVertices; @@ -251,7 +249,7 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormFaces = new aiFace[subMeshFaces.size()]; unsigned int nvi = 0; // next vertex index - std::vector previousVertexIndices( numSubMeshVertices, std::numeric_limits::max()); // per new vertex: its index in the source mesh + IndexArray previousVertexIndices( numSubMeshVertices, std::numeric_limits::max()); // per new vertex: its index in the source mesh for( unsigned int a = 0; a < subMeshFaces.size(); ++a ) { const aiFace& srcFace = pMesh->mFaces[subMeshFaces[a]]; aiFace& dstFace = newMesh->mFaces[a]; @@ -399,10 +397,10 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormNumMeshes == 0 ) { - std::vector newMeshList; + IndexArray newMeshList; for( unsigned int a = 0; a < pNode->mNumMeshes; ++a) { unsigned int srcIndex = pNode->mMeshes[a]; - const std::vector& replaceMeshes = mSubMeshIndices[srcIndex]; + const IndexArray& replaceMeshes = mSubMeshIndices[srcIndex]; newMeshList.insert( newMeshList.end(), replaceMeshes.begin(), replaceMeshes.end()); } diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index 625019e0c..efe85824f 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -76,6 +76,10 @@ public: /// basing on the Importer's configuration property list. virtual void SetupProperties(const Importer* pImp) override; + /// @brief Will return the maximal number of bones. + /// @return The maximal number of bones. + size_t getMaxNumberOfBones() const; + protected: /// Executes the post processing step on the given imported data. /// At the moment a process is not supposed to fail. @@ -90,14 +94,19 @@ protected: /// Recursively updates the node's mesh list to account for the changed mesh list void UpdateNode( aiNode* pNode) const; -public: +private: /// Max bone count. Splitting occurs if a mesh has more than that number of bones. size_t mMaxBoneCount; /// Per mesh index: Array of indices of the new submeshes. - std::vector< std::vector > mSubMeshIndices; + using IndexArray = std::vector; + std::vector mSubMeshIndices; }; +inline size_t SplitByBoneCountProcess::getMaxNumberOfBones() const { + return mMaxBoneCount; +} + } // end of namespace Assimp #endif // !!AI_SPLITBYBONECOUNTPROCESS_H_INC diff --git a/include/assimp/Vertex.h b/include/assimp/Vertex.h index fd7eb037e..b4aa1dd2d 100644 --- a/include/assimp/Vertex.h +++ b/include/assimp/Vertex.h @@ -105,7 +105,7 @@ class Vertex { friend Vertex operator * (ai_real, const Vertex&); public: - Vertex() {} + Vertex() = default; // ---------------------------------------------------------------------------- /** Extract a particular vertex from a mesh and interleave all components */ From aee4df9be8c403d2d361b28a3fc5f10bef2e445d Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 17 Apr 2023 15:40:29 +0200 Subject: [PATCH 193/232] Fix possible dereferencing of invalid pointer. - closes https://github.com/assimp/assimp/issues/4918 --- code/AssetLib/Obj/ObjFileImporter.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index 189757815..cf4515794 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2020, assimp team +Copyright (c) 2006-2023, assimp team All rights reserved. @@ -84,7 +84,6 @@ ObjFileImporter::ObjFileImporter() : // Destructor. ObjFileImporter::~ObjFileImporter() { delete m_pRootObject; - m_pRootObject = nullptr; } // ------------------------------------------------------------------------------------------------ @@ -270,7 +269,7 @@ aiNode *ObjFileImporter::createNodes(const ObjFile::Model *pModel, const ObjFile for (size_t i = 0; i < pObject->m_Meshes.size(); ++i) { unsigned int meshId = pObject->m_Meshes[i]; aiMesh *pMesh = createTopology(pModel, pObject, meshId); - if (pMesh) { + if (pMesh != nullptr) { if (pMesh->mNumFaces > 0) { MeshArray.push_back(pMesh); } else { @@ -324,14 +323,13 @@ aiMesh *ObjFileImporter::createTopology(const ObjFile::Model *pModel, const ObjF return nullptr; } - std::unique_ptr pMesh(new aiMesh); + aiMesh *pMesh = new aiMesh; if (!pObjMesh->m_name.empty()) { pMesh->mName.Set(pObjMesh->m_name); } for (size_t index = 0; index < pObjMesh->m_Faces.size(); index++) { const ObjFile::Face *inp = pObjMesh->m_Faces[index]; - //ai_assert(nullptr != inp); if (inp->mPrimitiveType == aiPrimitiveType_LINE) { pMesh->mNumFaces += static_cast(inp->m_vertices.size() - 1); @@ -387,9 +385,9 @@ aiMesh *ObjFileImporter::createTopology(const ObjFile::Model *pModel, const ObjF } // Create mesh vertices - createVertexArray(pModel, pData, meshIndex, pMesh.get(), uiIdxCount); + createVertexArray(pModel, pData, meshIndex, pMesh, uiIdxCount); - return pMesh.release(); + return pMesh; } // ------------------------------------------------------------------------------------------------ From ca937788ee10ed86646fd04e53f1111f65abea95 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 17 Apr 2023 20:08:58 +0200 Subject: [PATCH 194/232] Fix: Fix leak in Scope class, FBX - closes https://github.com/assimp/assimp/issues/3421 --- code/AssetLib/FBX/FBXParser.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index d71321452..a8e766873 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -188,15 +188,19 @@ Scope::Scope(Parser& parser,bool topLevel) ParseError("unexpected content: empty string."); } - elements.insert(ElementMap::value_type(str,new_Element(*n,parser))); - + auto *element = new_Element(*n, parser); + // Element() should stop at the next Key token (or right after a Close token) n = parser.CurrentToken(); if (n == nullptr) { if (topLevel) { + elements.insert(ElementMap::value_type(str, element)); return; } ParseError("unexpected end of file",parser.LastToken()); + delete element; + } else { + elements.insert(ElementMap::value_type(str, element)); } } } From d51f033e203762fa4239eb8c47180dd5e2da262f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 17 Apr 2023 21:30:47 +0200 Subject: [PATCH 195/232] Fix: Avoid integer overflow in inversion op - closes https://github.com/assimp/assimp/issues/3424 --- include/assimp/fast_atof.h | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/include/assimp/fast_atof.h b/include/assimp/fast_atof.h index 43bbbff64..61c053bc0 100644 --- a/include/assimp/fast_atof.h +++ b/include/assimp/fast_atof.h @@ -39,7 +39,7 @@ namespace Assimp { -const double fast_atof_table[16] = { // we write [16] here instead of [] to work around a swig bug +constexpr double fast_atof_table[16] = { // we write [16] here instead of [] to work around a swig bug 0.0, 0.1, 0.01, @@ -58,12 +58,10 @@ const double fast_atof_table[16] = { // we write [16] here instead of [] to wo 0.000000000000001 }; - // ------------------------------------------------------------------------------------ // Convert a string in decimal format to a number // ------------------------------------------------------------------------------------ -inline -unsigned int strtoul10( const char* in, const char** out=0) { +inline unsigned int strtoul10( const char* in, const char** out=0) { unsigned int value = 0; for ( ;; ) { @@ -83,8 +81,7 @@ unsigned int strtoul10( const char* in, const char** out=0) { // ------------------------------------------------------------------------------------ // Convert a string in octal format to a number // ------------------------------------------------------------------------------------ -inline -unsigned int strtoul8( const char* in, const char** out=0) { +inline unsigned int strtoul8( const char* in, const char** out=0) { unsigned int value( 0 ); for ( ;; ) { if ( *in < '0' || *in > '7' ) { @@ -103,8 +100,7 @@ unsigned int strtoul8( const char* in, const char** out=0) { // ------------------------------------------------------------------------------------ // Convert a string in hex format to a number // ------------------------------------------------------------------------------------ -inline -unsigned int strtoul16( const char* in, const char** out=0) { +inline unsigned int strtoul16( const char* in, const char** out=0) { unsigned int value( 0 ); for ( ;; ) { if ( *in >= '0' && *in <= '9' ) { @@ -128,8 +124,7 @@ unsigned int strtoul16( const char* in, const char** out=0) { // Convert just one hex digit // Return value is UINT_MAX if the input character is not a hex digit. // ------------------------------------------------------------------------------------ -inline -unsigned int HexDigitToDecimal(char in) { +inline unsigned int HexDigitToDecimal(char in) { unsigned int out( UINT_MAX ); if ( in >= '0' && in <= '9' ) { out = in - '0'; @@ -146,16 +141,14 @@ unsigned int HexDigitToDecimal(char in) { // ------------------------------------------------------------------------------------ // Convert a hex-encoded octet (2 characters, i.e. df or 1a). // ------------------------------------------------------------------------------------ -inline -uint8_t HexOctetToDecimal(const char* in) { +inline uint8_t HexOctetToDecimal(const char* in) { return ((uint8_t)HexDigitToDecimal(in[0])<<4)+(uint8_t)HexDigitToDecimal(in[1]); } // ------------------------------------------------------------------------------------ // signed variant of strtoul10 // ------------------------------------------------------------------------------------ -inline -int strtol10( const char* in, const char** out=0) { +inline int strtol10( const char* in, const char** out=0) { bool inv = (*in=='-'); if ( inv || *in == '+' ) { ++in; @@ -163,7 +156,11 @@ int strtol10( const char* in, const char** out=0) { int value = strtoul10(in,out); if (inv) { - value = -value; + if (value < INT_MAX) { + value = -value; + } else { + ASSIMP_LOG_WARN( "Converting the string \"", in, "\" into an inverted value resulted in overflow." ); + } } return value; } @@ -174,8 +171,7 @@ int strtol10( const char* in, const char** out=0) { // 0NNN - oct // NNN - dec // ------------------------------------------------------------------------------------ -inline -unsigned int strtoul_cppstyle( const char* in, const char** out=0) { +inline unsigned int strtoul_cppstyle( const char* in, const char** out=0) { if ('0' == in[0]) { return 'x' == in[1] ? strtoul16(in+2,out) : strtoul8(in+1,out); } @@ -187,8 +183,7 @@ unsigned int strtoul_cppstyle( const char* in, const char** out=0) { // It is mainly used by fast_atof to prevent ugly and unwanted integer overflows. // ------------------------------------------------------------------------------------ template -inline -uint64_t strtoul10_64( const char* in, const char** out=0, unsigned int* max_inout=0) { +inline uint64_t strtoul10_64( const char* in, const char** out=0, unsigned int* max_inout=0) { unsigned int cur = 0; uint64_t value = 0; From fd59a2209beaa60f380a1e1250b66e9045e1a2bd Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 17 Apr 2023 22:07:49 +0200 Subject: [PATCH 196/232] Update fast_atof.h --- include/assimp/fast_atof.h | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/include/assimp/fast_atof.h b/include/assimp/fast_atof.h index 61c053bc0..f2d179d60 100644 --- a/include/assimp/fast_atof.h +++ b/include/assimp/fast_atof.h @@ -39,7 +39,9 @@ namespace Assimp { -constexpr double fast_atof_table[16] = { // we write [16] here instead of [] to work around a swig bug +static constexpr size_t NumItems = 16; + +constexpr double fast_atof_table[NumItems] = { // we write [16] here instead of [] to work around a swig bug 0.0, 0.1, 0.01, @@ -236,8 +238,7 @@ inline uint64_t strtoul10_64( const char* in, const char** out=0, unsigned int* // signed variant of strtoul10_64 // ------------------------------------------------------------------------------------ template -inline -int64_t strtol10_64(const char* in, const char** out = 0, unsigned int* max_inout = 0) { +inline int64_t strtol10_64(const char* in, const char** out = 0, unsigned int* max_inout = 0) { bool inv = (*in == '-'); if ( inv || *in == '+' ) { ++in; @@ -259,8 +260,7 @@ int64_t strtol10_64(const char* in, const char** out = 0, unsigned int* max_inou // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. // ------------------------------------------------------------------------------------ template -inline -const char* fast_atoreal_move(const char* c, Real& out, bool check_comma = true) { +inline const char* fast_atoreal_move(const char* c, Real& out, bool check_comma = true) { Real f = 0; bool inv = (*c == '-'); @@ -349,8 +349,7 @@ const char* fast_atoreal_move(const char* c, Real& out, bool check_comma = true) // ------------------------------------------------------------------------------------ // The same but more human. template -inline -ai_real fast_atof(const char* c) { +inline ai_real fast_atof(const char* c) { ai_real ret(0.0); fast_atoreal_move(c, ret); @@ -367,8 +366,7 @@ ai_real fast_atof( const char* c, const char** cout) { } template -inline -ai_real fast_atof( const char** inout) { +inline ai_real fast_atof( const char** inout) { ai_real ret(0.0); *inout = fast_atoreal_move(*inout, ret); From 01488046e6e61a4e35109b2291e6af940c208f06 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:22:14 +0800 Subject: [PATCH 197/232] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/PostProcessing/ValidateDataStructure.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index e31054972..bbb08a2e9 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -290,7 +290,6 @@ void ValidateDSProcess::Validate(const aiMesh *pMesh) { switch (face.mNumIndices) { case 0: ReportError("aiMesh::mFaces[%i].mNumIndices is 0", i); - break; case 1: if (0 == (pMesh->mPrimitiveTypes & aiPrimitiveType_POINT)) { ReportError("aiMesh::mFaces[%i] is a POINT but aiMesh::mPrimitiveTypes " From 9e80dfc42db332130040748e5ddc6aaa43049a48 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:22:45 +0800 Subject: [PATCH 198/232] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/LWO/LWOBLoader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/LWO/LWOBLoader.cpp b/code/AssetLib/LWO/LWOBLoader.cpp index a61e49a7f..e49adcf98 100644 --- a/code/AssetLib/LWO/LWOBLoader.cpp +++ b/code/AssetLib/LWO/LWOBLoader.cpp @@ -65,7 +65,6 @@ void LWOImporter::LoadLWOBFile() if (mFileBuffer + head.length > end) { throw DeadlyImportError("LWOB: Invalid chunk length"); - break; } uint8_t* const next = mFileBuffer+head.length; switch (head.type) From 7620a69e3ec7ea5226c23456ffc335148ff57407 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:23:03 +0800 Subject: [PATCH 199/232] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/LWO/LWOLoader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 1bf39b2da..a7d4164bb 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -1486,7 +1486,6 @@ void LWOImporter::LoadLWO2File() { if (mFileBuffer + head.length > end) { throw DeadlyImportError("LWO2: Chunk length points behind the file"); - break; } uint8_t *const next = mFileBuffer + head.length; mFileBuffer += bufOffset; From cec41f6dd5d2992783163d2815ebc6e4b2699b4a Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:23:22 +0800 Subject: [PATCH 200/232] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Obj/ObjFileParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Obj/ObjFileParser.cpp b/code/AssetLib/Obj/ObjFileParser.cpp index c7121083a..ed416dc93 100644 --- a/code/AssetLib/Obj/ObjFileParser.cpp +++ b/code/AssetLib/Obj/ObjFileParser.cpp @@ -236,7 +236,7 @@ void ObjFileParser::parseFile(IOStreamBuffer &streamBuffer) { getNameNoSpace(m_DataIt, m_DataItEnd, name); insideCstype = name == "cstype"; goto pf_skip_line; - } break; + } default: { pf_skip_line: From 0a05a1f17f4c6316428b5f48de74ee8b22621232 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:23:43 +0800 Subject: [PATCH 201/232] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Collada/ColladaParser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index cce6a0db6..fcadd08a7 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -1855,7 +1855,6 @@ size_t ColladaParser::ReadPrimitives(XmlNode &node, Mesh &pMesh, std::vector Date: Sat, 1 Apr 2023 16:24:04 +0800 Subject: [PATCH 202/232] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Q3D/Q3DLoader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp index a91788c78..22d1065de 100644 --- a/code/AssetLib/Q3D/Q3DLoader.cpp +++ b/code/AssetLib/Q3D/Q3DLoader.cpp @@ -382,11 +382,10 @@ void Q3DImporter::InternReadFile(const std::string &pFile, // TODO goto outer; - } break; + } default: throw DeadlyImportError("Quick3D: Unknown chunk"); - break; }; } outer: From 4d962057e5bb78b60f417e00232f48ea6ed6c8da Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:24:31 +0800 Subject: [PATCH 203/232] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/X/XFileParser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/X/XFileParser.cpp b/code/AssetLib/X/XFileParser.cpp index 8786c3166..770c75a77 100644 --- a/code/AssetLib/X/XFileParser.cpp +++ b/code/AssetLib/X/XFileParser.cpp @@ -839,7 +839,6 @@ void XFileParser::ParseDataObjectAnimationKey(AnimBone *pAnimBone) { default: ThrowException("Unknown key type ", keyType, " in animation."); - break; } // end switch // key separator From 1b826afeda957e79bfdbe733601983ede17183dc Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:24:55 +0800 Subject: [PATCH 204/232] Remove -Wno-unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 05e31624a..6429de5fa 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1246,7 +1246,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-deprecated -Wno-format-nonliteral -Wno-comma - -Wno-unreachable-code-break -Wno-implicit-fallthrough -Wno-unused-template -Wno-undefined-func-template From c0947b704e8a318a5cebe98377340e92c6ca1bd9 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:24:15 +0800 Subject: [PATCH 205/232] Fix warning related to missing-variable-declarations, remove unused global variables. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/FBX/FBXMaterial.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/code/AssetLib/FBX/FBXMaterial.cpp b/code/AssetLib/FBX/FBXMaterial.cpp index 2677d652a..2f575a511 100644 --- a/code/AssetLib/FBX/FBXMaterial.cpp +++ b/code/AssetLib/FBX/FBXMaterial.cpp @@ -138,20 +138,6 @@ Material::Material(uint64_t id, const Element& element, const Document& doc, con // ------------------------------------------------------------------------------------------------ Material::~Material() = default; - aiVector2D uvTrans; - aiVector2D uvScaling; - ai_real uvRotation; - - std::string type; - std::string relativeFileName; - std::string fileName; - std::string alphaSource; - std::shared_ptr props; - - unsigned int crop[4]{}; - - const Video* media; - // ------------------------------------------------------------------------------------------------ Texture::Texture(uint64_t id, const Element& element, const Document& doc, const std::string& name) : Object(id,element,name), From 739cf15a1eeabb006b071eec866b5ee08781b5e1 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:26:03 +0800 Subject: [PATCH 206/232] Fix warning related to missing-variable-declarations, remove unused global variables. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/SIB/SIBImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index 323a69a00..9f299180b 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -85,7 +85,7 @@ static const aiImporterDesc desc = { struct SIBChunk { uint32_t Tag; uint32_t Size; -} PACK_STRUCT; +}; enum { POS, From 5738b3d172f052ebc5c1f1f523abb7e883f596e8 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:27:23 +0800 Subject: [PATCH 207/232] Fix warning related to missing-variable-declarations, add static to global variable. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Assjson/cencode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Assjson/cencode.c b/code/AssetLib/Assjson/cencode.c index 614a2671f..ec771536d 100644 --- a/code/AssetLib/Assjson/cencode.c +++ b/code/AssetLib/Assjson/cencode.c @@ -7,7 +7,7 @@ For details, see http://sourceforge.net/projects/libb64 #include "cencode.h" // changed from -const int CHARS_PER_LINE = 72; +static const int CHARS_PER_LINE = 72; #ifdef _MSC_VER #pragma warning(push) From 1244e582744a120c3e0f2aa192126cc8357a1b10 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:28:08 +0800 Subject: [PATCH 208/232] Fix warning related to missing-variable-declarations, add static to global variable. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- contrib/unzip/unzip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/unzip/unzip.c b/contrib/unzip/unzip.c index ba15257a9..4bc6773ef 100644 --- a/contrib/unzip/unzip.c +++ b/contrib/unzip/unzip.c @@ -78,7 +78,7 @@ # pragma warning(disable : 4131 4244 4189 4245) #endif // _MSC_VER -const char unz_copyright[] = +static const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; /* unz_file_info_internal contain internal info about a file in zipfile*/ From 46677b835c74f28bc36a4bf125b322297d681654 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:28:36 +0800 Subject: [PATCH 209/232] Fix warning related to missing-variable-declarations, add static to global variable. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Blender/BlenderCustomData.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/Blender/BlenderCustomData.cpp b/code/AssetLib/Blender/BlenderCustomData.cpp index c74a6bb75..2359482e1 100644 --- a/code/AssetLib/Blender/BlenderCustomData.cpp +++ b/code/AssetLib/Blender/BlenderCustomData.cpp @@ -96,7 +96,8 @@ struct CustomDataTypeDescription { * other (like CD_ORCO, ...) uses arrays of rawtypes or even arrays of Structures * use a special readfunction for that cases */ -std::array customDataTypeDescriptions = { { DECL_STRUCT_CUSTOMDATATYPEDESCRIPTION(MVert), +static std::array customDataTypeDescriptions = { { + DECL_STRUCT_CUSTOMDATATYPEDESCRIPTION(MVert), DECL_UNSUPPORTED_CUSTOMDATATYPEDESCRIPTION, DECL_UNSUPPORTED_CUSTOMDATATYPEDESCRIPTION, DECL_STRUCT_CUSTOMDATATYPEDESCRIPTION(MEdge), From ff17f1fe3de0ca2f97aa3a04af350999034d77b2 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:29:03 +0800 Subject: [PATCH 210/232] Remove -Wno-missing-variable-declarations. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 05e31624a..6e0d0f143 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1236,7 +1236,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-tautological-value-range-compare -Wno-tautological-type-limit-compare -Wno-missing-noreturn - -Wno-missing-variable-declarations -Wno-extra-semi -Wno-nonportable-system-include-path -Wno-undefined-reinterpret-cast From cd9de860cec3ea6ad3b45cb9f5435b850bb95916 Mon Sep 17 00:00:00 2001 From: Dan Rosser Date: Fri, 14 Apr 2023 18:56:08 +1000 Subject: [PATCH 211/232] Build Zlib if missing for other platforms --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f0e5a793..20c735c4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,7 +138,7 @@ IF (WIN32) ELSE() OPTION( ASSIMP_BUILD_ZLIB "Build your own zlib" - OFF + ON ) ENDIF() From 71043ec164e641ccc129797064744f15f48c7433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Suhajda=20Tam=C3=A1s?= Date: Fri, 28 Apr 2023 11:44:29 +0200 Subject: [PATCH 212/232] Add missing cast --- code/PostProcessing/ConvertToLHProcess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/PostProcessing/ConvertToLHProcess.cpp b/code/PostProcessing/ConvertToLHProcess.cpp index 0d5f3dc42..5524b31dc 100644 --- a/code/PostProcessing/ConvertToLHProcess.cpp +++ b/code/PostProcessing/ConvertToLHProcess.cpp @@ -241,7 +241,7 @@ void MakeLeftHandedProcess::ProcessAnimation(aiNodeAnim *pAnim) { // Converts a single camera to left handed coordinates. void MakeLeftHandedProcess::ProcessCamera( aiCamera* pCam) { - pCam->mLookAt = 2.0f * pCam->mPosition - pCam->mLookAt; + pCam->mLookAt = ai_real(2.0f) * pCam->mPosition - pCam->mLookAt; } #endif // !! ASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS From a8e7c2360508060234aca824d65b692a3d303624 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:29:33 +0800 Subject: [PATCH 213/232] Fix warning related to unreachable-code. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/FBX/FBXParser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index 150921db5..11cd1a934 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -190,7 +190,7 @@ Scope::Scope(Parser& parser,bool topLevel) } auto *element = new_Element(*n, parser); - + // Element() should stop at the next Key token (or right after a Close token) n = parser.CurrentToken(); if (n == nullptr) { @@ -198,8 +198,8 @@ Scope::Scope(Parser& parser,bool topLevel) elements.insert(ElementMap::value_type(str, element)); return; } - ParseError("unexpected end of file",parser.LastToken()); delete element; + ParseError("unexpected end of file",parser.LastToken()); } else { elements.insert(ElementMap::value_type(str, element)); } From cabf3a5d17be1479dd2b1a9d64eff7bc9f557501 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:30:21 +0800 Subject: [PATCH 214/232] Fix warning related to unreachable-code-return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/X3D/X3DXmlHelper.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/AssetLib/X3D/X3DXmlHelper.cpp b/code/AssetLib/X3D/X3DXmlHelper.cpp index ff24b74b3..7ed2e8237 100644 --- a/code/AssetLib/X3D/X3DXmlHelper.cpp +++ b/code/AssetLib/X3D/X3DXmlHelper.cpp @@ -12,7 +12,6 @@ bool X3DXmlHelper::getColor3DAttribute(XmlNode &node, const char *attributeName, tokenize(val, values, " "); if (values.size() != 3) { Throw_ConvertFail_Str2ArrF(node.name(), attributeName); - return false; } auto it = values.begin(); color.r = stof(*it++); @@ -30,7 +29,6 @@ bool X3DXmlHelper::getVector2DAttribute(XmlNode &node, const char *attributeName tokenize(val, values, " "); if (values.size() != 2) { Throw_ConvertFail_Str2ArrF(node.name(), attributeName); - return false; } auto it = values.begin(); color.x = stof(*it++); @@ -47,7 +45,6 @@ bool X3DXmlHelper::getVector3DAttribute(XmlNode &node, const char *attributeName tokenize(val, values, " "); if (values.size() != 3) { Throw_ConvertFail_Str2ArrF(node.name(), attributeName); - return false; } auto it = values.begin(); color.x = stof(*it++); From cdefc9f7aa5ff59618df60cfa505c6ac180e0115 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:43:40 +0800 Subject: [PATCH 215/232] Remove unused -Wno-deprecated-copy-with-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index d5500d986..cf86225d9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1241,7 +1241,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow -Wno-deprecated-copy-with-user-provided-dtor - -Wno-deprecated-copy-with-dtor -Wno-deprecated -Wno-format-nonliteral -Wno-comma From 51494e1b4fec3d9086aa4a45332f46d103aa7ddc Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:55:13 +0800 Subject: [PATCH 216/232] Remove unused -Wno-deprecated-copy-with-user-provided-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index cf86225d9..af260f5e9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1240,7 +1240,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-nonportable-system-include-path -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow - -Wno-deprecated-copy-with-user-provided-dtor -Wno-deprecated -Wno-format-nonliteral -Wno-comma From 92d426de2b6878ee5f8535d8ad5c51f871b632df Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 01:05:25 +0800 Subject: [PATCH 217/232] Remove unused -Wno-missing-noreturn. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index af260f5e9..02ba7a08e 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1234,7 +1234,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-header-hygiene -Wno-tautological-value-range-compare -Wno-tautological-type-limit-compare - -Wno-missing-noreturn -Wno-missing-variable-declarations -Wno-extra-semi -Wno-nonportable-system-include-path From a923d1f89bec9af09e4978adbd78c7d1aadae5c1 Mon Sep 17 00:00:00 2001 From: ParkBook <974200701@qq.com> Date: Mon, 1 May 2023 00:38:16 +0800 Subject: [PATCH 218/232] fix unreachable code fix unreachable code --- code/AssetLib/FBX/FBXParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index 150921db5..9278d90ab 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -198,8 +198,8 @@ Scope::Scope(Parser& parser,bool topLevel) elements.insert(ElementMap::value_type(str, element)); return; } - ParseError("unexpected end of file",parser.LastToken()); delete element; + ParseError("unexpected end of file",parser.LastToken()); } else { elements.insert(ElementMap::value_type(str, element)); } From d58201a579759305cec8330cdcc908d954d2b970 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 4 May 2023 00:00:52 +0200 Subject: [PATCH 219/232] Refactoring: Reuse code from GeometryUtils --- code/Geometry/GeometryUtils.cpp | 8 + code/Geometry/GeometryUtils.h | 14 +- .../ComputeUVMappingProcess.cpp | 289 ++++++++--------- .../PostProcessing/DropFaceNormalsProcess.cpp | 25 +- code/PostProcessing/FindDegenerates.cpp | 80 +++-- code/PostProcessing/PretransformVertices.cpp | 293 +++++++++--------- code/PostProcessing/PretransformVertices.h | 18 +- code/PostProcessing/ProcessHelper.cpp | 7 +- .../RemoveRedundantMaterials.cpp | 33 +- code/PostProcessing/ScaleProcess.cpp | 1 - code/PostProcessing/SortByPTypeProcess.cpp | 3 +- .../SplitByBoneCountProcess.cpp | 4 +- code/PostProcessing/SplitLargeMeshes.cpp | 36 +-- code/PostProcessing/TextureTransform.cpp | 6 +- code/PostProcessing/TriangulateProcess.cpp | 45 +-- code/PostProcessing/ValidateDataStructure.cpp | 83 +++-- include/assimp/StreamWriter.h | 5 +- include/assimp/Vertex.h | 25 +- test/CMakeLists.txt | 18 +- test/unit/Geometry/utGeometryUtils.cpp | 68 ++++ 20 files changed, 526 insertions(+), 535 deletions(-) create mode 100644 test/unit/Geometry/utGeometryUtils.cpp diff --git a/code/Geometry/GeometryUtils.cpp b/code/Geometry/GeometryUtils.cpp index 92a3aa853..ad99f2224 100644 --- a/code/Geometry/GeometryUtils.cpp +++ b/code/Geometry/GeometryUtils.cpp @@ -89,4 +89,12 @@ bool GeometryUtils::PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, return true; } +// ------------------------------------------------------------------------------------------------ +void GeometryUtils::normalizeVectorArray(aiVector3D *vectorArrayIn, aiVector3D *vectorArrayOut, + size_t numVectors) { + for (size_t i=0; i -#include "Geometry/GeometryUtils.h" using namespace Assimp; namespace { - const static aiVector3D base_axis_y(0.0,1.0,0.0); - const static aiVector3D base_axis_x(1.0,0.0,0.0); - const static aiVector3D base_axis_z(0.0,0.0,1.0); - const static ai_real angle_epsilon = ai_real( 0.95 ); -} +const static aiVector3D base_axis_y(0.0, 1.0, 0.0); +const static aiVector3D base_axis_x(1.0, 0.0, 0.0); +const static aiVector3D base_axis_z(0.0, 0.0, 1.0); +const static ai_real angle_epsilon = ai_real(0.95); +} // namespace // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool ComputeUVMappingProcess::IsActive( unsigned int pFlags) const { - return (pFlags & aiProcess_GenUVCoords) != 0; +bool ComputeUVMappingProcess::IsActive(unsigned int pFlags) const { + return (pFlags & aiProcess_GenUVCoords) != 0; } // ------------------------------------------------------------------------------------------------ // Find the first empty UV channel in a mesh -inline unsigned int FindEmptyUVChannel (aiMesh* mesh) { - for (unsigned int m = 0; m < AI_MAX_NUMBER_OF_TEXTURECOORDS;++m) +inline unsigned int FindEmptyUVChannel(aiMesh *mesh) { + for (unsigned int m = 0; m < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++m) if (!mesh->mTextureCoords[m]) { return m; } @@ -76,19 +76,19 @@ inline unsigned int FindEmptyUVChannel (aiMesh* mesh) { // ------------------------------------------------------------------------------------------------ // Try to remove UV seams -void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { +void RemoveUVSeams(aiMesh *mesh, aiVector3D *out) { // TODO: just a very rough algorithm. I think it could be done // much easier, but I don't know how and am currently too tired to // to think about a better solution. - const static ai_real LOWER_LIMIT = ai_real( 0.1 ); - const static ai_real UPPER_LIMIT = ai_real( 0.9 ); + const static ai_real LOWER_LIMIT = ai_real(0.1); + const static ai_real UPPER_LIMIT = ai_real(0.9); - const static ai_real LOWER_EPSILON = ai_real( 10e-3 ); - const static ai_real UPPER_EPSILON = ai_real( 1.0-10e-3 ); + const static ai_real LOWER_EPSILON = ai_real(10e-3); + const static ai_real UPPER_EPSILON = ai_real(1.0 - 10e-3); - for (unsigned int fidx = 0; fidx < mesh->mNumFaces;++fidx) { - const aiFace& face = mesh->mFaces[fidx]; + for (unsigned int fidx = 0; fidx < mesh->mNumFaces; ++fidx) { + const aiFace &face = mesh->mFaces[fidx]; if (face.mNumIndices < 3) { continue; // triangles and polygons only, please } @@ -100,20 +100,18 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { // but the assumption that a face with at least one very small // on the one side and one very large U coord on the other side // lies on a UV seam should work for most cases. - for (unsigned int n = 0; n < face.mNumIndices;++n) - { - if (out[face.mIndices[n]].x < LOWER_LIMIT) - { + for (unsigned int n = 0; n < face.mNumIndices; ++n) { + if (out[face.mIndices[n]].x < LOWER_LIMIT) { smallV = n; // If we have a U value very close to 0 we can't // round the others to 0, too. if (out[face.mIndices[n]].x <= LOWER_EPSILON) zero = true; - else round_to_zero = true; + else + round_to_zero = true; } - if (out[face.mIndices[n]].x > UPPER_LIMIT) - { + if (out[face.mIndices[n]].x > UPPER_LIMIT) { large = n; // If we have a U value very close to 1 we can't @@ -122,10 +120,8 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { one = true; } } - if (smallV != face.mNumIndices && large != face.mNumIndices) - { - for (unsigned int n = 0; n < face.mNumIndices;++n) - { + if (smallV != face.mNumIndices && large != face.mNumIndices) { + for (unsigned int n = 0; n < face.mNumIndices; ++n) { // If the u value is over the upper limit and no other u // value of that face is 0, round it to 0 if (out[face.mIndices[n]].x > UPPER_LIMIT && !zero) @@ -141,9 +137,8 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { // Due to numerical inaccuracies one U coord becomes 0, the // other 1. But we do still have a third UV coord to determine // to which side we must round to. - else if (one && zero) - { - if (round_to_zero && out[face.mIndices[n]].x >= UPPER_EPSILON) + else if (one && zero) { + if (round_to_zero && out[face.mIndices[n]].x >= UPPER_EPSILON) out[face.mIndices[n]].x = 0.0; else if (!round_to_zero && out[face.mIndices[n]].x <= LOWER_EPSILON) out[face.mIndices[n]].x = 1.0; @@ -154,8 +149,7 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh* mesh,const aiVector3D& axis, aiVector3D* out) -{ +void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh *mesh, const aiVector3D &axis, aiVector3D *out) { aiVector3D center, min, max; FindMeshCenter(mesh, center, min, max); @@ -163,7 +157,7 @@ void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh* mesh,const aiVector3D // currently the mapping axis will always be one of x,y,z, except if the // PretransformVertices step is used (it transforms the meshes into worldspace, // thus changing the mapping axis) - if (axis * base_axis_x >= angle_epsilon) { + if (axis * base_axis_x >= angle_epsilon) { // For each point get a normalized projection vector in the sphere, // get its longitude and latitude and map them to their respective @@ -177,58 +171,54 @@ void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh* mesh,const aiVector3D // Thus we can derive: // lat = arcsin (z) // lon = arctan (y/x) - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = (mesh->mVertices[pnt]-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.z, diff.y) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin (diff.x) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = (mesh->mVertices[pnt] - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.z, diff.y) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.x) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } - } - else if (axis * base_axis_y >= angle_epsilon) { + } else if (axis * base_axis_y >= angle_epsilon) { // ... just the same again - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = (mesh->mVertices[pnt]-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.x, diff.z) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin (diff.y) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = (mesh->mVertices[pnt] - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.x, diff.z) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.y) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } - } - else if (axis * base_axis_z >= angle_epsilon) { + } else if (axis * base_axis_z >= angle_epsilon) { // ... just the same again - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = (mesh->mVertices[pnt]-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin (diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = (mesh->mVertices[pnt] - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } } // slower code path in case the mapping axis is not one of the coordinate system axes - else { + else { aiMatrix4x4 mTrafo; - aiMatrix4x4::FromToMatrix(axis,base_axis_y,mTrafo); + aiMatrix4x4::FromToMatrix(axis, base_axis_y, mTrafo); // again the same, except we're applying a transformation now - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = ((mTrafo*mesh->mVertices[pnt])-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin(diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = ((mTrafo * mesh->mVertices[pnt]) - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } } - // Now find and remove UV seams. A seam occurs if a face has a tcoord // close to zero on the one side, and a tcoord close to one on the // other side. - RemoveUVSeams(mesh,out); + RemoveUVSeams(mesh, out); } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputeCylinderMapping(aiMesh* mesh,const aiVector3D& axis, aiVector3D* out) -{ +void ComputeUVMappingProcess::ComputeCylinderMapping(aiMesh *mesh, const aiVector3D &axis, aiVector3D *out) { aiVector3D center, min, max; // If the axis is one of x,y,z run a faster code path. It's worth the extra effort ... // currently the mapping axis will always be one of x,y,z, except if the // PretransformVertices step is used (it transforms the meshes into worldspace, // thus changing the mapping axis) - if (axis * base_axis_x >= angle_epsilon) { + if (axis * base_axis_x >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); const ai_real diff = max.x - min.x; @@ -236,116 +226,110 @@ void ComputeUVMappingProcess::ComputeCylinderMapping(aiMesh* mesh,const aiVector // directly to the texture V axis. The other axis is derived from // the angle between ( p.x - c.x, p.y - c.y ) and (1,0), where // 'c' is the center point of the mesh. - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.x - min.x) / diff; - uv.x = (std::atan2( pos.z - center.z, pos.y - center.y) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.z - center.z, pos.y - center.y) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } - } - else if (axis * base_axis_y >= angle_epsilon) { + } else if (axis * base_axis_y >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); const ai_real diff = max.y - min.y; // just the same ... - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.y - min.y) / diff; - uv.x = (std::atan2( pos.x - center.x, pos.z - center.z) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.x - center.x, pos.z - center.z) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } - } - else if (axis * base_axis_z >= angle_epsilon) { + } else if (axis * base_axis_z >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); const ai_real diff = max.z - min.z; // just the same ... - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.z - min.z) / diff; - uv.x = (std::atan2( pos.y - center.y, pos.x - center.x) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.y - center.y, pos.x - center.x) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } } // slower code path in case the mapping axis is not one of the coordinate system axes else { aiMatrix4x4 mTrafo; - aiMatrix4x4::FromToMatrix(axis,base_axis_y,mTrafo); - FindMeshCenterTransformed(mesh, center, min, max,mTrafo); + aiMatrix4x4::FromToMatrix(axis, base_axis_y, mTrafo); + FindMeshCenterTransformed(mesh, center, min, max, mTrafo); const ai_real diff = max.y - min.y; // again the same, except we're applying a transformation now - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt){ - const aiVector3D pos = mTrafo* mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D pos = mTrafo * mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.y - min.y) / diff; - uv.x = (std::atan2( pos.x - center.x, pos.z - center.z) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.x - center.x, pos.z - center.z) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } } // Now find and remove UV seams. A seam occurs if a face has a tcoord // close to zero on the one side, and a tcoord close to one on the // other side. - RemoveUVSeams(mesh,out); + RemoveUVSeams(mesh, out); } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputePlaneMapping(aiMesh* mesh,const aiVector3D& axis, aiVector3D* out) -{ - ai_real diffu,diffv; +void ComputeUVMappingProcess::ComputePlaneMapping(aiMesh *mesh, const aiVector3D &axis, aiVector3D *out) { + ai_real diffu, diffv; aiVector3D center, min, max; // If the axis is one of x,y,z run a faster code path. It's worth the extra effort ... // currently the mapping axis will always be one of x,y,z, except if the // PretransformVertices step is used (it transforms the meshes into worldspace, // thus changing the mapping axis) - if (axis * base_axis_x >= angle_epsilon) { + if (axis * base_axis_x >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); diffu = max.z - min.z; diffv = max.y - min.y; - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - out[pnt].Set((pos.z - min.z) / diffu,(pos.y - min.y) / diffv,0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + out[pnt].Set((pos.z - min.z) / diffu, (pos.y - min.y) / diffv, 0.0); } - } - else if (axis * base_axis_y >= angle_epsilon) { + } else if (axis * base_axis_y >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); diffu = max.x - min.x; diffv = max.z - min.z; - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - out[pnt].Set((pos.x - min.x) / diffu,(pos.z - min.z) / diffv,0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + out[pnt].Set((pos.x - min.x) / diffu, (pos.z - min.z) / diffv, 0.0); } - } - else if (axis * base_axis_z >= angle_epsilon) { + } else if (axis * base_axis_z >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); diffu = max.x - min.x; diffv = max.y - min.y; - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - out[pnt].Set((pos.x - min.x) / diffu,(pos.y - min.y) / diffv,0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + out[pnt].Set((pos.x - min.x) / diffu, (pos.y - min.y) / diffv, 0.0); } } // slower code path in case the mapping axis is not one of the coordinate system axes - else - { + else { aiMatrix4x4 mTrafo; - aiMatrix4x4::FromToMatrix(axis,base_axis_y,mTrafo); - FindMeshCenterTransformed(mesh, center, min, max,mTrafo); + aiMatrix4x4::FromToMatrix(axis, base_axis_y, mTrafo); + FindMeshCenterTransformed(mesh, center, min, max, mTrafo); diffu = max.x - min.x; diffv = max.z - min.z; // again the same, except we're applying a transformation now - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { const aiVector3D pos = mTrafo * mesh->mVertices[pnt]; - out[pnt].Set((pos.x - min.x) / diffu,(pos.z - min.z) / diffv,0.0); + out[pnt].Set((pos.x - min.x) / diffu, (pos.z - min.z) / diffv, 0.0); } } @@ -353,14 +337,12 @@ void ComputeUVMappingProcess::ComputePlaneMapping(aiMesh* mesh,const aiVector3D& } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputeBoxMapping( aiMesh*, aiVector3D* ) -{ +void ComputeUVMappingProcess::ComputeBoxMapping(aiMesh *, aiVector3D *) { ASSIMP_LOG_ERROR("Mapping type currently not implemented"); } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::Execute( aiScene* pScene) -{ +void ComputeUVMappingProcess::Execute(aiScene *pScene) { ASSIMP_LOG_DEBUG("GenUVCoordsProcess begin"); char buffer[1024]; @@ -371,23 +353,18 @@ void ComputeUVMappingProcess::Execute( aiScene* pScene) /* Iterate through all materials and search for non-UV mapped textures */ - for (unsigned int i = 0; i < pScene->mNumMaterials;++i) - { + for (unsigned int i = 0; i < pScene->mNumMaterials; ++i) { mappingStack.clear(); - aiMaterial* mat = pScene->mMaterials[i]; - for (unsigned int a = 0; a < mat->mNumProperties;++a) - { - aiMaterialProperty* prop = mat->mProperties[a]; - if (!::strcmp( prop->mKey.data, "$tex.mapping")) - { - aiTextureMapping& mapping = *((aiTextureMapping*)prop->mData); - if (aiTextureMapping_UV != mapping) - { - if (!DefaultLogger::isNullLogger()) - { + aiMaterial *mat = pScene->mMaterials[i]; + for (unsigned int a = 0; a < mat->mNumProperties; ++a) { + aiMaterialProperty *prop = mat->mProperties[a]; + if (!::strcmp(prop->mKey.data, "$tex.mapping")) { + aiTextureMapping &mapping = *((aiTextureMapping *)prop->mData); + if (aiTextureMapping_UV != mapping) { + if (!DefaultLogger::isNullLogger()) { ai_snprintf(buffer, 1024, "Found non-UV mapped texture (%s,%u). Mapping type: %s", - aiTextureTypeToString((aiTextureType)prop->mSemantic),prop->mIndex, - MappingTypeToString(mapping)); + aiTextureTypeToString((aiTextureType)prop->mSemantic), prop->mIndex, + MappingTypeToString(mapping)); ASSIMP_LOG_INFO(buffer); } @@ -395,70 +372,62 @@ void ComputeUVMappingProcess::Execute( aiScene* pScene) if (aiTextureMapping_OTHER == mapping) continue; - MappingInfo info (mapping); + MappingInfo info(mapping); // Get further properties - currently only the major axis - for (unsigned int a2 = 0; a2 < mat->mNumProperties;++a2) - { - aiMaterialProperty* prop2 = mat->mProperties[a2]; + for (unsigned int a2 = 0; a2 < mat->mNumProperties; ++a2) { + aiMaterialProperty *prop2 = mat->mProperties[a2]; if (prop2->mSemantic != prop->mSemantic || prop2->mIndex != prop->mIndex) continue; - if ( !::strcmp( prop2->mKey.data, "$tex.mapaxis")) { - info.axis = *((aiVector3D*)prop2->mData); + if (!::strcmp(prop2->mKey.data, "$tex.mapaxis")) { + info.axis = *((aiVector3D *)prop2->mData); break; } } - unsigned int idx( 99999999 ); + unsigned int idx(99999999); // Check whether we have this mapping mode already - std::list::iterator it = std::find (mappingStack.begin(),mappingStack.end(), info); - if (mappingStack.end() != it) - { + std::list::iterator it = std::find(mappingStack.begin(), mappingStack.end(), info); + if (mappingStack.end() != it) { idx = (*it).uv; - } - else - { + } else { /* We have found a non-UV mapped texture. Now - * we need to find all meshes using this material - * that we can compute UV channels for them. - */ - for (unsigned int m = 0; m < pScene->mNumMeshes;++m) - { - aiMesh* mesh = pScene->mMeshes[m]; + * we need to find all meshes using this material + * that we can compute UV channels for them. + */ + for (unsigned int m = 0; m < pScene->mNumMeshes; ++m) { + aiMesh *mesh = pScene->mMeshes[m]; unsigned int outIdx = 0; - if ( mesh->mMaterialIndex != i || ( outIdx = FindEmptyUVChannel(mesh) ) == UINT_MAX || - !mesh->mNumVertices) - { + if (mesh->mMaterialIndex != i || (outIdx = FindEmptyUVChannel(mesh)) == UINT_MAX || + !mesh->mNumVertices) { continue; } // Allocate output storage - aiVector3D* p = mesh->mTextureCoords[outIdx] = new aiVector3D[mesh->mNumVertices]; + aiVector3D *p = mesh->mTextureCoords[outIdx] = new aiVector3D[mesh->mNumVertices]; - switch (mapping) - { + switch (mapping) { case aiTextureMapping_SPHERE: - ComputeSphereMapping(mesh,info.axis,p); + ComputeSphereMapping(mesh, info.axis, p); break; case aiTextureMapping_CYLINDER: - ComputeCylinderMapping(mesh,info.axis,p); + ComputeCylinderMapping(mesh, info.axis, p); break; case aiTextureMapping_PLANE: - ComputePlaneMapping(mesh,info.axis,p); + ComputePlaneMapping(mesh, info.axis, p); break; case aiTextureMapping_BOX: - ComputeBoxMapping(mesh,p); + ComputeBoxMapping(mesh, p); break; default: ai_assert(false); } - if (m && idx != outIdx) - { + if (m && idx != outIdx) { ASSIMP_LOG_WARN("UV index mismatch. Not all meshes assigned to " - "this material have equal numbers of UV channels. The UV index stored in " - "the material structure does therefore not apply for all meshes. "); + "this material have equal numbers of UV channels. The UV index stored in " + "the material structure does therefore not apply for all meshes. "); } idx = outIdx; } @@ -468,7 +437,7 @@ void ComputeUVMappingProcess::Execute( aiScene* pScene) // Update the material property list mapping = aiTextureMapping_UV; - ((aiMaterial*)mat)->AddProperty(&idx,1,AI_MATKEY_UVWSRC(prop->mSemantic,prop->mIndex)); + ((aiMaterial *)mat)->AddProperty(&idx, 1, AI_MATKEY_UVWSRC(prop->mSemantic, prop->mIndex)); } } } diff --git a/code/PostProcessing/DropFaceNormalsProcess.cpp b/code/PostProcessing/DropFaceNormalsProcess.cpp index 223482374..c5f6333e0 100644 --- a/code/PostProcessing/DropFaceNormalsProcess.cpp +++ b/code/PostProcessing/DropFaceNormalsProcess.cpp @@ -42,27 +42,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file Implementation of the post processing step to drop face -* normals for all imported faces. -*/ - + * normals for all imported faces. + */ #include "DropFaceNormalsProcess.h" +#include #include #include #include -#include using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool DropFaceNormalsProcess::IsActive( unsigned int pFlags) const { - return (pFlags & aiProcess_DropNormals) != 0; +bool DropFaceNormalsProcess::IsActive(unsigned int pFlags) const { + return (pFlags & aiProcess_DropNormals) != 0; } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void DropFaceNormalsProcess::Execute( aiScene* pScene) { +void DropFaceNormalsProcess::Execute(aiScene *pScene) { ASSIMP_LOG_DEBUG("DropFaceNormalsProcess begin"); if (pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) { @@ -70,21 +69,21 @@ void DropFaceNormalsProcess::Execute( aiScene* pScene) { } bool bHas = false; - for( unsigned int a = 0; a < pScene->mNumMeshes; a++) { - bHas |= this->DropMeshFaceNormals( pScene->mMeshes[a]); + for (unsigned int a = 0; a < pScene->mNumMeshes; a++) { + bHas |= this->DropMeshFaceNormals(pScene->mMeshes[a]); } - if (bHas) { + if (bHas) { ASSIMP_LOG_INFO("DropFaceNormalsProcess finished. " - "Face normals have been removed"); + "Face normals have been removed"); } else { ASSIMP_LOG_DEBUG("DropFaceNormalsProcess finished. " - "No normals were present"); + "No normals were present"); } } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -bool DropFaceNormalsProcess::DropMeshFaceNormals (aiMesh* mesh) { +bool DropFaceNormalsProcess::DropMeshFaceNormals(aiMesh *mesh) { ai_assert(nullptr != mesh); if (nullptr == mesh->mNormals) { diff --git a/code/PostProcessing/FindDegenerates.cpp b/code/PostProcessing/FindDegenerates.cpp index 87ee75601..d9c14425c 100644 --- a/code/PostProcessing/FindDegenerates.cpp +++ b/code/PostProcessing/FindDegenerates.cpp @@ -41,11 +41,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file FindDegenerates.cpp * @brief Implementation of the FindDegenerates post-process step. -*/ + */ -#include "ProcessHelper.h" #include "FindDegenerates.h" #include "Geometry/GeometryUtils.h" +#include "ProcessHelper.h" #include @@ -54,35 +54,35 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; // Correct node indices to meshes and remove references to deleted mesh -static void updateSceneGraph(aiNode* pNode, const std::unordered_map& meshMap); +static void updateSceneGraph(aiNode *pNode, const std::unordered_map &meshMap); // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer FindDegeneratesProcess::FindDegeneratesProcess() : - mConfigRemoveDegenerates( false ), - mConfigCheckAreaOfTriangle( false ){ + mConfigRemoveDegenerates(false), + mConfigCheckAreaOfTriangle(false) { // empty } // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool FindDegeneratesProcess::IsActive( unsigned int pFlags) const { +bool FindDegeneratesProcess::IsActive(unsigned int pFlags) const { return 0 != (pFlags & aiProcess_FindDegenerates); } // ------------------------------------------------------------------------------------------------ // Setup import configuration -void FindDegeneratesProcess::SetupProperties(const Importer* pImp) { +void FindDegeneratesProcess::SetupProperties(const Importer *pImp) { // Get the current value of AI_CONFIG_PP_FD_REMOVE - mConfigRemoveDegenerates = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_REMOVE,0)); - mConfigCheckAreaOfTriangle = ( 0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_CHECKAREA) ); + mConfigRemoveDegenerates = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_REMOVE, 0)); + mConfigCheckAreaOfTriangle = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_CHECKAREA)); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void FindDegeneratesProcess::Execute( aiScene* pScene) { +void FindDegeneratesProcess::Execute(aiScene *pScene) { ASSIMP_LOG_DEBUG("FindDegeneratesProcess begin"); - if ( nullptr == pScene) { + if (nullptr == pScene) { return; } @@ -112,7 +112,7 @@ void FindDegeneratesProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("FindDegeneratesProcess finished"); } -static void updateSceneGraph(aiNode* pNode, const std::unordered_map& meshMap) { +static void updateSceneGraph(aiNode *pNode, const std::unordered_map &meshMap) { unsigned int targetIndex = 0; for (unsigned i = 0; i < pNode->mNumMeshes; ++i) { const unsigned int sourceMeshIndex = pNode->mMeshes[i]; @@ -123,7 +123,7 @@ static void updateSceneGraph(aiNode* pNode, const std::unordered_mapmNumMeshes = targetIndex; - //recurse to all children + // recurse to all children for (unsigned i = 0; i < pNode->mNumChildren; ++i) { updateSceneGraph(pNode->mChildren[i], meshMap); } @@ -131,17 +131,17 @@ static void updateSceneGraph(aiNode* pNode, const std::unordered_mapmPrimitiveTypes = 0; std::vector remove_me; if (mConfigRemoveDegenerates) { - remove_me.resize( mesh->mNumFaces, false ); + remove_me.resize(mesh->mNumFaces, false); } unsigned int deg = 0, limit; - for ( unsigned int a = 0; a < mesh->mNumFaces; ++a ) { - aiFace& face = mesh->mFaces[a]; + for (unsigned int a = 0; a < mesh->mNumFaces; ++a) { + aiFace &face = mesh->mFaces[a]; bool first = true; // check whether the face contains degenerated entries @@ -151,43 +151,43 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { // double points may not come directly after another. limit = face.mNumIndices; if (face.mNumIndices > 4) { - limit = std::min( limit, i+2 ); + limit = std::min(limit, i + 2); } - for (unsigned int t = i+1; t < limit; ++t) { - if (mesh->mVertices[face.mIndices[ i ] ] == mesh->mVertices[ face.mIndices[ t ] ]) { + for (unsigned int t = i + 1; t < limit; ++t) { + if (mesh->mVertices[face.mIndices[i]] == mesh->mVertices[face.mIndices[t]]) { // we have found a matching vertex position // remove the corresponding index from the array --face.mNumIndices; --limit; for (unsigned int m = t; m < face.mNumIndices; ++m) { - face.mIndices[ m ] = face.mIndices[ m+1 ]; + face.mIndices[m] = face.mIndices[m + 1]; } --t; // NOTE: we set the removed vertex index to an unique value // to make sure the developer gets notified when his // application attempts to access this data. - face.mIndices[ face.mNumIndices ] = 0xdeadbeef; + face.mIndices[face.mNumIndices] = 0xdeadbeef; - if(first) { + if (first) { ++deg; first = false; } - if ( mConfigRemoveDegenerates ) { - remove_me[ a ] = true; + if (mConfigRemoveDegenerates) { + remove_me[a] = true; goto evil_jump_outside; // hrhrhrh ... yeah, this rocks baby! } } } - if ( mConfigCheckAreaOfTriangle ) { - if ( face.mNumIndices == 3 ) { - ai_real area = GeometryUtils::calculateAreaOfTriangle( face, mesh ); + if (mConfigCheckAreaOfTriangle) { + if (face.mNumIndices == 3) { + ai_real area = GeometryUtils::calculateAreaOfTriangle(face, mesh); if (area < ai_epsilon) { - if ( mConfigRemoveDegenerates ) { - remove_me[ a ] = true; + if (mConfigRemoveDegenerates) { + remove_me[a] = true; ++deg; goto evil_jump_outside; } @@ -199,8 +199,7 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { } // We need to update the primitive flags array of the mesh. - switch (face.mNumIndices) - { + switch (face.mNumIndices) { case 1u: mesh->mPrimitiveTypes |= aiPrimitiveType_POINT; break; @@ -214,22 +213,21 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { mesh->mPrimitiveTypes |= aiPrimitiveType_POLYGON; break; }; -evil_jump_outside: + evil_jump_outside: continue; } // If AI_CONFIG_PP_FD_REMOVE is true, remove degenerated faces from the import if (mConfigRemoveDegenerates && deg) { unsigned int n = 0; - for (unsigned int a = 0; a < mesh->mNumFaces; ++a) - { - aiFace& face_src = mesh->mFaces[a]; + for (unsigned int a = 0; a < mesh->mNumFaces; ++a) { + aiFace &face_src = mesh->mFaces[a]; if (!remove_me[a]) { - aiFace& face_dest = mesh->mFaces[n++]; + aiFace &face_dest = mesh->mFaces[n++]; // Do a manual copy, keep the index array face_dest.mNumIndices = face_src.mNumIndices; - face_dest.mIndices = face_src.mIndices; + face_dest.mIndices = face_src.mIndices; if (&face_src != &face_dest) { // clear source @@ -246,15 +244,15 @@ evil_jump_outside: // Just leave the rest of the array unreferenced, we don't care for now mesh->mNumFaces = n; if (!mesh->mNumFaces) { - //The whole mesh consists of degenerated faces - //signal upward, that this mesh should be deleted. + // The whole mesh consists of degenerated faces + // signal upward, that this mesh should be deleted. ASSIMP_LOG_VERBOSE_DEBUG("FindDegeneratesProcess removed a mesh full of degenerated primitives"); return true; } } if (deg && !DefaultLogger::isNullLogger()) { - ASSIMP_LOG_WARN( "Found ", deg, " degenerated primitives"); + ASSIMP_LOG_WARN("Found ", deg, " degenerated primitives"); } return false; } diff --git a/code/PostProcessing/PretransformVertices.cpp b/code/PostProcessing/PretransformVertices.cpp index b6bb6155e..ff066a1d3 100644 --- a/code/PostProcessing/PretransformVertices.cpp +++ b/code/PostProcessing/PretransformVertices.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -41,9 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ -/** @file PretransformVertices.cpp - * @brief Implementation of the "PretransformVertices" post processing step -*/ +/// @file PretransformVertices.cpp +/// @brief Implementation of the "PretransformVertices" post processing step #include "PretransformVertices.h" #include "ConvertToLHProcess.h" @@ -57,16 +54,44 @@ using namespace Assimp; #define AI_PTVS_VERTEX 0x0 #define AI_PTVS_FACE 0x1 +namespace { + +// Get a bitwise combination identifying the vertex format of a mesh +static unsigned int GetMeshVFormat(aiMesh *pcMesh) { + // the vertex format is stored in aiMesh::mBones for later retrieval. + // there isn't a good reason to compute it a few hundred times + // from scratch. The pointer is unused as animations are lost + // during PretransformVertices. + if (pcMesh->mBones) + return (unsigned int)(uint64_t)pcMesh->mBones; + + const unsigned int iRet = GetMeshVFormatUnique(pcMesh); + + // store the value for later use + pcMesh->mBones = (aiBone **)(uint64_t)iRet; + return iRet; +} + +// Get a list of all vertex formats that occur for a given material index +// The output list contains duplicate elements +static void GetVFormatList(const aiScene *pcScene, unsigned int iMat, std::list &aiOut) { + for (unsigned int i = 0; i < pcScene->mNumMeshes; ++i) { + aiMesh *pcMesh = pcScene->mMeshes[i]; + if (iMat == pcMesh->mMaterialIndex) { + aiOut.push_back(GetMeshVFormat(pcMesh)); + } + } +} + +} // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer PretransformVertices::PretransformVertices() : - configKeepHierarchy(false), - configNormalize(false), - configTransform(false), - configTransformation(), - mConfigPointCloud(false) { - // empty -} + mConfigKeepHierarchy(false), + mConfigNormalize(false), + mConfigTransform(false), + mConfigTransformation(), + mConfigPointCloud(false) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. @@ -79,11 +104,11 @@ bool PretransformVertices::IsActive(unsigned int pFlags) const { void PretransformVertices::SetupProperties(const Importer *pImp) { // Get the current value of AI_CONFIG_PP_PTV_KEEP_HIERARCHY, AI_CONFIG_PP_PTV_NORMALIZE, // AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION and AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION - configKeepHierarchy = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_KEEP_HIERARCHY, 0)); - configNormalize = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_NORMALIZE, 0)); - configTransform = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION, 0)); + mConfigKeepHierarchy = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_KEEP_HIERARCHY, 0)); + mConfigNormalize = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_NORMALIZE, 0)); + mConfigTransform = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION, 0)); - configTransformation = pImp->GetPropertyMatrix(AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION, aiMatrix4x4()); + mConfigTransformation = pImp->GetPropertyMatrix(AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION, aiMatrix4x4()); mConfigPointCloud = pImp->GetPropertyBool(AI_CONFIG_EXPORT_POINT_CLOUDS); } @@ -99,25 +124,7 @@ unsigned int PretransformVertices::CountNodes(const aiNode *pcNode) const { } // ------------------------------------------------------------------------------------------------ -// Get a bitwise combination identifying the vertex format of a mesh -unsigned int PretransformVertices::GetMeshVFormat(aiMesh *pcMesh) const { - // the vertex format is stored in aiMesh::mBones for later retrieval. - // there isn't a good reason to compute it a few hundred times - // from scratch. The pointer is unused as animations are lost - // during PretransformVertices. - if (pcMesh->mBones) - return (unsigned int)(uint64_t)pcMesh->mBones; - - const unsigned int iRet = GetMeshVFormatUnique(pcMesh); - - // store the value for later use - pcMesh->mBones = (aiBone **)(uint64_t)iRet; - return iRet; -} - -// ------------------------------------------------------------------------------------------------ -// Count the number of vertices in the whole scene and a given -// material index +// Count the number of vertices in the whole scene and a given material index void PretransformVertices::CountVerticesAndFaces(const aiScene *pcScene, const aiNode *pcNode, unsigned int iMat, unsigned int iVFormat, unsigned int *piFaces, unsigned int *piVertices) const { for (unsigned int i = 0; i < pcNode->mNumMeshes; ++i) { @@ -128,8 +135,7 @@ void PretransformVertices::CountVerticesAndFaces(const aiScene *pcScene, const a } } for (unsigned int i = 0; i < pcNode->mNumChildren; ++i) { - CountVerticesAndFaces(pcScene, pcNode->mChildren[i], iMat, - iVFormat, piFaces, piVertices); + CountVerticesAndFaces(pcScene, pcNode->mChildren[i], iMat, iVFormat, piFaces, piVertices); } } @@ -272,19 +278,6 @@ void PretransformVertices::CollectData(const aiScene *pcScene, const aiNode *pcN } } -// ------------------------------------------------------------------------------------------------ -// Get a list of all vertex formats that occur for a given material index -// The output list contains duplicate elements -void PretransformVertices::GetVFormatList(const aiScene *pcScene, unsigned int iMat, - std::list &aiOut) const { - for (unsigned int i = 0; i < pcScene->mNumMeshes; ++i) { - aiMesh *pcMesh = pcScene->mMeshes[i]; - if (iMat == pcMesh->mMaterialIndex) { - aiOut.push_back(GetMeshVFormat(pcMesh)); - } - } -} - // ------------------------------------------------------------------------------------------------ // Compute the absolute transformation matrices of each node void PretransformVertices::ComputeAbsoluteTransform(aiNode *pcNode) { @@ -297,39 +290,44 @@ void PretransformVertices::ComputeAbsoluteTransform(aiNode *pcNode) { } } +static void normalizeVectorArray(aiVector3D *vectorArrayIn, aiVector3D *vectorArrayOut, size_t numVectors) { + for (size_t i=0; iHasFaces() && mat.Determinant() < 0) { - // Reverse the mesh face winding order - FlipWindingOrderProcess::ProcessMesh(mesh); + // Check for odd negative scale (mirror) + if (mesh->HasFaces() && mat.Determinant() < 0) { + // Reverse the mesh face winding order + FlipWindingOrderProcess::ProcessMesh(mesh); + } + + // Update positions + if (mesh->HasPositions()) { + for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { + mesh->mVertices[i] = mat * mesh->mVertices[i]; } + } - // Update positions - if (mesh->HasPositions()) { + // Update normals and tangents + if (mesh->HasNormals() || mesh->HasTangentsAndBitangents()) { + const aiMatrix3x3 m = aiMatrix3x3(mat).Inverse().Transpose(); + + if (mesh->HasNormals()) { + normalizeVectorArray(mesh->mNormals, mesh->mNormals, mesh->mNumVertices); + } + if (mesh->HasTangentsAndBitangents()) { for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { - mesh->mVertices[i] = mat * mesh->mVertices[i]; - } - } - - // Update normals and tangents - if (mesh->HasNormals() || mesh->HasTangentsAndBitangents()) { - const aiMatrix3x3 m = aiMatrix3x3(mat).Inverse().Transpose(); - - if (mesh->HasNormals()) { - for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { - mesh->mNormals[i] = (m * mesh->mNormals[i]).Normalize(); - } - } - if (mesh->HasTangentsAndBitangents()) { - for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { - mesh->mTangents[i] = (m * mesh->mTangents[i]).Normalize(); - mesh->mBitangents[i] = (m * mesh->mBitangents[i]).Normalize(); - } + mesh->mTangents[i] = (m * mesh->mTangents[i]).Normalize(); + mesh->mBitangents[i] = (m * mesh->mBitangents[i]).Normalize(); } } } @@ -352,40 +350,41 @@ void PretransformVertices::BuildWCSMeshes(std::vector &out, aiMesh **i // yes, we can. mesh->mBones = reinterpret_cast(&node->mTransformation); mesh->mNumBones = UINT_MAX; - } else { + continue; + } - // try to find us in the list of newly created meshes - for (unsigned int n = 0; n < out.size(); ++n) { - aiMesh *ctz = out[n]; - if (ctz->mNumBones == node->mMeshes[i] && *reinterpret_cast(ctz->mBones) == node->mTransformation) { + // try to find us in the list of newly created meshes + for (unsigned int n = 0; n < out.size(); ++n) { + aiMesh *ctz = out[n]; + if (ctz->mNumBones == node->mMeshes[i] && *reinterpret_cast(ctz->mBones) == node->mTransformation) { - // ok, use this one. Update node mesh index - node->mMeshes[i] = numIn + n; - } + // ok, use this one. Update node mesh index + node->mMeshes[i] = numIn + n; } - if (node->mMeshes[i] < numIn) { - // Worst case. Need to operate on a full copy of the mesh - ASSIMP_LOG_INFO("PretransformVertices: Copying mesh due to mismatching transforms"); - aiMesh *ntz; + } + if (node->mMeshes[i] < numIn) { + // Worst case. Need to operate on a full copy of the mesh + ASSIMP_LOG_INFO("PretransformVertices: Copying mesh due to mismatching transforms"); + aiMesh *ntz; - const unsigned int tmp = mesh->mNumBones; // - mesh->mNumBones = 0; - SceneCombiner::Copy(&ntz, mesh); - mesh->mNumBones = tmp; + const unsigned int cacheNumBones = mesh->mNumBones; // + mesh->mNumBones = 0; + SceneCombiner::Copy(&ntz, mesh); + mesh->mNumBones = cacheNumBones; - ntz->mNumBones = node->mMeshes[i]; - ntz->mBones = reinterpret_cast(&node->mTransformation); + ntz->mNumBones = node->mMeshes[i]; + ntz->mBones = reinterpret_cast(&node->mTransformation); - out.push_back(ntz); + out.push_back(ntz); - node->mMeshes[i] = static_cast(numIn + out.size() - 1); - } + node->mMeshes[i] = static_cast(numIn + out.size() - 1); } } // call children - for (unsigned int i = 0; i < node->mNumChildren; ++i) + for (unsigned int i = 0; i < node->mNumChildren; ++i) { BuildWCSMeshes(out, in, numIn, node->mChildren[i]); + } } // ------------------------------------------------------------------------------------------------ @@ -394,8 +393,9 @@ void PretransformVertices::MakeIdentityTransform(aiNode *nd) const { nd->mTransformation = aiMatrix4x4(); // call children - for (unsigned int i = 0; i < nd->mNumChildren; ++i) + for (unsigned int i = 0; i < nd->mNumChildren; ++i) { MakeIdentityTransform(nd->mChildren[i]); + } } // ------------------------------------------------------------------------------------------------ @@ -405,8 +405,27 @@ void PretransformVertices::BuildMeshRefCountArray(const aiNode *nd, unsigned int refs[nd->mMeshes[i]]++; // call children - for (unsigned int i = 0; i < nd->mNumChildren; ++i) + for (unsigned int i = 0; i < nd->mNumChildren; ++i) { BuildMeshRefCountArray(nd->mChildren[i], refs); + } +} + +// ------------------------------------------------------------------------------------------------ +static void appendNewMeshesToScene(aiScene *pScene, std::vector &apcOutMeshes) { + ai_assert(pScene != nullptr); + + if (apcOutMeshes.empty()) { + return; + } + + aiMesh **npp = new aiMesh *[pScene->mNumMeshes + apcOutMeshes.size()]; + + ::memcpy(npp, pScene->mMeshes, sizeof(aiMesh *) * pScene->mNumMeshes); + ::memcpy(npp + pScene->mNumMeshes, &apcOutMeshes[0], sizeof(aiMesh *) * apcOutMeshes.size()); + + pScene->mNumMeshes += static_cast(apcOutMeshes.size()); + delete[] pScene->mMeshes; + pScene->mMeshes = npp; } // ------------------------------------------------------------------------------------------------ @@ -418,12 +437,12 @@ void PretransformVertices::Execute(aiScene *pScene) { if (!pScene->mNumMeshes) return; - const unsigned int iOldMeshes = pScene->mNumMeshes; - const unsigned int iOldAnimationChannels = pScene->mNumAnimations; - const unsigned int iOldNodes = CountNodes(pScene->mRootNode); + const unsigned int oldMeshes = pScene->mNumMeshes; + const unsigned int oldAnimationChannels = pScene->mNumAnimations; + const unsigned int oldNodes = CountNodes(pScene->mRootNode); - if (configTransform) { - pScene->mRootNode->mTransformation = configTransformation * pScene->mRootNode->mTransformation; + if (mConfigTransform) { + pScene->mRootNode->mTransformation = mConfigTransformation * pScene->mRootNode->mTransformation; } // first compute absolute transformation matrices for all nodes @@ -449,22 +468,13 @@ void PretransformVertices::Execute(aiScene *pScene) { // we go on and transform all meshes, if one is referenced by nodes // with different absolute transformations a depth copy of the mesh // is required. - if (configKeepHierarchy) { + if (mConfigKeepHierarchy) { // Hack: store the matrix we're transforming a mesh with in aiMesh::mBones BuildWCSMeshes(apcOutMeshes, pScene->mMeshes, pScene->mNumMeshes, pScene->mRootNode); // ... if new meshes have been generated, append them to the end of the scene - if (apcOutMeshes.size() > 0) { - aiMesh **npp = new aiMesh *[pScene->mNumMeshes + apcOutMeshes.size()]; - - memcpy(npp, pScene->mMeshes, sizeof(aiMesh *) * pScene->mNumMeshes); - memcpy(npp + pScene->mNumMeshes, &apcOutMeshes[0], sizeof(aiMesh *) * apcOutMeshes.size()); - - pScene->mNumMeshes += static_cast(apcOutMeshes.size()); - delete[] pScene->mMeshes; - pScene->mMeshes = npp; - } + appendNewMeshesToScene(pScene, apcOutMeshes); // now iterate through all meshes and transform them to world-space for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) { @@ -488,34 +498,35 @@ void PretransformVertices::Execute(aiScene *pScene) { aiVFormats.sort(); aiVFormats.unique(); for (std::list::const_iterator j = aiVFormats.begin(); j != aiVFormats.end(); ++j) { - unsigned int iVertices = 0; - unsigned int iFaces = 0; - CountVerticesAndFaces(pScene, pScene->mRootNode, i, *j, &iFaces, &iVertices); - if (0 != iFaces && 0 != iVertices) { + unsigned int numVertices = 0u; + unsigned int numFaces = 0u; + CountVerticesAndFaces(pScene, pScene->mRootNode, i, *j, &numFaces, &numVertices); + if (0 != numFaces && 0 != numVertices) { apcOutMeshes.push_back(new aiMesh()); aiMesh *pcMesh = apcOutMeshes.back(); - pcMesh->mNumFaces = iFaces; - pcMesh->mNumVertices = iVertices; - pcMesh->mFaces = new aiFace[iFaces]; - pcMesh->mVertices = new aiVector3D[iVertices]; + pcMesh->mNumFaces = numFaces; + pcMesh->mNumVertices = numVertices; + pcMesh->mFaces = new aiFace[numFaces]; + pcMesh->mVertices = new aiVector3D[numVertices]; pcMesh->mMaterialIndex = i; - if ((*j) & 0x2) pcMesh->mNormals = new aiVector3D[iVertices]; + if ((*j) & 0x2) pcMesh->mNormals = new aiVector3D[numVertices]; if ((*j) & 0x4) { - pcMesh->mTangents = new aiVector3D[iVertices]; - pcMesh->mBitangents = new aiVector3D[iVertices]; + pcMesh->mTangents = new aiVector3D[numVertices]; + pcMesh->mBitangents = new aiVector3D[numVertices]; } - iFaces = 0; - while ((*j) & (0x100 << iFaces)) { - pcMesh->mTextureCoords[iFaces] = new aiVector3D[iVertices]; - if ((*j) & (0x10000 << iFaces)) - pcMesh->mNumUVComponents[iFaces] = 3; - else - pcMesh->mNumUVComponents[iFaces] = 2; - iFaces++; + numFaces = 0; + while ((*j) & (0x100 << numFaces)) { + pcMesh->mTextureCoords[numFaces] = new aiVector3D[numVertices]; + if ((*j) & (0x10000 << numFaces)) { + pcMesh->mNumUVComponents[numFaces] = 3; + } else { + pcMesh->mNumUVComponents[numFaces] = 2; + } + ++numFaces; } - iFaces = 0; - while ((*j) & (0x1000000 << iFaces)) - pcMesh->mColors[iFaces++] = new aiColor4D[iVertices]; + numFaces = 0; + while ((*j) & (0x1000000 << numFaces)) + pcMesh->mColors[numFaces++] = new aiColor4D[numVertices]; // fill the mesh ... unsigned int aiTemp[2] = { 0, 0 }; @@ -593,7 +604,7 @@ void PretransformVertices::Execute(aiScene *pScene) { l->mUp = aiMatrix3x3(nd->mTransformation) * l->mUp; } - if (!configKeepHierarchy) { + if (!mConfigKeepHierarchy) { // now delete all nodes in the scene and build a new // flat node graph with a root node and some level 1 children @@ -644,7 +655,7 @@ void PretransformVertices::Execute(aiScene *pScene) { MakeIdentityTransform(pScene->mRootNode); } - if (configNormalize) { + if (mConfigNormalize) { // compute the boundary of all meshes aiVector3D min, max; MinMaxChooser()(min, max); @@ -674,9 +685,9 @@ void PretransformVertices::Execute(aiScene *pScene) { if (!DefaultLogger::isNullLogger()) { ASSIMP_LOG_DEBUG("PretransformVerticesProcess finished"); - ASSIMP_LOG_INFO("Removed ", iOldNodes, " nodes and ", iOldAnimationChannels, " animation channels (", + ASSIMP_LOG_INFO("Removed ", oldNodes, " nodes and ", oldAnimationChannels, " animation channels (", CountNodes(pScene->mRootNode), " output nodes)"); ASSIMP_LOG_INFO("Kept ", pScene->mNumLights, " lights and ", pScene->mNumCameras, " cameras."); - ASSIMP_LOG_INFO("Moved ", iOldMeshes, " meshes to WCS (number of output meshes: ", pScene->mNumMeshes, ")"); + ASSIMP_LOG_INFO("Moved ", oldMeshes, " meshes to WCS (number of output meshes: ", pScene->mNumMeshes, ")"); } } diff --git a/code/PostProcessing/PretransformVertices.h b/code/PostProcessing/PretransformVertices.h index 7c2b5e99e..69d3d8400 100644 --- a/code/PostProcessing/PretransformVertices.h +++ b/code/PostProcessing/PretransformVertices.h @@ -90,7 +90,7 @@ public: * @param keep true for keep configuration. */ void KeepHierarchy(bool keep) { - configKeepHierarchy = keep; + mConfigKeepHierarchy = keep; } // ------------------------------------------------------------------- @@ -98,7 +98,7 @@ public: * @return ... */ bool IsHierarchyKept() const { - return configKeepHierarchy; + return mConfigKeepHierarchy; } private: @@ -108,7 +108,7 @@ private: // ------------------------------------------------------------------- // Get a bitwise combination identifying the vertex format of a mesh - unsigned int GetMeshVFormat(aiMesh *pcMesh) const; + //unsigned int GetMeshVFormat(aiMesh *pcMesh) const; // ------------------------------------------------------------------- // Count the number of vertices in the whole scene and a given @@ -131,8 +131,8 @@ private: // ------------------------------------------------------------------- // Get a list of all vertex formats that occur for a given material // The output list contains duplicate elements - void GetVFormatList(const aiScene *pcScene, unsigned int iMat, - std::list &aiOut) const; + /*void GetVFormatList(const aiScene *pcScene, unsigned int iMat, + std::list &aiOut) const;*/ // ------------------------------------------------------------------- // Compute the absolute transformation matrices of each node @@ -156,10 +156,10 @@ private: void BuildMeshRefCountArray(const aiNode *nd, unsigned int *refs) const; //! Configuration option: keep scene hierarchy as long as possible - bool configKeepHierarchy; - bool configNormalize; - bool configTransform; - aiMatrix4x4 configTransformation; + bool mConfigKeepHierarchy; + bool mConfigNormalize; + bool mConfigTransform; + aiMatrix4x4 mConfigTransformation; bool mConfigPointCloud; }; diff --git a/code/PostProcessing/ProcessHelper.cpp b/code/PostProcessing/ProcessHelper.cpp index 15f01676c..e55c17648 100644 --- a/code/PostProcessing/ProcessHelper.cpp +++ b/code/PostProcessing/ProcessHelper.cpp @@ -175,10 +175,9 @@ unsigned int GetMeshVFormatUnique(const aiMesh *pcMesh) { // tangents and bitangents if (pcMesh->HasTangentsAndBitangents()) iRet |= 0x4; -#ifdef BOOST_STATIC_ASSERT - BOOST_STATIC_ASSERT(8 >= AI_MAX_NUMBER_OF_COLOR_SETS); - BOOST_STATIC_ASSERT(8 >= AI_MAX_NUMBER_OF_TEXTURECOORDS); -#endif + + static_assert(8 >= AI_MAX_NUMBER_OF_COLOR_SETS); + static_assert(8 >= AI_MAX_NUMBER_OF_TEXTURECOORDS); // texture coordinates unsigned int p = 0; diff --git a/code/PostProcessing/RemoveRedundantMaterials.cpp b/code/PostProcessing/RemoveRedundantMaterials.cpp index dbc3c8822..ea8d154dc 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.cpp +++ b/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -45,7 +43,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // internal headers - #include "RemoveRedundantMaterials.h" #include #include "ProcessHelper.h" @@ -57,35 +54,28 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -RemoveRedundantMatsProcess::RemoveRedundantMatsProcess() -: mConfigFixedMaterials() { - // nothing to do here -} +RemoveRedundantMatsProcess::RemoveRedundantMatsProcess() : mConfigFixedMaterials() {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool RemoveRedundantMatsProcess::IsActive( unsigned int pFlags) const -{ +bool RemoveRedundantMatsProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_RemoveRedundantMaterials) != 0; } // ------------------------------------------------------------------------------------------------ // Setup import properties -void RemoveRedundantMatsProcess::SetupProperties(const Importer* pImp) -{ +void RemoveRedundantMatsProcess::SetupProperties(const Importer* pImp) { // Get value of AI_CONFIG_PP_RRM_EXCLUDE_LIST mConfigFixedMaterials = pImp->GetPropertyString(AI_CONFIG_PP_RRM_EXCLUDE_LIST,""); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void RemoveRedundantMatsProcess::Execute( aiScene* pScene) -{ +void RemoveRedundantMatsProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("RemoveRedundantMatsProcess begin"); unsigned int redundantRemoved = 0, unreferencedRemoved = 0; - if (pScene->mNumMaterials) - { + if (pScene->mNumMaterials) { // Find out which materials are referenced by meshes std::vector abReferenced(pScene->mNumMaterials,false); for (unsigned int i = 0;i < pScene->mNumMeshes;++i) @@ -134,8 +124,7 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) // we do already have a specific hash. This allows us to // determine which materials are identical. uint32_t *aiHashes = new uint32_t[ pScene->mNumMaterials ];; - for (unsigned int i = 0; i < pScene->mNumMaterials;++i) - { + for (unsigned int i = 0; i < pScene->mNumMaterials;++i) { // No mesh is referencing this material, remove it. if (!abReferenced[i]) { ++unreferencedRemoved; @@ -147,8 +136,7 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) // Check all previously mapped materials for a matching hash. // On a match we can delete this material and just make it ref to the same index. uint32_t me = aiHashes[i] = ComputeMaterialHash(pScene->mMaterials[i]); - for (unsigned int a = 0; a < i;++a) - { + for (unsigned int a = 0; a < i;++a) { if (abReferenced[a] && me == aiHashes[a]) { ++redundantRemoved; me = 0; @@ -205,12 +193,9 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) delete[] aiHashes; delete[] aiMappingTable; } - if (redundantRemoved == 0 && unreferencedRemoved == 0) - { + if (redundantRemoved == 0 && unreferencedRemoved == 0) { ASSIMP_LOG_DEBUG("RemoveRedundantMatsProcess finished "); - } - else - { + } else { ASSIMP_LOG_INFO("RemoveRedundantMatsProcess finished. Removed ", redundantRemoved, " redundant and ", unreferencedRemoved, " unused materials."); } diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 00df07090..1bb9196f1 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/PostProcessing/SortByPTypeProcess.cpp b/code/PostProcessing/SortByPTypeProcess.cpp index 394ef15c8..47633dce5 100644 --- a/code/PostProcessing/SortByPTypeProcess.cpp +++ b/code/PostProcessing/SortByPTypeProcess.cpp @@ -99,8 +99,9 @@ void UpdateNodes(const std::vector &replaceMeshIndex, aiNode *node } // call all subnodes recursively - for (unsigned int m = 0; m < node->mNumChildren; ++m) + for (unsigned int m = 0; m < node->mNumChildren; ++m) { UpdateNodes(replaceMeshIndex, node->mChildren[m]); + } } // ------------------------------------------------------------------------------------------------ diff --git a/code/PostProcessing/SplitByBoneCountProcess.cpp b/code/PostProcessing/SplitByBoneCountProcess.cpp index e44a55979..969146fee 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.cpp +++ b/code/PostProcessing/SplitByBoneCountProcess.cpp @@ -57,9 +57,7 @@ using namespace Assimp::Formatter; // ------------------------------------------------------------------------------------------------ // Constructor -SplitByBoneCountProcess::SplitByBoneCountProcess() : mMaxBoneCount(AI_SBBC_DEFAULT_MAX_BONES) { - // empty -} +SplitByBoneCountProcess::SplitByBoneCountProcess() : mMaxBoneCount(AI_SBBC_DEFAULT_MAX_BONES) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag. diff --git a/code/PostProcessing/SplitLargeMeshes.cpp b/code/PostProcessing/SplitLargeMeshes.cpp index 73e0cc5d8..b6e5b772a 100644 --- a/code/PostProcessing/SplitLargeMeshes.cpp +++ b/code/PostProcessing/SplitLargeMeshes.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -40,9 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** - * @file Implementation of the SplitLargeMeshes postprocessing step - */ + /// @file Implementation of the SplitLargeMeshes postprocessing step // internal headers of the post-processing framework #include "SplitLargeMeshes.h" @@ -75,22 +72,22 @@ void SplitLargeMeshesProcess_Triangle::Execute( aiScene* pScene) { this->SplitMesh(a, pScene->mMeshes[a],avList); } - if (avList.size() != pScene->mNumMeshes) { - // it seems something has been split. rebuild the mesh list - delete[] pScene->mMeshes; - pScene->mNumMeshes = (unsigned int)avList.size(); - pScene->mMeshes = new aiMesh*[avList.size()]; - - for (unsigned int i = 0; i < avList.size();++i) { - pScene->mMeshes[i] = avList[i].first; - } - - // now we need to update all nodes - this->UpdateNode(pScene->mRootNode,avList); - ASSIMP_LOG_INFO("SplitLargeMeshesProcess_Triangle finished. Meshes have been split"); - } else { + if (avList.size() == pScene->mNumMeshes) { ASSIMP_LOG_DEBUG("SplitLargeMeshesProcess_Triangle finished. There was nothing to do"); } + + // it seems something has been split. rebuild the mesh list + delete[] pScene->mMeshes; + pScene->mNumMeshes = (unsigned int)avList.size(); + pScene->mMeshes = new aiMesh*[avList.size()]; + + for (unsigned int i = 0; i < avList.size();++i) { + pScene->mMeshes[i] = avList[i].first; + } + + // now we need to update all nodes + this->UpdateNode(pScene->mRootNode,avList); + ASSIMP_LOG_INFO("SplitLargeMeshesProcess_Triangle finished. Meshes have been split"); } // ------------------------------------------------------------------------------------------------ @@ -102,8 +99,7 @@ void SplitLargeMeshesProcess_Triangle::SetupProperties( const Importer* pImp) { // ------------------------------------------------------------------------------------------------ // Update a node after some meshes have been split -void SplitLargeMeshesProcess_Triangle::UpdateNode(aiNode* pcNode, - const std::vector >& avList) { +void SplitLargeMeshesProcess_Triangle::UpdateNode(aiNode* pcNode, const std::vector >& avList) { // for every index in out list build a new entry std::vector aiEntries; aiEntries.reserve(pcNode->mNumMeshes + 1); diff --git a/code/PostProcessing/TextureTransform.cpp b/code/PostProcessing/TextureTransform.cpp index 2ed17f390..3de357c17 100644 --- a/code/PostProcessing/TextureTransform.cpp +++ b/code/PostProcessing/TextureTransform.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -42,8 +41,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file A helper class that processes texture transformations */ - - #include #include #include @@ -494,8 +491,9 @@ void TextureTransformStep::Execute( aiScene* pScene) { ai_assert(nullptr != src); // Copy the data to the destination array - if (dest != src) + if (dest != src) { ::memcpy(dest,src,sizeof(aiVector3D)*mesh->mNumVertices); + } end = dest + mesh->mNumVertices; diff --git a/code/PostProcessing/TriangulateProcess.cpp b/code/PostProcessing/TriangulateProcess.cpp index 52cfa66bf..b4c66b41e 100644 --- a/code/PostProcessing/TriangulateProcess.cpp +++ b/code/PostProcessing/TriangulateProcess.cpp @@ -158,15 +158,13 @@ namespace { // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool TriangulateProcess::IsActive( unsigned int pFlags) const -{ +bool TriangulateProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_Triangulate) != 0; } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void TriangulateProcess::Execute( aiScene* pScene) -{ +void TriangulateProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("TriangulateProcess begin"); bool bHas = false; @@ -187,8 +185,7 @@ void TriangulateProcess::Execute( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Triangulates the given mesh. -bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) -{ +bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) { // Now we have aiMesh::mPrimitiveTypes, so this is only here for test cases if (!pMesh->mPrimitiveTypes) { bool bNeed = false; @@ -218,8 +215,7 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) if( face.mNumIndices <= 3) { numOut++; - } - else { + } else { numOut += face.mNumIndices-2; max_out = std::max(max_out,face.mNumIndices); } @@ -511,22 +507,6 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) #endif num = 0; break; - - /*curOut -= (max-num); // undo all previous work - for (tmp = 0; tmp < max-2; ++tmp) { - aiFace& nface = *curOut++; - - nface.mNumIndices = 3; - if (!nface.mIndices) - nface.mIndices = new unsigned int[3]; - - nface.mIndices[0] = 0; - nface.mIndices[1] = tmp+1; - nface.mIndices[2] = tmp+2; - - } - num = 0; - break;*/ } aiFace& nface = *curOut++; @@ -580,23 +560,6 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) for(aiFace* f = last_face; f != curOut; ) { unsigned int* i = f->mIndices; - // drop dumb 0-area triangles - deactivated for now: - //FindDegenerates post processing step can do the same thing - //if (std::fabs(GetArea2D(temp_verts[i[0]],temp_verts[i[1]],temp_verts[i[2]])) < 1e-5f) { - // ASSIMP_LOG_VERBOSE_DEBUG("Dropping triangle with area 0"); - // --curOut; - - // delete[] f->mIndices; - // f->mIndices = nullptr; - - // for(aiFace* ff = f; ff != curOut; ++ff) { - // ff->mNumIndices = (ff+1)->mNumIndices; - // ff->mIndices = (ff+1)->mIndices; - // (ff+1)->mIndices = nullptr; - // } - // continue; - //} - i[0] = idx[i[0]]; i[1] = idx[i[1]]; i[2] = idx[i[2]]; diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index cae35b895..af4ff788e 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -110,18 +108,21 @@ inline int HasNameMatch(const aiString &in, aiNode *node) { template inline void ValidateDSProcess::DoValidation(T **parray, unsigned int size, const char *firstName, const char *secondName) { // validate all entries - if (size) { - if (!parray) { - ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", - firstName, secondName, size); - } - for (unsigned int i = 0; i < size; ++i) { - if (!parray[i]) { - ReportError("aiScene::%s[%i] is nullptr (aiScene::%s is %i)", - firstName, i, secondName, size); - } - Validate(parray[i]); + if (size == 0) { + return; + } + + if (!parray) { + ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", + firstName, secondName, size); + } + + for (unsigned int i = 0; i < size; ++i) { + if (!parray[i]) { + ReportError("aiScene::%s[%i] is nullptr (aiScene::%s is %i)", + firstName, i, secondName, size); } + Validate(parray[i]); } } @@ -130,25 +131,27 @@ template inline void ValidateDSProcess::DoValidationEx(T **parray, unsigned int size, const char *firstName, const char *secondName) { // validate all entries - if (size) { - if (!parray) { - ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", - firstName, secondName, size); + if (size == 0) { + return; + } + + if (!parray) { + ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", + firstName, secondName, size); + } + for (unsigned int i = 0; i < size; ++i) { + if (!parray[i]) { + ReportError("aiScene::%s[%u] is nullptr (aiScene::%s is %u)", + firstName, i, secondName, size); } - for (unsigned int i = 0; i < size; ++i) { - if (!parray[i]) { - ReportError("aiScene::%s[%u] is nullptr (aiScene::%s is %u)", - firstName, i, secondName, size); - } - Validate(parray[i]); + Validate(parray[i]); - // check whether there are duplicate names - for (unsigned int a = i + 1; a < size; ++a) { - if (parray[i]->mName == parray[a]->mName) { - ReportError("aiScene::%s[%u] has the same name as " - "aiScene::%s[%u]", - firstName, i, secondName, a); - } + // check whether there are duplicate names + for (unsigned int a = i + 1; a < size; ++a) { + if (parray[i]->mName == parray[a]->mName) { + ReportError("aiScene::%s[%u] has the same name as " + "aiScene::%s[%u]", + firstName, i, secondName, a); } } } @@ -229,12 +232,6 @@ void ValidateDSProcess::Execute(aiScene *pScene) { if (pScene->mNumMaterials) { DoValidation(pScene->mMaterials, pScene->mNumMaterials, "mMaterials", "mNumMaterials"); } -#if 0 - // NOTE: ScenePreprocessor generates a default material if none is there - else if (!(mScene->mFlags & AI_SCENE_FLAGS_INCOMPLETE)) { - ReportError("aiScene::mNumMaterials is 0. At least one material must be there"); - } -#endif else if (pScene->mMaterials) { ReportError("aiScene::mMaterials is non-null although there are no materials"); } @@ -267,8 +264,7 @@ void ValidateDSProcess::Validate(const aiCamera *pCamera) { if (pCamera->mClipPlaneFar <= pCamera->mClipPlaneNear) ReportError("aiCamera::mClipPlaneFar must be >= aiCamera::mClipPlaneNear"); - // FIX: there are many 3ds files with invalid FOVs. No reason to - // reject them at all ... a warning is appropriate. + // There are many 3ds files with invalid FOVs. No reason to reject them at all ... a warning is appropriate. if (!pCamera->mHorizontalFOV || pCamera->mHorizontalFOV >= (float)AI_MATH_PI) ReportWarning("%f is not a valid value for aiCamera::mHorizontalFOV", pCamera->mHorizontalFOV); } @@ -362,15 +358,6 @@ void ValidateDSProcess::Validate(const aiMesh *pMesh) { if (face.mIndices[a] >= pMesh->mNumVertices) { ReportError("aiMesh::mFaces[%i]::mIndices[%i] is out of range", i, a); } - // the MSB flag is temporarily used by the extra verbose - // mode to tell us that the JoinVerticesProcess might have - // been executed already. - /*if ( !(this->mScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT ) && !(this->mScene->mFlags & AI_SCENE_FLAGS_ALLOW_SHARED) && - abRefList[face.mIndices[a]]) - { - ReportError("aiMesh::mVertices[%i] is referenced twice - second " - "time by aiMesh::mFaces[%i]::mIndices[%i]",face.mIndices[a],i,a); - }*/ abRefList[face.mIndices[a]] = true; } } @@ -466,7 +453,7 @@ void ValidateDSProcess::Validate(const aiMesh *pMesh, const aiBone *pBone, float this->Validate(&pBone->mName); if (!pBone->mNumWeights) { - //ReportError("aiBone::mNumWeights is zero"); + ReportWarning("aiBone::mNumWeights is zero"); } // check whether all vertices affected by this bone are valid diff --git a/include/assimp/StreamWriter.h b/include/assimp/StreamWriter.h index 1bdfcc650..50e28447c 100644 --- a/include/assimp/StreamWriter.h +++ b/include/assimp/StreamWriter.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -68,8 +66,7 @@ namespace Assimp { */ // -------------------------------------------------------------------------------------------- template -class StreamWriter -{ +class StreamWriter { enum { INITIAL_CAPACITY = 1024 }; diff --git a/include/assimp/Vertex.h b/include/assimp/Vertex.h index b4aa1dd2d..3fc974504 100644 --- a/include/assimp/Vertex.h +++ b/include/assimp/Vertex.h @@ -97,14 +97,20 @@ namespace Assimp { * to *all* vertex components equally. This is useful for stuff like interpolation * or subdivision, but won't work if special handling is required for some vertex components. */ // ------------------------------------------------------------------------------------------------ -class Vertex { +struct Vertex { friend Vertex operator + (const Vertex&,const Vertex&); friend Vertex operator - (const Vertex&,const Vertex&); friend Vertex operator * (const Vertex&,ai_real); friend Vertex operator / (const Vertex&,ai_real); friend Vertex operator * (ai_real, const Vertex&); -public: + aiVector3D position; + aiVector3D normal; + aiVector3D tangent, bitangent; + + aiVector3D texcoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; + aiColor4D colors[AI_MAX_NUMBER_OF_COLOR_SETS]; + Vertex() = default; // ---------------------------------------------------------------------------- @@ -178,7 +184,7 @@ public: } // ---------------------------------------------------------------------------- - /** Convert back to non-interleaved storage */ + /// Convert back to non-interleaved storage void SortBack(aiMesh* out, unsigned int idx) const { ai_assert(idxmNumVertices); out->mVertices[idx] = position; @@ -204,7 +210,7 @@ public: private: // ---------------------------------------------------------------------------- - /** Construct from two operands and a binary operation to combine them */ + /// Construct from two operands and a binary operation to combine them template