Skip to content

Commit a09cd7d

Browse files
authored
fix: Nametag & sign text fixes (#391)
1 parent 39aca17 commit a09cd7d

File tree

15 files changed

+301
-234
lines changed

15 files changed

+301
-234
lines changed

experiments/three.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as THREE from 'three'
2-
import { loadThreeJsTextureFromBitmap } from '../renderer/viewer/lib/utils/skins'
32

43
// Create scene, camera and renderer
54
const scene = new THREE.Scene()

renderer/viewer/lib/renderUtils.js

Lines changed: 0 additions & 11 deletions
This file was deleted.

renderer/viewer/lib/utils.ts

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,3 @@
1-
import * as THREE from 'three'
2-
import { loadThreeJsTextureFromUrl, loadThreeJsTextureFromUrlSync } from './utils/skins'
3-
4-
let textureCache: Record<string, THREE.Texture> = {}
5-
let imagesPromises: Record<string, Promise<THREE.Texture>> = {}
6-
7-
export async function loadTexture (texture: string, cb: (texture: THREE.Texture) => void, onLoad?: () => void): Promise<void> {
8-
const cached = textureCache[texture]
9-
if (!cached) {
10-
const { promise, resolve } = Promise.withResolvers<THREE.Texture>()
11-
const t = loadThreeJsTextureFromUrlSync(texture)
12-
textureCache[texture] = t.texture
13-
void t.promise.then(resolve)
14-
imagesPromises[texture] = promise
15-
}
16-
17-
cb(textureCache[texture])
18-
void imagesPromises[texture].then(() => {
19-
onLoad?.()
20-
})
21-
}
22-
23-
export const clearTextureCache = () => {
24-
textureCache = {}
25-
imagesPromises = {}
26-
}
27-
281
export const loadScript = async function (scriptSrc: string, highPriority = true): Promise<HTMLScriptElement> {
292
const existingScript = document.querySelector<HTMLScriptElement>(`script[src="${scriptSrc}"]`)
303
if (existingScript) {
@@ -52,3 +25,33 @@ export const loadScript = async function (scriptSrc: string, highPriority = true
5225
document.head.appendChild(scriptElement)
5326
})
5427
}
28+
29+
const detectFullOffscreenCanvasSupport = () => {
30+
if (typeof OffscreenCanvas === 'undefined') return false
31+
try {
32+
const canvas = new OffscreenCanvas(1, 1)
33+
// Try to get a WebGL context - this will fail on iOS where only 2D is supported (iOS 16)
34+
const gl = canvas.getContext('webgl2') || canvas.getContext('webgl')
35+
return gl !== null
36+
} catch (e) {
37+
return false
38+
}
39+
}
40+
41+
const hasFullOffscreenCanvasSupport = detectFullOffscreenCanvasSupport()
42+
43+
export const createCanvas = (width: number, height: number): OffscreenCanvas => {
44+
if (hasFullOffscreenCanvasSupport) {
45+
return new OffscreenCanvas(width, height)
46+
}
47+
const canvas = document.createElement('canvas')
48+
canvas.width = width
49+
canvas.height = height
50+
return canvas as unknown as OffscreenCanvas // todo-low
51+
}
52+
53+
export async function loadImageFromUrl (imageUrl: string): Promise<ImageBitmap> {
54+
const response = await fetch(imageUrl)
55+
const blob = await response.blob()
56+
return createImageBitmap(blob)
57+
}

renderer/viewer/lib/utils/skins.ts

Lines changed: 2 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,7 @@
11
import { loadSkinToCanvas } from 'skinview-utils'
2-
import * as THREE from 'three'
3-
import stevePng from 'mc-assets/dist/other-textures/latest/entity/player/wide/steve.png'
4-
import { getLoadedImage } from 'mc-assets/dist/utils'
2+
import { createCanvas, loadImageFromUrl } from '../utils'
53

6-
const detectFullOffscreenCanvasSupport = () => {
7-
if (typeof OffscreenCanvas === 'undefined') return false
8-
try {
9-
const canvas = new OffscreenCanvas(1, 1)
10-
// Try to get a WebGL context - this will fail on iOS where only 2D is supported (iOS 16)
11-
const gl = canvas.getContext('webgl2') || canvas.getContext('webgl')
12-
return gl !== null
13-
} catch (e) {
14-
return false
15-
}
16-
}
17-
18-
const hasFullOffscreenCanvasSupport = detectFullOffscreenCanvasSupport()
19-
20-
export const loadThreeJsTextureFromUrlSync = (imageUrl: string) => {
21-
const texture = new THREE.Texture()
22-
const promise = getLoadedImage(imageUrl).then(image => {
23-
texture.image = image
24-
texture.needsUpdate = true
25-
return texture
26-
})
27-
return {
28-
texture,
29-
promise
30-
}
31-
}
32-
33-
export const createCanvas = (width: number, height: number): OffscreenCanvas => {
34-
if (hasFullOffscreenCanvasSupport) {
35-
return new OffscreenCanvas(width, height)
36-
}
37-
const canvas = document.createElement('canvas')
38-
canvas.width = width
39-
canvas.height = height
40-
return canvas as unknown as OffscreenCanvas // todo-low
41-
}
42-
43-
export const loadThreeJsTextureFromUrl = async (imageUrl: string) => {
44-
const loaded = new THREE.TextureLoader().loadAsync(imageUrl)
45-
return loaded
46-
}
47-
export const loadThreeJsTextureFromBitmap = (image: ImageBitmap) => {
48-
const canvas = createCanvas(image.width, image.height)
49-
const ctx = canvas.getContext('2d')!
50-
ctx.drawImage(image, 0, 0)
51-
const texture = new THREE.Texture(canvas)
52-
texture.magFilter = THREE.NearestFilter
53-
texture.minFilter = THREE.NearestFilter
54-
return texture
55-
}
56-
57-
export const stevePngUrl = stevePng
58-
export const steveTexture = loadThreeJsTextureFromUrl(stevePngUrl)
59-
60-
61-
export async function loadImageFromUrl (imageUrl: string): Promise<ImageBitmap> {
62-
const response = await fetch(imageUrl)
63-
const blob = await response.blob()
64-
return createImageBitmap(blob)
65-
}
4+
export { default as stevePngUrl } from 'mc-assets/dist/other-textures/latest/entity/player/wide/steve.png'
665

676
const config = {
687
apiEnabled: true,

0 commit comments

Comments
 (0)