| 42 | * 纹理加载器实现 |
| 43 | */ |
| 44 | export class TextureLoader implements IAssetLoader<ITextureAsset> { |
| 45 | readonly supportedType = AssetType.Texture; |
| 46 | readonly supportedExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp']; |
| 47 | readonly contentType: AssetContentType = 'image'; |
| 48 | |
| 49 | private static _nextTextureId = 1; |
| 50 | |
| 51 | /** |
| 52 | * Reset texture ID counter |
| 53 | * 重置纹理 ID 计数器 |
| 54 | * |
| 55 | * This should be called when restoring scene snapshots to ensure |
| 56 | * textures start with fresh IDs. |
| 57 | * 在恢复场景快照时应调用此方法,以确保纹理从新 ID 开始。 |
| 58 | */ |
| 59 | static resetTextureIdCounter(): void { |
| 60 | TextureLoader._nextTextureId = 1; |
| 61 | } |
| 62 | |
| 63 | /** |
| 64 | * Parse texture from image content. |
| 65 | * 从图片内容解析纹理。 |
| 66 | */ |
| 67 | async parse(content: IAssetContent, context: IAssetParseContext): Promise<ITextureAsset> { |
| 68 | if (!content.image) { |
| 69 | throw new Error('Texture content is empty'); |
| 70 | } |
| 71 | |
| 72 | const image = content.image; |
| 73 | |
| 74 | // Read sprite settings from import settings |
| 75 | // 从导入设置读取 sprite 设置 |
| 76 | const importSettings = context.metadata.importSettings as Record<string, unknown> | undefined; |
| 77 | const spriteSettings = importSettings?.spriteSettings as ISpriteSettings | undefined; |
| 78 | |
| 79 | const textureAsset: ITextureAsset = { |
| 80 | textureId: TextureLoader._nextTextureId++, |
| 81 | width: image.width, |
| 82 | height: image.height, |
| 83 | format: 'rgba', |
| 84 | hasMipmaps: false, |
| 85 | data: image, |
| 86 | // Include sprite settings if available |
| 87 | // 如果有则包含 sprite 设置 |
| 88 | sliceBorder: spriteSettings?.sliceBorder, |
| 89 | pivot: spriteSettings?.pivot |
| 90 | }; |
| 91 | |
| 92 | // Upload to GPU if bridge exists. |
| 93 | const bridge = getEngineBridge(); |
| 94 | if (bridge?.loadTexture) { |
| 95 | await bridge.loadTexture(textureAsset.textureId, context.metadata.path); |
| 96 | } |
| 97 | |
| 98 | return textureAsset; |
| 99 | } |
| 100 | |
| 101 | /** |
nothing calls this directly
no outgoing calls
no test coverage detected