From e49fff118c08af6ca0838ea393043ddf31464d33 Mon Sep 17 00:00:00 2001 From: 7shades Date: Mon, 29 Dec 2025 15:21:02 -0800 Subject: [PATCH 1/8] Added Rotation parameter switching to RBG0 interface --- saturnringlib/srl_vdp2.hpp | 378 ++++++++++++++++++++++++++++++------- 1 file changed, 312 insertions(+), 66 deletions(-) diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index 6cb0837a..cec60f79 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -94,7 +94,7 @@ namespace SRL /** @brief Currently allocated bottom RAM bank zones */ - inline static uint8_t* currentBot[4] = { (uint8_t*)VDP2_VRAM_A0,(uint8_t*)VDP2_VRAM_A1,(uint8_t*)VDP2_VRAM_B0,(uint8_t*)VDP2_VRAM_B1 };; + inline static uint8_t* currentBot[4] = { (uint8_t*)VDP2_VRAM_A0,(uint8_t*)VDP2_VRAM_A1,(uint8_t*)VDP2_VRAM_B0,(uint8_t*)VDP2_VRAM_B1 }; /** @brief Currently allocated top RAM bank zones */ @@ -544,6 +544,21 @@ namespace SRL return Address; } + /** @brief Registers the ScrollScreen to Display SRL's Debug Ascii Scroll + * @note The Ascii Scroll is not compatible with Rotation Scroll RBG0 + * @note The Ascii scroll data is stored outside The VRAM allocation region, so + * should not be written with the ScrollScreen loading functions. Manage loading + * fonts with the SRL::ASCII module instead. Furthermore, + */ + inline static void SetAsciiScroll() + { + SRL::Tilemap::TilemapInfo AsciiInfo(CRAM::TextureColorMode::Paletted16, PNB_1WORD|CN_10BIT, + CHAR_SIZE_1x1,PL_SIZE_1x1,1,1,0); + ScreenType::SetCellAdress((void*)(VDP2_VRAM_B1 + 0x1D000),0); + ScreenType::SetMapAddress((void*)(VDP2_VRAM_B1 + 0x1E000),0); + ScreenType::Init(AsciiInfo); + } + /** @brief Registers Scroll in VDP2 cycle pattern to enable display of this Scroll Screen * @details Asserts when registration of a scroll fails due to cycle pattern conflicts. * Possible causes: @@ -1124,7 +1139,7 @@ namespace SRL }; /** @brief setting for RBG0,1 rotation constraints - * @note more axis require more VRAM resources + * @note More simulated axis require more VRAM resources. */ enum class RotationMode { @@ -1133,17 +1148,74 @@ namespace SRL */ OneAxis, - /** @brief 3d rotation with pitch and yaw, but no roll (modified per line) + /** @brief 3d rotation with pitch and yaw, but no roll (scale modified per line) * @note Requires 0x2000-0x18000 bytes in arbitrary VRAM Bank (No cycles) */ TwoAxis, - /** @brief Full 3d rotation with pitch, yaw and roll (modified per pixel) + /** @brief Full 3d rotation with pitch, yaw and roll (scale modified per pixel) * @note Requires 0x2000-0x18000 bytes in Reserved VRAM bank (8 cycles) */ ThreeAxis, }; + /** @brief Options for treating display of rotation parameters outside of the + * main tilemap/bitmap area + */ + enum class OverPattern + { + + /** @brief Screen areas outside the tilemap repeat the full tilemap pattern + */ + RepeatMap, + + /** @brief Screen areas outside the tilemap repeat a single selectable tile from the + * tileset + * @note Not available in Bitmap Mode + */ + RepeatTile, + + /** @brief Screen areas outside the tilemap are filled with transparent pixels + */ + Transparent, + + /** @brief Areas outside a 512x512 square centered at coordintate [256,256] + * are made transparent regardless of the underlying map size + */ + Transparent512x512, + + }; + + /** @brief Options for switching between the 2 Rotation parameters available for RBG0 display + */ + enum class SwitchMode + { + /** @brief Only display Tilemap A (Primary Tilemap and rotation params) + */ + OnlyA = 0, + + /** @brief Only display Tilemap B (Secondary Tilemap and rotation params) + */ + OnlyB = 1, + + /** @brief Switch RBG0 Tilemap display based on perspective + * @details In regions of the screen beyond parameter A's 'simulated horizon'*, + * Rotation parameter B will be displayed + * @note *(More technically, any screen coordinate where the scaling coefficient + * data read for Parameter A is 0 will display Parameter B data instead). + */ + PerspectiveSwitch, + + /** @brief Switch RBG0 rotation display based on a VDP2 Window + * @details Rotation A displays in regions inside the selected VDP2 window While + * Rotation B displays outside the window + */ + WindowSwitch, + }; + + + + /** @brief RBG0 interface * @details Rotating Background Scroll 0: * -Available color depths: Paletted16, Paletted256, RBG555 @@ -1158,18 +1230,35 @@ namespace SRL /** @brief VRAM Address of RBG0 Coefficient table */ inline static void* KtableAddress = (void*)(VDP2_VRAM_A0 - 1); - + + /** @brief VRAM Address of RBG0 Coefficient table B + */ + inline static void* KtableAddressB = (void*)(VDP2_VRAM_A0 - 1); + /** @brief VRAM Address of TilemapB map data + */ + inline static void* MapAddressRB = (void*)(VDP2_VRAM_A0 - 1); + /** @brief VRAM Address of TilemapB cell data + */ + inline static void* CellAddressRB = (void*)(VDP2_VRAM_A0 - 1); + + /** @brief Initializes the ScrollScreen's tilemap specifications * @param info Tile map info + * @note This function initializes both parameters RA and RB to use + * the primary tilemap. To use a secondary tilemap in RB, call LoadTilemapB()/InitB() + * after loading and initializing the primary tilemap. */ inline static void Init(SRL::Tilemap::TilemapInfo& info) { slRparaMode(RA); slOverRA(0); + slOverRB(0); slCharRbg0(info.SGLColorMode(), info.CharSize); slPageRbg0(RBG0::CellAddress, (void*)RBG0::TilePalette.GetData(), info.MapMode); slPlaneRA(info.PlaneSize); + slPlaneRB(info.PlaneSize); sl1MapRA(RBG0::MapAddress); + sl1MapRB(RBG0::MapAddress); } /** @brief Initializes the ScrollScreen's bitmap specifications * @param info bitmap info @@ -1188,63 +1277,192 @@ namespace SRL } else slBMPaletteRbg0(RBG0::TilePalette.GetId()); } + + inline static bool InitB(SRL::Tilemap::TilemapInfo info) + { + if(info.MapMode!= RBG0::Info.MapMode || info.SGLColorMode()!=RBG0::Info.SGLColorMode()||info.CharSize!=RBG0::Info.CharSize) + { + SRL::Debug::Assert("RBG0 Tilemap B Load Failed: Tilemap B format does not match primary tilemap"); + return false; + } + slPlaneRB(info.PlaneSize); + sl1MapRB(MapAddressRB); + return true; + } + /** @brief Load a tilemap to be used with the secondary rotation parameters (RB) + * @details RBG0 can display 2 different tilemaps on screen with different + * rotatation parameters in areas that do not overlap. Use to load + * a secondary tilemap for RBG0. + * @note Due to shared registers, The Secondary Tilemap must be in the same + * color mode as the Primary Tilemap and its data must be able to fit within the same + * Reserved VRAM banks as the primary data. Loading fails if these conditions are not met. + * Always Load/ initialize Primary tilemap A before loading data for B + * @param tilemap Itilemap to load with + * @param mode (Optional) specify how to switch between the Primary and Secondary Tilemap during display + * (default = PerspectiveSwitch) + */ + inline static void LoadTilemapB(SRL::Tilemap::ITilemap& tilemap, VDP2::SwitchMode mode = VDP2::SwitchMode::PerspectiveSwitch) + { + SRL::Tilemap::TilemapInfo info = tilemap.GetInfo(); + + if(!InitB(info))return; + if(CellAddressRB<(void*)VDP2_VRAM_A0) CellAddressRB = VRAM::Allocate(info.CellByteSize, 32, VramBank::A0, 0); + if(((uint32_t)(CellAddressRB)& 0xfff80000)!= ((uint32_t)(CellAddress)& 0xfff80000)) + { + SRL::Debug::Assert("RBG0 Tilemap B Load Failed: Insufficient VRAM available"); + } + } + /** @brief Sets How screen regions outside the tilemap area are displayed in + * the Primary Rotation Parameter (RA) + * @param mode the display mode to select + * @param tileIndex (Optional)The tile index to display in exterior regions if RepeatTile is + * selected as mode (defaults to tile 0) + * @note see OverPattern documentatioin for descriptions of available modes + */ + inline static void SetOverDisplayA(VDP2::OverPattern mode, uint16_t tileIndex = 0) + { + slOverPatRA(tileIndex); + slOverRA((uint16_t)mode); + } + /** @brief Sets How screen regions outside the tilemap area are to be displayed in + * the Second Rotation Parameter (RB) + * @param mode the display mode to select + * @param tileIndex (Optional)The tile index to display in exterior regions if RepeatTile is + * selected as mode (defaults to tile 0) + * @note see OverPattern documentatioin for descriptions of available modes + */ + inline static void SetOverDisplayB(VDP2::OverPattern mode, uint16_t tileIndex = 0) + { + slOverPatRA(tileIndex); + slOverRA((uint16_t)mode); + } + /** @brief Sets Condition for displaying Primary and Secondary parameters/Tilemaps on screen. + * @param mode the display mode to select + * @note See SwitchMode documentation for description of available modes + * @note If a mode is selected that displays Secondary Parameter (RB) but no + * tilemap has previously been loaded with LoadTilemapB, RB will use the same + * source tilemap as primary parameter (RA) + */ + inline static void SetParameterDisplay(SwitchMode mode) + { + slRparaMode((uint16_t)mode); + } + /** @brief Select what type of rotation to use for the rotating scroll (Call before Loading RBG0) - * @param mode The RotationMode to use for this scroll - * @param vblank Chose to update VRAM at VBLANK to reduce amount of coefficient + * @param mode The RotationMode to use for RBG0 + * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of coefficient * data required for rotation of a plane (default = true) * @note when 2 or 3 axis rotation is Selected, VRAM will be allocated to store - * necessary coefficient data. If Vblank is set false, all coefficients will be - * statically stored in VRAM as a 0x18000 byte table. If Vblank is set true, only - * the coefficients necessary for the current frame will be dynamically written - * to VRAM at Vblank, reducing VRAM footprint to 0x2000 bytes per - * rotation parameter but increasing required Vblank overhead. + * necessary scaling coefficients. If Vblank is set false, all coefficients will be + * statically stored in VRAM as a 0x18000 byte table. If Vblank is set true, the + * the coefficients for the perspective of the current frame will be + * written to VRAM at each Vblank, reducing VRAM footprint to 0x2000 bytes per + * rotation parameter but increasing required Vblank overhead. If the transfer can + * not complete within Vblank window, screen tearing may be visible in the plane. */ inline static void SetRotationMode(VDP2::RotationMode mode, bool vblank = true) { - //slRparaInitSet((ROTSCROLL*)(VDP2_VRAM_B1 + 0x1ff00)); + //Allocate coeficient tables if necessary for either param: + if(mode!=VDP2::RotationMode::OneAxis) + { + if(vblank==true) + { + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddressB =(void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); + } + else + { + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); + VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; + } + } + //set mode of params A and B switch (mode) { case RotationMode::OneAxis: slKtableRA(nullptr, K_OFF); - //VDP2_RAMCTL &= 0xffcf; // Bypasses problem in slKtableRA: this never resets if K_DOT was previously specified + slKtableRB(nullptr, K_OFF); break; - case RotationMode::TwoAxis: - if (!vblank) + case RotationMode::TwoAxis: + slKtableRA((void*)VDP2::RBG0::KtableAddress, K_LINE | K_2WORD | K_ON); + slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_LINE | K_2WORD | K_ON); + break; + + case RotationMode::ThreeAxis: + slKtableRA((void*)VDP2::RBG0::KtableAddress, K_FIX | K_DOT | K_2WORD | K_ON); + slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_FIX | K_DOT | K_2WORD | K_ON); + break; + } + } + + /** @brief Overload to select separate rotation modes for both the primary and secondary + * rotating planes + * @param modeA The RotationMode to use for primary rotation + * @param modeB The RotationMode to use for secondary rotation + * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of coefficient + * data required for rotation of a plane (default = true) + * @note when 2 or 3 axis rotation is Selected, VRAM will be allocated to store + * necessary scaling coefficients. If Vblank is set false, all coefficients will be + * statically stored in VRAM as a 0x18000 byte table. If Vblank is set true, the + * the coefficients for the perspective of the current frame will be + * written to VRAM at each Vblank, reducing VRAM footprint to 0x2000 bytes per + * rotation parameter but increasing required Vblank overhead. If the transfer can + * not complete within Vblank window, screen tearing may be visible in the plane. + */ + inline static void SetRotationMode(VDP2::RotationMode modeA, VDP2::RotationMode modeB,bool vblank = true) + { + //Allocate coeficient tables if necessary for either param: + if(modeA!=VDP2::RotationMode::OneAxis||modeB!=VDP2::RotationMode::OneAxis) + { + if(vblank==true) { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); - slMakeKtable((void*)VDP2::RBG0::KtableAddress); - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_FIX | K_LINE | K_2WORD | K_ON); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddressB = (void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); } else { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x2000, 0x20000, VDP2::VramBank::B0, 0); - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_LINE | K_2WORD | K_ON); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); + VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; } + } - //VDP2_RAMCTL &= 0xffcf;//Bypasses problem in slKtableRA: this never resets if K_DOT was previously specified + //set mode of param A + switch (modeA) + { + case RotationMode::OneAxis: + slKtableRA(nullptr, K_OFF); break; - case RotationMode::ThreeAxis: - if (!vblank) - { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 8); - slMakeKtable((void*)VDP2::RBG0::KtableAddress); - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_FIX | K_DOT | K_2WORD | K_ON); - } - else - { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x2000, 0x20000, VDP2::VramBank::B0, 8); - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_DOT | K_2WORD | K_ON); - } + case RotationMode::TwoAxis: + slKtableRA((void*)VDP2::RBG0::KtableAddress, K_LINE | K_2WORD | K_ON); + break; + case RotationMode::ThreeAxis: + slKtableRA((void*)VDP2::RBG0::KtableAddress, K_FIX | K_DOT | K_2WORD | K_ON); + break; + } + + //set mode of param B + switch (modeB) + { + case RotationMode::OneAxis: + slKtableRB(nullptr, K_OFF); + break; + + case RotationMode::TwoAxis: + slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_LINE | K_2WORD | K_ON); + break; + + case RotationMode::ThreeAxis: + slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_FIX | K_DOT | K_2WORD | K_ON); break; } } - /** @brief Writes the current matrix transform to RBG0RA Rotation parameters - * to update its position and perspective + /** @brief Writes the current matrix transform to main Rotation parameter (RA) + * to update its perspective */ inline static void SetCurrentTransform() { @@ -1256,20 +1474,40 @@ namespace SRL } slPopMatrix(); } + + /** @brief Writes the current matrix transform to secondary rotation parameter (RB) + * to update its perspective + */ + inline static void SetCurrentTransformB() + { + slCurRpara(RB); + slPushMatrix(); + { + slScrMatConv(); + slScrMatSet(); + } + slPopMatrix(); + slCurRpara(RA); + } + /** @brief Sets the plane of Tilemap Data to be displayed * @param a,b,c,d Page Table addresses of the planes to display - * @note Multi Plane Maps are not supported yet for RBG0, only plane a is used + * @note Multi Plane maps must be set with the 16 plane version of this function */ static void SetPlanes(void* a, void* b, void* c, void* d) { sl1MapRA(a); } - /** @brief Sets the plane of Tilemap Data to be displayed with 16 planes + /** @brief Sets the plane of Tilemap Data to be displayed with 16 planes + * @details Unlike NBG scrolls RBG0 only loads with the default tiling of 1 plane. Use this + * function after loading to set the arrangement of multi plane tilemaps within a 4x4 grid: + * |a,b,c,d| + * |e,f,g,h| + * |i,j,k,l| + * |m,n,o,p| * @param layout 4x4 array of uint8_t indices representing the index of each plane in the map layout - * @note Unlike NBG scrolls RBG0 only loads with the default tiling of 1 plane. Use this - * function after loading to set the arrangement of multi plane tilemaps within a 4x4 grid. * @note No check is performed to ensure the indecies entered are within the bounds of * the scroll's map data. Specifying indices larger than the number of planes loaded * will result in the diplay of garbage data in those portions of the map @@ -1411,42 +1649,50 @@ namespace SRL inline static void ClearVRAM() { //reset ScrollScreen VRAM References - VDP2::NBG0::MapAddress = (void*)(VDP2_VRAM_A0 - 1); - VDP2::NBG0::CellAddress = (void*)(VDP2_VRAM_A0 - 1); - VDP2::NBG0::LineAddress = (void*)(VDP2_VRAM_A0 - 1); - - if (VDP2::NBG0::TilePalette.GetData()) + if((int)NBG0::MapAddress<(VDP2_VRAM_B1+0x18000)) { - SRL::CRAM::SetBankUsedState(VDP2::NBG0::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); - VDP2::NBG0::TilePalette = SRL::CRAM::Palette(); + VDP2::NBG0::MapAddress = (void*)(VDP2_VRAM_A0 - 1); + VDP2::NBG0::CellAddress = (void*)(VDP2_VRAM_A0 - 1); + VDP2::NBG0::LineAddress = (void*)(VDP2_VRAM_A0 - 1); + if (VDP2::NBG0::TilePalette.GetData()) + { + SRL::CRAM::SetBankUsedState(VDP2::NBG0::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); + VDP2::NBG0::TilePalette = SRL::CRAM::Palette(); + } } - VDP2::NBG1::MapAddress = (void*)(VDP2_VRAM_A0 - 1); - VDP2::NBG1::CellAddress = (void*)(VDP2_VRAM_A0 - 1); - VDP2::NBG1::LineAddress = (void*)(VDP2_VRAM_A0 - 1); - - if (VDP2::NBG1::TilePalette.GetData()) + if((int)NBG1::MapAddress<(VDP2_VRAM_B1+0x18000)) { - SRL::CRAM::SetBankUsedState(VDP2::NBG1::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); - VDP2::NBG1::TilePalette = SRL::CRAM::Palette(); + VDP2::NBG1::MapAddress = (void*)(VDP2_VRAM_A0 - 1); + VDP2::NBG1::CellAddress = (void*)(VDP2_VRAM_A0 - 1); + VDP2::NBG1::LineAddress = (void*)(VDP2_VRAM_A0 - 1); + if (VDP2::NBG1::TilePalette.GetData()) + { + SRL::CRAM::SetBankUsedState(VDP2::NBG1::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); + VDP2::NBG1::TilePalette = SRL::CRAM::Palette(); + } } - VDP2::NBG2::MapAddress = (void*)(VDP2_VRAM_A0 - 1); - VDP2::NBG2::CellAddress = (void*)(VDP2_VRAM_A0 - 1); - - if (VDP2::NBG2::TilePalette.GetData()) + if((int)NBG2::MapAddress<(VDP2_VRAM_B1+0x18000)) { - SRL::CRAM::SetBankUsedState(VDP2::NBG2::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); - VDP2::NBG2::TilePalette = SRL::CRAM::Palette(); + VDP2::NBG2::MapAddress = (void*)(VDP2_VRAM_A0 - 1); + VDP2::NBG2::CellAddress = (void*)(VDP2_VRAM_A0 - 1); + if (VDP2::NBG2::TilePalette.GetData()) + { + SRL::CRAM::SetBankUsedState(VDP2::NBG2::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); + VDP2::NBG2::TilePalette = SRL::CRAM::Palette(); + } } - VDP2::NBG3::MapAddress = (void*)(VDP2_VRAM_A0 - 1); - VDP2::NBG3::CellAddress = (void*)(VDP2_VRAM_A0 - 1); - - if (VDP2::NBG3::TilePalette.GetData()) + if((int)NBG3::MapAddress<(VDP2_VRAM_B1+0x18000)) { - SRL::CRAM::SetBankUsedState(VDP2::NBG3::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); - VDP2::NBG3::TilePalette = SRL::CRAM::Palette(); + VDP2::NBG3::MapAddress = (void*)(VDP2_VRAM_A0 - 1); + VDP2::NBG3::CellAddress = (void*)(VDP2_VRAM_A0 - 1); + if (VDP2::NBG3::TilePalette.GetData()) + { + SRL::CRAM::SetBankUsedState(VDP2::NBG3::TilePalette.GetId(), VDP2::RBG0::TilePalette.GetMode(), false); + VDP2::NBG3::TilePalette = SRL::CRAM::Palette(); + } } VDP2::RBG0::MapAddress = (void*)(VDP2_VRAM_A0 - 1); From de1835f0617d275ba931a0ab0e884b0544a876cc Mon Sep 17 00:00:00 2001 From: 7shades Date: Mon, 29 Dec 2025 15:33:32 -0800 Subject: [PATCH 2/8] Bug Fix- calling Transparent Disable no longer breaks VDP1 layer display --- saturnringlib/srl_vdp2.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index cec60f79..0fac9df7 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -335,7 +335,7 @@ namespace SRL /** @brief Bitfield recording all Scroll Screens That Disable transparent pixels */ - inline static uint16_t TransparentScrolls = 0; + inline static uint16_t TransparentScrolls = SPRON; /** @brief Functionality available to all Scroll Screen interfaces */ From 2f397960bbe1443d57a5e0c416bc3f8549b26c0f Mon Sep 17 00:00:00 2001 From: 7shades Date: Wed, 14 Jan 2026 18:21:37 -0800 Subject: [PATCH 3/8] -Made Map2Vram and Cell2VRAM public. -ClearVRAM() : Added optional param to disable clearing palettes. -LoadTilemap()/LoadBitmap(): Added optional param to disable auto loading palettes --- saturnringlib/srl_tilemap_interfaces.hpp | 8 +- saturnringlib/srl_vdp2.hpp | 198 +++++++++++++++-------- 2 files changed, 137 insertions(+), 69 deletions(-) diff --git a/saturnringlib/srl_tilemap_interfaces.hpp b/saturnringlib/srl_tilemap_interfaces.hpp index b63be490..31c23f05 100644 --- a/saturnringlib/srl_tilemap_interfaces.hpp +++ b/saturnringlib/srl_tilemap_interfaces.hpp @@ -322,7 +322,7 @@ namespace SRL::Tilemap::Interfaces return this->info; } - /** @brief Copies a rectangular selection of Tilemap data between 2 pages in the tilemap + /** @brief Copies a rectangular selection of Tilemap data between 2 pages in the tilemap * @param sourcePage Index of the Tilemap Page to copy from * @param topLeft Page Coordinates of Top left of region to Copy * @param botRight Page Coordinates of Bottom Right of region Copy @@ -334,7 +334,7 @@ namespace SRL::Tilemap::Interfaces // Check that requested page indicies exist in this map: if (!this->mapData || sourcePage >= this->numPages || destPage >= numPages) - { + { return; } @@ -488,10 +488,12 @@ namespace SRL::Tilemap::Interfaces // Load file uint8_t* imageData = (uint8_t*)(stream + 32); uint32_t* headerData = (uint32_t*)stream; + this->info.CellByteSize = headerData[1]; + uint32_t celSize = this->info.CellByteSize; uint32_t mapSize = headerData[2]; - + //decode color mode switch (headerData[4]) { diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index 0fac9df7..e2e08169 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -34,6 +34,7 @@ namespace SRL Layer6 = 6, Layer7 = 7, }; + /** @brief Options for using color offsets on Scroll Screens * * @details Scroll and sprite screens can apply one of 2 color offsets @@ -84,11 +85,11 @@ namespace SRL */ friend class VDP2; - /** @brief Bottom RAM bank zones + /** @brief Absolute Bottom Address of RAM bank zones */ inline static uint8_t* bankBot[4] = { (uint8_t*)VDP2_VRAM_A0,(uint8_t*)VDP2_VRAM_A1,(uint8_t*)VDP2_VRAM_B0,(uint8_t*)VDP2_VRAM_B1 }; - /** @brief Top RAM bank zones + /** @brief Abolute Top Address of RAM bank zones */ inline static uint8_t* bankTop[4] = { (uint8_t*)VDP2_VRAM_A1,(uint8_t*)VDP2_VRAM_B0,(uint8_t*)VDP2_VRAM_B1,(uint8_t*)(VDP2_VRAM_B1 + 0x18000) }; @@ -105,6 +106,11 @@ namespace SRL */ inline static int8_t bankCycles[4] = { -1,-1,-1,2 };//why will init to 0 not work? + /** @brief Indicates if map data has been stored in bank 0 by a previous allocation + */ + inline static bool MapBankA0 = false; + inline static bool MapBankB0 = false; + public: /** @brief Gets current amount of free VRAM in a bank * @param bank the VRAM bank to get free space in @@ -123,7 +129,7 @@ namespace SRL * @param cycles (Optional) Number of Bank Cycles this data will require to access during frame(0-8). * @return void* start of the Allocated region in VRAM (nullptr if allocation failed) * @note Any VRAM padded to maintain alignment to a requested boundary is rendered inaccessible to further - * allocations until VRAM is cleared and reset. + * allocations until VRAM is reset through VDP2::ClearVram(). */ inline static void* Allocate(uint32_t size, uint32_t boundary, VDP2::VramBank bank, uint8_t cycles = 0) { @@ -154,6 +160,8 @@ namespace SRL * @param info Tile cell data description * @param screen The screen identifier * @return Pointer to the allocated memory + * @note The Maximum supported allocation size is 0x20000 bytes (1 Bank).Single Allocations + * can not be spit between multiple banks */ inline static void* AutoAllocateCell(Tilemap::TilemapInfo& info, uint16_t screen) { @@ -161,10 +169,10 @@ namespace SRL if (screen == scnRBG0) // Reserve all 8 cycles of a bank { - alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::A0, 8); - if (alloc == nullptr) alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::A1, 8); - if (alloc == nullptr) alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::B0, 8); - if (alloc == nullptr) alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::B1, 8); + //alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::A0, 8); + alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::A1, 8); + //if (alloc == nullptr) alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::B0, 8); + //if (alloc == nullptr) alloc = VRAM::Allocate(info.CellByteSize, 32, VramBank::B1, 8); if (alloc == nullptr) SRL::Debug::Assert("RBG Cell Allocation failed: insufficient VRAM"); } else // Base cycle requirement on color type @@ -199,13 +207,15 @@ namespace SRL * @param screen The screen identifier * @param size optional pointer to pass the resulting allocation size back to * @return Pointer to the allocated memory + * @note The Maximum supported allocation size is 0x20000 bytes (1 Bank).Single Allocations + * can not be spit between multiple banks */ inline static void* AutoAllocateMap(Tilemap::TilemapInfo& info, int16_t screen,int* size = nullptr ) { void* alloc = nullptr; uint32_t page_sz = 0x800; uint32_t sz = (info.MapHeight * info.MapWidth) << 1; - + if (info.CharSize == CHAR_SIZE_1x1) page_sz <<= 2; if (info.MapMode == PNB_2WORD) @@ -216,17 +226,30 @@ namespace SRL if (info.PlaneSize == PL_SIZE_2x2) page_sz <<= 2; else if (info.PlaneSize == PL_SIZE_2x1) page_sz <<= 1; - + //if(info.MapByteSize)sz = info.MapByteSize; if (screen == scnRBG0) // Reserve all 8 cycles of bank 0 { alloc = VRAM::Allocate(sz, page_sz, VramBank::A0, 8); if (alloc == nullptr) Debug::Assert("RBG Map Allocation failed: insufficient VRAM"); - else if(size!=nullptr)*size = sz; + else + { + if(size!=nullptr)*size = sz; + MapBankA0 = true; + } } else // Reserve 1 cycle in bank B1 (or B0 if it doesn't conflict with RBG0 map) { - if (bankCycles[0]!=7) alloc = VRAM::Allocate(sz, page_sz, VramBank::A0, 1); - if(!alloc) alloc = VRAM::Allocate(sz, page_sz, VramBank::B1, 1); + alloc = VRAM::Allocate(sz, page_sz, VramBank::B1, 1); + if (alloc == nullptr && MapBankA0==false) + { + alloc = VRAM::Allocate(sz, page_sz, VramBank::B0, 1); + if(alloc)MapBankB0 = true; + } + if((alloc == nullptr) && MapBankB0==false) + { + alloc = VRAM::Allocate(sz, page_sz, VramBank::A0, 1); + if(alloc)MapBankA0 = true; + } if (alloc == nullptr) SRL::Debug::Assert("NBG Map Allocation failed: insufficient VRAM"); else if(size!=nullptr)*size = sz; } @@ -240,6 +263,7 @@ namespace SRL * @param size optional pointer to pass the resulting allocation size back from function * @return Pointer to the allocated memory * @note The maximum allocation size supported is 0x40000 bytes (2 banks of VRAM). + * 2 bank allocations must split either betweeen BankA0 and BankA1, Or BankA1 and BankB0. */ inline static void* AutoAllocateBmp(Bitmap::BitmapInfo& info, int16_t screen, int* size = nullptr) { @@ -287,7 +311,7 @@ namespace SRL } else { - Debug::Assert("Bmp Allocation Failed: Insufficient VRAM"); + Debug::Assert("Bmp Allocation Failed: Insufficient VRAM Available"); return nullptr; } } @@ -298,7 +322,7 @@ namespace SRL if (alloc == nullptr) alloc = VRAM::Allocate(sz, 32, VramBank::B0,numCycles); if (alloc == nullptr) alloc = VRAM::Allocate(sz, 32, VramBank::A1, numCycles); if (alloc == nullptr) alloc = VRAM::Allocate(sz, 32, VramBank::B1, numCycles); - if (alloc == nullptr) SRL::Debug::Assert("Bmp Allocation failed: insufficient VRAM"); + if (alloc == nullptr) SRL::Debug::Assert("Bmp Allocation failed: insufficient VRAM Available"); } if(size) *size = sz; // SRL::Debug::Print(3,17,"Size = %d",size); @@ -435,13 +459,17 @@ namespace SRL * if there is not enough VRAM/cycles available to allocate. * * @param tilemap The Tilemap to load + * @param loadPalette (optional: default = true) Auto load the Tilemap's palette to CRAM if present. + * If a CRAM palette is already assigned, loads to that bank, overwriting existing data. + * If a CRAM palette is not already assigned, attempts to assign palette and asserts if unavailable. + * * @note Manual VRAM allocation is for advanced use cases and is NOT verified for proper bank alignment. * @note Does not turn Scroll Display on- once loaded use ScrollEnable() to display a Scroll Screen. * @note As RBG0 must reserve dedicated VRAM banks always perform loading/allocation * for RBG0 before NBG0-3 screens if using it. */ - inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemap) + inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemap, bool loadPalette = true) { SRL::Tilemap::TilemapInfo myInfo = tilemap.GetInfo(); ScreenType::Info = tilemap.GetInfo(); @@ -477,7 +505,7 @@ namespace SRL } int colorID = 0; - if (ScreenType::Info.ColorMode != SRL::CRAM::TextureColorMode::RGB555) + if (loadPalette && ScreenType::Info.ColorMode != SRL::CRAM::TextureColorMode::RGB555) { if(ScreenType::TilePalette.GetData()==nullptr) { @@ -524,7 +552,7 @@ namespace SRL ScreenType::CellAllocSize = size; return address; } - + /** @brief Manually Sets VRAM area for Map Data (Advanced Use Cases) * @details This function manually sets an area in VRAM for a scroll's Map Data to be loaded to. Unless the * Address is obtained from VDP2::VRAM::Allocate() the VRAM allocator will be bypassed entirely. @@ -782,7 +810,6 @@ namespace SRL return paletteOffset; } - private: /** @brief Copies Cell data to VRAM (adapted from SGL samples). * @param CellData Cell Data to copy. @@ -848,7 +875,7 @@ namespace SRL * @note RBG0 only supports the 512x256 and 512x512 containers. Because RBG0 does not need to reserve an extra bank * for map data in this mode, this is one case where using the bitmap format may save VRAM resources over tilemaps. */ - inline static void LoadBitmap(SRL::Bitmap::IBitmap* bmp) + inline static void LoadBitmap(SRL::Bitmap::IBitmap* bmp, bool loadPalette = true) { SRL::Bitmap::BitmapInfo myInfo = bmp->GetInfo(); int autoSize = 0; @@ -866,7 +893,7 @@ namespace SRL Bmp2VRAM(bmp->GetData(),ScreenType::CellAddress,myInfo); int colorID = -1; - if (myInfo.Palette!=nullptr && myInfo.Palette->Count!=0) + if (loadPalette && myInfo.Palette!=nullptr && myInfo.Palette->Count!=0) { if(ScreenType::TilePalette.GetData()==nullptr) { @@ -900,7 +927,7 @@ namespace SRL } SRL::CRAM::SetBankUsedState(colorID, col, true); ScreenType::TilePalette = SRL::CRAM::Palette(col, colorID); - SRL::Debug::Print(0,21,"Pal: %d",(int)ScreenType::TilePalette.GetData()-VDP2_COLRAM); + //SRL::Debug::Print(0,21,"Pal: %d",(int)ScreenType::TilePalette.GetData()-VDP2_COLRAM); ScreenType::TilePalette.Load(myInfo.Palette->Colors, myInfo.Palette->Count); } ScreenType::TilePalette.Load(myInfo.Palette->Colors, myInfo.Palette->Count); @@ -1206,16 +1233,13 @@ namespace SRL */ PerspectiveSwitch, - /** @brief Switch RBG0 rotation display based on a VDP2 Window + /** @brief Switch RBG0 rotation display based on a VDP2 window * @details Rotation A displays in regions inside the selected VDP2 window While * Rotation B displays outside the window */ WindowSwitch, }; - - - /** @brief RBG0 interface * @details Rotating Background Scroll 0: * -Available color depths: Paletted16, Paletted256, RBG555 @@ -1229,8 +1253,7 @@ namespace SRL public: /** @brief VRAM Address of RBG0 Coefficient table */ - inline static void* KtableAddress = (void*)(VDP2_VRAM_A0 - 1); - + inline static void* KtableAddress = (void*)(VDP2_VRAM_A0 - 1); /** @brief VRAM Address of RBG0 Coefficient table B */ inline static void* KtableAddressB = (void*)(VDP2_VRAM_A0 - 1); @@ -1240,8 +1263,13 @@ namespace SRL /** @brief VRAM Address of TilemapB cell data */ inline static void* CellAddressRB = (void*)(VDP2_VRAM_A0 - 1); - - + /** @brief Size of Map B allocation + */ + inline static uint32_t MapAllocSizeB; + /** @brief Size of Cell B allocation + */ + inline static uint32_t CellAllocSizeB; + /** @brief Initializes the ScrollScreen's tilemap specifications * @param info Tile map info * @note This function initializes both parameters RA and RB to use @@ -1289,14 +1317,16 @@ namespace SRL sl1MapRB(MapAddressRB); return true; } - /** @brief Load a tilemap to be used with the secondary rotation parameters (RB) + /** @brief Load a tilemap to be used with the secondary rotation parameters (B) * @details RBG0 can display 2 different tilemaps on screen with different - * rotatation parameters in areas that do not overlap. Use to load - * a secondary tilemap for RBG0. + * rotatation parameters - primary(designated as A) Which is loaded + * with the standard LoadTilemap function, and secondary(designated as B), which is loaded + * with this function. These tilemaps can have their own independent 3d transforms and can + * display together in a frame in screen areas that do not overlap. * @note Due to shared registers, The Secondary Tilemap must be in the same * color mode as the Primary Tilemap and its data must be able to fit within the same - * Reserved VRAM banks as the primary data. Loading fails if these conditions are not met. - * Always Load/ initialize Primary tilemap A before loading data for B + * Reserved VRAM banks as the corresponding primary data. Loading fails if these conditions are not met. + * Always Load/ initialize Primary tilemap A before loading data for secondary tilemap B * @param tilemap Itilemap to load with * @param mode (Optional) specify how to switch between the Primary and Secondary Tilemap during display * (default = PerspectiveSwitch) @@ -1304,14 +1334,47 @@ namespace SRL inline static void LoadTilemapB(SRL::Tilemap::ITilemap& tilemap, VDP2::SwitchMode mode = VDP2::SwitchMode::PerspectiveSwitch) { SRL::Tilemap::TilemapInfo info = tilemap.GetInfo(); - - if(!InitB(info))return; - if(CellAddressRB<(void*)VDP2_VRAM_A0) CellAddressRB = VRAM::Allocate(info.CellByteSize, 32, VramBank::A0, 0); - if(((uint32_t)(CellAddressRB)& 0xfff80000)!= ((uint32_t)(CellAddress)& 0xfff80000)) + + uint32_t page_sz = 0x800; + uint32_t sz = (info.MapHeight * info.MapWidth) << 1; + if (info.CharSize == CHAR_SIZE_1x1) page_sz <<= 2; + if (info.MapMode == PNB_2WORD) { - SRL::Debug::Assert("RBG0 Tilemap B Load Failed: Insufficient VRAM available"); + sz <<= 1; + page_sz <<= 1; } + + if (info.PlaneSize == PL_SIZE_2x2) page_sz <<= 2; + else if (info.PlaneSize == PL_SIZE_2x1) page_sz <<= 1; + + if(MapAddressRB<(void*)VDP2_VRAM_A0) + { + MapAddressRB = VRAM::Allocate(sz, page_sz, VramBank::A0, 0); + MapAllocSizeB = sz; + } + + if(CellAddressRB<(void*)VDP2_VRAM_A0) + { + CellAddressRB = VRAM::Allocate(info.CellByteSize, 32, VramBank::A1, 0); + CellAllocSizeB = info.CellByteSize; + } + + if(MapAddressRB==nullptr||CellAddressRB==nullptr||MapAllocSizeB Date: Sat, 24 Jan 2026 17:49:12 -0800 Subject: [PATCH 4/8] Update: - Added Rotation RB tilemap loading -Added LoadTilemap overloads to streamline loading 2 tilemaps to RBG0 -Added Functions to adjust scale reduction limit in NBG0 and NBG1 interfaces -Adjustments to VRAM automap allocation -Minor documentation fixes --- saturnringlib/srl_vdp2.hpp | 221 ++++++++++++++++++++++++++++++------- 1 file changed, 184 insertions(+), 37 deletions(-) diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index e2e08169..d7822f59 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -64,6 +64,21 @@ namespace SRL B0 = 2, B1 = 3, }; + + /** @brief Used to set the minimum allowed scale for NBG0 and NBG1 scrolls + */ + enum class ScaleLimit: uint16_t + { + /** @brief Set minimum scale to 1x (default) + */ + One = ZOOM_1, + /** @brief Set minimum scale to 1/2x + */ + Half = ZOOM_HALF, + /** @brief Set minimum scale to 1/4x + */ + Quarter = ZOOM_QUARTER, + }; /** @brief converts an SRL TextureColorMode enum to its corresponding SGL macro for VDP2 * @param colorMode the colorMode to convert @@ -106,9 +121,11 @@ namespace SRL */ inline static int8_t bankCycles[4] = { -1,-1,-1,2 };//why will init to 0 not work? - /** @brief Indicates if map data has been stored in bank 0 by a previous allocation + /** @brief Indicates if map data has been stored in bank A0 by a previous allocation */ inline static bool MapBankA0 = false; + /** @brief Indicates if map data has been stored in bank B0 by a previous allocation + */ inline static bool MapBankB0 = false; public: @@ -122,11 +139,11 @@ namespace SRL } /** @brief Linearly Allocates Vram in a bank and returns address to start of allocation. Allocation fails if - * there is not enough free space in the bank or if access requires too many cycles. + * there is not enough free space in the bank or if access requires too many cycle slots. * @param size Number of bytes to allocate * @param boundary Byte Boundary that the allocation should be aligned to (must be multiple of 32 for all VDP2 Data types) * @param bank The VRAM bank to allocate in - * @param cycles (Optional) Number of Bank Cycles this data will require to access during frame(0-8). + * @param cycles (Optional)The Number of Access Slots in a bank's Cycle Pattern that the data will require during display. * @return void* start of the Allocated region in VRAM (nullptr if allocation failed) * @note Any VRAM padded to maintain alignment to a requested boundary is rendered inaccessible to further * allocations until VRAM is reset through VDP2::ClearVram(). @@ -572,11 +589,25 @@ namespace SRL return Address; } + /** @brief Manually sets the CRAM palette index for this scrollScreen(Advanced Use Cases) + * @details Shallow copies the specified palette handler to the ScrollScreen's + * TilePalette, forcing it to register with the specified palette. Use in cases + * where the user desires more control over palette placement in CRAM, such as palette + * sharing between tilemaps. + * @note when set this way, multiple sources may be able to write to the same palette. + * specify the LoadPalette parameter as false when using ScrollScreen::LoadTilemap() + * to ensure pre-existing palette is not overwritten during loading. + */ + inline static void SetPalette(CRAM::Palette palette) + { + ScreenType::TilePalette = palette; + } + /** @brief Registers the ScrollScreen to Display SRL's Debug Ascii Scroll * @note The Ascii Scroll is not compatible with Rotation Scroll RBG0 - * @note The Ascii scroll data is stored outside The VRAM allocation region, so + * @note The Ascii scroll data is stored outside The VRAM Alloacators memory region, so * should not be written with the ScrollScreen loading functions. Manage loading - * fonts with the SRL::ASCII module instead. Furthermore, + * fonts with the SRL::ASCII module instead. */ inline static void SetAsciiScroll() { @@ -709,9 +740,10 @@ namespace SRL } /** @brief Set the Display Priority of a Scroll Screen - * @note Higher value layers display on top of lower layers. - * @note When 2 or more scroll screens are assigned the same layer, their priority resolves as - * SPRITE>RBG0>NBG0>NBG1>NBG2>NBG3. + * @note -Higher priority values display on top of lower priorities. Setting Priority::Layer0 + * disables display of a scroll screen without unregistering it. + * @note -When 2 or more scroll screens are assigned the same layer, their priority resolves as + * SPRITE > RBG0 > NBG0 > NBG1 > NBG2 > NBG3. * @param pr The Priority Layer for the Scroll Screen */ inline static void SetPriority(SRL::VDP2::Priority pr) { slPriority(ScreenType::ScreenID, (uint16_t)pr); } @@ -872,8 +904,7 @@ namespace SRL * @param bmp Pointer to the bitmap interface to load from. * @note If source Bitmap size is not equal to one of the container sizes, excess VRAM will be wasted. * To conserve VRAM, consider converting to tilemap format with Bmp2Tile for smaller images when possible. - * @note RBG0 only supports the 512x256 and 512x512 containers. Because RBG0 does not need to reserve an extra bank - * for map data in this mode, this is one case where using the bitmap format may save VRAM resources over tilemaps. + * @note RBG0 only supports the 512x256 and 512x512 containers. */ inline static void LoadBitmap(SRL::Bitmap::IBitmap* bmp, bool loadPalette = true) { @@ -1010,7 +1041,6 @@ namespace SRL else slBMPaletteNbg0(NBG0::TilePalette.GetId()); } - /** @brief Set the 2x2 grid of planes for the layer * @param a First plane * @param b Second plane @@ -1023,13 +1053,25 @@ namespace SRL * @param pos Fixed Point X and Y Screen Position */ static void SetPosition(Math::Vector2D& pos) { slScrPosNbg0(pos.X.RawValue(), pos.Y.RawValue()); } - + /** @brief Sets the Scale of NBG0 Screen display * @param scl Fixed Point X an Y scaling values - * @note The minimum scale that can be displayed is determined by The Scale Limit, Scaling values - * lower than the minimum will be clamped to the minimum + * @note The minimum scale that can be displayed is determined by the Scale Limit , Scaling values + * lower than the minimum will be clamped to the minimum (see SetScaleLimit() for more details) */ static void SetScale(Math::Vector2D& scl) { slScrScaleNbg0(scl.X.RawValue(), scl.Y.RawValue()); } + + /** @brief Sets the minimum scale that the ScrollScreen can display + * @details NBG0 can scale its displayed tilemap or bitmap up freely, but has + * a minimum default scale of 1x due to cycle pattern limits. + * This minimum can be changed to 1/2x or 1/4x for further reduction at the + * cost of increasing its required cycle accesses( By 2x for 1/2x scaling or 4x + * for 1/4x scaling) + * @note -If the number of cycle access required for scaling is too large, it can interfere with + * registering scrolls for display with ScrollEnable(). + * @note -Only 8bpp and 4bpp data supports 1/2x scaling, and only 4bpp supports 1/4x scaling + */ + static void SetScaleLimit(VDP2::ScaleLimit limit){slZoomModeNbg0((uint16_t)limit); } }; /** @brief NBG1 interface @@ -1080,16 +1122,28 @@ namespace SRL static void SetPlanes(void* a, void* b, void* c, void* d) { slMapNbg1(a, b, c, d); } /** @brief Sets the Screen Position of NBG Scroll Screen - * @param pos Fixed Point X and Y Screen Position + * @param pos Fixed Point X and Y Offset of Scoll Position relative to screen */ static void SetPosition(Math::Vector2D& pos) { slScrPosNbg1(pos.X.RawValue(), pos.Y.RawValue()); } /** @brief Sets the Scale of NBG1 Screen display - * @param scl Fixed Point X an Y scaling values + * @param scl Fixed Point X and Y scaling values * @note The minimum scale that can be displayed is determined by The Scale Limit, Scaling values * lower than the minimum will be clamped to the minimum */ static void SetScale(Math::Vector2D& scl) { slScrScaleNbg1(scl.X.RawValue(), scl.Y.RawValue()); } + + /** @brief Sets the minimum scale that the ScrollScreen can display + * @details NBG1 can scale its displayed tilemap or bitmap up freely, but has + * a default minimum scale of 1x due to cycle pattern limits. + * This minimum can be changed to 1/2x or 1/4x for further reduction at the + * cost of increasing its required cycle accesses( By 2x for 1/2x scaling or 4x + * for 1/4x scaling) + * @note -If the number of cycle access required for scaling is too large, it can interfere with + * registering scrolls for display with ScrollEnable(). + * @note -Only 8bpp and 4bpp data supports 1/2x scaling, and only 4bpp supports 1/4x scaling + */ + static void SetScaleLimit(VDP2::ScaleLimit limit){slZoomModeNbg1((uint16_t)limit); } }; /** @brief NBG2 interface @@ -1187,7 +1241,11 @@ namespace SRL }; /** @brief Options for treating display of rotation parameters outside of the - * main tilemap/bitmap area + * main tilemap/bitmap area. + * @details when 3d rotation is simulated, some perspectives may display + * areas on screen that are beyond the 4x4 plane area defined by the tilemap. + * Use these options with RBG0::SetOverDisplayA/B to specify what to display in + * these areas. */ enum class OverPattern { @@ -1202,7 +1260,7 @@ namespace SRL */ RepeatTile, - /** @brief Screen areas outside the tilemap are filled with transparent pixels + /** @brief Screen areas outside the tilemap are treated as transparent pixels */ Transparent, @@ -1226,7 +1284,7 @@ namespace SRL OnlyB = 1, /** @brief Switch RBG0 Tilemap display based on perspective - * @details In regions of the screen beyond parameter A's 'simulated horizon'*, + * @details In regions of the screen beyond parameter A's simulated 'horizon'*, * Rotation parameter B will be displayed * @note *(More technically, any screen coordinate where the scaling coefficient * data read for Parameter A is 0 will display Parameter B data instead). @@ -1247,10 +1305,13 @@ namespace SRL * -Available features: Scrolling, Scaling, Rotation, * -Coefficient table allows per line and per pixel scaling * to simulate perspective + * -simulate up to 2 planes with secondary rotation parameters */ class RBG0 : public BmpScreen { public: + using ScrollScreen::LoadTilemap; + /** @brief VRAM Address of RBG0 Coefficient table */ inline static void* KtableAddress = (void*)(VDP2_VRAM_A0 - 1); @@ -1268,7 +1329,10 @@ namespace SRL inline static uint32_t MapAllocSizeB; /** @brief Size of Cell B allocation */ - inline static uint32_t CellAllocSizeB; + inline static int32_t CellAllocSizeB; + /* @brief The Palette handler for LoadTilemapB + */ + inline static CRAM::Palette TilePaletteB = CRAM::Palette(); /** @brief Initializes the ScrollScreen's tilemap specifications * @param info Tile map info @@ -1288,6 +1352,7 @@ namespace SRL sl1MapRA(RBG0::MapAddress); sl1MapRB(RBG0::MapAddress); } + /** @brief Initializes the ScrollScreen's bitmap specifications * @param info bitmap info */ @@ -1306,6 +1371,10 @@ namespace SRL else slBMPaletteRbg0(RBG0::TilePalette.GetId()); } + /** @brief Initializes the Tilemap settings for Secondary Tilemap on Rotation parameter B + * @param info Tilemap info to initialize with + * @note Initialization fails if the tilemap's format does not match the primary tilemap + */ inline static bool InitB(SRL::Tilemap::TilemapInfo info) { if(info.MapMode!= RBG0::Info.MapMode || info.SGLColorMode()!=RBG0::Info.SGLColorMode()||info.CharSize!=RBG0::Info.CharSize) @@ -1317,21 +1386,23 @@ namespace SRL sl1MapRB(MapAddressRB); return true; } - /** @brief Load a tilemap to be used with the secondary rotation parameters (B) - * @details RBG0 can display 2 different tilemaps on screen with different + + + /** @brief Load a tilemap to be used with the secondary rotation parameter (B) + * @details RBG0 can display 2 different source tilemaps on screen with different * rotatation parameters - primary(designated as A) Which is loaded * with the standard LoadTilemap function, and secondary(designated as B), which is loaded * with this function. These tilemaps can have their own independent 3d transforms and can - * display together in a frame in screen areas that do not overlap. - * @note Due to shared registers, The Secondary Tilemap must be in the same + * display together in a frame in independent screen areas that do not overlap. + * @note Due to shared registers, The Secondary Tilemap must be in the same * color mode as the Primary Tilemap and its data must be able to fit within the same * Reserved VRAM banks as the corresponding primary data. Loading fails if these conditions are not met. - * Always Load/ initialize Primary tilemap A before loading data for secondary tilemap B + * -Always Load/ initialize Primary tilemap A before loading data for secondary tilemap B * @param tilemap Itilemap to load with * @param mode (Optional) specify how to switch between the Primary and Secondary Tilemap during display * (default = PerspectiveSwitch) */ - inline static void LoadTilemapB(SRL::Tilemap::ITilemap& tilemap, VDP2::SwitchMode mode = VDP2::SwitchMode::PerspectiveSwitch) + inline static void LoadTilemapB(SRL::Tilemap::ITilemap& tilemap, VDP2::SwitchMode mode = VDP2::SwitchMode::PerspectiveSwitch, bool LoadPalette = true) { SRL::Tilemap::TilemapInfo info = tilemap.GetInfo(); @@ -1343,7 +1414,7 @@ namespace SRL sz <<= 1; page_sz <<= 1; } - + if (info.PlaneSize == PL_SIZE_2x2) page_sz <<= 2; else if (info.PlaneSize == PL_SIZE_2x1) page_sz <<= 1; @@ -1366,14 +1437,62 @@ namespace SRL } if(!InitB(info)) return; + int colorID = 0; + if (LoadPalette && info.ColorMode != SRL::CRAM::TextureColorMode::RGB555) + { + if(RBG0::TilePaletteB.GetData()==nullptr) + { + if ((colorID = SRL::CRAM::GetFreeBank(RBG0::Info.ColorMode)) < 0) + { + SRL::Debug::Assert("Tilemap Palette Load Failed- no CRAM Palettes available"); + return; + } + SRL::CRAM::SetBankUsedState(colorID, RBG0::Info.ColorMode, true); + RBG0::TilePaletteB = SRL::CRAM::Palette(RBG0::Info.ColorMode, colorID); + } + uint16_t len = (info.ColorMode == SRL::CRAM::TextureColorMode::Paletted16) ? 16 : 256; + RBG0::TilePaletteB.Load((Types::HighColor*)tilemap.GetPalData(), len); + } + RBG0::Cell2VRAM((uint8_t*)tilemap.GetCellData(), RBG0::CellAddressRB, info.CellByteSize); RBG0::Map2VRAM( info, (uint16_t*)tilemap.GetMapData(), RBG0::MapAddressRB, - RBG0::TilePalette.GetId(), + RBG0::TilePaletteB.GetId(), RBG0::GetCellOffset(info, RBG0::CellAddressRB)); } + + /** @brief Simultaneously Configures the desired rotation mode and loads primary tilemap + * @details This overload can be used to both load the primary tilemap and configure its rotation + * with one function. Calls SetRotationMode followed by LoadTilemap. + * @param tilemap The tilemap to load + * @param mode The rotation mode to configure for the tilemap.(See SetRotationMode for details) + * @param LoadPalette (optional) enable/disable auto loading of palette data (default = true) + */ + inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemap,VDP2::RotationMode mode, bool LoadPalette = true) + { + SetRotationMode(mode); + LoadTilemap(tilemap,LoadPalette); + } + + /** @brief Load and configure both primary and secondary Tilemaps + * @details This overload can be used to load and configure both primary and secondary tilemaps. + * The SwitchMode will be initialized to UsePerspective. Use SetSwitchMode() after loading + * to change the setting if desired. + * @param tilemapA The tilemap to load to Primary Tilemap (A) + * @param tilemapB The tilemap to load to Secondary Tilemap (B) + * @param modeA The rotation mode to configure for primary map (RA) + * @param modeB The rotation mode to configure for secondary map (RB) + * @param LoadPalette (optional) set false to disable auto loading of palette data (default = true) + * @note for details and restrictions on secondary map loading, see LoadTilemapB() + */ + inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemapA,SRL::Tilemap::ITilemap& tilemapB, VDP2::RotationMode modeA,VDP2::RotationMode modeB, bool LoadPalette = true) + { + SetRotationMode(modeA,modeB); + LoadTilemap(tilemapA,LoadPalette); + LoadTilemapB(tilemapB); + } /** @brief Sets How screen regions outside the tilemap area are displayed in * the Primary Rotation Parameter (RA) @@ -1396,14 +1515,14 @@ namespace SRL */ inline static void SetOverDisplayB(VDP2::OverPattern mode, uint16_t tileIndex = 0) { - slOverPatRA(tileIndex); - slOverRA((uint16_t)mode); + slOverPatRB(tileIndex); + slOverRB((uint16_t)mode); } /** @brief Sets Condition for displaying Primary and Secondary parameters/Tilemaps on screen. * @param mode the display mode to select * @note See SwitchMode documentation for description of available modes * @note If a mode is selected that displays Secondary Parameter (RB) but no - * tilemap has previously been loaded with LoadTilemapB, RB will use the same + * tilemap has previously been loaded to display on it, RB will use the same * source tilemap as primary parameter (RA) */ inline static void SetParameterDisplay(SwitchMode mode) @@ -1467,10 +1586,10 @@ namespace SRL * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of coefficient * data required for rotation of a plane (default = true) * @note when 2 or 3 axis rotation is selected, VRAM will be allocated to store - * necessary scaling coefficients. If Vblank is set false, all coefficients will be - * statically stored in VRAM as a 0x20000 byte table. If Vblank is set true, only the - * the coefficients for the current frame will be dynamically updated and - * written to VRAM at each Vblank, reducing VRAM footprint to 0x2000 bytes per + * necessary scaling coefficients. If Vblank is set false, all possible coefficients will be + * statically stored in VRAM as a 0x20000 byte table. If Vblank is set true, the + * the coefficients for the current frame will be dynamically written + * to VRAM at each Vblank, reducing VRAM footprint to 0x2000 bytes per * rotation parameter but increasing required Vblank overhead. If the transfer can * not complete within the Vblank window, screen tearing may be visible in the plane. */ @@ -1577,6 +1696,7 @@ namespace SRL */ static void SetPlanes(const uint8_t layout[4][4]) { + uint32_t offset = ((uint32_t)RBG0::MapAddress & 0x1ffff)>>11; uint8_t sz = (VDP2::RBG0::Info.CharSize==CHAR_SIZE_1x1) ? 4:1; uint8_t sLayout[4][4] = {}; if (VDP2::RBG0::Info.MapMode == PNB_2WORD) sz <<= 1; @@ -1584,11 +1704,38 @@ namespace SRL else if (VDP2::RBG0::Info.PlaneSize == PL_SIZE_2x1)sz <<= 1; for (size_t i = 0; i < 4; ++i) { for (size_t j = 0; j < 4; ++j) { - sLayout[i][j] = layout[i][j] * sz; + sLayout[i][j] = (layout[i][j] * sz)+(uint8_t)offset; } } sl16MapRA((uint8_t*)sLayout); } + /** @brief Sets the plane of Tilemap Data to be displayed with 16 planes for Tilemap B + * @details Unlike NBG scrolls RBG0 only loads with the default tiling of 1 plane. Use this + * function after loading to set the arrangement of multi plane tilemaps within a 4x4 grid: + * |a,b,c,d| + * |e,f,g,h| + * |i,j,k,l| + * |m,n,o,p| + * @param layout 4x4 array of uint8_t indices representing the index of each plane in the map layout + * @note No check is performed to ensure the indecies entered are within the bounds of + * the scroll's map data. Specifying indices larger than the number of planes loaded + * will result in the diplay of garbage data in those portions of the map + */ + static void SetPlanesB(const uint8_t layout[4][4]) + { + uint32_t offset = ((uint32_t)RBG0::MapAddressRB & 0x1ffff)>>11; + uint8_t sz = (VDP2::RBG0::Info.CharSize==CHAR_SIZE_1x1) ? 4:1; + uint8_t sLayout[4][4] = {}; + if (VDP2::RBG0::Info.MapMode == PNB_2WORD) sz <<= 1; + if (VDP2::RBG0::Info.PlaneSize == PL_SIZE_2x2)sz <<= 2; + else if (VDP2::RBG0::Info.PlaneSize == PL_SIZE_2x1)sz <<= 1; + for (size_t i = 0; i < 4; ++i) { + for (size_t j = 0; j < 4; ++j) { + sLayout[i][j] = (layout[i][j] * sz)+(uint8_t)offset; + } + } + sl16MapRB((uint8_t*)sLayout); + } }; @@ -1620,7 +1767,7 @@ namespace SRL Bank3 = scnSPR3, Bank4 = scnSPR4, Bank5 = scnSPR5, - Bank6 = scnSPR6, + Bank6 = scnSPR6, Bank7 = scnSPR7, }; From 85462e7282733453503ef585b058c32e57d686d4 Mon Sep 17 00:00:00 2001 From: 7shades Date: Mon, 2 Feb 2026 16:36:50 -0800 Subject: [PATCH 5/8] Fix Docs --- saturnringlib/srl_vdp2.hpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index d7822f59..ae9a3ad3 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -8,11 +8,6 @@ #include "srl_cd.hpp" #include "srl_tilemap_interfaces.hpp" -/*I'm running into an issue with getting Bitmaps working for RBG0. Does anyone know -what SGL function if any is supposed to set the RAM contol register associated with reserving -a bank in bitmaps case? None of the bitmap functions appear to set the bits. I can get it to work by -manually setting the bits in VDP2_RAMCTL system variable... - */ namespace SRL { /** @brief VDP2 control @@ -939,7 +934,6 @@ namespace SRL //handle 16 color palette mapping to the allowed banks if(GetSGLColorMode(col) == 0) { - SRL::Debug::Print(0,20,"4bpp"); for(int i = 0;i<8; ++i) { if(!SRL::CRAM::GetBankUsedState(i<<4, col)) @@ -958,7 +952,7 @@ namespace SRL } SRL::CRAM::SetBankUsedState(colorID, col, true); ScreenType::TilePalette = SRL::CRAM::Palette(col, colorID); - //SRL::Debug::Print(0,21,"Pal: %d",(int)ScreenType::TilePalette.GetData()-VDP2_COLRAM); + ScreenType::TilePalette.Load(myInfo.Palette->Colors, myInfo.Palette->Count); } ScreenType::TilePalette.Load(myInfo.Palette->Colors, myInfo.Palette->Count); @@ -967,8 +961,8 @@ namespace SRL } /** @brief Copies Bmp data to VRAM - * @param BmpData Data to copy. - * @param BmpAdr VRAM address to copy to. + * @param bmpData Source address of Data to copy. + * @param bmpAdr VRAM address to copy to. * @param info info about bmp * @note When the source image does not completely fill the container the * transfer will pad each line of the image to allign to the container width. @@ -1373,7 +1367,7 @@ namespace SRL /** @brief Initializes the Tilemap settings for Secondary Tilemap on Rotation parameter B * @param info Tilemap info to initialize with - * @note Initialization fails if the tilemap's format does not match the primary tilemap + * @note Initialization fails if the tilemap's data format does not match the primary tilemap */ inline static bool InitB(SRL::Tilemap::TilemapInfo info) { @@ -1464,7 +1458,7 @@ namespace SRL } /** @brief Simultaneously Configures the desired rotation mode and loads primary tilemap - * @details This overload can be used to both load the primary tilemap and configure its rotation + * @details Overload to both load the primary tilemap and configure its rotation * with one function. Calls SetRotationMode followed by LoadTilemap. * @param tilemap The tilemap to load * @param mode The rotation mode to configure for the tilemap.(See SetRotationMode for details) @@ -1477,7 +1471,7 @@ namespace SRL } /** @brief Load and configure both primary and secondary Tilemaps - * @details This overload can be used to load and configure both primary and secondary tilemaps. + * @details Overload to load and configure both primary and secondary tilemaps. * The SwitchMode will be initialized to UsePerspective. Use SetSwitchMode() after loading * to change the setting if desired. * @param tilemapA The tilemap to load to Primary Tilemap (A) @@ -1485,7 +1479,7 @@ namespace SRL * @param modeA The rotation mode to configure for primary map (RA) * @param modeB The rotation mode to configure for secondary map (RB) * @param LoadPalette (optional) set false to disable auto loading of palette data (default = true) - * @note for details and restrictions on secondary map loading, see LoadTilemapB() + * @note for details and restrictions on secondary map loading, see RBG0::LoadTilemapB() */ inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemapA,SRL::Tilemap::ITilemap& tilemapB, VDP2::RotationMode modeA,VDP2::RotationMode modeB, bool LoadPalette = true) { @@ -1852,10 +1846,10 @@ namespace SRL }; /** @brief Clear all VDP2 VRAM allocations and reset all Scroll Screen VRAM References, as well - * as all CRAM allocations associated with VDP2 Scroll Screens + * as all CRAM allocations associated with VDP2 Scroll Screens if desired. * @note When Loading a new set of Data and Configurations for Scroll Screens with auto allocation, Call this first * to ensure old data is freed - * @param FreePalettes (optional: default = true) additionally free All CRAM pallets currently registered to ScrollScreens + * @param FreePalettes (optional: default = true) additionally free all CRAM pallets currently registered to ScrollScreens */ inline static void ClearVRAM(bool FreePalettes = true) { From c057647b69b5c92600fe2c7a7751994a7b531a25 Mon Sep 17 00:00:00 2001 From: 7shades Date: Sat, 7 Feb 2026 15:40:20 -0800 Subject: [PATCH 6/8] Updates: -Modified interface control of RBG0RB -Added Rotation Parameter sample -Bug Fixes --- .../cd/data/CLOUDS.bin | Bin 0 -> 18976 bytes .../cd/data/GROUND.bin | Bin 0 -> 29472 bytes .../VDP2 - RBG0 Rotation Parameters/clean.bat | 3 + .../compile.bat | 3 + .../VDP2 - RBG0 Rotation Parameters/makefile | 35 ++ .../run_with_mednafen.bat | 3 + .../src/main.cxx | 103 +++++ saturnringlib/srl_vdp2.hpp | 374 +++++++++--------- 8 files changed, 334 insertions(+), 187 deletions(-) create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/cd/data/CLOUDS.bin create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/cd/data/GROUND.bin create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/clean.bat create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/compile.bat create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/makefile create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/run_with_mednafen.bat create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/CLOUDS.bin b/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/CLOUDS.bin new file mode 100644 index 0000000000000000000000000000000000000000..b8d1206de13d0e62b312c228ecf42a22923b320d GIT binary patch literal 18976 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 bAe(X=$tS3?aUW4zujUMaw1iFnVDtX~q8y%e literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/GROUND.bin b/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/GROUND.bin new file mode 100644 index 0000000000000000000000000000000000000000..d7bfaeb4fba83602cdca637914b6270be2fff693 GIT binary patch literal 29472 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 literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/clean.bat b/Samples/VDP2 - RBG0 Rotation Parameters/clean.bat new file mode 100644 index 00000000..235cac2d --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/clean.bat @@ -0,0 +1,3 @@ +:; "../../tools/scripts/make.sh" clean; exit; +@ECHO Off +"../../tools/scripts/make.bat" clean \ No newline at end of file diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/compile.bat b/Samples/VDP2 - RBG0 Rotation Parameters/compile.bat new file mode 100644 index 00000000..13cda258 --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/compile.bat @@ -0,0 +1,3 @@ +:; "../../tools/scripts/make.sh" $1; exit; +@ECHO Off +"../../tools/scripts/make.bat" %1 \ No newline at end of file diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/makefile b/Samples/VDP2 - RBG0 Rotation Parameters/makefile new file mode 100644 index 00000000..ade1ce59 --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/makefile @@ -0,0 +1,35 @@ +# Configuration +SRL_MAX_TEXTURES = 100 # Number of VDP1 texture slots +SRL_MODE = NTSC # Valid options are PAL or NTSC +SRL_HIGH_RES = 0 # 480i mode +SRL_FRAMERATE = 1 # Framerate control (0=dynamic, 1=< 60/value) +SRL_MAX_CD_BACKGROUND_JOBS = 1 # Maximum number of files GFS can open at once +SRL_MAX_CD_FILES = 256 # Maximum number of files on a CD +SRL_MAX_CD_RETRIES = 5 # Number of times to retry on unsuccessful read + +# Sound driver specific configuration +SRL_USE_SGL_SOUND_DRIVER = 0 # Set to 1 if you want to use SGL sound driver, this will copy necessary files into the CD folder +SRL_ENABLE_FREQ_ANALYSIS = 0 # Set to 1 if you want to enable frequency analysis for CD audio, this will load a DSP program into effect slot 1, SGL sound driver must be enabled + +# SGL configuration +SGL_MAX_VERTICES = 2500 # Number of vertices that can be used +SGL_MAX_POLYGONS = 1500 # Number of polygons that can be used +SGL_MAX_EVENTS = 1 # Number of events that can be used +SGL_MAX_WORKS = 1 # Number of works that can be used + +# Disk name +CD_NAME = VDP2_ScrollScreen + +# Directory build will be placed into +BUILD_DROP = ./BuildDrop + +# SRL installation directory +SRL_INSTALL_ROOT ?= ../.. + +# Find all .c and .cxx files +SOURCES = $(patsubst ./%,%,$(shell find src/ -name '*.c')) +SOURCES += $(patsubst ./%,%,$(shell find src/ -name '*.cxx')) + +# Include shared makefile +SDK_ROOT = $(SRL_INSTALL_ROOT)/saturnringlib +include $(SDK_ROOT)/shared.mk \ No newline at end of file diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/run_with_mednafen.bat b/Samples/VDP2 - RBG0 Rotation Parameters/run_with_mednafen.bat new file mode 100644 index 00000000..108b6e9f --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/run_with_mednafen.bat @@ -0,0 +1,3 @@ +:; "../../tools/scripts/run.sh" mednafen; exit; +@ECHO Off +"../../tools/scripts/run.bat" mednafen \ No newline at end of file diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx b/Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx new file mode 100644 index 00000000..e5ca6a96 --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx @@ -0,0 +1,103 @@ +/*VDP2 Scroll Layer Demo: +This Demo Shows how to Load and display 2 Tilemaps on RBG0 simultaneously using separate +Rotation Parameters +*/ +#include + + +using namespace SRL::Types; +using namespace SRL::Input; +using namespace SRL::Math; + + + +int main() +{ + SRL::Core::Initialize(HighColor(20,10,50)); + Digital port0(0); // Initialize gamepad on port 0 + + // variables to store current position/ rotation of the RBG0 tilemaps: + Vector3D Rbg0PositionPrimary(0.0,40.0,80.0);//40 units below camera for ground + Vector3D Rbg0PositionSecondary(0.0,-40.0,80.0);//40 units below camera for ground + Angle Rbg0RotationSecondary = Angle::FromDegrees(0.0);//we will also make the clouds rotate + + SRL::Tilemap::Interfaces::CubeTile* TestTilebin= new SRL::Tilemap::Interfaces::CubeTile("TESTN.BIN");//Load ground tilemap from cd to work RAM + + SRL::Tilemap::Interfaces::CubeTile *TestTilebinB= new SRL::Tilemap::Interfaces::CubeTile("FOG256.BIN");//Load fog tilemap from cd to work RAM + + //This new overload allows transferring both tilemaps to VRAM and initializing their rotation modes all in one go: + SRL::VDP2::RBG0::LoadTilemap(*TestTilebin,*TestTilebinB, SRL::VDP2::RotationMode::TwoAxis,SRL::VDP2::RotationMode::TwoAxis); + + delete TestTilebin;//free work RAM + delete TestTilebinB;//free work RAM + + //Example of laying out a multi plane tilemap in a 4x4 grid for the Primary Tilemap + uint8_t mapLayout[4][4] = + { + 0,1,2,3, + 0,1,2,3, + 0,1,2,3, + 0,1,2,3, + }; + + //set the multi plane layout of Primary Tilemap + SRL::VDP2::RBG0::SetPlanes(mapLayout); + + //set initial perspective for the Primary and secondary rotation: + SRL::Scene3D::LoadIdentity(); + + SRL::Scene3D::PushMatrix(); + { + SRL::Scene3D::Translate(Rbg0PositionPrimary); + SRL::Scene3D::RotateX(Angle::FromDegrees(-90.0)); + SRL::VDP2::RBG0::SetCurrentTransform(SRL::VDP2::RotationParameter::Primary); + } + + SRL::Scene3D::PushMatrix(); + { + SRL::Scene3D::Translate(Rbg0PositionSecondary); + SRL::Scene3D::RotateX(Angle::FromDegrees(90.0)); + SRL::VDP2::RBG0::SetCurrentTransform(SRL::VDP2::RotationParameter::Secondary); + } + SRL::Scene3D::PopMatrix(); + + /*This is not strictly necessary in our example because PerspectiveSwitch is the default setting + when loading 2 tilemaps, but use this function if you want a different setting*/ + SRL::VDP2::RBG0::SetParameterDisplay(SRL::VDP2::SwitchMode::PerspectiveSwitch); + + //Enable RBG0 to display on screen: + SRL::VDP2::RBG0::ScrollEnable(); + + SRL::Debug::Print(1,3,"VDP2 Rotation Parameters Sample"); + + while(1) + { + //Demonstrate independent manipulation of RA and RB tilemaps: + Rbg0PositionPrimary.Z-=Fxp(1.0);//scroll ground towards camera + Rbg0RotationSecondary+=Angle::FromDegrees(1.0);//rotate clouds + + + SRL::Scene3D::LoadIdentity(); + //set perspective matrix of primary tilemap: + SRL::Scene3D::PushMatrix(); + { + SRL::Scene3D::Translate(Rbg0PositionPrimary); + SRL::Scene3D::RotateX(Angle::FromDegrees(-90.0)); + SRL::VDP2::RBG0::SetCurrentTransform(SRL::VDP2::RotationParameter::Primary); + } + SRL::Scene3D::PopMatrix(); + + //set perspective matrix of secondary tilemap: + SRL::Scene3D::PushMatrix(); + { + SRL::Scene3D::Translate(Rbg0PositionSecondary); + SRL::Scene3D::RotateY(Rbg0RotationSecondary); + SRL::Scene3D::RotateX(Angle::FromDegrees(90.0)); + SRL::VDP2::RBG0::SetCurrentTransform(SRL::VDP2::RotationParameter::Secondary); + } + SRL::Scene3D::PopMatrix(); + + SRL::Core::Synchronize(); + } + return 0; +} diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index ae9a3ad3..1c924fce 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -486,7 +486,7 @@ namespace SRL SRL::Tilemap::TilemapInfo myInfo = tilemap.GetInfo(); ScreenType::Info = tilemap.GetInfo(); int autoMapSize = 0; - if ((uint32_t)ScreenType::MapAddress < VDP2_VRAM_A0) + if ((uint32_t)ScreenType::MapAddress < VDP2_VRAM_A0|| (uint32_t)ScreenType::MapAddress>=(VDP2_VRAM_B1 + 0x18000)) { ScreenType::MapAddress = VRAM::AutoAllocateMap(myInfo, ScreenType::ScreenID,&autoMapSize); if ((uint32_t)ScreenType::MapAddress < VDP2_VRAM_A0) return; @@ -499,13 +499,13 @@ namespace SRL return; } - if ((uint32_t)ScreenType::CellAddress < VDP2_VRAM_A0) + if ((uint32_t)ScreenType::CellAddress < VDP2_VRAM_A0||(uint32_t)ScreenType::CellAddress>=(VDP2_VRAM_B1 + 0x18000)) { ScreenType::CellAddress = VRAM::AutoAllocateCell(myInfo, ScreenType::ScreenID); if ((uint32_t)ScreenType::CellAddress < VDP2_VRAM_A0) { - SRL::Debug::Assert("Tilemap Load Failed- CEL DATA exceeds existing VRAM allocation"); + //SRL::Debug::Assert("Tilemap Load Failed- CEL DATA exceeds existing VRAM allocation"); return; } else ScreenType::CellAllocSize = myInfo.CellByteSize; @@ -599,17 +599,22 @@ namespace SRL } /** @brief Registers the ScrollScreen to Display SRL's Debug Ascii Scroll - * @note The Ascii Scroll is not compatible with Rotation Scroll RBG0 - * @note The Ascii scroll data is stored outside The VRAM Alloacators memory region, so - * should not be written with the ScrollScreen loading functions. Manage loading - * fonts with the SRL::ASCII module instead. + * @details A scrollscreen that is Registered to the Ascii Scroll will remain + * registered even if VDP2::ClearVRAM() is called. It will automatically unregister + * and revert to normal loading when it's LoadTilemap()/LoadBitmap() method is next called. + * @note -The Ascii Scroll is not compatible with Rotation Scroll RBG0 + * @note -The Ascii Scroll was designed to have its position fixed on screen, and may display garbage data if + * its position is offset. + * @note -The Ascii scroll data is stored outside The VRAM Alloacator's valid memory region, so + * can not be written to with the standard ScrollScreen loading functions. Manage loading + * fonts with the SRL::ASCII module instead. */ - inline static void SetAsciiScroll() + inline static void RegisterAsciiScroll() { SRL::Tilemap::TilemapInfo AsciiInfo(CRAM::TextureColorMode::Paletted16, PNB_1WORD|CN_10BIT, CHAR_SIZE_1x1,PL_SIZE_1x1,1,1,0); - ScreenType::SetCellAdress((void*)(VDP2_VRAM_B1 + 0x1D000),0); - ScreenType::SetMapAddress((void*)(VDP2_VRAM_B1 + 0x1E000),0); + SetCellAddress((void*)(VDP2_VRAM_B1 + 0x1D000),0); + SetMapAddress((void*)(VDP2_VRAM_B1 + 0x1E000),0); ScreenType::Init(AsciiInfo); } @@ -855,8 +860,8 @@ namespace SRL * @param info Tilemap data config. * @param mapData Map data to copy to VRAM. * @param mapAdr VRAM address to copy map to . - * @param mapoff offset added when Cell data does not start at bank boundary . * @param paloff Palette index in CRAM. + * @param mapoff offset added when Cell data does not start at bank boundary . */ inline static void Map2VRAM(SRL::Tilemap::TilemapInfo& info, uint16_t* mapData, void* mapAdr, uint8_t paloff, uint32_t mapoff) { @@ -967,7 +972,7 @@ namespace SRL * @note When the source image does not completely fill the container the * transfer will pad each line of the image to allign to the container width. * However the padded VRAM is not cleared when using this function, so may display - * garbage data. Use VDP2::VRAM::Blank() beforehand to clear all data to zero if desired. + * garbage data. Use VDP2::VRAM::Blank() beforehand to clear VRAM area to zeros if desired. */ inline static void Bmp2VRAM(void* bmpData, void* bmpAdr, SRL::Bitmap::BitmapInfo info) { @@ -1271,25 +1276,35 @@ namespace SRL { /** @brief Only display Tilemap A (Primary Tilemap and rotation params) */ - OnlyA = 0, + OnlyPrimary = 0, /** @brief Only display Tilemap B (Secondary Tilemap and rotation params) */ - OnlyB = 1, + OnlySecondary = 1, - /** @brief Switch RBG0 Tilemap display based on perspective + /** @brief Switch RBG0 Tilemap display based on perspective of Tilemap A * @details In regions of the screen beyond parameter A's simulated 'horizon'*, * Rotation parameter B will be displayed - * @note *(More technically, any screen coordinate where the scaling coefficient - * data read for Parameter A is 0 will display Parameter B data instead). + * @note -*(More technically, any screen coordinate where the scaling coefficient data + * read for Parameter A has its highest bit set to 1 will display Parameter B data instead). + * @note - Only Parameter A can display 3 Axis (Per Dot) Rotation in this mode. */ PerspectiveSwitch, /** @brief Switch RBG0 rotation display based on a VDP2 window * @details Rotation A displays in regions inside the selected VDP2 window While * Rotation B displays outside the window + * @note - This is the only avaiable mode where Parameter A and B can + * Simultaneously display 3 Axis (Per Dot) Rotation. */ - WindowSwitch, + WindowSwitch, + + }; + + enum class RotationParameter : uint16_t + { + Primary = RA, + Secondary = RB, }; /** @brief RBG0 interface @@ -1303,69 +1318,9 @@ namespace SRL */ class RBG0 : public BmpScreen { - public: - using ScrollScreen::LoadTilemap; - - /** @brief VRAM Address of RBG0 Coefficient table - */ - inline static void* KtableAddress = (void*)(VDP2_VRAM_A0 - 1); - /** @brief VRAM Address of RBG0 Coefficient table B - */ - inline static void* KtableAddressB = (void*)(VDP2_VRAM_A0 - 1); - /** @brief VRAM Address of TilemapB map data - */ - inline static void* MapAddressRB = (void*)(VDP2_VRAM_A0 - 1); - /** @brief VRAM Address of TilemapB cell data - */ - inline static void* CellAddressRB = (void*)(VDP2_VRAM_A0 - 1); - /** @brief Size of Map B allocation - */ - inline static uint32_t MapAllocSizeB; - /** @brief Size of Cell B allocation - */ - inline static int32_t CellAllocSizeB; - /* @brief The Palette handler for LoadTilemapB - */ - inline static CRAM::Palette TilePaletteB = CRAM::Palette(); - - /** @brief Initializes the ScrollScreen's tilemap specifications - * @param info Tile map info - * @note This function initializes both parameters RA and RB to use - * the primary tilemap. To use a secondary tilemap in RB, call LoadTilemapB()/InitB() - * after loading and initializing the primary tilemap. - */ - inline static void Init(SRL::Tilemap::TilemapInfo& info) - { - slRparaMode(RA); - slOverRA(0); - slOverRB(0); - slCharRbg0(info.SGLColorMode(), info.CharSize); - slPageRbg0(RBG0::CellAddress, (void*)RBG0::TilePalette.GetData(), info.MapMode); - slPlaneRA(info.PlaneSize); - slPlaneRB(info.PlaneSize); - sl1MapRA(RBG0::MapAddress); - sl1MapRB(RBG0::MapAddress); - } - - /** @brief Initializes the ScrollScreen's bitmap specifications - * @param info bitmap info - */ - static void Init(SRL::Bitmap::BitmapInfo& info) - { - slRparaMode(RA); - slOverRA(0); - uint16_t sglFlag = info.Height<=256? 0x2 : 0x6; - sglFlag |= info.Width<= 512 ? 0 : 1<<3; - slPageRbg0(RBG0::CellAddress, (void*)RBG0::TilePalette.GetData(), RBG0::Info.MapMode); - slBitMapRbg0(GetSGLColorMode(info.ColorMode), sglFlag, RBG0::CellAddress); - if(info.ColorMode==SRL::CRAM::TextureColorMode::Paletted16) - { - slBMPaletteRbg0(RBG0::TilePalette.GetId()>>4); - } - else slBMPaletteRbg0(RBG0::TilePalette.GetId()); - } - - /** @brief Initializes the Tilemap settings for Secondary Tilemap on Rotation parameter B + + private: + /** @brief Initializes the Tilemap settings for Secondary Tilemap on Rotation parameter B * @param info Tilemap info to initialize with * @note Initialization fails if the tilemap's data format does not match the primary tilemap */ @@ -1373,7 +1328,7 @@ namespace SRL { if(info.MapMode!= RBG0::Info.MapMode || info.SGLColorMode()!=RBG0::Info.SGLColorMode()||info.CharSize!=RBG0::Info.CharSize) { - SRL::Debug::Assert("RBG0 Tilemap B Load Failed: Tilemap B format does not match primary tilemap"); + SRL::Debug::Assert("RBG0 Tilemap B Init Failed: Tilemap B format does not match primary tilemap"); return false; } slPlaneRB(info.PlaneSize); @@ -1381,21 +1336,10 @@ namespace SRL return true; } - - /** @brief Load a tilemap to be used with the secondary rotation parameter (B) - * @details RBG0 can display 2 different source tilemaps on screen with different - * rotatation parameters - primary(designated as A) Which is loaded - * with the standard LoadTilemap function, and secondary(designated as B), which is loaded - * with this function. These tilemaps can have their own independent 3d transforms and can - * display together in a frame in independent screen areas that do not overlap. - * @note Due to shared registers, The Secondary Tilemap must be in the same - * color mode as the Primary Tilemap and its data must be able to fit within the same - * Reserved VRAM banks as the corresponding primary data. Loading fails if these conditions are not met. - * -Always Load/ initialize Primary tilemap A before loading data for secondary tilemap B - * @param tilemap Itilemap to load with - * @param mode (Optional) specify how to switch between the Primary and Secondary Tilemap during display - * (default = PerspectiveSwitch) - */ + /** @brief Function to Load tilemap to VRAM for use with Rotation Parameter RB, called in Overloads of Load tilemap. + * Because RB data can not be loaded without RA data present, This is never explicitly called alone by user. Instead + * it is called within RBG0's LoadTilemap overloads which allow loading both tilemaps at once. + */ inline static void LoadTilemapB(SRL::Tilemap::ITilemap& tilemap, VDP2::SwitchMode mode = VDP2::SwitchMode::PerspectiveSwitch, bool LoadPalette = true) { SRL::Tilemap::TilemapInfo info = tilemap.GetInfo(); @@ -1456,12 +1400,103 @@ namespace SRL RBG0::TilePaletteB.GetId(), RBG0::GetCellOffset(info, RBG0::CellAddressRB)); } + + + public: + using ScrollScreen::LoadTilemap; + + /** @brief VRAM Address of RBG0 Coefficient table + */ + inline static void* KtableAddress = (void*)(VDP2_VRAM_A0 - 1); + /** @brief VRAM Address of RBG0 Coefficient table B + */ + inline static void* KtableAddressB = (void*)(VDP2_VRAM_A0 - 1); + /** @brief VRAM Address of TilemapB map data + */ + inline static void* MapAddressRB = (void*)(VDP2_VRAM_A0 - 1); + /** @brief VRAM Address of TilemapB cell data + */ + inline static void* CellAddressRB = (void*)(VDP2_VRAM_A0 - 1); + /** @brief Size of Map B allocation + */ + inline static uint32_t MapAllocSizeB; + /** @brief Size of Cell B allocation + */ + inline static int32_t CellAllocSizeB; + /* @brief The Palette handler for LoadTilemapB + */ + inline static CRAM::Palette TilePaletteB = CRAM::Palette(); + + + void* SetCellAddress(void* address, int size, VDP2::RotationParameter param =VDP2::RotationParameter::Primary) + { + if(param==VDP2::RotationParameter::Primary) + { + RBG0::CellAddress = address; + RBG0::CellAllocSize = size; + } + else + { + RBG0::CellAddressRB = address; + RBG0::CellAllocSizeB = size; + } + return address; + } + /** @brief Initializes the ScrollScreen's tilemap specifications + * @param info Tile map info + * @note This function initializes both parameters RA and RB to use + * the primary tilemap. To use a secondary tilemap in RB, call LoadTilemapB()/InitB() + * after loading and initializing the primary tilemap. + */ + inline static void Init(SRL::Tilemap::TilemapInfo& info) + { + slRparaMode(RA); + slOverRA(0); + slOverRB(0); + slCharRbg0(info.SGLColorMode(), info.CharSize); + slPageRbg0(RBG0::CellAddress, (void*)RBG0::TilePalette.GetData(), info.MapMode); + slPlaneRA(info.PlaneSize); + slPlaneRB(info.PlaneSize); + sl1MapRA(RBG0::MapAddress); + sl1MapRB(RBG0::MapAddress); + } + + /** @brief Initializes the ScrollScreen's bitmap specifications + * @param info bitmap info + */ + static void Init(SRL::Bitmap::BitmapInfo& info) + { + slRparaMode(RA); + slOverRA(0); + uint16_t sglFlag = info.Height<=256? 0x2 : 0x6; + sglFlag |= info.Width<= 512 ? 0 : 1<<3; + slPageRbg0(RBG0::CellAddress, (void*)RBG0::TilePalette.GetData(), RBG0::Info.MapMode);//this is required to reserve the VRAM banks + slBitMapRbg0(GetSGLColorMode(info.ColorMode), sglFlag, RBG0::CellAddress); + if(info.ColorMode==SRL::CRAM::TextureColorMode::Paletted16) + { + slBMPaletteRbg0(RBG0::TilePalette.GetId()>>4); + } + else slBMPaletteRbg0(RBG0::TilePalette.GetId()); + } + + /** @brief Overload initializes Primary and Secondary rotation parameters to separate source tilemaps + * @note Initialization fails if infoA and infoB do not share the same configurations for + * color depth, tile size, and map data type. + * @param infoA Tilemap info of primary tilemap to initialize + * @param infoB Tilemap info of secondary tilemap to initialize + */ + static void Init(SRL::Tilemap::TilemapInfo& infoA,SRL::Tilemap::TilemapInfo& infoB) + { + RBG0::Init(infoA); + RBG0::InitB(infoB); + } + /** @brief Simultaneously Configures the desired rotation mode and loads primary tilemap - * @details Overload to both load the primary tilemap and configure its rotation - * with one function. Calls SetRotationMode followed by LoadTilemap. + * @details Overload to load the primary tilemap and configure its rotation + * with one function. Calls SetRotationMode() followed by LoadTilemap(). * @param tilemap The tilemap to load - * @param mode The rotation mode to configure for the tilemap.(See SetRotationMode for details) + * @param mode The rotation mode to configure for the tilemap (See SetRotationMode for details) * @param LoadPalette (optional) enable/disable auto loading of palette data (default = true) */ inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemap,VDP2::RotationMode mode, bool LoadPalette = true) @@ -1471,7 +1506,7 @@ namespace SRL } /** @brief Load and configure both primary and secondary Tilemaps - * @details Overload to load and configure both primary and secondary tilemaps. + * @details Overload to load and configure both primary and secondary tilemaps on RBG0. * The SwitchMode will be initialized to UsePerspective. Use SetSwitchMode() after loading * to change the setting if desired. * @param tilemapA The tilemap to load to Primary Tilemap (A) @@ -1479,39 +1514,40 @@ namespace SRL * @param modeA The rotation mode to configure for primary map (RA) * @param modeB The rotation mode to configure for secondary map (RB) * @param LoadPalette (optional) set false to disable auto loading of palette data (default = true) - * @note for details and restrictions on secondary map loading, see RBG0::LoadTilemapB() + * @note -Due to shared registers, the Secondary Tilemap must have the same underlying data format as the + * Primary Tilemap (color depth, tile size, map data type). Furthermore its data must be able to fit within the same + * Reserved VRAM banks as the corresponding primary data ((celDataA + celDataB) <= 0x20000 bytes and (mapDataA+mapDataB)<=0x20000 bytes) + * + * -See VDP2::Switchmode documentation for limits on rotation modes for A and B under various conditions. */ inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemapA,SRL::Tilemap::ITilemap& tilemapB, VDP2::RotationMode modeA,VDP2::RotationMode modeB, bool LoadPalette = true) { - SetRotationMode(modeA,modeB); + SetRotationMode(modeA,modeB,false); LoadTilemap(tilemapA,LoadPalette); LoadTilemapB(tilemapB); } - /** @brief Sets How screen regions outside the tilemap area are displayed in - * the Primary Rotation Parameter (RA) + /** @brief Sets How screen regions outside the tilemap area are displayed by a rotation parameter + * @param param The Rotation parameter that will be set(primary or secondary) * @param mode the display mode to select * @param tileIndex (Optional)The tile index to display in exterior regions if RepeatTile is * selected as mode (defaults to tile 0) * @note see OverPattern documentatioin for descriptions of available modes */ - inline static void SetOverDisplayA(VDP2::OverPattern mode, uint16_t tileIndex = 0) + inline static void SetOverDisplay(VDP2::RotationParameter param, VDP2::OverPattern mode, uint16_t tileIndex = 0) { - slOverPatRA(tileIndex); - slOverRA((uint16_t)mode); - } - /** @brief Sets How screen regions outside the tilemap area are to be displayed in - * the Second Rotation Parameter (RB) - * @param mode the display mode to select - * @param tileIndex (Optional)The tile index to display in exterior regions if RepeatTile is - * selected as mode (defaults to tile 0) - * @note see OverPattern documentatioin for descriptions of available modes - */ - inline static void SetOverDisplayB(VDP2::OverPattern mode, uint16_t tileIndex = 0) - { - slOverPatRB(tileIndex); - slOverRB((uint16_t)mode); + if(param == VDP2::RotationParameter::Primary) + { + slOverPatRA(tileIndex); + slOverRA((uint16_t)mode); + } + else + { + slOverPatRB(tileIndex); + slOverRB((uint16_t)mode); + } } + /** @brief Sets Condition for displaying Primary and Secondary parameters/Tilemaps on screen. * @param mode the display mode to select * @note See SwitchMode documentation for description of available modes @@ -1528,7 +1564,7 @@ namespace SRL * @param mode The RotationMode to use for RBG0 * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of coefficient * data required for rotation of a plane (default = true) - * @note when 2 or 3 axis rotation is Selected, VRAM will be allocated to store + * @note when 2 or 3 axis rotation is selected, VRAM will be allocated to store * necessary scaling coefficients. If Vblank is set false, all coefficients will be * statically stored in VRAM as a 0x18000 byte table. If Vblank is set true, the * the coefficients for the perspective of the current frame will be @@ -1539,17 +1575,20 @@ namespace SRL inline static void SetRotationMode(VDP2::RotationMode mode, bool vblank = true) { //Allocate coeficient tables if necessary for either param: + uint16_t kflag =0; if(mode!=VDP2::RotationMode::OneAxis) { if(vblank==true) { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB =(void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); } else { VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; + slMakeKtable(VDP2::RBG0::KtableAddress); + kflag = K_FIX; } } @@ -1562,13 +1601,13 @@ namespace SRL break; case RotationMode::TwoAxis: - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_LINE | K_2WORD | K_ON); - slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_LINE | K_2WORD | K_ON); + slKtableRA((void*)VDP2::RBG0::KtableAddress, kflag|K_LINE | K_2WORD | K_ON); + slKtableRB((void*)VDP2::RBG0::KtableAddressB, kflag|K_LINE | K_2WORD | K_ON); break; case RotationMode::ThreeAxis: - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_FIX | K_DOT | K_2WORD | K_ON); - slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_FIX | K_DOT | K_2WORD | K_ON); + slKtableRA((void*)VDP2::RBG0::KtableAddress, kflag | K_DOT | K_2WORD | K_ON); + slKtableRB((void*)VDP2::RBG0::KtableAddressB, kflag | K_DOT | K_2WORD | K_ON); break; } } @@ -1589,74 +1628,63 @@ namespace SRL */ inline static void SetRotationMode(VDP2::RotationMode modeA, VDP2::RotationMode modeB, bool vblank = true) { + uint16_t kflag =0; //Allocate coeficient tables if necessary for either param: if(modeA!=VDP2::RotationMode::OneAxis||modeB!=VDP2::RotationMode::OneAxis) { if(vblank==true) { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB = (void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); } else { VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; + slMakeKtable(VDP2::RBG0::KtableAddress); + kflag = K_FIX; } } - //set mode of param A - switch (modeA) + //set mode of param B + switch (modeB) { case RotationMode::OneAxis: - slKtableRA(nullptr, K_OFF); + slKtableRB(nullptr, K_OFF); break; case RotationMode::TwoAxis: - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_LINE | K_2WORD | K_ON); + slKtableRB((void*)VDP2::RBG0::KtableAddressB, kflag |K_LINE | K_2WORD | K_ON); break; case RotationMode::ThreeAxis: - slKtableRA((void*)VDP2::RBG0::KtableAddress, K_FIX | K_DOT | K_2WORD | K_ON); + slKtableRB((void*)VDP2::RBG0::KtableAddressB, kflag | K_DOT | K_2WORD | K_ON); break; } - - //set mode of param B - switch (modeB) + //set mode of param A + switch (modeA) { case RotationMode::OneAxis: - slKtableRB(nullptr, K_OFF); + slKtableRA(nullptr, K_OFF); break; case RotationMode::TwoAxis: - slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_LINE | K_2WORD | K_ON); + slKtableRA((void*)VDP2::RBG0::KtableAddress, kflag|K_LINE | K_2WORD | K_ON); break; case RotationMode::ThreeAxis: - slKtableRB((void*)VDP2::RBG0::KtableAddressB, K_FIX | K_DOT | K_2WORD | K_ON); + slKtableRA((void*)VDP2::RBG0::KtableAddress, kflag| K_DOT | K_2WORD | K_ON); break; } } - /** @brief Writes the current matrix transform to main Rotation parameter (RA) + /** @brief Writes the current matrix transform to RBG0 rotation parameters * to update its perspective + * @param param selects which rotation parameter to write the matrix to(defaults to Primary) */ - inline static void SetCurrentTransform() - { - slCurRpara(RA); - slPushMatrix(); - { - slScrMatConv(); - slScrMatSet(); - } - slPopMatrix(); - } - - /** @brief Writes the current matrix transform to secondary rotation parameter (RB) - * to update its perspective - */ - inline static void SetCurrentTransformB() + inline static void SetCurrentTransform(VDP2::RotationParameter param = VDP2::RotationParameter::Primary) { - slCurRpara(RB); + slCurRpara((uint16_t)param); slPushMatrix(); { slScrMatConv(); @@ -1666,7 +1694,6 @@ namespace SRL slCurRpara(RA); } - /** @brief Sets the plane of Tilemap Data to be displayed * @param a,b,c,d Page Table addresses of the planes to display * @note Multi Plane maps must be set with the 16 plane version of this function @@ -1688,36 +1715,9 @@ namespace SRL * the scroll's map data. Specifying indices larger than the number of planes loaded * will result in the diplay of garbage data in those portions of the map */ - static void SetPlanes(const uint8_t layout[4][4]) - { - uint32_t offset = ((uint32_t)RBG0::MapAddress & 0x1ffff)>>11; - uint8_t sz = (VDP2::RBG0::Info.CharSize==CHAR_SIZE_1x1) ? 4:1; - uint8_t sLayout[4][4] = {}; - if (VDP2::RBG0::Info.MapMode == PNB_2WORD) sz <<= 1; - if (VDP2::RBG0::Info.PlaneSize == PL_SIZE_2x2)sz <<= 2; - else if (VDP2::RBG0::Info.PlaneSize == PL_SIZE_2x1)sz <<= 1; - for (size_t i = 0; i < 4; ++i) { - for (size_t j = 0; j < 4; ++j) { - sLayout[i][j] = (layout[i][j] * sz)+(uint8_t)offset; - } - } - sl16MapRA((uint8_t*)sLayout); - } - /** @brief Sets the plane of Tilemap Data to be displayed with 16 planes for Tilemap B - * @details Unlike NBG scrolls RBG0 only loads with the default tiling of 1 plane. Use this - * function after loading to set the arrangement of multi plane tilemaps within a 4x4 grid: - * |a,b,c,d| - * |e,f,g,h| - * |i,j,k,l| - * |m,n,o,p| - * @param layout 4x4 array of uint8_t indices representing the index of each plane in the map layout - * @note No check is performed to ensure the indecies entered are within the bounds of - * the scroll's map data. Specifying indices larger than the number of planes loaded - * will result in the diplay of garbage data in those portions of the map - */ - static void SetPlanesB(const uint8_t layout[4][4]) + static void SetPlanes(const uint8_t layout[4][4], VDP2::RotationParameter param = VDP2::RotationParameter::Primary) { - uint32_t offset = ((uint32_t)RBG0::MapAddressRB & 0x1ffff)>>11; + uint32_t offset = (param==VDP2::RotationParameter::Primary) ? ((uint32_t)RBG0::MapAddress & 0x1ffff)>>11 : ((uint32_t)RBG0::MapAddressRB & 0x1ffff)>>11; uint8_t sz = (VDP2::RBG0::Info.CharSize==CHAR_SIZE_1x1) ? 4:1; uint8_t sLayout[4][4] = {}; if (VDP2::RBG0::Info.MapMode == PNB_2WORD) sz <<= 1; @@ -1728,9 +1728,9 @@ namespace SRL sLayout[i][j] = (layout[i][j] * sz)+(uint8_t)offset; } } - sl16MapRB((uint8_t*)sLayout); + if(param==VDP2::RotationParameter::Primary)sl16MapRA((uint8_t*)sLayout); + else sl16MapRB((uint8_t*)sLayout); } - }; /** @brief Sprite Color Calculation Conditions (See SpriteLayer::SetColorCondition() for details) From db8a0efe5a8658c2c830c9cd32f0df9bbfc24f82 Mon Sep 17 00:00:00 2001 From: 7shades Date: Mon, 27 Jul 2026 16:49:50 -0700 Subject: [PATCH 7/8] Test Changes --- .../.vscode/c_cpp_properties.json | 36 +++++++ Samples/ASCII - Fonts/.vscode/extensions.json | 5 + Samples/ASCII - Fonts/.vscode/settings.json | 42 ++++++++ Samples/ASCII - Fonts/.vscode/tasks.json | 63 ++++++++++++ Samples/ASCII - Fonts/cd/data/FONT1.tga | Bin 0 -> 6194 bytes Samples/ASCII - Fonts/clean.bat | 3 + Samples/ASCII - Fonts/compile.bat | 3 + Samples/ASCII - Fonts/makefile | 35 +++++++ Samples/ASCII - Fonts/run_with_mednafen.bat | 3 + Samples/ASCII - Fonts/src/main.cxx | 93 ++++++++++++++++++ .../VDP1 - 3D - Smooth teapot/src/main.cxx | 2 +- Samples/VDP2 - Layers/cd/data/AESPR.bin | Bin 0 -> 69664 bytes Samples/VDP2 - Layers/cd/data/AESPR2.bin | Bin 0 -> 69664 bytes Samples/VDP2 - Layers/cd/data/AESPR3.bin | Bin 0 -> 69664 bytes Samples/VDP2 - Layers/cd/data/AESPR4.bin | Bin 0 -> 53280 bytes Samples/VDP2 - Layers/cd/data/FOO.bin | Bin 0 -> 34592 bytes Samples/VDP2 - Layers/cd/data/FOO2.bin | Bin 0 -> 42784 bytes Samples/VDP2 - Layers/cd/data/LAY.bin | Bin 0 -> 48288 bytes Samples/VDP2 - Layers/cd/data/LAY2.bin | Bin 0 -> 45088 bytes Samples/VDP2 - Layers/cd/data/OGTEST.bin | Bin 0 -> 53280 bytes Samples/VDP2 - Layers/cd/data/THAT.bin | Bin 0 -> 53280 bytes Samples/VDP2 - Layers/cd/data/THIS.bin | Bin 0 -> 53280 bytes Samples/VDP2 - Layers/src/main.cxx | 34 ++++--- .../.vscode/c_cpp_properties.json | 36 +++++++ .../.vscode/extensions.json | 5 + .../.vscode/settings.json | 42 ++++++++ .../.vscode/tasks.json | 63 ++++++++++++ .../cd/data/TILE.bin | Bin 0 -> 51520 bytes .../cd/data/overworld_tileset_grass.aseprite | Bin 0 -> 13094 bytes .../cd/data/testgrass.aseprite | Bin 0 -> 12629 bytes .../cd/data/testgrass2.aseprite | Bin 0 -> 13123 bytes .../src/main.cxx | 4 +- Samples/VDP2 - RBG0 Rotation/cd/data/CLD.bin | Bin 66085 -> 0 bytes Samples/VDP2 - RBG0 Rotation/cd/data/CLD2.bin | Bin 68128 -> 0 bytes .../VDP2 - RBG0 Rotation/cd/data/ELF_S.TGA | Bin 9561 -> 0 bytes Samples/VDP2 - RBG0 Rotation/cd/data/FOG.tga | Bin 16761 -> 0 bytes Samples/VDP2 - RBG0 Rotation/cd/data/TEST.TGA | Bin 5339 -> 0 bytes .../VDP2 - RBG0 Rotation/cd/data/TESTN.bin | Bin 29472 -> 0 bytes .../VDP2 - RBG0 Rotation/cd/data/TESTN2.bin | Bin 29472 -> 0 bytes .../VDP2 - RBG0 Rotation/cd/data/TESTN3.bin | Bin 29472 -> 0 bytes Samples/VDP2 - RBG0 Rotation/src/main.cxx | 15 ++- saturnringlib/srl_mesh.hpp | 2 +- saturnringlib/srl_scene2d.hpp | 2 +- saturnringlib/srl_scene3d.hpp | 2 +- saturnringlib/srl_tilemap.hpp | 4 +- saturnringlib/srl_vdp2.hpp | 88 +++++++++-------- 46 files changed, 517 insertions(+), 65 deletions(-) create mode 100644 Samples/ASCII - Fonts/.vscode/c_cpp_properties.json create mode 100644 Samples/ASCII - Fonts/.vscode/extensions.json create mode 100644 Samples/ASCII - Fonts/.vscode/settings.json create mode 100644 Samples/ASCII - Fonts/.vscode/tasks.json create mode 100644 Samples/ASCII - Fonts/cd/data/FONT1.tga create mode 100644 Samples/ASCII - Fonts/clean.bat create mode 100644 Samples/ASCII - Fonts/compile.bat create mode 100644 Samples/ASCII - Fonts/makefile create mode 100644 Samples/ASCII - Fonts/run_with_mednafen.bat create mode 100644 Samples/ASCII - Fonts/src/main.cxx create mode 100644 Samples/VDP2 - Layers/cd/data/AESPR.bin create mode 100644 Samples/VDP2 - Layers/cd/data/AESPR2.bin create mode 100644 Samples/VDP2 - Layers/cd/data/AESPR3.bin create mode 100644 Samples/VDP2 - Layers/cd/data/AESPR4.bin create mode 100644 Samples/VDP2 - Layers/cd/data/FOO.bin create mode 100644 Samples/VDP2 - Layers/cd/data/FOO2.bin create mode 100644 Samples/VDP2 - Layers/cd/data/LAY.bin create mode 100644 Samples/VDP2 - Layers/cd/data/LAY2.bin create mode 100644 Samples/VDP2 - Layers/cd/data/OGTEST.bin create mode 100644 Samples/VDP2 - Layers/cd/data/THAT.bin create mode 100644 Samples/VDP2 - Layers/cd/data/THIS.bin create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/.vscode/c_cpp_properties.json create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/.vscode/extensions.json create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/.vscode/settings.json create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/.vscode/tasks.json create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/cd/data/TILE.bin create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/cd/data/overworld_tileset_grass.aseprite create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/cd/data/testgrass.aseprite create mode 100644 Samples/VDP2 - RBG0 Rotation Parameters/cd/data/testgrass2.aseprite delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/CLD.bin delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/CLD2.bin delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/ELF_S.TGA delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/FOG.tga delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/TEST.TGA delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/TESTN.bin delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/TESTN2.bin delete mode 100644 Samples/VDP2 - RBG0 Rotation/cd/data/TESTN3.bin diff --git a/Samples/ASCII - Fonts/.vscode/c_cpp_properties.json b/Samples/ASCII - Fonts/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..d9f92c7e --- /dev/null +++ b/Samples/ASCII - Fonts/.vscode/c_cpp_properties.json @@ -0,0 +1,36 @@ +{ + "configurations": [ + { + "name": "Saturn", + "includePath": [ + "${workspaceFolder}/../../saturnringlib", + "${workspaceFolder}/../../modules/sgl/INC", + "${workspaceFolder}/../../modules/tlsf", + "${workspaceFolder}/../../modules/SaturnMathPP", + "${workspaceFolder}/../../Compiler/sh2eb-elf/sh-elf/include", + "${workspaceFolder}/../../Compiler/sh2eb-elf/sh-elf/include/c++/14.2.0", + "${workspaceFolder}/../../saturnringlib/**" + ], + "compilerPath": "${workspaceFolder}/../../Compiler/sh2eb-elf/bin/sh-elf-gcc-14.2.0.exe", + "cStandard": "c23", + "cppStandard": "c++23", + "intelliSenseMode": "gcc-x86", + "defines": [ + "__STDC_HOSTED__=0", + "SRL_CUSTOM_SGL_WORK_AREA=0", + "SRL_MALLOC_MEMORY=131072", + "SRL_MAX_TEXTURES=100", + "SRL_MODE_PAL", + "SRL_FRAMERATE=0", + "SRL_MAX_CD_BACKGROUND_JOBS=1", + "SRL_MAX_CD_FILES=255", + "SRL_MAX_CD_RETRIES=5", + "SRL_DEBUG_MAX_PRINT_LENGTH=45", + "SRL_USE_SGL_SOUND_DRIVER=1", + "SRL_ENABLE_FREQ_ANALYSIS=1", + "DEBUG" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Samples/ASCII - Fonts/.vscode/extensions.json b/Samples/ASCII - Fonts/.vscode/extensions.json new file mode 100644 index 00000000..610a551b --- /dev/null +++ b/Samples/ASCII - Fonts/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ms-vscode.cpptools" + ] +} \ No newline at end of file diff --git a/Samples/ASCII - Fonts/.vscode/settings.json b/Samples/ASCII - Fonts/.vscode/settings.json new file mode 100644 index 00000000..2177b80d --- /dev/null +++ b/Samples/ASCII - Fonts/.vscode/settings.json @@ -0,0 +1,42 @@ +{ + "files.exclude": { + "**/*.o": true, + "**/*.bat": true, + "[Cc][Dd]/[Bb]uild[Dd]rop**" : true, + }, + "files.watcherExclude": { + "**/*.o": true, + "**/*.bat": true, + "[Cc][Dd]/[Bb]uild[Dd]rop**" : true, + }, + "C_Cpp.loggingLevel": "Debug", + "files.associations": { + "*.embeddedhtml": "html", + "*.H": "c", + "*.C": "c", + "*.def": "c", + "*.h": "c", + "*.c": "c", + "*.HPP": "cpp", + "*.CXX": "cpp", + "*.hpp": "cpp", + "*.cxx": "cpp", + "functional": "cpp", + "vector": "cpp" + }, + "cmake.configureOnOpen": false, + "makefile.makefilePath": "./makefile", + "C_Cpp.default.cppStandard": "c++23", + "C_Cpp.default.cStandard": "c17", + "C_Cpp.formatting": "vcFormat", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.function": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.block": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.namespace": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.type": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.lambda": "newLine", + "C_Cpp.vcFormat.indent.lambdaBracesWhenParameter": false, + "C_Cpp.inlayHints.autoDeclarationTypes.enabled": true, + "C_Cpp.inlayHints.autoDeclarationTypes.showOnLeft": true, + "C_Cpp.inlayHints.referenceOperator.enabled": true, + "C_Cpp.inlayHints.referenceOperator.showSpace": true +} diff --git a/Samples/ASCII - Fonts/.vscode/tasks.json b/Samples/ASCII - Fonts/.vscode/tasks.json new file mode 100644 index 00000000..fb205970 --- /dev/null +++ b/Samples/ASCII - Fonts/.vscode/tasks.json @@ -0,0 +1,63 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Run with Mednafen", + "type": "shell", + "command": "./run_with_mednafen.bat", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Compile [DEBUG]", + "type": "shell", + "command": "./compile.bat debug", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Compile [RELEASE]", + "type": "shell", + "command": "./compile.bat release", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Clean", + "type": "shell", + "command": "./clean.bat", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + ] +} diff --git a/Samples/ASCII - Fonts/cd/data/FONT1.tga b/Samples/ASCII - Fonts/cd/data/FONT1.tga new file mode 100644 index 0000000000000000000000000000000000000000..caa390119fb4c7f28576fd467573a32da27efe41 GIT binary patch literal 6194 zcmc&!ZEjpe5PZomj=)bY5R^*<$r1u7A&BE}b2IhT-7~v3wuQ_}@AX%8Rn6?$*M|?+ z_3`@gx;|fjujhxKuIqYyd|dB*fVi&pc5<;^9k)5dEBz;8`2ID9$Uw_lf61hQs3!?G zG`3rG*jTTdfd$TBT-qujfll=8LY;aOftOWBRtpC`A@fy0HxK+ehgol2r6#qa{nZ}_TDG)1rJ|xR()LzN)ASt^+G*$qP?H0c&zMojOT+27uai_ zyEn1IOeC%_HFA6!g={@T*#LiIMEds*yVFOQ%t2NH%paXmYFq;)cqK~9%A~p5i@** zQqD4KjJU;01ls0nU3GX;Cl+!3e+1}(w{Lv(-uq_pt%!G@mwy|q*N_idxH7;5NH}#=tWnP=Iy1~BZ*8+S9pv7ex)!|sp~QrDiQua zZ`)hqv>Cgu+yCa>M>~72MMNf?DW`OMHPEe(?ntmR=a&fr`q(gJJ@Kpog9KkArlaZ0 z^obG?x!Xre)N!rbK^m=>9TD0A)?*h*Y9`O>`$xTihA9zUPP;~)kHpf0T|?-Vzkn;%9xCb*H{8)va#i|c2IG#{an?1 zjq0qYGqVAI9SAf$qrPYpRUmLxg%_*#(bT~?MpMZO8~->m2J^Y|e-8lh6t)fcRGBlH ze&xcUIiI=-@ZOnqPjmBa9KfWXBUfvwRf99LO)r3 z&Hnk)@Iq_B{tz(7YkThXh!MVhi_UP9)GvGI)PD8Wj_?k + +using namespace SRL::Types; +using namespace SRL::Input; +using namespace SRL::Math; + +//A custom 16 color palette to load for a font: +HighColor CustomPalette[16] = +{ + HighColor::Colors::Black,//note: index 0 color in a palette will be transparent + HighColor::Colors::Red, + HighColor::Colors::Green, + HighColor::Colors::Blue, + HighColor::Colors::White, + HighColor::Colors::Magenta, + HighColor::Colors::Yellow, + HighColor::Colors::Black, + HighColor::Colors::Black, + HighColor::Colors::Black, + HighColor::Colors::Black, + HighColor::Colors::Black, + HighColor::Colors::Black, + HighColor::Colors::Black, + HighColor::Colors::Black, + HighColor::Colors::Black, +}; + +int main() +{ + + SRL::Core::Initialize(HighColor(20,10,50)); + + /* During initialization, SRL loads the SGL font to font index 0. + By default print statements will display using font index 0, palette index 0:*/ + + SRL::Debug::Print(1,2,"SRL Ascii Font Demo"); + SRL::Debug::Print(1,7,"This is the Default SGL Font"); + + /*The font system can use the first 8 16 color palettes in CRAM (0-7). + So we can load additional palettes to use with fonts: */ + + //reserve CRAM palette 1 for a font palette: + SRL::CRAM::SetBankUsedState(1, SRL::CRAM::TextureColorMode::Paletted16, true); + SRL::CRAM::Palette MyPalette(SRL::CRAM::TextureColorMode::Paletted16, 1); + + //load custom colors to CRAM palette 1 + MyPalette.Load(CustomPalette,16); + + //Switch the current font palette: + SRL::ASCII::SetPalette(1); + + //Now subsequent print statments will use palette 1: + SRL::Debug::Print(1,10, "This is a custom font palette-"); + SRL::Debug::Print(1,11, "8 palettes can display simultaneously!"); + + //Switch back to palette 0 + SRL::ASCII::SetPalette(0); + + /*Custom fonts can also be used. Up to 6 can be loaded and displayed at once (0-5). + The system loads 8x8 character ASCII tables from a bitmap source. + -Ensure the source is 4bpp (16 color) and the table begins with + one whitespace character followed by the standard Ascii characters. See the + included image in the CD::Data folder for an example of the proper table format. + -Only 7bit ascii tables (first 128 characters) are supported.*/ + + //load bitmap of the custom font to work ram + SRL::Bitmap::TGA* CustomFont = new SRL::Bitmap::TGA("FONT1.TGA"); + + //load custom font to Ascii index 1: + SRL::ASCII::LoadFont(CustomFont, 1); + + //Now we can switch to the new font like we switched palettes: + SRL::ASCII::SetFont(1); + SRL::Debug::Print(1,14,"This is a custom font-"); + SRL::Debug::Print(1,15,"6 fonts can display simultaneously!"); + + //Main Game Loop + while(1) + { + //Print statments will remain on screen until SRL::ASCII::Clear() is Called + SRL::Core::Synchronize(); + } + return 0; +} diff --git a/Samples/VDP1 - 3D - Smooth teapot/src/main.cxx b/Samples/VDP1 - 3D - Smooth teapot/src/main.cxx index 7bb0742d..361e7454 100644 --- a/Samples/VDP1 - 3D - Smooth teapot/src/main.cxx +++ b/Samples/VDP1 - 3D - Smooth teapot/src/main.cxx @@ -75,7 +75,7 @@ int main() // Initializes gouraud table work area SRL::Scene3D::LightInitGouraudTable(0, vertWork, workTable, polygons); - + // Sets current light shading table SRL::Scene3D::LightSetGouraudTable(shadingTable); diff --git a/Samples/VDP2 - Layers/cd/data/AESPR.bin b/Samples/VDP2 - Layers/cd/data/AESPR.bin new file mode 100644 index 0000000000000000000000000000000000000000..1aede522f88b9f09a5fcb22ae262153e15ff57e7 GIT binary patch literal 69664 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 CU1YNW literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/AESPR2.bin b/Samples/VDP2 - Layers/cd/data/AESPR2.bin new file mode 100644 index 0000000000000000000000000000000000000000..1aede522f88b9f09a5fcb22ae262153e15ff57e7 GIT binary patch literal 69664 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 CU1YNW literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/AESPR3.bin b/Samples/VDP2 - Layers/cd/data/AESPR3.bin new file mode 100644 index 0000000000000000000000000000000000000000..1aede522f88b9f09a5fcb22ae262153e15ff57e7 GIT binary patch literal 69664 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 CU1YNW literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/AESPR4.bin b/Samples/VDP2 - Layers/cd/data/AESPR4.bin new file mode 100644 index 0000000000000000000000000000000000000000..df2bdaf5e0de46035e98fd4d292ed131779c01a5 GIT binary patch literal 53280 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 n?Y>idUDvN8+V}bbhDFg9 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 C)(^@6 literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/FOO.bin b/Samples/VDP2 - Layers/cd/data/FOO.bin new file mode 100644 index 0000000000000000000000000000000000000000..aee5cad8cebdda7570669a9714c9e287ff9e0546 GIT binary patch literal 34592 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 MCGE!(zu^4;FVGB5y#N3J literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/FOO2.bin b/Samples/VDP2 - Layers/cd/data/FOO2.bin new file mode 100644 index 0000000000000000000000000000000000000000..d5b3d0eb690db3bc854a531a2d05965713d3ded0 GIT binary patch literal 42784 zcmeHPO>7)Tb{@`XyU7trNVEbl2?e#A1W8d^P_akKP=JO52iY|e?83=rvCan08d(H! z9KdvI<7f&e-iK@Pq}KoG!}0M5;Uk-$hUI_ebol<2nkzW3^NS2ufR zdb-G-c$ZJ=`Ch%M_g7tAUH!*Sr}MQ==l46E&KO%~3ELHHJr+KK;)6?;X6m_TG>G^dJ8GzrS(i+rROR@4fcFzxE&B|Lk}F{k5O`=70Ul|NQ!m z?;L&acYg5wAN<{WfAj9Yz5DrlpZ{>8wwCOcS!0%%-1Ur!u)c9@7uf2&&}ec6G~D zF`ZZbbz^EX|Eidp=5MwVFjeEg>dQDT3#OD4)P?T{=f7L8UI3;om_fm8^=7$R}@eE`u?Aus?7yfH>Ho4_TlFawxRPs2EMK)mfpxs zWgO~-9y_!=T(JOFH^KkX+wk=cw)e3;#CC%15w;K2%98o;jc&SvU-#5+;CPcgguO}r zKSmweEq#LRQ*57&6~CykXQEBVJT?K)^7KTNGQYklU**54ttNVl^gqr6UU~-pq~?Y( zCG^xG!RI~kRMv85qsLQQR#*Dt#OM9iU!d^J+x$BEPq6J{^ZYM8$Jm9v%I!s`(?#=% z^bj>C`NlbC34UxV=s}**lGS|^Z7qP1@fw#bEq@s4=BM_%D+q5 z6zZ~lC5^>@_fB3}Ip?stoP(eLFxRi*y5lM-WvKWF{p0zc)H3s*phY?VK>zf~7$(Ls zW{VPe`Il-Y7oU1nj;|cMFA$5@RB}%sVBUsJ{C^33Bga>b-NKknpy2zpve{V_wiSo@ zDdVE@Hoq2+mCp;!PZ`h4UtPNvPu=!k)pjQc+}|F3RTH_0`=_P{5@f=2LK}1fC;s+v z8%`(r80YKG1Z~>rgJ|wSp6sP+(z!D1ee}){!8+`g?l$IO80F1wjq21Wj}8#!@qy;rf|>3 z`Rl%cHdr%t-vqwxgl7fxpA?N1_8F?W?_hg>j1Bm(*tT{lLCZ<`4~tg1<5KwqejmX< zH}Hjf-cO5d=Pn`tS=9Z|TEIW~FRfhSowy5|U92&Q871JDf0_I?<+_ID?nm(dG5iCC zzVHk&{*!#`KK1I(i0ys?|DVD?kR;Fl5-`mF9P)+LskHQlSKYvW_cP>!K9ud5XUk&? za|p%5@EMhM!j`fwor+G&;dj1!ge*)(%?|)5qocF&9&j0rWF8u9dloM=i=5PKC;eO$i zAcD5~!1v|z2w`EAz;he5>`4=yd=1MX=MlH z8C5$wJJbULb`Dm+0uERr5}CHh4J z`bPr>Odlk%EsT1gBUS<6ow$NXiGZDz11U0}p8;B3U1gT5w{Bfq?Vupc>a}aD*KS?= zf1kbuf9=*SW`Wq5L8psckbxw&$Q(GIL{WtKB*ozvMI%5Q6Jw#y2!Q&|XoRB`2nGTk z>flCaaQud4&sk8y7Kmd^I*2nKfdRxw2hql(P8y>;QUr9s?mOVE7Bz`ay|xO=5rur6j{bRi1||Sl1y%#{W!PcmoqD;R&V~} zwCCnMAg4b_6n4t~>293_I3_tbmeTI}dJGvraD9DumkK_KGJZta`!TuUt|Qu8-#t8> zfOjUyt^J)tM|Z$+%c&?Sme@)qe(dBeJ}-1(O>SuMhw59rlj1w?dc@CZi0KZd0`WIix`r46}-yu_{B> zSezPtgZQ0+rutcQ7L;LDkuz3hnAd6zq@K_vSg#<25c5Rv0xT94vN z+;#FSObf~|tH>FvGGvX}X^Nr8Z>2tjI%zmOUdOz$OA!Y@nRpkIDABTOe*Et`J4L*6 zSS+Kb3hk^Op~?`zI~Gw71dR2q#(HSuhq@%%Q~fyVMeH3caYSGUp_C2bm(A$Ej97q( zTq zm%sQy2BL%?L70I^Gf=Z?nZ4B0@C^~&!t-a+2r!b^!Ok;)sKX3I7e9h?$xbLv@ zV4K}1Ho+2AE`5kH$5$`~9Y4X|tJ8;BNw3E76B(+iFMr$E2% zj-J#mv4yeC$xn;(mzRQ@DWeoUf)iQVw5#t++;u_IrZVLoSXf5_G2AS3o`F=mV_X7rz?~OrpucNVx(vH6nb`V!8LJiqLC{* zXNYNp+b`6`eGI8{0Ka0fgGGRv?rBbGR@VCbSI!Bs+}PlanbGJaQUR~NbhTVIebvSd z6Gx)#|3Fv%naq{T_U0{{IcNRqyyejNL-ps4_pIB8#$VKzdwLi-aYy3B1$2ho-;>I0 zG+}&*{;Yc1oo0VZJr_izh*u{d;1LOEa^4e6S8&YPVg=Jt#7l7Dyn$~gr5 z+^A<2p7+$!yr^3GJOJ*U|4Ep|=fZ~HR8>+tMds+v)jc^`%bgiYc=$<;!o263a{F5I z)0FwEY;WFjsQ(Ln*8>YW|C~wxPdUGd{VDau^G*BbpHTnVM9`42sZ}taQ;T!4HM*#m zHA|_lrk-EWc4~dY-Il4%vOlYS-ubrNKJ@s_?Y(rB6l0N0l7$0MuR3|g;sqqni>Sfc z0*EK>X>9&Q89&smBGu-_zLK>u{h;+XjfBjfRCi=?m2p=5q57fmhw6vMfA#7}_CP+K zaQzO6l_Oryqb!L2wla5}P~iRx&0qA>t9t#;am{#aeCOrr>q#UK+J8auPdUFz-_EKJ zjUVp%7$t^-2@p&8oI-rJ6}_fDgApU(byCx-ezLwyMi zcSz+@8X&KFcH#lS#DjhyWsisP&Q+LUVLx{*eU^ zZCK?G;zB6=4}r?Fva2__i$kLu4iM@viHXAmp$`Z|t=HFYk)YG^!19|jf6s!kat9gv zrr+<6`UBu-W7KzL-0tT7#E6(cQpq3a;vbBN9bq?6HY%$(%|Ab%>M1BHt>5&%1Lj%2 zB}s~p@oFT?%9P{K_*{}m)5VLSH{w56&b6Y!ae9nH0VoU+%s}uMQ#{L%IJ9zxa()Uu z{{-l3zhiJtAni2#%2_9kBMeYbhIRFMz5_+E>SrkVLq6mD>B8U{Gfqdxc!5;_-DuQs z{9|0}?jp!;0}u&70o$EbX#NAS>G(&#;t3RcWj1mLz)w2V_Cx9ghK<>7wqJ{{%0F)W z^VG=)0FBVjKTWZzU(;*q_pJ0{uG@IKyCH_g(bTW$+5E!yWRwsQ?jiFwa?SUjf}Wp? zpGCg^)5AIla~IcDTv-9Ftm~_My_K!MbUmi$XB^Ma9`UU#8X&qd0PCxKy(JA$FQ>4c zJ3sfZuImpshW$=7#QC1zEy;&I{C){LK)&yR$q3&F0R)xN`Z$IT^?Fe4Z}f+eto!gK z5!%Yy5R(k_@Ewt0+>y8XQKmJqfd>Lr>pDItu=Sv=_q2>tDb5$rU{hLr>u7QaO=xZ19AR%NQ^~VS>NEOPwJM zNm?B6ffyLr6^8c7h#xTO4~%7BUQg97>p)M->#4eBcjCueFhYpTp*w()1S!S(n&j?Z zQ=)ehN?#z&tx&9!J>7=l(@#VJuAacng zLFnYM=;40`{xPK^7kOO_C(!z@joIsEp&^)^3Y0k>@^V}zCt@SvewI*ld?>q?$am9= z$aa+DV=#xR%{M=kY+TrT?S|IQ>USNPou(+?eBkAF`~&d^n+o-N5R_aot0tqe!(EH3 zY5bx37KaAJ5;hgqia%68G=6;9Bjk-A?g$w-+}FBa-8e!^DQAd}A*3}j7KT6AR9Gv2 zwYR?RQ2oX0kt-`==d$eL5s#7jJ=Ey)@$1Ce7z$Q)?ewK6H0OsLAS>hjm)!_M8fMc7 z@+hr|Vg+_2xODwk=hqzFxI7h)#Z}jjwX^sPrJuaxdERp9>@}~ya{EyKq59FT?zvfL zA6nr^5W@b8IQfM7$DyM3b`LR>(sdj>1R#bCBsn@ck1aGHfL!#N!?a(GI{&rf20A+4 zXCO6sTqxkHFqX7TS;Uwna5BQLOZ*hNVpdIt@nhQ+tF(jkK=qN`#rCE1S#??G4|W*q zNkE~{{iof4KqMRnWTaVJiIWS-<(ah$^&hIAO8;TLn}Ekoj?ThdigqBP_TGB%^B?Or zL+dXoXRBrm3!&59yj4Z3tG6j$y?wiXZ)>&N1#aQ54O|09#NQw2N^N&_wV-})YwNa? z^lvK%M61=U+ubfLtaf1(3{A3XZOs^mTWhF7+b#I$u6Eb9x>Q=jKf>A?>H+kszoyP0 zQNwD`+SWCCy|%gqMY=<4u|PFikg(U*esK#YWcEzl6hp^PQ@^Gc>OWLJ=7+bK&YI%l z{fAw@*zueSu3B;H_LaSV3~!1%Jb zk1s1qy#^rxAf&ml@9Z?idHt2!SLffJG<5&Dfzy#ag|KB;391D7_SuF=i69uojeg{q zrr2c6`8v+;WyQ;imkW3~#$by!AOsTu$V3=0WN`Dl5m~=ik2~B~=eVSGI->^%edp2i z(S63w6-P}a%g?+zA93I5=RT#ya75spRe;>mlM){hpok{~BUS=N>^`>e_eB#vaQH-w ztO;5FUFNvn*ubzblzEB6#K|#eSkFOpc>^bE0EUx7AMYcuCm?VP-V_rF9&!kS``E%n zc*%ea7P`Xl0ktrvcEt2-EN(k*;{JKi`wO8nRWbb1aO>M>&(OvlZ+Qwywz$`f=T8`3 z*c>A$|`9)~{4fWl1TV&tq`etO;VmZb)-;V@}hEaA_z%EICcNU#-+Sh z=>3?S*RLcswx{t+68dB9JXK*$uG+c2D?iZK(ql%L;v34nz4&Nv8;Gyy9&A52W(jm0 z6Ck)N#qHw<&H!#8iV3`yD%|n$Hu_+1?-*^j!5mW?5*ES4Qr_OXTkg+!%i%$tR6_ck#;UHvWQ9nzA?9v9AiK5%x2MpqM`>5|8%Mc>Cxs_AlO2 zg=)-~RmCgLN={RhoGGZN5ik=8DgV z&nD<~U-z!VbUYBi6cbgjU4h5nzDyU1IyMa zNTEP(x?%i6q55Xr{F&V{+Bhx8AF5xrx1jQ-`rUk4aPwtBzzvi)H($O1+xkBGFGJj9TTs54+tBz!^|L@0#DvE022SUOV=yu#6AlqFL^4E51i>iY*fjrv&%gEi ze>?-_{NV2I7cidie88SV=`&w@sv}PaYCZp*^xUDYJaQe;6s5BRew^Ryiq{pd7w~!< zvkW1a2tX#;V7( literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/LAY.bin b/Samples/VDP2 - Layers/cd/data/LAY.bin new file mode 100644 index 0000000000000000000000000000000000000000..b6e7a0ccfaeb6e6dcf6942346e7b63fac8203f7f GIT binary patch literal 48288 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 Ba~1#q literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/LAY2.bin b/Samples/VDP2 - Layers/cd/data/LAY2.bin new file mode 100644 index 0000000000000000000000000000000000000000..f697de0ea30e511a3401d154b44b1ae0a96add8a GIT binary patch literal 45088 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 n?Y>idUDvN8+V}bbhDFg9 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 C)(^@6 literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/cd/data/THAT.bin b/Samples/VDP2 - Layers/cd/data/THAT.bin new file mode 100644 index 0000000000000000000000000000000000000000..4be3a0a807eaecf4e8a0c79a84f227dc1ff8bba2 GIT binary patch literal 53280 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 UKr#=){^TRhx#fY*-QNHI2Y?z7)c^nh literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - Layers/src/main.cxx b/Samples/VDP2 - Layers/src/main.cxx index f42746d2..305f6eed 100644 --- a/Samples/VDP2 - Layers/src/main.cxx +++ b/Samples/VDP2 - Layers/src/main.cxx @@ -22,26 +22,28 @@ using namespace SRL::Math; int main() { - - SRL::Core::Initialize(HighColor(20,10,50)); Digital port0(0); // Initialize gamepad on port 0 - SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("SPACE.BIN");//Load tilemap from cd to work RAM + SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("THIS.BIN");//Load tilemap from cd to work RAM + + SRL::Tilemap::TilemapInfo TestInfo = TestTilebin->GetInfo(); + SRL::VDP2::NBG0::LoadTilemap(*TestTilebin);//Transfer tilemap from work RAM to VDP2 VRAM and register with NBG0 - delete TestTilebin;//free work RAM - TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOG256.BIN");//Load fog tilemap from cd to work RAM + delete TestTilebin;//free work RAM + + TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOO2.BIN");//Load fog tilemap from cd to work RAM SRL::VDP2::NBG1::LoadTilemap(*TestTilebin);//Transfer tilemap from work RAM to VDP2 VRAM and register with NBG1 delete TestTilebin;//free work RAM //Demonstrate NBG2 loading with Tilemap converted from Bitmap: - SRL::Bitmap::TGA* logo = new SRL::Bitmap::TGA("LOGO1.TGA");//Load Bitmap image to work RAM - SRL::Tilemap::Interfaces::Bmp2Tile* TestTilebmp = new SRL::Tilemap::Interfaces::Bmp2Tile(*logo);//convert bitmap to tilemap - SRL::VDP2::NBG2::LoadTilemap(*TestTilebmp);//Transfer tilemap from work RAM to VDP2 VRAM and register with NBG2 - delete TestTilebmp;//free tilemap from work ram - delete logo;//free original bitmap from work ram + //SRL::Bitmap::TGA* logo = new SRL::Bitmap::TGA("LOGO1.TGA");//Load Bitmap image to work RAM + //SRL::Tilemap::Interfaces::Bmp2Tile* TestTilebmp = new SRL::Tilemap::Interfaces::Bmp2Tile(*logo);//convert bitmap to tilemap + //SRL::VDP2::NBG2::LoadTilemap(*TestTilebmp);//Transfer tilemap from work RAM to VDP2 VRAM and register with NBG2 + //delete TestTilebmp;//free tilemap from work ram + //delete logo;//free original bitmap from work ram //store XY screen positions of Background scrolls: Vector2D Nbg0Position(0.0, 0.0); @@ -52,13 +54,13 @@ int main() SRL::VDP2::NBG0::ScrollEnable();//enable display of NBG0 SRL::VDP2::NBG1::SetPriority(SRL::VDP2::Priority::Layer6);//set NBG1 priority - SRL::VDP2::NBG1::SetOpacity(0.5);//set opacity of NBG1 - SRL::VDP2::NBG1::TransparentDisable();//disable fully transparent pixels on Fog(its all half transparent) + //SRL::VDP2::NBG1::SetOpacity(0.5);//set opacity of NBG1 + //SRL::VDP2::NBG1::TransparentDisable();//disable fully transparent pixels on Fog(its all half transparent) SRL::VDP2::NBG1::ScrollEnable();//enable display of NBG1 - SRL::VDP2::NBG2::SetPriority(SRL::VDP2::Priority::Layer4);// Set NBG2 priority between NBG0 and NBG1 - SRL::VDP2::NBG2::SetPosition(Nbg2Position);//Set the static screen position for SRL Logo - SRL::VDP2::NBG2::ScrollEnable();//enable display of NBG2 + //SRL::VDP2::NBG2::SetPriority(SRL::VDP2::Priority::Layer4);// Set NBG2 priority between NBG0 and NBG1 + //SRL::VDP2::NBG2::SetPosition(Nbg2Position);//Set the static screen position for SRL Logo + //SRL::VDP2::NBG2::ScrollEnable();//enable display of NBG2 SRL::Debug::Print(1,3,"VDP2 ScrollScreen Sample"); @@ -67,7 +69,7 @@ int main() { //move positions of NBG0 and NBG1 scrolls: Nbg0Position += Vector2D(1.0, 1.0); - Nbg1Position += Vector2D(-2.0, 1.0); + Nbg1Position += Vector2D(1.0, 1.0); SRL::VDP2::NBG0::SetPosition(Nbg0Position); SRL::VDP2::NBG1::SetPosition(Nbg1Position); diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/c_cpp_properties.json b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..d9f92c7e --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/c_cpp_properties.json @@ -0,0 +1,36 @@ +{ + "configurations": [ + { + "name": "Saturn", + "includePath": [ + "${workspaceFolder}/../../saturnringlib", + "${workspaceFolder}/../../modules/sgl/INC", + "${workspaceFolder}/../../modules/tlsf", + "${workspaceFolder}/../../modules/SaturnMathPP", + "${workspaceFolder}/../../Compiler/sh2eb-elf/sh-elf/include", + "${workspaceFolder}/../../Compiler/sh2eb-elf/sh-elf/include/c++/14.2.0", + "${workspaceFolder}/../../saturnringlib/**" + ], + "compilerPath": "${workspaceFolder}/../../Compiler/sh2eb-elf/bin/sh-elf-gcc-14.2.0.exe", + "cStandard": "c23", + "cppStandard": "c++23", + "intelliSenseMode": "gcc-x86", + "defines": [ + "__STDC_HOSTED__=0", + "SRL_CUSTOM_SGL_WORK_AREA=0", + "SRL_MALLOC_MEMORY=131072", + "SRL_MAX_TEXTURES=100", + "SRL_MODE_PAL", + "SRL_FRAMERATE=0", + "SRL_MAX_CD_BACKGROUND_JOBS=1", + "SRL_MAX_CD_FILES=255", + "SRL_MAX_CD_RETRIES=5", + "SRL_DEBUG_MAX_PRINT_LENGTH=45", + "SRL_USE_SGL_SOUND_DRIVER=1", + "SRL_ENABLE_FREQ_ANALYSIS=1", + "DEBUG" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/extensions.json b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/extensions.json new file mode 100644 index 00000000..610a551b --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ms-vscode.cpptools" + ] +} \ No newline at end of file diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/settings.json b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/settings.json new file mode 100644 index 00000000..2177b80d --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/settings.json @@ -0,0 +1,42 @@ +{ + "files.exclude": { + "**/*.o": true, + "**/*.bat": true, + "[Cc][Dd]/[Bb]uild[Dd]rop**" : true, + }, + "files.watcherExclude": { + "**/*.o": true, + "**/*.bat": true, + "[Cc][Dd]/[Bb]uild[Dd]rop**" : true, + }, + "C_Cpp.loggingLevel": "Debug", + "files.associations": { + "*.embeddedhtml": "html", + "*.H": "c", + "*.C": "c", + "*.def": "c", + "*.h": "c", + "*.c": "c", + "*.HPP": "cpp", + "*.CXX": "cpp", + "*.hpp": "cpp", + "*.cxx": "cpp", + "functional": "cpp", + "vector": "cpp" + }, + "cmake.configureOnOpen": false, + "makefile.makefilePath": "./makefile", + "C_Cpp.default.cppStandard": "c++23", + "C_Cpp.default.cStandard": "c17", + "C_Cpp.formatting": "vcFormat", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.function": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.block": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.namespace": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.type": "newLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.lambda": "newLine", + "C_Cpp.vcFormat.indent.lambdaBracesWhenParameter": false, + "C_Cpp.inlayHints.autoDeclarationTypes.enabled": true, + "C_Cpp.inlayHints.autoDeclarationTypes.showOnLeft": true, + "C_Cpp.inlayHints.referenceOperator.enabled": true, + "C_Cpp.inlayHints.referenceOperator.showSpace": true +} diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/tasks.json b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/tasks.json new file mode 100644 index 00000000..fb205970 --- /dev/null +++ b/Samples/VDP2 - RBG0 Rotation Parameters/.vscode/tasks.json @@ -0,0 +1,63 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Run with Mednafen", + "type": "shell", + "command": "./run_with_mednafen.bat", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Compile [DEBUG]", + "type": "shell", + "command": "./compile.bat debug", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Compile [RELEASE]", + "type": "shell", + "command": "./compile.bat release", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Clean", + "type": "shell", + "command": "./clean.bat", + "problemMatcher": [], + "presentation": { + "showReuseMessage": false, + "clear": true + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + ] +} diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/TILE.bin b/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/TILE.bin new file mode 100644 index 0000000000000000000000000000000000000000..c07fda5351a538be4804a9da7ea8c04917cba5bd GIT binary patch literal 51520 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 RD!)o^)ukqOQtp0-{$CsJ_K*Mo literal 0 HcmV?d00001 diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/overworld_tileset_grass.aseprite b/Samples/VDP2 - RBG0 Rotation Parameters/cd/data/overworld_tileset_grass.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..a9b31793d0dfa75cd2a514368408a0ec630ffc6f GIT binary patch literal 13094 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�~* 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 z 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≦fMybONJR|66jr;>0_-yjHf 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%0Dd+}{uUy|cHk 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 z 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 diff --git a/Samples/VDP2 - RBG0 Rotation/cd/data/ELF_S.TGA b/Samples/VDP2 - RBG0 Rotation/cd/data/ELF_S.TGA deleted file mode 100644 index 1c2ead362ef2556ba7be193f199652747b2e92af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9561 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 diff --git a/Samples/VDP2 - RBG0 Rotation/cd/data/FOG.tga b/Samples/VDP2 - RBG0 Rotation/cd/data/FOG.tga deleted file mode 100644 index e06486bfa142df00222b04c938707929f052b70b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16761 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 a+`CORwd)7`T>YwUZ*+jaix_f(&*>N9hlQd+0< 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 diff --git a/Samples/VDP2 - RBG0 Rotation/cd/data/TESTN2.bin b/Samples/VDP2 - RBG0 Rotation/cd/data/TESTN2.bin deleted file mode 100644 index cf14cb120e05406fd78476c496ecac8f47c0ac44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29472 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 diff --git a/Samples/VDP2 - RBG0 Rotation/cd/data/TESTN3.bin b/Samples/VDP2 - RBG0 Rotation/cd/data/TESTN3.bin deleted file mode 100644 index a01cd018512f1c02f024b7ffc20f966f300ffaa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29472 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 @@ -15,6 +16,16 @@ static void LoadRBG0(uint8_t config, SRL::Tilemap::ITilemap* map) SRL::VDP2::RBG0::ScrollDisable();//turn off scroll display so we dont see junk when loading to VRAM SRL::VDP2::ClearVRAM();//Clearing VDP2 VRAM because use differs between Rotation Modes SRL::VDP2::RBG0::LoadTilemap(*map);//Transfer Tilemap to VRAM again + uint8_t mapLayout[4][4] = + { + 0,1,0,1, + 0,1,0,1, + 0,1,0,1, + 0,1,0,1, + }; + + //set the multi plane layout of Primary Tilemap + SRL::VDP2::RBG0::SetPlanes(mapLayout); switch (config) { case 0: @@ -55,7 +66,7 @@ int main() int8_t CurrentMode = 0; - SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOGRGB.BIN");//Load tilemap from cd to main RAM + SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOG256.BIN");//Load tilemap from cd to main RAM LoadRBG0(0, TestTilebin); @@ -70,7 +81,7 @@ int main() SRL::Debug::Print(1, 6, ""); SRL::Debug::Print(1, 7, ""); SRL::Debug::Print(1, 8, ""); - + //Main Game Loop while(1) { diff --git a/saturnringlib/srl_mesh.hpp b/saturnringlib/srl_mesh.hpp index 38878bf5..0527adf5 100644 --- a/saturnringlib/srl_mesh.hpp +++ b/saturnringlib/srl_mesh.hpp @@ -39,7 +39,7 @@ namespace SRL::Types /** @brief Use the average position of 4 points */ - Center = SORT_CEN + Center = SORT_CEN }; /** @brief Quad display mode diff --git a/saturnringlib/srl_scene2d.hpp b/saturnringlib/srl_scene2d.hpp index 56d0d9d8..d9a033ed 100644 --- a/saturnringlib/srl_scene2d.hpp +++ b/saturnringlib/srl_scene2d.hpp @@ -382,7 +382,7 @@ namespace SRL (Scene2D::Effects.Clipping << 9) | (Scene2D::Effects.ScreenDoors << 8) | - colorMode | + colorMode | (Scene2D::Effects.EndCode ? ECenb : ECdis) | (Scene2D::Effects.HighSpeedShrink ? HSSon : HSSoff) | (Scene2D::Effects.DisablePreClipping ? Pclpoff : Pclpon) | diff --git a/saturnringlib/srl_scene3d.hpp b/saturnringlib/srl_scene3d.hpp index 69a81195..ce40a3ba 100644 --- a/saturnringlib/srl_scene3d.hpp +++ b/saturnringlib/srl_scene3d.hpp @@ -85,7 +85,7 @@ namespace SRL */ static void LightInitGouraudTable(uint32_t gouraudRamOffset, uint8_t* vertexCalculationBuffer, Types::HighColor* tableStorage, uint32_t maxPolygons) { - slInitGouraud((GOURAUDTBL*)tableStorage, maxPolygons, 0xe000 + (gouraudRamOffset << 2), vertexCalculationBuffer); + slInitGouraud((GOURAUDTBL*)tableStorage, maxPolygons, 0xe000 + (gouraudRamOffset<<2) , vertexCalculationBuffer); } /** @brief Set custom light gouraud table. Affects quads with SRL::Types::Attribute::DisplayOption::EnableGouraud option set diff --git a/saturnringlib/srl_tilemap.hpp b/saturnringlib/srl_tilemap.hpp index 063a6031..72c2e9d6 100644 --- a/saturnringlib/srl_tilemap.hpp +++ b/saturnringlib/srl_tilemap.hpp @@ -115,10 +115,10 @@ namespace SRL::Tilemap } }; - /** @brief Unsigned 8 bit coordinates for tiles withing a page of a tilemap + /** @brief Unsigned 16 bit coordinates for tiles withing a page of a tilemap * @note Coordinates [0,0] represent top left corner of a page (same as Print coordinates) * @note Coordinates are in tile units, which can be either 8x8 or 16x16 pixels. - * Max allowed coordinates in a page vary by Tile Size (64 for 8x8 tiles, 32 for 16x16) + * Max coordinates in a page vary by Tile Size (64 for 8x8 tiles, 32 for 16x16) */ struct Coord { diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index 1c924fce..755eabf5 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -8,6 +8,7 @@ #include "srl_cd.hpp" #include "srl_tilemap_interfaces.hpp" +//Test Changes namespace SRL { /** @brief VDP2 control @@ -311,13 +312,15 @@ namespace SRL } else if(sz>131072)//case: bmp requires 2 out of the 4 VRAM banks { - if((uint32_t)bankBot[0]==VDP2_VRAM_A0 && (uint32_t)bankBot[1]==VDP2_VRAM_A1) + if((uint32_t)currentBot[0]==VDP2_VRAM_A0 && (uint32_t)currentBot[1]==VDP2_VRAM_A1) { + alloc = VRAM::Allocate(131072, 32, VramBank::A0, numCycles); VRAM::Allocate(131072, 32, VramBank::A1, numCycles); } - else if((uint32_t)bankBot[1]==VDP2_VRAM_A1 && (uint32_t)bankBot[2]==VDP2_VRAM_B0) + else if((uint32_t)currentBot[1]==VDP2_VRAM_A1 && (uint32_t)currentBot[2]==VDP2_VRAM_B0) { + alloc = VRAM::Allocate(131072, 32, VramBank::A1, numCycles); VRAM::Allocate(131072, 32, VramBank::B0, numCycles); } @@ -337,7 +340,7 @@ namespace SRL if (alloc == nullptr) SRL::Debug::Assert("Bmp Allocation failed: insufficient VRAM Available"); } if(size) *size = sz; - // SRL::Debug::Print(3,17,"Size = %d",size); + // SRL::Debug::Print(3,18,"Address: %x",(uint32_t)alloc-VDP2_VRAM_A0); return alloc; } @@ -717,7 +720,7 @@ namespace SRL * @details This Function takes the opacity specified as a fixed point value and converts it to * one of the 32 color calculation ratios that a scroll screen can use (value is floored to the nearest ratio). * Color Calculation is turned on if Opacity < 1.0, or off if Opacity>= 1.0. Color calculation is unchanged if value is negative. - * @note Color ratios only apply to highest priority pixels in frame + * @note Color ratios only apply to highest priority pixels in the frame * @note When VDP2 ColorCalcMode is set to UseColorAddition, all scrolls with opacity < 1.0 will use color addition * in place of their specified ratios. * @param opacity Fxp decimal value between 0.0 and 1.0 representing pixel opacity for the scroll screen (Default 1.0) @@ -920,7 +923,7 @@ namespace SRL SRL::Debug::Assert("Bitmap Allocation Failed"); return; } - VRAM::Blank(ScreenType::CellAddress,ScreenType::CellAllocSize); + //VRAM::Blank(ScreenType::CellAddress,ScreenType::CellAllocSize); Bmp2VRAM(bmp->GetData(),ScreenType::CellAddress,myInfo); int colorID = -1; @@ -1218,8 +1221,8 @@ namespace SRL static void SetPosition(Math::Vector2D& pos) { slScrPosNbg3(pos.X.RawValue(), pos.Y.RawValue()); } }; - /** @brief setting for RBG0,1 rotation constraints - * @note More simulated axis require more VRAM resources. + /** @brief Settings for RBG0 rotation constraints + * @note More simulated axis of rotation require more VDP2 VRAM resources to display. */ enum class RotationMode { @@ -1229,12 +1232,12 @@ namespace SRL OneAxis, /** @brief 3d rotation with pitch and yaw, but no roll (scale modified per line) - * @note Requires 0x2000-0x18000 bytes in arbitrary VRAM Bank (No cycles) + * @note Requires 0x2000-0x18000 bytes in arbitrary VRAM Bank (No cycle slots required) */ TwoAxis, /** @brief Full 3d rotation with pitch, yaw and roll (scale modified per pixel) - * @note Requires 0x2000-0x18000 bytes in Reserved VRAM bank (8 cycles) + * @note Requires 0x2000-0x18000 bytes in Reserved VRAM bank (all 8 cycle slots required) */ ThreeAxis, }; @@ -1249,17 +1252,17 @@ namespace SRL enum class OverPattern { - /** @brief Screen areas outside the tilemap repeat the full tilemap pattern + /** @brief Screen areas outside the map repeat the full tilemap pattern */ RepeatMap, - /** @brief Screen areas outside the tilemap repeat a single selectable tile from the + /** @brief Screen areas outside the map repeat a single selectable tile from the * tileset * @note Not available in Bitmap Mode */ RepeatTile, - /** @brief Screen areas outside the tilemap are treated as transparent pixels + /** @brief Screen areas outside the map are treated as transparent pixels */ Transparent, @@ -1286,7 +1289,7 @@ namespace SRL * @details In regions of the screen beyond parameter A's simulated 'horizon'*, * Rotation parameter B will be displayed * @note -*(More technically, any screen coordinate where the scaling coefficient data - * read for Parameter A has its highest bit set to 1 will display Parameter B data instead). + * read for Parameter A has its high bit set to 1 will display Parameter B data instead). * @note - Only Parameter A can display 3 Axis (Per Dot) Rotation in this mode. */ PerspectiveSwitch, @@ -1310,11 +1313,11 @@ namespace SRL /** @brief RBG0 interface * @details Rotating Background Scroll 0: * -Available color depths: Paletted16, Paletted256, RBG555 - * -Available modes: Tilemap, Bitmap + * -Available image modes: Tilemap, Bitmap * -Available features: Scrolling, Scaling, Rotation, - * -Coefficient table allows per line and per pixel scaling - * to simulate perspective - * -simulate up to 2 planes with secondary rotation parameters + * -Reading a coefficient table from VRAM allows per-line/per-pixel scaling + * to simulate a 3D plane. + * -simulate up to 2 planes using separate rotation parameters and tilemaps */ class RBG0 : public BmpScreen { @@ -1471,7 +1474,8 @@ namespace SRL slOverRA(0); uint16_t sglFlag = info.Height<=256? 0x2 : 0x6; sglFlag |= info.Width<= 512 ? 0 : 1<<3; - slPageRbg0(RBG0::CellAddress, (void*)RBG0::TilePalette.GetData(), RBG0::Info.MapMode);//this is required to reserve the VRAM banks + //VDP2_RAMCTL &= 0xff00; + slPageRbg0(RBG0::CellAddress, (void*)RBG0::TilePalette.GetData(), RBG0::Info.MapMode);//this is required to reserve the VRAM bank slBitMapRbg0(GetSGLColorMode(info.ColorMode), sglFlag, RBG0::CellAddress); if(info.ColorMode==SRL::CRAM::TextureColorMode::Paletted16) { @@ -1562,13 +1566,13 @@ namespace SRL /** @brief Select what type of rotation to use for the rotating scroll (Call before Loading RBG0) * @param mode The RotationMode to use for RBG0 - * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of coefficient - * data required for rotation of a plane (default = true) + * @param vblank (Optional) update VRAM at VBLANK to reduce amount of coefficient + * data required for rotation (default = true) * @note when 2 or 3 axis rotation is selected, VRAM will be allocated to store * necessary scaling coefficients. If Vblank is set false, all coefficients will be - * statically stored in VRAM as a 0x18000 byte table. If Vblank is set true, the - * the coefficients for the perspective of the current frame will be - * written to VRAM at each Vblank, reducing VRAM footprint to 0x2000 bytes per + * statically stored in VRAM as a 0x18000 byte table. If Vblank is set true, select + * coefficients for the perspective of the current frame will be dynamically + * sent to VRAM during Vblank, reducing VRAM footprint to 0x2000 bytes per * rotation parameter but increasing required Vblank overhead. If the transfer can * not complete within Vblank window, screen tearing may be visible in the plane. */ @@ -1580,12 +1584,12 @@ namespace SRL { if(vblank==true) { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B0, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); VDP2::RBG0::KtableAddressB =(void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); } else { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B1, 0); VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; slMakeKtable(VDP2::RBG0::KtableAddress); kflag = K_FIX; @@ -1634,12 +1638,12 @@ namespace SRL { if(vblank==true) { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B0, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); VDP2::RBG0::KtableAddressB = (void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); } else { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B1, 0); VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; slMakeKtable(VDP2::RBG0::KtableAddress); kflag = K_FIX; @@ -1680,7 +1684,7 @@ namespace SRL /** @brief Writes the current matrix transform to RBG0 rotation parameters * to update its perspective - * @param param selects which rotation parameter to write the matrix to(defaults to Primary) + * @param param selects which rotation parameter to write the matrix to (defaults to Primary) */ inline static void SetCurrentTransform(VDP2::RotationParameter param = VDP2::RotationParameter::Primary) { @@ -1696,21 +1700,24 @@ namespace SRL /** @brief Sets the plane of Tilemap Data to be displayed * @param a,b,c,d Page Table addresses of the planes to display - * @note Multi Plane maps must be set with the 16 plane version of this function + * @note Multi Plane maps must be set with the 16 plane overload of this function */ static void SetPlanes(void* a, void* b, void* c, void* d) { sl1MapRA(a); + sl1MapRB(b); } - /** @brief Sets the plane of Tilemap Data to be displayed with 16 planes - * @details Unlike NBG scrolls RBG0 only loads with the default tiling of 1 plane. Use this + /** @brief Sets the planes of Tilemap Data to be displayed with 16 planes + * @details Unlike NBG scrolls RBG0 only loads with the default of 1 plane. Use this * function after loading to set the arrangement of multi plane tilemaps within a 4x4 grid: * |a,b,c,d| * |e,f,g,h| * |i,j,k,l| * |m,n,o,p| - * @param layout 4x4 array of uint8_t indices representing the index of each plane in the map layout + * @param layout 4x4 array of uint8_t indices representing the index of each plane in the map data + * (index 0 = base address of the map data, increment by 1 per plane unit of map data stored) + * @param param The Rotation parameter whose map is being set: primary or secondary (defaults to primary) * @note No check is performed to ensure the indecies entered are within the bounds of * the scroll's map data. Specifying indices larger than the number of planes loaded * will result in the diplay of garbage data in those portions of the map @@ -1797,7 +1804,7 @@ namespace SRL * and Color addition is applied to all sprites whose priority meets the color condition (see SpriteLayer::SetColorCondition() for details) * @note -RGB sprites always use the opacity set in CC register[bank0] * @note -Does NOT turn color calc ON or OFF for the Sprite Layer(use SpriteLayer::ColorCalcON,OFF()) - * @note -available cc registers vary by Palette code config- default allows all 8 banks + * @note -available cc registers vary by Palette code config- default allows selecting all 8 banks * @param opacity Fxp decimal value between 0.0 and 1.0 representing pixel opacity of the cc register * @param bank (optional) which of the 8 CC registers to Set the opacity in (defaults to 0) */ @@ -1819,9 +1826,9 @@ namespace SRL * @note -RGB sprites always use the priority from bank0 * @note -During VDP2 init, priority bank0 and bank1 are initialized to Layer3 and Layer4 respectively * @note -Changing these priorities will result in differing behavior for sprite color calculation - * (See SpriteLayer::SetColorCondition() for more details) + * (See documentation of SpriteLayer::SetColorCondition() for more details) * @param pr enum VDP2::Priority Layer - * @param bank (optional) enum VDP2::SpriteBank designating which priority bank to write to + * @param bank (optional) enum VDP2::SpriteBank designating which priority bank to write to (default = Bank0) */ inline static void SetPriority(SRL::VDP2::Priority pr, VDP2::SpriteBank bank = VDP2::SpriteBank::Bank0) { @@ -1829,12 +1836,12 @@ namespace SRL } /** @brief Set conditions under which VDP2 color calculation is performed on sprites based on their priority. - * @details Sets up the condition that allows only select sprites to receive Half Transparent + * @details Sets up a condition that allows only select sprites to receive Half Transparent * color calculation with VDP2 layers. To make a sprite fully opaque, selectively turn color calculation off for it by - * assigning it to use a Priority Bank containing a priority layer that does not satisfy the Color Condition. + * assigning it to use a Priority Bank containing a layer that does not satisfy the chosen Color Condition. * The default VDP2 initialization uses ColorCondition::PriorityEquals Priority::Layer4, - * with SpriteBank0 set to Layer3 and SpriteBank1 set to Layer4. With this config RGB sprites receive no VDP2 - * color calculation, while Palette sprites only receive color calculation when they select priority from SpriteBank1 + * with Priority Bank0 set to Layer3 and Priority Bank1 set to Layer4. With this config RGB sprites receive no VDP2 + * color calculation, while Palette sprites only receive color calculation when they select priority from Bank1 * @param Condition The type of condition that VDP2 Color Calculation will follow. * @param TestValue The Layer that a sprite's priority will be tested against in the condition. */ @@ -1979,7 +1986,10 @@ namespace SRL SRL::VDP2::NBG3::ScrollEnable(); SRL::VDP2::NBG0::ScrollDisable(); // We don't want this on by default anymore // Fix param table at top of VRAM outside range of allocator - now user calls to slPerspective will always update here: + SRL::VDP2::SpriteLayer::SetPriority(VDP2::Priority::Layer3,VDP2::SpriteBank::Bank0); + SRL::VDP2::SpriteLayer::SetPriority(VDP2::Priority::Layer4,VDP2::SpriteBank::Bank0); slRparaInitSet((ROTSCROLL*)(VDP2_VRAM_B1 + 0x1ff00)); + VDP2_RAMCTL&=0xff00; } /** @brief Data structure of a VDP2 color offset to be set in Offset A or Offset B From 0d1701f4bb98101d15d572e74c69d2af18321fd1 Mon Sep 17 00:00:00 2001 From: 7shades Date: Thu, 30 Jul 2026 16:13:30 -0700 Subject: [PATCH 8/8] Additions/ Fixes to VDP2 Samples --- Samples/VDP2 - ColorCalc/src/main.cxx | 3 +- Samples/VDP2 - Layers/cd/data/AESPR.bin | Bin 69664 -> 0 bytes Samples/VDP2 - Layers/cd/data/AESPR2.bin | Bin 69664 -> 0 bytes Samples/VDP2 - Layers/cd/data/AESPR3.bin | Bin 69664 -> 0 bytes Samples/VDP2 - Layers/cd/data/AESPR4.bin | Bin 53280 -> 0 bytes Samples/VDP2 - Layers/cd/data/FOGRGB.bin | Bin 34848 -> 0 bytes Samples/VDP2 - Layers/cd/data/FOO.bin | Bin 34592 -> 0 bytes Samples/VDP2 - Layers/cd/data/FOO2.bin | Bin 42784 -> 0 bytes Samples/VDP2 - Layers/cd/data/LAY.bin | Bin 48288 -> 0 bytes Samples/VDP2 - Layers/cd/data/LAY2.bin | Bin 45088 -> 0 bytes Samples/VDP2 - Layers/cd/data/OGTEST.bin | Bin 53280 -> 0 bytes Samples/VDP2 - Layers/cd/data/THAT.bin | Bin 53280 -> 0 bytes Samples/VDP2 - Layers/cd/data/THIS.bin | Bin 53280 -> 0 bytes Samples/VDP2 - Layers/src/main.cxx | 28 +-- .../src/main.cxx | 53 +++--- Samples/VDP2 - RBG0 Rotation/src/main.cxx | 125 +++++++----- saturnringlib/srl_vdp2.hpp | 178 ++++++++++-------- 17 files changed, 215 insertions(+), 172 deletions(-) delete mode 100644 Samples/VDP2 - Layers/cd/data/AESPR.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/AESPR2.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/AESPR3.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/AESPR4.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/FOGRGB.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/FOO.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/FOO2.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/LAY.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/LAY2.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/OGTEST.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/THAT.bin delete mode 100644 Samples/VDP2 - Layers/cd/data/THIS.bin diff --git a/Samples/VDP2 - ColorCalc/src/main.cxx b/Samples/VDP2 - ColorCalc/src/main.cxx index c6f59792..a6ca87ec 100644 --- a/Samples/VDP2 - ColorCalc/src/main.cxx +++ b/Samples/VDP2 - ColorCalc/src/main.cxx @@ -1,7 +1,7 @@ /*VDP2 Color Calculation Demo: This Demo Shows The use of VDP2 Color Calculation and Priority through SRL and demonstrates its effect by creating an interactive version of color calculation diagrams found in the - VDP2 Users Manual. +VDP2 Users Manual. A Blue Triangle, Green Square, and Red Circle are displayed on 3 separate VDP2 ScrollScreens. Priorities are set such that the Triangle draws on top, Square draws in middle, and Circle draws @@ -161,7 +161,6 @@ class UiManager SRL::Debug::Print(0,CursorLine+5,"->"); } - }; int main() diff --git a/Samples/VDP2 - Layers/cd/data/AESPR.bin b/Samples/VDP2 - Layers/cd/data/AESPR.bin deleted file mode 100644 index 1aede522f88b9f09a5fcb22ae262153e15ff57e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69664 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 CU1YNW diff --git a/Samples/VDP2 - Layers/cd/data/AESPR2.bin b/Samples/VDP2 - Layers/cd/data/AESPR2.bin deleted file mode 100644 index 1aede522f88b9f09a5fcb22ae262153e15ff57e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69664 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 CU1YNW diff --git a/Samples/VDP2 - Layers/cd/data/AESPR3.bin b/Samples/VDP2 - Layers/cd/data/AESPR3.bin deleted file mode 100644 index 1aede522f88b9f09a5fcb22ae262153e15ff57e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69664 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 CU1YNW diff --git a/Samples/VDP2 - Layers/cd/data/AESPR4.bin b/Samples/VDP2 - Layers/cd/data/AESPR4.bin deleted file mode 100644 index df2bdaf5e0de46035e98fd4d292ed131779c01a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53280 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 n?Y>idUDvN8+V}bbhDFg9 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 C)(^@6 diff --git a/Samples/VDP2 - Layers/cd/data/FOGRGB.bin b/Samples/VDP2 - Layers/cd/data/FOGRGB.bin deleted file mode 100644 index ff1c6a16f958914b4e48f2079bcd379d856c7ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34848 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 F`oA>231a{N diff --git a/Samples/VDP2 - Layers/cd/data/FOO.bin b/Samples/VDP2 - Layers/cd/data/FOO.bin deleted file mode 100644 index aee5cad8cebdda7570669a9714c9e287ff9e0546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34592 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 MCGE!(zu^4;FVGB5y#N3J diff --git a/Samples/VDP2 - Layers/cd/data/FOO2.bin b/Samples/VDP2 - Layers/cd/data/FOO2.bin deleted file mode 100644 index d5b3d0eb690db3bc854a531a2d05965713d3ded0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42784 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 diff --git a/Samples/VDP2 - Layers/cd/data/LAY.bin b/Samples/VDP2 - Layers/cd/data/LAY.bin deleted file mode 100644 index b6e7a0ccfaeb6e6dcf6942346e7b63fac8203f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48288 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 Ba~1#q diff --git a/Samples/VDP2 - Layers/cd/data/LAY2.bin b/Samples/VDP2 - Layers/cd/data/LAY2.bin deleted file mode 100644 index f697de0ea30e511a3401d154b44b1ae0a96add8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45088 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 n?Y>idUDvN8+V}bbhDFg9 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 C)(^@6 diff --git a/Samples/VDP2 - Layers/cd/data/THAT.bin b/Samples/VDP2 - Layers/cd/data/THAT.bin deleted file mode 100644 index 4be3a0a807eaecf4e8a0c79a84f227dc1ff8bba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53280 zcmeHQON?AsTJEk^?zP+9<(B0~ce-NNls$!=#%|j&b{QAlr9sS$K%l@dnlNaX5wjo+ zVu%!pF%OBB*kmz6!!8m+$}&PMvcnQWn$1XI7Ziaa*kqX%niXU>eBb{#_uSjJUgx%} z;^4o1?|06B&i^{Ed+x1U<&~9{7gkpOW@Tk%gkxnD#}-YcZ5w_gAHzy9Gr z{NGR7_gDYpn;-n%zklgxzx7|g{6D{T zsf&`hZZ&@!*^v=Hx9hKilZuHLcWW#ru}~kI(#0CkX|&!W6s<9t8n5~ zJ6;2R$Bx&H$FetYOrpmqJeqLS$I%m2-WtPCWz+uK72$U(`8fM-oH>DXo&8B_ zo7g`E#ak8Si?n|mwg*eJUokD&lZ^i{G#*Vj#9-xgV)jQXD=A|m)&7$x4p09Wy!R`| z2UhPR!z!fO|7oPi)1T_LlUvVlaLhBmrFiTd+kbMbv|xDIgf?Ei4m-DT49xxr_*GT0 z`f8ynq);yOwxP#i*%El!82hW=fvwkZyn*8}jw2jz;rNkiS#=w+(rwGcWl!P?mUiA_ z=o@GMJ(Qu|>W^`}kK==p;zu?5oV9II3rdqFD_3_*V#|il_IxH`=i3))sK-r zn(@Gx5_)1th|>{!V$x%0rMD;6tS^kmNt}*re}v4((Gi!?eiz4e9FhIiPcU|&ulD$K zWu=AcW9czUj*5e8&MNHqQIZ2c(Ay!k(mGY7tEm?BwPLwag;BBocTs@2YS$dfjCcZd zaa7`OkvD-_tY1qbvERB~6xOaeEUv~7$3H0K>r$;z9hW>5yo>gU?2oG%>~~S48h=Ck zv`HVv`Y~dS3Ptf(O2%iOL`9aa9lM{xm#C`5-UWkkJEqwGDde3jT{m`1W3~%{*skYY z&$4h)ez=_~E-P-g>;8EDX`$Px;?uG>t6ukK*80zCy(2gtA8$RYfjsy7bJGG{M8a#r zBIpQ4;^VzV7#(M0RO~yusI!PR_!xHl_+(Vr2YV6Z`(VNDNbPrFc@eQ!0$hE~>{s}U z%C5c>+3&*Y!rLIS5A%zs(Ngu(p#1@!;wJMq0~WFO`iMa8}GXyN_O7?0UsRN%+#j27Pi?n3LUNFCu= z@c0+|+j1_SPG}t-_w1_l%!>BAI5^)NPs;uPI%}vks$s?~*e^Z1`Ly!PCa&8g-Gy)* zx94F$es)uOW@GkRuc8k2Os&^|-!bM%0qu9o%1V8PqSos;-WcHkJ}%dtIoCzaaq$nz zT3Vw@{s?y8f_)xHm!5e)Dc7Alhxn&a>qlM#_L=^v=PPMrx1h6yJti?w7b(VHrMOPD zEHU4D7xv$SeW1`sks|tkR2;1*QP~M4TR(>V_hBDMlF$FTNHG4V5HGY&q}5lW;spDx z4-gO9P>zoyT~V^MhG2Z~GmO?JT0x%0caiq^p)1@AejKH(J~$<6L6;KRG^CxU7_T8- z()v_WrOyHofAzDGaBtXk$uh2m>_}fJd=eO8E>_nN*6?+t8h@!jB30!*T2U~|{A&%0 z`krcyG<7U~v_T!MzEj6NAzl}Htp7{?MCzZaeYeB@UsU{0+$gY%W6|-~&6P#Q@8Lf# z$M5XL;Hda)k_N~0{nPWs>~~?o*T1J{tVZ*w6#q=0x4#vsiN|o9W}hC-cC4L3y)F*M zKMhf(^e$06hC_N()S0Hw%b|8=dUsmQQDJ{tRWI)%Q5V0L$M`ht$NHzGpN9P|jMl`z zwuRU9w{f7H$T2nUJs*??3ipvmV9jy_$>)jZEilsSKo>2+F}ZLWE#W#82N~J#g1_)K zi0s4s;%W4}|KGM&?*bRm{~yB+k56!{j21rr%lCL@zYA9u5j)H{={??P;qeFi?=Uqg z?01n}U>oQ?USuEU7fB`iU07aV?2NNypNyr@Xlebg;YRkC8GjeX7u^3E?x<*gWjy`! z5lqC#d&qZjEHZw#=Lqvlr!G8LR2#&$;xt@X8g*fL5%Ig7D#H9ysSE3ih~I;BdydXu z7B0$(>W-xzIL|p!>C(jumr(<75eT?&@#19_ zj?b4sJ3FYPe;4cNfw57MdM;j4n2I}A?}5p|Yt(OA=Hb5zU8Iyc zAL746dG-JDbon^)IE^L{x?l;m7L%|m33w`G_U6eSKzqg3CFV9DwGC}CmchKTKQ0GUe7z7&Tgl(vBz`g z{^kbro0}UOJa2BCKYw3fZ?6Mvoj<<^c5AQII={=@`BrOhZv(Y9fJ|)cZ2-@=fXMCb zop0@dx3@G|#LLbx2Sj3R>s)IsmHeKs`!Y_jh3ob&(e&`@B@$U;%81LTH2w zE!d{|kZQwC1YNRHNMt+K&c#$k>mb8JX!P>q7+Y#mX|GZT>V zga}E7H6`d>)AhjDq(y!9RFM}NP_o)8>$;4K;{KUHp@Bw zX%_8@M2Eu;9F9v4mZsyM`Z)lBq8Q5s8kHucJ77={c~~uvf1SSY{5}rQuAyXVPN*df zSrouC?7}6cirAr!` z?|&|_du0Dcv5OkNRJtg;(#vC>l930%8&?esNK+cD_8tXZ7tNtJdxr%s(db^034kcFbt@pR^7E~Jnu zX16I4M$9eJg`m!CluTGZP&;k@tN&<#)2F2!su31$6se-lvmZZVVVftnA6vyc&HLv* z_JI?KJsB6rm5X##Mf6gt;1%`Eeu)vZQ^2K&yTMnlg6VJ)`yZK1ys%>~^0KRo2aIsK z(H6Iwy#8C3<=}FEqVv(GFZVy3$6+5--v8({mYItaG=L#%5eqgDp`h}mAe2jO*hg8Q zqS0;&@6pXif;S%#krV7VGGX0tltYaoPr=mqsRSe@XbUZ5IR)mV(2Yx`Xg@7Wk6)};EJB-*gEkg&WC&C2lWo48 zjQwTAFWt_uL_%c9N(@UY$A-yegw z$MC)W?R}%$NbxAB%qizsOF5JD_uKno|FGX~vmPn$J8Hu1jnm&YQmNzTY4Xc1Z|eUv z`D{PC+sm_lDti0u_d(1!hJqsDMUE^Zk{@5L7RK41 zHh-&nJ%4+@%>^=V3mk^!Q&+&g=KKA;XO!8}m<^POIS82F17(CO+uOjw_V!?q9b|)T z{JDHpoU%}nQ5K18d;1C#PzPxs&f8Q%JtX4#`nmOxS5er_lm?lYLS8V(xFfmnIS7jq zQ%1XEg(D?Rub;MKz?MMv107s$Wj7&vBkmBGz-~h9AR&l4ieEI;>v#J8hx=|Cq8;qb z1esI2OwgVnipkggDpNwjqY}-{zW>oU()|~E=9=55Hu4z~JU3K^)CY$-E0WOE4@%6p z|H-(RfbtBR3{Z}NWhCP+$IK>Wa&ZG8KjLlY!>o;#Yv-_-bN<2ywqlmU2e6qy zi*e2}dbD1f@k>(yQN{q^KK$Jm_knPpA>{p@hBCypvfs;wRM|%~ZRqk&5OLIwk?9Jd z#<42xY{=fpVGa83-bE|s455!ELn0G^%Sa*sdaePu^G(|?xLD_0DAYt<72ijtVpIQR z=%aZ!_Iqd{whLQIh)pH4hX}qj9ZK7nQ%V_QB5BJeuYcMzXaphYIgU2JdN}sAp7f@= z=*t(D>7?~L+o$tuSt{=9g%jhFiT)!r3xT)~Aodkeg?t^sk0`)0UUB8Ao+Nm}p-g)= z#OzRN86TPA`5WzkMC(uhOM~PTnA0rIOh~3*R8h^~GBLmZFMe{Gfc349^;{O#9A>#7^!sa?&t*B_sz4@J3fWNrbwLm7gckSvR7^7Q zJnSR6&&+hcnPs=Q-$boj*p;$2Hl&7UZwbi`8?nm{TiPIT{f4KcWdEDWH|@Ws?bp=* zrt+B$j6BmVK+bKK5<4Cl?V!vIWhZ?9hmAixXlJPiSF^KcGYr_Xf;=%l4ZS{$3pL#T zr0<`y{486%PlQv3*^GGhGZKID{!ij;5Wfze^!;Dc`QOxjf8VJ>C=D}wYm(SGvA;n>z9ZU0u-pH1F2E+@ACJr+hXV>bUyy;Y8lHIa+Hc3(WvS5w`u%hAHEPt42*j*c+3zOsYC!4Ly&_uV_IhXXlZm$`u?MF z{Axe>`tK8@AvT`>)8>0v7Sz#bxe$iW?{V|L8lKmCQ6Hb#lR1I;K0mWh4Drz&KdIyA zn@BK?1V5moe%28?NC={iqJRE5)F*}$V92teD8<7=waS<7>`@~>Iuz5iHqYmu{v0C} zi~Td64DhJ{Kd8cEgZRE!o*$gOC65#El-KIXbl*y~>vFJ<&&^1*s~`#e+)UW<^9$4_ ziA3p?`1~U12yx99KRs^fe^Yr4A>DtIPkVmGs#c4gFTEzSeyIm2b4;n>FWQjt1pRZ9ru3-aHUy!R1$1<*TA|fB&`V z^Ji`|LASU`1M#zB61Q+dOvenSL2dusb4@=1&+S1(zNVsictD}`1HZ@DB0w(B=LVqM zEC$3LQAox6fv?hqyt<$6e^YsNKi&VP^3i<Hd z;LA;pL8dwIP48AF#kgBi4I(1WQkG5&$Et4?Vp3pg@*;?F{!fd)>Gemw$2oET)zp5| z`D^x*@4uSPUzKm$ve^r0%io%=e+A#xKN-tBnSFV2U>^@r`No61++eRd;OZ*Rc;%%C zJY(g%5lG9c5MG8Sw_s2cPdFs)&xV;D|NOV<^knd>{rOAN@w@EnpRXfZSovkim=i?^>xf`)ew<)e#wf~r9K%2v%6L*Fq}+agoLwE@ z*_Ku|><0{5n)ctbKL6wU^pwy4o6cXIhI+@r=NgOt{vY1^&wCFaK2*GZy_|Qx+Q^Fe_H#N z%ViwM(gJ?rx2GohPcbwC2b-Ol%1ll65W=AB`cDX+@nc4|U$0 zfd9}(E$IDBN6&HO$RTOR7lR1TGx*Lw9&^~+{me3l zdnSGLx(K6231#hqzE@rmy&RvS-}26{qSd>46~?kxP#Jp26ZHHzw0h#F*r)&L{io44 zl~)(&MmSV42Bwis?3_zEh zkdN7=m{-vGiZT%)LZp}?E-B1ION^W=%sYwzGg!jFq)BYo#554m+0q6S@_4=fSeg2$ z5Q`@TxJU<-{zkqc9=`Xi{Pg}$o%cb`0y6*R9=|GH-T%ln3KQWt+W7b8>m|Q9P<^9d z%KJ*=-d`x}*T3&1I5sx_S`D4xVPkDYC_*T#5Qti5& z>q)i$T%OOZ8}wgamy&D>?%TqH@BIqFCcfL6=gV&Yun2ODvyOo7uA{GpZL74e?FY-cTo;ymf_@l&-*$y84nM&9Fqp) zj06<&_Y53;fZ}aed{odb-gE6MRqKr#f9~fr|C`FYKaTVI?{bdw$~X1j=g~Mkv~_`9 zFQ2QSVTsmznfvWHum9uhI)9pddsKui0SFUU5c5}a@$ayJqkPsIvL4>%40{Zn^PKoN z2skS+ix)SABWJ$FX$<@QL@-R9*rz=8Q=V27l|epBcw&*-7|Q;KmgG?8O!jf#%ZZVv zqR%S6e=Wi2Ab>z~K--PXT0o<@2XY zBo3TJ+$8(>Jr3bO1V5XBAN&~J6-0eO{#=7fn10a*{Y2VPRQqO+bB6W}sjBCCho;Z< zI6EcI06RhpXu5CvVqlGh*nJd2RLM*yEQGy-WH z_9XyWWn>1cbkPnfJ^pOs;rX97Q~LO8D&N%q#`0)t3a8b|HG95(=FIxJbNKbh66VU!q5RAlWQYpul38DO zdB}QlE>C6@GHb!A*~r~~VN+@j4hVdb3Xlh-lEW`+GCNp5cfdlx0pdEt8cq6+vT?{v`g0wZbN{BH*LVLhJi}UCO3yg|U7ussfARC+z}?4%R><8yG@HruKf5QY?j6Ge zDY%FBV}i&8eo|NxKuLsoR@XPP@R~lq@O~I)%iGh@>-)M;olo=T$IYu*`SJtNa4w() zqQ45w--T9kza8Cwi)&tSA5Z%G(c>C#2L9mlq065d}8{+s41j3Y(I3K(}IB5F+(l+(K>HLu=lKS9K zpB>Km`_cORIQ{z{vHhVuzvSalk~8ifw-d?tn@xN_3E3&`=T>f5WX=CVT#9i24-R*x0J&gGZoq1||KGlHz(T;m z_De6l#2P0NLlYhJj0EREIbC8ZH|LRr!{8iT5zkS61;>E(Bm`8brJ|**xXQ2wY~nj* zmpy))&R^X>q`&{;pEIZ8vh6o*KVL^`2Vo7<>-)YJ_np1NgL^seKbesG&>rqH<@U4Z z_oY3}JHJ5J=jitdem~&%37)T_$&HyLn2<`2+iu7GmtrX0=5a;-cOOY$-jYLNVn79g zOuY1&dj3Nn;TskhIBXysi$=nr?_lEj&r5{x{Kp%l+EU(Njt~;6wx8!66Z_A_<^O7; z4*E-)_4$wcHx1p8_kYv%&-FQ0dk2^|m?i|7762jvC?I^z%e0E}+Dhr? zL)`Y`7WxKm{+SAYa*xkP0RATzG@d?V_y2r);l9Iti2x_P{l|?y{pUZU&)fZf)BA^} zzyGB7pLWMP0Vclx&EL~wAo9C=xHlG*cd9znFE3X)q8M`)FHZ?DNzx3IXm0lRzo;K1 z&6x81LhPA~41#%TBU0&1?|(IT|Gi`5+J6wy$N4z)dM;Pg!#!+vJ5`R|-EKvW-A;F$H|_9f$Jp&;jPs0}?$#i{0)Y&}2m>0hV1XIL zU}+>U9}WPy;`MM6kfMu>(lb`tZ&Hw!R(oeti3qSkq2jBYF-~0PN zf8!gUesl4+-}=tNcmL{-{^3vm`)8JZ@t1z)SHJPUKldNM{@HK-`#1jYm;dXh{^#f4 z_~xx&{f*!H_22rt@BYnq{_Q*8|L*sH=at|2mG8a!y?6ic&wlsYzyHtQ`?WuQ^v8eu z7yoB=e04a^7C4D=jfv$6VxKze#OuUi1^c9Th<6%dy>2~!7oK~>s{U~{1#h4FvLi6) zP5PtGIIQZ8bdyag3mKs=Fz8MCqs}-Cos(e52z`M;Z_*!i#^EG-qfW>OeStx5(tm$u zbgTqVV90L52k<_u#E{j8woVKTSxx$b7Io_wdQT#6i5U3@q=UDPp)W9G*6UUC_mMXw z22WtL~di5sh2%X^_Rh>_#FBR;^#X=KXuKX1eb`*q9uBt{Q69xd-gi{;pDMVx9max>>c7= z;yvPh;)4_)CYtDvh>wZMhS~Q>KOw$9S)4hEt|j7fEj}mzf*5{&h`f(d{CKCN_n|%Z zsP;GgpUf2Pv2UN;rS3gqgZ`=ff9yJ^)?e2fdHkRKjQBLg5&xk*OHuXEt=P){&{s#~ z_7K@Snc@;i9gF=6ef<#iUoU0%hUnZ$@lHt(-^cmiQ~$odN38oDdHfe&uVO=0S5vyN z{jqgqt%|&4-=i$_)iLR>+TLVKwY*V3dUoj-jo5oIM!)C{`s=!y@{QyFj@!_C>==B# z_sG}%R$lcFQh)My<`Hru4fZ}fApK8ExsCo;bXN6Sdbz=d7XBCO{uAbg;&8HfQ0?FQ z6n*$r~Qsdyn{u zr)QplcRYq)T620&h}0F1=vUo7ah>>_NFBwwJ`vj7^)Wa^=VPxsPXEk(%BiC@r}q)@ zW5-?k(P8`Kar$M$PO>HJnMD5`4&YEjZT!!oznFW+(Ep}i zdi%s3;$er1|GoRPz5JK{SPu_bfA1lCk%*66zxDrmvg5GzKS4ijpuKSKgXI5xln#kU z(EruFaPN~!`}fhWHaP51>3^+7N8SI$+P{ONN&ivyf3g05Q0o7}%>N&P{@0pQJqK$1 z9cBOb9x?Af_ZZ{vDEnV)PV6`4mMinG5B&)GUu#aI{_D_(#KR6+V^a+OkFx(mw>>+1 zKehjTY?AM?>#&1#yhlWLG5$pB6W57{9hOl*EZV$JUV5JslTFj$$o(Jq=Md9)?`nwx z&biWUF~(cqLFw3>Z5d&DQiq+@FR=os-k^3s2Yc$auD;eF~pB_>^SA3*<*_!04Ar%$cF z?sw$TA9|+2N%YTsQjy&!y-vi}k(hieo~sO5BPNMYsP_r75`PuvKBb*LBR=)=-aT+1 ze~afT$Sd}0d!_f#U$sT)-UIaaiSqwB5n9(cN&ANmd;YhN|53LI=dgM11@ZHlnG=|< zI(7ZMrel^N ze-zh(4=d?M_?6^WZHW1I;yU_=WAtO&$Qpv2xm0(T|L>vm3FXg5(XI<0H``FPr_ujA z$h%9tmr&{ZGw%O~Ahz3H<2gF_)Bo7{LTBUL#Qs@Dd~A$6r3^h+sE&W>m+$ph`2V=% zEqs-(_os*-jLPWbKlYBSHBW1@u`AkYEcU6hPJCXre-FOuIM~zwPvD(I&$v43gJIJD zA$mU|ewG%% z`+Q!;&_6g%Zh9Gz2pwz?Gu~qlD|h0$Jlq` zKE6FDKME&1;$bLfc5xVhL`j2w{$F)we z$4CEB&i~#Md{_JczaP8*w*L09;|Th{(f=cy|4sfMW&hjt)kn1dCzbZUPumZPYKKD( z_3JB*|D){xANKV>uEhd(U6UPh|65;coK<6={Cc7RhZ@jZ%(p(8c8J%BM>PJ;@6Z>h zw&)Yp28SK0x~l20TK3b2$f3>+{=nD*cC_2;- z`a@q}AFW5>|DihfmGG}x;EUV>7vFyOf`yBu-cG4^gBBF4bpG6{7pVc91A$l1oxAAF z)#G`>g$q>jzjMvu-9)CM$W}frVF7Lan7FdM$y4MoD%|4bgtsPm7$tV4l4F>Ujjoej(lE z_S0=v{Z$f1cNAarUtqF&dI$l57a|c@5H4ISNkytCEhv!)ENV3J7qzCfe06noWp#D_ zijJ!{7v_~;SeT#Jabf=K*_#GeuB?K+vuCeB?p^8i&aNnTw%5CIWu98|pc3;}=E1W) zkld9kXM0zmUAZCxpmNnFt)uEAj)de<&^vo&6_D6f#8c9{xq>q4k~b9jtW}*?0Xj?| z5;38NPFaE+S>{Idda@2B(t|~4B_UqSmR)X-$Yvtqsg4L0h(#*Qb`r`!qpIplKP{%F zn_pO2S-rWkIZzdg@Qfw|<3J{VdJue{g`Y({|13yo}*Yy3+s?Mh-* z!w!nZr3Opa@h|xrfS?Ixxu8*{(z*kMhUC#YI{tn7V);!XVI`qu8V=O5hAfM!*)r|Y ztd>cnq$0VjH!7~APsdN~cJ|x(lanH6efB@L53&7&?MFC&I==m`?@!qG*!~0b{l`U} zPuqkze_wFH=WIX4Mu`0t8eVHKdK@y_ ziS3;GZ#wTVfQDcwM&^?( zkz#AH{!5O;Fz^NF)#@+wy!4A;`rR&L(Lq6VHP;n95%O_uclOwzcdbv8CHJM8;QswMUf{ak5 zmg$nwXEr5!tRK{FH~-y!8sO!ZtsUwfmS&Wxvd)*^e|%A!w{AbRN_1NE&rSA$dj$1l zwYXZjOjoLyTyd4OvR=|ZLMWt*A-IGqg{@JA>2MJHADc`%u`?HS+V#Z)C7N#1rLCsU z|0%0-sM??Se2nR<{g38xu@4&E|M)bvnacqQ5Ns_{!8{%sI^7D2a;uGg%8F1n+Et_7 zzIxm6>TMx8!_`0~QoT*#ZK_y)b@l4iRVA;Aa+`Y8yn0o91#XIT`?f#{FH8Iok~ovE zLdjJfX>oLd=qk}cMJ@-ame7Id#8js2rj!Pq%+*A={UefwFzic4z@dwX%Pu`vd(kD*8X z>l-OtC#6`1QOamewVbk-{K4Xe>E9kKE~=hFJ_z(g=o=@0F$L$^ecX@#xXZiRzaM|L zk-f8)XM?sF?Xxi;C=*x|l!+(`R7qRC!BF+14jxy6Ged|Re~5e zQuu?*Kgja6cj%0^STs|#TVPR8CZZ@%C2jQvUq~Ofe(Ya9Sk$tFB_nvfmLFg48pi40 zZ~oThM*jN7q87+}(O|n+K79oocz!U**HXyR(wGfB2y+6M-ymdyHJ1mfTZIW9|x z%?y=uy-G-*A;qHmepM+8Mw1ZFO}_teKib=G`jTm(U(!UEOIV)J305D9a;eB%b34Q_ z-To)jVnWC>HW`GRft7-dyPTP=klD!%WJW2ZQJKMN!Kvc+5arHY9;05AXLCC9Ag(1Y zML4r`hJQ;O6`(4u!h}JOdWkQY@6Kb~wDx!9PiDyYYu9vKx;8g=4Jx3-8OJk$K`*cn z(9VCx(Ta~LJC^D4UW4C3pd{`jRC$V?RYNEfSQM0rC<;`G_A&3Uj)80M5I`G%8ATRU zCC?U>&m9L@#`sHOZ4u-kUWI!9<%mW~*eOu9i93t9Gw5nR{x0U5*&;2sn4>Y*{KW>fVwPhA zWF=@Z%~^R*>n+NEYbua3Ie_`tyJ6;o7%vy{!J50W$+>c{mTgMp0B;tN6`f%0)UKk^ zwLpzsRTi^N^-hj9J-I|WlMdp-;Og<@i%eG$syk}?x3)XWQZE^Mp9C$tJ zO*b)?FP7<6>vy&x!T;X~HwtEZ7bk-))C&ZP0T4#!`jW_IKs)+J9Z! zudDrC`Li@I^31mYxwc&%)bV7zgR-P3JK*a-HvU+!n6*Vr&CZ<37_esybx?jkjQS|I z&~g9Me*cu^XVl^YAx0(4Cd4ye5dT~6|IE)0{`>H0zyIqx|GVn%Jb!Kauyi}7(}&h> zjSNtuo6|>{)tS~>LYzKyI#DRh*x1Nv*p&rQE$xCd;iY}15t^U$^GrMq;iQI8HywX{w1 z{4?%jw8e7&%$)(<70`n!ZW~mui|ziwnQL}CfxEn^o=x|qwt9mP{X92QkX{E%_;WKO zSMOg?TfsO+4lVCr6fz3Grt@DGceKANzq`=h{>0zz{{5HT|E}wQSO2@}FBTq4*dn4O zL}8-m7hTuC?)uHt*6Sb7vh}1pUJFkcFN^d0R~7Q}PgUb5F5s&D{uR(K$@qPy{eVqB z+9Y8=bLCZc{myl=-@hVLJWn?w@;PVCiyIVPzo4(_wFpA+ z>%IXYPZ|qkk7&W!2L;`^OMW-Mz5QMJ-Te0Ucjd2Kcc@#Yz7Ok*Kd1d#i2XVJlxt^i z{Y8)HEU|PZPtOhV{Gjx=eSW;3{g|HVjXSP5%mr@J%GsqX3r@$H`!IRf&wuB(CR$oT ziJC`OH_+`OCqd>p=t=HUX2o1BxddY|W5p|@jgqP_m26g!#N?$D-=^8#k6d$6_}R4IbZ)udRqT%EbEZ;+lvDm+(gwI5B73Hdewom ztKH+Zmm;{ws&^wu+p7>!#+_RTlB5IC(s6HC+41*(yPp4D6;@e7_PhSD&8@v{Z%2e* z=8FnQG^{`PF!}wLuH*N(&wsIwEV1(2k})M36YGfK+Vr@GUK^v7uW1Z}Hk7$jWWlL} z!8pA>z_TTTeogGuCI^g zgC4lM9M&?dudf%GYC4EjT1t=V+bw^;@(^vYES#cMk8pjrK3_=5|iD6nUJktvakznq0=Fq*%RI}J{{LC zU4sA8C80zF!b0BoO70{i&t*dq;BQPDvDyBjz7nnYVM1$r`@8a2JZNQqZQRE=A2a@} z6@9+k@_BOr_9IVH=>5z`&u-MnQSgp02NCx(^v*xGInvwxU%v0(m;>bx7x1PCx_cA9 zT4?_ML7r`^;qta9X3aWHxs-G?YDsD+wi<2q2A}Edpx^n^u`-2YC14m^05!H4XLWR5 zSj}0RO>4oumbfpi8#6UV(AF;Gef{euSL4&a!cC|md<^8+w`JaKI-~-*}iOtIx9&U$*!QR38pM%fpHD;TRpbSeGM5$!EW~xEFOG_JQ zA^eU0Q)S7MKo(CiXpt_^`kQ=>z4+a;)7$rd+j(E`C5MuIQ;%O~ukU~C9K}S~jcNQx z^R2ahaiIQ2!9MRRjeCEg)ZhHRla*8CKcvt*OQv|JcbB@nzZLI~9ryLSU;pp%;zRnH z%bxE)s1Qf24!^BR(u!~MSYlJZ5$Bg!0((QlH;LKy2KPXD4ABz({v)?I)BVSW`=56I zw4kSY!Pi!A@P(YV`oH4Wed`YWH}It-+Xpw&!o%-=EufR%w&wY9w|}t^?vqI77m$|i ze9h(!_sd&iSO44U4ZiCAM}P5Q+V{UC!Pg(>XCd-Mb)xqteo)uH7*6TCDBCv6I0QZN zv5xJH+uL5wq+y&XfEMCCgTNS|yzR=Pg2nPZ*MWz6y>a6&?A*`(uKZz7;I#G!U*NR- zUG0x~G!D1Zx}dJN=V~;pF!f#*b_Y&t|2Vxt-%o$KRm7Hnz{E9V{(7$Z9Tq4~SG`Tu z<897jkKuD(6Q3yH=%6ewZW_godW$m=()SY~Bypx+{E{zzX>oLd=qk}cMXqDh_CL~O z(TNl3=ek!DBX5f_tMvYjr31-CQdmtpkB*w9$E)9LVNA+Ed%|d-r;OzI9)-|9O95_f z@_7nS^_{LymzWT?awk>r~^NnlsX$ zP@>jC?q-q~asyRIdW@%nqMPX$u6}6hplY90)5a2ffejU^q-y#Hi9fgZ@3~%YiQX3N z+rO>e;OnaYVEB=u<)a#1u(rq^7(fdAIK)m7LUMVkHp(kGHGb#Trhp*E5OB=v51(hT zVDAxNb4DX5jKhIBV5^MHVCOE|!MVpD6MJ$0&zq_J`0L8w)&9=>G&MuPhC_i$h|cJ8 z%xf5QM;lMD2*u`@J0ivM2?wb>&={1V>v>64Dl=sr@s7L#Xd(Qy&gY=YreCP@I6|su z%+Q@%FxVJ-#~)wZHvjCWZz)?$n_HQheO!!>~dMbeji3fzJz39HzxjIUt=G& zLTvr~^YZ1(r@F+XAFv=>Jm}G73ibq(l6aB{xu|!lWk}7QpE`Z|)GM#>^~e#-ot`87 z^l36ehf|h0bt?GbjpS68Ovse96$n`pgXC6-6*vjU)EH1c18Ik9j=OW|eVmzsjIcVXyHY@&fI^VRzs-`?J1> zItE|hIQ}v0`uJ>e;T5xd=#Z>+n^i-$1ANN%w4n4qDK1*b<{>qxr4Z;jaeA26f9Y=u zAuq7*f3~${w{YTwv7IW$eVyP7`}V`AANDgmi?w(pJ>mQhd4YBN&Cac@FrO2xg)o0R z>1;j!vl}Mr#xC5lf*Z7-5<(^Tq_8DGOBD00sc$Bsb-jNP{V+~fv}a({k9DCwpQg=^ zn^%+4?E}#mS736)zY4AILVF0i1H=C0*RLF#wm$MO7U z)MM`ES_tr)#pFaVqCf6d&g-D)Na?23=%`Ubd1n)lP=cznlnN9YW>{i6}KNRgu0Xtz^ zZm4Qp|1ZC>r9xn9`SsUdSB-=4p^FSzrhsvTTqY@%C*w(CFqEw~%yP=#AP!Z}T%bZ@ zC|fEO*9oZsyVx$?;~u|V=dbS{+Q0u3&zaleaqI8eezA@;4#Eav)Q^2H*PUzITQ_oD ze=1?up=(@c+U4h3T$iqSKIkQeyui3li0gs4PKbOR6W^Fg!i4k?xEy-Iek(@kvf>-| zzx!B%c`J&75<>|vRO0n7)cqgXh;1w|7@WW;$s2P+wnOCp&+CHX{!cVWy``eT0%5XH zZ@g+ZgbhsCG=%3{*@~J>>6LU0OHS1XgYksuK#uSB5cQe^MHe2{&S%( z`}Hq{AGGWLuGbG;zyIXdpXrKs57_hlZ+%Zsj@WnixHdMlcdAw;-(Ic?q?kF&%ToqQ zDtHDVo}2vrFUcoZGq$;ZVfvDZazc4Y6H4er?|*f8|9v%$>-ZpIjPr3A^@6Xg$39h| z^4(Ya;H%S8fif0S<*ludGw%QYuySgznqbfwhH4+~NC$h!ofucmk@oyGMXSjnNlk9= z*&eAGhYj`{JBOhXejuT|G7)4ypW98X;mt^~n$c@{BK5}*`;2qd`DwfxL)y~93dh#Z z58xGlgfczh^(%}ePc=O;KVLbYGxeFns%3M&AT~FrG7n*3oM!`*{$ulBM$1Ywo`WGC UKr#=){^TRhx#fY*-QNHI2Y?z7)c^nh diff --git a/Samples/VDP2 - Layers/src/main.cxx b/Samples/VDP2 - Layers/src/main.cxx index 305f6eed..a720a473 100644 --- a/Samples/VDP2 - Layers/src/main.cxx +++ b/Samples/VDP2 - Layers/src/main.cxx @@ -26,7 +26,7 @@ int main() SRL::Core::Initialize(HighColor(20,10,50)); Digital port0(0); // Initialize gamepad on port 0 - SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("THIS.BIN");//Load tilemap from cd to work RAM + SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("SPACE.BIN");//Load tilemap from cd to work RAM SRL::Tilemap::TilemapInfo TestInfo = TestTilebin->GetInfo(); @@ -34,16 +34,16 @@ int main() delete TestTilebin;//free work RAM - TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOO2.BIN");//Load fog tilemap from cd to work RAM + TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOG256.BIN");//Load fog tilemap from cd to work RAM SRL::VDP2::NBG1::LoadTilemap(*TestTilebin);//Transfer tilemap from work RAM to VDP2 VRAM and register with NBG1 delete TestTilebin;//free work RAM //Demonstrate NBG2 loading with Tilemap converted from Bitmap: - //SRL::Bitmap::TGA* logo = new SRL::Bitmap::TGA("LOGO1.TGA");//Load Bitmap image to work RAM - //SRL::Tilemap::Interfaces::Bmp2Tile* TestTilebmp = new SRL::Tilemap::Interfaces::Bmp2Tile(*logo);//convert bitmap to tilemap - //SRL::VDP2::NBG2::LoadTilemap(*TestTilebmp);//Transfer tilemap from work RAM to VDP2 VRAM and register with NBG2 - //delete TestTilebmp;//free tilemap from work ram - //delete logo;//free original bitmap from work ram + SRL::Bitmap::TGA* logo = new SRL::Bitmap::TGA("LOGO1.TGA");//Load Bitmap image to work RAM + SRL::Tilemap::Interfaces::Bmp2Tile* TestTilebmp = new SRL::Tilemap::Interfaces::Bmp2Tile(*logo);//convert bitmap to tilemap + SRL::VDP2::NBG2::LoadTilemap(*TestTilebmp);//Transfer tilemap from work RAM to VDP2 VRAM and register with NBG2 + delete TestTilebmp;//free tilemap from work ram + delete logo;//free original bitmap from work ram //store XY screen positions of Background scrolls: Vector2D Nbg0Position(0.0, 0.0); @@ -54,22 +54,22 @@ int main() SRL::VDP2::NBG0::ScrollEnable();//enable display of NBG0 SRL::VDP2::NBG1::SetPriority(SRL::VDP2::Priority::Layer6);//set NBG1 priority - //SRL::VDP2::NBG1::SetOpacity(0.5);//set opacity of NBG1 - //SRL::VDP2::NBG1::TransparentDisable();//disable fully transparent pixels on Fog(its all half transparent) + SRL::VDP2::NBG1::SetOpacity(0.5);//set opacity of NBG1 + SRL::VDP2::NBG1::TransparentDisable();//disable fully transparent pixels on Fog(its all half transparent) SRL::VDP2::NBG1::ScrollEnable();//enable display of NBG1 - //SRL::VDP2::NBG2::SetPriority(SRL::VDP2::Priority::Layer4);// Set NBG2 priority between NBG0 and NBG1 - //SRL::VDP2::NBG2::SetPosition(Nbg2Position);//Set the static screen position for SRL Logo - //SRL::VDP2::NBG2::ScrollEnable();//enable display of NBG2 + SRL::VDP2::NBG2::SetPriority(SRL::VDP2::Priority::Layer4);// Set NBG2 priority between NBG0 and NBG1 + SRL::VDP2::NBG2::SetPosition(Nbg2Position);//Set the static screen position for SRL Logo + SRL::VDP2::NBG2::ScrollEnable();//enable display of NBG2 - SRL::Debug::Print(1,3,"VDP2 ScrollScreen Sample"); + SRL::Debug::Print(1,3,"VDP2 ScrollScreen Layers Sample"); //Main Game Loop while(1) { //move positions of NBG0 and NBG1 scrolls: Nbg0Position += Vector2D(1.0, 1.0); - Nbg1Position += Vector2D(1.0, 1.0); + Nbg1Position += Vector2D(1.0, 0.0); SRL::VDP2::NBG0::SetPosition(Nbg0Position); SRL::VDP2::NBG1::SetPosition(Nbg1Position); diff --git a/Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx b/Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx index e8cb2e44..89da6ece 100644 --- a/Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx +++ b/Samples/VDP2 - RBG0 Rotation Parameters/src/main.cxx @@ -1,37 +1,35 @@ /*VDP2 Scroll Layer Demo: -This Demo Shows how to Load and display 2 Tilemaps on RBG0 simultaneously using separate -Rotation Parameters +This Demo shows how to Load and display 2 Tilemaps on RBG0 simultaneously using the primary and secondary +Rotation Parameters. */ #include - using namespace SRL::Types; using namespace SRL::Input; using namespace SRL::Math; - - int main() { SRL::Core::Initialize(HighColor(20,10,50)); Digital port0(0); // Initialize gamepad on port 0 - // variables to store current position/ rotation of the RBG0 tilemaps: - Vector3D Rbg0PositionPrimary(0.0,40.0,80.0);//40 units below camera for ground - Vector3D Rbg0PositionSecondary(0.0,-40.0,80.0);//40 units below camera for ground - Angle Rbg0RotationSecondary = Angle::FromDegrees(0.0);//we will also make the clouds rotate + // variables to store current position/ rotation of the 2 RBG0 tilemaps: + Vector3D Rbg0PositionPrimary(0.0,80.0,80.0);//80 units below camera for ground + Vector3D Rbg0PositionSecondary(0.0,-80.0,300.0);//80 units above camera for clouds + Angle Rbg0RotationSecondary = Angle::FromDegrees(0.0);//Just for fun, we will also make the clouds rotate SRL::Tilemap::Interfaces::CubeTile* TestTilebin= new SRL::Tilemap::Interfaces::CubeTile("GROUND.BIN");//Load ground tilemap from cd to work RAM SRL::Tilemap::Interfaces::CubeTile *TestTilebinB= new SRL::Tilemap::Interfaces::CubeTile("CLOUDS.BIN");//Load fog tilemap from cd to work RAM - //This new overload allows transferring both tilemaps to VRAM and initializing their rotation modes all in one go: + //This new overload allows loading 2 tilemaps for RBG0 and initializing their rotation modes all in one go: SRL::VDP2::RBG0::LoadTilemap(*TestTilebin,*TestTilebinB, SRL::VDP2::RotationMode::TwoAxis,SRL::VDP2::RotationMode::TwoAxis); delete TestTilebin;//free work RAM delete TestTilebinB;//free work RAM - //Example of laying out a multi plane tilemap in a 4x4 grid for the Primary Tilemap + //----------------------------------------------------------------------------------------------------------------------- + /*Example of laying out a multi plane tilemap in a 4x4 grid for the Primary Tilemap*/ uint8_t mapLayout[4][4] = { 0,1,2,3, @@ -40,10 +38,10 @@ int main() 0,1,2,3, }; - //set the multi plane layout of Primary Tilemap - SRL::VDP2::RBG0::SetPlanes(mapLayout); - - //set initial perspective for the Primary and secondary rotation: + SRL::VDP2::RBG0::SetPlanes(mapLayout,SRL::VDP2::RotationParameter::Primary);//set the multi-plane layout of Primary Tilemap + + //------------------------------------------------------------------------------------------------------------------------ + //set initial perspective for the Primary and secondary tilemap rotations: SRL::Scene3D::LoadIdentity(); SRL::Scene3D::PushMatrix(); @@ -61,28 +59,29 @@ int main() } SRL::Scene3D::PopMatrix(); - /*This is not strictly necessary in our example because PerspectiveSwitch is the default setting - when loading 2 tilemaps, but use this function if you want a different setting*/ - SRL::VDP2::RBG0::SetParameterDisplay(SRL::VDP2::SwitchMode::PerspectiveSwitch); + /*Using SetParameterMode() here is not strictly necessary in our example because PerspectiveSwitch + is the default setting when loading 2 tilemaps, but use it if you want a different setting:*/ + SRL::VDP2::RBG0::SetParameterMode(SRL::VDP2::SwitchMode::PerspectiveSwitch); + + SRL::VDP2::RBG0::TransparentDisable();//Turn off transparent pixels on RBG0 - //Enable RBG0 to display on screen: - SRL::VDP2::RBG0::ScrollEnable(); + SRL::VDP2::RBG0::ScrollEnable();//Display RBG0 on screen SRL::Debug::Print(1,3,"VDP2 Rotation Parameters Sample"); while(1) { - //Demonstrate independent manipulation of RA and RB tilemaps: + //Demonstrate independent manipulation of Primary and Secondary tilemaps Rbg0PositionPrimary.Z-=Fxp(1.0);//scroll ground towards camera - Rbg0RotationSecondary+=Angle::FromDegrees(1.0);//rotate clouds - + Rbg0PositionPrimary.X-=Fxp(1.0);//scroll ground towards camera + Rbg0RotationSecondary+=Angle::FromDegrees(0.1);//rotate clouds + //set transform of primary tilemap: SRL::Scene3D::LoadIdentity(); - //set perspective matrix of primary tilemap: SRL::Scene3D::PushMatrix(); { SRL::Scene3D::Translate(Rbg0PositionPrimary); - SRL::Scene3D::RotateX(Angle::FromDegrees(-90.0)); + SRL::Scene3D::RotateX(Angle::FromDegrees(-90.0));//'floor' is always rotated -90 degrees X from its default SRL::VDP2::RBG0::SetCurrentTransform(SRL::VDP2::RotationParameter::Primary); } SRL::Scene3D::PopMatrix(); @@ -91,8 +90,8 @@ int main() SRL::Scene3D::PushMatrix(); { SRL::Scene3D::Translate(Rbg0PositionSecondary); - SRL::Scene3D::RotateY(Rbg0RotationSecondary); - SRL::Scene3D::RotateX(Angle::FromDegrees(90.0)); + SRL::Scene3D::RotateX(Angle::FromDegrees(90.0));//ceilng is always rotated +90 degrees X from its default + SRL::Scene3D::RotateZ(Rbg0RotationSecondary); SRL::VDP2::RBG0::SetCurrentTransform(SRL::VDP2::RotationParameter::Secondary); } SRL::Scene3D::PopMatrix(); diff --git a/Samples/VDP2 - RBG0 Rotation/src/main.cxx b/Samples/VDP2 - RBG0 Rotation/src/main.cxx index 858bc3cc..efed8c83 100644 --- a/Samples/VDP2 - RBG0 Rotation/src/main.cxx +++ b/Samples/VDP2 - RBG0 Rotation/src/main.cxx @@ -1,9 +1,14 @@ /*VDP2 Rotation Demo: -This Demo Demonstrates how to configure a rotating scroll and provides an interactive -showcase of the differences in rotation behavior between rotation modes. Since VRAM demands -increase with the number of rotation axis used, It is recommended to select the minimum -Number of Axis Required for your desired use case. - +This Demo shows how to configure a rotating scroll on RBG0 and provides an interactive +showcase of the differences in rotation behavior and perspective between +1 axis, 2 axis, and 3 axis rotation modes. Since VDP2 VRAM demands +increase with the number of rotation axis used, it is recommended to select the minimum +number of axis required for your desired use case. A blue polygon is drawn in the center +of the screen alligned to the same starting axis as the RBG0 plane (facing out of the screen). +This demonstrates that 3D transforms effect both polygons and RBG0 identically when within +the valid rotation axis for the selected mode, but will not align when rotation +occurs along an invalid axis for the selected rotation mode. With 3 axis rotation selected +for RBG0, the polygon plane and RBG0 plane will always align. */ #include @@ -11,21 +16,38 @@ using namespace SRL::Types; using namespace SRL::Math::Types; using namespace SRL::Input; +//---------------------------------------------------------------------------------------------------- +// Mesh data for a single polygon plane + +Vector3D TestVerts[] = +{ + Vector3D(-40.0,-140.0,0.0), + Vector3D(-40.0,-60.0,0.0), + Vector3D(40.0,-60.0,0.0), + Vector3D(40.0,-140.0,0.0), +}; + +Polygon TestPolys[] = +{ + Polygon(Vector3D(0.0,0.0,-1.0),(uint16_t[4]){0, 1, 2, 3}), +}; + +Attribute TestAttr[] = +{ + Attribute(Attribute::FaceVisibility::DoubleSided,Attribute::SortMode::Maximum, + No_Texture,HighColor(0,0,255),No_Gouraud,CL32KRGB,sprPolygon,No_Option), +}; +Mesh TestMesh = Mesh(4,TestVerts, 1, TestPolys,TestAttr); + +//------------------------------------------------------------------------------------------------------- +//Function to swap between the 3 available rotation modes + static void LoadRBG0(uint8_t config, SRL::Tilemap::ITilemap* map) { SRL::VDP2::RBG0::ScrollDisable();//turn off scroll display so we dont see junk when loading to VRAM - SRL::VDP2::ClearVRAM();//Clearing VDP2 VRAM because use differs between Rotation Modes - SRL::VDP2::RBG0::LoadTilemap(*map);//Transfer Tilemap to VRAM again - uint8_t mapLayout[4][4] = - { - 0,1,0,1, - 0,1,0,1, - 0,1,0,1, - 0,1,0,1, - }; - - //set the multi plane layout of Primary Tilemap - SRL::VDP2::RBG0::SetPlanes(mapLayout); + SRL::VDP2::ClearVRAM();//Clearing VDP2 VRAM because its use differs between Rotation Modes + SRL::VDP2::RBG0::LoadTilemap(*map);//Transfer Tilemap to VRAM again since we cleared it + switch (config) { case 0: @@ -39,44 +61,40 @@ static void LoadRBG0(uint8_t config, SRL::Tilemap::ITilemap* map) case 1: /*configure RBG0 with 2 Axis rotation: -X and Z axis rotation displays correctly while Y rotation causes scaling/skewing - -Snes Mode7 style effect like Mario Kart/F-Zero - -Works for 3D ground in games where there is no rolling around camera's axis*/ + -SNES Mode 7 style floor effect like Mario Kart/F-Zero + -Works for 3D ground/cieling pland in games where there is no rolling around the camera's axis*/ SRL::VDP2::RBG0::SetRotationMode(SRL::VDP2::RotationMode::TwoAxis); SRL::Debug::Print(1,5,"Rotation Mode "); break; case 2: /*configure RBG0 with 3 Axis Rotation: - -Full 3D rotation + -Full 3D rotation on all axis (SNES couldn't do this!) -Works for 3D flight sims or other games where camera rolling is desired*/ SRL::VDP2::RBG0::SetRotationMode(SRL::VDP2::RotationMode::ThreeAxis); SRL::Debug::Print(1,5,"Rotation Mode "); break; } - slBMPaletteRbg0(9); + SRL::VDP2::RBG0::ScrollEnable();//Turn Scroll Display back on } int main() { SRL::Core::Initialize(HighColor(20,10,50)); - - Digital port0(0); // Initialize gamepad on port 0 - int8_t CurrentMode = 0; - - SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOG256.BIN");//Load tilemap from cd to main RAM - - LoadRBG0(0, TestTilebin); + int8_t CurrentMode = 0;//variable to store which rotation mode is selected + SRL::Tilemap::Interfaces::CubeTile* TestTilebin = new SRL::Tilemap::Interfaces::CubeTile("FOG256.BIN");//Load tilemap from cd to work RAM + LoadRBG0(CurrentMode, TestTilebin);//Load tilemap from work RAM to VDP2 VRAM and configure it to start in Single Axis mode - //SRL::VDP2::RBG0::SetPriority(SRL::VDP2::Priority::Layer2);//set RBG0 priority - //SRL::VDP2::RBG0::ScrollEnable();//enable display of RBG0 - - //variables to store current RBG0 rotation - int16_t angY = (int16_t)DEGtoANG(0.1); - int16_t angZ = (int16_t)DEGtoANG(0.0); - int16_t angX = (int16_t)DEGtoANG(0.0); + //variables to store current RBG0 position and rotation + Vector3D RBG0position = Vector3D(0.0,100.0,160.0); + Angle angX = Angle::FromDegrees(0.0); + Angle angY = Angle::FromDegrees(0.1); + Angle angZ = Angle::FromDegrees(0.0); + + //Print title and demo controls on screen SRL::Debug::Print(1,3,"Rotating Scroll Modes Sample"); SRL::Debug::Print(1, 6, ""); SRL::Debug::Print(1, 7, ""); @@ -106,27 +124,38 @@ int main() } //Update Rotations based on user input - if (port0.IsHeld(Digital::Button::X)) angX += DEGtoANG(0.3); - else if (port0.IsHeld(Digital::Button::A)) angX -= DEGtoANG(0.3); + if (port0.IsHeld(Digital::Button::X)) angX += Angle::FromDegrees(0.3); + else if (port0.IsHeld(Digital::Button::A)) angX -= Angle::FromDegrees(0.3); - if (port0.IsHeld(Digital::Button::Y)) angY += DEGtoANG(0.3); - else if (port0.IsHeld(Digital::Button::B)) angY -= DEGtoANG(0.3); + if (port0.IsHeld(Digital::Button::Y)) angY +=Angle::FromDegrees(0.3); + else if (port0.IsHeld(Digital::Button::B)) angY -= Angle::FromDegrees(0.3); - if (port0.IsHeld(Digital::Button::Z)) angZ += DEGtoANG(0.3); - else if (port0.IsHeld(Digital::Button::C)) angZ -= DEGtoANG(0.3); + if (port0.IsHeld(Digital::Button::Z)) angZ += Angle::FromDegrees(0.3); + else if (port0.IsHeld(Digital::Button::C)) angZ -=Angle::FromDegrees(0.3); } - //Rotate current matrix and Set it in rotation parameters - slPushMatrix(); + /*Rotate current matrix and Set it in rotation parameters. + RBG0 plane gets its position, rotation, and scale based on the same Matrix that SRL::Scene3D uses. + + -NOTE: because this is Euler rotation, the order they are applied matters (Rot(XYZ) is not equal to Rot(YXZ)). + A different order of rotations might change which axis preserve the correct perspective of RBG0 in 2 Axis mode. + With the standard XYZ ordering below, X and Z rotations preserve perspective in 2 axis mode*/ + SRL::Scene3D::PushMatrix(); { - slTranslate(toFIXED(0.0), toFIXED(100), MsScreenDist); - slRotY(angY); - slRotX(angX); - slRotZ(angZ); + SRL::Scene3D::Translate(RBG0position); + + SRL::Scene3D::RotateX(angX); + SRL::Scene3D::RotateY(angY); + SRL::Scene3D::RotateZ(angZ); + + //Apply the current matrix transform to RBG0: SRL::VDP2::RBG0::SetCurrentTransform(); + //To demonstrate that the transform applies the same to polygons, draw a polygon plane using the same matrix: + SRL::Scene3D::DrawMesh(TestMesh); + } - slPopMatrix(); + SRL::Scene3D::PopMatrix(); SRL::Core::Synchronize(); } diff --git a/saturnringlib/srl_vdp2.hpp b/saturnringlib/srl_vdp2.hpp index 755eabf5..c4789882 100644 --- a/saturnringlib/srl_vdp2.hpp +++ b/saturnringlib/srl_vdp2.hpp @@ -8,7 +8,6 @@ #include "srl_cd.hpp" #include "srl_tilemap_interfaces.hpp" -//Test Changes namespace SRL { /** @brief VDP2 control @@ -605,9 +604,9 @@ namespace SRL * @details A scrollscreen that is Registered to the Ascii Scroll will remain * registered even if VDP2::ClearVRAM() is called. It will automatically unregister * and revert to normal loading when it's LoadTilemap()/LoadBitmap() method is next called. - * @note -The Ascii Scroll is not compatible with Rotation Scroll RBG0 - * @note -The Ascii Scroll was designed to have its position fixed on screen, and may display garbage data if - * its position is offset. + * @note -The Ascii Scroll is not compatible with Rotation Scroll RBG0. + * @note -The Ascii Scroll was designed to have its position fixed on screen, and may display garbage + * data in the margins if its position is offset or used in High res mode without proper scaling. * @note -The Ascii scroll data is stored outside The VRAM Alloacator's valid memory region, so * can not be written to with the standard ScrollScreen loading functions. Manage loading * fonts with the SRL::ASCII module instead. @@ -876,7 +875,7 @@ namespace SRL { for (uint16_t j = 0; j < info.MapWidth; j++) { - if (info.MapMode) *VRAM++ = ((*mapData++) + mapoff) | (paloff << 12); // 1WORD data + if (info.MapMode) *VRAM++ = ((*mapData++) + mapoff) | (paloff << 12); // 1WORD datal else *VRAM32++ = ((*Data32++) + mapoff) | (paloff << 20); // 2WORD data } } @@ -1244,30 +1243,29 @@ namespace SRL /** @brief Options for treating display of rotation parameters outside of the * main tilemap/bitmap area. - * @details when 3d rotation is simulated, some perspectives may display - * areas on screen that are beyond the 4x4 plane area defined by the tilemap. + * @details when 3d rotation and scaling is simulated, some perspectives may display + * areas on screen that extend beyond the 4x4 plane area defined by the tilemap data. * Use these options with RBG0::SetOverDisplayA/B to specify what to display in - * these areas. + * those areas. */ enum class OverPattern { - /** @brief Screen areas outside the map repeat the full tilemap pattern + /** @brief Screen areas outside the map repeat the full tilemap pattern (Default) */ RepeatMap, - /** @brief Screen areas outside the map repeat a single selectable tile from the - * tileset + /** @brief Screen areas outside the map repeat a single selectable tile from the map's tileset. * @note Not available in Bitmap Mode */ RepeatTile, - /** @brief Screen areas outside the map are treated as transparent pixels + /** @brief Screen areas outside the map area are treated as transparent pixels */ Transparent, /** @brief Areas outside a 512x512 square centered at coordintate [256,256] - * are made transparent regardless of the underlying map size + * are made transparent regardless of the underlying map area */ Transparent512x512, @@ -1277,19 +1275,19 @@ namespace SRL */ enum class SwitchMode { - /** @brief Only display Tilemap A (Primary Tilemap and rotation params) + /** @brief Only display Primary Tilemap and rotation params */ OnlyPrimary = 0, - /** @brief Only display Tilemap B (Secondary Tilemap and rotation params) + /** @brief Only display Secondary Tilemap and rotation params */ OnlySecondary = 1, /** @brief Switch RBG0 Tilemap display based on perspective of Tilemap A - * @details In regions of the screen beyond parameter A's simulated 'horizon'*, - * Rotation parameter B will be displayed - * @note -*(More technically, any screen coordinate where the scaling coefficient data - * read for Parameter A has its high bit set to 1 will display Parameter B data instead). + * @details In regions of the screen beyond the Primary Parameter's simulated 'horizon'*, + * the Secondary Parameter will be displayed instead. + * @note -*(More technically, any screen coordinate where the scaling coefficient + * read for the primary parameter has its high bit set to 1 will display Parameter B data instead). * @note - Only Parameter A can display 3 Axis (Per Dot) Rotation in this mode. */ PerspectiveSwitch, @@ -1297,16 +1295,24 @@ namespace SRL /** @brief Switch RBG0 rotation display based on a VDP2 window * @details Rotation A displays in regions inside the selected VDP2 window While * Rotation B displays outside the window - * @note - This is the only avaiable mode where Parameter A and B can + * @note - This is the only avaiable mode where Primary and Secondary Parameters can * Simultaneously display 3 Axis (Per Dot) Rotation. */ WindowSwitch, }; - + + /** @brief Used to select between the 2 Rotation Parameters on RBG0: Primary or Secondary. + * Primary rotation parameter controls the display of the Primary Tilemap, Secondary Parameter controls + * display of the Secondary Tilemap. + */ enum class RotationParameter : uint16_t { + /** @brief Select Primary Rotation Parameter (RA) + */ Primary = RA, + /** @brief Select Secondary Rotation Parameter (RB) + */ Secondary = RB, }; @@ -1331,7 +1337,7 @@ namespace SRL { if(info.MapMode!= RBG0::Info.MapMode || info.SGLColorMode()!=RBG0::Info.SGLColorMode()||info.CharSize!=RBG0::Info.CharSize) { - SRL::Debug::Assert("RBG0 Tilemap B Init Failed: Tilemap B format does not match primary tilemap"); + SRL::Debug::Assert("RBG0 Secondary Tilemap Init Failed: Format does not match primary tilemap"); return false; } slPlaneRB(info.PlaneSize); @@ -1447,10 +1453,13 @@ namespace SRL } /** @brief Initializes the ScrollScreen's tilemap specifications + * @details Initailization is performed automatically when using the built in + * LoadTilemap functions. This function is only required when performing custom loading + * routines. Ensure that VRAM for Cell and Map data has already been allocated before calling. * @param info Tile map info - * @note This function initializes both parameters RA and RB to use - * the primary tilemap. To use a secondary tilemap in RB, call LoadTilemapB()/InitB() - * after loading and initializing the primary tilemap. + * @note This function initializes both rotation parameters using the same + * source tilemap. To use a secondary tilemap in RB, use the respective + * overloads */ inline static void Init(SRL::Tilemap::TilemapInfo& info) { @@ -1466,6 +1475,9 @@ namespace SRL } /** @brief Initializes the ScrollScreen's bitmap specifications + * @details Initailization is performed automatically when using the built in + * LoadBitmap function. This function is only required when performing custom loading + * routines. Ensure that VRAM has already been allocated before calling. * @param info bitmap info */ static void Init(SRL::Bitmap::BitmapInfo& info) @@ -1485,7 +1497,10 @@ namespace SRL } /** @brief Overload initializes Primary and Secondary rotation parameters to separate source tilemaps - * @note Initialization fails if infoA and infoB do not share the same configurations for + * @details Initailization is performed automatically when using the built in + * LoadTilemap functions. This function is only required when performing custom loading + * routines. Ensure that VRAM for Cell and Map data has already been allocated before calling. + * @note Initialization for Secondary fails if it does not share the same configuration as Primary for * color depth, tile size, and map data type. * @param infoA Tilemap info of primary tilemap to initialize * @param infoB Tilemap info of secondary tilemap to initialize @@ -1509,7 +1524,7 @@ namespace SRL LoadTilemap(tilemap,LoadPalette); } - /** @brief Load and configure both primary and secondary Tilemaps + /** @brief Load and configure both a Primary and Secondary Tilemap * @details Overload to load and configure both primary and secondary tilemaps on RBG0. * The SwitchMode will be initialized to UsePerspective. Use SetSwitchMode() after loading * to change the setting if desired. @@ -1520,9 +1535,8 @@ namespace SRL * @param LoadPalette (optional) set false to disable auto loading of palette data (default = true) * @note -Due to shared registers, the Secondary Tilemap must have the same underlying data format as the * Primary Tilemap (color depth, tile size, map data type). Furthermore its data must be able to fit within the same - * Reserved VRAM banks as the corresponding primary data ((celDataA + celDataB) <= 0x20000 bytes and (mapDataA+mapDataB)<=0x20000 bytes) - * - * -See VDP2::Switchmode documentation for limits on rotation modes for A and B under various conditions. + * Reserved VRAM banks as the corresponding primary data ((celDataA + celDataB) <= 0x20000 bytes and (mapDataA+mapDataB)<=0x20000 bytes). + * @note -See VDP2::Switchmode documentation for limits on rotation modes for A and B under various conditions. */ inline static void LoadTilemap(SRL::Tilemap::ITilemap& tilemapA,SRL::Tilemap::ITilemap& tilemapB, VDP2::RotationMode modeA,VDP2::RotationMode modeB, bool LoadPalette = true) { @@ -1531,12 +1545,12 @@ namespace SRL LoadTilemapB(tilemapB); } - /** @brief Sets How screen regions outside the tilemap area are displayed by a rotation parameter - * @param param The Rotation parameter that will be set(primary or secondary) + /** @brief Sets How screen regions outside the tilemap area are displayed by the rotation parameters + * @param param The Tilemap/Rotation Parameter that is being set(primary or secondary) * @param mode the display mode to select - * @param tileIndex (Optional)The tile index to display in exterior regions if RepeatTile is - * selected as mode (defaults to tile 0) - * @note see OverPattern documentatioin for descriptions of available modes + * @param tileIndex (Optional) The tile index to display in exterior regions if RepeatTile is + * selected as mode (defaults to tile 0 if not specified) + * @note See OverPattern documentatioin for descriptions of available modes */ inline static void SetOverDisplay(VDP2::RotationParameter param, VDP2::OverPattern mode, uint16_t tileIndex = 0) { @@ -1552,29 +1566,31 @@ namespace SRL } } - /** @brief Sets Condition for displaying Primary and Secondary parameters/Tilemaps on screen. + /** @brief Sets the condition for switching between display of Primary and Secondary parameters/Tilemaps on screen. * @param mode the display mode to select - * @note See SwitchMode documentation for description of available modes - * @note If a mode is selected that displays Secondary Parameter (RB) but no - * tilemap has previously been loaded to display on it, RB will use the same - * source tilemap as primary parameter (RA) + * @note See VDP2::SwitchMode documentation for description of available modes + * @note If a mode is selected that includes display of Secondary Parameter (RB) when no + * secondary tilemap has been loaded, it will use the same + * source tilemap as the primary parameter. */ - inline static void SetParameterDisplay(SwitchMode mode) + inline static void SetParameterMode(SwitchMode mode) { slRparaMode((uint16_t)mode); } - /** @brief Select what type of rotation to use for the rotating scroll (Call before Loading RBG0) + /** @brief Select what type of rotation to use for the rotating scroll. + * @details This initializes both Primary and Secondary parameters to the same mode. + * Use the overload to initialize separate modes for each. * @param mode The RotationMode to use for RBG0 - * @param vblank (Optional) update VRAM at VBLANK to reduce amount of coefficient - * data required for rotation (default = true) - * @note when 2 or 3 axis rotation is selected, VRAM will be allocated to store - * necessary scaling coefficients. If Vblank is set false, all coefficients will be - * statically stored in VRAM as a 0x18000 byte table. If Vblank is set true, select - * coefficients for the perspective of the current frame will be dynamically - * sent to VRAM during Vblank, reducing VRAM footprint to 0x2000 bytes per - * rotation parameter but increasing required Vblank overhead. If the transfer can - * not complete within Vblank window, screen tearing may be visible in the plane. + * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of stored coefficient + * data required (default = true). + * When 2 or 3 axis rotation is selected, VRAM is allocated to store the + * required scaling coefficients. If vblank is set false, all possible coefficients will be + * statically stored in VRAM as a 0x18000 byte table. If vblank is set true, + * select coefficients for the next frame's perspective will be dynamically written + * to VRAM during Vblank, reducing the VRAM footprint to 0x2000 bytes per + * rotation parameter. If this transfer can not complete within the Vblank window + * screen tearing may be visible in the plane. */ inline static void SetRotationMode(VDP2::RotationMode mode, bool vblank = true) { @@ -1584,12 +1600,12 @@ namespace SRL { if(vblank==true) { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB =(void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); } else { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; slMakeKtable(VDP2::RBG0::KtableAddress); kflag = K_FIX; @@ -1617,18 +1633,18 @@ namespace SRL } /** @brief Overload to select separate rotation modes for both the primary and secondary - * rotating planes - * @param modeA The RotationMode to use for primary rotation - * @param modeB The RotationMode to use for secondary rotation - * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of coefficient - * data required for rotation of a plane (default = true) - * @note when 2 or 3 axis rotation is selected, VRAM will be allocated to store - * necessary scaling coefficients. If Vblank is set false, all possible coefficients will be - * statically stored in VRAM as a 0x20000 byte table. If Vblank is set true, the - * the coefficients for the current frame will be dynamically written - * to VRAM at each Vblank, reducing VRAM footprint to 0x2000 bytes per - * rotation parameter but increasing required Vblank overhead. If the transfer can - * not complete within the Vblank window, screen tearing may be visible in the plane. + * rotating planes. + * @param modeA The RotationMode to use for primary tilemap + * @param modeB The RotationMode to use for secondary tilemap + * @param vblank (Optional) Chose to update VRAM at VBLANK to reduce amount of stored coefficient + * data required (default = true). + * When 2 or 3 axis rotation is selected, VRAM is allocated to store the + * required scaling coefficients. If vblank is set false, all possible coefficients will be + * statically stored in VRAM as a 0x18000 byte table. If vblank is set true, + * select coefficients for the next frame's perspective will be dynamically written + * to VRAM during Vblank, reducing the VRAM footprint to 0x2000 bytes per + * rotation parameter. If this transfer can not complete within the Vblank window + * screen tearing may be visible in the plane. */ inline static void SetRotationMode(VDP2::RotationMode modeA, VDP2::RotationMode modeB, bool vblank = true) { @@ -1638,12 +1654,12 @@ namespace SRL { if(vblank==true) { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x4000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB = (void*)((uint32_t)VDP2::RBG0::KtableAddress+0x2000); } else { - VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B1, 0); + VDP2::RBG0::KtableAddress = VDP2::VRAM::Allocate(0x18000, 0x20000, VDP2::VramBank::B0, 0); VDP2::RBG0::KtableAddressB = VDP2::RBG0::KtableAddress; slMakeKtable(VDP2::RBG0::KtableAddress); kflag = K_FIX; @@ -1684,7 +1700,7 @@ namespace SRL /** @brief Writes the current matrix transform to RBG0 rotation parameters * to update its perspective - * @param param selects which rotation parameter to write the matrix to (defaults to Primary) + * @param param selects which rotation parameter to write the matrix to (optional- defaults to Primary) */ inline static void SetCurrentTransform(VDP2::RotationParameter param = VDP2::RotationParameter::Primary) { @@ -1708,15 +1724,15 @@ namespace SRL sl1MapRB(b); } - /** @brief Sets the planes of Tilemap Data to be displayed with 16 planes - * @details Unlike NBG scrolls RBG0 only loads with the default of 1 plane. Use this - * function after loading to set the arrangement of multi plane tilemaps within a 4x4 grid: + /** @brief Sets the layout of Tilemaps comprised of multiple planes from a 4x4 grid of plane indices + * @details Unlike NBG scrolls RBG0 only loads with the default repetition of 1 plane of tilemap data. Use this + * function after loading to set the layout planes of larger multi-plane tilemaps within a 4x4 grid: * |a,b,c,d| * |e,f,g,h| * |i,j,k,l| * |m,n,o,p| * @param layout 4x4 array of uint8_t indices representing the index of each plane in the map data - * (index 0 = base address of the map data, increment by 1 per plane unit of map data stored) + * (index 0 = first plane of the map data, increments by 1 per plane of map data stored) * @param param The Rotation parameter whose map is being set: primary or secondary (defaults to primary) * @note No check is performed to ensure the indecies entered are within the bounds of * the scroll's map data. Specifying indices larger than the number of planes loaded @@ -1772,7 +1788,7 @@ namespace SRL Bank7 = scnSPR7, }; - /** @brief Interface to control VDP2 settings for the Sprite Layer (data read from VDP1 framebuffer), + /** @brief Interface to control VDP2 settings for the Sprite Layer (data from the VDP1 framebuffer), * such as Display priority and VDP2 color calculation) */ class SpriteLayer @@ -1799,7 +1815,7 @@ namespace SRL * one of the 32 color calculation ratios that the system can use (value is floored to the nearest ratio). * It then sets the ratio in the specified sprite cc register (cc register 0 if not specified) * @note -Color ratios only apply to highest priority pixels in frame - * @note -When Color Calc is ON, max opacity is ~(0.97). Fully opaque sprites must select with color condition + * @note -When Color Calc is ON, max opacity is ~(0.97). Fully opaque sprites must be excluded by the color condition. * @note -When ColorCalcMode is set to UseColorAddition, The Opacity levels are ignored * and Color addition is applied to all sprites whose priority meets the color condition (see SpriteLayer::SetColorCondition() for details) * @note -RGB sprites always use the opacity set in CC register[bank0] @@ -1839,7 +1855,7 @@ namespace SRL * @details Sets up a condition that allows only select sprites to receive Half Transparent * color calculation with VDP2 layers. To make a sprite fully opaque, selectively turn color calculation off for it by * assigning it to use a Priority Bank containing a layer that does not satisfy the chosen Color Condition. - * The default VDP2 initialization uses ColorCondition::PriorityEquals Priority::Layer4, + * The default VDP2 initialization uses [ColorCondition::PriorityEquals] [Priority::Layer4], * with Priority Bank0 set to Layer3 and Priority Bank1 set to Layer4. With this config RGB sprites receive no VDP2 * color calculation, while Palette sprites only receive color calculation when they select priority from Bank1 * @param Condition The type of condition that VDP2 Color Calculation will follow. @@ -1928,7 +1944,7 @@ namespace SRL VDP2_RAMCTL &= 0xff00; //Clear MapBank Flags: VDP2::VRAM::MapBankA0 = VDP2::VRAM::MapBankB0 = false; - //leave cylces reserved for ASCII + //keep 2 cycle slots reserved for ASCII VDP2::VRAM::bankCycles[3] = 2; } @@ -1993,10 +2009,10 @@ namespace SRL } /** @brief Data structure of a VDP2 color offset to be set in Offset A or Offset B - * @details The offset data that will be set is a signed 9 bit value per color channel. + * @details The offset data is a signed 9 bit value per color channel. * The valid range of inputs is -255 to +255. The sign determines whether the color offset - * is additive or subtractive. Values outside the range will be clamped on initialization. - * See SetColorOffsetA and SetColorOffsetB for more details. + * is additive or subtractive on that channel. Values outside the range will be clamped on initialization. + * See SetColorOffsetA and SetColorOffsetB for more details on setting up a VDP2 color offset. */ struct ColorOffset { @@ -2103,7 +2119,7 @@ namespace SRL slColOffsetB(offset.Red, offset.Green, offset.Blue); } - /** @brief Basic Options for behavior of VDP2 Half Transparent Color Calculation + /** @brief Options for behavior of VDP2 Half Transparent Color Calculation */ enum class ColorCalcMode : uint16_t { @@ -2120,7 +2136,7 @@ namespace SRL UseColorAddition = 0x100, }; - /** @brief Sets VDP2 Half Transparent Color Calculation Mode (only one mode can be used at once) + /** @brief Sets VDP2 Half Transparent Color Calculation Mode (only one mode can be used at a time) * @param mode The VDP2 color calculation mode to use * @param extend Designates whether to extend color calculation to the top 3 Layer Priories instead of just top 2 * @note Extended color calculation has many restrictions detailed in VDP2 users manual- not all color modes can support