diff --git a/renderer/playground/scenes/allEntities.ts b/renderer/playground/scenes/allEntities.ts index 68714cf8..281af807 100644 --- a/renderer/playground/scenes/allEntities.ts +++ b/renderer/playground/scenes/allEntities.ts @@ -1,6 +1,6 @@ -//@ts-nocheck import { BasePlaygroundScene } from '../baseScene' import { EntityDebugFlags, EntityMesh, rendererSpecialHandled } from '../../viewer/three/entity/EntityMesh' +import { displayEntitiesDebugList } from '../allEntitiesDebug' export default class AllEntities extends BasePlaygroundScene { continuousRender = false @@ -8,159 +8,6 @@ export default class AllEntities extends BasePlaygroundScene { async initData () { await super.initData() - - // Create results container - const container = document.createElement('div') - container.style.cssText = ` - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - max-height: 90vh; - overflow-y: auto; - background: rgba(0,0,0,0.8); - color: white; - padding: 20px; - border-radius: 8px; - font-family: monospace; - min-width: 400px; - ` - document.body.appendChild(container) - - // Add title - const title = document.createElement('h2') - title.textContent = 'Minecraft Entity Support' - title.style.cssText = 'margin-top: 0; text-align: center;' - container.appendChild(title) - - // Test entities - const results: Array<{ - entity: string; - supported: boolean; - type?: 'obj' | 'bedrock'; - mappedFrom?: string; - textureMap?: boolean; - errors?: string[]; - }> = [] - const { mcData } = window - const entityNames = Object.keys(mcData.entitiesArray.reduce((acc, entity) => { - acc[entity.name] = true - return acc - }, {})) - - // Add loading indicator - const loading = document.createElement('div') - loading.textContent = 'Testing entities...' - loading.style.textAlign = 'center' - container.appendChild(loading) - - for (const entity of entityNames) { - const debugFlags: EntityDebugFlags = {} - - try { - // eslint-disable-next-line no-new - new EntityMesh(this.version, entity, viewer.world, {}, debugFlags) - - results.push({ - entity, - supported: !!debugFlags.type || rendererSpecialHandled.includes(entity), - type: debugFlags.type, - mappedFrom: debugFlags.tempMap, - textureMap: debugFlags.textureMap, - errors: debugFlags.errors - }) - } catch (e) { - console.error(e) - results.push({ - entity, - supported: false, - mappedFrom: debugFlags.tempMap - }) - } - } - - // Remove loading indicator - loading.remove() - - const createSection = (title: string, items: any[], filter: (item: any) => boolean) => { - const section = document.createElement('div') - section.style.marginBottom = '20px' - - const sectionTitle = document.createElement('h3') - sectionTitle.textContent = title - sectionTitle.style.textAlign = 'center' - section.appendChild(sectionTitle) - - const list = document.createElement('ul') - list.style.cssText = 'padding-left: 20px; list-style-type: none; margin: 0;' - - const filteredItems = items.filter(filter) - for (const item of filteredItems) { - const listItem = document.createElement('li') - listItem.style.cssText = 'line-height: 1.4; margin: 8px 0;' - - const entityName = document.createElement('strong') - entityName.style.cssText = 'user-select: text;-webkit-user-select: text;' - entityName.textContent = item.entity - listItem.appendChild(entityName) - - let text = '' - if (item.mappedFrom) { - text += ` -> ${item.mappedFrom}` - } - if (item.type) { - text += ` - ${item.type}` - } - if (item.textureMap) { - text += ' ⚠️' - } - if (item.errors) { - text += ' ❌' - } - - listItem.appendChild(document.createTextNode(text)) - list.appendChild(listItem) - } - - section.appendChild(list) - return { section, count: filteredItems.length } - } - - // Sort results - bedrock first - results.sort((a, b) => { - if (a.type === 'bedrock' && b.type !== 'bedrock') return -1 - if (a.type !== 'bedrock' && b.type === 'bedrock') return 1 - return a.entity.localeCompare(b.entity) - }) - - // Add sections - const sections = [ - { - title: '❌ Unsupported Entities', - filter: (r: any) => !r.supported && !r.mappedFrom - }, - { - title: '⚠️ Partially Supported Entities', - filter: (r: any) => r.mappedFrom - }, - { - title: '✅ Supported Entities', - filter: (r: any) => r.supported && !r.mappedFrom - } - ] - - for (const { title, filter } of sections) { - const { section, count } = createSection(title, results, filter) - if (count > 0) { - container.appendChild(section) - } - } - - // log object with errors per entity - const errors = results.filter(r => r.errors).map(r => ({ - entity: r.entity, - errors: r.errors - })) - console.log(errors) + displayEntitiesDebugList(this.version) } } diff --git a/renderer/viewer/three/entities.ts b/renderer/viewer/three/entities.ts index 38b482f2..04357c2c 100644 --- a/renderer/viewer/three/entities.ts +++ b/renderer/viewer/three/entities.ts @@ -1089,6 +1089,14 @@ export class Entities { }) } } + + raycastScene () { + // return any object from scene. raycast from camera + const raycaster = new THREE.Raycaster() + raycaster.setFromCamera(new THREE.Vector2(0, 0), this.worldRenderer.camera) + const intersects = raycaster.intersectObjects(this.worldRenderer.scene.children) + return intersects[0]?.object + } } function getGeneralEntitiesMetadata (entity: { name; metadata }): Partial> { @@ -1187,12 +1195,6 @@ function addArmorModel (worldRenderer: WorldRendererThree, entityMesh: THREE.Obj group.name = `armor_${slotType}${overlay ? '_overlay' : ''}` group.add(mesh) - const skeletonHelper = new THREE.SkeletonHelper(mesh) - //@ts-expect-error - skeletonHelper.material.linewidth = 2 - skeletonHelper.visible = false - group.add(skeletonHelper) - entityMesh.add(mesh) } diff --git a/renderer/viewer/three/graphicsBackend.ts b/renderer/viewer/three/graphicsBackend.ts index 14534d40..6ac068d7 100644 --- a/renderer/viewer/three/graphicsBackend.ts +++ b/renderer/viewer/three/graphicsBackend.ts @@ -3,6 +3,8 @@ import { Vec3 } from 'vec3' import { GraphicsBackendLoader, GraphicsBackend, GraphicsInitOptions, DisplayWorldOptions } from '../../../src/appViewer' import { ProgressReporter } from '../../../src/core/progressReporter' import { showNotification } from '../../../src/react/NotificationProvider' +import { displayEntitiesDebugList } from '../../playground/allEntitiesDebug' +import supportedVersions from '../../../src/supportedVersions.mjs' import { WorldRendererThree } from './worldrendererThree' import { DocumentRenderer } from './documentRenderer' import { PanoramaRenderer } from './panorama' @@ -55,6 +57,15 @@ const createGraphicsBackend: GraphicsBackendLoader = (initOptions: GraphicsInitO const startPanorama = async () => { if (worldRenderer) return + const qs = new URLSearchParams(window.location.search) + if (qs.get('debugEntities')) { + initOptions.resourcesManager.currentConfig = { version: qs.get('version') || supportedVersions.at(-1)!, noInventoryGui: true } + await initOptions.resourcesManager.updateAssetsData({ }) + + displayEntitiesDebugList(initOptions.resourcesManager.currentConfig.version) + return + } + if (!panoramaRenderer) { panoramaRenderer = new PanoramaRenderer(documentRenderer, initOptions, !!process.env.SINGLE_FILE_BUILD_MODE) window.panoramaRenderer = panoramaRenderer