From fd64d9491d13be1bd60b2f00c15ac4fdedcfc63b Mon Sep 17 00:00:00 2001 From: schmelczerandras Date: Sun, 20 Sep 2020 20:15:27 +0200 Subject: [PATCH] Update project --- .github/workflows/main.yaml | 50 ++++++++++ Dockerfile | 5 +- README.md | 2 +- docker-compose.yml | 31 +++++++ package.json | 15 +-- src/helper/pretty-print.ts | 2 + src/index.html | 28 ++---- src/index.ts | 11 ++- src/scenes/{ => blob}/blob-scene.ts | 56 +++++++---- src/scenes/blob/blob.ts | 139 ++++++++++++++++++++++++++++ src/scenes/rain/rain-scene.ts | 20 ++-- src/scenes/tunnel-scene.ts | 7 +- static/logo-white.svg | 10 +- static/og-image.jpg | Bin 0 -> 35516 bytes tsconfig.json | 4 +- webpack.config.js | 30 +++--- 16 files changed, 311 insertions(+), 99 deletions(-) create mode 100644 .github/workflows/main.yaml create mode 100644 docker-compose.yml create mode 100644 src/helper/pretty-print.ts rename src/scenes/{ => blob}/blob-scene.ts (51%) create mode 100644 src/scenes/blob/blob.ts create mode 100644 static/og-image.jpg diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml new file mode 100644 index 0000000..c5782ad --- /dev/null +++ b/.github/workflows/main.yaml @@ -0,0 +1,50 @@ +name: Deploy everything +on: + push: + branches: + - main +env: + CONTAINER_REGISTRY: schmelczera + DOMAIN: schmelczer.dev + PROJECT_NAME: sdf-2d-demo + +jobs: + build-frontend: + runs-on: ubuntu-latest + steps: + - name: Checkout current branch with lfs + uses: actions/checkout@main + with: + lfs: true + + - name: Setup auth tokens + run: | + docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push frontend + run: | + docker build . -t $CONTAINER_REGISTRY/$PROJECT_NAME + docker push $CONTAINER_REGISTRY/$PROJECT_NAME + + deploy: + runs-on: ubuntu-latest + needs: + - build + steps: + - name: Checkout current branch with lfs + uses: actions/checkout@main + with: + lfs: true + + - name: Setup auth tokens + run: | + # SSH key + mkdir ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 + chmod 400 ~/.ssh/id_ed25519 + ssh -o StrictHostKeyChecking=no root@$DOMAIN uptime + + - name: Stack deploy + run: | + DOCKER_HOST=ssh://root@$DOMAIN docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} + DOCKER_HOST=ssh://root@$DOMAIN docker stack deploy $PROJECT_NAME -c docker-compose.yml --with-registry-auth diff --git a/Dockerfile b/Dockerfile index d7c92e0..b0b745e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,12 +7,11 @@ WORKDIR /home/node COPY src src COPY static static -COPY package.json custom.d.ts tsconfig.json webpack.config.js ./ +COPY package.json tsconfig.json webpack.config.js ./ RUN npm install RUN npm run build - FROM nginx:alpine HEALTHCHECK --interval=1m --timeout=10s CMD curl --fail http://localhost/ || exit 1 @@ -22,7 +21,7 @@ WORKDIR /usr/share/nginx/html RUN rm -rf * COPY --from=build-webpage /home/node/dist . COPY --from=build-error-pages /home/python/built errors -RUN find . -type f | xargs gzip -k9 &&\ +RUN find . -type f | xargs gzip -k9 &&\ chmod -R 555 . COPY nginx-config /etc/nginx/ diff --git a/README.md b/README.md index 89f655e..e1ff961 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -logo +logo # SDF-2D demo diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..503b7ee --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3.8" + +services: + sdf-2d-demo: + init: true + image: schmelczera/sdf-2d-demo + networks: + - network + deploy: + replicas: 3 + resources: + limits: + cpus: "0.1" + memory: 16M + reservations: + cpus: "0.1" + memory: 16M + placement: + max_replicas_per_node: 1 + update_config: + parallelism: 1 + failure_action: rollback + delay: 10s + monitor: 10s + restart_policy: + condition: on-failure + window: 30s + +networks: + network: + driver: overlay diff --git a/package.json b/package.json index 0a7767a..d569df2 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "start": "webpack-dev-server --mode development", "lint": "npx eslint --fix \"src/**/*.ts\" && npx prettier --write \"src/**/*.ts\"", - "build": "webpack --mode production && find dist -type f -not -regex \"dist\\/.*\\.\\(html\\|png\\|ico\\|svg\\|jpg\\)\" | xargs rm && sed -i 's/^\\/\\/#.*.map//' dist/index.html" + "build": "rm -rf dist/* && webpack --mode production && find dist -type f -not -regex \"dist\\/.*\\.\\(html\\|png\\|ico\\|svg\\|jpg\\)\" | xargs rm && sed -i 's/^\\/\\/#.*.map//' dist/index.html" }, "keywords": [], "author": "AndrĂ¡s Schmelczer (https://schmelczer.dev/)", @@ -20,19 +20,12 @@ "browserslist": [ "defaults" ], - "sideEffects": [ - "*.scss", - "*.png", - "*.jpg", - "*.ico", - "*.svg" - ], - "optimization": { - "usedExports": true - }, + "sideEffects": false, "devDependencies": { "@typescript-eslint/eslint-plugin": "^3.10.1", "@typescript-eslint/parser": "^3.10.1", + "@types/gl-matrix": "^2.4.5", + "gl-matrix": "^3.3.0", "autoprefixer": "^9.8.6", "css-loader": "^3.5.2", "eslint": "^7.9.0", diff --git a/src/helper/pretty-print.ts b/src/helper/pretty-print.ts new file mode 100644 index 0000000..4b21da7 --- /dev/null +++ b/src/helper/pretty-print.ts @@ -0,0 +1,2 @@ +export const prettyPrint = (o: any): string => + JSON.stringify(o, (_, v) => (v.toFixed ? Number(v.toFixed(2)) : v), ' '); diff --git a/src/index.html b/src/index.html index 8fced4c..b87696b 100644 --- a/src/index.html +++ b/src/index.html @@ -2,37 +2,23 @@ - SDF-2D demo - - + + - + + + + + - - - diff --git a/src/index.ts b/src/index.ts index 174c780..41012d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,15 +3,18 @@ import '../static/favicons/apple-touch-icon.png'; import '../static/favicons/favicon-16x16.png'; import '../static/favicons/favicon-32x32.png'; import '../static/favicons/favicon.ico'; -//import '../static/og-image.jpg'; +import '../static/logo-white.svg'; +import '../static/og-image.jpg'; import { DeltaTimeCalculator } from './helper/delta-time-calculator'; import { removeUnnecessaryOutlines } from './helper/remove-unnecessary-outlines'; -import { BlobScene } from './scenes/blob-scene'; +import { BlobScene } from './scenes/blob/blob-scene'; +import { RainScene } from './scenes/rain/rain-scene'; import { Scene } from './scenes/scene'; +import { TunnelScene } from './scenes/tunnel-scene'; import './styles/index.scss'; -const scenes = [/*TunnelScene, RainScene*/ BlobScene]; -const sceneIntervalInSeconds = 80000; +const scenes = [TunnelScene, RainScene, BlobScene]; +const sceneIntervalInSeconds = 8; glMatrix.setMatrixArrayType(Array); removeUnnecessaryOutlines(); diff --git a/src/scenes/blob-scene.ts b/src/scenes/blob/blob-scene.ts similarity index 51% rename from src/scenes/blob-scene.ts rename to src/scenes/blob/blob-scene.ts index 03e4192..a0bca48 100644 --- a/src/scenes/blob-scene.ts +++ b/src/scenes/blob/blob-scene.ts @@ -1,6 +1,8 @@ -import { vec3 } from 'gl-matrix'; +import { vec2, vec3 } from 'gl-matrix'; import { Circle, CircleLight, compile, InvertedTunnel, Renderer } from 'sdf-2d'; -import { Scene } from './scene'; +import { prettyPrint } from '../../helper/pretty-print'; +import { Scene } from '../scene'; +import { Blob } from './blob'; export class BlobScene implements Scene { private renderer: Renderer; @@ -19,25 +21,33 @@ export class BlobScene implements Scene { this.renderer = await compile( canvas, [ - { - ...InvertedTunnel.descriptor, - shaderCombinationSteps: [0, 1, 2, 4, 8, 12], - }, Circle.descriptor, { ...CircleLight.descriptor, - shaderCombinationSteps: [1, 2, 3, 4, 5, 6, 7], + shaderCombinationSteps: [1, 2], }, + Blob.descriptor, ], - [vec3.fromValues(0.4, 1, 0.6), vec3.fromValues(1, 1, 0), vec3.fromValues(0.3, 1, 1)] + [ + vec3.fromValues(0, 0, 0), + vec3.fromValues(224 / 255, 96 / 255, 126 / 255), + vec3.fromValues(119 / 255, 173 / 255, 120 / 255), + ] ); this.renderer.setRuntimeSettings({ ambientLight: vec3.fromValues(0.35, 0.1, 0.45), - shadowLength: 550, + shadowLength: 800, }); + + const { width, height } = this.canvas.getBoundingClientRect(); + const length = vec2.length([width, height]); + + this.blob = new Blob([width / 2, -length / 4 + length / 2]); } + private blob: Blob; + private deltaSinceStart = 0; public drawNextFrame( currentTime: DOMHighResTimeStamp, @@ -48,20 +58,28 @@ export class BlobScene implements Scene { this.renderer.setViewArea([0, height], [width, height]); this.renderer.autoscaleQuality(deltaTime); - this.overlay.innerText = JSON.stringify( - this.renderer.insights, - (_, v) => (v.toFixed ? Number(v.toFixed(2)) : v), - ' ' - ); + this.overlay.innerText = prettyPrint(this.renderer.insights); - const q = (this.deltaSinceStart % 5000) / 2500; - console.log(q); + const length = vec2.length([width, height]); + const q = (this.deltaSinceStart % 8000) / 4000; + this.blob.animate(this.deltaSinceStart); [ - new Circle([width / 2, -width / 4], width / 2), - new CircleLight([q * width, Math.sin(q * Math.PI) * height], [1, 0.8, 0], 1), + new Circle([width / 2, -length / 4], length / 2), + this.blob, new CircleLight( - [(q - 1) * width, Math.sin((q - 1) * Math.PI) * height], + [ + (Math.cos((1 - q) * Math.PI) * length) / 2 + width / 2, + (Math.sin((1 - q) * Math.PI) * length) / 2, + ], + [1, 0.8, 0], + 1 + ), + new CircleLight( + [ + (Math.cos(-q * Math.PI) * length) / 2 + width / 2, + (Math.sin(-q * Math.PI) * length) / 2, + ], [0, 0.8, 1], 1 ), diff --git a/src/scenes/blob/blob.ts b/src/scenes/blob/blob.ts new file mode 100644 index 0000000..50409bf --- /dev/null +++ b/src/scenes/blob/blob.ts @@ -0,0 +1,139 @@ +import { mat2d, vec2 } from 'gl-matrix'; +import { Circle, Drawable, DrawableDescriptor } from 'sdf-2d'; + +export class Blob extends Drawable { + public static descriptor: DrawableDescriptor = { + sdf: { + shader: ` + uniform struct { + vec2 headCenter; + vec2 leftFootCenter; + vec2 rightFootCenter; + float headRadius; + float footRadius; + float k; + }[BLOB_COUNT] blobs; + + float smoothMin(float a, float b) + { + const float k = 80.0; + float res = exp2( -k*a ) + exp2( -k*b ); + return -log2( res )/k; + } + + float circleDistance(vec2 circleCenter, float radius) { + return distance(position, circleCenter) - radius; + } + + void blobMinDistance(inout float minDistance, inout float color) { + for (int i = 0; i < BLOB_COUNT; i++) { + float headDistance = circleDistance(blobs[i].headCenter, blobs[i].headRadius); + float leftFootDistance = circleDistance(blobs[i].leftFootCenter, blobs[i].footRadius); + float rightFootDistance = circleDistance(blobs[i].rightFootCenter, blobs[i].footRadius); + + float res = min( + smoothMin(headDistance, leftFootDistance), + smoothMin(headDistance, rightFootDistance) + ); + + minDistance = min(minDistance, res); + color = mix(1.0, color, step(distanceNdcPixelSize + SURFACE_OFFSET, res)); + } + } + `, + distanceFunctionName: 'blobMinDistance', + }, + uniformName: 'blobs', + uniformCountMacroName: 'BLOB_COUNT', + shaderCombinationSteps: [1], + empty: new Blob(vec2.fromValues(0, 0)), + }; + + public readonly boundingCircleRadius = 200; + + protected readonly headRadius = 70; + protected readonly footRadius = 30; + + private readonly headOffset = vec2.fromValues(0, 120); + private leftFootOffset = vec2.fromValues(-30, this.footRadius); + private rightFootOffset = vec2.fromValues(30, this.footRadius); + + private leftFootOffsetDefault = vec2.fromValues(-30, this.footRadius); + private rightFootOffsetDefault = vec2.fromValues(30, this.footRadius); + + protected boundingCircle = new Circle(vec2.create(), this.boundingCircleRadius); + protected head = new Circle(vec2.create(), this.headRadius); + protected leftFoot = new Circle(vec2.create(), this.footRadius); + protected rightFoot = new Circle(vec2.create(), this.footRadius); + + public constructor(private center: vec2) { + super(); + this.position = center; + } + + public set position(value: vec2) { + vec2.copy(this.boundingCircle.center, value); + vec2.add(this.head.center, value, this.headOffset); + vec2.add(this.leftFoot.center, value, this.leftFootOffset); + vec2.add(this.rightFoot.center, value, this.rightFootOffset); + } + + public animate(time: number) { + const offset = 20; + const q = (time % 1000) / 500; + + vec2.subtract( + this.rightFootOffset, + this.rightFootOffsetDefault, + vec2.fromValues(q * offset, 0) + ); + + vec2.subtract( + this.leftFootOffset, + this.leftFootOffsetDefault, + vec2.fromValues(q * offset, 0) + ); + + vec2.add( + this.rightFootOffset, + this.rightFootOffset, + vec2.fromValues( + Math.min(1, q) * offset * 2, + Math.sin(Math.min(1, q) * Math.PI) * 10 + ) + ); + + vec2.add( + this.leftFootOffset, + this.leftFootOffset, + vec2.fromValues( + (q > 1 ? q - 1 : 0) * offset * 2, + Math.sin((q > 1 ? q - 1 : 0) * Math.PI) * 10 + ) + ); + + this.position = this.center; + } + + public minDistance(target: vec2): number { + return this.boundingCircle.minDistance(target); + } + + protected getObjectToSerialize(transform2d: mat2d, transform1d: number): any { + return { + headCenter: vec2.transformMat2d(vec2.create(), this.head.center, transform2d), + leftFootCenter: vec2.transformMat2d( + vec2.create(), + this.leftFoot.center, + transform2d + ), + rightFootCenter: vec2.transformMat2d( + vec2.create(), + this.rightFoot.center, + transform2d + ), + headRadius: this.headRadius * transform1d, + footRadius: this.footRadius * transform1d, + }; + } +} diff --git a/src/scenes/rain/rain-scene.ts b/src/scenes/rain/rain-scene.ts index 1b39475..f2e5307 100644 --- a/src/scenes/rain/rain-scene.ts +++ b/src/scenes/rain/rain-scene.ts @@ -1,5 +1,6 @@ import { vec2, vec3 } from 'gl-matrix'; import { CircleLight, compile, Renderer, Tunnel } from 'sdf-2d'; +import { prettyPrint } from '../../helper/pretty-print'; import { Scene } from '../scene'; import { Droplet } from './droplet'; @@ -7,7 +8,7 @@ export class RainScene implements Scene { private droplets: Array = []; private light1: CircleLight = new CircleLight( vec2.create(), - vec3.fromValues(1, 0, 1), + vec3.fromValues(0.5, 0, 1), 1 ); private light2: CircleLight = new CircleLight( @@ -20,12 +21,6 @@ export class RainScene implements Scene { private canvas: HTMLCanvasElement; private overlay: HTMLDivElement; - public constructor() { - for (let i = 0; i < 40; i++) { - this.droplets.push(new Droplet()); - } - } - public async initialize( canvas: HTMLCanvasElement, overlay: HTMLDivElement @@ -51,6 +46,10 @@ export class RainScene implements Scene { ambientLight: vec3.fromValues(0.45, 0.25, 0.45), tileMultiplier: 10, }); + + for (let i = 0; i < (canvas.getBoundingClientRect().width / 1000) * 20; i++) { + this.droplets.push(new Droplet()); + } } public drawNextFrame( @@ -60,12 +59,7 @@ export class RainScene implements Scene { const { width, height } = this.canvas.getBoundingClientRect(); this.renderer.setViewArea(vec2.fromValues(0, height), vec2.fromValues(width, height)); this.renderer.autoscaleQuality(deltaTime); - - this.overlay.innerText = JSON.stringify( - this.renderer.insights, - (_, v) => (v.toFixed ? Number(v.toFixed(2)) : v), - ' ' - ); + this.overlay.innerText = prettyPrint(this.renderer.insights); const viewAreaSize = this.renderer.viewAreaSize; diff --git a/src/scenes/tunnel-scene.ts b/src/scenes/tunnel-scene.ts index a687384..488b160 100644 --- a/src/scenes/tunnel-scene.ts +++ b/src/scenes/tunnel-scene.ts @@ -2,6 +2,7 @@ import { vec2, vec3 } from 'gl-matrix'; import { CircleLight, compile, InvertedTunnel, Renderer } from 'sdf-2d'; import { clamp } from '../helper/clamp'; import { last } from '../helper/last'; +import { prettyPrint } from '../helper/pretty-print'; import { Random } from '../helper/random'; import { Scene } from './scene'; @@ -101,11 +102,7 @@ export class TunnelScene implements Scene { ); this.renderer.autoscaleQuality(deltaTime); - this.overlay.innerText = JSON.stringify( - this.renderer.insights, - (_, v) => (v.toFixed ? Number(v.toFixed(2)) : v), - ' ' - ); + this.overlay.innerText = prettyPrint(this.renderer.insights); [ ...this.tunnels.filter( diff --git a/static/logo-white.svg b/static/logo-white.svg index 3569c14..bb36e19 100644 --- a/static/logo-white.svg +++ b/static/logo-white.svg @@ -2,18 +2,18 @@ - + - + - + - + @@ -33,7 +33,7 @@ attributeName="transform" type="rotate" values="0;90" - dur="8s" + dur="10s" repeatCount="indefinite" /> diff --git a/static/og-image.jpg b/static/og-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93c8001e1d03cf307a3c7c05b2a07daaa07a2fb8 GIT binary patch literal 35516 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