diff --git a/arm9/examples/cube.c b/arm9/examples/cube.c index ca406c8..e01d274 100644 --- a/arm9/examples/cube.c +++ b/arm9/examples/cube.c @@ -45,14 +45,32 @@ void main() // load identity matrices io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__projection; io_registers.a.MTX_IDENTITY = 0; - // scale everything by 1/2 - io_registers.a.MTX_SCALE = (1 << 12) / 2; - io_registers.a.MTX_SCALE = (1 << 12) / 2; - io_registers.a.MTX_SCALE = (1 << 12) / 2; - // scale the x-axis by the ratio of the display height by the display width. - io_registers.a.MTX_SCALE = (192 << 12) / 256; - io_registers.a.MTX_SCALE = 1 << 12; - io_registers.a.MTX_SCALE = 1 << 12; + + // 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 = -3 << 12; io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position; io_registers.a.MTX_IDENTITY = 0; @@ -71,12 +89,11 @@ void main() // set the depth buffer clear value to the maximum value io_registers.a.CLEAR_DEPTH = CLEAR_DEPTH__value(0x7fff); - // the following polygons are fully opaque and are not - // backface-culled + // the following polygons are fully opaque; backface culling is + // enabled io_registers.a.POLYGON_ATTR = 0 | POLYGON_ATTR__alpha_value(31) - | POLYGON_ATTR__render_front_surface__enable - | POLYGON_ATTR__render_back_surface__enable; + | POLYGON_ATTR__render_front_surface__enable; // the 3d viewport is the entire display area io_registers.a.VIEWPORT = 0