Skip to content

Releases

67js 0.18.0

Choose a tag to compare

@github-actions github-actions released this 10 Nov 12:04
95946a2
  • Clip layers on an imported asset take a strip with 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_apply takes bake-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)
  • sdf geometry 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)
  • curve geometry takes kind poly or nurbs, several splines, arc, spiral and star shapes and a trim, so rails, ropes and a growing vine need no hand-placed points (#701)
  • uv_project (cube, cylinder, sphere) and uv_pack mesh edits write and pack UVs with one texel density (#702)
  • mesh_edit gains poke, dual, tris_to_quads, symmetrize, scale_elements and extrude_edges (#703)
  • Add a build mesh modifier that reveals faces over start and length frames in index, seeded random or axis order, with reverse (#704).
  • scene_restore takes revision to undo the last few scene_apply edits 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 run scripts/summarize-mcp-log.mjs for 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_control exists, 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: false opts out; installDepthPrecision, hasFarOverlap and requestReversedDepth are removed (use installCoplanarDiagnostics for the warning); bench/flicker/index.html is 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.resolveCoplanar is false, a renderer does it with resolveCoplanar: resolveFlushParts; decal and depthLayer use the same bias; what cannot be ranked (more than 15 faces stacked on one plane, double-sided faces a gap apart) comes back as a coplanar-overlap warning with a reason; coplanarLayers, resolveCoplanarParts and EXACT_FLUSH_DISTANCE are removed; bench/flicker has 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).geometry holds 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/flicker gains the plaque-closeup-0.5m trap 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/runtime adds createRuntime, 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

Choose a tag to compare

@github-actions github-actions released this 09 Nov 20:43
76510af
  • 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, keyTransmittance and surfaceTransmittance approximate 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 }) and renderer.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: applyAnimation prepares 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 field to volume fog (also renderer.setFogField), flow-advected noise (flowStrength, flowPeriod), a profile choice, 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.volumeFog needs import '@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.diagnostics lists skin-reflected-vertices with 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 through updateParts without a new batch. (#586)
  • Volume fog takes detailOctaves, detailAmount, warp and contrast for wispier mist, profileSoftness for where a layer top starts to fade, and keyScattering to 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.specularAntiAliasing sets 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: Renderer67 loads reversed-depth.js as a separate chunk on the first such frame and every frame after it draws with it (await renderer.reversedDepthReady to have it from frame one; reversedDepth: false keeps 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)
  • resolveCoplanar is now a function, resolveFlushParts from 67js/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) and line geometries, and plane is accepted as an alias of grid (#596)
  • Fields can read other surfaces: nearest (distance, point or normal of the closest point on a surface) and raycast (hit, distance, point or normal along a direction, with a miss value), plus attr: group to read a vertex group back. In instances the surface is a geometry id, so a scatter can avoid a path mesh and follow terrain; in set_position, displace, vertex_group and vertex_color it is a geometry record, and vertex_group stores the result by name (#597)
  • Force fields: a fields list on the recipe particles and cloth sections accelerates particles, hair and cloth through one shared evaluation, with wind, turbulence, vortex, drag and magnet types, strength, falloff, radius and seed. The same seed gives the same frames (#598).
  • Ocean modifier: the ocean mesh 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 group foam where 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, ao and mist next to albedo, normal, emission, depth and objectId; diffuse + glossy + emission add back to the lit image, and exr keeps 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) and effects.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) from src/post-steps.js adds the stages (#602)
  • scene_inspect reports a bake-stale warning 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: true bakes 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), clearcoat and transmission (per-pixel masks), and mixing nodes layer (mask-blended layers such as paint over rust), hue and curve. 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, for image and stills), format: "png16" or "exr" (16-bit PNG and OpenEXR from a half-float frame, passes included: depth in metres as float32 Z, object IDs as float32 id), region: { x, y, width, height } (a crop of the whole frame, for image, stills and video) and fps up to 60. The encoders are small hand-written Node code with no new dependency. docs/agent-render-jobs.md has the details.
  • Area lights can cast soft shadows: castShadow: true on an areaLights entry 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: ies on spot and area lights takes a bundled name (wide-flood, downlight, narrow-spot, batwing) or { angles, candela }; parseIesPhotometry reads 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...
Read more

67js 0.16.0

Choose a tag to compare

