@@ -21,6 +21,86 @@ import * as FES from './strands_FES'
2121import { getNodeDataFromID } from './ir_dag'
2222import { StrandsNode , createStrandsNode } from './strands_node'
2323
24+ const BUILTIN_GLOBAL_SPECS = {
25+ width : { typeInfo : DataType . float1 , get : ( p ) => p . width } ,
26+ height : { typeInfo : DataType . float1 , get : ( p ) => p . height } ,
27+ mouseX : { typeInfo : DataType . float1 , get : ( p ) => p . mouseX } ,
28+ mouseY : { typeInfo : DataType . float1 , get : ( p ) => p . mouseY } ,
29+ pmouseX : { typeInfo : DataType . float1 , get : ( p ) => p . pmouseX } ,
30+ pmouseY : { typeInfo : DataType . float1 , get : ( p ) => p . pmouseY } ,
31+ winMouseX : { typeInfo : DataType . float1 , get : ( p ) => p . winMouseX } ,
32+ winMouseY : { typeInfo : DataType . float1 , get : ( p ) => p . winMouseY } ,
33+ pwinMouseX : { typeInfo : DataType . float1 , get : ( p ) => p . pwinMouseX } ,
34+ pwinMouseY : { typeInfo : DataType . float1 , get : ( p ) => p . pwinMouseY } ,
35+ frameCount : { typeInfo : DataType . float1 , get : ( p ) => p . frameCount } ,
36+ deltaTime : { typeInfo : DataType . float1 , get : ( p ) => p . deltaTime } ,
37+ displayWidth : { typeInfo : DataType . float1 , get : ( p ) => p . displayWidth } ,
38+ displayHeight : { typeInfo : DataType . float1 , get : ( p ) => p . displayHeight } ,
39+ windowWidth : { typeInfo : DataType . float1 , get : ( p ) => p . windowWidth } ,
40+ windowHeight : { typeInfo : DataType . float1 , get : ( p ) => p . windowHeight } ,
41+ mouseIsPressed : { typeInfo : DataType . bool1 , get : ( p ) => p . mouseIsPressed } ,
42+ }
43+
44+ function _getBuiltinGlobalsCache ( strandsContext ) {
45+ if ( ! strandsContext . _builtinGlobals || strandsContext . _builtinGlobals . dag !== strandsContext . dag ) {
46+ strandsContext . _builtinGlobals = {
47+ dag : strandsContext . dag ,
48+ nodes : new Map ( ) ,
49+ uniformsAdded : new Set ( ) ,
50+ }
51+ }
52+ // return the cache
53+ return strandsContext . _builtinGlobals
54+ }
55+
56+ function getBuiltinGlobalNode ( strandsContext , name ) {
57+ const spec = BUILTIN_GLOBAL_SPECS [ name ]
58+ if ( ! spec ) return null
59+
60+ const cache = _getBuiltinGlobalsCache ( strandsContext )
61+ const uniformName = `_p5_global_${ name } `
62+ const cached = cache . nodes . get ( uniformName )
63+ if ( cached ) return cached
64+
65+ if ( ! cache . uniformsAdded . has ( uniformName ) ) {
66+ cache . uniformsAdded . add ( uniformName )
67+ strandsContext . uniforms . push ( {
68+ name : uniformName ,
69+ typeInfo : spec . typeInfo ,
70+ defaultValue : ( ) => {
71+ const p5Instance = strandsContext . renderer ?. _pInst || strandsContext . p5 ?. instance
72+ return p5Instance ? spec . get ( p5Instance ) : undefined
73+ } ,
74+ } )
75+ }
76+
77+ const { id, dimension } = build . variableNode ( strandsContext , spec . typeInfo , uniformName )
78+ const node = createStrandsNode ( id , dimension , strandsContext )
79+ node . _originalBuiltinName = name
80+ cache . nodes . set ( uniformName , node )
81+ return node
82+ }
83+
84+ function installBuiltinGlobalAccessors ( strandsContext ) {
85+ if ( strandsContext . _builtinGlobalsAccessorsInstalled ) return
86+
87+ const getRuntimeP5Instance = ( ) => strandsContext . renderer ?. _pInst || strandsContext . p5 ?. instance
88+
89+ for ( const name of Object . keys ( BUILTIN_GLOBAL_SPECS ) ) {
90+ const spec = BUILTIN_GLOBAL_SPECS [ name ]
91+ Object . defineProperty ( window , name , {
92+ get : ( ) => {
93+ if ( strandsContext . active ) {
94+ return getBuiltinGlobalNode ( strandsContext , name ) ;
95+ }
96+ const inst = getRuntimeP5Instance ( )
97+ return spec . get ( inst ) ;
98+ } ,
99+ } )
100+ }
101+ strandsContext . _builtinGlobalsAccessorsInstalled = true
102+ }
103+
24104//////////////////////////////////////////////
25105// User nodes
26106//////////////////////////////////////////////
@@ -419,6 +499,8 @@ function enforceReturnTypeMatch(strandsContext, expectedType, returned, hookName
419499 return returnedNodeID ;
420500}
421501export function createShaderHooksFunctions ( strandsContext , fn , shader ) {
502+ installBuiltinGlobalAccessors ( strandsContext )
503+
422504 // Add shader context to hooks before spreading
423505 const vertexHooksWithContext = Object . fromEntries (
424506 Object . entries ( shader . hooks . vertex ) . map ( ( [ name , hook ] ) => [ name , { ...hook , shaderContext : 'vertex' } ] )
0 commit comments