UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

90 lines 8.09 kB
import { TgdGeometry } from "./../../../geometry/index.js"; import { TgdDataset } from "./../../../dataset/index.js"; import { TgdVec3, TgdVec4 } from "./../../../math/index.js"; import { TgdMaterialDiffuse } from "./../../../material/index.js"; import { TgdLight } from "./../../../light/index.js"; import { TgdPainterMesh } from "../mesh/index.js"; /** */ export class TgdPainterMeshGltf extends TgdPainterMesh { constructor(context, options) { var _a; const { asset, meshIndex = 0, primitiveIndex = 0, materialFactory = makeMaterial, } = options; const color = figureColor(asset, meshIndex, primitiveIndex, context); const material = materialFactory({ color }); let computeNormals = false; const attributes = { POSITION: "vec3", NORMAL: "vec3", }; if (asset.getMeshPrimitive().attributes.TEXCOORD_0) { attributes.TEXCOORD_0 = "vec2"; } const dataset = new TgdDataset(attributes); asset.setAttrib(dataset, "POSITION", meshIndex, primitiveIndex); if (asset.getMeshPrimitive().attributes.NORMAL) { asset.setAttrib(dataset, "NORMAL", meshIndex, primitiveIndex); } else { // It seems to be impossible to retrieve normals. // We will compute them with a smooth shading. console.warn("No normals found! We will apply smooth shading."); computeNormals = true; } if (asset.getMeshPrimitive().attributes.TEXCOORD_0) { asset.setAttrib(dataset, "TEXCOORD_0", meshIndex, primitiveIndex); } super(context, { geometry: new TgdGeometry({ dataset, elements: asset.getMeshPrimitiveIndices(meshIndex, primitiveIndex), drawMode: "TRIANGLES", computeNormalsIfMissing: computeNormals, }), material, }); this.name = (_a = options.name) !== null && _a !== void 0 ? _a : `Gltf/${this.name}`; } } const DEFAULT_COLOR = new TgdVec4(0.9, 0.5, 0.1, 1); function figureColor(asset, meshIndex, primitiveIndex, context) { var _a, _b, _c; const primitive = asset.getMeshPrimitive(meshIndex, primitiveIndex); const materialIndex = (_a = primitive.material) !== null && _a !== void 0 ? _a : -1; if (materialIndex === -1) return DEFAULT_COLOR; const material = asset.getMaterial(materialIndex); const pbr = material.pbrMetallicRoughness; if (!pbr) { const emissive = material.emissiveTexture; if (!emissive) return DEFAULT_COLOR; const color = asset.createTexture2D(context, (_b = emissive.index) !== null && _b !== void 0 ? _b : 0); color.eventChange.addListener(context.paint); return color; } if (pbr.baseColorTexture) { const textureIndex = (_c = pbr.baseColorTexture) === null || _c === void 0 ? void 0 : _c.index; const color = asset.createTexture2D(context, textureIndex !== null && textureIndex !== void 0 ? textureIndex : 0); color.eventChange.addListener(context.paint); return color; } if (pbr.baseColorFactor) { return new TgdVec4(...pbr.baseColorFactor); } return DEFAULT_COLOR; } function makeMaterial({ color }) { const material = new TgdMaterialDiffuse({ color, light: new TgdLight({ color: new TgdVec4(1, 1, 1, 1), direction: new TgdVec3(1, 0.2, 0), }), ambient: new TgdLight({ color: new TgdVec4(0.75, 0.75, 0.75, 1), }), }); return material; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x0Zi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wYWludGVyL21lc2gvZ2x0Zi9nbHRmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBd0IsTUFBTSxjQUFjLENBQUE7QUFFL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDNUMsT0FBTyxFQUFlLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQy9ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQWN4QztHQUNHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGNBQWM7SUFDbEQsWUFBWSxPQUFtQixFQUFFLE9BQWtDOztRQUMvRCxNQUFNLEVBQ0YsS0FBSyxFQUNMLFNBQVMsR0FBRyxDQUFDLEVBQ2IsY0FBYyxHQUFHLENBQUMsRUFDbEIsZUFBZSxHQUFHLFlBQVksR0FDakMsR0FBRyxPQUFPLENBQUE7UUFDWCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDcEUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMzQyxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUE7UUFDMUIsTUFBTSxVQUFVLEdBQXlCO1lBQ3JDLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1NBQ2pCLENBQUE7UUFDRCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqRCxVQUFVLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQTtRQUNsQyxD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