@metav_xly/decal-loader
Version:
Three.js 贴花加载器,支持纹理管理和贴花配置加载
290 lines (213 loc) • 5.46 kB
Markdown
# @metav_xly/decal-loader
基于 Three.js 的贴花加载器,支持纹理管理和贴花配置加载。
## 功能特性
- 🎨 **纹理管理**: 统一管理漫反射和法线贴图
- 📦 **贴花加载**: 支持从配置文件批量加载贴花
- 🔧 **材质定制**: 支持自定义材质构造函数
- 📝 **日志系统**: 内置模块化日志管理
- 🎯 **TypeScript**: 完整的类型定义支持
## 安装
```bash
npm install @metav_xly/decal-loader
# 或
pnpm add @metav_xly/decal-loader
# 或
yarn add @metav_xly/decal-loader
```
## 快速开始
```typescript
import * as THREE from 'three'
import { DecalLoader, TextureManager } from '@metav_xly/decal-loader'
// 1. 配置纹理
const textureConfigs = [
{
label: 'metal',
diffuseUrl: '/textures/metal_diffuse.jpg',
normalUrl: '/textures/metal_normal.jpg'
},
{
label: 'wood',
diffuseUrl: '/textures/wood_diffuse.jpg',
normalUrl: '/textures/wood_normal.jpg'
}
]
// 2. 创建贴花加载器
const decalLoader = new DecalLoader(textureConfigs)
// 3. 等待纹理加载完成
await decalLoader.textureManager.loadTextures()
// 4. 加载贴花配置
const config = {
version: '1.0.0',
decals: [
{
id: 1,
position: { x: 0, y: 0, z: 1 },
orientation: { x: 0, y: 0, z: 0 },
scale: 2,
textureType: 'metal',
normalScale: 1.0,
targetName: 'mesh'
}
]
}
const decalMeshes = decalLoader.loadConfig(config, targetMesh)
```
## API 文档
### DecalLoader
贴花加载器主类,负责从配置文件加载贴花。
#### 构造函数
```typescript
constructor(
textureConfigs: TextureConfig[],
materialConstructor?: MaterialConstructor
)
```
- `textureConfigs`: 纹理配置数组
- `materialConstructor`: 可选的自定义材质构造函数
#### 方法
##### loadConfig(config, targetMesh)
从配置对象加载贴花到目标网格。
```typescript
loadConfig(config: DecalConfig, targetMesh: THREE.Object3D): THREE.Mesh[]
```
- `config`: 贴花配置对象
- `targetMesh`: 目标网格对象
- 返回: 创建的贴花网格数组
##### validateConfig(config)
验证配置对象的有效性。
```typescript
validateConfig(config: any): config is DecalConfig
```
### TextureManager
纹理管理器,负责纹理加载和材质创建。
#### 构造函数
```typescript
constructor(
textureConfigs: TextureConfig[],
materialConstructor?: MaterialConstructor
)
```
#### 方法
##### loadTextures()
异步加载所有配置的纹理。
```typescript
async loadTextures(): Promise<void>
```
##### isReady()
检查纹理是否已加载完成。
```typescript
isReady(): boolean
```
##### getMaterial(index)
获取指定索引的材质。
```typescript
getMaterial(index: number): THREE.Material | null
```
##### cloneMaterial(index)
克隆指定索引的材质。
```typescript
cloneMaterial(index: number): THREE.Material | null
```
### Logger
模块化日志管理器。
#### 使用方法
```typescript
import { createModuleLogger, LogLevel } from '@metav_xly/decal-loader'
// 创建模块日志器
const logger = createModuleLogger('MyModule')
// 使用日志
logger.debug('调试信息')
logger.info('普通信息')
logger.warn('警告信息')
logger.error('错误信息')
// 设置日志级别
import { logger as globalLogger } from '@metav_xly/decal-loader'
globalLogger.setLogLevel(LogLevel.WARN)
```
## 类型定义
### TextureConfig
```typescript
interface TextureConfig {
label: string // 纹理标签
diffuseUrl?: string // 漫反射贴图 URL
normalUrl?: string // 法线贴图 URL
}
```
### DecalData
```typescript
interface DecalData {
id: number
position: { x: number; y: number; z: number }
orientation: { x: number; y: number; z: number }
scale: number
textureType: string
normalScale?: number
targetName: string
}
```
### DecalConfig
```typescript
interface DecalConfig {
version: string
decals: DecalData[]
}
```
### MaterialConstructor
```typescript
type MaterialConstructor = (
textureSet: TextureSet,
index: number
) => THREE.Material
```
## 高级用法
### 自定义材质构造函数
```typescript
const customMaterialConstructor = (textureSet, index) => {
const material = new THREE.MeshStandardMaterial({
map: textureSet.diffuse,
normalMap: textureSet.normal,
metalness: 0.5,
roughness: 0.3
})
return material
}
const decalLoader = new DecalLoader(
textureConfigs,
customMaterialConstructor
)
```
### 批量加载贴花
```typescript
// 从 JSON 文件加载配置
fetch('/decals/config.json')
.then(response => response.json())
.then(config => {
if (decalLoader.validateConfig(config)) {
const decalMeshes = decalLoader.loadConfig(config, targetMesh)
console.log(`成功加载 ${decalMeshes.length} 个贴花`)
}
})
```
### 动态纹理管理
```typescript
const textureManager = new TextureManager(textureConfigs)
// 等待纹理加载
await textureManager.loadTextures()
// 检查加载状态
if (textureManager.isReady()) {
// 获取材质
const material = textureManager.getMaterial(0)
// 克隆材质用于不同的贴花
const clonedMaterial = textureManager.cloneMaterial(0)
}
```
## 许可证
MIT License
## 贡献
欢迎提交 Issue 和 Pull Request!
## 更新日志
### 1.0.0
- 初始版本发布
- 支持基础的贴花加载功能
- 集成纹理管理器
- 提供完整的 TypeScript 类型定义