@forgeax-extension/character-3d 0.1.2
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/SOURCE_PROVENANCE.md +8 -0
- package/dist/assets/index-CIx3aXo1.js +4336 -0
- package/dist/assets/index-CIx3aXo1.js.map +1 -0
- package/dist/assets/index-CmhOHLEB.css +1 -0
- package/dist/hdr/README.md +28 -0
- package/dist/hdr/presets.json +8 -0
- package/dist/index.html +13 -0
- package/forgeax-extension.json +428 -0
- package/marketplace-card.json +56 -0
- package/package.json +59 -0
- package/packages/external-asset-meta/package.json +24 -0
- package/packages/external-asset-meta/src/cook.test.ts +211 -0
- package/packages/external-asset-meta/src/cook.ts +188 -0
- package/packages/external-asset-meta/src/draco3dgltf.d.ts +11 -0
- package/packages/external-asset-meta/src/index.ts +18 -0
- package/packages/external-asset-meta/src/normalize.test.ts +36 -0
- package/packages/external-asset-meta/src/normalize.ts +101 -0
- package/packages/external-asset-meta/src/types.ts +82 -0
- package/schemas/adopt-playable-character.args.json +26 -0
- package/schemas/adopt-playable-character.returns.json +31 -0
- package/schemas/apply-motion.args.json +47 -0
- package/schemas/apply-motion.returns.json +23 -0
- package/schemas/auto-rig.args.json +35 -0
- package/schemas/auto-rig.returns.json +23 -0
- package/schemas/delete-asset.args.json +18 -0
- package/schemas/delete-asset.returns.json +18 -0
- package/schemas/engine-import-status.args.json +18 -0
- package/schemas/engine-import-status.returns.json +50 -0
- package/schemas/export-playable-character.args.json +21 -0
- package/schemas/export-playable-character.returns.json +47 -0
- package/schemas/gen3d-asset-manifest.json +281 -0
- package/schemas/generate-meshy-text-mock.args.json +42 -0
- package/schemas/generate-meshy-text-mock.returns.json +301 -0
- package/schemas/get-credentials.args.json +7 -0
- package/schemas/get-credentials.returns.json +45 -0
- package/schemas/get-playable-profile.args.json +11 -0
- package/schemas/get-playable-profile.returns.json +188 -0
- package/schemas/image-to-3d.args.json +47 -0
- package/schemas/image-to-3d.returns.json +306 -0
- package/schemas/import-to-engine.args.json +18 -0
- package/schemas/import-to-engine.returns.json +35 -0
- package/schemas/list-assets.args.json +22 -0
- package/schemas/list-assets.returns.json +296 -0
- package/schemas/list-motions.args.json +29 -0
- package/schemas/list-motions.returns.json +41 -0
- package/schemas/pose-standardization.args.json +28 -0
- package/schemas/pose-standardization.returns.json +29 -0
- package/schemas/provider-status.args.json +7 -0
- package/schemas/provider-status.returns.json +70 -0
- package/schemas/refine-mesh.args.json +33 -0
- package/schemas/refine-mesh.returns.json +306 -0
- package/schemas/rename-asset.args.json +22 -0
- package/schemas/rename-asset.returns.json +14 -0
- package/schemas/retopo-lowpoly.args.json +34 -0
- package/schemas/retopo-lowpoly.returns.json +24 -0
- package/schemas/score-quality.args.json +36 -0
- package/schemas/score-quality.returns.json +12 -0
- package/schemas/set-credentials.args.json +32 -0
- package/schemas/set-credentials.returns.json +45 -0
- package/schemas/set-playable-motion-mapping.args.json +25 -0
- package/schemas/set-playable-motion-mapping.returns.json +33 -0
- package/schemas/set-playable-profile.args.json +32 -0
- package/schemas/set-playable-profile.returns.json +67 -0
- package/schemas/text-to-3d.args.json +51 -0
- package/schemas/text-to-3d.returns.json +306 -0
- package/schemas/upload-image.args.json +19 -0
- package/schemas/upload-image.returns.json +21 -0
- package/schemas/upload-video.args.json +14 -0
- package/schemas/upload-video.returns.json +14 -0
- package/schemas/views-to-3d.args.json +58 -0
- package/schemas/views-to-3d.returns.json +306 -0
- package/server/adopt-playable-character.ts +291 -0
- package/server/asset-storage.ts +136 -0
- package/server/asset-upload.ts +123 -0
- package/server/audit.ts +58 -0
- package/server/cache.ts +75 -0
- package/server/cos-uploader.ts +141 -0
- package/server/credentials-store.ts +186 -0
- package/server/engine-import.ts +238 -0
- package/server/env.ts +287 -0
- package/server/export-playable-character.ts +364 -0
- package/server/generate.ts +89 -0
- package/server/merge-playable-character.ts +259 -0
- package/server/motion-catalog.ts +137 -0
- package/server/per-game-store.ts +1016 -0
- package/server/providers/gateway-client.ts +171 -0
- package/server/providers/gateway-data.ts +182 -0
- package/server/providers/gateway-models.ts +49 -0
- package/server/providers/hunyuan-rest.ts +317 -0
- package/server/providers/hunyuan-workflow.ts +225 -0
- package/server/providers/meshy-direct-client.ts +223 -0
- package/server/providers/meshy.ts +548 -0
- package/server/providers/rodin-gateway.ts +193 -0
- package/server/providers/rodin.ts +253 -0
- package/server/providers/visvise.ts +329 -0
- package/server/rate-guard.ts +29 -0
- package/server/tool-handlers.ts +2193 -0
- package/shared/catalog.ts +307 -0
- package/shared/manifest.ts +378 -0
- package/shared/meshy-actions.ts +690 -0
- package/shared/playable-preview-url.test.ts +14 -0
- package/shared/playable-preview-url.ts +13 -0
- package/shared/playable-profile.test.ts +127 -0
- package/shared/playable-profile.ts +171 -0
- package/shared/provider-params.test.ts +172 -0
- package/shared/provider-params.ts +389 -0
- package/shared/quality/heuristics.test.ts +84 -0
- package/shared/quality/heuristics.ts +100 -0
- package/shared/rodin-image.test.ts +51 -0
- package/shared/rodin-image.ts +125 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/** Volcengine hyper3d-gen2 rejects images outside this width/height range. */
|
|
2
|
+
export const RODIN_ASPECT_MIN = 0.4;
|
|
3
|
+
export const RODIN_ASPECT_MAX = 2.5;
|
|
4
|
+
export const RODIN_MAX_EDGE = 4096;
|
|
5
|
+
|
|
6
|
+
/** Pad slightly inside the official band so rounding cannot fail the check. */
|
|
7
|
+
const PAD_MIN = 0.41;
|
|
8
|
+
const PAD_MAX = 2.49;
|
|
9
|
+
|
|
10
|
+
export const RODIN_ASPECT_USER_MESSAGE =
|
|
11
|
+
'Rodin 不收这张图:太瘦或太宽了(宽高比要在 0.4~2.5 之间)。请裁成更方一点,或重新用本地上传(会自动留白补齐)。';
|
|
12
|
+
|
|
13
|
+
export function rodinAspectRatio(width: number, height: number): number {
|
|
14
|
+
return width / height;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function fitsRodinAspect(width: number, height: number): boolean {
|
|
18
|
+
if (width <= 0 || height <= 0) return false;
|
|
19
|
+
const ratio = rodinAspectRatio(width, height);
|
|
20
|
+
return ratio >= RODIN_ASPECT_MIN && ratio <= RODIN_ASPECT_MAX;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function paddedRodinSize(width: number, height: number): { width: number; height: number } {
|
|
24
|
+
if (fitsRodinAspect(width, height)) return { width, height };
|
|
25
|
+
const ratio = rodinAspectRatio(width, height);
|
|
26
|
+
if (ratio < RODIN_ASPECT_MIN) return { width: Math.ceil(height * PAD_MIN), height };
|
|
27
|
+
return { width, height: Math.ceil(width / PAD_MAX) };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function clampRodinEdge(width: number, height: number): { width: number; height: number } {
|
|
31
|
+
if (width <= RODIN_MAX_EDGE && height <= RODIN_MAX_EDGE) return { width, height };
|
|
32
|
+
const scale = Math.min(RODIN_MAX_EDGE / width, RODIN_MAX_EDGE / height);
|
|
33
|
+
return {
|
|
34
|
+
width: Math.max(1, Math.floor(width * scale)),
|
|
35
|
+
height: Math.max(1, Math.floor(height * scale)),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function rodinAspectRejectMessage(width: number, height: number): string {
|
|
40
|
+
const ratio = rodinAspectRatio(width, height);
|
|
41
|
+
const kind = ratio < RODIN_ASPECT_MIN ? '太瘦(太高)' : '太宽';
|
|
42
|
+
return `Rodin 不收这张图:${width}×${height},${kind},宽高比 ${ratio.toFixed(2)}(只要 0.4~2.5)。请裁成更方一点,或重新用本地上传(会自动留白补齐)。`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function explainRodinGatewayError(raw: string): string | null {
|
|
46
|
+
if (/aspect ratio/i.test(raw) && /0\.40|0\.4/.test(raw)) return RODIN_ASPECT_USER_MESSAGE;
|
|
47
|
+
if (/downloading image/i.test(raw) && /aspect ratio/i.test(raw)) return RODIN_ASPECT_USER_MESSAGE;
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function readImageSize(data: Uint8Array): { width: number; height: number } | null {
|
|
52
|
+
if (data.length < 24) return null;
|
|
53
|
+
if (data[0] === 0x89 && data[1] === 0x50 && data[2] === 0x4e && data[3] === 0x47) {
|
|
54
|
+
return { width: u32be(data, 16), height: u32be(data, 20) };
|
|
55
|
+
}
|
|
56
|
+
if (data[0] === 0xff && data[1] === 0xd8) return readJpegSize(data);
|
|
57
|
+
if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46) {
|
|
58
|
+
return { width: u16le(data, 6), height: u16le(data, 8) };
|
|
59
|
+
}
|
|
60
|
+
if (
|
|
61
|
+
data[0] === 0x52 &&
|
|
62
|
+
data[1] === 0x49 &&
|
|
63
|
+
data[2] === 0x46 &&
|
|
64
|
+
data[3] === 0x46 &&
|
|
65
|
+
data[8] === 0x57 &&
|
|
66
|
+
data[9] === 0x45 &&
|
|
67
|
+
data[10] === 0x42 &&
|
|
68
|
+
data[11] === 0x50
|
|
69
|
+
) {
|
|
70
|
+
return readWebpSize(data);
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function u16be(data: Uint8Array, i: number): number {
|
|
76
|
+
return ((data[i] ?? 0) << 8) | (data[i + 1] ?? 0);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function u16le(data: Uint8Array, i: number): number {
|
|
80
|
+
return (data[i] ?? 0) | ((data[i + 1] ?? 0) << 8);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function u32be(data: Uint8Array, i: number): number {
|
|
84
|
+
return (
|
|
85
|
+
((data[i] ?? 0) << 24) |
|
|
86
|
+
((data[i + 1] ?? 0) << 16) |
|
|
87
|
+
((data[i + 2] ?? 0) << 8) |
|
|
88
|
+
(data[i + 3] ?? 0)
|
|
89
|
+
) >>> 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function readJpegSize(data: Uint8Array): { width: number; height: number } | null {
|
|
93
|
+
let i = 2;
|
|
94
|
+
while (i + 8 < data.length) {
|
|
95
|
+
if (data[i] !== 0xff) {
|
|
96
|
+
i += 1;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const marker = data[i + 1] ?? 0;
|
|
100
|
+
if (marker === 0xc0 || marker === 0xc1 || marker === 0xc2) {
|
|
101
|
+
return { height: u16be(data, i + 5), width: u16be(data, i + 7) };
|
|
102
|
+
}
|
|
103
|
+
const len = u16be(data, i + 2);
|
|
104
|
+
if (len < 2) return null;
|
|
105
|
+
i += 2 + len;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function readWebpSize(data: Uint8Array): { width: number; height: number } | null {
|
|
111
|
+
const kind = String.fromCharCode(data[12] ?? 0, data[13] ?? 0, data[14] ?? 0, data[15] ?? 0);
|
|
112
|
+
if (kind === 'VP8X' && data.length >= 30) {
|
|
113
|
+
const width = 1 + ((data[24] ?? 0) | ((data[25] ?? 0) << 8) | ((data[26] ?? 0) << 16));
|
|
114
|
+
const height = 1 + ((data[27] ?? 0) | ((data[28] ?? 0) << 8) | ((data[29] ?? 0) << 16));
|
|
115
|
+
return { width, height };
|
|
116
|
+
}
|
|
117
|
+
if (kind === 'VP8 ' && data.length >= 30) {
|
|
118
|
+
return { width: u16le(data, 26) & 0x3fff, height: u16le(data, 28) & 0x3fff };
|
|
119
|
+
}
|
|
120
|
+
if (kind === 'VP8L' && data.length >= 25) {
|
|
121
|
+
const bits = (data[21] ?? 0) | ((data[22] ?? 0) << 8) | ((data[23] ?? 0) << 16) | ((data[24] ?? 0) << 24);
|
|
122
|
+
return { width: (bits & 0x3fff) + 1, height: ((bits >> 14) & 0x3fff) + 1 };
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|