examples: add majora

This commit is contained in:
Zack Buhman 2024-09-04 22:03:27 -05:00
parent 909e041082
commit 140f243ad3
50 changed files with 2322 additions and 29 deletions

View File

@ -20,6 +20,7 @@ triangle_rotating.elf: $(DEFAULT) arm9/triangle_rotating.bin.o
texture.elf: $(DEFAULT) arm9/texture.bin.o
cube.elf: $(DEFAULT) arm9/cube.bin.o
icosphere.elf: $(DEFAULT) arm9/icosphere.bin.o
majora.elf: $(DEFAULT) arm9/majora.bin.o
TARGET = arm-none-eabi-
AARCH = -march=armv4t -mlittle-endian

View File

@ -1,4 +1,4 @@
OPT = -Os
OPT = -Og
ALL = \
arm9.bin \
@ -26,6 +26,22 @@ cube.elf: start.o examples/cube.o ../math/cos_table_fp12.o ../math/cos.o
icosphere.elf: start.o examples/icosphere.o ../math/cos_table_fp12.o ../math/cos.o
MAJORA_RES = \
../res/060067E0.data.pal.o \
../res/060079E0.data.pal.o \
../res/06007DE0.data.pal.o \
../res/060077E0.data.pal.o \
../res/06007BE0.data.pal.o \
../res/06007FE0.data.pal.o \
../res/060067E0.data.o \
../res/060079E0.data.o \
../res/06007DE0.data.o \
../res/060077E0.data.o \
../res/06007BE0.data.o \
../res/06007FE0.data.o
majora.elf: start.o examples/majora.o ../math/cos_table_fp12.o ../math/cos.o $(MAJORA_RES)
CFLAGS += -I../include -I../
include arm9.mk

520
arm9/examples/majora.c Normal file
View File

