summaryrefslogtreecommitdiff
path: root/libs/assimp/code/AssetLib/Obj/ObjTools.h
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-04-16 11:55:09 -0500
committersanine <sanine.not@pm.me>2022-04-16 11:55:09 -0500
commitdb81b925d776103326128bf629cbdda576a223e7 (patch)
tree58bea8155c686733310009f6bed7363f91fbeb9d /libs/assimp/code/AssetLib/Obj/ObjTools.h
parent55860037b14fb3893ba21cf2654c83d349cc1082 (diff)
move 3rd-party librarys into libs/ and add built-in honeysuckle
Diffstat (limited to 'libs/assimp/code/AssetLib/Obj/ObjTools.h')
-rw-r--r--libs/assimp/code/AssetLib/Obj/ObjTools.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/libs/assimp/code/AssetLib/Obj/ObjTools.h b/libs/assimp/code/AssetLib/Obj/ObjTools.h
new file mode 100644
index 0000000..9e57a1c
--- /dev/null
+++ b/libs/assimp/code/AssetLib/Obj/ObjTools.h
@@ -0,0 +1,284 @@
+/*
+Open Asset Import Library (assimp)
+----------------------------------------------------------------------
+
+Copyright (c) 2006-2021, 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 ObjTools.h
+ * @brief Some helpful templates for text parsing
+ */
+#ifndef OBJ_TOOLS_H_INC
+#define OBJ_TOOLS_H_INC
+
+#include <assimp/ParsingUtils.h>
+#include <assimp/fast_atof.h>
+#include <vector>
+
+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.
+ * @return true, if the end of the buffer is reached.
+ */
+template <class char_t>
+inline bool isEndOfBuffer(char_t it, char_t end) {
+ if (it == end) {
+ return true;
+ }
+ --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
+ * @return Pointer to next space
+ */
+template <class Char_T>
+inline Char_T getNextWord(Char_T pBuffer, Char_T pEnd) {
+ while (!isEndOfBuffer(pBuffer, pEnd)) {
+ if (!IsSpaceOrNewLine(*pBuffer) || IsLineEnd(*pBuffer)) {
+ break;
+ }
+ ++pBuffer;
+ }
+
+ return pBuffer;
+}
+
+/**
+ * @brief Returns pointer a next token
+ * @param[in] pBuffer Pointer to data buffer
+ * @param[in] pEnd Pointer to end of buffer
+ * @return Pointer to next token
+ */
+template <class Char_T>
+inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd) {
+ while (!isEndOfBuffer(pBuffer, pEnd)) {
+ if (IsSpaceOrNewLine(*pBuffer)) {
+ break;
+ }
+ ++pBuffer;
+ }
+ 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
+ * @param[out] uiLine Current line number in format
+ * @return Current-iterator with new position
+ */
+template <class char_t>
+inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine) {
+ while (!isEndOfBuffer(it, end) && !IsLineEnd(*it)) {
+ ++it;
+ }
+
+ if (it != end) {
+ ++it;
+ ++uiLine;
+ }
+ // fix .. from time to time there are spaces at the beginning of a material line
+ while (it != end && (*it == '\t' || *it == ' ')) {
+ ++it;
+ }
+
+ 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
+ * @param[in] end set to end of scratch buffer for readout
+ * @param[out] name Separated name
+ * @return Current-iterator with new position
+ */
+template <class char_t>
+inline char_t getName(char_t it, char_t end, std::string &name) {
+ name = "";
+ if (isEndOfBuffer(it, end)) {
+ return end;
+ }
+
+ char *pStart = &(*it);
+ while (!isEndOfBuffer(it, end) && !IsLineEnd(*it)) {
+ ++it;
+ }
+
+ while (IsSpace(*it)) {
+ --it;
+ }
+ // Get name
+ // if there is no name, and the previous char is a separator, come back to start
+ while (&(*it) < pStart) {
+ ++it;
+ }
+ 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
+ * @param end set to end of scratch buffer for readout
+ * @param name Separated name
+ * @return Current-iterator with new position
+ */
+template <class char_t>
+inline char_t getNameNoSpace(char_t it, char_t end, std::string &name) {
+ name = "";
+ if (isEndOfBuffer(it, end)) {
+ return end;
+ }
+
+ char *pStart = &(*it);
+ while (!isEndOfBuffer(it, end) && !IsLineEnd(*it) && !IsSpaceOrNewLine(*it)) {
+ ++it;
+ }
+
+ while (isEndOfBuffer(it, end) || IsLineEnd(*it) || IsSpaceOrNewLine(*it)) {
+ --it;
+ }
+ ++it;
+
+ // Get name
+ // if there is no name, and the previous char is a separator, come back to start
+ while (&(*it) < pStart) {
+ ++it;
+ }
+ std::string strName(pStart, &(*it));
+ 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
+ * @param[in] pBuffer Buffer for next word
+ * @param[in] length Buffer length
+ * @return Current-iterator with new position
+ */
+template <class char_t>
+inline char_t CopyNextWord(char_t it, char_t end, char *pBuffer, size_t length) {
+ size_t index = 0;
+ it = getNextWord<char_t>(it, end);
+ while (!IsSpaceOrNewLine(*it) && !isEndOfBuffer(it, end)) {
+ pBuffer[index] = *it;
+ ++index;
+ if (index == length - 1) {
+ break;
+ }
+ ++it;
+ }
+ pBuffer[index] = '\0';
+ 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
+ * @param[out] value Separated float value.
+ * @return Current-iterator with new position
+ */
+template <class char_t>
+inline char_t getFloat(char_t it, char_t end, ai_real &value) {
+ static const size_t BUFFERSIZE = 1024;
+ char buffer[BUFFERSIZE];
+ it = CopyNextWord<char_t>(it, end, buffer, BUFFERSIZE);
+ value = (ai_real)fast_atof(buffer);
+
+ return it;
+}
+
+/**
+ * @brief Will remove white-spaces for a string.
+ * @param[in] str The string to clean
+ * @return The trimmed string.
+ */
+template <class string_type>
+inline string_type trim_whitespaces(string_type str) {
+ while (!str.empty() && IsSpace(str[0])) {
+ str.erase(0);
+ }
+ while (!str.empty() && IsSpace(str[str.length() - 1])) {
+ str.erase(str.length() - 1);
+ }
+ return str;
+}
+
+/**
+ * @brief Checks for a line-end.
+ * @param[in] it Current iterator in string.
+ * @param[in] end End of the string.
+ * @return The trimmed string.
+ */
+template <class T>
+bool hasLineEnd(T it, T end) {
+ bool hasLineEnd = false;
+ while (!isEndOfBuffer(it, end)) {
+ ++it;
+ if (IsLineEnd(it)) {
+ hasLineEnd = true;
+ break;
+ }
+ }
+
+ return hasLineEnd;
+}
+
+} // Namespace Assimp
+
+#endif // OBJ_TOOLS_H_INC