#codec #game-cube #texture #wii #graphics #gamedev

gctex

gctex is a Rust crate designed for encoding and decoding texture formats used in the Nintendo GameCube and Wii games. The library provides C bindings, making it useful in both Rust and C/C++ based projects.

27 releases

0.3.12 Jul 12, 2024
0.3.8 Jun 14, 2024
0.3.0 Oct 21, 2023
0.1.4 Jul 15, 2023

#81 in Graphics APIs


Used in 2 crates

GPL-2.0-or-later

235KB
5K SLoC

C++ 2.5K SLoC // 0.2% comments Rust 2K SLoC // 0.0% comments Bitbake 716 SLoC

Contains (Windows DLL, 190KB) examples/c#/bindings/gctex_v13.dll

crates.io docs.rs

gctex

gctex is a Rust crate designed for encoding and decoding texture formats used in the Nintendo GameCube and Wii games. The library provides C bindings, making it useful in both Rust and C/C++ based projects.

Usage

Rust

The following snippet demonstrates how to encode a texture in CMPR format using Rust:

let width: u32 = 32;
let height: u32 = 32;
let src = vec![0; (width*height*4) as usize];
let dst = gctex::encode(gctex::TextureFormat::CMPR, &src, width, height);

C# Bindings

See https://github.com/riidefi/RiiStudio/tree/master/source/gctex/examples/c%23

byte[] dst = new byte[dst_len];
byte[] src = new byte[src_len];
gctex.Encode(0xE /* CMPR */, dst, src, width, height);

C/C++

See https://github.com/riidefi/RiiStudio/tree/master/source/gctex/examples/c%2b%2b

#include "gctex.h"

unsigned char dst[dst_len];
unsigned char src[src_len];
rii_encode_cmpr(dst, sizeof(dst), src, sizeof(src), width, height);

The relevant header is available in include/gctex.h.

Supported Formats

All supported texture formats and their respective encoding and decoding sources are listed below.

Format Encoding Source Decoding Source
CMPR Builtin Dolphin Emulator (SIMD) / Rust non-SIMD fallback
I4 Builtin Builtin (SIMD (SSE3))
I8 Builtin Dolphin Emulator (SIMD) / Rust non-SIMD fallback
IA4 Builtin Builtin
IA8 Builtin Dolphin Emulator (SIMD) / Rust non-SIMD fallback
RGB565 Builtin Dolphin Emulator (SIMD) / Rust non-SIMD fallback
RGB5A3 Builtin Dolphin Emulator (SIMD) / Rust non-SIMD fallback
RGBA8 Builtin Builtin (SIMD (SSE3))
C4 - Dolphin Emulator / No fallback
C8 - Dolphin Emulator / No fallback
C14 - Dolphin Emulator / No fallback

Please note, SIMD texture decoding for I4, I8 and IA8 formats uses SSE3 instructions with a fallback to SSE2 if necessary (excepting I4), and these are implemented based on the Dolphin Emulator's texture decoding logic.

Optional Features

  • To avoid needing a C++ compiler or running C++ code, unset the cpp_fallback feature to fallback to non-SIMD Rust implementations of I4/I8/IA8/RGB565/RGB5A3 decoding.
  • For debugging the simd feature can be disabled to use pure, standard Rust.

License

This dynamically linked library is published under GPLv2.

Dependencies

~435–600KB
~12K SLoC