|
@@ -356,6 +356,53 @@ struct Nullable {
|
|
|
isPresent(true) {}
|
|
|
};
|
|
|
|
|
|
+struct CustomExtension {
|
|
|
+ //
|
|
|
+ // A struct containing custom extension data added to a glTF2 file
|
|
|
+ // Has to contain Object, Array, String, Double, Uint64, and Int64 at a minimum
|
|
|
+ // String, Double, Uint64, and Int64 are stored in the Nullables
|
|
|
+ // Object and Array are stored in the std::vector
|
|
|
+ //
|
|
|
+ std::string name;
|
|
|
+
|
|
|
+ Nullable<std::string> mStringValue;
|
|
|
+ Nullable<double> mDoubleValue;
|
|
|
+ Nullable<uint64_t> mUint64Value;
|
|
|
+ Nullable<int64_t> mInt64Value;
|
|
|
+ Nullable<bool> mBoolValue;
|
|
|
+
|
|
|
+ // std::vector<CustomExtension> handles both Object and Array
|
|
|
+ Nullable<std::vector<CustomExtension>> mValues;
|
|
|
+
|
|
|
+ operator bool() const {
|
|
|
+ return Size() != 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ size_t Size() const {
|
|
|
+ if (mValues.isPresent) {
|
|
|
+ return mValues.value.size();
|
|
|
+ } else if (mStringValue.isPresent || mDoubleValue.isPresent || mUint64Value.isPresent || mInt64Value.isPresent || mBoolValue.isPresent) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ CustomExtension() = default;
|
|
|
+
|
|
|
+ ~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
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
//! Base class for all glTF top-level objects
|
|
|
struct Object {
|
|
|
int index; //!< The index of this object within its property container
|
|
@@ -363,6 +410,8 @@ struct Object {
|
|
|
std::string id; //!< The globally unique ID used to reference this object
|
|
|
std::string name; //!< The user-defined name of this object
|
|
|
|
|
|
+ CustomExtension customExtensions;
|
|
|
+
|
|
|
//! Objects marked as special are not exported (used to emulate the binary body buffer)
|
|
|
virtual bool IsSpecial() const { return false; }
|
|
|
|
|
@@ -377,6 +426,8 @@ struct Object {
|
|
|
inline Value *FindArray(Value &val, const char *id);
|
|
|
inline Value *FindObject(Value &val, const char *id);
|
|
|
inline Value *FindExtension(Value &val, const char *extensionId);
|
|
|
+
|
|
|
+ inline void ReadExtensions(Value &val);
|
|
|
};
|
|
|
|
|
|
//
|
|
@@ -834,50 +885,6 @@ struct Mesh : public Object {
|
|
|
void Read(Value &pJSON_Object, Asset &pAsset_Root);
|
|
|
};
|
|
|
|
|
|
-struct CustomExtension : public Object {
|
|
|
- //
|
|
|
- // A struct containing custom extension data added to a glTF2 file
|
|
|
- // Has to contain Object, Array, String, Double, Uint64, and Int64 at a minimum
|
|
|
- // String, Double, Uint64, and Int64 are stored in the Nullables
|
|
|
- // Object and Array are stored in the std::vector
|
|
|
- //
|
|
|
-
|
|
|
- Nullable<std::string> mStringValue;
|
|
|
- Nullable<double> mDoubleValue;
|
|
|
- Nullable<uint64_t> mUint64Value;
|
|
|
- Nullable<int64_t> mInt64Value;
|
|
|
- Nullable<bool> mBoolValue;
|
|
|
-
|
|
|
- // std::vector<CustomExtension> handles both Object and Array
|
|
|
- Nullable<std::vector<CustomExtension>> mValues;
|
|
|
-
|
|
|
- operator bool() const {
|
|
|
- return Size() != 0;
|
|
|
- }
|
|
|
-
|
|
|
- size_t Size() const {
|
|
|
- if (mValues.isPresent) {
|
|
|
- return mValues.value.size();
|
|
|
- } else if (mStringValue.isPresent || mDoubleValue.isPresent || mUint64Value.isPresent || mInt64Value.isPresent || mBoolValue.isPresent) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- CustomExtension() = default;
|
|
|
-
|
|
|
- CustomExtension(const CustomExtension &other)
|
|
|
- : Object(other)
|
|
|
- , mStringValue(other.mStringValue)
|
|
|
- , mDoubleValue(other.mDoubleValue)
|
|
|
- , mUint64Value(other.mUint64Value)
|
|
|
- , mInt64Value(other.mInt64Value)
|
|
|
- , mBoolValue(other.mBoolValue)
|
|
|
- , mValues(other.mValues)
|
|
|
- {
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
struct Node : public Object {
|
|
|
std::vector<Ref<Node>> children;
|
|
|
std::vector<Ref<Mesh>> meshes;
|
|
@@ -896,8 +903,6 @@ struct Node : public Object {
|
|
|
|
|
|
Ref<Node> parent; //!< This is not part of the glTF specification. Used as a helper.
|
|
|
|
|
|
- CustomExtension extensions;
|
|
|
-
|
|
|
Node() {}
|
|
|
void Read(Value &obj, Asset &r);
|
|
|
};
|