From e2c1c416a2ff94fb38cfed9de6f829c2387238ec Mon Sep 17 00:00:00 2001 From: Alex Chi Date: Mon, 12 Mar 2018 15:56:39 +0800 Subject: [PATCH] support KHR_draco_mesh_compression and KHR_materials_pbrSpecularGlossiness --- .gitignore | 4 +- .gitlab-ci.yml | 16 +- .travis.yml | 4 +- external/glTF | 2 +- include/libgltf/libgltf.h | 140 +- ...undiFish.gltf => glTF-BarramundiFish.gltf} | 0 .../glTF-Draco-BarramundiFish.gltf | 151 ++ ...F-pbrSpecularGlossinessBarramundiFish.gltf | 189 ++ source/libgltf/libgltf.cpp | 47 +- source/libgltf/libgltfparser.cpp | 1657 +++++++++++------ source/libgltf/libgltfparser.h | 80 + .../codes/extension.schema.json.function.cpp | 0 tools/batch/codes/extension.schema.json.h | 1 + .../extension.schema.json.parser.from.cpp | 14 + .../codes/extension.schema.json.parser.to.cpp | 22 + .../codes/extension.schema.json.variable.cpp | 1 + tools/batch/glTF_2.0_schema.ini | 29 + tools/batch/update_parser_by_scheme.bat | 6 +- tools/batch/update_parser_by_scheme.sh | 10 +- tools/jsonschematoc11/__init__.py | 9 +- tools/jsonschematoc11/__main__.py | 9 +- tools/jsonschematoc11/c11types/__init__.py | 3 +- tools/jsonschematoc11/c11types/c11type.py | 7 + .../jsonschematoc11/c11types/c11typearray.py | 4 +- tools/jsonschematoc11/c11types/c11typebool.py | 6 +- .../c11types/c11typeinteger.py | 6 +- tools/jsonschematoc11/c11types/c11typemap.py | 4 +- .../jsonschematoc11/c11types/c11typenumber.py | 4 +- .../jsonschematoc11/c11types/c11typestring.py | 6 +- .../jsonschematoc11/c11types/c11typestruct.py | 153 +- tools/jsonschematoc11/c11types/c11variable.py | 11 +- tools/jsonschematoc11/jsonschematoc11.py | 154 +- 32 files changed, 2060 insertions(+), 689 deletions(-) rename resource/example-2.0/{BarramundiFish.gltf => glTF-BarramundiFish.gltf} (100%) create mode 100644 resource/example-2.0/glTF-Draco-BarramundiFish.gltf create mode 100644 resource/example-2.0/glTF-pbrSpecularGlossinessBarramundiFish.gltf create mode 100644 tools/batch/codes/extension.schema.json.function.cpp create mode 100644 tools/batch/codes/extension.schema.json.h create mode 100644 tools/batch/codes/extension.schema.json.parser.from.cpp create mode 100644 tools/batch/codes/extension.schema.json.parser.to.cpp create mode 100644 tools/batch/codes/extension.schema.json.variable.cpp create mode 100644 tools/batch/glTF_2.0_schema.ini diff --git a/.gitignore b/.gitignore index 0b556a1..3a69ea2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -/.vscode +/**/.vs +/**/.vscode + /output /build diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 512a889..ec7c2e6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -33,7 +33,9 @@ test_win32: - 'cd build' - 'cmake -G "Visual Studio 14 2015" ../' - 'msbuild libgltf.sln /t:Rebuild /p:Configuration="Debug" /p:Platform="Win32"' - - '..\output\bin\win32\Debug\runtest.exe ..\resource\example-2.0\BarramundiFish.gltf' + - '..\output\bin\win32\Debug\runtest.exe ..\resource\example-2.0\glTF-BarramundiFish.gltf' + - '..\output\bin\win32\Debug\runtest.exe ..\resource\example-2.0\glTF-Draco-BarramundiFish.gltf' + - '..\output\bin\win32\Debug\runtest.exe ..\resource\example-2.0\glTF-pbrSpecularGlossinessBarramundiFish.gltf' - 'cd ../' tags: - win32 @@ -50,7 +52,9 @@ test_win64: - 'cd build' - 'cmake -G "Visual Studio 14 2015 Win64" ../' - 'msbuild libgltf.sln /t:Rebuild /p:Configuration="Debug" /p:Platform="x64"' - - '..\output\bin\win64\Debug\runtest.exe ..\resource\example-2.0\BarramundiFish.gltf' + - '..\output\bin\win64\Debug\runtest.exe ..\resource\example-2.0\glTF-BarramundiFish.gltf' + - '..\output\bin\win64\Debug\runtest.exe ..\resource\example-2.0\glTF-Draco-BarramundiFish.gltf' + - '..\output\bin\win64\Debug\runtest.exe ..\resource\example-2.0\glTF-pbrSpecularGlossinessBarramundiFish.gltf' - 'cd ../' tags: - win64 @@ -66,8 +70,10 @@ test_linux: - 'make' - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls' - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/nothing.gltf' + - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/glTF-BarramundiFish.gltf' + - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/glTF-Draco-BarramundiFish.gltf' + - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/glTF-pbrSpecularGlossinessBarramundiFish.gltf' - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/AnimatedMorphCube.gltf' - - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/BarramundiFish.gltf' - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/BoxAnimated.gltf' - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/Cameras.gltf' - 'valgrind --leak-check=full --show-leak-kinds=all ./../output/bin/linux/runtest --coveralls ../resource/example-2.0/DamagedHelmet.Embedded.gltf' @@ -90,7 +96,9 @@ test_macos: - 'cd build' - 'cmake -G "Unix Makefiles" ../' - 'make' - - './../output/bin/macos/runtest ../resource/example-2.0/BarramundiFish.gltf' + - './../output/bin/macos/runtest ../resource/example-2.0/glTF-BarramundiFish.gltf' + - './../output/bin/macos/runtest ../resource/example-2.0/glTF-Draco-BarramundiFish.gltf' + - './../output/bin/macos/runtest ../resource/example-2.0/glTF-pbrSpecularGlossinessBarramundiFish.gltf' - 'cd ../' tags: - macos diff --git a/.travis.yml b/.travis.yml index cdfd023..b90a97d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,8 +31,10 @@ script: after_success: - if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls; fi - if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./nothing.gltf; fi +- if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/glTF-BarramundiFish.gltf; fi +- if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/glTF-Draco-BarramundiFish.gltf; fi +- if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/glTF-pbrSpecularGlossinessBarramundiFish.gltf; fi - if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/AnimatedMorphCube.gltf; fi -- if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/BarramundiFish.gltf; fi - if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/BoxAnimated.gltf; fi - if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/Cameras.gltf; fi - if [ $RUN_COVERALLS == true ]; then ./output/bin/linux/runtest --coveralls ./resource/example-2.0/DamagedHelmet.Embedded.gltf; fi diff --git a/external/glTF b/external/glTF index d76ef06..9350e5b 160000 --- a/external/glTF +++ b/external/glTF @@ -1 +1 @@ -Subproject commit d76ef06a38f2190ce0b1e5faef39053dd78f9e03 +Subproject commit 9350e5bc8fc7adf7b06f9fa42f3fa43ce1b62df8 diff --git a/include/libgltf/libgltf.h b/include/libgltf/libgltf.h index 5eec812..fd44663 100644 --- a/include/libgltf/libgltf.h +++ b/include/libgltf/libgltf.h @@ -6,27 +6,36 @@ #include #include -namespace libgltf -{ +#define LIBGLTF_MAJOR_VERSION 0 +#define LIBGLTF_MINOR_VERSION 1 +#define LIBGLTF_PATCH_VERSION 0 + #if defined(LIBGLTF_USE_WCHAR) - typedef std::wstring GLTFString; +typedef std::wstring GLTFString; #else - typedef std::string GLTFString; +typedef std::string GLTFString; #endif +namespace libgltf +{ struct SGlTF; bool operator<<(std::shared_ptr& _pGlTF, const GLTFString& _sContent); bool operator>>(const std::shared_ptr& _pGlTF, GLTFString& _sContent); + struct SObject + { + SObject(); + GLTFString schemaType; + }; /*! * struct: SGlTFProperty */ - struct SGlTFProperty + struct SGlTFProperty : SObject { SGlTFProperty(); // Check valid - operator bool() const; + virtual operator bool() const; std::shared_ptr extras; std::shared_ptr extensions; @@ -40,7 +49,7 @@ namespace libgltf SGlTFChildofRootProperty(); // Check valid - operator bool() const; + virtual operator bool() const; // The user-defined name of this object. GLTFString name; @@ -55,7 +64,7 @@ namespace libgltf SMaterial(); // Check valid - operator bool() const; + virtual operator bool() const; // The alpha cutoff value of the material. float alphaCutoff; @@ -84,7 +93,7 @@ namespace libgltf SAsset(); // Check valid - operator bool() const; + virtual operator bool() const; // The minimum glTF version that this asset targets. GLTFString minVersion; @@ -105,7 +114,7 @@ namespace libgltf SSampler(); // Check valid - operator bool() const; + virtual operator bool() const; // s wrapping mode. int32_t wrapS; @@ -126,7 +135,7 @@ namespace libgltf SAnimationSampler(); // Check valid - operator bool() const; + virtual operator bool() const; // The index of an accessor containing keyframe input values, e.g., time. std::shared_ptr input; @@ -140,13 +149,12 @@ namespace libgltf * struct: SExtras * Application-specific data. */ - struct SExtras + struct SExtras : SObject { SExtras(); // Check valid - operator bool() const; - + virtual operator bool() const; }; /*! @@ -158,7 +166,7 @@ namespace libgltf SScene(); // Check valid - operator bool() const; + virtual operator bool() const; // The indices of each root node. std::vector> nodes; @@ -173,7 +181,7 @@ namespace libgltf SCameraPerspective(); // Check valid - operator bool() const; + virtual operator bool() const; // The floating-point aspect ratio of the field of view. float aspectRatio; @@ -194,7 +202,7 @@ namespace libgltf SBufferView(); // Check valid - operator bool() const; + virtual operator bool() const; // The length of the bufferView in bytes. int32_t byteLength; @@ -217,7 +225,7 @@ namespace libgltf STextureInfo(); // Check valid - operator bool() const; + virtual operator bool() const; // The index of the texture. std::shared_ptr index; @@ -233,7 +241,7 @@ namespace libgltf SMaterialNormalTextureInfo(); // Check valid - operator bool() const; + virtual operator bool() const; // The scalar multiplier applied to each normal vector of the normal texture. float scale; @@ -247,7 +255,7 @@ namespace libgltf SMaterialOcclusionTextureInfo(); // Check valid - operator bool() const; + virtual operator bool() const; // A scalar multiplier controlling the amount of occlusion applied. float strength; @@ -262,7 +270,7 @@ namespace libgltf SAccessorSparseValues(); // Check valid - operator bool() const; + virtual operator bool() const; // The index of the bufferView with sparse values. Referenced bufferView can't have ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER target. std::shared_ptr bufferView; @@ -279,11 +287,11 @@ namespace libgltf SAnimationChannelTarget(); // Check valid - operator bool() const; + virtual operator bool() const; // The index of the node to target. std::shared_ptr node; - // The name of the node's TRS property to modify, or the "weights" of the Morph Targets it instantiates. + // The name of the node's TRS property to modify, or the "weights" of the Morph Targets it instantiates. For the "translation" property, the values that are provided by the sampler are the translation along the x, y, and z axes. For the "rotation" property, the values are a quaternion in the order (x, y, z, w), where w is the scalar. For the "scale" property, the values are the scaling factors along the x, y, and z axes. GLTFString path; }; @@ -296,7 +304,7 @@ namespace libgltf SMesh(); // Check valid - operator bool() const; + virtual operator bool() const; // An array of primitives, each defining geometry to be rendered with a material. std::vector> primitives; @@ -313,7 +321,7 @@ namespace libgltf SAccessorSparse(); // Check valid - operator bool() const; + virtual operator bool() const; // Number of entries stored in the sparse array. int32_t count; @@ -332,7 +340,7 @@ namespace libgltf SMeshPrimitive(); // Check valid - operator bool() const; + virtual operator bool() const; // The index of the accessor that contains the indices. std::shared_ptr indices; @@ -346,17 +354,42 @@ namespace libgltf std::vector> targets; }; + /*! + * struct: SKHR_materials_pbrSpecularGlossinessglTFextension + * glTF extension that defines the specular-glossiness material model from Physically-Based Rendering (PBR) methodology. + */ + struct SKHR_materials_pbrSpecularGlossinessglTFextension : SGlTFProperty + { + SKHR_materials_pbrSpecularGlossinessglTFextension(); + + // Check valid + virtual operator bool() const; + + // The specular RGB color of the material. + std::vector specularFactor; + // The glossiness or smoothness of the material. + float glossinessFactor; + // The diffuse texture. + std::shared_ptr diffuseTexture; + // The specular-glossiness texture. + std::shared_ptr specularGlossinessTexture; + // The reflected diffuse factor of the material. + std::vector diffuseFactor; + }; + /*! * struct: SExtension * Dictionary object with extension-specific objects. */ - struct SExtension + struct SExtension : SObject { SExtension(); // Check valid - operator bool() const; + virtual operator bool() const; + // Manual code lines + std::map> properties; }; /*! @@ -368,7 +401,7 @@ namespace libgltf SAnimationChannel(); // Check valid - operator bool() const; + virtual operator bool() const; // The index of the node and TRS property to target. std::shared_ptr target; @@ -379,17 +412,16 @@ namespace libgltf /*! * struct: SGlTFId */ - struct SGlTFId + struct SGlTFId : SObject { SGlTFId(); // Check valid - operator bool() const; + virtual operator bool() const; operator int32_t() const; int32_t int32_tValue; - }; /*! @@ -401,7 +433,7 @@ namespace libgltf SAccessorSparseIndices(); // Check valid - operator bool() const; + virtual operator bool() const; // The indices data type. int32_t componentType; @@ -420,9 +452,9 @@ namespace libgltf SNode(); // Check valid - operator bool() const; + virtual operator bool() const; - // The node's non-uniform scale. + // The node's non-uniform scale, given as the scaling factors along the x, y, and z axes. std::vector scale; // The node's unit quaternion rotation in the order (x, y, z, w), where w is the scalar. std::vector rotation; @@ -436,7 +468,7 @@ namespace libgltf std::vector weights; // The index of the skin referenced by this node. std::shared_ptr skin; - // The node's translation. + // The node's translation along the x, y, and z axes. std::vector translation; // The indices of this node's children. std::vector> children; @@ -451,7 +483,7 @@ namespace libgltf SAnimation(); // Check valid - operator bool() const; + virtual operator bool() const; // An array of channels, each of which targets an animation's sampler at a node's property. Different channels of the same animation can't have equal targets. std::vector> channels; @@ -468,7 +500,7 @@ namespace libgltf SSkin(); // Check valid - operator bool() const; + virtual operator bool() const; // Indices of skeleton nodes, used as joints in this skin. std::vector> joints; @@ -487,7 +519,7 @@ namespace libgltf SMaterialPBRMetallicRoughness(); // Check valid - operator bool() const; + virtual operator bool() const; // The roughness of the material. float roughnessFactor; @@ -501,6 +533,22 @@ namespace libgltf std::shared_ptr metallicRoughnessTexture; }; + /*! + * struct: SKHR_draco_mesh_compressionextension + */ + struct SKHR_draco_mesh_compressionextension : SObject + { + SKHR_draco_mesh_compressionextension(); + + // Check valid + virtual operator bool() const; + + // A dictionary object, where each key corresponds to an attribute and its unique attribute id stored in the compressed geometry. + std::map> attributes; + // The index of the bufferView. + std::shared_ptr bufferView; + }; + /*! * struct: SCamera * A camera's projection. A node can reference a camera to apply a transform to place the camera in the scene. @@ -510,7 +558,7 @@ namespace libgltf SCamera(); // Check valid - operator bool() const; + virtual operator bool() const; // Specifies if the camera uses a perspective or orthographic projection. GLTFString type; @@ -529,7 +577,7 @@ namespace libgltf SImage(); // Check valid - operator bool() const; + virtual operator bool() const; // The image's MIME type. GLTFString mimeType; @@ -548,7 +596,7 @@ namespace libgltf STexture(); // Check valid - operator bool() const; + virtual operator bool() const; // The index of the image used by this texture. std::shared_ptr source; @@ -565,7 +613,7 @@ namespace libgltf SCameraOrthographic(); // Check valid - operator bool() const; + virtual operator bool() const; // The floating-point horizontal magnification of the view. Must not be zero. float xmag; @@ -586,7 +634,7 @@ namespace libgltf SBuffer(); // Check valid - operator bool() const; + virtual operator bool() const; // The length of the buffer in bytes. int32_t byteLength; @@ -603,7 +651,7 @@ namespace libgltf SAccessor(); // Check valid - operator bool() const; + virtual operator bool() const; // The number of attributes referenced by this accessor. int32_t count; @@ -634,7 +682,7 @@ namespace libgltf SGlTF(); // Check valid - operator bool() const; + virtual operator bool() const; // An array of textures. std::vector> textures; diff --git a/resource/example-2.0/BarramundiFish.gltf b/resource/example-2.0/glTF-BarramundiFish.gltf similarity index 100% rename from resource/example-2.0/BarramundiFish.gltf rename to resource/example-2.0/glTF-BarramundiFish.gltf diff --git a/resource/example-2.0/glTF-Draco-BarramundiFish.gltf b/resource/example-2.0/glTF-Draco-BarramundiFish.gltf new file mode 100644 index 0000000..b3a7b1f --- /dev/null +++ b/resource/example-2.0/glTF-Draco-BarramundiFish.gltf @@ -0,0 +1,151 @@ +{ + "accessors": [ + { + "componentType": 5123, + "count": 11592, + "type": "SCALAR" + }, + { + "componentType": 5126, + "count": 2188, + "type": "VEC2" + }, + { + "componentType": 5126, + "count": 2188, + "type": "VEC3" + }, + { + "componentType": 5126, + "count": 2188, + "type": "VEC4" + }, + { + "componentType": 5126, + "count": 2188, + "max": [ + 0.0690619648, + 0.2866283, + 0.3253729 + ], + "min": [ + -0.073841624, + -0.000878453255, + -0.317738324 + ], + "type": "VEC3" + } + ], + "asset": { + "generator": "glTF Tools for Unity", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 22339 + } + ], + "buffers": [ + { + "byteLength": 22339, + "uri": "0.bin" + } + ], + "images": [ + { + "uri": "BarramundiFish_baseColor.png" + }, + { + "uri": "BarramundiFish_occlusionRoughnessMetallic.png" + }, + { + "uri": "BarramundiFish_normal.png" + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "TEXCOORD_0": 1, + "NORMAL": 2, + "TANGENT": 3, + "POSITION": 4 + }, + "indices": 0, + "material": 0, + "extensions": { + "KHR_draco_mesh_compression": { + "bufferView": 0, + "attributes": { + "TEXCOORD_0": 0, + "NORMAL": 1, + "TANGENT": 2, + "POSITION": 3 + } + } + } + } + ], + "name": "barramundi_fish_Hero" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicRoughnessTexture": { + "index": 1 + } + }, + "normalTexture": { + "index": 2 + }, + "occlusionTexture": { + "index": 1 + }, + "name": "7288_barramundi fish_col" + } + ], + "nodes": [ + { + "mesh": 0, + "rotation": [ + 0, + 1, + 0, + 0 + ], + "name": "BarramundiFish" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "textures": [ + { + "source": 0 + }, + { + "source": 1 + }, + { + "source": 2 + } + ], + "extensionsRequired": [ + "KHR_draco_mesh_compression" + ], + "extensionsUsed": [ + "KHR_draco_mesh_compression" + ] +} diff --git a/resource/example-2.0/glTF-pbrSpecularGlossinessBarramundiFish.gltf b/resource/example-2.0/glTF-pbrSpecularGlossinessBarramundiFish.gltf new file mode 100644 index 0000000..6cca2db --- /dev/null +++ b/resource/example-2.0/glTF-pbrSpecularGlossinessBarramundiFish.gltf @@ -0,0 +1,189 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 2188, + "type": "VEC2" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 2188, + "type": "VEC3" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 2188, + "type": "VEC4" + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 2188, + "type": "VEC3", + "max": [ + 0.0690619648, + 0.2866283, + 0.3253729 + ], + "min": [ + -0.073841624, + -0.000878453255, + -0.317738324 + ] + }, + { + "bufferView": 4, + "componentType": 5123, + "count": 11592, + "type": "SCALAR" + } + ], + "asset": { + "generator": "glTF Tools for Unity", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 17504 + }, + { + "buffer": 0, + "byteOffset": 17504, + "byteLength": 26256 + }, + { + "buffer": 0, + "byteOffset": 43760, + "byteLength": 35008 + }, + { + "buffer": 0, + "byteOffset": 78768, + "byteLength": 26256 + }, + { + "buffer": 0, + "byteOffset": 105024, + "byteLength": 23184 + } + ], + "buffers": [ + { + "uri": "BarramundiFish.bin", + "byteLength": 128208 + } + ], + "extensionsUsed": [ + "KHR_materials_pbrSpecularGlossiness" + ], + "images": [ + { + "uri": "BarramundiFish_baseColor.png" + }, + { + "uri": "BarramundiFish_roughnessMetallic.png" + }, + { + "uri": "BarramundiFish_normal.png" + }, + { + "uri": "BarramundiFish_occlusion.png" + }, + { + "uri": "BarramundiFish_diffuse.png" + }, + { + "uri": "BarramundiFish_specularGlossiness.png" + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "TEXCOORD_0": 0, + "NORMAL": 1, + "TANGENT": 2, + "POSITION": 3 + }, + "indices": 4, + "material": 0 + } + ], + "name": "barramundi_fish_Hero" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicRoughnessTexture": { + "index": 1 + } + }, + "normalTexture": { + "index": 2 + }, + "occlusionTexture": { + "index": 3 + }, + "name": "7288_barramundi fish_col", + "extensions": { + "KHR_materials_pbrSpecularGlossiness": { + "diffuseTexture": { + "index": 4 + }, + "specularGlossinessTexture": { + "index": 5 + } + } + } + } + ], + "nodes": [ + { + "mesh": 0, + "rotation": [ + 0.0, + 1.0, + 0.0, + 0.0 + ], + "name": "BarramundiFish" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "textures": [ + { + "source": 0 + }, + { + "source": 1 + }, + { + "source": 2 + }, + { + "source": 3 + }, + { + "source": 4 + }, + { + "source": 5 + } + ] +} \ No newline at end of file diff --git a/source/libgltf/libgltf.cpp b/source/libgltf/libgltf.cpp index d2c1a51..d12188d 100644 --- a/source/libgltf/libgltf.cpp +++ b/source/libgltf/libgltf.cpp @@ -3,8 +3,15 @@ namespace libgltf { + SObject::SObject() + : schemaType(GLTFTEXT("")) + { + // + } + SGlTFProperty::SGlTFProperty() - : extras(nullptr) + : SObject() + , extras(nullptr) , extensions(nullptr) { // @@ -97,6 +104,7 @@ namespace libgltf } SExtras::SExtras() + : SObject() { // } @@ -267,7 +275,27 @@ namespace libgltf return true; } + SKHR_materials_pbrSpecularGlossinessglTFextension::SKHR_materials_pbrSpecularGlossinessglTFextension() + : SGlTFProperty() + , specularFactor({ 1.000000f, 1.000000f, 1.000000f }) + , glossinessFactor(1.000000f) + , diffuseTexture(nullptr) + , specularGlossinessTexture(nullptr) + , diffuseFactor({ 1.000000f, 1.000000f, 1.000000f, 1.000000f }) + { + // + } + + SKHR_materials_pbrSpecularGlossinessglTFextension::operator bool() const + { + //TODO: + return true; + } + SExtension::SExtension() + : SObject() + // Manual code lines + , properties() { // } @@ -293,7 +321,8 @@ namespace libgltf } SGlTFId::SGlTFId() - : int32_tValue(0) + : SObject() + , int32_tValue(0) { // } @@ -391,6 +420,20 @@ namespace libgltf return true; } + SKHR_draco_mesh_compressionextension::SKHR_draco_mesh_compressionextension() + : SObject() + , attributes() + , bufferView(nullptr) + { + // + } + + SKHR_draco_mesh_compressionextension::operator bool() const + { + //TODO: + return true; + } + SCamera::SCamera() : SGlTFChildofRootProperty() , type(GLTFTEXT("")) diff --git a/source/libgltf/libgltfparser.cpp b/source/libgltf/libgltfparser.cpp index c70f6d2..374b4f7 100644 --- a/source/libgltf/libgltfparser.cpp +++ b/source/libgltf/libgltfparser.cpp @@ -106,7 +106,11 @@ namespace libgltf size_t len = json_array.Size(); if (len == 0) return true; datas.resize(len); - for (size_t i = 0; i < len; ++i) if (!(datas[i] << json_array[static_cast(i)])) return false; + for (size_t i = 0; i < len; ++i) + { + if (datas[i] << json_array[static_cast(i)]) continue; + return false; + } _vDatas = datas; return true; } @@ -156,40 +160,53 @@ namespace libgltf return true; } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SGlTFProperty& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); if (_JsonValue.HasMember(GLTFTEXT("extras")) && _JsonValue[GLTFTEXT("extras")].IsObject()) { - if (!(data_ptr->extras << _JsonValue[GLTFTEXT("extras")])) return false; + if (!(_rData.extras << _JsonValue[GLTFTEXT("extras")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("extensions")) && _JsonValue[GLTFTEXT("extensions")].IsObject()) { - if (!(data_ptr->extensions << _JsonValue[GLTFTEXT("extensions")])) return false; + if (!(_rData.extensions << _JsonValue[GLTFTEXT("extensions")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("glTFProperty.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SGlTFProperty& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); - if (!!_pData->extras) + if (!!_rData.extras) { GLTFCharValue json_value; - if (!(_pData->extras >> json_value)) return false; + if (!(_rData.extras >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("extras"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->extensions) + if (!!_rData.extensions) { GLTFCharValue json_value; - if (!(_pData->extensions >> json_value)) return false; + if (!(_rData.extensions >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("extensions"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -200,105 +217,118 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SMaterial& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("alphaCutoff")) && _JsonValue[GLTFTEXT("alphaCutoff")].IsFloat()) { - data_ptr->alphaCutoff = _JsonValue[GLTFTEXT("alphaCutoff")].GetFloat(); + _rData.alphaCutoff = _JsonValue[GLTFTEXT("alphaCutoff")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("emissiveTexture")) && _JsonValue[GLTFTEXT("emissiveTexture")].IsObject()) { - if (!(data_ptr->emissiveTexture << _JsonValue[GLTFTEXT("emissiveTexture")])) return false; + if (!(_rData.emissiveTexture << _JsonValue[GLTFTEXT("emissiveTexture")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("pbrMetallicRoughness")) && _JsonValue[GLTFTEXT("pbrMetallicRoughness")].IsObject()) { - if (!(data_ptr->pbrMetallicRoughness << _JsonValue[GLTFTEXT("pbrMetallicRoughness")])) return false; + if (!(_rData.pbrMetallicRoughness << _JsonValue[GLTFTEXT("pbrMetallicRoughness")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("occlusionTexture")) && _JsonValue[GLTFTEXT("occlusionTexture")].IsObject()) { - if (!(data_ptr->occlusionTexture << _JsonValue[GLTFTEXT("occlusionTexture")])) return false; + if (!(_rData.occlusionTexture << _JsonValue[GLTFTEXT("occlusionTexture")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("alphaMode")) && _JsonValue[GLTFTEXT("alphaMode")].IsString()) { - data_ptr->alphaMode = _JsonValue[GLTFTEXT("alphaMode")].GetString(); + _rData.alphaMode = _JsonValue[GLTFTEXT("alphaMode")].GetString(); } if (_JsonValue.HasMember(GLTFTEXT("doubleSided")) && _JsonValue[GLTFTEXT("doubleSided")].IsBool()) { - data_ptr->doubleSided = _JsonValue[GLTFTEXT("doubleSided")].GetBool(); + _rData.doubleSided = _JsonValue[GLTFTEXT("doubleSided")].GetBool(); } if (_JsonValue.HasMember(GLTFTEXT("normalTexture")) && _JsonValue[GLTFTEXT("normalTexture")].IsObject()) { - if (!(data_ptr->normalTexture << _JsonValue[GLTFTEXT("normalTexture")])) return false; + if (!(_rData.normalTexture << _JsonValue[GLTFTEXT("normalTexture")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("emissiveFactor")) && _JsonValue[GLTFTEXT("emissiveFactor")].IsArray()) { - if (!(data_ptr->emissiveFactor << _JsonValue[GLTFTEXT("emissiveFactor")])) return false; + if (!(_rData.emissiveFactor << _JsonValue[GLTFTEXT("emissiveFactor")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("material.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SMaterial& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->alphaCutoff >> json_value)) return false; + if (!(_rData.alphaCutoff >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("alphaCutoff"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->emissiveTexture) + if (!!_rData.emissiveTexture) { GLTFCharValue json_value; - if (!(_pData->emissiveTexture >> json_value)) return false; + if (!(_rData.emissiveTexture >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("emissiveTexture"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->pbrMetallicRoughness) + if (!!_rData.pbrMetallicRoughness) { GLTFCharValue json_value; - if (!(_pData->pbrMetallicRoughness >> json_value)) return false; + if (!(_rData.pbrMetallicRoughness >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("pbrMetallicRoughness"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->occlusionTexture) + if (!!_rData.occlusionTexture) { GLTFCharValue json_value; - if (!(_pData->occlusionTexture >> json_value)) return false; + if (!(_rData.occlusionTexture >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("occlusionTexture"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->alphaMode >> json_value)) return false; + if (!(_rData.alphaMode >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("alphaMode"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->doubleSided >> json_value)) return false; + if (!(_rData.doubleSided >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("doubleSided"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->normalTexture) + if (!!_rData.normalTexture) { GLTFCharValue json_value; - if (!(_pData->normalTexture >> json_value)) return false; + if (!(_rData.normalTexture >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("normalTexture"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->emissiveFactor.empty()) + if (!_rData.emissiveFactor.empty()) { GLTFCharValue json_value; - if (!(_pData->emissiveFactor >> json_value)) return false; + if (!(_rData.emissiveFactor >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("emissiveFactor"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -309,64 +339,77 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAsset& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("minVersion")) && _JsonValue[GLTFTEXT("minVersion")].IsString()) { - data_ptr->minVersion = _JsonValue[GLTFTEXT("minVersion")].GetString(); + _rData.minVersion = _JsonValue[GLTFTEXT("minVersion")].GetString(); } if (_JsonValue.HasMember(GLTFTEXT("version")) && _JsonValue[GLTFTEXT("version")].IsString()) { - data_ptr->version = _JsonValue[GLTFTEXT("version")].GetString(); + _rData.version = _JsonValue[GLTFTEXT("version")].GetString(); } if (_JsonValue.HasMember(GLTFTEXT("generator")) && _JsonValue[GLTFTEXT("generator")].IsString()) { - data_ptr->generator = _JsonValue[GLTFTEXT("generator")].GetString(); + _rData.generator = _JsonValue[GLTFTEXT("generator")].GetString(); } if (_JsonValue.HasMember(GLTFTEXT("copyright")) && _JsonValue[GLTFTEXT("copyright")].IsString()) { - data_ptr->copyright = _JsonValue[GLTFTEXT("copyright")].GetString(); + _rData.copyright = _JsonValue[GLTFTEXT("copyright")].GetString(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("asset.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAsset& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->minVersion >> json_value)) return false; + if (!(_rData.minVersion >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("minVersion"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->version >> json_value)) return false; + if (!(_rData.version >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("version"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->generator >> json_value)) return false; + if (!(_rData.generator >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("generator"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->copyright >> json_value)) return false; + if (!(_rData.copyright >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("copyright"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -377,64 +420,77 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SSampler& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("wrapS")) && _JsonValue[GLTFTEXT("wrapS")].IsInt()) { - data_ptr->wrapS = _JsonValue[GLTFTEXT("wrapS")].GetInt(); + _rData.wrapS = _JsonValue[GLTFTEXT("wrapS")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("minFilter")) && _JsonValue[GLTFTEXT("minFilter")].IsInt()) { - data_ptr->minFilter = _JsonValue[GLTFTEXT("minFilter")].GetInt(); + _rData.minFilter = _JsonValue[GLTFTEXT("minFilter")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("magFilter")) && _JsonValue[GLTFTEXT("magFilter")].IsInt()) { - data_ptr->magFilter = _JsonValue[GLTFTEXT("magFilter")].GetInt(); + _rData.magFilter = _JsonValue[GLTFTEXT("magFilter")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("wrapT")) && _JsonValue[GLTFTEXT("wrapT")].IsInt()) { - data_ptr->wrapT = _JsonValue[GLTFTEXT("wrapT")].GetInt(); + _rData.wrapT = _JsonValue[GLTFTEXT("wrapT")].GetInt(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("sampler.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SSampler& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->wrapS >> json_value)) return false; + if (!(_rData.wrapS >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("wrapS"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->minFilter >> json_value)) return false; + if (!(_rData.minFilter >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("minFilter"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->magFilter >> json_value)) return false; + if (!(_rData.magFilter >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("magFilter"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->wrapT >> json_value)) return false; + if (!(_rData.wrapT >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("wrapT"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -445,37 +501,50 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SGlTFChildofRootProperty& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("name")) && _JsonValue[GLTFTEXT("name")].IsString()) { - data_ptr->name = _JsonValue[GLTFTEXT("name")].GetString(); + _rData.name = _JsonValue[GLTFTEXT("name")].GetString(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("glTFChildOfRootProperty.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SGlTFChildofRootProperty& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->name >> json_value)) return false; + if (!(_rData.name >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("name"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -486,57 +555,70 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAnimationSampler& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("input")) && _JsonValue[GLTFTEXT("input")].IsInt()) { - if (!(data_ptr->input << _JsonValue[GLTFTEXT("input")])) return false; + if (!(_rData.input << _JsonValue[GLTFTEXT("input")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("output")) && _JsonValue[GLTFTEXT("output")].IsInt()) { - if (!(data_ptr->output << _JsonValue[GLTFTEXT("output")])) return false; + if (!(_rData.output << _JsonValue[GLTFTEXT("output")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("interpolation")) && _JsonValue[GLTFTEXT("interpolation")].IsString()) { - data_ptr->interpolation = _JsonValue[GLTFTEXT("interpolation")].GetString(); + _rData.interpolation = _JsonValue[GLTFTEXT("interpolation")].GetString(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("animation.sampler.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAnimationSampler& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!!_pData->input) + if (!!_rData.input) { GLTFCharValue json_value; - if (!(_pData->input >> json_value)) return false; + if (!(_rData.input >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("input"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->output) + if (!!_rData.output) { GLTFCharValue json_value; - if (!(_pData->output >> json_value)) return false; + if (!(_rData.output >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("output"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->interpolation >> json_value)) return false; + if (!(_rData.interpolation >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("interpolation"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -547,18 +629,31 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } + bool operator<<(SExtras& _rData, const GLTFCharValue& _JsonValue) + { + _rData.schemaType = GLTFTEXT("extras.schema.json"); + return true; + } + + bool operator>>(const SExtras& _rData, GLTFCharValue& _JsonValue) + { + if (!g_json_doc_ptr) return false; + _JsonValue.SetObject(); + return true; + } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) { std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; _pData = data_ptr; return true; } bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; - _JsonValue.SetObject(); - return true; + if (!_pData) return false; + return (*_pData >> _JsonValue); } bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) @@ -571,38 +666,51 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SScene& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("nodes")) && _JsonValue[GLTFTEXT("nodes")].IsArray()) { - if (!(data_ptr->nodes << _JsonValue[GLTFTEXT("nodes")])) return false; + if (!(_rData.nodes << _JsonValue[GLTFTEXT("nodes")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("scene.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SScene& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!_pData->nodes.empty()) + if (!_rData.nodes.empty()) { GLTFCharValue json_value; - if (!(_pData->nodes >> json_value)) return false; + if (!(_rData.nodes >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("nodes"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -613,64 +721,77 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SCameraPerspective& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("aspectRatio")) && _JsonValue[GLTFTEXT("aspectRatio")].IsFloat()) { - data_ptr->aspectRatio = _JsonValue[GLTFTEXT("aspectRatio")].GetFloat(); + _rData.aspectRatio = _JsonValue[GLTFTEXT("aspectRatio")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("yfov")) && _JsonValue[GLTFTEXT("yfov")].IsFloat()) { - data_ptr->yfov = _JsonValue[GLTFTEXT("yfov")].GetFloat(); + _rData.yfov = _JsonValue[GLTFTEXT("yfov")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("znear")) && _JsonValue[GLTFTEXT("znear")].IsFloat()) { - data_ptr->znear = _JsonValue[GLTFTEXT("znear")].GetFloat(); + _rData.znear = _JsonValue[GLTFTEXT("znear")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("zfar")) && _JsonValue[GLTFTEXT("zfar")].IsFloat()) { - data_ptr->zfar = _JsonValue[GLTFTEXT("zfar")].GetFloat(); + _rData.zfar = _JsonValue[GLTFTEXT("zfar")].GetFloat(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("camera.perspective.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SCameraPerspective& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->aspectRatio >> json_value)) return false; + if (!(_rData.aspectRatio >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("aspectRatio"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->yfov >> json_value)) return false; + if (!(_rData.yfov >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("yfov"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->znear >> json_value)) return false; + if (!(_rData.znear >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("znear"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->zfar >> json_value)) return false; + if (!(_rData.zfar >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("zfar"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -681,74 +802,87 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SBufferView& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("byteLength")) && _JsonValue[GLTFTEXT("byteLength")].IsInt()) { - data_ptr->byteLength = _JsonValue[GLTFTEXT("byteLength")].GetInt(); + _rData.byteLength = _JsonValue[GLTFTEXT("byteLength")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("buffer")) && _JsonValue[GLTFTEXT("buffer")].IsInt()) { - if (!(data_ptr->buffer << _JsonValue[GLTFTEXT("buffer")])) return false; + if (!(_rData.buffer << _JsonValue[GLTFTEXT("buffer")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("byteOffset")) && _JsonValue[GLTFTEXT("byteOffset")].IsInt()) { - data_ptr->byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); + _rData.byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("target")) && _JsonValue[GLTFTEXT("target")].IsInt()) { - data_ptr->target = _JsonValue[GLTFTEXT("target")].GetInt(); + _rData.target = _JsonValue[GLTFTEXT("target")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("byteStride")) && _JsonValue[GLTFTEXT("byteStride")].IsInt()) { - data_ptr->byteStride = _JsonValue[GLTFTEXT("byteStride")].GetInt(); + _rData.byteStride = _JsonValue[GLTFTEXT("byteStride")].GetInt(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("bufferView.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SBufferView& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->byteLength >> json_value)) return false; + if (!(_rData.byteLength >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("byteLength"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->buffer) + if (!!_rData.buffer) { GLTFCharValue json_value; - if (!(_pData->buffer >> json_value)) return false; + if (!(_rData.buffer >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("buffer"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->byteOffset >> json_value)) return false; + if (!(_rData.byteOffset >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("byteOffset"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->target >> json_value)) return false; + if (!(_rData.target >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("target"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->byteStride >> json_value)) return false; + if (!(_rData.byteStride >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("byteStride"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -759,37 +893,50 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SMaterialNormalTextureInfo& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + STextureInfo& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("scale")) && _JsonValue[GLTFTEXT("scale")].IsFloat()) { - data_ptr->scale = _JsonValue[GLTFTEXT("scale")].GetFloat(); + _rData.scale = _JsonValue[GLTFTEXT("scale")].GetFloat(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("material.normalTextureInfo.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SMaterialNormalTextureInfo& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const STextureInfo& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->scale >> json_value)) return false; + if (!(_rData.scale >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("scale"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -800,37 +947,50 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SMaterialOcclusionTextureInfo& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + STextureInfo& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("strength")) && _JsonValue[GLTFTEXT("strength")].IsFloat()) { - data_ptr->strength = _JsonValue[GLTFTEXT("strength")].GetFloat(); + _rData.strength = _JsonValue[GLTFTEXT("strength")].GetFloat(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("material.occlusionTextureInfo.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SMaterialOcclusionTextureInfo& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const STextureInfo& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->strength >> json_value)) return false; + if (!(_rData.strength >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("strength"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -841,47 +1001,60 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAccessorSparseValues& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("bufferView")) && _JsonValue[GLTFTEXT("bufferView")].IsInt()) { - if (!(data_ptr->bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; + if (!(_rData.bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("byteOffset")) && _JsonValue[GLTFTEXT("byteOffset")].IsInt()) { - data_ptr->byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); + _rData.byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("accessor.sparse.values.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAccessorSparseValues& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!!_pData->bufferView) + if (!!_rData.bufferView) { GLTFCharValue json_value; - if (!(_pData->bufferView >> json_value)) return false; + if (!(_rData.bufferView >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("bufferView"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->byteOffset >> json_value)) return false; + if (!(_rData.byteOffset >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("byteOffset"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -892,47 +1065,60 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAnimationChannelTarget& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("node")) && _JsonValue[GLTFTEXT("node")].IsInt()) { - if (!(data_ptr->node << _JsonValue[GLTFTEXT("node")])) return false; + if (!(_rData.node << _JsonValue[GLTFTEXT("node")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("path")) && _JsonValue[GLTFTEXT("path")].IsString()) { - data_ptr->path = _JsonValue[GLTFTEXT("path")].GetString(); + _rData.path = _JsonValue[GLTFTEXT("path")].GetString(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("animation.channel.target.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAnimationChannelTarget& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!!_pData->node) + if (!!_rData.node) { GLTFCharValue json_value; - if (!(_pData->node >> json_value)) return false; + if (!(_rData.node >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("node"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->path >> json_value)) return false; + if (!(_rData.path >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("path"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -943,48 +1129,61 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SMesh& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("primitives")) && _JsonValue[GLTFTEXT("primitives")].IsArray()) { - if (!(data_ptr->primitives << _JsonValue[GLTFTEXT("primitives")])) return false; + if (!(_rData.primitives << _JsonValue[GLTFTEXT("primitives")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("weights")) && _JsonValue[GLTFTEXT("weights")].IsArray()) { - if (!(data_ptr->weights << _JsonValue[GLTFTEXT("weights")])) return false; + if (!(_rData.weights << _JsonValue[GLTFTEXT("weights")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("mesh.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SMesh& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!_pData->primitives.empty()) + if (!_rData.primitives.empty()) { GLTFCharValue json_value; - if (!(_pData->primitives >> json_value)) return false; + if (!(_rData.primitives >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("primitives"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->weights.empty()) + if (!_rData.weights.empty()) { GLTFCharValue json_value; - if (!(_pData->weights >> json_value)) return false; + if (!(_rData.weights >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("weights"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -995,57 +1194,70 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAccessorSparse& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("count")) && _JsonValue[GLTFTEXT("count")].IsInt()) { - data_ptr->count = _JsonValue[GLTFTEXT("count")].GetInt(); + _rData.count = _JsonValue[GLTFTEXT("count")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("indices")) && _JsonValue[GLTFTEXT("indices")].IsObject()) { - if (!(data_ptr->indices << _JsonValue[GLTFTEXT("indices")])) return false; + if (!(_rData.indices << _JsonValue[GLTFTEXT("indices")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("values")) && _JsonValue[GLTFTEXT("values")].IsObject()) { - if (!(data_ptr->values << _JsonValue[GLTFTEXT("values")])) return false; + if (!(_rData.values << _JsonValue[GLTFTEXT("values")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("accessor.sparse.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAccessorSparse& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->count >> json_value)) return false; + if (!(_rData.count >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("count"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->indices) + if (!!_rData.indices) { GLTFCharValue json_value; - if (!(_pData->indices >> json_value)) return false; + if (!(_rData.indices >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("indices"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->values) + if (!!_rData.values) { GLTFCharValue json_value; - if (!(_pData->values >> json_value)) return false; + if (!(_rData.values >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("values"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1056,77 +1268,90 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SMeshPrimitive& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("indices")) && _JsonValue[GLTFTEXT("indices")].IsInt()) { - if (!(data_ptr->indices << _JsonValue[GLTFTEXT("indices")])) return false; + if (!(_rData.indices << _JsonValue[GLTFTEXT("indices")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("attributes")) && _JsonValue[GLTFTEXT("attributes")].IsObject()) { - if (!(data_ptr->attributes << _JsonValue[GLTFTEXT("attributes")])) return false; + if (!(_rData.attributes << _JsonValue[GLTFTEXT("attributes")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("material")) && _JsonValue[GLTFTEXT("material")].IsInt()) { - if (!(data_ptr->material << _JsonValue[GLTFTEXT("material")])) return false; + if (!(_rData.material << _JsonValue[GLTFTEXT("material")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("mode")) && _JsonValue[GLTFTEXT("mode")].IsInt()) { - data_ptr->mode = _JsonValue[GLTFTEXT("mode")].GetInt(); + _rData.mode = _JsonValue[GLTFTEXT("mode")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("targets")) && _JsonValue[GLTFTEXT("targets")].IsArray()) { - if (!(data_ptr->targets << _JsonValue[GLTFTEXT("targets")])) return false; + if (!(_rData.targets << _JsonValue[GLTFTEXT("targets")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("mesh.primitive.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SMeshPrimitive& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!!_pData->indices) + if (!!_rData.indices) { GLTFCharValue json_value; - if (!(_pData->indices >> json_value)) return false; + if (!(_rData.indices >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("indices"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->attributes.empty()) + if (!_rData.attributes.empty()) { GLTFCharValue json_value; - if (!(_pData->attributes >> json_value)) return false; + if (!(_rData.attributes >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("attributes"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->material) + if (!!_rData.material) { GLTFCharValue json_value; - if (!(_pData->material >> json_value)) return false; + if (!(_rData.material >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("material"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->mode >> json_value)) return false; + if (!(_rData.mode >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("mode"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->targets.empty()) + if (!_rData.targets.empty()) { GLTFCharValue json_value; - if (!(_pData->targets >> json_value)) return false; + if (!(_rData.targets >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("targets"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1137,18 +1362,158 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } + bool operator<<(SKHR_materials_pbrSpecularGlossinessglTFextension& _rData, const GLTFCharValue& _JsonValue) + { + { + SGlTFProperty& super_ptr = _rData; + if (!(super_ptr << _JsonValue)) return false; + } + if (_JsonValue.HasMember(GLTFTEXT("specularFactor")) && _JsonValue[GLTFTEXT("specularFactor")].IsArray()) + { + if (!(_rData.specularFactor << _JsonValue[GLTFTEXT("specularFactor")])) return false; + } + if (_JsonValue.HasMember(GLTFTEXT("glossinessFactor")) && _JsonValue[GLTFTEXT("glossinessFactor")].IsFloat()) + { + _rData.glossinessFactor = _JsonValue[GLTFTEXT("glossinessFactor")].GetFloat(); + } + if (_JsonValue.HasMember(GLTFTEXT("diffuseTexture")) && _JsonValue[GLTFTEXT("diffuseTexture")].IsObject()) + { + if (!(_rData.diffuseTexture << _JsonValue[GLTFTEXT("diffuseTexture")])) return false; + } + if (_JsonValue.HasMember(GLTFTEXT("specularGlossinessTexture")) && _JsonValue[GLTFTEXT("specularGlossinessTexture")].IsObject()) + { + if (!(_rData.specularGlossinessTexture << _JsonValue[GLTFTEXT("specularGlossinessTexture")])) return false; + } + if (_JsonValue.HasMember(GLTFTEXT("diffuseFactor")) && _JsonValue[GLTFTEXT("diffuseFactor")].IsArray()) + { + if (!(_rData.diffuseFactor << _JsonValue[GLTFTEXT("diffuseFactor")])) return false; + } + _rData.schemaType = GLTFTEXT("glTF.KHR_materials_pbrSpecularGlossiness.schema.json"); + return true; + } + + bool operator>>(const SKHR_materials_pbrSpecularGlossinessglTFextension& _rData, GLTFCharValue& _JsonValue) + { + if (!g_json_doc_ptr) return false; + _JsonValue.SetObject(); + { + const SGlTFProperty& super_ptr = _rData; + if (!(super_ptr >> _JsonValue)) return false; + } + if (!_rData.specularFactor.empty()) + { + GLTFCharValue json_value; + if (!(_rData.specularFactor >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("specularFactor"), json_value, g_json_doc_ptr->GetAllocator()); + } + { + GLTFCharValue json_value; + if (!(_rData.glossinessFactor >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("glossinessFactor"), json_value, g_json_doc_ptr->GetAllocator()); + } + if (!!_rData.diffuseTexture) + { + GLTFCharValue json_value; + if (!(_rData.diffuseTexture >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("diffuseTexture"), json_value, g_json_doc_ptr->GetAllocator()); + } + if (!!_rData.specularGlossinessTexture) + { + GLTFCharValue json_value; + if (!(_rData.specularGlossinessTexture >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("specularGlossinessTexture"), json_value, g_json_doc_ptr->GetAllocator()); + } + if (!_rData.diffuseFactor.empty()) + { + GLTFCharValue json_value; + if (!(_rData.diffuseFactor >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("diffuseFactor"), json_value, g_json_doc_ptr->GetAllocator()); + } + return true; + } + + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) + { + return operator<< >(_vDatas, _JsonValue); + } + + bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue) + { + return operator>> >(_vDatas, _JsonValue); + } + + bool operator<<(SExtension& _rData, const GLTFCharValue& _JsonValue) + { + // Manual code lines + if (_JsonValue.HasMember(GLTFTEXT("KHR_draco_mesh_compression")) && _JsonValue[GLTFTEXT("KHR_draco_mesh_compression")].IsObject()) + { + std::shared_ptr extension; + if (!(extension << _JsonValue[GLTFTEXT("KHR_draco_mesh_compression")])) return false; + _rData.properties.insert(std::make_pair(GLTFTEXT("KHR_draco_mesh_compression"), extension)); + } + if (_JsonValue.HasMember(GLTFTEXT("KHR_materials_pbrSpecularGlossiness")) && _JsonValue[GLTFTEXT("KHR_materials_pbrSpecularGlossiness")].IsObject()) + { + std::shared_ptr extension; + if (!(extension << _JsonValue[GLTFTEXT("KHR_materials_pbrSpecularGlossiness")])) return false; + _rData.properties.insert(std::make_pair(GLTFTEXT("KHR_materials_pbrSpecularGlossiness"), extension)); + } + _rData.schemaType = GLTFTEXT("extension.schema.json"); + return true; + } + + bool operator>>(const SExtension& _rData, GLTFCharValue& _JsonValue) + { + // Manual code lines + if (!_rData || !g_json_doc_ptr) return false; + _JsonValue.SetObject(); + for (const std::pair>& extensionProperty : _rData.properties) + { + const std::shared_ptr& extensionValue = extensionProperty.second; + if (!extensionValue) return false; + if (extensionValue->schemaType == GLTFTEXT("node.KHR_draco_mesh_compression.schema.json")) + { + const SKHR_draco_mesh_compressionextension& extension = *((const SKHR_draco_mesh_compressionextension*)extensionValue.get()); + GLTFCharValue json_value; + if (!(extension >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("KHR_draco_mesh_compression"), json_value, g_json_doc_ptr->GetAllocator()); + } + else if (extensionValue->schemaType == GLTFTEXT("glTF.KHR_materials_pbrSpecularGlossiness.schema.json")) + { + const SKHR_materials_pbrSpecularGlossinessglTFextension& extension = *((const SKHR_materials_pbrSpecularGlossinessglTFextension*)extensionValue.get()); + GLTFCharValue json_value; + if (!(extension >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("KHR_materials_pbrSpecularGlossiness"), json_value, g_json_doc_ptr->GetAllocator()); + } + } + return true; + } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) { std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; _pData = data_ptr; return true; } bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; - _JsonValue.SetObject(); - return true; + if (!_pData) return false; + return (*_pData >> _JsonValue); } bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) @@ -1161,72 +1526,98 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAnimationChannel& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("target")) && _JsonValue[GLTFTEXT("target")].IsObject()) { - if (!(data_ptr->target << _JsonValue[GLTFTEXT("target")])) return false; + if (!(_rData.target << _JsonValue[GLTFTEXT("target")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("sampler")) && _JsonValue[GLTFTEXT("sampler")].IsInt()) { - if (!(data_ptr->sampler << _JsonValue[GLTFTEXT("sampler")])) return false; + if (!(_rData.sampler << _JsonValue[GLTFTEXT("sampler")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("animation.channel.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAnimationChannel& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!!_pData->target) + if (!!_rData.target) { GLTFCharValue json_value; - if (!(_pData->target >> json_value)) return false; + if (!(_rData.target >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("target"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->sampler) + if (!!_rData.sampler) { GLTFCharValue json_value; - if (!(_pData->sampler >> json_value)) return false; + if (!(_rData.sampler >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("sampler"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } - bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) + { + return operator<< >(_vDatas, _JsonValue); + } + + bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue) + { + return operator>> >(_vDatas, _JsonValue); + } + + bool operator<<(SGlTFId& _rData, const GLTFCharValue& _JsonValue) { - return operator<< >(_vDatas, _JsonValue); + if (!(_rData.int32_tValue << _JsonValue)) return false; + _rData.schemaType = GLTFTEXT("glTFid.schema.json"); + return true; } - bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue) + bool operator>>(const SGlTFId& _rData, GLTFCharValue& _JsonValue) { - return operator>> >(_vDatas, _JsonValue); + if (!g_json_doc_ptr) return false; + _JsonValue.SetObject(); + if (!(_rData.int32_tValue >> _JsonValue)) return false; + return true; } bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) { std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); - if (!(data_ptr->int32_tValue << _JsonValue)) return false; + if (!(*data_ptr << _JsonValue)) return false; _pData = data_ptr; return true; } bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; - _JsonValue.SetObject(); - if (!(_pData->int32_tValue >> _JsonValue)) return false; - return true; + if (!_pData) return false; + return (*_pData >> _JsonValue); } bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) @@ -1239,56 +1630,69 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAccessorSparseIndices& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("componentType")) && _JsonValue[GLTFTEXT("componentType")].IsInt()) { - data_ptr->componentType = _JsonValue[GLTFTEXT("componentType")].GetInt(); + _rData.componentType = _JsonValue[GLTFTEXT("componentType")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("bufferView")) && _JsonValue[GLTFTEXT("bufferView")].IsInt()) { - if (!(data_ptr->bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; + if (!(_rData.bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("byteOffset")) && _JsonValue[GLTFTEXT("byteOffset")].IsInt()) { - data_ptr->byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); + _rData.byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("accessor.sparse.indices.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAccessorSparseIndices& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->componentType >> json_value)) return false; + if (!(_rData.componentType >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("componentType"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->bufferView) + if (!!_rData.bufferView) { GLTFCharValue json_value; - if (!(_pData->bufferView >> json_value)) return false; + if (!(_rData.bufferView >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("bufferView"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->byteOffset >> json_value)) return false; + if (!(_rData.byteOffset >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("byteOffset"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1299,118 +1703,131 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SNode& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("scale")) && _JsonValue[GLTFTEXT("scale")].IsArray()) { - if (!(data_ptr->scale << _JsonValue[GLTFTEXT("scale")])) return false; + if (!(_rData.scale << _JsonValue[GLTFTEXT("scale")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("rotation")) && _JsonValue[GLTFTEXT("rotation")].IsArray()) { - if (!(data_ptr->rotation << _JsonValue[GLTFTEXT("rotation")])) return false; + if (!(_rData.rotation << _JsonValue[GLTFTEXT("rotation")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("matrix")) && _JsonValue[GLTFTEXT("matrix")].IsArray()) { - if (!(data_ptr->matrix << _JsonValue[GLTFTEXT("matrix")])) return false; + if (!(_rData.matrix << _JsonValue[GLTFTEXT("matrix")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("mesh")) && _JsonValue[GLTFTEXT("mesh")].IsInt()) { - if (!(data_ptr->mesh << _JsonValue[GLTFTEXT("mesh")])) return false; + if (!(_rData.mesh << _JsonValue[GLTFTEXT("mesh")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("camera")) && _JsonValue[GLTFTEXT("camera")].IsInt()) { - if (!(data_ptr->camera << _JsonValue[GLTFTEXT("camera")])) return false; + if (!(_rData.camera << _JsonValue[GLTFTEXT("camera")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("weights")) && _JsonValue[GLTFTEXT("weights")].IsArray()) { - if (!(data_ptr->weights << _JsonValue[GLTFTEXT("weights")])) return false; + if (!(_rData.weights << _JsonValue[GLTFTEXT("weights")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("skin")) && _JsonValue[GLTFTEXT("skin")].IsInt()) { - if (!(data_ptr->skin << _JsonValue[GLTFTEXT("skin")])) return false; + if (!(_rData.skin << _JsonValue[GLTFTEXT("skin")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("translation")) && _JsonValue[GLTFTEXT("translation")].IsArray()) { - if (!(data_ptr->translation << _JsonValue[GLTFTEXT("translation")])) return false; + if (!(_rData.translation << _JsonValue[GLTFTEXT("translation")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("children")) && _JsonValue[GLTFTEXT("children")].IsArray()) { - if (!(data_ptr->children << _JsonValue[GLTFTEXT("children")])) return false; + if (!(_rData.children << _JsonValue[GLTFTEXT("children")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("node.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SNode& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!_pData->scale.empty()) + if (!_rData.scale.empty()) { GLTFCharValue json_value; - if (!(_pData->scale >> json_value)) return false; + if (!(_rData.scale >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("scale"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->rotation.empty()) + if (!_rData.rotation.empty()) { GLTFCharValue json_value; - if (!(_pData->rotation >> json_value)) return false; + if (!(_rData.rotation >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("rotation"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->matrix.empty()) + if (!_rData.matrix.empty()) { GLTFCharValue json_value; - if (!(_pData->matrix >> json_value)) return false; + if (!(_rData.matrix >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("matrix"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->mesh) + if (!!_rData.mesh) { GLTFCharValue json_value; - if (!(_pData->mesh >> json_value)) return false; + if (!(_rData.mesh >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("mesh"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->camera) + if (!!_rData.camera) { GLTFCharValue json_value; - if (!(_pData->camera >> json_value)) return false; + if (!(_rData.camera >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("camera"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->weights.empty()) + if (!_rData.weights.empty()) { GLTFCharValue json_value; - if (!(_pData->weights >> json_value)) return false; + if (!(_rData.weights >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("weights"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->skin) + if (!!_rData.skin) { GLTFCharValue json_value; - if (!(_pData->skin >> json_value)) return false; + if (!(_rData.skin >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("skin"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->translation.empty()) + if (!_rData.translation.empty()) { GLTFCharValue json_value; - if (!(_pData->translation >> json_value)) return false; + if (!(_rData.translation >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("translation"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->children.empty()) + if (!_rData.children.empty()) { GLTFCharValue json_value; - if (!(_pData->children >> json_value)) return false; + if (!(_rData.children >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("children"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1421,48 +1838,61 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAnimation& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("channels")) && _JsonValue[GLTFTEXT("channels")].IsArray()) { - if (!(data_ptr->channels << _JsonValue[GLTFTEXT("channels")])) return false; + if (!(_rData.channels << _JsonValue[GLTFTEXT("channels")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("samplers")) && _JsonValue[GLTFTEXT("samplers")].IsArray()) { - if (!(data_ptr->samplers << _JsonValue[GLTFTEXT("samplers")])) return false; + if (!(_rData.samplers << _JsonValue[GLTFTEXT("samplers")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("animation.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAnimation& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!_pData->channels.empty()) + if (!_rData.channels.empty()) { GLTFCharValue json_value; - if (!(_pData->channels >> json_value)) return false; + if (!(_rData.channels >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("channels"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->samplers.empty()) + if (!_rData.samplers.empty()) { GLTFCharValue json_value; - if (!(_pData->samplers >> json_value)) return false; + if (!(_rData.samplers >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("samplers"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1473,58 +1903,71 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SSkin& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("joints")) && _JsonValue[GLTFTEXT("joints")].IsArray()) { - if (!(data_ptr->joints << _JsonValue[GLTFTEXT("joints")])) return false; + if (!(_rData.joints << _JsonValue[GLTFTEXT("joints")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("inverseBindMatrices")) && _JsonValue[GLTFTEXT("inverseBindMatrices")].IsInt()) { - if (!(data_ptr->inverseBindMatrices << _JsonValue[GLTFTEXT("inverseBindMatrices")])) return false; + if (!(_rData.inverseBindMatrices << _JsonValue[GLTFTEXT("inverseBindMatrices")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("skeleton")) && _JsonValue[GLTFTEXT("skeleton")].IsInt()) { - if (!(data_ptr->skeleton << _JsonValue[GLTFTEXT("skeleton")])) return false; + if (!(_rData.skeleton << _JsonValue[GLTFTEXT("skeleton")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("skin.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SSkin& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!_pData->joints.empty()) + if (!_rData.joints.empty()) { GLTFCharValue json_value; - if (!(_pData->joints >> json_value)) return false; + if (!(_rData.joints >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("joints"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->inverseBindMatrices) + if (!!_rData.inverseBindMatrices) { GLTFCharValue json_value; - if (!(_pData->inverseBindMatrices >> json_value)) return false; + if (!(_rData.inverseBindMatrices >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("inverseBindMatrices"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->skeleton) + if (!!_rData.skeleton) { GLTFCharValue json_value; - if (!(_pData->skeleton >> json_value)) return false; + if (!(_rData.skeleton >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("skeleton"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1535,76 +1978,89 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SMaterialPBRMetallicRoughness& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("roughnessFactor")) && _JsonValue[GLTFTEXT("roughnessFactor")].IsFloat()) { - data_ptr->roughnessFactor = _JsonValue[GLTFTEXT("roughnessFactor")].GetFloat(); + _rData.roughnessFactor = _JsonValue[GLTFTEXT("roughnessFactor")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("baseColorTexture")) && _JsonValue[GLTFTEXT("baseColorTexture")].IsObject()) { - if (!(data_ptr->baseColorTexture << _JsonValue[GLTFTEXT("baseColorTexture")])) return false; + if (!(_rData.baseColorTexture << _JsonValue[GLTFTEXT("baseColorTexture")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("metallicFactor")) && _JsonValue[GLTFTEXT("metallicFactor")].IsFloat()) { - data_ptr->metallicFactor = _JsonValue[GLTFTEXT("metallicFactor")].GetFloat(); + _rData.metallicFactor = _JsonValue[GLTFTEXT("metallicFactor")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("baseColorFactor")) && _JsonValue[GLTFTEXT("baseColorFactor")].IsArray()) { - if (!(data_ptr->baseColorFactor << _JsonValue[GLTFTEXT("baseColorFactor")])) return false; + if (!(_rData.baseColorFactor << _JsonValue[GLTFTEXT("baseColorFactor")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("metallicRoughnessTexture")) && _JsonValue[GLTFTEXT("metallicRoughnessTexture")].IsObject()) { - if (!(data_ptr->metallicRoughnessTexture << _JsonValue[GLTFTEXT("metallicRoughnessTexture")])) return false; + if (!(_rData.metallicRoughnessTexture << _JsonValue[GLTFTEXT("metallicRoughnessTexture")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("material.pbrMetallicRoughness.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SMaterialPBRMetallicRoughness& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->roughnessFactor >> json_value)) return false; + if (!(_rData.roughnessFactor >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("roughnessFactor"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->baseColorTexture) + if (!!_rData.baseColorTexture) { GLTFCharValue json_value; - if (!(_pData->baseColorTexture >> json_value)) return false; + if (!(_rData.baseColorTexture >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("baseColorTexture"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->metallicFactor >> json_value)) return false; + if (!(_rData.metallicFactor >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("metallicFactor"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->baseColorFactor.empty()) + if (!_rData.baseColorFactor.empty()) { GLTFCharValue json_value; - if (!(_pData->baseColorFactor >> json_value)) return false; + if (!(_rData.baseColorFactor >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("baseColorFactor"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->metallicRoughnessTexture) + if (!!_rData.metallicRoughnessTexture) { GLTFCharValue json_value; - if (!(_pData->metallicRoughnessTexture >> json_value)) return false; + if (!(_rData.metallicRoughnessTexture >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("metallicRoughnessTexture"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1615,57 +2071,127 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SKHR_draco_mesh_compressionextension& _rData, const GLTFCharValue& _JsonValue) + { + if (_JsonValue.HasMember(GLTFTEXT("attributes")) && _JsonValue[GLTFTEXT("attributes")].IsObject()) + { + if (!(_rData.attributes << _JsonValue[GLTFTEXT("attributes")])) return false; + } + if (_JsonValue.HasMember(GLTFTEXT("bufferView")) && _JsonValue[GLTFTEXT("bufferView")].IsInt()) + { + if (!(_rData.bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; + } + _rData.schemaType = GLTFTEXT("node.KHR_draco_mesh_compression.schema.json"); + return true; + } + + bool operator>>(const SKHR_draco_mesh_compressionextension& _rData, GLTFCharValue& _JsonValue) + { + if (!g_json_doc_ptr) return false; + _JsonValue.SetObject(); + if (!_rData.attributes.empty()) + { + GLTFCharValue json_value; + if (!(_rData.attributes >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("attributes"), json_value, g_json_doc_ptr->GetAllocator()); + } + if (!!_rData.bufferView) + { + GLTFCharValue json_value; + if (!(_rData.bufferView >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("bufferView"), json_value, g_json_doc_ptr->GetAllocator()); + } + return true; + } + + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) + { + return operator<< >(_vDatas, _JsonValue); + } + + bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue) + { + return operator>> >(_vDatas, _JsonValue); + } + + bool operator<<(SCamera& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("type")) && _JsonValue[GLTFTEXT("type")].IsString()) { - data_ptr->type = _JsonValue[GLTFTEXT("type")].GetString(); + _rData.type = _JsonValue[GLTFTEXT("type")].GetString(); } if (_JsonValue.HasMember(GLTFTEXT("perspective")) && _JsonValue[GLTFTEXT("perspective")].IsObject()) { - if (!(data_ptr->perspective << _JsonValue[GLTFTEXT("perspective")])) return false; + if (!(_rData.perspective << _JsonValue[GLTFTEXT("perspective")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("orthographic")) && _JsonValue[GLTFTEXT("orthographic")].IsObject()) { - if (!(data_ptr->orthographic << _JsonValue[GLTFTEXT("orthographic")])) return false; + if (!(_rData.orthographic << _JsonValue[GLTFTEXT("orthographic")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("camera.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SCamera& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->type >> json_value)) return false; + if (!(_rData.type >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("type"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->perspective) + if (!!_rData.perspective) { GLTFCharValue json_value; - if (!(_pData->perspective >> json_value)) return false; + if (!(_rData.perspective >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("perspective"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->orthographic) + if (!!_rData.orthographic) { GLTFCharValue json_value; - if (!(_pData->orthographic >> json_value)) return false; + if (!(_rData.orthographic >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("orthographic"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1676,56 +2202,69 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SImage& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("mimeType")) && _JsonValue[GLTFTEXT("mimeType")].IsString()) { - data_ptr->mimeType = _JsonValue[GLTFTEXT("mimeType")].GetString(); + _rData.mimeType = _JsonValue[GLTFTEXT("mimeType")].GetString(); } if (_JsonValue.HasMember(GLTFTEXT("bufferView")) && _JsonValue[GLTFTEXT("bufferView")].IsInt()) { - if (!(data_ptr->bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; + if (!(_rData.bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("uri")) && _JsonValue[GLTFTEXT("uri")].IsString()) { - data_ptr->uri = _JsonValue[GLTFTEXT("uri")].GetString(); + _rData.uri = _JsonValue[GLTFTEXT("uri")].GetString(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("image.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SImage& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->mimeType >> json_value)) return false; + if (!(_rData.mimeType >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("mimeType"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->bufferView) + if (!!_rData.bufferView) { GLTFCharValue json_value; - if (!(_pData->bufferView >> json_value)) return false; + if (!(_rData.bufferView >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("bufferView"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->uri >> json_value)) return false; + if (!(_rData.uri >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("uri"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1736,48 +2275,61 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(STexture& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("source")) && _JsonValue[GLTFTEXT("source")].IsInt()) { - if (!(data_ptr->source << _JsonValue[GLTFTEXT("source")])) return false; + if (!(_rData.source << _JsonValue[GLTFTEXT("source")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("sampler")) && _JsonValue[GLTFTEXT("sampler")].IsInt()) { - if (!(data_ptr->sampler << _JsonValue[GLTFTEXT("sampler")])) return false; + if (!(_rData.sampler << _JsonValue[GLTFTEXT("sampler")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("texture.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const STexture& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!!_pData->source) + if (!!_rData.source) { GLTFCharValue json_value; - if (!(_pData->source >> json_value)) return false; + if (!(_rData.source >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("source"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->sampler) + if (!!_rData.sampler) { GLTFCharValue json_value; - if (!(_pData->sampler >> json_value)) return false; + if (!(_rData.sampler >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("sampler"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1788,64 +2340,77 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SCameraOrthographic& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("xmag")) && _JsonValue[GLTFTEXT("xmag")].IsFloat()) { - data_ptr->xmag = _JsonValue[GLTFTEXT("xmag")].GetFloat(); + _rData.xmag = _JsonValue[GLTFTEXT("xmag")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("ymag")) && _JsonValue[GLTFTEXT("ymag")].IsFloat()) { - data_ptr->ymag = _JsonValue[GLTFTEXT("ymag")].GetFloat(); + _rData.ymag = _JsonValue[GLTFTEXT("ymag")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("zfar")) && _JsonValue[GLTFTEXT("zfar")].IsFloat()) { - data_ptr->zfar = _JsonValue[GLTFTEXT("zfar")].GetFloat(); + _rData.zfar = _JsonValue[GLTFTEXT("zfar")].GetFloat(); } if (_JsonValue.HasMember(GLTFTEXT("znear")) && _JsonValue[GLTFTEXT("znear")].IsFloat()) { - data_ptr->znear = _JsonValue[GLTFTEXT("znear")].GetFloat(); + _rData.znear = _JsonValue[GLTFTEXT("znear")].GetFloat(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("camera.orthographic.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SCameraOrthographic& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->xmag >> json_value)) return false; + if (!(_rData.xmag >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("xmag"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->ymag >> json_value)) return false; + if (!(_rData.ymag >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("ymag"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->zfar >> json_value)) return false; + if (!(_rData.zfar >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("zfar"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->znear >> json_value)) return false; + if (!(_rData.znear >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("znear"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1856,46 +2421,59 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SBuffer& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("byteLength")) && _JsonValue[GLTFTEXT("byteLength")].IsInt()) { - data_ptr->byteLength = _JsonValue[GLTFTEXT("byteLength")].GetInt(); + _rData.byteLength = _JsonValue[GLTFTEXT("byteLength")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("uri")) && _JsonValue[GLTFTEXT("uri")].IsString()) { - data_ptr->uri = _JsonValue[GLTFTEXT("uri")].GetString(); + _rData.uri = _JsonValue[GLTFTEXT("uri")].GetString(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("buffer.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SBuffer& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->byteLength >> json_value)) return false; + if (!(_rData.byteLength >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("byteLength"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->uri >> json_value)) return false; + if (!(_rData.uri >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("uri"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -1906,113 +2484,126 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SAccessor& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("count")) && _JsonValue[GLTFTEXT("count")].IsInt()) { - data_ptr->count = _JsonValue[GLTFTEXT("count")].GetInt(); + _rData.count = _JsonValue[GLTFTEXT("count")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("min")) && _JsonValue[GLTFTEXT("min")].IsArray()) { - if (!(data_ptr->min << _JsonValue[GLTFTEXT("min")])) return false; + if (!(_rData.min << _JsonValue[GLTFTEXT("min")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("max")) && _JsonValue[GLTFTEXT("max")].IsArray()) { - if (!(data_ptr->max << _JsonValue[GLTFTEXT("max")])) return false; + if (!(_rData.max << _JsonValue[GLTFTEXT("max")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("bufferView")) && _JsonValue[GLTFTEXT("bufferView")].IsInt()) { - if (!(data_ptr->bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; + if (!(_rData.bufferView << _JsonValue[GLTFTEXT("bufferView")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("componentType")) && _JsonValue[GLTFTEXT("componentType")].IsInt()) { - data_ptr->componentType = _JsonValue[GLTFTEXT("componentType")].GetInt(); + _rData.componentType = _JsonValue[GLTFTEXT("componentType")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("byteOffset")) && _JsonValue[GLTFTEXT("byteOffset")].IsInt()) { - data_ptr->byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); + _rData.byteOffset = _JsonValue[GLTFTEXT("byteOffset")].GetInt(); } if (_JsonValue.HasMember(GLTFTEXT("sparse")) && _JsonValue[GLTFTEXT("sparse")].IsObject()) { - if (!(data_ptr->sparse << _JsonValue[GLTFTEXT("sparse")])) return false; + if (!(_rData.sparse << _JsonValue[GLTFTEXT("sparse")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("type")) && _JsonValue[GLTFTEXT("type")].IsString()) { - data_ptr->type = _JsonValue[GLTFTEXT("type")].GetString(); + _rData.type = _JsonValue[GLTFTEXT("type")].GetString(); } if (_JsonValue.HasMember(GLTFTEXT("normalized")) && _JsonValue[GLTFTEXT("normalized")].IsBool()) { - data_ptr->normalized = _JsonValue[GLTFTEXT("normalized")].GetBool(); + _rData.normalized = _JsonValue[GLTFTEXT("normalized")].GetBool(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("accessor.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SAccessor& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFChildofRootProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } { GLTFCharValue json_value; - if (!(_pData->count >> json_value)) return false; + if (!(_rData.count >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("count"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->min.empty()) + if (!_rData.min.empty()) { GLTFCharValue json_value; - if (!(_pData->min >> json_value)) return false; + if (!(_rData.min >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("min"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->max.empty()) + if (!_rData.max.empty()) { GLTFCharValue json_value; - if (!(_pData->max >> json_value)) return false; + if (!(_rData.max >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("max"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->bufferView) + if (!!_rData.bufferView) { GLTFCharValue json_value; - if (!(_pData->bufferView >> json_value)) return false; + if (!(_rData.bufferView >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("bufferView"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->componentType >> json_value)) return false; + if (!(_rData.componentType >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("componentType"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->byteOffset >> json_value)) return false; + if (!(_rData.byteOffset >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("byteOffset"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->sparse) + if (!!_rData.sparse) { GLTFCharValue json_value; - if (!(_pData->sparse >> json_value)) return false; + if (!(_rData.sparse >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("sparse"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->type >> json_value)) return false; + if (!(_rData.type >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("type"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->normalized >> json_value)) return false; + if (!(_rData.normalized >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("normalized"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -2023,198 +2614,211 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(SGlTF& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("textures")) && _JsonValue[GLTFTEXT("textures")].IsArray()) { - if (!(data_ptr->textures << _JsonValue[GLTFTEXT("textures")])) return false; + if (!(_rData.textures << _JsonValue[GLTFTEXT("textures")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("cameras")) && _JsonValue[GLTFTEXT("cameras")].IsArray()) { - if (!(data_ptr->cameras << _JsonValue[GLTFTEXT("cameras")])) return false; + if (!(_rData.cameras << _JsonValue[GLTFTEXT("cameras")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("accessors")) && _JsonValue[GLTFTEXT("accessors")].IsArray()) { - if (!(data_ptr->accessors << _JsonValue[GLTFTEXT("accessors")])) return false; + if (!(_rData.accessors << _JsonValue[GLTFTEXT("accessors")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("extensionsUsed")) && _JsonValue[GLTFTEXT("extensionsUsed")].IsArray()) { - if (!(data_ptr->extensionsUsed << _JsonValue[GLTFTEXT("extensionsUsed")])) return false; + if (!(_rData.extensionsUsed << _JsonValue[GLTFTEXT("extensionsUsed")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("samplers")) && _JsonValue[GLTFTEXT("samplers")].IsArray()) { - if (!(data_ptr->samplers << _JsonValue[GLTFTEXT("samplers")])) return false; + if (!(_rData.samplers << _JsonValue[GLTFTEXT("samplers")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("scenes")) && _JsonValue[GLTFTEXT("scenes")].IsArray()) { - if (!(data_ptr->scenes << _JsonValue[GLTFTEXT("scenes")])) return false; + if (!(_rData.scenes << _JsonValue[GLTFTEXT("scenes")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("scene")) && _JsonValue[GLTFTEXT("scene")].IsInt()) { - if (!(data_ptr->scene << _JsonValue[GLTFTEXT("scene")])) return false; + if (!(_rData.scene << _JsonValue[GLTFTEXT("scene")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("extensionsRequired")) && _JsonValue[GLTFTEXT("extensionsRequired")].IsArray()) { - if (!(data_ptr->extensionsRequired << _JsonValue[GLTFTEXT("extensionsRequired")])) return false; + if (!(_rData.extensionsRequired << _JsonValue[GLTFTEXT("extensionsRequired")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("meshes")) && _JsonValue[GLTFTEXT("meshes")].IsArray()) { - if (!(data_ptr->meshes << _JsonValue[GLTFTEXT("meshes")])) return false; + if (!(_rData.meshes << _JsonValue[GLTFTEXT("meshes")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("animations")) && _JsonValue[GLTFTEXT("animations")].IsArray()) { - if (!(data_ptr->animations << _JsonValue[GLTFTEXT("animations")])) return false; + if (!(_rData.animations << _JsonValue[GLTFTEXT("animations")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("images")) && _JsonValue[GLTFTEXT("images")].IsArray()) { - if (!(data_ptr->images << _JsonValue[GLTFTEXT("images")])) return false; + if (!(_rData.images << _JsonValue[GLTFTEXT("images")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("nodes")) && _JsonValue[GLTFTEXT("nodes")].IsArray()) { - if (!(data_ptr->nodes << _JsonValue[GLTFTEXT("nodes")])) return false; + if (!(_rData.nodes << _JsonValue[GLTFTEXT("nodes")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("bufferViews")) && _JsonValue[GLTFTEXT("bufferViews")].IsArray()) { - if (!(data_ptr->bufferViews << _JsonValue[GLTFTEXT("bufferViews")])) return false; + if (!(_rData.bufferViews << _JsonValue[GLTFTEXT("bufferViews")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("skins")) && _JsonValue[GLTFTEXT("skins")].IsArray()) { - if (!(data_ptr->skins << _JsonValue[GLTFTEXT("skins")])) return false; + if (!(_rData.skins << _JsonValue[GLTFTEXT("skins")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("materials")) && _JsonValue[GLTFTEXT("materials")].IsArray()) { - if (!(data_ptr->materials << _JsonValue[GLTFTEXT("materials")])) return false; + if (!(_rData.materials << _JsonValue[GLTFTEXT("materials")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("buffers")) && _JsonValue[GLTFTEXT("buffers")].IsArray()) { - if (!(data_ptr->buffers << _JsonValue[GLTFTEXT("buffers")])) return false; + if (!(_rData.buffers << _JsonValue[GLTFTEXT("buffers")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("asset")) && _JsonValue[GLTFTEXT("asset")].IsObject()) { - if (!(data_ptr->asset << _JsonValue[GLTFTEXT("asset")])) return false; + if (!(_rData.asset << _JsonValue[GLTFTEXT("asset")])) return false; } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("glTF.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const SGlTF& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!_pData->textures.empty()) + if (!_rData.textures.empty()) { GLTFCharValue json_value; - if (!(_pData->textures >> json_value)) return false; + if (!(_rData.textures >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("textures"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->cameras.empty()) + if (!_rData.cameras.empty()) { GLTFCharValue json_value; - if (!(_pData->cameras >> json_value)) return false; + if (!(_rData.cameras >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("cameras"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->accessors.empty()) + if (!_rData.accessors.empty()) { GLTFCharValue json_value; - if (!(_pData->accessors >> json_value)) return false; + if (!(_rData.accessors >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("accessors"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->extensionsUsed.empty()) + if (!_rData.extensionsUsed.empty()) { GLTFCharValue json_value; - if (!(_pData->extensionsUsed >> json_value)) return false; + if (!(_rData.extensionsUsed >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("extensionsUsed"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->samplers.empty()) + if (!_rData.samplers.empty()) { GLTFCharValue json_value; - if (!(_pData->samplers >> json_value)) return false; + if (!(_rData.samplers >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("samplers"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->scenes.empty()) + if (!_rData.scenes.empty()) { GLTFCharValue json_value; - if (!(_pData->scenes >> json_value)) return false; + if (!(_rData.scenes >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("scenes"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->scene) + if (!!_rData.scene) { GLTFCharValue json_value; - if (!(_pData->scene >> json_value)) return false; + if (!(_rData.scene >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("scene"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->extensionsRequired.empty()) + if (!_rData.extensionsRequired.empty()) { GLTFCharValue json_value; - if (!(_pData->extensionsRequired >> json_value)) return false; + if (!(_rData.extensionsRequired >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("extensionsRequired"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->meshes.empty()) + if (!_rData.meshes.empty()) { GLTFCharValue json_value; - if (!(_pData->meshes >> json_value)) return false; + if (!(_rData.meshes >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("meshes"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->animations.empty()) + if (!_rData.animations.empty()) { GLTFCharValue json_value; - if (!(_pData->animations >> json_value)) return false; + if (!(_rData.animations >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("animations"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->images.empty()) + if (!_rData.images.empty()) { GLTFCharValue json_value; - if (!(_pData->images >> json_value)) return false; + if (!(_rData.images >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("images"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->nodes.empty()) + if (!_rData.nodes.empty()) { GLTFCharValue json_value; - if (!(_pData->nodes >> json_value)) return false; + if (!(_rData.nodes >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("nodes"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->bufferViews.empty()) + if (!_rData.bufferViews.empty()) { GLTFCharValue json_value; - if (!(_pData->bufferViews >> json_value)) return false; + if (!(_rData.bufferViews >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("bufferViews"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->skins.empty()) + if (!_rData.skins.empty()) { GLTFCharValue json_value; - if (!(_pData->skins >> json_value)) return false; + if (!(_rData.skins >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("skins"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->materials.empty()) + if (!_rData.materials.empty()) { GLTFCharValue json_value; - if (!(_pData->materials >> json_value)) return false; + if (!(_rData.materials >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("materials"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!_pData->buffers.empty()) + if (!_rData.buffers.empty()) { GLTFCharValue json_value; - if (!(_pData->buffers >> json_value)) return false; + if (!(_rData.buffers >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("buffers"), json_value, g_json_doc_ptr->GetAllocator()); } - if (!!_pData->asset) + if (!!_rData.asset) { GLTFCharValue json_value; - if (!(_pData->asset >> json_value)) return false; + if (!(_rData.asset >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("asset"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); @@ -2225,47 +2829,60 @@ namespace libgltf return operator>> >(_vDatas, _JsonValue); } - bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + bool operator<<(STextureInfo& _rData, const GLTFCharValue& _JsonValue) { - std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); { - std::shared_ptr super_ptr = data_ptr; + SGlTFProperty& super_ptr = _rData; if (!(super_ptr << _JsonValue)) return false; } if (_JsonValue.HasMember(GLTFTEXT("index")) && _JsonValue[GLTFTEXT("index")].IsInt()) { - if (!(data_ptr->index << _JsonValue[GLTFTEXT("index")])) return false; + if (!(_rData.index << _JsonValue[GLTFTEXT("index")])) return false; } if (_JsonValue.HasMember(GLTFTEXT("texCoord")) && _JsonValue[GLTFTEXT("texCoord")].IsInt()) { - data_ptr->texCoord = _JsonValue[GLTFTEXT("texCoord")].GetInt(); + _rData.texCoord = _JsonValue[GLTFTEXT("texCoord")].GetInt(); } - _pData = data_ptr; + _rData.schemaType = GLTFTEXT("textureInfo.schema.json"); return true; } - bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + bool operator>>(const STextureInfo& _rData, GLTFCharValue& _JsonValue) { - if (!_pData || !g_json_doc_ptr) return false; + if (!g_json_doc_ptr) return false; _JsonValue.SetObject(); { - const std::shared_ptr super_ptr = _pData; + const SGlTFProperty& super_ptr = _rData; if (!(super_ptr >> _JsonValue)) return false; } - if (!!_pData->index) + if (!!_rData.index) { GLTFCharValue json_value; - if (!(_pData->index >> json_value)) return false; + if (!(_rData.index >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("index"), json_value, g_json_doc_ptr->GetAllocator()); } { GLTFCharValue json_value; - if (!(_pData->texCoord >> json_value)) return false; + if (!(_rData.texCoord >> json_value)) return false; _JsonValue.AddMember(GLTFTEXT("texCoord"), json_value, g_json_doc_ptr->GetAllocator()); } return true; } + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue) + { + std::shared_ptr data_ptr = !!_pData ? _pData : std::make_shared(); + if (!(*data_ptr << _JsonValue)) return false; + _pData = data_ptr; + return true; + } + + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue) + { + if (!_pData) return false; + return (*_pData >> _JsonValue); + } + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue) { return operator<< >(_vDatas, _JsonValue); diff --git a/source/libgltf/libgltfparser.h b/source/libgltf/libgltfparser.h index f873f34..3b16a9a 100644 --- a/source/libgltf/libgltfparser.h +++ b/source/libgltf/libgltfparser.h @@ -7,166 +7,246 @@ namespace libgltf { + bool operator<<(struct SGlTFProperty& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SGlTFProperty& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SMaterial& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SMaterial& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAsset& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAsset& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SSampler& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SSampler& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SGlTFChildofRootProperty& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SGlTFChildofRootProperty& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAnimationSampler& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAnimationSampler& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SExtras& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SExtras& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SScene& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SScene& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SCameraPerspective& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SCameraPerspective& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SBufferView& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SBufferView& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SMaterialNormalTextureInfo& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SMaterialNormalTextureInfo& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SMaterialOcclusionTextureInfo& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SMaterialOcclusionTextureInfo& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAccessorSparseValues& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAccessorSparseValues& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAnimationChannelTarget& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAnimationChannelTarget& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SMesh& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SMesh& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAccessorSparse& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAccessorSparse& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SMeshPrimitive& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SMeshPrimitive& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SKHR_materials_pbrSpecularGlossinessglTFextension& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SKHR_materials_pbrSpecularGlossinessglTFextension& _rData, GLTFCharValue& _JsonValue); + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); + bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + + bool operator<<(struct SExtension& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SExtension& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAnimationChannel& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAnimationChannel& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SGlTFId& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SGlTFId& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAccessorSparseIndices& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAccessorSparseIndices& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SNode& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SNode& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAnimation& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAnimation& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SSkin& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SSkin& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SMaterialPBRMetallicRoughness& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SMaterialPBRMetallicRoughness& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SKHR_draco_mesh_compressionextension& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SKHR_draco_mesh_compressionextension& _rData, GLTFCharValue& _JsonValue); + bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); + bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); + bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); + bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + + bool operator<<(struct SCamera& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SCamera& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SImage& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SImage& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct STexture& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct STexture& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SCameraOrthographic& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SCameraOrthographic& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SBuffer& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SBuffer& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SAccessor& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SAccessor& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct SGlTF& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct SGlTF& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); bool operator>>(const std::vector>& _vDatas, GLTFCharValue& _JsonValue); + bool operator<<(struct STextureInfo& _rData, const GLTFCharValue& _JsonValue); + bool operator>>(const struct STextureInfo& _rData, GLTFCharValue& _JsonValue); bool operator<<(std::shared_ptr& _pData, const GLTFCharValue& _JsonValue); bool operator>>(const std::shared_ptr& _pData, GLTFCharValue& _JsonValue); bool operator<<(std::vector>& _vDatas, const GLTFCharValue& _JsonValue); diff --git a/tools/batch/codes/extension.schema.json.function.cpp b/tools/batch/codes/extension.schema.json.function.cpp new file mode 100644 index 0000000..e69de29 diff --git a/tools/batch/codes/extension.schema.json.h b/tools/batch/codes/extension.schema.json.h new file mode 100644 index 0000000..8ea3a31 --- /dev/null +++ b/tools/batch/codes/extension.schema.json.h @@ -0,0 +1 @@ +std::map> properties; \ No newline at end of file diff --git a/tools/batch/codes/extension.schema.json.parser.from.cpp b/tools/batch/codes/extension.schema.json.parser.from.cpp new file mode 100644 index 0000000..6c0b040 --- /dev/null +++ b/tools/batch/codes/extension.schema.json.parser.from.cpp @@ -0,0 +1,14 @@ +if (_JsonValue.HasMember(GLTFTEXT("KHR_draco_mesh_compression")) && _JsonValue[GLTFTEXT("KHR_draco_mesh_compression")].IsObject()) +{ + std::shared_ptr extension; + if (!(extension << _JsonValue[GLTFTEXT("KHR_draco_mesh_compression")])) return false; + _rData.properties.insert(std::make_pair(GLTFTEXT("KHR_draco_mesh_compression"), extension)); +} +if (_JsonValue.HasMember(GLTFTEXT("KHR_materials_pbrSpecularGlossiness")) && _JsonValue[GLTFTEXT("KHR_materials_pbrSpecularGlossiness")].IsObject()) +{ + std::shared_ptr extension; + if (!(extension << _JsonValue[GLTFTEXT("KHR_materials_pbrSpecularGlossiness")])) return false; + _rData.properties.insert(std::make_pair(GLTFTEXT("KHR_materials_pbrSpecularGlossiness"), extension)); +} +_rData.schemaType = GLTFTEXT("extension.schema.json"); +return true; \ No newline at end of file diff --git a/tools/batch/codes/extension.schema.json.parser.to.cpp b/tools/batch/codes/extension.schema.json.parser.to.cpp new file mode 100644 index 0000000..c8654e4 --- /dev/null +++ b/tools/batch/codes/extension.schema.json.parser.to.cpp @@ -0,0 +1,22 @@ +if (!_rData || !g_json_doc_ptr) return false; +_JsonValue.SetObject(); +for (const std::pair>& extensionProperty : _rData.properties) +{ + const std::shared_ptr& extensionValue = extensionProperty.second; + if (!extensionValue) return false; + if (extensionValue->schemaType == GLTFTEXT("node.KHR_draco_mesh_compression.schema.json")) + { + const SKHR_draco_mesh_compressionextension& extension = *((const SKHR_draco_mesh_compressionextension*)extensionValue.get()); + GLTFCharValue json_value; + if (!(extension >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("KHR_draco_mesh_compression"), json_value, g_json_doc_ptr->GetAllocator()); + } + else if (extensionValue->schemaType == GLTFTEXT("glTF.KHR_materials_pbrSpecularGlossiness.schema.json")) + { + const SKHR_materials_pbrSpecularGlossinessglTFextension& extension = *((const SKHR_materials_pbrSpecularGlossinessglTFextension*)extensionValue.get()); + GLTFCharValue json_value; + if (!(extension >> json_value)) return false; + _JsonValue.AddMember(GLTFTEXT("KHR_materials_pbrSpecularGlossiness"), json_value, g_json_doc_ptr->GetAllocator()); + } +} +return true; \ No newline at end of file diff --git a/tools/batch/codes/extension.schema.json.variable.cpp b/tools/batch/codes/extension.schema.json.variable.cpp new file mode 100644 index 0000000..e5eddee --- /dev/null +++ b/tools/batch/codes/extension.schema.json.variable.cpp @@ -0,0 +1 @@ +properties() \ No newline at end of file diff --git a/tools/batch/glTF_2.0_schema.ini b/tools/batch/glTF_2.0_schema.ini new file mode 100644 index 0000000..f1bcdf2 --- /dev/null +++ b/tools/batch/glTF_2.0_schema.ini @@ -0,0 +1,29 @@ +[glTF] +schema_directory=%(CD)s/../../external/glTF/specification/2.0/schema/ +code_file_name=libgltf +extensions_schema_directories= + %(CD)s/../../external/glTF/extensions/2.0/Khronos/KHR_draco_mesh_compression/schema, + %(CD)s/../../external/glTF/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness/schema +major_version=0 +minor_version=1 +patch_version=0 + +[code.headers] +extension.schema.json=%(CD)s/codes/extension.schema.json.h + +[code.sources.variable] +extension.schema.json=%(CD)s/codes/extension.schema.json.variable.cpp + +[code.sources.function] +extension.schema.json=%(CD)s/codes/extension.schema.json.function.cpp + +[code.parsers.to] +extension.schema.json=%(CD)s/codes/extension.schema.json.parser.to.cpp + +[code.parsers.from] +extension.schema.json=%(CD)s/codes/extension.schema.json.parser.from.cpp + +[output] +output_header_path=%(CD)s/../../include/libgltf +output_source_path=%(CD)s/../../source/libgltf +namespace=libgltf diff --git a/tools/batch/update_parser_by_scheme.bat b/tools/batch/update_parser_by_scheme.bat index ffd5ec9..be785f9 100644 --- a/tools/batch/update_parser_by_scheme.bat +++ b/tools/batch/update_parser_by_scheme.bat @@ -1,7 +1,3 @@ echo off - echo Generate the cpp code by glTF 2.0 schema files - -python .\..\..\tools\jsonschematoc11 .\..\..\external\glTF\specification\2.0\schema\ libgltf --output_header_path=.\..\..\include\libgltf\ --output_source_path=.\..\..\source\libgltf --namespace=libgltf - -pause +python .\..\..\tools\jsonschematoc11 glTF_2.0_schema.ini \ No newline at end of file diff --git a/tools/batch/update_parser_by_scheme.sh b/tools/batch/update_parser_by_scheme.sh index d6f49e9..e0ab288 100755 --- a/tools/batch/update_parser_by_scheme.sh +++ b/tools/batch/update_parser_by_scheme.sh @@ -1,11 +1,3 @@ #!/bin/bash - -function pause(){ - read -p "$*" -} - echo Generate the cpp code by glTF 2.0 schema files - -python ./../../tools/jsonschematoc11 ./../../external/glTF/specification/2.0/schema/ libgltf --output_header_path=./../../include/libgltf/ --output_source_path=./../../source/libgltf --namespace=libgltf - -pause 'Press [Enter] key to continue...' +python ./../../tools/jsonschematoc11 glTF_2.0_schema.ini \ No newline at end of file diff --git a/tools/jsonschematoc11/__init__.py b/tools/jsonschematoc11/__init__.py index 9da96dc..e6683f4 100644 --- a/tools/jsonschematoc11/__init__.py +++ b/tools/jsonschematoc11/__init__.py @@ -2,5 +2,10 @@ from jsonschematoc11 import JSONSchemaToC11 if __name__ == u'__main__': - (errorCode, errorMessage) = JSONSchemaToC11(sys.argv[1:]) - exit(errorCode) + (error_code, error_message) = JSONSchemaToC11(sys.argv[1:]) + if error_code != 0: + print u'Failed: ', error_message + sys.exit(error_code) + else: + print u'Success' + exit(error_code) diff --git a/tools/jsonschematoc11/__main__.py b/tools/jsonschematoc11/__main__.py index 9da96dc..e6683f4 100644 --- a/tools/jsonschematoc11/__main__.py +++ b/tools/jsonschematoc11/__main__.py @@ -2,5 +2,10 @@ from jsonschematoc11 import JSONSchemaToC11 if __name__ == u'__main__': - (errorCode, errorMessage) = JSONSchemaToC11(sys.argv[1:]) - exit(errorCode) + (error_code, error_message) = JSONSchemaToC11(sys.argv[1:]) + if error_code != 0: + print u'Failed: ', error_message + sys.exit(error_code) + else: + print u'Success' + exit(error_code) diff --git a/tools/jsonschematoc11/c11types/__init__.py b/tools/jsonschematoc11/c11types/__init__.py index 298abba..4f8adee 100644 --- a/tools/jsonschematoc11/c11types/__init__.py +++ b/tools/jsonschematoc11/c11types/__init__.py @@ -7,7 +7,7 @@ from c11typemap import C11TypeMap from c11typestruct import C11TypeStruct -def BuildC11Type(schemaName, schemaValue, isSchema=False): +def BuildC11Type(schemaName, schemaValue, isSchema=False, manualCodeHeaders=None, manualCodeSourcesVariable=None, manualCodeSourcesFunction=None, manualCodeParsersFrom=None, manualCodeParsersTo=None): if u'title' not in schemaValue: return (None, 1, u'can\'t get the attribute `title` in %s' % schemaName) c11Type = None @@ -28,4 +28,5 @@ def BuildC11Type(schemaName, schemaValue, isSchema=False): if c11Type == None: c11Type = C11TypeStruct() c11Type.setSchema(schemaName, schemaValue) + c11Type.setCodes(manualCodeHeaders, manualCodeSourcesVariable, manualCodeSourcesFunction, manualCodeParsersFrom, manualCodeParsersTo) return (c11Type, 0, None) diff --git a/tools/jsonschematoc11/c11types/c11type.py b/tools/jsonschematoc11/c11types/c11type.py index 5e882b8..25d35ad 100644 --- a/tools/jsonschematoc11/c11types/c11type.py +++ b/tools/jsonschematoc11/c11types/c11type.py @@ -8,6 +8,13 @@ def __init__(self): self.schemaValue = None self.typeName = None + def setCodes(self, manualCodeHeaders, manualCodeSourcesVariable, manualCodeSourcesFunction, manualCodeParsersFrom, manualCodeParsersTo): + self.manualCodeHeaders = manualCodeHeaders + self.manualCodeSourcesVariable = manualCodeSourcesVariable + self.manualCodeSourcesFunction = manualCodeSourcesFunction + self.manualCodeParsersFrom = manualCodeParsersFrom + self.manualCodeParsersTo = manualCodeParsersTo + def setSchema(self, schemaName, schemaValue): self.schemaName = schemaName self.schemaValue = schemaValue diff --git a/tools/jsonschematoc11/c11types/c11typearray.py b/tools/jsonschematoc11/c11types/c11typearray.py index 6245a9f..6429e32 100644 --- a/tools/jsonschematoc11/c11types/c11typearray.py +++ b/tools/jsonschematoc11/c11types/c11typearray.py @@ -82,7 +82,7 @@ def codeJsonCheck(self): return u'IsArray()' def codeJsonSet(self, dataName, variableName): - return u'if (!(%s->%s << _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) + return u'if (!(%s.%s << _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) def codeJsonGet(self, dataName, variableName): - return u'if (!(%s->%s >> _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) + return u'if (!(%s.%s >> _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) diff --git a/tools/jsonschematoc11/c11types/c11typebool.py b/tools/jsonschematoc11/c11types/c11typebool.py index a54c7ae..c31d71c 100644 --- a/tools/jsonschematoc11/c11types/c11typebool.py +++ b/tools/jsonschematoc11/c11types/c11typebool.py @@ -17,7 +17,7 @@ def codeDefaultValue(cls, schemaDefaultValue): @classmethod def codeDefaultValueArray(cls, schemaDefaultValue): if schemaDefaultValue is None\ - or isinstance(schemaDefaultValue) is not list\ + or not isinstance(schemaDefaultValue, list)\ or len(schemaDefaultValue) <= 0: return u'' codeDefauleValue = u'' @@ -35,8 +35,8 @@ def codeJsonCheck(cls): @classmethod def codeJsonSet(cls, dataName, variableName): - return u'%s->%s = _JsonValue[GLTFTEXT("%s")].GetBool();' % (dataName, variableName, variableName) + return u'%s.%s = _JsonValue[GLTFTEXT("%s")].GetBool();' % (dataName, variableName, variableName) @classmethod def codeJsonGet(cls, dataName, variableName): - return u'_JsonValue[GLTFTEXT("%s")].SetBool(%s->%s);' % (variableName, dataName, variableName) + return u'_JsonValue[GLTFTEXT("%s")].SetBool(%s.%s);' % (variableName, dataName, variableName) diff --git a/tools/jsonschematoc11/c11types/c11typeinteger.py b/tools/jsonschematoc11/c11types/c11typeinteger.py index 84e804e..61f18fc 100644 --- a/tools/jsonschematoc11/c11types/c11typeinteger.py +++ b/tools/jsonschematoc11/c11types/c11typeinteger.py @@ -17,7 +17,7 @@ def codeDefaultValue(cls, schemaDefaultValue): @classmethod def codeDefaultValueArray(cls, schemaDefaultValue): - if schemaDefaultValue is None or isinstance(schemaDefaultValue) != list or len(schemaDefaultValue) <= 0: + if schemaDefaultValue is None or isinstance(schemaDefaultValue, list) or len(schemaDefaultValue) <= 0: return u'' codeDefauleValue = u'' for i in range(0, len(schemaDefaultValue)): @@ -31,8 +31,8 @@ def codeJsonCheck(cls): @classmethod def codeJsonSet(cls, dataName, variableName): - return u'%s->%s = _JsonValue[GLTFTEXT("%s")].GetInt();' % (dataName, variableName, variableName) + return u'%s.%s = _JsonValue[GLTFTEXT("%s")].GetInt();' % (dataName, variableName, variableName) @classmethod def codeJsonGet(cls, dataName, variableName): - return u'_JsonValue[GLTFTEXT("%s")].SetInt(%s->%s);' % (variableName, dataName, variableName) + return u'_JsonValue[GLTFTEXT("%s")].SetInt(%s.%s);' % (variableName, dataName, variableName) diff --git a/tools/jsonschematoc11/c11types/c11typemap.py b/tools/jsonschematoc11/c11types/c11typemap.py index fce541b..732a9cd 100644 --- a/tools/jsonschematoc11/c11types/c11typemap.py +++ b/tools/jsonschematoc11/c11types/c11typemap.py @@ -77,8 +77,8 @@ def codeJsonCheck(cls): @classmethod def codeJsonSet(cls, dataName, variableName): - return u'if (!(%s->%s << _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) + return u'if (!(%s.%s << _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) @classmethod def codeJsonGet(cls, dataName, variableName): - return u'if (!(%s->%s >> _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) + return u'if (!(%s.%s >> _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) diff --git a/tools/jsonschematoc11/c11types/c11typenumber.py b/tools/jsonschematoc11/c11types/c11typenumber.py index 48e386e..59d622d 100644 --- a/tools/jsonschematoc11/c11types/c11typenumber.py +++ b/tools/jsonschematoc11/c11types/c11typenumber.py @@ -33,8 +33,8 @@ def codeJsonCheck(cls): @classmethod def codeJsonSet(cls, dataName, variableName): - return u'%s->%s = _JsonValue[GLTFTEXT("%s")].GetFloat();' % (dataName, variableName, variableName) + return u'%s.%s = _JsonValue[GLTFTEXT("%s")].GetFloat();' % (dataName, variableName, variableName) @classmethod def codeJsonGet(cls, dataName, variableName): - return u'_JsonValue[GLTFTEXT("%s")].SetFloat(%s->%s);' % (variableName, dataName, variableName) + return u'_JsonValue[GLTFTEXT("%s")].SetFloat(%s.%s);' % (variableName, dataName, variableName) diff --git a/tools/jsonschematoc11/c11types/c11typestring.py b/tools/jsonschematoc11/c11types/c11typestring.py index 953bfc5..684f9c2 100644 --- a/tools/jsonschematoc11/c11types/c11typestring.py +++ b/tools/jsonschematoc11/c11types/c11typestring.py @@ -21,7 +21,7 @@ def codeDefaultValue(cls, schemaDefaultValue): @classmethod def codeDefaultValueArray(self, schemaDefaultValue): if schemaDefaultValue is None\ - or isinstance(schemaDefaultValue) is not list\ + or not isinstance(schemaDefaultValue, list)\ or len(schemaDefaultValue) <= 0: return u'' code_default_value = u'' @@ -36,8 +36,8 @@ def codeJsonCheck(cls): @classmethod def codeJsonSet(cls, dataName, variableName): - return u'%s->%s = _JsonValue[GLTFTEXT("%s")].GetString();' % (dataName, variableName, variableName) + return u'%s.%s = _JsonValue[GLTFTEXT("%s")].GetString();' % (dataName, variableName, variableName) @classmethod def codeJsonGet(cls, dataName, variableName): - return u'_JsonValue[GLTFTEXT("%s")].SetString(%s->%s.c_str(), g_json_doc_ptr->GetAllocator());' % (variableName, dataName, variableName) + return u'_JsonValue[GLTFTEXT("%s")].SetString(%s.%s.c_str(), g_json_doc_ptr->GetAllocator());' % (variableName, dataName, variableName) diff --git a/tools/jsonschematoc11/c11types/c11typestruct.py b/tools/jsonschematoc11/c11types/c11typestruct.py index b6070d4..b7ca1e7 100644 --- a/tools/jsonschematoc11/c11types/c11typestruct.py +++ b/tools/jsonschematoc11/c11types/c11typestruct.py @@ -45,14 +45,16 @@ def setSchema(self, schemaName, schemaValue): def haveParents(self): return len(self.parents) > 0 - def getParentTypeNames(self, recursion=True): + def getParentTypeNames(self, recursion=True, withDeclare=False, asVariable=False, withObject=False): parentTypeNames = [] for key in self.parents: parent = self.parents[key] if recursion: for parentParentTypeName in parent.getParentTypeNames(): parentTypeNames.append(parentParentTypeName) - parentTypeNames.append(parent.codeTypeName()) + parentTypeNames.append(parent.codeTypeName(withDeclare, asVariable)) + if withObject and len(parentTypeNames) <= 0: + parentTypeNames.append(u'SObject') return parentTypeNames def getVariableKeys(self, includeParent=False): @@ -91,6 +93,7 @@ def revise(self, c11Types): def codeTypeName(self, withDeclare=False, asVariable=False): codeLine = self.typeName if self.typeName == None: + #TODO: print u'dd' if withDeclare: codeLine = u'struct ' + codeLine @@ -100,7 +103,7 @@ def codeTypeName(self, withDeclare=False, asVariable=False): def codeInheritTypes(self): if len(self.parents) <= 0: - return u'' + return u' : SObject' code = u'' for parent in self.parents: code = code + u', %s' % self.parents[parent].codeTypeName() @@ -129,17 +132,28 @@ def codeHeader(self, codeTypeNames): codeLines.append(u' %s();' % self.codeTypeName()) codeLines.append(u'') codeLines.append(u' // Check valid') - codeLines.append(u' operator bool() const;') + codeLines.append(u' virtual operator bool() const;') + if self.c11Type != None: codeLines.append(u'') codeLines.append(u' operator %s() const;' % self.c11Type.codeTypeName()) codeLines.append(u'') codeLines.append(u' %s %sValue;' % (self.c11Type.codeTypeName(), self.c11Type.codeTypeName())) - codeLines.append(u'') - for variable in self.getVariables(): - if variable.hasComment(): - codeLines.append(u' // %s' % variable.codeComment()) - codeLines.append(u' %s;' % variable.codeDeclare()) + + variables = self.getVariables() + if variables is not None and len(variables) > 0: + codeLines.append(u'') + for variable in variables: + if variable.hasComment(): + codeLines.append(u' // %s' % variable.codeComment()) + codeLines.append(u' %s;' % variable.codeDeclare()) + + if self.manualCodeHeaders is not None and len(self.manualCodeHeaders) > 0: + codeLines.append(u'') + codeLines.append(u' // Manual code lines') + for code_header_line in self.manualCodeHeaders: + codeLines.append(u' %s' % code_header_line.replace(u'\n', u'')) + codeLines.append(u'};') return codeLines @@ -157,7 +171,7 @@ def codeSource(self, codeTypeNames): codeLines.append(u'%s::%s()' % (self.codeTypeName(), self.codeTypeName())) beginConstructorDefault = True - parentTypeNames = self.getParentTypeNames(recursion=False) + parentTypeNames = self.getParentTypeNames(recursion=False, withObject=True) for parentTypeName in parentTypeNames: if beginConstructorDefault: codeLines.append(u' : %s()' % parentTypeName) @@ -177,6 +191,15 @@ def codeSource(self, codeTypeNames): beginConstructorDefault = False else: codeLines.append(u' , %s' % variable.codeConstructorDefault()) + if self.manualCodeSourcesVariable is not None and len(self.manualCodeSourcesVariable) > 0: + codeLines.append(u' // Manual code lines') + for variable in self.manualCodeSourcesVariable: + if beginConstructorDefault: + codeLines.append(u' : %s' % variable) + beginConstructorDefault = False + else: + codeLines.append(u' , %s' % variable) + codeLines.append(u'{') codeLines.append(u' //') codeLines.append(u'}') @@ -192,10 +215,19 @@ def codeSource(self, codeTypeNames): codeLines.append(u'{') codeLines.append(u' return %sValue;' % (self.c11Type.codeTypeName())) codeLines.append(u'}') + + if self.manualCodeSourcesFunction is not None and len(self.manualCodeSourcesFunction) > 0: + codeLines.append(u'') + codeLines.append(u'// Manual code lines') + for code_source_function_line in self.manualCodeSourcesFunction: + codeLines.append(u'%s' % code_source_function_line.replace(u'\n', u'')) + return codeLines def codeParserHeader(self): codeLines = [] + codeLines.append(u'bool operator<<(%s& _rData, const GLTFCharValue& _JsonValue);' % (self.codeTypeName(withDeclare=True))) + codeLines.append(u'bool operator>>(const %s& _rData, GLTFCharValue& _JsonValue);' % (self.codeTypeName(withDeclare=True))) codeLines.append(u'bool operator<<(%s& _pData, const GLTFCharValue& _JsonValue);' % (self.codeTypeName(withDeclare=True, asVariable=True))) codeLines.append(u'bool operator>>(const %s& _pData, GLTFCharValue& _JsonValue);' % (self.codeTypeName(withDeclare=True, asVariable=True))) codeLines.append(u'bool operator<<(std::vector<%s>& _vDatas, const GLTFCharValue& _JsonValue);' % (self.codeTypeName(withDeclare=True, asVariable=True))) @@ -204,59 +236,86 @@ def codeParserHeader(self): def codeParserSource(self): codeLines = [] - codeLines.append(u'bool operator<<(%s& _pData, const GLTFCharValue& _JsonValue)' % (self.codeTypeName(asVariable=True))) + codeLines.append(u'bool operator<<(%s& _rData, const GLTFCharValue& _JsonValue)' % (self.codeTypeName())) codeLines.append(u'{') - codeLines.append(u' std::shared_ptr<%s> data_ptr = !!_pData ? _pData : std::make_shared<%s>();' % (self.codeTypeName(), self.codeTypeName())) + if self.manualCodeParsersFrom is not None and len(self.manualCodeParsersFrom) > 0: + codeLines.append(u' // Manual code lines') + for code_parser in self.manualCodeParsersFrom: + codeLines.append(u' %s' % code_parser.replace(u'\n', u'')) + else: + parentTypes = self.getParentTypeNames(recursion=False) + for parentType in parentTypes: + codeLines.append(u' {') + codeLines.append(u' %s& super_ptr = _rData;' % parentType) + codeLines.append(u' if (!(super_ptr << _JsonValue)) return false;') + codeLines.append(u' }') + + if self.c11Type != None: + codeLines.append(u' if (!(_rData.%sValue << _JsonValue)) return false;' % self.c11Type.codeTypeName()) + else: + variables = self.getVariables() + for variable in variables: + codeParserLines = variable.codeParser() + for codeParserLine in codeParserLines: + codeLines.append(u' %s' % codeParserLine) - parentTypes = self.getParentTypeNames(recursion=False) - for parentType in parentTypes: - codeLines.append(u' {') - codeLines.append(u' std::shared_ptr<%s> super_ptr = data_ptr;' % parentType) - codeLines.append(u' if (!(super_ptr << _JsonValue)) return false;') - codeLines.append(u' }') + codeLines.append(u' _rData.schemaType = GLTFTEXT("%s");' % (self.schemaName)) + codeLines.append(u' return true;') + codeLines.append(u'}') + codeLines.append(u'') - if self.c11Type != None: - codeLines.append(u' if (!(data_ptr->%sValue << _JsonValue)) return false;' % self.c11Type.codeTypeName()) + codeLines.append(u'bool operator>>(const %s& _rData, GLTFCharValue& _JsonValue)' % (self.codeTypeName())) + codeLines.append(u'{') + if self.manualCodeParsersTo is not None and len(self.manualCodeParsersTo) > 0: + codeLines.append(u' // Manual code lines') + for code_parser in self.manualCodeParsersTo: + codeLines.append(u' %s' % code_parser.replace(u'\n', u'')) else: - variables = self.getVariables() - for variable in variables: - codeParserLines = variable.codeParser() - for codeParserLine in codeParserLines: - codeLines.append(u' %s' % codeParserLine) + codeLines.append(u' if (!g_json_doc_ptr) return false;') + codeLines.append(u' _JsonValue.SetObject();') + + parentTypes = self.getParentTypeNames(recursion=False) + for parentType in parentTypes: + codeLines.append(u' {') + codeLines.append(u' const %s& super_ptr = _rData;' % parentType) + codeLines.append(u' if (!(super_ptr >> _JsonValue)) return false;') + codeLines.append(u' }') + + if self.c11Type != None: + codeLines.append(u' if (!(_rData.%sValue >> _JsonValue)) return false;' % self.c11Type.codeTypeName()) + else: + variables = self.getVariables() + for variable in variables: + codeParserLines = variable.codeParser(isSet=False) + for codeParserLine in codeParserLines: + codeLines.append(u' %s' % codeParserLine) + + codeLines.append(u' return true;') + codeLines.append(u'}') + codeLines.append(u'') + codeLines.append(u'bool operator<<(%s& _pData, const GLTFCharValue& _JsonValue)' % (self.codeTypeName(asVariable=True))) + codeLines.append(u'{') + codeLines.append(u' %s data_ptr = !!_pData ? _pData : std::make_shared<%s>();' % (self.codeTypeName(asVariable=True), self.codeTypeName())) + codeLines.append(u' if (!(*data_ptr << _JsonValue)) return false;') codeLines.append(u' _pData = data_ptr;') codeLines.append(u' return true;') codeLines.append(u'}') codeLines.append(u'') + codeLines.append(u'bool operator>>(const %s& _pData, GLTFCharValue& _JsonValue)' % (self.codeTypeName(asVariable=True))) codeLines.append(u'{') - codeLines.append(u' if (!_pData || !g_json_doc_ptr) return false;') - codeLines.append(u' _JsonValue.SetObject();') - - parentTypes = self.getParentTypeNames(recursion=False) - for parentType in parentTypes: - codeLines.append(u' {') - codeLines.append(u' const std::shared_ptr<%s> super_ptr = _pData;' % parentType) - codeLines.append(u' if (!(super_ptr >> _JsonValue)) return false;') - codeLines.append(u' }') - - if self.c11Type != None: - codeLines.append(u' if (!(_pData->%sValue >> _JsonValue)) return false;' % self.c11Type.codeTypeName()) - else: - variables = self.getVariables() - for variable in variables: - codeParserLines = variable.codeParser(isSet=False) - for codeParserLine in codeParserLines: - codeLines.append(u' %s' % codeParserLine) - - codeLines.append(u' return true;') + codeLines.append(u' if (!_pData) return false;') + codeLines.append(u' return (*_pData >> _JsonValue);') codeLines.append(u'}') codeLines.append(u'') + codeLines.append(u'bool operator<<(std::vector<%s>& _vDatas, const GLTFCharValue& _JsonValue)' % (self.codeTypeName(asVariable=True))) codeLines.append(u'{') codeLines.append(u' return operator<< <%s>(_vDatas, _JsonValue);' % (self.codeTypeName(asVariable=True))) codeLines.append(u'}') codeLines.append(u'') + codeLines.append(u'bool operator>>(const std::vector<%s>& _vDatas, GLTFCharValue& _JsonValue)' % (self.codeTypeName(asVariable=True))) codeLines.append(u'{') codeLines.append(u' return operator>> <%s>(_vDatas, _JsonValue);' % (self.codeTypeName(asVariable=True))) @@ -272,7 +331,7 @@ def codeJsonCheck(self): return self.c11Type.codeJsonCheck() def codeJsonSet(self, dataName, variableName): - return u'if (!(%s->%s << _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) + return u'if (!(%s.%s << _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) def codeJsonGet(self, dataName, variableName): - return u'if (!(%s->%s >> _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) + return u'if (!(%s.%s >> _JsonValue[GLTFTEXT("%s")])) return false;' % (dataName, variableName, variableName) diff --git a/tools/jsonschematoc11/c11types/c11variable.py b/tools/jsonschematoc11/c11types/c11variable.py index f42361f..8c6089c 100644 --- a/tools/jsonschematoc11/c11types/c11variable.py +++ b/tools/jsonschematoc11/c11types/c11variable.py @@ -101,20 +101,17 @@ def codeParser(self, isSet=True): codeLines.append(u'if (_JsonValue.HasMember(GLTFTEXT("%s")) && _JsonValue[GLTFTEXT("%s")].%s)' % (self.name, self.name, codeCheckLine)) else: if self.typeName == u'array' or self.typeName == u'map': - codeLines.append(u'if (!_pData->%s.empty())' % self.name) + codeLines.append(u'if (!_rData.%s.empty())' % self.name) elif self.typeName == u'struct': - codeLines.append(u'if (!!_pData->%s)' % self.name) + codeLines.append(u'if (!!_rData.%s)' % self.name) codeLines.append(u'{') if isSet: - codeSetLine = self.c11Type.codeJsonSet(u'data_ptr', self.name) + codeSetLine = self.c11Type.codeJsonSet(u'_rData', self.name) if codeSetLine != None and len(codeSetLine) > 0: codeLines.append(u' %s' % (codeSetLine)) else: codeLines.append(u' GLTFCharValue json_value;') - codeLines.append(u' if (!(_pData->%s >> json_value)) return false;' % self.name) + codeLines.append(u' if (!(_rData.%s >> json_value)) return false;' % self.name) codeLines.append(u' _JsonValue.AddMember(GLTFTEXT("%s"), json_value, g_json_doc_ptr->GetAllocator());' % self.name) - #codeGetLine = self.c11Type.codeJsonGet(u'_pData', self.name) - #if codeGetLine != None and len(codeGetLine) > 0: - # codeLines.append(u' %s' % (codeGetLine)) codeLines.append(u'}') return codeLines diff --git a/tools/jsonschematoc11/jsonschematoc11.py b/tools/jsonschematoc11/jsonschematoc11.py index 3b12b5a..13bdbfb 100644 --- a/tools/jsonschematoc11/jsonschematoc11.py +++ b/tools/jsonschematoc11/jsonschematoc11.py @@ -1,6 +1,7 @@ import sys import os import argparse +from ConfigParser import SafeConfigParser import logging import json @@ -14,19 +15,54 @@ class C11TypeLibrary(object): def __init__(self): self.c11Types = dict() + def setVersion(self, major=0, minor=0, patch=0): + self.major = major + self.minor = minor + self.patch = patch + def addC11Type(self, schemaName, c11Type): if schemaName in self.c11Types: return (1, u'already have %s in c11 type library' % schemaName) self.c11Types[schemaName] = c11Type return (0, u'') - def addSchema(self, rootPath, schemaFileName): + def addSchema(self, rootPath, schemaFileName, config=None): schema_file_path = os.path.join(rootPath, schemaFileName) with open(schema_file_path, u'r') as schema_file: schema = json.load(schema_file) if schema is None: return (1, u'Can\'t parse the schema file %s' % schema_file_path) - (c11_type, error_code, error_message) = BuildC11Type(schemaFileName, schema, isSchema=True) + code_headers = None + if config is not None and config.has_option(u'code.headers', schemaFileName): + code_file_path = config.get(u'code.headers', schemaFileName) + if os.path.isfile(code_file_path): + with open(code_file_path, u'r') as code_file: + code_headers = code_file.readlines() + code_sources_variable = None + if config is not None and config.has_option(u'code.sources.variable', schemaFileName): + code_file_path = config.get(u'code.sources.variable', schemaFileName) + if os.path.isfile(code_file_path): + with open(code_file_path, u'r') as code_file: + code_sources_variable = code_file.readlines() + code_sources_function = None + if config is not None and config.has_option(u'code.sources.function', schemaFileName): + code_file_path = config.get(u'code.sources.function', schemaFileName) + if os.path.isfile(code_file_path): + with open(code_file_path, u'r') as code_file: + code_sources_function = code_file.readlines() + code_parsers_from = None + if config is not None and config.has_option(u'code.parsers.from', schemaFileName): + code_file_path = config.get(u'code.parsers.from', schemaFileName) + if os.path.isfile(code_file_path): + with open(code_file_path, u'r') as code_file: + code_parsers_from = code_file.readlines() + code_parsers_to = None + if config is not None and config.has_option(u'code.parsers.to', schemaFileName): + code_file_path = config.get(u'code.parsers.to', schemaFileName) + if os.path.isfile(code_file_path): + with open(code_file_path, u'r') as code_file: + code_parsers_to = code_file.readlines() + (c11_type, error_code, error_message) = BuildC11Type(schemaFileName, schema, isSchema=True, manualCodeHeaders=code_headers, manualCodeSourcesVariable=code_sources_variable, manualCodeSourcesFunction=code_sources_function , manualCodeParsersFrom=code_parsers_from, manualCodeParsersTo=code_parsers_to) if error_code != 0: return (error_code, u'Has error when build - %s' % error_message) (error_code, error_message) = self.addC11Type(schemaFileName, c11_type) @@ -34,25 +70,48 @@ def addSchema(self, rootPath, schemaFileName): return (error_code, u'Has error when add - %s' % error_message) return (0, u'') - def addSchemaDirectory(self, schemaDirectory): - if not os.path.isdir(schemaDirectory): - return (1, u'The schema directory (%s) is not a valid directory' % schemaDirectory) + def addSchemaDirectory(self, schemaDirectory, config=None): + schema_directory = os.path.normpath(schemaDirectory) + if not os.path.isdir(schema_directory): + return (1, u'The schema directory (%s) is not a valid directory' % schema_directory) - for root_path, _, file_names in os.walk(schemaDirectory, topdown=False): + for root_path, _, file_names in os.walk(schema_directory, topdown=False): for file_name in file_names: if not file_name.endswith(u'schema.json'): continue - (error_code, error_message) = self.addSchema(root_path, file_name) + (error_code, error_message) = self.addSchema(root_path, file_name, config) if error_code != 0: return (error_code, error_message) return (0, u'') + def codeVersion(self): + code_lines = [] + code_lines.append(u'#define LIBGLTF_MAJOR_VERSION %s' % self.major) + code_lines.append(u'#define LIBGLTF_MINOR_VERSION %s' % self.minor) + code_lines.append(u'#define LIBGLTF_PATCH_VERSION %s' % self.patch) + return code_lines + @classmethod def codeHeaderParser(self): code_lines = [] code_lines.append(u'struct SGlTF;') code_lines.append(u'bool operator<<(std::shared_ptr& _pGlTF, const GLTFString& _sContent);') code_lines.append(u'bool operator>>(const std::shared_ptr& _pGlTF, GLTFString& _sContent);') + code_lines.append(u'struct SObject') + code_lines.append(u'{') + code_lines.append(u' SObject();') + code_lines.append(u' GLTFString schemaType;') + code_lines.append(u'};') + return code_lines + + @classmethod + def codeSourceParser(self): + code_lines = [] + code_lines.append(u'SObject::SObject()') + code_lines.append(u' : schemaType(GLTFTEXT(""))') + code_lines.append(u'{') + code_lines.append(u' //') + code_lines.append(u'}') return code_lines def preprocess(self): @@ -81,10 +140,13 @@ def generate(self, codeFileName, outputHeaderPath=None, outputSourcePath=None, n header_file.write(u'\n') begin_space = u'' - if nameSpace is not None: - header_file.write(u'namespace %s\n' % nameSpace) - header_file.write(u'{\n') - begin_space = u' ' + + code_version_parser_lines = self.codeVersion() + for code_version_parser_line in code_version_parser_lines: + code_version_parser_line = u'%s%s\n' % (begin_space, code_version_parser_line) + header_file.write(code_version_parser_line) + if code_version_parser_line: + header_file.write(u'\n') header_file.write(u'#if defined(LIBGLTF_USE_WCHAR)\n') header_file.write(u'%s%s\n' % (begin_space, u'typedef std::wstring GLTFString;')) @@ -93,6 +155,11 @@ def generate(self, codeFileName, outputHeaderPath=None, outputSourcePath=None, n header_file.write(u'#endif\n') header_file.write(u'\n') + if nameSpace is not None: + header_file.write(u'namespace %s\n' % nameSpace) + header_file.write(u'{\n') + begin_space = u' ' + code_header_parser_lines = self.codeHeaderParser() for code_header_parser_line in code_header_parser_lines: code_header_parser_line = u'%s%s\n' % (begin_space, code_header_parser_line) @@ -132,6 +199,13 @@ def generate(self, codeFileName, outputHeaderPath=None, outputSourcePath=None, n source_file.write(u'{\n') begin_space = u' ' + code_source_parser_lines = self.codeSourceParser() + for code_source_parser_line in code_source_parser_lines: + code_source_parser_line = u'%s%s\n' % (begin_space, code_source_parser_line) + source_file.write(code_source_parser_line) + if code_source_parser_lines: + source_file.write(u'\n') + parent_type_names = [] for key in self.c11Types: c11_type = self.c11Types[key] @@ -315,7 +389,11 @@ def generate(self, codeFileName, outputHeaderPath=None, outputSourcePath=None, n source_file.write(u'%s size_t len = json_array.Size();\n' % begin_space) source_file.write(u'%s if (len == 0) return true;\n' % begin_space) source_file.write(u'%s datas.resize(len);\n' % begin_space) - source_file.write(u'%s for (size_t i = 0; i < len; ++i) if (!(datas[i] << json_array[static_cast(i)])) return false;\n' % begin_space) + source_file.write(u'%s for (size_t i = 0; i < len; ++i)\n' % begin_space) + source_file.write(u'%s {\n' % begin_space) + source_file.write(u'%s if (datas[i] << json_array[static_cast(i)]) continue;\n' % begin_space) + source_file.write(u'%s return false;\n' % begin_space) + source_file.write(u'%s }\n' % begin_space) source_file.write(u'%s _vDatas = datas;\n' % begin_space) source_file.write(u'%s return true;\n' % begin_space) source_file.write(u'%s}\n' % begin_space) @@ -389,30 +467,54 @@ def generate(self, codeFileName, outputHeaderPath=None, outputSourcePath=None, n def JSONSchemaToC11(argv): parser = argparse.ArgumentParser(description=u'Generate c11 code by json schema.') - parser.add_argument(u'schemaDirectory', metavar=u'schema_directory', type=type(u''), help=u'The directory contains all schema files') - parser.add_argument(u'codeFileName', metavar=u'code_file_name', type=type(u''), help=u'The output filename of c11 code') - parser.add_argument(u'--output_header_path', type=type(u''), help=u'Set the output header path') - parser.add_argument(u'--output_source_path', type=type(u''), help=u'Set the output source path') - parser.add_argument(u'--namespace', type=type(u''), help=u'Set the namespace') + parser.add_argument(u'configFile', metavar=u'config_file', type=file, help=u'The configuration file') args = parser.parse_args(argv) - if args.output_header_path != None and not os.path.exists(args.output_header_path): + if not args.configFile: + return (1, u'Can\'t find the configuration file') + + os.environ['CD'] = os.path.dirname(os.path.abspath(args.configFile.name)) + + config = SafeConfigParser(os.environ) + config.readfp(args.configFile) + + schema_directory = config.get(u'glTF', u'schema_directory') + code_file_name = config.get(u'glTF', u'code_file_name') + extensions_schema_directories = [] + for extensions_schema_directory in config.get(u'glTF', u'extensions_schema_directories').split(u','): + extensions_schema_directories.append(extensions_schema_directory.replace(u'\n', u'')) + + major_version = config.get(u'glTF', u'major_version') + minor_version = config.get(u'glTF', u'minor_version') + patch_version = config.get(u'glTF', u'patch_version') + + output_header_path = config.get(u'output', u'output_header_path') + output_source_path = config.get(u'output', u'output_source_path') + namespace = config.get(u'output', u'namespace') + + if output_header_path != None and not os.path.exists(output_header_path): return (1, u'Invalid output header path') - if args.output_source_path != None and not os.path.exists(args.output_source_path): + if output_source_path != None and not os.path.exists(output_source_path): return (1, u'Invalid output source path') - if args.output_header_path == None: - args.output_header_path = u'./' - if args.output_source_path == None: - args.output_source_path = u'./' + if output_header_path == None: + output_header_path = u'./' + if output_source_path == None: + output_source_path = u'./' c11_type_library = C11TypeLibrary() - (error_code, error_message) = c11_type_library.addSchemaDirectory(args.schemaDirectory) + c11_type_library.setVersion(major_version, minor_version, patch_version) + (error_code, error_message) = c11_type_library.addSchemaDirectory(schema_directory, config) if error_code != 0: return (error_code, error_message) + for extensions_schema_directory in extensions_schema_directories: + (error_code, error_message) = c11_type_library.addSchemaDirectory(extensions_schema_directory, config) + if error_code != 0: + print error_code, error_message + return (error_code, error_message) (error_code, error_message) = c11_type_library.preprocess() if error_code != 0: return (error_code, error_message) - (error_code, error_message) = c11_type_library.generate(args.codeFileName, outputHeaderPath=args.output_header_path, outputSourcePath=args.output_source_path, nameSpace=args.namespace) + (error_code, error_message) = c11_type_library.generate(code_file_name, outputHeaderPath=output_header_path, outputSourcePath=output_source_path, nameSpace=namespace) if error_code != 0: return (error_code, error_message) return (0, u'') @@ -421,7 +523,7 @@ def JSONSchemaToC11(argv): (error_code, error_message) = JSONSchemaToC11(sys.argv[1:]) if error_code != 0: logger.error(error_message) + sys.exit(error_code) else: logger.info(u'Success') exit(error_code) -