bloody-engine 1.1.6 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,11 +43,24 @@ class NodeRenderingContext {
43
43
  }
44
44
  isWebGL2() {
45
45
  const glAny = this.glContext;
46
- return glAny.drawBuffers !== void 0 && glAny.getBufferSubData !== void 0;
46
+ const hasWebGL2Features = glAny.drawBuffers !== void 0 && glAny.getBufferSubData !== void 0;
47
+ if (!hasWebGL2Features && glAny.getSupportedExtensions) {
48
+ const extensions = glAny.getSupportedExtensions();
49
+ return extensions.includes("WEBGL_draw_buffers");
50
+ }
51
+ return hasWebGL2Features;
47
52
  }
48
53
  supportsInstancing() {
49
54
  const glAny = this.glContext;
50
- return glAny.drawArraysInstanced !== void 0 && glAny.vertexAttribDivisor !== void 0;
55
+ const hasDirectMethods = glAny.drawArraysInstanced !== void 0 && glAny.vertexAttribDivisor !== void 0;
56
+ if (hasDirectMethods) {
57
+ return true;
58
+ }
59
+ if (glAny.getSupportedExtensions) {
60
+ const extensions = glAny.getSupportedExtensions();
61
+ return extensions.includes("ANGLE_instanced_arrays");
62
+ }
63
+ return false;
51
64
  }
