'use strict';
const { updateElementReadonly, updateElementInvalid } = require('../../utils/assets');
const { join, dirname } = require('path');
exports.template = /* html */`
`;
exports.style = /* css */`
ui-prop { margin-right: 4px; }
ui-section.config { margin-right: 0; }
.images {
margin: 4px 0;
}
.images > ui-section > .sub-item {
padding-top: 10px;
padding-left: 10px;
}
.images > ui-section > .sub-item ui-prop {
--left-width: calc(35% - 10px);
}
.images > ui-section > .sub-item ui-asset {
width: 100%;
}
.images > ui-section > .sub-item .img {
max-width: 100px;
max-height: 100px;
min-width: 14px;
}
.images > ui-section > .sub-item .image {
margin-top: 5px;
max-height: 400px;
}
`;
exports.$ = {
container: '.container',
dumpMaterialsCheckbox: '.dumpMaterials-checkbox',
materialDumpDirProp: '.materialDumpDir-prop',
materialDumpDirFile: '.materialDumpDir-file',
useVertexColorsCheckbox: '.useVertexColors-checkbox',
depthWriteInAlphaModeBlendCheckbox: '.depthWriteInAlphaModeBlend-checkbox',
images: '.images',
};
const Elements = {
dumpMaterials: {
ready() {
const panel = this;
panel.$.dumpMaterialsCheckbox.addEventListener('change', (event) => {
panel.setProp('dumpMaterials', event);
Elements.materialDumpDir.update.bind(panel)();
});
panel.$.dumpMaterialsCheckbox.addEventListener('confirm', () => {
panel.dispatch('snapshot');
});
},
update() {
const panel = this;
panel.$.dumpMaterialsCheckbox.value = panel.getDefault(panel.meta.userData.dumpMaterials, false);
updateElementInvalid.call(panel, panel.$.dumpMaterialsCheckbox, 'dumpMaterials');
updateElementReadonly.call(panel, panel.$.dumpMaterialsCheckbox);
},
},
materialDumpDir: {
ready() {
const panel = this;
panel.$.materialDumpDirFile.addEventListener('change', async (event) => {
const value = event.target.value;
panel.materialDumpDir = value;
// Restricted values are in the assets directory
const projectAssets = join(Editor.Project.path, 'assets');
if (!Editor.Utils.Path.contains(projectAssets, value)) {
await Editor.Dialog.warn(Editor.I18n.t('ENGINE.assets.fbx.limitMaterialDumpDir'), {
title: Editor.I18n.t('scene.messages.warning'),
});
panel.materialDumpDir = panel.materialDumpDirDefault;
Elements.materialDumpDir.update.bind(panel)();
return;
}
const dir = await Editor.Message.request('asset-db', 'query-url', panel.materialDumpDir);
panel.metaList.forEach((meta) => {
meta.userData.materialDumpDir = dir;
});
panel.dispatch('change');
});
},
async update() {
const panel = this;
panel.$.materialDumpDirProp.style.display = panel.$.dumpMaterialsCheckbox.value ? 'block' : 'none';
if (!panel.$.dumpMaterialsCheckbox.value) {
return;
}
// Same resource in a parent folder
const filePath = (await Editor.Message.request('asset-db', 'query-path', panel.asset.path)) || '';
panel.materialDumpDirDefault = dirname(filePath);
// Same resource in a parent folder
let materialDumpDir = panel.materialDumpDirDefault;
if (panel.meta.userData.materialDumpDir) {
const dataDir = await Editor.Message.request('asset-db', 'query-path', panel.meta.userData.materialDumpDir);
if (dataDir) {
materialDumpDir = dataDir;
}
}
panel.$.materialDumpDirFile.value = materialDumpDir;
updateElementInvalid.call(panel, panel.$.materialDumpDirFile, 'materialDumpDir');
updateElementReadonly.call(panel, panel.$.materialDumpDirFile);
},
},
useVertexColors: {
ready() {
const panel = this;
panel.$.useVertexColorsCheckbox.addEventListener('change', panel.setProp.bind(panel, 'useVertexColors'));
panel.$.useVertexColorsCheckbox.addEventListener('confirm', () => {
panel.dispatch('snapshot');
});
},
update() {
const panel = this;
panel.$.useVertexColorsCheckbox.value = panel.getDefault(panel.meta.userData.useVertexColors, false);
updateElementInvalid.call(panel, panel.$.useVertexColorsCheckbox, 'useVertexColors');
updateElementReadonly.call(panel, panel.$.useVertexColorsCheckbox);
},
},
depthWriteInAlphaModeBlend: {
ready() {
const panel = this;
panel.$.depthWriteInAlphaModeBlendCheckbox.addEventListener('change', panel.setProp.bind(panel, 'depthWriteInAlphaModeBlend'));
panel.$.depthWriteInAlphaModeBlendCheckbox.addEventListener('confirm', () => {
panel.dispatch('snapshot');
});
},
update() {
const panel = this;
panel.$.depthWriteInAlphaModeBlendCheckbox.value = panel.getDefault(panel.meta.userData.depthWriteInAlphaModeBlend, false);
updateElementInvalid.call(panel, panel.$.depthWriteInAlphaModeBlendCheckbox, 'depthWriteInAlphaModeBlend');
updateElementReadonly.call(panel, panel.$.depthWriteInAlphaModeBlendCheckbox);
},
},
images: {
async update() {
const panel = this;
panel.$.images.innerText = '';
if (panel.assetList.length !== 1) {
return;
}
if (!panel.meta || !panel.meta.userData || !panel.meta.userData.imageMetas) {
return;
}
const images = [];
const subNames = Object.keys(panel.meta.userData.imageMetas);
for (let index = 0; index < subNames.length; index++) {
const name = subNames[index];
const item = panel.meta.userData.imageMetas[name];
const imageUuid = item.uri;
// Processing image display
let src = '';
// may be base64 images.
if (item.uri.startsWith('data:')) {
src = item.uri;
} else {
// Handling the case of uuid
const imageAsset = await Editor.Message.request('asset-db', 'query-asset-info', imageUuid);
if (imageAsset && imageAsset.library) {
const key = Object.keys(imageAsset.library).find((key) => key !== '.json');
if (key) {
src = imageAsset.library[key];
}
}
}
let remapUuid = '';
// URL format
if (item.remap) {
remapUuid = await Editor.Message.request('asset-db', 'query-uuid', item.remap);
}
images.push({
name: item.name || name,
src,
imageUuid,
remapUuid,
remap: item.remap,
index,
});
}
// Generate dom
images.forEach((image, index) => {
const section = document.createElement('ui-section');
section.setAttribute('expand', '');
panel.$.images.appendChild(section);
const header = document.createElement('div');
header.setAttribute('slot', 'header');
header.innerText = image.name;
section.appendChild(header);
const content = document.createElement('div');
content.setAttribute('class', 'sub-item');
section.appendChild(content);
const remapAsProp = document.createElement('ui-prop');
content.appendChild(remapAsProp);
const remapAsPropLabel = document.createElement('ui-label');
remapAsPropLabel.setAttribute('slot', 'label');
remapAsPropLabel.setAttribute('value', 'i18n:ENGINE.assets.fbx.ImageRemap.remapAs');
remapAsProp.appendChild(remapAsPropLabel);
const remapAsPropContent = document.createElement('div');
remapAsPropContent.setAttribute('slot', 'content');
remapAsProp.appendChild(remapAsPropContent);
const remapAsPropContentAsset = document.createElement('ui-asset');
remapAsPropContentAsset.setAttribute('droppable', 'cc.ImageAsset');
remapAsPropContent.appendChild(remapAsPropContentAsset);
remapAsPropContentAsset.addEventListener('confirm', async (event) => {
const uuid = event.target.value;
let url = '';
if (uuid) {
const asset = await Editor.Message.request('asset-db', 'query-asset-info', uuid);
if (!asset) {
return;
}
url = asset.source;
}
image.remapUuid = uuid;
image.remap = url;
panel.meta.userData.imageMetas[index].remap = uuid;
const remapAsPropContentImg = remapAsPropContent.querySelector('.image');
if (remapAsPropContentImg) {
remapAsPropContentImg.setAttribute('value', image.remap);
} else {
panel.appendImage(remapAsPropContent, image.remap);
}
this.dispatch('change');
this.dispatch('snapshot');
});
if (image.remap) {
remapAsPropContentAsset.setAttribute('value', image.remap);
panel.appendImage(remapAsPropContent, image.remap);
}
//
const originalProp = document.createElement('ui-prop');
content.appendChild(originalProp);
const originalPropLabel = document.createElement('ui-label');
originalPropLabel.setAttribute('slot', 'label');
originalPropLabel.setAttribute('value', 'i18n:ENGINE.assets.fbx.ImageRemap.original');
originalProp.appendChild(originalPropLabel);
const originalPropContent = document.createElement('div');
originalPropContent.setAttribute('slot', 'content');
originalProp.appendChild(originalPropContent);
if (image.src) {
const originalPropContentImg = document.createElement('img');
originalPropContentImg.setAttribute('src', image.src);
originalPropContentImg.setAttribute('title', image.imageUuid);
originalPropContentImg.setAttribute('class', 'img');
originalPropContent.appendChild(originalPropContentImg);
} else {
originalPropContent.innerText = `${image.imageUuid}`;
}
});
},
},
};
exports.methods = {
setProp(prop, event) {
this.metaList.forEach((meta) => {
meta.userData[prop] = event.target.value;
});
this.dispatch('change');
this.dispatch('track', { tab: 'material', prop, value: event.target.value });
},
getDefault(value, def, prop) {
if (value === undefined) {
return def;
}
if (prop) {
value = value[prop];
}
if (value === undefined) {
return def;
}
return value;
},
appendImage(parent, value) {
const image = document.createElement('ui-image');
image.setAttribute('class', 'image');
image.setAttribute('value', value);
image.setAttribute('slot', 'content');
parent.appendChild(image);
},
};
exports.ready = function() {
for (const prop in Elements) {
const element = Elements[prop];
if (element.ready) {
element.ready.call(this);
}
}
};
exports.update = function(assetList, metaList) {
this.assetList = assetList;
this.metaList = metaList;
this.asset = assetList[0];
this.meta = metaList[0];
for (const prop in Elements) {
const element = Elements[prop];
if (element.update) {
element.update.call(this);
}
}
};
exports.close = function() {
for (const prop in Elements) {
const element = Elements[prop];
if (element.close) {
element.close.call(this);
}
}
};