@forgeax/engine-image 0.1.27 → 0.1.29

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.
Files changed (36) hide show
  1. package/README.md +12 -2
  2. package/dist/__tests__/cube-parser.unit.test.d.ts +2 -0
  3. package/dist/__tests__/cube-parser.unit.test.d.ts.map +1 -0
  4. package/dist/__tests__/cube-producer.integration.test.d.ts +2 -0
  5. package/dist/__tests__/cube-producer.integration.test.d.ts.map +1 -0
  6. package/dist/__tests__/cube-recovery.integration.test.d.ts +2 -0
  7. package/dist/__tests__/cube-recovery.integration.test.d.ts.map +1 -0
  8. package/dist/decode-image-from-file.d.ts +1 -1
  9. package/dist/decode-image-from-file.mjs.map +1 -1
  10. package/dist/errors.d.ts +13 -0
  11. package/dist/errors.d.ts.map +1 -1
  12. package/dist/hdr-decoder.mjs.map +1 -1
  13. package/dist/image-importer.d.ts +2 -0
  14. package/dist/image-importer.d.ts.map +1 -1
  15. package/dist/image-importer.mjs +286 -2
  16. package/dist/image-importer.mjs.map +1 -1
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/lut/cube-parser.d.ts +18 -0
  19. package/dist/lut/cube-parser.d.ts.map +1 -0
  20. package/dist/lut/cube-producer.d.ts +17 -0
  21. package/dist/lut/cube-producer.d.ts.map +1 -0
  22. package/dist/parse-image.mjs.map +1 -1
  23. package/dist/to-asset-pack.d.ts +1 -1
  24. package/package.json +6 -6
  25. package/src/__tests__/cube-parser.unit.test.ts +84 -0
  26. package/src/__tests__/cube-producer.integration.test.ts +94 -0
  27. package/src/__tests__/cube-recovery.integration.test.ts +52 -0
  28. package/src/__tests__/errors.test-d.ts +2 -2
  29. package/src/__tests__/image-importer-topology.unit.test.ts +27 -0
  30. package/src/__tests__/image.unit.test.ts +1 -1
  31. package/src/decode-image-from-file.ts +1 -1
  32. package/src/errors.ts +35 -0
  33. package/src/image-importer.ts +13 -1
  34. package/src/lut/cube-parser.ts +185 -0
  35. package/src/lut/cube-producer.ts +135 -0
  36. package/src/to-asset-pack.ts +1 -1
