kinetic-slider
Version:
A WebGL-powered kinetic slider component using PIXI.js
1 lines • 39.4 kB
Source Map (JSON)
{"version":3,"file":"AtlasManager.cjs","sources":["../../../src/managers/AtlasManager.ts"],"sourcesContent":["import { Assets, Texture, Rectangle } from 'pixi.js';\nimport ResourceManager from './ResourceManager';\n\n// Development environment check\nconst isDevelopment = import.meta.env?.MODE === 'development';\n\n/**\n * Interface for a frame within an atlas\n */\nexport interface AtlasFrame {\n frame: {\n x: number;\n y: number;\n w: number;\n h: number;\n };\n rotated: boolean;\n trimmed: boolean;\n spriteSourceSize?: {\n x: number;\n y: number;\n w: number;\n h: number;\n };\n sourceSize?: {\n w: number;\n h: number;\n };\n pivot?: {\n x: number;\n y: number;\n };\n}\n\n/**\n * Interface for atlas metadata\n */\nexport interface AtlasMetadata {\n app?: string;\n version?: string;\n image?: string;\n format?: string;\n size?: {\n w: number;\n h: number;\n };\n scale?: number;\n}\n\n/**\n * Interface for a complete texture atlas\n */\nexport interface Atlas {\n frames: Record<string, AtlasFrame>;\n meta: AtlasMetadata;\n}\n\n/**\n * Options for the atlas manager\n */\nexport interface AtlasManagerOptions {\n // Whether to enable debug logging\n debug?: boolean;\n\n // Whether to prefer atlases over individual images when both are available\n preferAtlas?: boolean;\n\n // Whether to cache frame textures (recommended for better performance)\n cacheFrameTextures?: boolean;\n\n // Base path to prepend to atlas image paths\n basePath?: string;\n}\n\n/**\n * Status of an atlas or image loading operation\n */\nexport enum LoadStatus {\n NotLoaded = 'not_loaded',\n Loading = 'loading',\n Loaded = 'loaded',\n Failed = 'failed'\n}\n\n/**\n * Manager for handling texture atlases in the KineticSlider\n *\n * This class provides methods for:\n * - Loading texture atlases from JSON and image files\n * - Retrieving textures for individual frames\n * - Managing the lifecycle of atlas resources\n * - Providing proper cleanup when an atlas is no longer needed\n */\nexport class AtlasManager {\n // Loaded atlases\n private atlases: Map<string, Atlas> = new Map();\n\n // Atlas textures (the full atlas texture)\n private atlasTextures: Map<string, Texture> = new Map();\n\n // Cached frame textures (individual sprites cut from the atlas)\n private frameTextures: Map<string, Texture> = new Map();\n\n // Image textures (for individual images, used as fallback)\n private imageTextures: Map<string, Texture> = new Map();\n\n // Loading status for atlases\n private atlasStatus: Map<string, LoadStatus> = new Map();\n\n // Loading status for individual images\n private imageStatus: Map<string, LoadStatus> = new Map();\n\n // Reference to ResourceManager for tracking resources\n private resourceManager?: ResourceManager;\n\n // Options for the atlas manager\n private options: AtlasManagerOptions;\n\n /**\n * Create a new atlas manager\n *\n * @param options - Options for the atlas manager\n * @param resourceManager - Optional ResourceManager for tracking resources\n */\n constructor(options: AtlasManagerOptions = {}, resourceManager?: ResourceManager) {\n this.options = {\n debug: isDevelopment,\n preferAtlas: true,\n cacheFrameTextures: true,\n basePath: '',\n ...options\n };\n\n this.resourceManager = resourceManager;\n\n if (this.options.debug) {\n console.log('AtlasManager initialized with options:', this.options);\n }\n }\n\n /**\n * Extract the filename from a path for atlas frame lookup\n *\n * @param imagePath - The full path to the image\n * @returns The filename part of the path\n */\n private getFilenameFromPath(imagePath: string): string {\n // Check if the path is empty or null\n if (!imagePath) return '';\n\n // Extract filename from path (everything after the last /)\n const filename = imagePath.split('/').pop() || imagePath;\n\n if (this.options.debug) {\n console.log(`Extracted filename \"${filename}\" from path \"${imagePath}\"`);\n }\n\n return filename;\n }\n\n /**\n * Load a texture atlas from a JSON file\n *\n * @param atlasId - Identifier for the atlas\n * @param jsonUrl - URL to the atlas JSON file\n * @param imageUrl - Optional URL to the atlas image file (if not specified in JSON)\n * @returns Promise resolving when the atlas is loaded\n */\n async loadAtlas(atlasId: string, jsonUrl: string, imageUrl?: string): Promise<boolean> {\n // Check if atlas is already loaded or loading\n if (this.atlasStatus.get(atlasId) === LoadStatus.Loaded) {\n this.log(`Atlas '${atlasId}' already loaded, skipping`);\n return true;\n }\n\n if (this.atlasStatus.get(atlasId) === LoadStatus.Loading) {\n this.log(`Atlas '${atlasId}' is already loading, waiting...`);\n\n // Wait for atlas to finish loading\n return new Promise<boolean>((resolve) => {\n const checkInterval = setInterval(() => {\n const status = this.atlasStatus.get(atlasId);\n if (status === LoadStatus.Loaded) {\n clearInterval(checkInterval);\n resolve(true);\n } else if (status === LoadStatus.Failed) {\n clearInterval(checkInterval);\n resolve(false);\n }\n }, 100);\n });\n }\n\n try {\n // Mark atlas as loading\n this.atlasStatus.set(atlasId, LoadStatus.Loading);\n this.log(`Loading atlas '${atlasId}' from ${jsonUrl}`);\n\n // Load the atlas JSON\n let atlasData: Atlas;\n try {\n const response = await fetch(jsonUrl);\n if (!response.ok) {\n throw new Error(`Failed to load atlas JSON: ${response.statusText}`);\n }\n atlasData = await response.json();\n } catch (error) {\n this.log(`Error loading atlas JSON: ${error}`, 'error');\n this.atlasStatus.set(atlasId, LoadStatus.Failed);\n return false;\n }\n\n // Validate atlas data\n if (!atlasData.frames || !atlasData.meta) {\n this.log(`Invalid atlas data: missing frames or meta`, 'error');\n this.atlasStatus.set(atlasId, LoadStatus.Failed);\n return false;\n }\n\n // Determine the image URL\n const atlasImageUrl = imageUrl ||\n (atlasData.meta.image ?\n (this.options.basePath ? `${this.options.basePath}/${atlasData.meta.image}` : atlasData.meta.image) :\n null);\n\n if (!atlasImageUrl) {\n this.log(`Invalid atlas data: no image URL specified`, 'error');\n this.atlasStatus.set(atlasId, LoadStatus.Failed);\n return false;\n }\n\n // Load the atlas texture\n let atlasTexture: Texture;\n try {\n // Check if the texture is already in the Assets cache\n if (Assets.cache.has(atlasImageUrl)) {\n atlasTexture = Assets.cache.get(atlasImageUrl);\n } else {\n // Load the texture\n this.log(`Loading atlas texture from ${atlasImageUrl}`);\n atlasTexture = await Assets.load(atlasImageUrl);\n }\n\n // Track the texture with ResourceManager\n if (this.resourceManager) {\n this.resourceManager.trackTexture(atlasImageUrl, atlasTexture);\n }\n } catch (error) {\n this.log(`Error loading atlas texture: ${error}`, 'error');\n this.atlasStatus.set(atlasId, LoadStatus.Failed);\n return false;\n }\n\n // Store the atlas data and texture\n this.atlases.set(atlasId, atlasData);\n this.atlasTextures.set(atlasId, atlasTexture);\n\n // Mark atlas as loaded\n this.atlasStatus.set(atlasId, LoadStatus.Loaded);\n this.log(`Atlas '${atlasId}' loaded successfully with ${Object.keys(atlasData.frames).length} frames`);\n\n return true;\n } catch (error) {\n this.log(`Unexpected error loading atlas: ${error}`, 'error');\n this.atlasStatus.set(atlasId, LoadStatus.Failed);\n return false;\n }\n }\n\n /**\n * Check if a frame exists in any loaded atlas\n *\n * @param frameName - Name of the frame to check\n * @returns The ID of the atlas containing the frame, or null if not found\n */\n hasFrame(frameName: string): string | null {\n // First check with the exact name\n for (const [atlasId, atlas] of this.atlases.entries()) {\n if (atlas.frames[frameName]) {\n return atlasId;\n }\n }\n\n // If not found and it looks like a path, extract the filename and try again\n if (frameName.includes('/')) {\n const filename = this.getFilenameFromPath(frameName);\n for (const [atlasId, atlas] of this.atlases.entries()) {\n if (atlas.frames[filename]) {\n if (this.options.debug) {\n console.log(`Found frame \"${filename}\" in atlas \"${atlasId}\" by extracting from path \"${frameName}\"`);\n }\n return atlasId;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Get a texture for a frame from an atlas\n *\n * @param frameName - Name of the frame\n * @param atlasId - Optional ID of the atlas to use (if not specified, all atlases will be searched)\n * @returns The texture for the frame, or null if not found\n */\n getFrameTexture(frameName: string, atlasId?: string): Texture | null {\n // Use full path for cache key to avoid collisions\n const cacheKey = atlasId ? `${atlasId}:${frameName}` : frameName;\n\n // Check if we already have a cached texture for this frame\n if (this.options.cacheFrameTextures && this.frameTextures.has(cacheKey)) {\n return this.frameTextures.get(cacheKey)!;\n }\n\n // Find the atlas containing the frame\n let targetAtlasId = atlasId;\n let frameData: AtlasFrame | null = null;\n let lookupName = frameName;\n\n // If frameName looks like a path, try to extract just the filename\n if (frameName.includes('/')) {\n lookupName = this.getFilenameFromPath(frameName);\n }\n\n if (targetAtlasId) {\n // Use the specified atlas\n const atlas = this.atlases.get(targetAtlasId);\n if (!atlas) {\n this.log(`Atlas '${targetAtlasId}' not found`, 'warn');\n return null;\n }\n\n // Try first with original name\n frameData = atlas.frames[frameName] || null;\n\n // If not found, try with extracted filename\n if (!frameData && frameName !== lookupName) {\n frameData = atlas.frames[lookupName] || null;\n\n if (frameData && this.options.debug) {\n console.log(`Found frame \"${lookupName}\" in atlas \"${targetAtlasId}\" by extracting from path \"${frameName}\"`);\n }\n }\n\n if (!frameData) {\n this.log(`Frame '${frameName}' not found in atlas '${targetAtlasId}'`, 'warn');\n return null;\n }\n } else {\n // Search all atlases\n for (const [id, atlas] of this.atlases.entries()) {\n // Try first with original name\n if (atlas.frames[frameName]) {\n targetAtlasId = id;\n frameData = atlas.frames[frameName];\n break;\n }\n\n // If not found, try with extracted filename\n if (frameName !== lookupName && atlas.frames[lookupName]) {\n targetAtlasId = id;\n frameData = atlas.frames[lookupName];\n\n if (this.options.debug) {\n console.log(`Found frame \"${lookupName}\" in atlas \"${id}\" by extracting from path \"${frameName}\"`);\n }\n\n break;\n }\n }\n\n if (!targetAtlasId || !frameData) {\n this.log(`Frame '${frameName}' not found in any atlas`, 'warn');\n return null;\n }\n }\n\n // Get the atlas texture\n const atlasTexture = this.atlasTextures.get(targetAtlasId!);\n if (!atlasTexture) {\n this.log(`Atlas texture for '${targetAtlasId}' not found`, 'warn');\n return null;\n }\n\n // Create a new texture from the atlas using the frame data\n try {\n // Create the frame rectangle\n const rect = new Rectangle(\n frameData.frame.x,\n frameData.frame.y,\n frameData.frame.w,\n frameData.frame.h\n );\n\n // Create the texture using the PixiJS v8 approach\n // Get the source from the atlas texture\n const source = atlasTexture.source;\n\n // Create the frame texture with the new approach\n const frameTexture = new Texture({\n source, // Use the same source as the atlas texture\n frame: rect, // The frame rectangle within the atlas\n orig: frameData.trimmed && frameData.spriteSourceSize ?\n new Rectangle(\n frameData.spriteSourceSize.x,\n frameData.spriteSourceSize.y,\n frameData.spriteSourceSize.w,\n frameData.spriteSourceSize.h\n ) : undefined,\n trim: frameData.trimmed ? rect : undefined,\n rotate: frameData.rotated ? 2 : 0 // 2 = DEGREES_90, 0 = DEGREES_0\n });\n\n // Cache the frame texture if enabled - use the original frameName as the key for consistency\n if (this.options.cacheFrameTextures) {\n this.frameTextures.set(cacheKey, frameTexture);\n\n // Track with ResourceManager if available\n if (this.resourceManager) {\n // We don't directly track frame textures as they share the base texture\n // But we could track them if needed for special cases\n }\n }\n\n return frameTexture;\n } catch (error) {\n this.log(`Error creating frame texture: ${error}`, 'error');\n return null;\n }\n }\n\n /**\n * Get a list of all frame names in an atlas\n *\n * @param atlasId - ID of the atlas\n * @returns Array of frame names, or empty array if atlas not found\n */\n getFrameNames(atlasId: string): string[] {\n const atlas = this.atlases.get(atlasId);\n if (!atlas) {\n return [];\n }\n\n return Object.keys(atlas.frames);\n }\n\n /**\n * Get a texture for an image, either from an atlas or as an individual texture\n *\n * @param imagePath - Path to the image\n * @param atlasId - Optional ID of a specific atlas to check first\n * @returns Promise resolving to the texture, or null if not found\n */\n async getTexture(imagePath: string, atlasId?: string): Promise<Texture | null> {\n // First check if we have the texture as a frame in the specified atlas or any atlas\n if (this.options.preferAtlas) {\n // Try to find the frame using the full imagePath first\n let frameTexture = this.getFrameTexture(imagePath, atlasId);\n\n // If not found and it looks like a path, extract the filename and try again\n if (!frameTexture && imagePath.includes('/')) {\n const filename = this.getFilenameFromPath(imagePath);\n frameTexture = this.getFrameTexture(filename, atlasId);\n\n if (frameTexture && this.options.debug) {\n console.log(`Using atlas frame for ${imagePath} (found using filename ${filename}) ${atlasId ? `from atlas '${atlasId}'` : ''}`);\n }\n\n return frameTexture;\n }\n\n if (frameTexture) {\n this.log(`Using atlas frame for ${imagePath} ${atlasId ? `from atlas '${atlasId}'` : ''}`);\n return frameTexture;\n }\n }\n\n // If not found in atlas or atlases are not preferred, try to load the individual image\n // Check if we already have the texture loaded\n if (this.imageTextures.has(imagePath)) {\n return this.imageTextures.get(imagePath)!;\n }\n\n // Check the loading status\n const status = this.imageStatus.get(imagePath);\n if (status === LoadStatus.Loading) {\n this.log(`Image ${imagePath} is already loading, waiting...`);\n\n // Wait for image to finish loading\n return new Promise<Texture | null>((resolve) => {\n const checkInterval = setInterval(() => {\n const currentStatus = this.imageStatus.get(imagePath);\n if (currentStatus === LoadStatus.Loaded) {\n clearInterval(checkInterval);\n resolve(this.imageTextures.get(imagePath) || null);\n } else if (currentStatus === LoadStatus.Failed) {\n clearInterval(checkInterval);\n resolve(null);\n }\n }, 100);\n });\n }\n\n // Load the image\n try {\n this.imageStatus.set(imagePath, LoadStatus.Loading);\n\n // Check if the texture is already in the Assets cache\n let texture: Texture;\n if (Assets.cache.has(imagePath)) {\n texture = Assets.cache.get(imagePath);\n } else {\n // Load the texture\n this.log(`Loading individual texture from ${imagePath}`);\n texture = await Assets.load(imagePath);\n }\n\n // Store and track the texture\n this.imageTextures.set(imagePath, texture);\n this.imageStatus.set(imagePath, LoadStatus.Loaded);\n\n // Track with ResourceManager\n if (this.resourceManager) {\n this.resourceManager.trackTexture(imagePath, texture);\n }\n\n return texture;\n } catch (error) {\n this.log(`Error loading individual texture ${imagePath}: ${error}`, 'error');\n this.imageStatus.set(imagePath, LoadStatus.Failed);\n return null;\n }\n }\n\n /**\n * Preload a set of images, preferably from atlas(es)\n *\n * @param imagePaths - Array of image paths to preload\n * @param atlasIds - Optional array of atlas IDs to search for frames\n * @param progressCallback - Optional callback for loading progress\n * @returns Promise resolving when all images are loaded\n */\n async preloadImages(\n imagePaths: string[],\n atlasIds?: string[],\n progressCallback?: (progress: number) => void\n ): Promise<void> {\n if (!imagePaths.length) {\n return;\n }\n\n let loadedCount = 0;\n const totalCount = imagePaths.length;\n\n // Function to update progress\n const updateProgress = () => {\n loadedCount++;\n if (progressCallback) {\n progressCallback(loadedCount / totalCount);\n }\n };\n\n // Process each image\n const loadPromises = imagePaths.map(async (imagePath) => {\n try {\n // Try to get the texture, optionally limiting to specified atlas IDs\n if (atlasIds && atlasIds.length > 0) {\n // Try each specified atlas in order\n for (const atlasId of atlasIds) {\n const texture = await this.getTexture(imagePath, atlasId);\n if (texture) {\n updateProgress();\n return; // Found in one of the specified atlases\n }\n }\n\n // If not found in specified atlases, try individual texture\n await this.getTexture(imagePath);\n } else {\n // No atlas IDs specified, try any atlas or individual texture\n await this.getTexture(imagePath);\n }\n\n updateProgress();\n } catch (error) {\n this.log(`Error preloading image ${imagePath}: ${error}`, 'warn');\n updateProgress();\n }\n });\n\n // Wait for all images to load\n await Promise.all(loadPromises);\n }\n\n /**\n * Unload an atlas and its resources\n *\n * @param atlasId - ID of the atlas to unload\n */\n unloadAtlas(atlasId: string): void {\n // Check if the atlas exists\n if (!this.atlases.has(atlasId)) {\n this.log(`Atlas '${atlasId}' not found, cannot unload`, 'warn');\n return;\n }\n\n try {\n // Get the atlas texture\n const atlasTexture = this.atlasTextures.get(atlasId);\n\n // Remove all frame textures for this atlas\n if (this.options.cacheFrameTextures) {\n const prefix = `${atlasId}:`;\n for (const [key] of this.frameTextures.entries()) {\n if (key.startsWith(prefix)) {\n // Do not destroy the texture as it shares the base texture with the atlas\n this.frameTextures.delete(key);\n }\n }\n }\n\n // Remove the atlas data\n this.atlases.delete(atlasId);\n\n // Remove the atlas texture\n if (atlasTexture) {\n this.atlasTextures.delete(atlasId);\n\n // Let ResourceManager handle the actual destruction\n // We don't need to call destroy here as that's handled by ResourceManager\n }\n\n // Clear the loading status\n this.atlasStatus.delete(atlasId);\n\n this.log(`Atlas '${atlasId}' unloaded`);\n } catch (error) {\n this.log(`Error unloading atlas '${atlasId}': ${error}`, 'error');\n }\n }\n\n /**\n * Unload an individual image texture\n *\n * @param imagePath - Path to the image\n */\n unloadTexture(imagePath: string): void {\n // Check if the texture exists\n if (!this.imageTextures.has(imagePath)) {\n return;\n }\n\n try {\n // Remove the texture\n this.imageTextures.delete(imagePath);\n\n // Clear the loading status\n this.imageStatus.delete(imagePath);\n\n // ResourceManager handles the actual texture destruction\n\n this.log(`Texture ${imagePath} unloaded`);\n } catch (error) {\n this.log(`Error unloading texture ${imagePath}: ${error}`, 'error');\n }\n }\n\n /**\n * Clean up all resources\n */\n dispose(): void {\n try {\n // Clear all cached data\n this.atlases.clear();\n this.atlasTextures.clear();\n this.frameTextures.clear();\n this.imageTextures.clear();\n this.atlasStatus.clear();\n this.imageStatus.clear();\n\n // ResourceManager handles actual resource destruction\n\n this.log('AtlasManager disposed');\n } catch (error) {\n this.log(`Error disposing AtlasManager: ${error}`, 'error');\n }\n }\n\n /**\n * Log a message with the appropriate level\n *\n * @param message - Message to log\n * @param level - Log level\n */\n private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n if (!this.options.debug && level === 'log') {\n return;\n }\n\n const prefix = '[AtlasManager]';\n\n switch (level) {\n case 'warn':\n console.warn(`${prefix} ${message}`);\n break;\n case 'error':\n console.error(`${prefix} ${message}`);\n break;\n default:\n console.log(`${prefix} ${message}`);\n break;\n }\n }\n}"],"names":["Assets","Rectangle","Texture"],"mappings":"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"}