From 8dabf9e8fc505ff02c0fdcb527e73a0a339ac981 Mon Sep 17 00:00:00 2001 From: tengge1 <930372551@qq.com> Date: Sat, 28 Sep 2019 21:49:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E8=BD=BD=E5=85=A5=E5=9C=BA=E6=99=AF=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=98=E9=BB=91bug=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- .../material/RawShaderMaterialSerializer.js | 38 +--- .../material/ShaderMaterialSerializer.js | 39 +--- .../material/UniformsSerializer.js | 184 +++++++++++++++++- 4 files changed, 190 insertions(+), 76 deletions(-) diff --git a/README.md b/README.md index 41f46380..f5ffb507 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,8 @@ Supported Languages: 中文 / [繁體中文](README-tw.md) / [English](README-en 3. 角色管理:添加角色、编辑角色、删除角色、查找角色。 4. 用户管理:添加用户、编辑用户、删除用户、查找用户。 5. `DataGrid`控件大幅度优化:每页显示条数设置;跳转第一页、前一页、后一页、最后一页;当前页和总页数;刷新按钮;每页条数和总记录数展示,加载数据显示LoadMask。 -6. 修复非高光材质切换高光材质报错的bug。 -7. 修复反序列化场景时,把`specular`误当作数值的bug。 -8. 修复材质组件修改高光颜色bug。 +6. 修复高光颜色编辑、序列化和反序列化中的一系列bug。 +7. 修复一部分模型载入场景时,变黑bug。 ## v0.3.3更新 diff --git a/ShadowEditor.Web/src/serialization/material/RawShaderMaterialSerializer.js b/ShadowEditor.Web/src/serialization/material/RawShaderMaterialSerializer.js index 9316e0cb..00db5407 100644 --- a/ShadowEditor.Web/src/serialization/material/RawShaderMaterialSerializer.js +++ b/ShadowEditor.Web/src/serialization/material/RawShaderMaterialSerializer.js @@ -1,5 +1,6 @@ import BaseSerializer from '../BaseSerializer'; import MaterialSerializer from './MaterialSerializer'; +import UniformsSerializer from './UniformsSerializer'; /** * RawShaderMaterialSerializer @@ -16,24 +17,7 @@ RawShaderMaterialSerializer.prototype.toJSON = function (obj) { var json = MaterialSerializer.prototype.toJSON.call(this, obj); json.defines = obj.defines; - - json.uniforms = {}; - - // TODO: 着色器材质uniforms序列化有很多bug。 - for (var i in obj.uniforms) { - var uniform = obj.uniforms[i]; - if (uniform.value instanceof THREE.Color) { - json.uniforms[i] = { - type: 'color', - value: uniform.value - }; - } else { - json.uniforms[i] = { - value: uniform.value - }; - } - } - + json.uniforms = (new UniformsSerializer()).toJSON(obj.uniforms); json.vertexShader = obj.vertexShader; json.fragmentShader = obj.fragmentShader; @@ -46,23 +30,7 @@ RawShaderMaterialSerializer.prototype.fromJSON = function (json, parent, server) MaterialSerializer.prototype.fromJSON.call(this, json, obj, server); obj.defines = json.defines; - - obj.uniforms = {}; - - // TODO: 着色器材质uniforms反序列化有很多bug。 - for (var i in json.uniforms) { - var uniform = json.uniforms[i]; - if (uniform.type === 'color') { - obj.uniforms[i] = { - value: new THREE.Color(uniform.value) - }; - } else { - obj.uniforms[i] = { - value: uniform.value - }; - } - } - + obj.uniforms = (new UniformsSerializer()).fromJSON(json.uniforms, undefined, server); obj.vertexShader = json.vertexShader; obj.fragmentShader = json.fragmentShader; diff --git a/ShadowEditor.Web/src/serialization/material/ShaderMaterialSerializer.js b/ShadowEditor.Web/src/serialization/material/ShaderMaterialSerializer.js index 47186b37..1bd93d56 100644 --- a/ShadowEditor.Web/src/serialization/material/ShaderMaterialSerializer.js +++ b/ShadowEditor.Web/src/serialization/material/ShaderMaterialSerializer.js @@ -1,5 +1,6 @@ import BaseSerializer from '../BaseSerializer'; import MaterialSerializer from './MaterialSerializer'; +import UniformsSerializer from './UniformsSerializer'; /** * ShaderMaterialSerializer @@ -16,24 +17,7 @@ ShaderMaterialSerializer.prototype.toJSON = function (obj) { var json = MaterialSerializer.prototype.toJSON.call(this, obj); json.defines = obj.defines; - - json.uniforms = {}; - - // TODO: 着色器材质uniforms序列化有很多bug。 - for (var i in obj.uniforms) { - var uniform = obj.uniforms[i]; - if (uniform.value instanceof THREE.Color) { - json.uniforms[i] = { - type: 'color', - value: uniform.value - }; - } else { - json.uniforms[i] = { - value: uniform.value - }; - } - } - + json.uniforms = (new UniformsSerializer()).toJSON(obj.uniforms); json.vertexShader = obj.vertexShader; json.fragmentShader = obj.fragmentShader; @@ -48,24 +32,7 @@ ShaderMaterialSerializer.prototype.fromJSON = function (json, parent, server) { MaterialSerializer.prototype.fromJSON.call(this, json, obj, server); obj.defines = json.defines; - - obj.uniforms = {}; - - // TODO: 着色器材质uniforms反序列化有很多bug。 - for (var i in json.uniforms) { - var uniform = json.uniforms[i]; - - if (uniform.type === 'color') { - obj.uniforms[i] = { - value: new THREE.Color(uniform.value) - }; - } else { - obj.uniforms[i] = { - value: uniform.value - }; - } - } - + obj.uniforms = (new UniformsSerializer()).fromJSON(json.uniforms, undefined, server); obj.vertexShader = json.vertexShader; obj.fragmentShader = json.fragmentShader; diff --git a/ShadowEditor.Web/src/serialization/material/UniformsSerializer.js b/ShadowEditor.Web/src/serialization/material/UniformsSerializer.js index aff79a8b..d3b68bf5 100644 --- a/ShadowEditor.Web/src/serialization/material/UniformsSerializer.js +++ b/ShadowEditor.Web/src/serialization/material/UniformsSerializer.js @@ -1,5 +1,4 @@ import BaseSerializer from '../BaseSerializer'; - import TexturesSerializer from '../texture/TexturesSerializer'; /** @@ -14,11 +13,192 @@ UniformsSerializer.prototype = Object.create(BaseSerializer.prototype); UniformsSerializer.prototype.constructor = UniformsSerializer; UniformsSerializer.prototype.toJSON = function (obj) { + let json = {}; + Object.keys(obj).forEach(n => { + const item = obj[n]; + + if (item.value === null) { + json[n] = { + type: 'null', + value: null, + }; + } else if (item.value instanceof THREE.Texture) { // 纹理 + json[n] = { + type: 't', + value: (new TexturesSerializer()).toJSON(item.value), + }; + } else if (item.value instanceof THREE.Color) { // 颜色 + json[n] = { + type: 'c', + value: item.value, + }; + } else if (Number.isInteger(item.value)) { // 整数 + json[n] = { + type: 'i', + value: item.value, + }; + } else if (typeof item.value === 'number') { // 浮点数 + json[n] = { + type: 'f', + value: item.value, + }; + } else if (item.value instanceof THREE.Vector2) { // Vector2 + json[n] = { + type: 'v2', + value: item.value, + }; + } else if (item.value instanceof THREE.Vector3) { // Vector3 + json[n] = { + type: 'v3', + value: item.value, + }; + } else if (item.value instanceof THREE.Vector4) { // Vector4 + json[n] = { + type: 'v4', + value: item.value, + }; + } else if (item.value instanceof THREE.Matrix3) { // Matrix3 + json[n] = { + type: 'm3', + value: item.value, + }; + } else if (item.value instanceof THREE.Matrix4) { // Matrix4 + json[n] = { + type: 'm4', + value: item.value, + }; + } else if (Array.isArray(item.value) && item.value.every(n => typeof n === 'number')) { // 浮点数数组 + json[n] = { + type: 'af', + value: item.value, + }; + } else if (Array.isArray(item.value) && item.value.every(n => n instanceof THREE.Vector2)) { // Vector2数组 + json[n] = { + type: 'av2', + value: item.value, + }; + } else if (Array.isArray(item.value) && item.value.every(n => n instanceof THREE.Vector3)) { // Vector3数组 + json[n] = { + type: 'av3', + value: item.value, + }; + } else if (Array.isArray(item.value) && item.value.every(n => n instanceof THREE.Vector4)) { // Vector4数组 + json[n] = { + type: 'av4', + value: item.value, + }; + } else if (Array.isArray(item.value) && item.value.every(n => n instanceof THREE.Matrix3)) { // Matrix3数组 + json[n] = { + type: 'am3', + value: item.value, + }; + } else if (Array.isArray(item.value) && item.value.every(n => n instanceof THREE.Matrix4)) { // Matrix4数组 + json[n] = { + type: 'am4', + value: item.value, + }; + } else if (Array.isArray(item.value) && item.value.every(n => n instanceof THREE.Texture)) { // Texture数组 + json[n] = { + type: 'at', + value: item.value.map(m => (new TexturesSerializer()).toJSON(m)), + }; + } else { + console.warn(`UniformsSerializer: unknown uniform type: `, item.value); + json[n] = { + type: 'unknow', + value: item.value, + }; + } + }); + + return json; }; -UniformsSerializer.prototype.fromJSON = function (json) { +UniformsSerializer.prototype.fromJSON = function (json, parent, server) { + let obj = {}; + Object.keys(json).forEach(n => { + const type = json[n].type; + const value = json[n].value; + + if (type === 'null') { + obj[n] = { + value: null, + }; + } else if (type === 't') { + obj[n] = { + value: (new TexturesSerializer()).fromJSON(value, undefined, server), + }; + } else if (type === 'c') { + obj[n] = { + value: new THREE.Color(value), + }; + } else if (type === 'i') { + obj[n] = { + value, + }; + } else if (type === 'f') { + obj[n] = { + value, + }; + } else if (type === 'v2') { + obj[n] = { + value: new THREE.Vector2().copy(value), + }; + } else if (type === 'v3') { + obj[n] = { + value: new THREE.Vector3().copy(value), + }; + } else if (type === 'v4') { + obj[n] = { + value: new THREE.Vector4().copy(value), + }; + } else if (type === 'm3') { + obj[n] = { + value: new THREE.Matrix3().copy(value), + }; + } else if (type === 'm4') { + obj[n] = { + value: new THREE.Matrix4().copy(value), + }; + } else if (type === 'af') { + obj[n] = { + value: value, + }; + } else if (type === 'av2') { + obj[n] = { + value: value.map(m => new THREE.Vector2().copy(m)), + }; + } else if (type === 'av3') { + obj[n] = { + value: value.map(m => new THREE.Vector3().copy(m)), + }; + } else if (type === 'av4') { + obj[n] = { + value: value.map(m => new THREE.Vector4().copy(m)), + }; + } else if (type === 'am3') { + obj[n] = { + value: value.map(m => new THREE.Matrix3().copy(m)), + }; + } else if (type === 'am4') { + obj[n] = { + value: value.map(m => new THREE.Matrix4().copy(m)), + }; + } else if (type === 'at') { + obj[n] = { + value: value.map(m => new TexturesSerializer().fromJSON(m, undefined, server)), + }; + } else { + console.warn(`UniformsSerializer: unknown uniform type: `, value); + obj[n] = { + value: value, + }; + } + }); + + return obj; }; export default UniformsSerializer; \ No newline at end of file