|
@@ -10,6 +10,7 @@ Licensed under a 3-clause BSD license. See the LICENSE file for more information
|
|
#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER
|
|
#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER
|
|
|
|
|
|
#include <assimp/scene.h>
|
|
#include <assimp/scene.h>
|
|
|
|
+#include <assimp/ai_assert.h>
|
|
#include <assimp/Exporter.hpp>
|
|
#include <assimp/Exporter.hpp>
|
|
#include <assimp/IOStream.hpp>
|
|
#include <assimp/IOStream.hpp>
|
|
#include <assimp/IOSystem.hpp>
|
|
#include <assimp/IOSystem.hpp>
|
|
@@ -23,16 +24,15 @@ Licensed under a 3-clause BSD license. See the LICENSE file for more information
|
|
|
|
|
|
#define CURRENT_FORMAT_VERSION 100
|
|
#define CURRENT_FORMAT_VERSION 100
|
|
|
|
|
|
-// grab scoped_ptr from assimp to avoid a dependency on boost.
|
|
|
|
-//#include <assimp/../../code/BoostWorkaround/boost/scoped_ptr.hpp>
|
|
|
|
-
|
|
|
|
#include "mesh_splitter.h"
|
|
#include "mesh_splitter.h"
|
|
|
|
|
|
extern "C" {
|
|
extern "C" {
|
|
-#include "cencode.h"
|
|
|
|
|
|
+# include "cencode.h"
|
|
}
|
|
}
|
|
|
|
+
|
|
namespace Assimp {
|
|
namespace Assimp {
|
|
|
|
|
|
|
|
+// Forward declarations
|
|
void ExportAssimp2Json(const char *, Assimp::IOSystem *, const aiScene *, const Assimp::ExportProperties *);
|
|
void ExportAssimp2Json(const char *, Assimp::IOSystem *, const aiScene *, const Assimp::ExportProperties *);
|
|
|
|
|
|
// small utility class to simplify serializing the aiScene to Json
|
|
// small utility class to simplify serializing the aiScene to Json
|
|
@@ -179,7 +179,6 @@ private:
|
|
// escape backslashes and single quotes, both would render the JSON invalid if left as is
|
|
// escape backslashes and single quotes, both would render the JSON invalid if left as is
|
|
t.reserve(s.length);
|
|
t.reserve(s.length);
|
|
for (size_t i = 0; i < s.length; ++i) {
|
|
for (size_t i = 0; i < s.length; ++i) {
|
|
-
|
|
|
|
if (s.data[i] == '\\' || s.data[i] == '\'' || s.data[i] == '\"') {
|
|
if (s.data[i] == '\\' || s.data[i] == '\'' || s.data[i] == '\"') {
|
|
t.push_back('\\');
|
|
t.push_back('\\');
|
|
}
|
|
}
|
|
@@ -241,7 +240,7 @@ private:
|
|
unsigned int flags;
|
|
unsigned int flags;
|
|
};
|
|
};
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiVector3D &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiVector3D &ai, bool is_elem = true) {
|
|
out.StartArray(is_elem);
|
|
out.StartArray(is_elem);
|
|
out.Element(ai.x);
|
|
out.Element(ai.x);
|
|
out.Element(ai.y);
|
|
out.Element(ai.y);
|
|
@@ -249,7 +248,7 @@ void Write(JSONWriter &out, const aiVector3D &ai, bool is_elem = true) {
|
|
out.EndArray();
|
|
out.EndArray();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiQuaternion &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiQuaternion &ai, bool is_elem = true) {
|
|
out.StartArray(is_elem);
|
|
out.StartArray(is_elem);
|
|
out.Element(ai.w);
|
|
out.Element(ai.w);
|
|
out.Element(ai.x);
|
|
out.Element(ai.x);
|
|
@@ -258,7 +257,7 @@ void Write(JSONWriter &out, const aiQuaternion &ai, bool is_elem = true) {
|
|
out.EndArray();
|
|
out.EndArray();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiColor3D &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiColor3D &ai, bool is_elem = true) {
|
|
out.StartArray(is_elem);
|
|
out.StartArray(is_elem);
|
|
out.Element(ai.r);
|
|
out.Element(ai.r);
|
|
out.Element(ai.g);
|
|
out.Element(ai.g);
|
|
@@ -266,7 +265,7 @@ void Write(JSONWriter &out, const aiColor3D &ai, bool is_elem = true) {
|
|
out.EndArray();
|
|
out.EndArray();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiMatrix4x4 &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiMatrix4x4 &ai, bool is_elem = true) {
|
|
out.StartArray(is_elem);
|
|
out.StartArray(is_elem);
|
|
for (unsigned int x = 0; x < 4; ++x) {
|
|
for (unsigned int x = 0; x < 4; ++x) {
|
|
for (unsigned int y = 0; y < 4; ++y) {
|
|
for (unsigned int y = 0; y < 4; ++y) {
|
|
@@ -276,7 +275,7 @@ void Write(JSONWriter &out, const aiMatrix4x4 &ai, bool is_elem = true) {
|
|
out.EndArray();
|
|
out.EndArray();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiBone &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiBone &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("name");
|
|
out.Key("name");
|
|
@@ -297,7 +296,7 @@ void Write(JSONWriter &out, const aiBone &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiFace &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiFace &ai, bool is_elem = true) {
|
|
out.StartArray(is_elem);
|
|
out.StartArray(is_elem);
|
|
for (unsigned int i = 0; i < ai.mNumIndices; ++i) {
|
|
for (unsigned int i = 0; i < ai.mNumIndices; ++i) {
|
|
out.Element(ai.mIndices[i]);
|
|
out.Element(ai.mIndices[i]);
|
|
@@ -305,7 +304,7 @@ void Write(JSONWriter &out, const aiFace &ai, bool is_elem = true) {
|
|
out.EndArray();
|
|
out.EndArray();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiMesh &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiMesh &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("name");
|
|
out.Key("name");
|
|
@@ -416,7 +415,7 @@ void Write(JSONWriter &out, const aiMesh &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiNode &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiNode &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("name");
|
|
out.Key("name");
|
|
@@ -446,7 +445,7 @@ void Write(JSONWriter &out, const aiNode &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiMaterial &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiMaterial &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("properties");
|
|
out.Key("properties");
|
|
@@ -466,41 +465,55 @@ void Write(JSONWriter &out, const aiMaterial &ai, bool is_elem = true) {
|
|
|
|
|
|
out.Key("value");
|
|
out.Key("value");
|
|
switch (prop->mType) {
|
|
switch (prop->mType) {
|
|
- case aiPTI_Float:
|
|
|
|
- if (prop->mDataLength / sizeof(float) > 1) {
|
|
|
|
- out.StartArray();
|
|
|
|
- for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(float); ++ii) {
|
|
|
|
- out.Element(reinterpret_cast<float *>(prop->mData)[ii]);
|
|
|
|
|
|
+ case aiPTI_Float:
|
|
|
|
+ if (prop->mDataLength / sizeof(float) > 1) {
|
|
|
|
+ out.StartArray();
|
|
|
|
+ for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(float); ++ii) {
|
|
|
|
+ out.Element(reinterpret_cast<float *>(prop->mData)[ii]);
|
|
|
|
+ }
|
|
|
|
+ out.EndArray();
|
|
|
|
+ } else {
|
|
|
|
+ out.SimpleValue(*reinterpret_cast<float *>(prop->mData));
|
|
}
|
|
}
|
|
- out.EndArray();
|
|
|
|
- } else {
|
|
|
|
- out.SimpleValue(*reinterpret_cast<float *>(prop->mData));
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case aiPTI_Integer:
|
|
|
|
- if (prop->mDataLength / sizeof(int) > 1) {
|
|
|
|
- out.StartArray();
|
|
|
|
- for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(int); ++ii) {
|
|
|
|
- out.Element(reinterpret_cast<int *>(prop->mData)[ii]);
|
|
|
|
|
|
+ break;
|
|
|
|
+ case aiPTI_Double:
|
|
|
|
+ if (prop->mDataLength / sizeof(double) > 1) {
|
|
|
|
+ out.StartArray();
|
|
|
|
+ for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(double); ++ii) {
|
|
|
|
+ out.Element(reinterpret_cast<double*>(prop->mData)[ii]);
|
|
|
|
+ }
|
|
|
|
+ out.EndArray();
|
|
|
|
+ } else {
|
|
|
|
+ out.SimpleValue(*reinterpret_cast<double*>(prop->mData));
|
|
}
|
|
}
|
|
- out.EndArray();
|
|
|
|
- } else {
|
|
|
|
- out.SimpleValue(*reinterpret_cast<int *>(prop->mData));
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case aiPTI_String: {
|
|
|
|
- aiString s;
|
|
|
|
- aiGetMaterialString(&ai, prop->mKey.data, prop->mSemantic, prop->mIndex, &s);
|
|
|
|
- out.SimpleValue(s);
|
|
|
|
- } break;
|
|
|
|
- case aiPTI_Buffer: {
|
|
|
|
- // binary data is written as series of hex-encoded octets
|
|
|
|
- out.SimpleValue(prop->mData, prop->mDataLength);
|
|
|
|
- } break;
|
|
|
|
- default:
|
|
|
|
- assert(false);
|
|
|
|
|
|
+ break;
|
|
|
|
+ case aiPTI_Integer:
|
|
|
|
+ if (prop->mDataLength / sizeof(int) > 1) {
|
|
|
|
+ out.StartArray();
|
|
|
|
+ for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(int); ++ii) {
|
|
|
|
+ out.Element(reinterpret_cast<int *>(prop->mData)[ii]);
|
|
|
|
+ }
|
|
|
|
+ out.EndArray();
|
|
|
|
+ } else {
|
|
|
|
+ out.SimpleValue(*reinterpret_cast<int *>(prop->mData));
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case aiPTI_String:
|
|
|
|
+ {
|
|
|
|
+ aiString s;
|
|
|
|
+ aiGetMaterialString(&ai, prop->mKey.data, prop->mSemantic, prop->mIndex, &s);
|
|
|
|
+ out.SimpleValue(s);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case aiPTI_Buffer:
|
|
|
|
+ {
|
|
|
|
+ // binary data is written as series of hex-encoded octets
|
|
|
|
+ out.SimpleValue(prop->mData, prop->mDataLength);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ai_assert(false);
|
|
}
|
|
}
|
|
|
|
|
|
out.EndObj();
|
|
out.EndObj();
|
|
@@ -510,7 +523,7 @@ void Write(JSONWriter &out, const aiMaterial &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiTexture &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiTexture &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("width");
|
|
out.Key("width");
|
|
@@ -546,7 +559,7 @@ void Write(JSONWriter &out, const aiTexture &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiLight &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiLight &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("name");
|
|
out.Key("name");
|
|
@@ -594,7 +607,7 @@ void Write(JSONWriter &out, const aiLight &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiNodeAnim &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiNodeAnim &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("name");
|
|
out.Key("name");
|
|
@@ -647,7 +660,7 @@ void Write(JSONWriter &out, const aiNodeAnim &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiAnimation &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiAnimation &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("name");
|
|
out.Key("name");
|
|
@@ -668,7 +681,7 @@ void Write(JSONWriter &out, const aiAnimation &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiCamera &ai, bool is_elem = true) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiCamera &ai, bool is_elem = true) {
|
|
out.StartObj(is_elem);
|
|
out.StartObj(is_elem);
|
|
|
|
|
|
out.Key("name");
|
|
out.Key("name");
|
|
@@ -695,7 +708,7 @@ void Write(JSONWriter &out, const aiCamera &ai, bool is_elem = true) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void WriteFormatInfo(JSONWriter &out) {
|
|
|
|
|
|
+static void WriteFormatInfo(JSONWriter &out) {
|
|
out.StartObj();
|
|
out.StartObj();
|
|
out.Key("format");
|
|
out.Key("format");
|
|
out.SimpleValue("\"assimp2json\"");
|
|
out.SimpleValue("\"assimp2json\"");
|
|
@@ -704,7 +717,7 @@ void WriteFormatInfo(JSONWriter &out) {
|
|
out.EndObj();
|
|
out.EndObj();
|
|
}
|
|
}
|
|
|
|
|
|
-void Write(JSONWriter &out, const aiScene &ai) {
|
|
|
|
|
|
+static void Write(JSONWriter &out, const aiScene &ai) {
|
|
out.StartObj();
|
|
out.StartObj();
|
|
|
|
|
|
out.Key("__metadata__");
|
|
out.Key("__metadata__");
|