@ -0,0 +1,520 @@
#include "io_registers.h"
#include "bits.h"
#include "math/math.h"
#include "res/060067E0.data.h"
#include "res/060067E0.data.pal.h"
#include "res/060077E0.data.h"
#include "res/060077E0.data.pal.h"
#include "res/060079E0.data.h"
#include "res/060079E0.data.pal.h"
#include "res/06007BE0.data.h"
#include "res/06007BE0.data.pal.h"
#include "res/06007DE0.data.h"
#include "res/06007DE0.data.pal.h"
#include "res/06007FE0.data.h"
#include "res/06007FE0.data.pal.h"
#include "models/majora.h"
struct object * object[6] = {
&majora_1,
&majora_3,
&majora_4,
&majora_5,
&majora_6,
&majora_7,
};
int palette_offset[6];
int pixel_dimension[6];
uint32_t teximage_param[6];
int round_up_32(int n)
{
return ((n + 63) / 64) * 64;
}
uint16_t rgb565(const uint8_t * buf)
{
uint8_t r = buf[0] >> 3;
uint8_t g = buf[1] >> 3;
uint8_t g_l = (buf[1] >> 2) & 1;
uint8_t b = buf[2] >> 3;
return (g_l << 15) | (b << 10) | (g << 5) | (r << 0);
}
void copy_palettes()
{
int offset = 0;
volatile uint16_t * vram_f = (volatile uint16_t *)(0x06890000);
int num_pixel_palettes = (sizeof (majora_pixel_palette)) / (sizeof (struct pixel_palette));
for (int i = 0; i < num_pixel_palettes; i++) {
palette_offset[i] = offset;
int colors = majora_pixel_palette[i].palette.size / 3;
uint8_t * pal = majora_pixel_palette[i].palette.start;
for (int c = 0; c < colors; c++) {
vram_f[c + (offset / 2)] = rgb565(&pal[c * 3]);
}
offset = round_up_32(offset + colors * 2);
}
}
int pixel_dimension_from_pixels(int pixels)
{
switch (pixels) {
default:
case 64: return 8;
case 256: return 16;
case 1024: return 32;
case 4096: return 64;
case 16384: return 128;
case 65536: return 256;
case 262144: return 512;
case 1048576: return 1024;
}
}
uint32_t teximage_size_from_dimension(int dimension)
{
switch (dimension) {
default:
case 8: return TEXIMAGE_PARAM__t_size__8_texels
| TEXIMAGE_PARAM__s_size__8_texels;
case 16: return TEXIMAGE_PARAM__t_size__16_texels
| TEXIMAGE_PARAM__s_size__16_texels;
case 32: return TEXIMAGE_PARAM__t_size__32_texels
| TEXIMAGE_PARAM__s_size__32_texels;
case 64: return TEXIMAGE_PARAM__t_size__64_texels
| TEXIMAGE_PARAM__s_size__64_texels;
case 128: return TEXIMAGE_PARAM__t_size__128_texels
| TEXIMAGE_PARAM__s_size__128_texels;
case 256: return TEXIMAGE_PARAM__t_size__256_texels
| TEXIMAGE_PARAM__s_size__256_texels;
case 512: return TEXIMAGE_PARAM__t_size__512_texels
| TEXIMAGE_PARAM__s_size__512_texels;
case 1024: return TEXIMAGE_PARAM__t_size__1024_texels
| TEXIMAGE_PARAM__s_size__1024_texels;
}
}
uint32_t make_teximage_param(int offset, int dimension)
{
return 0
| TEXIMAGE_PARAM__texture_coordinate_transformation_mode__vertex_source
| TEXIMAGE_PARAM__texture_format__256_color_palette
| teximage_size_from_dimension(dimension)
| TEXIMAGE_PARAM__repeat_t__repeat
| TEXIMAGE_PARAM__repeat_s__repeat
| TEXIMAGE_PARAM__texture_starting_address(offset >> 3);
}
void copy_pixels()
{
int offset = 0;
volatile uint16_t * vram_a = (volatile uint16_t *)(0x06800000);
int num_pixel_palettes = (sizeof (majora_pixel_palette)) / (sizeof (struct pixel_palette));
for (int i = 0; i < num_pixel_palettes; i++) {
int size = majora_pixel_palette[i].pixel.size;
pixel_dimension[i] = pixel_dimension_from_pixels(size);
teximage_param[i] = make_teximage_param(offset, pixel_dimension[i]);
uint8_t * pixel = majora_pixel_palette[i].pixel.start;
for (int p = 0; p < size; p+=2) {
uint16_t texel = (pixel[p + 1] << 8) | (pixel[p + 0] << 0);
vram_a[(p + offset) / 2] = texel;
}
offset += size;
}
}
int u_to_s(int n, int dimension)
{
return (n * dimension) >> 10;
}
int v_to_t(int n, int dimension)
{
return ((((1 << 15) - n) * dimension) >> 10);
}
void copy_texture_data()
{
// memory bank allocation
// use VRAM-A for texture pixel data
// use VRAM-E for texture palette data
// temporarily map VRAM-A (128KB) to the arm9 address space:
// 0x06800000 - 0x0681FFFF
io_registers.a.VRAMCNT = 0
| VRAMCNT__vram_a__enable
| VRAMCNT__vram_a__mst(0b00); // arm9
// temporarily map VRAM-F (16KB) to the arm9 address space:
// 0x06890000 - 0x06893FFF
io_registers.a.WVRAMCNT = 0
| WVRAMCNT__vram_f__enable
| WVRAMCNT__vram_f__mst(0b000); // arm9
// at this point, VRAM-A/VRAM-E are not accessible by the 3d engine.
copy_palettes();
copy_pixels();
// map VRAM-A (128KB) to the 3d-engine "texture image slot 0":
// 0x00000 - 0x1ffff (3d engine texture image address space)
io_registers.a.VRAMCNT = 0
| VRAMCNT__vram_a__enable
| VRAMCNT__vram_a__ofs(0) // slot 0
| VRAMCNT__vram_a__mst(0b11); // texture image
// map VRAM-F (16KB) to the 3d-engine "texture palette slot 0":
// 0x0000 - 0x3fff (3d engine texture palette address space)
io_registers.a.WVRAMCNT = 0
| WVRAMCNT__vram_f__enable
| WVRAMCNT__vram_f__ofs(0) // slot 0
| WVRAMCNT__vram_f__mst(0b011); // texture palette
}
void main()
{
// power control
io_registers.a.POWCNT = 0
| POWCNT__lcd_output_destination__a_to_upper__b_to_lower
| POWCNT__geometry_engine__enable
| POWCNT__rendering_engine__enable
| POWCNT__lcd__enable;
// enable bg0 and 3d graphics
io_registers.a.DISPCNT = 0
| DISPCNT__display_mode__graphics_display
| DISPCNT__bg0__enable
| DISPCNT__display_selection_for_bg0__3d_graphics
;
// disable all 3d effects
io_registers.a.DISP3DCNT = 0
| DISP3DCNT__clear_image__disable
| DISP3DCNT__fog_master__disable
| DISP3DCNT__edge_marking__disable
| DISP3DCNT__anti_aliasing__disable
| DISP3DCNT__alpha_blending__disable
| DISP3DCNT__alpha_test__disable
| DISP3DCNT__texture_mapping__enable;
copy_texture_data();
copy_texture_data();
// clear matrix stack status
io_registers.a.GXSTAT |= GXSTAT__matrix_stack_status__overflow_or_underflow;
// load identity matrices
io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__projection;
io_registers.a.MTX_IDENTITY = 0;
/*
io_registers.a.MTX_SCALE = ((192 << 12) / (256)) / 2;
io_registers.a.MTX_SCALE = 0.5 * 4096;
io_registers.a.MTX_SCALE = 0.5 * 4096;
*/
// load a symmetric perspective matrix, with aspect ratio correction
io_registers.a.MTX_LOAD_4X4 = (192 << 12) / 256;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 1 << 12;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = -(1 << 12);
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = 0;
io_registers.a.MTX_LOAD_4X4 = -(1 << 12);
io_registers.a.MTX_LOAD_4X4 = 0;
// translate the viewpoint
io_registers.a.MTX_TRANS = 0;
io_registers.a.MTX_TRANS = 0;
io_registers.a.MTX_TRANS = (int)(-2.0 * (float)(1 << 12));
io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position;
io_registers.a.MTX_IDENTITY = 0;
io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position_and_vector;
io_registers.a.MTX_IDENTITY = 0;
io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__texture;
io_registers.a.MTX_IDENTITY = 0;
io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position_and_vector;
// set the 3d clear color to a dark red
io_registers.a.CLEAR_COLOR = 0
| CLEAR_COLOR__clear_polygon_id(31)
| CLEAR_COLOR__alpha_value(31)
| CLEAR_COLOR__blue(1)
| CLEAR_COLOR__green(1)
| CLEAR_COLOR__red(10);
// set the depth buffer clear value to the maximum value
io_registers.a.CLEAR_DEPTH = CLEAR_DEPTH__value(0x7fff);
// the 3d viewport is the entire display area
io_registers.a.VIEWPORT = 0
| VIEWPORT__y2(191)
| VIEWPORT__x2(255)
| VIEWPORT__y1(0)
| VIEWPORT__x1(0);
// normalized 45° vector
int c = 0.57735 * 512;
// lighting
io_registers.a.LIGHT_VECTOR = 0
| LIGHT_VECTOR__light_number(0)
| LIGHT_VECTOR__decimal_z(-c)
| LIGHT_VECTOR__decimal_y(-c)
| LIGHT_VECTOR__decimal_x(-c);
io_registers.a.LIGHT_VECTOR = 0
| LIGHT_VECTOR__light_number(1)
| LIGHT_VECTOR__decimal_z(-c)
| LIGHT_VECTOR__decimal_y(-c)
| LIGHT_VECTOR__decimal_x(c);
io_registers.a.LIGHT_VECTOR = 0
| LIGHT_VECTOR__light_number(2)
| LIGHT_VECTOR__decimal_z(-c)
| LIGHT_VECTOR__decimal_y(c)
| LIGHT_VECTOR__decimal_x(-c);
io_registers.a.LIGHT_COLOR = 0
| LIGHT_COLOR__light_number(0)
| LIGHT_COLOR__blue(31)
| LIGHT_COLOR__green(31)
| LIGHT_COLOR__red(31);
io_registers.a.LIGHT_COLOR = 0
| LIGHT_COLOR__light_number(1)
| LIGHT_COLOR__blue(31)
| LIGHT_COLOR__green(31)
| LIGHT_COLOR__red(31);
io_registers.a.LIGHT_COLOR = 0
| LIGHT_COLOR__light_number(2)
| LIGHT_COLOR__blue(31)
| LIGHT_COLOR__green(31)
| LIGHT_COLOR__red(31);
// degrees
int theta = 0;
while (1) {
// calculate sin/cos for 2d rotation; signed fp20.12 result
int cos = cos_fp12(theta);
int sin = sin_fp12(theta);
int cos2 = cos_fp12(-theta >> 1);
int sin2 = sin_fp12(-theta >> 1);
io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position_and_vector;
// reset position matrix
io_registers.a.MTX_IDENTITY = 0;
io_registers.a.MTX_TRANS = 0;
io_registers.a.MTX_TRANS = (int)(-0.5 * (float)(1 << 12));
io_registers.a.MTX_TRANS = 0;
// multiply by a y-axis rotation
/*
io_registers.a.MTX_MULT_3X3 = cos2;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = sin2;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = 1 << 12;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = -sin2;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = cos2;
*/
/*
// multiply by a z-axis rotation
io_registers.a.MTX_MULT_3X3 = cos;
io_registers.a.MTX_MULT_3X3 = -sin;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = sin;
io_registers.a.MTX_MULT_3X3 = cos;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = 1 << 12;
*/
// multiply by a x-axis rotation
io_registers.a.MTX_MULT_3X3 = 1 << 12;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = cos2;
io_registers.a.MTX_MULT_3X3 = -sin2;
io_registers.a.MTX_MULT_3X3 = 0;
io_registers.a.MTX_MULT_3X3 = sin2;
io_registers.a.MTX_MULT_3X3 = cos2;
// cube faces
io_registers.a.DIF_AMB = 0
| DIF_AMB__ambient_blue(3)
| DIF_AMB__ambient_green(3)
| DIF_AMB__ambient_red(3)
| DIF_AMB__diffuse_blue(10)
| DIF_AMB__diffuse_green(10)
| DIF_AMB__diffuse_red(10);
io_registers.a.SPE_EMI = 0
| SPE_EMI__specular_blue(25)
| SPE_EMI__specular_green(25)
| SPE_EMI__specular_red(25);
/*
io_registers.a.COLOR = 0
| COLOR__blue(31)
| COLOR__green(31)
| COLOR__red(31);
*/
// the following polygons are fully opaque; backface culling is
// enabled
io_registers.a.POLYGON_ATTR = 0
| POLYGON_ATTR__polygon_id(0)
| POLYGON_ATTR__alpha_value(31)
| POLYGON_ATTR__render_front_surface__enable
| POLYGON_ATTR__render_back_surface__enable
| POLYGON_ATTR__polygon_mode__modulation
| POLYGON_ATTR__light_2__enable
| POLYGON_ATTR__light_1__enable
| POLYGON_ATTR__light_0__enable;
// the following vertices are a triangles
io_registers.a.BEGIN_VTXS = BEGIN_VTXS__type__triangle;
for (int oix = 0; oix < (sizeof (object)) / (sizeof (struct object *)); oix++) {
struct object * obj = object[oix];
const int num_triangles = obj->triangle_count;
int material = obj->material;
io_registers.a.TEXPLTT_BASE = TEXPLTT_BASE__base_address(palette_offset[material] >> 4);
io_registers.a.TEXIMAGE_PARAM = teximage_param[material];
int dimension = pixel_dimension[material];
for (int i = 0; i < num_triangles; i++) {
// "When texture mapping, the Geometry Engine works faster if you
// issue commands in the following order: TexCoord→Normal→Vertex."
struct vertex_texture * at = &majora_texture[obj->triangle[i].a.texture];
// convert from UV space to ST space
int au = at->u;
int av = at->v;
io_registers.a.TEXCOORD = 0
| TEXCOORD__t_coordinate(v_to_t(av, dimension))
| TEXCOORD__s_coordinate(u_to_s(au, dimension));
struct vertex_normal * an = &majora_normal[obj->triangle[i].a.normal];
io_registers.a.NORMAL = 0
| NORMAL__z_component(an->z)
| NORMAL__y_component(an->y)
| NORMAL__x_component(an->x);
struct vertex_position * a = &majora_position[obj->triangle[i].a.position];
io_registers.a.VTX_10 = 0
| VTX_10__z_coordinate(a->z)
| VTX_10__y_coordinate(a->y)
| VTX_10__x_coordinate(a->x);
struct vertex_texture * bt = &majora_texture[obj->triangle[i].b.texture];
// convert from UV space to ST space
int bu = bt->u;
int bv = bt->v;
io_registers.a.TEXCOORD = 0
| TEXCOORD__t_coordinate(v_to_t(bv, dimension))
| TEXCOORD__s_coordinate(u_to_s(bu, dimension));
struct vertex_normal * bn = &majora_normal[obj->triangle[i].b.normal];
io_registers.a.NORMAL = 0
| NORMAL__z_component(bn->z)
| NORMAL__y_component(bn->y)
| NORMAL__x_component(bn->x);
struct vertex_position * b = &majora_position[obj->triangle[i].b.position];
io_registers.a.VTX_10 = 0
| VTX_10__z_coordinate(b->z)
| VTX_10__y_coordinate(b->y)
| VTX_10__x_coordinate(b->x);
struct vertex_texture * ct = &majora_texture[obj->triangle[i].c.texture];
// convert from UV space to ST space
int cu = ct->u;
int cv = ct->v;
io_registers.a.TEXCOORD = 0
| TEXCOORD__t_coordinate(v_to_t(cv, dimension))
| TEXCOORD__s_coordinate(u_to_s(cu, dimension));
struct vertex_normal * cn = &majora_normal[obj->triangle[i].c.normal];
io_registers.a.NORMAL = 0
| NORMAL__z_component(cn->z)
| NORMAL__y_component(cn->y)
| NORMAL__x_component(cn->x);
struct vertex_position * c = &majora_position[obj->triangle[i].c.position];
io_registers.a.VTX_10 = 0
| VTX_10__z_coordinate(c->z)
| VTX_10__y_coordinate(c->y)
| VTX_10__x_coordinate(c->x);
}
}
// end of the triangle
io_registers.a.END_VTXS = 0;
// wait for the geometry engine
while (io_registers.a.GXSTAT & GXSTAT__geometry_engine_busy);
// wait for the end of the current frame
while (io_registers.a.VCOUNT != 262);
while (io_registers.a.VCOUNT == 262);
// swap buffers
io_registers.a.SWAP_BUFFERS = 0;
// increment theta once per frame
theta += 1;
if (theta >= 360 * 16) {
theta = 0;
}
}
}

View File

@ -12,6 +12,7 @@ CFLAGS += -Wno-error=maybe-uninitialized
CFLAGS += -Wno-error=unused-but-set-variable
CFLAGS += -Wno-error=unused-variable
CFLAGS += -Wno-aggressive-loop-optimizations
CFLAGS += -fno-inline-small-functions
CXXFLAGS += -fno-exceptions -fno-non-call-exceptions -fno-rtti -fno-threadsafe-statics

View File

