space-game/docs/BLENDER_EXPORT.md
Michael Mainguy 146ffccd3d
All checks were successful
Build / build (push) Successful in 1m18s
Add Blender export tooling and refactor asset structure
## Blender Export Utilities
- Add blenderExporter utility with ESM support (tsx)
- Create CLI script for exporting .blend files to GLB
- Add npm scripts: export-blend, export-blend:watch, export-blend:batch
- Support watch mode, batch export, and Draco compression
- Complete documentation in docs/BLENDER_EXPORT.md
- Add loadAsset utility helper

## Asset Structure Reorganization
- Move models to themeable structure: public/assets/themes/default/models/
- Add themes/ directory with source .blend files
- Remove old model files from public/ root
- Consolidate to asteroid.glb, base.glb, ship.glb

## Level Configuration Improvements
- Make startBase optional in LevelConfig interface
- Update LevelGenerator to not generate startBase data by default
- Update LevelDeserializer to handle optional startBase
- Update Level1 to handle null startBase
- Fix levelEditor to remove startBase generation references
- Update validation to treat startBase as optional

## Dependencies
- Add tsx for ESM TypeScript execution
- Add @types/node for Node.js types
- Update package-lock.json

This enables modding support with themeable assets and simplifies
level generation by making base stations optional.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 12:25:34 -06:00

230 lines
5.8 KiB
Markdown

# Blender Export Utility
Automated export of Blender `.blend` files to GLB format using Blender's command-line interface.
## Installation
First, install the required dependencies:
```bash
npm install
```
This will install `tsx` and `@types/node` which are needed to run the export scripts.
## Requirements
- **Blender**: Must be installed on your system
- macOS: Install from [blender.org](https://www.blender.org/download/) (will be at `/Applications/Blender.app`)
- Windows: Install to default location (`C:\Program Files\Blender Foundation\Blender\`)
- Linux: Install via package manager (`sudo apt install blender`)
## Usage
### Basic Export
Export a single `.blend` file to `.glb`:
```bash
npm run export-blend -- public/ship1.blend public/ship1.glb
```
### Watch Mode
Automatically re-export when the `.blend` file changes:
```bash
npm run export-blend -- public/ship1.blend public/ship1.glb --watch
```
This is useful during development - save your Blender file and it will auto-export!
### Batch Export
Export all `.blend` files in a directory:
```bash
npm run export-blend -- public/ public/ --batch
```
This will:
- Find all `.blend` files in `public/`
- Export each to `.glb` with the same name
- Skip `.blend1` backup files
### Compression
Enable Draco mesh compression for smaller file sizes:
```bash
npm run export-blend -- public/ship1.blend public/ship1.glb --compress
```
### Advanced Options
```bash
# Don't apply modifiers during export
npm run export-blend -- input.blend output.glb --no-modifiers
# Combine options
npm run export-blend -- input.blend output.glb --watch --compress
```
## Programmatic Usage
You can also use the export functions directly in your TypeScript code:
```typescript
import { exportBlendToGLB, batchExportBlendToGLB, watchAndExport } from './src/utils/blenderExporter';
// Single export
async function exportMyModel() {
const result = await exportBlendToGLB(
'./models/ship.blend',
'./public/ship.glb',
{
exportParams: {
export_draco_mesh_compression_enable: true,
export_apply_modifiers: true,
export_animations: true
}
}
);
console.log(`Exported in ${result.duration}ms`);
}
// Batch export
async function exportAllModels() {
const results = await batchExportBlendToGLB([
['./models/ship1.blend', './public/ship1.glb'],
['./models/ship2.blend', './public/ship2.glb'],
['./models/asteroid.blend', './public/asteroid.glb']
], {
exportParams: {
export_draco_mesh_compression_enable: true
}
});
console.log(`Exported ${results.length} files`);
}
// Watch for changes
function watchMyModel() {
const stopWatching = watchAndExport(
'./models/ship.blend',
'./public/ship.glb',
{
exportParams: {
export_apply_modifiers: true
}
}
);
// Call stopWatching() when you want to stop
setTimeout(() => {
stopWatching();
}, 60000); // Stop after 1 minute
}
```
## Export Parameters
The following glTF export parameters are supported:
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `export_format` | `'GLB'` \| `'GLTF_SEPARATE'` \| `'GLTF_EMBEDDED'` | `'GLB'` | Output format |
| `export_draco_mesh_compression_enable` | `boolean` | `false` | Enable Draco compression |
| `export_apply_modifiers` | `boolean` | `true` | Apply modifiers before export |
| `export_yup` | `boolean` | `true` | Use Y-up coordinate system |
| `export_animations` | `boolean` | `true` | Export animations |
| `export_materials` | `'EXPORT'` \| `'PLACEHOLDER'` \| `'NONE'` | `'EXPORT'` | Material export mode |
See [Blender's glTF export documentation](https://docs.blender.org/api/current/bpy.ops.export_scene.html#bpy.ops.export_scene.gltf) for all available parameters.
## Troubleshooting
### "Blender executable not found"
**Solution**: Set a custom Blender path:
```typescript
await exportBlendToGLB('input.blend', 'output.glb', {
blenderPath: '/custom/path/to/blender'
});
```
Or for the CLI, edit the `blenderExporter.ts` file to update `getDefaultBlenderPath()`.
### "Export timed out"
**Solution**: Increase the timeout (default is 60 seconds):
```typescript
await exportBlendToGLB('large-model.blend', 'output.glb', {
timeout: 120000 // 2 minutes
});
```
### Output file not created
Check that:
1. The `.blend` file opens in Blender without errors
2. The output directory exists
3. You have write permissions to the output directory
4. Check the console for Blender error messages
## Example Workflow
Here's a typical development workflow:
```bash
# Terminal 1: Run the dev server
npm run build
# Terminal 2: Watch your ship model
npm run export-blend -- public/ship2.blend public/ship2.glb --watch --compress
# Now edit ship2.blend in Blender
# Every time you save, it will auto-export to ship2.glb
# Refresh your browser to see changes
```
## Integration with Build Process
You can add the batch export to your build process:
```json
{
"scripts": {
"prebuild": "npm run export-blend:batch -- public/ public/",
"build": "tsc && vite build"
}
}
```
Now all `.blend` files will be exported before every build!
## Performance Tips
1. **Use compression for production**: Add `--compress` flag to reduce file sizes by ~50-70%
2. **Batch exports are sequential**: Large batches may take time
3. **Watch mode debounces**: Changes are detected with 1-second delay to avoid excessive exports
4. **Optimize your models**: Lower poly counts export faster
## Current Project Models
Here are the `.blend` files currently in the project:
```bash
# Export all current models
npm run export-blend -- public/ship1.blend public/ship1.glb
npm run export-blend -- public/ship2.blend public/ship2.glb
npm run export-blend -- public/asteroid4.blend public/asteroid4.glb
npm run export-blend -- public/base.blend public/base.glb
# Or batch export all at once
npm run export-blend:batch -- public/ public/
```