@game_engine/runtime-browser-pixi 0.1.0-alpha.1
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/LICENSE +201 -0
- package/README.md +35 -0
- package/dist/index.d.ts +203 -0
- package/dist/index.js +1130 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AssetDefinition, WorldSnapshot } from \"@game_engine/contracts\";\r\nimport type { Application, Container, Graphics, Sprite, Texture } from \"pixi.js\";\r\n\r\nexport type DisplayPrimitiveKind = \"rectangle\" | \"marker\";\r\n\r\nexport type PixiRenderSeverity = \"warning\";\r\n\r\nexport interface PixiRenderDiagnostic {\r\n severity: PixiRenderSeverity;\r\n code: string;\r\n entityId: string;\r\n path: string;\r\n message: string;\r\n suggestion?: string;\r\n}\r\n\r\nexport interface DisplayListItem {\r\n id: string;\r\n kind: DisplayPrimitiveKind;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rotation: number;\r\n scaleX: number;\r\n scaleY: number;\r\n fill: number;\r\n alpha: number;\r\n stroke: number;\r\n strokeWidth: number;\r\n layer: string;\r\n order: number;\r\n animation?: DisplayAnimationState;\r\n}\r\n\r\nexport interface DisplayAnimationState {\r\n activeClip: string;\r\n activeFrameId: string;\r\n frameIndex: number;\r\n sprite?: string;\n rect?: [number, number, number, number];\n asset?: DisplayAssetReference;\n atlasFrame?: DisplayAtlasFrameReference;\n texture?: DisplayAnimationTextureState;\n elapsedFrames?: number;\n elapsedSeconds?: number;\n}\r\n\r\nexport interface DisplayAssetReference {\n id: string;\n type: \"sprite\";\n path: string;\n texture?: string;\n rect?: [number, number, number, number];\n atlas?: string;\n frame?: string;\n atlasFrame?: DisplayAtlasFrameReference;\n}\n\nexport interface DisplayAtlasFrameReference {\n atlas: string;\n frame: string;\n rect: [number, number, number, number];\n texture?: string;\n}\n\r\nexport interface DisplayAnimationTextureState {\r\n assetId: string;\r\n applied: boolean;\r\n mode: \"texture\" | \"debug\";\r\n}\r\n\r\nexport interface PixiTextureRequest {\n assetId: string;\n asset: DisplayAssetReference;\n atlasFrame?: DisplayAtlasFrameReference;\n item: DisplayListItem;\n}\n\r\nexport type PixiTextureResolver =\r\n | Map<string, Texture>\r\n | Record<string, Texture | undefined>\r\n | ((request: PixiTextureRequest) => Texture | undefined);\r\n\r\nexport interface PixiManifestDiagnostic {\r\n severity: \"error\";\r\n code: string;\r\n path: string;\r\n message: string;\r\n suggestion?: string;\r\n}\r\n\r\nexport interface PixiManifestTextureResolverResult {\n assets: AssetDefinition[];\n textureResolver: PixiTextureResolver;\n diagnostics: PixiManifestDiagnostic[];\n}\n\nexport type PixiAssetLoaderSeverity = \"error\" | \"warning\";\n\nexport interface PixiAssetLoaderDiagnostic {\n severity: PixiAssetLoaderSeverity;\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n}\n\ntype SpriteAssetDefinition = Extract<AssetDefinition, { type: \"sprite\" }>;\n\nexport interface PixiAssetUrlRequest {\n asset: SpriteAssetDefinition;\n atlasFrame?: DisplayAtlasFrameReference;\n}\n\nexport interface PixiAssetLoadRequest extends PixiAssetUrlRequest {\n url: string;\n}\n\nexport interface PixiAssetLoaderOptions {\n baseUrl?: string | URL;\n resolveUrl?: (request: PixiAssetUrlRequest) => string | URL | undefined;\n loadTexture?: (request: PixiAssetLoadRequest) => Texture | undefined | Promise<Texture | undefined>;\n}\n\nexport interface PixiAssetLoaderResult {\n assets: AssetDefinition[];\n textureResolver: PixiTextureResolver;\n diagnostics: PixiAssetLoaderDiagnostic[];\n loadedTextureIds: string[];\n}\n\ntype AtlasAssetDefinition = Extract<AssetDefinition, { type: \"atlas\" }>;\ntype TextureAssetDefinition = Extract<AssetDefinition, { type: \"texture\" }>;\n\nexport interface PixiAtlasTextureRequest {\n atlas: AtlasAssetDefinition;\n textureAsset?: TextureAssetDefinition;\n textureId?: string;\n}\n\nexport type PixiAtlasTextureResolver =\n | Map<string, Texture>\n | Record<string, Texture | undefined>\n | ((request: PixiAtlasTextureRequest) => Texture | undefined);\n\nexport interface PixiAtlasSliceRequest {\n sprite: SpriteAssetDefinition;\n atlas: AtlasAssetDefinition;\n atlasFrame: DisplayAtlasFrameReference;\n atlasTexture: Texture;\n}\n\nexport interface PixiAtlasTextureResolverOptions {\n atlasTextures?: PixiAtlasTextureResolver;\n fallbackTextureResolver?: PixiTextureResolver;\n sliceTexture?: (request: PixiAtlasSliceRequest) => Texture | undefined | Promise<Texture | undefined>;\n}\n\nexport interface PixiAtlasTextureResolverResult {\n assets: AssetDefinition[];\n textureResolver: PixiTextureResolver;\n diagnostics: PixiAssetLoaderDiagnostic[];\n slicedTextureIds: string[];\n slicedFrameIds: string[];\n}\n\nexport interface DisplayList {\n version: 1;\n frame: number;\n items: DisplayListItem[];\n diagnostics: PixiRenderDiagnostic[];\r\n}\r\n\r\nexport interface DisplayListOptions {\r\n drawTransformOnlyMarkers?: boolean;\r\n markerSize?: number;\r\n rectangleFill?: number;\r\n markerFill?: number;\r\n stroke?: number;\r\n strokeWidth?: number;\r\n alpha?: number;\r\n layer?: string;\r\n assets?: AssetDefinition[];\r\n}\r\n\r\nexport interface PixiRendererOptions {\r\n width?: number;\r\n height?: number;\r\n backgroundColor?: number;\r\n resolution?: number;\r\n antialias?: boolean;\r\n preference?: \"webgl\" | \"webgpu\";\r\n preserveDrawingBuffer?: boolean;\r\n container?: HTMLElement;\r\n}\r\n\r\nexport interface RenderSnapshotOptions extends DisplayListOptions {\r\n textureResolver?: PixiTextureResolver;\r\n}\r\n\r\nexport interface RenderWorldSnapshotOptions extends RenderSnapshotOptions {\r\n renderer?: PixiRenderer;\r\n app?: Application;\r\n stage?: Container;\r\n clear?: boolean;\r\n}\r\n\r\nexport interface PixiRenderer {\r\n app: Application;\r\n stage: Container;\r\n renderSnapshot(snapshot: WorldSnapshot, options?: RenderSnapshotOptions): Promise<DisplayList>;\r\n destroy(): void;\r\n}\r\n\r\nexport interface WorldLike {\r\n listEntities(): Array<{\r\n id: string;\r\n components: Record<string, unknown>;\r\n }>;\r\n}\r\n\r\nconst defaultMarkerSize = 4;\r\nconst defaultRectangleFill = 0x3b82f6;\r\nconst defaultMarkerFill = 0xf59e0b;\r\nconst defaultStroke = 0x111827;\r\nconst defaultStrokeWidth = 1;\r\nconst defaultAlpha = 0.35;\r\nconst defaultLayer = \"debug\";\r\nconst supportedManifestAssetTypes = new Set([\"texture\", \"sprite\", \"atlas\", \"audio\", \"font\"]);\n\r\nexport function createDisplayList(snapshot: WorldSnapshot, options: DisplayListOptions = {}): DisplayList {\r\n const diagnostics: PixiRenderDiagnostic[] = [];\r\n const animationClips = collectAnimationClips(snapshot);\r\n const assetsById = collectDisplayAssets(options.assets);\r\n const items = [...(snapshot.entities ?? [])]\r\n .sort((left, right) => left.id.localeCompare(right.id))\r\n .flatMap((entity): DisplayListItem[] => {\r\n const transform = readTransform(entity.components?.Transform);\r\n if (!transform) {\r\n if (isRenderMetadataOnly(entity.components)) {\r\n return [];\r\n }\r\n\r\n diagnostics.push({\r\n severity: \"warning\",\r\n code: \"PIXI_ENTITY_MISSING_TRANSFORM\",\r\n entityId: entity.id,\r\n path: `$.entities[${JSON.stringify(entity.id)}].components.Transform`,\r\n message: `Entity '${entity.id}' was skipped because it has no valid Transform component.`,\r\n suggestion: \"Add a Transform component before expecting the browser renderer to project this entity.\"\r\n });\r\n return [];\r\n }\r\n\r\n const collider = readCollider(entity.components?.Collider);\r\n const animation = readAnimatorPlayback(\r\n entity.id,\r\n entity.components?.Animator,\r\n animationClips,\r\n assetsById,\r\n diagnostics\r\n );\r\n if (collider) {\r\n return [\r\n createDisplayItem(entity.id, \"rectangle\", transform, collider.size[0], collider.size[1], {\r\n fill: options.rectangleFill ?? defaultRectangleFill,\r\n options,\r\n animation\r\n })\r\n ];\r\n }\r\n\r\n if (options.drawTransformOnlyMarkers ?? true) {\r\n const markerSize = options.markerSize ?? defaultMarkerSize;\r\n return [\r\n createDisplayItem(entity.id, \"marker\", transform, markerSize, markerSize, {\r\n fill: options.markerFill ?? defaultMarkerFill,\r\n options,\r\n animation\r\n })\r\n ];\r\n }\r\n\r\n return [];\r\n })\r\n .map((item, index) => ({\r\n ...item,\r\n order: index\r\n }));\r\n\r\n return {\r\n version: 1,\r\n frame: snapshot.frame,\r\n items,\r\n diagnostics\r\n };\r\n}\r\n\r\nexport function createPixiTextureResolverFromManifest(\n manifest: unknown,\n textures: PixiTextureResolver = {}\n): PixiManifestTextureResolverResult {\n const diagnostics: PixiManifestDiagnostic[] = [];\r\n const document = readManifestDocument(manifest, diagnostics);\r\n if (!document) {\r\n return {\r\n assets: [],\r\n textureResolver: () => undefined,\r\n diagnostics\r\n };\r\n }\r\n\r\n const assets = readManifestAssets(document.assets, diagnostics);\r\n const spriteAssetIds = new Set(assets.filter((asset) => asset.type === \"sprite\").map((asset) => asset.id));\r\n return {\r\n assets,\r\n textureResolver: (request) => {\r\n if (!spriteAssetIds.has(request.assetId)) {\r\n return undefined;\r\n }\r\n\r\n return resolveTextureByAssetId(textures, request);\r\n },\r\n diagnostics\n };\n}\n\nexport async function createPixiAssetLoaderFromManifest(\n manifestOrAssets: unknown,\n options: PixiAssetLoaderOptions = {}\n): Promise<PixiAssetLoaderResult> {\n const manifestDiagnostics: PixiManifestDiagnostic[] = [];\n const assets = readManifestOrAssetDefinitions(manifestOrAssets, manifestDiagnostics);\n const diagnostics: PixiAssetLoaderDiagnostic[] = [...manifestDiagnostics];\n const assetsById = new Map(assets.map((asset) => [asset.id, asset]));\n const textures = new Map<string, Texture>();\n const loadTexture = options.loadTexture ?? loadPixiTextureFromUrl;\n\n for (const asset of assets) {\n if (asset.type !== \"sprite\") {\n continue;\n }\n\n const atlasFrame = resolveDisplayAtlasFrameReference(asset, assetsById);\n const url = resolveAssetLoadUrl(asset, atlasFrame, options, diagnostics);\n if (!url) {\n continue;\n }\n\n let texture: Texture | undefined;\n try {\n texture = await loadTexture({\n asset,\n ...(atlasFrame ? { atlasFrame } : {}),\n url\n });\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ASSET_TEXTURE_LOAD_FAILED\",\n path: `$.assets[${JSON.stringify(asset.id)}].path`,\n message: `Sprite asset '${asset.id}' failed to load texture from '${url}'.`,\n suggestion:\n error instanceof Error\n ? error.message\n : \"Check the browser asset URL, server routing, and caller-provided texture loader.\"\n });\n continue;\n }\n\n if (!texture) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ASSET_TEXTURE_LOAD_MISSING\",\n path: `$.assets[${JSON.stringify(asset.id)}].path`,\n message: `Sprite asset '${asset.id}' did not produce a Pixi texture from '${url}'.`,\n suggestion: \"Return a Pixi texture from loadTexture or leave the renderer debug fallback in place.\"\n });\n continue;\n }\n\n textures.set(asset.id, texture);\n }\n\n const spriteAssetIds = new Set(assets.filter((asset) => asset.type === \"sprite\").map((asset) => asset.id));\n return {\n assets,\n textureResolver: (request) => {\n if (!spriteAssetIds.has(request.assetId)) {\n return undefined;\n }\n\n return textures.get(request.assetId);\n },\n diagnostics,\n loadedTextureIds: [...textures.keys()].sort((left, right) => left.localeCompare(right))\n };\n}\n\nexport async function createPixiAtlasTextureResolverFromManifest(\n manifestOrAssets: unknown,\n options: PixiAtlasTextureResolverOptions = {}\n): Promise<PixiAtlasTextureResolverResult> {\n const manifestDiagnostics: PixiManifestDiagnostic[] = [];\n const assets = readManifestOrAssetDefinitions(manifestOrAssets, manifestDiagnostics);\n const diagnostics: PixiAssetLoaderDiagnostic[] = [...manifestDiagnostics];\n const assetsById = new Map(assets.map((asset) => [asset.id, asset]));\n const textures = new Map<string, Texture>();\n const frameTextures = new Map<string, Texture>();\n const sliceTexture = options.sliceTexture ?? slicePixiTextureByAtlasFrame;\n const diagnosedAtlasTextureIds = new Set<string>();\n\n for (const asset of assets) {\n if (asset.type !== \"sprite\" || !asset.atlas || !asset.frame) {\n continue;\n }\n\n const atlas = assetsById.get(asset.atlas);\n const atlasFrame = resolveDisplayAtlasFrameReference(asset, assetsById);\n if (atlas?.type !== \"atlas\" || !atlasFrame) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ATLAS_SLICE_FRAME_UNRESOLVED\",\n path: `$.assets[${JSON.stringify(asset.id)}].frame`,\n message: `Sprite asset '${asset.id}' cannot resolve atlas frame '${asset.frame}' in atlas '${asset.atlas}'.`,\n suggestion: \"Run project validation and ensure SpriteAsset.atlas and SpriteAsset.frame still match atlas metadata.\"\n });\n continue;\n }\n\n const atlasTexture = resolveAtlasTexture(atlas, assetsById, options.atlasTextures);\n if (!atlasTexture) {\n const diagnosticKey = atlas.texture ?? atlas.id;\n if (!diagnosedAtlasTextureIds.has(diagnosticKey)) {\n diagnosedAtlasTextureIds.add(diagnosticKey);\n diagnostics.push(createMissingAtlasTextureDiagnostic(atlas));\n }\n continue;\n }\n\n if (!isAtlasFrameInsideTexture(atlasFrame.rect, atlasTexture)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ATLAS_SLICE_RECT_OUT_OF_BOUNDS\",\n path: `$.assets[${JSON.stringify(asset.id)}].frame`,\n message: `Sprite asset '${asset.id}' frame '${atlasFrame.frame}' is outside atlas texture '${atlas.id}'.`,\n suggestion:\n \"Check atlas frame rects against the loaded source texture dimensions before slicing. Scene validation remains metadata-only.\"\n });\n continue;\n }\n\n let slicedTexture: Texture | undefined;\n try {\n slicedTexture = await sliceTexture({\n sprite: asset,\n atlas,\n atlasFrame,\n atlasTexture\n });\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ATLAS_SLICE_FAILED\",\n path: `$.assets[${JSON.stringify(asset.id)}].frame`,\n message: `Sprite asset '${asset.id}' failed to slice frame '${atlasFrame.frame}' from atlas '${atlas.id}'.`,\n suggestion:\n error instanceof Error\n ? error.message\n : \"Check the loaded atlas texture, frame rect, and caller-provided sliceTexture function.\"\n });\n continue;\n }\n\n if (!slicedTexture) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ATLAS_SLICE_MISSING\",\n path: `$.assets[${JSON.stringify(asset.id)}].frame`,\n message: `Sprite asset '${asset.id}' did not produce a sliced texture for frame '${atlasFrame.frame}'.`,\n suggestion: \"Return a Pixi texture from sliceTexture or leave the renderer debug fallback in place.\"\n });\n continue;\n }\n\n textures.set(asset.id, slicedTexture);\n if (!frameTextures.has(atlasFrame.frame)) {\n frameTextures.set(atlasFrame.frame, slicedTexture);\n }\n }\n\n return {\n assets,\n textureResolver: (request) => {\n const slicedTexture = textures.get(request.assetId) ?? (request.atlasFrame ? frameTextures.get(request.atlasFrame.frame) : undefined);\n if (slicedTexture) {\n return slicedTexture;\n }\n\n return options.fallbackTextureResolver ? resolveTextureByAssetId(options.fallbackTextureResolver, request) : undefined;\n },\n diagnostics,\n slicedTextureIds: [...textures.keys()].sort((left, right) => left.localeCompare(right)),\n slicedFrameIds: [...frameTextures.keys()].sort((left, right) => left.localeCompare(right))\n };\n}\n\nexport async function createPixiRenderer(options: PixiRendererOptions = {}): Promise<PixiRenderer> {\n const pixi = await import(\"pixi.js\");\n const app = new pixi.Application();\r\n await app.init({\r\n width: options.width ?? 800,\r\n height: options.height ?? 450,\r\n backgroundColor: options.backgroundColor ?? 0x0f172a,\r\n resolution: options.resolution ?? 1,\r\n antialias: options.antialias ?? false,\r\n preference: options.preference ?? \"webgl\",\r\n preserveDrawingBuffer: options.preserveDrawingBuffer ?? false\r\n });\r\n\r\n if (options.container) {\r\n options.container.appendChild(app.canvas);\r\n }\r\n\r\n return {\r\n app,\r\n stage: app.stage,\r\n async renderSnapshot(snapshot, renderOptions) {\r\n return renderWorldSnapshot(snapshot, {\r\n ...renderOptions,\r\n app,\r\n stage: app.stage\r\n });\r\n },\r\n destroy() {\r\n app.destroy(true);\r\n }\r\n };\r\n}\r\n\r\nexport async function renderWorldSnapshot(\r\n snapshot: WorldSnapshot,\r\n options: RenderWorldSnapshotOptions = {}\r\n): Promise<DisplayList> {\r\n const renderer = options.renderer;\r\n const app = options.app ?? renderer?.app;\r\n const stage = options.stage ?? renderer?.stage ?? app?.stage;\r\n if (!stage) {\r\n throw new Error(\"renderWorldSnapshot requires a Pixi renderer, app, or stage.\");\r\n }\r\n\r\n const pixi = await import(\"pixi.js\");\r\n const displayList = createDisplayList(snapshot, options);\r\n if (options.clear ?? true) {\r\n stage.removeChildren();\r\n }\r\n\r\n for (const item of displayList.items) {\r\n const texture = resolveTextureForDisplayItem(item, options.textureResolver);\r\n if (texture) {\r\n const sprite = new pixi.Sprite(texture);\r\n markAnimationTextureState(item, true);\r\n drawTexturedDisplayItem(sprite, item);\r\n stage.addChild(sprite);\r\n } else {\r\n const graphic = new pixi.Graphics();\r\n markAnimationTextureState(item, false);\r\n drawDisplayItem(graphic, item);\r\n stage.addChild(graphic);\r\n }\r\n }\r\n\r\n app?.renderer.render(stage);\r\n return displayList;\r\n}\r\n\r\nexport async function renderWorld(\r\n world: WorldLike,\r\n options: RenderWorldSnapshotOptions & { frame?: number; fixedDeltaSeconds?: number; elapsedSeconds?: number } = {}\r\n): Promise<DisplayList> {\r\n return renderWorldSnapshot(worldToSnapshot(world, options), options);\r\n}\r\n\r\nfunction createDisplayItem(\r\n id: string,\r\n kind: DisplayPrimitiveKind,\r\n transform: TransformProjection,\r\n width: number,\r\n height: number,\r\n config: { fill: number; options: DisplayListOptions; animation?: DisplayAnimationState }\r\n): DisplayListItem {\r\n return {\r\n id,\r\n kind,\r\n x: transform.position[0],\r\n y: transform.position[1],\r\n width,\r\n height,\r\n rotation: transform.rotation,\r\n scaleX: transform.scale[0],\r\n scaleY: transform.scale[1],\r\n fill: config.fill,\r\n alpha: config.options.alpha ?? defaultAlpha,\r\n stroke: config.options.stroke ?? defaultStroke,\r\n strokeWidth: config.options.strokeWidth ?? defaultStrokeWidth,\r\n layer: config.options.layer ?? defaultLayer,\r\n order: 0,\r\n ...(config.animation ? { animation: config.animation } : {})\r\n };\r\n}\r\n\r\nfunction drawDisplayItem(graphic: Graphics, item: DisplayListItem): void {\r\n graphic.position.set(item.x, item.y);\r\n graphic.rotation = item.rotation;\r\n graphic.scale.set(item.scaleX, item.scaleY);\r\n\r\n if (item.kind === \"rectangle\") {\r\n graphic.rect(item.width / -2, item.height / -2, item.width, item.height);\r\n } else {\r\n graphic.rect(item.width / -2, item.height / -2, item.width, item.height);\r\n }\r\n\r\n graphic.fill({ color: item.fill, alpha: item.alpha });\r\n graphic.stroke({ color: item.stroke, width: item.strokeWidth });\r\n}\r\n\r\nfunction drawTexturedDisplayItem(sprite: Sprite, item: DisplayListItem): void {\r\n sprite.anchor.set(0.5);\r\n sprite.position.set(item.x, item.y);\r\n sprite.rotation = item.rotation;\r\n sprite.width = item.width * item.scaleX;\r\n sprite.height = item.height * item.scaleY;\r\n}\r\n\r\nfunction resolveTextureForDisplayItem(\r\n item: DisplayListItem,\r\n resolver: PixiTextureResolver | undefined\r\n): Texture | undefined {\r\n const asset = item.animation?.asset;\r\n if (!asset || !resolver) {\r\n return undefined;\r\n }\r\n\r\n if (typeof resolver === \"function\") {\n return resolver({\n assetId: asset.id,\n asset,\n ...(asset.atlasFrame ? { atlasFrame: asset.atlasFrame } : {}),\n item\n });\n }\n\r\n if (resolver instanceof Map) {\r\n return resolver.get(asset.id);\r\n }\r\n\r\n return resolver[asset.id];\r\n}\r\n\r\nfunction resolveTextureByAssetId(resolver: PixiTextureResolver, request: PixiTextureRequest): Texture | undefined {\n if (typeof resolver === \"function\") {\n return resolver(request);\n }\n\r\n if (resolver instanceof Map) {\r\n return resolver.get(request.assetId);\r\n }\r\n\n return resolver[request.assetId];\n}\n\nasync function loadPixiTextureFromUrl(request: PixiAssetLoadRequest): Promise<Texture | undefined> {\n const pixi = await import(\"pixi.js\");\n return (await pixi.Assets.load(request.url)) as Texture | undefined;\n}\n\nasync function slicePixiTextureByAtlasFrame(request: PixiAtlasSliceRequest): Promise<Texture | undefined> {\n const pixi = await import(\"pixi.js\");\n const [x, y, width, height] = request.atlasFrame.rect;\n return new pixi.Texture({\n source: request.atlasTexture.source,\n frame: new pixi.Rectangle(x, y, width, height)\n });\n}\n\nfunction resolveAtlasTexture(\n atlas: AtlasAssetDefinition,\n assetsById: Map<string, AssetDefinition>,\n resolver: PixiAtlasTextureResolver | undefined\n): Texture | undefined {\n if (!resolver) {\n return undefined;\n }\n\n const textureAsset = atlas.texture ? assetsById.get(atlas.texture) : undefined;\n const request: PixiAtlasTextureRequest = {\n atlas,\n ...(textureAsset?.type === \"texture\" ? { textureAsset } : {}),\n ...(atlas.texture ? { textureId: atlas.texture } : {})\n };\n\n if (typeof resolver === \"function\") {\n return resolver(request);\n }\n\n return resolveTextureByAtlasTextureId(resolver, atlas.texture) ?? resolveTextureByAtlasTextureId(resolver, atlas.id);\n}\n\nfunction resolveTextureByAtlasTextureId(\n resolver: Map<string, Texture> | Record<string, Texture | undefined>,\n textureId: string | undefined\n): Texture | undefined {\n if (!textureId) {\n return undefined;\n }\n\n if (resolver instanceof Map) {\n return resolver.get(textureId);\n }\n\n return resolver[textureId];\n}\n\nfunction createMissingAtlasTextureDiagnostic(atlas: AtlasAssetDefinition): PixiAssetLoaderDiagnostic {\n if (!atlas.texture) {\n return {\n severity: \"warning\",\n code: \"PIXI_ATLAS_SLICE_TEXTURE_REFERENCE_MISSING\",\n path: `$.assets[${JSON.stringify(atlas.id)}].texture`,\n message: `Atlas asset '${atlas.id}' has no source texture id for slicing.`,\n suggestion: \"Set atlas.texture to a texture asset id or pass an atlas texture keyed by the atlas id.\"\n };\n }\n\n return {\n severity: \"warning\",\n code: \"PIXI_ATLAS_SLICE_TEXTURE_MISSING\",\n path: `$.assets[${JSON.stringify(atlas.id)}].texture`,\n message: `Atlas asset '${atlas.id}' source texture '${atlas.texture}' was not provided to the Pixi atlas slicing helper.`,\n suggestion: \"Pass atlasTextures keyed by atlas.texture or atlas id, or keep debug fallback behavior.\"\n };\n}\n\nfunction isAtlasFrameInsideTexture(rect: [number, number, number, number], texture: Texture): boolean {\n const [x, y, width, height] = rect;\n return x >= 0 && y >= 0 && x + width <= texture.width && y + height <= texture.height;\n}\n\nfunction resolveAssetLoadUrl(\n asset: SpriteAssetDefinition,\n atlasFrame: DisplayAtlasFrameReference | undefined,\n options: PixiAssetLoaderOptions,\n diagnostics: PixiAssetLoaderDiagnostic[]\n): string | undefined {\n if (options.resolveUrl) {\n let resolved: string | URL | undefined;\n try {\n resolved = options.resolveUrl({\n asset,\n ...(atlasFrame ? { atlasFrame } : {})\n });\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ASSET_TEXTURE_URL_FAILED\",\n path: `$.assets[${JSON.stringify(asset.id)}].path`,\n message: `Sprite asset '${asset.id}' texture URL resolution failed.`,\n suggestion:\n error instanceof Error\n ? error.message\n : \"Check the caller-provided resolveUrl function and keep asset URL policy explicit.\"\n });\n return undefined;\n }\n\n const url = stringifyAssetUrl(resolved);\n if (url) {\n return url;\n }\n\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ASSET_TEXTURE_URL_UNRESOLVED\",\n path: `$.assets[${JSON.stringify(asset.id)}].path`,\n message: `Sprite asset '${asset.id}' has no browser texture URL.`,\n suggestion: \"Return a URL from resolveUrl or omit the texture so the renderer uses the debug fallback.\"\n });\n return undefined;\n }\n\n if (options.baseUrl !== undefined) {\n try {\n return new URL(asset.path, options.baseUrl).toString();\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ASSET_TEXTURE_URL_FAILED\",\n path: `$.assets[${JSON.stringify(asset.id)}].path`,\n message: `Sprite asset '${asset.id}' path '${asset.path}' could not be resolved against the loader baseUrl.`,\n suggestion:\n error instanceof Error\n ? error.message\n : \"Pass an absolute baseUrl or a resolveUrl function for browser asset paths.\"\n });\n return undefined;\n }\n }\n\n return asset.path;\n}\n\nfunction stringifyAssetUrl(value: string | URL | undefined): string | undefined {\n if (value instanceof URL) {\n return value.toString();\n }\n\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction markAnimationTextureState(item: DisplayListItem, applied: boolean): void {\n const assetId = item.animation?.asset?.id;\n if (!assetId || !item.animation) {\r\n return;\r\n }\r\n\r\n item.animation.texture = {\r\n assetId,\r\n applied,\r\n mode: applied ? \"texture\" : \"debug\"\r\n };\r\n}\r\n\r\nfunction worldToSnapshot(\r\n world: WorldLike,\r\n options: { frame?: number; fixedDeltaSeconds?: number; elapsedSeconds?: number }\r\n): WorldSnapshot {\r\n const fixedDeltaSeconds = options.fixedDeltaSeconds ?? 1 / 60;\r\n const frame = options.frame ?? 0;\r\n return {\r\n version: 1,\r\n frame,\r\n fixedDeltaSeconds,\r\n elapsedSeconds: options.elapsedSeconds ?? roundDeterministic(frame * fixedDeltaSeconds),\r\n entities: world\r\n .listEntities()\r\n .map((entity) => ({\r\n id: entity.id,\r\n components: entity.components\r\n }))\r\n .sort((left, right) => left.id.localeCompare(right.id))\r\n };\r\n}\r\n\r\ninterface TransformProjection {\r\n position: [number, number];\r\n rotation: number;\r\n scale: [number, number];\r\n}\r\n\r\ninterface ColliderProjection {\r\n size: [number, number];\r\n}\r\n\r\ninterface AnimationFrameProjection {\r\n id: string;\r\n sprite?: string;\r\n rect?: [number, number, number, number];\r\n}\r\n\r\ninterface AnimationClipProjection {\r\n id: string;\r\n frameOrder?: string[];\r\n frames: AnimationFrameProjection[];\r\n}\r\n\r\nfunction collectAnimationClips(snapshot: WorldSnapshot): Map<string, AnimationClipProjection> {\r\n const clips = new Map<string, AnimationClipProjection>();\r\n for (const entity of snapshot.entities ?? []) {\r\n const clip = readAnimationClip(entity.components?.AnimationClip);\r\n if (clip) {\r\n clips.set(clip.id, clip);\r\n }\r\n }\r\n\r\n return clips;\r\n}\r\n\r\nfunction readAnimationClip(value: unknown): AnimationClipProjection | undefined {\r\n if (!isRecord(value) || typeof value.id !== \"string\" || !Array.isArray(value.frames)) {\r\n return undefined;\r\n }\r\n\r\n const frames = value.frames.flatMap((frame): AnimationFrameProjection[] => {\r\n if (!isRecord(frame) || typeof frame.id !== \"string\") {\r\n return [];\r\n }\r\n\r\n const sprite = typeof frame.sprite === \"string\" ? frame.sprite : undefined;\r\n const rect = readNumberTuple(frame.rect, 4);\r\n return [\r\n {\r\n id: frame.id,\r\n ...(sprite ? { sprite } : {}),\r\n ...(rect ? { rect } : {})\r\n }\r\n ];\r\n });\r\n\r\n if (frames.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n id: value.id,\r\n ...(Array.isArray(value.frameOrder)\r\n ? { frameOrder: value.frameOrder.filter((frameId): frameId is string => typeof frameId === \"string\") }\r\n : {}),\r\n frames\r\n };\r\n}\r\n\r\nfunction readAnimatorPlayback(\r\n entityId: string,\r\n value: unknown,\r\n clips: Map<string, AnimationClipProjection>,\r\n assetsById: Map<string, AssetDefinition> | undefined,\r\n diagnostics: PixiRenderDiagnostic[]\r\n): DisplayAnimationState | undefined {\r\n if (!isRecord(value)) {\r\n return undefined;\r\n }\r\n\r\n const activeClip =\r\n readString(value.activeClip) ?? readString(value.defaultClip) ?? readString(value.currentClip);\r\n if (!activeClip) {\r\n return undefined;\r\n }\r\n\r\n const clip = clips.get(activeClip);\r\n if (!clip) {\r\n diagnostics.push({\r\n severity: \"warning\",\r\n code: \"PIXI_ANIMATION_CLIP_UNRESOLVED\",\r\n entityId,\r\n path: `$.entities[${JSON.stringify(entityId)}].components.Animator.activeClip`,\r\n message: `Animator activeClip '${activeClip}' cannot be resolved by the Pixi display list.`,\r\n suggestion: \"Run scene validation and ensure the active clip id exists in the rendered snapshot.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n const orderedFrames = orderAnimationFrames(clip);\r\n const explicitActiveFrameId = readString(value.activeFrameId);\r\n const explicitFrameIndex = readNonNegativeInteger(value.currentFrameIndex);\r\n const frameIndex =\r\n explicitActiveFrameId !== undefined\r\n ? orderedFrames.findIndex((frame) => frame.id === explicitActiveFrameId)\r\n : explicitFrameIndex ?? 0;\r\n const frame = orderedFrames[frameIndex];\r\n\r\n if (!frame || frameIndex < 0) {\r\n const frameId = explicitActiveFrameId ?? String(explicitFrameIndex ?? 0);\r\n diagnostics.push({\r\n severity: \"warning\",\r\n code: \"PIXI_ANIMATION_FRAME_UNRESOLVED\",\r\n entityId,\r\n path: `$.entities[${JSON.stringify(entityId)}].components.Animator.activeFrameId`,\r\n message: `Animator activeFrameId '${frameId}' cannot be resolved in clip '${activeClip}'.`,\r\n suggestion: \"Run scene validation and ensure activeFrameId references a SpriteFrame in the active clip.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n const elapsedFrames = readNonNegativeInteger(value.elapsedFrames);\r\n const elapsedSeconds = readFiniteNumber(value.elapsedSeconds);\r\n const asset = frame.sprite\r\n ? resolveDisplayAssetReference(entityId, frame.sprite, assetsById, diagnostics)\r\n : undefined;\r\n return {\n activeClip,\n activeFrameId: frame.id,\n frameIndex,\n ...(frame.sprite ? { sprite: frame.sprite } : {}),\n ...(frame.rect ? { rect: frame.rect } : {}),\n ...(asset ? { asset } : {}),\n ...(asset?.atlasFrame ? { atlasFrame: asset.atlasFrame } : {}),\n ...(elapsedFrames !== undefined ? { elapsedFrames } : {}),\n ...(elapsedSeconds !== undefined ? { elapsedSeconds } : {})\n };\n}\r\n\r\nfunction orderAnimationFrames(clip: AnimationClipProjection): AnimationFrameProjection[] {\r\n if (!clip.frameOrder || clip.frameOrder.length === 0) {\r\n return clip.frames;\r\n }\r\n\r\n const framesById = new Map(clip.frames.map((frame) => [frame.id, frame]));\r\n return clip.frameOrder.flatMap((frameId) => {\r\n const frame = framesById.get(frameId);\r\n return frame ? [frame] : [];\r\n });\r\n}\r\n\r\nfunction collectDisplayAssets(assets: AssetDefinition[] | undefined): Map<string, AssetDefinition> | undefined {\n if (!assets) {\n return undefined;\n }\n\r\n return new Map(assets.map((asset) => [asset.id, asset]));\n}\n\nfunction readManifestOrAssetDefinitions(value: unknown, diagnostics: PixiManifestDiagnostic[]): AssetDefinition[] {\n if (Array.isArray(value)) {\n return readManifestAssets(value, diagnostics);\n }\n\n const document = readManifestDocument(value, diagnostics);\n return document ? readManifestAssets(document.assets, diagnostics) : [];\n}\n\nfunction readManifestDocument(\n value: unknown,\n diagnostics: PixiManifestDiagnostic[]\r\n): { assets: unknown[] } | undefined {\r\n const document = parseManifestValue(value, diagnostics);\r\n if (!isRecord(document)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_MANIFEST_INVALID\",\r\n path: \"$\",\r\n message: \"Asset manifest must be an object.\",\r\n suggestion: \"Pass parsed Asset Manifest v0 JSON with version and assets.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n if (!Array.isArray(document.assets)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_MANIFEST_ASSETS_MISSING\",\r\n path: \"$.assets\",\r\n message: \"Asset manifest is missing an assets array.\",\r\n suggestion: \"Add assets: [] entries with stable ids, types, and paths.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n return {\r\n assets: document.assets\r\n };\r\n}\r\n\r\nfunction parseManifestValue(value: unknown, diagnostics: PixiManifestDiagnostic[]): unknown {\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n\r\n try {\r\n return JSON.parse(value);\r\n } catch (error) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_MANIFEST_PARSE_FAILED\",\r\n path: \"$\",\r\n message: error instanceof Error ? error.message : String(error),\r\n suggestion: \"Pass parsed JSON or a valid JSON string.\"\r\n });\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction readManifestAssets(assets: unknown[], diagnostics: PixiManifestDiagnostic[]): AssetDefinition[] {\r\n const assetsById = new Map<string, AssetDefinition>();\r\n for (const [index, value] of assets.entries()) {\r\n const assetPath = `$.assets[${index}]`;\r\n if (!isRecord(value)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_INVALID\",\r\n path: assetPath,\r\n message: \"Asset entry must be an object.\",\r\n suggestion: \"Use asset entries with id, type, and path fields.\"\r\n });\r\n continue;\r\n }\r\n\r\n const id = readString(value.id);\r\n if (!id) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_ID_MISSING\",\r\n path: `${assetPath}.id`,\r\n message: \"Asset entry is missing a stable id.\",\r\n suggestion: \"Add a non-empty asset id and reference that id from SpriteFrame.sprite.\"\r\n });\r\n continue;\r\n }\r\n\r\n if (assetsById.has(id)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_DUPLICATE_ID\",\r\n path: `${assetPath}.id`,\r\n message: `Duplicate asset id '${id}'.`,\r\n suggestion: \"Use one stable asset id once in the manifest.\"\r\n });\r\n continue;\r\n }\r\n\r\n const type = readString(value.type);\r\n if (!type || !supportedManifestAssetTypes.has(type)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_TYPE_UNSUPPORTED\",\n path: `${assetPath}.type`,\n message: `Asset '${id}' has unsupported type '${String(value.type)}'.`,\n suggestion: \"Use one of: texture, sprite, atlas, audio, font.\"\n });\n continue;\n }\n\r\n const sourcePath = readString(value.path);\r\n if (!sourcePath) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_PATH_MISSING\",\r\n path: `${assetPath}.path`,\r\n message: `Asset '${id}' is missing a source path.`,\r\n suggestion: \"Add a project-relative path. The renderer helper validates metadata only and does not load the file.\"\r\n });\r\n continue;\r\n }\r\n\r\n const asset = createAssetDefinition(id, type, sourcePath, value, assetPath, diagnostics);\r\n assetsById.set(id, asset);\r\n }\r\n\r\n validateManifestAssetReferences(assetsById, diagnostics);\n return [...assetsById.values()].sort((left, right) => left.id.localeCompare(right.id));\n}\n\r\nfunction createAssetDefinition(\r\n id: string,\r\n type: string,\r\n sourcePath: string,\r\n value: Record<string, unknown>,\r\n assetPath: string,\r\n diagnostics: PixiManifestDiagnostic[]\r\n): AssetDefinition {\r\n if (type === \"sprite\") {\n const texture = readString(value.texture);\n const atlas = readString(value.atlas);\n const frame = readString(value.frame);\n const rect = readManifestSpriteRect(value.rect, assetPath, id, diagnostics);\n return {\n id,\n type,\n path: sourcePath,\n ...(texture ? { texture } : {}),\n ...(atlas ? { atlas } : {}),\n ...(frame ? { frame } : {}),\n ...(rect ? { rect } : {})\n };\n }\n\n if (type === \"atlas\") {\n const texture = readString(value.texture);\n return {\n id,\n type,\n path: sourcePath,\n ...(texture ? { texture } : {}),\n frames: readManifestAtlasFrames(value.frames, assetPath, id, diagnostics)\n };\n }\n\n return {\n id,\n type: type as \"texture\" | \"audio\" | \"font\",\n path: sourcePath\n };\r\n}\n\nfunction readManifestAtlasFrames(\n value: unknown,\n assetPath: string,\n atlasId: string,\n diagnostics: PixiManifestDiagnostic[]\n): Array<{ id: string; rect: [number, number, number, number] }> {\n if (!Array.isArray(value)) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAMES_MISSING\",\n path: `${assetPath}.frames`,\n message: `Atlas asset '${atlasId}' is missing a frames array.`,\n suggestion: \"Add frame entries with stable ids and [x, y, width, height] rect metadata.\"\n });\n return [];\n }\n\n const framesById = new Map<string, { id: string; rect: [number, number, number, number] }>();\n for (const [index, frame] of value.entries()) {\n const framePath = `${assetPath}.frames[${index}]`;\n if (!isRecord(frame)) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAME_INVALID\",\n path: framePath,\n message: `Atlas frame entry in '${atlasId}' must be an object.`,\n suggestion: \"Use frame entries with id and rect fields.\"\n });\n continue;\n }\n\n const frameId = readString(frame.id);\n if (!frameId) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAME_ID_MISSING\",\n path: `${framePath}.id`,\n message: `Atlas asset '${atlasId}' has a frame without a stable id.`,\n suggestion: \"Add a non-empty frame id and reference it from SpriteAsset.frame.\"\n });\n continue;\n }\n\n if (framesById.has(frameId)) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_DUPLICATE_FRAME_ID\",\n path: `${framePath}.id`,\n message: `Atlas asset '${atlasId}' defines duplicate frame id '${frameId}'.`,\n suggestion: \"Use each frame id once per atlas.\"\n });\n continue;\n }\n\n const rect = readManifestAtlasFrameRect(frame.rect, framePath, atlasId, frameId, diagnostics);\n if (!rect) {\n continue;\n }\n\n framesById.set(frameId, {\n id: frameId,\n rect\n });\n }\n\n return [...framesById.values()].sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction readManifestAtlasFrameRect(\n value: unknown,\n framePath: string,\n atlasId: string,\n frameId: string,\n diagnostics: PixiManifestDiagnostic[]\n): [number, number, number, number] | undefined {\n if (!Array.isArray(value) || value.length !== 4) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAME_RECT_INVALID\",\n path: `${framePath}.rect`,\n message: `Atlas frame '${frameId}' in atlas '${atlasId}' rect must be [x, y, width, height].`,\n suggestion: \"Use four finite numbers. The Pixi helper records metadata only and does not slice atlases.\"\n });\n return undefined;\n }\n\n const invalidIndex = value.findIndex((item) => typeof item !== \"number\" || !Number.isFinite(item));\n if (invalidIndex !== -1) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAME_RECT_INVALID\",\n path: `${framePath}.rect[${invalidIndex}]`,\n message: `Atlas frame '${frameId}' in atlas '${atlasId}' rect value at index ${invalidIndex} must be a finite number.`,\n suggestion: \"Use numeric [x, y, width, height] atlas metadata.\"\n });\n return undefined;\n }\n\n const rect = [value[0], value[1], value[2], value[3]] as [number, number, number, number];\n if (rect[2] <= 0 || rect[3] <= 0) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAME_RECT_INVALID\",\n path: `${framePath}.rect[${rect[2] <= 0 ? 2 : 3}]`,\n message: `Atlas frame '${frameId}' in atlas '${atlasId}' rect width and height must be greater than zero.`,\n suggestion: \"Use positive width and height values. Atlas slicing remains caller-owned.\"\n });\n return undefined;\n }\n\n return rect;\n}\n\r\nfunction readManifestSpriteRect(\r\n value: unknown,\r\n assetPath: string,\r\n assetId: string,\r\n diagnostics: PixiManifestDiagnostic[]\r\n): [number, number, number, number] | undefined {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (!Array.isArray(value) || value.length !== 4) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_RECT_INVALID\",\r\n path: `${assetPath}.rect`,\r\n message: `Sprite asset '${assetId}' rect must be [x, y, width, height].`,\r\n suggestion: \"Use four finite numbers. The Pixi helper records metadata only and does not slice atlases.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n const invalidIndex = value.findIndex((item) => typeof item !== \"number\" || !Number.isFinite(item));\r\n if (invalidIndex !== -1) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_RECT_INVALID\",\r\n path: `${assetPath}.rect[${invalidIndex}]`,\r\n message: `Sprite asset '${assetId}' rect value at index ${invalidIndex} must be a finite number.`,\r\n suggestion: \"Use numeric [x, y, width, height] atlas planning metadata.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n const rect = [value[0], value[1], value[2], value[3]] as [number, number, number, number];\r\n if (rect[2] <= 0 || rect[3] <= 0) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PIXI_ASSET_RECT_INVALID\",\r\n path: `${assetPath}.rect[${rect[2] <= 0 ? 2 : 3}]`,\r\n message: `Sprite asset '${assetId}' rect width and height must be greater than zero.`,\r\n suggestion: \"Use positive width and height values. Atlas slicing remains caller-owned.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n return rect;\r\n}\r\n\r\nfunction validateManifestAssetReferences(\n assetsById: Map<string, AssetDefinition>,\n diagnostics: PixiManifestDiagnostic[]\n): void {\n for (const asset of assetsById.values()) {\n if (asset.type === \"sprite\") {\n if (asset.texture) {\n validateManifestReferenceToType({\n assetsById,\n diagnostics,\n path: `$.assets[${JSON.stringify(asset.id)}].texture`,\n ownerType: \"Sprite asset\",\n assetId: asset.id,\n referencedId: asset.texture,\n expectedType: \"texture\",\n missingCode: \"PIXI_ASSET_REFERENCE_UNRESOLVED\",\n mismatchCode: \"PIXI_ASSET_REFERENCE_TYPE_MISMATCH\",\n suggestion: \"Add the referenced texture asset or remove the texture link until atlas loading exists.\"\n });\n }\n\n validateManifestSpriteAtlasFrameReference(asset, assetsById, diagnostics);\n continue;\n }\n\n if (asset.type === \"atlas\" && asset.texture) {\n validateManifestReferenceToType({\n assetsById,\n diagnostics,\n path: `$.assets[${JSON.stringify(asset.id)}].texture`,\n ownerType: \"Atlas asset\",\n assetId: asset.id,\n referencedId: asset.texture,\n expectedType: \"texture\",\n missingCode: \"PIXI_ASSET_ATLAS_TEXTURE_REFERENCE_UNRESOLVED\",\n mismatchCode: \"PIXI_ASSET_ATLAS_TEXTURE_TYPE_MISMATCH\",\n suggestion: \"Point atlas.texture to a texture asset id or remove the texture reference.\"\n });\n }\n }\n}\n\nfunction validateManifestReferenceToType(input: {\n assetsById: Map<string, AssetDefinition>;\n diagnostics: PixiManifestDiagnostic[];\n path: string;\n ownerType: string;\n assetId: string;\n referencedId: string;\n expectedType: string;\n missingCode: string;\n mismatchCode: string;\n suggestion: string;\n}): void {\n const referenced = input.assetsById.get(input.referencedId);\n if (!referenced) {\n input.diagnostics.push({\n severity: \"error\",\n code: input.missingCode,\n path: input.path,\n message: `${input.ownerType} '${input.assetId}' references missing ${input.expectedType} asset '${input.referencedId}'.`,\n suggestion: input.suggestion\n });\n return;\n }\n\n if (referenced.type !== input.expectedType) {\n input.diagnostics.push({\n severity: \"error\",\n code: input.mismatchCode,\n path: input.path,\n message: `${input.ownerType} '${input.assetId}' references '${input.referencedId}', but it is '${referenced.type}', not '${input.expectedType}'.`,\n suggestion: input.suggestion\n });\n }\n}\n\nfunction validateManifestSpriteAtlasFrameReference(\n asset: Extract<AssetDefinition, { type: \"sprite\" }>,\n assetsById: Map<string, AssetDefinition>,\n diagnostics: PixiManifestDiagnostic[]\n): void {\n if (!asset.atlas && !asset.frame) {\n return;\n }\n\n if (!asset.atlas || !asset.frame) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAME_REFERENCE_INCOMPLETE\",\n path: `$.assets[${JSON.stringify(asset.id)}].${asset.atlas ? \"frame\" : \"atlas\"}`,\n message: `Sprite asset '${asset.id}' must set both atlas and frame when referencing atlas metadata.`,\n suggestion: \"Set atlas to an atlas asset id and frame to a frame id inside that atlas.\"\n });\n return;\n }\n\n const atlas = assetsById.get(asset.atlas);\n if (!atlas) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_REFERENCE_UNRESOLVED\",\n path: `$.assets[${JSON.stringify(asset.id)}].atlas`,\n message: `Sprite asset '${asset.id}' references missing atlas asset '${asset.atlas}'.`,\n suggestion: \"Add the referenced atlas asset or update SpriteAsset.atlas.\"\n });\n return;\n }\n\n if (atlas.type !== \"atlas\") {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_REFERENCE_TYPE_MISMATCH\",\n path: `$.assets[${JSON.stringify(asset.id)}].atlas`,\n message: `Sprite asset '${asset.id}' references '${asset.atlas}', but it is '${atlas.type}', not 'atlas'.`,\n suggestion: \"Point SpriteAsset.atlas to an atlas asset id.\"\n });\n return;\n }\n\n const frame = atlas.frames.find((candidate) => candidate.id === asset.frame);\n if (!frame) {\n diagnostics.push({\n severity: \"error\",\n code: \"PIXI_ASSET_ATLAS_FRAME_REFERENCE_UNRESOLVED\",\n path: `$.assets[${JSON.stringify(asset.id)}].frame`,\n message: `Sprite asset '${asset.id}' references missing frame '${asset.frame}' in atlas '${asset.atlas}'.`,\n suggestion: \"Use a frame id defined by the referenced atlas asset.\"\n });\n }\n}\n\r\nfunction resolveDisplayAssetReference(\r\n entityId: string,\r\n assetId: string,\r\n assetsById: Map<string, AssetDefinition> | undefined,\r\n diagnostics: PixiRenderDiagnostic[]\r\n): DisplayAssetReference | undefined {\r\n if (!assetsById) {\r\n return undefined;\r\n }\r\n\r\n const asset = assetsById.get(assetId);\r\n if (!asset) {\r\n diagnostics.push({\r\n severity: \"warning\",\r\n code: \"PIXI_ANIMATION_ASSET_UNRESOLVED\",\r\n entityId,\r\n path: `$.entities[${JSON.stringify(entityId)}].components.Animator.activeFrameId`,\r\n message: `Animation sprite asset '${assetId}' cannot be resolved by the Pixi display list.`,\r\n suggestion: \"Pass the project asset manifest assets to the renderer or update SpriteFrame.sprite to a known sprite asset id.\"\r\n });\r\n return undefined;\r\n }\r\n\r\n if (asset.type !== \"sprite\") {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ANIMATION_ASSET_TYPE_MISMATCH\",\n entityId,\r\n path: `$.entities[${JSON.stringify(entityId)}].components.Animator.activeFrameId`,\r\n message: `Animation sprite asset '${assetId}' is '${asset.type}', not 'sprite'.`,\r\n suggestion: \"Use a SpriteFrame.sprite id whose manifest asset type is 'sprite'.\"\r\n });\r\n return undefined;\n }\n\n const atlasFrame = resolveDisplayAtlasFrameReference(asset, assetsById);\n if ((asset.atlas || asset.frame) && !atlasFrame) {\n diagnostics.push({\n severity: \"warning\",\n code: \"PIXI_ANIMATION_ATLAS_FRAME_UNRESOLVED\",\n entityId,\n path: `$.entities[${JSON.stringify(entityId)}].components.Animator.activeFrameId`,\n message: `Animation sprite asset '${assetId}' has atlas/frame metadata that cannot be resolved by the Pixi display list.`,\n suggestion:\n \"Run project validation and ensure SpriteAsset.atlas points to an atlas asset and SpriteAsset.frame points to an atlas frame id.\"\n });\n }\n\n return {\n id: asset.id,\n type: \"sprite\",\n path: asset.path,\n ...(typeof asset.texture === \"string\" ? { texture: asset.texture } : {}),\n ...(asset.rect ? { rect: asset.rect } : {}),\n ...(typeof asset.atlas === \"string\" ? { atlas: asset.atlas } : {}),\n ...(typeof asset.frame === \"string\" ? { frame: asset.frame } : {}),\n ...(atlasFrame ? { atlasFrame } : {})\n };\n}\n\nfunction resolveDisplayAtlasFrameReference(\n asset: Extract<AssetDefinition, { type: \"sprite\" }>,\n assetsById: Map<string, AssetDefinition>\n): DisplayAtlasFrameReference | undefined {\n if (!asset.atlas || !asset.frame) {\n return undefined;\n }\n\n const atlas = assetsById.get(asset.atlas);\n if (atlas?.type !== \"atlas\") {\n return undefined;\n }\n\n const frame = atlas.frames.find((candidate) => candidate.id === asset.frame);\n if (!frame) {\n return undefined;\n }\n\n return {\n atlas: atlas.id,\n frame: frame.id,\n rect: frame.rect,\n ...(typeof atlas.texture === \"string\" ? { texture: atlas.texture } : {})\n };\n}\n\r\nfunction isRenderMetadataOnly(components: Record<string, unknown> | undefined): boolean {\r\n if (!components) {\r\n return false;\r\n }\r\n\r\n const componentNames = Object.keys(components);\r\n return componentNames.length > 0 && componentNames.every((name) => name === \"AnimationClip\");\r\n}\r\n\r\nfunction readTransform(value: unknown): TransformProjection | undefined {\r\n if (!isRecord(value)) {\r\n return undefined;\r\n }\r\n\r\n const position = readNumberPair(value.position);\r\n const scale = readNumberPair(value.scale);\r\n const rotation = typeof value.rotation === \"number\" && Number.isFinite(value.rotation) ? value.rotation : undefined;\r\n if (!position || !scale || rotation === undefined) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n position,\r\n rotation,\r\n scale\r\n };\r\n}\r\n\r\nfunction readCollider(value: unknown): ColliderProjection | undefined {\r\n if (!isRecord(value) || value.shape !== \"box\") {\r\n return undefined;\r\n }\r\n\r\n const size = readNumberPair(value.size);\r\n if (!size || size[0] <= 0 || size[1] <= 0) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n size\r\n };\r\n}\r\n\r\nfunction readNumberPair(value: unknown): [number, number] | undefined {\r\n if (\r\n !Array.isArray(value) ||\r\n value.length !== 2 ||\r\n typeof value[0] !== \"number\" ||\r\n typeof value[1] !== \"number\" ||\r\n !Number.isFinite(value[0]) ||\r\n !Number.isFinite(value[1])\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return [value[0], value[1]];\r\n}\r\n\r\nfunction readNumberTuple(value: unknown, length: 4): [number, number, number, number] | undefined {\r\n if (!Array.isArray(value) || value.length !== length) {\r\n return undefined;\r\n }\r\n\r\n if (!value.every((item) => typeof item === \"number\" && Number.isFinite(item))) {\r\n return undefined;\r\n }\r\n\r\n return [value[0], value[1], value[2], value[3]];\r\n}\r\n\r\nfunction readString(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\r\n}\r\n\r\nfunction readFiniteNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction readNonNegativeInteger(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 ? value : undefined;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction roundDeterministic(value: number): number {\r\n return Number(value.toFixed(12));\r\n}\r\n"],"mappings":"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","names":["frame"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@game_engine/runtime-browser-pixi",
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
|
+
"description": "Experimental PixiJS browser debug renderer for Agent Engine world snapshots.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/rktkdduq01/game_engine.git",
|
|
9
|
+
"directory": "packages/runtime-browser-pixi"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"agent-engine",
|
|
13
|
+
"game-engine",
|
|
14
|
+
"ai-agent",
|
|
15
|
+
"pixijs",
|
|
16
|
+
"experimental"
|
|
17
|
+
],
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"pixi.js": "^8.19.0",
|
|
35
|
+
"@game_engine/contracts": "0.1.0-alpha.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"tsup": "^8.3.5",
|
|
39
|
+
"typescript": "^5.7.2",
|
|
40
|
+
"vitest": "^2.1.8"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean"
|
|
44
|
+
}
|
|
45
|
+
}
|