瀏覽代碼

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

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

* ObjectLoader: Rename light target method.
Michael Herzog 1 年之前
父節點
當前提交
6ea0fb9ec4
共有 2 個文件被更改,包括 30 次插入0 次删除
  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.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
+		if ( this.target !== undefined ) data.object.target = this.target.uuid;
 
 		return data;
 

+ 29 - 0
src/loaders/ObjectLoader.js

@@ -164,6 +164,7 @@ class ObjectLoader extends Loader {
 		const skeletons = this.parseSkeletons( json.skeletons, object );
 
 		this.bindSkeletons( object, skeletons );
+		this.bindLightTargets( object );
 
 		//
 
@@ -834,6 +835,7 @@ class ObjectLoader extends Loader {
 			case 'DirectionalLight':
 
 				object = new DirectionalLight( data.color, data.intensity );
+				object.target = data.target || '';
 
 				break;
 
@@ -852,6 +854,7 @@ class ObjectLoader extends Loader {
 			case 'SpotLight':
 
 				object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
+				object.target = data.target || '';
 
 				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 = {