diff --git a/Makefile b/Makefile index dbeb322..dc39c65 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ OPT = -O2 MAKEFILE_PATH := $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))) LIB ?= $(MAKEFILE_PATH)/dreamcast -CFLAGS += -I$(MAKEFILE_PATH) +CFLAGS += -I$(MAKEFILE_PATH)/ +CFLAGS += -I$(MAKEFILE_PATH)/src CFLAGS += -I$(MAKEFILE_PATH)/dreamcast CFLAGS += -Wno-error=strict-aliasing -fno-strict-aliasing CARCH = -m4-single -ml diff --git a/src/graphics.cpp b/src/graphics.cpp index 2f9eabd..d2c0d85 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -25,25 +25,9 @@ #include "font/tandy1k.data.h" #include "framebuffer.hpp" -#include "src/scene/tracker/scene.hpp" - -constexpr uint32_t ta_alloc = 0 - | ta_alloc_ctrl::pt_opb::_32x4byte - | ta_alloc_ctrl::tm_opb::no_list - | ta_alloc_ctrl::t_opb::_8x4byte - | ta_alloc_ctrl::om_opb::no_list - | ta_alloc_ctrl::o_opb::_32x4byte; - -constexpr int ta_cont_count = 1; -constexpr struct opb_size opb_size[ta_cont_count] = { - { - .opaque = 32 * 4, - .opaque_modifier = 0, - .translucent = 8 * 4, - .translucent_modifier = 0, - .punch_through = 32 * 4 - } -}; +#include "scene/scene.hpp" +#include "scene/tracker/scene.hpp" +#include "graphics.hpp" static volatile int ta_in_use = 0; static volatile int core_in_use = 0; @@ -51,6 +35,12 @@ static volatile int next_frame = 0; static volatile int framebuffer_ix = 0; static volatile int next_frame_ix = 0; +static const scene::scene scenes[] = { + scene::tracker::scene, +}; + +static const scene::scene * current_scene = &scenes[0]; + void graphics_interrupt(uint32_t istnrm) { if (istnrm & istnrm::v_blank_in) { @@ -152,22 +142,25 @@ void graphics_init() background_parameter2(texture_memory_alloc.background[0].start, 0xff800080); + transfer_textures(); + transfer_palettes(); +} + +void graphics_scene_init() +{ region_array_multipass(framebuffer.tile_width(), framebuffer.tile_height(), - opb_size, + ¤t_scene->opb_size, ta_cont_count, texture_memory_alloc.region_array.start, texture_memory_alloc.object_list.start); - - transfer_textures(); - transfer_palettes(); } void graphics_event(ta_parameter_writer& writer) { writer.offset = 0; - tracker::scene::transfer(writer); + scene::tracker::transfer(writer); while (ta_in_use); while (core_in_use); @@ -176,8 +169,8 @@ void graphics_event(ta_parameter_writer& writer) texture_memory_alloc.isp_tsp_parameters.end, texture_memory_alloc.object_list.start, texture_memory_alloc.object_list.end, - opb_size[0].total(), - ta_alloc, + current_scene->opb_size.total(), + current_scene->ta_alloc, framebuffer.tile_width(), framebuffer.tile_height()); ta_polygon_converter_writeback(writer.buf, writer.offset); diff --git a/src/graphics.hpp b/src/graphics.hpp index 078a94a..c70b6e5 100644 --- a/src/graphics.hpp +++ b/src/graphics.hpp @@ -4,6 +4,9 @@ #include "holly/ta_parameter.hpp" +constexpr int ta_cont_count = 1; + void graphics_interrupt(uint32_t istnrm); void graphics_init(); void graphics_event(ta_parameter_writer& writer); +void graphics_scene_init(); diff --git a/src/main.cpp b/src/main.cpp index 6a3aea4..22e35f8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -239,6 +239,7 @@ void main() const float aica_clock_multiplier = 44.1; load_xm(aica_clock_multiplier); graphics_init(); + graphics_scene_init(); test_pattern(); diff --git a/src/scene/scene.hpp b/src/scene/scene.hpp new file mode 100644 index 0000000..5e60a77 --- /dev/null +++ b/src/scene/scene.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "holly/region_array.hpp" + +namespace scene { + +struct scene { + const uint32_t ta_alloc; + const struct opb_size opb_size; + void (* const transfer)(ta_parameter_writer& writer); +}; + +} diff --git a/src/scene/tracker/channel_status.cpp b/src/scene/tracker/channel_status.cpp index 41b92d8..a3b69b7 100644 --- a/src/scene/tracker/channel_status.cpp +++ b/src/scene/tracker/channel_status.cpp @@ -22,8 +22,7 @@ static inline int round_up(int n, int m) return n + m - rem; } -namespace tracker { - namespace channel_status { +namespace scene::tracker::channel_status { void transfer(ta_parameter_writer& writer, int x, int y) { @@ -99,5 +98,4 @@ void transfer(ta_parameter_writer& writer, int x, int y) //borders(writer, x, y); } - } } diff --git a/src/scene/tracker/channel_status.hpp b/src/scene/tracker/channel_status.hpp index 94cc607..cd6d444 100644 --- a/src/scene/tracker/channel_status.hpp +++ b/src/scene/tracker/channel_status.hpp @@ -2,8 +2,6 @@ #include "holly/ta_parameter.hpp" -namespace tracker { - namespace channel_status { - void transfer(ta_parameter_writer& writer, int x, int y); - } +namespace scene::tracker::channel_status { + void transfer(ta_parameter_writer& writer, int x, int y); } diff --git a/src/scene/tracker/notes.cpp b/src/scene/tracker/notes.cpp index 8b67d6a..ca446cb 100644 --- a/src/scene/tracker/notes.cpp +++ b/src/scene/tracker/notes.cpp @@ -172,8 +172,7 @@ static void transfer_line(ta_parameter_writer& writer, int line_index, int x, in } } -namespace tracker { - namespace notes { +namespace scene::tracker::notes { void borders(ta_parameter_writer& writer, int x, int y) { @@ -249,5 +248,4 @@ void transfer_middle_line(ta_parameter_writer& writer, float x, float y) 0x202020); } - } } diff --git a/src/scene/tracker/notes.hpp b/src/scene/tracker/notes.hpp index bbf736d..e9a49de 100644 --- a/src/scene/tracker/notes.hpp +++ b/src/scene/tracker/notes.hpp @@ -2,12 +2,10 @@ #include "holly/ta_parameter.hpp" -namespace tracker { - namespace notes { +namespace scene::tracker::notes { - void borders(ta_parameter_writer& writer, int x, int y); - void transfer_lines(ta_parameter_writer& writer, int x, int y); - void transfer_middle_line(ta_parameter_writer& writer, float x, float y); + void borders(ta_parameter_writer& writer, int x, int y); + void transfer_lines(ta_parameter_writer& writer, int x, int y); + void transfer_middle_line(ta_parameter_writer& writer, float x, float y); - } } diff --git a/src/scene/tracker/scene.cpp b/src/scene/tracker/scene.cpp index bea98bd..81f9686 100644 --- a/src/scene/tracker/scene.cpp +++ b/src/scene/tracker/scene.cpp @@ -1,50 +1,50 @@ -#include "../../ta_parameter.hpp" +#include "holly/ta_bits.hpp" + +#include "ta_parameter.hpp" #include "notes.hpp" #include "channel_status.hpp" +#include "scene/scene.hpp" -namespace tracker { - namespace scene { +namespace scene::tracker { -void transfer(ta_parameter_writer& writer) -{ - const int x = 3; - const int y = 100; + void transfer(ta_parameter_writer& writer) + { + const int x = 3; + const int y = 100; - { // punch-through - global_polygon_textured(writer, - para_control::list_type::punch_through); + { // punch-through + global_polygon_textured(writer, + para_control::list_type::punch_through); - tracker::notes::transfer_lines(writer, x, y); + tracker::notes::transfer_lines(writer, x, y); - writer.append() = - ta_global_parameter::end_of_list(para_control::para_type::end_of_list); - } + writer.append() = + ta_global_parameter::end_of_list(para_control::para_type::end_of_list); + } - { // translucent - global_polygon_untextured(writer, - para_control::list_type::translucent, - tsp_instruction_word::dst_alpha_instr::one); + { // translucent + global_polygon_untextured(writer, + para_control::list_type::translucent, + tsp_instruction_word::dst_alpha_instr::one); - tracker::notes::transfer_middle_line(writer, x, y); + tracker::notes::transfer_middle_line(writer, x, y); - writer.append() = - ta_global_parameter::end_of_list(para_control::para_type::end_of_list); - } + writer.append() = + ta_global_parameter::end_of_list(para_control::para_type::end_of_list); + } - { // opaque - global_polygon_untextured(writer, - para_control::list_type::opaque, - tsp_instruction_word::dst_alpha_instr::zero); + { // opaque + global_polygon_untextured(writer, + para_control::list_type::opaque, + tsp_instruction_word::dst_alpha_instr::zero); - tracker::notes::borders(writer, x, y); + tracker::notes::borders(writer, x, y); - tracker::channel_status::transfer(writer, 0, 0); - - writer.append() = - ta_global_parameter::end_of_list(para_control::para_type::end_of_list); - } -} + tracker::channel_status::transfer(writer, 0, 0); + writer.append() = + ta_global_parameter::end_of_list(para_control::para_type::end_of_list); + } } } diff --git a/src/scene/tracker/scene.hpp b/src/scene/tracker/scene.hpp index 6d2d32a..49d835b 100644 --- a/src/scene/tracker/scene.hpp +++ b/src/scene/tracker/scene.hpp @@ -1,7 +1,22 @@ #pragma once -namespace tracker { - namespace scene { - void transfer(ta_parameter_writer& writer); - } +namespace scene::tracker { + + void transfer(ta_parameter_writer& writer); + + struct scene::scene scene = { + .ta_alloc = ta_alloc_ctrl::pt_opb::_32x4byte + | ta_alloc_ctrl::tm_opb::no_list + | ta_alloc_ctrl::t_opb::_8x4byte + | ta_alloc_ctrl::om_opb::no_list + | ta_alloc_ctrl::o_opb::_32x4byte, + .opb_size = { + .opaque = 32 * 4, + .opaque_modifier = 0, + .translucent = 8 * 4, + .translucent_modifier = 0, + .punch_through = 32 * 4 + }, + .transfer = transfer, + }; }