From 31b24de86cb9966657ed5539260064b8ddb89230 Mon Sep 17 00:00:00 2001 From: Max Richter Date: Wed, 27 Mar 2024 01:51:42 +0100 Subject: [PATCH] feat: track images with git lfs --- .gitattributes | 5 + astro.config.mjs | 9 +- package.json | 7 +- pnpm-lock.yaml | 1262 ++++++++++++++++- public/app.css | 72 +- public/fonts/nunito-sans-v15-latin-300.ttf | 3 + public/fonts/nunito-sans-v15-latin-300.woff2 | 3 + public/fonts/nunito-v26-latin-300.ttf | 3 + public/fonts/nunito-v26-latin-300.woff2 | 3 + public/fonts/roboto-v30-latin-300.ttf | 3 + public/fonts/roboto-v30-latin-300.woff2 | 3 + src/components/GoogleyEye.svelte | 178 +++ src/components/Image.astro | 46 + src/components/LanguagePicker.astro | 15 +- src/components/Logo.astro | 5 +- src/components/Max.astro | 86 ++ src/components/Max.png | 3 + src/components/Nav.astro | 109 +- src/components/YouTube.astro | 19 + .../blog/alpine-valley/images/DSC_1601.jpg | 3 + .../blog/alpine-valley/images/Render.png | 3 + .../blog/alpine-valley/images/Render4.png | 3 + .../blog/alpine-valley/images/Render6.png | 3 + .../blog/alpine-valley/images/Unbenannt-1.jpg | 3 + .../blog/alpine-valley/images/untitled1-1.png | 3 + src/content/blog/alpine-valley/index.en.mdx | 53 + src/content/blog/alpine-valley/index.mdx | 55 + .../blog/colonial/images/Butterflies_1.gif | 3 + src/content/blog/colonial/images/Mask_01.gif | 3 + src/content/blog/colonial/images/Mask_02.gif | 3 + src/content/blog/colonial/images/Pebbles.gif | 3 + .../blog/colonial/images/T_MacroVariation.png | 3 + src/content/blog/colonial/index.en.mdx | 45 + src/content/blog/post-01/index.en.md | 7 - src/content/blog/post-01/index.md | 7 - src/content/blog/post-02/index.en.md | 7 - src/content/blog/post-02/index.md | 7 - src/content/blog/post-03/index.en.md | 7 - src/content/blog/post-03/index.md | 7 - .../random-renders-02/images/Cabin_new.png | 3 + .../random-renders-02/images/Cabin_old.jpg | 3 + .../blog/random-renders-02/images/Home.png | 3 + .../random-renders-02/images/Poster_var2.jpg | 3 + .../random-renders-02/images/Workroom.png | 3 + .../blog/random-renders-02/images/palma.png | 3 + .../random-renders-02/images/render_05.png | 3 + .../blog/random-renders-02/index.en.mdx | 35 + src/content/blog/random-renders-02/index.mdx | 37 + .../random-renders-no1/images/Assets_01.png | 3 + .../random-renders-no1/images/Assets_02.png | 3 + .../random-renders-no1/images/Render_03.png | 3 + .../blog/random-renders-no1/images/myown.png | 3 + .../random-renders-no1/images/render_01.png | 3 + .../random-renders-no1/images/render_02.png | 3 + .../random-renders-no1/images/render_04.png | 3 + .../random-renders-no1/images/render_05.png | 3 + .../random-renders-no1/images/render_06.png | 3 + .../random-renders-no1/images/render_07.png | 3 + .../random-renders-no1/images/render_08.png | 3 + .../random-renders-no1/images/render_09.png | 3 + .../random-renders-no1/images/render_10.png | 3 + .../random-renders-no1/images/render_11.png | 3 + .../random-renders-no1/images/untitled2.png | 3 + .../blog/random-renders-no1/index.en.mdx | 30 + src/content/blog/random-renders-no1/index.mdx | 31 + .../blog/server-setup/images/new-server.svg | 274 ++++ src/content/blog/server-setup/index.en.mdx | 97 ++ src/content/blog/server-setup/index.mdx | 85 ++ src/content/blog/sketche-01/images/Baakk.jpg | 3 + .../blog/sketche-01/images/Sketche_No1.jpg | 3 + src/content/blog/sketche-01/index.en.mdx | 12 + src/content/blog/sketche-01/index.mdx | 13 + .../blog/speed_scene_03/images/Render_04.png | 3 + .../speed_scene_03/images/Render_05-2.png | 3 + src/content/blog/speed_scene_03/index.en.mdx | 18 + src/content/blog/speed_scene_03/index.mdx | 18 + .../speed_scene_0405/images/Render_01.jpg | 3 + .../blog/speed_scene_0405/images/untitled.png | 3 + .../blog/speed_scene_0405/index.en.mdx | 13 + src/content/blog/speed_scene_0405/index.mdx | 14 + .../blog/station-b3-4-offline/images/Car.png | 3 + .../images/Snowy_Mountains.png | 3 + .../station-b3-4-offline/images/Station.jpg | 3 + .../station-b3-4-offline/images/human.png | 3 + .../images/untitled-2.png | 3 + .../blog/station-b3-4-offline/index.en.mdx | 35 + .../blog/station-b3-4-offline/index.mdx | 35 + .../images/IMG-20170416-WA0001.jpg | 3 + .../images/IMG-20170416-WA0007.jpg | 3 + .../images/MAX_4758-Recovered-1.jpg | 3 + .../images/MAX_4758-Recovered.jpg | 3 + .../images/MAX_4888-Recovered.jpg | 3 + .../images/MAX_4945-Recovered.jpg | 3 + .../images/MAX_4967-Recovered.jpg | 3 + .../surfirvorcamp-esmoriz/images/MAX_4978.jpg | 3 + .../images/MAX_4997-Recovered.jpg | 3 + .../surfirvorcamp-esmoriz/images/MAX_5075.jpg | 3 + .../surfirvorcamp-esmoriz/images/MAX_5112.jpg | 3 + .../blog/surfirvorcamp-esmoriz/index.mdx | 53 + src/content/blog/the-end/images/Render_01.jpg | 3 + src/content/blog/the-end/images/Render_05.png | 3 + src/content/blog/the-end/index.mdx | 29 + .../images/Cover.png | 3 + .../images/MAX_8935.jpg | 3 + .../images/untitled1_low.png | 3 + .../images/untitled3.png | 3 + .../timelapse-rig-pi-zero-project/index.mdx | 24 + ...ildschirmfoto-2018-01-03-um-13.09.42-2.png | 3 + ...ildschirmfoto-2018-01-03-um-13.17.57-2.png | 3 + ...ildschirmfoto-2018-01-03-um-13.18.27-2.png | 3 + ...ildschirmfoto-2018-01-03-um-13.18.45-2.png | 3 + .../blog/webgl-showcase/images/wHarG.jpg | 3 + src/content/blog/webgl-showcase/index.mdx | 105 ++ .../blog/workroom-no2/images/untitled6.png | 3 + .../blog/workroom-no2/images/untitled7.png | 3 + .../blog/workroom-no2/images/untitled8.png | 3 + src/content/blog/workroom-no2/index.en.mdx | 27 + src/content/blog/workroom/images/untitled.png | 3 + .../blog/workroom/images/untitled1.png | 3 + .../blog/workroom/images/untitled2.png | 3 + .../blog/workroom/images/untitled4.png | 3 + .../blog/workroom/images/untitled5.png | 3 + src/content/blog/workroom/index.en.mdx | 36 + .../blog/zentralwerk_2051/Fishes.svelte | 85 ++ .../blog/zentralwerk_2051/fishes/fishModel.ts | 1202 ++++++++++++++++ .../zentralwerk_2051/fishes/shaders/Fish.frag | 24 + .../zentralwerk_2051/fishes/shaders/Fish.vert | 110 ++ .../fishes/shaders/Seeweed.frag | 83 ++ .../fishes/shaders/Seeweed.vert | 124 ++ .../fishes/shaders/helpers/noise.glsl | 64 + .../fishes/shaders/helpers/rotate2d.glsl | 6 + .../zentralwerk_2051/fishes/webgl-fishes.ts | 106 ++ src/content/blog/zentralwerk_2051/index.mdx | 33 + src/content/config.ts | 4 +- src/i18n/ui.ts | 14 +- src/layouts/Layout.astro | 53 +- src/layouts/Post.astro | 55 +- src/pages/about/index.astro | 2 +- src/pages/blog/[slug].astro | 13 +- src/pages/blog/index.astro | 23 +- src/pages/index.astro | 11 +- tsconfig.json | 18 +- 142 files changed, 5133 insertions(+), 169 deletions(-) create mode 100644 .gitattributes create mode 100644 public/fonts/nunito-sans-v15-latin-300.ttf create mode 100644 public/fonts/nunito-sans-v15-latin-300.woff2 create mode 100644 public/fonts/nunito-v26-latin-300.ttf create mode 100644 public/fonts/nunito-v26-latin-300.woff2 create mode 100644 public/fonts/roboto-v30-latin-300.ttf create mode 100644 public/fonts/roboto-v30-latin-300.woff2 create mode 100644 src/components/GoogleyEye.svelte create mode 100644 src/components/Image.astro create mode 100644 src/components/Max.astro create mode 100755 src/components/Max.png create mode 100644 src/components/YouTube.astro create mode 100644 src/content/blog/alpine-valley/images/DSC_1601.jpg create mode 100644 src/content/blog/alpine-valley/images/Render.png create mode 100644 src/content/blog/alpine-valley/images/Render4.png create mode 100644 src/content/blog/alpine-valley/images/Render6.png create mode 100644 src/content/blog/alpine-valley/images/Unbenannt-1.jpg create mode 100644 src/content/blog/alpine-valley/images/untitled1-1.png create mode 100644 src/content/blog/alpine-valley/index.en.mdx create mode 100644 src/content/blog/alpine-valley/index.mdx create mode 100644 src/content/blog/colonial/images/Butterflies_1.gif create mode 100644 src/content/blog/colonial/images/Mask_01.gif create mode 100644 src/content/blog/colonial/images/Mask_02.gif create mode 100644 src/content/blog/colonial/images/Pebbles.gif create mode 100644 src/content/blog/colonial/images/T_MacroVariation.png create mode 100644 src/content/blog/colonial/index.en.mdx delete mode 100644 src/content/blog/post-01/index.en.md delete mode 100644 src/content/blog/post-01/index.md delete mode 100644 src/content/blog/post-02/index.en.md delete mode 100644 src/content/blog/post-02/index.md delete mode 100644 src/content/blog/post-03/index.en.md delete mode 100644 src/content/blog/post-03/index.md create mode 100644 src/content/blog/random-renders-02/images/Cabin_new.png create mode 100644 src/content/blog/random-renders-02/images/Cabin_old.jpg create mode 100644 src/content/blog/random-renders-02/images/Home.png create mode 100644 src/content/blog/random-renders-02/images/Poster_var2.jpg create mode 100644 src/content/blog/random-renders-02/images/Workroom.png create mode 100644 src/content/blog/random-renders-02/images/palma.png create mode 100644 src/content/blog/random-renders-02/images/render_05.png create mode 100644 src/content/blog/random-renders-02/index.en.mdx create mode 100644 src/content/blog/random-renders-02/index.mdx create mode 100644 src/content/blog/random-renders-no1/images/Assets_01.png create mode 100644 src/content/blog/random-renders-no1/images/Assets_02.png create mode 100644 src/content/blog/random-renders-no1/images/Render_03.png create mode 100644 src/content/blog/random-renders-no1/images/myown.png create mode 100644 src/content/blog/random-renders-no1/images/render_01.png create mode 100644 src/content/blog/random-renders-no1/images/render_02.png create mode 100644 src/content/blog/random-renders-no1/images/render_04.png create mode 100644 src/content/blog/random-renders-no1/images/render_05.png create mode 100644 src/content/blog/random-renders-no1/images/render_06.png create mode 100644 src/content/blog/random-renders-no1/images/render_07.png create mode 100644 src/content/blog/random-renders-no1/images/render_08.png create mode 100644 src/content/blog/random-renders-no1/images/render_09.png create mode 100644 src/content/blog/random-renders-no1/images/render_10.png create mode 100644 src/content/blog/random-renders-no1/images/render_11.png create mode 100644 src/content/blog/random-renders-no1/images/untitled2.png create mode 100644 src/content/blog/random-renders-no1/index.en.mdx create mode 100644 src/content/blog/random-renders-no1/index.mdx create mode 100644 src/content/blog/server-setup/images/new-server.svg create mode 100644 src/content/blog/server-setup/index.en.mdx create mode 100644 src/content/blog/server-setup/index.mdx create mode 100644 src/content/blog/sketche-01/images/Baakk.jpg create mode 100644 src/content/blog/sketche-01/images/Sketche_No1.jpg create mode 100644 src/content/blog/sketche-01/index.en.mdx create mode 100644 src/content/blog/sketche-01/index.mdx create mode 100644 src/content/blog/speed_scene_03/images/Render_04.png create mode 100644 src/content/blog/speed_scene_03/images/Render_05-2.png create mode 100644 src/content/blog/speed_scene_03/index.en.mdx create mode 100644 src/content/blog/speed_scene_03/index.mdx create mode 100644 src/content/blog/speed_scene_0405/images/Render_01.jpg create mode 100644 src/content/blog/speed_scene_0405/images/untitled.png create mode 100644 src/content/blog/speed_scene_0405/index.en.mdx create mode 100644 src/content/blog/speed_scene_0405/index.mdx create mode 100644 src/content/blog/station-b3-4-offline/images/Car.png create mode 100644 src/content/blog/station-b3-4-offline/images/Snowy_Mountains.png create mode 100644 src/content/blog/station-b3-4-offline/images/Station.jpg create mode 100644 src/content/blog/station-b3-4-offline/images/human.png create mode 100644 src/content/blog/station-b3-4-offline/images/untitled-2.png create mode 100644 src/content/blog/station-b3-4-offline/index.en.mdx create mode 100644 src/content/blog/station-b3-4-offline/index.mdx create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0001.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0007.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered-1.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_4888-Recovered.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_4945-Recovered.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_4967-Recovered.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_4978.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_4997-Recovered.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_5075.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/images/MAX_5112.jpg create mode 100644 src/content/blog/surfirvorcamp-esmoriz/index.mdx create mode 100644 src/content/blog/the-end/images/Render_01.jpg create mode 100644 src/content/blog/the-end/images/Render_05.png create mode 100644 src/content/blog/the-end/index.mdx create mode 100644 src/content/blog/timelapse-rig-pi-zero-project/images/Cover.png create mode 100644 src/content/blog/timelapse-rig-pi-zero-project/images/MAX_8935.jpg create mode 100644 src/content/blog/timelapse-rig-pi-zero-project/images/untitled1_low.png create mode 100644 src/content/blog/timelapse-rig-pi-zero-project/images/untitled3.png create mode 100644 src/content/blog/timelapse-rig-pi-zero-project/index.mdx create mode 100644 src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.09.42-2.png create mode 100644 src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.17.57-2.png create mode 100644 src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.27-2.png create mode 100644 src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.45-2.png create mode 100644 src/content/blog/webgl-showcase/images/wHarG.jpg create mode 100644 src/content/blog/webgl-showcase/index.mdx create mode 100644 src/content/blog/workroom-no2/images/untitled6.png create mode 100644 src/content/blog/workroom-no2/images/untitled7.png create mode 100644 src/content/blog/workroom-no2/images/untitled8.png create mode 100644 src/content/blog/workroom-no2/index.en.mdx create mode 100644 src/content/blog/workroom/images/untitled.png create mode 100644 src/content/blog/workroom/images/untitled1.png create mode 100644 src/content/blog/workroom/images/untitled2.png create mode 100644 src/content/blog/workroom/images/untitled4.png create mode 100644 src/content/blog/workroom/images/untitled5.png create mode 100644 src/content/blog/workroom/index.en.mdx create mode 100644 src/content/blog/zentralwerk_2051/Fishes.svelte create mode 100644 src/content/blog/zentralwerk_2051/fishes/fishModel.ts create mode 100644 src/content/blog/zentralwerk_2051/fishes/shaders/Fish.frag create mode 100644 src/content/blog/zentralwerk_2051/fishes/shaders/Fish.vert create mode 100644 src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.frag create mode 100644 src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.vert create mode 100644 src/content/blog/zentralwerk_2051/fishes/shaders/helpers/noise.glsl create mode 100644 src/content/blog/zentralwerk_2051/fishes/shaders/helpers/rotate2d.glsl create mode 100644 src/content/blog/zentralwerk_2051/fishes/webgl-fishes.ts create mode 100644 src/content/blog/zentralwerk_2051/index.mdx diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..824e60a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.woff2 filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text diff --git a/astro.config.mjs b/astro.config.mjs index f13e782..8321e85 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,9 +1,10 @@ import { defineConfig } from 'astro/config'; import { i18n, filterSitemapByDefaultLocale } from "astro-i18n-aut/integration"; import sitemap from "@astrojs/sitemap"; +import mdx from '@astrojs/mdx'; +import glsl from 'vite-plugin-glsl'; import svelte from "@astrojs/svelte"; -import tailwind from "@astrojs/tailwind"; const defaultLocale = "de"; const locales = { @@ -18,7 +19,13 @@ export default defineConfig({ build: { format: "file", }, + vite: { + plugins: [ + glsl(), + ], + }, integrations: [ + mdx(), svelte(), i18n({ exclude: ["pages/**/*.json.ts", "pages/api/**/*",], diff --git a/package.json b/package.json index 1abce5a..bc8a5f8 100644 --- a/package.json +++ b/package.json @@ -11,17 +11,22 @@ }, "dependencies": { "@astrojs/check": "^0.5.9", + "@astrojs/mdx": "^2.2.1", "@astrojs/svelte": "^5.2.0", "@astrojs/tailwind": "^5.1.0", "astro": "^4.5.5", "astro-i18n-aut": "^0.7.0", + "astro-imagetools": "^0.9.0", "svelte": "^4.2.12", "tailwindcss": "^3.4.1", "typescript": "^5.4.2" }, "devDependencies": { "@astrojs/sitemap": "^3.1.1", + "astro-font": "^0.0.78", + "ogl": "^1.0.6", "prettier": "^3.2.5", - "prettier-plugin-astro": "^0.13.0" + "prettier-plugin-astro": "^0.13.0", + "vite-plugin-glsl": "^1.3.0" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6199f0..6579d3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@astrojs/check': specifier: ^0.5.9 version: 0.5.9(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.2) + '@astrojs/mdx': + specifier: ^2.2.1 + version: 2.2.1(astro@4.5.5) '@astrojs/svelte': specifier: ^5.2.0 version: 5.2.0(astro@4.5.5)(svelte@4.2.12)(typescript@5.4.2)(vite@5.1.6) @@ -20,6 +23,9 @@ dependencies: astro-i18n-aut: specifier: ^0.7.0 version: 0.7.0(astro@4.5.5)(kleur@4.1.5) + astro-imagetools: + specifier: ^0.9.0 + version: 0.9.0(astro@4.5.5) svelte: specifier: ^4.2.12 version: 4.2.12 @@ -34,12 +40,21 @@ devDependencies: '@astrojs/sitemap': specifier: ^3.1.1 version: 3.1.1 + astro-font: + specifier: ^0.0.78 + version: 0.0.78 + ogl: + specifier: ^1.0.6 + version: 1.0.6 prettier: specifier: ^3.2.5 version: 3.2.5 prettier-plugin-astro: specifier: ^0.13.0 version: 0.13.0 + vite-plugin-glsl: + specifier: ^1.3.0 + version: 1.3.0(vite@5.1.6) packages: @@ -143,6 +158,57 @@ packages: - supports-color dev: false + /@astrojs/markdown-remark@4.3.1: + resolution: {integrity: sha512-eJFi600tkRjTFiwzY9oD8AgCgB7gFqyWCKWuZ33dATVBgLiROD+zlMZ8STZzU7+ZALvmiUAun/K7umTmP5YfVQ==} + dependencies: + '@astrojs/prism': 3.0.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-to-text: 4.0.0 + import-meta-resolve: 4.0.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-smartypants: 2.1.0 + shiki: 1.2.0 + unified: 11.0.4 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/mdx@2.2.1(astro@4.5.5): + resolution: {integrity: sha512-bSr/AkvGieD9Pc5ZzMnAk7IHnw0vyt/aOujuYUmYT+NHiWahAUy/+ywNNMhTMmea0irdMYnBVC1AEKMQ/oXxow==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^4.0.0 + dependencies: + '@astrojs/markdown-remark': 4.3.1 + '@mdx-js/mdx': 3.0.1 + acorn: 8.11.3 + astro: 4.5.5(typescript@5.4.2) + es-module-lexer: 1.4.1 + estree-util-visit: 2.0.0 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 9.0.0 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 + remark-smartypants: 2.1.0 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /@astrojs/prism@3.0.0: resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} engines: {node: '>=18.14.1'} @@ -205,6 +271,10 @@ packages: - supports-color dev: false + /@astropub/codecs@0.4.4: + resolution: {integrity: sha512-jHmdZK2B7dfelTsVzkWVb93WPjuKkHz07xUcyg5WtUxTeCCxdDVLnvZlsB5PC2r7HmJLf03TP1QYb1ZgrEebyQ==} + dev: false + /@babel/code-frame@7.23.5: resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -396,6 +466,13 @@ packages: '@babel/types': 7.24.0 dev: false + /@babel/runtime@7.24.1: + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} @@ -454,7 +531,6 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: false optional: true /@esbuild/android-arm64@0.19.12: @@ -463,7 +539,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/android-arm@0.19.12: @@ -472,7 +547,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/android-x64@0.19.12: @@ -481,7 +555,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/darwin-arm64@0.19.12: @@ -490,7 +563,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@esbuild/darwin-x64@0.19.12: @@ -499,7 +571,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@esbuild/freebsd-arm64@0.19.12: @@ -508,7 +579,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false optional: true /@esbuild/freebsd-x64@0.19.12: @@ -517,7 +587,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false optional: true /@esbuild/linux-arm64@0.19.12: @@ -526,7 +595,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-arm@0.19.12: @@ -535,7 +603,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-ia32@0.19.12: @@ -544,7 +611,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-loong64@0.19.12: @@ -553,7 +619,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-mips64el@0.19.12: @@ -562,7 +627,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-ppc64@0.19.12: @@ -571,7 +635,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-riscv64@0.19.12: @@ -580,7 +643,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-s390x@0.19.12: @@ -589,7 +651,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-x64@0.19.12: @@ -598,7 +659,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/netbsd-x64@0.19.12: @@ -607,7 +667,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false optional: true /@esbuild/openbsd-x64@0.19.12: @@ -616,7 +675,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false optional: true /@esbuild/sunos-x64@0.19.12: @@ -625,7 +683,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false optional: true /@esbuild/win32-arm64@0.19.12: @@ -634,7 +691,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /@esbuild/win32-ia32@0.19.12: @@ -643,7 +699,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true /@esbuild/win32-x64@0.19.12: @@ -652,7 +707,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@isaacs/cliui@8.0.2: @@ -667,6 +721,381 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: false + /@jimp/bmp@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + bmp-js: 0.1.0 + dev: false + + /@jimp/core@0.14.0: + resolution: {integrity: sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w==} + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/utils': 0.14.0 + any-base: 1.1.0 + buffer: 5.7.1 + exif-parser: 0.1.12 + file-type: 9.0.0 + load-bmfont: 1.4.1 + mkdirp: 0.5.6 + phin: 2.9.3 + pixelmatch: 4.0.2 + tinycolor2: 1.6.0 + dev: false + + /@jimp/custom@0.14.0: + resolution: {integrity: sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA==} + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/core': 0.14.0 + dev: false + + /@jimp/gif@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + gifwrap: 0.9.4 + omggif: 1.0.10 + dev: false + + /@jimp/jpeg@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + jpeg-js: 0.4.4 + dev: false + + /@jimp/plugin-blit@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-blur@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-circle@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-color@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + tinycolor2: 1.6.0 + dev: false + + /@jimp/plugin-contain@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blit@0.14.0)(@jimp/plugin-resize@0.14.0)(@jimp/plugin-scale@0.14.0): + resolution: {integrity: sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-blit': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-resize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-scale': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-resize@0.14.0) + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-cover@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-crop@0.14.0)(@jimp/plugin-resize@0.14.0)(@jimp/plugin-scale@0.14.0): + resolution: {integrity: sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-crop': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-resize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-scale': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-resize@0.14.0) + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-crop@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-displace@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-dither@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-fisheye@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-flip@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-rotate@0.14.0): + resolution: {integrity: sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-rotate': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-rotate': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blit@0.14.0)(@jimp/plugin-crop@0.14.0)(@jimp/plugin-resize@0.14.0) + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-gaussian@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-invert@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-mask@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-normalize@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-print@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blit@0.14.0): + resolution: {integrity: sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-blit': 0.14.0(@jimp/custom@0.14.0) + '@jimp/utils': 0.14.0 + load-bmfont: 1.4.1 + dev: false + + /@jimp/plugin-resize@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-rotate@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blit@0.14.0)(@jimp/plugin-crop@0.14.0)(@jimp/plugin-resize@0.14.0): + resolution: {integrity: sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-blit': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-crop': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-resize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-scale@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-resize@0.14.0): + resolution: {integrity: sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-resize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-shadow@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blur@0.14.0)(@jimp/plugin-resize@0.14.0): + resolution: {integrity: sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blur': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-blur': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-resize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugin-threshold@0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-color@0.14.0)(@jimp/plugin-resize@0.14.0): + resolution: {integrity: sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-color': '>=0.8.0' + '@jimp/plugin-resize': '>=0.8.0' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-color': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-resize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/utils': 0.14.0 + dev: false + + /@jimp/plugins@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugin-blit': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-blur': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-circle': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-color': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-contain': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blit@0.14.0)(@jimp/plugin-resize@0.14.0)(@jimp/plugin-scale@0.14.0) + '@jimp/plugin-cover': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-crop@0.14.0)(@jimp/plugin-resize@0.14.0)(@jimp/plugin-scale@0.14.0) + '@jimp/plugin-crop': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-displace': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-dither': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-fisheye': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-flip': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-rotate@0.14.0) + '@jimp/plugin-gaussian': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-invert': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-mask': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-normalize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-print': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blit@0.14.0) + '@jimp/plugin-resize': 0.14.0(@jimp/custom@0.14.0) + '@jimp/plugin-rotate': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blit@0.14.0)(@jimp/plugin-crop@0.14.0)(@jimp/plugin-resize@0.14.0) + '@jimp/plugin-scale': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-resize@0.14.0) + '@jimp/plugin-shadow': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-blur@0.14.0)(@jimp/plugin-resize@0.14.0) + '@jimp/plugin-threshold': 0.14.0(@jimp/custom@0.14.0)(@jimp/plugin-color@0.14.0)(@jimp/plugin-resize@0.14.0) + timm: 1.7.1 + dev: false + + /@jimp/png@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/utils': 0.14.0 + pngjs: 3.4.0 + dev: false + + /@jimp/tiff@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + utif: 2.0.1 + dev: false + + /@jimp/types@0.14.0(@jimp/custom@0.14.0): + resolution: {integrity: sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/bmp': 0.14.0(@jimp/custom@0.14.0) + '@jimp/custom': 0.14.0 + '@jimp/gif': 0.14.0(@jimp/custom@0.14.0) + '@jimp/jpeg': 0.14.0(@jimp/custom@0.14.0) + '@jimp/png': 0.14.0(@jimp/custom@0.14.0) + '@jimp/tiff': 0.14.0(@jimp/custom@0.14.0) + timm: 1.7.1 + dev: false + + /@jimp/utils@0.14.0: + resolution: {integrity: sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A==} + dependencies: + '@babel/runtime': 7.24.1 + regenerator-runtime: 0.13.11 + dev: false + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -697,6 +1126,36 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false + /@mdx-js/mdx@3.0.1: + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.12 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -725,12 +1184,25 @@ packages: dev: false optional: true + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@rollup/rollup-android-arm-eabi@4.13.0: resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} cpu: [arm] os: [android] requiresBuild: true - dev: false optional: true /@rollup/rollup-android-arm64@4.13.0: @@ -738,7 +1210,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true /@rollup/rollup-darwin-arm64@4.13.0: @@ -746,7 +1217,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@rollup/rollup-darwin-x64@4.13.0: @@ -754,7 +1224,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@rollup/rollup-linux-arm-gnueabihf@4.13.0: @@ -762,7 +1231,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@rollup/rollup-linux-arm64-gnu@4.13.0: @@ -770,7 +1238,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@rollup/rollup-linux-arm64-musl@4.13.0: @@ -778,7 +1245,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@rollup/rollup-linux-riscv64-gnu@4.13.0: @@ -786,7 +1252,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false optional: true /@rollup/rollup-linux-x64-gnu@4.13.0: @@ -794,7 +1259,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@rollup/rollup-linux-x64-musl@4.13.0: @@ -802,7 +1266,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@rollup/rollup-win32-arm64-msvc@4.13.0: @@ -810,7 +1273,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /@rollup/rollup-win32-ia32-msvc@4.13.0: @@ -818,7 +1280,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true /@rollup/rollup-win32-x64-msvc@4.13.0: @@ -826,7 +1287,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@shikijs/core@1.2.0: @@ -869,6 +1329,16 @@ packages: - supports-color dev: false + /@tokenizer/token@0.3.0: + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: @@ -904,9 +1374,14 @@ packages: '@types/ms': 0.7.34 dev: false + /@types/estree-jsx@1.0.5: + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: false /@types/hast@3.0.4: resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -920,6 +1395,10 @@ packages: '@types/unist': 3.0.2 dev: false + /@types/mdx@2.0.12: + resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==} + dev: false + /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: false @@ -930,6 +1409,10 @@ packages: '@types/unist': 2.0.10 dev: false + /@types/node@16.9.1: + resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} + dev: false + /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: true @@ -1034,6 +1517,14 @@ packages: resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} dev: false + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: false + /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} @@ -1075,6 +1566,10 @@ packages: engines: {node: '>=12'} dev: false + /any-base@1.1.0: + resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: false @@ -1110,6 +1605,15 @@ packages: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} dev: false + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /astro-font@0.0.78: + resolution: {integrity: sha512-4Wz1aTZRUsae1C6hbS/6eahsVlSlq8pNa6sbPUJLjU3XEf1pTBVuk+VRwtxE4uI4D1M7YgG8vYMC+HYXtarbyw==} + dev: true + /astro-i18n-aut@0.7.0(astro@4.5.5)(kleur@4.1.5): resolution: {integrity: sha512-IPcjs5NkaNJIrTYDbLx+ay6J6LbAG0QMGE8LwjGmS6JuJHmFRbkmVnqW/OYYZhrHOxOhruhCwfY0bWo5K0TGrA==} peerDependencies: @@ -1126,6 +1630,23 @@ packages: - babel-plugin-macros dev: false + /astro-imagetools@0.9.0(astro@4.5.5): + resolution: {integrity: sha512-iZCSiUbFr0h8HSyX2Fl/hzc3RlmVjNstWwsZZSyQKW9vRmMny/bd3qL3p8wuC6ISsAvtHfVnJLmorhhRhwVOcw==} + engines: {node: ^14.15.0 || >=16.0.0} + peerDependencies: + astro: '>=0.26 || >=1.0.0-beta' + dependencies: + '@astropub/codecs': 0.4.4 + astro: 4.5.5(typescript@5.4.2) + file-type: 17.1.1 + find-cache-dir: 3.3.2 + find-up: 6.3.0 + object-hash: 3.0.0 + potrace: 2.1.8 + optionalDependencies: + imagetools-core: 3.0.2 + dev: false + /astro@4.5.5(typescript@5.4.2): resolution: {integrity: sha512-gZ3jR06dLmY9/SMkKMr+3pRSrUjhuwjnXt+9abFJV3WGwhCnLZbSNsTBrLMsaFHpAS1ReJChcTWyKRCvs/jCIQ==} engines: {node: '>=18.14.1', npm: '>=6.14.0'} @@ -1305,6 +1826,10 @@ packages: readable-stream: 3.6.2 dev: false + /bmp-js@0.1.0: + resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} + dev: false + /boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -1343,6 +1868,11 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: false + /buffer-equal@0.0.1: + resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} + engines: {node: '>=0.4.0'} + dev: false + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} requiresBuild: true @@ -1350,7 +1880,6 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 dev: false - optional: true /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1403,6 +1932,10 @@ packages: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} dev: false + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1475,6 +2008,10 @@ packages: periscopic: 3.1.0 dev: false + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1529,6 +2066,10 @@ packages: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} dev: false + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: false + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: false @@ -1618,6 +2159,14 @@ packages: engines: {node: '>=6'} dev: false + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + requiresBuild: true + dev: false + optional: true + /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} @@ -1655,6 +2204,10 @@ packages: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: false + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: false + /dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} @@ -1733,7 +2286,6 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: false /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} @@ -1756,6 +2308,44 @@ packages: hasBin: true dev: false + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.2 + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: @@ -1781,6 +2371,10 @@ packages: strip-final-newline: 3.0.0 dev: false + /exif-parser@0.1.12: + resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} + dev: false + /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -1822,6 +2416,20 @@ packages: reusify: 1.0.4 dev: false + /file-type@17.1.1: + resolution: {integrity: sha512-heRUMZHby2Qj6wZAA3YHeMlRmZNQTcb6VxctkGmM+mcM6ROQKvHpr7SS6EgdfEhH+s25LDshBjvPx/Ecm+bOVQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.0.0 + token-types: 5.0.1 + dev: false + + /file-type@9.0.0: + resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} + engines: {node: '>=6'} + dev: false + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1829,6 +2437,15 @@ packages: to-regex-range: 5.0.1 dev: false + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: false + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -1845,6 +2462,14 @@ packages: path-exists: 4.0.0 dev: false + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: false + /find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} dependencies: @@ -1889,7 +2514,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: false optional: true /function-bind@1.1.2: @@ -1916,6 +2540,13 @@ packages: engines: {node: '>=16'} dev: false + /gifwrap@0.9.4: + resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==} + dependencies: + image-q: 4.0.0 + omggif: 1.0.10 + dev: false + /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} requiresBuild: true @@ -1952,6 +2583,13 @@ packages: path-scurry: 1.10.1 dev: false + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: false + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -2037,6 +2675,29 @@ packages: zwitch: 2.0.4 dev: false + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /hast-util-to-html@9.0.0: resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} dependencies: @@ -2054,6 +2715,28 @@ packages: zwitch: 2.0.4 dev: false + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} dependencies: @@ -2112,6 +2795,21 @@ packages: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false + /image-q@4.0.0: + resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} + dependencies: + '@types/node': 16.9.1 + dev: false + + /imagetools-core@3.0.2: + resolution: {integrity: sha512-DlArpNiefCc1syIqvOONcE8L8IahN8GjwaEjm6wIJIvuKoFoI1RcKmWWfS2dYxSlTiSp2X5b3JnHDjUXmWqlVA==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + sharp: 0.29.3 + dev: false + optional: true + /import-meta-resolve@4.0.0: resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} dev: false @@ -2126,6 +2824,25 @@ packages: dev: false optional: true + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} requiresBuild: true @@ -2150,6 +2867,10 @@ packages: hasown: 2.0.2 dev: false + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + /is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2171,6 +2892,10 @@ packages: engines: {node: '>=8'} dev: false + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: false + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2178,6 +2903,10 @@ packages: is-extglob: 2.1.1 dev: false + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -2237,11 +2966,25 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: false + /jimp@0.14.0: + resolution: {integrity: sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA==} + dependencies: + '@babel/runtime': 7.24.1 + '@jimp/custom': 0.14.0 + '@jimp/plugins': 0.14.0(@jimp/custom@0.14.0) + '@jimp/types': 0.14.0(@jimp/custom@0.14.0) + regenerator-runtime: 0.13.11 + dev: false + /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true dev: false + /jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: false @@ -2314,6 +3057,19 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: false + /load-bmfont@1.4.1: + resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} + dependencies: + buffer-equal: 0.0.1 + mime: 1.6.0 + parse-bmfont-ascii: 1.0.6 + parse-bmfont-binary: 1.0.6 + parse-bmfont-xml: 1.1.6 + phin: 2.9.3 + xhr: 2.6.0 + xtend: 4.0.2 + dev: false + /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -2342,6 +3098,13 @@ packages: p-locate: 5.0.0 dev: false + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: false + /log-symbols@5.1.0: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} engines: {node: '>=12'} @@ -2385,6 +3148,18 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: false + + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + dev: false + /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false @@ -2494,6 +3269,64 @@ packages: - supports-color dev: false + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} dependencies: @@ -2640,6 +3473,67 @@ packages: micromark-util-types: 2.0.0 dev: false + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + /micromark-factory-destination@2.0.0: resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} dependencies: @@ -2657,6 +3551,19 @@ packages: micromark-util-types: 2.0.0 dev: false + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + /micromark-factory-space@2.0.0: resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} dependencies: @@ -2729,6 +3636,19 @@ packages: resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} dev: false + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + /micromark-util-html-tag-name@2.0.0: resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} dev: false @@ -2802,6 +3722,12 @@ packages: picomatch: 2.3.1 dev: false + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -2825,6 +3751,12 @@ packages: dev: false optional: true + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: false + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2836,7 +3768,6 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} requiresBuild: true dev: false - optional: true /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} @@ -2849,6 +3780,13 @@ packages: dev: false optional: true + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false @@ -2869,7 +3807,6 @@ packages: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: false /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -2899,6 +3836,12 @@ packages: dev: false optional: true + /node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + requiresBuild: true + dev: false + optional: true + /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} requiresBuild: true @@ -2936,6 +3879,14 @@ packages: engines: {node: '>= 6'} dev: false + /ogl@1.0.6: + resolution: {integrity: sha512-ephp/AP2qR2JV/BLoFEoeMSs6JofFZIx3nB6iLKfom88Q3GFjFLXwFjW0ZQObHJaWHhmNGPcMi1n1nxUm+30TA==} + dev: true + + /omggif@1.0.10: + resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} requiresBuild: true @@ -2987,6 +3938,13 @@ packages: yocto-queue: 0.1.0 dev: false + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: false + /p-limit@5.0.0: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} @@ -3008,6 +3966,13 @@ packages: p-limit: 3.1.0 dev: false + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: false + /p-queue@8.0.1: resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} engines: {node: '>=18'} @@ -3026,6 +3991,42 @@ packages: engines: {node: '>=6'} dev: false + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /parse-bmfont-ascii@1.0.6: + resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} + dev: false + + /parse-bmfont-binary@1.0.6: + resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} + dev: false + + /parse-bmfont-xml@1.1.6: + resolution: {integrity: sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==} + dependencies: + xml-parse-from-string: 1.0.1 + xml2js: 0.5.0 + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + dev: false + /parse-latin@5.0.1: resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} dependencies: @@ -3056,6 +4057,11 @@ packages: engines: {node: '>=8'} dev: false + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3082,6 +4088,11 @@ packages: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false + /peek-readable@5.0.0: + resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} + engines: {node: '>=14.16'} + dev: false + /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: @@ -3090,14 +4101,17 @@ packages: is-reference: 3.0.2 dev: false + /phin@2.9.3: + resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - dev: false /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} @@ -3114,6 +4128,13 @@ packages: engines: {node: '>= 6'} dev: false + /pixelmatch@4.0.2: + resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} + hasBin: true + dependencies: + pngjs: 3.4.0 + dev: false + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -3121,6 +4142,11 @@ packages: find-up: 4.1.0 dev: false + /pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + dev: false + /postcss-import@15.1.0(postcss@8.4.35): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -3189,6 +4215,11 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + + /potrace@2.1.8: + resolution: {integrity: sha512-V9hI7UMJyEhNZjM8CbZaP/804ZRLgzWkCS9OOYnEZkszzj3zKR/erRdj0uFMcN3pp6x4B+AIZebmkQgGRinG/g==} + dependencies: + jimp: 0.14.0 dev: false /prebuild-install@7.1.2: @@ -3240,6 +4271,11 @@ packages: engines: {node: '>=6'} dev: false + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -3298,6 +4334,13 @@ packages: util-deprecate: 1.0.2 dev: false + /readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + dependencies: + readable-stream: 3.6.2 + dev: false + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -3305,6 +4348,14 @@ packages: picomatch: 2.3.1 dev: false + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + /rehype-parse@9.0.0: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} dependencies: @@ -3351,6 +4402,15 @@ packages: - supports-color dev: false + /remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: @@ -3476,7 +4536,6 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.13.0 '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 - dev: false /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3498,7 +4557,6 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: true /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} @@ -3521,6 +4579,22 @@ packages: lru-cache: 6.0.0 dev: false + /sharp@0.29.3: + resolution: {integrity: sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA==} + engines: {node: '>=12.13.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 1.0.3 + node-addon-api: 4.3.0 + prebuild-install: 7.1.2 + semver: 7.6.0 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + optional: true + /sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -3611,6 +4685,10 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} dev: false /space-separated-tokens@2.0.2: @@ -3724,6 +4802,26 @@ packages: dev: false optional: true + /strtok3@7.0.0: + resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} + engines: {node: '>=14.16'} + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.0.0 + dev: false + + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: false + /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -3886,6 +4984,14 @@ packages: any-promise: 1.3.0 dev: false + /timm@1.7.1: + resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} + dev: false + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: false + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -3898,6 +5004,14 @@ packages: is-number: 7.0.0 dev: false + /token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + dev: false + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -4010,6 +5124,12 @@ packages: array-iterate: 2.0.1 dev: false + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + /unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: @@ -4087,6 +5207,12 @@ packages: picocolors: 1.0.0 dev: false + /utif@2.0.1: + resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} + dependencies: + pako: 1.0.11 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -4129,6 +5255,18 @@ packages: vfile-message: 4.0.2 dev: false + /vite-plugin-glsl@1.3.0(vite@5.1.6): + resolution: {integrity: sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==} + engines: {node: '>= 16.15.1', npm: '>= 8.11.0'} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + '@rollup/pluginutils': 5.1.0 + vite: 5.1.6 + transitivePeerDependencies: + - rollup + dev: true + /vite@5.1.6: resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4162,7 +5300,6 @@ packages: rollup: 4.13.0 optionalDependencies: fsevents: 2.3.3 - dev: false /vitefu@0.2.5(vite@5.1.6): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} @@ -4380,6 +5517,37 @@ packages: dev: false optional: true + /xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + dev: false + + /xml-parse-from-string@1.0.1: + resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} + dev: false + + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} diff --git a/public/app.css b/public/app.css index 2b657f1..38ce484 100644 --- a/public/app.css +++ b/public/app.css @@ -1,4 +1,45 @@ +/* @font-face { */ +/* font-display: swap; */ +/* font-family: 'Nunito Sans'; */ +/* font-style: normal; */ +/* font-weight: 300; */ +/* src: url('/fonts/nunito-sans-v15-latin-300.woff2') format('woff2'), */ +/* url('/fonts/nunito-sans-v15-latin-300.ttf') format('truetype'); */ +/* } */ +/**/ +/* @font-face { */ +/* font-display: swap; */ +/* font-family: 'Roboto'; */ +/* font-style: normal; */ +/* font-weight: 300; */ +/* src: url('/fonts/roboto-v30-latin-300.woff2') format('woff2'), */ +/* url('/fonts/roboto-v30-latin-300.ttf') format('truetype'); */ +/* } */ + +h1 { + font-weight: 300; + font-size: 2rem; + margin: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p { + margin: 0px; + padding: 0px; +} + +p { + font-family: 'Nunito Sans', sans-serif; + font-size: 16px; +} + :root { + --neutral1000: #000000; --neutral800: #16161E; --neutral500: #252530; --neutral400: #2C2C3A; @@ -8,13 +49,38 @@ } body { + --background-dark: var(--neutral800); - --background: var(--neutral500); + --background: var(--neutral000); --background-light: var(--neutral400); --outline: var(--neutral300); - --text: var(--neutral100); + --text: var(--neutral1000); + --layer100: var(--neutral000); - background-color: var(--background-dark); + background-color: var(--layer100); + transition: background-color 0.1s; color: var(--text); font-family: 'Roboto', sans-serif; } + +.theme-dark { + + --background-dark: var(--neutral800); + --background: var(--neutral500); + --background-light: var(--neutral400); + --background-gradient: linear-gradient(-30deg, var(--neutral500) 0%, var(--neutral400) 100%); + --outline: var(--neutral300); + --text: var(--neutral100); + --layer100: var(--background-dark); +} + +img { + max-width: 100%; + height: auto; +} + +.center { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/public/fonts/nunito-sans-v15-latin-300.ttf b/public/fonts/nunito-sans-v15-latin-300.ttf new file mode 100644 index 0000000..f337ba2 --- /dev/null +++ b/public/fonts/nunito-sans-v15-latin-300.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32a6e057898ce3f33d5ada85949241a0519a424226690ac010f1440333ed01ae +size 33160 diff --git a/public/fonts/nunito-sans-v15-latin-300.woff2 b/public/fonts/nunito-sans-v15-latin-300.woff2 new file mode 100644 index 0000000..65e29e4 --- /dev/null +++ b/public/fonts/nunito-sans-v15-latin-300.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5b7090adec01fe538f614831a5b06096a80f095d9f4096911410e7f867dbfcc +size 13724 diff --git a/public/fonts/nunito-v26-latin-300.ttf b/public/fonts/nunito-v26-latin-300.ttf new file mode 100644 index 0000000..7819e30 --- /dev/null +++ b/public/fonts/nunito-v26-latin-300.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84fa1ad32d85bed7158e3daab06e3b3061e4a3c7bf764ababe1f97a4cde1ce4e +size 39140 diff --git a/public/fonts/nunito-v26-latin-300.woff2 b/public/fonts/nunito-v26-latin-300.woff2 new file mode 100644 index 0000000..49c3f2f --- /dev/null +++ b/public/fonts/nunito-v26-latin-300.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ca366bcd4c496c368ba1e6c05c4c5e9281d1fe0bf3a22c362a1b392ca4e1158 +size 16068 diff --git a/public/fonts/roboto-v30-latin-300.ttf b/public/fonts/roboto-v30-latin-300.ttf new file mode 100644 index 0000000..1f64d3a --- /dev/null +++ b/public/fonts/roboto-v30-latin-300.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4501b0c41bd6ffd12d34114eed5113b9e136f5f1715d7b4348dd1ccb570470f9 +size 36216 diff --git a/public/fonts/roboto-v30-latin-300.woff2 b/public/fonts/roboto-v30-latin-300.woff2 new file mode 100644 index 0000000..53c8d9e --- /dev/null +++ b/public/fonts/roboto-v30-latin-300.woff2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f75911313e1c7802c23345ab57e754d87801581706780c993fb23ff4e0fe62ef +size 15740 diff --git a/src/components/GoogleyEye.svelte b/src/components/GoogleyEye.svelte new file mode 100644 index 0000000..2b09e9d --- /dev/null +++ b/src/components/GoogleyEye.svelte @@ -0,0 +1,178 @@ + + + + + + +
($visible = !$visible)} + role="button" + tabindex="0" + aria-label="Toggle Googley Eyes" + aria-hidden="true" + on:keydown={(ev) => (ev.key === "Enter" ? ($visible = !$visible) : "")} +> + {#if $visible} +
+
+
+ {/if} +
+ + diff --git a/src/components/Image.astro b/src/components/Image.astro new file mode 100644 index 0000000..5ec1cff --- /dev/null +++ b/src/components/Image.astro @@ -0,0 +1,46 @@ +--- +import type { ImageMetadata } from "astro"; +import { Image as AstroImage } from "astro:assets"; +interface Props { + src: ImageMetadata; + alt: string; + maxWidth?: number; +} + +const { src, alt, maxWidth } = Astro.props; + +const image = typeof src === "string" ? await import(src) : src; + +const sizes = [ + { + width: 240, + media: "(max-width: 360px)", + }, + { + width: 540, + media: "(max-width: 720px)", + }, + { + width: 720, + media: "(max-width: 1600px)", + }, + { + width: image.width, + }, +].filter((size) => !maxWidth || size.width <= maxWidth); +--- + + size.width)} + sizes={sizes + .map((size) => `${size.media || "100vw"} ${size.width}px`) + .join(", ")} +/> + + diff --git a/src/components/LanguagePicker.astro b/src/components/LanguagePicker.astro index aa82b68..2643613 100644 --- a/src/components/LanguagePicker.astro +++ b/src/components/LanguagePicker.astro @@ -2,11 +2,18 @@ import { locales, defaultLocale, getLocale } from "astro-i18n-aut"; import { useTranslations } from "../i18n/utils"; -const reg = new RegExp(`^\/(${Object.keys(locales).join("|")})\/`); function translatePath(lang: string) { - const p = Astro.url.pathname.replace(reg, "").replace(/^\//, ""); - if (lang === defaultLocale) return `/${p}`; - return `/${lang}/${p}`; + const split = Astro.url.pathname.split("/").filter((s) => s.length); + + if (split[0] in locales) { + split.shift(); + } + + if (lang === defaultLocale) { + return `/${split.join("/")}`; + } + + return `/${[lang, ...split].join("/")}`; } const locale = getLocale(Astro.url); diff --git a/src/components/Logo.astro b/src/components/Logo.astro index 66f5b39..a938105 100644 --- a/src/components/Logo.astro +++ b/src/components/Logo.astro @@ -1,8 +1,9 @@ diff --git a/src/components/Max.astro b/src/components/Max.astro new file mode 100644 index 0000000..6b71813 --- /dev/null +++ b/src/components/Max.astro @@ -0,0 +1,86 @@ +--- +import MaxImg from "./Max.png"; +import Image from "./Image.astro"; +import GoogleyEye from "./GoogleyEye.svelte"; + +import { useTranslations } from "@i18n/utils"; + +import { getLocale } from "astro-i18n-aut"; + +const locale = getLocale(Astro.url); + +const t = useTranslations(locale); +--- + +
+
+ its mee +
+ +
+
+ +
+
+ +
+

{t("home.title")}

+

{t("home.subtitle")}

+
+ + + diff --git a/src/components/Max.png b/src/components/Max.png new file mode 100755 index 0000000..af0fe3a --- /dev/null +++ b/src/components/Max.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:984b75718e2172458588d0920435b6c8809715b18670f7bdc125ec69f3897b90 +size 5351648 diff --git a/src/components/Nav.astro b/src/components/Nav.astro index 8d4aeb3..89e9e11 100644 --- a/src/components/Nav.astro +++ b/src/components/Nav.astro @@ -3,17 +3,43 @@ import { getLocale } from "astro-i18n-aut"; import { useTranslations, useTranslatedPath } from "../i18n/utils"; import Logo from "./Logo.astro"; +function isActive(path) { + return Astro.url.pathname === path ? "active" : ""; +} + const lang = getLocale(Astro.url); const t = useTranslations(lang); const translatePath = useTranslatedPath(lang); +const paths = [ + { + link: translatePath("/"), + component: Logo, + }, + { + link: translatePath("/blog"), + text: t("nav.blog"), + }, + { + link: translatePath("/projects"), + text: t("nav.projects"), + }, + { + link: translatePath("/photos"), + text: t("nav.photos"), + }, + { + link: translatePath("/videos"), + text: t("nav.videos"), + }, +]; --- diff --git a/src/components/YouTube.astro b/src/components/YouTube.astro new file mode 100644 index 0000000..e6b43d2 --- /dev/null +++ b/src/components/YouTube.astro @@ -0,0 +1,19 @@ +--- +interface Props { + id: string; +} +--- + + + + diff --git a/src/content/blog/alpine-valley/images/DSC_1601.jpg b/src/content/blog/alpine-valley/images/DSC_1601.jpg new file mode 100644 index 0000000..a2e8f44 --- /dev/null +++ b/src/content/blog/alpine-valley/images/DSC_1601.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d795c528e9f72923da69f1300eed66b670ef05f4d95be9bc4c78b109a2677118 +size 2607042 diff --git a/src/content/blog/alpine-valley/images/Render.png b/src/content/blog/alpine-valley/images/Render.png new file mode 100644 index 0000000..528cbda --- /dev/null +++ b/src/content/blog/alpine-valley/images/Render.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a118f39dc9d3eebf742984af991a8bf366a92014d41c65638b6b743329752d8 +size 3473842 diff --git a/src/content/blog/alpine-valley/images/Render4.png b/src/content/blog/alpine-valley/images/Render4.png new file mode 100644 index 0000000..249e35d --- /dev/null +++ b/src/content/blog/alpine-valley/images/Render4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8afd5697f1861ed3847ee655d25d79e568ecdce79ff52e8c0991570c9aa83312 +size 1045101 diff --git a/src/content/blog/alpine-valley/images/Render6.png b/src/content/blog/alpine-valley/images/Render6.png new file mode 100644 index 0000000..d711985 --- /dev/null +++ b/src/content/blog/alpine-valley/images/Render6.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:929f931c2928d2837f0176b25794213a996bbd670247f48e4c48d0c20ff74a29 +size 1670314 diff --git a/src/content/blog/alpine-valley/images/Unbenannt-1.jpg b/src/content/blog/alpine-valley/images/Unbenannt-1.jpg new file mode 100644 index 0000000..bb0f565 --- /dev/null +++ b/src/content/blog/alpine-valley/images/Unbenannt-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f5cf0cd45dde09c479c02c52cbe6c275f0854e592bff5f2795ffb4d874960f3 +size 1037760 diff --git a/src/content/blog/alpine-valley/images/untitled1-1.png b/src/content/blog/alpine-valley/images/untitled1-1.png new file mode 100644 index 0000000..350fc2e --- /dev/null +++ b/src/content/blog/alpine-valley/images/untitled1-1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33728797046ef512c732d319fbf07e625b8fa2bfef427e40042494e8ff6ebc77 +size 2114776 diff --git a/src/content/blog/alpine-valley/index.en.mdx b/src/content/blog/alpine-valley/index.en.mdx new file mode 100644 index 0000000..e60f3dc --- /dev/null +++ b/src/content/blog/alpine-valley/index.en.mdx @@ -0,0 +1,53 @@ +--- +title: "Alpine Valley" +date: 2016-12-22 +headerImg: "images/Render.png" +comments: true +--- +import Image from "@components/Image.astro"; +import ValleyView from "./images/Render.png"; +import DSC_1601 from "./images/DSC_1601.jpg"; +import Unbenannt1 from "./images/Unbenannt-1.jpg"; +import Render4 from "./images/Render4.png"; +import UntitledPng from "./images/untitled1-1.png" +import Render6 from "./images/Render6.png"; + +ValleyView + +This piece was inspired by a picture I took in 2013 on the way to Italy + +DSC_1601 +Unbenannt1 + +The scene consists of three basic Elements, the foreground, the valley and the background image. The foreground consists of some lowpoly tree models which i created party from photoscanning and partly by handmodelling. + +Render4 + +Some photoscanned rocks, centipede grass from Andrew Prices grass essentials and some plant models i created myself. As an eyecatcher i created a quick human in makehuman but didnt spend a lot of time on that as it wasnt my focus in this project. + +UntitledPng + + +The valley was created as usual in World Machine. For the textures i used screenshots from google maps and edited them in PixPlant to make them seamless. In Blender i used a mixture from slope, height and " noise mask to apply them to the model. + +Render6 + +The background was just the picture. diff --git a/src/content/blog/alpine-valley/index.mdx b/src/content/blog/alpine-valley/index.mdx new file mode 100644 index 0000000..d9b592d --- /dev/null +++ b/src/content/blog/alpine-valley/index.mdx @@ -0,0 +1,55 @@ +--- +title: "Alpine Valley" +date: 2016-12-22 +headerImg: "images/Render.png" +comments: true +--- + +import Image from "@components/Image.astro"; +import ValleyView from "./images/Render.png"; +import DSC_1601 from "./images/DSC_1601.jpg"; +import Unbenannt1 from "./images/Unbenannt-1.jpg"; +import Render4 from "./images/Render4.png"; +import UntitledPng from "./images/untitled1-1.png" +import Render6 from "./images/Render6.png"; + + +ValleyView + +Die Inspiration diesen Render zu machen kam von einem Bild was 2013 auf dem Weg nach Italien entstanden ist. + +DSC_1601 +Unbenannt1 + +Die Szene besteht aus drei ELementen, dem Vordergrund, dem Tal und dem Hintergrund Bild. Der Vordergrund besteht aus einigen Lowpoly Baum Modellen, die ich aus gescannten und handgemodellten Modellen erstellt habe. + +Render4 + +Einige 3D gescannte Steine, Centipede Grass Models aus Andrew Prices Grass Essentials Pack und einige Pflanzenmodelle die ich selber erstellt habe. Um einen gewissen Fokuspunkt im Bild zu haben habe ich in Makehuman einen Menschen erstellt wollte aber nicht allzu viel Zeit damit verbringen, weil es nicht der Hauptfokus in der Szene war. + +UntitledPng + +Wie die meisten 3D Landschaften habe ich das Tal in World Machine erstellt. Die Texturen der Landschaft sind Screenshots aus Google Maps die ich mit PixPlant nahtlos gemacht habe, und danach in Blender mit verschiedenen Steigungs/Höhen und Rauschtexturen miteinander vermischt habe. + +Render6 + +Der Hintergrund ist das Bild das die Inspiration für den Render war. + diff --git a/src/content/blog/colonial/images/Butterflies_1.gif b/src/content/blog/colonial/images/Butterflies_1.gif new file mode 100644 index 0000000..aa8e2d4 --- /dev/null +++ b/src/content/blog/colonial/images/Butterflies_1.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1640f79cf2c6141b1e6f05d75e1943691348f04b163f5818f64be072e4aa8b6d +size 11574456 diff --git a/src/content/blog/colonial/images/Mask_01.gif b/src/content/blog/colonial/images/Mask_01.gif new file mode 100644 index 0000000..b6eab38 --- /dev/null +++ b/src/content/blog/colonial/images/Mask_01.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b9c51e53032e6510258f89df34799d2e2cb510b50ec0fd807da9ce74c2461af +size 9983093 diff --git a/src/content/blog/colonial/images/Mask_02.gif b/src/content/blog/colonial/images/Mask_02.gif new file mode 100644 index 0000000..e59f35b --- /dev/null +++ b/src/content/blog/colonial/images/Mask_02.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a530de72d5bdfda0a28be47e113658d7fab976daa4282e2c91b7460792a52f6f +size 7177983 diff --git a/src/content/blog/colonial/images/Pebbles.gif b/src/content/blog/colonial/images/Pebbles.gif new file mode 100644 index 0000000..c4b3071 --- /dev/null +++ b/src/content/blog/colonial/images/Pebbles.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:433f732f0f31637d3111a0114af508594b25b0fbdf90e50868fcbef70c44ebc9 +size 9751066 diff --git a/src/content/blog/colonial/images/T_MacroVariation.png b/src/content/blog/colonial/images/T_MacroVariation.png new file mode 100644 index 0000000..cdcfcc1 --- /dev/null +++ b/src/content/blog/colonial/images/T_MacroVariation.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a95cb90220659cf76da34ebbba19165b3eca6b7865ecc4b2c0c611a94780354f +size 127937 diff --git a/src/content/blog/colonial/index.en.mdx b/src/content/blog/colonial/index.en.mdx new file mode 100644 index 0000000..b9371cf --- /dev/null +++ b/src/content/blog/colonial/index.en.mdx @@ -0,0 +1,45 @@ +--- +title: "Colonial" +date: 2017-02-15 +comments: true +--- +import Image from "@components/Image.astro"; +import YouTube from "@components/YouTube.astro"; + +import T_MacroVariation from "./images/T_MacroVariation.png"; +import Mask_01 from "./images/Mask_01.gif"; +import Mask_02 from "./images/Mask_02.gif"; +import Pebbles from "./images/Pebbles.gif"; +import Butterflies from "./images/Butterflies_1.gif"; + + + +This project kind of went a little further than i first anticipated, I first thought of it just as a little 3D modelling practice. At the same time i played around in WorldMachine to create some sort of northern atlantic style Island. After i brought the House into Unreal, i simply added the island heightmap as a Landscape and went on from there. + +Gladly i still had a Landscape Material which i created a while ago, so i didnt need to set up a whole new one. The landscape utilizes a set of slope, paint and perlin noise masks to determine which parts of the landscape are grass, rock, forest, and gravel. Every single material blends between two texture sizes based on distance to the actor in the level to avoid texture tiling on distant materials. After that another layer of textures is overlayed, to add some variation to the color. + +
+ T_MacroVariation +
+ +I learned this technique from the materials that Unreal provides with the startup content, and it really adds to the realism of materials, i also used it in the roof material. With UnrealEngine it's also possible to create material instances to manipulate attributes of the material at runtime, i also included an option to preview the mmask live, green represents the near tiling and the pebbles, red represents the distant texture. + +Mask_01 + +The material also utilizes Unreal engines Foliage Type feature to distribute foliage like Grass, Rocks, Forest Plants and Flowthaton their according ground. The material also blends the material according to their heightmaps which produces a very natural gradient. Notice how the grass, expand to the cracks of the rock material first. + +Mask_02 + + +The heightmap can be used to displace the physical vertices of the Landscape mesh  together with adaptive tesselation that will make the material look fucking amazing, but this feature takes a huge hit on the performance and is for live gameplay, atleast on my pc, not feasable. + +Pebbles + +Another material that im really proud of is the ocean material, there is no physical displacement happening, just a lot of normal map magic. Another difficulty that i faced was the animation of the butterflies, as i am more used to the particle systems in Blender, 3DSMax and C4D Unreals so called Cascade System was not very intuituve for me. + +After some time i found a solution which looks, atleast to me, natural. Now the Butterflies spawn in a small radius around a sphere which moves to a random position every two seconds, the sphere also poses as a force to the Butterflies, so they fly towards it. + +Butterflies + + + diff --git a/src/content/blog/post-01/index.en.md b/src/content/blog/post-01/index.en.md deleted file mode 100644 index 686ff0a..0000000 --- a/src/content/blog/post-01/index.en.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -date: 2021-01-01 -author: MaxEN -title: "First Post" ---- - -# First Post diff --git a/src/content/blog/post-01/index.md b/src/content/blog/post-01/index.md deleted file mode 100644 index c5f619a..0000000 --- a/src/content/blog/post-01/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -date: 2021-01-01 -author: MaxDE -title: "Erster Post" ---- - -# Erster post diff --git a/src/content/blog/post-02/index.en.md b/src/content/blog/post-02/index.en.md deleted file mode 100644 index 79d180e..0000000 --- a/src/content/blog/post-02/index.en.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -date: 2021-01-01 -author: MaxEN -title: "Second Post" ---- - -# 2. post diff --git a/src/content/blog/post-02/index.md b/src/content/blog/post-02/index.md deleted file mode 100644 index 2a4cfed..0000000 --- a/src/content/blog/post-02/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -date: 2021-01-01 -author: MaxDE -title: "Zweiter Post" ---- - -# 2. post diff --git a/src/content/blog/post-03/index.en.md b/src/content/blog/post-03/index.en.md deleted file mode 100644 index 241aea5..0000000 --- a/src/content/blog/post-03/index.en.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -date: 2021-01-01 -author: MaxEN -title: "Third Post" ---- - -# Third Post diff --git a/src/content/blog/post-03/index.md b/src/content/blog/post-03/index.md deleted file mode 100644 index 1c61a21..0000000 --- a/src/content/blog/post-03/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -date: 2021-01-01 -author: MaxDE -title: "Dritter Post" ---- - -# Dritter Post diff --git a/src/content/blog/random-renders-02/images/Cabin_new.png b/src/content/blog/random-renders-02/images/Cabin_new.png new file mode 100644 index 0000000..04f509f --- /dev/null +++ b/src/content/blog/random-renders-02/images/Cabin_new.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e39a7f313323a6e5aee99e4b0060fa99620c68c9ad8d40b0a768f6e8cb7e11c2 +size 4506387 diff --git a/src/content/blog/random-renders-02/images/Cabin_old.jpg b/src/content/blog/random-renders-02/images/Cabin_old.jpg new file mode 100644 index 0000000..0afbd2d --- /dev/null +++ b/src/content/blog/random-renders-02/images/Cabin_old.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6481bf7e76fe30ab3d4580515db782b7d8d3f41dae7d43db8184fbab1c1730b1 +size 339856 diff --git a/src/content/blog/random-renders-02/images/Home.png b/src/content/blog/random-renders-02/images/Home.png new file mode 100644 index 0000000..a142362 --- /dev/null +++ b/src/content/blog/random-renders-02/images/Home.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fecd0a3b8e9aa0cb77ba1b764d972bb4bec08df985e53baba0467af85ed78f35 +size 16745999 diff --git a/src/content/blog/random-renders-02/images/Poster_var2.jpg b/src/content/blog/random-renders-02/images/Poster_var2.jpg new file mode 100644 index 0000000..f442d7f --- /dev/null +++ b/src/content/blog/random-renders-02/images/Poster_var2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:caf93c28d784e72613efd56ad8d4cc9569ffa4ea48f9624ae699999aa74bba39 +size 1276485 diff --git a/src/content/blog/random-renders-02/images/Workroom.png b/src/content/blog/random-renders-02/images/Workroom.png new file mode 100644 index 0000000..6cced11 --- /dev/null +++ b/src/content/blog/random-renders-02/images/Workroom.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86748a3fd9f66aae028f2b59e243d05aebeec084f3a8fdff38ec7bfeb1208d6a +size 3605038 diff --git a/src/content/blog/random-renders-02/images/palma.png b/src/content/blog/random-renders-02/images/palma.png new file mode 100644 index 0000000..816c8cb --- /dev/null +++ b/src/content/blog/random-renders-02/images/palma.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:366e6f59c8abe5b62283535dc7aa74e00ece736b9f0f18e086691b4cf6776b87 +size 5629039 diff --git a/src/content/blog/random-renders-02/images/render_05.png b/src/content/blog/random-renders-02/images/render_05.png new file mode 100644 index 0000000..0e133fb --- /dev/null +++ b/src/content/blog/random-renders-02/images/render_05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47fab8fc226104a876ea796571b89786c713862bdc3e46de1b963102cd2dd6cd +size 1861254 diff --git a/src/content/blog/random-renders-02/index.en.mdx b/src/content/blog/random-renders-02/index.en.mdx new file mode 100644 index 0000000..25f461c --- /dev/null +++ b/src/content/blog/random-renders-02/index.en.mdx @@ -0,0 +1,35 @@ +--- +title: "Random Renders NO°2" +date: 2023-05-11 +headerImg: "images/render_05.png" +comments: true +--- +import Image from "@components/Image.astro" +import Palma from "./images/palma.png" +import Render05 from "./images/render_05.png" +import Poster_var2 from "./images/Poster_var2.jpg"; +import Cabin_old from "./images/Cabin_old.jpg"; +import Cabin_new from "./images/Cabin_new.png"; +import Home from "./images/Home.png"; +import Workroom from "./images/Workroom.png"; + +Last month I felt like creating some renderings again. I also found a few old renderings that haven't ended up on my blog yet. + +## Palma +Duude + +## [Sudoku.nvim](https://github.com/jim-fx/sudoku.nvim) + +Duude + +Poster_var2 + +## Super old renders: + +Cabin_old + +Cabin_new + +Home + +Workroom diff --git a/src/content/blog/random-renders-02/index.mdx b/src/content/blog/random-renders-02/index.mdx new file mode 100644 index 0000000..ba088fa --- /dev/null +++ b/src/content/blog/random-renders-02/index.mdx @@ -0,0 +1,37 @@ +--- +title: "Random Renders NO°2" +date: 2023-05-11 +headerImg: "images/render_05.png" +comments: true +--- +import Image from "@components/Image.astro" +import Palma from "./images/palma.png" +import Render05 from "./images/render_05.png" + +Im letzten Monat hatte ich wieder Lust, einige Renderings zu erstellen. Außerdem habe ich noch ein paar alte Renderings gefunden die noch nicht auf meinem Blog gelandet sind. + + +## Palma +Duude + +## [Sudoku.nvim](https://github.com/jim-fx/sudoku.nvim) + +Duude + +![](./images/Poster_var2.jpg) + +## Super old renders: + +![](./images/Cabin_old.jpg) + +![](./images/Cabin_new.png) + +![](./images/Home.png) + +![](./images/Workroom.png) diff --git a/src/content/blog/random-renders-no1/images/Assets_01.png b/src/content/blog/random-renders-no1/images/Assets_01.png new file mode 100644 index 0000000..d575c71 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/Assets_01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69e0aa966d84bc4b6f154a54d2eb59b44f48c18b7fdd8078eb511573b901aab9 +size 680741 diff --git a/src/content/blog/random-renders-no1/images/Assets_02.png b/src/content/blog/random-renders-no1/images/Assets_02.png new file mode 100644 index 0000000..fa3e672 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/Assets_02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc5aa6b5bd31ee29b96857b266371cf3e47a5bdf04d1fb0b640c0595bf4ea0b0 +size 195988 diff --git a/src/content/blog/random-renders-no1/images/Render_03.png b/src/content/blog/random-renders-no1/images/Render_03.png new file mode 100644 index 0000000..ea69929 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/Render_03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efadcc0d9ebf27034bd8e3d7bb5166b70f6f9fbefe8d919a9da2b15ce070675f +size 3086102 diff --git a/src/content/blog/random-renders-no1/images/myown.png b/src/content/blog/random-renders-no1/images/myown.png new file mode 100644 index 0000000..225c332 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/myown.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70d47b46f926f2a6e1d43284c4669658c0f3ba194ee27381e2669ea6ba6d688a +size 2267792 diff --git a/src/content/blog/random-renders-no1/images/render_01.png b/src/content/blog/random-renders-no1/images/render_01.png new file mode 100644 index 0000000..3893989 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f658a614f015fa6d51201bb7a7c55ef0fd07ce955f764e0b7804fad0087edde +size 2189090 diff --git a/src/content/blog/random-renders-no1/images/render_02.png b/src/content/blog/random-renders-no1/images/render_02.png new file mode 100644 index 0000000..4d51e2e --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:807ab53f6e054f94fd683b7f0678813d8023f693f9c44f3ba3b95a08f0312b8f +size 3694383 diff --git a/src/content/blog/random-renders-no1/images/render_04.png b/src/content/blog/random-renders-no1/images/render_04.png new file mode 100644 index 0000000..e5c4b32 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_04.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08718ac470f2228e332c3f82fa667484acefcf18eddf46c6e716b8a0386c793d +size 15591017 diff --git a/src/content/blog/random-renders-no1/images/render_05.png b/src/content/blog/random-renders-no1/images/render_05.png new file mode 100644 index 0000000..f7c4f2e --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5809788fc0db64c2006b813f51546e2bc9dedab8197ee5be3038ebad0b398c71 +size 15649502 diff --git a/src/content/blog/random-renders-no1/images/render_06.png b/src/content/blog/random-renders-no1/images/render_06.png new file mode 100644 index 0000000..f5dbf0c --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_06.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee4caec72db626bf5c9487362c3a4a005a95c9dc2a111641fe234c4d3b31d058 +size 15476417 diff --git a/src/content/blog/random-renders-no1/images/render_07.png b/src/content/blog/random-renders-no1/images/render_07.png new file mode 100644 index 0000000..e54ae4e --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_07.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ca4eb5900c41957a54fd5e8ff230254e8a5895452dfecfc47225afb4889d116 +size 13363273 diff --git a/src/content/blog/random-renders-no1/images/render_08.png b/src/content/blog/random-renders-no1/images/render_08.png new file mode 100644 index 0000000..647a7ee --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_08.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2277eaf31d1f8e80e52eb3b4808a833f513be618dcf426a12de78a930bde6883 +size 13931149 diff --git a/src/content/blog/random-renders-no1/images/render_09.png b/src/content/blog/random-renders-no1/images/render_09.png new file mode 100644 index 0000000..ace41e4 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_09.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4239a241eca9a30cab54f41dc9c7e89dae7996f3f55bbd0bbd18edff50a7998b +size 38543768 diff --git a/src/content/blog/random-renders-no1/images/render_10.png b/src/content/blog/random-renders-no1/images/render_10.png new file mode 100644 index 0000000..048f037 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_10.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8b12a5379c5eb1662cbe76cbcb3ec5c63f320abd6445e149678fe2e504842fa +size 14837481 diff --git a/src/content/blog/random-renders-no1/images/render_11.png b/src/content/blog/random-renders-no1/images/render_11.png new file mode 100644 index 0000000..0fb71bc --- /dev/null +++ b/src/content/blog/random-renders-no1/images/render_11.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fbf6350ce79720a8fe49c8031f46f3f184d44ba6ca23d4ec4cbc8e5b40a93c9 +size 13911870 diff --git a/src/content/blog/random-renders-no1/images/untitled2.png b/src/content/blog/random-renders-no1/images/untitled2.png new file mode 100644 index 0000000..f077e47 --- /dev/null +++ b/src/content/blog/random-renders-no1/images/untitled2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91f48c8fc9b03f1c7d97b90d283e298cc9cafa6e1c9a62a74c45a07d5bc65e04 +size 1598104 diff --git a/src/content/blog/random-renders-no1/index.en.mdx b/src/content/blog/random-renders-no1/index.en.mdx new file mode 100644 index 0000000..82f8fdd --- /dev/null +++ b/src/content/blog/random-renders-no1/index.en.mdx @@ -0,0 +1,30 @@ +--- +title: "Random Renders NO°1" +date: 2018-12-30 +headerImg: "images/myown.png" +comments: true +--- + +import Image from "@components/Image.astro" +import SoupKitchen from "./images/render_11.png" +import Guadelajara from "./images/Render_03.png" +import Benzema from "./images/untitled2.png" +import Wallpaper from "./images/myown.png" + +A small collection of new and older renders: + +## Ilse Crawfords Soup Kitchen + +Ilse Crawfords Soup Kitchen + +## Guadelajara + + + +## Benzema + + + +## Wallpaper + + diff --git a/src/content/blog/random-renders-no1/index.mdx b/src/content/blog/random-renders-no1/index.mdx new file mode 100644 index 0000000..1402b73 --- /dev/null +++ b/src/content/blog/random-renders-no1/index.mdx @@ -0,0 +1,31 @@ +--- +title: "Random Renders NO°1" +date: 2018-12-30 +headerImg: "images/myown.png" +comments: true +--- + +import Image from "@components/Image.astro" +import SoupKitchen from "./images/render_11.png" +import Guadelajara from "./images/Render_03.png" +import Benzema from "./images/untitled2.png" +import Wallpaper from "./images/myown.png" + +Einfach ne kleine Sammlung von aktuellen und nicht aktuellen Szenen: + +## Ilse Crawfords Soup Kitchen + +Ilse Crawfords Soup Kitchen + +## Guadelajara + + + +## Benzema + + + +## Wallpaper + + + diff --git a/src/content/blog/server-setup/images/new-server.svg b/src/content/blog/server-setup/images/new-server.svg new file mode 100644 index 0000000..bc58ffa --- /dev/null +++ b/src/content/blog/server-setup/images/new-server.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/content/blog/server-setup/index.en.mdx b/src/content/blog/server-setup/index.en.mdx new file mode 100644 index 0000000..c32edc7 --- /dev/null +++ b/src/content/blog/server-setup/index.en.mdx @@ -0,0 +1,97 @@ +--- +title: "How I completely rebuild my server setup." +date: 2020-06-09 +comments: true +--- + +import Image from "@components/Image.astro" + +So, this topic has been on my mind for a long time. And in the past two weeks i have finally realized it. This blog post is not meant as a guide, but as a way for future me to understand my current me's decision processes. + +> **My plan is to publish the guides as separate posts later:** +> +> - [ ] _🔗 Proxying local servers with Tinc_ +> - [ ] _☕+🛸=♥ Setting up a Gitea server with drone.io CI/CD_ +> - [ ] _Setting up Nginx+SFTP+Traefik_ +> - [ ] _Including Svelte elements in a Hugo site_ + +## Requirements + +But before we begin to dive into the technical details of my new setup i would like to talk about the requirements i have: + +### Git + +This one is relatively simple; I code, so i need git. Preferably hosted publicly so that i can share code with other people, and preferably with a CI/CD pipeline attached for the benefits that CI/CD has. + +### PAAS + +I don't really like to worry about infrastructure, (i know ironic right). At least when I'm working on a project and the infrastructure is not the main focus for that I need a way to easily deploy any application i have to the cloud. + +### Static Hosting + +Because I code a lot of small static HTML+CSS+Javascript websites and experiments I want to have a way to quickly host them somewhere. Also this Blog needs to be hosted somewhere. + +### Blogging + +I dont write a lot of blog posts at all, but i still like to have a central platform to put my thoughts onto. + +### Filesharing + +Most of the time i keep my project file both on my laptop and my main pc. If i work on a coding project i can sync those with git, but for that i need to commit and push every time i switch my pc. For 3D/Media that workflow is not very feasible. To achieve a better workflow I need a File sharing platform, which i definitely want to self host for one because storing a lot of data with a third party is expensive and because i want to be in control of my own data. + +  + +## My previous setup + +In my previous setup i used a mixture of external services. For **git hosting** i have experience with Github, Gitlab and Bitbucket. I have experience with a few **PaaS** providers, IBM Cloud, Google Cloud but mostly Heroku because it is very easy to use. My **static website** was hosted with one.com, again because it was very easy to use. I have tried a few different **Filesharing** solutions in the past, from Google Drive, Dropbox and Mega and some self hosted solutions like Koken.me, Syncthing and Nextcloud. But in the last year i did not use any File sharing at all. + +  + +## My new Setup + +![New Setup](./images/new-server.svg) + +Now, the first question that may come to mind is, "Why do you use both cloud and local servers?". There are some drawbacks and some benefits to both. Cloud servers provide fast network speeds and static public IPs but storing large amount of data is kind of expensive. Disk space is comparably cheap with local servers I paid around 60€ for my 1tb harddrive which is made specifically for nas situations with drives running 24/7. Also i really like the idea of having physical access to my own data and not having to trust a third party with it. Another benefit to having physical access to my own server is that i can tinker with hardware aspects like networking, drives and cooling as well as taking physical measurements like room temperature and humidity. + +To be totally honest the main reason for me to use a cloud server is because i cant use port forwarding on my local network because we (me and my flatmates) dont know the password to our router 🤦. The solution to that is to create a vpn network with my cloud server and proxy all requests through it. + +The whole process of setting up my new infrastructure was mainly my trying out different tech stacks until i found one i liked. So, what i choose in the end: + +  + +### Git + +I definitely wanted to setup a git server on my local raspberry pi, because i want to own my own code, if that makes sense. My first instinct was to use Gitlab, because i really like the integrated ci/cd pipeline, so i downloaded the appropriate docker-compose.yml, started and made my pi instantly unusable because it was so performance intensive. So Gitlab was definitely not the right choice for me. + +After that i tried Gogs, which is a lightweight git server build with Go. I really liked the simplicity of the setup and the configuration, but the integration with my ci/cd server of choice, drone.io was not very easy. + +So finally i ended up with my current setup which is running a Gitea, and Drone.io Instance on my pi, with the Drone.io CI/CD runner running in the cloud. I started the Drone.io runner in the cloud because the pi is arm based and that caused some problems with certain docker images. + +### PAAS + +My first idea was to use Dokku, but for some reason i had a lot of problems setting up dokku as a docker image. Then i tried caprover which is a rebranding of a project called CaptainDuckDuck, which is imho a wayyy better name. Caprover was super easy to setup and its super easy to deploy to. + +### Static Hosting + +This was a very easy decision, as i already had some good experience with nginx and some not so good experience with the configuration of apache. On my cloud server i provisioned a harddrive with a folder which is being mounted into a nginx docker image and a sftp docker image. + +### Blogging + +Coming from some experience with developing wordpress sites i definitely did not want to keep my old wordpress site. Honestly i did not try a lot of different solutions as Hugo just seemed to click with me, from the blazing fast site generation to the very minimal overhead to the incredible flexible asset pipelines. + +### Filesharing + +Nextcloud, easy. I just like it and it does not seem to have any competitors with the same amount of functionality. + +  + +## Conclusion + +This was a very good learning experience for me and just so much fun. My future plans are to expand my local server setup to a cluster build out of pies and also maybe to try out wireguard instead of tinc because it seems to be way faster. + +  +  + +Cheers thats all for now, + +Max diff --git a/src/content/blog/server-setup/index.mdx b/src/content/blog/server-setup/index.mdx new file mode 100644 index 0000000..17fa510 --- /dev/null +++ b/src/content/blog/server-setup/index.mdx @@ -0,0 +1,85 @@ +--- +title: "Wie ich mein Server-Setup komplett neu aufbaue." +date: 2020-06-09 +comments: true +--- + +import Image from "@components/Image.astro" + +Dieses Thema beschäftigt mich also schon seit längerem. Und in den letzten zwei Wochen ist es mir endlich klar geworden. Dieser Blogbeitrag ist nicht als Leitfaden gedacht, sondern als Möglichkeit für mein zukünftiges Ich, die Entscheidungsprozesse meines jetzigen Ichs zu verstehen. + +> **Mein Plan ist es, die Leitfäden später als separate Beiträge zu veröffentlichen:** +> > - [ ] _🔗 Proxying lokaler Server mit Tinc_ +> > - [ ] _☕+🛸=♥ Einrichten eines Gitea-Servers mit Drone.io CI/ CD_ +> > - [ ] _Nginx+SFTP+Traefik einrichten_ +> > - [ ] _Svelte-Elemente in eine Hugo-Site einbinden_ + +## Anforderungen + +Bevor wir uns jedoch mit den technischen Details meines neuen Setups befassen, möchte ich über meine Anforderungen sprechen: + +### Git + +Dieser ist relativ einfach; Ich programmiere, also brauche ich Git. Vorzugsweise öffentlich gehostet, damit ich Code mit anderen Leuten teilen kann, und vorzugsweise mit angeschlossener CI/CD-Pipeline, um die Vorteile von CI/CD nutzen zu können. + +### PAAS + +Ich mag es nicht wirklich, mich um die Infrastruktur zu kümmern, (ich weiß, ironisch, oder?). Zumindest, wenn ich an einem Projekt arbeite und die Infrastruktur nicht der Hauptfokus ist, brauche ich eine Möglichkeit, jede Anwendung, die ich habe, einfach in die Cloud zu deployen. + +### Static Hosting + +Weil ich viele kleine statische HTML+CSS+Javascript-Websites und -Experimente programmiere, möchte ich eine Möglichkeit haben, sie schnell irgendwo zu hosten. Auch dieser Blog muss irgendwo gehostet werden. + +### Blogging + +Ich schreibe nicht viele Blogbeiträge, aber ich möchte trotzdem eine zentrale Plattform haben, um meine Gedanken festzuhalten. + +### Filesharing + +Die meiste Zeit halte ich meine Projektdatei sowohl auf meinem Laptop als auch auf meinem Haupt-PC. Wenn ich an einem Codierungsprojekt arbeite, kann ich diese mit Git synchronisieren, aber dafür muss ich jedes Mal, wenn ich meinen PC wechsle, committen und pushen. Für 3D/Media ist dieser Workflow nicht sehr praktikabel. Um einen besseren Workflow zu erreichen, benötige ich eine Filesharing-Plattform, die ich definitiv selbst hosten möchte, zum einen, weil das Speichern einer großen Datenmenge bei einem Drittanbieter teuer ist, und zum anderen, weil ich die Kontrolle über meine eigenen Daten haben möchte. + +## Mein vorheriges Setup + +In meinem vorherigen Setup habe ich eine Mischung aus externen Diensten verwendet. Für **Git-Hosting** habe ich Erfahrung mit Github, Gitlab und Bitbucket. Ich habe Erfahrung mit einigen **PaaS**-Anbietern, IBM Cloud, Google Cloud, aber hauptsächlich Heroku, weil es sehr einfach zu bedienen ist. Meine **statische Website** wurde mit one.com gehostet, wiederum, weil es sehr einfach zu bedienen war. Ich habe ein paar verschiedene **Filesharing**-Lösungen ausprobiert, von Google Drive, Dropbox und Mega und einigen selbst gehosteten Lösungen wie Koken.me, Syncthing und Nextcloud. Aber im letzten Jahr habe ich überhaupt kein Filesharing genutzt. + +## My new Setup + +![New Setup](./images/new-server.svg) + +Eine Frage, die man sich jetzt stellen könnte wäre: „Warum benutzt du Cloud und lokale Server?“ Beide haben einige Nachteile und einige Vorteile. Cloud-Server bieten schnelle Netzwerkgeschwindigkeiten und statische öffentliche IPs, aber die Speicherung großer Datenmengen ist recht teuer. Der Festplattenspeicher ist bei lokalen Servern vergleichsweise günstig. Ich habe etwa 60 € für meine 1-TB-Festplatte bezahlt, die speziell für NAS-Situationen entwickelt wurde, bei denen die Laufwerke rund um die Uhr laufen. Außerdem gefällt mir die Idee sehr gut, physischen Zugriff auf meine eigenen Daten zu haben und diese nicht einem Dritten anvertrauen zu müssen. Ein weiterer Vorteil des physischen Zugriffs auf meinen eigenen Server besteht darin, dass ich an Hardwareaspekten wie Netzwerk, Laufwerken und Kühlung herumbasteln und physische Messungen wie Raumtemperatur und Luftfeuchtigkeit vornehmen kann. + +Um ganz ehrlich zu sein, der Hauptgrund für mich, einen Cloud-Server zu verwenden, ist, dass ich auf meinem lokalen Netzwerk kein Port-Forwarding verwenden kann, weil wir (meine Mitbewohner und ich) das Passwort zu unserem Router nicht kennen 🤦. Die Lösung dafür ist, ein VPN-Netzwerk mit meinem Cloud-Server zu erstellen und alle Anfragen darüber zu proxyen. + +Die Idee ist also, dass ich meinen lokalen Server als Hauptserver verwende und den Cloud-Server als Proxy verwende, um auf meinen lokalen Server zuzugreifen. Der Cloud-Server wird auch als Backup-Server für meine Dateien verwendet, falls mein lokaler Server ausfällt. + +### Git + +Ich wollte definitiv einen Git-Server auf meinem lokalen Raspberry Pi einrichten, weil ich meinen eigenen Code besitzen wollte, wenn das Sinn macht. Mein erster Instinkt war, Gitlab zu verwenden, weil ich die integrierte CI/CD-Pipeline wirklich mag, also habe ich die entsprechende docker-compose.yml heruntergeladen, gestartet und meinen Pi sofort unbrauchbar gemacht, weil es so leistungsintensiv war. Also war Gitlab definitiv nicht die richtige Wahl für mich. + +Danach habe ich Gogs ausprobiert, das ist ein leichtgewichtiger Git-Server, der mit Go erstellt wurde. Mir gefiel die Einfachheit des Setups und der Konfiguration wirklich gut, aber die Integration mit meinem CI/CD-Server der Wahl, drone.io, war nicht sehr einfach. + +Also landete ich schließlich bei meinem aktuellen Setup, das einen Gitea- und einen Drone.io-Server auf meinem Pi mit einem in der Cloud laufenden Drone.io CI/CD-Runner umfasst. Ich habe den Drone.io-Runner in der Cloud gestartet, weil der Pi arm-basiert ist und das bei bestimmten Docker-Images Probleme verursacht hat. + +### PAAS + +Meine erste Idee war, Dokku zu verwenden, aber aus irgendeinem Grund hatte ich viele Probleme, Dokku als Docker-Image einzurichten. Dann habe ich Caprover ausprobiert, das eine Neubrandung eines Projekts namens CaptainDuckDuck ist, was meiner Meinung nach ein viel besserer Name ist. Caprover war super einfach einzurichten und es ist super einfach zu deployen. + +### Static Hosting + +Ich habe mich für Nginx entschieden. Dies war eine sehr einfache Entscheidung, da ich bereits einige gute Erfahrungen mit nginx und einige nicht so gute Erfahrungen mit der Konfiguration von Apache hatte. Auf meinem Cloud-Server habe ich eine Festplatte mit einem Ordner bereitgestellt, der in ein Nginx-Docker-Image und ein SFTP-Docker-Image eingebunden ist. + +### Blogging + +Aufgrund einiger Erfahrung in der Entwicklung von WordPress-Sites wollte ich meine alte WordPress-Site definitiv nicht behalten. Ehrlich gesagt habe ich nicht viele verschiedene Lösungen ausprobiert, da Hugo einfach zu mir passte, von der rasend schnellen Site-Generierung über den sehr minimalen Overhead bis hin zu den unglaublich flexiblen Asset-Pipelines. + +### Filesharing + +Ich habe mich für Nextcloud entschieden, weil ich es einfach mag und es keine Konkurrenz mit der gleichen Funktionalität zu geben scheint. + +## Abschluss + +Alles in allem bin ich sehr zufrieden mit meinem neuen Setup. Ich habe viel gelernt und es hat mir viel Spaß gemacht. Meine zukünftigen Pläne sind, mein lokales Server-Setup zu einem Cluster-Build aus Pies zu erweitern und auch vielleicht Wireguard anstelle von Tinc auszuprobieren, weil es anscheinend viel schneller ist. + +Cheers, + +Max diff --git a/src/content/blog/sketche-01/images/Baakk.jpg b/src/content/blog/sketche-01/images/Baakk.jpg new file mode 100644 index 0000000..a335d7d --- /dev/null +++ b/src/content/blog/sketche-01/images/Baakk.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d7f7d4ab3912b5e21b6c19c5b0d5b0375ec1cf219bc446d91d15802e70e0018 +size 164296 diff --git a/src/content/blog/sketche-01/images/Sketche_No1.jpg b/src/content/blog/sketche-01/images/Sketche_No1.jpg new file mode 100644 index 0000000..b519ff4 --- /dev/null +++ b/src/content/blog/sketche-01/images/Sketche_No1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9e42c41972aad161b82122382927a59de05cbfd196a15558ba909da4ae21168 +size 4607817 diff --git a/src/content/blog/sketche-01/index.en.mdx b/src/content/blog/sketche-01/index.en.mdx new file mode 100644 index 0000000..1e1244c --- /dev/null +++ b/src/content/blog/sketche-01/index.en.mdx @@ -0,0 +1,12 @@ +--- +title: "Sketche 01" +date: 2017-05-08 +headerImg: "images/Baakk.jpg" +--- + +import Image from "@components/Image.astro"; +import SketcheNo1 from "./images/Sketche_No1.jpg"; + +Yup, i bought a graphics tablet. + +Sketche No1 diff --git a/src/content/blog/sketche-01/index.mdx b/src/content/blog/sketche-01/index.mdx new file mode 100644 index 0000000..7df4dcc --- /dev/null +++ b/src/content/blog/sketche-01/index.mdx @@ -0,0 +1,13 @@ +--- +title: "Sketche 01" +date: 2017-05-08 +headerImg: "images/Baakk.jpg" +--- + +import Image from "@components/Image.astro"; +import SketcheNo1 from "./images/Sketche_No1.jpg"; + +Ratet mal wer sich gerade ein Zeichentablett gekauft hat :) + +Sketche No1 + diff --git a/src/content/blog/speed_scene_03/images/Render_04.png b/src/content/blog/speed_scene_03/images/Render_04.png new file mode 100644 index 0000000..434182f --- /dev/null +++ b/src/content/blog/speed_scene_03/images/Render_04.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fab6fe45e199f1190a5e7612482238551d88458e98aa2707f77fddf4ebdf5969 +size 2880425 diff --git a/src/content/blog/speed_scene_03/images/Render_05-2.png b/src/content/blog/speed_scene_03/images/Render_05-2.png new file mode 100644 index 0000000..d665d77 --- /dev/null +++ b/src/content/blog/speed_scene_03/images/Render_05-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3fab20b52f662f8a0a17de9c7e5823217e224168b7e4ada6461556b345b6c23 +size 4949831 diff --git a/src/content/blog/speed_scene_03/index.en.mdx b/src/content/blog/speed_scene_03/index.en.mdx new file mode 100644 index 0000000..d43b19f --- /dev/null +++ b/src/content/blog/speed_scene_03/index.en.mdx @@ -0,0 +1,18 @@ +--- +title: "Speed_Scene_03" +date: 2017-02-03 +headerImg: "images/Render_04.png" +comments: true +--- + +import Image from "@components/Image.astro" +import Render04 from "./images/Render_04.png"; +import Render05 from "./images/Render_05-2.png"; + +Speed_Scene_03 + +After some corrections, (thanks /r/blender). + +Speed_Scene_03 + +Basically a small exercise to improve my skills with architecture scenes. Here is the original scene, I took a template to not spend time with concept work. diff --git a/src/content/blog/speed_scene_03/index.mdx b/src/content/blog/speed_scene_03/index.mdx new file mode 100644 index 0000000..d540fc5 --- /dev/null +++ b/src/content/blog/speed_scene_03/index.mdx @@ -0,0 +1,18 @@ +--- +title: "Speed_Scene_03" +date: 2017-02-03 +headerImg: "images/Render_04.png" +comments: true +--- + +import Image from "@components/Image.astro" +import Render04 from "./images/Render_04.png"; +import Render05 from "./images/Render_05-2.png"; + +Speed_Scene_03 + +Nach einigen Korrekturen, (danke /r/blender). + +Speed_Scene_03 + +Im Grunde ne kleine Übung um meine Skills mit Architektur Szenen zu verbessern. Hier ist die Ursprungsszene, ich habe ne Vorlage genommen, um keine Zeit mit Konzeptarbeit zu verbringen: diff --git a/src/content/blog/speed_scene_0405/images/Render_01.jpg b/src/content/blog/speed_scene_0405/images/Render_01.jpg new file mode 100644 index 0000000..03fd400 --- /dev/null +++ b/src/content/blog/speed_scene_0405/images/Render_01.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86d3ff72eb75b8de363407b6ae3838fc8a397c79f53ac3e07e1d0a53c6f4a5a8 +size 498035 diff --git a/src/content/blog/speed_scene_0405/images/untitled.png b/src/content/blog/speed_scene_0405/images/untitled.png new file mode 100644 index 0000000..3950a33 --- /dev/null +++ b/src/content/blog/speed_scene_0405/images/untitled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eac555db7f2e3141b38baa4fe9f15ed42fbf5a99c668f5a67a71c3a47a0a1455 +size 3635837 diff --git a/src/content/blog/speed_scene_0405/index.en.mdx b/src/content/blog/speed_scene_0405/index.en.mdx new file mode 100644 index 0000000..fe31da0 --- /dev/null +++ b/src/content/blog/speed_scene_0405/index.en.mdx @@ -0,0 +1,13 @@ +--- +title: "Speed_Scene_04/05" +date: 2017-03-13 +headerImg: "Render_01.jpg" +comments: true +--- + +import Image from "@components/Image.astro"; +import Render01 from "./images/Render_01.jpg"; +import Untitled from "./images/untitled.png"; + +Render 01 +Untitled diff --git a/src/content/blog/speed_scene_0405/index.mdx b/src/content/blog/speed_scene_0405/index.mdx new file mode 100644 index 0000000..b37a44a --- /dev/null +++ b/src/content/blog/speed_scene_0405/index.mdx @@ -0,0 +1,14 @@ +--- +title: "Speed_Scene_04/05" +date: 2017-03-13 +headerImg: "Render_01.jpg" +comments: true +--- + +import Image from "@components/Image.astro"; +import Render01 from "./images/Render_01.jpg"; +import Untitled from "./images/untitled.png"; + +Render 01 +Untitled + diff --git a/src/content/blog/station-b3-4-offline/images/Car.png b/src/content/blog/station-b3-4-offline/images/Car.png new file mode 100644 index 0000000..66b3782 --- /dev/null +++ b/src/content/blog/station-b3-4-offline/images/Car.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2aa34187be00543baa08867aaa99c6b0da71762f85b357b3bddc69ef0fcbc67d +size 842201 diff --git a/src/content/blog/station-b3-4-offline/images/Snowy_Mountains.png b/src/content/blog/station-b3-4-offline/images/Snowy_Mountains.png new file mode 100644 index 0000000..bcf2c0f --- /dev/null +++ b/src/content/blog/station-b3-4-offline/images/Snowy_Mountains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b3ec12381682654b39d46645589dd8f8d408fc12c307915df88fa2e194a4f53 +size 1912063 diff --git a/src/content/blog/station-b3-4-offline/images/Station.jpg b/src/content/blog/station-b3-4-offline/images/Station.jpg new file mode 100644 index 0000000..b8a5ba9 --- /dev/null +++ b/src/content/blog/station-b3-4-offline/images/Station.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fb1d4ad09573690b839e6d7e6304ca74abacff75c4a471dac5539cc0170cb54 +size 861278 diff --git a/src/content/blog/station-b3-4-offline/images/human.png b/src/content/blog/station-b3-4-offline/images/human.png new file mode 100644 index 0000000..707245a --- /dev/null +++ b/src/content/blog/station-b3-4-offline/images/human.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:776de99d47bdde603947ff7f2865ddb1d9c5c2057a3af235365319359acf1d48 +size 809988 diff --git a/src/content/blog/station-b3-4-offline/images/untitled-2.png b/src/content/blog/station-b3-4-offline/images/untitled-2.png new file mode 100644 index 0000000..3648068 --- /dev/null +++ b/src/content/blog/station-b3-4-offline/images/untitled-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:121a2326d9b4f0ed5ce36f9fa7aa85384fcecab2bb541dfc8c589b1a6e145b75 +size 2432052 diff --git a/src/content/blog/station-b3-4-offline/index.en.mdx b/src/content/blog/station-b3-4-offline/index.en.mdx new file mode 100644 index 0000000..7f553bb --- /dev/null +++ b/src/content/blog/station-b3-4-offline/index.en.mdx @@ -0,0 +1,35 @@ +--- +title: "Station B3-4 Offline" +date: 2016-12-21 +headerImg: "Station.jpg" +comments: true +--- + +import Image from "@components/Image.astro" +import Untitled2 from "./images/untitled-2.png" +import Snowy_Mountains from "./images/Snowy_Mountains.png" +import Car from "./images/Car.png" +import Station from "./images/Station.jpg" +import Human from "./images/human.png" + + +Einheit B3-4 wurde entsandt um zu überprüfen, was den Ausfall verursacht hat, und um die Einheit wieder ins Netz zu bringen. Sein Fahrzeug bringt ihn so weit wie die letzten Straßen gehen. + +Von dort an muss er seine Kletterfähigkeiten und seine hochentwickelte Ausrüstung nutzen, um zur Station zu gelangen. + +Station B3-4 Offline + +Die Berge wurden in World Machine generiert, von dort exportierte ich die Berge als Objektdatei, eine Farbkarte und eine Normalenkarte. In Blender habe ich die Berge von etwa 1 Million Vertices auf 150.000 Vertices reduziert und die Normalenkarte verwendet, um die verlorenen Details zurückzugewinnen. + +Snowy Mountains + +Das Auto ist ein sogenannter Whillys Jeep, den ich vor einiger Zeit für ein Spielprojekt modelliert habe. + +Car + +Station + +Der Mensch begann als ein Projekt, um einen hochtechnologisch fortgeschrittenen Kletterer zu modellieren, und ist tatsächlich der erste Mensch, den ich je modelliert habe. + +Human + diff --git a/src/content/blog/station-b3-4-offline/index.mdx b/src/content/blog/station-b3-4-offline/index.mdx new file mode 100644 index 0000000..222a627 --- /dev/null +++ b/src/content/blog/station-b3-4-offline/index.mdx @@ -0,0 +1,35 @@ +--- +title: "Station B3-4 Offline" +date: 2016-12-21 +headerImg: "Station.jpg" +comments: true +--- + +import Image from "@components/Image.astro" +import Untitled2 from "./images/untitled-2.png" +import Snowy_Mountains from "./images/Snowy_Mountains.png" +import Car from "./images/Car.png" +import Station from "./images/Station.jpg" +import Human from "./images/human.png" + + +Unit +Unit B54 was dispatched to check what caused the failure, and to get the unit back on the net. His vehicle brings him as far as the last roads go. + +From there on he has to use his climbing skills and his highly developed equipment to get to the station. + +Station B3-4 Offline + +I used world machine to generate the mountains, from wm I exported the mountains as obj file a color map and an normal map. In blender i decimated the mountains from around 1 million vertices to 150.000 vertices, and used the normal map to gain back the lost detail. + +Snowy Mountains + +The car is a so called Whillys Jeep which i modelled a while ago for a game project. + +Car + +Station + +The human started as an project to model a highly technologically advanced climber, and is actually the first human I've ever modelled. + +Human diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0001.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0001.jpg new file mode 100644 index 0000000..8c050a0 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0001.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90fe76cbab162aa907d86f9dafbcec25c138e7499846eb645f4f37cf44411759 +size 174058 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0007.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0007.jpg new file mode 100644 index 0000000..49ea427 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/IMG-20170416-WA0007.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a2bcd3fc8483420e7be9978cf5925eed770a870371093fd144dc0d5e95b3bd1 +size 88336 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered-1.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered-1.jpg new file mode 100644 index 0000000..8e0d8d6 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0288ab88c8a8dbdde0e7518c760dfc9ac516c13a034a684cc4586f42b73f3973 +size 1509917 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered.jpg new file mode 100644 index 0000000..8e0d8d6 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4758-Recovered.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0288ab88c8a8dbdde0e7518c760dfc9ac516c13a034a684cc4586f42b73f3973 +size 1509917 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4888-Recovered.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4888-Recovered.jpg new file mode 100644 index 0000000..772f163 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4888-Recovered.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cacb61fc9543680d3a65b213c7a95e54ffb895e24fc16294f15afad342313684 +size 5529125 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4945-Recovered.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4945-Recovered.jpg new file mode 100644 index 0000000..2949e40 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4945-Recovered.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b34a0a3acc1924e75342903cfc2dc4f0c557b447875a678e4f9362ca2e7f1ada +size 1714965 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4967-Recovered.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4967-Recovered.jpg new file mode 100644 index 0000000..11aa894 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4967-Recovered.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61add75f23b41b97f5180a214b09d47a067fd92921e366c386ade075296ea2d8 +size 7341307 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4978.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4978.jpg new file mode 100644 index 0000000..296de18 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4978.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:151e595701833920dfe0c04e0d9c5d2cb9e568123f7fdb6d4ba7787fa34ace0f +size 10581031 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4997-Recovered.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4997-Recovered.jpg new file mode 100644 index 0000000..191b5f7 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_4997-Recovered.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef1d5b2aded69c117f8256cd848a524d508e3d90efafb8aa1b9f6a77d0cfd1d4 +size 5922367 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_5075.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_5075.jpg new file mode 100644 index 0000000..1a95566 --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_5075.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0db25ed4de6ea6d2e1781826565fda93e4d8be8978820a9ab7174462d618d864 +size 11407422 diff --git a/src/content/blog/surfirvorcamp-esmoriz/images/MAX_5112.jpg b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_5112.jpg new file mode 100644 index 0000000..48cc7bd --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/images/MAX_5112.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bd9d46aec52f9cb52d180cbc3deaff32ce5cf9a14541ef81c5bcf420737261e +size 14260874 diff --git a/src/content/blog/surfirvorcamp-esmoriz/index.mdx b/src/content/blog/surfirvorcamp-esmoriz/index.mdx new file mode 100644 index 0000000..6b087ab --- /dev/null +++ b/src/content/blog/surfirvorcamp-esmoriz/index.mdx @@ -0,0 +1,53 @@ +--- +title: "Surfirvorcamp | Esmoriz" +date: 2017-04-18 +headerImg: "MAX_4978.jpg" +comments: true +--- +import YouTube from "@components/YouTube.astro"; +import Image from "@components/Image.astro"; + +import MAX_4978 from "./images/MAX_4978.jpg"; +import MAX_4758 from "./images/MAX_4758-Recovered-1.jpg"; +import MAX_4888 from "./images/MAX_4888-Recovered.jpg"; +import MAX_4997 from "./images/MAX_4997-Recovered.jpg"; +import MAX_4967 from "./images/MAX_4967-Recovered.jpg"; +import MAX_4945 from "./images/MAX_4945-Recovered.jpg"; +import IMG_20170416_WA0007 from "./images/IMG-20170416-WA0007.jpg"; +import MAX_5075 from "./images/MAX_5075.jpg"; +import IMG_20170416_WA0001 from "./images/IMG-20170416-WA0001.jpg"; +import MAX_5112 from "./images/MAX_5112.jpg"; + + + +Letzten Freitag habe ich sehr spontan eine Woche Surfkurs in Esmoriz gebucht zum einen weil ich nen bisschen irgendwo absacken wollte und zum anderen weil Pella auch da war. Ich hatte ne super Woche das Surfivorcamp kann ich nur jedem empfehlen tolle Leute super entspannte Atmosphäre. + +Surfivorcamp + +Freitag an dem Tag sind wir das erste Mal ohne Trainer surfen gewesen und Pella hat sich nettwerweise bereiterklärt Paparazzi zu spielen. Von Links nach Rechts, Thomas, Jamie, Ich und Florian. Thomas und Florian sind Lehrer und Jamie hat ne Woche Saufurlaub mit seinen Kumpels hinter sich. Sehr korrekte Leute. An den ersten Tagen waren noch Ellen, Alba und Lucas dabei aber zur Zeit des Fotos waren die schon abgereist. + +Surfivorcamp + +Surfivorcamp + +Das war kurz nach dem ich meinen Dreifachen Rückwärtssalto auf der 7 Meter Welle hingelegt habe. + +Surfivorcamp + +Flo wollte mir nochmal sagen wie siiiiiiick der Rückwärtssalto war. + +Surfivorcamp + +Surfivorcamp + +Ausflug nach Porto, was macht man in Porto? Richtig Portwein trinken. Sponsored by Flo. Rechts von der Mitte war noch Juri dazugekommen, ein Surfer-Softwareentwickler dem es in Lissabon zu voll geworden war. + +Surfivorcamp + +Pella die Profi Weinprobiererin. + +Surfivorcamp + +Nach dem Portwein haben wir Francesinha gegessen, ich glaube mein neues dritt Lieblingsessen. Nichts kommt vor frittierten Meeresfrüchten in Italien und dem Thunfischsandwich von Papa. Das Grundkonzept ist, man stapelt soviele fettige Sachen wie möglich übereinander sprich, Wurst, Steak, Schinken Würstchen packt das alles zwischen zwei Scheiben Brot überbackt das alles mit Käse, manchmal nen Spiegelei obendrauf, setzt alles in ne Schale mit Soße und fertig ist der Arterienalbtraum. Aber ein sooooo leckerer. + +Surfivorcamp diff --git a/src/content/blog/the-end/images/Render_01.jpg b/src/content/blog/the-end/images/Render_01.jpg new file mode 100644 index 0000000..03fd400 --- /dev/null +++ b/src/content/blog/the-end/images/Render_01.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86d3ff72eb75b8de363407b6ae3838fc8a397c79f53ac3e07e1d0a53c6f4a5a8 +size 498035 diff --git a/src/content/blog/the-end/images/Render_05.png b/src/content/blog/the-end/images/Render_05.png new file mode 100644 index 0000000..722595e --- /dev/null +++ b/src/content/blog/the-end/images/Render_05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d5e8f13b9f5ca17f2b9e61505f2c4da06753d42b2c58560de2fb5d26d6691b2 +size 4314200 diff --git a/src/content/blog/the-end/index.mdx b/src/content/blog/the-end/index.mdx new file mode 100644 index 0000000..c094365 --- /dev/null +++ b/src/content/blog/the-end/index.mdx @@ -0,0 +1,29 @@ +--- +title: "The End" +date: 2017-02-02 +headerImg: "Render_01.jpg" +comments: true +--- + +import Image from "@components/Image.astro"; +import YouTube from "@components/YouTube.astro"; +import Render01 from "./images/Render_01.jpg"; +import Render05 from "./images/Render_05.png"; + +Render 01 + +Dies war auch die erste Szene zu der ich ne Timelapse gemacht hab: + + + +Die Inspiration zu dieser Szene kam unerwartet, und war aber auch irgendwie schon lange da. Am Dienstag den zweiten Februar 2016 habe ich eine Datei erstellt mit den Namen Desert_The_End.blend. Dann habe ich gestern dass Musik Video zu Gorillaz - Stylo gesehen, und so habe ich dann angefangen. + +Render 05 + +Ich finde es sehr schön, wenn man sehen kann dass man Fortschritte macht, aber gleichzeitig auch alles was man je gemacht hat der Grundstein ist für alles was man macht, und machen wird. Aus diesem Projekt konnte ich die Kakteen und das Straßenschild entnehmen. Den Rest habe ich handgemodelt, arbeite gerade auch an einer Timelapse zu dem Projekt. In der Szene habe ich zwei stark bearbeitete Assets von Blendswap verwendet, welche ich nur jedem empfehlen kann: + +[Low Poly Grass Patches (+LoD)](http://www.blendswap.com/blends/view/71002) + +[Low Poly Tree Next Gen](http://www.blendswap.com/blends/view/70949) + +Bei der Straße habe ich stark auf das neue Microdisplacement Feature in Blender gesetzt. Das größte Problem beim arbeiten an dem Projekt war dass Blenders Crashwarscheinlichkeit um einiges höher ist wenn im Hintergrund Nvidia Shadowplay läuft. Noch nie war ich so dankbar ein gutes Autosave system zu haben wie hier. diff --git a/src/content/blog/timelapse-rig-pi-zero-project/images/Cover.png b/src/content/blog/timelapse-rig-pi-zero-project/images/Cover.png new file mode 100644 index 0000000..baf7935 --- /dev/null +++ b/src/content/blog/timelapse-rig-pi-zero-project/images/Cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40f6a5de918dd556cccc5f424381ad83abd4269f31a89536e279ba282f117ba0 +size 1393557 diff --git a/src/content/blog/timelapse-rig-pi-zero-project/images/MAX_8935.jpg b/src/content/blog/timelapse-rig-pi-zero-project/images/MAX_8935.jpg new file mode 100644 index 0000000..7564d4c --- /dev/null +++ b/src/content/blog/timelapse-rig-pi-zero-project/images/MAX_8935.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f9ee056f76e5302c12ad5eeea72c0929cab4b58b534c69ae0c1db33befda899 +size 388300 diff --git a/src/content/blog/timelapse-rig-pi-zero-project/images/untitled1_low.png b/src/content/blog/timelapse-rig-pi-zero-project/images/untitled1_low.png new file mode 100644 index 0000000..f5fb7ea --- /dev/null +++ b/src/content/blog/timelapse-rig-pi-zero-project/images/untitled1_low.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e109f0c3031cec51af173262b5c482d45c8841a3f20aff41286e11320ae217c +size 618168 diff --git a/src/content/blog/timelapse-rig-pi-zero-project/images/untitled3.png b/src/content/blog/timelapse-rig-pi-zero-project/images/untitled3.png new file mode 100644 index 0000000..129a659 --- /dev/null +++ b/src/content/blog/timelapse-rig-pi-zero-project/images/untitled3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c99a3d53117a95f0b05590d8318d67a45cdadc1cec926585283d155980e4d448 +size 722220 diff --git a/src/content/blog/timelapse-rig-pi-zero-project/index.mdx b/src/content/blog/timelapse-rig-pi-zero-project/index.mdx new file mode 100644 index 0000000..d6b3b7e --- /dev/null +++ b/src/content/blog/timelapse-rig-pi-zero-project/index.mdx @@ -0,0 +1,24 @@ +--- +title: "Timelaps Rig Pi-Zero Project" +date: 2017-01-21 +comments: true +--- + +import Image from "@components/Image.astro"; +import YouTube from "@components/YouTube.astro"; +import Untitled1_low from "./images/untitled1_low.png"; +import Untitled3 from "./images/untitled3.png"; + +Ich habe schon seid längerem den Plan, mit dem Pi-Zero eine Art Zeitraffer Rig zu bauen ungefähr so: + + + +Dazu habe ich mir drei [Nema 17 Stepper Motor](http://www.ebay.de/itm/262028165823), drei [L9110s](http://www.ebay.de/itm/like/272305858883) und eine RAVPower 10400MAh Powerbank besorgt. Der Plan dass der PI ein Bluetooth PAN Netzwerk aufbaut, wo ich mich mit meinem Handy einklinke und über SSH einen Pythonskript steuere, welcher die Schrittmotoren ansteuert. Bis dahin klappt auch schon alles, nur nach einer Woche elektronischen Faustkampfes mit dem Pi, verschiedenen Driver Boards und sehr vielen Foren habe ich fast aufgegeben, den aus irgendwelchen Gründen krieg ich es nicht hin die Schrittmotoren zum laufen zu bringen. Bis jetzt habe ich das L9110s mit dem Schrittmotor verbunden aber der Pythonskript der bei einem anderen Schrittmotor funktioniert ([Schrittmotor](http://www.funduinoshop.com/Schrittmotor)) führt hier nur zu einem kläglichen Zittern des NEMA. + +untitled1_low + +untitled3 + +Damit das Projekt leichter zu realisieren ist, habe ich aus Plänen die ich online über die einzelnen Bauteile gefunden habe, das komplette Rig nachgemodelt. Außerdem hatte ich keine Lust mehr mich mit den Schrittmotoren selber zu beschäftigen, da ich sie einfach nicht dazu überredet gekriegt hab dass zu tuen was sie tuen sollten. + +Irgendwann hatte ich keine weiteren Ideen was ich falsch machen könnte und so konsultierte ich das Deutsche RPi-Forum. nach ungefähr 3 Stunden hatte ich meine Antwort, Das Driverboard war das falsche und die Powerbank hat zu wenig Ampere um den Pi und die Schrittmotoren anzutreiben. Also sitze ich jetzt hier und warte seit zwei Wochen auf die Driverboards die ich bestellt habe, und deren Verkäufer mir eine Email aus HongKong geschickt hat, dass sie leider noch nicht verschickt worden sind, da sie gerade das Chinesische Neujahr feiern. diff --git a/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.09.42-2.png b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.09.42-2.png new file mode 100644 index 0000000..67697b0 --- /dev/null +++ b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.09.42-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bf4a73e3947e08995cf61c4fec76ccdaa7bb0b0b84473409e832a306ef40733 +size 406387 diff --git a/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.17.57-2.png b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.17.57-2.png new file mode 100644 index 0000000..6692f60 --- /dev/null +++ b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.17.57-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c34527889da16ce24ed2e556e181a8538dbf24b43b759bc89d351235723a5c4d +size 681918 diff --git a/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.27-2.png b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.27-2.png new file mode 100644 index 0000000..3f559b5 --- /dev/null +++ b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.27-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28496fb4b91499722dba3976d80e8c66370bf3e7ec94e7bda8212d8e29b5621d +size 684688 diff --git a/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.45-2.png b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.45-2.png new file mode 100644 index 0000000..45a93bd --- /dev/null +++ b/src/content/blog/webgl-showcase/images/Bildschirmfoto-2018-01-03-um-13.18.45-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c95c88631a4d2811cc57e353fe04ca32fa1394b94eac246bdb416931b80edc78 +size 520984 diff --git a/src/content/blog/webgl-showcase/images/wHarG.jpg b/src/content/blog/webgl-showcase/images/wHarG.jpg new file mode 100644 index 0000000..6c7c575 --- /dev/null +++ b/src/content/blog/webgl-showcase/images/wHarG.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abf4e47fd2211027ef01823b7150a9b91375399461e33b07655491e1fdeb108b +size 118777 diff --git a/src/content/blog/webgl-showcase/index.mdx b/src/content/blog/webgl-showcase/index.mdx new file mode 100644 index 0000000..d076df0 --- /dev/null +++ b/src/content/blog/webgl-showcase/index.mdx @@ -0,0 +1,105 @@ +--- +title: "WebGL Showcase" +date: 2018-01-03 +headerImg: "images/Bildschirmfoto-2018-01-03-um-13.09.42-2.png" +comments: true +--- + +import Image from "@components/Image.astro"; +import YouTube from "@components/YouTube.astro"; + +import Screenshot1 from "./images/Bildschirmfoto-2018-01-03-um-13.18.45-2.png"; +import Screenshot2 from "./images/Bildschirmfoto-2018-01-03-um-13.18.27-2.png"; +import Screenshot3 from "./images/Bildschirmfoto-2018-01-03-um-13.17.57-2.png"; +import Screenshot4 from "./images/Bildschirmfoto-2018-01-03-um-13.09.42-2.png"; +import WHarG from "./images/wHarG.jpg"; + +Vorerst etwas Story: + +Ich habe mich in letzter Zeit sehr viel mit dem Programmieren von Webanwendungen beschäftigt, angefangen über statisches HTML und CSS, dann bin ich zu Javascript übergegangen und jetzt schließlich Node.js. Im + +Grunde hat mich programmieren schon vor sehr langer Zeit gepackt, und zwar als ich mit meinem besten Freund für ein Schulpraktikum vier Wochen auf einer Farm in Kanada verbracht hab. Ich wollte diese Erfahrung irgendwie festhalten nicht nur in Bildern und Videos sondern auch interaktiv, der Plan war eine Reihe von Bildern von der Farm zu machen und auf einer Website eine Art Suchbild/Weg durch die Farm zu erstellen. Der User sollte dann auf bestimme parts in dem Foto klicken können, eventuell Infos dazu bekommen und sich so durch die Farm bewegen. Ich weiß noch dass ich es geschafft habe dass erste Bild einzubinden und vollflächig darzustellen. Dann habe ich die anderen zerschnipselt und versucht über dass erste zu legen und meine Fresse war die Scheiße frustrierend, an alle die schonmal versucht habe Dinge mit CSS zu positionieren ohne überhaupt zu wissen was der Unterschied zwischen "absolute" und "relative" ist, ich denke ihr wisst wie es ausgegangen ist, an alle anderen stellt es euch vor als würdet ihr versuchen nen 20. seitige Broschüre in Word gestalten.  Diese Website verstaubt ihm Moment auf ner alten Festplatte von mir, naja vielleicht grab ich sie eines Tages noch aus. + +Dann bin ich im Zuge meiner Arbeit irgendwie auf WebGL, dass ist eine Technologie die auf einer anderen Technologie (OpenGL) beruht, die wiederum so gut wie alle Live 3D Anwendung ermöglicht, WebGL also macht es möglich 3D im Internet zu haben, echtes, interaktives 3D. Ich war ziemlich begeistert. Ich denke im Nachhinein war es der perfekte Einstieg für mich, ich kannte schon die ganzen Fremdwörter aus dem 3D Bereich, deswegen war es nicht so schwierig für mich. Des Weiteren hat mir eine grandiose Javascript Library namens three.js geholfen, eine Library ist im Grunde eine kleine extra Programmiersprache, der man dann nur einfache Dinge sagen muss, wie zum Beispiel "new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );" und die dann die ganzen komplizierten Sachen für einen macht. + +Meine erste 3D Anwendung ist bist jetzt auch meine komplizierteste da ich immer weiter daran arbeite. Eine Visualisierung von einem von mir erstellten Raum: + +[Link](/modern/?scene=modern) + +Bis jetzt habe ich zwei Szenen erstellt einmal "modern" und einmal "dwfb", beide kann man erreichen in dem man in der URL hinter "szene=" den Szenennamen schreibt. Da in "dwfb" diverse 4k Texturen sind, sind die Ladezeiten alles andere als schön. + +# Sachen die ich beim Programmieren von dieser Website gelernt habe: + +OOP: + +OOP steht für Object Oriented Programming, dass heißt der Code ist in Objekte aufgeteilt die untereinander kommunizieren, dass macht es einfacher Fehler zu finden, und den Code zu erweitern. + +Nerdstuff: + +jaja ich weiß OOP, dass ist ja mal so was von 2015 +Functional Programming ist das Neue Ding und so, ey ich habe +quasi gerade erst angefangen zu Programmieren mir reicht OOP +für jetzt erstmal. Also + +JSON: + +JSON steht for JavaScript Object Notation, ich brauchte für das Projekt einen besseren Weg meine Objekte in die Szene zu laden als den Standardweg, deswegen habe ich ein Loader Objekt programmiert, was zuerst aus einer .json Datei den Grundaufbau der Szene lädt, d.h. welche Objekte an welcher Position stehen, welche Materialien diese Objekte haben usw, danach lädt es diese Objekte, erstellt die Materialien unternimmt diverse Optimierung an der Szene, und lädt dann zum Schluss die Szene. + +--- + +Nerdstuff: + +Sobald der Loader initalisiert wird erstellt er eine Szene. +Dann kann man über Loader.load("Pfad/Zur/Json/Datei") dein Ladevorgang starten. +Die JSON Datei wird per XMLHttpRequest geladen, dann geparst. +Die Datei enthält den Namen der Szene, einen Array für alle HDRI's, einen Array für alle Objekte, +und einen für alle Materialen. Der Aufbau ist darauf ausgelegt möglich +wenige requests zu machen, und wegen der Redundanz der einzelnen Objekte, +eine HDRIS wird von vielen Materialien verwendet, eine Textur eher selten deswegen sind +die Texturen in den Materialien Array eingebettet. +Zur Optimierung der FPS kann man den Objekten eine "statische" +Eigenschaft geben, alle statischen Objekte werden in Buffergeometry +umgewandelt, dass heißt die Koordinaten der einzelnen Vertices liegen nicht im Format +\{xyz\}\{xyz\}\{xyz\}\{xyz\} vor sondern so: \{xyzxyzxyzxyz\}. Dies verringert die Kommunikation +zwischen CPU und GPU. Außerdem werden alle statischen Objekte zu einem Mesh +zusammengefügt was wiederum denselben Effekt hat. + +Hier der Link zur JSON Datei: +[LINK](/modern/3D/modern/modern.json) Und hier der Link zum Loader Modul: +[LINK](/modern/js/loader.js) + +ArchVizControls: + +Architecture Visualizations Controls, es gibt schon diverse fertig programmierte Objekte die den User die Kamera kontrollieren lassen. Diese hatten allerdings diverse Limitationen die ich nicht umgehen konnte deshalb habe ich meine eigenen Controls programmiert. Diese haben den Vorteil das sie sehr einfach einen 3D Cursor unterstützen, genauere Begrenzung der Kamera Rotation, und der Auto Rotation der Kamera und bessere Drag Controls. + +--- + +Nerdstuff: + +Die Komplikation bei den OrbitControls.js die ich vorher benutzt habe +war dass der Author die kompletten Rotation auf der Y-Achse von -PI bis ++PI moduliert hat, das Problem ist hier etwas verdeutlicht: + +WHarG + +Nachdem ich dazu eine Frage auf Stackoverflow gestellt habe, +wurde ich darauf hingewiesen dass ich relativ leicht meine +eigenen Controls programmieren kann. Einfach ein Empty Objekt, +an welches die Kamera geparented ist. Dann muss man nur noch aus +der MouseDown Position und der aktuellen Mouse Position einen +Vektor erstellen und diesen als Rotation auf das Empty Objekt anwenden. +Dazu dann noch ein Raycaster, welcher die Interaktion mit dem 3D Cursor +und klickbaren Objekten ermöglicht, und eine Animationsmodul zum +animieren der Kamera wenn man auf etwas klickt uuuuuund +fettich. + +Screenshots: + +Modern: +Screenshot 1 +Screenshot 2 + +DWFB: +Screenshot 3 +Screenshot 4 + diff --git a/src/content/blog/workroom-no2/images/untitled6.png b/src/content/blog/workroom-no2/images/untitled6.png new file mode 100644 index 0000000..56570f8 --- /dev/null +++ b/src/content/blog/workroom-no2/images/untitled6.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f64549e8313ecf8b7de01e37f9762ff2fa2fecb04eefc2064c7a76d3dfce63c5 +size 3253721 diff --git a/src/content/blog/workroom-no2/images/untitled7.png b/src/content/blog/workroom-no2/images/untitled7.png new file mode 100644 index 0000000..d7d8cd1 --- /dev/null +++ b/src/content/blog/workroom-no2/images/untitled7.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c00341a8a6e00cf99d5c176fe9fb9157b968b4ff16733f6066f506d72eb4e38d +size 3151017 diff --git a/src/content/blog/workroom-no2/images/untitled8.png b/src/content/blog/workroom-no2/images/untitled8.png new file mode 100644 index 0000000..15a0d2c --- /dev/null +++ b/src/content/blog/workroom-no2/images/untitled8.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75060bca6894ad6ad56c61a1fb7732654980d2d6ecc53df4511491a6621f7a54 +size 3813278 diff --git a/src/content/blog/workroom-no2/index.en.mdx b/src/content/blog/workroom-no2/index.en.mdx new file mode 100644 index 0000000..c98ffec --- /dev/null +++ b/src/content/blog/workroom-no2/index.en.mdx @@ -0,0 +1,27 @@ +--- +title: "Workroom No°2" +date: 2017-05-26 +headerImg: "images/untitled7.png" +comments: true +--- + +import Image from "@components/Image.astro"; +import YouTube from "@components/YouTube.astro"; +import Untitled6 from "./images/untitled6.png"; +import Untitled7 from "./images/untitled7.png"; +import Untitled8 from "./images/untitled8.png"; + + +This time i made a lot of changes to the wood material, i basically completely redid it. So this time the normal map looks a lot better. In the last material you could see the wooden fibers as structur in on the surface, which is highly unnatural for a polished surface. + + + +Then i added edgewear, so there are some fine scratches and imperfections on the edges aswell as some dust on the surface that are pointing upwards. + + + +This was new and exciting as ai got to use my tablet to sculpt the high poly model, which was a evry fun process. + + + +New wooden floor material i really like. diff --git a/src/content/blog/workroom/images/untitled.png b/src/content/blog/workroom/images/untitled.png new file mode 100644 index 0000000..3950a33 --- /dev/null +++ b/src/content/blog/workroom/images/untitled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eac555db7f2e3141b38baa4fe9f15ed42fbf5a99c668f5a67a71c3a47a0a1455 +size 3635837 diff --git a/src/content/blog/workroom/images/untitled1.png b/src/content/blog/workroom/images/untitled1.png new file mode 100644 index 0000000..279c56a --- /dev/null +++ b/src/content/blog/workroom/images/untitled1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0ad5e70d50675321f1138bb08e285ba62daa8bcca1cca9fa325fc8ff60f3673 +size 3971970 diff --git a/src/content/blog/workroom/images/untitled2.png b/src/content/blog/workroom/images/untitled2.png new file mode 100644 index 0000000..2da671e --- /dev/null +++ b/src/content/blog/workroom/images/untitled2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:359e69841f41282ecad3c41e5482eaa6f5f5960d58c122abc7810e4f39638743 +size 3944817 diff --git a/src/content/blog/workroom/images/untitled4.png b/src/content/blog/workroom/images/untitled4.png new file mode 100644 index 0000000..c968ccf --- /dev/null +++ b/src/content/blog/workroom/images/untitled4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:924bdac92bca6c435954a98f7eda4420e77f2d5e5f445ef98563267c09462ed4 +size 4024813 diff --git a/src/content/blog/workroom/images/untitled5.png b/src/content/blog/workroom/images/untitled5.png new file mode 100644 index 0000000..b1eb75c --- /dev/null +++ b/src/content/blog/workroom/images/untitled5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5eedda51ddad456de01185a6312f2e0b5c1a31a1267a6233a8c80f20281db053 +size 3692928 diff --git a/src/content/blog/workroom/index.en.mdx b/src/content/blog/workroom/index.en.mdx new file mode 100644 index 0000000..12add16 --- /dev/null +++ b/src/content/blog/workroom/index.en.mdx @@ -0,0 +1,36 @@ +--- +title: "Workroom" +date: 2017-05-22 +headerImg: "images/untitled4.png" +comments: true +--- + +import Image from "@components/Image.astro"; +import YouTube from "@components/YouTube.astro"; +import Untitled4 from "./images/untitled4.png"; +import Untitled1 from "./images/untitled1.png"; +import Untitled2 from "./images/untitled2.png"; +import Untitled from "./images/untitled.png"; +import Untitled5 from "./images/untitled5.png"; + +Okay, this time its another scene i did for the second time, but this one has a bit more story, a friend of mine smuggled me into his uni in a course were a professional showed us his photogrammetry workflow. And we got to try Reality Capture a 15.000€ piece of photogrammetry software. My friend scanned a small dragon statue he got as a present: + + + +For some reason i thought it really belonged on a table owned by a old professor, who travelled the world and got all kinds of items on his desk, he brought back from his travels. I remembered i already did that kind of scene, but lost all the savefiles except some renders: + +![](http://cdnb.artstation.com/p/assets/images/images/002/233/745/large/jim-richter-untitled1.jpg?1459086797) + +![](http://cdnb.artstation.com/p/assets/images/images/002/233/717/large/jim-richter-workroom.jpg?1459086495) + +So i started modelling, the table the globus and a cabinet you can see in the top image. In the workshop we did at the uni we also used the substance toolbag which consists of Substance Designer and Substance Painter and i really fell in love with both programs. Usually i just do everything inside of Blender. But this time i modelled a highpoly version in Blender, baked the normals to a low poly mesh in blender, created a material that conforms to the shape of the model in Substance Designer and finished the material in Substance Painter then imported the finished material into Blender and rendered in Blender. And i think the difference in quality compared to my old workflow is clearly visible. + + + + + + + + + +Here you can see the low poly mesh. diff --git a/src/content/blog/zentralwerk_2051/Fishes.svelte b/src/content/blog/zentralwerk_2051/Fishes.svelte new file mode 100644 index 0000000..41952ec --- /dev/null +++ b/src/content/blog/zentralwerk_2051/Fishes.svelte @@ -0,0 +1,85 @@ + + + + + { + speed = Math.min(speed + 0.001, 0.15); + timeOffset += speed; + }} +/> + + + + + diff --git a/src/content/blog/zentralwerk_2051/fishes/fishModel.ts b/src/content/blog/zentralwerk_2051/fishes/fishModel.ts new file mode 100644 index 0000000..db990d1 --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/fishModel.ts @@ -0,0 +1,1202 @@ +const mesh = { + position: { + data: Float32Array.from([ + -0.22962942719459534, + 2.6812964293299046e-8, + -5.71157693862915, + 0.3508965075016022, + 2.681298205686744e-8, + -5.71157693862915, + -0.1883154809474945, + 3.6638876821371014e-8, + -6.3836283683776855, + -0.397721529006958, + 3.401317272277993e-8, + -6.367576599121094, + -0.22962942719459534, + 2.6812964293299046e-8, + -5.71157693862915, + -1.061193585395813, + 2.6812939424303295e-8, + -5.71157693862915, + -1.4428715705871582, + 1.6986984263667182e-8, + -4.846091270446777, + -0.008489936590194702, + 1.6987060647011276e-8, + -4.846091270446777, + -0.008489936590194702, + 1.6987060647011276e-8, + -4.846091270446777, + -1.4428715705871582, + 1.6986984263667182e-8, + -4.846091270446777, + -2.091588020324707, + 1.9246906290959487e-8, + -3.596668243408203, + 0.07158166170120239, + 1.9247032412295084e-8, + -3.596668243408203, + 0.07158166170120239, + 1.9247032412295084e-8, + -3.596668243408203, + -2.091588020324707, + 1.9246906290959487e-8, + -3.596668243408203, + -2.2815277576446533, + 2.162397017002604e-8, + -2.74206280708313, + 0.06826597452163696, + 2.162412293671423e-8, + -2.74206280708313, + 0.06826597452163696, + 2.162412293671423e-8, + -2.74206280708313, + -2.2815277576446533, + 2.162397017002604e-8, + -2.74206280708313, + -2.386138677597046, + 2.3916125968526103e-8, + -1.9099469184875488, + 0.012060336768627167, + 2.6864093172207504e-8, + -2.2613472938537598, + 0.012060336768627167, + 2.6864093172207504e-8, + -2.2613472938537598, + -2.386138677597046, + 2.3916125968526103e-8, + -1.9099469184875488, + -2.1151468753814697, + 1.8822385428052257e-8, + -0.3244289457798004, + 0.08239194750785828, + 1.882255951102252e-8, + -0.3244289457798004, + 0.08239194750785828, + 1.882255951102252e-8, + -0.3244289457798004, + -2.1151468753814697, + 1.8822385428052257e-8, + -0.3244289457798004, + -1.5463093519210815, + 4.390069641146965e-9, + 0.9462344646453857, + 0.2064114809036255, + 4.390248609098535e-9, + 0.9462344646453857, + 0.2064114809036255, + 4.390248609098535e-9, + 0.9462344646453857, + -1.5463093519210815, + 4.390069641146965e-9, + 0.9462344646453857, + -1.1573379039764404, + 2.2100365981714276e-8, + 1.7799121141433716, + -0.08435896039009094, + 1.7973588839481636e-8, + 1.8345743417739868, + -0.08435896039009094, + 1.7973588839481636e-8, + 1.8345743417739868, + -1.1573379039764404, + 2.2100365981714276e-8, + 1.7799121141433716, + -1.1535388231277466, + 2.4199160009175102e-8, + 2.499892234802246, + -0.17243854701519012, + 2.4199293235938057e-8, + 2.499892234802246, + -0.17243854701519012, + 2.4199293235938057e-8, + 2.499892234802246, + -1.1535388231277466, + 2.4199160009175102e-8, + 2.499892234802246, + -2.0507466793060303, + 4.8370829119903647e-8, + 3.8195950984954834, + -0.3900178372859955, + 4.8371070704433805e-8, + 3.8195950984954834, + -0.3900178372859955, + 4.8371070704433805e-8, + 3.8195950984954834, + -2.0507466793060303, + 4.8370829119903647e-8, + 3.8195950984954834, + -2.7179229259490967, + 5.426627680549245e-8, + 4.889413356781006, + -0.36338019371032715, + 5.426663918228769e-8, + 4.889413356781006, + 0.7693589925765991, + 4.837123768197671e-8, + 3.8195950984954834, + -0.3900178372859955, + 4.8371070704433805e-8, + 3.8195950984954834, + -0.36338019371032715, + 5.426663918228769e-8, + 4.889413356781006, + 1.2803572416305542, + 5.4266894977672564e-8, + 4.889413356781006, + 0.5124804973602295, + 2.4199387382850546e-8, + 2.499892234802246, + -0.17243854701519012, + 2.4199293235938057e-8, + 2.499892234802246, + -0.3900178372859955, + 4.8371070704433805e-8, + 3.8195950984954834, + 0.7693589925765991, + 4.837123768197671e-8, + 3.8195950984954834, + 0.6265413761138916, + 1.797366699918257e-8, + 1.8345743417739868, + -0.08435896039009094, + 1.7973588839481636e-8, + 1.8345743417739868, + -0.17243854701519012, + 2.4199293235938057e-8, + 2.499892234802246, + 0.5124804973602295, + 2.4199387382850546e-8, + 2.499892234802246, + 1.4300090074539185, + 4.390373398166503e-9, + 0.9462344646453857, + 0.2064114809036255, + 4.390248609098535e-9, + 0.9462344646453857, + -0.08435896039009094, + 1.7973588839481636e-8, + 1.8345743417739868, + 0.6265413761138916, + 1.797366699918257e-8, + 1.8345743417739868, + 1.6165227890014648, + 1.8822680303287598e-8, + -0.3244289457798004, + 0.08239194750785828, + 1.882255951102252e-8, + -0.3244289457798004, + 0.2064114809036255, + 4.390248609098535e-9, + 0.9462344646453857, + 1.4300090074539185, + 4.390373398166503e-9, + 0.9462344646453857, + 1.7135322093963623, + 2.6864228175327298e-8, + -2.2613472938537598, + 0.012060336768627167, + 2.6864093172207504e-8, + -2.2613472938537598, + 0.08239194750785828, + 1.882255951102252e-8, + -0.3244289457798004, + 1.6165227890014648, + 1.8822680303287598e-8, + -0.3244289457798004, + 1.7086880207061768, + 2.1624227741767754e-8, + -2.74206280708313, + 0.06826597452163696, + 2.162412293671423e-8, + -2.74206280708313, + 0.012060336768627167, + 2.6864093172207504e-8, + -2.2613472938537598, + 1.7135322093963623, + 2.6864228175327298e-8, + -2.2613472938537598, + 1.5817190408706665, + 1.9247119453780215e-8, + -3.596668243408203, + 0.07158166170120239, + 1.9247032412295084e-8, + -3.596668243408203, + 0.06826597452163696, + 2.162412293671423e-8, + -2.74206280708313, + 1.7086880207061768, + 2.1624227741767754e-8, + -2.74206280708313, + 0.9928708672523499, + 1.6987113937716458e-8, + -4.846091270446777, + -0.008489936590194702, + 1.6987060647011276e-8, + -4.846091270446777, + 0.07158166170120239, + 1.9247032412295084e-8, + -3.596668243408203, + 1.5817190408706665, + 1.9247119453780215e-8, + -3.596668243408203, + 0.3508965075016022, + 2.681298205686744e-8, + -5.71157693862915, + -0.22962942719459534, + 2.6812964293299046e-8, + -5.71157693862915, + -0.008489936590194702, + 1.6987060647011276e-8, + -4.846091270446777, + 0.9928708672523499, + 1.6987113937716458e-8, + -4.846091270446777, + -1.061193585395813, + 2.6812939424303295e-8, + -5.71157693862915, + -0.22962942719459534, + 2.6812964293299046e-8, + -5.71157693862915, + -0.397721529006958, + 3.401317272277993e-8, + -6.367576599121094, + -0.6976815462112427, + 3.025202488515788e-8, + -6.344583988189697, + 1.2803572416305542, + 5.4266894977672564e-8, + 4.889413356781006, + -0.36338019371032715, + 5.426663918228769e-8, + 4.889413356781006, + 0.8626161813735962, + -3.829351413742188e-8, + 6.459001064300537, + 1.7645087242126465, + 1.771447699638884e-8, + 6.513663291931152, + -0.36338019371032715, + 5.426663918228769e-8, + 4.889413356781006, + -2.7179229259490967, + 5.426627680549245e-8, + 4.889413356781006, + -3.178647756576538, + 8.905003312520421e-8, + 6.482428073883057, + -1.3785364627838135, + 1.3090880202071276e-7, + 6.185689926147461, + -1.1573379039764404, + 2.2100365981714276e-8, + 1.7799121141433716, + -1.5463093519210815, + 4.390069641146965e-9, + 0.9462344646453857, + -2.046078681945801, + 4.212159865346621e-8, + 1.789595127105713, + -1.5321648120880127, + 5.039901296299831e-8, + 2.4280502796173096, + -1.5463093519210815, + 4.390069641146965e-9, + 0.9462344646453857, + -2.1151468753814697, + 1.8822385428052257e-8, + -0.3244289457798004, + -2.661769390106201, + 6.009124575712121e-8, + 0.9171853065490723, + -2.046078681945801, + 4.212159865346621e-8, + 1.789595127105713, + -2.1151468753814697, + 1.8822385428052257e-8, + -0.3244289457798004, + -2.386138677597046, + 2.3916125968526103e-8, + -1.9099469184875488, + -3.159219264984131, + 8.228207803995247e-8, + -0.6761415004730225, + -2.661769390106201, + 6.009124575712121e-8, + 0.9171853065490723, + 1.4300090074539185, + 4.390373398166503e-9, + 0.9462344646453857, + 0.6265413761138916, + 1.797366699918257e-8, + 1.8345743417739868, + 0.9076616168022156, + -3.250319347003483e-9, + 2.6310815811157227, + 1.6955114603042603, + -1.5654503471296266e-8, + 2.4377331733703613, + 1.6955114603042603, + -1.5654503471296266e-8, + 2.4377331733703613, + 0.9076616168022156, + -3.250319347003483e-9, + 2.6310815811157227, + 1.5130374431610107, + -3.33123715279271e-8, + 3.503904104232788, + 1.7773187160491943, + -3.7473306235824566e-8, + 3.4390461444854736, + 1.7135322093963623, + 2.6864228175327298e-8, + -2.2613472938537598, + 1.6165227890014648, + 1.8822680303287598e-8, + -0.3244289457798004, + 2.119415760040283, + -1.9144671625781484e-8, + -0.1354537457227707, + 2.3398056030273438, + -2.041809743502654e-8, + -1.6881743669509888, + 2.3398056030273438, + -2.041809743502654e-8, + -1.6881743669509888, + 2.119415760040283, + -1.9144671625781484e-8, + -0.1354537457227707, + 2.9362261295318604, + -8.08121356499214e-8, + 0.7656927108764648, + 2.948899269104004, + -6.640340188823757e-8, + -0.5027841925621033, + ]), + size: 3, + }, + normal: { + data: Float32Array.from([ + -3.03066416407205e-9, + 1, + 1.4434480277714101e-8, + -3.03066416407205e-9, + 1, + 1.4434480277714101e-8, + -3.03066416407205e-9, + 1, + 1.4434480277714101e-8, + -3.03066416407205e-9, + 1, + 1.4434480277714101e-8, + -4.528878154116435e-14, + 1, + 1.1353072260078534e-8, + -4.528878154116435e-14, + 1, + 1.1353072260078534e-8, + -4.528878154116435e-14, + 1, + 1.1353072260078534e-8, + -4.528878154116435e-14, + 1, + 1.1353072260078534e-8, + -5.5327578862797086e-14, + 1, + -1.8088049946740625e-9, + -5.5327578862797086e-14, + 1, + -1.8088049946740625e-9, + -5.5327578862797086e-14, + 1, + -1.8088049946740625e-9, + -5.5327578862797086e-14, + 1, + -1.8088049946740625e-9, + -6.263854723537882e-14, + 1, + -2.7814981429230556e-9, + -6.263854723537882e-14, + 1, + -2.7814981429230556e-9, + -6.263854723537882e-14, + 1, + -2.7814981429230556e-9, + -6.263854723537882e-14, + 1, + -2.7814981429230556e-9, + -1.055104670300011e-9, + 1, + -5.866561014755689e-9, + -1.055104670300011e-9, + 1, + -5.866561014755689e-9, + -1.055104670300011e-9, + 1, + -5.866561014755689e-9, + -1.055104670300011e-9, + 1, + -5.866561014755689e-9, + -3.5374345119798534e-10, + 1, + 3.763308331627968e-9, + -3.5374345119798534e-10, + 1, + 3.763308331627968e-9, + -3.5374345119798534e-10, + 1, + 3.763308331627968e-9, + -3.5374345119798534e-10, + 1, + 3.763308331627968e-9, + -8.953536019149985e-14, + 1, + 1.135811800168085e-8, + -8.953536019149985e-14, + 1, + 1.135811800168085e-8, + -8.953536019149985e-14, + 1, + 1.135811800168085e-8, + -8.953536019149985e-14, + 1, + 1.135811800168085e-8, + 1.8139266755312633e-9, + 1, + -1.82760935274473e-8, + 1.8139266755312633e-9, + 1, + -1.82760935274473e-8, + 1.8139266755312633e-9, + 1, + -1.82760935274473e-8, + 1.8139266755312633e-9, + 1, + -1.82760935274473e-8, + 2.1654076309829406e-9, + 1, + -5.877434983148078e-9, + 2.1654076309829406e-9, + 1, + -5.877434983148078e-9, + 2.1654076309829406e-9, + 1, + -5.877434983148078e-9, + 2.1654076309829406e-9, + 1, + -5.877434983148078e-9, + -1.4266166644284067e-13, + 1, + -1.8316091754400077e-8, + -1.4266166644284067e-13, + 1, + -1.8316091754400077e-8, + -1.4266166644284067e-13, + 1, + -1.8316091754400077e-8, + -1.4266166644284067e-13, + 1, + -1.8316091754400077e-8, + -1.5217838653710375e-13, + 1, + -5.510800260566384e-9, + -1.5217838653710375e-13, + 1, + -5.510800260566384e-9, + -1.5217838653710375e-13, + 1, + -5.510800260566384e-9, + -1.5217838653710375e-13, + 1, + -5.510800260566384e-9, + -1.492725349794624e-13, + 1, + -5.510816247777939e-9, + -1.492725349794624e-13, + 1, + -5.510816247777939e-9, + -1.492725349794624e-13, + 1, + -5.510816247777939e-9, + -1.492725349794624e-13, + 1, + -5.510816247777939e-9, + -1.430472764980123e-13, + 1, + -1.8316102412541113e-8, + -1.430472764980123e-13, + 1, + -1.8316102412541113e-8, + -1.430472764980123e-13, + 1, + -1.8316102412541113e-8, + -1.430472764980123e-13, + 1, + -1.8316102412541113e-8, + -1.2433257819566973e-13, + 0.9999999403953552, + -9.357514763053132e-9, + -1.2433257819566973e-13, + 0.9999999403953552, + -9.357514763053132e-9, + -1.2433257819566973e-13, + 0.9999999403953552, + -9.357514763053132e-9, + -1.2433257819566973e-13, + 0.9999999403953552, + -9.357514763053132e-9, + -1.0543455485848702e-13, + 0.9999999403953552, + -1.5290741117723883e-8, + -1.0543455485848702e-13, + 0.9999999403953552, + -1.5290741117723883e-8, + -1.0543455485848702e-13, + 0.9999999403953552, + -1.5290741117723883e-8, + -1.0543455485848702e-13, + 0.9999999403953552, + -1.5290741117723883e-8, + -8.972665411230776e-14, + 1, + 1.135808691543616e-8, + -8.972665411230776e-14, + 1, + 1.135808691543616e-8, + -8.972665411230776e-14, + 1, + 1.135808691543616e-8, + -8.972665411230776e-14, + 1, + 1.135808691543616e-8, + -7.936367356483828e-14, + 1, + 4.1517185245254495e-9, + -7.936367356483828e-14, + 1, + 4.1517185245254495e-9, + -7.936367356483828e-14, + 1, + 4.1517185245254495e-9, + -7.936367356483828e-14, + 1, + 4.1517185245254495e-9, + -7.187250740305767e-14, + 1, + -1.0900392588553132e-8, + -7.187250740305767e-14, + 1, + -1.0900392588553132e-8, + -7.187250740305767e-14, + 1, + -1.0900392588553132e-8, + -7.187250740305767e-14, + 1, + -1.0900392588553132e-8, + -6.069668015808508e-14, + 1, + -2.7815139080900053e-9, + -6.069668015808508e-14, + 1, + -2.7815139080900053e-9, + -6.069668015808508e-14, + 1, + -2.7815139080900053e-9, + -6.069668015808508e-14, + 1, + -2.7815139080900053e-9, + -5.660928201352798e-14, + 1, + -1.8088101016999758e-9, + -5.660928201352798e-14, + 1, + -1.8088101016999758e-9, + -5.660928201352798e-14, + 1, + -1.8088101016999758e-9, + -5.660928201352798e-14, + 1, + -1.8088101016999758e-9, + -4.411376049607424e-14, + 1, + 1.1353060713759078e-8, + -4.411376049607424e-14, + 1, + 1.1353060713759078e-8, + -4.411376049607424e-14, + 1, + 1.1353060713759078e-8, + -4.411376049607424e-14, + 1, + 1.1353060713759078e-8, + -3.1660247756803983e-9, + 1, + 7.77388731165729e-9, + -3.1660247756803983e-9, + 1, + 7.77388731165729e-9, + -3.1660247756803983e-9, + 1, + 7.77388731165729e-9, + -3.1660247756803983e-9, + 1, + 7.77388731165729e-9, + -2.3135795501616485e-8, + 1, + 5.281365389464554e-8, + -2.3135795501616485e-8, + 1, + 5.281365389464554e-8, + -2.3135795501616485e-8, + 1, + 5.281365389464554e-8, + -2.3135795501616485e-8, + 1, + 5.281365389464554e-8, + -1.331547672123179e-8, + 1, + -4.5366828516080204e-8, + -1.331547672123179e-8, + 1, + -4.5366828516080204e-8, + -1.331547672123179e-8, + 1, + -4.5366828516080204e-8, + -1.331547672123179e-8, + 1, + -4.5366828516080204e-8, + 2.218704331369281e-8, + 1, + -3.126082503968064e-8, + 2.218704331369281e-8, + 1, + -3.126082503968064e-8, + 2.218704331369281e-8, + 1, + -3.126082503968064e-8, + 2.218704331369281e-8, + 1, + -3.126082503968064e-8, + 5.0265395401538626e-8, + 1, + -1.2663508464072493e-8, + 5.0265395401538626e-8, + 1, + -1.2663508464072493e-8, + 5.0265395401538626e-8, + 1, + -1.2663508464072493e-8, + 5.0265395401538626e-8, + 1, + -1.2663508464072493e-8, + 6.302157373738737e-8, + 1, + -6.651410977553951e-9, + 6.302157373738737e-8, + 1, + -6.651410977553951e-9, + 6.302157373738737e-8, + 1, + -6.651410977553951e-9, + 6.302157373738737e-8, + 1, + -6.651410977553951e-9, + 2.459691295086941e-8, + 1, + 1.2160644935477194e-8, + 2.459691295086941e-8, + 1, + 1.2160644935477194e-8, + 2.459691295086941e-8, + 1, + 1.2160644935477194e-8, + 2.459691295086941e-8, + 1, + 1.2160644935477194e-8, + 2.0677347833952808e-8, + 1, + 2.0100857867078048e-8, + 2.0677347833952808e-8, + 1, + 2.0100857867078048e-8, + 2.0677347833952808e-8, + 1, + 2.0100857867078048e-8, + 2.0677347833952808e-8, + 1, + 2.0100857867078048e-8, + 6.989768763787652e-8, + 1, + 8.297024400860664e-9, + 6.989768763787652e-8, + 1, + 8.297024400860664e-9, + 6.989768763787652e-8, + 1, + 8.297024400860664e-9, + 6.989768763787652e-8, + 1, + 8.297024400860664e-9, + 6.127729079707933e-8, + 1, + 9.718124971414e-9, + 6.127729079707933e-8, + 1, + 9.718124971414e-9, + 6.127729079707933e-8, + 1, + 9.718124971414e-9, + 6.127729079707933e-8, + 1, + 9.718124971414e-9, + ]), + size: 3, + }, + uv: { + data: Float32Array.from([ + 0.9477602243423462, + 0.7507259249687195, + 0.9480448365211487, + 0.7957742214202881, + 0.9999311566352844, + 0.7536023259162903, + 0.9985828399658203, + 0.7373603582382202, + 0.9477602243423462, + 0.7507259249687195, + 0.9473524689674377, + 0.6861971020698547, + 0.8800042867660522, + 0.6570035219192505, + 0.8807075023651123, + 0.768310546875, + 0.8807075023651123, + 0.768310546875, + 0.8800042867660522, + 0.6570035219192505, + 0.7827318906784058, + 0.6072762608528137, + 0.7837926149368286, + 0.7751365900039673, + 0.7837926149368286, + 0.7751365900039673, + 0.7827318906784058, + 0.6072762608528137, + 0.7163220643997192, + 0.5929561257362366, + 0.7174742221832275, + 0.7752983570098877, + 0.7174742221832275, + 0.7752983570098877, + 0.7163220643997192, + 0.5929561257362366, + 0.6516991853713989, + 0.5852463841438293, + 0.6801434755325317, + 0.7711725234985352, + 0.6801434755325317, + 0.7711725234985352, + 0.6516991853713989, + 0.5852463841438293, + 0.5287971496582031, + 0.6070525646209717, + 0.5298746228218079, + 0.7775799036026001, + 0.5298746228218079, + 0.7775799036026001, + 0.5287971496582031, + 0.6070525646209717, + 0.4304734468460083, + 0.6518169045448303, + 0.43133288621902466, + 0.787826657295227, + 0.43133288621902466, + 0.787826657295227, + 0.4304734468460083, + 0.6518169045448303, + 0.36597156524658203, + 0.6824095845222473, + 0.36225593090057373, + 0.7656986713409424, + 0.36225593090057373, + 0.7656986713409424, + 0.36597156524658203, + 0.6824095845222473, + 0.3101035952568054, + 0.683057427406311, + 0.3105846643447876, + 0.7591899633407593, + 0.3105846643447876, + 0.7591899633407593, + 0.3101035952568054, + 0.683057427406311, + 0.20725560188293457, + 0.614081859588623, + 0.20806998014450073, + 0.7429531812667847, + 0.20806998014450073, + 0.7429531812667847, + 0.20725560188293457, + 0.614081859588623, + 0.12391138076782227, + 0.5628340244293213, + 0.12506598234176636, + 0.7455447912216187, + 0.20863837003707886, + 0.8329198360443115, + 0.20806998014450073, + 0.7429531812667847, + 0.12506598234176636, + 0.7455447912216187, + 0.1258719563484192, + 0.8730975389480591, + 0.31092047691345215, + 0.812339186668396, + 0.3105846643447876, + 0.7591899633407593, + 0.20806998014450073, + 0.7429531812667847, + 0.20863837003707886, + 0.8329198360443115, + 0.3626044988632202, + 0.8208640813827515, + 0.36225593090057373, + 0.7656986713409424, + 0.3105846643447876, + 0.7591899633407593, + 0.31092047691345215, + 0.812339186668396, + 0.4319329261779785, + 0.8827769160270691, + 0.43133288621902466, + 0.787826657295227, + 0.36225593090057373, + 0.7656986713409424, + 0.3626044988632202, + 0.8208640813827515, + 0.5306267738342285, + 0.8966271877288818, + 0.5298746228218079, + 0.7775799036026001, + 0.43133288621902466, + 0.787826657295227, + 0.4319329261779785, + 0.8827769160270691, + 0.6809777021408081, + 0.903205394744873, + 0.6801434755325317, + 0.7711725234985352, + 0.5298746228218079, + 0.7775799036026001, + 0.5306267738342285, + 0.8966271877288818, + 0.7182785272598267, + 0.9025938510894775, + 0.7174742221832275, + 0.7752983570098877, + 0.6801434755325317, + 0.7711725234985352, + 0.6809777021408081, + 0.903205394744873, + 0.784532904624939, + 0.8923220634460449, + 0.7837926149368286, + 0.7751365900039673, + 0.7174742221832275, + 0.7752983570098877, + 0.7182785272598267, + 0.9025938510894775, + 0.881198525428772, + 0.8460153341293335, + 0.8807075023651123, + 0.768310546875, + 0.7837926149368286, + 0.7751365900039673, + 0.784532904624939, + 0.8923220634460449, + 0.9480448365211487, + 0.7957742214202881, + 0.9477602243423462, + 0.7507259249687195, + 0.8807075023651123, + 0.768310546875, + 0.881198525428772, + 0.8460153341293335, + 0.9473524689674377, + 0.6861971020698547, + 0.9477602243423462, + 0.7507259249687195, + 0.9985828399658203, + 0.7373603582382202, + 0.9966515302658081, + 0.7140949964523315, + 0.1258719563484192, + 0.8730975389480591, + 0.12506598234176636, + 0.7455447912216187, + 0.003868281841278076, + 0.8414506912231445, + 0.00006884336471557617, + 0.9114636778831482, + 0.12506598234176636, + 0.7455447912216187, + 0.12391138076782227, + 0.5628340244293213, + 0.00006884336471557617, + 0.5278633832931519, + 0.02397817373275757, + 0.6674050092697144, + 0.36597156524658203, + 0.6824095845222473, + 0.4304734468460083, + 0.6518169045448303, + 0.3647843599319458, + 0.6134486794471741, + 0.31549280881881714, + 0.6536411046981812, + 0.4304734468460083, + 0.6518169045448303, + 0.5287971496582031, + 0.6070525646209717, + 0.4321807622909546, + 0.5652438402175903, + 0.3647843599319458, + 0.6134486794471741, + 0.5287971496582031, + 0.6070525646209717, + 0.6516991853713989, + 0.5852463841438293, + 0.5555777549743652, + 0.5258609056472778, + 0.4321807622909546, + 0.5652438402175903, + 0.4319329261779785, + 0.8827769160270691, + 0.3626044988632202, + 0.8208640813827515, + 0.3009340763092041, + 0.843069314956665, + 0.3163239359855652, + 0.9041110277175903, + 0.3163239359855652, + 0.9041110277175903, + 0.3009340763092041, + 0.843069314956665, + 0.23350048065185547, + 0.8904739618301392, + 0.2386629581451416, + 0.9109501838684082, + 0.6809777021408081, + 0.903205394744873, + 0.5306267738342285, + 0.8966271877288818, + 0.5162090063095093, + 0.935744047164917, + 0.6368069648742676, + 0.9520847797393799, + 0.6368069648742676, + 0.9520847797393799, + 0.5162090063095093, + 0.935744047164917, + 0.44668126106262207, + 0.9995696544647217, + 0.5451202988624573, + 0.9999311566352844, + ]), + size: 3, + }, + index: { + data: Uint16Array.from([ + 0, + 1, + 2, + 0, + 2, + 3, + 4, + 5, + 6, + 4, + 6, + 7, + 8, + 9, + 10, + 8, + 10, + 11, + 12, + 13, + 14, + 12, + 14, + 15, + 16, + 17, + 18, + 16, + 18, + 19, + 20, + 21, + 22, + 20, + 22, + 23, + 24, + 25, + 26, + 24, + 26, + 27, + 28, + 29, + 30, + 28, + 30, + 31, + 32, + 33, + 34, + 32, + 34, + 35, + 36, + 37, + 38, + 36, + 38, + 39, + 40, + 41, + 42, + 40, + 42, + 43, + 44, + 45, + 46, + 44, + 46, + 47, + 48, + 49, + 50, + 48, + 50, + 51, + 52, + 53, + 54, + 52, + 54, + 55, + 56, + 57, + 58, + 56, + 58, + 59, + 60, + 61, + 62, + 60, + 62, + 63, + 64, + 65, + 66, + 64, + 66, + 67, + 68, + 69, + 70, + 68, + 70, + 71, + 72, + 73, + 74, + 72, + 74, + 75, + 76, + 77, + 78, + 76, + 78, + 79, + 80, + 81, + 82, + 80, + 82, + 83, + 84, + 85, + 86, + 84, + 86, + 87, + 88, + 89, + 90, + 88, + 90, + 91, + 92, + 93, + 94, + 92, + 94, + 95, + 96, + 97, + 98, + 96, + 98, + 99, + 100, + 101, + 102, + 100, + 102, + 103, + 104, + 105, + 106, + 104, + 106, + 107, + 108, + 109, + 110, + 108, + 110, + 111, + 112, + 113, + 114, + 112, + 114, + 115, + 116, + 117, + 118, + 116, + 118, + 119, + 120, + 121, + 122, + 120, + 122, + 123, + ]), + size: 1, + }, +}; + +export default mesh; diff --git a/src/content/blog/zentralwerk_2051/fishes/shaders/Fish.frag b/src/content/blog/zentralwerk_2051/fishes/shaders/Fish.frag new file mode 100644 index 0000000..c8f8f05 --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/shaders/Fish.frag @@ -0,0 +1,24 @@ +precision highp float; + +varying vec3 vNormal; +varying vec4 vMVPos; + +uniform vec3 uFogColor; + +void main() { + + vec3 normal = normalize(vNormal); + float lighting = dot(normal, normalize(vec3(-0.3, 0.8, 0.6))); + + vec3 color = vec3(0.95, 0.5, 0.2) + lighting * 0.1; + + float dist = length(vMVPos); + + float fog = smoothstep(15.0, 17.0, dist); + + color = mix(color, uFogColor, fog); + + gl_FragColor.rgb = color; + gl_FragColor.a = 1.0; + +} diff --git a/src/content/blog/zentralwerk_2051/fishes/shaders/Fish.vert b/src/content/blog/zentralwerk_2051/fishes/shaders/Fish.vert new file mode 100644 index 0000000..0d6908e --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/shaders/Fish.vert @@ -0,0 +1,110 @@ +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x*34.0)+1.0)*x); +} + +float noise(vec2 v) { + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + // First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + + // Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +void rotate2d(inout vec2 v, float a){ + mat2 m = mat2(cos(a), -sin(a), sin(a), cos(a)); + v = m * v; +} + +attribute vec2 uv; +attribute vec3 position; +attribute vec3 normal; + +// Add instanced attributes just like any attribute +attribute vec3 offset; +attribute vec3 random; + +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; +uniform mat3 normalMatrix; + +uniform float uTime; + +varying vec3 vNormal; +varying vec2 vUv; +varying vec4 vMVPos; + +void main() { + + // Scale random + vec3 pos = position * (0.2 + random.y * 0.2); + + // This was an error, but it worked out and adds some randomness to the fish shape + pos += vec3(sin(pos.x+random.y*2.0)*0.5, 0.0, sin(pos.z*3.0+random.x*2.0)*0.1); + + // Make the fish look like the move their flaps + rotate2d(pos.yz, pos.z * 0.05 + noise(vec2(uTime*0.1, random.y))); + + // Offset random + pos += vec3(offset.x, offset.y, offset.z); + + // Make fishes swim to right + pos += vec3(0.0, 0.0, mod((random.z-0.5) * 50.0 - uTime*(1.5+random.x*2.0), 80.0) - 40.0); + + pos += vec3(0.0, 0.0, sin(pos.z)*0.2); + + // Pass varyings to frag shader + vUv = uv; + vMVPos = modelViewMatrix * vec4(pos, 1.0); + vNormal = normalize(position + random); + + gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0); + +} \ No newline at end of file diff --git a/src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.frag b/src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.frag new file mode 100644 index 0000000..d656243 --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.frag @@ -0,0 +1,83 @@ +precision highp float; +precision highp int; + +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x*34.0)+1.0)*x); +} + +float noise(vec2 v) { + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + // First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + + // Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} +uniform float uTime; +uniform vec3 uFogColor; + +varying vec2 vUv; +varying vec4 vMVPos; +varying vec3 vNormal; + + +void main() { + vec3 normal = normalize(vNormal); + float lighting = dot(normal, normalize(vec3(-0.3, 0.8, 0.6))); + vec3 color = vec3(0.2,0.3,0.2) * (1.0 - 0.5 * lighting); + + float dist = length(vMVPos); + float fog = smoothstep(15.0, 17.0, dist); + color = mix(color, uFogColor, fog)*(1.0-0.05*noise(vec2(vUv.x*50.0, vUv.y))); + + gl_FragColor.rgb = color; + gl_FragColor.a = 1.0; + +} diff --git a/src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.vert b/src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.vert new file mode 100644 index 0000000..a217391 --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/shaders/Seeweed.vert @@ -0,0 +1,124 @@ + +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x*34.0)+1.0)*x); +} + +float noise(vec2 v) { + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + // First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + + // Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +void rotate2d(inout vec2 v, float a){ + mat2 m = mat2(cos(a), -sin(a), sin(a), cos(a)); + v = m * v; +} + +attribute vec2 uv; +attribute vec3 position; +attribute vec3 normal; + +// Add instanced attributes just like any attribute +attribute vec3 offset; +attribute vec3 random; + +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; +uniform mat3 normalMatrix; + +uniform float uTime; +varying vec2 vUv; +varying vec3 vNormal; +varying vec3 vRandom; +varying vec4 vMVPos; +varying vec3 vPos; + +float smallWiggleSpeed = 10.0; + +void main() { + + vUv = uv; + vRandom = random; + + // copy position so that we can modify the instances + vec3 pos = position * (1.0 + random.y * 0.2); + + float alpha = 1.0 - (position.y * 2.0); + + // Taper towards the bottom + pos *= vec3(((2.1 - alpha) * (0.3 - random.x * 0.2) + noise(vec2(alpha*3.0, random.y))*0.1) * 0.5, 1.0, 1.0 ); + + // rotate around y axis + rotate2d(pos.xz, random.x * 6.28 + 4.0 * (random.y - 0.5) + noise(vec2(uTime*0.1+position.y*10.0, 1.0))*5.0); + + // Add some per object swiggle + pos += vec3(sin( uTime*4.0 + alpha *smallWiggleSpeed)*(random.z*0.05)*0.05+noise(vec2(position.y, random.x))*0.1, 0.0, sin(uTime*4.0 + alpha *smallWiggleSpeed)*(random.z*0.05)*0.05+noise(vec2(position.z, random.y))*0.1); + + // scale first + pos *= 2.0 + random.y * 1.0; + + // pos += vec3(sin(position.y*5.0+random.x*10.0) * 0.05, 0.0, 0.0); + + //Add some global wiggle + pos += vec3(noise(vec2(random.x*0.2, position.y+(1.0+noise(vec2(uTime*0.5, 1.0)*0.2))))*alpha*0.1, 0.0, 0.0); + + pos += offset; + + vPos = pos; + + vMVPos = modelViewMatrix * vec4(pos, 1.0); + + vNormal = normalize(position + random); + + gl_Position = projectionMatrix * vMVPos; +} \ No newline at end of file diff --git a/src/content/blog/zentralwerk_2051/fishes/shaders/helpers/noise.glsl b/src/content/blog/zentralwerk_2051/fishes/shaders/helpers/noise.glsl new file mode 100644 index 0000000..abc9d8d --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/shaders/helpers/noise.glsl @@ -0,0 +1,64 @@ +precision highp float; +precision highp int; + +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x*34.0)+1.0)*x); +} + +float noise(vec2 v) { + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + // First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + + // Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +#pragma glslify: export(noise) \ No newline at end of file diff --git a/src/content/blog/zentralwerk_2051/fishes/shaders/helpers/rotate2d.glsl b/src/content/blog/zentralwerk_2051/fishes/shaders/helpers/rotate2d.glsl new file mode 100644 index 0000000..9af18d2 --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/shaders/helpers/rotate2d.glsl @@ -0,0 +1,6 @@ +void rotate2d(inout vec2 v, float a){ + mat2 m = mat2(cos(a), -sin(a), sin(a), cos(a)); + v = m * v; +} + +#pragma glslify: export(rotate2d) diff --git a/src/content/blog/zentralwerk_2051/fishes/webgl-fishes.ts b/src/content/blog/zentralwerk_2051/fishes/webgl-fishes.ts new file mode 100644 index 0000000..3ceb844 --- /dev/null +++ b/src/content/blog/zentralwerk_2051/fishes/webgl-fishes.ts @@ -0,0 +1,106 @@ +import { + Camera, Color, Geometry, Mesh, Plane, Program, Renderer, Transform +} from "ogl"; + +const rand = (amount = 1) => amount * (Math.random() * 2 - 1); + +import FishModel from "./fishModel"; +import FishFrag from "./shaders/Fish.frag"; +import FishVert from "./shaders/Fish.vert"; +import SeeweedFrag from "./shaders/Seeweed.frag"; +import SeeweedVert from "./shaders/Seeweed.vert"; + +export default (canvas: HTMLCanvasElement, { amount = 100, color = new Color(0xffffff) }: { amount?: number, color?: Color } = {}) => { + const renderer = new Renderer({ + canvas, + antialias: true, + }); + + const { gl } = renderer; + + gl.clearColor(color.r, color.g, color.b, 1); + + const scene = new Transform(); + + const camParent = new Transform(); + const camera = new Camera(gl, { fov: 15 }); + camera.position.z = 15; + camera.setParent(camParent); + + camParent.setParent(scene); + + const fishAmount = 10; + let fishOffset = new Float32Array(fishAmount * 3); + let fishRandom = new Float32Array(fishAmount * 3); + for (let i = 0; i < fishAmount; i++) { + fishOffset.set([Math.random() * 10, rand(50.0), rand(10.0)], i * 3); + fishRandom.set([Math.random(), Math.random(), Math.random()], i * 3); + } + const fishMesh = new Mesh(gl, { + geometry: new Geometry(gl, { + ...FishModel, + offset: { instanced: 1, size: 3, data: fishOffset }, + random: { instanced: 1, size: 3, data: fishRandom }, + }), + program: new Program(gl, { + uniforms: { + uTime: { value: 0 }, + uFogColor: { value: color }, + }, + vertex: FishVert, + fragment: FishFrag, + cullFace: gl.NONE, + }), + }); + fishMesh.scale.scale(0.1); + fishMesh.position.y = 1.5; + fishMesh.rotation.set([Math.PI, Math.PI / 2, Math.PI / 2]); + fishMesh.setParent(scene); + + const program = new Program(gl, { + vertex: SeeweedVert, + fragment: SeeweedFrag, + cullFace: gl.NONE, + uniforms: { + uTime: { value: 0 }, + uFogColor: { value: color }, + uFogNear: { value: 50 }, + uFogFar: { value: 100 }, + }, + }); + + let offset = new Float32Array(amount * 3); + let random = new Float32Array(amount * 3); + for (let i = 0; i < amount; i++) { + offset.set([rand(3.3), rand(0.4), rand(2)], i * 3); + random.set([Math.random() * 5, Math.random() * 2, rand()], i * 3); + } + + const geometry = new Plane(gl, { + width: 0.1, + heightSegments: 8, + attributes: { + offset: { instanced: 1, size: 3, data: offset }, + random: { instanced: 1, size: 3, data: random }, + }, + }); + + const mesh = new Mesh(gl, { geometry, program }); + mesh.position.y = 1.5; + mesh.setParent(scene); + + return { + update: (t, timeOffset) => { + program.uniforms.uTime.value = t * 0.001 + timeOffset; + fishMesh.program.uniforms.uTime.value = t * 0.001; + renderer.render({ scene, camera }); + }, + resize: () => { + let height = window.innerHeight; + let width = window.innerWidth; + renderer.setSize(width, height); + gl.clearColor(color.r, color.g, color.b, 1); + camera.perspective({ aspect: gl.canvas.width / gl.canvas.height }); + }, + }; +}; diff --git a/src/content/blog/zentralwerk_2051/index.mdx b/src/content/blog/zentralwerk_2051/index.mdx new file mode 100644 index 0000000..6476a8a --- /dev/null +++ b/src/content/blog/zentralwerk_2051/index.mdx @@ -0,0 +1,33 @@ +--- +title: "Zentralwerk_2051" +date: 2021-01-07 +links: [["PDF", "/Zentralwerk_2051.pdf"]] +license: "CC-BY-SA:4.0" +comments: true +--- + +import Fishes from './Fishes.svelte'; + + + +Ich werde durch ein leichtes Vibrieren geweckt. Der Bildschirm in meinem Unterarm erinnert mich an meine bevorstehende Aufgabe und das Pochen in meiner Schläfe erinnert mich an den gestrigen Abend. Gestern war der 20.01., wir schreiben das Jahr 2051 und das Zentralwerk, mein Zuhause, hat Geburtstag gefeiert. Also eigentlich ist es nicht wirklich der Geburtstag, sondern der Tag, an dem vor ziemlich genau 30 Jahren das Urteil gefällt wurde, das die Stadt Köln das Otto-&-Langen-Quartier kaufen wird und zu einem Zukunftslabor umbaut. + +Nach einer kurzen Katzenwäsche mache ich mich auf den Weg. Ich bin eigentlich schon zu spät dran, deswegen muss ich mich ein bisschen beeilen. Auf dem Weg zur Farm treffe ich mein erstes Teammitglied. Alfie ist bei uns im Team für den Daten Ingress verantwortlich. Wir sind das Team Victoria, offiziell heißen wir eigentlich DataLake3 aber das war uns zu technisch und rollt auch irgendwie nicht so gut von der Zunge. Wir arbeiten eng mit den Datenfarmern zusammen und sind dafür verantwortlich, die Unmengen an Daten die sie von ihren unzähligen Sensoren bekommen, abzuspeichern, zu strukturieren und erste Analysen zu machen. + +Auf dem Weg zur Farm laufen wir durch unser Atrium, wo eine kleine Herde an Cleanbots gerade den Boden reinigt und die letzten Reste des gestrigen Festes beseitigt. Danach geht es vorbei an den Aquaponikanlagen – eines meiner Lieblingsareale. Oft verbringe ich hier meine Nachmittage, während ich den Tilapia Barschen dabei zu­sehe, wie sie in den großen gläsernen Becken durch die Wurzeln der auf der Oberfläche wachsenden Tomaten, Karotten und Gurken streifen. Manchmal habe ich dann das Gefühl, das die Fische irgendwas vom Leben verstanden haben, wofür wir Menschen noch nicht bereit sind. Sie wissen nicht was Besitz oder was „Wollen“ ist, sondern ziehen einfach endlose Bahnen durch die weißlichen Wurzeln, mit der Hoffnung etwas Ess­bares zu finden. + +Die Sonne steht schon hoch am Himmel, aufgrund des Festes wurden alle Aufgaben etwas nach hinten verschoben, als wir die Möhring-Halle erreichen. Diese Halle ist etwas Besonderes. Hier wurde vor mehr als 180 Jahren der erste Otto-Motor entwickelt der die Menschheit in ein neues Zeitalter katapultierte. Etwa um diese Zeit schrieb Gottfried Daimler „Von hier aus wird ein Stern aufgehen.“ Viele von den älteren Menschen, die die Entstehungsphase des Zentralwerks im Jahr 2025 miterlebt haben, erzählen oft aus dieser Zeit und wenn man ihnen dabei aufmerksam zuhört, kann man den Stern vor ihrem inneren Auge emporsteigen sehen. Heute existieren nur noch die äußeren Mauern der Halle, im Inneren hängen wie große Kokons unsere Arbeitsräume. Über Treppen und Brücken erreichen wir etwas verspätet Raum13, in dem uns unser Team mit leicht missbilligenden Blicken empfängt. Henri, unser Team Lead schüttelt leicht den Kopf, aber ich weiß genau, dass er uns beiden mag und außerdem hat er gestern auch das ein oder andere Glas mitgetrunken. + +Alfie und ich experimentieren schon seit längerem mit dem Fermentieren von verschiedenen Getreidesorten und zur Ehre des Festes haben wir das erste Mal das Ergebnis unserer Experimente ausprobiert. Einige der Älteren hatten dann erzählt das unsere Stadt früher dafür berühmt war auf ähnliche Art und Weise ein Getränk namens „Kölsch“ herzustellen, welches man dann zu bestimmten Anlässen in großen Mengen zu sich nahm. Ich fand die Vorstellung das eine ganze Stadt für ein Getränk berühmt ist etwas absurd. Außerdem muss ich zugeben, dass wir keine Ahnung hatten wie sehr die Wirkung des Getränkes uns noch bis in den nächsten Tag begleitet. + +Henri eröffnet das Meeting und schickt uns unsere heutigen Aufgabe. Ich lasse mir die Aufgaben auf meinem Iris-Display kurz anzeigen, glücklicherweise ist heute nicht allzu viel los. Ein paar der Wasserqualitäts-Sensoren scheinen komische Daten zu senden außerdem müssen wir uns auf unser halbjährliches Rollover vorbereiten, bei dem wir die Daten aus dem DataLake auf Glasscheiben brennen, die die Bauteams dann in den Gewächshäusern verbauen. Alfie kümmert sich zusammen mit Sonya, unserer Hardware Spezialistin um die Wasserqualitäts-Sensoren. Wir mussten vor einigen Monaten große Teile unserer Funksensoren durch kabelgebundene Sensoren ersetzen, da stärker gewordenen Sonnenwinde die drahtlose Kommunikation schwierig machten und einige der neuen Sensoren noch ab und zu Probleme hatten. + +Ich bearbeite heute eine Anfrage der Arbeiter\*innen aus der Recyclinganlage. Dort werden in mehreren großen Tanks unserer Abfälle durch Bakterien zersetzt und zu Methangas umgewandelt. Das Team experimentiert schon seit mehreren Monaten mit einer neu gezüchteten Variante der Familie _Ideonella_. Seit ein paar Wochen war der Output an Methangas deutlich gesunken und sie wollten der Sache auf den Grund gehen. Bei einer ersten Analyse schienen die Werte größtenteils in einem kleinen Bereich zu fluktuieren, Redoxpotential, Stickstoffgehalt, Druck und Temperatur waren alle nominal. Ich war erst einmal ratlos, also tat ich was ich immer tue, wenn ich ratlos bin, und machte mich auf den Weg zum alten Gernot. + +Viele Leute mochten ihn nicht sehr, da er vielleicht zu oft, über die „guten alten“ Tage sprach und manchmal ein wenig melancholisch war. Gernot war 2030 zur Zeit des großen Crashes zu Besuch im Zentralwerk und ist dann einfach geblieben, vorher war er Französischlehrer an einer kleinen Schule in einem kleinen Ort in Frankreich, dessen Namen ich mir nie merken konnte. Und er sammelte gerne Wissen. Er hatte ein äußerst gutes Gedächtnis, aber eine noch bessere Sammlung an Glasscheiben und Büchern. Wenn man ihm eine Frage stellte, konnte er stundenlang erzählen, bis man irgendwann vergaß, was man ihn überhaupt gefragt hatte. Er erzählte Geschichten von Unternehmen, die so groß waren das sie mehr Macht als ganze Regierungen hatten, wie man sich Pakete in wenigen Tage um die ganze Welt schicken konnte und wie die meisten Menschen den Großteil ihres Lebens im Cyberspace verbrachten. Aber er erzählte euch von der Zeit nach dem Crash, als ein fast unscheinbares Ereignis das globale Kartenhaus von Abhängigkeiten zu Fall brachte. Wie die Menschen Jahre brauchten, bis sie sich auf die neue Realität eingestellt hatten, damals nannte man diesen Prozess die Regionalisierung. Nachdem die Globalisierung alle Teile der Welt zu einem untrennbaren Woll­knäuel aus Abhängigkeiten gemacht und für große Ungerechtigkeiten gesorgt hatte, führte die Regionalisierung die Menschen wieder zu einer etwas ursprünglicheren Lebensart zurück. Viele Menschen mussten komplett neu lernen mit Ressourcen umzugehen, da die Supermärkte keine Lieferungen erhielten, mussten die Menschen wieder lernen Ackerbau zu betreiben und Lebensmittel selbst einzulagern. Gernot ist einer der wenigen Menschen die über diese Zeit reden, ich denke für viele andere ist sie mit zu vielen schlechten Erinnerungen verbunden. + +Als ich seine Wohneinheit erreichte, hörte ich schon aus der Ferne, das er wieder Musik hörte. Die wenigen Menschen die heutzutage noch Musik hörten taten dies über subdermale Implantate, aber aus irgendeinem Grund zog Gernot sogenannte Youtube Videos vor. Er hatte schon vor dem Crash mehrere Terrabytes an Videos auf alten Magnet Festplatten gespeichert, die er hin und wieder zur Frustration seiner Nachbarn über ein mindestens ebenso altes Stereo System abspielte. Heute lief eines meiner persönlichen Lieblingsmixtapes „[japanese jazz when driving on a warm night](https://www.youtube.com/watch?v=G68Q4lCM5pQ)“. Als ich seine Tür öffnete, saß er tief über ein altes MacBook gebeugt, dessen Bauteile über seinen gesamten Tisch verstreut waren. Er rief mich zu sich und fing an begeistert darüber zu reden was für ein Meisterwerk der damaligen Technik dieses Gerät gewesen war und wie die Menschen in ewigen Schlangen standen um eins dieser Geräte zu erwerben. Aus irgendeinem Grund funktionierte aber das Display nicht mehr. Ich konnte mir eigentlich nicht vorstellen wie die Menschen damals scheinbar so begeistert von einem so klobig aussehenden Stück Technik sein konnten, wollte ihn in seiner Begeisterung aber auch nicht bremsen. Als er kurz aufsah, fragte ich ihn, ob er irgendwelche Bücher über Bakterien habe. „Bakterien? Bist du krank?“ fragte er, „nein, keine Sorge, ich recherchiere nur gerade für etwas“. Ich folgte ihm in sein Archiv, eigentlich eine alte Wohnung die nicht länger gebraucht wurde, und sah ihm dabei zu wie er scheinbar zufällig ausgewählte Bücher und Glasplatten aus irgendwelchen Stapeln zog. Nach einiger Zeit zog er das „INTERNATIONAL JOURNAL OF SYSTEMATIC AND EVOLUTIONARY MICROBIOLOGY Volume 66, Issue 8″ aus einem Stapel hervor und reichte es mir. Unter dem Titel stand „First Published: 01 August 2016″. Oh Mann, das ist mehr als 30 Jahre alt, ob die Informationen überhaupt noch gültig waren? + +Zum Abschied überreichte mir Gernot ein kleines schwarzes Gerät mit einem Y-förmigen Kabel und sagte „Das ist ein MP3-Player“, er erklärte das man sich die Enden des Kabels in sein Ohr steckte und welche Knöpfe man drücken muss damit es funktioniert, ich bedankte mich, überließ Gernot wieder seinem MacBook und setze mich mit dem Buch auf eine Bank bei den Aquaponikbecken. Zum Glück hatte ich anscheinend genau das richtige Buch gewählt, denn es handelte auch von dem Bakterium _Ideonella_. Anscheinend wurde es 2016 von einem Team japanischer Mikrobiologen, unter der Leitung von Somboon Tanasupawat, in Japan in der Stadt Sakai entdeckt. Die Wissenschaftler waren auf Mülldeponien gegangen und hatten dort Bakterien von PET Flaschen gesammelt. Ich wusste nicht genau was eine Mülldeponie war, aber ich hatte schon oft die Recyclingteams über PET reden hören. Ich nahm mir vor Gernot bei nächster Gelegenheit zu fragen, was genau eine Mülldeponie ist. Nach ein paar Minuten wurde ich dann fündig, „It grew within the pH range 5.5–9.0 (optimally at pH 7–7.5)“. Ich klappte das Buch zu und machte mich auf zu Raum13, um die PH Werte der Recyclinganlage zu überprüfen. Ziemlich schnell hatte ich herausgefunden, das aufgrund der Experimente mit der Sauerstoffzufuhr der PH Wert unter 4 gesunken war, was den Rückgang der Methanproduktion erklärte und schickte meine Ergebnisse an das Recyclingteam. + +Es wurde schon etwas kühler während die Sonne lange Schatten über die Gebäude warf und sich das Licht immer oranger färbte. Aus einer spontanen Laune heraus rief ich Alfie an und fragte, ob sie Lust hätte zum Dach zu kommen. Wir hatten vor einiger Zeit eine alte fast überwachsene Leiter entdeckt, die definitiv keine Sicherheitsüberprüfung schaffen würde, aber sie führte zu einem kleinen Vordach von dem aus man einen super Überblick über den Mülheimer Hafen, den Rhein und den Dom hatte. Während ich noch versuchte zu verstehen wie dieses MP3 Ding funktionieren sollte, kam sie mit zwei Flaschen in der Hand die Leiter hochgeklettert. Es war noch ein sehr angenehmer Abend während wir Songs aus den 2010ner Jahren hörten und die Sonne langsam hinter dem Dom unterging. diff --git a/src/content/config.ts b/src/content/config.ts index 992e7ab..1cdd6b4 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -3,8 +3,8 @@ import { defineCollection, z } from 'astro:content'; const blogCollection = defineCollection({ schema: z.object({ title: z.string(), - author: z.string(), - date: z.date() + date: z.date(), + headerImg: z.string().optional() }) }); diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index 11f0028..60d81a7 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -10,16 +10,22 @@ export const ui = { en: { "en": "English", "de": "Deutsch", - 'nav.home': 'Home', + 'home.title': 'Hi, I’m Max :)', + 'home.subtitle': 'Trained Media Designer, Blender Nerd, Developer and Hardware Tinkerer.', 'nav.blog': 'Blog', - 'nav.about': 'About', + 'nav.projects': 'Projects', + 'nav.videos': 'Videos', + 'nav.photos': 'Photos', }, de: { "en": "English", "de": "Deutsch", - 'nav.home': 'Home', + 'home.title': 'Hi, ich bin Max :)', + 'home.subtitle': 'Ausgebildeter Mediengestalter, Blender Nerd, Entwickler und Hardware Bastler.', 'nav.blog': 'Blog', - 'nav.about': 'Über', + 'nav.projects': 'Projekte', + 'nav.videos': 'Videos', + 'nav.photos': 'Fotos', }, } as const; diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index d8a549a..1259c09 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,11 +1,13 @@ --- import LanguagePicker from "../components/LanguagePicker.astro"; +import { AstroFont } from "astro-font"; import Nav from "../components/Nav.astro"; interface Props { title: string; + width?: "full" | "compact"; } -const { title } = Astro.props; +const { title, width = "compact" } = Astro.props; --- @@ -15,6 +17,38 @@ const { title } = Astro.props; + span", + fallback: "serif", + }, + ]} + /> @@ -33,9 +67,20 @@ const { title } = Astro.props; })(); - -