浏览代码

Support more uniform types

Mugen87 7 年之前
父节点
当前提交
a1abfff338
共有 2 个文件被更改,包括 74 次插入6 次删除
  1. 35 1
      src/loaders/MaterialLoader.js
  2. 39 5
      src/materials/ShaderMaterial.js

+ 35 - 1
src/loaders/MaterialLoader.js

@@ -1,4 +1,8 @@
+import { Color } from '../math/Color.js';
 import { Vector2 } from '../math/Vector2.js';
+import { Vector3 } from '../math/Vector3.js';
+import { Vector4 } from '../math/Vector4.js';
+import { Matrix4 } from '../math/Matrix4.js';
 import { FileLoader } from './FileLoader.js';
 import { DefaultLoadingManager } from './LoadingManager.js';
 import * as Materials from '../materials/Materials.js';
@@ -106,7 +110,37 @@ Object.assign( MaterialLoader.prototype, {
 				var uniform = json.uniforms[ name ];
 
 				material.uniforms[ name ] = {};
-				material.uniforms[ name ].value = ( uniform.type === 't' ) ? getTexture( uniform.value ) : uniform.value;
+
+				switch ( uniform.type ) {
+
+					case 't':
+						material.uniforms[ name ].value = getTexture( uniform.value );
+						break;
+
+					case 'c':
+						material.uniforms[ name ].value = new Color().setHex( uniform.value );
+						break;
+
+					case 'v2':
+						material.uniforms[ name ].value = new Vector2().fromArray( uniform.value );
+						break;
+
+					case 'v3':
+						material.uniforms[ name ].value = new Vector3().fromArray( uniform.value );
+						break;
+
+					case 'v4':
+						material.uniforms[ name ].value = new Vector4().fromArray( uniform.value );
+						break;
+
+					case 'm4':
+						material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );
+						break;
+
+					default:
+						material.uniforms[ name ].value = uniform.value;
+
+				}
 
 			}
 

+ 39 - 5
src/materials/ShaderMaterial.js

@@ -121,20 +121,54 @@ ShaderMaterial.prototype.toJSON = function ( meta ) {
 	for ( var name in this.uniforms ) {
 
 		var uniform = this.uniforms[ name ];
+		var value = uniform.value;
 
-		if ( uniform.value.isTexture ) {
-
-			var texture = uniform.value;
+		if ( value.isTexture ) {
 
 			data.uniforms[ name ] = {
 				type: 't',
-				value: texture.toJSON( meta ).uuid
+				value: value.toJSON( meta ).uuid
+			};
+
+		} else if ( value.isColor ) {
+
+			data.uniforms[ name ] = {
+				type: 'c',
+				value: value.getHex()
+			};
+
+		} else if ( value.isVector2 ) {
+
+			data.uniforms[ name ] = {
+				type: 'v2',
+				value: value.toArray()
+			};
+
+		} else if ( value.isVector3 ) {
+
+			data.uniforms[ name ] = {
+				type: 'v3',
+				value: value.toArray()
+			};
+
+		} else if ( value.isVector4 ) {
+
+			data.uniforms[ name ] = {
+				type: 'v4',
+				value: value.toArray()
+			};
+
+		} else if ( value.isMatrix4 ) {
+
+			data.uniforms[ name ] = {
+				type: 'm4',
+				value: value.toArray()
 			};
 
 		} else {
 
 			data.uniforms[ name ] = {
-				value: uniform.value
+				value: value
 			};
 
 		}