diff --git a/.gitattributes b/.gitattributes index fdc560a..ab3e086 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ *.webm filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text diff --git a/bun.lockb b/bun.lockb index 28d9c13..db6a886 100644 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/example/script.ts b/example/script.ts index 3a9652b..5a26ca0 100644 --- a/example/script.ts +++ b/example/script.ts @@ -1,4 +1,6 @@ -import { Color, DirectionalLight, Mesh, Node, PerspectiveCamera, PointLight, Quaternion, Scene, Submesh, Vector3 } from "../src/data/index"; +/// + +import { Color, Mesh, Node, PerspectiveCamera, PointLight, Quaternion, Scene, Submesh, Vector3 } from "../src/data/index"; import { Renderer, degToRad } from "../src/oktaeder"; import "./style.css"; @@ -16,38 +18,74 @@ const camera = new PerspectiveCamera({ farPlane: Infinity, }); -const vertexBuffer = renderer.createVertexBuffer({ vertexCount: 6 }); +const vertexBuffer = renderer.createVertexBuffer({ vertexCount: 12, texCoord: true }); vertexBuffer.writeTypedArray(0, { position: new Float32Array([ + 0, 0, 1, + 1, 0, 0, + 0, 1, 0, -1, 0, 0, + 0, 0, -1, + 0, 0, -1, + 0, 0, -1, 1, 0, 0, 0, -1, 0, - 0, 1, 0, + -1, 0, 0, 0, 0, -1, 0, 0, 1, ]), + texCoord: new Float32Array([ + 0.5, 0.7113, + 0.333333, 1, + 0.166666, 0.7113, + 0.333333, 0.4226, + 0, 0.4226, + 0, 1, + 1, 1, + 0.666666, 1, + 0.833333, 0.7113, + 0.666666, 0.4226, + 1, 0.4226, + 0.5, 0.7113, + ]), }); const indexBuffer = renderer.createIndexBuffer({ indexCount: 24, indexFormat: "uint16" }); indexBuffer.writeArray(0, [ - 0, 4, 3, - 4, 1, 3, - 1, 5, 3, - 5, 0, 3, - 4, 0, 2, - 1, 4, 2, + 0, 2, 1, + 3, 4, 2, 5, 1, 2, - 0, 5, 2, + 2, 0, 3, + 6, 8, 7, + 9, 8, 10, + 7, 8, 11, + 11, 8, 9, ]); const submesh: Submesh = { start: 0, length: 24 }; const mesh = new Mesh({ vertexBuffer, indexBuffer, submeshes: [submesh] }); +const imageBitmap = await loadImageBitmap("/uvmap.png"); + +const texture = renderer.createTexture({ + format: "srgb", + width: imageBitmap.width, + height: imageBitmap.height, + usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, +}); + +renderer._device.queue.copyExternalImageToTexture( + { source: imageBitmap, flipY: false }, + { texture: texture._texture }, + { width: imageBitmap.width, height: imageBitmap.height }, +); + const material = renderer.createMaterial({ baseColor: Color.white(), + baseColorPartialCoverageTexture: texture, roughness: 0.5, - metallic: 1, + metallic: 0, }); const node = new Node({ mesh, materials: [material] }); @@ -55,25 +93,13 @@ const node = new Node({ mesh, materials: [material] }); const scene = new Scene({ nodes: [ node, - new Node({ - translation: new Vector3(-1, 1, 0), - light: new PointLight({ color: new Color(1, 0, 0) }), - }), new Node({ translation: new Vector3(0, 1, -1), - light: new PointLight({ color: new Color(0, 1, 0) }), + light: new PointLight({ color: new Color(1, 1, 1) }), }), new Node({ - translation: new Vector3(1, 1, 0), - light: new PointLight({ color: new Color(0, 0, 1) }), - }), - new Node({ - translation: new Vector3(0, 1, 1), - light: new PointLight({ color: new Color(1, 1, 0) }), - }), - new Node({ - rotation: Quaternion.fromRotationYZ(degToRad(-90)), - light: new DirectionalLight({ color: new Color(0.5, 0.5, 0.5) }), + translation: new Vector3(0, -1, -1), + light: new PointLight({ color: new Color(1, 1, 1) }), }), new Node({ translation: new Vector3(0, 0.8, -3), @@ -91,6 +117,14 @@ function onResize(this: Window) { const _quaternion = Quaternion.identity(); +async function loadImageBitmap(url: string) { + const res = await fetch(url); + const blob = await res.blob(); + const imageBitmap = await createImageBitmap(blob, { colorSpaceConversion: "none" }); + + return imageBitmap; +} + function draw(timeMs: number) { const time = 0.001 * timeMs; node.setRotation(_quaternion.setRotationZX(-0.5 * time)); diff --git a/example/uvmap.png b/example/uvmap.png new file mode 100644 index 0000000..64689f8 --- /dev/null +++ b/example/uvmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9ad63b29f85aed2ef2a6d630028d50a63f3a9050a3f9f0b291dcb5878adf820 +size 1079056 diff --git a/package.json b/package.json index 92a24ce..9555b64 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,12 @@ "build": "tsc --build" }, "dependencies": { - "tslib": "^2.6.1" + "tslib": "^2.6.2" }, "devDependencies": { - "@webgpu/types": "^0.1.34", - "esbuild": "^0.19.2", - "typescript": "5.1.6" + "@webgpu/types": "^0.1.40", + "esbuild": "^0.20.2", + "typescript": "^5.4.2" }, "exports": { ".": { diff --git a/src/gltf.ts b/src/gltf.ts index 1bc9c58..39cd0a1 100644 --- a/src/gltf.ts +++ b/src/gltf.ts @@ -5,6 +5,7 @@ */ import * as data from "./data"; +import * as resources from "./resources"; /* INITIAL SUPPORT PLAN * @@ -94,7 +95,7 @@ import * as data from "./data"; export interface ParseResult { readonly cameras: readonly data.Camera[]; - readonly materials: readonly data.Material[]; + readonly materials: readonly resources.Material[]; readonly lights: readonly data.Light[]; readonly scenes: readonly data.Scene[]; readonly scene: data.Scene | null; @@ -181,7 +182,7 @@ export async function parse(gltf: ArrayBufferView, { }: ParseOptions = {}): Promise { const cameras: data.Camera[] = []; - const materials: data.Material[] = []; + const materials: resources.Material[] = []; const lights: data.Light[] = []; const scenes: data.Scene[] = []; const scene: data.Scene | null = null; @@ -267,6 +268,10 @@ export async function parse(gltf: ArrayBufferView, { // --- JSON CHUNK ---------------------------------------------------------- + void(stopOnFirstError); + void(treatWarningsAsErrors); + void(rest); + throw new Error("TODO"); // --- BIN CHUNK ----------------------------------------------------------- diff --git a/src/oktaeder.ts b/src/oktaeder.ts index 3878bdd..8e56a4a 100644 --- a/src/oktaeder.ts +++ b/src/oktaeder.ts @@ -49,7 +49,7 @@ export class Renderer { _textureWhite: Texture2D; /** 1×1 rgba8unorm texture of [0, 0, 0, 255] */ _textureBlack: Texture2D; - /** 1×1 rgba8unorm texture of [128, 128, 128, 255] */ + /** 1×1 rgba8unorm texture of [128, 128, 255, 255] */ _textureNormal: Texture2D; _depthBuffer: Texture2D; @@ -110,7 +110,7 @@ export class Renderer { height: 1, format: "linear", }); - this._textureNormal.writeFull(new Uint8Array([128, 128, 128, 255])); + this._textureNormal.writeFull(new Uint8Array([128, 128, 255, 255])); const framebufferTexture = this._context.getCurrentTexture(); this._depthBuffer = new Texture2D(this, { diff --git a/src/shader.ts b/src/shader.ts index 99cd009..cb4b6a1 100644 --- a/src/shader.ts +++ b/src/shader.ts @@ -46,10 +46,10 @@ export function _createPipeline(renderer: Renderer, { const shaderModule = renderer._device.createShaderModule({ code: shaderCode, - hints: { - "vert": { layout: renderer._pipelineLayout }, - "frag": { layout: renderer._pipelineLayout }, - }, + compilationHints: [ + { entryPoint: "vert", layout: renderer._pipelineLayout }, + { entryPoint: "frag", layout: renderer._pipelineLayout }, + ], }); let vertexLocation = 0; @@ -318,17 +318,17 @@ fn frag(fragment: Varyings) -> @location(0) vec4 { var emissive = _Material.emissive; var ior = _Material.ior; ${texCoord ? ` - let baseColorPartialCoverageTexel = texture(_BaseColorPartialCoverageTexture, _Sampler, fragment.texCoord); + let baseColorPartialCoverageTexel = textureSample(_BaseColorPartialCoverageTexture, _Sampler, fragment.texCoord); baseColor *= baseColorPartialCoverageTexel.rgb; partialCoverage *= baseColorPartialCoverageTexel.a; - let roughnessMetallicTexel = texture(_RoughnessMetallicTexture, _Sampler, fragment.texCoord); + let roughnessMetallicTexel = textureSample(_RoughnessMetallicTexture, _Sampler, fragment.texCoord); roughness *= roughnessMetallicTexel.g; metallic *= roughnessMetallicTexel.b; - let emissiveTexel = texture(_EmissiveTexture, _Sampler, fragment.texCoord); + let emissiveTexel = textureSample(_EmissiveTexture, _Sampler, fragment.texCoord); emissive *= emissiveTexel.rgb; ` : ""} ${lightTexCoord ? ` - let occlusionTexel = texture(_OcclusionTexture, _Sampler, fragment.lightTexCoord); + let occlusionTexel = textureSample(_OcclusionTexture, _Sampler, fragment.lightTexCoord); occlusion += _Material.occlusionTextureStrength * (occlusionTexel.r - 1.0); ` : ""} @@ -348,10 +348,10 @@ fn frag(fragment: Varyings) -> @location(0) vec4 { ` : ` let matrixTStoVS = screenSpaceMatrixTStoVS(positionVS, geometricNormalVS, fragment.texCoord); `} - let normalTextureTexel = texture(_NormalTexture, _Sampler, fragment.texCoord); + let normalTextureTexel = textureSample(_NormalTexture, _Sampler, fragment.texCoord); var normalTS = normalTextureTexel.xyz * 2.0 - 1.0; - normalTS.xy *= _Material.normalScale; - let actualNormalVS = normalize(matrixTStoVS * geometricNormalVS); + normalTS = vec3(normalTS.xy * _Material.normalScale, normalTS.z); + let actualNormalVS = normalize(matrixTStoVS * normalTS); ` : ` let actualNormalVS = geometricNormalVS; `} diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo deleted file mode 100644 index 5be1229..0000000 --- a/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.1.6/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/tslib@2.6.1/node_modules/tslib/tslib.d.ts","./node_modules/.pnpm/tslib@2.6.1/node_modules/tslib/modules/index.d.ts","./src/oktaeder.ts"],"fileInfos":[{"version":"f59215c5f1d886b05395ee7aca73e0ac69ddfad2843aa88530e797879d511bad","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc",{"version":"3dda5344576193a4ae48b8d03f105c86f20b2f2aff0a1d1fd7935f5d68649654","affectsGlobalScope":true},{"version":"9d9885c728913c1d16e0d2831b40341d6ad9a0ceecaabc55209b306ad9c736a5","affectsGlobalScope":true},{"version":"17bea081b9c0541f39dd1ae9bc8c78bdd561879a682e60e2f25f688c0ecab248","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"ab22100fdd0d24cfc2cc59d0a00fc8cf449830d9c4030dc54390a46bd562e929","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"36ae84ccc0633f7c0787bc6108386c8b773e95d3b052d9464a99cd9b8795fbec","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"f06948deb2a51aae25184561c9640fb66afeddb34531a9212d011792b1d19e0a","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"709efdae0cb5df5f49376cde61daacc95cdd44ae4671da13a540da5088bf3f30","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"61ed9b6d07af959e745fb11f9593ecd743b279418cc8a99448ea3cd5f3b3eb22","affectsGlobalScope":true},{"version":"038a2f66a34ee7a9c2fbc3584c8ab43dff2995f8c68e3f566f4c300d2175e31e","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"f5c92f2c27b06c1a41b88f6db8299205aee52c2a2943f7ed29bd585977f254e8","affectsGlobalScope":true},{"version":"930b0e15811f84e203d3c23508674d5ded88266df4b10abee7b31b2ac77632d2","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"b9ea5778ff8b50d7c04c9890170db34c26a5358cccba36844fe319f50a43a61a","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true},{"version":"189c0703923150aa30673fa3de411346d727cc44a11c75d05d7cf9ef095daa22","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"7a1971efcba559ea9002ada4c4e3c925004fb67a755300d53b5edf9399354900","31973b272be35eab5ecf20a38ea54bec84cdc0317117590cb813c72fe0ef75b3","8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"],"root":[59],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"importHelpers":true,"module":7,"newLine":1,"noErrorTruncation":true,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noPropertyAccessFromIndexSignature":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"removeComments":false,"skipLibCheck":false,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":9,"useUnknownInCatchVariables":true},"fileIdsList":[[57],[58]],"referencedMap":[[58,1],[59,2]],"exportedModulesMap":[[58,1],[59,2]],"semanticDiagnosticsPerFile":[58,57,55,56,10,12,11,2,13,14,15,16,17,18,19,20,3,4,24,21,22,23,25,26,27,5,28,29,30,31,6,35,32,33,34,36,7,37,42,43,38,39,40,41,8,47,44,45,46,48,9,49,50,51,54,52,53,1,59],"latestChangedDtsFile":"./src/oktaeder.d.ts"},"version":"5.1.6"} \ No newline at end of file