Fix: Add missing ahndling for double export in json

pull/4761/head
Kim Kulling 2022-10-18 19:05:04 +02:00
parent a3c209f2ca
commit 07aef23d24
2 changed files with 94 additions and 76 deletions

View File

@ -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: case aiPTI_Float:
if (prop->mDataLength / sizeof(float) > 1) { if (prop->mDataLength / sizeof(float) > 1) {
out.StartArray(); out.StartArray();
for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(float); ++ii) { for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(float); ++ii) {
out.Element(reinterpret_cast<float *>(prop->mData)[ii]); out.Element(reinterpret_cast<float *>(prop->mData)[ii]);
}
out.EndArray();
} else {
out.SimpleValue(*reinterpret_cast<float *>(prop->mData));
} }
out.EndArray(); break;
} else { case aiPTI_Double:
out.SimpleValue(*reinterpret_cast<float *>(prop->mData)); if (prop->mDataLength / sizeof(double) > 1) {
} out.StartArray();
break; for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(double); ++ii) {
out.Element(reinterpret_cast<double*>(prop->mData)[ii]);
case aiPTI_Integer: }
if (prop->mDataLength / sizeof(int) > 1) { out.EndArray();
out.StartArray(); } else {
for (unsigned int ii = 0; ii < prop->mDataLength / sizeof(int); ++ii) { out.SimpleValue(*reinterpret_cast<double*>(prop->mData));
out.Element(reinterpret_cast<int *>(prop->mData)[ii]);
} }
out.EndArray(); break;
} else { case aiPTI_Integer:
out.SimpleValue(*reinterpret_cast<int *>(prop->mData)); if (prop->mDataLength / sizeof(int) > 1) {
} out.StartArray();
break; 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: { case aiPTI_String:
aiString s; {
aiGetMaterialString(&ai, prop->mKey.data, prop->mSemantic, prop->mIndex, &s); aiString s;
out.SimpleValue(s); aiGetMaterialString(&ai, prop->mKey.data, prop->mSemantic, prop->mIndex, &s);
} break; out.SimpleValue(s);
case aiPTI_Buffer: { }
// binary data is written as series of hex-encoded octets break;
out.SimpleValue(prop->mData, prop->mDataLength); case aiPTI_Buffer:
} break; {
default: // binary data is written as series of hex-encoded octets
assert(false); 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__");

View File

@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
Copyright (c) 2006-2022, assimp team Copyright (c) 2006-2022, assimp team
All rights reserved. All rights reserved.
Redistribution and use of this software in source and binary forms, Redistribution and use of this software in source and binary forms,
@ -36,7 +35,6 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------- ----------------------------------------------------------------------
*/ */
@ -55,21 +53,25 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <assimp/defs.h> #include <assimp/defs.h>
// Forward declarations
template <typename TReal> class aiVector3t; template <typename TReal> class aiVector3t;
template <typename TReal> class aiMatrix3x3t; template <typename TReal> class aiMatrix3x3t;
template <typename TReal> class aiMatrix4x4t; template <typename TReal> class aiMatrix4x4t;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** Represents a quaternion in a 4D vector. */ /**
* @brief This class represents a quaternion as a 4D vector.
*/
template <typename TReal> template <typename TReal>
class aiQuaterniont class aiQuaterniont {
{
public: public:
aiQuaterniont() AI_NO_EXCEPT : w(1.0), x(), y(), z() {} aiQuaterniont() AI_NO_EXCEPT : w(1.0), x(), y(), z() {}
aiQuaterniont(TReal pw, TReal px, TReal py, TReal pz) aiQuaterniont(TReal pw, TReal px, TReal py, TReal pz)
: w(pw), x(px), y(py), z(pz) {} : w(pw), x(px), y(py), z(pz) {}
/** Construct from rotation matrix. Result is undefined if the matrix is not orthonormal. */ /**
* @brief Construct from rotation matrix. Result is undefined if the matrix is not orthonormal.
*/
explicit aiQuaterniont( const aiMatrix3x3t<TReal>& pRotMatrix); explicit aiQuaterniont( const aiMatrix3x3t<TReal>& pRotMatrix);
/** Construct from euler angles */ /** Construct from euler angles */
@ -84,8 +86,6 @@ public:
/** Returns a matrix representation of the quaternion */ /** Returns a matrix representation of the quaternion */
aiMatrix3x3t<TReal> GetMatrix() const; aiMatrix3x3t<TReal> GetMatrix() const;
public:
bool operator== (const aiQuaterniont& o) const; bool operator== (const aiQuaterniont& o) const;
bool operator!= (const aiQuaterniont& o) const; bool operator!= (const aiQuaterniont& o) const;
@ -94,23 +94,30 @@ public:
bool Equal(const aiQuaterniont &o, TReal epsilon = ai_epsilon) const; bool Equal(const aiQuaterniont &o, TReal epsilon = ai_epsilon) const;
public: /**
* @brief Will normalize the quaternion representation.
/** Normalize the quaternion */ */
aiQuaterniont& Normalize(); aiQuaterniont& Normalize();
/** Compute quaternion conjugate */ /**
aiQuaterniont& Conjugate (); * @brief Will compute the quaternion conjugate. The result will be stored in the instance.
*/
aiQuaterniont& Conjugate();
/** Rotate a point by this quaternion */ /**
aiVector3t<TReal> Rotate (const aiVector3t<TReal>& in) const; * @brief Rotate a point by this quaternion
*/
aiVector3t<TReal> Rotate(const aiVector3t<TReal>& in) const;
/** Multiply two quaternions */ /**
aiQuaterniont operator* (const aiQuaterniont& two) const; * @brief Multiply two quaternions
* @param two The other quaternion.
* @return The result of the multiplication.
*/
aiQuaterniont operator * (const aiQuaterniont& two) const;
public: /**
* @brief Performs a spherical interpolation between two quaternions and writes the result into the third.
/** Performs a spherical interpolation between two quaternions and writes the result into the third.
* @param pOut Target object to received the interpolated rotation. * @param pOut Target object to received the interpolated rotation.
* @param pStart Start rotation of the interpolation at factor == 0. * @param pStart Start rotation of the interpolation at factor == 0.
* @param pEnd End rotation, factor == 1. * @param pEnd End rotation, factor == 1.
@ -119,13 +126,11 @@ public:
static void Interpolate( aiQuaterniont& pOut, const aiQuaterniont& pStart, static void Interpolate( aiQuaterniont& pOut, const aiQuaterniont& pStart,
const aiQuaterniont& pEnd, TReal pFactor); const aiQuaterniont& pEnd, TReal pFactor);
public:
//! w,x,y,z components of the quaternion //! w,x,y,z components of the quaternion
TReal w, x, y, z; TReal w, x, y, z;
} ; } ;
typedef aiQuaterniont<ai_real> aiQuaternion; using aiQuaternion = aiQuaterniont<ai_real>;
#else #else