bloody-engine 1.1.7 → 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.
@@ -2871,7 +2871,7 @@ class GPUBasedSpriteBatchRenderer {
2871
2871
  // top-right
2872
2872
  [halfW, halfH],
2873
2873
  // top-right (duplicate)
2874
- [-halfH, halfH],
2874
+ [-halfW, halfH],
2875
2875
  // top-left
2876
2876
  [-halfW, -halfH]
2877
2877
  // bottom-left (duplicate)
@@ -3584,6 +3584,7 @@ class InstancedRenderer {
3584
3584
  }
3585
3585
  class HybridRenderer {
3586
3586
  constructor(gl, instancedShader, batchShader, options = {}) {
3587
+ this.quads = [];
3587
3588
  this.metrics = {
3588
3589
  instancedDrawCalls: 0,
3589
3590
  batchedDrawCalls: 0,
@@ -3613,20 +3614,10 @@ class HybridRenderer {
3613
3614
  }
3614
3615
  /**
3615
3616
  * Add a sprite for rendering
3616
- * Automatically determines which renderer to use
3617
+ * Stores the sprite and routes to appropriate renderer during render()
3617
3618
  */
3618
3619
  addSprite(sprite) {
3619
- const instance = {
3620
- gridX: sprite.gridX ?? 0,
3621
- gridY: sprite.gridY ?? 0,
3622
- z: sprite.z ?? 0,
3623
- color: sprite.color ?? { r: 1, g: 1, b: 1, a: 1 },
3624
- texIndex: sprite.texIndex ?? 0,
3625
- uvOffset: sprite.uvRect ? { u: sprite.uvRect.uMin, v: sprite.uvRect.vMin } : { u: 0, v: 0 },
3626
- size: { width: sprite.width, height: sprite.height }
3627
- };
3628
- this.instancedRenderer.addInstance(instance);
3629
- this.batchRenderer.addQuad(sprite);
3620
+ this.quads.push(sprite);
3630
3621
  }
3631
3622
  /**
3632
3623
  * Add a quad (alias for addSprite for API compatibility)
@@ -3636,11 +3627,12 @@ class HybridRenderer {
3636
3627
  this.addSprite(quad);
3637
3628
  }
3638
3629
  /**
3639
- * Clear all renderers
3630
+ * Clear all renderers and stored quads
3640
3631
  */
3641
3632
  clear() {
3642
3633
  this.instancedRenderer.clear();
3643
3634
  this.batchRenderer.clear();
3635
+ this.quads = [];
3644
3636
  this.metrics = {
3645
3637
  instancedDrawCalls: 0,
3646
3638
  batchedDrawCalls: 0,
@@ -3662,17 +3654,69 @@ class HybridRenderer {
3662
3654
  this.instancedRenderer.setDepthTestEnabled(enabled);
3663
3655
  this.batchRenderer.setDepthTestEnabled(enabled);
3664
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
+ }
3665
3676
  /**
3666
3677
  * Render all sprites
3667
3678
  * Returns rendering metrics
3668
3679
  */
3669
3680
  render(camera) {
3670
- this.metrics.instancedDrawCalls = this.instancedRenderer.render(camera);
3671
- const instancedMetrics = this.instancedRenderer.getMetrics();
3672
- this.metrics.instancedInstances = instancedMetrics.instanceCount;
3673
- this.batchRenderer.render(camera);
3674
- this.metrics.batchedDrawCalls = 1;
3675
- 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();
3676
3720
  this.frameCount++;
3677
3721
  if (this.frameCount % 60 === 0) {
3678
3722
  this.adjustThreshold();
@@ -3687,10 +3731,10 @@ class HybridRenderer {
3687
3731
  }
3688
3732
  /**
3689
3733
  * Get total quad count (API compatibility with GPUBasedSpriteBatchRenderer)
3690
- * Returns total number of sprites across both renderers
3734
+ * Returns actual number of quads waiting to be rendered
3691
3735
  */
3692
3736
  getQuadCount() {
3693
- return this.metrics.batchedInstances + this.metrics.instancedInstances;
3737
+ return this.quads.length;
3694
3738
  }
3695
3739
  /**
3696
3740
  * Set instancing threshold manually
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bloody-engine",
3
- "version": "1.1.7",
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",