refactor: move missing texture into context

This commit is contained in:
trafficlunar 2024-12-24 20:12:03 +00:00
parent 324f9569ce
commit 78b762a361
4 changed files with 17 additions and 11 deletions

View file

@ -1,17 +1,17 @@
/* eslint-disable react-hooks/exhaustive-deps */
import { useEffect, useRef } from "react"; import { useEffect, useRef } from "react";
import * as PIXI from "pixi.js"; import * as PIXI from "pixi.js";
import { useApp } from "@pixi/react"; import { useApp } from "@pixi/react";
import { CompositeTilemap, settings } from "@pixi/tilemap"; import { CompositeTilemap, settings } from "@pixi/tilemap";
import constants from "@/constants";
import _blockData from "@/data/blocks/programmer-art/data.json"; import _blockData from "@/data/blocks/programmer-art/data.json";
const blockData: BlockData = _blockData; const blockData: BlockData = _blockData;
interface Props { interface Props {
blocks: Block[]; blocks: Block[];
setBlocks: React.Dispatch<React.SetStateAction<Block[]>>; setBlocks: React.Dispatch<React.SetStateAction<Block[]>>;
missingTexture: PIXI.Texture | undefined;
textures: Record<string, PIXI.Texture>; textures: Record<string, PIXI.Texture>;
solidTextures: Record<string, PIXI.Texture>; solidTextures: Record<string, PIXI.Texture>;
image: HTMLImageElement | undefined; image: HTMLImageElement | undefined;
@ -24,7 +24,7 @@ interface Props {
// Lifts 16,000 tiles limit // Lifts 16,000 tiles limit
settings.use32bitIndex = true; settings.use32bitIndex = true;
function Blocks({ blocks, setBlocks, textures, solidTextures, image, imageDimensions, coords, scale, setLoading }: Props) { function Blocks({ blocks, setBlocks, missingTexture, textures, solidTextures, image, imageDimensions, coords, scale, setLoading }: Props) {
const app = useApp(); const app = useApp();
const tilemapRef = useRef<CompositeTilemap>(); const tilemapRef = useRef<CompositeTilemap>();
@ -36,11 +36,11 @@ function Blocks({ blocks, setBlocks, textures, solidTextures, image, imageDimens
// Tile solid colors at smaller scales // Tile solid colors at smaller scales
if (scale >= 0.5) { if (scale >= 0.5) {
blocks.forEach((block) => { blocks.forEach((block) => {
tilemap.tile(textures[`${block.name}.png`] ?? constants.MISSING_TEXTURE, block.x * 16, block.y * 16); tilemap.tile(textures[`${block.name}.png`] ?? missingTexture, block.x * 16, block.y * 16);
}); });
} else { } else {
blocks.forEach((block) => { blocks.forEach((block) => {
tilemap.tile(solidTextures[`${block.name}`] ?? constants.MISSING_TEXTURE, block.x * 16, block.y * 16); tilemap.tile(solidTextures[`${block.name}`] ?? missingTexture, block.x * 16, block.y * 16);
}); });
} }
}; };

View file

@ -28,7 +28,7 @@ function Canvas() {
const { image, imageDimensions } = useContext(ImageContext); const { image, imageDimensions } = useContext(ImageContext);
const { setLoading } = useContext(LoadingContext); const { setLoading } = useContext(LoadingContext);
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const { textures, solidTextures } = useContext(TexturesContext); const { missingTexture, textures, solidTextures } = useContext(TexturesContext);
const { tool, selectedBlock, cssCursor, setTool, setCssCursor } = useContext(ToolContext); const { tool, selectedBlock, cssCursor, setTool, setCssCursor } = useContext(ToolContext);
const stageContainerRef = useRef<HTMLDivElement>(null); const stageContainerRef = useRef<HTMLDivElement>(null);
@ -249,6 +249,7 @@ function Canvas() {
<Blocks <Blocks
blocks={visibleBlocks} blocks={visibleBlocks}
setBlocks={setBlocks} setBlocks={setBlocks}
missingTexture={missingTexture}
textures={textures} textures={textures}
solidTextures={solidTextures} solidTextures={solidTextures}
image={image} image={image}

View file

@ -1,4 +0,0 @@
export default {
MISSING_TEXTURE:
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVR42mPABX4w/MCKaKJhVMPgcOuoBgDZRfgBVl5QdQAAAABJRU5ErkJggg==",
};

View file

@ -12,6 +12,7 @@ interface Props {
} }
export const TexturesContext = createContext({ export const TexturesContext = createContext({
missingTexture: {} as PIXI.Texture | undefined,
textures: {} as Record<string, PIXI.Texture>, textures: {} as Record<string, PIXI.Texture>,
solidTextures: {} as Record<string, PIXI.Texture>, solidTextures: {} as Record<string, PIXI.Texture>,
}); });
@ -19,10 +20,18 @@ export const TexturesContext = createContext({
export const TexturesProvider = ({ children }: Props) => { export const TexturesProvider = ({ children }: Props) => {
const { setLoading } = useContext(LoadingContext); const { setLoading } = useContext(LoadingContext);
const [missingTexture, setMissingTexture] = useState<PIXI.Texture>();
const [textures, setTextures] = useState<Record<string, PIXI.Texture>>({}); const [textures, setTextures] = useState<Record<string, PIXI.Texture>>({});
const [solidTextures, setSolidTextures] = useState<Record<string, PIXI.Texture>>({}); const [solidTextures, setSolidTextures] = useState<Record<string, PIXI.Texture>>({});
useEffect(() => { useEffect(() => {
// Load missing texture
const baseTexture = new PIXI.BaseTexture(
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVR42mPABX4w/MCKaKJhVMPgcOuoBgDZRfgBVl5QdQAAAABJRU5ErkJggg=="
);
setMissingTexture(new PIXI.Texture(baseTexture));
// Load textures
const sheet = new PIXI.Spritesheet(PIXI.BaseTexture.from("/blocks/programmer-art/spritesheet.png"), spritesheet); const sheet = new PIXI.Spritesheet(PIXI.BaseTexture.from("/blocks/programmer-art/spritesheet.png"), spritesheet);
sheet.parse().then((t) => { sheet.parse().then((t) => {
setTextures(t); setTextures(t);
@ -54,5 +63,5 @@ export const TexturesProvider = ({ children }: Props) => {
setLoading(false); setLoading(false);
}, []); }, []);
return <TexturesContext.Provider value={{ textures, solidTextures }}>{children}</TexturesContext.Provider>; return <TexturesContext.Provider value={{ missingTexture, textures, solidTextures }}>{children}</TexturesContext.Provider>;
}; };