|
|
@@ -1,3 +1,10 @@
|
|
|
+/**
|
|
|
+ * Finds the minimum value in an array.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {Array<number>} array - The array to search for the minimum value.
|
|
|
+ * @return {number} The minimum value in the array, or Infinity if the array is empty.
|
|
|
+ */
|
|
|
function arrayMin( array ) {
|
|
|
|
|
|
if ( array.length === 0 ) return Infinity;
|
|
|
@@ -14,6 +21,13 @@ function arrayMin( array ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Finds the maximum value in an array.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {Array<number>} array - The array to search for the maximum value.
|
|
|
+ * @return {number} The maximum value in the array, or -Infinity if the array is empty.
|
|
|
+ */
|
|
|
function arrayMax( array ) {
|
|
|
|
|
|
if ( array.length === 0 ) return - Infinity;
|
|
|
@@ -30,6 +44,18 @@ function arrayMax( array ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Checks if an array contains values that require Uint32 representation.
|
|
|
+ *
|
|
|
+ * This function determines whether the array contains any values >= 65535,
|
|
|
+ * which would require a Uint32Array rather than a Uint16Array for proper storage.
|
|
|
+ * The function iterates from the end of the array, assuming larger values are
|
|
|
+ * typically located at the end.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {Array<number>} array - The array to check.
|
|
|
+ * @return {boolean} True if the array contains values >= 65535, false otherwise.
|
|
|
+ */
|
|
|
function arrayNeedsUint32( array ) {
|
|
|
|
|
|
// assumes larger values usually on last
|
|
|
@@ -44,6 +70,14 @@ function arrayNeedsUint32( array ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Map of typed array constructor names to their constructors.
|
|
|
+ * This mapping enables dynamic creation of typed arrays based on string type names.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @constant
|
|
|
+ * @type {Object<string, TypedArrayConstructor>}
|
|
|
+ */
|
|
|
const TYPED_ARRAYS = {
|
|
|
Int8Array: Int8Array,
|
|
|
Uint8Array: Uint8Array,
|
|
|
@@ -56,6 +90,14 @@ const TYPED_ARRAYS = {
|
|
|
Float64Array: Float64Array
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * Creates a typed array of the specified type from the given buffer.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {string} type - The name of the typed array type (e.g., 'Float32Array', 'Uint16Array').
|
|
|
+ * @param {ArrayBuffer} buffer - The buffer to create the typed array from.
|
|
|
+ * @return {TypedArray} A new typed array of the specified type.
|
|
|
+ */
|
|
|
function getTypedArray( type, buffer ) {
|
|
|
|
|
|
return new TYPED_ARRAYS[ type ]( buffer );
|
|
|
@@ -74,12 +116,31 @@ function isTypedArray( array ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Creates an XHTML element with the specified tag name.
|
|
|
+ *
|
|
|
+ * This function uses the XHTML namespace to create DOM elements,
|
|
|
+ * ensuring proper element creation in XML-based contexts.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {string} name - The tag name of the element to create (e.g., 'canvas', 'div').
|
|
|
+ * @return {HTMLElement} The created XHTML element.
|
|
|
+ */
|
|
|
function createElementNS( name ) {
|
|
|
|
|
|
return document.createElementNS( 'http://www.w3.org/1999/xhtml', name );
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Creates a canvas element configured for block display.
|
|
|
+ *
|
|
|
+ * This is a convenience function that creates a canvas element with
|
|
|
+ * display style set to 'block', which is commonly used in three.js
|
|
|
+ * rendering contexts to avoid inline element spacing issues.
|
|
|
+ *
|
|
|
+ * @return {HTMLCanvasElement} A canvas element with display set to 'block'.
|
|
|
+ */
|
|
|
function createCanvasElement() {
|
|
|
|
|
|
const canvas = createElementNS( 'canvas' );
|
|
|
@@ -88,22 +149,59 @@ function createCanvasElement() {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Internal cache for tracking warning messages to prevent duplicate warnings.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @type {Object<string, boolean>}
|
|
|
+ */
|
|
|
const _cache = {};
|
|
|
|
|
|
+/**
|
|
|
+ * Custom console function handler for intercepting log, warn, and error calls.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @type {Function|null}
|
|
|
+ */
|
|
|
let _setConsoleFunction = null;
|
|
|
|
|
|
+/**
|
|
|
+ * Sets a custom function to handle console output.
|
|
|
+ *
|
|
|
+ * This allows external code to intercept and handle console.log, console.warn,
|
|
|
+ * and console.error calls made by three.js, which is useful for custom logging,
|
|
|
+ * testing, or debugging workflows.
|
|
|
+ *
|
|
|
+ * @param {Function} fn - The function to handle console output. Should accept
|
|
|
+ * (type, message, ...params) where type is 'log', 'warn', or 'error'.
|
|
|
+ */
|
|
|
function setConsoleFunction( fn ) {
|
|
|
|
|
|
_setConsoleFunction = fn;
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Gets the currently set custom console function.
|
|
|
+ *
|
|
|
+ * @return {Function|null} The custom console function, or null if not set.
|
|
|
+ */
|
|
|
function getConsoleFunction() {
|
|
|
|
|
|
return _setConsoleFunction;
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Logs an informational message with the 'THREE.' prefix.
|
|
|
+ *
|
|
|
+ * If a custom console function is set via setConsoleFunction(), it will be used
|
|
|
+ * instead of the native console.log. The first parameter is treated as the
|
|
|
+ * method name and is automatically prefixed with 'THREE.'.
|
|
|
+ *
|
|
|
+ * @param {...any} params - The message components. The first param is used as
|
|
|
+ * the method name and prefixed with 'THREE.'.
|
|
|
+ */
|
|
|
function log( ...params ) {
|
|
|
|
|
|
const message = 'THREE.' + params.shift();
|
|
|
@@ -120,6 +218,16 @@ function log( ...params ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Logs a warning message with the 'THREE.' prefix.
|
|
|
+ *
|
|
|
+ * If a custom console function is set via setConsoleFunction(), it will be used
|
|
|
+ * instead of the native console.warn. The first parameter is treated as the
|
|
|
+ * method name and is automatically prefixed with 'THREE.'.
|
|
|
+ *
|
|
|
+ * @param {...any} params - The message components. The first param is used as
|
|
|
+ * the method name and prefixed with 'THREE.'.
|
|
|
+ */
|
|
|
function warn( ...params ) {
|
|
|
|
|
|
const message = 'THREE.' + params.shift();
|
|
|
@@ -136,6 +244,16 @@ function warn( ...params ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Logs an error message with the 'THREE.' prefix.
|
|
|
+ *
|
|
|
+ * If a custom console function is set via setConsoleFunction(), it will be used
|
|
|
+ * instead of the native console.error. The first parameter is treated as the
|
|
|
+ * method name and is automatically prefixed with 'THREE.'.
|
|
|
+ *
|
|
|
+ * @param {...any} params - The message components. The first param is used as
|
|
|
+ * the method name and prefixed with 'THREE.'.
|
|
|
+ */
|
|
|
function error( ...params ) {
|
|
|
|
|
|
const message = 'THREE.' + params.shift();
|
|
|
@@ -152,6 +270,15 @@ function error( ...params ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Logs a warning message only once, preventing duplicate warnings.
|
|
|
+ *
|
|
|
+ * This function maintains an internal cache of warning messages and will only
|
|
|
+ * output each unique warning message once. Useful for warnings that may be
|
|
|
+ * triggered repeatedly but should only be shown to the user once.
|
|
|
+ *
|
|
|
+ * @param {...any} params - The warning message components.
|
|
|
+ */
|
|
|
function warnOnce( ...params ) {
|
|
|
|
|
|
const message = params.join( ' ' );
|
|
|
@@ -164,6 +291,20 @@ function warnOnce( ...params ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Asynchronously probes for WebGL sync object completion.
|
|
|
+ *
|
|
|
+ * This function creates a promise that resolves when the WebGL sync object
|
|
|
+ * signals completion or rejects if the sync operation fails. It uses polling
|
|
|
+ * at the specified interval to check the sync status without blocking the
|
|
|
+ * main thread. This is useful for GPU-CPU synchronization in WebGL contexts.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {WebGLRenderingContext|WebGL2RenderingContext} gl - The WebGL rendering context.
|
|
|
+ * @param {WebGLSync} sync - The WebGL sync object to wait for.
|
|
|
+ * @param {number} interval - The polling interval in milliseconds.
|
|
|
+ * @return {Promise<void>} A promise that resolves when the sync completes or rejects if it fails.
|
|
|
+ */
|
|
|
function probeAsync( gl, sync, interval ) {
|
|
|
|
|
|
return new Promise( function ( resolve, reject ) {
|
|
|
@@ -193,6 +334,18 @@ function probeAsync( gl, sync, interval ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Converts a projection matrix from normalized device coordinates (NDC)
|
|
|
+ * range [-1, 1] to [0, 1].
|
|
|
+ *
|
|
|
+ * This conversion is commonly needed when working with depth textures or
|
|
|
+ * render targets that expect depth values in the [0, 1] range rather than
|
|
|
+ * the standard OpenGL NDC range of [-1, 1]. The function modifies the
|
|
|
+ * projection matrix in place.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {Matrix4} projectionMatrix - The projection matrix to convert (modified in place).
|
|
|
+ */
|
|
|
function toNormalizedProjectionMatrix( projectionMatrix ) {
|
|
|
|
|
|
const m = projectionMatrix.elements;
|
|
|
@@ -205,6 +358,21 @@ function toNormalizedProjectionMatrix( projectionMatrix ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Reverses the depth range of a projection matrix.
|
|
|
+ *
|
|
|
+ * This function inverts the depth mapping of a projection matrix, which is
|
|
|
+ * useful for reversed-Z depth buffer techniques that can improve depth
|
|
|
+ * precision. The function handles both perspective and orthographic projection
|
|
|
+ * matrices differently and modifies the matrix in place.
|
|
|
+ *
|
|
|
+ * For perspective matrices (where m[11] === -1), the depth mapping is
|
|
|
+ * reversed with an offset. For orthographic matrices, a simpler reversal
|
|
|
+ * is applied.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @param {Matrix4} projectionMatrix - The projection matrix to reverse (modified in place).
|
|
|
+ */
|
|
|
function toReversedProjectionMatrix( projectionMatrix ) {
|
|
|
|
|
|
const m = projectionMatrix.elements;
|