123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- // inputs
- import ColorNode from './inputs/ColorNode.js';
- import FloatNode from './inputs/FloatNode.js';
- import Vector2Node from './inputs/Vector2Node.js';
- import Vector3Node from './inputs/Vector3Node.js';
- import Vector4Node from './inputs/Vector4Node.js';
- // math
- import MathNode from './math/MathNode.js';
- import OperatorNode from './math/OperatorNode.js';
- // utils
- import JoinNode from './utils/JoinNode.js';
- import SplitNode from './utils/SplitNode.js';
- // core
- import { Vector2, Vector3, Vector4, Color } from 'three';
- const NodeHandler = {
- get: function ( node, prop ) {
- // Split Properties Pass
- if ( typeof prop === 'string' && node[ prop ] === undefined ) {
- const splitProps = prop.match( /^[xyzw]{1,4}$/ );
- if ( splitProps !== null ) {
- return ShaderNodeObject( new SplitNode( node, splitProps[ 0 ] ) );
- }
- }
- return node[ prop ];
- }
- };
- export const ShaderNodeObject = ( obj ) => {
- const type = typeof obj;
- if ( type === 'number' ) {
- return ShaderNodeObject( new FloatNode( obj ).setConst( true ) );
- } else if ( type === 'object' ) {
- if ( obj.isNode === true ) {
- const node = obj;
- if ( node.isProxyNode !== true ) {
- node.isProxyNode = true;
- return new Proxy( node, NodeHandler );
- }
- }
- }
- return obj;
- };
- export const ShaderNodeArray = ( array ) => {
- const len = array.length;
- for ( let i = 0; i < len; i ++ ) {
- array[ i ] = ShaderNodeObject( array[ i ] );
- }
- return array;
- };
- export const ShaderNodeScript = ( jsFunc ) => {
- return ( ...params ) => {
- ShaderNodeArray( params );
- return ShaderNodeObject( jsFunc( ...params ) );
- };
- };
- export const ShaderNode = ( obj ) => {
- return ShaderNodeScript( obj );
- };
- //
- // Node Material Shader Syntax
- //
- export const uniform = ShaderNodeScript( ( inputNode ) => {
- inputNode.setConst( false );
- return inputNode;
- } );
- export const float = ( val ) => {
- return ShaderNodeObject( new FloatNode( val ).setConst( true ) );
- };
- export const color = ( ...params ) => {
- return ShaderNodeObject( new ColorNode( new Color( ...params ) ).setConst( true ) );
- };
- export const join = ( ...params ) => {
- return ShaderNodeObject( new JoinNode( ShaderNodeArray( params ) ) );
- };
- export const vec2 = ( ...params ) => {
- return ShaderNodeObject( new Vector2Node( new Vector2( ...params ) ).setConst( true ) );
- };
- export const vec3 = ( ...params ) => {
- return ShaderNodeObject( new Vector3Node( new Vector3( ...params ) ).setConst( true ) );
- };
- export const vec4 = ( ...params ) => {
- return ShaderNodeObject( new Vector4Node( new Vector4( ...params ) ).setConst( true ) );
- };
- export const add = ( ...params ) => {
- return ShaderNodeObject( new OperatorNode( '+', ...ShaderNodeArray( params ) ) );
- };
- export const sub = ( ...params ) => {
- return new OperatorNode( '-', ...ShaderNodeArray( params ) );
- };
- export const mul = ( ...params ) => {
- return ShaderNodeObject( new OperatorNode( '*', ...ShaderNodeArray( params ) ) );
- };
- export const div = ( ...params ) => {
- return ShaderNodeObject( new OperatorNode( '/', ...ShaderNodeArray( params ) ) );
- };
- export const floor = ( ...params ) => {
- return ShaderNodeObject( new MathNode( 'floor', ...ShaderNodeArray( params ) ) );
- };
- export const mod = ( ...params ) => {
- return ShaderNodeObject( new MathNode( 'mod', ...ShaderNodeArray( params ) ) );
- };
- export const sign = ( ...params ) => {
- return ShaderNodeObject( new MathNode( 'sign', ...ShaderNodeArray( params ) ) );
- };
|