threepipe
Version:
A 3D viewer framework built on top of three.js in TypeScript with a focus on quality rendering, modularity and extensibility.
65 lines • 2.98 kB
JavaScript
/**
* Displacement Map Extension
*
* displacementTexture and displacementScale are added to the material
*
* Specification: https://webgi.xyz/docs/gltf-extensions/WEBGI_materials_displacementmap.html
*/
export class GLTFMaterialsDisplacementMapExtension {
}
GLTFMaterialsDisplacementMapExtension.WebGiMaterialsDisplacementMapExtension = 'WEBGI_materials_displacementmap';
GLTFMaterialsDisplacementMapExtension.Import = (parser) => new GLTFMaterialsDisplacementMapExtensionImport(parser);
GLTFMaterialsDisplacementMapExtension.Export = (writer) => new GLTFMaterialsDisplacementMapExtensionExport(writer);
// see GLTFDracoExportPlugin
GLTFMaterialsDisplacementMapExtension.Textures = {
displacementTexture: 'R',
};
class GLTFMaterialsDisplacementMapExtensionImport {
constructor(parser) {
this.parser = parser;
this.name = GLTFMaterialsDisplacementMapExtension.WebGiMaterialsDisplacementMapExtension;
}
async extendMaterialParams(materialIndex, materialParams) {
const parser = this.parser;
const materialDef = parser.json.materials[materialIndex];
if (!materialDef.extensions || !materialDef.extensions[this.name]) {
return Promise.resolve();
}
const pending = [];
const extension = materialDef.extensions[this.name];
if (extension.displacementScale !== undefined) {
materialParams.displacementScale = extension.displacementScale;
}
if (extension.displacementBias !== undefined) {
materialParams.displacementBias = extension.displacementBias;
}
if (extension.displacementTexture !== undefined) {
pending.push(parser.assignTexture(materialParams, 'displacementMap', extension.displacementTexture));
}
return Promise.all(pending);
}
}
class GLTFMaterialsDisplacementMapExtensionExport {
constructor(writer) {
this.writer = writer;
this.name = GLTFMaterialsDisplacementMapExtension.WebGiMaterialsDisplacementMapExtension;
}
writeMaterial(material, materialDef) {
if (!material.isMeshStandardMaterial || material.displacementScale === 0)
return;
const writer = this.writer;
const extensionsUsed = writer.extensionsUsed;
const extensionDef = {};
extensionDef.displacementScale = material.displacementScale;
extensionDef.displacementBias = material.displacementBias;
if (material.displacementMap) {
const displacementMapDef = { index: writer.processTexture(material.displacementMap) };
writer.applyTextureTransform(displacementMapDef, material.displacementMap);
extensionDef.displacementTexture = displacementMapDef;
}
materialDef.extensions = materialDef.extensions || {};
materialDef.extensions[this.name] = extensionDef;
extensionsUsed[this.name] = true;
}
}
//# sourceMappingURL=GLTFMaterialsDisplacementMapExtension.js.map