@ -252,7 +252,7 @@
#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__do_not_transform_texture_coordinates (0x0 << 30)
#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__texcoord_source (0x1 << 30)
#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__normal_source (0x2 << 30)
#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__vextex_source (0x3 << 30)
#define TEXIMAGE_PARAM__texture_coordinate_transformation_mode__vertex_source (0x3 << 30)
#define TEXIMAGE_PARAM__palette_color0_transparency__palette_setting (0x0 << 29)
#define TEXIMAGE_PARAM__palette_color0_transparency__always_transparent (0x1 << 29)
#define TEXIMAGE_PARAM__texture_format__no_texture (0x0 << 26)

933
models/majora.h Normal file
View File

@ -0,0 +1,933 @@
#include "model.h"
// .6 fixed-point
struct vertex_position majora_position[] = {
{28, 13, -2},
{41, -9, -3},
{17, 4, -2},
{23, 8, 2},
{-24, 8, 2},
{-29, 13, -2},
{-42, -9, -3},
{-18, 4, -2},
{0, 61, -3},
{41, 20, -5},
{0, -13, -7},
{16, 68, -3},
{35, 68, -3},
{49, 52, -3},
{-49, 52, -3},
{-36, 68, -3},
{-17, 68, -3},
{-42, 20, -5},
{-28, 95, 0},
{-16, 63, -1},
{-31, 62, -1},
{-23, 60, 6},
{22, 60, 6},
{30, 62, -1},
{27, 95, 0},
{15, 63, -1},
{64, 20, -1},
{36, 25, -1},
{43, 36, -1},
{39, 30, 3},
{-40, 30, 3},
{-44, 36, -1},
{-65, 20, -1},
{-37, 25, -1},
{-4, -4, -3},
{-25, -20, -3},
{-18, 3, -2},
{-11, -1, 1},
{24, -20, -3},
{17, 3, -2},
{10, -1, 1},
{3, -4, -3},
{-28, 14, -2},
{-54, 3, -2},
{-38, 23, -1},
{-33, 18, 2},
{53, 3, -2},
{37, 23, -1},
{32, 18, 2},
{27, 14, -2},
{0, 61, -3},
{0, 42, 13},
{6, 54, 11},
{15, 29, 17},
{0, 13, 6},
{-16, 29, 17},
{-19, 45, 18},
{0, -13, -7},
{-12, 14, 15},
{-17, 68, -3},
{-13, 61, 7},
{-36, 68, -3},
{-49, 52, -3},
{-37, 48, 14},
{-14, 53, 17},
{-7, 54, 11},
{30, 24, 13},
{41, 20, -5},
{49, 52, -3},
{13, 53, 17},
{18, 45, 18},
{-31, 24, 13},
{-42, 20, -5},
{-24, 14, 7},
{23, 14, 7},
{-27, 60, 11},
{12, 61, 7},
{16, 68, -3},
{26, 60, 11},
{35, 68, -3},
{36, 48, 14},
{11, 14, 15},
};
// .14 fixed-point
struct vertex_texture majora_texture[] = {
{11583, 9984},
{13855, 16384},
{16352, 31},
{12704, 13184},
{0, 31},
{3647, 13184},
{2496, 16384},
{4768, 9984},
{16223, 0},
{16384, 16288},
{3072, 3664},
{256, 11056},
{5439, 16415},
{1679, 15952},
{5456, 16384},
{0, 384},
{672, 16384},
{4096, 1055},
{2111, 0},
{15679, 16384},
{14240, 0},
{16352, 384},
{12256, 1055},
{13631, 16384},
{16384, 0},
{12768, 4768},
{13184, 10591},
{0, 0},
{3167, 10591},
{2720, 16384},
{3584, 4768},
{2399, 16384},
{6880, 11968},
{0, 0},
{4639, 14175},
{11712, 14175},
{16384, 0},
{13951, 16384},
{9472, 11968},
{2399, 16384},
{3968, 8735},
{0, 0},
{3167, 12575},
{13184, 12575},
{16384, 0},
{13951, 16384},
{12383, 8735},
{10944, 13767},
{12256, 16384},
{12256, 11080},
{12263, 5359},
{8623, 8960},
{8192, 12544},
{8647, 5407},
{12263, -17},
{8840, 15552},
{6792, 16415},
{4415, 12712},
{4112, 16440},
{2976, 13160},
{9232, 13943},
{5744, 7960},
{4112, 4903},
{6431, 4712},
{11480, -17},
{6999, 15016},
};
// .9 fixed-point
struct vertex_normal majora_normal[] = {
{-233, -430, -155},
{425, 262, -113},
{107, -155, 476},
{48, -84, 502},
{-108, -155, 476},
{-49, -84, 502},
{-426, 262, -113},
{-426, 262, -113},
{232, -430, -155},
{232, -430, -155},
{48, -84, 502},
{107, -155, 476},
{0, 25, -512},
{0, 25, -512},
{0, 25, -512},
{0, 25, -512},
{0, 25, -512},
{-1, 25, -512},
{-1, 25, -512},
{-1, 25, -512},
{0, 25, -512},
{0, 25, -512},
{0, 25, -512},
{0, 25, -512},
{-1, 25, -512},
{-1, 25, -512},
{-1, 25, -512},
{-1, 25, -512},
{-478, 46, -181},
{-27, 245, 448},
{444, 184, -176},
{-12, 75, 506},
{444, 184, -176},
{26, 245, 448},
{11, 75, 506},
{477, 46, -181},
{26, 245, 448},
{477, 46, -181},
{-445, 184, -176},
{-445, 184, -176},
{11, 75, 506},
{-12, 75, 506},
{-27, 245, 448},
{-478, 46, -181},
{291, 405, -113},
{142, -104, 480},
{-79, -479, -165},
{62, -61, 504},
{-79, -479, -165},
{142, -104, 480},
{-143, -104, 480},
{-63, -61, 504},
{-292, 405, -113},
{-292, 405, -113},
{78, -479, -165},
{-143, -104, 480},
{78, -479, -165},
{142, -104, 480},
{291, 405, -113},
{-475, 155, -112},
{312, -378, -149},
{-80, -177, 473},
{312, -378, -148},
{-37, -96, 501},
{-80, -177, 473},
{36, -96, 501},
{79, -177, 473},
{474, 155, -112},
{-313, -378, -149},
{474, 155, -112},
{79, -177, 473},
{36, -96, 501},
{-313, -378, -148},
{-475, 155, -112},
{-391, 311, -113},
{187, -450, -159},
{-121, -143, 476},
{187, -450, -159},
{-54, -78, 503},
{-121, -143, 476},
{53, -78, 503},
{120, -143, 476},
{390, 311, -113},
{-188, -450, -159},
{390, 311, -113},
{120, -143, 476},
{53, -78, 503},
{-188, -450, -159},
{120, -143, 476},
{-121, -143, 476},
{-54, -78, 503},
{-391, 311, -113},
{-276, 297, 311},
{0, 398, 321},
{0, 75, 506},
{0, -109, 500},
{-48, -49, 507},
{0, 74, 506},
{-26, 46, 509},
{47, -49, 507},
{13, -212, 466},
{0, -355, 369},
{-1, -109, 500},
{157, 391, 290},
{0, 398, 321},
{85, 425, 271},
{-243, 93, 441},
{-211, 346, 312},
{-417, 7, 297},
{275, 297, 311},
{117, 241, 435},
{416, 7, 297},
{283, -182, 385},
{347, -277, 254},
{-118, 241, 435},
{25, 46, 509},
{-252, -339, 290},
{-284, -182, 385},
{-348, -277, 254},
{251, -339, 290},
{347, -278, 254},
{-64, 330, 385},
{85, 425, 271},
{-211, 346, 312},
{-26, 46, 509},
{-417, 7, 297},
{-348, -277, 254},
{-158, 391, 290},
{-86, 425, 271},
{-86, 425, 271},
{63, 330, 385},
{210, 346, 312},
{210, 346, 312},
{242, 93, 441},
{416, 7, 297},
{25, 46, 509},
{-1, 74, 506},
{283, -182, 385},
{347, -277, 254},
{0, -355, 369},
{-348, -278, 254},
{-14, -212, 466},
{0, -109, 500},
{157, 391, 290},
{275, 297, 311},
{117, 241, 435},
{-64, 330, 385},
{-26, 46, 509},
{-243, 93, 441},
{47, -49, 507},
{-252, -339, 290},
{-158, 391, 290},
{-276, 297, 311},
{25, 46, 509},
{63, 330, 385},
{-118, 241, 435},
{-48, -49, 507},
{242, 93, 441},
{-48, -49, 507},
{251, -339, 290},
{117, 241, 435},
{-64, 330, 385},
{-118, 241, 435},
{63, 330, 385},
{-243, 93, 441},
{210, 346, 312},
{63, 330, 385},
{-284, -182, 385},
{416, 7, 297},
{13, -212, 466},
{-14, -212, 466},
};
enum majora_material {
mtl_060067E0,
mtl_060077E0,
mtl_060079E0,
mtl_06007BE0,
mtl_06007DE0,
mtl_06007FE0,
};
struct pixel_palette majora_pixel_palette[] = {
[mtl_060067E0] = {
.pixel = {
.start = (uint8_t *)&_binary_060067E0_data_start,
.end = (uint8_t *)&_binary_060067E0_data_end,
.size = (int)&_binary_060067E0_data_size,
},
.palette = {
.start = (uint8_t *)&_binary_060067E0_data_pal_start,
.end = (uint8_t *)&_binary_060067E0_data_pal_end,
.size = (int)&_binary_060067E0_data_pal_size,
},
},
[mtl_060077E0] = {
.pixel = {
.start = (uint8_t *)&_binary_060077E0_data_start,
.end = (uint8_t *)&_binary_060077E0_data_end,
.size = (int)&_binary_060077E0_data_size,
},
.palette = {
.start = (uint8_t *)&_binary_060077E0_data_pal_start,
.end = (uint8_t *)&_binary_060077E0_data_pal_end,
.size = (int)&_binary_060077E0_data_pal_size,
},
},
[mtl_060079E0] = {
.pixel = {
.start = (uint8_t *)&_binary_060079E0_data_start,
.end = (uint8_t *)&_binary_060079E0_data_end,
.size = (int)&_binary_060079E0_data_size,
},
.palette = {
.start = (uint8_t *)&_binary_060079E0_data_pal_start,
.end = (uint8_t *)&_binary_060079E0_data_pal_end,
.size = (int)&_binary_060079E0_data_pal_size,
},
},
[mtl_06007BE0] = {
.pixel = {
.start = (uint8_t *)&_binary_06007BE0_data_start,
.end = (uint8_t *)&_binary_06007BE0_data_end,
.size = (int)&_binary_06007BE0_data_size,
},
.palette = {
.start = (uint8_t *)&_binary_06007BE0_data_pal_start,
.end = (uint8_t *)&_binary_06007BE0_data_pal_end,
.size = (int)&_binary_06007BE0_data_pal_size,
},
},
[mtl_06007DE0] = {
.pixel = {
.start = (uint8_t *)&_binary_06007DE0_data_start,
.end = (uint8_t *)&_binary_06007DE0_data_end,
.size = (int)&_binary_06007DE0_data_size,
},
.palette = {
.start = (uint8_t *)&_binary_06007DE0_data_pal_start,
.end = (uint8_t *)&_binary_06007DE0_data_pal_end,
.size = (int)&_binary_06007DE0_data_pal_size,
},
},
[mtl_06007FE0] = {
.pixel = {
.start = (uint8_t *)&_binary_06007FE0_data_start,
.end = (uint8_t *)&_binary_06007FE0_data_end,
.size = (int)&_binary_06007FE0_data_size,
},
.palette = {
.start = (uint8_t *)&_binary_06007FE0_data_pal_start,
.end = (uint8_t *)&_binary_06007FE0_data_pal_end,
.size = (int)&_binary_06007FE0_data_pal_size,
},
},
};
struct triangle majora_1_triangle[] = {
{
{2, 0, 0},
{0, 1, 1},
{1, 2, 2},
},
{
{3, 3, 3},
{2, 0, 0},
{1, 2, 2},
},
{
{6, 4, 4},
{4, 5, 5},
{5, 6, 6},
},
{
{5, 6, 7},
{7, 7, 8},
{6, 4, 4},
},
{
{7, 7, 9},
{4, 5, 5},
{6, 4, 4},
},
{
{3, 3, 10},
{1, 2, 11},
{0, 1, 1},
},
};
struct object majora_1 = {
.triangle = &majora_1_triangle[0],
.quadrilateral = NULL,
.triangle_count = 6,
.quadrilateral_count = 0,
.material = mtl_06007BE0,
};
struct triangle majora_3_triangle[] = {
{
{10, 8, 12},
{8, 9, 13},
{9, 10, 14},
},
{
{13, 11, 15},
{11, 12, 15},
{12, 13, 16},
},
{
{16, 14, 17},
{14, 11, 17},
{15, 13, 18},
},
{
{14, 11, 19},
{8, 9, 19},
{17, 10, 19},
},
{
{8, 9, 20},
{13, 11, 20},
{9, 10, 20},
},
{
{11, 12, 21},
{13, 11, 22},
{8, 9, 23},
},
{
{14, 11, 24},
{16, 14, 25},
{8, 9, 23},
},
{
{8, 9, 26},
{10, 8, 12},
{17, 10, 27},
},
};
struct object majora_3 = {
.triangle = &majora_3_triangle[0],
.quadrilateral = NULL,
.triangle_count = 8,
.quadrilateral_count = 0,
.material = mtl_06007FE0,
};
struct triangle majora_4_triangle[] = {
{
{20, 15, 28},
{18, 16, 29},
{19, 17, 30},
},
{
{21, 18, 31},
{19, 17, 32},
{18, 16, 29},
},
{
{24, 19, 33},
{22, 20, 34},
{23, 21, 35},
},
{
{24, 19, 36},
{23, 21, 37},
{25, 22, 38},
},
{
{25, 22, 39},
{22, 20, 40},
{24, 19, 36},
},
{
{21, 18, 41},
{18, 16, 42},
{20, 15, 43},
},
{
{28, 23, 44},
{26, 24, 45},
{27, 25, 46},
},
{
{29, 26, 47},
{27, 25, 48},
{26, 24, 49},
},
{
{32, 27, 50},
{30, 28, 51},
{31, 29, 52},
},
{
{31, 29, 53},
{33, 30, 54},
{32, 27, 55},
},
{
{33, 30, 56},
{30, 28, 51},
{32, 27, 50},
},
{
{29, 26, 47},
{26, 24, 57},
{28, 23, 58},
},
};
struct object majora_4 = {
.triangle = &majora_4_triangle[0],
.quadrilateral = NULL,
.triangle_count = 12,
.quadrilateral_count = 0,
.material = mtl_060077E0,
};
struct triangle majora_5_triangle[] = {
{
{36, 31, 59},
{34, 32, 60},
{35, 33, 61},
},
{
{34, 32, 62},
{37, 34, 63},
{35, 33, 64},
},
{
{40, 35, 65},
{38, 36, 66},
{39, 37, 67},
},
{
{41, 38, 68},
{39, 37, 69},
{38, 36, 70},
},
{
{40, 35, 71},
{41, 38, 72},
{38, 36, 66},
},
{
{35, 33, 64},
{37, 34, 63},
{36, 31, 73},
},
};
struct object majora_5 = {
.triangle = &majora_5_triangle[0],
.quadrilateral = NULL,
.triangle_count = 6,
.quadrilateral_count = 0,
.material = mtl_06007DE0,
};
struct triangle majora_6_triangle[] = {
{
{44, 39, 74},
{42, 40, 75},
{43, 41, 76},
},
{
{42, 40, 77},
{45, 42, 78},
{43, 41, 79},
},
{
{48, 43, 80},
{46, 44, 81},
{47, 45, 82},
},
{
{49, 46, 83},
{47, 45, 84},
{46, 44, 85},
},
{
{48, 43, 86},
{49, 46, 87},
{46, 44, 88},
},
{
{43, 41, 89},
{45, 42, 90},
{44, 39, 91},
},
};
struct object majora_6 = {
.triangle = &majora_6_triangle[0],
.quadrilateral = NULL,
.triangle_count = 6,
.quadrilateral_count = 0,
.material = mtl_060079E0,
};
struct triangle majora_7_triangle[] = {
{
{52, 47, 92},
{50, 48, 93},
{51, 49, 94},
},
{
{54, 50, 95},
{53, 51, 96},
{51, 49, 97},
},
{
{56, 52, 98},
{55, 51, 99},
{51, 49, 97},
},
{
{58, 53, 100},
{57, 54, 101},
{54, 50, 102},
},
{
{60, 55, 103},
{50, 48, 104},
{59, 56, 105},
},
{
{63, 57, 106},
{61, 58, 107},
{62, 59, 108},
},
{
{65, 47, 109},
{64, 60, 110},
{51, 49, 97},
},
{
{68, 59, 111},
{66, 61, 112},
{67, 62, 113},
},
{
{69, 60, 114},
{52, 47, 92},
{51, 49, 97},
},
{
{70, 52, 115},
{69, 60, 114},
{51, 49, 97},
},
{
{73, 63, 116},
{71, 61, 117},
{72, 62, 118},
},
{
{74, 63, 119},
{57, 64, 101},
{67, 62, 120},
},
{
{50, 48, 93},
{65, 47, 109},
{51, 49, 97},
},
{
{75, 65, 121},
{59, 56, 122},
{61, 58, 123},
},
{
{64, 60, 110},
{56, 52, 124},
{51, 49, 97},
},
{
{71, 61, 117},
{62, 59, 125},
{72, 62, 126},
},
{
{55, 51, 99},
{54, 50, 95},
{51, 49, 97},
},
{
{50, 48, 104},
{76, 55, 127},
{77, 56, 128},
},
{
{77, 56, 129},
{78, 65, 130},
{79, 58, 131},
},
{
{79, 58, 132},
{80, 57, 133},
{68, 59, 134},
},
{
{53, 51, 96},
{70, 52, 135},
{51, 49, 136},
},
{
{66, 61, 137},
{74, 63, 119},
{67, 62, 138},
},
{
{57, 64, 139},
{73, 63, 116},
{72, 62, 140},
},
{
{57, 54, 101},
{81, 53, 141},
{54, 50, 142},
},
{
{50, 48, 104},
{60, 55, 143},
{65, 47, 144},
},
{
{60, 55, 143},
{64, 60, 145},
{65, 47, 144},
},
{
{75, 65, 146},
{56, 52, 147},
{64, 60, 110},
},
{
{63, 57, 148},
{55, 51, 149},
{56, 52, 124},
},
{
{71, 61, 117},
{58, 53, 100},
{55, 51, 149},
},
{
{73, 63, 150},
{57, 54, 101},
{58, 53, 100},
},
{
{76, 55, 151},
{50, 48, 93},
{52, 47, 152},
},
{
{69, 60, 114},
{76, 55, 151},
{52, 47, 152},
},
{
{70, 52, 153},
{78, 65, 154},
{69, 60, 155},
},
{
{53, 51, 156},
{80, 57, 157},
{70, 52, 115},
},
{
{81, 53, 141},
{66, 61, 137},
{53, 51, 158},
},
{
{57, 54, 101},
{74, 63, 159},
{81, 53, 141},
},
{
{64, 60, 160},
{60, 55, 103},
{75, 65, 161},
},
{
{76, 55, 127},
{69, 60, 162},
{78, 65, 130},
},
{
{59, 56, 105},
{75, 65, 121},
{60, 55, 103},
},
{
{78, 65, 163},
{77, 56, 128},
{76, 55, 127},
},
{
{56, 52, 147},
{75, 65, 146},
{63, 57, 164},
},
{
{61, 58, 123},
{63, 57, 164},
{75, 65, 121},
},
{
{78, 65, 154},
{70, 52, 153},
{80, 57, 133},
},
{
{80, 57, 133},
{79, 58, 165},
{78, 65, 166},
},
{
{55, 51, 149},
{63, 57, 164},
{71, 61, 167},
},
{
{80, 57, 133},
{53, 51, 158},
{66, 61, 137},
},
{
{62, 59, 125},
{71, 61, 167},
{63, 57, 164},
},
{
{66, 61, 112},
{68, 59, 168},
{80, 57, 133},
},
{
{54, 50, 95},
{55, 51, 149},
{58, 53, 169},
},
{
{53, 51, 158},
{54, 50, 95},
{81, 53, 170},
},
{
{58, 53, 100},
{71, 61, 117},
{73, 63, 150},
},
{
{66, 61, 137},
{81, 53, 170},
{74, 63, 159},
},
};
struct object majora_7 = {
.triangle = &majora_7_triangle[0],
.quadrilateral = NULL,
.triangle_count = 52,
.quadrilateral_count = 0,
.material = mtl_060067E0,
};

