116 lines
3.9 KiB
TypeScript
116 lines
3.9 KiB
TypeScript
|
|
/**
|
||
|
|
* Mesh3D Runtime Module - Plugin for 3D mesh rendering.
|
||
|
|
* Mesh3D 运行时模块 - 3D 网格渲染插件。
|
||
|
|
*/
|
||
|
|
|
||
|
|
import type { IComponentRegistry, IScene } from '@esengine/ecs-framework';
|
||
|
|
import type { IRuntimeModule, IRuntimePlugin, ModuleManifest, SystemContext } from '@esengine/engine-core';
|
||
|
|
import { EngineBridgeToken } from '@esengine/ecs-engine-bindgen';
|
||
|
|
import { AssetManagerToken } from '@esengine/asset-system';
|
||
|
|
import { MeshComponent } from './MeshComponent';
|
||
|
|
import { Animation3DComponent } from './Animation3DComponent';
|
||
|
|
import { SkeletonComponent } from './SkeletonComponent';
|
||
|
|
import { MeshRenderSystem } from './systems/MeshRenderSystem';
|
||
|
|
import { MeshAssetLoaderSystem } from './systems/MeshAssetLoaderSystem';
|
||
|
|
import { Animation3DSystem } from './systems/Animation3DSystem';
|
||
|
|
import { SkeletonBakingSystem } from './systems/SkeletonBakingSystem';
|
||
|
|
import { MeshRenderSystemToken } from './tokens';
|
||
|
|
|
||
|
|
export type { SystemContext, ModuleManifest, IRuntimeModule, IRuntimePlugin };
|
||
|
|
|
||
|
|
// Re-export tokens
|
||
|
|
// 重新导出令牌
|
||
|
|
export { MeshRenderSystemToken } from './tokens';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Runtime module for 3D mesh rendering.
|
||
|
|
* 3D 网格渲染的运行时模块。
|
||
|
|
*/
|
||
|
|
class Mesh3DRuntimeModule implements IRuntimeModule {
|
||
|
|
registerComponents(registry: IComponentRegistry): void {
|
||
|
|
registry.register(MeshComponent);
|
||
|
|
registry.register(Animation3DComponent);
|
||
|
|
registry.register(SkeletonComponent);
|
||
|
|
}
|
||
|
|
|
||
|
|
createSystems(scene: IScene, context: SystemContext): void {
|
||
|
|
// Get engine bridge from services
|
||
|
|
// 从服务获取引擎桥接
|
||
|
|
const bridge = context.services.get(EngineBridgeToken) ?? null;
|
||
|
|
if (!bridge) {
|
||
|
|
console.warn('[Mesh3D] EngineBridge not found, MeshRenderSystem will be disabled');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get asset manager
|
||
|
|
// 获取资产管理器
|
||
|
|
const assetManager = context.services.get(AssetManagerToken);
|
||
|
|
|
||
|
|
// Create asset loader system
|
||
|
|
// 创建资产加载器系统
|
||
|
|
const loaderSystem = new MeshAssetLoaderSystem();
|
||
|
|
if (assetManager) {
|
||
|
|
loaderSystem.setAssetManager(assetManager);
|
||
|
|
} else {
|
||
|
|
console.warn('[Mesh3D] AssetManager not found, mesh loading will be disabled');
|
||
|
|
}
|
||
|
|
scene.addSystem(loaderSystem);
|
||
|
|
|
||
|
|
// Create animation system (runs before rendering to update bone transforms)
|
||
|
|
// 创建动画系统(在渲染前运行以更新骨骼变换)
|
||
|
|
const animationSystem = new Animation3DSystem();
|
||
|
|
scene.addSystem(animationSystem);
|
||
|
|
|
||
|
|
// Create skeleton baking system (computes final bone matrices)
|
||
|
|
// 创建骨骼烘焙系统(计算最终骨骼矩阵)
|
||
|
|
const skeletonSystem = new SkeletonBakingSystem();
|
||
|
|
scene.addSystem(skeletonSystem);
|
||
|
|
|
||
|
|
// Create render system with bridge
|
||
|
|
// 使用桥接创建渲染系统
|
||
|
|
const renderSystem = new MeshRenderSystem(bridge);
|
||
|
|
|
||
|
|
// Add to scene
|
||
|
|
// 添加到场景
|
||
|
|
scene.addSystem(renderSystem);
|
||
|
|
|
||
|
|
// Register service
|
||
|
|
// 注册服务
|
||
|
|
context.services.register(MeshRenderSystemToken, renderSystem);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Module manifest.
|
||
|
|
* 模块清单。
|
||
|
|
*/
|
||
|
|
const manifest: ModuleManifest = {
|
||
|
|
id: 'mesh-3d',
|
||
|
|
name: '@esengine/mesh-3d',
|
||
|
|
displayName: 'Mesh 3D',
|
||
|
|
version: '1.0.0',
|
||
|
|
description: '3D mesh rendering with GLTF/GLB support',
|
||
|
|
category: 'Rendering',
|
||
|
|
icon: 'Box',
|
||
|
|
isCore: false,
|
||
|
|
defaultEnabled: true,
|
||
|
|
isEngineModule: true,
|
||
|
|
canContainContent: true,
|
||
|
|
dependencies: ['core', 'math', 'asset-system'],
|
||
|
|
exports: {
|
||
|
|
components: ['MeshComponent', 'Animation3DComponent', 'SkeletonComponent']
|
||
|
|
},
|
||
|
|
editorPackage: '@esengine/mesh-3d-editor',
|
||
|
|
requiresWasm: true
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Mesh3D Plugin export.
|
||
|
|
* Mesh3D 插件导出。
|
||
|
|
*/
|
||
|
|
export const Mesh3DPlugin: IRuntimePlugin = {
|
||
|
|
manifest,
|
||
|
|
runtimeModule: new Mesh3DRuntimeModule()
|
||
|
|
};
|
||
|
|
|
||
|
|
export { Mesh3DRuntimeModule };
|