@flighthq/render 0.2.1-next.738.07b221d → 0.2.1-next.841.373388f
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/explainScene2DRender.d.ts +3 -0
- package/dist/explainScene2DRender.d.ts.map +1 -0
- package/dist/{explainDisplayObjectRender.js → explainScene2DRender.js} +3 -3
- package/dist/explainScene2DRender.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/renderProxy.d.ts +2 -2
- package/dist/renderProxy.d.ts.map +1 -1
- package/dist/renderProxy.js +13 -13
- package/dist/renderProxy.js.map +1 -1
- package/dist/renderQueue.js +1 -1
- package/dist/renderQueue.js.map +1 -1
- package/dist/renderTarget.d.ts +7 -7
- package/dist/renderTarget.d.ts.map +1 -1
- package/dist/renderTarget.js +16 -16
- package/dist/renderTarget.js.map +1 -1
- package/dist/sceneRender.d.ts +3 -3
- package/dist/sceneRender.d.ts.map +1 -1
- package/dist/sceneRender.js +27 -23
- package/dist/sceneRender.js.map +1 -1
- package/package.json +12 -12
- package/src/enableColorAdjustmentGuards.test.ts +3 -5
- package/src/{explainDisplayObjectRender.test.ts → explainScene2DRender.test.ts} +21 -21
- package/src/renderAppearance.test.ts +1 -1
- package/src/renderCache.test.ts +1 -1
- package/src/renderColorTransform.test.ts +4 -10
- package/src/renderProxy.test.ts +45 -45
- package/src/renderProxyAdapter.test.ts +1 -1
- package/src/renderQueue.test.ts +7 -7
- package/src/renderTarget.test.ts +32 -32
- package/src/renderTransform2d.test.ts +1 -1
- package/src/renderViewport.test.ts +5 -5
- package/src/renderer.test.ts +2 -2
- package/src/sceneRender.test.ts +76 -62
- package/dist/explainDisplayObjectRender.d.ts +0 -3
- package/dist/explainDisplayObjectRender.d.ts.map +0 -1
- package/dist/explainDisplayObjectRender.js.map +0 -1
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { createDisplayObject } from '@flighthq/displayobject';
|
|
2
1
|
import { addNodeChild } from '@flighthq/node';
|
|
2
|
+
import { createDisplayObject } from '@flighthq/scene2d';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { explainScene2DRender } from './explainScene2DRender';
|
|
5
5
|
import { registerRenderer } from './renderer';
|
|
6
|
-
import { getRenderProxy2D,
|
|
6
|
+
import { getRenderProxy2D, prepareScene2DRender } from './renderProxy';
|
|
7
7
|
import { createRenderState, getRenderStateRuntime } from './renderState';
|
|
8
8
|
|
|
9
9
|
function makeRenderer() {
|
|
10
10
|
return { createData: () => ({ tag: 'data' }), submit: vi.fn() } as any;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
describe('
|
|
13
|
+
describe('explainScene2DRender', () => {
|
|
14
14
|
it('reports no-renderer for a node whose kind has no registered renderer', () => {
|
|
15
15
|
const state = createRenderState();
|
|
16
16
|
const source = createDisplayObject();
|
|
17
|
-
|
|
17
|
+
prepareScene2DRender(state, source);
|
|
18
18
|
|
|
19
|
-
const explanation =
|
|
19
|
+
const explanation = explainScene2DRender(state, source);
|
|
20
20
|
|
|
21
21
|
expect(explanation.hasRenderer).toBe(false);
|
|
22
22
|
expect(explanation.reason).toBe('no-renderer');
|
|
@@ -28,7 +28,7 @@ describe('explainDisplayObjectRender', () => {
|
|
|
28
28
|
const source = createDisplayObject();
|
|
29
29
|
registerRenderer(state, source.kind, makeRenderer());
|
|
30
30
|
|
|
31
|
-
const explanation =
|
|
31
|
+
const explanation = explainScene2DRender(state, source);
|
|
32
32
|
|
|
33
33
|
expect(explanation.hasRenderer).toBe(true);
|
|
34
34
|
expect(explanation.prepared).toBe(false);
|
|
@@ -39,9 +39,9 @@ describe('explainDisplayObjectRender', () => {
|
|
|
39
39
|
const state = createRenderState();
|
|
40
40
|
const source = createDisplayObject();
|
|
41
41
|
registerRenderer(state, source.kind, makeRenderer());
|
|
42
|
-
|
|
42
|
+
prepareScene2DRender(state, source);
|
|
43
43
|
|
|
44
|
-
const explanation =
|
|
44
|
+
const explanation = explainScene2DRender(state, source);
|
|
45
45
|
|
|
46
46
|
expect(explanation.prepared).toBe(true);
|
|
47
47
|
expect(explanation.visible).toBe(true);
|
|
@@ -54,9 +54,9 @@ describe('explainDisplayObjectRender', () => {
|
|
|
54
54
|
const source = createDisplayObject();
|
|
55
55
|
source.visible = false;
|
|
56
56
|
registerRenderer(state, source.kind, makeRenderer());
|
|
57
|
-
|
|
57
|
+
prepareScene2DRender(state, source);
|
|
58
58
|
|
|
59
|
-
const explanation =
|
|
59
|
+
const explanation = explainScene2DRender(state, source);
|
|
60
60
|
|
|
61
61
|
expect(explanation.visible).toBe(false);
|
|
62
62
|
expect(explanation.reason).toBe('not-visible');
|
|
@@ -67,9 +67,9 @@ describe('explainDisplayObjectRender', () => {
|
|
|
67
67
|
const source = createDisplayObject();
|
|
68
68
|
source.alpha = 0;
|
|
69
69
|
registerRenderer(state, source.kind, makeRenderer());
|
|
70
|
-
|
|
70
|
+
prepareScene2DRender(state, source);
|
|
71
71
|
|
|
72
|
-
const explanation =
|
|
72
|
+
const explanation = explainScene2DRender(state, source);
|
|
73
73
|
|
|
74
74
|
expect(explanation.visible).toBe(true);
|
|
75
75
|
expect(explanation.effectiveAlpha).toBe(0);
|
|
@@ -83,9 +83,9 @@ describe('explainDisplayObjectRender', () => {
|
|
|
83
83
|
parent.visible = false;
|
|
84
84
|
addNodeChild(parent, child);
|
|
85
85
|
registerRenderer(state, child.kind, makeRenderer());
|
|
86
|
-
|
|
86
|
+
prepareScene2DRender(state, parent);
|
|
87
87
|
|
|
88
|
-
const explanation =
|
|
88
|
+
const explanation = explainScene2DRender(state, child);
|
|
89
89
|
|
|
90
90
|
expect(explanation.prepared).toBe(false);
|
|
91
91
|
expect(explanation.reason).toBe('not-prepared');
|
|
@@ -99,9 +99,9 @@ describe('explainDisplayObjectRender', () => {
|
|
|
99
99
|
child.alpha = 0.5;
|
|
100
100
|
addNodeChild(parent, child);
|
|
101
101
|
registerRenderer(state, child.kind, makeRenderer());
|
|
102
|
-
|
|
102
|
+
prepareScene2DRender(state, parent);
|
|
103
103
|
|
|
104
|
-
const explanation =
|
|
104
|
+
const explanation = explainScene2DRender(state, child);
|
|
105
105
|
|
|
106
106
|
expect(explanation.effectiveAlpha).toBeCloseTo(0.25);
|
|
107
107
|
expect(explanation.reason).toBe('ok');
|
|
@@ -112,10 +112,10 @@ describe('explainDisplayObjectRender', () => {
|
|
|
112
112
|
const source = createDisplayObject();
|
|
113
113
|
registerRenderer(state, source.kind, makeRenderer());
|
|
114
114
|
|
|
115
|
-
expect(() =>
|
|
115
|
+
expect(() => explainScene2DRender(state, source)).not.toThrow();
|
|
116
116
|
// Two calls agree and neither materialized a proxy — the query is a pure read.
|
|
117
|
-
const first =
|
|
118
|
-
const second =
|
|
117
|
+
const first = explainScene2DRender(state, source);
|
|
118
|
+
const second = explainScene2DRender(state, source);
|
|
119
119
|
expect(second).toEqual(first);
|
|
120
120
|
expect(getRenderProxy2D(state, source)).toBeUndefined();
|
|
121
121
|
expect(getRenderStateRuntime(state).renderProxyMap.get(source)).toBeUndefined();
|
|
@@ -125,6 +125,6 @@ describe('explainDisplayObjectRender', () => {
|
|
|
125
125
|
const state = createRenderState();
|
|
126
126
|
const bare = { kind: 'DisplayObject' } as any;
|
|
127
127
|
|
|
128
|
-
expect(() =>
|
|
128
|
+
expect(() => explainScene2DRender(state, bare)).not.toThrow();
|
|
129
129
|
});
|
|
130
130
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createDisplayObject } from '@flighthq/displayobject';
|
|
2
1
|
import { invalidateNodeAppearance } from '@flighthq/node';
|
|
2
|
+
import { createDisplayObject } from '@flighthq/scene2d';
|
|
3
3
|
import { BlendMode } from '@flighthq/types';
|
|
4
4
|
|
|
5
5
|
import { updateRenderProxyAppearance } from './renderAppearance';
|
package/src/renderCache.test.ts
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { createColorTransformAdjustment } from '@flighthq/adjustments';
|
|
2
|
-
import {
|
|
3
|
-
createDisplayObject,
|
|
4
|
-
getDisplayObjectRuntime,
|
|
5
|
-
setDisplayObjectColorAdjustments,
|
|
6
|
-
} from '@flighthq/displayobject';
|
|
7
2
|
import { createColorTransform } from '@flighthq/materials';
|
|
3
|
+
import { createDisplayObject, getNode2DRuntime, setNode2DColorAdjustments } from '@flighthq/scene2d';
|
|
8
4
|
import type { Renderable } from '@flighthq/types';
|
|
9
5
|
|
|
10
6
|
import { updateRenderProxyColorTransform } from './renderColorTransform';
|
|
@@ -15,7 +11,7 @@ describe('updateRenderProxyColorTransform', () => {
|
|
|
15
11
|
it('resolves a node color-adjustment stack onto the render node as an affine ColorTransform', () => {
|
|
16
12
|
const state = createRenderState();
|
|
17
13
|
const node = createDisplayObject();
|
|
18
|
-
|
|
14
|
+
setNode2DColorAdjustments(node, [
|
|
19
15
|
createColorTransformAdjustment(createColorTransform({ redMultiplier: 0.5, greenMultiplier: 0 })),
|
|
20
16
|
]);
|
|
21
17
|
const data = createRenderProxy(state, node as unknown as Renderable);
|
|
@@ -36,11 +32,9 @@ describe('updateRenderProxyColorTransform', () => {
|
|
|
36
32
|
it('reads the cache the accessor fused once (the walk never re-fuses)', () => {
|
|
37
33
|
const state = createRenderState();
|
|
38
34
|
const node = createDisplayObject();
|
|
39
|
-
|
|
40
|
-
createColorTransformAdjustment(createColorTransform({ redMultiplier: 0.25 })),
|
|
41
|
-
]);
|
|
35
|
+
setNode2DColorAdjustments(node, [createColorTransformAdjustment(createColorTransform({ redMultiplier: 0.25 }))]);
|
|
42
36
|
// The set-accessor fused the stack once; the runtime already holds the cached resolved value.
|
|
43
|
-
const cached =
|
|
37
|
+
const cached = getNode2DRuntime(node).resolvedColorTransform;
|
|
44
38
|
expect(cached).not.toBeNull();
|
|
45
39
|
const data = createRenderProxy(state, node as unknown as Renderable);
|
|
46
40
|
updateRenderProxyColorTransform(state, data);
|
package/src/renderProxy.test.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createDisplayObject, setDisplayObjectClip } from '@flighthq/displayobject';
|
|
2
1
|
import { createMatrix, createRectangle } from '@flighthq/geometry';
|
|
3
2
|
import {
|
|
4
3
|
addNodeChild,
|
|
@@ -8,6 +7,7 @@ import {
|
|
|
8
7
|
invalidateNodeAppearance,
|
|
9
8
|
invalidateNodeLocalTransform,
|
|
10
9
|
} from '@flighthq/node';
|
|
10
|
+
import { createDisplayObject, setNode2DClip } from '@flighthq/scene2d';
|
|
11
11
|
import { createSprite } from '@flighthq/sprite';
|
|
12
12
|
import type { ClipRegion } from '@flighthq/types';
|
|
13
13
|
|
|
@@ -15,14 +15,14 @@ import { registerRenderer } from './renderer';
|
|
|
15
15
|
import {
|
|
16
16
|
createRenderProxy,
|
|
17
17
|
createRenderProxy2D,
|
|
18
|
-
|
|
18
|
+
disposeScene2DRender,
|
|
19
19
|
disposeRenderProxy,
|
|
20
20
|
getOrCreateRenderProxy2D,
|
|
21
21
|
getRenderProxy2D,
|
|
22
22
|
installRenderAdaptHook,
|
|
23
23
|
isRenderProxyDirty,
|
|
24
24
|
isRenderProxyVisible,
|
|
25
|
-
|
|
25
|
+
prepareScene2DRender,
|
|
26
26
|
updateNodeClip,
|
|
27
27
|
updateRenderProxy2D,
|
|
28
28
|
updateRenderProxyRenderer,
|
|
@@ -108,7 +108,28 @@ describe('createRenderProxy2D', () => {
|
|
|
108
108
|
});
|
|
109
109
|
});
|
|
110
110
|
|
|
111
|
-
describe('
|
|
111
|
+
describe('disposeRenderProxy', () => {
|
|
112
|
+
it('cascades to the renderer destroyData and removes the proxy', () => {
|
|
113
|
+
const state = createRenderState();
|
|
114
|
+
const source = createSprite();
|
|
115
|
+
const destroyData = vi.fn();
|
|
116
|
+
registerRenderer(state, source.kind, { createData: () => ({ tag: 'data' }), destroyData, submit: vi.fn() } as any);
|
|
117
|
+
const node = getOrCreateRenderProxy2D(state, source);
|
|
118
|
+
const data = node.rendererData;
|
|
119
|
+
|
|
120
|
+
disposeRenderProxy(state, source);
|
|
121
|
+
|
|
122
|
+
expect(destroyData).toHaveBeenCalledWith(state, data);
|
|
123
|
+
expect(getRenderProxy2D(state, source)).toBeUndefined();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('is a no-op when no proxy exists', () => {
|
|
127
|
+
const state = createRenderState();
|
|
128
|
+
expect(() => disposeRenderProxy(state, createSprite())).not.toThrow();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe('disposeScene2DRender', () => {
|
|
112
133
|
it('disposes the root and all descendants', () => {
|
|
113
134
|
const state = createRenderState();
|
|
114
135
|
const root = createDisplayObject();
|
|
@@ -116,9 +137,9 @@ describe('disposeDisplayObjectRender', () => {
|
|
|
116
137
|
const grandchild = createDisplayObject();
|
|
117
138
|
addNodeChild(root, child);
|
|
118
139
|
addNodeChild(child, grandchild);
|
|
119
|
-
|
|
140
|
+
prepareScene2DRender(state, root);
|
|
120
141
|
|
|
121
|
-
|
|
142
|
+
disposeScene2DRender(state, root);
|
|
122
143
|
|
|
123
144
|
expect(getRenderProxy2D(state, root)).toBeUndefined();
|
|
124
145
|
expect(getRenderProxy2D(state, child)).toBeUndefined();
|
|
@@ -132,9 +153,9 @@ describe('disposeDisplayObjectRender', () => {
|
|
|
132
153
|
const grandchild = createSprite();
|
|
133
154
|
addNodeChild(root, child);
|
|
134
155
|
addNodeChild(child, grandchild);
|
|
135
|
-
|
|
156
|
+
prepareScene2DRender(state, root);
|
|
136
157
|
|
|
137
|
-
|
|
158
|
+
disposeScene2DRender(state, root);
|
|
138
159
|
|
|
139
160
|
expect(getRenderProxy2D(state, root)).toBeUndefined();
|
|
140
161
|
expect(getRenderProxy2D(state, child)).toBeUndefined();
|
|
@@ -151,7 +172,7 @@ describe('disposeDisplayObjectRender', () => {
|
|
|
151
172
|
getOrCreateRenderProxy2D(state, root);
|
|
152
173
|
getOrCreateRenderProxy2D(state, child);
|
|
153
174
|
|
|
154
|
-
|
|
175
|
+
disposeScene2DRender(state, root);
|
|
155
176
|
|
|
156
177
|
expect(destroyData).toHaveBeenCalledTimes(2);
|
|
157
178
|
});
|
|
@@ -162,37 +183,16 @@ describe('disposeDisplayObjectRender', () => {
|
|
|
162
183
|
const child = createDisplayObject();
|
|
163
184
|
addNodeChild(root, child);
|
|
164
185
|
child.enabled = false;
|
|
165
|
-
|
|
166
|
-
//
|
|
186
|
+
prepareScene2DRender(state, root);
|
|
187
|
+
// prepareScene2DRender skips disabled nodes, but disposeScene2DRender should not
|
|
167
188
|
getOrCreateRenderProxy2D(state, child);
|
|
168
189
|
|
|
169
|
-
|
|
190
|
+
disposeScene2DRender(state, root);
|
|
170
191
|
|
|
171
192
|
expect(getRenderProxy2D(state, child)).toBeUndefined();
|
|
172
193
|
});
|
|
173
194
|
});
|
|
174
195
|
|
|
175
|
-
describe('disposeRenderProxy', () => {
|
|
176
|
-
it('cascades to the renderer destroyData and removes the proxy', () => {
|
|
177
|
-
const state = createRenderState();
|
|
178
|
-
const source = createSprite();
|
|
179
|
-
const destroyData = vi.fn();
|
|
180
|
-
registerRenderer(state, source.kind, { createData: () => ({ tag: 'data' }), destroyData, submit: vi.fn() } as any);
|
|
181
|
-
const node = getOrCreateRenderProxy2D(state, source);
|
|
182
|
-
const data = node.rendererData;
|
|
183
|
-
|
|
184
|
-
disposeRenderProxy(state, source);
|
|
185
|
-
|
|
186
|
-
expect(destroyData).toHaveBeenCalledWith(state, data);
|
|
187
|
-
expect(getRenderProxy2D(state, source)).toBeUndefined();
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('is a no-op when no proxy exists', () => {
|
|
191
|
-
const state = createRenderState();
|
|
192
|
-
expect(() => disposeRenderProxy(state, createSprite())).not.toThrow();
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
|
|
196
196
|
describe('getOrCreateRenderProxy2D', () => {
|
|
197
197
|
it('creates a node on first call', () => {
|
|
198
198
|
const state = createRenderState();
|
|
@@ -336,14 +336,14 @@ describe('isRenderProxyVisible', () => {
|
|
|
336
336
|
});
|
|
337
337
|
});
|
|
338
338
|
|
|
339
|
-
describe('
|
|
339
|
+
describe('prepareScene2DRender', () => {
|
|
340
340
|
it('creates render nodes for all enabled nodes in the tree', () => {
|
|
341
341
|
const state = createRenderState();
|
|
342
342
|
const root = createDisplayObject();
|
|
343
343
|
const child = createDisplayObject();
|
|
344
344
|
addNodeChild(root, child);
|
|
345
345
|
|
|
346
|
-
|
|
346
|
+
prepareScene2DRender(state, root);
|
|
347
347
|
|
|
348
348
|
expect(getRenderStateRuntime(state).renderProxyMap.get(root)).toBeDefined();
|
|
349
349
|
expect(getRenderStateRuntime(state).renderProxyMap.get(child)).toBeDefined();
|
|
@@ -355,7 +355,7 @@ describe('prepareDisplayObjectRender', () => {
|
|
|
355
355
|
const child = createSprite();
|
|
356
356
|
addNodeChild(root, child);
|
|
357
357
|
|
|
358
|
-
|
|
358
|
+
prepareScene2DRender(state, root);
|
|
359
359
|
|
|
360
360
|
expect(getRenderStateRuntime(state).renderProxyMap.get(root)).toBeDefined();
|
|
361
361
|
expect(getRenderStateRuntime(state).renderProxyMap.get(child)).toBeDefined();
|
|
@@ -368,7 +368,7 @@ describe('prepareDisplayObjectRender', () => {
|
|
|
368
368
|
addNodeChild(root, child);
|
|
369
369
|
child.enabled = false;
|
|
370
370
|
|
|
371
|
-
|
|
371
|
+
prepareScene2DRender(state, root);
|
|
372
372
|
|
|
373
373
|
expect(getRenderStateRuntime(state).renderProxyMap.get(root)).toBeDefined();
|
|
374
374
|
expect(getRenderStateRuntime(state).renderProxyMap.get(child)).toBeUndefined();
|
|
@@ -378,15 +378,15 @@ describe('prepareDisplayObjectRender', () => {
|
|
|
378
378
|
const state = createRenderState();
|
|
379
379
|
const root = createDisplayObject();
|
|
380
380
|
|
|
381
|
-
expect(
|
|
381
|
+
expect(prepareScene2DRender(state, root)).toBe(true);
|
|
382
382
|
});
|
|
383
383
|
|
|
384
384
|
it('returns false when tree is clean', () => {
|
|
385
385
|
const state = createRenderState({ sceneGraphSyncPolicy: 'requiresInvalidation' });
|
|
386
386
|
const root = createDisplayObject();
|
|
387
|
-
|
|
387
|
+
prepareScene2DRender(state, root);
|
|
388
388
|
|
|
389
|
-
expect(
|
|
389
|
+
expect(prepareScene2DRender(state, root)).toBe(false);
|
|
390
390
|
});
|
|
391
391
|
|
|
392
392
|
it('accumulates clip depth down a clipped subtree', () => {
|
|
@@ -396,10 +396,10 @@ describe('prepareDisplayObjectRender', () => {
|
|
|
396
396
|
const grandchild = createDisplayObject();
|
|
397
397
|
addNodeChild(root, child);
|
|
398
398
|
addNodeChild(child, grandchild);
|
|
399
|
-
|
|
400
|
-
|
|
399
|
+
setNode2DClip(root, makeClipRegion());
|
|
400
|
+
setNode2DClip(child, makeClipRegion());
|
|
401
401
|
|
|
402
|
-
|
|
402
|
+
prepareScene2DRender(state, root);
|
|
403
403
|
|
|
404
404
|
expect(getOrCreateRenderProxy2D(state, root).clipDepth).toBe(1);
|
|
405
405
|
expect(getOrCreateRenderProxy2D(state, child).clipDepth).toBe(2);
|
|
@@ -411,7 +411,7 @@ describe('updateNodeClip', () => {
|
|
|
411
411
|
it('adds one to the parent depth when the node has a clip', () => {
|
|
412
412
|
const state = createRenderState();
|
|
413
413
|
const node = createDisplayObject();
|
|
414
|
-
|
|
414
|
+
setNode2DClip(node, makeClipRegion());
|
|
415
415
|
const data = getOrCreateRenderProxy2D(state, node);
|
|
416
416
|
updateNodeClip(state, node, data, undefined);
|
|
417
417
|
expect(data.clipDepth).toBe(1);
|
|
@@ -456,7 +456,7 @@ describe('updateRenderProxy2D', () => {
|
|
|
456
456
|
it('sets clip depth from the parent through the same visitor', () => {
|
|
457
457
|
const state = createRenderState();
|
|
458
458
|
const root = createDisplayObject();
|
|
459
|
-
|
|
459
|
+
setNode2DClip(root, makeClipRegion());
|
|
460
460
|
const data = getOrCreateRenderProxy2D(state, root);
|
|
461
461
|
updateRenderProxy2D(state, root, data, undefined);
|
|
462
462
|
expect(data.clipDepth).toBe(1);
|
package/src/renderQueue.test.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { createDisplayObject } from '@flighthq/displayobject';
|
|
2
1
|
import { addNodeChild } from '@flighthq/node';
|
|
2
|
+
import { createDisplayObject } from '@flighthq/scene2d';
|
|
3
3
|
import { createSprite } from '@flighthq/sprite';
|
|
4
4
|
import type { Renderer, RenderProxy, RenderQueueEntry } from '@flighthq/types';
|
|
5
5
|
|
|
6
6
|
import { registerRenderer } from './renderer';
|
|
7
|
-
import {
|
|
7
|
+
import { prepareScene2DRender } from './renderProxy';
|
|
8
8
|
import {
|
|
9
9
|
buildRenderQueue,
|
|
10
10
|
clearRenderQueue,
|
|
@@ -24,7 +24,7 @@ describe('buildRenderQueue', () => {
|
|
|
24
24
|
it('produces zero entries for a scene with no renderers', () => {
|
|
25
25
|
const state = createRenderState();
|
|
26
26
|
const root = createDisplayObject();
|
|
27
|
-
|
|
27
|
+
prepareScene2DRender(state, root);
|
|
28
28
|
const queue = createRenderQueue();
|
|
29
29
|
buildRenderQueue(state, root, queue);
|
|
30
30
|
expect(queue.entryCount).toBe(0);
|
|
@@ -35,7 +35,7 @@ describe('buildRenderQueue', () => {
|
|
|
35
35
|
const child = createDisplayObject();
|
|
36
36
|
addNodeChild(root, child);
|
|
37
37
|
registerRenderer(state, root.kind, makeRenderer());
|
|
38
|
-
|
|
38
|
+
prepareScene2DRender(state, root);
|
|
39
39
|
const queue = createRenderQueue();
|
|
40
40
|
buildRenderQueue(state, root, queue);
|
|
41
41
|
expect(queue.entryCount).toBe(2);
|
|
@@ -45,7 +45,7 @@ describe('buildRenderQueue', () => {
|
|
|
45
45
|
const root = createDisplayObject();
|
|
46
46
|
root.visible = false;
|
|
47
47
|
registerRenderer(state, root.kind, makeRenderer());
|
|
48
|
-
|
|
48
|
+
prepareScene2DRender(state, root);
|
|
49
49
|
const queue = createRenderQueue();
|
|
50
50
|
buildRenderQueue(state, root, queue);
|
|
51
51
|
expect(queue.entryCount).toBe(0);
|
|
@@ -54,7 +54,7 @@ describe('buildRenderQueue', () => {
|
|
|
54
54
|
const state = createRenderState();
|
|
55
55
|
const root = createDisplayObject();
|
|
56
56
|
registerRenderer(state, root.kind, makeRenderer());
|
|
57
|
-
|
|
57
|
+
prepareScene2DRender(state, root);
|
|
58
58
|
const queue = createRenderQueue();
|
|
59
59
|
buildRenderQueue(state, root, queue);
|
|
60
60
|
const firstCount = queue.entryCount;
|
|
@@ -71,7 +71,7 @@ describe('buildRenderQueue', () => {
|
|
|
71
71
|
registerRenderer(state, root.kind, makeRenderer());
|
|
72
72
|
registerRenderer(state, child1.kind, makeRenderer());
|
|
73
73
|
registerRenderer(state, child2.kind, makeRenderer());
|
|
74
|
-
|
|
74
|
+
prepareScene2DRender(state, root);
|
|
75
75
|
const queue = createRenderQueue();
|
|
76
76
|
buildRenderQueue(state, root, queue);
|
|
77
77
|
expect(queue.entries[0].sortKey).toBeLessThan(queue.entries[1].sortKey);
|
package/src/renderTarget.test.ts
CHANGED
|
@@ -1,42 +1,12 @@
|
|
|
1
|
-
import { createDisplayObject } from '@flighthq/displayobject';
|
|
2
1
|
import { createMatrix, createRectangle } from '@flighthq/geometry';
|
|
2
|
+
import { createDisplayObject } from '@flighthq/scene2d';
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
|
|
5
|
+
computeScene2DRenderTargetTransform,
|
|
6
6
|
computeRenderCacheTransform,
|
|
7
7
|
computeRenderTargetSize,
|
|
8
8
|
} from './renderTarget';
|
|
9
9
|
|
|
10
|
-
describe('computeDisplayObjectRenderTargetTransform', () => {
|
|
11
|
-
it('writes an identity-based transform for an unrotated object at origin', () => {
|
|
12
|
-
const obj = createDisplayObject();
|
|
13
|
-
const bounds = createRectangle(0, 0, 100, 80);
|
|
14
|
-
const out = createMatrix();
|
|
15
|
-
computeDisplayObjectRenderTargetTransform(out, obj, bounds);
|
|
16
|
-
expect(typeof out.a).toBe('number');
|
|
17
|
-
expect(typeof out.tx).toBe('number');
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('offsets by contentX and contentY', () => {
|
|
21
|
-
const obj = createDisplayObject();
|
|
22
|
-
const bounds = createRectangle(10, 20, 100, 80);
|
|
23
|
-
const out1 = createMatrix();
|
|
24
|
-
const out2 = createMatrix();
|
|
25
|
-
computeDisplayObjectRenderTargetTransform(out1, obj, bounds, 0, 0);
|
|
26
|
-
computeDisplayObjectRenderTargetTransform(out2, obj, bounds, 5, 10);
|
|
27
|
-
expect(out2.tx).not.toBe(out1.tx);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('does not throw for a non-identity local transform', () => {
|
|
31
|
-
const obj = createDisplayObject();
|
|
32
|
-
obj.x = 50;
|
|
33
|
-
obj.y = 30;
|
|
34
|
-
const bounds = createRectangle(50, 30, 100, 80);
|
|
35
|
-
const out = createMatrix();
|
|
36
|
-
expect(() => computeDisplayObjectRenderTargetTransform(out, obj, bounds)).not.toThrow();
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
10
|
describe('computeRenderCacheTransform', () => {
|
|
41
11
|
it('produces a pure translation from bounds origin', () => {
|
|
42
12
|
const out = createMatrix();
|
|
@@ -82,3 +52,33 @@ describe('computeRenderTargetSize', () => {
|
|
|
82
52
|
expect(result.height).toBe(1);
|
|
83
53
|
});
|
|
84
54
|
});
|
|
55
|
+
|
|
56
|
+
describe('computeScene2DRenderTargetTransform', () => {
|
|
57
|
+
it('writes an identity-based transform for an unrotated object at origin', () => {
|
|
58
|
+
const obj = createDisplayObject();
|
|
59
|
+
const bounds = createRectangle(0, 0, 100, 80);
|
|
60
|
+
const out = createMatrix();
|
|
61
|
+
computeScene2DRenderTargetTransform(out, obj, bounds);
|
|
62
|
+
expect(typeof out.a).toBe('number');
|
|
63
|
+
expect(typeof out.tx).toBe('number');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('offsets by contentX and contentY', () => {
|
|
67
|
+
const obj = createDisplayObject();
|
|
68
|
+
const bounds = createRectangle(10, 20, 100, 80);
|
|
69
|
+
const out1 = createMatrix();
|
|
70
|
+
const out2 = createMatrix();
|
|
71
|
+
computeScene2DRenderTargetTransform(out1, obj, bounds, 0, 0);
|
|
72
|
+
computeScene2DRenderTargetTransform(out2, obj, bounds, 5, 10);
|
|
73
|
+
expect(out2.tx).not.toBe(out1.tx);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('does not throw for a non-identity local transform', () => {
|
|
77
|
+
const obj = createDisplayObject();
|
|
78
|
+
obj.x = 50;
|
|
79
|
+
obj.y = 30;
|
|
80
|
+
const bounds = createRectangle(50, 30, 100, 80);
|
|
81
|
+
const out = createMatrix();
|
|
82
|
+
expect(() => computeScene2DRenderTargetTransform(out, obj, bounds)).not.toThrow();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { createBitmap, createDisplayObject } from '@flighthq/displayobject';
|
|
2
1
|
import { createMatrix, createRectangle } from '@flighthq/geometry';
|
|
3
2
|
import { addNodeChild, getNodeRuntime, invalidateNodeLocalBounds, invalidateNodeLocalTransform } from '@flighthq/node';
|
|
3
|
+
import { createBitmap, createDisplayObject } from '@flighthq/scene2d';
|
|
4
4
|
import type { HasBoundsRectangleRuntime, RenderProxy2D, RenderViewport2D } from '@flighthq/types';
|
|
5
5
|
|
|
6
|
-
import { createRenderProxy2D,
|
|
6
|
+
import { createRenderProxy2D, prepareScene2DRender } from './renderProxy';
|
|
7
7
|
import { createRenderState } from './renderState';
|
|
8
8
|
import {
|
|
9
9
|
computeRenderProxyWorldBounds,
|
|
@@ -44,7 +44,7 @@ describe('computeRenderProxyWorldBounds', () => {
|
|
|
44
44
|
expect(result).toBe(false);
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
it('returns true and writes world bounds for a
|
|
47
|
+
it('returns true and writes world bounds for a Node2D', () => {
|
|
48
48
|
const obj = makeObjectWithBounds(10, 20, 50, 30);
|
|
49
49
|
const out = createRectangle();
|
|
50
50
|
const result = computeRenderProxyWorldBounds(out, obj);
|
|
@@ -176,10 +176,10 @@ describe('isRenderProxyInViewport', () => {
|
|
|
176
176
|
expect(isRenderProxyInViewport(proxy, vp)).toBe(true);
|
|
177
177
|
});
|
|
178
178
|
|
|
179
|
-
it('returns true for a proxy backed by a
|
|
179
|
+
it('returns true for a proxy backed by a Node2D within the viewport', () => {
|
|
180
180
|
const state = createRenderState();
|
|
181
181
|
const obj = makeObjectWithBounds(10, 10, 50, 50);
|
|
182
|
-
|
|
182
|
+
prepareScene2DRender(state, obj);
|
|
183
183
|
const proxy = createRenderProxy2D(state, obj);
|
|
184
184
|
const vp: RenderViewport2D = { x: 0, y: 0, width: 800, height: 600 };
|
|
185
185
|
expect(isRenderProxyInViewport(proxy, vp)).toBe(true);
|
package/src/renderer.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Scene2DClipHooks, Renderer, RenderState } from '@flighthq/types';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
copyAllRenderersFromRenderState,
|
|
@@ -18,7 +18,7 @@ describe('copyAllRenderersFromRenderState', () => {
|
|
|
18
18
|
finalize: vi.fn(),
|
|
19
19
|
popClip: vi.fn(),
|
|
20
20
|
pushClip: vi.fn(),
|
|
21
|
-
} as unknown as
|
|
21
|
+
} as unknown as Scene2DClipHooks;
|
|
22
22
|
registerRenderer(source, kind, renderer);
|
|
23
23
|
source.displayObjectClipHooks = hooks;
|
|
24
24
|
|