Browse Source

ShaderMaterial: Add support for texture serialization/deserialization

Mugen87 7 years ago
parent
commit
e4d46acb33
2 changed files with 43 additions and 4 deletions
  1. 18 3
      src/loaders/MaterialLoader.js
  2. 25 1
      src/materials/ShaderMaterial.js

+ 18 - 3
src/loaders/MaterialLoader.js

@@ -63,9 +63,6 @@ Object.assign( MaterialLoader.prototype, {
 		if ( json.shininess !== undefined ) material.shininess = json.shininess;
 		if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;
 		if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;
-		if ( json.uniforms !== undefined ) material.uniforms = json.uniforms;
-		if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
-		if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
 		if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;
 		if ( json.fog !== undefined ) material.fog = json.fog;
 		if ( json.flatShading !== undefined ) material.flatShading = json.flatShading;
@@ -100,6 +97,24 @@ Object.assign( MaterialLoader.prototype, {
 		if ( json.visible !== undefined ) material.visible = json.visible;
 		if ( json.userData !== undefined ) material.userData = json.userData;
 
+		// Shader Material
+
+		if ( json.uniforms !== undefined ) {
+
+			for ( var name in json.uniforms ) {
+
+				var uniform = json.uniforms[ name ];
+
+				material.uniforms[ name ] = {};
+				material.uniforms[ name ].value = ( uniform.type === 't' ) ? getTexture( uniform.value ) : uniform.value;
+
+			}
+
+		}
+
+		if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
+		if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
+
 		// Deprecated
 
 		if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading

+ 25 - 1
src/materials/ShaderMaterial.js

@@ -116,7 +116,31 @@ ShaderMaterial.prototype.toJSON = function ( meta ) {
 
 	var data = Material.prototype.toJSON.call( this, meta );
 
-	data.uniforms = this.uniforms;
+	data.uniforms = {};
+
+	for ( var name in this.uniforms ) {
+
+		var uniform = this.uniforms[ name ];
+
+		if ( uniform.value.isTexture ) {
+
+			var texture = uniform.value;
+
+			data.uniforms[ name ] = {
+				type: 't',
+				value: texture.toJSON( meta ).uuid
+			};
+
+		} else {
+
+			data.uniforms[ name ] = {
+				value: uniform.value
+			};
+
+		}
+
+	}
+
 	data.vertexShader = this.vertexShader;
 	data.fragmentShader = this.fragmentShader;