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.
package/dist/node/index.js
CHANGED
|
@@ -2871,7 +2871,7 @@ class GPUBasedSpriteBatchRenderer {
|
|
|
2871
2871
|
// top-right
|
|
2872
2872
|
[halfW, halfH],
|
|
2873
2873
|
// top-right (duplicate)
|
|
2874
|
-
[-
|
|
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
|
-
*
|
|
3617
|
+
* Stores the sprite and routes to appropriate renderer during render()
|
|
3617
3618
|
*/
|
|
3618
3619
|
addSprite(sprite) {
|
|
3619
|
-
|
|
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
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
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
|
|
3734
|
+
* Returns actual number of quads waiting to be rendered
|
|
3691
3735
|
*/
|
|
3692
3736
|
getQuadCount() {
|
|
3693
|
-
return this.
|
|
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
|
-
*
|
|
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
|
|
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;
|
|
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"}
|