From b469bc53086ee45603da839cd74d4c9bd7f1d81c Mon Sep 17 00:00:00 2001 From: Souryo Date: Tue, 15 Aug 2017 20:25:25 -0400 Subject: [PATCH] HD Packs: Added built-in conditions (hmirror, vmirror, bgpriority) --- Core/HdData.h | 18 +++++++++++++++--- Core/HdNesPack.cpp | 20 ++++++++++---------- Core/HdNesPack.h | 2 +- Core/HdPackLoader.cpp | 20 ++++++++++++++++++++ Core/HdPackLoader.h | 2 ++ 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/Core/HdData.h b/Core/HdData.h index 87e064cf..20f7777a 100644 --- a/Core/HdData.h +++ b/Core/HdData.h @@ -109,6 +109,9 @@ enum class HdPackConditionType SpriteAtPosition, TileNearby, SpriteNearby, + HorizontalMirroring, + VerticalMirroring, + BackgroundPriority, }; struct HdPackCondition @@ -121,9 +124,18 @@ struct HdPackCondition int32_t TileIndex; uint8_t TileData[16]; - bool CheckCondition(HdPpuPixelInfo *screenTiles, int x, int y) + bool CheckCondition(HdPpuPixelInfo *screenTiles, int x, int y, HdPpuTileInfo* tile) { switch(Type) { + case HdPackConditionType::HorizontalMirroring: + return tile && tile->HorizontalMirroring; + + case HdPackConditionType::VerticalMirroring: + return tile && tile->VerticalMirroring; + + case HdPackConditionType::BackgroundPriority: + return tile && tile->BackgroundPriority; + case HdPackConditionType::TileAtPosition: case HdPackConditionType::SpriteAtPosition: { int pixelIndex = (TileY << 8) + TileX; @@ -233,10 +245,10 @@ struct HdPackTileInfo : public HdTileKey vector Conditions; - bool MatchesCondition(HdPpuPixelInfo *screenTiles, int x, int y) + bool MatchesCondition(HdPpuPixelInfo *screenTiles, int x, int y, HdPpuTileInfo* tile) { for(HdPackCondition* condition : Conditions) { - if(!condition->CheckCondition(screenTiles, x, y)) { + if(!condition->CheckCondition(screenTiles, x, y, tile)) { return false; } } diff --git a/Core/HdNesPack.cpp b/Core/HdNesPack.cpp index 1b5ed114..fa7cc134 100644 --- a/Core/HdNesPack.cpp +++ b/Core/HdNesPack.cpp @@ -143,7 +143,7 @@ void HdNesPack::OnBeforeApplyFilter(HdPpuPixelInfo *screenTiles) for(size_t i = 0; i < hdData->Backgrounds.size(); i++) { bool isMatch = true; for(HdPackCondition* condition : hdData->Backgrounds[i].Conditions) { - if(!condition->CheckCondition(screenTiles, 0, 0)) { + if(!condition->CheckCondition(screenTiles, 0, 0, nullptr)) { isMatch = false; break; } @@ -156,18 +156,18 @@ void HdNesPack::OnBeforeApplyFilter(HdPpuPixelInfo *screenTiles) } } -HdPackTileInfo * HdNesPack::GetMatchingTile(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y, HdTileKey &key) +HdPackTileInfo * HdNesPack::GetMatchingTile(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y, HdPpuTileInfo* tile) { HdPackData *hdData = Console::GetHdData(); - auto hdTile = hdData->TileByKey.find(key); + auto hdTile = hdData->TileByKey.find(*tile); if(hdTile == hdData->TileByKey.end()) { - hdTile = hdData->TileByKey.find(key.GetKey(true)); + hdTile = hdData->TileByKey.find(tile->GetKey(true)); } if(hdTile != hdData->TileByKey.end()) { - for(HdPackTileInfo* tile : hdTile->second) { - if(tile->MatchesCondition(screenTiles, x, y)) { - return tile; + for(HdPackTileInfo* hdTile : hdTile->second) { + if(hdTile->MatchesCondition(screenTiles, x, y, tile)) { + return hdTile; } } } @@ -230,7 +230,7 @@ void HdNesPack::GetPixels(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y, H bool hasSprite = pixelInfo.SpriteCount > 0; if(pixelInfo.Tile.TileIndex != HdPpuTileInfo::NoTile) { - hdPackTileInfo = GetMatchingTile(screenTiles, x, y, pixelInfo.Tile); + hdPackTileInfo = GetMatchingTile(screenTiles, x, y, &pixelInfo.Tile); } bool hasBgSprite = false; @@ -244,7 +244,7 @@ void HdNesPack::GetPixels(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y, H hasBgSprite = true; lowestBgSprite = k; - hdPackSpriteInfo = GetMatchingTile(screenTiles, x, y, pixelInfo.Sprite[k]); + hdPackSpriteInfo = GetMatchingTile(screenTiles, x, y, &pixelInfo.Sprite[k]); if(hdPackSpriteInfo) { DrawTile(pixelInfo.Sprite[k], *hdPackSpriteInfo, outputBuffer, screenWidth); } else if(pixelInfo.Sprite[k].SpriteColorIndex != 0) { @@ -275,7 +275,7 @@ void HdNesPack::GetPixels(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y, H if(hasSprite) { for(int k = pixelInfo.SpriteCount - 1; k >= 0; k--) { if(!pixelInfo.Sprite[k].BackgroundPriority && lowestBgSprite > k) { - hdPackSpriteInfo = GetMatchingTile(screenTiles, x, y, pixelInfo.Sprite[k]); + hdPackSpriteInfo = GetMatchingTile(screenTiles, x, y, &pixelInfo.Sprite[k]); if(hdPackSpriteInfo) { DrawTile(pixelInfo.Sprite[k], *hdPackSpriteInfo, outputBuffer, screenWidth); } else if(pixelInfo.Sprite[k].SpriteColorIndex != 0) { diff --git a/Core/HdNesPack.h b/Core/HdNesPack.h index dfb9d64d..88766aa4 100644 --- a/Core/HdNesPack.h +++ b/Core/HdNesPack.h @@ -12,7 +12,7 @@ private: __forceinline uint32_t AdjustBrightness(uint8_t input[4], uint16_t brightness); __forceinline void DrawColor(uint32_t color, uint32_t* outputBuffer, uint32_t scale, uint32_t screenWidth); __forceinline void DrawTile(HdPpuTileInfo &tileInfo, HdPackTileInfo &hdPackTileInfo, uint32_t* outputBuffer, uint32_t screenWidth); - __forceinline HdPackTileInfo* GetMatchingTile(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y, HdTileKey& key); + __forceinline HdPackTileInfo* GetMatchingTile(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y, HdPpuTileInfo* tile); __forceinline bool IsNextToSprite(HdPpuPixelInfo *screenTiles, uint32_t x, uint32_t y); __forceinline uint32_t GetCustomBackgroundPixel(int x, int y, int offsetX, int offsetY); diff --git a/Core/HdPackLoader.cpp b/Core/HdPackLoader.cpp index ac7535e0..5fcbf381 100644 --- a/Core/HdPackLoader.cpp +++ b/Core/HdPackLoader.cpp @@ -112,6 +112,8 @@ bool HdPackLoader::LoadPack() return false; } + InitializeGlobalConditions(); + for(string lineContent : StringUtilities::Split(string(hdDefinition.data(), hdDefinition.data() + hdDefinition.size()), '\n')) { lineContent = lineContent.substr(0, lineContent.length() - 1); @@ -178,6 +180,24 @@ bool HdPackLoader::ProcessImgTag(string src) } } +void HdPackLoader::InitializeGlobalConditions() +{ + HdPackCondition* hmirror = new HdPackCondition(); + hmirror->Name = "hmirror"; + hmirror->Type = HdPackConditionType::HorizontalMirroring; + _data->Conditions.push_back(unique_ptr(hmirror)); + + HdPackCondition* vmirror = new HdPackCondition(); + vmirror->Name = "vmirror"; + vmirror->Type = HdPackConditionType::VerticalMirroring; + _data->Conditions.push_back(unique_ptr(vmirror)); + + HdPackCondition* bgpriority = new HdPackCondition(); + bgpriority->Name = "bgpriority"; + bgpriority->Type = HdPackConditionType::BackgroundPriority; + _data->Conditions.push_back(unique_ptr(bgpriority)); +} + void HdPackLoader::ProcessOverscanTag(vector &tokens) { OverscanDimensions overscan; diff --git a/Core/HdPackLoader.h b/Core/HdPackLoader.h index 274d8b58..4316a1f9 100644 --- a/Core/HdPackLoader.h +++ b/Core/HdPackLoader.h @@ -27,6 +27,8 @@ private: void InitializeHdPack(); void LoadCustomPalette(); + void InitializeGlobalConditions(); + bool ProcessImgTag(string src); void ProcessPatchTag(vector &tokens); void ProcessOverscanTag(vector &tokens);