68 EXPECT_EQ(info_00.draw_routine_id, 0);
69 EXPECT_EQ(info_00.routine_name,
"Rightwards2x2_1to15or32");
70 EXPECT_TRUE(info_00.is_horizontal);
73 EXPECT_EQ(info_01.draw_routine_id, 1);
74 EXPECT_EQ(info_01.routine_name,
"Rightwards2x4_1to15or26");
75 EXPECT_TRUE(info_01.is_horizontal);
78 EXPECT_EQ(info_09.draw_routine_id, 5);
79 EXPECT_EQ(info_09.routine_name,
"DiagonalAcute_1to16");
80 EXPECT_FALSE(info_09.is_horizontal);
83 EXPECT_EQ(info_34.draw_routine_id, 16);
84 EXPECT_EQ(info_34.routine_name,
"Rightwards1x1Solid_1to16_plus3");
85 EXPECT_TRUE(info_34.is_horizontal);
89 EXPECT_EQ(info_unknown.draw_routine_id, 16);
90 EXPECT_EQ(info_unknown.routine_name,
"DefaultSolid");
96 auto palette_group = CreateTestPaletteGroup();
101 auto status = drawer.
DrawObject(floor_object, bg1_, bg2_, palette_group);
103 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
107 stair_object.
set_rom(rom_.get());
109 status = drawer.
DrawObject(stair_object, bg1_, bg2_, palette_group);
110 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
114 block_object.
set_rom(rom_.get());
116 status = drawer.
DrawObject(block_object, bg1_, bg2_, palette_group);
117 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
123 auto palette_group = CreateTestPaletteGroup();
127 bg1_object.
set_rom(rom_.get());
129 auto status = drawer.
DrawObject(bg1_object, bg1_, bg2_, palette_group);
130 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
134 bg2_object.
set_rom(rom_.get());
136 status = drawer.
DrawObject(bg2_object, bg1_, bg2_, palette_group);
137 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
143 auto palette_group = CreateTestPaletteGroup();
147 small_object.
set_rom(rom_.get());
149 auto status = drawer.
DrawObject(small_object, bg1_, bg2_, palette_group);
150 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
154 large_object.
set_rom(rom_.get());
156 status = drawer.
DrawObject(large_object, bg1_, bg2_, palette_group);
157 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
161 max_object.
set_rom(rom_.get());
163 status = drawer.
DrawObject(max_object, bg1_, bg2_, palette_group);
164 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
170 auto palette_group = CreateTestPaletteGroup();
174 origin_object.
set_rom(rom_.get());
176 auto status = drawer.
DrawObject(origin_object, bg1_, bg2_, palette_group);
177 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
180 RoomObject zero_size_object(0x34, 10, 10, 0, 0);
181 zero_size_object.
set_rom(rom_.get());
183 status = drawer.
DrawObject(zero_size_object, bg1_, bg2_, palette_group);
184 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
187 RoomObject max_coord_object(0x34, 63, 63, 1, 0);
188 max_coord_object.
set_rom(rom_.get());
190 status = drawer.
DrawObject(max_coord_object, bg1_, bg2_, palette_group);
191 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
197 auto palette_group = CreateTestPaletteGroup();
199 std::vector<RoomObject> objects;
202 objects.emplace_back(0x00, 5, 5, 3, 0);
203 objects.emplace_back(0x01, 10, 10, 2, 0);
204 objects.emplace_back(0x09, 15, 15, 4, 0);
205 objects.emplace_back(0x34, 20, 20, 1, 1);
208 for (
auto& obj : objects) {
209 obj.set_rom(rom_.get());
212 auto status = drawer.
DrawObjectList(objects, bg1_, bg2_, palette_group);
213 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
219 auto palette_group = CreateTestPaletteGroup();
223 rightward_obj.
set_rom(rom_.get());
225 auto status = drawer.
DrawObject(rightward_obj, bg1_, bg2_, palette_group);
226 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
230 diagonal_obj.
set_rom(rom_.get());
232 status = drawer.
DrawObject(diagonal_obj, bg1_, bg2_, palette_group);
233 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
239 status = drawer.
DrawObject(solid_obj, bg1_, bg2_, palette_group);
240 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
246 auto palette_group = CreateTestPaletteGroup();
250 auto status = drawer.
DrawObject(test_object, bg1_, bg2_, palette_group);
251 EXPECT_FALSE(status.ok());
252 EXPECT_EQ(status.code(), absl::StatusCode::kFailedPrecondition);
260 for (
int id = 0;
id <= 0x40;
id += 4) {
262 EXPECT_GE(info.draw_routine_id, 0);
263 EXPECT_LT(info.draw_routine_id, 25);
264 EXPECT_FALSE(info.routine_name.empty());
268 std::vector<int16_t> important_objects = {
269 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
270 0x0A, 0x0B, 0x15, 0x16, 0x21, 0x22, 0x2F, 0x30, 0x31, 0x32,
271 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
272 0x3D, 0x3E, 0x3F, 0x40
275 for (int16_t obj_id : important_objects) {
277 EXPECT_GE(info.draw_routine_id, 0);
278 EXPECT_LT(info.draw_routine_id, 25);
279 EXPECT_FALSE(info.routine_name.empty());
282 EXPECT_GT(info.tile_count, 0);
283 EXPECT_LE(info.tile_count, 64);
290 auto palette_group = CreateTestPaletteGroup();
292 std::vector<RoomObject> objects;
295 for (
int i = 0; i < 100; ++i) {
297 int x = (i * 2) % 60;
298 int y = (i * 3) % 60;
299 int size = (i % 8) + 1;
302 objects.emplace_back(
id, x, y, size, layer);
303 objects.back().set_rom(rom_.get());
307 auto start_time = std::chrono::high_resolution_clock::now();
309 auto status = drawer.
DrawObjectList(objects, bg1_, bg2_, palette_group);
311 auto end_time = std::chrono::high_resolution_clock::now();
312 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
313 end_time - start_time);
315 EXPECT_TRUE(status.ok() || status.code() == absl::StatusCode::kOk);
318 EXPECT_LT(duration.count(), 1000);
320 std::cout <<
"Drew 100 objects in " << duration.count() <<
"ms" << std::endl;
absl::Status DrawObjectList(const std::vector< RoomObject > &objects, gfx::BackgroundBuffer &bg1, gfx::BackgroundBuffer &bg2, const gfx::PaletteGroup &palette_group)
Draw all objects in a room.
absl::Status DrawObject(const RoomObject &object, gfx::BackgroundBuffer &bg1, gfx::BackgroundBuffer &bg2, const gfx::PaletteGroup &palette_group)
Draw a room object to background buffers.