尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證No WebAssembly engine: a 3D game engine for the browser with no WebAssembly at all (no WASM, WebAssembly-free, WebAssemblyless) — a game engine without WebAssembly, in plain TypeScript on three.js. Streaming levels, BVH collision, GPU particles, FSR 1, frame generation. Runs on low-end Chromebooks.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗No WebAssembly engine — a 3D game engine for the browser with no WebAssembly in it at all (no WASM, WebAssembly-free, WebAssemblyless): plain TypeScript on three.js. Live demo
A 3D game engine for the browser, written in TypeScript on three.js — with no WebAssembly anywhere in it. It is the engine underneath SANGUINE, a fast first-person shooter built to run on low-end machines like a school Chromebook, taken out on its own: just the engine, none of the game.
Many browser engines that do real physics or heavy geometry lean on WebAssembly: a physics library compiled from C++ or Rust, a mesh optimiser, a navigation library. Arterial does all of its work in plain JavaScript (TypeScript compiled down) and on the GPU, and that buys it a lot:
.wasm file does not start there at all; Arterial only needs JavaScript and WebGL 2..wasm to fetch and compile before
the first frame, and no async instantiation step to orchestrate at start-up. The engine is part of the same
JavaScript bundle as the game and is ready the moment the page is.npm install and
Vite are the whole toolchain.engine/ — the core.
World: entities, an event bus, a level format (LevelFile, plain JSON), loading and saving.StaticChunks): the level is cut into cells, each baked into merged meshes and
collision with hidden faces culled; cells are built as the camera nears them and let go as it leaves.boss:start,
boss:phase, boss:health, boss:defeated[:<id>], boss:reset). The boss itself — model, moves, attacks — is
the game's: an entity that owns a BossEncounter and acts on its state.LevelSet of levels in order (each a file in hand, or a function that fetches or builds
one), loaded by id, and gone on from by an event from anything in a level — level:exit to the next,
level:goto:<id> to a named one — with level:loading / level:loaded / level:complete / levels:finished
announced and reached/finished progress saved as plain data.physics/ — the collision system: a BVH over the baked level, moving bodies, ray casts, capsule tests.
core/ — a fixed-step loop (120 Hz simulation, interpolated rendering), input with pointer lock, persisted settings.
render/ — procedural surface textures and materials (no image files needed), the level material, a procedural sky, an AMD FidelityFX Super Resolution 1 port (EASU + RCAS), an upscaler, frame generation (reprojection), dynamic resolution, a GPU timer, mesh decimation for level-of-detail copies.
entities/ — the engine's own entity types: brush (level geometry), spawn, trigger (event volumes),
light. A game registers its own beside them with registerEntity.
prefabs/geometry — helpers for building placeable pieces out of parts laid out in fractions of their size.
npm install
npm run dev # the example scene: http://localhost:5173
npm run build # type-check and build
The example (example/main.ts) is the smallest useful program: a level loaded from JSON, baked and streamed, a
sky, a smoke stream and bursts of sparks, a camera circling it, and the fixed-step loop driving it all.
import { World, Loop, registerCoreEntities, applySky, prepareLevelMaterial } from './src'
registerCoreEntities()
const world = new World()
prepareLevelMaterial(renderer)
applySky(world.scene)
world.load(level) // a LevelFile: { name, version: 1, entities: [...] }
world.particles.register('sparks', { layers: [{ style: 'streak', count: 24, speed: 9, spread: 0.9, life: 0.6, size: 0.05, color: 0xffc070, gravity: 14 }] })
const loop = new Loop(
(dt) => world.update(dt),
() => {
world.updateLod(camera.position)
world.particles.update(loop.stats.frameMs / 1000, camera)
renderer.render(world.scene, camera)
},
)
loop.start()
A browser with WebGL 2. Dependencies: three and three-mesh-bvh (both MIT).
src/render/fsr1.ts, with AMD's
notice kept).