Repository navigation
Releases
67js 0.18.0
- Clip layers on an imported asset take a
stripwith start, scale, repeat, blend in and out, extend and blend mode, so a walk repeated three times can crossfade into an idle (#693) - Particle emitters take points from a mesh surface (weighted by area), its vertices or its closed volume, push them along the normal, and draw each particle as one of up to 8 listed nodes with a random or surface-aligned rotation (#695)
scene_applytakesbake-motion: it samples nodes over a range into keyframe tracks (tracks, IK, constraints, drivers, ragdoll and rigid bodies), optionally drops keys within a position and angle tolerance, and removes the sources it replaced, so the motion exports as a clip (#697)sdfgeometry meshes a tree of sphere, box, round box, capsule, cylinder and torus shapes with union, subtract, intersect, smooth blends and offset by surface nets, so blobby bodies and rounded joins need no hand modeling (#700)curvegeometry takeskindpoly or nurbs, severalsplines, arc, spiral and starshapes and atrim, so rails, ropes and a growing vine need no hand-placed points (#701)uv_project(cube, cylinder, sphere) anduv_packmesh edits write and pack UVs with one texel density (#702)mesh_editgainspoke,dual,tris_to_quads,symmetrize,scale_elementsandextrude_edges(#703)- Add a
buildmesh modifier that reveals faces overstartandlengthframes in index, seeded random or axis order, withreverse(#704). scene_restoretakesrevisionto undo the last fewscene_applyedits in one call, with no checkpoint made first (#744)- Docs: add an FAQ page for the questions from the launch: three.js, size and speed, tokens, what the agent sees, undo and diffs (#745).
- Set
SIXTYSEVENJS_MCP_LOG=<file>to log each MCP tool call (tool, duration, ok, result size, never arguments), and runscripts/summarize-mcp-log.mjsfor calls, error rate and median duration per tool (#746) - Depth precision by default (#751, phase 1 of 2): the colour pass draws with reversed-Z and a 32-bit float depth buffer wherever
EXT_clip_controlexists, at any far / near ratio, from the first frame; the 16-bit depth buffer is gone; without the extension the depth buffer is 24-bit and the near plane fits the visible bounds when the camera left near unset;reversedDepth: falseopts out;installDepthPrecision,hasFarOverlapandrequestReversedDepthare removed (useinstallCoplanarDiagnosticsfor the warning);bench/flicker/index.htmlis a viewer with a flicker probe - Flush faces stop flickering by default (#751, phase 2, step 1 of 2): faces that lie on one plane or a few millimetres apart, inside one mesh or across parts, are ranked per triangle and drawn with a small view-space depth bias, so the face in front wins at every distance and on every depth format; agent scenes do it unless
environment.resolveCoplanarisfalse, a renderer does it withresolveCoplanar: resolveFlushParts;decalanddepthLayeruse the same bias; what cannot be ranked (more than 15 faces stacked on one plane, double-sided faces a gap apart) comes back as acoplanar-overlapwarning with areason;coplanarLayers,resolveCoplanarPartsandEXACT_FLUSH_DISTANCEare removed;bench/flickerhas trap scenes (?trap=,probe.mjs --traps) - Hidden flush faces are cut away (#751, phase 2, step 2 of 2): where an opaque face covers another on exactly the same plane (1 cm2 or more), the covered part is cut out of the copy the hidden face draws with, every vertex array interpolated, so a stack of any depth on one plane stops flickering and no longer reports
rank-overflow; parts and their geometry stay as they are (flushOrderOf(part).geometryholds the cut copy), instances of one geometry share a cut, and the path tracer traces the cut geometry; a face under a blended or masked face, or a double-sided face under a one-sided one, is still ranked;bench/flickergains theplaque-closeup-0.5mtrap with an open-pixel count - Near-flush faces are cut too (#751): an opaque face in front of another by at most a thousandth of the side of their shared area (from 1 mm to 1 cm) cuts the face behind it, as a flush face does, instead of taking a rank; the Melbourne city model, whose stacked blocks nest facades 5 to 17 mm apart up to 17 deep, now reports no
rank-overflow - scene_inspect and scene_capabilities take the inputs Haiku sent in the bench: short mesh edit branch names (meshEdit.inset), dotted fields (environment.spotLights), near topic names (uvs, scene.terrain), source nodes without a mesh of their own, includeBounds with kind hierarchy; an unwalkable path start names the nearest walkable point (#761)
- scene_inspect with a node ID lists the parts below it and tags each with
fromNode; a node with no part below it, such as a skeleton joint, returns its transform (parent, joint flag, local translation, rotation and scale, rest world position) instead of an error (#761) 67js/addons/runtimeaddscreateRuntime, a live game loop with fixed, variable or interpolated steps, ordered pluggable systems, pause on a hidden tab and a frame-time readout (#770)
Install: npm install @codepawlhq/67js@0.18.0
67js 0.17.0
- bake.gridFog: the sun the fog scatters is dimmed by the fog between it and the sun (#543)
- bake.gridFog: true (with irradianceGrid) lets the irradiance grid scatter in the scene's volume fog, off by default, for sunlit closed rooms with fog (#543)
- An irradiance grid bake runs on the kernel worker with its 90 s limit instead of the page's 20 s, so 8 grid bounces fit a hall like temple-hall (#543)
- Volume fog: opt-in
scatterOctaves,multiScatter,multiExtinction,multiAnisotropy,keyTransmittanceandsurfaceTransmittanceapproximate multiple scattering of the sun in the haze and dim the sun by the haze between it and a point or surface. Off by default; the scenes without them render the same (#543) - The publish workflow waits up to five minutes for the registry to serve a new version instead of two. The 0.16.0 publish succeeded, but the registry took longer than two minutes, so the check failed and skipped the release page.
applyAnimation(time, clip, { checks: false })andrenderer.updateParts(parts, { checks: false })skip the per-frame pose checks for clips you trust, and frames on the same clip no longer reset and snapshot every node. Eight animated characters: update CPU 1.6 ms to 1.3 ms with checks, 0.9 ms without.- Skinned character frames cost less CPU: palette math reads joint matrices in place and a normal pose allocates nothing, so eight animated characters update about 0.1 ms faster (#572)
- Animating an imported glTF character costs about a third of the CPU it did:
applyAnimationprepares the pose once instead of twice, reuses its rollback snapshot, and skin validation checks each distinct set of joint weights once instead of every vertex. Eight RobotExpressive characters went from 4.5 ms to about 1.5 ms per frame. - Add a per-frame density and velocity
fieldto volume fog (alsorenderer.setFogField), flow-advected noise (flowStrength,flowPeriod), aprofilechoice, and scattering from up to 8 point and spot lights in the fog (issue #573). A fog without a field or lights draws exactly as before. - Breaking: a renderer that draws
environment.volumeFogneedsimport '@codepawlhq/67js/addons/fog-shader'first (recipes, the film and the MCP server load it on their own), which takes about 2.5 KB gzip out of the core (#577) - Motion blur and bloom no longer leave a ghost of the previous frame after a seek (#578)
- A few mirrored skin vertices (a finger pinched between two joints) no longer fail the frame. They draw pinched, and
renderer.diagnosticslistsskin-reflected-verticeswith the count and the joints and weights of the first one (#581) - Materials accept
alphaMode: 'add'for additive glow, and the opacity of blend and add parts changes each frame throughupdatePartswithout a new batch. (#586) - Volume fog takes
detailOctaves,detailAmount,warpandcontrastfor wispier mist,profileSoftnessfor where a layer top starts to fade, andkeyScatteringto scale only the key light shafts (#586) - Metal with detailed normal and roughness maps no longer sparkles from frame to frame at grazing angles;
environment.specularAntiAliasingsets the strength (#588) - resolveCoplanar: resolveFlushParts no longer layers pairs that lie on one plane to within a micrometre (the depth buffer already settles them) and settles chains of equal-sized parts, so it stops adding flicker on dense scenes (#593)
- A film with a very long lens (far / near over 10,000, such as near 0.08 and far 9000) now switches to reversed-Z float depth on its own:
Renderer67loadsreversed-depth.jsas a separate chunk on the first such frame and every frame after it draws with it (await renderer.reversedDepthReadyto have it from frame one;reversedDepth: falsekeeps the 24-bit buffer). On the metro film, 24-bit depth could not tell surfaces 2 micrometres apart at 2.6 m, and stairs, canopy panels, handrails and steel flickered between frames; those pairs went from thousands of flipping pixels to under 60 (#593) resolveCoplanaris now a function,resolveFlushPartsfrom67js/addons/coplanar-overlap, so the plane-keyed search stays out of the core bundle. Its depth layers also work under reversed depth: the slope part of the offset is 16 times larger there, because the constant part moves a surface by under a micrometre in a float depth buffer (#593)- motion.constraints: adds copy_transforms, limit_distance, limit_scale, stretch_to, locked_track, transformation and action, each one scene_motion call (#595)
- Recipes gain
cone,icoSphere,circle(filled or ring) andlinegeometries, andplaneis accepted as an alias ofgrid(#596) - Fields can read other surfaces:
nearest(distance, point or normal of the closest point on a surface) andraycast(hit, distance, point or normal along a direction, with amissvalue), plusattr: groupto read a vertex group back. Ininstancesthe surface is a geometry id, so a scatter can avoid a path mesh and follow terrain; inset_position,displace,vertex_groupandvertex_colorit is a geometry record, andvertex_groupstores the result by name (#597) - Force fields: a
fieldslist on the recipeparticlesandclothsections accelerates particles, hair and cloth through one shared evaluation, with wind, turbulence, vortex, drag and magnet types,strength,falloff,radiusandseed. The same seed gives the same frames (#598). - Ocean modifier: the
oceanmesh edit and stack node turn a flat grid into a seeded sea (Phillips spectrum for the wind,choppiness,size,seed,time) and write the vertex groupfoamwhere the surface folds. The same seed and time give identical vertices. Part of #599. - Per-object motion blur:
effects.motionBlur.objects(0 to 1, off by default) smears each part that moves during the shutter along its own screen path, while the still background stays sharp; it replaces camera motion blur on that frame and loads on demand (#600) - render jobs: passes now include
diffuse,glossy,shadow,aoandmistnext to albedo, normal, emission, depth and objectId; diffuse + glossy + emission add back to the lit image, andexrkeeps values above 1 (#601) - Three named post steps join defocus (
effects.depthOfField) in the look:effects.colorBalance(lift,gamma,gain, each three numbers),effects.glare(streaks,count,angle,fogGlow,threshold,size) andeffects.lensDistortion(distortion,dispersion). Each is off until a recipe names it and draws nothing at its neutral values, so a recipe without them renders the same pixels as before. Their code is a lazy module that loads only for a recipe that names one;installPostSteps(renderer)fromsrc/post-steps.jsadds the stages (#602) scene_inspectreports abake-stalewarning when motion has moved a light, the sun or a part off the pose a light bake was traced at; a scene without motion or without a bake pays nothing.bake.rebake: truebakes each pose a render or seek samples (the last 4 are kept, about 0.7 s each on a small room), so the baked light matches the frame and the warning does not apply. Material animation is not checked, see docs/light-bake.md (#603)- MCP scene_create and set-environment now accept the 16 point, 8 spot and 7 area lights the engine renders, read from one limits file, not 8 point and 4 area (#604)
- Motion tracks animate lights, the sun, sky and fog, exposure and focus distance, so a sunset, a lamp flicker or a rack focus plays from a recipe (#605)
- Nodes take visible (keyable in a motion track), castShadow, receiveShadow, holdout and shadowCatcher, so films hide parts without parking them and renders composite over footage (#606)
- Scene cameras take projection orthographic with orthoScale, focalLength with sensorWidth (instead of fov), shift [x, y] and fStop for depth of field, in recipes and set-camera (#607)
- environment.hdri and a .cube environment.look: shipped HDRIs (sky-clouds, studio-softbox) and looks (teal-orange, noir), or catalog files by ID, work from recipes and MCP (#608)
- Material graphs: new outputs
opacity(base texture alpha),clearcoatandtransmission(per-pixel masks), and mixing nodeslayer(mask-blended layers such as paint over rust),hueandcurve. The rasterizer reads opacity and clearcoat, the CPU path tracer all three. Graphs without them bake the same (#609) - A recipe mesh takes
shapeKeys(named offsets or move-only edits), animated by the existing morph tracks and written as morph targets in a GLB (#610) - Render jobs gain four optional output settings, all off by default so a plain job writes the same bytes:
transparent: true(PNG with alpha, forimageandstills),format: "png16"or"exr"(16-bit PNG and OpenEXR from a half-float frame, passes included: depth in metres as float32Z, object IDs as float32id),region: { x, y, width, height }(a crop of the whole frame, forimage,stillsandvideo) andfpsup to 60. The encoders are small hand-written Node code with no new dependency.docs/agent-render-jobs.mdhas the details. - Area lights can cast soft shadows:
castShadow: trueon anareaLightsentry takes one tile of the local shadow atlas, and the penumbra widens with the rectangle and with the gap between blocker and receiver. Cost is 16 blocker taps and 32 filter taps per lit pixel, only for a shadowed area light. environment.sunAngularRadius(radians, 0.0005 to 0.2) softens the sun shadow in the raster through the cascades (at least one slice is used) and sets the sun disk of the path tracer, which was fixed at 0.0087. Without the field nothing changes.- IES profiles:
ieson spot and area lights takes a bundled name (wide-flood,downlight,narrow-spot,batwing) or{ angles, candela };parseIesPhotometryreads an LM-63 file into that shape. The raster and the CPU path tracer read the same 16 samples. The GPU path tracer and the light bake igno...
67js 0.16.0
Highlights
- GPU path tracer:
backend: 'gpu'renders the 1080p demo room in about 40 s, against 586 s on the CPU. The light bake can use it too (#302) - Outlines and toon shading with
environment.lines(#285) - Subsurface scattering for skin, wax and leaves with the material
subsurfaceblock (#283) - 3D Gaussian splats from a standard PLY file, as an addon (#288)
environment.viewTransformpicks ACES, AgX or neutral, and AgX now matches Blender 5.2 (#282)- Easing curves and
cubic-bezieron keyframes, within 1e-4 of Blender (#286)
Agents and MCP
- Recipes place catalog GLB assets next to terrain and procedural meshes, and render jobs draw them (#320)
- A
vegetationnode plants one tree or a seeded forest over terrain, with seasons and wind (#321) motion.drivedrives a car model along a path with real steering, reverse and brake lights (#322)- Crowds of up to 1,000 walkers draw in one batch per material (#323)
- Clips retarget between characters, feet stay planted, and morph targets key by name (#325)
- Materials can play an image sequence as their colour map (#339)
- The new
scene_walkmaptool finds where a character can walk (#553) - The MCP schema now accepts every environment and node field the engine reads (#490)
Rendering
- Up to 16 point, 8 spot and 7 area lights, from 8, 8 and 4 (#261)
- Water got depth fade, soft shadows on the bed, refraction, and a reflection that survives rough water and costs less (#349)
- Default fog fits the scene size, so the far side of a big world no longer fades out (#263)
volumeFogtakesheightFallofffor valley mist that thins with height- Sunlit rooms get softer bounced light by default, and
bake.irradianceGridadds Cycles-like multi-bounce light (#506) - Far trees no longer pop darker when they switch level, and big forests can use impostor cards (#432)
- Reversed-Z depth and a z-fighting warning that names both parts and the fix (#310)
- Mesh blend softens the seam where a rock or a trunk meets the ground (#478)
- Your own post passes and a GLSL hook on materials (#405)
- Plain scenes draw faster, and far shadow cascades redraw less often (#388)
glTF
- Many more real-world files load: meshopt, WebP, spec-gloss, optional extensions, skeleton-only clips and common Sketchfab defects (#496)
- KTX2 textures stay GPU-compressed, about a quarter of the memory (#304)
- Large texture sets scale down instead of throwing, and the default limits are higher (#260)
Animation and physics
- Cloth follows moving characters, and steps live with pins and tearing (#326)
renderer.updatePartsis about 6 times faster for matrix and colour updates (#299)
Tools, docs and site
- Video export encodes in the browser: a 4,488-frame film took 21 s instead of 140 s (#301)
- Path traced jobs can use Intel Open Image Denoise (#303)
- The docs are now interactive learn pages with live examples, plus an API reference (#508)
- The showcase worlds show their first frame sooner and stream the rest in (#445)
- Agent benchmarks against three.js code and the Blender MCP on the same tasks (#31)
Breaking changes
- Skin, morph, water, foliage, terrain, liquid and splat shaders moved into addons. A renderer that draws those parts without the import throws and names it. Recipes and loaders import them on their own (#281)
- glTF limit errors are one
RangeErrorthat names every limit the file goes over. Match on the option name, not the old message (#458) material.lightMaskdefaults to-1, every light (#261)normalizeAgentLookreturnsfogDensity: nullfor fog that fits the scene (#263)
Install: npm install @codepawlhq/67js@0.16.0
67js 0.15.0
-
Add
fog-valleyandfog-roomto the reference suite (part of issue #165, which stays open). Against Cyclesfog-roomscores 0.1953 (EEVEE 0.3730) andfog-valley0.1967 (EEVEE 0.1952), so the fog constants of #161 hold on both. Scaling the fog ambient by the share of the sky the volume sees was measured and not kept: it worsened the region oftemple-hall(0.2305 to 0.2513), so #164 is not fixed. Seebench/reference/README.md. -
Fix a thin bright line at the corners of baked rooms (issue #165). The texel just outside a lightmap chart took the average of the neighbouring chart, so the wall of
dark-shaftread 128 of 255 sky visibility at its bottom edge where the interior reads 1.rasterizeTexelsinsrc/light-bake.jsnow gives that texel to the nearest triangle. Bakeddark-shaftgoes from 0.0653 to 0.0607 andtemple-hallfrom 0.0578 to 0.0559 against Cycles. -
Add three options for each grand reference scene, to pick from (part of issue #168, which stays open until An picks).
bench/reference/grand-scenes.jsholdsmountain-valley,temple-hallandmegacity-duskas-a,-band-c, each with its own composition, light and time of day, drawn bynpm run reference -- --grandintogrand.jsonandimages/grand-<id>.jpg(baseline.jsonand the existing images are unchanged). The Blender side gained agradientworld, written as the same equirectangular image 67js draws.bench/reference/grand-sheets.pymakes one comparison sheet per scene. -
Hide sky light where the scene blocks it: inside tree crowns and on a valley floor (issue #191, part of it).
createTreebakes a sky visibility into each foliage vertex from the leaf density above it, andcreateTerrainbakes one into each terrain vertex from the horizon in 16 directions. The shader multiplies it into the environment light only, and meshes without it read 1. Onbench/reference, thefoliagecrown went from 0.298 to 0.200 (Cycles 0.175) and the score from 0.1173 to 0.1023 (EEVEE 0.0888);mountain-valleywent from 0.3483 to 0.2623 (EEVEE 0.1879), and its floor from 0.417 to 0.360 (Cycles 0.272). No other scene changed to four digits. The agent scene geometry bound allows 4 more bytes for each terrain vertex. -
Compare trees like with like (issue #166, part of it). The Blender side of
bench/referencenow rebuilds the 67js leaf model forfoliagematerials (back-face normal, colour and normal variation, sky reflection 0.3, and light from behind as a Translucent BSDF with weight0.3 * pi / (3.7, 3.4, 2.9)), and the 67js back light is now shadowed by the sun shadow.foliagegoes from 0.1290 to 0.1173 against Cycles (EEVEE 0.0864 to 0.0888) andmountain-valleyfrom 0.3473 to 0.3483 (EEVEE 0.1828 to 0.1879); no other scene moved. The remaining gap is canopy and valley sky occlusion, recorded inbench/reference/README.md. -
Make the recipe bake presets bake large rooms (issue #189). A preset that does not fit the 5 million path step budget at 16 samples and 1 texel per unit now gives up bounces one at a time instead of refusing, and
bake.reductiontells the agent what it asked for, what ran and that explicit samples, bounces and texelsPerUnit (up to 24 million path steps, 20 s inline) buy more.temple-hallatstandardnow bakes (16 samples, 1 bounce, 1.37 texels per unit, 0.0705 against 0.1504 unbaked with a probe).fineis now the same asstandard: five samples and density mixes within the 20 s limit scored no better on the room scenes. Table inbench/reference/README.md. -
Score the recipe bake presets against Cycles (part of issue #170, open for the frame costs).
standardscores 0.127 to 0.159 on the three rooms (no bake 0.51),fineis no better, andstandardandfinerefusetemple-hall. Table inbench/reference/README.md. -
No test asserts real elapsed time any more (issue #179): work counts and a fake clock replace stopwatches.
smoke:agent-review-closeandsmoke:film-physicsare wired; the second starts its own server. -
Show the floor and the other parts in smooth metal (part of issue #167, which stays open).
traceObjectProbesinsrc/probe-trace.jsgives each part withmetallicof at least 0.5 androughnessof at most 0.6 a reflection probe of its own, traced from the middle of the part without it (up to 8 parts, lit by direct light and the environment's diffuse light), andplaceProbesassigns it.metalscores 0.1294 to 0.1036 against Cycles (EEVEE 0.0916),brushed-film0.1149 to 0.1029,car-paint0.1059 to 0.1038,material-spheres0.1312 to 0.1293; every scene without a reflective part is unchanged to four digits and draws the same frame (metal1.51 ms plain, 1.58 ms with four probes).npm run reference -- --object-probesplaces them (opt in; the committed baseline is unchanged); recipes do not yet. -
Make every test file pass on its own, and check it in CI (issue #172).
node --test tests/agent-bake.test.jsfailed 16 of 19 becausenpm testpreloaded every on-demand module into each test process, so 28 files only passed through that preload. The loading path agents use was fine (tests/agent-scene-on-demand.test.jsruns it in clean processes). Each of those files now importstests/support/load-agent-scene-modules.mjsitself,npm testno longer preloads, andnpm run test:isolated(scripts/test-each-file.mjs) runs each file in its own process, 4 at a time at below-normal priority, rerunning a failure alone once so a busy machine does not count. It runs in theTestworkflow. -
Fix links in the npm package that pointed at docs it does not ship (issue #178).
docs/guide.md,docs/material-maps.md,README.mdandROADMAP.mdnow link the 20 unshipped docs,CONTRIBUTING.md, the texture credits and the changelog by absolute GitHub URL; shipping those docs would add 64 KB gzip.npm run check:links:packagepacks the archive, unpacks it and checks every link inside (26 files, 0 broken), and theTestworkflow runs it. -
Take 34 KB of headroom under the npm archive budget without raising it (issue #177).
CHANGELOG.mdno longer ships in the package, because GitHub serves it; the archive went from 740,972 to 705,961 bytes against the 740,000 budget.bench/size/README.mdnow says how the budget is set and what it protects. -
Add a test that fails when the MCP tool count in
docs/guide.md,docs/mcp.md,index.htmlorscripts/smoke-mcp.mjsdiffers from thetools/listresult (issue #180). The server registers 22 tools; the 23rdregister(in the file is the function definition, so the documented count was right. -
Remove the AGPL-3.0
@codepawlhq/orglet-uipackage, React and react-dom from the website (issue #176). The site now uses its own tokens and button insrc/site-tokens.cssandsrc/site-controls.js, and screenshots of the pages match before and after. The site JavaScript drops from 1,778,425 to 1,531,367 bytes. The published package was never affected. -
A renderer no longer draws its shadow map a second time on the first frame when the frame has no assembly; the constructor already drew it. On
mountain-valleythat removes 9.72 million shadow triangles from the first frame, with identical pictures (issue #171).node bench/reference/profile-scene.mjs <scene>prints where a scene's time goes, andframe-time.mjs --plainmeasures scenes that are too large for the light bake. -
The shadow pass skips instances outside the light and draws each shadow caster at a level chosen from the world size of one shadow texel (issue #171). A part can carry
shadowLods, in the format oflods, and the renderer uses the coarsest level whose error is within one texel of an orthographic shadow map; tree bark carries a trunk-only level. Onmountain-valleythe shadow pass fell from 9.72 to 2.34 million triangles; the score against Cycles moved from 0.3473 to 0.3478 and the other scenes kept theirs. -
Tell an agent when its scene is a closed room with no bake (issue #163).
scene_inspectnow returns aclosed-room-without-bakediagnostic when 90 percent or more of 48 rays from the middle of the scene hit a front face, and namesbake; measured against Cycles a closed room goes from 0.1430 and 0.1436 (dark-shaft,temple-hall) to 0.0609 and 0.0560 once baked. No frame cost and no schema change; agent scene entry grows 884 bytes gzip.bakeSkyVisibilityinlight-bakewrites only the occlusion map (0.1021 and 0.0856 in under a second) and is not applied automatically. A closed room without a bake now shows a warning inscene_inspect. -
Clean up docs, media and scripts. Remove stale logs, six unreferenced PNG previews (about 6.1 MB) with their render sidecars, the OpenAI skill metadata and ten scripts that aimed at harness pages that no longer exist. Update the roadmap, the mesh and verification docs and the contributing guide, point the links to unshipped docs at GitHub, and add
npm run check:links,smoke:modeling,smoke:material-mapsandbenchmark:mesh-query. -
The GitHub repository is
anxuanng/67.js, public since 2026-11-02. Links andrepository.urlpoint there, which npm provenance needs to match. -
Follow 3 bounces by default in a light bake, up from 2 (part of issue #159, which stays open). Baked rooms scored worse after the sky visibility change (
lit-interior0.1444 to 0.1915,brick-room0.1515 to 0.2048 against Cycles) because the occlusion map removed the world light that had been filling the light a 2 bounce path cuts off. With 3 bounces they score 0.1341 and 0.1412,dark-shaft0.0609 andtemple-hall0.0560. A bake takes about 1.3 to 1.9 times as long (temple-hall39 to 75 s); passbounces: 2for the old light and time. Recipe presets are unchanged. -
Remove the streaks in baked dark scenes and the speckle in the fog's glow (part of issue #159, which stays open). A bake unwrapped each shared geometry once at unit size, so a 2 x 32 x 180 m wall got texels 90 times longer than wide (carpet 2,867 times...
67js 0.14.0
- Add
motion.ikto imported assets: IK runs over the selected clip and overrides, moves every skin and rigid part, and takesworldForward, so agents can pose imported characters through MCP without writing quaternions - Add
npm run smoke:character, which takes a real CC0 character through the MCP server along the path an agent uses
Install: npm install @codepawlhq/67js@0.14.0
67js 0.13.1
- Add
createAssetPose, which poses a loaded glTF asset's whole hierarchy so every skin and rigid part moves, andclipFromGltfAnimation, which converts its clips for layers andretargetClip - Add
worldForwardto aim IK, because bone axes differ between real rigs - Accept skin weights one unit of Float32 rounding above 1, which exporters write and which made such files fail to load
Install: npm install @codepawlhq/67js@0.13.1
67js 0.13.0
- Add
motion.ikto procedural recipes: two-bone and aim solvers on node hierarchies, with fixed, keyframed or node-following targets, so agents can animate jointed models without writing quaternions;scene_inspectreports whether each solver reaches its target across the clip - Add
67js/addons/skeleton-pose: clip layers for skinned rigs with joint masks and additive blending, two-bone IK with poles and aim IK with angle limits and shared chains, all seekable, with joints named by rig name or humanoid bone
Install: npm install @codepawlhq/67js@0.13.0
67js 0.12.0
- Add the recipe material field
pattern: eleven seeded, tileable procedural surfaces (wood, planks, bricks, tiles, marble, stone, concrete, metal, rust, fabric, noise) that need no UVs, keep their real size under node scale, and can change while a scene is open - Add periodic gradient, ridged and cellular noise for those patterns
- Close
extrudesolids whose holes have aligned edges: their caps left T-junctions, so the mesh was open and booleans refused it - Let
mesh_inspecttakegeometryas well asgeometries, matchingmesh_editandmesh_stack - Say in the MCP schema that
boxandcylinderare bevelled by default, and how to get exact sizes
Install: npm install @codepawlhq/67js@0.12.0