72
models/majora.mtl Normal file
View File

@ -0,0 +1,72 @@
# Blender 4.1.1 MTL File: 'None'
# www.blender.org
newmtl mtl_060067E0
Ns 95.999992
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd 060067E0.png
newmtl mtl_060077E0
Ns 95.999992
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd 060077E0.png
newmtl mtl_060079E0
Ns 95.999992
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd 060079E0.png
newmtl mtl_06007BE0
Ns 95.999992
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd 06007BE0.png
newmtl mtl_06007DE0
Ns 95.999992
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd 06007DE0.png
newmtl mtl_06007FE0
Ns 95.999992
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd 06007FE0.png
newmtl mtl_060087E0
Ns 95.999992
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd 060087E0.png

430
models/majora.obj Normal file
View File

@ -0,0 +1,430 @@
# Blender 4.1.1
# www.blender.org
mtllib majora.mtl
o 1
v 0.451172 0.203125 -0.021484
v 0.652344 -0.129883 -0.038086
v 0.270508 0.073242 -0.027344
v 0.361328 0.135742 0.034180
v -0.361328 0.135742 0.034180
v -0.451172 0.203125 -0.021484
v -0.652344 -0.129883 -0.038086
v -0.270508 0.073242 -0.027344
vn -0.4545 -0.8383 -0.3012
vn 0.8303 0.5125 -0.2191
vn 0.2101 -0.3020 0.9299
vn 0.0955 -0.1626 0.9821
vn -0.2101 -0.3020 0.9299
vn -0.0954 -0.1626 0.9821
vn -0.8303 0.5125 -0.2191
vn -0.8302 0.5125 -0.2191
vn 0.4545 -0.8383 -0.3012
vn 0.4544 -0.8383 -0.3012
vn 0.0954 -0.1626 0.9821
vn 0.2100 -0.3019 0.9299
vt 0.707031 0.609375
vt 0.845703 1.000000
vt 0.998047 0.001953
vt 0.775391 0.804688
vt 0.000000 0.001953
vt 0.222656 0.804688
vt 0.152344 1.000000
vt 0.291016 0.609375
s 0
usemtl mtl_06007BE0
f 3/1/1 1/2/2 2/3/3
f 4/4/4 3/1/1 2/3/3
f 7/5/5 5/6/6 6/7/7
f 6/7/8 8/8/9 7/5/5
f 8/8/10 5/6/6 7/5/5
f 4/4/11 2/3/12 1/2/2
o 3
v 0.000000 0.958008 -0.039062
v 0.643555 0.322266 -0.070312
v 0.000000 -0.203125 -0.096680
v 0.254883 1.076172 -0.033203
v 0.559570 1.070312 -0.033203
v 0.765625 0.813476 -0.045898
v -0.765625 0.813477 -0.045898
v -0.559570 1.070313 -0.033203
v -0.254883 1.076172 -0.033203
v -0.643555 0.322266 -0.070313
vn -0.0000 0.0496 -0.9988
vn 0.0002 0.0494 -0.9988
vn 0.0005 0.0496 -0.9988
vn 0.0007 0.0497 -0.9988
vn 0.0010 0.0501 -0.9987
vn -0.0007 0.0497 -0.9988
vn -0.0010 0.0501 -0.9987
vn -0.0004 0.0495 -0.9988
vn 0.0004 0.0495 -0.9988
vn 0.0006 0.0494 -0.9988
vn 0.0005 0.0493 -0.9988
vn -0.0000 0.0493 -0.9988
vn -0.0005 0.0494 -0.9988
vn -0.0006 0.0494 -0.9988
vn -0.0002 0.0494 -0.9988
vn -0.0005 0.0496 -0.9988
vt 0.990234 0.000000
vt 1.000000 0.994141
vt 0.187500 0.223633
vt 0.015625 0.674805
vt 0.332031 1.001953
vt 0.102539 0.973633
vt 0.333008 1.000000
s 0
usemtl mtl_06007FE0
f 11/9/13 9/10/14 10/11/15
f 14/12/16 12/13/16 13/14/17
f 17/15/18 15/12/18 16/14/19
f 15/12/20 9/10/20 18/11/20
f 9/10/21 14/12/21 10/11/21
f 12/13/22 14/12/23 9/10/24
f 15/12/25 17/15/26 9/10/24
f 9/10/27 11/9/13 18/11/28
o 4
v -0.436523 1.492188 0.012695
v -0.238281 0.990234 -0.011719
v -0.477539 0.968750 -0.013672
v -0.353516 0.951172 0.095703
v 0.353516 0.951172 0.095703
v 0.477539 0.968750 -0.013672
v 0.436524 1.492187 0.012695
v 0.238281 0.990234 -0.011719
v 1.013672 0.322265 -0.015625
v 0.566406 0.394531 -0.011719
v 0.673828 0.570312 -0.002930
v 0.620117 0.479492 0.051758
v -0.620117 0.479492 0.051758
v -0.673828 0.570313 -0.002930
v -1.013672 0.322266 -0.015625
v -0.566406 0.394531 -0.011719
vn -0.9317 0.0907 -0.3517
vn -0.0513 0.4802 0.8757
vn 0.8679 0.3594 -0.3428
vn -0.0218 0.1484 0.9887
vn 0.8680 0.3594 -0.3426
vn 0.0512 0.4802 0.8757
vn 0.0217 0.1483 0.9887
vn 0.9317 0.0907 -0.3516
vn 0.0513 0.4802 0.8757
vn 0.9317 0.0906 -0.3517
vn -0.8680 0.3594 -0.3428
vn -0.8680 0.3595 -0.3426
vn 0.0218 0.1483 0.9887
vn -0.0217 0.1484 0.9887
vn -0.0512 0.4802 0.8757
vn -0.9317 0.0907 -0.3516
vn 0.5699 0.7920 -0.2191
vn 0.2787 -0.2021 0.9389
vn -0.1539 -0.9345 -0.3211
vn 0.1219 -0.1172 0.9856
vn -0.1538 -0.9345 -0.3211
vn 0.2788 -0.2022 0.9388
vn -0.2788 -0.2022 0.9388
vn -0.1219 -0.1172 0.9856
vn -0.5699 0.7920 -0.2190
vn -0.5699 0.7920 -0.2191
vn 0.1538 -0.9345 -0.3211
vn -0.2787 -0.2022 0.9388
vn 0.1539 -0.9345 -0.3211
vn 0.2787 -0.2022 0.9388
vn 0.5698 0.7920 -0.2190
vt 0.000000 0.023438
vt 0.041016 1.000000
vt 0.250000 0.064453
vt 0.128906 0.000000
vt 0.957031 1.000000
vt 0.869141 0.000000
vt 0.998047 0.023438
vt 0.748047 0.064453
vt 0.832031 1.000000
vt 1.000000 0.000000
vt 0.779297 0.291016
vt 0.804688 0.646484
vt 0.000000 0.000000
vt 0.193359 0.646484
vt 0.166016 1.000000
vt 0.218750 0.291016
s 0
usemtl mtl_060077E0
f 21/16/29 19/17/30 20/18/31
f 22/19/32 20/18/33 19/17/30
f 25/20/34 23/21/35 24/22/36
f 25/20/37 24/22/38 26/23/39
f 26/23/40 23/21/41 25/20/37
f 22/19/42 19/17/43 21/16/44
f 29/24/45 27/25/46 28/26/47
f 30/27/48 28/26/49 27/25/50
f 33/28/51 31/29/52 32/30/53
f 32/30/54 34/31/55 33/28/56
f 34/31/57 31/29/52 33/28/51
f 30/27/48 27/25/58 29/24/59
o 5
v -0.060547 -0.047852 -0.033203
v -0.383789 -0.310547 -0.046875
v -0.270508 0.049805 -0.028320
v -0.166016 -0.001953 0.027344
v 0.383789 -0.310547 -0.046875
v 0.270508 0.049805 -0.028320
v 0.166016 -0.001953 0.027344
v 0.060547 -0.047852 -0.033203
vn -0.9276 0.3030 -0.2185
vn 0.6111 -0.7368 -0.2891
vn -0.1552 -0.3452 0.9256
vn 0.6112 -0.7369 -0.2890
vn -0.0709 -0.1856 0.9801
vn -0.1553 -0.3452 0.9256
vn 0.0709 -0.1856 0.9801
vn 0.1553 -0.3452 0.9256
vn 0.9277 0.3029 -0.2185
vn -0.6111 -0.7369 -0.2891
vn 0.9276 0.3029 -0.2185
vn 0.1552 -0.3452 0.9256
vn 0.0709 -0.1857 0.9800
vn -0.6111 -0.7369 -0.2890
vn -0.9277 0.3028 -0.2185
vt 0.146484 1.000000
vt 0.419922 0.730469
vt 0.000000 0.000000
vt 0.283203 0.865234
vt 0.714844 0.865234
vt 1.000000 0.000000
vt 0.851562 1.000000
vt 0.578125 0.730469
s 0
usemtl mtl_06007DE0
f 37/32/60 35/33/61 36/34/62
f 35/33/63 38/35/64 36/34/65
f 41/36/66 39/37/67 40/38/68
f 42/39/69 40/38/70 39/37/71
f 41/36/72 42/39/73 39/37/67
f 36/34/65 38/35/64 37/32/74
o 6
v -0.429688 0.225586 -0.019531
v -0.836914 0.058594 -0.028320
v -0.590820 0.372070 -0.012695
v -0.510742 0.295899 0.042969
v 0.836914 0.058594 -0.028320
v 0.590820 0.372070 -0.012695
v 0.510742 0.295898 0.042969
v 0.429687 0.225586 -0.019531
vn -0.7621 0.6093 -0.2193
vn 0.3665 -0.8775 -0.3094
vn -0.2348 -0.2774 0.9316
vn 0.3666 -0.8775 -0.3093
vn -0.1052 -0.1508 0.9830
vn -0.2347 -0.2774 0.9316
vn 0.1051 -0.1507 0.9830
vn 0.2348 -0.2775 0.9316
vn 0.7621 0.6092 -0.2192
vn -0.3665 -0.8775 -0.3094
vn 0.7621 0.6092 -0.2193
vn 0.2348 -0.2774 0.9316
vn 0.1051 -0.1508 0.9830
vn -0.3665 -0.8775 -0.3093
vn 0.2347 -0.2775 0.9316
vn -0.2348 -0.2775 0.9316
vn -0.1051 -0.1507 0.9830
vn -0.7621 0.6092 -0.2192
vt 0.146484 1.000000
vt 0.242188 0.533203
vt 0.000000 0.000000
vt 0.193359 0.767578
vt 0.804688 0.767578
vt 1.000000 0.000000
vt 0.851562 1.000000
vt 0.755859 0.533203
s 0
usemtl mtl_060079E0
f 45/40/75 43/41/76 44/42/77
f 43/41/78 46/43/79 44/42/80
f 49/44/81 47/45/82 48/46/83
f 50/47/84 48/46/85 47/45/86
f 49/44/87 50/47/88 47/45/89
f 44/42/90 46/43/91 45/40/92
o 7
v 0.000000 0.958008 -0.039062
v 0.000000 0.657227 0.215820
v 0.097656 0.847656 0.176758
v 0.246094 0.464844 0.268555
v 0.000000 0.209961 0.107422
v -0.246094 0.464844 0.268555
v -0.291992 0.710938 0.281250
v 0.000000 -0.203125 -0.096680
v -0.184570 0.228516 0.241211
v -0.254883 1.076172 -0.033203
v -0.191406 0.959961 0.111328
v -0.559570 1.070313 -0.033203
v -0.765625 0.813477 -0.045898
v -0.574219 0.756836 0.222656
v -0.213867 0.839844 0.272461
v -0.097656 0.847656 0.176758
v 0.483398 0.388672 0.204102
v 0.643555 0.322266 -0.070312
v 0.765625 0.813476 -0.045898
v 0.213867 0.839844 0.272461
v 0.291992 0.710937 0.281250
v -0.483398 0.388672 0.204102
v -0.643555 0.322266 -0.070313
v -0.374023 0.221680 0.122070
v 0.374023 0.221680 0.122070
v -0.419922 0.952148 0.172852
v 0.191406 0.959961 0.111328
v 0.254883 1.076172 -0.033203
v 0.419922 0.952148 0.172852
v 0.559570 1.070312 -0.033203
v 0.574219 0.756836 0.222656
v 0.184570 0.228516 0.241211
vn -0.5389 0.5818 0.6091
vn -0.0000 0.7781 0.6282
vn -0.0000 0.1465 0.9892
vn -0.0000 -0.2122 0.9772
vn -0.0919 -0.0941 0.9913
vn -0.0000 0.1464 0.9892
vn -0.0492 0.0905 0.9947
vn 0.0919 -0.0941 0.9913
vn 0.0260 -0.4132 0.9103
vn -0.0000 -0.6929 0.7210
vn -0.0001 -0.2122 0.9772
vn 0.3080 0.7641 0.5669
vn -0.0000 0.7780 0.6282
vn 0.1670 0.8317 0.5295
vn -0.4742 0.1822 0.8614
vn -0.4115 0.6761 0.6113
vn -0.8131 0.0141 0.5819
vn 0.5389 0.5818 0.6091
vn 0.2295 0.4721 0.8511
vn 0.8131 0.0140 0.5819
vn 0.5535 -0.3543 0.7537
vn 0.6778 -0.5410 0.4979
vn -0.2295 0.4721 0.8511
vn 0.0493 0.0905 0.9947
vn -0.4916 -0.6608 0.5671
vn -0.5535 -0.3544 0.7537
vn -0.6778 -0.5410 0.4978
vn 0.4916 -0.6608 0.5671
vn 0.6778 -0.5411 0.4978
vn -0.1243 0.6459 0.7532
vn 0.1669 0.8318 0.5295
vn -0.4114 0.6761 0.6113
vn -0.0493 0.0905 0.9947
vn -0.8131 0.0140 0.5819
vn -0.6778 -0.5410 0.4979
vn -0.3080 0.7641 0.5669
vn -0.1670 0.8317 0.5295
vn -0.1669 0.8318 0.5295
vn 0.1243 0.6459 0.7532
vn 0.4114 0.6761 0.6112
vn 0.4115 0.6761 0.6112
vn 0.4741 0.1822 0.8614
vn 0.8131 0.0141 0.5819
vn 0.0492 0.0905 0.9947
vn -0.0001 0.1464 0.9892
vn 0.5535 -0.3544 0.7537
vn 0.6778 -0.5410 0.4978
vn -0.0000 -0.6930 0.7210
vn -0.6778 -0.5411 0.4978
vn -0.0260 -0.4132 0.9103
vn -0.0000 -0.2121 0.9772
vn 0.3081 0.7640 0.5669
vn 0.5389 0.5819 0.6091
vn 0.2295 0.4722 0.8511
vn -0.1243 0.6458 0.7533
vn -0.0493 0.0906 0.9947
vn -0.4741 0.1821 0.8614
vn 0.0918 -0.0941 0.9913
vn -0.4916 -0.6608 0.5672
vn -0.3081 0.7640 0.5669
vn -0.5389 0.5819 0.6091
vn 0.0493 0.0906 0.9947
vn 0.1243 0.6458 0.7533
vn -0.2295 0.4721 0.8512
vn -0.0918 -0.0940 0.9913
vn 0.4741 0.1821 0.8614
vn -0.0918 -0.0941 0.9913
vn 0.4916 -0.6608 0.5672
vn 0.2294 0.4722 0.8511
vn -0.1243 0.6459 0.7533
vn -0.2294 0.4722 0.8511
vn 0.1242 0.6459 0.7533
vn -0.4741 0.1822 0.8614
vn 0.4114 0.6761 0.6113
vn 0.1243 0.6459 0.7533
vn -0.5535 -0.3543 0.7537
vn 0.8131 0.0140 0.5820
vn 0.0260 -0.4133 0.9102
vn -0.0260 -0.4133 0.9102
vt 0.667969 0.840332
vt 0.748047 1.000000
vt 0.748047 0.676270
vt 0.748535 0.327148
vt 0.526367 0.546875
vt 0.500000 0.765625
vt 0.527832 0.330078
vt 0.748535 -0.000977
vt 0.539551 0.949219
vt 0.414551 1.001953
vt 0.269531 0.775879
vt 0.250977 1.003418
vt 0.181641 0.803223
vt 0.563477 0.851074
vt 0.350586 0.485840
vt 0.250977 0.299316
vt 0.392578 0.287598
vt 0.700684 -0.000977
vt 0.427246 0.916504
s 0
usemtl mtl_060067E0
f 53/48/93 51/49/94 52/50/95
f 55/51/96 54/52/97 52/50/98
f 57/53/99 56/52/100 52/50/98
f 59/54/101 58/55/102 55/51/103
f 61/56/104 51/49/105 60/57/106
f 64/58/107 62/59/108 63/60/109
f 66/48/110 65/61/111 52/50/98
f 69/60/112 67/62/113 68/63/114
f 70/61/115 53/48/93 52/50/98
f 71/53/116 70/61/115 52/50/98
f 74/64/117 72/62/118 73/63/119
f 75/64/120 58/65/102 68/63/121
f 51/49/94 66/48/110 52/50/98
f 76/66/122 60/57/123 62/59/124
f 65/61/111 57/53/125 52/50/98
f 72/62/118 63/60/126 73/63/127
f 56/52/100 55/51/96 52/50/98
f 51/49/105 77/56/128 78/57/129
f 78/57/130 79/66/131 80/59/132
f 80/59/133 81/58/134 69/60/135
f 54/52/97 71/53/136 52/50/137
f 67/62/138 75/64/120 68/63/139
f 58/65/140 74/64/117 73/63/141
f 58/55/102 82/54/142 55/51/143
f 51/49/105 61/56/144 66/48/145
f 61/56/144 65/61/146 66/48/145
f 76/66/147 57/53/148 65/61/111
f 64/58/149 56/52/150 57/53/125
f 72/62/118 59/54/101 56/52/150
f 74/64/151 58/55/102 59/54/101
f 77/56/152 51/49/94 53/48/153
f 70/61/115 77/56/152 53/48/153
f 71/53/154 79/66/155 70/61/156
f 54/52/157 81/58/158 71/53/116
f 82/54/142 67/62/138 54/52/159
f 58/55/102 75/64/160 82/54/142
f 65/61/161 61/56/104 76/66/162
f 77/56/128 70/61/163 79/66/131
f 60/57/106 76/66/122 61/56/104
f 79/66/164 78/57/129 77/56/128
f 57/53/148 76/66/147 64/58/165
f 62/59/124 64/58/165 76/66/122
f 79/66/155 71/53/154 81/58/134
f 81/58/134 80/59/166 79/66/167
f 56/52/150 64/58/165 72/62/168
f 81/58/134 54/52/159 67/62/138
f 63/60/126 72/62/168 64/58/165
f 67/62/113 69/60/169 81/58/134
f 55/51/96 56/52/150 59/54/170
f 54/52/159 55/51/96 82/54/171
f 59/54/101 72/62/118 74/64/151
f 67/62/138 82/54/171 75/64/160

