From 3d6de0b9c876d01923b985b1af3a48cc0e70814f Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Thu, 5 Jan 2023 15:47:27 +0100 Subject: [PATCH] Transparent multiplayer!?! --- .gitignore | 1 + config/common.pr | 1 + config/scene.pr | 9 ++ package.json | 4 +- protocols/schemas/shapes.prs | 31 ++++++ scene/README.md | 1 + scene/example.pr | 19 ++++ src/engine.ts | 35 ++++--- src/index.ts | 62 ++++++----- src/shapes.ts | 194 +++++++++++++++++++++++++++++++++++ textures/grass-256x256.jpg | Bin 0 -> 62236 bytes tsconfig.json | 1 + yarn.lock | 22 ++-- 13 files changed, 326 insertions(+), 54 deletions(-) create mode 100644 config/scene.pr create mode 100644 scene/README.md create mode 100644 scene/example.pr create mode 100644 textures/grass-256x256.jpg diff --git a/.gitignore b/.gitignore index 557d2fc..942c9c1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /node_modules /src.ts/ /src/gen/ +/tsconfig.tsbuildinfo diff --git a/config/common.pr b/config/common.pr index d3e29fb..2cec067 100644 --- a/config/common.pr +++ b/config/common.pr @@ -10,6 +10,7 @@ ; Create a dataspace entity, and register it with the gatekeeper with name `"syndicate"` and an ; empty secret key: let ?ds = dataspace + ? [ diff --git a/config/scene.pr b/config/scene.pr new file mode 100644 index 0000000..91140cb --- /dev/null +++ b/config/scene.pr @@ -0,0 +1,9 @@ +let ?sceneDs = dataspace + +> + +? [ + $ds [ + + ] +] diff --git a/package.json b/package.json index 800ffd9..33631f4 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,11 @@ "devDependencies": { "@preserves/core": "*", "@preserves/schema": "*", + "@rollup/plugin-node-resolve": "15.0", "@syndicate-lang/ts-plugin": "*", "@syndicate-lang/tsc": "*", - "@rollup/plugin-node-resolve": "15.0", - "rollup-plugin-sourcemaps": "0.6", "rollup": "3.8", + "rollup-plugin-sourcemaps": "0.6", "tslib": "2.4", "typescript": "4.9", "typescript-language-server": "3.0" diff --git a/protocols/schemas/shapes.prs b/protocols/schemas/shapes.prs index a17a342..0b0f1fc 100644 --- a/protocols/schemas/shapes.prs +++ b/protocols/schemas/shapes.prs @@ -1 +1,32 @@ version 1 . + +Sprite = . + +Shape = Sphere / Box / Light / Ground / Scale / Move / Rotate / @many [Shape ...] / Texture / Color / Name / Floor . + +Sphere = . +Box = . +Light = . +Ground = . + +Vector2 = . +Vector3 = . +Quaternion = . + +Scale = . +Move = . +Rotate = @euler / @quaternion . + +Texture = +/ @simple +/ @uv +. + +Color = +/ @opaque +/ @transparent +. + +Name = . + +Floor = . diff --git a/scene/README.md b/scene/README.md new file mode 100644 index 0000000..13f787e --- /dev/null +++ b/scene/README.md @@ -0,0 +1 @@ +For scene files. diff --git a/scene/example.pr b/scene/example.pr new file mode 100644 index 0000000..aa31c2d --- /dev/null +++ b/scene/example.pr @@ -0,0 +1,19 @@ +>> + + + + >>>> + + + >>>> + + + >>>> + +[] diff --git a/src/engine.ts b/src/engine.ts index 5492131..60e01f9 100644 --- a/src/engine.ts +++ b/src/engine.ts @@ -1,11 +1,11 @@ import { - AbstractMesh, DualShockPad, Engine, FreeCamera, FreeCameraGamepadInput, Gamepad as b_Gamepad, Mesh, + Quaternion, Scene, Vector3, } from '@babylonjs/core/Legacy/legacy'; @@ -58,16 +58,17 @@ if ((navigator as any).oscpu?.startsWith('Linux')) { }; } -export type CreateScene = (canvas: HTMLCanvasElement, engine: Engine) => Promise<{ +export type CreateScene = (canvas: HTMLCanvasElement, engine: Engine) => Promise; +export type CreatedScene = { scene: Scene, - floorMeshes: Mesh[] -}>; + floorMeshes: () => Mesh[] +}; export async function startEngine( createScene: CreateScene, initialPos = new Vector3(0, 1.6, 0), initialRotation = new Vector3(0, 0, 0).scaleInPlace(2 * Math.PI), -): Promise { +): Promise { const canvas = document.getElementById("renderCanvas") as HTMLCanvasElement; const engine = new Engine(canvas, true); const { scene, floorMeshes } = await createScene(canvas, engine); @@ -99,12 +100,6 @@ export async function startEngine( camera.applyGravity = true; camera.ellipsoid = new Vector3(0.25, 0.8, 0.25); - scene.getNodes().forEach(n => { - if (n instanceof AbstractMesh) { - n.checkCollisions = true; - } - }); - const enableVR = () => { if (xrAvailable) { xr.baseExperience.enterXRAsync('immersive-vr', 'local').then(() => { @@ -117,6 +112,7 @@ export async function startEngine( document.body.onclick = enableVR; let leanBase: { position: Vector3 } | null = null; + let recenterBase: { rotation: Quaternion } | null = null; engine.runRenderLoop(() => { @@ -142,9 +138,10 @@ export async function startEngine( if (sm && latch(gp, 0)) { const ray = xr.baseExperience.camera.getForwardRay(); - const hit = scene.pickWithRay(ray, m => floorMeshes.indexOf(m as any) !== -1); + const meshes = floorMeshes(); + const hit = scene.pickWithRay(ray, m => meshes.indexOf(m as any) !== -1); if (hit !== null) { - if (floorMeshes.indexOf(hit.pickedMesh as any) !== -1) { + if (meshes.indexOf(hit.pickedMesh as any) !== -1) { if (hit.pickedPoint !== null) { xr.baseExperience.camera.position = hit.pickedPoint.add(new Vector3(0, 1.6, 0)); @@ -172,8 +169,14 @@ export async function startEngine( xr.baseExperience.camera.rotationQuaternion.copyFrom(r.toQuaternion()); } } - if (sm && latch(gp, 4)) { - xr.baseExperience.camera.rotationQuaternion.copyFrom(initialRotation.toQuaternion()); + + if (sm) { + if (latch(gp, 4)) { + recenterBase = { rotation: xr.baseExperience.camera.rotationQuaternion.clone() }; + } + if (buttonDown[4] && recenterBase) { + xr.baseExperience.camera.rotationQuaternion.copyFrom(recenterBase.rotation); + } } } } @@ -181,4 +184,6 @@ export async function startEngine( scene.render(); }); window.addEventListener("resize", () => engine.resize()); + + return scene; } diff --git a/src/index.ts b/src/index.ts index 756fe5d..aa21fe2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,38 +2,38 @@ import { Dataspace, Embedded, Reader, Ref, Schemas, Sturdy } from "@syndicate-la import * as html from "@syndicate-lang/html"; import * as wsRelay from "@syndicate-lang/ws-relay"; import * as wakeDetector from './wake-detector.js'; +import * as Shapes from './gen/shapes.js'; import { Engine, - HemisphericLight, Mesh, - MeshBuilder, Scene, - Vector3, } from '@babylonjs/core/Legacy/legacy'; -import { box } from './shapes.js'; -import { attachTexture } from './interiors.js'; -import { startEngine } from './engine.js'; -import { uuid } from './uuid.js'; +import { activeFloorMeshes, ShapeTree } from './shapes.js'; +import { startEngine, CreatedScene } from './engine.js'; -async function createScene(_canvas: HTMLCanvasElement, engine: Engine): Promise<{ - scene: Scene, - floorMeshes: Mesh[] -}> { - const scene = new Scene(engine); +assertion type SceneHandle(ds: Embedded); - new HemisphericLight("light", new Vector3(0, 1, 0), scene); +function interpretScene(scene: Scene, sceneDs: Ref) { + at sceneDs { + during Shapes.Sprite({ "name": $name: string }) => spawn named `sprite:${name}` { + console.log('+shape', name); + on stop console.log('-shape', name); + spriteMain(name, scene, sceneDs); + } + } +} - const b = attachTexture(box('b', 1, 1, 1, 0, 2, 2), scene, 'papenweg-textures/individual/floor1.jpg'); - - return { - scene, - floorMeshes: [ - b, - MeshBuilder.CreateGround("ground", {width:30, height:30}), - ], - }; +function spriteMain(name: string, scene: Scene, sceneDs: Ref) { + at sceneDs { + let currentShape = ShapeTree.empty(name, scene); + on stop currentShape.remove(); + during Shapes.Sprite({ "name": name, "shape": $shape: Shapes.Shape }) => { + console.log('=shape', name, shape); + currentShape = currentShape.reconcile(name, shape); + } + } } function wsurl(): string { @@ -41,13 +41,12 @@ function wsurl(): string { return `${scheme}://${document.location.host}/ws`; } -function bootApp(ds: Ref) { +function bootApp(ds: Ref, scene: Scene) { spawn named 'app' { at ds { const url = wsurl(); const serverCap = Sturdy.asSturdyRef(new Reader( '').next()); - const this_instance = uuid(); const relayAddr = wsRelay.RelayAddress(Schemas.transportAddress.WebSocket(url)); during wsRelay.Resolved({ @@ -60,17 +59,28 @@ function bootApp(ds: Ref) { on message wakeDetector.WakeEvent() => { send message wsRelay.ForceRelayDisconnect(relayAddr); } + + at remoteDs { + during SceneHandle($sceneDs_e: Embedded) => { + const sceneDs = sceneDs_e.embeddedValue; + interpretScene(scene, sceneDs); + } + } } } } } window.addEventListener('load', async () => { - await startEngine(createScene); + const scene = await startEngine( + async (_canvas: HTMLCanvasElement, engine: Engine): Promise => ({ + scene: new Scene(engine), + floorMeshes: () => activeFloorMeshes, + })); Dataspace.boot(ds => { html.boot(ds); wsRelay.boot(ds, true); wakeDetector.boot(ds); - bootApp(ds); + bootApp(ds, scene); }); }); diff --git a/src/shapes.ts b/src/shapes.ts index ed03b97..06c0521 100644 --- a/src/shapes.ts +++ b/src/shapes.ts @@ -1,10 +1,25 @@ import { + AbstractMesh, + Color3, CSG, + HemisphericLight, Mesh, MeshBuilder, + Node, PhotoDome, + Quaternion, + Scene, + StandardMaterial, + Texture, + TransformNode, + Vector2, Vector3, } from '@babylonjs/core/Legacy/legacy'; +import { Value, is } from "@syndicate-lang/core"; + +import * as Shapes from './gen/shapes.js'; + +export const activeFloorMeshes: Array = []; export function adjust(f: (... csgs: CSG[]) => CSG, ... ms: Mesh[]): Mesh { const csgs = ms.map(m => CSG.FromMesh(m)); @@ -47,3 +62,182 @@ export function box(name: string, width: number, height: number, depth: number, b.position = new Vector3(x ?? 0, y ?? b.scaling.y/2, z ?? 0); return b; } + +//--------------------------------------------------------------------------- + +export class ShapeTree { + shapePreserve: Value; + cleanups: Array<() => void> = []; + + constructor ( + public scene: Scene, + public shape: Shapes.Shape, + public node: N, + ) { + this.shapePreserve = Shapes.fromShape(this.shape); + if (this.node instanceof AbstractMesh) { + this.node.checkCollisions = true; + } + } + + reconcile(name: string, shape: Shapes.Shape): ShapeTree { + if (is(Shapes.fromShape(shape), this.shapePreserve)) { + return this; + } else { + this.remove(); + return build(name, this.scene, shape, {}); + } + } + + remove() { + this.node?.dispose(false, true); + } + + static empty(name: string, scene: Scene): ShapeTree { + return ShapeTree.transform(name, scene, Shapes.Shape.many([])); + } + + static transform(name: string, scene: Scene, shape: Shapes.Shape): ShapeTree { + return new ShapeTree(scene, shape, new TransformNode(name, scene)); + } +} + +export function v2(v: Shapes.Vector2): Vector2 { + return new Vector2(v.x, v.y); +} + +export function v3(v: Shapes.Vector3): Vector3 { + return new Vector3(v.x, v.y, v.z); +} + +export function q(q: Shapes.Quaternion): Quaternion { + return new Quaternion(q.a, q.b, q.c, q.d); +} + +export type MeshCustomizer = { [key: string]: ((m: ShapeTree) => void) }; + +function applyCustomizer(m: ShapeTree, c: MeshCustomizer) { + Object.values(c).forEach(f => f(m)); +} + +export function build(name: string, scene: Scene, shape: Shapes.Shape, customize: MeshCustomizer): ShapeTree { + switch (shape._variant) { + case "Sphere": { + const t = new ShapeTree(scene, shape, MeshBuilder.CreateSphere(name, {}, scene)); + applyCustomizer(t, customize); + return t; + } + + case "Box": { + const t = new ShapeTree(scene, shape, MeshBuilder.CreateBox(name, {}, scene)); + applyCustomizer(t, customize); + return t; + } + + case "Light": + return new ShapeTree( + scene, + shape, + new HemisphericLight(name, v3(shape.value.v), scene)); + + case "Ground": { + const v = v2(shape.value.size); + const t = new ShapeTree( + scene, + shape, + MeshBuilder.CreateGround(name, { width: v.x, height: v.y }, scene)); + applyCustomizer(t, customize); + return t; + } + + case "Scale": { + const t = ShapeTree.transform(name, scene, shape); + t.node.scaling = v3(shape.value.v); + build(name + '.inner', scene, shape.value.shape, customize).node.parent = t.node; + return t; + } + + case "Move": { + const t = ShapeTree.transform(name, scene, shape); + t.node.position = v3(shape.value.v); + build(name + '.inner', scene, shape.value.shape, customize).node.parent = t.node; + return t; + } + + case "Rotate": { + const t = ShapeTree.transform(name, scene, shape); + switch (shape.value._variant) { + case "euler": + t.node.rotation = v3(shape.value.v); + break; + case "quaternion": + t.node.rotationQuaternion = q(shape.value.q); + break; + } + build(name + '.inner', scene, shape.value.shape, customize).node.parent = t.node; + return t; + } + + case "many": { + const t = ShapeTree.transform(name, scene, shape); + shape.value.forEach((s, i) => { + build(name + '[' + i + ']', scene, s, customize).node.parent = t.node; + }); + return t; + } + + case "Texture": { + const mat = new StandardMaterial(name + '.texture', scene); + const tex = new Texture(shape.value.path, scene); + mat.diffuseTexture = tex; + switch (shape.value._variant) { + case "simple": + break; + case "uv": { + const scale = v2(shape.value.scale); + const offset = v2(shape.value.offset); + tex.uScale = 1 / scale.x; + tex.vScale = 1 / scale.y; + tex.uOffset = offset.x; + tex.vOffset = offset.y; + break; + } + } + return build(name + '.inner', scene, shape.value.shape, { + ... customize, + material: m => m.node.material = mat, + }); + } + + case "Color": { + const mat = new StandardMaterial(name + '.texture', scene); + mat.diffuseColor = new Color3(shape.value.r, shape.value.g, shape.value.b); + if (shape.value._variant === "transparent") mat.alpha = shape.value.alpha; + return build(name + '.inner', scene, shape.value.shape, { + ... customize, + material: m => m.node.material = mat, + }); + } + + case "Name": + return build(name + '.' + shape.value.base, scene, shape.value.shape, customize); + + case "Floor": + return build(name, scene, shape.value.shape, { + ... customize, + floor: m => { + activeFloorMeshes.push(m.node); + m.cleanups.push(() => { + const i = activeFloorMeshes.indexOf(m.node); + if (i !== -1) activeFloorMeshes.splice(i, 1); + }); + }, + }); + + default: + ((_shape: never) => { + console.error('Unsupported shape variant', shape); + throw new Error("Unsupported shape variant"); + })(shape); + } +} diff --git a/textures/grass-256x256.jpg b/textures/grass-256x256.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f970888885eb445a070cd2d443758099e700a4cb GIT binary patch literal 62236 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.20.2", "@preserves/core@^0.20.4": - version "0.20.4" - resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.20.4.tgz#b964d31c291a489c2682b5cf35f29b6677885000" - integrity sha512-4XSQwcbn66LQWl8ympnhumWboZiMGW3bIQmvSx4Bt04v3m1vtiJz/Pw/mltTgPahWWs/f6ADAZoNywD4w6aY0Q== +"@preserves/core@*", "@preserves/core@>=0.20.2", "@preserves/core@^0.20.5": + version "0.20.5" + resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.20.5.tgz#3b34693b1f5aff659639690725a703a95689f822" + integrity sha512-hnywtmY30swKSuHix3MbEoheyCh6plCERzmhnCQllrkhdT0hFm66iSr2PVjNsXAUNIwd3Rh3Vu2btgdjMK+Q9Q== "@preserves/schema@*", "@preserves/schema@>=0.21.2": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.21.6.tgz#572a2731712a6e503ad218639ef58099a61f2956" - integrity sha512-0lxqEN5qJDu/Ez84gpZxD3/XHF8LzrBcx2WMfRIqOGl4L4067l4N+xM01YNRTHjiY53weT3xyoWAizlqow5fBg== + version "0.21.7" + resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.21.7.tgz#09e388b8c582c3dc95018ebdfe990381dddabfa8" + integrity sha512-q2gncEOOY3qqs+i+Op5yZx89cckqN601vbEcBDfnQge5PB9HrOrfMk68Wq4w/rpdQpRyVqWhZNxLlKsANjgoOw== dependencies: - "@preserves/core" "^0.20.4" + "@preserves/core" "^0.20.5" "@types/glob" "^7.1" "@types/minimatch" "^3.0" chalk "^4.1"