From 91dd41bcdc2972c04aca0f41b720a80d75f6c4e9 Mon Sep 17 00:00:00 2001 From: SnaveSutit Date: Sat, 11 Jan 2025 13:33:46 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20Fix=20#357?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/systems/minecraft/assetManager.ts | 5 ++++ src/systems/minecraft/blockModelManager.ts | 34 ++++++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/systems/minecraft/assetManager.ts b/src/systems/minecraft/assetManager.ts index 47180f9c..3526dc27 100644 --- a/src/systems/minecraft/assetManager.ts +++ b/src/systems/minecraft/assetManager.ts @@ -121,6 +121,11 @@ export async function assetsLoaded() { }) } +export function hasAsset(path: string) { + if (!loadedAssets) throw new Error('Assets not loaded') + return !!loadedAssets[path] +} + export function getRawAsset(path: string) { if (!loadedAssets) throw new Error('Assets not loaded') diff --git a/src/systems/minecraft/blockModelManager.ts b/src/systems/minecraft/blockModelManager.ts index f1baba2a..705f1a6d 100644 --- a/src/systems/minecraft/blockModelManager.ts +++ b/src/systems/minecraft/blockModelManager.ts @@ -6,7 +6,7 @@ import { resolveBlockstateValueType, } from '../../util/minecraftUtil' import { translate } from '../../util/translation' -import { assetsLoaded, getJSONAsset, getPngAssetAsDataUrl } from './assetManager' +import { assetsLoaded, getJSONAsset, getPngAssetAsDataUrl, hasAsset } from './assetManager' import { BlockStateValue } from './blockstateManager' import { IBlockModel, @@ -366,14 +366,36 @@ async function loadTexture(textures: IBlockModel['textures'], key: string): Prom if (resourceLocation?.at(0) === '#') { return await loadTexture(textures, resourceLocation.slice(1)) } - const textureUrl = getPathFromResourceLocation(resourceLocation, 'textures') + '.png' - if (TEXTURE_CACHE.has(textureUrl)) { - return TEXTURE_CACHE.get(textureUrl)! + const texturePath = getPathFromResourceLocation(resourceLocation, 'textures') + '.png' + if (TEXTURE_CACHE.has(texturePath)) { + return TEXTURE_CACHE.get(texturePath)! } - const texture = await LOADER.loadAsync(getPngAssetAsDataUrl(textureUrl)) + let texture: THREE.Texture + if (hasAsset(texturePath + '.mcmeta')) { + console.log(`Found mcmeta for texture '${texturePath}'`) + + const img = new Image() + img.src = getPngAssetAsDataUrl(texturePath) + const canvas = document.createElement('canvas') + const ctx = canvas.getContext('2d')! + await new Promise(resolve => { + img.onload = () => { + canvas.width = img.width + canvas.height = img.width + ctx.drawImage(img, 0, 0) + resolve() + } + }) + texture = new THREE.CanvasTexture(canvas) + } else { + texture = await LOADER.loadAsync(getPngAssetAsDataUrl(texturePath)) + } + texture.magFilter = THREE.NearestFilter texture.minFilter = THREE.NearestFilter - TEXTURE_CACHE.set(textureUrl, texture) + + TEXTURE_CACHE.set(texturePath, texture) + return texture }