View File

@ -22,18 +22,37 @@ struct quadrilateral {
};
struct vertex_position { // signed 4.6 fixed point
uint16_t x;
uint16_t y;
uint16_t z;
int16_t x;
int16_t y;
int16_t z;
};
struct vertex_normal { // s.9 fixed point
uint16_t x;
uint16_t y;
uint16_t z;
int16_t x;
int16_t y;
int16_t z;
};
struct vertex_texture { // s.15 fixed point
uint16_t u;
uint16_t v;
int16_t u;
int16_t v;
};
struct object {
struct triangle * triangle;
struct quadrilateral * quadrilateral;
int triangle_count;
int quadrilateral_count;
int material;
};
struct start_size_end {
uint8_t * start;
uint8_t * end;
int size;
};
struct pixel_palette {
struct start_size_end pixel;
struct start_size_end palette;
};

47
models/parse_material.py Normal file
View File

@ -0,0 +1,47 @@
from dataclasses import dataclass
@dataclass
class NewMtl:
name: str
@dataclass
class MapKd:
name: str
def parse_material_newmtl(args):
name, = args.split()
yield NewMtl(name)
def parse_material_mapkd(args):
name, = args.split()
yield MapKd(name)
def parse_mtl_line(line):
prefixes = [
('newmtl ', parse_material_newmtl),
('map_Kd ', parse_material_mapkd),
]
for prefix, parser in prefixes:
if line.startswith(prefix):
args = line.removeprefix(prefix)
yield from parser(args)
def group_by_material(l):
current_material = None
for i in l:
if type(i) is NewMtl:
current_material = i
elif type(i) is MapKd:
assert current_material is not None
yield (current_material, i)
current_material = None
else:
assert False, type(i)
def parse_mtl_file(buf):
return list(group_by_material((
parsed
for line in buf.strip().split('\n')
for parsed in parse_mtl_line(line)
if not line.startswith('#')
)))