52
65
  getWebGL2Context() {
53
66
  return this.glContext;
@@ -2752,7 +2765,11 @@ class GPUBasedSpriteBatchRenderer {
2752
2765
  this.maxQuads = maxQuads;
2753
2766
  this.tileSize = tileSize;
2754
2767
  this.zScale = zScale;
2755
- this.resolution = { width: gl.canvas.width, height: gl.canvas.height };
2768
+ const glAny = gl;
2769
+ this.resolution = {
2770
+ width: glAny.canvas?.width || glAny.drawingBufferWidth || 800,
2771
+ height: glAny.canvas?.height || glAny.drawingBufferHeight || 600
2772
+ };
2756
2773
  this.depthSorter = new DepthSorter({ cellSize: spatialCellSize });
2757
2774
  const totalFloats = maxQuads * this.verticesPerQuad * this.floatsPerVertex;
2758
2775
  this.vertexData = new Float32Array(totalFloats);
@@ -2854,7 +2871,7 @@ class GPUBasedSpriteBatchRenderer {
2854
2871
  // top-right
2855
2872
  [halfW, halfH],
2856
2873
  // top-right (duplicate)
2857
- [-halfH, halfH],
2874
+ [-halfW, halfH],
2858
2875
  // top-left
2859
2876
  [-halfW, -halfH]
2860
2877
  // bottom-left (duplicate)
@@ -3051,14 +3068,14 @@ class RingBuffer {
3051
3068
  this.frameIndex = 0;
3052
3069
  this.fenceSync = null;
3053
3070
  this.pendingFrames = [];
3071
+ this.useFallbackMode = false;
3072
+ this.fallbackBuffer = null;
3054
3073
  this.ALIGNMENT = 256;
3055
3074
  this.FRAME_COUNT = 3;
3056
- const glAny = options.gl;
3057
- if (!glAny || typeof glAny.mapBufferRange !== "function") {
3058
- throw new Error("RingBuffer requires WebGL2 context with mapBufferRange support");
3059
- }
3060
3075
  this.gl = options.gl;
3061
3076
  this.size = options.size;
3077
+ const glAny = options.gl;
3078
+ this.useFallbackMode = typeof glAny.mapBufferRange !== "function";
3062
3079
  this.buffer = this.gl.createBuffer();
3063
3080
  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);
3064
3081
  this.gl.bufferData(
@@ -3066,18 +3083,22 @@ class RingBuffer {
3066
3083
  this.size,
3067
3084
  options.usage ?? this.gl.DYNAMIC_DRAW
3068
3085
  );
3069
- const MAP_WRITE_BIT2 = 2;
3070
- const MAP_PERSISTENT_BIT2 = 64;
3071
- const MAP_COHERENT_BIT2 = 128;
3072
- const flags = MAP_WRITE_BIT2 | MAP_PERSISTENT_BIT2 | MAP_COHERENT_BIT2;
3073
- this.mappedPtr = glAny.mapBufferRange(
3074
- this.gl.ARRAY_BUFFER,
3075
- 0,
3076
- this.size,
3077
- flags
3078
- );
3079
- if (!this.mappedPtr) {
3080
- throw new Error("Failed to map ring buffer persistently");
3086
+ if (this.useFallbackMode) {
3087
+ this.fallbackBuffer = new Float32Array(this.size / 4);
3088
+ } else {
3089
+ const MAP_WRITE_BIT2 = 2;
3090
+ const MAP_PERSISTENT_BIT2 = 64;
3091
+ const MAP_COHERENT_BIT2 = 128;
3092
+ const flags = MAP_WRITE_BIT2 | MAP_PERSISTENT_BIT2 | MAP_COHERENT_BIT2;
3093
+ this.mappedPtr = glAny.mapBufferRange(
3094
+ this.gl.ARRAY_BUFFER,
3095
+ 0,
3096
+ this.size,
3097
+ flags
3098
+ );
3099
+ if (!this.mappedPtr) {
3100
+ throw new Error("Failed to map ring buffer persistently");
3101
+ }
3081
3102
  }
3082
3103
  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null);
3083
3104
  }
@@ -3105,7 +3126,7 @@ class RingBuffer {
3105
3126
  const region = {
3106
3127
  offset: this.writeOffset,
3107
3128
  size: alignedSize,
3108
- view: new Float32Array(this.mappedPtr, this.writeOffset / 4, byteSize / 4),
3129
+ view: this.useFallbackMode ? this.fallbackBuffer.subarray(this.writeOffset / 4, this.writeOffset / 4 + byteSize / 4) : new Float32Array(this.mappedPtr, this.writeOffset / 4, byteSize / 4),
3109
3130
  frameIndex: this.frameIndex
3110
3131
  };
3111
3132
  this.writeOffset += alignedSize;
@@ -3117,6 +3138,18 @@ class RingBuffer {
3117
3138
  */
3118
3139
  advanceFrame() {
3119
3140
  const glAny = this.gl;
3141
+ if (this.useFallbackMode && this.fallbackBuffer) {
3142
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);
3143
+ this.gl.bufferSubData(this.gl.ARRAY_BUFFER, 0, this.fallbackBuffer);
3144
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null);
3145
+ }
3146
+ if (!glAny.fenceSync) {
3147
+ this.frameIndex++;
3148
+ if (this.writeOffset > this.size * 0.9) {
3149
+ this.writeOffset = 0;
3150
+ }
3151
+ return;
3152
+ }
3120
3153
  const SYNC_GPU_COMMANDS_COMPLETE = 37143;
3121
3154
  this.fenceSync = glAny.fenceSync(SYNC_GPU_COMMANDS_COMPLETE, 0);
3122
3155
  if (!this.fenceSync) {
@@ -3215,6 +3248,29 @@ class RingBuffer {
3215
3248
  this.gl.deleteBuffer(this.buffer);
3216
3249
  }
3217
3250
  }
3251
+ function getInstancingMethods(gl) {
3252
+ if (gl.drawArraysInstanced && gl.vertexAttribDivisor) {
3253
+ return {
3254
+ drawArraysInstanced: gl.drawArraysInstanced.bind(gl),
3255
+ drawElementsInstanced: gl.drawElementsInstanced?.bind(gl) || gl.drawArraysInstanced.bind(gl),
3256
+ vertexAttribDivisor: gl.vertexAttribDivisor.bind(gl)
3257
+ };
3258
+ }
3259
+ const ext = gl.getExtension("ANGLE_instanced_arrays");
3260
+ if (ext) {
3261
+ const drawArrays = ext.drawArraysInstanced || ext._drawArraysInstanced;
3262
+ const drawElements = ext.drawElementsInstanced || ext._drawElementsInstanced;
3263
+ const divisor = ext.vertexAttribDivisor || ext._vertexAttribDivisor;
3264
+ if (drawArrays && divisor) {
3265
+ return {
3266
+ drawArraysInstanced: drawArrays.bind(ext),
3267
+ drawElementsInstanced: drawElements?.bind(ext) || drawArrays.bind(ext),
3268
+ vertexAttribDivisor: divisor.bind(ext)
3269
+ };
3270
+ }
3271
+ }
3272
+ return null;
3273
+ }
3218
3274
  class InstancedRenderer {
3219
3275
  constructor(gl, shader, options = {}) {
3220
3276
  this.texture = null;
@@ -3222,10 +3278,11 @@ class InstancedRenderer {
3222
3278
  this.depthTestEnabled = true;
3223
3279
  this.lastFrameDrawCalls = 0;
3224
3280
  this.lastFrameInstanceCount = 0;
3225
- const glAny = gl;
3226
- if (!glAny || typeof glAny.drawArraysInstanced !== "function") {
3227
- throw new Error("InstancedRenderer requires WebGL2 context with instancing support");
3281
+ const methods = getInstancingMethods(gl);
3282
+ if (!methods) {
3283
+ throw new Error("InstancedRenderer requires WebGL2 context with instancing support (ANGLE_instanced_arrays)");
3228
3284
  }
3285
+ this.instancingMethods = methods;
3229
3286
  this.gl = gl;
3230
3287
  this.shader = shader;
3231
3288
  this.maxInstances = options.maxInstances ?? 1e4;
@@ -3424,7 +3481,7 @@ class InstancedRenderer {
3424
3481
  }
3425
3482
  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.instanceBufferWebGL);
3426
3483
  this.setupInstanceAttributes(region.offset);
3427
- this.gl.drawArraysInstanced(
3484
+ this.instancingMethods.drawArraysInstanced(
3428
3485
  this.gl.TRIANGLES,
3429
3486
  0,
3430
3487
  6,
@@ -3439,42 +3496,41 @@ class InstancedRenderer {
3439
3496
  setupInstanceAttributes(offset) {
3440
3497
  const stride = this.instanceStride * 4;
3441
3498
  const baseOffset = offset;
3442
- const glAny = this.gl;
3443
3499
  const gridAttr = this.shader.getAttributeLocation("aGridPosition");
3444
3500
  if (gridAttr !== -1) {
3445
3501
  this.gl.enableVertexAttribArray(gridAttr);
3446
3502
  this.gl.vertexAttribPointer(gridAttr, 2, this.gl.FLOAT, false, stride, baseOffset);
3447
- glAny.vertexAttribDivisor(gridAttr, 1);
3503
+ this.instancingMethods.vertexAttribDivisor(gridAttr, 1);
3448
3504
  }
3449
3505
  const zAttr = this.shader.getAttributeLocation("aZPosition");
3450
3506
  if (zAttr !== -1) {
3451
3507
  this.gl.enableVertexAttribArray(zAttr);
3452
3508
  this.gl.vertexAttribPointer(zAttr, 1, this.gl.FLOAT, false, stride, baseOffset + 2 * 4);
3453
- glAny.vertexAttribDivisor(zAttr, 1);
3509
+ this.instancingMethods.vertexAttribDivisor(zAttr, 1);
3454
3510
  }
3455
3511
  const colorAttr = this.shader.getAttributeLocation("aColor");
3456
3512
  if (colorAttr !== -1) {
3457
3513
  this.gl.enableVertexAttribArray(colorAttr);
3458
3514
  this.gl.vertexAttribPointer(colorAttr, 4, this.gl.FLOAT, false, stride, baseOffset + 3 * 4);
3459
- glAny.vertexAttribDivisor(colorAttr, 1);
3515
+ this.instancingMethods.vertexAttribDivisor(colorAttr, 1);
3460
3516
  }
3461
3517
  const texAttr = this.shader.getAttributeLocation("aTexIndex");
3462
3518
  if (texAttr !== -1) {
3463
3519
  this.gl.enableVertexAttribArray(texAttr);
3464
3520
  this.gl.vertexAttribPointer(texAttr, 1, this.gl.FLOAT, false, stride, baseOffset + 7 * 4);
3465
- glAny.vertexAttribDivisor(texAttr, 1);
3521
+ this.instancingMethods.vertexAttribDivisor(texAttr, 1);
3466
3522
  }
3467
3523
  const uvOffsetAttr = this.shader.getAttributeLocation("aUVOffset");
3468
3524
  if (uvOffsetAttr !== -1) {
3469
3525
  this.gl.enableVertexAttribArray(uvOffsetAttr);
3470
3526
  this.gl.vertexAttribPointer(uvOffsetAttr, 2, this.gl.FLOAT, false, stride, baseOffset + 8 * 4);
3471
- glAny.vertexAttribDivisor(uvOffsetAttr, 1);
3527
+ this.instancingMethods.vertexAttribDivisor(uvOffsetAttr, 1);
3472
3528
  }
3473
3529
  const sizeAttr = this.shader.getAttributeLocation("aSize");
3474
3530
  if (sizeAttr !== -1) {
3475
3531
  this.gl.enableVertexAttribArray(sizeAttr);
3476
3532
  this.gl.vertexAttribPointer(sizeAttr, 2, this.gl.FLOAT, false, stride, baseOffset + 10 * 4);
3477
- glAny.vertexAttribDivisor(sizeAttr, 1);
3533
+ this.instancingMethods.vertexAttribDivisor(sizeAttr, 1);
3478
3534
  }
3479
3535
  }
3480
3536
  /**
@@ -3528,6 +3584,7 @@ class InstancedRenderer {
3528
3584
  }
3529
3585
  class HybridRenderer {
3530
3586
  constructor(gl, instancedShader, batchShader, options = {}) {
3587
+ this.quads = [];
3531
3588
  this.metrics = {
3532
3589
  instancedDrawCalls: 0,
3533
3590
  batchedDrawCalls: 0,
@@ -3557,20 +3614,10 @@ class HybridRenderer {
3557
3614
  }
3558
3615
  /**
3559
3616
  * Add a sprite for rendering
3560
- * Automatically determines which renderer to use
3617
+ * Stores the sprite and routes to appropriate renderer during render()
3561
3618
  */
3562
3619
  addSprite(sprite) {
3563
- const instance = {
3564
- gridX: sprite.gridX ?? 0,
3565
- gridY: sprite.gridY ?? 0,
3566
- z: sprite.z ?? 0,
3567
- color: sprite.color ?? { r: 1, g: 1, b: 1, a: 1 },
3568
- texIndex: sprite.texIndex ?? 0,
3569
- uvOffset: sprite.uvRect ? { u: sprite.uvRect.uMin, v: sprite.uvRect.vMin } : { u: 0, v: 0 },
3570
- size: { width: sprite.width, height: sprite.height }
3571
- };
3572
- this.instancedRenderer.addInstance(instance);
3573
- this.batchRenderer.addQuad(sprite);
3620
+ this.quads.push(sprite);
3574
3621
  }
3575
3622
  /**
3576
3623
  * Add a quad (alias for addSprite for API compatibility)
@@ -3580,11 +3627,12 @@ class HybridRenderer {
3580
3627
  this.addSprite(quad);
3581
3628
  }
3582
3629
  /**
3583
- * Clear all renderers
3630
+ * Clear all renderers and stored quads
3584
3631
  */
3585
3632
  clear() {
3586
3633
  this.instancedRenderer.clear();
3587
3634
  this.batchRenderer.clear();
3635
+ this.quads = [];
3588
3636
  this.metrics = {
3589
3637
  instancedDrawCalls: 0,
3590
3638
  batchedDrawCalls: 0,
@@ -3606,17 +3654,69 @@ class HybridRenderer {
3606
3654
  this.instancedRenderer.setDepthTestEnabled(enabled);
3607
3655
  this.batchRenderer.setDepthTestEnabled(enabled);
3608
3656
  }
3657
+ /**
3658
+ * Group quads by texture and size for efficient batching
3659
+ */
3660
+ groupQuads() {
3661
+ const groups = /* @__PURE__ */ new Map();
3662
+ for (const quad of this.quads) {
3663
+ const key = `${quad.texIndex ?? 0}_${quad.width}_${quad.height}`;
3664
+ if (!groups.has(key)) {
3665
+ groups.set(key, {
3666
+ texIndex: quad.texIndex ?? 0,
3667
+ width: quad.width,
3668
+ height: quad.height,
3669
+ quads: []
3670
+ });
3671
+ }
3672
+ groups.get(key).quads.push(quad);
3673
+ }
3674
+ return groups;
3675
+ }
3609
3676
  /**
3610
3677
  * Render all sprites
3611
3678
  * Returns rendering metrics
3612
3679
  */
3613
3680
  render(camera) {
3614
- this.metrics.instancedDrawCalls = this.instancedRenderer.render(camera);
3615
- const instancedMetrics = this.instancedRenderer.getMetrics();
3616
- this.metrics.instancedInstances = instancedMetrics.instanceCount;
3617
- this.batchRenderer.render(camera);
3618
- this.metrics.batchedDrawCalls = 1;
3619
- this.metrics.batchedInstances = this.batchRenderer.getQuadCount();
3681
+ this.metrics = {
3682
+ instancedDrawCalls: 0,
3683
+ batchedDrawCalls: 0,
3684
+ instancedInstances: 0,
3685
+ batchedInstances: 0
3686
+ };
3687
+ const groups = this.groupQuads();
3688
+ for (const group of groups.values()) {
3689
+ if (group.quads.length >= this.threshold) {
3690
+ for (const quad of group.quads) {
3691
+ const instance = {
3692
+ gridX: quad.gridX ?? 0,
3693
+ gridY: quad.gridY ?? 0,
3694
+ z: quad.z ?? 0,
3695
+ color: quad.color ?? { r: 1, g: 1, b: 1, a: 1 },
3696
+ texIndex: quad.texIndex ?? 0,
3697
+ uvOffset: quad.uvRect ? { u: quad.uvRect.uMin, v: quad.uvRect.vMin } : { u: 0, v: 0 },
3698
+ size: { width: quad.width, height: quad.height }
3699
+ };
3700
+ this.instancedRenderer.addInstance(instance);
3701
+ }
3702
+ this.metrics.instancedInstances += group.quads.length;
3703
+ } else {
3704
+ for (const quad of group.quads) {
3705
+ this.batchRenderer.addQuad(quad);
3706
+ }
3707
+ this.metrics.batchedInstances += group.quads.length;
3708
+ }
3709
+ }
3710
+ if (this.metrics.instancedInstances > 0) {
3711
+ this.metrics.instancedDrawCalls = this.instancedRenderer.render(camera);
3712
+ }
3713
+ if (this.metrics.batchedInstances > 0) {
3714
+ this.batchRenderer.render(camera);
3715
+ this.metrics.batchedDrawCalls = 1;
3716
+ }
3717
+ this.quads = [];
3718
+ this.instancedRenderer.clear();
3719
+ this.batchRenderer.clear();
3620
3720
  this.frameCount++;
3621
3721
  if (this.frameCount % 60 === 0) {
3622
3722
  this.adjustThreshold();
@@ -3631,10 +3731,10 @@ class HybridRenderer {
3631
3731
  }
3632
3732
  /**
3633
3733
  * Get total quad count (API compatibility with GPUBasedSpriteBatchRenderer)
3634
- * Returns total number of sprites across both renderers
3734
+ * Returns actual number of quads waiting to be rendered
3635
3735
  */
3636
3736
  getQuadCount() {
3637
- return this.metrics.batchedInstances + this.metrics.instancedInstances;
3737
+ return this.quads.length;
3638
3738
  }
3639
3739
  /**
3640
3740
  * Set instancing threshold manually
@@ -1 +1 @@
1
- {"version":3,"file":"node-context.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/node/node-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAE3C;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAS;gBAEf,OAAO,EAAE,uBAAuB;IAiB5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAU3C,WAAW,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAIhD,KAAK,CAAC,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IASnE,OAAO,IAAI,IAAI;IAKf,OAAO,IAAI,IAAI;IAOf,QAAQ,IAAI,OAAO;IAQnB,kBAAkB,IAAI,OAAO;IAO7B,gBAAgB,IAAI,GAAG;IAMvB;;;OAGG;IACH,UAAU,IAAI,UAAU;CAazB"}
1
+ {"version":3,"file":"node-context.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/node/node-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAE3C;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAS;gBAEf,OAAO,EAAE,uBAAuB;IAiB5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAU3C,WAAW,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAIhD,KAAK,CAAC,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IASnE,OAAO,IAAI,IAAI;IAKf,OAAO,IAAI,IAAI;IAOf,QAAQ,IAAI,OAAO;IAiBnB,kBAAkB,IAAI,OAAO;IAqB7B,gBAAgB,IAAI,GAAG;IAMvB;;;OAGG;IACH,UAAU,IAAI,UAAU;CAazB"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * WebGL Extension Helper for Node.js
3
+ *
4
+ * headless-gl provides WebGL2 features through extensions rather than
5
+ * direct context methods. This helper provides unified access to both.
6
+ */
7
+ /**
8
+ * Get instancing extension methods
9
+ * Returns either direct methods or ANGLE_instanced_arrays extension
10
+ * Handles both standard names and headless-gl's underscored names
11
+ */
12
+ export declare function getInstancingMethods(gl: any): {
13
+ drawArraysInstanced: Function;
14
+ drawElementsInstanced: Function;
15
+ vertexAttribDivisor: Function;
16
+ } | null;
17
+ /**
18
+ * Check if instancing is available
19
+ */
20
+ export declare function hasInstancingSupport(gl: any): boolean;
21
+ /**
22
+ * Get WebGL2 buffer mapping methods
23
+ * Returns either direct methods or checks for extension support
24
+ */
25
+ export declare function getBufferMappingMethods(gl: any): {
26
+ mapBufferRange: Function;
27
+ unmapBuffer: Function;
28
+ fenceSync: Function;
29
+ clientWaitSync: Function;
30
+ deleteSync: Function;
31
+ } | null;
32
+ //# sourceMappingURL=webgl-extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl-extensions.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/node/webgl-extensions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,GAAG,GAAG;IAC7C,mBAAmB,EAAE,QAAQ,CAAC;IAC9B,qBAAqB,EAAE,QAAQ,CAAC;IAChC,mBAAmB,EAAE,QAAQ,CAAC;CAC/B,GAAG,IAAI,CA4BP;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,GAAG,GAAG;IAChD,cAAc,EAAE,QAAQ,CAAC;IACzB,WAAW,EAAE,QAAQ,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC;IACpB,cAAc,EAAE,QAAQ,CAAC;IACzB,UAAU,EAAE,QAAQ,CAAC;CACtB,GAAG,IAAI,CAeP"}
@@ -1 +1 @@
1
- {"version":3,"file":"batch-renderer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/batch-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch-renderer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/batch-renderer.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,7 @@ export declare class HybridRenderer {
42
42
  private instancedRenderer;
43
43
  private batchRenderer;
44
44
  private threshold;
45
+ private quads;
45
46
  private metrics;
46
47
  private frameCount;
47
48
  private lastFpsCheck;
@@ -50,7 +51,7 @@ export declare class HybridRenderer {
50
51
  instancedShader: Shader, batchShader: Shader, options?: HybridRendererOptions);
51
52
  /**
52
53
  * Add a sprite for rendering
53
- * Automatically determines which renderer to use
54
+ * Stores the sprite and routes to appropriate renderer during render()
54
55
  */
55
56
  addSprite(sprite: SpriteQuadInstance): void;
56
57
  /**
@@ -59,7 +60,7 @@ export declare class HybridRenderer {
59
60
  */
60
61
  addQuad(quad: SpriteQuadInstance): void;
61
62
  /**
62
- * Clear all renderers
63
+ * Clear all renderers and stored quads
63
64
  */
64
65
  clear(): void;
65
66
  /**
@@ -70,6 +71,10 @@ export declare class HybridRenderer {
70
71
  * Set depth testing
71
72
  */
72
73
  setDepthTestEnabled(enabled: boolean): void;
74
+ /**
75
+ * Group quads by texture and size for efficient batching
76
+ */
77
+ private groupQuads;
73
78
  /**
74
79
  * Render all sprites
75
80
  * Returns rendering metrics
@@ -81,7 +86,7 @@ export declare class HybridRenderer {
81
86
  getMetrics(): RenderMetrics;
82
87
  /**
83
88
  * Get total quad count (API compatibility with GPUBasedSpriteBatchRenderer)
84
- * Returns total number of sprites across both renderers
89
+ * Returns actual number of quads waiting to be rendered
85
90
  */
86
91
  getQuadCount(): number;
87
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-renderer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/hybrid-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,OAAO,CAKb;IAGF,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,kBAAkB,CAAgB;gBAGxC,EAAE,EAAE,GAAG,EAAE,yCAAyC;IAClD,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B;IAuBrC;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAsB3C;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAIvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAab;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAKzC;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK3C;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAuBrC;;OAEG;IACH,UAAU,IAAI,aAAa;IAI3B;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK/C;;OAEG;IACH,sBAAsB,IAAI,MAAM;IAIhC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
1
+ {"version":3,"file":"hybrid-renderer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/hybrid-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAYD;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA4B;IAGzC,OAAO,CAAC,OAAO,CAKb;IAGF,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,kBAAkB,CAAgB;gBAGxC,EAAE,EAAE,GAAG,EAAE,yCAAyC;IAClD,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B;IAuBrC;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAI3C;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAIvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAKzC;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK3C;;OAEG;IACH,OAAO,CAAC,UAAU;IAqBlB;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAmErC;;OAEG;IACH,UAAU,IAAI,aAAa;IAI3B;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK/C;;OAEG;IACH,sBAAsB,IAAI,MAAM;IAIhC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -58,6 +58,7 @@ export declare class InstancedRenderer {
58
58
  private gl;
59
59
  private shader;
60
60
  private texture;
61
+ private instancingMethods;
61
62
  private positionBuffer;
62
63
  private uvBuffer;
63
64
  private instanceBuffer;
@@ -1 +1 @@
1
- {"version":3,"file":"instanced-renderer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/instanced-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instanced-renderer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/instanced-renderer.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,8 @@ export interface RingBufferOptions {
42
42
  *
43
43
  * Circular buffer with persistent mapping for efficient GPU streaming.
44
44
  * Uses triple buffering to avoid CPU-GPU synchronization points.
45
+ *
46
+ * Falls back to regular buffer updates if persistent mapping is not available.
45
47
  */
46
48
  export declare class RingBuffer {
47
49
  private gl;
@@ -53,6 +55,8 @@ export declare class RingBuffer {
53
55
  private frameIndex;
54
56
  private fenceSync;
55
57
  private pendingFrames;
58
+ private useFallbackMode;
59
+ private fallbackBuffer;
56
60
  private readonly ALIGNMENT;
57
61
  private readonly FRAME_COUNT;
58
62
  constructor(options: RingBufferOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/ring-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,YAAY,CAAC;IACnB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,EAAE,EAAE,GAAG,CAAC;IACR,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAWD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,IAAI,CAAS;IAGrB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAG/B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,aAAa,CAAsB;IAG3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;gBAErB,OAAO,EAAE,iBAAiB;IA0CtC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAsCnD;;;OAGG;IACH,YAAY,IAAI,IAAI;IAmCpB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;;OAGG;IACH,KAAK,IAAI,IAAI;IAmBb;;;OAGG;IACH,SAAS,IAAI,WAAW;IAIxB;;;OAGG;IACH,gBAAgB,IAAI,WAAW,GAAG,IAAI;IAItC;;;OAGG;IACH,OAAO,IAAI,IAAI;CA0BhB"}
1
+ {"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../../../src/rendering/ring-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,YAAY,CAAC;IACnB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,EAAE,EAAE,GAAG,CAAC;IACR,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAWD;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,IAAI,CAAS;IAGrB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAG/B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,aAAa,CAAsB;IAG3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAA6B;IAGnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;gBAErB,OAAO,EAAE,iBAAiB;IA6CtC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAwCnD;;;OAGG;IACH,YAAY,IAAI,IAAI;IAqDpB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;;OAGG;IACH,KAAK,IAAI,IAAI;IAmBb;;;OAGG;IACH,SAAS,IAAI,WAAW;IAIxB;;;OAGG;IACH,gBAAgB,IAAI,WAAW,GAAG,IAAI;IAItC;;;OAGG;IACH,OAAO,IAAI,IAAI;CA0BhB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bloody-engine",
3
- "version": "1.1.6",
3
+ "version": "1.1.8",
4
4
  "description": "A WebGL-based 2.5D graphics engine for isometric rendering",
5
5
  "license": "MIT",
6
6
  "type": "module",