Browse Source

#18335 CodeSerializer is only able to serialize prototypes when uglification is used. The name of simple objects can not be properly referenced from uglified code in memory. Therefore only functionality for serialzation of prototypes and their respective instance is supported.

Kai Salmen 5 years ago
parent
commit
7e952c95da

+ 10 - 11
examples/jsm/loaders/OBJLoader2Parallel.js

@@ -97,17 +97,16 @@ OBJLoader2Parallel.prototype = Object.assign( Object.create( OBJLoader2.prototyp
 		}
 		}
 		if ( codeBuilderInstructions.isSupportsStandardWorker() ) {
 		if ( codeBuilderInstructions.isSupportsStandardWorker() ) {
 
 
-			let codeOBJLoader2Parser = CodeSerializer.serializeClass( 'OBJLoader2Parser', OBJLoader2Parser );
-			let codeObjectManipulator = CodeSerializer.serializeObject( 'ObjectManipulator', ObjectManipulator );
-			let codeParserPayloadHandler = CodeSerializer.serializeClass( 'DefaultWorkerPayloadHandler', DefaultWorkerPayloadHandler );
-			let codeWorkerRunner = CodeSerializer.serializeClass( 'WorkerRunner', WorkerRunner );
-
-			codeBuilderInstructions.addCodeFragment( codeOBJLoader2Parser );
-			codeBuilderInstructions.addCodeFragment( codeObjectManipulator );
-			codeBuilderInstructions.addCodeFragment( codeParserPayloadHandler );
-			codeBuilderInstructions.addCodeFragment( codeWorkerRunner );
-
-			codeBuilderInstructions.addStartCode( 'new WorkerRunner( new DefaultWorkerPayloadHandler( new OBJLoader2Parser() ) );' );
+			let objectManipulator = new ObjectManipulator();
+			let defaultWorkerPayloadHandler = new DefaultWorkerPayloadHandler( this.parser );
+			let workerRunner = new WorkerRunner( {} );
+			codeBuilderInstructions.addCodeFragment( CodeSerializer.serializeClass( OBJLoader2Parser, this.parser ) );
+			codeBuilderInstructions.addCodeFragment( CodeSerializer.serializeClass( ObjectManipulator, objectManipulator ) );
+			codeBuilderInstructions.addCodeFragment( CodeSerializer.serializeClass( DefaultWorkerPayloadHandler, defaultWorkerPayloadHandler ) );
+			codeBuilderInstructions.addCodeFragment( CodeSerializer.serializeClass( WorkerRunner, workerRunner ) );
+
+			let startCode = 'new ' + workerRunner.constructor.name + '( new ' + defaultWorkerPayloadHandler.constructor.name + '( new ' + this.parser.constructor.name + '() ) );';
+			codeBuilderInstructions.addStartCode( startCode );
 
 
 		}
 		}
 		return codeBuilderInstructions;
 		return codeBuilderInstructions;

+ 3 - 2
examples/jsm/loaders/obj2/utils/CodeSerializer.d.ts

