From ceb2be7214ebf1d23d008615cb466038ffff2474 Mon Sep 17 00:00:00 2001 From: wgroeneveld Date: Sun, 5 Aug 2018 13:35:38 +0200 Subject: [PATCH] combining palettes for bulk manipulation --- src/CMakeLists.txt | 2 +- src/engine/Scene.cpp | 2 +- src/engine/Scene.h | 6 ++--- src/engine/background/text_stream.cpp | 2 +- src/engine/background/text_stream.h | 2 +- src/engine/effects/fade_out_scene.cpp | 20 +++++++++----- src/engine/effects/fade_out_scene.h | 3 ++- src/engine/palette/combined_palette.cpp | 28 ++++++++++++++++++++ src/engine/palette/combined_palette.h | 25 +++++++++++++++++ src/engine/{ => palette}/palette_manager.cpp | 14 +++++++--- src/engine/{ => palette}/palette_manager.h | 7 +++++ src/main.cpp | 4 +-- test/CMakeLists.txt | 2 +- test/palettetest.cpp | 2 +- 14 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 src/engine/palette/combined_palette.cpp create mode 100644 src/engine/palette/combined_palette.h rename src/engine/{ => palette}/palette_manager.cpp (74%) rename src/engine/{ => palette}/palette_manager.h (88%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e33e19a..cdbbae9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,7 +2,7 @@ SET(CMAKE_C_COMPILER arm-none-eabi-gcc) SET(CMAKE_CXX_COMPILER arm-none-eabi-g++) set_property(SOURCE engine/gba/sin_lut.s PROPERTY LANGUAGE C) -add_executable(${PROJECT_NAME}.elf main.cpp engine/sprites/sprite_manager.cpp engine/sprites/sprite_manager.h engine/gba/tonc_memmap.h engine/gba/tonc_core.h engine/gba/tonc_memdef.h engine/gba/tonc_types.h engine/sprites/sprite.cpp engine/sprites/sprite.h kul.h engine/palette_manager.cpp engine/palette_manager.h engine/allocator.cpp engine/allocator.h engine/gba/tonc_oam.h engine/gba/tonc_math.h engine/gba/sin_lut.s engine/Scene.cpp engine/Scene.h engine/sprites/sprite_builder.cpp engine/sprites/sprite_builder.h engine/sprites/affine_sprite.cpp engine/sprites/affine_sprite.h flying_stuff_scene.cpp flying_stuff_scene.h engine/gba_engine.cpp engine/gba_engine.h engine/background/text_stream.cpp engine/background/text_stream.h engine/background/background.cpp engine/background/background.h engine/background/text.h sample_start_scene.cpp sample_start_scene.h engine/sprites/animated_sprite.cpp engine/sprites/animated_sprite.h engine/effects/fade_out_scene.cpp engine/effects/fade_out_scene.h engine/gba/tonc_core_stub.h engine/effects/scene_effect.h) +add_executable(${PROJECT_NAME}.elf main.cpp engine/sprites/sprite_manager.cpp engine/sprites/sprite_manager.h engine/gba/tonc_memmap.h engine/gba/tonc_core.h engine/gba/tonc_memdef.h engine/gba/tonc_types.h engine/sprites/sprite.cpp engine/sprites/sprite.h kul.h engine/palette/palette_manager.cpp engine/palette/palette_manager.h engine/palette/combined_palette.cpp engine/palette/combined_palette.h engine/allocator.cpp engine/allocator.h engine/gba/tonc_oam.h engine/gba/tonc_math.h engine/gba/sin_lut.s engine/Scene.cpp engine/Scene.h engine/sprites/sprite_builder.cpp engine/sprites/sprite_builder.h engine/sprites/affine_sprite.cpp engine/sprites/affine_sprite.h flying_stuff_scene.cpp flying_stuff_scene.h engine/gba_engine.cpp engine/gba_engine.h engine/background/text_stream.cpp engine/background/text_stream.h engine/background/background.cpp engine/background/background.h engine/background/text.h sample_start_scene.cpp sample_start_scene.h engine/sprites/animated_sprite.cpp engine/sprites/animated_sprite.h engine/effects/fade_out_scene.cpp engine/effects/fade_out_scene.h engine/gba/tonc_core_stub.h engine/effects/scene_effect.h) add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -v -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.gba diff --git a/src/engine/Scene.cpp b/src/engine/Scene.cpp index 9b4fc48..2bfa944 100644 --- a/src/engine/Scene.cpp +++ b/src/engine/Scene.cpp @@ -6,6 +6,6 @@ #include -void Scene::setEngineForSceneSwitching(GBAEngine *engine) { +void Scene::setEngineForSceneSwitching(std::shared_ptr engine) { this->engine = engine; } \ No newline at end of file diff --git a/src/engine/Scene.h b/src/engine/Scene.h index db009b5..73fdf86 100644 --- a/src/engine/Scene.h +++ b/src/engine/Scene.h @@ -9,7 +9,7 @@ #include #include #include "engine/sprites/sprite.h" -#include "palette_manager.h" +#include "engine/palette/palette_manager.h" class GBAEngine; @@ -17,7 +17,7 @@ class Scene { protected: std::unique_ptr foregroundPalette; std::unique_ptr backgroundPalette; - GBAEngine* engine; + std::shared_ptr engine; public: ForegroundPaletteManager* getForegroundPalette() { return foregroundPalette.get(); } @@ -28,7 +28,7 @@ public: virtual void load() = 0; virtual void tick(u16 i) = 0; - void setEngineForSceneSwitching(GBAEngine* engine); + void setEngineForSceneSwitching(std::shared_ptr engine); Scene() { } ~Scene() { diff --git a/src/engine/background/text_stream.cpp b/src/engine/background/text_stream.cpp index 94305f1..d9828a3 100644 --- a/src/engine/background/text_stream.cpp +++ b/src/engine/background/text_stream.cpp @@ -3,7 +3,7 @@ // #include -#include +#include #include "text_stream.h" #include diff --git a/src/engine/background/text_stream.h b/src/engine/background/text_stream.h index 49aae6c..16a25c8 100644 --- a/src/engine/background/text_stream.h +++ b/src/engine/background/text_stream.h @@ -10,7 +10,7 @@ #include #include -#include +#include #define CHAR_OFFSET_INDEX 32 #define TILE_WIDTH 32 diff --git a/src/engine/effects/fade_out_scene.cpp b/src/engine/effects/fade_out_scene.cpp index b07ebcd..327120a 100644 --- a/src/engine/effects/fade_out_scene.cpp +++ b/src/engine/effects/fade_out_scene.cpp @@ -4,16 +4,22 @@ #include "fade_out_scene.h" +FadeOutScene::FadeOutScene(int speed) : timesUpdated(0), speed(speed) { +} void FadeOutScene::update() { - sceneToAffect->getForegroundPalette()->increaseBrightness(speed); + if(!this->palette.get()) { + auto bgPalette = sceneToAffect->getBackgroundPalette(); + if(!bgPalette) { + BackgroundPaletteManager defaultBg({}); + bgPalette = &defaultBg; + } + + auto combined = (*sceneToAffect->getForegroundPalette() + *bgPalette); + this->palette = std::unique_ptr(combined); - auto bgPalette = sceneToAffect->getBackgroundPalette(); - if(bgPalette) { - bgPalette->increaseBrightness(speed); - } else { - BackgroundPaletteManager defaultBg({}); - defaultBg.increaseBrightness(speed); } + + this->palette.get()->increaseBrightness(speed); timesUpdated++; } \ No newline at end of file diff --git a/src/engine/effects/fade_out_scene.h b/src/engine/effects/fade_out_scene.h index bb77171..299fb91 100644 --- a/src/engine/effects/fade_out_scene.h +++ b/src/engine/effects/fade_out_scene.h @@ -13,9 +13,10 @@ class FadeOutScene : public SceneEffect { private: int timesUpdated; int speed; + std::unique_ptr palette; public: - FadeOutScene(int speed) : timesUpdated(0), speed(speed) {} + FadeOutScene(int speed); void update() override; bool isDone() override { return timesUpdated >= (32 / speed); } diff --git a/src/engine/palette/combined_palette.cpp b/src/engine/palette/combined_palette.cpp new file mode 100644 index 0000000..bc6d2f3 --- /dev/null +++ b/src/engine/palette/combined_palette.cpp @@ -0,0 +1,28 @@ +// +// Created by Wouter Groeneveld on 05/08/18. +// + + +#include +#include "palette_manager.h" + +void CombinedPalette::increaseBrightness(PaletteManager& palette, int bank, int index, u32 intensity) { + auto current = palette.get(bank, index); + auto next = PaletteManager::modify(current, intensity); + + palette.change(bank, index, next); +} + +void CombinedPalette::increaseBrightness(u32 intensity) { + if(intensity > 31) { + failure(Brightness_Intensity_Too_High); + return; + } + + for(int bank = 0; bank < PALETTE_BANK_SIZE; bank++) { + for(int index = 0; index < PALETTE_BANK_SIZE; index++) { + increaseBrightness(palette1, bank, index, intensity); + increaseBrightness(palette2, bank, index, intensity); + } + } +} \ No newline at end of file diff --git a/src/engine/palette/combined_palette.h b/src/engine/palette/combined_palette.h new file mode 100644 index 0000000..79709dc --- /dev/null +++ b/src/engine/palette/combined_palette.h @@ -0,0 +1,25 @@ +// +// Created by Wouter Groeneveld on 05/08/18. +// + +#ifndef GBA_SPRITE_ENGINE_COMBINED_PALETTE_H +#define GBA_SPRITE_ENGINE_COMBINED_PALETTE_H + +class PaletteManager; + +class CombinedPalette { +private: + // WHY use references here? lifetimes not bound, not owned by CombinedPalette + PaletteManager& palette1; + PaletteManager& palette2; + + void increaseBrightness(PaletteManager& palette, int bank, int index, u32 intensity); +public: + CombinedPalette(PaletteManager& one, PaletteManager& two) : palette1(one), palette2(two) {} + CombinedPalette(const CombinedPalette& other) = delete; + + void increaseBrightness(u32 intensity); +}; + + +#endif //GBA_SPRITE_ENGINE_COMBINED_PALETTE_H diff --git a/src/engine/palette_manager.cpp b/src/engine/palette/palette_manager.cpp similarity index 74% rename from src/engine/palette_manager.cpp rename to src/engine/palette/palette_manager.cpp index 5cc60e9..8c3ab9e 100644 --- a/src/engine/palette_manager.cpp +++ b/src/engine/palette/palette_manager.cpp @@ -14,6 +14,10 @@ int getBits(int number, int k, int p) { return (((1 << k) - 1) & (number >> p)); } +CombinedPalette* PaletteManager::operator+(const PaletteManager &other) { + return new CombinedPalette(*this, const_cast(other)); +} + void PaletteManager::persist() { dma3_cpy(this->paletteAddress(), this->data, this->size); } @@ -44,6 +48,11 @@ u32 PaletteManager::blue(COLOR r) { return getBits(r, 5, 10); } +COLOR PaletteManager::modify(COLOR color, u32 intensity) { + return PaletteManager::color(PaletteManager::red(color) + intensity, + PaletteManager::green(color) + intensity, PaletteManager::blue(color) + intensity); +} + void PaletteManager::increaseBrightness(u32 intensity) { if(intensity > 31) { failure(Brightness_Intensity_Too_High); @@ -53,9 +62,8 @@ void PaletteManager::increaseBrightness(u32 intensity) { auto palBank = this->paletteBank(); for(int bank = 0; bank < PALETTE_BANK_SIZE; bank++) { for(int index = 0; index < PALETTE_BANK_SIZE; index++) { - auto current = palBank[bank][index]; - auto next = PaletteManager::color(PaletteManager::red(current) + intensity, - PaletteManager::green(current) + intensity, PaletteManager::blue(current) + intensity); + auto current = get(bank, index); + auto next = PaletteManager::modify(current, intensity); change(bank, index, next); } diff --git a/src/engine/palette_manager.h b/src/engine/palette/palette_manager.h similarity index 88% rename from src/engine/palette_manager.h rename to src/engine/palette/palette_manager.h index 7fbe541..6d5040d 100644 --- a/src/engine/palette_manager.h +++ b/src/engine/palette/palette_manager.h @@ -7,12 +7,15 @@ #include #include +#include "combined_palette.h" #define PALETTE_BANK_SIZE 16 #define PALETTE_MAX_SIZE 256 int getBits(int number, int k, int p); +class CombinedPalette; + class PaletteManager { protected: const u16 *data; @@ -24,11 +27,15 @@ public: PaletteManager(const u16 paletteData[]) : data(paletteData), size(PALETTE_MAX_SIZE) {} PaletteManager(const u16 paletteData[], int size) : data(paletteData), size(size) {} + CombinedPalette* operator+(const PaletteManager& other); + void persist(); void persistToBank(int bank); COLOR change(int bank, int index, COLOR newColor); + COLOR get(int bank, int index) { return paletteBank()[bank][index]; } void increaseBrightness(u32 intensity); + static COLOR modify(COLOR color, u32 intensity); static COLOR color(u32 r, u32 g, u32 b); static u32 red(COLOR r); static u32 green(COLOR r); diff --git a/src/main.cpp b/src/main.cpp index 5e729fd..1e853dd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include "kul.h" @@ -15,7 +15,7 @@ * assumes 8bpp sprites */ int main() { - GBAEngine* engine = new GBAEngine(); + std::shared_ptr engine(new GBAEngine()); SampleStartScene* startScene = new SampleStartScene(); startScene->setEngineForSceneSwitching(engine); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 994330e..6996651 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,5 +11,5 @@ add_definitions(-DCODE_COMPILED_AS_PART_OF_TEST) include_directories(${GTEST_LIBRARY}/include) -add_executable(unittest maintest.cpp gbatest.cpp spritetest.cpp ../src/engine/background/background.cpp ../src/engine/background/text_stream.cpp ../src/engine/palette_manager.cpp ../src/engine/sprites/sprite.cpp ../src/engine/allocator.cpp scenetest.cpp allocatortest.cpp palettetest.cpp) +add_executable(unittest maintest.cpp gbatest.cpp spritetest.cpp ../src/engine/background/background.cpp ../src/engine/background/text_stream.cpp ../src/engine/palette/palette_manager.cpp ../src/engine/sprites/sprite.cpp ../src/engine/allocator.cpp scenetest.cpp allocatortest.cpp palettetest.cpp ../src/engine/palette/combined_palette.cpp ../src/engine/palette/combined_palette.h) target_link_libraries(unittest ${GTEST_LIBRARY}/build/libgtest.a ${GTEST_LIBRARY}/build/libgtest_main.a) diff --git a/test/palettetest.cpp b/test/palettetest.cpp index 7f37cd6..3ac85d8 100644 --- a/test/palettetest.cpp +++ b/test/palettetest.cpp @@ -2,7 +2,7 @@ // Created by Wouter Groeneveld on 04/08/18. // -#include +#include #include "gtest/gtest.h" class SomePaletteManager : public PaletteManager {