From 0a15fcd926cb2d5d6f31a232bfec58dec60e256b Mon Sep 17 00:00:00 2001 From: billsonnn Date: Wed, 27 Mar 2024 21:52:03 -0400 Subject: [PATCH] Update hit detection --- .../room/src/renderer/utils/ExtendedSprite.ts | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/packages/room/src/renderer/utils/ExtendedSprite.ts b/packages/room/src/renderer/utils/ExtendedSprite.ts index 1d668f2e..0eed5d3b 100644 --- a/packages/room/src/renderer/utils/ExtendedSprite.ts +++ b/packages/room/src/renderer/utils/ExtendedSprite.ts @@ -1,6 +1,8 @@ import { AlphaTolerance } from '@nitrots/api'; import { GetRenderer } from '@nitrots/utils'; -import { Point, Sprite, Texture, TextureSource } from 'pixi.js'; +import { GlRenderTarget, Point, Sprite, Texture, TextureSource, WebGLRenderer } from 'pixi.js'; + +const BYTES_PER_PIXEL = 4; export class ExtendedSprite extends Sprite { @@ -77,14 +79,31 @@ export class ExtendedSprite extends Sprite { if(!textureSource) return false; - const texture = new Texture(textureSource); - const canvas = GetRenderer().texture.generateCanvas(texture); - const ctx = canvas.getContext('2d'); - const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const width = Math.max(Math.round(textureSource.width * textureSource.resolution), 1); + const height = Math.max(Math.round(textureSource.height * textureSource.resolution), 1); + const pixels = new Uint8Array(BYTES_PER_PIXEL * width * height); + + const renderer = GetRenderer() as WebGLRenderer; + + const renderTarget = renderer.renderTarget.getRenderTarget(textureSource); + const glRenterTarget = renderer.renderTarget.getGpuRenderTarget(renderTarget) as GlRenderTarget; + + const gl = renderer.gl; + + gl.bindFramebuffer(gl.FRAMEBUFFER, glRenterTarget.resolveTargetFramebuffer); + + gl.readPixels( + 0, + 0, + width, + height, + gl.RGBA, + gl.UNSIGNED_BYTE, + pixels + ); //@ts-ignore - textureSource.hitMap = imageData.data; - texture.destroy(); + textureSource.hitMap = pixels; return true; }