@@ -1,6 +1,7 @@
 export namespace CodeSerializer {
 export namespace CodeSerializer {
-	export function serializeObject( fullName: string, serializationTarget: object ): string;
-	export function serializeClass( fullObjectName: string, serializationTarget: object, basePrototypeName?: string, overrideFunctions?: CodeSerializationInstruction[] ): string;
+
+	export function serializeClass( targetPrototype: object, targetPrototypeInstance: object, basePrototypeName?: string, overrideFunctions?: CodeSerializationInstruction[] ): string;
+
 }
 }
 
 
 export class CodeSerializationInstruction {
 export class CodeSerializationInstruction {

+ 8 - 49
examples/jsm/loaders/obj2/utils/CodeSerializer.js

@@ -5,61 +5,20 @@
 
 
 const CodeSerializer = {
 const CodeSerializer = {
 
 
-	/**
-	 * Serialize an object without specific prototype definition.
-	 *
-	 * @param {String} fullObjectName complete object name
-	 * @param {Object} serializationTarget The object that should be serialized
-	 * @returns {String}
-	 */
-	serializeObject: function ( fullObjectName, serializationTarget ) {
-
-		let objectString = fullObjectName + ' = {\n\n';
-		let part;
-		for ( let name in serializationTarget ) {
-
-			part = serializationTarget[ name ];
-			if ( typeof ( part ) === 'string' || part instanceof String ) {
-
-				part = part.replace( /\n/g, '\\n' );
-				part = part.replace( /\r/g, '\\r' );
-				objectString += '\t' + name + ': "' + part + '",\n';
-
-			} else if ( part instanceof Array ) {
-
-				objectString += '\t' + name + ': [' + part + '],\n';
-
-			} else if ( typeof part === 'object' ) {
-
-				console.log( 'Omitting object "' + name + '" and replace it with empty object.' );
-				objectString += '\t' + name + ': {},\n';
-
-			} else {
-
-				objectString += '\t' + name + ': ' + part + ',\n';
-
-			}
-
-		}
-		objectString += '}\n\n';
-
-		return objectString;
-
-	},
-
 	/**
 	/**
 	 * Serialize an object with specific prototype definition.
 	 * Serialize an object with specific prototype definition.
 	 *
 	 *
-	 * @param {String} fullObjectName Specifies the complete object name
-	 * @param {Object} serializationTarget The object that should be serialized
+	 * @param {Object} targetPrototype The object that should be serialized
+	 * @param {Object} targetPrototypeInstance An instance of the oriobject that should be serialized
 	 * @param {String} [basePrototypeName] Name of the prototype
 	 * @param {String} [basePrototypeName] Name of the prototype
 	 * @param {Object} [overrideFunctions} Array of {@Link CodeSerializationInstruction} allows to replace or remove function with provided content
 	 * @param {Object} [overrideFunctions} Array of {@Link CodeSerializationInstruction} allows to replace or remove function with provided content
 	 *
 	 *
 	 * @returns {String}
 	 * @returns {String}
 	 */
 	 */
-	serializeClass: function ( fullObjectName, serializationTarget, basePrototypeName, overrideFunctions ) {
+	serializeClass: function ( targetPrototype, targetPrototypeInstance, basePrototypeName, overrideFunctions ) {
 
 
 		let objectPart, constructorString, i, funcInstructions, funcTemp;
 		let objectPart, constructorString, i, funcInstructions, funcTemp;
+		let fullObjectName = targetPrototypeInstance.constructor.name;
 		let prototypeFunctions = [];
 		let prototypeFunctions = [];
 		let objectProperties = [];
 		let objectProperties = [];
 		let objectFunctions = [];
 		let objectFunctions = [];
@@ -67,9 +26,9 @@ const CodeSerializer = {
 
 
 		if ( ! Array.isArray( overrideFunctions ) ) overrideFunctions = [];
 		if ( ! Array.isArray( overrideFunctions ) ) overrideFunctions = [];
 
 
-		for ( let name in serializationTarget.prototype ) {
+		for ( let name in targetPrototype.prototype ) {
 
 
-			objectPart = serializationTarget.prototype[ name ];
+			objectPart = targetPrototype.prototype[ name ];
 			funcInstructions = new CodeSerializationInstruction( name, fullObjectName + '.prototype.' + name );
 			funcInstructions = new CodeSerializationInstruction( name, fullObjectName + '.prototype.' + name );
 			funcInstructions.setCode( objectPart.toString() );
 			funcInstructions.setCode( objectPart.toString() );
 
 
@@ -106,9 +65,9 @@ const CodeSerializer = {
 			}
 			}
 
 
 		}
 		}
-		for ( let name in serializationTarget ) {
+		for ( let name in targetPrototype ) {
 
 
-			objectPart = serializationTarget[ name ];
+			objectPart = targetPrototype[ name ];
 			funcInstructions = new CodeSerializationInstruction( name, fullObjectName + '.' + name );
 			funcInstructions = new CodeSerializationInstruction( name, fullObjectName + '.' + name );
 			if ( typeof objectPart === 'function' ) {
 			if ( typeof objectPart === 'function' ) {
 
 

+ 4 - 2
examples/jsm/loaders/obj2/worker/parallel/WorkerRunner.d.ts

@@ -1,6 +1,8 @@
-export namespace ObjectManipulator {
+export class ObjectManipulator {
 
 
-	export function applyProperties( objToAlter: object, params: object, forceCreation: boolean ): void;
+	constructor();
+
+	applyProperties( objToAlter: object, params: object, forceCreation: boolean ): void;
 
 
 }
 }
 
 

+ 10 - 3
examples/jsm/loaders/obj2/worker/parallel/WorkerRunner.js

@@ -3,13 +3,19 @@
  * Development repository: https://github.com/kaisalmen/WWOBJLoader
  * Development repository: https://github.com/kaisalmen/WWOBJLoader
  */
  */
 
 
-const ObjectManipulator = {
+const ObjectManipulator = function () {
+};
+
+ObjectManipulator.prototype = {
+
+	constructor: ObjectManipulator,
 
 
 	/**
 	/**
 	 * Applies values from parameter object via set functions or via direct assignment.
 	 * Applies values from parameter object via set functions or via direct assignment.
 	 *
 	 *
 	 * @param {Object} objToAlter The objToAlter instance
 	 * @param {Object} objToAlter The objToAlter instance
 	 * @param {Object} params The parameter object
 	 * @param {Object} params The parameter object
+	 * @param {boolean} forceCreation Force the creation of a property
 	 */
 	 */
 	applyProperties: function ( objToAlter, params, forceCreation ) {
 	applyProperties: function ( objToAlter, params, forceCreation ) {
 
 
@@ -81,8 +87,9 @@ DefaultWorkerPayloadHandler.prototype = {
 				parser.setLogging( this.logging.enabled, this.logging.debug );
 				parser.setLogging( this.logging.enabled, this.logging.debug );
 
 
 			}
 			}
-			ObjectManipulator.applyProperties( parser, payload.params, false );
-			ObjectManipulator.applyProperties( parser, callbacks, false );
+			let objectManipulator = new ObjectManipulator();
+			objectManipulator.applyProperties( parser, payload.params, false );
+			objectManipulator.applyProperties( parser, callbacks, false );
 
 
 			let arraybuffer = payload.data.input;
 			let arraybuffer = payload.data.input;
 			let executeFunctionName = 'execute';
 			let executeFunctionName = 'execute';

+ 10 - 7
examples/webgl_loader_obj2_options.html

@@ -168,9 +168,14 @@
 					let modelName = 'female02_vertex' ;
 					let modelName = 'female02_vertex' ;
 					this._reportProgress( { detail: { text: 'Loading: ' + modelName } } );
 					this._reportProgress( { detail: { text: 'Loading: ' + modelName } } );
 
 
+					let local = new THREE.Object3D();
+					local.name = 'Pivot_female02_vertex';
+					local.position.set( -75, 0, 0 );
+					this.pivot.add( local );
+
 					let scope = this;
 					let scope = this;
 					function callbackOnLoad( object3d, message ) {
 					function callbackOnLoad( object3d, message ) {
-						scope.scene.add( object3d );
+						local.add( object3d );
 						scope._reportProgress( { detail: { text: 'Loading of ' + modelName + 'completed: ' + message } } );
 						scope._reportProgress( { detail: { text: 'Loading of ' + modelName + 'completed: ' + message } } );
 					}
 					}
 
 
@@ -227,7 +232,7 @@
 
 
 					let local = new THREE.Object3D();
 					let local = new THREE.Object3D();
 					local.name = 'Pivot_WaltHead';
 					local.name = 'Pivot_WaltHead';
-					local.position.set( -125, 50, 0 );
+					local.position.set( -175, 50, 0 );
 					let scale = 0.5;
 					let scale = 0.5;
 					local.scale.set( scale, scale, scale );
 					local.scale.set( scale, scale, scale );
 					this.pivot.add( local );
 					this.pivot.add( local );
@@ -272,8 +277,8 @@
 
 
 				useLoadParallelMeshAlter: function () {
 				useLoadParallelMeshAlter: function () {
 					let local = new THREE.Object3D();
 					let local = new THREE.Object3D();
-					local.position.set( 125, 50, 0 );
-					local.name = 'Pivot_vive-controller';
+					local.position.set( 175, -100, 0 );
+					local.name = 'Pivot_ninjaHead';
 					this.pivot.add( local );
 					this.pivot.add( local );
 
 
 					let objLoader2Parallel = new OBJLoader2Parallel()
 					let objLoader2Parallel = new OBJLoader2Parallel()
@@ -287,8 +292,6 @@
 						let override = new LoadedMeshUserOverride( false, true );
 						let override = new LoadedMeshUserOverride( false, true );
 
 
 						let mesh = new THREE.Mesh( event.detail.bufferGeometry, event.detail.material );
 						let mesh = new THREE.Mesh( event.detail.bufferGeometry, event.detail.material );
-						let scale = 200.0;
-						mesh.scale.set( scale, scale, scale );
 						mesh.name = event.detail.meshName;
 						mesh.name = event.detail.meshName;
 						let helper = new VertexNormalsHelper( mesh, 2, 0x00ff00, 1 );
 						let helper = new VertexNormalsHelper( mesh, 2, 0x00ff00, 1 );
 						helper.name = 'VertexNormalsHelper';
 						helper.name = 'VertexNormalsHelper';
@@ -305,7 +308,7 @@
 						scope._reportProgress( { detail: { text: 'Loading of ' + objLoader2Parallel.modelName + 'completed: ' + message } } );
 						scope._reportProgress( { detail: { text: 'Loading of ' + objLoader2Parallel.modelName + 'completed: ' + message } } );
 					}
 					}
 
 
-					objLoader2Parallel.load( 'models/obj/vive-controller/vr_controller_vive_1_5.obj', callbackOnLoad );
+					objLoader2Parallel.load( 'models/obj/ninja/ninjaHead_Low.obj', callbackOnLoad );
 				},
 				},
 
 
 				finalize: function () {
 				finalize: function () {