three
Version:
JavaScript 3D library
1,721 lines • 52.4 kB
JavaScript
import { int, uint, float, vec3, bool, uvec3, vec2, vec4, If, Fn } from '../tsl/TSLBase.js';
import { select } from '../math/ConditionalNode.js';
import { add, sub, mul } from '../math/OperatorNode.js';
import { floor, abs, max, dot, sqrt, clamp, fract } from '../math/MathNode.js';
import { overloadingFn } from '../utils/FunctionOverloadingNode.js';
import { Loop } from '../utils/LoopNode.js';
import { mx_rotate2d, mx_rotate3d } from './MaterialXCore.js';
export const mx_select = /*@__PURE__*/ Fn( ( [ b_immutable, t_immutable, f_immutable ] ) => {
const f = float( f_immutable ).toVar();
const t = float( t_immutable ).toVar();
const b = bool( b_immutable ).toVar();
return select( b, t, f ).uniformFlow();
} ).setLayout( {
name: 'mx_select',
type: 'float',
inputs: [
{ name: 'b', type: 'bool' },
{ name: 't', type: 'float' },
{ name: 'f', type: 'float' }
]
} );
export const mx_negate_if = /*@__PURE__*/ Fn( ( [ val_immutable, b_immutable ] ) => {
const b = bool( b_immutable ).toVar();
const val = float( val_immutable ).toVar();
return select( b, val.negate(), val ).uniformFlow();
} ).setLayout( {
name: 'mx_negate_if',
type: 'float',
inputs: [
{ name: 'val', type: 'float' },
{ name: 'b', type: 'bool' }
]
} );
export const mx_floor = /*@__PURE__*/ Fn( ( [ x_immutable ] ) => {
const x = float( x_immutable ).toVar();
return int( floor( x ) );
} ).setLayout( {
name: 'mx_floor',
type: 'int',
inputs: [
{ name: 'x', type: 'float' }
]
} );
export const mx_floorfrac = /*@__PURE__*/ Fn( ( [ x_immutable, i ] ) => {
const x = float( x_immutable ).toVar();
i.assign( mx_floor( x ) );
return x.sub( float( i ) );
} );
const mxBilerpValue = ( v0, v1, v2, v3, s, t ) => {
const s1 = float( sub( 1.0, s ) ).toVar();
return sub( 1.0, t ).mul( v0.mul( s1 ).add( v1.mul( s ) ) ).add( t.mul( v2.mul( s1 ).add( v3.mul( s ) ) ) );
};
const mxTrilerpValue = ( v0, v1, v2, v3, v4, v5, v6, v7, s, t, r ) => {
const s1 = float( sub( 1.0, s ) ).toVar();
const t1 = float( sub( 1.0, t ) ).toVar();
const r1 = float( sub( 1.0, r ) ).toVar();
return r1.mul( t1.mul( v0.mul( s1 ).add( v1.mul( s ) ) ).add( t.mul( v2.mul( s1 ).add( v3.mul( s ) ) ) ) ).add( r.mul( t1.mul( v4.mul( s1 ).add( v5.mul( s ) ) ).add( t.mul( v6.mul( s1 ).add( v7.mul( s ) ) ) ) ) );
};
export const mx_bilerp_0 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, s_immutable, t_immutable ] ) => {
const t = float( t_immutable ).toVar();
const s = float( s_immutable ).toVar();
const v3 = float( v3_immutable ).toVar();
const v2 = float( v2_immutable ).toVar();
const v1 = float( v1_immutable ).toVar();
const v0 = float( v0_immutable ).toVar();
return mxBilerpValue( v0, v1, v2, v3, s, t );
} ).setLayout( {
name: 'mx_bilerp_0',
type: 'float',
inputs: [
{ name: 'v0', type: 'float' },
{ name: 'v1', type: 'float' },
{ name: 'v2', type: 'float' },
{ name: 'v3', type: 'float' },
{ name: 's', type: 'float' },
{ name: 't', type: 'float' }
]
} );
export const mx_bilerp_1 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, s_immutable, t_immutable ] ) => {
const t = float( t_immutable ).toVar();
const s = float( s_immutable ).toVar();
const v3 = vec3( v3_immutable ).toVar();
const v2 = vec3( v2_immutable ).toVar();
const v1 = vec3( v1_immutable ).toVar();
const v0 = vec3( v0_immutable ).toVar();
return mxBilerpValue( v0, v1, v2, v3, s, t );
} ).setLayout( {
name: 'mx_bilerp_1',
type: 'vec3',
inputs: [
{ name: 'v0', type: 'vec3' },
{ name: 'v1', type: 'vec3' },
{ name: 'v2', type: 'vec3' },
{ name: 'v3', type: 'vec3' },
{ name: 's', type: 'float' },
{ name: 't', type: 'float' }
]
} );
export const mx_bilerp = /*@__PURE__*/ overloadingFn( [ mx_bilerp_0, mx_bilerp_1 ] );
export const mx_trilerp_0 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, v4_immutable, v5_immutable, v6_immutable, v7_immutable, s_immutable, t_immutable, r_immutable ] ) => {
const r = float( r_immutable ).toVar();
const t = float( t_immutable ).toVar();
const s = float( s_immutable ).toVar();
const v7 = float( v7_immutable ).toVar();
const v6 = float( v6_immutable ).toVar();
const v5 = float( v5_immutable ).toVar();
const v4 = float( v4_immutable ).toVar();
const v3 = float( v3_immutable ).toVar();
const v2 = float( v2_immutable ).toVar();
const v1 = float( v1_immutable ).toVar();
const v0 = float( v0_immutable ).toVar();
return mxTrilerpValue( v0, v1, v2, v3, v4, v5, v6, v7, s, t, r );
} ).setLayout( {
name: 'mx_trilerp_0',
type: 'float',
inputs: [
{ name: 'v0', type: 'float' },
{ name: 'v1', type: 'float' },
{ name: 'v2', type: 'float' },
{ name: 'v3', type: 'float' },
{ name: 'v4', type: 'float' },
{ name: 'v5', type: 'float' },
{ name: 'v6', type: 'float' },
{ name: 'v7', type: 'float' },
{ name: 's', type: 'float' },
{ name: 't', type: 'float' },
{ name: 'r', type: 'float' }
]
} );
export const mx_trilerp_1 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, v4_immutable, v5_immutable, v6_immutable, v7_immutable, s_immutable, t_immutable, r_immutable ] ) => {
const r = float( r_immutable ).toVar();
const t = float( t_immutable ).toVar();
const s = float( s_immutable ).toVar();
const v7 = vec3( v7_immutable ).toVar();
const v6 = vec3( v6_immutable ).toVar();
const v5 = vec3( v5_immutable ).toVar();
const v4 = vec3( v4_immutable ).toVar();
const v3 = vec3( v3_immutable ).toVar();
const v2 = vec3( v2_immutable ).toVar();
const v1 = vec3( v1_immutable ).toVar();
const v0 = vec3( v0_immutable ).toVar();
return mxTrilerpValue( v0, v1, v2, v3, v4, v5, v6, v7, s, t, r );
} ).setLayout( {
name: 'mx_trilerp_1',
type: 'vec3',
inputs: [
{ name: 'v0', type: 'vec3' },
{ name: 'v1', type: 'vec3' },
{ name: 'v2', type: 'vec3' },
{ name: 'v3', type: 'vec3' },
{ name: 'v4', type: 'vec3' },
{ name: 'v5', type: 'vec3' },
{ name: 'v6', type: 'vec3' },
{ name: 'v7', type: 'vec3' },
{ name: 's', type: 'float' },
{ name: 't', type: 'float' },
{ name: 'r', type: 'float' }
]
} );
export const mx_trilerp = /*@__PURE__*/ overloadingFn( [ mx_trilerp_0, mx_trilerp_1 ] );
export const mx_gradient_float_0 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable ] ) => {
const y = float( y_immutable ).toVar();
const x = float( x_immutable ).toVar();
const hash = uint( hash_immutable ).toVar();
const h = uint( hash.bitAnd( uint( 7 ) ) ).toVar();
const u = float( mx_select( h.lessThan( uint( 4 ) ), x, y ) ).toVar();
const v = float( mul( 2.0, mx_select( h.lessThan( uint( 4 ) ), y, x ) ) ).toVar();
return mx_negate_if( u, bool( h.bitAnd( uint( 1 ) ) ) ).add( mx_negate_if( v, bool( h.bitAnd( uint( 2 ) ) ) ) );
} ).setLayout( {
name: 'mx_gradient_float_0',
type: 'float',
inputs: [
{ name: 'hash', type: 'uint' },
{ name: 'x', type: 'float' },
{ name: 'y', type: 'float' }
]
} );
export const mx_gradient_float_1 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable, z_immutable ] ) => {
const z = float( z_immutable ).toVar();
const y = float( y_immutable ).toVar();
const x = float( x_immutable ).toVar();
const hash = uint( hash_immutable ).toVar();
const h = uint( hash.bitAnd( uint( 15 ) ) ).toVar();
const u = float( mx_select( h.lessThan( uint( 8 ) ), x, y ) ).toVar();
const v = float( mx_select( h.lessThan( uint( 4 ) ), y, mx_select( h.equal( uint( 12 ) ).or( h.equal( uint( 14 ) ) ), x, z ) ) ).toVar();
return mx_negate_if( u, bool( h.bitAnd( uint( 1 ) ) ) ).add( mx_negate_if( v, bool( h.bitAnd( uint( 2 ) ) ) ) );
} ).setLayout( {
name: 'mx_gradient_float_1',
type: 'float',
inputs: [
{ name: 'hash', type: 'uint' },
{ name: 'x', type: 'float' },
{ name: 'y', type: 'float' },
{ name: 'z', type: 'float' }
]
} );
export const mx_gradient_float = /*@__PURE__*/ overloadingFn( [ mx_gradient_float_0, mx_gradient_float_1 ] );
export const mx_gradient_vec3_0 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable ] ) => {
const y = float( y_immutable ).toVar();
const x = float( x_immutable ).toVar();
const hash = uvec3( hash_immutable ).toVar();
return vec3( mx_gradient_float( hash.x, x, y ), mx_gradient_float( hash.y, x, y ), mx_gradient_float( hash.z, x, y ) );
} ).setLayout( {
name: 'mx_gradient_vec3_0',
type: 'vec3',
inputs: [
{ name: 'hash', type: 'uvec3' },
{ name: 'x', type: 'float' },
{ name: 'y', type: 'float' }
]
} );
export const mx_gradient_vec3_1 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable, z_immutable ] ) => {
const z = float( z_immutable ).toVar();
const y = float( y_immutable ).toVar();
const x = float( x_immutable ).toVar();
const hash = uvec3( hash_immutable ).toVar();
return vec3( mx_gradient_float( hash.x, x, y, z ), mx_gradient_float( hash.y, x, y, z ), mx_gradient_float( hash.z, x, y, z ) );
} ).setLayout( {
name: 'mx_gradient_vec3_1',
type: 'vec3',
inputs: [
{ name: 'hash', type: 'uvec3' },
{ name: 'x', type: 'float' },
{ name: 'y', type: 'float' },
{ name: 'z', type: 'float' }
]
} );
export const mx_gradient_vec3 = /*@__PURE__*/ overloadingFn( [ mx_gradient_vec3_0, mx_gradient_vec3_1 ] );
export const mx_gradient_scale2d_0 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {
const v = float( v_immutable ).toVar();
return mul( 0.6616, v );
} ).setLayout( {
name: 'mx_gradient_scale2d_0',
type: 'float',
inputs: [
{ name: 'v', type: 'float' }
]
} );
export const mx_gradient_scale3d_0 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {
const v = float( v_immutable ).toVar();
return mul( 0.9820, v );
} ).setLayout( {
name: 'mx_gradient_scale3d_0',
type: 'float',
inputs: [
{ name: 'v', type: 'float' }
]
} );
export const mx_gradient_scale2d_1 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {
const v = vec3( v_immutable ).toVar();
return mul( 0.6616, v );
} ).setLayout( {
name: 'mx_gradient_scale2d_1',
type: 'vec3',
inputs: [
{ name: 'v', type: 'vec3' }
]
} );
export const mx_gradient_scale2d = /*@__PURE__*/ overloadingFn( [ mx_gradient_scale2d_0, mx_gradient_scale2d_1 ] );
export const mx_gradient_scale3d_1 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {
const v = vec3( v_immutable ).toVar();
return mul( 0.9820, v );
} ).setLayout( {
name: 'mx_gradient_scale3d_1',
type: 'vec3',
inputs: [
{ name: 'v', type: 'vec3' }
]
} );
export const mx_gradient_scale3d = /*@__PURE__*/ overloadingFn( [ mx_gradient_scale3d_0, mx_gradient_scale3d_1 ] );
export const mx_rotl32 = /*@__PURE__*/ Fn( ( [ x_immutable, k_immutable ] ) => {
const k = int( k_immutable ).toVar();
const x = uint( x_immutable ).toVar();
return x.shiftLeft( k ).bitOr( x.shiftRight( int( 32 ).sub( k ) ) );
} ).setLayout( {
name: 'mx_rotl32',
type: 'uint',
inputs: [
{ name: 'x', type: 'uint' },
{ name: 'k', type: 'int' }
]
} );
export const mx_bjmix = /*@__PURE__*/ Fn( ( [ a, b, c ] ) => {
a = uint( a ).toVar();
b = uint( b ).toVar();
c = uint( c ).toVar();
a.subAssign( c );
a.bitXorAssign( mx_rotl32( c, int( 4 ) ) );
c.addAssign( b );
b.subAssign( a );
b.bitXorAssign( mx_rotl32( a, int( 6 ) ) );
a.addAssign( c );
c.subAssign( b );
c.bitXorAssign( mx_rotl32( b, int( 8 ) ) );
b.addAssign( a );
a.subAssign( c );
a.bitXorAssign( mx_rotl32( c, int( 16 ) ) );
c.addAssign( b );
b.subAssign( a );
b.bitXorAssign( mx_rotl32( a, int( 19 ) ) );
a.addAssign( c );
c.subAssign( b );
c.bitXorAssign( mx_rotl32( b, int( 4 ) ) );
b.addAssign( a );
return uvec3( a, b, c );
} ).setLayout( {
name: 'mx_bjmix',
type: 'uvec3',
inputs: [
{ name: 'a', type: 'uint' },
{ name: 'b', type: 'uint' },
{ name: 'c', type: 'uint' }
]
} );
export const mx_bjfinal = /*@__PURE__*/ Fn( ( [ a_immutable, b_immutable, c_immutable ] ) => {
const c = uint( c_immutable ).toVar();
const b = uint( b_immutable ).toVar();
const a = uint( a_immutable ).toVar();
c.bitXorAssign( b );
c.subAssign( mx_rotl32( b, int( 14 ) ) );
a.bitXorAssign( c );
a.subAssign( mx_rotl32( c, int( 11 ) ) );
b.bitXorAssign( a );
b.subAssign( mx_rotl32( a, int( 25 ) ) );
c.bitXorAssign( b );
c.subAssign( mx_rotl32( b, int( 16 ) ) );
a.bitXorAssign( c );
a.subAssign( mx_rotl32( c, int( 4 ) ) );
b.bitXorAssign( a );
b.subAssign( mx_rotl32( a, int( 14 ) ) );
c.bitXorAssign( b );
c.subAssign( mx_rotl32( b, int( 24 ) ) );
return c;
} ).setLayout( {
name: 'mx_bjfinal',
type: 'uint',
inputs: [
{ name: 'a', type: 'uint' },
{ name: 'b', type: 'uint' },
{ name: 'c', type: 'uint' }
]
} );
export const mx_bits_to_01 = /*@__PURE__*/ Fn( ( [ bits_immutable ] ) => {
const bits = uint( bits_immutable ).toVar();
return float( bits ).div( float( uint( 0xffffffff ) ) );
} ).setLayout( {
name: 'mx_bits_to_01',
type: 'float',
inputs: [
{ name: 'bits', type: 'uint' }
]
} );
export const mx_fade = /*@__PURE__*/ Fn( ( [ t_immutable ] ) => {
const t = float( t_immutable ).toVar();
return t.mul( t ).mul( t ).mul( t.mul( t.mul( 6.0 ).sub( 15.0 ) ).add( 10.0 ) );
} ).setLayout( {
name: 'mx_fade',
type: 'float',
inputs: [
{ name: 't', type: 'float' }
]
} );
export const mx_hash_int_0 = /*@__PURE__*/ Fn( ( [ x_immutable ] ) => {
const x = int( x_immutable ).toVar();
const len = uint( uint( 1 ) ).toVar();
const seed = uint( uint( 0xdeadbeef ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ).toVar();
return mx_bjfinal( seed.add( uint( x ) ), seed, seed );
} ).setLayout( {
name: 'mx_hash_int_0',
type: 'uint',
inputs: [
{ name: 'x', type: 'int' }
]
} );
export const mx_hash_int_1 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable ] ) => {
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const len = uint( uint( 2 ) ).toVar();
const a = uint().toVar(), b = uint().toVar(), c = uint().toVar();
a.assign( b.assign( c.assign( uint( 0xdeadbeef ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );
a.addAssign( uint( x ) );
b.addAssign( uint( y ) );
return mx_bjfinal( a, b, c );
} ).setLayout( {
name: 'mx_hash_int_1',
type: 'uint',
inputs: [
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' }
]
} );
export const mx_hash_int_2 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable ] ) => {
const z = int( z_immutable ).toVar();
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const len = uint( uint( 3 ) ).toVar();
const a = uint().toVar(), b = uint().toVar(), c = uint().toVar();
a.assign( b.assign( c.assign( uint( 0xdeadbeef ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );
a.addAssign( uint( x ) );
b.addAssign( uint( y ) );
c.addAssign( uint( z ) );
return mx_bjfinal( a, b, c );
} ).setLayout( {
name: 'mx_hash_int_2',
type: 'uint',
inputs: [
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' },
{ name: 'z', type: 'int' }
]
} );
export const mx_hash_int_3 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable, xx_immutable ] ) => {
const xx = int( xx_immutable ).toVar();
const z = int( z_immutable ).toVar();
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const len = uint( uint( 4 ) ).toVar();
const a = uint().toVar(), b = uint().toVar(), c = uint().toVar();
a.assign( b.assign( c.assign( uint( 0xdeadbeef ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );
a.addAssign( uint( x ) );
b.addAssign( uint( y ) );
c.addAssign( uint( z ) );
const mixed = uvec3( mx_bjmix( a, b, c ) ).toVar();
a.assign( mixed.x );
b.assign( mixed.y );
c.assign( mixed.z );
a.addAssign( uint( xx ) );
return mx_bjfinal( a, b, c );
} ).setLayout( {
name: 'mx_hash_int_3',
type: 'uint',
inputs: [
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' },
{ name: 'z', type: 'int' },
{ name: 'xx', type: 'int' }
]
} );
export const mx_hash_int_4 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable, xx_immutable, yy_immutable ] ) => {
const yy = int( yy_immutable ).toVar();
const xx = int( xx_immutable ).toVar();
const z = int( z_immutable ).toVar();
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const len = uint( uint( 5 ) ).toVar();
const a = uint().toVar(), b = uint().toVar(), c = uint().toVar();
a.assign( b.assign( c.assign( uint( 0xdeadbeef ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );
a.addAssign( uint( x ) );
b.addAssign( uint( y ) );
c.addAssign( uint( z ) );
const mixed = uvec3( mx_bjmix( a, b, c ) ).toVar();
a.assign( mixed.x );
b.assign( mixed.y );
c.assign( mixed.z );
a.addAssign( uint( xx ) );
b.addAssign( uint( yy ) );
return mx_bjfinal( a, b, c );
} ).setLayout( {
name: 'mx_hash_int_4',
type: 'uint',
inputs: [
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' },
{ name: 'z', type: 'int' },
{ name: 'xx', type: 'int' },
{ name: 'yy', type: 'int' }
]
} );
export const mx_hash_int = /*@__PURE__*/ overloadingFn( [ mx_hash_int_0, mx_hash_int_1, mx_hash_int_2, mx_hash_int_3, mx_hash_int_4 ] );
export const mx_hash_vec3_0 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable ] ) => {
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const h = uint( mx_hash_int( x, y ) ).toVar();
const result = uvec3().toVar();
result.x.assign( h.bitAnd( int( 0xFF ) ) );
result.y.assign( h.shiftRight( int( 8 ) ).bitAnd( int( 0xFF ) ) );
result.z.assign( h.shiftRight( int( 16 ) ).bitAnd( int( 0xFF ) ) );
return result;
} ).setLayout( {
name: 'mx_hash_vec3_0',
type: 'uvec3',
inputs: [
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' }
]
} );
export const mx_hash_vec3_1 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable ] ) => {
const z = int( z_immutable ).toVar();
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const h = uint( mx_hash_int( x, y, z ) ).toVar();
const result = uvec3().toVar();
result.x.assign( h.bitAnd( int( 0xFF ) ) );
result.y.assign( h.shiftRight( int( 8 ) ).bitAnd( int( 0xFF ) ) );
result.z.assign( h.shiftRight( int( 16 ) ).bitAnd( int( 0xFF ) ) );
return result;
} ).setLayout( {
name: 'mx_hash_vec3_1',
type: 'uvec3',
inputs: [
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' },
{ name: 'z', type: 'int' }
]
} );
export const mx_hash_vec3 = /*@__PURE__*/ overloadingFn( [ mx_hash_vec3_0, mx_hash_vec3_1 ] );
export const mx_perlin_noise_float_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec2( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar();
const fx = float( mx_floorfrac( p.x, X ) ).toVar();
const fy = float( mx_floorfrac( p.y, Y ) ).toVar();
const u = float( mx_fade( fx ) ).toVar();
const v = float( mx_fade( fy ) ).toVar();
const result = float( mx_bilerp( mx_gradient_float( mx_hash_int( X, Y ), fx, fy ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y ), fx.sub( 1.0 ), fy ), mx_gradient_float( mx_hash_int( X, Y.add( int( 1 ) ) ), fx, fy.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ) ), u, v ) ).toVar();
return mx_gradient_scale2d( result );
} ).setLayout( {
name: 'mx_perlin_noise_float_0',
type: 'float',
inputs: [
{ name: 'p', type: 'vec2' }
]
} );
export const mx_perlin_noise_float_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec3( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar(), Z = int().toVar();
const fx = float( mx_floorfrac( p.x, X ) ).toVar();
const fy = float( mx_floorfrac( p.y, Y ) ).toVar();
const fz = float( mx_floorfrac( p.z, Z ) ).toVar();
const u = float( mx_fade( fx ) ).toVar();
const v = float( mx_fade( fy ) ).toVar();
const w = float( mx_fade( fz ) ).toVar();
const result = float( mx_trilerp( mx_gradient_float( mx_hash_int( X, Y, Z ), fx, fy, fz ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y, Z ), fx.sub( 1.0 ), fy, fz ), mx_gradient_float( mx_hash_int( X, Y.add( int( 1 ) ), Z ), fx, fy.sub( 1.0 ), fz ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz ), mx_gradient_float( mx_hash_int( X, Y, Z.add( int( 1 ) ) ), fx, fy, fz.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y, Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy, fz.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X, Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx, fy.sub( 1.0 ), fz.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz.sub( 1.0 ) ), u, v, w ) ).toVar();
return mx_gradient_scale3d( result );
} ).setLayout( {
name: 'mx_perlin_noise_float_1',
type: 'float',
inputs: [
{ name: 'p', type: 'vec3' }
]
} );
export const mx_perlin_noise_float = /*@__PURE__*/ overloadingFn( [ mx_perlin_noise_float_0, mx_perlin_noise_float_1 ] );
export const mx_perlin_noise_vec3_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec2( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar();
const fx = float( mx_floorfrac( p.x, X ) ).toVar();
const fy = float( mx_floorfrac( p.y, Y ) ).toVar();
const u = float( mx_fade( fx ) ).toVar();
const v = float( mx_fade( fy ) ).toVar();
const result = vec3( mx_bilerp( mx_gradient_vec3( mx_hash_vec3( X, Y ), fx, fy ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y ), fx.sub( 1.0 ), fy ), mx_gradient_vec3( mx_hash_vec3( X, Y.add( int( 1 ) ) ), fx, fy.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ) ), u, v ) ).toVar();
return mx_gradient_scale2d( result );
} ).setLayout( {
name: 'mx_perlin_noise_vec3_0',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec2' }
]
} );
export const mx_perlin_noise_vec3_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec3( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar(), Z = int().toVar();
const fx = float( mx_floorfrac( p.x, X ) ).toVar();
const fy = float( mx_floorfrac( p.y, Y ) ).toVar();
const fz = float( mx_floorfrac( p.z, Z ) ).toVar();
const u = float( mx_fade( fx ) ).toVar();
const v = float( mx_fade( fy ) ).toVar();
const w = float( mx_fade( fz ) ).toVar();
const result = vec3( mx_trilerp( mx_gradient_vec3( mx_hash_vec3( X, Y, Z ), fx, fy, fz ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y, Z ), fx.sub( 1.0 ), fy, fz ), mx_gradient_vec3( mx_hash_vec3( X, Y.add( int( 1 ) ), Z ), fx, fy.sub( 1.0 ), fz ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz ), mx_gradient_vec3( mx_hash_vec3( X, Y, Z.add( int( 1 ) ) ), fx, fy, fz.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y, Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy, fz.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X, Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx, fy.sub( 1.0 ), fz.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz.sub( 1.0 ) ), u, v, w ) ).toVar();
return mx_gradient_scale3d( result );
} ).setLayout( {
name: 'mx_perlin_noise_vec3_1',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec3' }
]
} );
export const mx_perlin_noise_vec3 = /*@__PURE__*/ overloadingFn( [ mx_perlin_noise_vec3_0, mx_perlin_noise_vec3_1 ] );
export const mx_cell_noise_float_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = float( p_immutable ).toVar();
const ix = int( mx_floor( p ) ).toVar();
return mx_bits_to_01( mx_hash_int( ix ) );
} ).setLayout( {
name: 'mx_cell_noise_float_0',
type: 'float',
inputs: [
{ name: 'p', type: 'float' }
]
} );
export const mx_cell_noise_float_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec2( p_immutable ).toVar();
const ix = int( mx_floor( p.x ) ).toVar();
const iy = int( mx_floor( p.y ) ).toVar();
return mx_bits_to_01( mx_hash_int( ix, iy ) );
} ).setLayout( {
name: 'mx_cell_noise_float_1',
type: 'float',
inputs: [
{ name: 'p', type: 'vec2' }
]
} );
export const mx_cell_noise_float_2 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec3( p_immutable ).toVar();
const ix = int( mx_floor( p.x ) ).toVar();
const iy = int( mx_floor( p.y ) ).toVar();
const iz = int( mx_floor( p.z ) ).toVar();
return mx_bits_to_01( mx_hash_int( ix, iy, iz ) );
} ).setLayout( {
name: 'mx_cell_noise_float_2',
type: 'float',
inputs: [
{ name: 'p', type: 'vec3' }
]
} );
export const mx_cell_noise_float_3 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec4( p_immutable ).toVar();
const ix = int( mx_floor( p.x ) ).toVar();
const iy = int( mx_floor( p.y ) ).toVar();
const iz = int( mx_floor( p.z ) ).toVar();
const iw = int( mx_floor( p.w ) ).toVar();
return mx_bits_to_01( mx_hash_int( ix, iy, iz, iw ) );
} ).setLayout( {
name: 'mx_cell_noise_float_3',
type: 'float',
inputs: [
{ name: 'p', type: 'vec4' }
]
} );
export const mx_cell_noise_float = /*@__PURE__*/ overloadingFn( [ mx_cell_noise_float_0, mx_cell_noise_float_1, mx_cell_noise_float_2, mx_cell_noise_float_3 ] );
export const mx_cell_noise_vec3_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = float( p_immutable ).toVar();
const ix = int( mx_floor( p ) ).toVar();
return vec3(
mx_bits_to_01( mx_hash_int( ix, int( 0 ) ) ),
mx_bits_to_01( mx_hash_int( ix, int( 1 ) ) ),
mx_bits_to_01( mx_hash_int( ix, int( 2 ) ) )
);
} ).setLayout( {
name: 'mx_cell_noise_vec3_0',
type: 'vec3',
inputs: [
{ name: 'p', type: 'float' }
]
} );
export const mx_cell_noise_vec3_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec2( p_immutable ).toVar();
const ix = int( mx_floor( p.x ) ).toVar();
const iy = int( mx_floor( p.y ) ).toVar();
return vec3(
mx_bits_to_01( mx_hash_int( ix, iy, int( 0 ) ) ),
mx_bits_to_01( mx_hash_int( ix, iy, int( 1 ) ) ),
mx_bits_to_01( mx_hash_int( ix, iy, int( 2 ) ) )
);
} ).setLayout( {
name: 'mx_cell_noise_vec3_1',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec2' }
]
} );
export const mx_cell_noise_vec3_2 = /*@__PURE__*/ Fn( ( [ positionInput ] ) => {
const position = vec3( positionInput ).toVar();
const ix = int( floor( position.x ) ).toVar();
const iy = int( floor( position.y ) ).toVar();
const iz = int( floor( position.z ) ).toVar();
const seed = uint( 0xdeadbeef + ( 4 << 2 ) + 13 ).toVar();
const a = uint().toVar(), b = uint().toVar(), c = uint().toVar();
a.assign( b.assign( c.assign( seed ) ) );
a.addAssign( uint( ix ) );
b.addAssign( uint( iy ) );
c.addAssign( uint( iz ) );
const mixed = uvec3( mx_bjmix( a, b, c ) ).toVar();
const hash0 = mx_bjfinal( mixed.x, mixed.y, mixed.z );
const hash1 = mx_bjfinal( add( mixed.x, uint( 1 ) ), mixed.y, mixed.z );
const hash2 = mx_bjfinal( add( mixed.x, uint( 2 ) ), mixed.y, mixed.z );
return vec3(
mx_bits_to_01( hash0 ),
mx_bits_to_01( hash1 ),
mx_bits_to_01( hash2 )
);
} ).setLayout( {
name: 'mx_cell_noise_vec3_2',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec3' }
]
} );
export const mx_cell_noise_vec3_3 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {
const p = vec4( p_immutable ).toVar();
const ix = int( mx_floor( p.x ) ).toVar();
const iy = int( mx_floor( p.y ) ).toVar();
const iz = int( mx_floor( p.z ) ).toVar();
const iw = int( mx_floor( p.w ) ).toVar();
const seed = uint( 0xdeadbeef + ( 5 << 2 ) + 13 ).toVar();
const a = uint().toVar(), b = uint().toVar(), c = uint().toVar();
a.assign( b.assign( c.assign( seed ) ) );
a.addAssign( uint( ix ) );
b.addAssign( uint( iy ) );
c.addAssign( uint( iz ) );
const mixed = uvec3( mx_bjmix( a, b, c ) ).toVar();
a.assign( mixed.x );
b.assign( mixed.y );
c.assign( mixed.z );
a.addAssign( uint( iw ) );
return vec3(
mx_bits_to_01( mx_bjfinal( a, b, c ) ),
mx_bits_to_01( mx_bjfinal( a, add( b, uint( 1 ) ), c ) ),
mx_bits_to_01( mx_bjfinal( a, add( b, uint( 2 ) ), c ) )
);
} ).setLayout( {
name: 'mx_cell_noise_vec3_3',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec4' }
]
} );
export const mx_cell_noise_vec3 = /*@__PURE__*/ overloadingFn( [ mx_cell_noise_vec3_0, mx_cell_noise_vec3_1, mx_cell_noise_vec3_2, mx_cell_noise_vec3_3 ] );
const mx_cell_noise_vec3_3d = /*@__PURE__*/ Fn( ( [ positionInput ] ) => {
const position = vec3( positionInput ).toVar();
const ix = int( floor( position.x ) ).toVar();
const iy = int( floor( position.y ) ).toVar();
const iz = int( floor( position.z ) ).toVar();
const seed = uint( 0xdeadbeef + ( 4 << 2 ) + 13 ).toVar();
const a = uint().toVar(), b = uint().toVar(), c = uint().toVar();
a.assign( b.assign( c.assign( seed ) ) );
a.addAssign( uint( ix ) );
b.addAssign( uint( iy ) );
c.addAssign( uint( iz ) );
const mixed = uvec3( mx_bjmix( a, b, c ) ).toVar();
const hash0 = mx_bjfinal( mixed.x, mixed.y, mixed.z );
const hash1 = mx_bjfinal( add( mixed.x, uint( 1 ) ), mixed.y, mixed.z );
const hash2 = mx_bjfinal( add( mixed.x, uint( 2 ) ), mixed.y, mixed.z );
return vec3(
mx_bits_to_01( hash0 ),
mx_bits_to_01( hash1 ),
mx_bits_to_01( hash2 )
);
} );
export const mx_fractal_noise_float_2d = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {
const diminish = float( diminish_immutable ).toVar();
const lacunarity = float( lacunarity_immutable ).toVar();
const octaves = int( octaves_immutable ).toVar();
const p = vec2( p_immutable ).toVar();
const result = float( 0.0 ).toVar();
const amplitude = float( 1.0 ).toVar();
Loop( octaves, () => {
result.addAssign( amplitude.mul( mx_perlin_noise_float( p ) ) );
amplitude.mulAssign( diminish );
p.mulAssign( lacunarity );
} );
return result;
} ).setLayout( {
name: 'mx_fractal_noise_float_2d',
type: 'float',
inputs: [
{ name: 'p', type: 'vec2' },
{ name: 'octaves', type: 'int' },
{ name: 'lacunarity', type: 'float' },
{ name: 'diminish', type: 'float' }
]
} );
export const mx_fractal_noise_float = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {
const diminish = float( diminish_immutable ).toVar();
const lacunarity = float( lacunarity_immutable ).toVar();
const octaves = int( octaves_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
const result = float( 0.0 ).toVar();
const amplitude = float( 1.0 ).toVar();
Loop( octaves, () => {
result.addAssign( amplitude.mul( mx_perlin_noise_float( p ) ) );
amplitude.mulAssign( diminish );
p.mulAssign( lacunarity );
} );
return result;
} ).setLayout( {
name: 'mx_fractal_noise_float',
type: 'float',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'octaves', type: 'int' },
{ name: 'lacunarity', type: 'float' },
{ name: 'diminish', type: 'float' }
]
} );
export const mx_fractal_noise_vec3 = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {
const diminish = float( diminish_immutable ).toVar();
const lacunarity = float( lacunarity_immutable ).toVar();
const octaves = int( octaves_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
const result = vec3( 0.0 ).toVar();
const amplitude = float( 1.0 ).toVar();
Loop( octaves, () => {
result.addAssign( amplitude.mul( mx_perlin_noise_vec3( p ) ) );
amplitude.mulAssign( diminish );
p.mulAssign( lacunarity );
} );
return result;
} ).setLayout( {
name: 'mx_fractal_noise_vec3',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'octaves', type: 'int' },
{ name: 'lacunarity', type: 'float' },
{ name: 'diminish', type: 'float' }
]
} );
export const mx_fractal_noise_vec2 = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {
const diminish = float( diminish_immutable ).toVar();
const lacunarity = float( lacunarity_immutable ).toVar();
const octaves = int( octaves_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
return vec2( mx_fractal_noise_float( p, octaves, lacunarity, diminish ), mx_fractal_noise_float( p.add( vec3( int( 19 ), int( 193 ), int( 17 ) ) ), octaves, lacunarity, diminish ) );
} ).setLayout( {
name: 'mx_fractal_noise_vec2',
type: 'vec2',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'octaves', type: 'int' },
{ name: 'lacunarity', type: 'float' },
{ name: 'diminish', type: 'float' }
]
} );
export const mx_fractal_noise_vec4 = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {
const diminish = float( diminish_immutable ).toVar();
const lacunarity = float( lacunarity_immutable ).toVar();
const octaves = int( octaves_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
const c = vec3( mx_fractal_noise_vec3( p, octaves, lacunarity, diminish ) ).toVar();
const f = float( mx_fractal_noise_float( p.add( vec3( int( 19 ), int( 193 ), int( 17 ) ) ), octaves, lacunarity, diminish ) ).toVar();
return vec4( c, f );
} ).setLayout( {
name: 'mx_fractal_noise_vec4',
type: 'vec4',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'octaves', type: 'int' },
{ name: 'lacunarity', type: 'float' },
{ name: 'diminish', type: 'float' }
]
} );
export const mx_worley_distance_0 = /*@__PURE__*/ Fn( ( [ p_immutable, x_immutable, y_immutable, xoff_immutable, yoff_immutable, jitter_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const yoff = int( yoff_immutable ).toVar();
const xoff = int( xoff_immutable ).toVar();
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const p = vec2( p_immutable ).toVar();
const tmp = vec3( mx_cell_noise_vec3( vec2( x.add( xoff ), y.add( yoff ) ) ) ).toVar();
const off = vec2( tmp.x, tmp.y ).toVar();
off.subAssign( 0.5 );
off.mulAssign( jitter );
off.addAssign( 0.5 );
const cellpos = vec2( vec2( float( x ), float( y ) ).add( off ) ).toVar();
const diff = vec2( cellpos.sub( p ) ).toVar();
If( metric.equal( int( 2 ) ), () => {
return abs( diff.x ).add( abs( diff.y ) );
} );
If( metric.equal( int( 3 ) ), () => {
return max( abs( diff.x ), abs( diff.y ) );
} );
return dot( diff, diff );
} ).setLayout( {
name: 'mx_worley_distance_0',
type: 'float',
inputs: [
{ name: 'p', type: 'vec2' },
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' },
{ name: 'xoff', type: 'int' },
{ name: 'yoff', type: 'int' },
{ name: 'jitter', type: 'float' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_distance_1 = /*@__PURE__*/ Fn( ( [ p_immutable, x_immutable, y_immutable, z_immutable, xoff_immutable, yoff_immutable, zoff_immutable, jitter_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const zoff = int( zoff_immutable ).toVar();
const yoff = int( yoff_immutable ).toVar();
const xoff = int( xoff_immutable ).toVar();
const z = int( z_immutable ).toVar();
const y = int( y_immutable ).toVar();
const x = int( x_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
const off = vec3( mx_cell_noise_vec3_3d( vec3( x.add( xoff ), y.add( yoff ), z.add( zoff ) ) ) ).toVar();
off.subAssign( 0.5 );
off.mulAssign( jitter );
off.addAssign( 0.5 );
const cellpos = vec3( vec3( float( x ), float( y ), float( z ) ).add( off ) ).toVar();
const diff = vec3( cellpos.sub( p ) ).toVar();
If( metric.equal( int( 2 ) ), () => {
return abs( diff.x ).add( abs( diff.y ) ).add( abs( diff.z ) );
} );
If( metric.equal( int( 3 ) ), () => {
return max( abs( diff.x ), abs( diff.y ), abs( diff.z ) );
} );
return dot( diff, diff );
} ).setLayout( {
name: 'mx_worley_distance_1',
type: 'float',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'x', type: 'int' },
{ name: 'y', type: 'int' },
{ name: 'z', type: 'int' },
{ name: 'xoff', type: 'int' },
{ name: 'yoff', type: 'int' },
{ name: 'zoff', type: 'int' },
{ name: 'jitter', type: 'float' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_distance = /*@__PURE__*/ overloadingFn( [ mx_worley_distance_0, mx_worley_distance_1 ] );
const mx_perlin_noise_float_scaled = ( texcoord, amplitude = 1, pivot = 0 ) => mx_perlin_noise_float( texcoord ).mul( amplitude ).add( pivot );
export const mx_worley_noise_float_3d = /*@__PURE__*/ Fn( ( [ positionInput, jitterInput, styleInput ] ) => {
const position = vec3( positionInput ).toVar();
const jitter = float( jitterInput ).toVar();
const style = int( styleInput ).toVar();
const X = int().toVar(), Y = int().toVar(), Z = int().toVar();
const localpos = vec3( mx_floorfrac( position.x, X ), mx_floorfrac( position.y, Y ), mx_floorfrac( position.z, Z ) ).toVar();
const sqdist = float( 1e6 ).toVar();
const minpos = vec3( 0, 0, 0 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'z', condition: '<=' }, ( { z } ) => {
const dist = float( mx_worley_distance( localpos, x, y, z, X, Y, Z, jitter, int( 0 ) ) ).toVar();
const off = vec3( mx_cell_noise_vec3_3d( vec3( X.add( x ), Y.add( y ), Z.add( z ) ) ) ).toVar();
off.subAssign( 0.5 );
off.mulAssign( jitter );
off.addAssign( 0.5 );
const cellpos = vec3( vec3( float( x ), float( y ), float( z ) ).add( off ).sub( localpos ) ).toVar();
If( dist.lessThan( sqdist ), () => {
sqdist.assign( dist );
minpos.assign( cellpos );
} );
} );
} );
} );
If( style.equal( int( 1 ) ), () => {
sqdist.assign( mx_cell_noise_float( minpos.add( position ) ) );
} ).Else( () => {
sqdist.assign( sqrt( sqdist ) );
} );
return sqdist;
} );
export const mx_worley_noise_float_2d = /*@__PURE__*/ Fn( ( [ texcoordInput, jitterInput, styleInput ] ) => {
const texcoord = vec2( texcoordInput ).toVar();
const jitter = float( jitterInput ).toVar();
const style = int( styleInput ).toVar();
const floorPos = floor( texcoord ).toVar();
const localpos = vec2( fract( texcoord.x ), fract( texcoord.y ) ).toVar();
const sqdist = float( 1e6 ).toVar();
const minpos = vec2( 0, 0 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
const cell = vec2( float( x ), float( y ) ).toVar();
const seed = vec2( cell.x.add( floorPos.x ), cell.y.add( floorPos.y ) ).toVar();
const off = vec2( mx_cell_noise_float( vec3( seed.x, seed.y, 0 ) ), mx_cell_noise_float( vec3( seed.x, seed.y, 1 ) ) ).toVar();
off.subAssign( 0.5 );
off.mulAssign( jitter );
off.addAssign( 0.5 );
const cellpos = vec2( cell.add( off ).sub( localpos ) ).toVar();
const dist = dot( cellpos, cellpos ).toVar();
If( dist.lessThan( sqdist ), () => {
sqdist.assign( dist );
minpos.assign( cellpos );
} );
} );
} );
If( style.equal( int( 1 ) ), () => {
sqdist.assign( mx_cell_noise_float( minpos.add( texcoord ) ) );
} ).Else( () => {
sqdist.assign( sqrt( sqdist ) );
} );
return sqdist;
} );
export const mx_worley_noise_float = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_float_2d, mx_worley_noise_float_3d ] );
export const mx_worley_noise_vec2_0 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const p = vec2( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar();
const localpos = vec2( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ) ).toVar();
const sqdist = vec2( 1e6, 1e6 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
const dist = float( mx_worley_distance( localpos, x, y, X, Y, jitter, metric ) ).toVar();
If( dist.lessThan( sqdist.x ), () => {
sqdist.y.assign( sqdist.x );
sqdist.x.assign( dist );
} ).ElseIf( dist.lessThan( sqdist.y ), () => {
sqdist.y.assign( dist );
} );
} );
} );
If( metric.equal( int( 0 ) ), () => {
sqdist.assign( sqrt( sqdist ) );
} );
return sqdist;
} ).setLayout( {
name: 'mx_worley_noise_vec2_0',
type: 'vec2',
inputs: [
{ name: 'p', type: 'vec2' },
{ name: 'jitter', type: 'float' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_noise_vec3_0 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const p = vec2( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar();
const localpos = vec2( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ) ).toVar();
const sqdist = vec3( 1e6, 1e6, 1e6 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
const dist = float( mx_worley_distance( localpos, x, y, X, Y, jitter, metric ) ).toVar();
If( dist.lessThan( sqdist.x ), () => {
sqdist.z.assign( sqdist.y );
sqdist.y.assign( sqdist.x );
sqdist.x.assign( dist );
} ).ElseIf( dist.lessThan( sqdist.y ), () => {
sqdist.z.assign( sqdist.y );
sqdist.y.assign( dist );
} ).ElseIf( dist.lessThan( sqdist.z ), () => {
sqdist.z.assign( dist );
} );
} );
} );
If( metric.equal( int( 0 ) ), () => {
sqdist.assign( sqrt( sqdist ) );
} );
return sqdist;
} ).setLayout( {
name: 'mx_worley_noise_vec3_0',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec2' },
{ name: 'jitter', type: 'float' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_noise_vec2_1 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar(), Z = int().toVar();
const localpos = vec3( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ), mx_floorfrac( p.z, Z ) ).toVar();
const sqdist = vec2( 1e6, 1e6 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'z', condition: '<=' }, ( { z } ) => {
const dist = float( mx_worley_distance( localpos, x, y, z, X, Y, Z, jitter, metric ) ).toVar();
If( dist.lessThan( sqdist.x ), () => {
sqdist.y.assign( sqdist.x );
sqdist.x.assign( dist );
} ).ElseIf( dist.lessThan( sqdist.y ), () => {
sqdist.y.assign( dist );
} );
} );
} );
} );
If( metric.equal( int( 0 ) ), () => {
sqdist.assign( sqrt( sqdist ) );
} );
return sqdist;
} ).setLayout( {
name: 'mx_worley_noise_vec2_1',
type: 'vec2',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'jitter', type: 'float' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_noise_vec2 = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_vec2_0, mx_worley_noise_vec2_1 ] );
export const mx_worley_noise_vec3_1 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar(), Z = int().toVar();
const localpos = vec3( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ), mx_floorfrac( p.z, Z ) ).toVar();
const sqdist = vec3( 1e6, 1e6, 1e6 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'z', condition: '<=' }, ( { z } ) => {
const dist = float( mx_worley_distance( localpos, x, y, z, X, Y, Z, jitter, metric ) ).toVar();
If( dist.lessThan( sqdist.x ), () => {
sqdist.z.assign( sqdist.y );
sqdist.y.assign( sqdist.x );
sqdist.x.assign( dist );
} ).ElseIf( dist.lessThan( sqdist.y ), () => {
sqdist.z.assign( sqdist.y );
sqdist.y.assign( dist );
} ).ElseIf( dist.lessThan( sqdist.z ), () => {
sqdist.z.assign( dist );
} );
} );
} );
} );
If( metric.equal( int( 0 ) ), () => {
sqdist.assign( sqrt( sqdist ) );
} );
return sqdist;
} ).setLayout( {
name: 'mx_worley_noise_vec3_1',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'jitter', type: 'float' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_noise_vec3 = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_vec3_0, mx_worley_noise_vec3_1 ] );
export const mx_worley_noise_vec3_style_0 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, style_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const style = int( style_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const p = vec2( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar();
const localpos = vec2( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ) ).toVar();
const sqdist = float( 1e6 ).toVar();
const minpos = vec2( 0, 0 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
const dist = float( mx_worley_distance( localpos, x, y, X, Y, jitter, metric ) ).toVar();
const tmp = vec3( mx_cell_noise_vec3( vec2( X.add( x ), Y.add( y ) ) ) ).toVar();
const off = vec2( tmp.x, tmp.y ).toVar();
off.subAssign( 0.5 );
off.mulAssign( jitter );
off.addAssign( 0.5 );
const cellpos = vec2( vec2( float( x ), float( y ) ).add( off ).sub( localpos ) ).toVar();
If( dist.lessThan( sqdist ), () => {
sqdist.assign( dist );
minpos.assign( cellpos );
} );
} );
} );
const result = vec3( mx_worley_noise_vec3( p, jitter, metric ) ).toVar();
If( style.equal( int( 1 ) ), () => {
result.assign( mx_cell_noise_vec3( minpos.add( p ) ) );
} );
return result;
} ).setLayout( {
name: 'mx_worley_noise_vec3_style_0',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec2' },
{ name: 'jitter', type: 'float' },
{ name: 'style', type: 'int' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_noise_vec3_style_1 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, style_immutable, metric_immutable ] ) => {
const metric = int( metric_immutable ).toVar();
const style = int( style_immutable ).toVar();
const jitter = float( jitter_immutable ).toVar();
const p = vec3( p_immutable ).toVar();
const X = int().toVar(), Y = int().toVar(), Z = int().toVar();
const localpos = vec3( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ), mx_floorfrac( p.z, Z ) ).toVar();
const sqdist = float( 1e6 ).toVar();
const minpos = vec3( 0, 0, 0 ).toVar();
Loop( { start: - 1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {
Loop( { start: - 1, end: int( 1 ), name: 'z', condition: '<=' }, ( { z } ) => {
const dist = float( mx_worley_distance( localpos, x, y, z, X, Y, Z, jitter, metric ) ).toVar();
const off = vec3( mx_cell_noise_vec3_3d( vec3( X.add( x ), Y.add( y ), Z.add( z ) ) ) ).toVar();
off.subAssign( 0.5 );
off.mulAssign( jitter );
off.addAssign( 0.5 );
const cellpos = vec3( vec3( float( x ), float( y ), float( z ) ).add( off ).sub( localpos ) ).toVar();
If( dist.lessThan( sqdist ), () => {
sqdist.assign( dist );
minpos.assign( cellpos );
} );
} );
} );
} );
const result = vec3( mx_worley_noise_vec3( p, jitter, metric ) ).toVar();
If( style.equal( int( 1 ) ), () => {
result.assign( mx_cell_noise_vec3_3d( minpos.add( p ) ) );
} );
return result;
} ).setLayout( {
name: 'mx_worley_noise_vec3_style_1',
type: 'vec3',
inputs: [
{ name: 'p', type: 'vec3' },
{ name: 'jitter', type: 'float' },
{ name: 'style', type: 'int' },
{ name: 'metric', type: 'int' }
]
} );
export const mx_worley_noise_vec3_style = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_vec3_style_0, mx_worley_noise_vec3_style_1 ] );
// Unified Noise 2D
export const mx_unifiednoise2d = /*@__PURE__*/ Fn( ( [
noiseTypeInput,
texcoordInput,
freqInput,
offsetInput,
jitterInput,
outminInput,
outmaxInput,
clampoutputInput,
octavesInput,
lacunarityInput,
diminishInput,
styleInput
] ) => {
const noiseType = int( noiseTypeInput ).toVar();
const texcoord = vec2( texcoordInput ).toVar();
const freq = vec2( freqInput ).toVar();
const offset = vec2( offsetInput ).toVar();
const jitter = float( jitterInput ).toVar();
const outmin = float( outminInput ).toVar();
const outmax = float( outmaxInput ).toVar();
const clampoutput = float( clampoutputInput ).toVar();
const octaves = int( octavesInput ).toVar();
const lacunarity = float( lacunarityInput ).toVar();
const diminish = float( diminishInput ).toVar();
const style = int( styleInput ).toVar();
const applyFreq = mul( texcoord, freq ).toVar();
const applyOffset = add( applyFreq, offset ).toVar();
const cellJitterMult = mul( sub( jitter, 1 ), 90000 ).toVar();
const applyCellJitter = mx_rotate2d( applyOffset, cellJitterMult ).toVar();
const fractalInput = vec3( applyOffset.x, applyOffset.y, cellJitterMult ).toVar();
const result = float( 0 ).toVar();
If( noiseType.equal( int( 0 ) ), () => {
result.assign( mx_perlin_noise_float_scaled( applyCellJitter, 0.5, 0.5 ) );
} );
If( noiseType.equal( int( 1 ) ), () => {
result.assign( mx_cell_noise_float( applyCellJitter ) );
} );
If( noiseType.equal( int( 2 ) ), () => {
result.assign( mx_worley_noise_float_2d( applyOffset, jitter, style ) );
} );
If( noiseType.equal( int( 3 ) ), () => {
result.assign( mx_fractal_noise_float( fractalInput, octaves, lacunarity, diminish ) );
} );
const ranged = add( outmin, mul( result, sub( outmax, outmin ) ) ).toVar();
const clamped = clamp( ranged, outmin, outmax ).toVar();
const output = ranged.toVar();
If( clampoutput.equal( float( 1 ) ), () => {
output.assign( clamped );
} );
return output;
} );
// Unified Noise 3D
export const mx_unifiednoise3d = /*@__PURE__*/ Fn( ( [
noiseTypeInput,
positionInput,
freqInput,
offsetInput,
jitterInput,
outminInput,
outmaxInput,
clampoutputInput,
octavesInput,
lacunarityInput,
diminishInput,
styleInput
] ) => {
const noiseType = int( noiseTypeInput ).toVar();
const position = vec3( positionInput ).toVar();
const freq = vec3( freqInput ).toVar();
const offset = vec3( offsetInput ).toVar();
const jitter = float( jitterInput ).toVar();
const outmin = float( outminInput ).toVar();
const outmax = float( outmaxInput ).toVar();
const clampoutput = float( clampoutputInput ).toVar();
const octaves = int( octavesInput ).toVar();
const lacunarity = float( lacunarityInput ).toVar();
const diminish = float( diminishInput ).toVar();
const style = int( styleInput ).toVar();
const applyFreq = mul( position, freq ).toVar();
const applyOffset = add( applyFreq, offset ).toVar();
const cellJitterMult = mul( sub( jitter, 1 ), 90000 ).toVar();
const applyCellJitter = mx_rotate3d( applyOffset, cellJitterMult, vec3( 0.1, 1, 0 ) ).toVar();
const perlin = mx_perlin_noise_float_scaled( applyCellJitter, 0.5, 0.5 );
const cell = mx_cell_noise_float( applyCellJitter );
const worley = mx_worley_noise_float_3d( applyOffset, jitter, style );
const fractal = mx_fractal_noise_float( applyCellJitter, octaves, lacunarity, diminish );
const result = perlin.toVar();
If( noiseType.equal( int( 1 ) ), () => {
result.assign( cell );
} );
If( noiseType.equal( int( 2 ) ), () => {
result.assign( worley );
} );
If( noiseType.equal( int( 3 ) ), () => {
result.assign( fractal );
} );
const ranged = add( outmin, mul( result, sub( outmax, outmin ) ) ).toVar();
const clamped = clamp( ranged, outmin, outmax ).toVar();
const output = ranged.toVar();
If( clampoutput.equal( float( 1 ) ), () => {
output.assign( clamped );
} );
return output;
} );