Browse Source

Serialize userData.gltfExtensions

Robert Long 7 years ago
parent
commit
0b1c3a0992
1 changed files with 39 additions and 18 deletions
  1. 39 18
      examples/js/exporters/GLTFExporter.js

+ 39 - 18
examples/js/exporters/GLTFExporter.js

@@ -331,21 +331,50 @@ THREE.GLTFExporter.prototype = {
 		 * Serializes a userData.
 		 * Serializes a userData.
 		 *
 		 *
 		 * @param {THREE.Object3D|THREE.Material} object
 		 * @param {THREE.Object3D|THREE.Material} object
-		 * @returns {Object}
+		 * @param {Object} gltfProperty
 		 */
 		 */
-		function serializeUserData( object ) {
+		function serializeUserData( object, gltfProperty ) {
+
+			if ( ! object.userData || Object.keys( object.userData ).length === 0 ) {
+
+				return;
+
+			}
 
 
 			try {
 			try {
 
 
-				return JSON.parse( JSON.stringify( object.userData ) );
+				var json = JSON.parse( JSON.stringify( object.userData ) );
+
+				if ( json.gltfExtensions ) {
+
+					if ( gltfProperty.extensions === undefined ) {
+
+						gltfProperty.extensions = {};
+
+					}
+
+					for ( var extensionName in json.gltfExtensions ) {
+
+						gltfProperty.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];
+						extensionsUsed[ extensionName ] = true;
+
+					}
+
+					delete json.gltfExtensions;
+
+				}
+
+				if ( Object.keys( json ).length > 0 ) {
+
+					gltfProperty.extras = json;
+
+				}
 
 
 			} catch ( error ) {
 			} catch ( error ) {
 
 
 				console.warn( 'THREE.GLTFExporter: userData of \'' + object.name + '\' ' +
 				console.warn( 'THREE.GLTFExporter: userData of \'' + object.name + '\' ' +
 					'won\'t be serialized because of JSON.stringify error - ' + error.message );
 					'won\'t be serialized because of JSON.stringify error - ' + error.message );
 
 
-				return {};
-
 			}
 			}
 
 
 		}
 		}
@@ -979,11 +1008,7 @@ THREE.GLTFExporter.prototype = {
 
 
 			}
 			}
 
 
-			if ( Object.keys( material.userData ).length > 0 ) {
-
-				gltfMaterial.extras = serializeUserData( material );
-
-			}
+			serializeUserData( material, gltfMaterial );
 
 
 			outputJSON.materials.push( gltfMaterial );
 			outputJSON.materials.push( gltfMaterial );
 
 
@@ -1201,8 +1226,6 @@ THREE.GLTFExporter.prototype = {
 
 
 			}
 			}
 
 
-			var extras = ( Object.keys( geometry.userData ).length > 0 ) ? serializeUserData( geometry ) : undefined;
-
 			var forceIndices = options.forceIndices;
 			var forceIndices = options.forceIndices;
 			var isMultiMaterial = Array.isArray( mesh.material );
 			var isMultiMaterial = Array.isArray( mesh.material );
 
 
@@ -1244,7 +1267,7 @@ THREE.GLTFExporter.prototype = {
 					attributes: attributes,
 					attributes: attributes,
 				};
 				};
 
 
-				if ( extras ) primitive.extras = extras;
+				serializeUserData( geometry, primitive );
 
 
 				if ( targets.length > 0 ) primitive.targets = targets;
 				if ( targets.length > 0 ) primitive.targets = targets;
 
 
@@ -1563,11 +1586,7 @@ THREE.GLTFExporter.prototype = {
 
 
 			}
 			}
 
 
-			if ( object.userData && Object.keys( object.userData ).length > 0 ) {
-
-				gltfNode.extras = serializeUserData( object );
-
-			}
+			serializeUserData( object, gltfNode );
 
 
 			if ( object.isMesh || object.isLine || object.isPoints ) {
 			if ( object.isMesh || object.isLine || object.isPoints ) {
 
 
@@ -1684,6 +1703,8 @@ THREE.GLTFExporter.prototype = {
 
 
 			}
 			}
 
 
+			serializeUserData( scene, gltfScene );
+
 		}
 		}
 
 
 		/**
 		/**