Skip to content

Commit ef3ac9a

Browse files
authored
Merge pull request #14598 from Mugen87/dev17
ShaderMaterial: Improved serialization/deserialization
2 parents 67a4893 + 906ce13 commit ef3ac9a

File tree

2 files changed

+113
-4
lines changed

2 files changed

+113
-4
lines changed

src/loaders/MaterialLoader.js

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import { Color } from '../math/Color.js';
12
import { Vector2 } from '../math/Vector2.js';
3+
import { Vector3 } from '../math/Vector3.js';
4+
import { Vector4 } from '../math/Vector4.js';
5+
import { Matrix4 } from '../math/Matrix4.js';
26
import { FileLoader } from './FileLoader.js';
37
import { DefaultLoadingManager } from './LoadingManager.js';
48
import * as Materials from '../materials/Materials.js';
@@ -63,9 +67,6 @@ Object.assign( MaterialLoader.prototype, {
6367
if ( json.shininess !== undefined ) material.shininess = json.shininess;
6468
if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;
6569
if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;
66-
if ( json.uniforms !== undefined ) material.uniforms = json.uniforms;
67-
if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
68-
if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
6970
if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;
7071
if ( json.fog !== undefined ) material.fog = json.fog;
7172
if ( json.flatShading !== undefined ) material.flatShading = json.flatShading;
@@ -100,6 +101,54 @@ Object.assign( MaterialLoader.prototype, {
100101
if ( json.visible !== undefined ) material.visible = json.visible;
101102
if ( json.userData !== undefined ) material.userData = json.userData;
102103

104+
// Shader Material
105+
106+
if ( json.uniforms !== undefined ) {
107+
108+
for ( var name in json.uniforms ) {
109+
110+
var uniform = json.uniforms[ name ];
111+
112+
material.uniforms[ name ] = {};
113+
114+
switch ( uniform.type ) {
115+
116+
case 't':
117+
material.uniforms[ name ].value = getTexture( uniform.value );
118+
break;
119+
120+
case 'c':
121+
material.uniforms[ name ].value = new Color().setHex( uniform.value );
122+
break;
123+
124+
case 'v2':
125+
material.uniforms[ name ].value = new Vector2().fromArray( uniform.value );
126+
break;
127+
128+
case 'v3':
129+
material.uniforms[ name ].value = new Vector3().fromArray( uniform.value );
130+
break;
131+
132+
case 'v4':
133+
material.uniforms[ name ].value = new Vector4().fromArray( uniform.value );
134+
break;
135+
136+
case 'm4':
137+
material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );
138+
break;
139+
140+
default:
141+
material.uniforms[ name ].value = uniform.value;
142+
143+
}
144+
145+
}
146+
147+
}
148+
149+
if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
150+
if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
151+
103152
// Deprecated
104153

105154
if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading

src/materials/ShaderMaterial.js

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,67 @@ ShaderMaterial.prototype.toJSON = function ( meta ) {
116116

117117
var data = Material.prototype.toJSON.call( this, meta );
118118

119-
data.uniforms = this.uniforms;
119+
data.uniforms = {};
120+
121+
for ( var name in this.uniforms ) {
122+
123+
var uniform = this.uniforms[ name ];
124+
var value = uniform.value;
125+
126+
if ( value.isTexture ) {
127+
128+
data.uniforms[ name ] = {
129+
type: 't',
130+
value: value.toJSON( meta ).uuid
131+
};
132+
133+
} else if ( value.isColor ) {
134+
135+
data.uniforms[ name ] = {
136+
type: 'c',
137+
value: value.getHex()
138+
};
139+
140+
} else if ( value.isVector2 ) {
141+
142+
data.uniforms[ name ] = {
143+
type: 'v2',
144+
value: value.toArray()
145+
};
146+
147+
} else if ( value.isVector3 ) {
148+
149+
data.uniforms[ name ] = {
150+
type: 'v3',
151+
value: value.toArray()
152+
};
153+
154+
} else if ( value.isVector4 ) {
155+
156+
data.uniforms[ name ] = {
157+
type: 'v4',
158+
value: value.toArray()
159+
};
160+
161+
} else if ( value.isMatrix4 ) {
162+
163+
data.uniforms[ name ] = {
164+
type: 'm4',
165+
value: value.toArray()
166+
};
167+
168+
} else {
169+
170+
data.uniforms[ name ] = {
171+
value: value
172+
};
173+
174+
// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far
175+
176+
}
177+
178+
}
179+
120180
data.vertexShader = this.vertexShader;
121181
data.fragmentShader = this.fragmentShader;
122182

0 commit comments

Comments
 (0)