[engine] 修复 Effect 被修改后其变体的 hash 错误问题

This commit is contained in:
SmallMain 2022-06-25 00:27:59 +08:00
parent e4e59b0305
commit f31cb598e3
3 changed files with 25 additions and 18 deletions

View File

@ -75,7 +75,7 @@ export default class EffectVariant extends EffectBase {
let effect = this._effect;
if (effect) {
hash += utils.serializePasses(effect.passes);
hash += effect._id;
}
this._hash = murmurhash2(hash, 666);

View File

@ -7,6 +7,8 @@ export default class Effect extends EffectBase {
_techniques: Technique[] = [];
_asset = null;
static id = 0;
_id = '';
get technique () {
return this._technique;
@ -22,6 +24,7 @@ export default class Effect extends EffectBase {
constructor (name, techniques, techniqueIndex, asset) {
super();
this.init(name, techniques, techniqueIndex, asset, true);
this._id = '|' + Effect.id++;
}
init (name, techniques, techniqueIndex, asset, createNative) {

View File

@ -18,12 +18,14 @@ import enums from '../../../renderer/enums';
const hashArray = [];
function serializeDefines (defines, names) {
const len = names.length;
for (let i = 0; i < len; i++) {
const name = names[i];
hashArray[i] = name + defines[name];
let i = 0;
for (const name in defines) {
if (Object.hasOwnProperty.call(defines, name)) {
hashArray[i] = name + defines[name];
i++;
}
}
hashArray.length = len;
hashArray.length = i;
return hashArray.join('');
}
@ -63,21 +65,23 @@ function serializePasses (passes) {
function serializeUniforms (uniforms, names) {
let index = 0;
for (let i = 0, len = names.length; i < len; i++) {
let param = uniforms[names[i]];
let prop = param.value;
for (const name in uniforms) {
if (Object.hasOwnProperty.call(uniforms, name)) {
const param = uniforms[name];
let prop = param.value;
if (!prop) {
continue;
}
if (!prop) {
continue;
}
if (param.type === enums.PARAM_TEXTURE_2D || param.type === enums.PARAM_TEXTURE_CUBE) {
hashArray[index] = prop._id;
if (param.type === enums.PARAM_TEXTURE_2D || param.type === enums.PARAM_TEXTURE_CUBE) {
hashArray[index] = prop._id;
}
else {
hashArray[index] = prop.toString();
}
index++;
}
else {
hashArray[index] = prop.toString();
}
index++
}
hashArray.length = index;
return hashArray.join(';');