Selaa lähdekoodia

Light: Ensure `target` can be serialized/deserialized. (#28696)

* Light: Ensure `target` can be serialized/deserialized.

* ObjectLoader: Rename light target method.
Michael Herzog 1 vuosi sitten
vanhempi
commit
6ea0fb9ec4
2 muutettua tiedostoa jossa 30 lisäystä ja 0 poistoa
  1. 1 0
      src/lights/Light.js
  2. 29 0
      src/loaders/ObjectLoader.js

+ 1 - 0
src/lights/Light.js

@@ -48,6 +48,7 @@ class Light extends Object3D {
 		if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
 		if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
 
 
 		if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
 		if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
+		if ( this.target !== undefined ) data.object.target = this.target.uuid;
 
 
 		return data;
 		return data;
 
 

+ 29 - 0
src/loaders/ObjectLoader.js

@@ -164,6 +164,7 @@ class ObjectLoader extends Loader {
 		const skeletons = this.parseSkeletons( json.skeletons, object );
 		const skeletons = this.parseSkeletons( json.skeletons, object );
 
 
 		this.bindSkeletons( object, skeletons );
 		this.bindSkeletons( object, skeletons );
+		this.bindLightTargets( object );
 
 
 		//
 		//
 
 
@@ -834,6 +835,7 @@ class ObjectLoader extends Loader {
 			case 'DirectionalLight':
 			case 'DirectionalLight':
 
 
 				object = new DirectionalLight( data.color, data.intensity );
 				object = new DirectionalLight( data.color, data.intensity );
+				object.target = data.target || '';
 
 
 				break;
 				break;
 
 
@@ -852,6 +854,7 @@ class ObjectLoader extends Loader {
 			case 'SpotLight':
 			case 'SpotLight':
 
 
 				object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
 				object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
+				object.target = data.target || '';
 
 
 				break;
 				break;
 
 
@@ -1124,6 +1127,32 @@ class ObjectLoader extends Loader {
 
 
 	}
 	}
 
 
+	bindLightTargets( object ) {
+
+		object.traverse( function ( child ) {
+
+			if ( child.isDirectionalLight || child.isSpotLight ) {
+
+				const uuid = child.target;
+
+				const target = object.getObjectByProperty( 'uuid', uuid );
+
+				if ( target !== undefined ) {
+
+					child.target = target;
+
+				} else {
+
+					child.target = new Object3D();
+
+				}
+
+			}
+
+		} );
+
+	}
+
 }
 }
 
 
 const TEXTURE_MAPPING = {
 const TEXTURE_MAPPING = {