1use crate::gbi::macros::gbi_command;
2use crate::gbi::utils::get_cmd;
3use crate::gbi::{f3dex2, GBICommandParams, GBICommandRegistry, GBIResult};
4use crate::rsp::RSP;
5use fast3d_gbi::defines::OpCode;
6
7#[allow(dead_code)]
8pub fn setup(gbi: &mut GBICommandRegistry, rsp: &mut RSP) {
9 f3dex2::setup(gbi, rsp);
10 gbi.register(OpCode::TEXRECT.bits(), TextureRectangle);
11 gbi.register(OpCode::TEXRECTFLIP.bits(), TextureRectangle);
12 gbi.register(OpCode::FILLRECT.bits(), FillRectangle);
13}
14
15gbi_command!(TextureRectangle, |params: &mut GBICommandParams| {
16 let w0 = unsafe { (*(*params.command)).words.w0 };
17 let w1 = unsafe { (*(*params.command)).words.w1 };
18
19 let opcode = (w0 >> 24) as u8;
20
21 let lrx = get_cmd(w0, 0, 24) << 8 >> 8;
22 let lry = get_cmd(w1, 0, 24) << 8 >> 8;
23 let tile = get_cmd(w1, 24, 3);
24
25 unsafe {
26 *params.command = (*params.command).add(1);
27 }
28 let w0 = unsafe { (*(*params.command)).words.w0 };
29 let w1 = unsafe { (*(*params.command)).words.w1 };
30
31 let ulx = get_cmd(w0, 0, 24) << 8 >> 8;
32 let uls = get_cmd(w1, 16, 16);
33 let ult = get_cmd(w1, 0, 16);
34
35 unsafe {
36 *params.command = (*params.command).add(1);
37 }
38 let w0 = unsafe { (*(*params.command)).words.w0 };
39 let w1 = unsafe { (*(*params.command)).words.w1 };
40
41 let uly = get_cmd(w0, 0, 24) << 8 >> 8;
42 let dsdx = get_cmd(w1, 16, 16);
43 let dtdy = get_cmd(w1, 0, 16);
44
45 params.rdp.draw_texture_rectangle(
46 params.rsp,
47 params.output,
48 ulx as i32,
49 uly as i32,
50 lrx as i32,
51 lry as i32,
52 tile as u8,
53 uls as i16,
54 ult as i16,
55 dsdx as i16,
56 dtdy as i16,
57 opcode == OpCode::TEXRECTFLIP.bits(),
58 );
59
60 GBIResult::Continue
61});
62
63gbi_command!(FillRectangle, |params: &mut GBICommandParams| {
64 let w0 = unsafe { (*(*params.command)).words.w0 };
65 let w1 = unsafe { (*(*params.command)).words.w1 };
66
67 let lrx = get_cmd(w0, 0, 24) << 8 >> 8;
68 let lry = get_cmd(w1, 0, 24) << 8 >> 8;
69
70 unsafe {
71 *params.command = (*params.command).add(1);
72 }
73 let w0 = unsafe { (*(*params.command)).words.w0 };
74 let w1 = unsafe { (*(*params.command)).words.w1 };
75
76 let ulx = get_cmd(w0, 0, 24) << 8 >> 8;
77 let uly = get_cmd(w1, 0, 24) << 8 >> 8;
78
79 params.rdp.fill_rect(
80 params.rsp,
81 params.output,
82 ulx as i32,
83 uly as i32,
84 lrx as i32,
85 lry as i32,
86 );
87
88 GBIResult::Continue
89});