'use strict';
const { updateElementReadonly } = require('../utils/assets');
exports.template = /* html */ `
`;
exports.style = /* css */`
.asset-erp-texture-cube ui-prop{
margin-right: 4px;
}
.asset-erp-texture-cube #filterAdvancedSection,
.asset-erp-texture-cube #wrapAdvancedSection,
.asset-erp-texture-cube #generateMipmapsSection {
margin-left: 1em;
display: none;
}
`;
exports.$ = {
anisotropy: '#anisotropy',
faceSize: '#faceSize',
filterMode: '#filterMode',
filterAdvancedSection: '#filterAdvancedSection',
minfilter: '#minfilter',
magfilter: '#magfilter',
generateMipmaps: '#generateMipmaps',
generateMipmapsSection: '#generateMipmapsSection',
mipfilter: '#mipfilter',
wrapMode: '#wrapMode',
wrapAdvancedSection: '#wrapAdvancedSection',
wrapModeS: '#wrapModeS',
wrapModeT: '#wrapModeT',
mipBakeMode: '#mipBakeMode',
};
const ModeMap = {
filter: {
'Nearest (None)': {
minfilter: 'nearest',
magfilter: 'nearest',
mipfilter: 'none',
},
Bilinear: {
minfilter: 'linear',
magfilter: 'linear',
mipfilter: 'none',
},
'Bilinear with Mipmaps': {
minfilter: 'linear',
magfilter: 'linear',
mipfilter: 'nearest',
},
'Trilinear with Mipmaps': {
minfilter: 'linear',
magfilter: 'linear',
mipfilter: 'linear',
},
},
wrap: {
Repeat: {
wrapModeS: 'repeat',
wrapModeT: 'repeat',
},
Clamp: {
wrapModeS: 'clamp-to-edge',
wrapModeT: 'clamp-to-edge',
},
Mirror: {
wrapModeS: 'mirrored-repeat',
wrapModeT: 'mirrored-repeat',
},
},
};
const Elements = {
anisotropy: {
ready() {
this.$.anisotropy.addEventListener('change', this.change.bind(this, 'anisotropy'));
this.$.anisotropy.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
this.$.anisotropy.value = this.meta.userData.anisotropy;
this.updateInvalid(this.$.anisotropy, 'anisotropy');
updateElementReadonly.call(this, this.$.anisotropy);
},
},
faceSize: {
ready() {
this.$.faceSize.addEventListener('change', this.change.bind(this, 'faceSize'));
this.$.faceSize.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
this.$.faceSize.value = this.meta.userData.faceSize;
this.updateInvalid(this.$.faceSize, 'faceSize');
updateElementReadonly.call(this, this.$.faceSize);
},
},
filterMode: {
ready() {
this.$.filterMode.addEventListener('change', this.change.bind(this, 'filterMode'));
this.$.filterMode.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
let optionsHtml = '';
// FilterMode 选项
const types = Object.keys(ModeMap.filter).concat('Advanced');
types.forEach((type) => {
optionsHtml += ``;
});
this.$.filterMode.innerHTML = optionsHtml;
// 匹配 filterMode 值,没有匹配到组合,则为自定义 Advanced
let value = 'Advanced';
for (const filterKey of Object.keys(ModeMap.filter)) {
const filterItem = ModeMap.filter[filterKey];
let flag = true;
for (const key of Object.keys(filterItem)) {
if (this.meta.userData[key] !== filterItem[key]) {
flag = false;
break;
}
}
if (flag) {
value = filterKey;
break;
}
}
this.$.filterMode.value = value;
// 更新时需要判断是否显示自定义项
value === 'Advanced'
? (this.$.filterAdvancedSection.style.display = 'block')
: (this.$.filterAdvancedSection.style.display = 'none');
this.updateInvalid(this.$.filterMode, 'filterMode');
updateElementReadonly.call(this, this.$.filterMode);
},
},
minfilter: {
ready() {
this.$.minfilter.addEventListener('change', this.change.bind(this, 'minfilter'));
this.$.minfilter.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
let optionsHtml = '';
const types = ['nearest', 'linear'];
types.forEach((type) => {
optionsHtml += ``;
});
this.$.minfilter.innerHTML = optionsHtml;
this.$.minfilter.value = this.meta.userData.minfilte || 'nearest';
this.updateInvalid(this.$.minfilter, 'minfilter');
updateElementReadonly.call(this, this.$.minfilter);
},
},
magfilter: {
ready() {
this.$.magfilter.addEventListener('change', this.change.bind(this, 'magfilter'));
this.$.magfilter.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
let optionsHtml = '';
const types = ['nearest', 'linear'];
types.forEach((type) => {
optionsHtml += ``;
});
this.$.magfilter.innerHTML = optionsHtml;
this.$.magfilter.value = this.meta.userData.magfilter || 'nearest';
this.updateInvalid(this.$.magfilter, 'magfilter');
updateElementReadonly.call(this, this.$.magfilter);
},
},
generateMipmaps: {
ready() {
this.$.generateMipmaps.addEventListener('change', this.change.bind(this, 'generateMipmaps'));
this.$.generateMipmaps.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
this.$.generateMipmaps.value = this.meta.userData.mipfilter ? this.meta.userData.mipfilter !== 'none' : false;
// 更新时判断是否显示 mipfilter 选项
this.$.generateMipmaps.value
? (this.$.generateMipmapsSection.style.display = 'block')
: (this.$.generateMipmapsSection.style.display = 'none');
this.updateInvalid(this.$.generateMipmaps, 'generateMipmaps');
updateElementReadonly.call(this, this.$.generateMipmaps);
},
},
mipfilter: {
ready() {
this.$.mipfilter.addEventListener('change', this.change.bind(this, 'mipfilter'));
this.$.mipfilter.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
let optionsHtml = '';
const types = ['nearest', 'linear'];
types.forEach((type) => {
optionsHtml += ``;
});
this.$.mipfilter.innerHTML = optionsHtml;
this.$.mipfilter.value = this.meta.userData.mipfilter || 'nearest';
this.metaList && this.metaList.forEach((meta) => {
Editor.Profile.setTemp('inspector', `${meta.uuid}.texture.mipfilter`, this.meta.userData.mipfilter);
});
this.updateInvalid(this.$.mipfilter, 'mipfilter');
updateElementReadonly.call(this, this.$.mipfilter);
},
},
wrapMode: {
ready() {
this.$.wrapMode.addEventListener('change', this.change.bind(this, 'wrapMode'));
this.$.wrapMode.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
let optionsHtml = '';
// WrapMode 选项
const types = Object.keys(ModeMap.wrap).concat('Advanced');
types.forEach((type) => {
optionsHtml += ``;
});
this.$.wrapMode.innerHTML = optionsHtml;
// 匹配 wrapMode 值,没有匹配到组合,则为自定义 Advanced
let value = 'Advanced';
for (const wrapKey of Object.keys(ModeMap.wrap)) {
const wrapItem = ModeMap.wrap[wrapKey];
let flag = true;
for (const key of Object.keys(wrapItem)) {
if (this.meta.userData[key] !== wrapItem[key]) {
flag = false;
break;
}
}
if (flag) {
value = wrapKey;
break;
}
}
this.$.wrapMode.value = value;
// 更新时需要判断是否显示自定义项
value === 'Advanced'
? (this.$.wrapAdvancedSection.style.display = 'block')
: (this.$.wrapAdvancedSection.style.display = 'none');
this.updateInvalid(this.$.wrapMode, 'wrapMode');
updateElementReadonly.call(this, this.$.wrapMode);
},
},
wrapModeS: {
ready() {
this.$.wrapModeS.addEventListener('change', this.change.bind(this, 'wrapModeS'));
this.$.wrapModeS.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
let optionsHtml = '';
const types = {
Repeat: 'repeat',
Clamp: 'clamp-to-edge',
Mirror: 'mirrored-repeat',
};
for (const type in types) {
optionsHtml += ``;
}
this.$.wrapModeS.innerHTML = optionsHtml;
this.$.wrapModeS.value = this.meta.userData.wrapModeS || 'repeat';
this.updateInvalid(this.$.wrapModeS, 'wrapModeS');
updateElementReadonly.call(this, this.$.wrapModeS);
},
},
wrapModeT: {
ready() {
this.$.wrapModeT.addEventListener('change', this.change.bind(this, 'wrapModeT'));
this.$.wrapModeT.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
let optionsHtml = '';
const types = {
Repeat: 'repeat',
Clamp: 'clamp-to-edge',
Mirror: 'mirrored-repeat',
};
for (const type in types) {
optionsHtml += ``;
}
this.$.wrapModeT.innerHTML = optionsHtml;
this.$.wrapModeT.value = this.meta.userData.wrapModeT || 'repeat';
this.updateInvalid(this.$.wrapModeT, 'wrapModeT');
updateElementReadonly.call(this, this.$.wrapModeT);
},
},
mipBakeMode: {
ready() {
this.$.mipBakeMode.addEventListener('change', this.change.bind(this, 'mipBakeMode'));
this.$.mipBakeMode.addEventListener('confirm', () => {
this.dispatch('snapshot');
});
},
update() {
this.$.mipBakeMode.value = this.meta.userData.mipBakeMode === 2 ? true : false;
this.updateInvalid(this.$.mipBakeMode, 'mipBakeMode');
updateElementReadonly.call(this, this.$.mipBakeMode);
},
},
};
exports.methods = {
updateInvalid(element, prop) {
let invalid;
// filterMode、 wrapMode 和 generateMipmaps 需要拆解进行判断
switch (prop) {
case 'filterMode':
invalid = this.metaList.some((meta) => {
for (const key of Object.keys(ModeMap.filter.Bilinear)) {
if (meta.userData[key] !== this.meta.userData[key]) {
return true;
}
}
return false;
});
break;
case 'wrapMode':
invalid = this.metaList.some((meta) => {
for (const key of Object.keys(ModeMap.wrap.Repeat)) {
if (meta.userData[key] !== this.meta.userData[key]) {
return true;
}
}
return false;
});
break;
case 'generateMipmaps':
invalid = this.metaList.some((meta) => {
return meta.userData['mipfilter'] !== this.meta.userData['mipfilter'];
});
break;
default:
invalid = this.metaList.some((meta) => {
return meta.userData[prop] !== this.meta.userData[prop];
});
break;
}
element.invalid = invalid;
},
change(key, event) {
let value = event.target.value;
if (key === 'mipBakeMode') {
value = event.target.value ? 2 : 1;
}
this.metaList.forEach((meta) => {
if (key === 'filterMode') {
if (ModeMap.filter[value]) {
const data = ModeMap.filter[value];
for (const key of Object.keys(data)) {
meta.userData[key] = data[key];
}
this.$.filterAdvancedSection.style.display = 'none';
} else {
// 选择 advanced 显示自定义项
this.$.filterAdvancedSection.style.display = 'block';
}
} else if (key === 'generateMipmaps') {
if (!value) {
// 没勾选 生成 mipmaps,不显示 mipfilter 选项
meta.userData.mipfilter = 'none';
this.$.generateMipmapsSection.style.display = 'none';
} else {
this.$.generateMipmapsSection.style.display = 'block';
if (this.$.mipfilter.value === 'none') {
this.$.mipfilter.value = 'nearest';
// TODO: 目前 ui-select 通过 .value 修改组件值后没有触发 change 事件,需要手动提交
this.$.mipfilter.dispatch('change');
}
}
} else if (key === 'wrapMode') {
if (ModeMap.wrap[value]) {
const data = ModeMap.wrap[value];
for (const key of Object.keys(data)) {
meta.userData[key] = data[key];
}
this.$.wrapAdvancedSection.style.display = 'none';
} else {
// 选择 advanced 需要显示自定义项
this.$.wrapAdvancedSection.style.display = 'block';
}
} else {
meta.userData[key] = value || undefined;
}
});
this.dispatch('change');
},
};
exports.ready = function() {
for (const key in Elements) {
if (typeof Elements[key].ready === 'function') {
Elements[key].ready.call(this);
}
}
};
exports.update = function(assetList, metaList) {
this.assetList = assetList;
this.metaList = metaList;
this.asset = assetList[0];
this.meta = metaList[0];
for (const key in Elements) {
if (typeof Elements[key].update === 'function') {
Elements[key].update.call(this);
}
}
};