interlacing mode

This commit is contained in:
h4570
2022-07-24 23:03:48 +02:00
parent 7c1ab0bfaa
commit c1f88d2f15
5 changed files with 29 additions and 17 deletions
@@ -33,6 +33,11 @@ class RendererSettings {
const float& getProjectionScale() const { return projectionScale; }
const float& getAspectRatio() const { return aspectRatio; }
float getInterlacedHeightF() const { return getHeight() / 2; }
unsigned int getInterlacedHeightUI() const {
return static_cast<unsigned int>(getInterlacedHeightF());
}
static void copy(RendererSettings* out, const RendererSettings* in);
void set(const RendererSettings& v);
@@ -88,10 +88,11 @@ void RendererCore2D::render(Sprite* sprite,
packet2_utils_gs_add_texbuff_clut(packet, texBuffers.core, clutBuffer);
draw_enable_blending();
packet2_update(packet, draw_rect_textured(packet->next, 0, rect));
packet2_update(packet, draw_primitive_xyoffset(
packet->next, 0,
SCREEN_CENTER - (settings->getWidth() / 2.0F),
SCREEN_CENTER - (settings->getHeight() / 2.0F)));
packet2_update(
packet,
draw_primitive_xyoffset(
packet->next, 0, SCREEN_CENTER - (settings->getWidth() / 2.0F),
SCREEN_CENTER - (settings->getInterlacedHeightF() / 2.0F)));
draw_disable_blending();
packet2_update(packet, draw_finish(packet->next));
@@ -37,7 +37,7 @@ void RendererCore3D::setFov(const float& t_fov) {
void RendererCore3D::setProjection() {
projection = M4x4::perspective(
fov, settings->getWidth(), settings->getHeight(),
fov, settings->getWidth(), settings->getInterlacedHeightF(),
settings->getProjectionScale(), settings->getAspectRatio(),
settings->getNear(), settings->getFar());
}
@@ -52,12 +52,12 @@ void RendererCoreGS::initChannels() {
}
void RendererCoreGS::allocateBuffers() {
const u16 psm = 24;
const u16 psm = 32;
frameBuffers[0].width = static_cast<unsigned int>(settings->getWidth());
frameBuffers[0].height = static_cast<unsigned int>(settings->getHeight());
frameBuffers[0].height = settings->getInterlacedHeightUI();
frameBuffers[0].mask = 0;
frameBuffers[0].psm = GS_PSM_24;
frameBuffers[0].psm = GS_PSM_32;
frameBuffers[0].address =
graph_vram_allocate(frameBuffers[0].width, frameBuffers[0].height,
frameBuffers[0].psm, GRAPH_ALIGN_PAGE);
@@ -73,15 +73,20 @@ void RendererCoreGS::allocateBuffers() {
zBuffer.enable = DRAW_ENABLE;
zBuffer.mask = 0;
zBuffer.method = ZTEST_METHOD_GREATER_EQUAL;
zBuffer.zsm = GS_ZBUF_24;
zBuffer.zsm = GS_ZBUF_32;
zBuffer.address =
graph_vram_allocate(frameBuffers[0].width, frameBuffers[0].height,
zBuffer.zsm, GRAPH_ALIGN_PAGE);
TYRA_LOG("Framebuffers, zBuffer set and allocated!");
// Initialize the screen and tie the first framebuffer to the read circuits.
graph_initialize(frameBuffers[1].address, frameBuffers[1].width,
frameBuffers[1].height, frameBuffers[1].psm, 0, 0);
graph_set_mode(GRAPH_MODE_INTERLACED, GRAPH_MODE_NTSC, GRAPH_MODE_FRAME,
GRAPH_ENABLE);
graph_set_screen(0, 0, static_cast<int>(settings->getWidth()),
static_cast<int>(settings->getHeight()));
graph_set_bgcolor(0, 0, 0);
graph_set_framebuffer_filtered(frameBuffers[1].address, frameBuffers[1].width,
frameBuffers[1].psm, 0, 0);
graph_enable_output();
spaceOccupiedByFrameBuffers =
((frameBuffers[0].width / 100.0F) * (frameBuffers[0].height / 100.0F) *
@@ -96,10 +101,11 @@ void RendererCoreGS::initDrawingEnvironment() {
packet2_t* packet2 = packet2_create(20, P2_TYPE_NORMAL, P2_MODE_NORMAL, 0);
packet2_update(packet2, draw_setup_environment(packet2->base, 0, frameBuffers,
&zBuffer));
packet2_update(packet2, draw_primitive_xyoffset(
packet2->next, 0,
screenCenter - (settings->getWidth() / 2.0F),
screenCenter - (settings->getHeight() / 2.0F)));
packet2_update(
packet2,
draw_primitive_xyoffset(
packet2->next, 0, screenCenter - (settings->getWidth() / 2.0F),
screenCenter - (settings->getInterlacedHeightF() / 2.0F)));
packet2_update(packet2, draw_finish(packet2->next));
dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true);
dma_channel_wait(DMA_CHANNEL_GIF, 0);
+1 -1
View File
@@ -113,7 +113,7 @@ void H4570::init() {
blocks[i].color = Color(128.0F, 128.0F, 128.0F, 128.0F);
}
engine->audio.playSong();
// engine->audio.playSong();
engine->renderer.setFrameLimit(false);
}