distark-render 1.0.6 → 1.0.7
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/README.md +158 -154
- package/dist/cli/animate.d.ts +8 -0
- package/dist/cli/animate.d.ts.map +1 -0
- package/dist/cli/animate.js +121 -0
- package/dist/cli/animate.js.map +1 -0
- package/dist/cli/diff.d.ts +8 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +124 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/distark-check.d.ts +13 -0
- package/dist/cli/distark-check.d.ts.map +1 -0
- package/dist/cli/distark-check.js +69 -0
- package/dist/cli/distark-check.js.map +1 -0
- package/dist/cli/query.d.ts +12 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +64 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/record.d.ts +13 -0
- package/dist/cli/record.d.ts.map +1 -0
- package/dist/cli/record.js +97 -0
- package/dist/cli/record.js.map +1 -0
- package/dist/cli/render.d.ts +40 -0
- package/dist/cli/render.d.ts.map +1 -0
- package/dist/cli/render.js +75 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/shared.d.ts +6 -0
- package/dist/cli/shared.d.ts.map +1 -0
- package/dist/cli/shared.js +54 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/test.d.ts +13 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +130 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/cli/verify.d.ts +21 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +175 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/modules/adapters/p5Renderer.d.ts +0 -0
- package/dist/modules/adapters/p5Renderer.d.ts.map +0 -0
- package/dist/modules/adapters/p5Renderer.js +0 -0
- package/dist/modules/adapters/p5Renderer.js.map +0 -0
- package/dist/modules/adapters/skiaRenderer.d.ts +0 -0
- package/dist/modules/adapters/skiaRenderer.d.ts.map +0 -0
- package/dist/modules/adapters/skiaRenderer.js +0 -0
- package/dist/modules/adapters/skiaRenderer.js.map +0 -0
- package/dist/modules/animationDiff.d.ts +0 -0
- package/dist/modules/animationDiff.d.ts.map +0 -0
- package/dist/modules/animationDiff.js +0 -0
- package/dist/modules/animationDiff.js.map +0 -0
- package/dist/modules/eyeSystem.d.ts +0 -0
- package/dist/modules/eyeSystem.d.ts.map +0 -0
- package/dist/modules/eyeSystem.js +0 -0
- package/dist/modules/eyeSystem.js.map +0 -0
- package/dist/modules/imageLoad.d.ts +0 -0
- package/dist/modules/imageLoad.d.ts.map +0 -0
- package/dist/modules/imageLoad.js +0 -0
- package/dist/modules/imageLoad.js.map +0 -0
- package/dist/modules/mouthSystem.d.ts +0 -0
- package/dist/modules/mouthSystem.d.ts.map +0 -0
- package/dist/modules/mouthSystem.js +0 -0
- package/dist/modules/mouthSystem.js.map +0 -0
- package/dist/modules/renderRig.d.ts +0 -0
- package/dist/modules/renderRig.d.ts.map +0 -0
- package/dist/modules/renderRig.js +0 -0
- package/dist/modules/renderRig.js.map +0 -0
- package/dist/tests/test-animation-diff-rendering.d.ts +7 -0
- package/dist/tests/test-animation-diff-rendering.d.ts.map +1 -0
- package/dist/tests/test-animation-diff-rendering.js +444 -0
- package/dist/tests/test-animation-diff-rendering.js.map +1 -0
- package/dist/tests/test-animation-diff.d.ts +7 -0
- package/dist/tests/test-animation-diff.d.ts.map +1 -0
- package/dist/tests/test-animation-diff.js +488 -0
- package/dist/tests/test-animation-diff.js.map +1 -0
- package/dist/tests/test-cli.d.ts +8 -0
- package/dist/tests/test-cli.d.ts.map +1 -0
- package/dist/tests/test-cli.js +307 -0
- package/dist/tests/test-cli.js.map +1 -0
- package/dist/tests/test-joint-movement.d.ts +0 -0
- package/dist/tests/test-joint-movement.d.ts.map +0 -0
- package/dist/tests/test-joint-movement.js +0 -0
- package/dist/tests/test-joint-movement.js.map +0 -0
- package/dist/tests/test-skia.d.ts +0 -0
- package/dist/tests/test-skia.d.ts.map +0 -0
- package/dist/tests/test-skia.js +0 -0
- package/dist/tests/test-skia.js.map +0 -0
- package/dist/tests/test-visual-verification.d.ts +0 -0
- package/dist/tests/test-visual-verification.d.ts.map +0 -0
- package/dist/tests/test-visual-verification.js +0 -0
- package/dist/tests/test-visual-verification.js.map +0 -0
- package/dist/types.d.ts +0 -0
- package/dist/types.d.ts.map +0 -0
- package/dist/types.js +0 -0
- package/dist/types.js.map +0 -0
- package/package.json +9 -2
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animation Diff Rendering Test
|
|
3
|
+
* Tests that animation diffs are correctly applied and rendered
|
|
4
|
+
* Verifies joint positions after diff application using visual verification
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
8
|
+
import { SkiaRenderer } from '../modules/adapters/skiaRenderer.js';
|
|
9
|
+
import { createDiffBasedAnimation, expandDiffBasedAnimation } from '../modules/animationDiff.js';
|
|
10
|
+
/**
|
|
11
|
+
* Define 3x3 grid of screen sectors
|
|
12
|
+
*/
|
|
13
|
+
function defineScreenSectors(width, height) {
|
|
14
|
+
const sectorWidth = width / 3;
|
|
15
|
+
const sectorHeight = height / 3;
|
|
16
|
+
const sectors = [];
|
|
17
|
+
const rows = ['Top', 'Middle', 'Bottom'];
|
|
18
|
+
const cols = ['Left', 'Center', 'Right'];
|
|
19
|
+
for (let row = 0; row < 3; row++) {
|
|
20
|
+
for (let col = 0; col < 3; col++) {
|
|
21
|
+
sectors.push({
|
|
22
|
+
name: `${rows[row]}-${cols[col]}`,
|
|
23
|
+
x: col * sectorWidth,
|
|
24
|
+
y: row * sectorHeight,
|
|
25
|
+
width: sectorWidth,
|
|
26
|
+
height: sectorHeight
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return sectors;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get pixel color from ImageData
|
|
34
|
+
*/
|
|
35
|
+
function getPixelColor(imageData, x, y) {
|
|
36
|
+
const index = (Math.floor(y) * imageData.width + Math.floor(x)) * 4;
|
|
37
|
+
return {
|
|
38
|
+
r: imageData.data[index],
|
|
39
|
+
g: imageData.data[index + 1],
|
|
40
|
+
b: imageData.data[index + 2],
|
|
41
|
+
a: imageData.data[index + 3]
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Check if color is different from background
|
|
46
|
+
*/
|
|
47
|
+
function isDifferentFromBackground(color, bgColor, threshold = 10) {
|
|
48
|
+
const rDiff = Math.abs(color.r - bgColor.r);
|
|
49
|
+
const gDiff = Math.abs(color.g - bgColor.g);
|
|
50
|
+
const bDiff = Math.abs(color.b - bgColor.b);
|
|
51
|
+
return rDiff > threshold || gDiff > threshold || bDiff > threshold;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if sector has content (non-background pixels)
|
|
55
|
+
*/
|
|
56
|
+
function hasContentInSector(imageData, sector, bgColor, samplePoints = 25) {
|
|
57
|
+
let contentPixels = 0;
|
|
58
|
+
const gridSize = Math.ceil(Math.sqrt(samplePoints));
|
|
59
|
+
for (let row = 0; row < gridSize; row++) {
|
|
60
|
+
for (let col = 0; col < gridSize; col++) {
|
|
61
|
+
const x = sector.x + (sector.width / gridSize) * (col + 0.5);
|
|
62
|
+
const y = sector.y + (sector.height / gridSize) * (row + 0.5);
|
|
63
|
+
if (x < imageData.width && y < imageData.height) {
|
|
64
|
+
const color = getPixelColor(imageData, x, y);
|
|
65
|
+
if (isDifferentFromBackground(color, bgColor, 10)) {
|
|
66
|
+
contentPixels++;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return contentPixels > 0;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Save canvas to file
|
|
75
|
+
*/
|
|
76
|
+
async function saveCanvas(canvas, filename) {
|
|
77
|
+
try {
|
|
78
|
+
const buffer = await canvas.toBuffer('image/png');
|
|
79
|
+
await writeFile(filename, buffer);
|
|
80
|
+
console.log(` 💾 Saved: ${filename}`);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.log(` ❌ Failed to save ${filename}:`, error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Draw sector grid on canvas for visualization
|
|
88
|
+
*/
|
|
89
|
+
function drawSectorGrid(ctx, sectors) {
|
|
90
|
+
ctx.strokeStyle = '#FF0000';
|
|
91
|
+
ctx.lineWidth = 2;
|
|
92
|
+
ctx.font = '24px Arial';
|
|
93
|
+
ctx.fillStyle = '#FF0000';
|
|
94
|
+
sectors.forEach(sector => {
|
|
95
|
+
// Draw sector border
|
|
96
|
+
ctx.strokeRect(sector.x, sector.y, sector.width, sector.height);
|
|
97
|
+
// Draw sector label
|
|
98
|
+
const labelX = sector.x + 10;
|
|
99
|
+
const labelY = sector.y + 30;
|
|
100
|
+
ctx.fillText(sector.name, labelX, labelY);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Render character with applied frame data
|
|
105
|
+
*/
|
|
106
|
+
async function renderFrame(baseRigData, frameData, renderer, width, height, saveFilename, drawGrid = false) {
|
|
107
|
+
const canvas = await renderer.createCanvas(width, height);
|
|
108
|
+
const ctx = canvas.getContext('2d');
|
|
109
|
+
// Apply frame data to base rig
|
|
110
|
+
const rigDataWithFrame = {
|
|
111
|
+
...baseRigData,
|
|
112
|
+
...frameData,
|
|
113
|
+
rotationValues: {
|
|
114
|
+
...baseRigData.rotationValues,
|
|
115
|
+
...frameData.rotationValues
|
|
116
|
+
},
|
|
117
|
+
selfRotationValues: {
|
|
118
|
+
...baseRigData.selfRotationValues,
|
|
119
|
+
...frameData.selfRotationValues
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
// Render
|
|
123
|
+
ctx.fillStyle = '#FFFFFF';
|
|
124
|
+
ctx.fillRect(0, 0, width, height);
|
|
125
|
+
await renderer.renderToCanvas(canvas, rigDataWithFrame);
|
|
126
|
+
// Draw grid if requested
|
|
127
|
+
if (drawGrid) {
|
|
128
|
+
const sectors = defineScreenSectors(width, height);
|
|
129
|
+
drawSectorGrid(ctx, sectors);
|
|
130
|
+
}
|
|
131
|
+
// Save if filename provided
|
|
132
|
+
if (saveFilename) {
|
|
133
|
+
await saveCanvas(canvas, saveFilename);
|
|
134
|
+
}
|
|
135
|
+
return ctx.getImageData(0, 0, width, height);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Test 1: Arm Movement via Diff
|
|
139
|
+
*/
|
|
140
|
+
async function testArmMovementDiff(baseRigData, renderer, width, height) {
|
|
141
|
+
console.log('\n Test 1: Arm Movement via Diff');
|
|
142
|
+
console.log(' ' + '-'.repeat(40));
|
|
143
|
+
// Create animation frames with diff
|
|
144
|
+
const frames = [
|
|
145
|
+
// Frame 0: Base frame (no rotations)
|
|
146
|
+
{
|
|
147
|
+
rotationValues: {}
|
|
148
|
+
},
|
|
149
|
+
// Frame 1: Left arm raised (diff only contains the change)
|
|
150
|
+
{
|
|
151
|
+
rotationValues: {
|
|
152
|
+
leftUpperArm: -Math.PI / 3 // Raise left arm
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
];
|
|
156
|
+
// Create diff-based animation
|
|
157
|
+
const diffAnimation = createDiffBasedAnimation(frames);
|
|
158
|
+
console.log(' Created diff animation with', diffAnimation.length, 'frames');
|
|
159
|
+
console.log(' Frame 0 keys:', Object.keys(diffAnimation[0]));
|
|
160
|
+
console.log(' Frame 1 keys:', Object.keys(diffAnimation[1]));
|
|
161
|
+
// Expand diffs back to full frames
|
|
162
|
+
const expandedFrames = expandDiffBasedAnimation(diffAnimation);
|
|
163
|
+
console.log(' Expanded to full frames');
|
|
164
|
+
// Render before (frame 0 - base frame)
|
|
165
|
+
console.log(' Rendering before frame...');
|
|
166
|
+
await renderFrame(baseRigData, expandedFrames[0], renderer, width, height, 'test-outputs/diff-test-1-before.png', true);
|
|
167
|
+
// Render after (frame 1 - arm raised)
|
|
168
|
+
console.log(' Rendering after frame...');
|
|
169
|
+
const imageData = await renderFrame(baseRigData, expandedFrames[1], renderer, width, height, 'test-outputs/diff-test-1-after.png', true);
|
|
170
|
+
const sectors = defineScreenSectors(width, height);
|
|
171
|
+
const bgColor = getPixelColor(imageData, 10, 10);
|
|
172
|
+
// Check if arm appears in expected sectors (top-left or middle-left)
|
|
173
|
+
const topLeft = sectors.find(s => s.name === 'Top-Left');
|
|
174
|
+
const middleLeft = sectors.find(s => s.name === 'Middle-Left');
|
|
175
|
+
const hasContentTopLeft = topLeft ? hasContentInSector(imageData, topLeft, bgColor) : false;
|
|
176
|
+
const hasContentMiddleLeft = middleLeft ? hasContentInSector(imageData, middleLeft, bgColor) : false;
|
|
177
|
+
console.log(' Content in Top-Left:', hasContentTopLeft ? '✅' : '❌');
|
|
178
|
+
console.log(' Content in Middle-Left:', hasContentMiddleLeft ? '✅' : '❌');
|
|
179
|
+
const passed = hasContentTopLeft || hasContentMiddleLeft;
|
|
180
|
+
console.log(` Result: ${passed ? '✅ PASS' : '❌ FAIL'}`);
|
|
181
|
+
return passed;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Test 2: Head Rotation via Diff
|
|
185
|
+
*/
|
|
186
|
+
async function testHeadRotationDiff(baseRigData, renderer, width, height) {
|
|
187
|
+
console.log('\n Test 2: Head Rotation via Diff');
|
|
188
|
+
console.log(' ' + '-'.repeat(40));
|
|
189
|
+
const frames = [
|
|
190
|
+
{
|
|
191
|
+
rotationValues: {}
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
rotationValues: {
|
|
195
|
+
head: Math.PI / 4 // Turn head 45 degrees
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
];
|
|
199
|
+
const diffAnimation = createDiffBasedAnimation(frames);
|
|
200
|
+
const expandedFrames = expandDiffBasedAnimation(diffAnimation);
|
|
201
|
+
// Render before and after
|
|
202
|
+
console.log(' Rendering before frame...');
|
|
203
|
+
await renderFrame(baseRigData, expandedFrames[0], renderer, width, height, 'test-outputs/diff-test-2-before.png', true);
|
|
204
|
+
console.log(' Rendering after frame...');
|
|
205
|
+
const imageData = await renderFrame(baseRigData, expandedFrames[1], renderer, width, height, 'test-outputs/diff-test-2-after.png', true);
|
|
206
|
+
const sectors = defineScreenSectors(width, height);
|
|
207
|
+
const bgColor = getPixelColor(imageData, 10, 10);
|
|
208
|
+
// Head should still be in top-center region
|
|
209
|
+
const topCenter = sectors.find(s => s.name === 'Top-Center');
|
|
210
|
+
const middleCenter = sectors.find(s => s.name === 'Middle-Center');
|
|
211
|
+
const hasContentTopCenter = topCenter ? hasContentInSector(imageData, topCenter, bgColor) : false;
|
|
212
|
+
const hasContentMiddleCenter = middleCenter ? hasContentInSector(imageData, middleCenter, bgColor) : false;
|
|
213
|
+
console.log(' Content in Top-Center:', hasContentTopCenter ? '✅' : '❌');
|
|
214
|
+
console.log(' Content in Middle-Center:', hasContentMiddleCenter ? '✅' : '❌');
|
|
215
|
+
const passed = hasContentTopCenter || hasContentMiddleCenter;
|
|
216
|
+
console.log(` Result: ${passed ? '✅ PASS' : '❌ FAIL'}`);
|
|
217
|
+
return passed;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Test 3: Multiple Joints via Diff
|
|
221
|
+
*/
|
|
222
|
+
async function testMultipleJointsDiff(baseRigData, renderer, width, height) {
|
|
223
|
+
console.log('\n Test 3: Multiple Joints via Diff');
|
|
224
|
+
console.log(' ' + '-'.repeat(40));
|
|
225
|
+
const frames = [
|
|
226
|
+
{
|
|
227
|
+
rotationValues: {}
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
rotationValues: {
|
|
231
|
+
leftUpperArm: -Math.PI / 4, // Left arm raised slightly
|
|
232
|
+
rightUpperArm: -Math.PI / 4, // Right arm raised slightly
|
|
233
|
+
leftThigh: Math.PI / 12, // Left leg forward slightly
|
|
234
|
+
rightThigh: -Math.PI / 12 // Right leg back slightly
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
];
|
|
238
|
+
const diffAnimation = createDiffBasedAnimation(frames);
|
|
239
|
+
console.log(' Diff contains:', Object.keys(diffAnimation[1]));
|
|
240
|
+
console.log(' Diff has 4 joint rotations:', Object.keys(diffAnimation[1].rotationValues || {}).length === 4 ? '✅' : '❌');
|
|
241
|
+
const expandedFrames = expandDiffBasedAnimation(diffAnimation);
|
|
242
|
+
// Render before and after
|
|
243
|
+
console.log(' Rendering before frame...');
|
|
244
|
+
const beforeImageData = await renderFrame(baseRigData, expandedFrames[0], renderer, width, height, 'test-outputs/diff-test-3-before.png', true);
|
|
245
|
+
console.log(' Rendering after frame...');
|
|
246
|
+
const afterImageData = await renderFrame(baseRigData, expandedFrames[1], renderer, width, height, 'test-outputs/diff-test-3-after.png', true);
|
|
247
|
+
const sectors = defineScreenSectors(width, height);
|
|
248
|
+
const bgColor = getPixelColor(afterImageData, 10, 10);
|
|
249
|
+
// Check that arms are spread
|
|
250
|
+
const topLeft = sectors.find(s => s.name === 'Top-Left');
|
|
251
|
+
const topRight = sectors.find(s => s.name === 'Top-Right');
|
|
252
|
+
const hasArmsSpread = (topLeft ? hasContentInSector(afterImageData, topLeft, bgColor) : false) ||
|
|
253
|
+
(topRight ? hasContentInSector(afterImageData, topRight, bgColor) : false);
|
|
254
|
+
// Verify the frames are different (proves diff was applied)
|
|
255
|
+
let differentPixels = 0;
|
|
256
|
+
const totalPixels = beforeImageData.width * beforeImageData.height;
|
|
257
|
+
for (let i = 0; i < beforeImageData.data.length; i += 4) {
|
|
258
|
+
const rDiff = Math.abs(beforeImageData.data[i] - afterImageData.data[i]);
|
|
259
|
+
const gDiff = Math.abs(beforeImageData.data[i + 1] - afterImageData.data[i + 1]);
|
|
260
|
+
const bDiff = Math.abs(beforeImageData.data[i + 2] - afterImageData.data[i + 2]);
|
|
261
|
+
if (rDiff > 10 || gDiff > 10 || bDiff > 10) {
|
|
262
|
+
differentPixels++;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const percentDifferent = (differentPixels / totalPixels) * 100;
|
|
266
|
+
const framesAreDifferent = percentDifferent > 1; // At least 1% of pixels changed
|
|
267
|
+
console.log(' Arms visible in upper sectors:', hasArmsSpread ? '✅' : '❌');
|
|
268
|
+
console.log(` Frames are different (${percentDifferent.toFixed(2)}% pixels changed):`, framesAreDifferent ? '✅' : '❌');
|
|
269
|
+
const passed = hasArmsSpread && framesAreDifferent;
|
|
270
|
+
console.log(` Result: ${passed ? '✅ PASS' : '❌ FAIL'}`);
|
|
271
|
+
return passed;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Test 4: Animation Sequence via Diffs
|
|
275
|
+
*/
|
|
276
|
+
async function testAnimationSequenceDiff(baseRigData, renderer, width, height) {
|
|
277
|
+
console.log('\n Test 4: Animation Sequence via Diffs');
|
|
278
|
+
console.log(' ' + '-'.repeat(40));
|
|
279
|
+
// Create a simple walk cycle
|
|
280
|
+
const frames = [
|
|
281
|
+
{
|
|
282
|
+
rotationValues: {}
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
rotationValues: {
|
|
286
|
+
leftThigh: Math.PI / 8,
|
|
287
|
+
rightThigh: -Math.PI / 8
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
rotationValues: {
|
|
292
|
+
leftThigh: 0,
|
|
293
|
+
rightThigh: 0
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
rotationValues: {
|
|
298
|
+
leftThigh: -Math.PI / 8,
|
|
299
|
+
rightThigh: Math.PI / 8
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
];
|
|
303
|
+
const diffAnimation = createDiffBasedAnimation(frames);
|
|
304
|
+
console.log(' Created', diffAnimation.length, 'frame animation');
|
|
305
|
+
console.log(' Frame 1 diff size:', JSON.stringify(diffAnimation[1]).length, 'bytes');
|
|
306
|
+
console.log(' Frame 2 diff size:', JSON.stringify(diffAnimation[2]).length, 'bytes');
|
|
307
|
+
console.log(' Frame 3 diff size:', JSON.stringify(diffAnimation[3]).length, 'bytes');
|
|
308
|
+
const expandedFrames = expandDiffBasedAnimation(diffAnimation);
|
|
309
|
+
// Render each frame and verify character is present (not checking legs specifically as they may move out of frame)
|
|
310
|
+
let allFramesValid = true;
|
|
311
|
+
for (let i = 0; i < expandedFrames.length; i++) {
|
|
312
|
+
console.log(` Rendering frame ${i}...`);
|
|
313
|
+
const imageData = await renderFrame(baseRigData, expandedFrames[i], renderer, width, height, `test-outputs/diff-test-4-frame-${i}.png`, true);
|
|
314
|
+
const sectors = defineScreenSectors(width, height);
|
|
315
|
+
const bgColor = getPixelColor(imageData, 10, 10);
|
|
316
|
+
// Check if character has content in ANY sector (proves frame was rendered)
|
|
317
|
+
const hasAnyContent = sectors.some(sector => hasContentInSector(imageData, sector, bgColor));
|
|
318
|
+
console.log(` Frame ${i} rendered:`, hasAnyContent ? '✅' : '❌');
|
|
319
|
+
if (!hasAnyContent) {
|
|
320
|
+
allFramesValid = false;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
console.log(` Result: ${allFramesValid ? '✅ PASS' : '❌ FAIL'}`);
|
|
324
|
+
return allFramesValid;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Test 5: Complex Diff with Multiple Properties
|
|
328
|
+
*/
|
|
329
|
+
async function testComplexDiff(baseRigData, renderer, width, height) {
|
|
330
|
+
console.log('\n Test 5: Complex Diff with Multiple Properties');
|
|
331
|
+
console.log(' ' + '-'.repeat(40));
|
|
332
|
+
const frames = [
|
|
333
|
+
{
|
|
334
|
+
rotationValues: {},
|
|
335
|
+
flipX: false
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
rotationValues: {
|
|
339
|
+
head: Math.PI / 6,
|
|
340
|
+
leftUpperArm: -Math.PI / 4,
|
|
341
|
+
rightUpperArm: -Math.PI / 4
|
|
342
|
+
},
|
|
343
|
+
flipX: false // Same value, should not be in diff
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
rotationValues: {
|
|
347
|
+
head: Math.PI / 6,
|
|
348
|
+
leftUpperArm: -Math.PI / 3, // Changed
|
|
349
|
+
rightUpperArm: -Math.PI / 3 // Changed
|
|
350
|
+
},
|
|
351
|
+
flipX: true // Changed
|
|
352
|
+
}
|
|
353
|
+
];
|
|
354
|
+
const diffAnimation = createDiffBasedAnimation(frames);
|
|
355
|
+
// Verify diff 1 doesn't contain flipX (unchanged)
|
|
356
|
+
const diff1HasFlipX = 'flipX' in diffAnimation[1];
|
|
357
|
+
console.log(' Diff 1 excludes unchanged flipX:', !diff1HasFlipX ? '✅' : '❌');
|
|
358
|
+
// Verify diff 2 contains flipX (changed)
|
|
359
|
+
const diff2HasFlipX = 'flipX' in diffAnimation[2];
|
|
360
|
+
console.log(' Diff 2 includes changed flipX:', diff2HasFlipX ? '✅' : '❌');
|
|
361
|
+
const expandedFrames = expandDiffBasedAnimation(diffAnimation);
|
|
362
|
+
// Render initial, middle, and final frames
|
|
363
|
+
console.log(' Rendering frame 0 (initial)...');
|
|
364
|
+
await renderFrame(baseRigData, expandedFrames[0], renderer, width, height, 'test-outputs/diff-test-5-frame-0.png', true);
|
|
365
|
+
console.log(' Rendering frame 1 (middle)...');
|
|
366
|
+
await renderFrame(baseRigData, expandedFrames[1], renderer, width, height, 'test-outputs/diff-test-5-frame-1.png', true);
|
|
367
|
+
console.log(' Rendering frame 2 (final)...');
|
|
368
|
+
const imageData = await renderFrame(baseRigData, expandedFrames[2], renderer, width, height, 'test-outputs/diff-test-5-frame-2.png', true);
|
|
369
|
+
const sectors = defineScreenSectors(width, height);
|
|
370
|
+
const bgColor = getPixelColor(imageData, 10, 10);
|
|
371
|
+
const topSectors = sectors.filter(s => s.name.startsWith('Top'));
|
|
372
|
+
const hasTopContent = topSectors.some(sector => hasContentInSector(imageData, sector, bgColor));
|
|
373
|
+
console.log(' Frame renders correctly:', hasTopContent ? '✅' : '❌');
|
|
374
|
+
const passed = !diff1HasFlipX && diff2HasFlipX && hasTopContent;
|
|
375
|
+
console.log(` Result: ${passed ? '✅ PASS' : '❌ FAIL'}`);
|
|
376
|
+
return passed;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Main test runner
|
|
380
|
+
*/
|
|
381
|
+
async function runAllTests(inputFile = 'tank.json') {
|
|
382
|
+
console.log('\n🎬 Animation Diff Rendering Tests');
|
|
383
|
+
console.log('='.repeat(50));
|
|
384
|
+
console.log(` Testing with: ${inputFile}`);
|
|
385
|
+
// Load base rig data
|
|
386
|
+
if (!fs.existsSync(inputFile)) {
|
|
387
|
+
console.error(`❌ Error: File not found: ${inputFile}`);
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
const rigData = JSON.parse(fs.readFileSync(inputFile, 'utf-8'));
|
|
391
|
+
// Create test-outputs directory if it doesn't exist
|
|
392
|
+
try {
|
|
393
|
+
await mkdir('test-outputs', { recursive: true });
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
// Directory might already exist, that's fine
|
|
397
|
+
}
|
|
398
|
+
// Create renderer and load images
|
|
399
|
+
const renderer = new SkiaRenderer();
|
|
400
|
+
console.log(' Loading character images...');
|
|
401
|
+
await renderer.loadImages(rigData);
|
|
402
|
+
console.log(' ✅ Images loaded\n');
|
|
403
|
+
const width = 1000;
|
|
404
|
+
const height = 1000;
|
|
405
|
+
// Run all tests
|
|
406
|
+
const results = {
|
|
407
|
+
'Arm Movement via Diff': await testArmMovementDiff(rigData, renderer, width, height),
|
|
408
|
+
'Head Rotation via Diff': await testHeadRotationDiff(rigData, renderer, width, height),
|
|
409
|
+
'Multiple Joints via Diff': await testMultipleJointsDiff(rigData, renderer, width, height),
|
|
410
|
+
'Animation Sequence via Diffs': await testAnimationSequenceDiff(rigData, renderer, width, height),
|
|
411
|
+
'Complex Diff Properties': await testComplexDiff(rigData, renderer, width, height)
|
|
412
|
+
};
|
|
413
|
+
// Summary
|
|
414
|
+
console.log('\n' + '='.repeat(50));
|
|
415
|
+
console.log('📊 Test Summary:');
|
|
416
|
+
const passed = Object.values(results).filter(r => r).length;
|
|
417
|
+
const total = Object.keys(results).length;
|
|
418
|
+
console.log(` ${passed}/${total} tests passed`);
|
|
419
|
+
Object.entries(results).forEach(([name, result]) => {
|
|
420
|
+
console.log(` ${result ? '✅' : '❌'} ${name}`);
|
|
421
|
+
});
|
|
422
|
+
const allPassed = passed === total;
|
|
423
|
+
if (allPassed) {
|
|
424
|
+
console.log('\n✅ All animation diff rendering tests PASSED\n');
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
console.log('\n❌ Some animation diff rendering tests FAILED\n');
|
|
428
|
+
}
|
|
429
|
+
return allPassed;
|
|
430
|
+
}
|
|
431
|
+
// Run tests
|
|
432
|
+
async function main() {
|
|
433
|
+
try {
|
|
434
|
+
const inputFile = process.argv[2] || 'assets/tank.json';
|
|
435
|
+
const success = await runAllTests(inputFile);
|
|
436
|
+
process.exit(success ? 0 : 1);
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
console.error('❌ Test failed with error:', error);
|
|
440
|
+
process.exit(1);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
main();
|
|
444
|
+
//# sourceMappingURL=test-animation-diff-rendering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-animation-diff-rendering.js","sourceRoot":"","sources":["../../tests/test-animation-diff-rendering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-animation-diff.d.ts","sourceRoot":"","sources":["../../tests/test-animation-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|