@@ -42,7 +42,7 @@ var INDEX_LOC = "index";
42
42
var TRANSFORM_LOC = "transform" ;
43
43
var SLOT_SIZE_LOC = "slotSize_and_number" ;
44
44
var INSTANCE_LOC = "instance" ;
45
- var SPRITE_FLAGS_LOC = "spriteFlag " ;
45
+ var SPRITE_TYPE_LOC = "spriteType " ;
46
46
var CAM_POS_LOC = "camPos" ;
47
47
var CAM_TILT_LOC = "camTilt" ;
48
48
var CAM_TURN_LOC = "camTurn" ;
@@ -1396,6 +1396,11 @@ var vertexShader_default = `#version 300 es
1396
1396
1397
1397
precision highp float;
1398
1398
1399
+ // CONST
1400
+ const mat4 identity = mat4(1.0);
1401
+ const float SPRITE = 1.0;
1402
+ const float threshold = 0.5;
1403
+
1399
1404
// IN
1400
1405
// shape
1401
1406
layout(location = 0) in vec2 position;
@@ -1405,7 +1410,7 @@ layout(location = 1) in mat4 transform;
1405
1410
layout(location = 5) in vec2 slotSize_and_number;
1406
1411
// instance
1407
1412
layout(location = 6) in float instance;
1408
- layout(location = 7) in float spriteFlag ;
1413
+ layout(location = 7) in float spriteType ;
1409
1414
1410
1415
// UNIFORM
1411
1416
uniform float maxTextureSize;
@@ -1433,7 +1438,13 @@ void main() {
1433
1438
float slotX = mod(slotNumber, maxCols);
1434
1439
float slotY = mod(floor(slotNumber / maxCols), maxRows);
1435
1440
1436
- vec4 elemPosition = transform * vec4(position, 0.0, 1.0);
1441
+ vec4 basePosition = vec4(position, 0.0, 1.0);
1442
+
1443
+ float spriteFlag = max(0., 1. - 2. * abs(spriteType - SPRITE));
1444
+ mat4 billboardMatrix = inverse(camTilt * camTurn);
1445
+ basePosition = (spriteFlag * billboardMatrix + (1. - spriteFlag) * identity) * basePosition;
1446
+
1447
+ vec4 elemPosition = transform * basePosition;
1437
1448
// elementPosition => relativePosition
1438
1449
vec4 relativePosition = camTilt * camTurn * camPos * elemPosition;
1439
1450
relativePosition.z -= camDist;
@@ -1451,9 +1462,6 @@ void main() {
1451
1462
float g = fract(instance / (256.0 * 255.0));
1452
1463
float b = fract(instance / 255.0);
1453
1464
vInstanceColor = vec3(r, g, b);
1454
-
1455
- // DUMMY
1456
- vInstanceColor.x += spriteFlag;
1457
1465
}
1458
1466
` ;
1459
1467
@@ -4403,6 +4411,20 @@ var VectorUniform;
4403
4411
VectorUniform2 [ VectorUniform2 [ "BG_COLOR" ] = 0 ] = "BG_COLOR" ;
4404
4412
} ) ( VectorUniform || ( VectorUniform = { } ) ) ;
4405
4413
4414
+ // src/world/sprite/Sprite.ts
4415
+ function copySprite ( sprite ) {
4416
+ return {
4417
+ transform : Matrix_default . create ( ) . copy ( sprite . transform ) ,
4418
+ imageId : sprite . imageId ,
4419
+ spriteType : sprite . spriteType
4420
+ } ;
4421
+ }
4422
+ var SpriteType ;
4423
+ ( function ( SpriteType2 ) {
4424
+ SpriteType2 [ SpriteType2 [ "DEFAULT" ] = 0 ] = "DEFAULT" ;
4425
+ SpriteType2 [ SpriteType2 [ "SPRITE" ] = 1 ] = "SPRITE" ;
4426
+ } ) ( SpriteType || ( SpriteType = { } ) ) ;
4427
+
4406
4428
// src/graphics/GraphicsEngine.ts
4407
4429
var glProxy = function ( gl ) {
4408
4430
if ( ! LOG_GL ) {
@@ -4602,9 +4624,9 @@ class GraphicsEngine extends Disposable {
4602
4624
} else {
4603
4625
this . attributeBuffers . ensureSize ( INSTANCE_LOC , instanceCount ) ;
4604
4626
}
4605
- if ( ! this . attributeBuffers . hasBuffer ( SPRITE_FLAGS_LOC ) ) {
4627
+ if ( ! this . attributeBuffers . hasBuffer ( SPRITE_TYPE_LOC ) ) {
4606
4628
this . attributeBuffers . createBuffer ( {
4607
- location : SPRITE_FLAGS_LOC ,
4629
+ location : SPRITE_TYPE_LOC ,
4608
4630
target : GL . ARRAY_BUFFER ,
4609
4631
usage : GL . STATIC_DRAW ,
4610
4632
vertexAttribPointerRows : 1 ,
@@ -4613,7 +4635,7 @@ class GraphicsEngine extends Disposable {
4613
4635
instanceCount
4614
4636
} ) ;
4615
4637
} else {
4616
- this . attributeBuffers . ensureSize ( SPRITE_FLAGS_LOC , instanceCount ) ;
4638
+ this . attributeBuffers . ensureSize ( SPRITE_TYPE_LOC , instanceCount ) ;
4617
4639
}
4618
4640
return this . attributeBuffers ;
4619
4641
}
@@ -4682,6 +4704,19 @@ class GraphicsEngine extends Disposable {
4682
4704
}
4683
4705
} ) ;
4684
4706
}
4707
+ static tempBuffer = new Float32Array ( 2 ) ;
4708
+ updateSpriteTypes ( spriteIds , sprites ) {
4709
+ const attributeBuffers = this . attributeBuffers ;
4710
+ attributeBuffers . bindVertexArray ( ) ;
4711
+ attributeBuffers . bindBuffer ( SPRITE_TYPE_LOC ) ;
4712
+ spriteIds . forEach ( ( spriteId ) => {
4713
+ const sprite = sprites . at ( spriteId ) ;
4714
+ const type = sprite ?. spriteType ?? SpriteType . DEFAULT ;
4715
+ GraphicsEngine . tempBuffer [ 0 ] = type ;
4716
+ this . gl . bufferSubData ( GL . ARRAY_BUFFER , 1 * Float32Array . BYTES_PER_ELEMENT * spriteId , GraphicsEngine . tempBuffer ) ;
4717
+ } ) ;
4718
+ spriteIds . clear ( ) ;
4719
+ }
4685
4720
updateUniformMatrix ( type , matrix ) {
4686
4721
this . gl . uniformMatrix4fv ( this . matrixUniforms [ type ] , false , matrix ) ;
4687
4722
}
@@ -4746,10 +4781,9 @@ class Motor {
4746
4781
} ;
4747
4782
const updates = [ ] ;
4748
4783
const loop = ( time ) => {
4749
- updatePayload . deltaTime = Math . min ( time - updatePayload . time , MAX_DELTA_TIME ) ;
4750
- updatePayload . time = time ;
4751
4784
handle = requestAnimationFrame ( loop ) ;
4752
- this . time = time ;
4785
+ updatePayload . deltaTime = Math . min ( time - updatePayload . time , MAX_DELTA_TIME ) ;
4786
+ this . time = updatePayload . time = time ;
4753
4787
updates . length = 0 ;
4754
4788
this . updateSchedule . forEach ( ( schedule , update ) => {
4755
4789
if ( time < schedule . triggerTime ) {
@@ -4759,6 +4793,7 @@ class Motor {
4759
4793
if ( schedule . period && time < schedule . expirationTime ) {
4760
4794
schedule . triggerTime = Math . max ( schedule . triggerTime + schedule . period , time ) ;
4761
4795
} else {
4796
+ console . log ( update ) ;
4762
4797
this . updateSchedule . delete ( update ) ;
4763
4798
}
4764
4799
} ) ;
@@ -6084,22 +6119,14 @@ class SpriteGroup {
6084
6119
}
6085
6120
}
6086
6121
6087
- // src/world/sprite/Sprite.ts
6088
- function copySprite ( sprite ) {
6089
- return {
6090
- name : sprite . name ,
6091
- transform : Matrix_default . create ( ) . copy ( sprite . transform ) ,
6092
- imageId : sprite . imageId
6093
- } ;
6094
- }
6095
-
6096
6122
// src/world/sprite/update/SpriteUpdateType.ts
6097
6123
var SpriteUpdateType ;
6098
6124
( function ( SpriteUpdateType2 ) {
6099
6125
SpriteUpdateType2 [ SpriteUpdateType2 [ "NONE" ] = 0 ] = "NONE" ;
6100
6126
SpriteUpdateType2 [ SpriteUpdateType2 [ "TRANSFORM" ] = 1 ] = "TRANSFORM" ;
6101
6127
SpriteUpdateType2 [ SpriteUpdateType2 [ "ANIM" ] = 2 ] = "ANIM" ;
6102
- SpriteUpdateType2 [ SpriteUpdateType2 [ "ALL" ] = 3 ] = "ALL" ;
6128
+ SpriteUpdateType2 [ SpriteUpdateType2 [ "TYPE" ] = 4 ] = "TYPE" ;
6129
+ SpriteUpdateType2 [ SpriteUpdateType2 [ "ALL" ] = 7 ] = "ALL" ;
6103
6130
} ) ( SpriteUpdateType || ( SpriteUpdateType = { } ) ) ;
6104
6131
6105
6132
// src/world/sprite/aux/SpriteGrid.ts
@@ -6239,6 +6266,7 @@ class StaticSprites {
6239
6266
class SpriteUpdater {
6240
6267
spriteTransformUpdate ;
6241
6268
spriteAnimUpdate ;
6269
+ spriteTypeUpdate ;
6242
6270
sprites ;
6243
6271
set holder ( value ) {
6244
6272
this . sprites = value ;
@@ -6247,6 +6275,7 @@ class SpriteUpdater {
6247
6275
constructor ( { engine, motor } ) {
6248
6276
this . spriteTransformUpdate = new UpdateRegistry ( ( ids ) => engine . updateSpriteTransforms ( ids , this . sprites ) , motor ) ;
6249
6277
this . spriteAnimUpdate = new UpdateRegistry ( ( ids ) => engine . updateSpriteAnims ( ids , this . sprites ) , motor ) ;
6278
+ this . spriteTypeUpdate = new UpdateRegistry ( ( ids ) => engine . updateSpriteTypes ( ids , this . sprites ) , motor ) ;
6250
6279
}
6251
6280
informUpdate ( id , type = SpriteUpdateType . ALL ) {
6252
6281
if ( this . sprites && id < this . sprites . length ) {
@@ -6256,6 +6285,9 @@ class SpriteUpdater {
6256
6285
if ( type & SpriteUpdateType . ANIM ) {
6257
6286
this . spriteAnimUpdate . informUpdate ( id ) ;
6258
6287
}
6288
+ if ( type & SpriteUpdateType . TYPE ) {
6289
+ this . spriteTypeUpdate . informUpdate ( id ) ;
6290
+ }
6259
6291
}
6260
6292
}
6261
6293
}
@@ -6272,6 +6304,7 @@ var LOGO_SIZE = 512;
6272
6304
var CELLSIZE = 2 ;
6273
6305
6274
6306
class DemoWorld extends AuxiliaryHolder {
6307
+ camera ;
6275
6308
constructor ( { engine, motor } ) {
6276
6309
super ( ) ;
6277
6310
const spritesAccumulator = new SpritesAccumulator ;
@@ -6382,11 +6415,8 @@ class DemoWorld extends AuxiliaryHolder {
6382
6415
spritesAccumulator . addAuxiliary ( new FixedSpriteGrid ( { cellSize : CELLSIZE } , [
6383
6416
{
6384
6417
imageId : DOBUKI ,
6385
- transform : Matrix_default . create ( ) . translate ( 0 , 0 , - 1 )
6386
- } ,
6387
- {
6388
- imageId : DOBUKI ,
6389
- transform : Matrix_default . create ( ) . translate ( 0 , 0 , - 1 ) . rotateY ( Math . PI )
6418
+ spriteType : SpriteType . SPRITE ,
6419
+ transform : Matrix_default . create ( ) . translate ( 0 , 0 , 0 )
6390
6420
}
6391
6421
] , [
6392
6422
...[
@@ -6422,22 +6452,13 @@ class DemoWorld extends AuxiliaryHolder {
6422
6452
const camera = new Camera ( { engine, motor } ) ;
6423
6453
camera . addAuxiliary ( new ResizeAux ( { engine } ) ) ;
6424
6454
this . addAuxiliary ( camera ) ;
6455
+ this . camera = camera ;
6425
6456
camera . posMatrix . moveBlocker = {
6426
6457
isBlocked ( pos ) {
6427
6458
const [ cx , cy , cz ] = PositionMatrix . getCellPos ( pos , 2 ) ;
6428
6459
return cx === 0 && cy === 0 && cz === - 3 ;
6429
6460
}
6430
6461
} ;
6431
- spritesAccumulator . addAuxiliary ( new FixedSpriteGrid ( { cellSize : CELLSIZE } , [
6432
- {
6433
- imageId : DOBUKI ,
6434
- transform : Matrix_default . create ( ) . translate ( 0 , 0 , - 1 )
6435
- } ,
6436
- {
6437
- imageId : DOBUKI ,
6438
- transform : Matrix_default . create ( ) . translate ( 0 , 0 , - 1 ) . rotateY ( Math . PI )
6439
- }
6440
- ] ) ) ;
6441
6462
spritesAccumulator . addAuxiliary ( new SpriteGrid ( { yRange : [ 0 , 0 ] } , {
6442
6463
getSpritesAtCell : ( cell ) => [
6443
6464
{
@@ -6504,7 +6525,6 @@ async function testCanvas(canvas) {
6504
6525
pixelListener . y = y ;
6505
6526
} ) ;
6506
6527
const engine = new GraphicsEngine ( canvas ) ;
6507
- engine . setPixelListener ( pixelListener ) ;
6508
6528
const motor = new Motor ;
6509
6529
const core = new AuxiliaryHolder ;
6510
6530
const world = new DemoWorld ( { engine, motor } ) ;
@@ -6525,4 +6545,4 @@ export {
6525
6545
hello
6526
6546
} ;
6527
6547
6528
- //# debugId=026FCEB5FA262A6164756e2164756e21
6548
+ //# debugId=A2434C825D92470464756e2164756e21
0 commit comments