Merge branch 'master' into blender2.8
[blender.git] / intern / opensubdiv / opensubdiv_capi.cc
index aed5d4fbd14dd628ccc1920568ddcc3b495b7c55..bb865bc0e0f1e950cf37590f8f5b5e3e57998140 100644 (file)
 
 #include "MEM_guardedalloc.h"
 
+#include <string>
+#include <vector>
+
+using std::string;
+using std::vector;
+
+#define STRINGIFY_ARG(x) "" #x
+#define STRINGIFY_APPEND(a, b) "" a #b
+#define STRINGIFY(x) STRINGIFY_APPEND("", x)
+
 /* **************** Types declaration **************** */
 
 using OpenSubdiv::Osd::GLMeshInterface;
@@ -147,6 +157,38 @@ typedef Mesh<GLVertexBuffer,
 
 namespace {
 
+#if !defined(OPENSUBDIV_VERSION_NUMBER) && !defined(OPENSUBDIV_VERSION_MINOR)
+void stringSplit(vector<string>* tokens,
+                 const string& str,
+                 const string& separators,
+                 bool skip_empty) {
+       size_t token_start = 0, token_length = 0;
+       for (size_t i = 0; i < str.length(); ++i) {
+               const char ch = str[i];
+               if (separators.find(ch) == string::npos) {
+                       /* Append non-separator char to a token. */
+                       ++token_length;
+               } else {
+                       /* Append current token to the list (if any). */
+                       if (token_length > 0 || !skip_empty) {
+                               string token = str.substr(token_start, token_length);
+                               tokens->push_back(token);
+                       }
+                       /* Re-set token pointers, */
+                       token_start = i + 1;
+                       token_length = 0;
+               }
+       }
+       /* Append token which might be at the end of the string. */
+       if ((token_length != 0) ||
+           (!skip_empty && token_start > 0 &&
+            separators.find(str[token_start-1]) != string::npos)) {
+               string token = str.substr(token_start, token_length);
+               tokens->push_back(token);
+       }
+}
+#endif
+
 struct FVarVertex {
        float u, v;
        void Clear() {
@@ -372,5 +414,27 @@ const struct OpenSubdiv_TopologyRefinerDescr *openSubdiv_getGLMeshTopologyRefine
 
 int openSubdiv_getVersionHex(void)
 {
+#if defined(OPENSUBDIV_VERSION_NUMBER)
        return OPENSUBDIV_VERSION_NUMBER;
+#elif defined(OPENSUBDIV_VERSION_MAJOR)
+       return OPENSUBDIV_VERSION_MAJOR * 10000 +
+              OPENSUBDIV_VERSION_MINOR * 100 +
+              OPENSUBDIV_VERSION_PATCH;
+#elif defined(OPENSUBDIV_VERSION)
+       const char* version = STRINGIFY(OPENSUBDIV_VERSION);
+       if (version[0] == 'v') {
+               version += 1;
+       }
+       int major = 0, minor = 0, patch = 0;
+       vector<string> tokens;
+       stringSplit(&tokens, version, "_", true);
+       if (tokens.size() == 3) {
+               major = atoi(tokens[0].c_str());
+               minor = atoi(tokens[1].c_str());
+               patch = atoi(tokens[2].c_str());
+       }
+       return major * 10000 + minor * 100 + patch;
+#else
+       return 0;
+#endif
 }