feat(duet-keys): real KayKit GLB assets + textured environment - #835
Merged
Merged
Conversation
Replace duet-keys' hand-built primitive shapes with kaykit-dungeon / kaykit-adventurers GLB models: heroes (Mage/Barbarian, tinted per hero), gate/plate/receiver/spike (dynamically tinted via renderObject; the gate sinks into the floor when open and spikes physically retract instead of just recoloring a box), wall (fluted stone pillars forming a real colonnade)/emitter/exit, and real floor tiles (three variants, hashed per cell) replacing the flat colored plane + debug grid. Held VFX props (prism, anchor weight) are now real crystal/trunk models instead of primitive geometry. Zero Kenney assets (barred repo-wide, #829). Fixes a real engine bug found while shooting this: `useLoader`'s implicit THREE.DefaultLoadingManager can end up with an already-aborted internal AbortController under repeated dev-server navigations, silently stalling every future GLTFLoader.load() with no thrown error. GamePlayerShell now constructs its shared GLTFLoader with a dedicated LoadingManager; duet-keys does the same, and routes every placed object (including wall/emitter/exit, which would otherwise sit on the engine's own objectModels/sharedGltfLoader path) through its own single preloaded loader instance, so the module-level preload actually warms every model this game uses before the Canvas render loop starts competing for the main thread.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Keep KayKit duet-keys assets/render; take main GamePlayerShell refactor, generated skill apis, and baselines. Union model gitignore exceptions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fresh redo of #832 (closed — wired
kenney-mini-dungeon, now barred repo-wide per #829) on KayKit only — zero Kenney assets.kaykit-adventurersMage (Lumen, cyan-tinted) / Barbarian (Anchor, orange-tinted), posed via the rig'sIdleclip.kaykit-dungeon/pillar— a real fluted-stone colonnade around each room instead of flat dark cubes.barrier_half/floor_tile_small_decorated/torch_mounted/floor_tile_big_spikes, dynamically tinted viarenderObjectfrom live room state — the gate now sinks into the floor when open and spikes physically retract instead of just recoloring a box.floor_tile_smalltiles (three variants hashed per cell for texture variety) replacing the flat colored plane + debug grid.torch/stairs, tinted per hero.coincrystal, Anchor's weight is atrunk_small_A, replacing primitive octahedron/cylinder geometry.Engine fix
Found while shooting this: a bare
useLoader(GLTFLoader, url, ...)constructs the implicitTHREE.DefaultLoadingManager. Under this dev server's repeated navigations that shared singleton manager's internalAbortControllercan end up already-aborted, whichFileLoader.load()composes into every future request's abort signal — silently stalling every subsequentGLTFLoader.load()forever with no thrown error (parsing already-fetched bytes still works fine, so it's a fetch-stage-only hang).packages/shell/src/GamePlayerShell.tsx'sEntityModel/BoneAttachmentnow share oneGLTFLoaderconstructed with a dedicatedLoadingManagerinstead. duet-keys does the same for its own custom model rendering, and — since the engine's staticobjectModelsmap resolves through the shell's own loader instance, separate from a game's local one — routes every placed object (including wall/emitter/exit) through its own single loader so its module-leveluseLoader.preloadwarms every model it uses before the Canvas render loop starts competing for the main thread.Assets
kaykit-dungeon+kaykit-adventurers(CC0, KayKit), pulled viaassets add..gitignorewhitelists both underapps/dev/public/models/;.glb/texture files are staged in this PR.packages/assets/src/generated/*already carried both source indexes onmain(from a sibling PR) — no changes needed there.Before / after (Room 1, same camera framing)
Test plan
bun run check-typesclean (repo-wide)bun run test:all— 4354 passbun run buildcleanbun run --cwd Games/duet-keys check-typescleanbun test Games/duet-keys— 19/19 passpr-shotsgit statusconfirmed zerokenney-*files stagedGenerated by Claude Code