blob: 74f1dfad0791865ed88aa07fc5333480a0da5b82 [file] [log] [blame] [view] [edit]
# Tools <!-- omit in toc -->
The individual asset tools have been deprecated in favour of https://github.com/pimoroni/32blit-tools which installs `32blit` or `32blit.exe` command on Linux/Mac or Windows respectively.
You can install these tools with `pip`:
```
pip3 install 32blit
```
Head on over to https://github.com/pimoroni/32blit-tools for further documentation covering the installation of the new tools.
- [Asset Pipeline](#asset-pipeline)
- [Visual Studio](#visual-studio)
- [Old Tools](#old-tools)
- [Sprite Builder](#sprite-builder)
- [Prerequisites](#prerequisites)
- [Usage](#usage)
- [Packed](#packed)
- [Raw](#raw)
# Asset Pipeline
The new `32blit` tool has been integrated into CMake so that you can turn your raw images and assets into packed data at compile time.
To use this new setup your project must have an `assets.yml` and you should reference it in your `CMakeLists.txt` right after `blit_executable` like so:
```cmake
blit_assets_yaml (project-name assets.yml)
```
Substituting `project-name` for the first argument given to `blit_executable`.
Assuming you assets are in a directory called `assets/`, a simple `assets.yml` might look like this:
```yml
assets.cpp:
assets/sprites.png:
name: sprites_data
assets/level.tmx:
name: level_data
```
When you configure and compile your project, this will add an `assets.cpp` to your project's sources and output an `assets.hpp` file which you can include into your code to reference your assets:
```c++
#include "assets.hpp"
```
This file will include `sprites_data`, `sprites_data_length`, `level_data`, and `level_data_length`.
You can load sprites like so:
```c++
screen.sprites = SpriteSheet::load(sprites_data);
```
For your level data you might want to create an in-memory copy of it that you can edit to change your level in game:
```c++
// Store your level width/height in tiles
constexpr uint16_t level_width = 64;
constexpr uint16_t level_height = 64;
// Allocate memory for the writeable copy of the level
uint8_t *local_level_data = (uint8_t *)malloc(level_width * level_height);
// Copy read-only level data into writeable copy
for(auto x = 0; x < level_width * level_height; x++){
local_level_data[x] = level_data[x];
}
// Load our level data into the TileMap
level = new TileMap((uint8_t *)local_level_data, nullptr, Size(level_width, level_height), screen.sprites);
```
# Visual Studio
To use `assets.yml` with a Visual Studio project, you need to run the packer as a pre-build step. Make sure that the output path is in the project's include path.
```
python -m ttblit pack --force --config $(ProjectDir)assets.yml --output $(ProjectDir)
```
To add the build step right click the project and click properties. From there go to build events and paste the command into the command line text box.
If the step is failing to complete then make sure that both python and the 32blit pip package is installed.
After the build completes you will want to add the two files it generates to the project. (assets.cpp and assets.hpp).
Right click the project go to add then existing item and choose the two files from the project directory.
Failing to do this may cause errors when trying to debug similar to the ones below.
`LNK2001 unresolved external symbol "unsigned char const * const sprites_data" (?sprites_data@@3QBEB)`
`LNK1120 1 unresolved externals`
# Old Tools
## Sprite Builder
The `sprite-builder` tool is intended to be a tool for packing 32blit images into byte-arrays, includes, or data files for use in code.
The script outputs to a C++ byte-array and includes a header with information about the image size and palette.
Have a look into the script for further details regarding the formats.
### Prerequisites
``` shell
python3 -m pip install construct bitarray bitstring pillow
```
### Usage
Currently `sprite-builder` knows two types of conversion:
- Packed paletted images, and
- Raw images like RGBA, RGB888 or RGB565
Both conversions output data to stdout in C include style only. Output should be redirected into a file for usage (or copy-pasted from the terminal, if you wish).
#### Packed
A packed sprite can have a variable number of palette colours up to 255.
Data is packed at the number of bits-per-pixel required to index each palette entry.
IE: a two colour image will be packed with 1bpp
If you start with the 32blit, start with this format.
``` shell
./sprite-builder packed input-file.png
```
#### Raw
An unpacked sprite is just a block of raw surface data
in either RGBA (4 bytes), RGB888 (3 bytes) or RGB565 (2 bytes) format.
Unpacked sprites are *huge* but useful for streaming into the framebuffer from storage.
The max power of two sprite sizes supported by this file format are-
- 64x64 in RGBA and RGB888 mode
- 128x128 in RGB565 mode
``` shell
./sprite-builder raw --format RGB565 input-file.png
```