@anxuanng anxuanng released this 08 Nov 06:18
bce0a97

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 subsurface block (#283)
  • 3D Gaussian splats from a standard PLY file, as an addon (#288)
  • environment.viewTransform picks ACES, AgX or neutral, and AgX now matches Blender 5.2 (#282)
  • Easing curves and cubic-bezier on 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 vegetation node plants one tree or a seeded forest over terrain, with seasons and wind (#321)
  • motion.drive drives 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_walkmap tool 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)
  • volumeFog takes heightFalloff for valley mist that thins with height
  • Sunlit rooms get softer bounced light by default, and bake.irradianceGrid adds 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.updateParts is 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 RangeError that names every limit the file goes over. Match on the option name, not the old message (#458)
  • material.lightMask defaults to -1, every light (#261)
  • normalizeAgentLook returns fogDensity: null for fog that fits the scene (#263)

Install: npm install @codepawlhq/67js@0.16.0

67js 0.15.0

Choose a tag to compare

@anxuanng anxuanng released this 05 Nov 11:03
  • Add fog-valley and fog-room to the reference suite (part of issue #165, which stays open). Against Cycles fog-room scores 0.1953 (EEVEE 0.3730) and fog-valley 0.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 of temple-hall (0.2305 to 0.2513), so #164 is not fixed. See bench/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-shaft read 128 of 255 sky visibility at its bottom edge where the interior reads 1. rasterizeTexels in src/light-bake.js now gives that texel to the nearest triangle. Baked dark-shaft goes from 0.0653 to 0.0607 and temple-hall from 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.js holds mountain-valley, temple-hall and megacity-dusk as -a, -b and -c, each with its own composition, light and time of day, drawn by npm run reference -- --grand into grand.json and images/grand-<id>.jpg (baseline.json and the existing images are unchanged). The Blender side gained a gradient world, written as the same equirectangular image 67js draws. bench/reference/grand-sheets.py makes 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). createTree bakes a sky visibility into each foliage vertex from the leaf density above it, and createTerrain bakes 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. On bench/reference, the foliage crown went from 0.298 to 0.200 (Cycles 0.175) and the score from 0.1173 to 0.1023 (EEVEE 0.0888); mountain-valley went 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/reference now rebuilds the 67js leaf model for foliage materials (back-face normal, colour and normal variation, sky reflection 0.3, and light from behind as a Translucent BSDF with weight 0.3 * pi / (3.7, 3.4, 2.9)), and the 67js back light is now shadowed by the sun shadow. foliage goes from 0.1290 to 0.1173 against Cycles (EEVEE 0.0864 to 0.0888) and mountain-valley from 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 in bench/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.reduction tells 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-hall at standard now bakes (16 samples, 1 bounce, 1.37 texels per unit, 0.0705 against 0.1504 unbaked with a probe). fine is now the same as standard: five samples and density mixes within the 20 s limit scored no better on the room scenes. Table in bench/reference/README.md.

  • Score the recipe bake presets against Cycles (part of issue #170, open for the frame costs). standard scores 0.127 to 0.159 on the three rooms (no bake 0.51), fine is no better, and standard and fine refuse temple-hall. Table in bench/reference/README.md.

  • No test asserts real elapsed time any more (issue #179): work counts and a fake clock replace stopwatches. smoke:agent-review-close and smoke:film-physics are wired; the second starts its own server.

  • Show the floor and the other parts in smooth metal (part of issue #167, which stays open). traceObjectProbes in src/probe-trace.js gives each part with metallic of at least 0.5 and roughness of 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), and placeProbes assigns it. metal scores 0.1294 to 0.1036 against Cycles (EEVEE 0.0916), brushed-film 0.1149 to 0.1029, car-paint 0.1059 to 0.1038, material-spheres 0.1312 to 0.1293; every scene without a reflective part is unchanged to four digits and draws the same frame (metal 1.51 ms plain, 1.58 ms with four probes). npm run reference -- --object-probes places 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.js failed 16 of 19 because npm test preloaded 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.js runs it in clean processes). Each of those files now imports tests/support/load-agent-scene-modules.mjs itself, npm test no longer preloads, and npm 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 the Test workflow.

  • Fix links in the npm package that pointed at docs it does not ship (issue #178). docs/guide.md, docs/material-maps.md, README.md and ROADMAP.md now 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:package packs the archive, unpacks it and checks every link inside (26 files, 0 broken), and the Test workflow runs it.

  • Take 34 KB of headroom under the npm archive budget without raising it (issue #177). CHANGELOG.md no 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.md now 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.html or scripts/smoke-mcp.mjs differs from the tools/list result (issue #180). The server registers 22 tools; the 23rd register( in the file is the function definition, so the documented count was right.

  • Remove the AGPL-3.0 @codepawlhq/orglet-ui package, React and react-dom from the website (issue #176). The site now uses its own tokens and button in src/site-tokens.css and src/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-valley that 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, and frame-time.mjs --plain measures 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 of lods, 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. On mountain-valley the 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_inspect now returns a closed-room-without-bake diagnostic when 90 percent or more of 48 rays from the middle of the scene hit a front face, and names bake; 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. bakeSkyVisibility in light-bake writes 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 in scene_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-maps and benchmark:mesh-query.

  • The GitHub repository is anxuanng/67.js, public since 2026-11-02. Links and repository.url point 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-interior 0.1444 to 0.1915, brick-room 0.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-shaft 0.0609 and temple-hall 0.0560. A bake takes about 1.3 to 1.9 times as long (temple-hall 39 to 75 s); pass bounces: 2 for 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...

Read more

67js 0.14.0

Choose a tag to compare

@anxuanng anxuanng released this 05 Nov 11:03
  • Add motion.ik to imported assets: IK runs over the selected clip and overrides, moves every skin and rigid part, and takes worldForward, 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

Choose a tag to compare

@anxuanng anxuanng released this 05 Nov 11:03
  • Add createAssetPose, which poses a loaded glTF asset's whole hierarchy so every skin and rigid part moves, and clipFromGltfAnimation, which converts its clips for layers and retargetClip
  • Add worldForward to 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

Choose a tag to compare

@anxuanng anxuanng released this 05 Nov 11:03
  • Add motion.ik to 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_inspect reports 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

Choose a tag to compare

@anxuanng anxuanng released this 05 Nov 11:03
  • 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 extrude solids whose holes have aligned edges: their caps left T-junctions, so the mesh was open and booleans refused it
  • Let mesh_inspect take geometry as well as geometries, matching mesh_edit and mesh_stack
  • Say in the MCP schema that box and cylinder are bevelled by default, and how to get exact sizes

Install: npm install @codepawlhq/67js@0.12.0