From 975e9430b81986b1b8c04b38e17d25d4915d4a9f Mon Sep 17 00:00:00 2001 From: duckietm Date: Tue, 6 May 2025 14:31:28 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9A=A0=EF=B8=8F=20Beta=20-=202=20All=20Badge?= =?UTF-8?q?s=20should=20be=20fixed=20now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 3 - src/common/layout/BadgeContext.tsx | 198 ------------------ src/common/layout/LayoutBadgeImageView.tsx | 139 +++--------- src/common/layout/index.ts | 1 - .../groups/views/GroupBadgeCreatorView.tsx | 44 ++-- .../renderer/src/pixi-proxy/TextureUtils.ts | 37 ++-- 6 files changed, 79 insertions(+), 343 deletions(-) delete mode 100644 src/common/layout/BadgeContext.tsx diff --git a/src/App.tsx b/src/App.tsx index 80e2084..baf6f4c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,5 @@ import { ConfigurationEvent, GetAssetManager, HabboWebTools, LegacyExternalInterface, Nitro, NitroCommunicationDemoEvent, NitroConfiguration, NitroEvent, NitroLocalizationEvent, NitroVersion, RoomEngineEvent } from '@nitrots/nitro-renderer'; import { AnimatePresence, motion } from 'framer-motion'; -import { BadgeProvider } from './common/layout/BadgeContext'; import { Base } from './common'; import { FC, useCallback, useEffect, useState } from 'react'; import { GetCommunication, GetConfiguration, GetNitroInstance, GetUIVersion } from './api'; @@ -133,7 +132,6 @@ export const App: FC<{}> = props => return ( - { (!isReady || isError) && } @@ -144,7 +142,6 @@ export const App: FC<{}> = props => )} - ); } \ No newline at end of file diff --git a/src/common/layout/BadgeContext.tsx b/src/common/layout/BadgeContext.tsx deleted file mode 100644 index d156f9b..0000000 --- a/src/common/layout/BadgeContext.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import { BadgeImageReadyEvent, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; -import { createContext, FC, useContext, useEffect, useState } from 'react'; -import { GetSessionDataManager } from '../../api'; - -interface BadgeContextType -{ - badgeImages: Map; - requestBadge: (badgeCode: string, isGroup: boolean) => Promise; - updateBadgeImage: (badgeCode: string, image: HTMLImageElement) => void; -} - -const BadgeContext = createContext({ - badgeImages: new Map(), - requestBadge: async () => - { - console.warn('BadgeContext: Default requestBadge called - BadgeProvider not initialized'); - throw new Error('BadgeProvider not initialized - ensure BadgeProvider is wrapped around the app'); - }, - updateBadgeImage: () => - { - console.warn('BadgeContext: Default updateBadgeImage called - BadgeProvider not initialized'); - throw new Error('BadgeProvider not initialized - ensure BadgeProvider is wrapped around the app'); - }, -}); - -export const BadgeProvider: FC<{}> = ({ children }) => -{ - const [ badgeImages, setBadgeImages ] = useState>(new Map()); - - console.log('BadgeProvider: Initialized'); - - const requestBadge = async (badgeCode: string, isGroup: boolean): Promise => - { - console.log('BadgeProvider: requestBadge called', { badgeCode, isGroup }); - - if(!badgeCode || !badgeCode.length) - { - console.warn('BadgeProvider: Invalid or empty badgeCode', badgeCode); - return null; - } - - // Check if badge is already cached - const cachedImage = badgeImages.get(badgeCode); - if(cachedImage) - { - console.log('BadgeProvider: Badge loaded from cache', { badgeCode }); - return cachedImage; - } - - const maxRetries = 3; - let retryCount = 0; - - while(retryCount < maxRetries) - { - try - { - console.log('BadgeProvider: Attempting to load badge', { badgeCode, retryCount, isGroup }); - - // Check if GetSessionDataManager is ready - if(!GetSessionDataManager().events) - { - console.warn('BadgeProvider: GetSessionDataManager events not available', { badgeCode, isGroup }); - return null; - } - - // Check if badge is already in session data - let texture = isGroup ? GetSessionDataManager().getGroupBadgeImage(badgeCode) : GetSessionDataManager().getBadgeImage(badgeCode); - - if(!texture) - { - console.log('BadgeProvider: Badge not in cache, requesting', { badgeCode, isGroup }); - - // Create a Promise to wait for the BadgeImageReadyEvent - const badgePromise = new Promise>((resolve, reject) => - { - console.log('BadgeProvider: Setting up BadgeImageReadyEvent listener', { badgeCode, isGroup }); - - const onBadgeImageReadyEvent = (event: BadgeImageReadyEvent) => - { - console.log('BadgeProvider: BadgeImageReadyEvent received', { badgeCode, eventBadgeId: event.badgeId, isGroup }); - - if(event.badgeId === badgeCode) - { - resolve(event.image); - GetSessionDataManager().events.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); - } - }; - - GetSessionDataManager().events.addEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); - - // Timeout after 20 seconds to avoid hanging - setTimeout(() => - { - console.warn('BadgeProvider: Badge loading timed out', { badgeCode, retryCount, isGroup }); - GetSessionDataManager().events.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); - reject(new Error('Badge loading timed out')); - }, 20000); - }); - - // Request the badge image - console.log('BadgeProvider: Requesting badge image', { badgeCode, isGroup }); - if(isGroup) - { - GetSessionDataManager().requestGroupBadgeImage(badgeCode); - } - else - { - GetSessionDataManager().requestBadgeImage(badgeCode); - } - - // Wait for the badge image to be ready - texture = await badgePromise; - console.log('BadgeProvider: Badge image received via event', { badgeCode, texture, isGroup }); - } - else - { - console.log('BadgeProvider: Badge found in session data', { badgeCode, isGroup }); - } - - if(texture) - { - try - { - console.log('BadgeProvider: Generating image from texture', { badgeCode, isGroup }); - const sprite = new NitroSprite(texture); - const element = await TextureUtils.generateImage(sprite); - - if(element && element.src && element.src.startsWith('data:image/')) - { - setBadgeImages(prev => - { - const newMap = new Map(prev); - newMap.set(badgeCode, element); - return newMap; - }); - console.log('BadgeProvider: Badge loaded and cached', { badgeCode, isGroup }); - return element; - } - else - { - console.warn('BadgeProvider: Invalid badge image', { badgeCode, element, isGroup }); - } - } - catch(error) - { - console.warn('BadgeProvider: Error generating badge image', { error: error.message, badgeCode, isGroup }); - } - } - else - { - console.warn('BadgeProvider: Failed to load badge image', { badgeCode, isGroup }); - } - } - catch(error) - { - console.error('BadgeProvider: Error loading badge', { error: error.message, badgeCode, retryCount, isGroup }); - } - - retryCount++; - if(retryCount < maxRetries) - { - console.log('BadgeProvider: Retrying badge load', { badgeCode, retryCount, isGroup }); - await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2 seconds before retrying - } - } - - console.warn('BadgeProvider: Max retries reached, returning null', { badgeCode, maxRetries, isGroup }); - return null; - }; - - const updateBadgeImage = (badgeCode: string, image: HTMLImageElement) => - { - if(!badgeCode || !image) return; - - console.log('BadgeProvider: Updating badge image in context', { badgeCode }); - - setBadgeImages(prev => - { - const newMap = new Map(prev); - newMap.set(badgeCode, image); - return newMap; - }); - }; - - return ( - - { children } - - ); -}; - -export const useBadgeContext = () => { - const context = useContext(BadgeContext); - if(!context.requestBadge || !context.updateBadgeImage || context.requestBadge.toString().includes('Default requestBadge')) { - throw new Error('BadgeContext not initialized - ensure BadgeProvider is wrapped around the app'); - } - return context; -}; \ No newline at end of file diff --git a/src/common/layout/LayoutBadgeImageView.tsx b/src/common/layout/LayoutBadgeImageView.tsx index a7845dc..0e898ba 100644 --- a/src/common/layout/LayoutBadgeImageView.tsx +++ b/src/common/layout/LayoutBadgeImageView.tsx @@ -1,8 +1,7 @@ +import { BadgeImageReadyEvent, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; import { GetConfiguration, GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; import { Base, BaseProps } from '../Base'; -import { NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; -import { useBadgeContext } from './BadgeContext'; export interface LayoutBadgeImageViewProps extends BaseProps { @@ -18,20 +17,15 @@ export const LayoutBadgeImageView: FC = props => { const { badgeCode = null, isGroup = false, showInfo = false, customTitle = null, isGrayscale = false, scale = 1, classNames = [], style = {}, children = null, ...rest } = props; const [ imageElement, setImageElement ] = useState(null); - const [ isLoading, setIsLoading ] = useState(true); - const [ retryCount, setRetryCount ] = useState(0); - const maxRetries = 5; // Maximum number of retries - const retryInterval = 2000; // Retry every 2 seconds - const { badgeImages, requestBadge, updateBadgeImage } = useBadgeContext(); - - console.log('LayoutBadgeImageView: Rendered', { badgeCode, isGroup, badgeImagesSize: badgeImages.size }); const getClassNames = useMemo(() => { const newClassNames: string[] = [ 'badge-image' ]; if(isGroup) newClassNames.push('group-badge'); + if(isGrayscale) newClassNames.push('grayscale'); + if(classNames.length) newClassNames.push(...classNames); return newClassNames; @@ -43,14 +37,18 @@ export const LayoutBadgeImageView: FC = props => if(imageElement) { - const badgeUrl = isGroup ? imageElement.src : GetConfiguration('badge.asset.url', '').replace('%badgename%', badgeCode.toString()); - - newStyle.backgroundImage = `url(${ badgeUrl })`; + newStyle.backgroundImage = `url(${ (isGroup) ? imageElement.src : GetConfiguration('badge.asset.url').replace('%badgename%', badgeCode.toString())})`; + newStyle.width = imageElement.width; + newStyle.height = imageElement.height; if(scale !== 1) { newStyle.transform = `scale(${ scale })`; + if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; + + newStyle.width = (imageElement.width * scale); + newStyle.height = (imageElement.height * scale); } } @@ -61,111 +59,36 @@ export const LayoutBadgeImageView: FC = props => useEffect(() => { - console.log('LayoutBadgeImageView: useEffect triggered', { badgeCode, isGroup, retryCount }); + if(!badgeCode || !badgeCode.length) return; - if(!badgeCode || !badgeCode.length) + let didSetBadge = false; + + const onBadgeImageReadyEvent = (event: BadgeImageReadyEvent) => { - console.warn('LayoutBadgeImageView: Invalid or empty badgeCode', badgeCode); - setImageElement(null); - setIsLoading(false); - return; - } + if(event.badgeId !== badgeCode) return; - const loadBadgeImage = async () => - { - console.log('LayoutBadgeImageView: loadBadgeImage started', { badgeCode, retryCount, isGroup }); + TextureUtils.generateImage(new NitroSprite(event.image)).then(element => { + if (element) setImageElement(element); + }); - setIsLoading(true); + didSetBadge = true; - try - { - // Check if badge is already in context - const cachedImage = badgeImages.get(badgeCode); - if(cachedImage) - { - setImageElement(cachedImage); - setIsLoading(false); - console.log('LayoutBadgeImageView: Badge loaded from context', { badgeCode, isGroup }); - return; - } - - console.log('LayoutBadgeImageView: Requesting badge via context', { badgeCode, isGroup }); - - // Request the badge image via the context - const element = await requestBadge(badgeCode, isGroup); - - if(element) - { - setImageElement(element); - console.log('LayoutBadgeImageView: Badge loaded via request', { badgeCode, isGroup }); - } - else - { - console.warn('LayoutBadgeImageView: Failed to load badge image via context, attempting direct fetch', { badgeCode, isGroup }); - - // Fallback: Try fetching directly from session data - let texture = isGroup ? GetSessionDataManager().getGroupBadgeImage(badgeCode) : GetSessionDataManager().getBadgeImage(badgeCode); - - console.log('LayoutBadgeImageView: getGroupBadgeImage result', { badgeCode, texture: texture ? 'exists' : 'null', isGroup }); - - if(texture) - { - const sprite = new NitroSprite(texture); - const fallbackElement = await TextureUtils.generateImage(sprite); - - if(fallbackElement && fallbackElement.src && fallbackElement.src.startsWith('data:image/')) - { - setImageElement(fallbackElement); - updateBadgeImage(badgeCode, fallbackElement); - console.log('LayoutBadgeImageView: Badge loaded via direct fetch and cached in context', { badgeCode, isGroup }); - } - else - { - console.warn('LayoutBadgeImageView: Invalid badge image from direct fetch', { badgeCode, isGroup }); - } - } - else if(retryCount < maxRetries) - { - console.log('LayoutBadgeImageView: Retrying badge load', { badgeCode, retryCount, isGroup }); - setTimeout(() => - { - setRetryCount(prev => prev + 1); - }, retryInterval); - return; - } - else - { - console.warn('LayoutBadgeImageView: Max retries reached, failed to load badge', { badgeCode, maxRetries, isGroup }); - } - } - } - catch(error) - { - console.error('LayoutBadgeImageView: Error loading badge', { error: error.message, badgeCode, isGroup }); - } - finally - { - setIsLoading(false); - console.log('LayoutBadgeImageView: loadBadgeImage completed', { badgeCode, isLoading: false, isGroup }); - } + GetSessionDataManager().events.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); }; - loadBadgeImage(); - }, [ badgeCode, isGroup, badgeImages, requestBadge, retryCount, updateBadgeImage ]); + GetSessionDataManager().events.addEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); - if(isLoading) - { - console.log('LayoutBadgeImageView: Rendering loading state', { badgeCode, isGroup }); - return null; // Optionally render a loading placeholder - } + const texture = isGroup ? GetSessionDataManager().getGroupBadgeImage(badgeCode) : GetSessionDataManager().getBadgeImage(badgeCode); - if(!imageElement) - { - console.log('LayoutBadgeImageView: Rendering fallback placeholder', { badgeCode, isGroup }); - return ; // Gray square as fallback - } + if(texture && !didSetBadge) + { + TextureUtils.generateImage(new NitroSprite(texture)).then(element => { + if (element) setImageElement(element); + }); + } - console.log('LayoutBadgeImageView: Rendering badge', { badgeCode, hasImage: !!imageElement, isGroup }); + return () => GetSessionDataManager().events.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); + }, [ badgeCode, isGroup ]); return ( @@ -177,4 +100,4 @@ export const LayoutBadgeImageView: FC = props => { children } ); -}; \ No newline at end of file +} \ No newline at end of file diff --git a/src/common/layout/index.ts b/src/common/layout/index.ts index 1cfdb5d..5f3a739 100644 --- a/src/common/layout/index.ts +++ b/src/common/layout/index.ts @@ -1,4 +1,3 @@ -export * from './BadgeContext'; export * from './LayoutAvatarImageView'; export * from './LayoutBackgroundImage'; export * from './LayoutBadgeImageView'; diff --git a/src/components/groups/views/GroupBadgeCreatorView.tsx b/src/components/groups/views/GroupBadgeCreatorView.tsx index 9a807f2..2e8e130 100644 --- a/src/components/groups/views/GroupBadgeCreatorView.tsx +++ b/src/components/groups/views/GroupBadgeCreatorView.tsx @@ -1,4 +1,4 @@ -import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react'; +import React, { Dispatch, FC, SetStateAction, useEffect, useState, useMemo } from 'react'; import { FaPlus, FaTimes } from 'react-icons/fa'; import { GroupBadgePart } from '../../../api'; import { Base, Column, Flex, Grid, LayoutBadgeImageView } from '../../../common'; @@ -13,12 +13,16 @@ interface GroupBadgeCreatorViewProps const POSITIONS: number[] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]; -export const GroupBadgeCreatorView: FC = props => +// Memoize to prevent unnecessary re-renders +export const GroupBadgeCreatorView: FC = React.memo(props => { const { badgeParts = [], setBadgeParts = null, onBadgeCodeUpdate = null } = props; const [ selectedIndex, setSelectedIndex ] = useState(-1); const { groupCustomize = null } = useGroup(); + // Log re-renders to debug state changes + console.log('GroupBadgeCreatorView: Component rendered', { selectedIndex, badgePartsLength: badgeParts.length }); + const setPartProperty = (partIndex: number, property: string, value: number) => { const newBadgeParts = [ ...badgeParts ]; @@ -31,7 +35,7 @@ export const GroupBadgeCreatorView: FC = props => }; // Helper function to generate a full group badge code with all parts - const getFullBadgeCode = (index: number): string => { + const getFullBadgeCode = useMemo(() => { if (!badgeParts) return ''; let badgeCode = ''; @@ -46,22 +50,24 @@ export const GroupBadgeCreatorView: FC = props => console.log('GroupBadgeCreatorView: Computed full badge code', { badgeCode }); return badgeCode; - }; + }, [badgeParts]); // Debug the contents of badgeBases and badgeSymbols console.log('GroupBadgeCreatorView: badgeBases', groupCustomize?.badgeBases); console.log('GroupBadgeCreatorView: badgeSymbols', groupCustomize?.badgeSymbols); - // Compute the full badge code - const fullBadgeCode = getFullBadgeCode(0); - useEffect(() => { - console.log('GroupBadgeCreatorView: useEffect triggered', { fullBadgeCode, hasOnBadgeCodeUpdate: !!onBadgeCodeUpdate }); - if (onBadgeCodeUpdate && fullBadgeCode) { - console.log('GroupBadgeCreatorView: Propagating badge code to parent', { fullBadgeCode }); - onBadgeCodeUpdate(fullBadgeCode); + console.log('GroupBadgeCreatorView: useEffect triggered', { fullBadgeCode: getFullBadgeCode, hasOnBadgeCodeUpdate: !!onBadgeCodeUpdate }); + if (onBadgeCodeUpdate && getFullBadgeCode) { + console.log('GroupBadgeCreatorView: Propagating badge code to parent', { fullBadgeCode: getFullBadgeCode }); + onBadgeCodeUpdate(getFullBadgeCode); } - }, [fullBadgeCode, onBadgeCodeUpdate]); + }, [getFullBadgeCode, onBadgeCodeUpdate]); + + // Debug selectedIndex changes + useEffect(() => { + console.log('GroupBadgeCreatorView: selectedIndex changed', { selectedIndex }); + }, [selectedIndex]); // Early return after all hooks are called if (!badgeParts || !badgeParts.length) return null; @@ -70,14 +76,14 @@ export const GroupBadgeCreatorView: FC = props => <> { ((selectedIndex < 0) && badgeParts && (badgeParts.length > 0)) && badgeParts.map((part, index) => { - const badgeCode = badgeParts[index].code; - console.log('GroupBadgeCreatorView: Rendering badge part', { index, badgeCode, fullBadgeCode, part }); + const badgeCode = part.code; + console.log('GroupBadgeCreatorView: Rendering badge part', { index, badgeCode, fullBadgeCode: getFullBadgeCode, part }); return ( - + setSelectedIndex(index) }> { (badgeCode && badgeCode.length > 0) ? ( - + ) : ( @@ -114,12 +120,12 @@ export const GroupBadgeCreatorView: FC = props => console.log('GroupBadgeCreatorView: Rendering template badge', { type: badgeParts[selectedIndex].type, id: item.id, badgeCode, color: badgeParts[selectedIndex].color, position: badgeParts[selectedIndex].position, item }); return ( - setPartProperty(selectedIndex, 'key', item.id) }> - + setPartProperty(selectedIndex, 'key', item.id) }> + ); }) } } ); -}; \ No newline at end of file +}, (prevProps, nextProps) => prevProps.badgeParts === nextProps.badgeParts && prevProps.onBadgeCodeUpdate === nextProps.onBadgeCodeUpdate); \ No newline at end of file diff --git a/submodules/renderer/src/pixi-proxy/TextureUtils.ts b/submodules/renderer/src/pixi-proxy/TextureUtils.ts index d9d8465..ea5c765 100644 --- a/submodules/renderer/src/pixi-proxy/TextureUtils.ts +++ b/submodules/renderer/src/pixi-proxy/TextureUtils.ts @@ -1,8 +1,8 @@ -import { AbstractRenderer, Renderer, RenderTexture, Resource, Texture } from '@pixi/core'; +import { Renderer, RenderTexture, Texture, BaseTexture } from '@pixi/core'; import { DisplayObject } from '@pixi/display'; import { Extract } from '@pixi/extract'; import { Matrix, Rectangle } from '@pixi/math'; -import { settings } from '@pixi/settings'; +import { SCALE_MODES } from '@pixi/constants'; import { Sprite } from '@pixi/sprite'; import { PixiApplicationProxy } from './PixiApplicationProxy'; @@ -10,7 +10,7 @@ export class TextureUtils { private static _extract: Extract | null = null; - public static initialize(renderer: Renderer | AbstractRenderer): void + public static initialize(renderer: Renderer): void { if (!this._extract && renderer) { this._extract = new Extract(renderer); @@ -18,48 +18,57 @@ export class TextureUtils } } - public static async generateImage(target: DisplayObject | RenderTexture): Promise - { + public static async generateImage(target: DisplayObject | RenderTexture): Promise { if (!target) { + console.warn('generateImage: Invalid target', { target }); return null; } const extractor = this.getExtractor(); if (!extractor) { + console.warn('generateImage: Extractor not available'); return null; } try { - const image = await extractor.image(target); + if (target instanceof DisplayObject) { + const renderTexture = this.createRenderTexture(target.width, target.height); + this.writeToRenderTexture(target, renderTexture); + target = renderTexture; + } - if (!image || !image.src || typeof image.src !== 'string' || !image.src.startsWith('data:image/')) { + const image = await extractor.image(target); + console.log('generateImage: Extracted image', { src: image?.src, isValid: image?.src?.startsWith('data:image/') }); + + if (!image || !image.src || !image.src.startsWith('data:image/')) { const canvas = extractor.canvas(target); if (canvas) { const dataUrl = canvas.toDataURL('image/png'); + console.log('generateImage: Fallback canvas', { dataUrl }); if (dataUrl && dataUrl.startsWith('data:image/')) { const fallbackImage = new Image(); fallbackImage.src = dataUrl; return fallbackImage; } } + console.warn('generateImage: Failed to generate valid image', { target }); const fallback = new Image(); fallback.src = ''; return fallback; } return image; } catch (error) { + console.error('generateImage: Error extracting image', { error: error.message, target }); const fallback = new Image(); fallback.src = ''; return fallback; } } - public static generateTexture(displayObject: DisplayObject, region: Rectangle = null, scaleMode: number = null, resolution: number = 1): RenderTexture + public static generateTexture(displayObject: DisplayObject, region: Rectangle = null, scaleMode: SCALE_MODES = SCALE_MODES.LINEAR, resolution: number = 1): RenderTexture { if (!displayObject) return null; - if (scaleMode === null) scaleMode = settings.SCALE_MODE; - return this.getRenderer().generateTexture(displayObject, { scaleMode, resolution, @@ -67,7 +76,7 @@ export class TextureUtils }); } - public static generateTextureFromImage(image: HTMLImageElement): Texture + public static generateTextureFromImage(image: HTMLImageElement): Texture { if (!image) return null; @@ -140,7 +149,7 @@ export class TextureUtils }); } - public static createAndFillRenderTexture(width: number, height: number, color: number = 16777215): RenderTexture + public static createAndFillRenderTexture(width: number, height: number, color: number = 0xFFFFFF): RenderTexture { if (width < 0 || height < 0) return null; @@ -158,7 +167,7 @@ export class TextureUtils return this.writeToRenderTexture(displayObject, renderTexture, true, transform); } - public static clearAndFillRenderTexture(renderTexture: RenderTexture, color: number = 16777215): RenderTexture + public static clearAndFillRenderTexture(renderTexture: RenderTexture, color: number = 0xFFFFFF): RenderTexture { if (!renderTexture) return null; @@ -194,7 +203,7 @@ export class TextureUtils return extractor.pixels(displayObject, frame); } - public static getRenderer(): Renderer | AbstractRenderer + public static getRenderer(): Renderer { const renderer = PixiApplicationProxy.instance.renderer; if (!renderer) {