@@ -0,0 +1,135 @@
1
+ import type {
2
+ ImportContext,
3
+ ImportedAsset,
4
+ ImportResult,
5
+ TextureAsset,
6
+ } from '@forgeax/engine-types';
7
+ import { IMPORT_ERROR_HINTS, ImportError } from '@forgeax/engine-types';
8
+ import type { CubeParserError } from '../errors.js';
9
+ import { cubeLutBytes, parseCubeLut } from './cube-parser.js';
10
+
11
+ export interface CubeTextureProducerInput {
12
+ readonly source: string;
13
+ readonly sourceKey: string;
14
+ readonly guid: string;
15
+ }
16
+
17
+ export type CubeTextureProducerResult =
18
+ | { readonly ok: true; readonly value: ImportedAsset<TextureAsset> }
19
+ | { readonly ok: false; readonly error: CubeParserError };
20
+
21
+ export function produceCubeTexture(
22
+ input: CubeTextureProducerInput,
23
+ source: string,
24
+ ): CubeTextureProducerResult {
25
+ const parsed = parseCubeLut(source, input.sourceKey);
26
+ if (!parsed.ok) return parsed;
27
+ const bytes = cubeLutBytes(parsed.value);
28
+ return {
29
+ ok: true,
30
+ value: {
31
+ guid: input.guid,
32
+ kind: 'texture',
33
+ payload: {
34
+ kind: 'texture',
35
+ shape: {
36
+ viewDimension: '3d',
37
+ extent: { width: parsed.value.size, height: parsed.value.size, depth: parsed.value.size },
38
+ },
39
+ format: 'rgba16float',
40
+ data: bytes,
41
+ colorSpace: 'linear',
42
+ mips: { kind: 'none' },
43
+ },
44
+ refs: [],
45
+ artifacts: {
46
+ body: {
47
+ mediaType: 'application/x-forgeax-rgba16float',
48
+ assetCodec: { name: 'rgba16float', version: '1' },
49
+ bytes,
50
+ },
51
+ },
52
+ },
53
+ };
54
+ }
55
+
56
+ export async function importCubeSource(ctx: ImportContext): Promise<ImportResult> {
57
+ const subAsset = ctx.subAssets.length === 1 ? ctx.subAssets[0] : undefined;
58
+ if (subAsset === undefined || subAsset.kind !== 'texture' || subAsset.sourceIndex !== 0) {
59
+ return {
60
+ ok: false,
61
+ error: new ImportError({
62
+ code: 'source-validation-failed',
63
+ expected: 'one texture subAsset at sourceIndex 0',
64
+ actual: JSON.stringify(ctx.subAssets),
65
+ hint: IMPORT_ERROR_HINTS['source-validation-failed'],
66
+ detail: {
67
+ diagnostics: [
68
+ {
69
+ code: 'cube-subasset-topology',
70
+ severity: 'error',
71
+ sourcePath: `${ctx.source}#subAssets`,
72
+ sourceRange: { start: 0, end: 0, line: 1, column: 1 },
73
+ rule: 'cube-required-single-texture',
74
+ expected: 'one texture subAsset at sourceIndex 0',
75
+ actual: JSON.stringify(ctx.subAssets),
76
+ hint: 'declare one ordinary texture subAsset and retry the same sourceKey',
77
+ },
78
+ ],
79
+ },
80
+ }),
81
+ };
82
+ }
83
+ const source = await ctx.readSource();
84
+ if (!source.ok) {
85
+ return {
86
+ ok: false,
87
+ error: new ImportError({
88
+ code: 'source-read-failed',
89
+ expected: `readable .cube source at "${ctx.source}"`,
90
+ actual: String(source.error),
91
+ hint: IMPORT_ERROR_HINTS['source-read-failed'],
92
+ detail: { source: ctx.source, reason: String(source.error) },
93
+ }),
94
+ };
95
+ }
96
+ const produced = produceCubeTexture(
97
+ {
98
+ source: ctx.source,
99
+ sourceKey: subAsset.sourceKey ?? `${ctx.source}:texture`,
100
+ guid: subAsset.guid,
101
+ },
102
+ new TextDecoder().decode(source.value),
103
+ );
104
+ if (!produced.ok) {
105
+ return {
106
+ ok: false,
107
+ error: new ImportError({
108
+ code: 'source-validation-failed',
109
+ expected: produced.error.expected,
110
+ actual: JSON.stringify(produced.error.detail),
111
+ hint: produced.error.hint,
112
+ detail: {
113
+ diagnostics: [
114
+ {
115
+ code: produced.error.code,
116
+ severity: 'error',
117
+ sourcePath: `${ctx.source}#${produced.error.detail.field}`,
118
+ sourceRange: {
119
+ start: 0,
120
+ end: 0,
121
+ line: produced.error.detail.line ?? 1,
122
+ column: 1,
123
+ },
124
+ rule: 'cube-source-parser',
125
+ expected: produced.error.expected,
126
+ actual: JSON.stringify(produced.error.detail.actual),
127
+ hint: produced.error.hint,
128
+ },
129
+ ],
130
+ },
131
+ }),
132
+ };
133
+ }
134
+ return { ok: true, value: { assets: [produced.value], sourceDependencies: [ctx.source] } };
135
+ }
@@ -3,7 +3,7 @@ import type { AssetCompression, DecodedImage, ImageMeta } from '@forgeax/engine-
3
3
  /**
4
4
  * External-asset-package envelope shape mirroring the
5
5
  * `packages/pack/schema/meta.schema.json` $defs/ExternalAssetPackage.
6
- * Consumed by `forgeax-engine-remote-asset import` (CLI entry, M3b) +
6
+ * Consumed by `forgeax asset import` (unified CLI entry) +
7
7
  * the image importer in M2 build-time path. The internal-text-package
8
8
  * variant ($defs/InternalTextPackage) is owned by the gltf-loader feat.
9
9
  */