From d199ec5305532e69bc8cde120f0f6eee9b3a1539 Mon Sep 17 00:00:00 2001 From: Bart van der Braak Date: Sat, 29 Jul 2023 14:32:25 +0200 Subject: [PATCH] feat: added threlte & threejs implementations --- package.json | 4 +- pnpm-lock.yaml | 70 ++++++++++++++- src/lib/assets/vectors/github.glb | Bin 0 -> 67016 bytes src/lib/assets/vectors/github.svg | 1 + src/lib/components/gltf/Github3d.svelte | 29 +++++++ src/lib/extrude-svg.ts | 45 ++++++++++ src/routes/tools/+page.svelte | 111 ++---------------------- src/routes/tools/Scene.svelte | 42 +++++++++ static/github-transformed.glb | Bin 0 -> 9976 bytes vite.config.ts | 5 +- 10 files changed, 198 insertions(+), 109 deletions(-) create mode 100644 src/lib/assets/vectors/github.glb create mode 100644 src/lib/assets/vectors/github.svg create mode 100644 src/lib/components/gltf/Github3d.svelte create mode 100644 src/lib/extrude-svg.ts create mode 100644 src/routes/tools/Scene.svelte create mode 100644 static/github-transformed.glb diff --git a/package.json b/package.json index bd13ced..7c8da14 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,9 @@ }, "type": "module", "dependencies": { + "@threlte/core": "6.0.0-next.11", + "@threlte/extras": "5.0.0-next.16", "@types/three": "^0.154.0", - "three": "^0.154.0" + "three": "^0.155.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84c2fd4..089d397 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,12 +5,18 @@ settings: excludeLinksFromLockfile: false dependencies: + '@threlte/core': + specifier: 6.0.0-next.11 + version: 6.0.0-next.11 + '@threlte/extras': + specifier: 5.0.0-next.16 + version: 5.0.0-next.16(three@0.155.0) '@types/three': specifier: ^0.154.0 version: 0.154.0 three: - specifier: ^0.154.0 - version: 0.154.0 + specifier: ^0.155.0 + version: 0.155.0 devDependencies: '@skeletonlabs/skeleton': @@ -486,6 +492,19 @@ packages: - supports-color dev: true + /@threlte/core@6.0.0-next.11: + resolution: {integrity: sha512-mW7tCxUiXTrMvTb9NLD/fBNlMtnSDnIdBykf7bXKw6Jd5lKUGNq1zQp/8jg456g17XJazmAY1nO/oJ54ye1qoA==} + dev: false + + /@threlte/extras@5.0.0-next.16(three@0.155.0): + resolution: {integrity: sha512-KcjvVrRlvTtHlzHdRtvEHmQa+ijyr6CFLIIN1kISZHvvnReg4HuNOZQRgAfjXCDs8Rrmoq31H9nvcayfEDrIwA==} + dependencies: + lodash: 4.17.21 + troika-three-text: 0.47.2(three@0.155.0) + transitivePeerDependencies: + - three + dev: false + /@tweenjs/tween.js@18.6.4: resolution: {integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==} dev: false @@ -751,6 +770,12 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /bidi-js@1.0.2: + resolution: {integrity: sha512-rzSy/k7WdX5zOyeHHCOixGXbCHkyogkxPKL2r8QtzHmVQDiWCXUWa18bLdMWT9CYMLOYTjWpTHawuev2ouYJVw==} + dependencies: + require-from-string: 2.0.2 + dev: false + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -1449,6 +1474,10 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1817,6 +1846,11 @@ packages: picomatch: 2.3.1 dev: true + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -2152,8 +2186,8 @@ packages: any-promise: 1.3.0 dev: true - /three@0.154.0: - resolution: {integrity: sha512-Uzz8C/5GesJzv8i+Y2prEMYUwodwZySPcNhuJUdsVMH2Yn4Nm8qlbQe6qRN5fOhg55XB0WiLfTPBxVHxpE60ug==} + /three@0.155.0: + resolution: {integrity: sha512-sNgCYmDijnIqkD/bMfk+1pHg3YzsxW7V2ChpuP6HCQ8NiZr3RufsXQr8M3SSUMjW4hG+sUk7YbyuY0DncaDTJQ==} dev: false /to-regex-range@5.0.1: @@ -2168,6 +2202,30 @@ packages: engines: {node: '>=6'} dev: true + /troika-three-text@0.47.2(three@0.155.0): + resolution: {integrity: sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==} + peerDependencies: + three: '>=0.125.0' + dependencies: + bidi-js: 1.0.2 + three: 0.155.0 + troika-three-utils: 0.47.2(three@0.155.0) + troika-worker-utils: 0.47.2 + webgl-sdf-generator: 1.1.1 + dev: false + + /troika-three-utils@0.47.2(three@0.155.0): + resolution: {integrity: sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==} + peerDependencies: + three: '>=0.125.0' + dependencies: + three: 0.155.0 + dev: false + + /troika-worker-utils@0.47.2: + resolution: {integrity: sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==} + dev: false + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true @@ -2282,6 +2340,10 @@ packages: vite: 4.4.4 dev: true + /webgl-sdf-generator@1.1.1: + resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} + dev: false + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/src/lib/assets/vectors/github.glb b/src/lib/assets/vectors/github.glb new file mode 100644 index 0000000000000000000000000000000000000000..e297dce38c0316196bf89b9c4939917f1d845527 GIT binary patch literal 67016 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 H>@)u#wiDn8 literal 0 HcmV?d00001 diff --git a/src/lib/assets/vectors/github.svg b/src/lib/assets/vectors/github.svg new file mode 100644 index 0000000..37fa923 --- /dev/null +++ b/src/lib/assets/vectors/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lib/components/gltf/Github3d.svelte b/src/lib/components/gltf/Github3d.svelte new file mode 100644 index 0000000..5e2c117 --- /dev/null +++ b/src/lib/components/gltf/Github3d.svelte @@ -0,0 +1,29 @@ + + + + + + {#await gltf} + + {:then gltf} + + {:catch error} + + {/await} + + + diff --git a/src/lib/extrude-svg.ts b/src/lib/extrude-svg.ts new file mode 100644 index 0000000..48b097c --- /dev/null +++ b/src/lib/extrude-svg.ts @@ -0,0 +1,45 @@ +import type * as THREE from 'three'; +import { SVGLoader } from 'three/examples/jsm/loaders/SVGLoader'; +import type { SVGResult, SVGResultPaths } from 'three/examples/jsm/loaders/SVGLoader'; + +import { Mesh } from 'three/src/objects/Mesh'; +import { Group } from 'three/src/objects/Group'; +import { MeshNormalMaterial } from 'three/src/materials/MeshNormalMaterial'; +import { ExtrudeGeometry } from 'three/src/geometries/ExtrudeGeometry'; + +/** + * Parses the provided SVG markup and extrudes it into a 3D model using THREE.js. + * @param svgMarkup - SVG markup to extrude. + * @return Group containing all of the extruded SVG paths. + * @throws Error If the SVG markup is empty. + */ +export function extrudeSvg(svgMarkup: string): Group { + if (!svgMarkup) { + throw new Error('SVG markup is empty'); + } + + const svgData: SVGResult = new SVGLoader().parse(svgMarkup); + const material: MeshNormalMaterial = new MeshNormalMaterial(); + + const svgGroup: Mesh[][] = svgData.paths.map(createShapeFromPath); + + const group = new Group(); + svgGroup.flat().forEach(mesh => group.add(mesh)); + + return group; + + function createShapeFromPath(path: SVGResultPaths): Mesh[] { + const shapes: THREE.Shape[] = path.toShapes(true); + + return shapes.map(shape => extrudeShape(shape, material)); + } + + function extrudeShape(shape: THREE.Shape, material: MeshNormalMaterial): Mesh { + const geometry = new ExtrudeGeometry(shape, { + depth: 20, + bevelEnabled: false + }); + + return new Mesh(geometry, material); + } +} diff --git a/src/routes/tools/+page.svelte b/src/routes/tools/+page.svelte index f62f863..f453a69 100644 --- a/src/routes/tools/+page.svelte +++ b/src/routes/tools/+page.svelte @@ -1,98 +1,7 @@ @@ -101,13 +10,9 @@

Tools

+ + + + +
- -
- - diff --git a/src/routes/tools/Scene.svelte b/src/routes/tools/Scene.svelte new file mode 100644 index 0000000..1b985e3 --- /dev/null +++ b/src/routes/tools/Scene.svelte @@ -0,0 +1,42 @@ + + + { + ref.lookAt(0, 1, 0); + }} +/> + + scale.set(1.5)} + on:pointerleave={() => scale.set(1)} + on:click={() => scale.set(3)} +> + + + + + scale.set(1.5)} + on:pointerleave={() => scale.set(1)} + on:click={() => scale.set(3)} +/> diff --git a/static/github-transformed.glb b/static/github-transformed.glb new file mode 100644 index 0000000000000000000000000000000000000000..743764f3ca2d5afe27812b0b96b70b9ee56490c9 GIT binary patch literal 9976 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