No description
| data | ||
| src | ||
| tests/Unit | ||
| .gitignore | ||
| composer.json | ||
| composer.lock | ||
| LICENSE | ||
| phpunit.xml | ||
| README.md | ||
| test.php | ||
doom-wad-php
Small PHP toolkit for reading Doom WAD files and rendering patch/texture graphics.
It currently focuses on the graphics side of classic Doom data:
- WAD header + lump directory parsing
- Doom patch (
Picture) parsing TEXTURE1/TEXTURE2(TextureX) parsingPNAMESparsing- Texture resolution (
TEXTUREX + PNAMES + patch lumps) - PNG rendering through
intervention/image
Requirements
- PHP 8.2+
- Composer
Install
composer install
Run tests
composer test
Quick start
1) Parse a WAD
<?php
require_once 'vendor/autoload.php';
use Doom\Wad\File as WadFile;
use Shufflingpixels\IO\BinaryReader;
use Shufflingpixels\IO\File;
use Shufflingpixels\IO\FileMode;
$file = File::open('./data/test.wad', FileMode::READ);
$wad = WadFile::parse(BinaryReader::stream($file));
2) Render a single patch lump to PNG
use Doom\Image\Renderer;
$renderer = new Renderer();
$pictureRenderer = $renderer->createPicture();
$patch = $wad->firstLumpByName('S3DUMMY');
if ($patch !== null) {
$pictureRenderer->render($patch->asPicture())->save('output/S3DUMMY.png');
}
3) Resolve and render composite textures
use Doom\Image\Renderer;
$renderer = new Renderer();
$textures = $wad->resolveTextures();
foreach ($textures as $texture) {
$canvas = $renderer->createTexture($texture->width, $texture->height);
foreach ($texture->patches as $patch) {
if ($patch->patchName === null) {
continue;
}
$path = sprintf('output/patches/%s.png', $patch->patchName);
if (is_file($path)) {
$canvas->blit($path, $patch->originX, $patch->originY);
}
}
$canvas->image()->save(sprintf('output/textures/%s.png', $texture->name));
}
For a full runnable example, see test.php.
Main API
Doom\Wad\File::parse(...)Doom\Wad\File::firstLumpByName(...)Doom\Wad\File::pNames()Doom\Wad\File::resolveTextures()Doom\Wad\Types\Lump::asPicture()Doom\Wad\Types\Lump::asTextureX()Doom\Image\RenderercreatePicture()->Doom\Image\PictureRenderercreateTexture($width, $height)->Doom\Image\TextureRenderer
Notes
- Rendering is palette-index based (Doom 8-bit graphics model).
- The default Doom palette is built in, and custom palettes are supported via
Doom\Picture\Palette.