View File

@ -45,6 +45,19 @@ class Quadrilateral:
c: IndexVTN
d: IndexVTN
@dataclass
class Object:
name: str
@dataclass
class Material:
lib: str
name: str
@dataclass
class MtlLib:
name: str
def parse_fixed_point(s):
negative = s.startswith('-')
s = s.removeprefix('-')
@ -81,7 +94,7 @@ def int_minus_one(s):
assert n >= 0
return n
def parse_vertex_indices(args):
def _parse_vertex_indices(args):
indices = args.split('/')
assert len(indices) == 3, indices
return IndexVTN(*map(int_minus_one, indices))
@ -89,18 +102,33 @@ def parse_vertex_indices(args):
def parse_face(args):
vertices = args.split()
if len(vertices) == 3:
yield Triangle(*map(parse_vertex_indices, vertices))
yield Triangle(*map(_parse_vertex_indices, vertices))
elif len(vertices) == 4:
yield Quadrilateral(*map(parse_vertex_indices, vertices))
yield Quadrilateral(*map(_parse_vertex_indices, vertices))
else:
assert False, (len(vertices), args)
def parse_object(args):
name, = args.split()
yield Object(name)
def parse_material(args):
name, = args.split()
yield Material(None, name)
def parse_mtllib(args):
name, = args.split()
yield MtlLib(name)
def parse_obj_line(line):
prefixes = [
('v ', parse_vertex_position),
('vn ', parse_vertex_normal),
('vt ', parse_vertex_texture),
('f ', parse_face)
('f ', parse_face),
('o ', parse_object),
('usemtl ', parse_material),
('mtllib ', parse_mtllib),
]
for prefix, parser in prefixes:
if line.startswith(prefix):
@ -108,10 +136,31 @@ def parse_obj_line(line):
yield from parser(args)
def group_by_type(l):
grouped = defaultdict(list)
vertices = defaultdict(list)
current_object = None
faces = defaultdict(lambda: defaultdict(list))
materials = dict()
current_mtllib = None
for i in l:
grouped[type(i)].append(i)
return dict(grouped)
if type(i) in {VertexPosition, VertexTexture, VertexNormal}:
vertices[type(i)].append(i)
elif type(i) in {Triangle, Quadrilateral}:
assert current_object is not None
faces[current_object.name][type(i)].append(i)
elif type(i) is Material:
assert current_object is not None
assert current_mtllib is not None
i.lib = current_mtllib.name
assert current_object.name not in materials
materials[current_object.name] = i
elif type(i) is Object:
current_object = i
elif type(i) is MtlLib:
current_mtllib = i
else:
assert False, type(i)
return dict(vertices), dict((k, dict(v)) for k, v in faces.items()), materials
def parse_obj_file(buf):
return group_by_type((

View File

@ -9,9 +9,11 @@ from parse_obj_fixed_point import VertexTexture
from parse_obj_fixed_point import Triangle
from parse_obj_fixed_point import Quadrilateral
from parse_material import parse_mtl_file
vertex_position_fraction_bits = 6 # 4.6
vertex_normal_fraction_bits = 9 # s.9
vertex_texture_fraction_bits = 15 # s.15
vertex_texture_fraction_bits = 14 # s.15
def convert_fixed_point(fp, fraction_bits):
point = 2 ** fraction_bits
@ -31,7 +33,7 @@ def render_face(face):
yield "},"
def render_faces(prefix, name, faces):
yield f"struct {name} {prefix}_{name}s[] = {{"
yield f"struct {name} {prefix}_{name}[] = {{"
for face in faces:
yield from render_face(face)
yield "};"
@ -57,7 +59,7 @@ def render_vertex(vertex_tuple, fraction_bits):
def render_vertices(prefix, name, vertices, fraction_bits):
yield f"// .{fraction_bits} fixed-point"
yield f"struct vertex_{name} {prefix}_{name}s[] = {{"
yield f"struct vertex_{name} {prefix}_{name}[] = {{"
for vertex in vertices:
yield from render_vertex(vertex, fraction_bits)
yield "};"
@ -80,6 +82,61 @@ def render_vertex_texture(prefix, vertex_textures):
map(uv, vertex_textures),
vertex_texture_fraction_bits)
def render_object(prefix, object_name, d, material):
yield f"struct object {prefix}_{object_name} = {{"
triangle_count = len(d[Triangle]) if Triangle in d else 0
quadrilateral_count = len(d[Quadrilateral]) if Quadrilateral in d else 0
if triangle_count > 0:
yield f".triangle = &{prefix}_{object_name}_triangle[0],"
else:
yield f".triangle = NULL,"
if quadrilateral_count > 0:
yield f".quadrilateral = &{prefix}_{object_name}_quadrilateral[0],"
else:
yield f".quadrilateral = NULL,"
yield f".triangle_count = {triangle_count},"
yield f".quadrilateral_count = {quadrilateral_count},"
if material is None:
yield f".material = -1,",
else:
yield f".material = {material.name},"
yield "};"
def render_pixel_palette(prefix, newmtl, mapkd):
name, _ext = mapkd.name.rsplit('.', maxsplit=1)
pixel_name = f"{name}_data"
palette_name = f"{name}_data_pal"
yield f"[{newmtl.name}] = {{"
yield ".pixel = {"
yield f".start = (uint8_t *)&_binary_{pixel_name}_start,"
yield f".end = (uint8_t *)&_binary_{pixel_name}_end,"
yield f".size = (int)&_binary_{pixel_name}_size,"
yield "},"
yield ".palette = {"
yield f".start = (uint8_t *)&_binary_{palette_name}_start,"
yield f".end = (uint8_t *)&_binary_{palette_name}_end,"
yield f".size = (int)&_binary_{palette_name}_size,"
yield "},"
yield "},"
def render_materials(prefix, newmtl_mapkd):
yield f"enum {prefix}_material {{"
for newmtl, mapkd in newmtl_mapkd:
yield f"{newmtl.name},";
yield "};"
yield f"struct pixel_palette {prefix}_pixel_palette[] = {{"
for newmtl, mapkd in newmtl_mapkd:
yield from render_pixel_palette(prefix, newmtl, mapkd)
yield "};"
def render_header():
yield '#include "model.h"'
yield ""
@ -88,14 +145,37 @@ with open(sys.argv[1]) as f:
buf = f.read()
prefix = sys.argv[2]
d = parse_obj_file(buf)
vertices, faces, materials = parse_obj_file(buf)
render, out = renderer()
render(render_header())
render(render_vertex_positions(prefix, d[VertexPosition]))
render(render_vertex_texture(prefix, d[VertexTexture]))
render(render_vertex_normals(prefix, d[VertexNormal]))
render(render_vertex_positions(prefix, vertices[VertexPosition]))
render(render_vertex_texture(prefix, vertices[VertexTexture]))
render(render_vertex_normals(prefix, vertices[VertexNormal]))
materials_by_lib_name = set((m.lib, m.name) for m in materials.values())
material_names = set()
for _, name in materials_by_lib_name:
assert name not in material_names
material_names.add(name)
material_libs = set(lib for lib, _ in materials_by_lib_name)
for material_lib in material_libs:
with open(material_lib) as f:
buf = f.read()
newmtl_mapkd = [
(newmtl, mapkd)
for (newmtl, mapkd) in parse_mtl_file(buf)
if newmtl.name in material_names
]
render(render_materials(prefix, newmtl_mapkd))
for object_name, d in faces.items():
object_prefix = '_'.join((prefix, object_name))
if Triangle in d:
render(render_triangles(prefix, d[Triangle]))
render(render_triangles(object_prefix, d[Triangle]))
if Quadrilateral in d:
render(render_quadrilateral(prefix, d[Quadrilateral]))
render(render_quadrilateral(object_prefix, d[Quadrilateral]))
render(render_object(prefix, object_name, d, materials.get(object_name)));
sys.stdout.write(out.getvalue())

View File

@ -0,0 +1,51 @@
import sys
from parse_obj_fixed_point import parse_obj_file
from parse_obj_fixed_point import VertexPosition
from parse_obj_fixed_point import VertexNormal
from parse_obj_fixed_point import VertexTexture
from parse_obj_fixed_point import Triangle
def convert_fixed_point(fp, fraction_bits):
point = 2 ** fraction_bits
sign = -1 if fp.negative else 1
n0 = sign * (fp.integer * fp.point + fp.fraction)
n1 = n0 * point // fp.point
return n1
from pprint import pprint
with open(sys.argv[1]) as f:
buf = f.read()
vertices, faces, materials = parse_obj_file(buf)
position = vertices[VertexPosition]
texture = vertices[VertexTexture]
normal = vertices[VertexNormal]
def flt(fp):
sign = -1 if fp.negative else 1
return sign * (fp.integer + fp.fraction / fp.point)
for object_name, d in faces.items():
if object_name != '3':
continue
triangle = d[Triangle]
for t in triangle:
at = texture[t.a.vertex_texture]
bt = texture[t.b.vertex_texture]
ct = texture[t.c.vertex_texture]
print((flt(at.u), flt(at.v)),
(flt(bt.u), flt(bt.v)),
(flt(ct.u), flt(ct.v)))
verts = [at, bt, ct]
pprint([
(convert_fixed_point(t.u, 15), convert_fixed_point(t.v, 15)) for t in verts
])
pprint([
[((convert_fixed_point(c, 15) * 31) >> 11) // (2 ** 4) for c in [t.u, t.v]] for t in verts
])

View File

@ -285,7 +285,7 @@
"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","do_not_transform_texture_coordinates","0b00",,
"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","texcoord_source","0b01",,
"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","normal_source","0b10",,
"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","vextex_source","0b11",,
"TEXIMAGE_PARAM","texture_coordinate_transformation_mode","31-30","vertex_source","0b11",,
"TEXIMAGE_PARAM","palette_color0_transparency",29,"palette_setting",0,,
"TEXIMAGE_PARAM","palette_color0_transparency",29,"always_transparent",1,,
"TEXIMAGE_PARAM","texture_format","28-26","no_texture",0,,

1 register_name enum_name bits bit_name value mask description
285 TEXIMAGE_PARAM texture_coordinate_transformation_mode 31-30 do_not_transform_texture_coordinates 0b00
286 TEXIMAGE_PARAM texture_coordinate_transformation_mode 31-30 texcoord_source 0b01
287 TEXIMAGE_PARAM texture_coordinate_transformation_mode 31-30 normal_source 0b10
288 TEXIMAGE_PARAM texture_coordinate_transformation_mode 31-30 vextex_source vertex_source 0b11
289 TEXIMAGE_PARAM palette_color0_transparency 29 palette_setting 0
290 TEXIMAGE_PARAM palette_color0_transparency 29 always_transparent 1
291 TEXIMAGE_PARAM texture_format 28-26 no_texture 0

Binary file not shown.

BIN
res/060067E0.data Normal file

Binary file not shown.

5
res/060067E0.data.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060067E0_data_start __asm("_binary_060067E0_data_start");
extern uint32_t _binary_060067E0_data_end __asm("_binary_060067E0_data_end");
extern uint32_t _binary_060067E0_data_size __asm("_binary_060067E0_data_size");

BIN
res/060067E0.data.pal Normal file

Binary file not shown.

5
res/060067E0.data.pal.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060067E0_data_pal_start __asm("_binary_060067E0_data_pal_start");
extern uint32_t _binary_060067E0_data_pal_end __asm("_binary_060067E0_data_pal_end");
extern uint32_t _binary_060067E0_data_pal_size __asm("_binary_060067E0_data_pal_size");

BIN
res/060067E0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
res/060077E0.data Normal file

Binary file not shown.

5
res/060077E0.data.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060077E0_data_start __asm("_binary_060077E0_data_start");
extern uint32_t _binary_060077E0_data_end __asm("_binary_060077E0_data_end");
extern uint32_t _binary_060077E0_data_size __asm("_binary_060077E0_data_size");

1
res/060077E0.data.pal Normal file
View File

@ -0,0 +1 @@
hX(�h�ィ

5
res/060077E0.data.pal.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060077E0_data_pal_start __asm("_binary_060077E0_data_pal_start");
extern uint32_t _binary_060077E0_data_pal_end __asm("_binary_060077E0_data_pal_end");
extern uint32_t _binary_060077E0_data_pal_size __asm("_binary_060077E0_data_pal_size");

BIN
res/060077E0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
res/060079E0.data Normal file

Binary file not shown.

5
res/060079E0.data.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060079E0_data_start __asm("_binary_060079E0_data_start");
extern uint32_t _binary_060079E0_data_end __asm("_binary_060079E0_data_end");
extern uint32_t _binary_060079E0_data_size __asm("_binary_060079E0_data_size");

1
res/060079E0.data.pal Normal file
View File

@ -0,0 +1 @@
爃h饦橉需

5
res/060079E0.data.pal.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060079E0_data_pal_start __asm("_binary_060079E0_data_pal_start");
extern uint32_t _binary_060079E0_data_pal_end __asm("_binary_060079E0_data_pal_end");
extern uint32_t _binary_060079E0_data_pal_size __asm("_binary_060079E0_data_pal_size");

BIN
res/060079E0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
res/06007BE0.data Normal file

Binary file not shown.

5
res/06007BE0.data.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_06007BE0_data_start __asm("_binary_06007BE0_data_start");
extern uint32_t _binary_06007BE0_data_end __asm("_binary_06007BE0_data_end");
extern uint32_t _binary_06007BE0_data_size __asm("_binary_06007BE0_data_size");

1
res/06007BE0.data.pal Normal file
View File

@ -0,0 +1 @@
PHXЈh�и�

5
res/06007BE0.data.pal.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_06007BE0_data_pal_start __asm("_binary_06007BE0_data_pal_start");
extern uint32_t _binary_06007BE0_data_pal_end __asm("_binary_06007BE0_data_pal_end");
extern uint32_t _binary_06007BE0_data_pal_size __asm("_binary_06007BE0_data_pal_size");

BIN
res/06007BE0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
res/06007DE0.data Normal file

Binary file not shown.

5
res/06007DE0.data.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_06007DE0_data_start __asm("_binary_06007DE0_data_start");
extern uint32_t _binary_06007DE0_data_end __asm("_binary_06007DE0_data_end");
extern uint32_t _binary_06007DE0_data_size __asm("_binary_06007DE0_data_size");

1
res/06007DE0.data.pal Normal file
View File

@ -0,0 +1 @@
@`€Px Xђ°`ђЁp�°€ёИ�ИШ�Ра Ша Ши

5
res/06007DE0.data.pal.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_06007DE0_data_pal_start __asm("_binary_06007DE0_data_pal_start");
extern uint32_t _binary_06007DE0_data_pal_end __asm("_binary_06007DE0_data_pal_end");
extern uint32_t _binary_06007DE0_data_pal_size __asm("_binary_06007DE0_data_pal_size");

BIN
res/06007DE0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
res/06007FE0.data Normal file

Binary file not shown.

5
res/06007FE0.data.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_06007FE0_data_start __asm("_binary_06007FE0_data_start");
extern uint32_t _binary_06007FE0_data_end __asm("_binary_06007FE0_data_end");
extern uint32_t _binary_06007FE0_data_size __asm("_binary_06007FE0_data_size");

BIN
res/06007FE0.data.pal Normal file

Binary file not shown.

5
res/06007FE0.data.pal.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_06007FE0_data_pal_start __asm("_binary_06007FE0_data_pal_start");
extern uint32_t _binary_06007FE0_data_pal_end __asm("_binary_06007FE0_data_pal_end");
extern uint32_t _binary_06007FE0_data_pal_size __asm("_binary_06007FE0_data_pal_size");

BIN
res/06007FE0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
res/060087E0.data Normal file

Binary file not shown.

5
res/060087E0.data.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060087E0_data_start __asm("_binary_060087E0_data_start");
extern uint32_t _binary_060087E0_data_end __asm("_binary_060087E0_data_end");
extern uint32_t _binary_060087E0_data_size __asm("_binary_060087E0_data_size");

BIN
res/060087E0.data.pal Normal file

Binary file not shown.

5
res/060087E0.data.pal.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <stdint.h>
extern uint32_t _binary_060087E0_data_pal_start __asm("_binary_060087E0_data_pal_start");
extern uint32_t _binary_060087E0_data_pal_end __asm("_binary_060087E0_data_pal_end");
extern uint32_t _binary_060087E0_data_pal_size __asm("_binary_060087E0_data_pal_size");

BIN
res/060087E0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB