5
5
* GPU Accelerated JavaScript
6
6
*
7
7
* @version 2.9.3
8
- * @date Wed Apr 01 2020 07:53:27 GMT-0400 (Eastern Daylight Time)
8
+ * @date Mon Aug 24 2020 13:12:42 GMT-0400 (Eastern Daylight Time)
9
9
*
10
10
* @license MIT
11
11
* The MIT License
@@ -1043,6 +1043,15 @@ class CPUFunctionNode extends FunctionNode {
1043
1043
this . astGeneric ( mNode . property , retArr ) ;
1044
1044
retArr . push ( ']' ) ;
1045
1045
return retArr ;
1046
+ case 'fn()[][]' :
1047
+ this . astGeneric ( mNode . object . object , retArr ) ;
1048
+ retArr . push ( '[' ) ;
1049
+ this . astGeneric ( mNode . object . property , retArr ) ;
1050
+ retArr . push ( ']' ) ;
1051
+ retArr . push ( '[' ) ;
1052
+ this . astGeneric ( mNode . property , retArr ) ;
1053
+ retArr . push ( ']' ) ;
1054
+ return retArr ;
1046
1055
default :
1047
1056
throw this . astErrorOutput ( 'Unexpected expression' , mNode ) ;
1048
1057
}
@@ -1064,6 +1073,9 @@ class CPUFunctionNode extends FunctionNode {
1064
1073
case 'Array(2)' :
1065
1074
case 'Array(3)' :
1066
1075
case 'Array(4)' :
1076
+ case 'Matrix(2)' :
1077
+ case 'Matrix(3)' :
1078
+ case 'Matrix(4)' :
1067
1079
case 'HTMLImageArray' :
1068
1080
case 'ArrayTexture(1)' :
1069
1081
case 'ArrayTexture(2)' :
@@ -1165,18 +1177,23 @@ class CPUFunctionNode extends FunctionNode {
1165
1177
}
1166
1178
1167
1179
astArrayExpression ( arrNode , retArr ) {
1180
+ const returnType = this . getType ( arrNode ) ;
1168
1181
const arrLen = arrNode . elements . length ;
1169
-
1170
- retArr . push ( 'new Float32Array([' ) ;
1182
+ const elements = [ ] ;
1171
1183
for ( let i = 0 ; i < arrLen ; ++ i ) {
1172
- if ( i > 0 ) {
1173
- retArr . push ( ', ' ) ;
1174
- }
1175
- const subNode = arrNode . elements [ i ] ;
1176
- this . astGeneric ( subNode , retArr )
1184
+ const element = [ ] ;
1185
+ this . astGeneric ( arrNode . elements [ i ] , element ) ;
1186
+ elements . push ( element . join ( '' ) ) ;
1187
+ }
1188
+ switch ( returnType ) {
1189
+ case 'Matrix(2)' :
1190
+ case 'Matrix(3)' :
1191
+ case 'Matrix(4)' :
1192
+ retArr . push ( `[${ elements . join ( ', ' ) } ]` ) ;
1193
+ break ;
1194
+ default :
1195
+ retArr . push ( `new Float32Array([${ elements . join ( ', ' ) } ])` ) ;
1177
1196
}
1178
- retArr . push ( '])' ) ;
1179
-
1180
1197
return retArr ;
1181
1198
}
1182
1199
@@ -1189,6 +1206,7 @@ class CPUFunctionNode extends FunctionNode {
1189
1206
module . exports = {
1190
1207
CPUFunctionNode
1191
1208
} ;
1209
+
1192
1210
} , { "../function-node" :9 } ] , 6 :[ function ( require , module , exports ) {
1193
1211
const { utils } = require ( '../../utils' ) ;
1194
1212
@@ -1208,6 +1226,9 @@ function constantsToString(constants, types) {
1208
1226
case 'Array(2)' :
1209
1227
case 'Array(3)' :
1210
1228
case 'Array(4)' :
1229
+ case 'Matrix(2)' :
1230
+ case 'Matrix(3)' :
1231
+ case 'Matrix(4)' :
1211
1232
results . push ( `${ name } :new ${ constant . constructor . name } (${ JSON . stringify ( Array . from ( constant ) ) } )` ) ;
1212
1233
break ;
1213
1234
}
@@ -1347,6 +1368,9 @@ ${ header.join('\n') }
1347
1368
case 'Array(2)':
1348
1369
case 'Array(3)':
1349
1370
case 'Array(4)':
1371
+ case 'Matrix(2)':
1372
+ case 'Matrix(3)':
1373
+ case 'Matrix(4)':
1350
1374
if (incomingConstants.hasOwnProperty(p)) {
1351
1375
console.warn('constant ' + p + ' of type ' + type + ' cannot be resigned');
1352
1376
}
@@ -2843,6 +2867,13 @@ class FunctionNode {
2843
2867
case 'BlockStatement' :
2844
2868
return this . getType ( ast . body ) ;
2845
2869
case 'ArrayExpression' :
2870
+ const childType = this . getType ( ast . elements [ 0 ] ) ;
2871
+ switch ( childType ) {
2872
+ case 'Array(2)' :
2873
+ case 'Array(3)' :
2874
+ case 'Array(4)' :
2875
+ return `Matrix(${ ast . elements . length } )` ;
2876
+ }
2846
2877
return `Array(${ ast . elements . length } )` ;
2847
2878
case 'Literal' :
2848
2879
const literalKey = this . astKey ( ast ) ;
@@ -3774,6 +3805,7 @@ class FunctionNode {
3774
3805
} ;
3775
3806
}
3776
3807
case 'fn()[]' :
3808
+ case 'fn()[][]' :
3777
3809
case '[][]' :
3778
3810
return {
3779
3811
signature : variableSignature ,
@@ -3883,6 +3915,9 @@ const typeLookupMap = {
3883
3915
'Array(2)' : 'Number' ,
3884
3916
'Array(3)' : 'Number' ,
3885
3917
'Array(4)' : 'Number' ,
3918
+ 'Matrix(2)' : 'Number' ,
3919
+ 'Matrix(3)' : 'Number' ,
3920
+ 'Matrix(4)' : 'Number' ,
3886
3921
'Array2D' : 'Number' ,
3887
3922
'Array3D' : 'Number' ,
3888
3923
'Input' : 'Number' ,
@@ -4380,14 +4415,15 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC
4380
4415
result . push ( context . toString ( ) ) ;
4381
4416
if ( kernel . renderOutput === kernel . renderTexture ) {
4382
4417
context . reset ( ) ;
4418
+ const framebufferName = context . getContextVariableName ( kernel . framebuffer ) ;
4383
4419
if ( kernel . renderKernels ) {
4384
4420
const results = kernel . renderKernels ( ) ;
4385
4421
const textureName = context . getContextVariableName ( kernel . texture . texture ) ;
4386
4422
result . push ( ` return {
4387
4423
result: {
4388
4424
texture: ${ textureName } ,
4389
4425
type: '${ results . result . type } ',
4390
- toArray: ${ getToArrayString ( results . result , textureName ) }
4426
+ toArray: ${ getToArrayString ( results . result , textureName , framebufferName ) }
4391
4427
},` ) ;
4392
4428
const { subKernels, mappedTextures } = kernel ;
4393
4429
for ( let i = 0 ; i < subKernels . length ; i ++ ) {
@@ -4399,7 +4435,7 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC
4399
4435
${ subKernel . property } : {
4400
4436
texture: ${ subKernelTextureName } ,
4401
4437
type: '${ subKernelResult . type } ',
4402
- toArray: ${ getToArrayString ( subKernelResult , subKernelTextureName ) }
4438
+ toArray: ${ getToArrayString ( subKernelResult , subKernelTextureName , framebufferName ) }
4403
4439
},` ) ;
4404
4440
}
4405
4441
result . push ( ` };` ) ;
@@ -4409,7 +4445,7 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC
4409
4445
result . push ( ` return {
4410
4446
texture: ${ textureName } ,
4411
4447
type: '${ rendered . type } ',
4412
- toArray: ${ getToArrayString ( rendered , textureName ) }
4448
+ toArray: ${ getToArrayString ( rendered , textureName , framebufferName ) }
4413
4449
};` ) ;
4414
4450
}
4415
4451
}
@@ -4424,7 +4460,7 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC
4424
4460
4425
4461
let constantsUpload = [ ] ;
4426
4462
kernelConstants . forEach ( ( kernelConstant ) => {
4427
- constantsUpload . push ( `${ kernelConstant . getStringValueHandler ( ) } ` ) ;
4463
+ constantsUpload . push ( `${ kernelConstant . getStringValueHandler ( ) } ` ) ;
4428
4464
} ) ;
4429
4465
return `function kernel(settings) {
4430
4466
const { context, constants } = settings;
@@ -4468,14 +4504,17 @@ function getGetPixelsString(kernel) {
4468
4504
} ) ;
4469
4505
}
4470
4506
4471
- function getToArrayString ( kernelResult , textureName ) {
4507
+ function getToArrayString ( kernelResult , textureName , framebufferName ) {
4472
4508
const toArray = kernelResult . toArray . toString ( ) ;
4473
4509
const useFunctionKeyword = ! / ^ f u n c t i o n / . test ( toArray ) ;
4474
4510
const flattenedFunctions = utils . flattenFunctionToString ( `${ useFunctionKeyword ? 'function ' : '' } ${ toArray } ` , {
4475
4511
findDependency : ( object , name ) => {
4476
4512
if ( object === 'utils' ) {
4477
4513
return `const ${ name } = ${ utils [ name ] . toString ( ) } ;` ;
4478
4514
} else if ( object === 'this' ) {
4515
+ if ( name === 'framebuffer' ) {
4516
+ return '' ;
4517
+ }
4479
4518
return `${ useFunctionKeyword ? 'function ' : '' } ${ kernelResult [ name ] . toString ( ) } ` ;
4480
4519
} else {
4481
4520
throw new Error ( 'unhandled fromObject' ) ;
@@ -4489,17 +4528,14 @@ function getToArrayString(kernelResult, textureName) {
4489
4528
if ( isDeclaration ) return null ;
4490
4529
return 'gl' ;
4491
4530
}
4492
- if ( property === '_framebuffer' ) {
4493
- return '_framebuffer' ;
4494
- }
4495
4531
if ( kernelResult . hasOwnProperty ( property ) ) {
4496
4532
return JSON . stringify ( kernelResult [ property ] ) ;
4497
4533
}
4498
4534
throw new Error ( `unhandled thisLookup ${ property } ` ) ;
4499
4535
}
4500
4536
} ) ;
4501
4537
return `() => {
4502
- let _framebuffer ;
4538
+ function framebuffer() { return ${ framebufferName } ; } ;
4503
4539
${ flattenedFunctions }
4504
4540
return toArray();
4505
4541
}` ;
@@ -4542,6 +4578,7 @@ function findKernelValue(argument, kernelValues, values, context, uploadedValues
4542
4578
module . exports = {
4543
4579
glKernelString
4544
4580
} ;
4581
+
4545
4582
} , { "../../utils" :113 , "gl-wiretap" :2 } ] , 12 :[ function ( require , module , exports ) {
4546
4583
const { Kernel } = require ( '../kernel' ) ;
4547
4584
const { utils } = require ( '../../utils' ) ;
@@ -5801,18 +5838,12 @@ class GLTexture extends Texture {
5801
5838
if ( this . texture . _refs ) return ;
5802
5839
}
5803
5840
this . context . deleteTexture ( this . texture ) ;
5804
- if ( this . texture . _refs === 0 && this . _framebuffer ) {
5805
- this . context . deleteFramebuffer ( this . _framebuffer ) ;
5806
- this . _framebuffer = null ;
5807
- }
5808
5841
}
5809
5842
5810
5843
framebuffer ( ) {
5811
5844
if ( ! this . _framebuffer ) {
5812
- this . _framebuffer = this . context . createFramebuffer ( ) ;
5845
+ this . _framebuffer = this . kernel . getRawValueFramebuffer ( this . size [ 0 ] , this . size [ 1 ] ) ;
5813
5846
}
5814
- this . _framebuffer . width = this . size [ 0 ] ;
5815
- this . _framebuffer . height = this . size [ 1 ] ;
5816
5847
return this . _framebuffer ;
5817
5848
}
5818
5849
}
@@ -5926,8 +5957,7 @@ class GLTextureUnsigned extends GLTexture {
5926
5957
}
5927
5958
renderRawOutput ( ) {
5928
5959
const { context : gl } = this ;
5929
- const framebuffer = gl . createFramebuffer ( ) ;
5930
- gl . bindFramebuffer ( gl . FRAMEBUFFER , framebuffer ) ;
5960
+ gl . bindFramebuffer ( gl . FRAMEBUFFER , this . framebuffer ( ) ) ;
5931
5961
gl . framebufferTexture2D (
5932
5962
gl . FRAMEBUFFER ,
5933
5963
gl . COLOR_ATTACHMENT0 ,
@@ -7412,6 +7442,9 @@ class WebGLFunctionNode extends FunctionNode {
7412
7442
case 'Array(4)' :
7413
7443
case 'Array(3)' :
7414
7444
case 'Array(2)' :
7445
+ case 'Matrix(2)' :
7446
+ case 'Matrix(3)' :
7447
+ case 'Matrix(4)' :
7415
7448
case 'Input' :
7416
7449
this . astGeneric ( ast . argument , result ) ;
7417
7450
break ;
@@ -7977,7 +8010,7 @@ class WebGLFunctionNode extends FunctionNode {
7977
8010
}
7978
8011
const markupType = typeMap [ type ] ;
7979
8012
if ( ! markupType ) {
7980
- throw this . astErrorOutput ( `Markup type ${ markupType } not handled` , varDecNode ) ;
8013
+ throw this . astErrorOutput ( `Markup type ${ type } not handled` , varDecNode ) ;
7981
8014
}
7982
8015
const declarationResult = [ ] ;
7983
8016
if ( actualType === 'Integer' && type === 'Integer' ) {
@@ -8275,6 +8308,15 @@ class WebGLFunctionNode extends FunctionNode {
8275
8308
retArr . push ( this . memberExpressionPropertyMarkup ( property ) ) ;
8276
8309
retArr . push ( ']' ) ;
8277
8310
return retArr ;
8311
+ case 'fn()[][]' :
8312
+ this . astCallExpression ( mNode . object . object , retArr ) ;
8313
+ retArr . push ( '[' ) ;
8314
+ retArr . push ( this . memberExpressionPropertyMarkup ( mNode . object . property ) ) ;
8315
+ retArr . push ( ']' ) ;
8316
+ retArr . push ( '[' ) ;
8317
+ retArr . push ( this . memberExpressionPropertyMarkup ( mNode . property ) ) ;
8318
+ retArr . push ( ']' ) ;
8319
+ return retArr ;
8278
8320
case '[][]' :
8279
8321
this . astArrayExpression ( mNode . object , retArr ) ;
8280
8322
retArr . push ( '[' ) ;
@@ -8402,6 +8444,14 @@ class WebGLFunctionNode extends FunctionNode {
8402
8444
this . memberExpressionXYZ ( xProperty , yProperty , zProperty , retArr ) ;
8403
8445
retArr . push ( ')' ) ;
8404
8446
break ;
8447
+ case 'Matrix(2)' :
8448
+ case 'Matrix(3)' :
8449
+ case 'Matrix(4)' :
8450
+ retArr . push ( `${ markupName } [${ this . memberExpressionPropertyMarkup ( yProperty ) } ]` ) ;
8451
+ if ( yProperty ) {
8452
+ retArr . push ( `[${ this . memberExpressionPropertyMarkup ( xProperty ) } ]` ) ;
8453
+ }
8454
+ break ;
8405
8455
default :
8406
8456
throw new Error ( `unhandled member expression "${ type } "` ) ;
8407
8457
}
@@ -8574,9 +8624,19 @@ class WebGLFunctionNode extends FunctionNode {
8574
8624
}
8575
8625
8576
8626
astArrayExpression ( arrNode , retArr ) {
8627
+ const returnType = this . getType ( arrNode ) ;
8628
+
8577
8629
const arrLen = arrNode . elements . length ;
8578
8630
8579
- retArr . push ( 'vec' + arrLen + '(' ) ;
8631
+ switch ( returnType ) {
8632
+ case 'Matrix(2)' :
8633
+ case 'Matrix(3)' :
8634
+ case 'Matrix(4)' :
8635
+ retArr . push ( `mat${ arrLen } (` ) ;
8636
+ break ;
8637
+ default :
8638
+ retArr . push ( `vec${ arrLen } (` ) ;
8639
+ }
8580
8640
for ( let i = 0 ; i < arrLen ; ++ i ) {
8581
8641
if ( i > 0 ) {
8582
8642
retArr . push ( ', ' ) ;
@@ -8630,6 +8690,9 @@ const typeMap = {
8630
8690
'Array(2)' : 'vec2' ,
8631
8691
'Array(3)' : 'vec3' ,
8632
8692
'Array(4)' : 'vec4' ,
8693
+ 'Matrix(2)' : 'mat2' ,
8694
+ 'Matrix(3)' : 'mat3' ,
8695
+ 'Matrix(4)' : 'mat4' ,
8633
8696
'Array2D' : 'sampler2D' ,
8634
8697
'Array3D' : 'sampler2D' ,
8635
8698
'Boolean' : 'bool' ,
@@ -10467,6 +10530,7 @@ class WebGLKernel extends GLKernel {
10467
10530
this . framebuffer = gl . createFramebuffer ( ) ;
10468
10531
this . framebuffer . width = texSize [ 0 ] ;
10469
10532
this . framebuffer . height = texSize [ 1 ] ;
10533
+ this . rawValueFramebuffers = { } ;
10470
10534
10471
10535
const vertices = new Float32Array ( [ - 1 , - 1 ,
10472
10536
1 , - 1 , - 1 , 1 ,
@@ -10999,6 +11063,19 @@ float integerCorrectionModulo(float number, float divisor) {
10999
11063
return result . join ( '' ) ;
11000
11064
}
11001
11065
11066
+ getRawValueFramebuffer ( width , height ) {
11067
+ if ( ! this . rawValueFramebuffers [ width ] ) {
11068
+ this . rawValueFramebuffers [ width ] = { } ;
11069
+ }
11070
+ if ( ! this . rawValueFramebuffers [ width ] [ height ] ) {
11071
+ const framebuffer = this . context . createFramebuffer ( ) ;
11072
+ framebuffer . width = width ;
11073
+ framebuffer . height = height ;
11074
+ this . rawValueFramebuffers [ width ] [ height ] = framebuffer ;
11075
+ }
11076
+ return this . rawValueFramebuffers [ width ] [ height ] ;
11077
+ }
11078
+
11002
11079
getKernelResultDeclaration ( ) {
11003
11080
switch ( this . returnType ) {
11004
11081
case 'Array(2)' :
@@ -11329,6 +11406,13 @@ float integerCorrectionModulo(float number, float divisor) {
11329
11406
if ( this . framebuffer ) {
11330
11407
this . context . deleteFramebuffer ( this . framebuffer ) ;
11331
11408
}
11409
+ for ( const width in this . rawValueFramebuffers ) {
11410
+ for ( const height in this . rawValueFramebuffers [ width ] ) {
11411
+ this . context . deleteFramebuffer ( this . rawValueFramebuffers [ width ] [ height ] ) ;
11412
+ delete this . rawValueFramebuffers [ width ] [ height ] ;
11413
+ }
11414
+ delete this . rawValueFramebuffers [ width ] ;
11415
+ }
11332
11416
if ( this . vertShader ) {
11333
11417
this . context . deleteShader ( this . vertShader ) ;
11334
11418
}
@@ -14754,7 +14838,7 @@ const utils = {
14754
14838
if ( ! flattened [ functionDependency ] ) {
14755
14839
flattened [ functionDependency ] = true ;
14756
14840
}
14757
- flattenedFunctionDependencies . push ( utils . flattenFunctionToString ( functionDependency , settings ) + '\n' ) ;
14841
+ functionDependency ? flattenedFunctionDependencies . push ( utils . flattenFunctionToString ( functionDependency , settings ) + '\n' ) : '' ;
14758
14842
}
14759
14843
return flattenedFunctionDependencies . join ( '' ) + result ;
14760
14844
}
@@ -14984,5 +15068,6 @@ const _systemEndianness = utils.getSystemEndianness();
14984
15068
module . exports = {
14985
15069
utils
14986
15070
} ;
15071
+
14987
15072
} , { "./input" :109 , "./texture" :112 , "acorn" :1 } ] } , { } , [ 106 ] ) ( 106 )
14988
15073
} ) ;
0 commit comments