NPCFACTORY and wardrobegod were the same product — wardrobegod had already absorbed its reskin engine, and keeping two benches means two half-libraries and two export paths. Folded, keeping the wardrobegod name and codebase (370 lines there vs ~1,100 here). · Vendored three.js r175 from NPCFACTORY, replacing the unpkg CDN importmap. This was real drift, not tidiness: a CDN import breaks offline and can't be lifted into a game build. NPCFACTORY lacked OrbitControls (it used PointerLock), so that one addon was fetched at the matching revision. Added a guarded /vendor/ static route. Verified in-browser: zero CDN requests, 5 vendor files, model still loads. · Took the 17 rigged walk-animated NPCs and 6 parts. Bodies 4 -> 20. · New `unitfix` op. Deliberately NOT scale-to-height: a 0.06m human is a UNIT error, but normalising everything to 1.72m would erase the small/medium/large/obese range the library is meant to carry. So it only corrects heights outside 0.5-3.0m — physically impossible for a human — and leaves real proportions alone as data. Verified both ways: hum_character 0.0576m -> 1.72m, tradie 1.000m left untouched. Three bugs found while building it, two of them pre-existing: · `is_helper`/`real_meshes`/`bbox_of` factored out. Material-less bone widgets (a radius-1 42-vert Icosphere, so exactly 2.0 units tall) were being measured INSTEAD of the character — every body reported 2.000m. This poisoned the `scale` op too, which has been measuring widgets all along; NPCFACTORY's render_plates.py had independently worked around the same thing by framing on the dominant mesh. · `transform_apply` under temp_override(selected_editable_objects=...) SEGFAULTS Blender 5.1.2 on rigs with parented children. A segfault can't be caught, so it's avoided rather than handled: glTF encodes node scale natively, so setting the root transform is sufficient and every downstream measurement still reads correctly. Confirmed `scale` still round-trips (1.00m -> 1.72m, re-measured). · My own bulk edit replaced only ONE of the two crash-prone call sites and reported "replaced 1" — I didn't check for a second, which is why `scale` worked while `unitfix` kept crashing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
190 lines
4.0 KiB
JavaScript
190 lines
4.0 KiB
JavaScript
import {
|
|
BufferGeometry,
|
|
Float32BufferAttribute,
|
|
OrthographicCamera,
|
|
Mesh
|
|
} from 'three';
|
|
|
|
/**
|
|
* Abstract base class for all post processing passes.
|
|
*
|
|
* This module is only relevant for post processing with {@link WebGLRenderer}.
|
|
*
|
|
* @abstract
|
|
*/
|
|
class Pass {
|
|
|
|
/**
|
|
* Constructs a new pass.
|
|
*/
|
|
constructor() {
|
|
|
|
/**
|
|
* This flag can be used for type testing.
|
|
*
|
|
* @type {boolean}
|
|
* @readonly
|
|
* @default true
|
|
*/
|
|
this.isPass = true;
|
|
|
|
/**
|
|
* If set to `true`, the pass is processed by the composer.
|
|
*
|
|
* @type {boolean}
|
|
* @default true
|
|
*/
|
|
this.enabled = true;
|
|
|
|
/**
|
|
* If set to `true`, the pass indicates to swap read and write buffer after rendering.
|
|
*
|
|
* @type {boolean}
|
|
* @default true
|
|
*/
|
|
this.needsSwap = true;
|
|
|
|
/**
|
|
* If set to `true`, the pass clears its buffer before rendering
|
|
*
|
|
* @type {boolean}
|
|
* @default false
|
|
*/
|
|
this.clear = false;
|
|
|
|
/**
|
|
* If set to `true`, the result of the pass is rendered to screen. The last pass in the composers
|
|
* pass chain gets automatically rendered to screen, no matter how this property is configured.
|
|
*
|
|
* @type {boolean}
|
|
* @default false
|
|
*/
|
|
this.renderToScreen = false;
|
|
|
|
}
|
|
|
|
/**
|
|
* Sets the size of the pass.
|
|
*
|
|
* @abstract
|
|
* @param {number} width - The width to set.
|
|
* @param {number} height - The width to set.
|
|
*/
|
|
setSize( /* width, height */ ) {}
|
|
|
|
/**
|
|
* This method holds the render logic of a pass. It must be implemented in all derived classes.
|
|
*
|
|
* @abstract
|
|
* @param {WebGLRenderer} renderer - The renderer.
|
|
* @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering
|
|
* destination for the pass.
|
|
* @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the
|
|
* previous pass from this buffer.
|
|
* @param {number} deltaTime - The delta time in seconds.
|
|
* @param {boolean} maskActive - Whether masking is active or not.
|
|
*/
|
|
render( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {
|
|
|
|
console.error( 'THREE.Pass: .render() must be implemented in derived pass.' );
|
|
|
|
}
|
|
|
|
/**
|
|
* Frees the GPU-related resources allocated by this instance. Call this
|
|
* method whenever the pass is no longer used in your app.
|
|
*
|
|
* @abstract
|
|
*/
|
|
dispose() {}
|
|
|
|
}
|
|
|
|
// Helper for passes that need to fill the viewport with a single quad.
|
|
|
|
const _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
|
|
|
|
// https://github.com/mrdoob/three.js/pull/21358
|
|
|
|
class FullscreenTriangleGeometry extends BufferGeometry {
|
|
|
|
constructor() {
|
|
|
|
super();
|
|
|
|
this.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );
|
|
this.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const _geometry = new FullscreenTriangleGeometry();
|
|
|
|
|
|
/**
|
|
* This module is a helper for passes which need to render a full
|
|
* screen effect which is quite common in context of post processing.
|
|
*
|
|
* The intended usage is to reuse a single full screen quad for rendering
|
|
* subsequent passes by just reassigning the `material` reference.
|
|
*
|
|
* This module can only be used with {@link WebGLRenderer}.
|
|
*
|
|
* @augments Mesh
|
|
*/
|
|
class FullScreenQuad {
|
|
|
|
/**
|
|
* Constructs a new full screen quad.
|
|
*
|
|
* @param {?Material} material - The material to render te full screen quad with.
|
|
*/
|
|
constructor( material ) {
|
|
|
|
this._mesh = new Mesh( _geometry, material );
|
|
|
|
}
|
|
|
|
/**
|
|
* Frees the GPU-related resources allocated by this instance. Call this
|
|
* method whenever the instance is no longer used in your app.
|
|
*/
|
|
dispose() {
|
|
|
|
this._mesh.geometry.dispose();
|
|
|
|
}
|
|
|
|
/**
|
|
* Renders the full screen quad.
|
|
*
|
|
* @param {WebGLRenderer} renderer - The renderer.
|
|
*/
|
|
render( renderer ) {
|
|
|
|
renderer.render( this._mesh, _camera );
|
|
|
|
}
|
|
|
|
/**
|
|
* The quad's material.
|
|
*
|
|
* @type {?Material}
|
|
*/
|
|
get material() {
|
|
|
|
return this._mesh.material;
|
|
|
|
}
|
|
|
|
set material( value ) {
|
|
|
|
this._mesh.material = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export { Pass, FullScreenQuad };
|