From 86c0ab74f10b17b986f5e70b5cdcdb8ef48fb68e Mon Sep 17 00:00:00 2001 From: Nicholas Date: Fri, 14 Apr 2023 12:52:42 -0400 Subject: [PATCH 01/16] Updated tyra install directions to include downloading assets --- docs/install/README.MD | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/install/README.MD b/docs/install/README.MD index f7b4646..e6decdb 100644 --- a/docs/install/README.MD +++ b/docs/install/README.MD @@ -17,9 +17,10 @@ docker pull h4570/tyra git clone https://github.com/h4570/tyra.git ``` -3. Open `VSCode` and open previously cloned directory. -4. In `VSCode` open `.vscode/configurations/windows-docker` and copy configuration files into `.vscode/` -5. In `c_cpp_properties.json` fix all `YOUR-INTELLISENSE-PATH` with path from point 2. -6. Click `CTRL+SHIFT+P`, type `Tasks: Run task` and run `Start docker container` - Repeat this step every time you want to start working with Tyra (every reboot) -7. Click `CTRL+SHIFT+P`, type `Tasks: Run build task` -8. Tyra should automatically compile engine, `demo` game and run `PCSX2`. If you want to compile & run tutorials, please change `buildDirectory` in `settings.json` to example `tutorials/01-hello` +3. Download the [assets.zip](https://github.com/h4570/tyra/releases) file and unzip it into the tyra directory +4. Open `VSCode` and open previously cloned directory. +5. In `VSCode` open `.vscode/configurations/windows-docker` and copy configuration files into `.vscode/` +6. In `c_cpp_properties.json` fix all `YOUR-INTELLISENSE-PATH` with path from point 2. +7. Click `CTRL+SHIFT+P`, type `Tasks: Run task` and run `Start docker container` - Repeat this step every time you want to start working with Tyra (every reboot) +8. Click `CTRL+SHIFT+P`, type `Tasks: Run build task` +9. Tyra should automatically compile engine, `demo` game and run `PCSX2`. If you want to compile & run tutorials, please change `buildDirectory` in `settings.json` to example `tutorials/01-hello` From fbcb38d37a3736b31b6f71783c92b2bb211c2d94 Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Fri, 26 May 2023 18:04:23 -0300 Subject: [PATCH 02/16] tutorial 10 --- tutorials/10-sprite-sheet/Makefile | 24 ++++ tutorials/10-sprite-sheet/bin/.gitignore | 4 + tutorials/10-sprite-sheet/inc/tutorial_10.hpp | 34 ++++++ tutorials/10-sprite-sheet/obj/.gitignore | 4 + tutorials/10-sprite-sheet/res/.gitignore | 4 + tutorials/10-sprite-sheet/run.ps1 | 4 + tutorials/10-sprite-sheet/src/main.cpp | 26 ++++ tutorials/10-sprite-sheet/src/tutorial_10.cpp | 112 ++++++++++++++++++ 8 files changed, 212 insertions(+) create mode 100644 tutorials/10-sprite-sheet/Makefile create mode 100644 tutorials/10-sprite-sheet/bin/.gitignore create mode 100644 tutorials/10-sprite-sheet/inc/tutorial_10.hpp create mode 100644 tutorials/10-sprite-sheet/obj/.gitignore create mode 100644 tutorials/10-sprite-sheet/res/.gitignore create mode 100644 tutorials/10-sprite-sheet/run.ps1 create mode 100644 tutorials/10-sprite-sheet/src/main.cpp create mode 100644 tutorials/10-sprite-sheet/src/tutorial_10.cpp diff --git a/tutorials/10-sprite-sheet/Makefile b/tutorials/10-sprite-sheet/Makefile new file mode 100644 index 0000000..e7d6385 --- /dev/null +++ b/tutorials/10-sprite-sheet/Makefile @@ -0,0 +1,24 @@ +TARGET := tutorial_10.elf +ENGINEDIR := ../../engine + +#The Directories, Source, Includes, Objects, Binary and Resources +SRCDIR := src +INCDIR := inc +BUILDDIR := obj +TARGETDIR := bin +RESDIR := res +SRCEXT := cpp +VSMEXT := vsm +VCLEXT := vcl +VCLPPEXT := vclpp +DEPEXT := d +OBJEXT := o + +#Flags, Libraries and Includes +CFLAGS := +LIB := +LIBDIRS := +INC := -I$(INCDIR) +INCDEP := -I$(INCDIR) + +include ../Makefile.tutorials-base \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/bin/.gitignore b/tutorials/10-sprite-sheet/bin/.gitignore new file mode 100644 index 0000000..44c5ea8 --- /dev/null +++ b/tutorials/10-sprite-sheet/bin/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/inc/tutorial_10.hpp b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp new file mode 100644 index 0000000..3f14763 --- /dev/null +++ b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp @@ -0,0 +1,34 @@ +/* +# _____ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022, tyra - https://github.com/h4570/tyra +# Licensed under Apache License 2.0 +# Sandro Sobczyński +*/ + +#pragma once + +#include + +namespace Tyra { + +class Tutorial10 : public Game { + public: + Tutorial10(Engine* engine); + ~Tutorial10(); + + void init(); + void loop(); + + private: + void loadTexture(); + void loadSprite(); + + Engine* engine; + + Sprite sprite; +}; + +} // namespace Tyra diff --git a/tutorials/10-sprite-sheet/obj/.gitignore b/tutorials/10-sprite-sheet/obj/.gitignore new file mode 100644 index 0000000..44c5ea8 --- /dev/null +++ b/tutorials/10-sprite-sheet/obj/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/res/.gitignore b/tutorials/10-sprite-sheet/res/.gitignore new file mode 100644 index 0000000..44c5ea8 --- /dev/null +++ b/tutorials/10-sprite-sheet/res/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/run.ps1 b/tutorials/10-sprite-sheet/run.ps1 new file mode 100644 index 0000000..74646cc --- /dev/null +++ b/tutorials/10-sprite-sheet/run.ps1 @@ -0,0 +1,4 @@ +$ConfigFile = Join-Path $PSScriptRoot '../../windows-pcsx2.ps1' +. $ConfigFile + +RunPCSX2 diff --git a/tutorials/10-sprite-sheet/src/main.cpp b/tutorials/10-sprite-sheet/src/main.cpp new file mode 100644 index 0000000..087f27c --- /dev/null +++ b/tutorials/10-sprite-sheet/src/main.cpp @@ -0,0 +1,26 @@ +/* +# _____ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022, tyra - https://github.com/h4570/tyra +# Licensed under Apache License 2.0 +# Sandro Sobczyński +*/ + +#include "engine.hpp" +#include "tutorial_10.hpp" + +/** + * In this tutorial we will learn how to: + * - Load png file and create texture from it + * - Create sprite class + * - Clear screen and render sprite + */ + +int main() { + Tyra::Engine engine; + Tyra::Tutorial10 game(&engine); + engine.run(&game); + return 0; +} diff --git a/tutorials/10-sprite-sheet/src/tutorial_10.cpp b/tutorials/10-sprite-sheet/src/tutorial_10.cpp new file mode 100644 index 0000000..09db4e6 --- /dev/null +++ b/tutorials/10-sprite-sheet/src/tutorial_10.cpp @@ -0,0 +1,112 @@ +/* +# _____ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022, tyra - https://github.com/h4570/tyra +# Licensed under Apache License 2.0 +# Sandro Sobczyński +*/ + +#include +#include "tutorial_10.hpp" + +namespace Tyra { + +Tutorial10::Tutorial10(Engine* t_engine) : engine(t_engine) {} + +Tutorial10::~Tutorial10() { + engine->renderer.getTextureRepository().freeBySprite(sprite); +} + +void Tutorial10::init() { + engine->renderer.setClearScreenColor(Color(32.0F, 32.0F, 32.0F)); + + /** Sprite contains rectangle information. */ + loadSprite(); + + /** Texture contains png image. */ + loadTexture(); +} + +void Tutorial10::loop() { + auto& renderer = engine->renderer; + + /** Begin frame will clear our screen. */ + renderer.beginFrame(); + + /** Render sprite. */ + renderer.renderer2D.render(sprite); + + /** End frame will perform vsync. */ + renderer.endFrame(); +} + +void Tutorial10::loadSprite() { + const auto& screenSettings = engine->renderer.core.getSettings(); + + sprite.mode = SpriteMode::MODE_STRETCH; + + /** Let's scale it down */ + sprite.size = Vec2(256.0F, 256.0F); + + /** Set it in screen center */ + sprite.position = + Vec2(screenSettings.getWidth() / 2.0F - sprite.size.x / 2.0F, + screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + + TYRA_LOG("Sprite created!"); +} + +void Tutorial10::loadTexture() { + /** + * Renderer has high layer functions, + * which allows to render: + * - Sprite (2D) + * - Mesh (3D) + * + * It uses ONLY low layer functions which are in renderer.core + */ + auto& renderer = engine->renderer; + + /** + * TextureRepository is a repository of textures. + * It is a singleton class, with all game textures. + * We are linking these textures with sprite's (2D) and mesh (3D) materials. + */ + auto& textureRepository = renderer.getTextureRepository(); + + /** + * Texture is stored in "res" directory. + * Content of "res" directory is automatically copied into + * "bin" directory, which contains our final game. + * + * File utils automatically add's device prefix to the path, + * based on current working directory. + * + * In PS2 world: + * - USB has a "mass:" prefix + * - Our PC in PS2Link has a "host:" prefix + * - Our PC in PCSX2 has a "host:" prefix + */ + auto filepath = FileUtils::fromCwd("atlas.png"); + + /** + * Tyra supports following PNG formats: + * 32bpp (RGBA) + * 24bpp (RGB) + * 8bpp, palletized (RGBA) + * 4bpp, palletized (RGBA) + * + * 8bpp and 4bpp are the fastest. + * All of these formats can be easily exported via GIMP. + */ + auto* texture = textureRepository.add(filepath); + + /** Let's assign this texture to sprite. */ + texture->addLink(sprite.id); + + TYRA_LOG("Texture loaded!"); +} + +} // namespace Tyra From 4f6e55c0b065121f95c192a85bf4172034a8056e Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Sun, 28 May 2023 13:47:48 -0300 Subject: [PATCH 03/16] new Tutorial tutorial with sprite offset, sprite sheet and texture filtering --- .../inc/renderer/core/2d/renderer_core_2d.hpp | 3 + engine/inc/renderer/core/2d/sprite/sprite.hpp | 2 +- .../src/renderer/core/2d/renderer_core_2d.cpp | 13 +- engine/src/renderer/core/2d/sprite/sprite.cpp | 1 + tutorials/10-sprite-sheet/inc/fontSprite.hpp | 34 ++++ tutorials/10-sprite-sheet/inc/tutorial_10.hpp | 9 + tutorials/10-sprite-sheet/src/fontSprite.cpp | 106 ++++++++++++ tutorials/10-sprite-sheet/src/main.cpp | 7 +- tutorials/10-sprite-sheet/src/tutorial_10.cpp | 162 +++++++++++++++++- 9 files changed, 321 insertions(+), 16 deletions(-) create mode 100644 tutorials/10-sprite-sheet/inc/fontSprite.hpp create mode 100644 tutorials/10-sprite-sheet/src/fontSprite.cpp diff --git a/engine/inc/renderer/core/2d/renderer_core_2d.hpp b/engine/inc/renderer/core/2d/renderer_core_2d.hpp index aaa1d4d..bbb35a8 100644 --- a/engine/inc/renderer/core/2d/renderer_core_2d.hpp +++ b/engine/inc/renderer/core/2d/renderer_core_2d.hpp @@ -13,6 +13,7 @@ #include "debug/debug.hpp" #include "renderer/core/2d/sprite/sprite.hpp" #include "renderer/core/texture/renderer_core_texture_buffers.hpp" +#include "renderer/3d/pipeline/shared/pipeline_texture_mapping_type.hpp" #include "renderer/core/texture/models/texture.hpp" #include "renderer/renderer_settings.hpp" #include @@ -30,6 +31,8 @@ class RendererCore2D { void render(const Sprite& sprite, const RendererCoreTextureBuffers& texBuffers, Texture* texture); + void setTextureMappingType(const PipelineTextureMappingType textureMappingType); + private: void setPrim(); void setLod(); diff --git a/engine/inc/renderer/core/2d/sprite/sprite.hpp b/engine/inc/renderer/core/2d/sprite/sprite.hpp index 6580a2d..439a5c2 100644 --- a/engine/inc/renderer/core/2d/sprite/sprite.hpp +++ b/engine/inc/renderer/core/2d/sprite/sprite.hpp @@ -24,7 +24,7 @@ class Sprite { ~Sprite(); u32 id; - Vec2 position, size; + Vec2 position, size, offset; float scale; Color color; SpriteMode mode; diff --git a/engine/src/renderer/core/2d/renderer_core_2d.cpp b/engine/src/renderer/core/2d/renderer_core_2d.cpp index 3f4f397..0b83faa 100644 --- a/engine/src/renderer/core/2d/renderer_core_2d.cpp +++ b/engine/src/renderer/core/2d/renderer_core_2d.cpp @@ -84,10 +84,10 @@ void RendererCore2D::render(const Sprite& sprite, else if (sizeY > sizeX) texS = texMax / (sizeY / sizeX); - rect->t0.s = sprite.flipHorizontal ? texS : 0.0F; - rect->t0.t = sprite.flipVertical ? texT : 0.0F; - rect->t1.s = sprite.flipHorizontal ? 0.0F : texS; - rect->t1.t = sprite.flipVertical ? 0.0F : texT; + rect->t0.s = sprite.flipHorizontal ? (texS+sprite.offset.x) : sprite.offset.x; + rect->t0.t = sprite.flipVertical ? (texT+sprite.offset.y) : sprite.offset.y; + rect->t1.s = sprite.flipHorizontal ? sprite.offset.x : (texS+sprite.offset.x); + rect->t1.t = sprite.flipVertical ? sprite.offset.y : (texT+sprite.offset.y); rect->color.r = sprite.color.r; rect->color.g = sprite.color.g; @@ -131,4 +131,9 @@ void RendererCore2D::render(const Sprite& sprite, context = !context; } +void RendererCore2D::setTextureMappingType(const PipelineTextureMappingType textureMappingType){ + lod.mag_filter = textureMappingType; + lod.min_filter = textureMappingType; +} + } // namespace Tyra diff --git a/engine/src/renderer/core/2d/sprite/sprite.cpp b/engine/src/renderer/core/2d/sprite/sprite.cpp index 59a0e86..821a9f2 100644 --- a/engine/src/renderer/core/2d/sprite/sprite.cpp +++ b/engine/src/renderer/core/2d/sprite/sprite.cpp @@ -18,6 +18,7 @@ Sprite::Sprite() { flipVertical = false; size.set(32.0F, 32.0F); position.set(100.0F, 100.0F); + offset.set(0.0F,0.0F); scale = 1.0F; mode = MODE_REPEAT; setDefaultColor(); diff --git a/tutorials/10-sprite-sheet/inc/fontSprite.hpp b/tutorials/10-sprite-sheet/inc/fontSprite.hpp new file mode 100644 index 0000000..3d089e3 --- /dev/null +++ b/tutorials/10-sprite-sheet/inc/fontSprite.hpp @@ -0,0 +1,34 @@ +/* +# _____ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022, tyra - https://github.com/h4570/tyra +# Licensed under Apache License 2.0 +# Sandro Sobczyński +*/ + +#pragma once + +#include + +namespace Tyra{ + +extern const int charSize; +extern const int font_char[96]; +extern const int font_charWidth[96]; + +class Font{ + public: + Font(); + void LoadFont(TextureRepository& repository, Renderer2D* renderer); + void FreeFont(TextureRepository& repository); + void DrawText(const char* text, int x, int y, Color color); + void DrawText(const std::string& text, int x, int y, Color color); + private: + Renderer2D* renderer2D; + Sprite all_font; + std::array font; +}; + +} // namespace Tyra \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/inc/tutorial_10.hpp b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp index 3f14763..f0e0779 100644 --- a/tutorials/10-sprite-sheet/inc/tutorial_10.hpp +++ b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp @@ -11,6 +11,7 @@ #pragma once #include +#include "fontSprite.hpp" namespace Tyra { @@ -27,8 +28,16 @@ class Tutorial10 : public Game { void loadSprite(); Engine* engine; + Pad* pad; + Font font; Sprite sprite; + Sprite spriteFlip; + Sprite spriteScale; + Sprite spriteStrech; + std::string str_filter; + + PipelineTextureMappingType textureFilter; }; } // namespace Tyra diff --git a/tutorials/10-sprite-sheet/src/fontSprite.cpp b/tutorials/10-sprite-sheet/src/fontSprite.cpp new file mode 100644 index 0000000..38f842e --- /dev/null +++ b/tutorials/10-sprite-sheet/src/fontSprite.cpp @@ -0,0 +1,106 @@ +#include "fontSprite.hpp" + +namespace Tyra{ + +const int charSize = 96; + +const int font_char[charSize]{ + ' ', '!', '"', ' ', '$', '%', ' ', '´', '(', ')', ' ', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '2', '8', '9', ':', ';', '“', '=', '”', '?', + ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', ' ', ' ', ' ', ' ', + ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '♪', ']', '~', ' ' +}; + +const int font_charWidth[charSize] { + 0, 1, 3, 0, 5, 9, 0, 9, 3, 3, 0, 5, 2, 2, 1, 4, + 4, 2, 4, 4, 5, 4, 4, 4, 4, 4, 1, 2, 4, 5, 4, 4, + 0, 6, 5, 5, 5, 4, 4, 5, 5, 1, 4, 5, 4, 7, 5, 5, + 5, 5, 5, 5, 5, 5, 6, 7, 5, 5, 4, 0, 0, 0, 0, 0, + 0, 5, 4, 4, 4, 4, 3, 4, 4, 1, 2, 4, 1, 7, 4, 4, + 4, 4, 3, 4, 3, 4, 5, 7, 4, 4, 4, 2, 5, 2, 6, 0, +}; + +Font::Font(){ } + + +void Font::LoadFont(TextureRepository& repository, Renderer2D* renderer){ + renderer2D = renderer; + + float height = 16.0F; + float width = 16.0F; + + all_font.mode = MODE_REPEAT; + all_font.size = Vec2(255,127); + + auto filepath = FileUtils::fromCwd("earthbound-Font.png"); + auto* texture = repository.add(filepath); + texture->addLink(all_font.id); + + int column = 0; + int arrow = 0; + + for(int i=0; i < 96; i++){ + font[i].id = all_font.id; + font[i].mode = MODE_REPEAT; + font[i].size = Vec2(width,height); + font[i].offset = Vec2(width*column,height*arrow); + column++; + if(column == 16){ + arrow++; + column = 0; + } + } +} + +void Font::FreeFont(TextureRepository& repository){ + repository.freeBySprite(all_font); + for(int i=0;i<96;i++){ repository.freeBySprite(font[i]); } +} + +void Font::DrawText(const char* text, int x, int y, Color color){ + DrawText(std::string(text),x,y,color); +} + +void Font::DrawText(const std::string& text, int x, int y, Color color){ + int sizeText = text.size(); + + int offsetY = 0; + int offsetX = 0; + + Sprite spr_font; + int pos_font; + + for (int i = 0; i < sizeText; i++) + { + pos_font = text[i]; + spr_font = font[0]; + + for(int j=0; j < charSize; j++){ + if(pos_font == font_char[j]){ + pos_font = j; + spr_font = font[j]; + spr_font.color = color; + spr_font.position = Vec2(x + offsetX, y + offsetY); + break; + } + } + + if (pos_font == '\n') + { + offsetY += 18; + offsetX = 0.0f; + }else{ + if ((pos_font != ' ') && (pos_font != '\t')){ + renderer2D->render(spr_font); + offsetX += font_charWidth[pos_font] + 2; + }else{ + offsetX += 2; + } + + } + } +} + +} // namespace Tyra \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/src/main.cpp b/tutorials/10-sprite-sheet/src/main.cpp index 087f27c..21559e1 100644 --- a/tutorials/10-sprite-sheet/src/main.cpp +++ b/tutorials/10-sprite-sheet/src/main.cpp @@ -12,10 +12,9 @@ #include "tutorial_10.hpp" /** - * In this tutorial we will learn how to: - * - Load png file and create texture from it - * - Create sprite class - * - Clear screen and render sprite + * In this tutorial we will learn: + * - How works the offset of the sprite + * - how works the texture mapping */ int main() { diff --git a/tutorials/10-sprite-sheet/src/tutorial_10.cpp b/tutorials/10-sprite-sheet/src/tutorial_10.cpp index 09db4e6..9733a34 100644 --- a/tutorials/10-sprite-sheet/src/tutorial_10.cpp +++ b/tutorials/10-sprite-sheet/src/tutorial_10.cpp @@ -13,30 +13,150 @@ namespace Tyra { -Tutorial10::Tutorial10(Engine* t_engine) : engine(t_engine) {} +Tutorial10::Tutorial10(Engine* t_engine) : engine(t_engine), pad(&t_engine->pad){ } Tutorial10::~Tutorial10() { engine->renderer.getTextureRepository().freeBySprite(sprite); + engine->renderer.getTextureRepository().freeBySprite(spriteFlip); + engine->renderer.getTextureRepository().freeBySprite(spriteScale); + engine->renderer.getTextureRepository().freeBySprite(spriteStrech); + font.FreeFont(engine->renderer.getTextureRepository()); } void Tutorial10::init() { engine->renderer.setClearScreenColor(Color(32.0F, 32.0F, 32.0F)); + /** Load all the sprites of the sprite sheet. */ + font.LoadFont(engine->renderer.getTextureRepository(),&engine->renderer.renderer2D); + /** Sprite contains rectangle information. */ loadSprite(); /** Texture contains png image. */ loadTexture(); + + /** Set the texture filtering. */ + textureFilter = TyraNearest; + + engine->renderer.core.renderer2D.setTextureMappingType(textureFilter); + } void Tutorial10::loop() { auto& renderer = engine->renderer; + /** Change the texture filtering of the texture. + * + * The options are: + * TyraNearest (Point Sampling): + * uses the color of the texel closest to the pixel center for the pixel color. + * + * TyraLinear (Bilinear Sampling): + * the four nearest texels to the pixel center are sampled + * and their colors are combined by weighted average according to distance. + * + * By default it is linear. + */ + + renderer.core.renderer2D.setTextureMappingType(textureFilter); + + if(engine->pad.getClicked().Cross){ + textureFilter = TyraNearest; + }else if(engine->pad.getClicked().Circle){ + textureFilter = TyraLinear; + } + + static int timer = 0; + + /** Move the offset of the sprites. + * + * The offset of the sprite need to be equal or greater to zero + * or a graphical error occurs. + * + * And the sum of the sprite size and the offset must be less than 1024 + * or a graphical error occurs. + * + * Sum with repeat mode: + * Max = sprite.size + sprite.offset. + * + * Sum with strecth mode: + * Max = original size of the image + sprite.offset. + * + * If it continues moving past these values + * in a moment it will return to normal but + * the error will be repeated with another value. + */ + + if(timer <= 0){ + if(pad->getLeftJoyPad().v <= 100){ //up + sprite.offset -= Vec2(0,16); + spriteFlip.offset -= Vec2(0,16); + spriteScale.offset -= Vec2(0,16); + spriteStrech.offset -= Vec2(0,16); timer = 20; + printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); + }else if(pad->getLeftJoyPad().v >= 200 ){ //down + sprite.offset += Vec2(0,16); + spriteFlip.offset += Vec2(0,16); + spriteScale.offset += Vec2(0,16); + spriteStrech.offset += Vec2(0,16); timer = 20; + printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); + } + + if (pad->getLeftJoyPad().h <= 100) { // left + sprite.offset -= Vec2(16,0); + spriteFlip.offset -= Vec2(16,0); + spriteScale.offset -= Vec2(16,0); + spriteStrech.offset -= Vec2(16,0); timer = 20; + printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); + } else if (pad->getLeftJoyPad().h >= 200 ) { //right + sprite.offset += Vec2(16,0); + spriteFlip.offset += Vec2(16,0); + spriteScale.offset += Vec2(16,0); + spriteStrech.offset += Vec2(16,0); timer = 20; + printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); + } + + }else{ + timer--; + } + /** Begin frame will clear our screen. */ renderer.beginFrame(); /** Render sprite. */ renderer.renderer2D.render(sprite); + renderer.core.renderer2D.setTextureMappingType(TyraLinear); + renderer.renderer2D.render(spriteFlip); + renderer.core.renderer2D.setTextureMappingType(textureFilter); + renderer.renderer2D.render(spriteScale); + renderer.renderer2D.render(spriteStrech); + + font.DrawText("tests with sprite sheet",(512/2)-60,10,Color(255,255,255)); + font.DrawText("Press Cross for nearest filter",(512/2)-70,50,Color(255,255,255)); + font.DrawText("Press Circle for linear filter",(512/2)-65,70,Color(255,255,255)); + font.DrawText("Use left stick for move the offsets of the sprites",(512/2)-110,90,Color(255,255,255)); + font.DrawText("sprite 32x32\n scaled x3",sprite.position.x+16,sprite.position.y-40,Color(255,255,255)); + font.DrawText("sprite 32x32\nscaled x3 with flip",spriteFlip.position.x+4,spriteFlip.position.y-40,Color(255,255,255)); + font.DrawText("sprite 96x96 with\n repeat mode",spriteScale.position.x+6,spriteScale.position.y-40,Color(255,255,255)); + font.DrawText("sprite 96x96 with\n stretch mode",spriteStrech.position.x+6,spriteStrech.position.y-40,Color(255,255,255)); + + if(textureFilter == TyraLinear){ str_filter = "Filter: Linear";} + else{ str_filter = "Filter: Nearest";} + + static int posX1 = sprite.position.x + 16; + static int posX2 = spriteFlip.position.x + 16; + static int posX3 = spriteStrech.position.x + 16; + static int posX4 = spriteScale.position.x + 16; + + static int posY1 = sprite.position.y + (sprite.size.y * sprite.scale) + 16; + static int posY2 = spriteFlip.position.y + (spriteFlip.size.y * spriteFlip.scale) + 16; + static int posY3 = spriteStrech.position.y + (spriteStrech.size.y * spriteStrech.scale) + 16; + static int posY4 = spriteScale.position.y + (spriteScale.size.y * spriteScale.scale) + 16; + + font.DrawText(str_filter,posX1,posY1,Color(255,255,255)); + font.DrawText("Filter: Linear",posX2,posY2,Color(255,255,255)); + font.DrawText(str_filter,posX3,posY3,Color(255,255,255)); + font.DrawText(str_filter,posX4,posY4,Color(255,255,255)); /** End frame will perform vsync. */ renderer.endFrame(); @@ -45,15 +165,39 @@ void Tutorial10::loop() { void Tutorial10::loadSprite() { const auto& screenSettings = engine->renderer.core.getSettings(); - sprite.mode = SpriteMode::MODE_STRETCH; + int offset = 25; + + sprite.mode = SpriteMode::MODE_REPEAT; /** Let's scale it down */ - sprite.size = Vec2(256.0F, 256.0F); + sprite.size = Vec2(32.0F, 32.0F); + sprite.scale = 3; + + /** Set the position */ + sprite.position = Vec2(offset,screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); - /** Set it in screen center */ - sprite.position = - Vec2(screenSettings.getWidth() / 2.0F - sprite.size.x / 2.0F, - screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + spriteFlip.mode = SpriteMode::MODE_REPEAT; + + spriteFlip.flipHorizontal = true; + spriteFlip.flipVertical = true; + + spriteFlip.size = Vec2(32.0F, 32.0F); + + spriteFlip.scale = 3; + + spriteFlip.position = Vec2(((offset*2) + (32.0F*3)),screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + + spriteScale.mode = SpriteMode::MODE_REPEAT; + + spriteScale.size = Vec2(96.0F,96.0F); + + spriteScale.position = Vec2(((offset*3) + ((32.0F*3)*2)),screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + + spriteStrech.mode = SpriteMode::MODE_STRETCH; + + spriteStrech.size = Vec2(96.0F,96.0F); + + spriteStrech.position = Vec2(((offset*4) + ((32.0F*3)*3)),screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); TYRA_LOG("Sprite created!"); } @@ -106,6 +250,10 @@ void Tutorial10::loadTexture() { /** Let's assign this texture to sprite. */ texture->addLink(sprite.id); + spriteFlip.id = sprite.id; + spriteScale.id = sprite.id; + spriteStrech.id = sprite.id; + TYRA_LOG("Texture loaded!"); } From 20d2291a88e9e83739e7f0afaffa4ffbfe4523a8 Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Sun, 28 May 2023 16:46:32 -0300 Subject: [PATCH 04/16] Update Tyra copyright --- tutorials/10-sprite-sheet/inc/fontSprite.hpp | 3 ++- tutorials/10-sprite-sheet/inc/tutorial_10.hpp | 3 ++- tutorials/10-sprite-sheet/src/fontSprite.cpp | 11 +++++++++++ tutorials/10-sprite-sheet/src/main.cpp | 3 ++- tutorials/10-sprite-sheet/src/tutorial_10.cpp | 3 ++- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/tutorials/10-sprite-sheet/inc/fontSprite.hpp b/tutorials/10-sprite-sheet/inc/fontSprite.hpp index 3d089e3..9ae1d3c 100644 --- a/tutorials/10-sprite-sheet/inc/fontSprite.hpp +++ b/tutorials/10-sprite-sheet/inc/fontSprite.hpp @@ -3,8 +3,9 @@ # | \/ ____| |___| # | | | \ | | #----------------------------------------------------------------------- -# Copyright 2022, tyra - https://github.com/h4570/tyra +# Copyright 2022-2023, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 +# Guido Diego Quispe Robles # Sandro Sobczyński */ diff --git a/tutorials/10-sprite-sheet/inc/tutorial_10.hpp b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp index f0e0779..56f16c9 100644 --- a/tutorials/10-sprite-sheet/inc/tutorial_10.hpp +++ b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp @@ -3,8 +3,9 @@ # | \/ ____| |___| # | | | \ | | #----------------------------------------------------------------------- -# Copyright 2022, tyra - https://github.com/h4570/tyra +# Copyright 2022-2023, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 +# Guido Diego Quispe Robles # Sandro Sobczyński */ diff --git a/tutorials/10-sprite-sheet/src/fontSprite.cpp b/tutorials/10-sprite-sheet/src/fontSprite.cpp index 38f842e..254d41d 100644 --- a/tutorials/10-sprite-sheet/src/fontSprite.cpp +++ b/tutorials/10-sprite-sheet/src/fontSprite.cpp @@ -1,3 +1,14 @@ +/* +# _____ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022-2023, tyra - https://github.com/h4570/tyra +# Licensed under Apache License 2.0 +# Guido Diego Quispe Robles +# Sandro Sobczyński +*/ + #include "fontSprite.hpp" namespace Tyra{ diff --git a/tutorials/10-sprite-sheet/src/main.cpp b/tutorials/10-sprite-sheet/src/main.cpp index 21559e1..18d8d5c 100644 --- a/tutorials/10-sprite-sheet/src/main.cpp +++ b/tutorials/10-sprite-sheet/src/main.cpp @@ -3,8 +3,9 @@ # | \/ ____| |___| # | | | \ | | #----------------------------------------------------------------------- -# Copyright 2022, tyra - https://github.com/h4570/tyra +# Copyright 2022-2023, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 +# Guido Diego Quispe Robles # Sandro Sobczyński */ diff --git a/tutorials/10-sprite-sheet/src/tutorial_10.cpp b/tutorials/10-sprite-sheet/src/tutorial_10.cpp index 9733a34..7aa61aa 100644 --- a/tutorials/10-sprite-sheet/src/tutorial_10.cpp +++ b/tutorials/10-sprite-sheet/src/tutorial_10.cpp @@ -3,8 +3,9 @@ # | \/ ____| |___| # | | | \ | | #----------------------------------------------------------------------- -# Copyright 2022, tyra - https://github.com/h4570/tyra +# Copyright 2022-2023, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 +# Guido Diego Quispe Robles # Sandro Sobczyński */ From cab934763fd670209bf84e9a04584b7da4d0bd83 Mon Sep 17 00:00:00 2001 From: h4570 Date: Sun, 28 May 2023 22:55:42 +0200 Subject: [PATCH 05/16] minor adjustments --- .../inc/renderer/core/2d/renderer_core_2d.hpp | 5 +- .../src/renderer/core/2d/renderer_core_2d.cpp | 13 +- engine/src/renderer/core/2d/sprite/sprite.cpp | 2 +- tutorials/10-sprite-sheet/inc/fontSprite.hpp | 35 --- tutorials/10-sprite-sheet/inc/font_sprite.hpp | 37 +++ tutorials/10-sprite-sheet/inc/tutorial_10.hpp | 11 +- tutorials/10-sprite-sheet/src/fontSprite.cpp | 117 --------- tutorials/10-sprite-sheet/src/font_sprite.cpp | 109 ++++++++ tutorials/10-sprite-sheet/src/main.cpp | 4 +- tutorials/10-sprite-sheet/src/tutorial_10.cpp | 237 ++++++++++-------- 10 files changed, 299 insertions(+), 271 deletions(-) delete mode 100644 tutorials/10-sprite-sheet/inc/fontSprite.hpp create mode 100644 tutorials/10-sprite-sheet/inc/font_sprite.hpp delete mode 100644 tutorials/10-sprite-sheet/src/fontSprite.cpp create mode 100644 tutorials/10-sprite-sheet/src/font_sprite.cpp diff --git a/engine/inc/renderer/core/2d/renderer_core_2d.hpp b/engine/inc/renderer/core/2d/renderer_core_2d.hpp index bbb35a8..177687f 100644 --- a/engine/inc/renderer/core/2d/renderer_core_2d.hpp +++ b/engine/inc/renderer/core/2d/renderer_core_2d.hpp @@ -31,8 +31,9 @@ class RendererCore2D { void render(const Sprite& sprite, const RendererCoreTextureBuffers& texBuffers, Texture* texture); - void setTextureMappingType(const PipelineTextureMappingType textureMappingType); - + void setTextureMappingType( + const PipelineTextureMappingType textureMappingType); + private: void setPrim(); void setLod(); diff --git a/engine/src/renderer/core/2d/renderer_core_2d.cpp b/engine/src/renderer/core/2d/renderer_core_2d.cpp index 0b83faa..44fb7bd 100644 --- a/engine/src/renderer/core/2d/renderer_core_2d.cpp +++ b/engine/src/renderer/core/2d/renderer_core_2d.cpp @@ -84,10 +84,12 @@ void RendererCore2D::render(const Sprite& sprite, else if (sizeY > sizeX) texS = texMax / (sizeY / sizeX); - rect->t0.s = sprite.flipHorizontal ? (texS+sprite.offset.x) : sprite.offset.x; - rect->t0.t = sprite.flipVertical ? (texT+sprite.offset.y) : sprite.offset.y; - rect->t1.s = sprite.flipHorizontal ? sprite.offset.x : (texS+sprite.offset.x); - rect->t1.t = sprite.flipVertical ? sprite.offset.y : (texT+sprite.offset.y); + rect->t0.s = + sprite.flipHorizontal ? (texS + sprite.offset.x) : sprite.offset.x; + rect->t0.t = sprite.flipVertical ? (texT + sprite.offset.y) : sprite.offset.y; + rect->t1.s = + sprite.flipHorizontal ? sprite.offset.x : (texS + sprite.offset.x); + rect->t1.t = sprite.flipVertical ? sprite.offset.y : (texT + sprite.offset.y); rect->color.r = sprite.color.r; rect->color.g = sprite.color.g; @@ -131,7 +133,8 @@ void RendererCore2D::render(const Sprite& sprite, context = !context; } -void RendererCore2D::setTextureMappingType(const PipelineTextureMappingType textureMappingType){ +void RendererCore2D::setTextureMappingType( + const PipelineTextureMappingType textureMappingType) { lod.mag_filter = textureMappingType; lod.min_filter = textureMappingType; } diff --git a/engine/src/renderer/core/2d/sprite/sprite.cpp b/engine/src/renderer/core/2d/sprite/sprite.cpp index 821a9f2..9827749 100644 --- a/engine/src/renderer/core/2d/sprite/sprite.cpp +++ b/engine/src/renderer/core/2d/sprite/sprite.cpp @@ -18,7 +18,7 @@ Sprite::Sprite() { flipVertical = false; size.set(32.0F, 32.0F); position.set(100.0F, 100.0F); - offset.set(0.0F,0.0F); + offset.set(0.0F, 0.0F); scale = 1.0F; mode = MODE_REPEAT; setDefaultColor(); diff --git a/tutorials/10-sprite-sheet/inc/fontSprite.hpp b/tutorials/10-sprite-sheet/inc/fontSprite.hpp deleted file mode 100644 index 9ae1d3c..0000000 --- a/tutorials/10-sprite-sheet/inc/fontSprite.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* -# _____ ____ ___ -# | \/ ____| |___| -# | | | \ | | -#----------------------------------------------------------------------- -# Copyright 2022-2023, tyra - https://github.com/h4570/tyra -# Licensed under Apache License 2.0 -# Guido Diego Quispe Robles -# Sandro Sobczyński -*/ - -#pragma once - -#include - -namespace Tyra{ - -extern const int charSize; -extern const int font_char[96]; -extern const int font_charWidth[96]; - -class Font{ - public: - Font(); - void LoadFont(TextureRepository& repository, Renderer2D* renderer); - void FreeFont(TextureRepository& repository); - void DrawText(const char* text, int x, int y, Color color); - void DrawText(const std::string& text, int x, int y, Color color); - private: - Renderer2D* renderer2D; - Sprite all_font; - std::array font; -}; - -} // namespace Tyra \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/inc/font_sprite.hpp b/tutorials/10-sprite-sheet/inc/font_sprite.hpp new file mode 100644 index 0000000..b139003 --- /dev/null +++ b/tutorials/10-sprite-sheet/inc/font_sprite.hpp @@ -0,0 +1,37 @@ +/* +# _____ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022-2023, tyra - https://github.com/h4570/tyra +# Licensed under Apache License 2.0 +# Guido Diego Quispe Robles +*/ + +#pragma once + +#include + +#define FONT_CHAR_SIZE 96 + +namespace Tyra { + +class Font { + public: + Font(); + void load(TextureRepository& repository, Renderer2D* renderer); + void free(TextureRepository& repository); + void drawText(const char* text, const int& x, const int& y, Color color); + void drawText(const std::string& text, const int& x, const int& y, + Color color); + + private: + const static int chars[FONT_CHAR_SIZE]; + const static int charWidths[FONT_CHAR_SIZE]; + + Renderer2D* renderer2D; + Sprite allFont; + std::array font; +}; + +} // namespace Tyra \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/inc/tutorial_10.hpp b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp index 56f16c9..e11d626 100644 --- a/tutorials/10-sprite-sheet/inc/tutorial_10.hpp +++ b/tutorials/10-sprite-sheet/inc/tutorial_10.hpp @@ -6,19 +6,18 @@ # Copyright 2022-2023, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 # Guido Diego Quispe Robles -# Sandro Sobczyński */ #pragma once #include -#include "fontSprite.hpp" +#include "font_sprite.hpp" namespace Tyra { class Tutorial10 : public Game { public: - Tutorial10(Engine* engine); + explicit Tutorial10(Engine* engine); ~Tutorial10(); void init(); @@ -27,7 +26,9 @@ class Tutorial10 : public Game { private: void loadTexture(); void loadSprite(); + void handlePad(); + int padTimer; Engine* engine; Pad* pad; Font font; @@ -35,8 +36,8 @@ class Tutorial10 : public Game { Sprite sprite; Sprite spriteFlip; Sprite spriteScale; - Sprite spriteStrech; - std::string str_filter; + Sprite spriteStretch; + std::string strFilter; PipelineTextureMappingType textureFilter; }; diff --git a/tutorials/10-sprite-sheet/src/fontSprite.cpp b/tutorials/10-sprite-sheet/src/fontSprite.cpp deleted file mode 100644 index 254d41d..0000000 --- a/tutorials/10-sprite-sheet/src/fontSprite.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* -# _____ ____ ___ -# | \/ ____| |___| -# | | | \ | | -#----------------------------------------------------------------------- -# Copyright 2022-2023, tyra - https://github.com/h4570/tyra -# Licensed under Apache License 2.0 -# Guido Diego Quispe Robles -# Sandro Sobczyński -*/ - -#include "fontSprite.hpp" - -namespace Tyra{ - -const int charSize = 96; - -const int font_char[charSize]{ - ' ', '!', '"', ' ', '$', '%', ' ', '´', '(', ')', ' ', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '2', '8', '9', ':', ';', '“', '=', '”', '?', - ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', ' ', ' ', ' ', ' ', - ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '♪', ']', '~', ' ' -}; - -const int font_charWidth[charSize] { - 0, 1, 3, 0, 5, 9, 0, 9, 3, 3, 0, 5, 2, 2, 1, 4, - 4, 2, 4, 4, 5, 4, 4, 4, 4, 4, 1, 2, 4, 5, 4, 4, - 0, 6, 5, 5, 5, 4, 4, 5, 5, 1, 4, 5, 4, 7, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 7, 5, 5, 4, 0, 0, 0, 0, 0, - 0, 5, 4, 4, 4, 4, 3, 4, 4, 1, 2, 4, 1, 7, 4, 4, - 4, 4, 3, 4, 3, 4, 5, 7, 4, 4, 4, 2, 5, 2, 6, 0, -}; - -Font::Font(){ } - - -void Font::LoadFont(TextureRepository& repository, Renderer2D* renderer){ - renderer2D = renderer; - - float height = 16.0F; - float width = 16.0F; - - all_font.mode = MODE_REPEAT; - all_font.size = Vec2(255,127); - - auto filepath = FileUtils::fromCwd("earthbound-Font.png"); - auto* texture = repository.add(filepath); - texture->addLink(all_font.id); - - int column = 0; - int arrow = 0; - - for(int i=0; i < 96; i++){ - font[i].id = all_font.id; - font[i].mode = MODE_REPEAT; - font[i].size = Vec2(width,height); - font[i].offset = Vec2(width*column,height*arrow); - column++; - if(column == 16){ - arrow++; - column = 0; - } - } -} - -void Font::FreeFont(TextureRepository& repository){ - repository.freeBySprite(all_font); - for(int i=0;i<96;i++){ repository.freeBySprite(font[i]); } -} - -void Font::DrawText(const char* text, int x, int y, Color color){ - DrawText(std::string(text),x,y,color); -} - -void Font::DrawText(const std::string& text, int x, int y, Color color){ - int sizeText = text.size(); - - int offsetY = 0; - int offsetX = 0; - - Sprite spr_font; - int pos_font; - - for (int i = 0; i < sizeText; i++) - { - pos_font = text[i]; - spr_font = font[0]; - - for(int j=0; j < charSize; j++){ - if(pos_font == font_char[j]){ - pos_font = j; - spr_font = font[j]; - spr_font.color = color; - spr_font.position = Vec2(x + offsetX, y + offsetY); - break; - } - } - - if (pos_font == '\n') - { - offsetY += 18; - offsetX = 0.0f; - }else{ - if ((pos_font != ' ') && (pos_font != '\t')){ - renderer2D->render(spr_font); - offsetX += font_charWidth[pos_font] + 2; - }else{ - offsetX += 2; - } - - } - } -} - -} // namespace Tyra \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/src/font_sprite.cpp b/tutorials/10-sprite-sheet/src/font_sprite.cpp new file mode 100644 index 0000000..93577a2 --- /dev/null +++ b/tutorials/10-sprite-sheet/src/font_sprite.cpp @@ -0,0 +1,109 @@ +/* +# _____ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022-2023, tyra - https://github.com/h4570/tyra +# Licensed under Apache License 2.0 +# Guido Diego Quispe Robles +*/ + +#include "font_sprite.hpp" + +namespace Tyra { + +const int Font::chars[FONT_CHAR_SIZE]{ + ' ', '!', '"', ' ', '$', '%', ' ', '{', '(', ')', ' ', '+', ',', '-', + '.', '/', '0', '1', '2', '3', '4', '5', '6', '2', '8', '9', ':', ';', + '<', '=', '>', '?', ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', + 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', ' ', ' ', ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', + 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', + 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '}', ']', '~', ' '}; + +const int Font::charWidths[FONT_CHAR_SIZE]{ + 0, 1, 3, 0, 5, 9, 0, 9, 3, 3, 0, 5, 2, 2, 1, 4, 4, 2, 4, 4, 5, 4, 4, 4, + 4, 4, 1, 2, 4, 5, 4, 4, 0, 6, 5, 5, 5, 4, 4, 5, 5, 1, 4, 5, 4, 7, 5, 5, + 5, 5, 5, 5, 5, 5, 6, 7, 5, 5, 4, 0, 0, 0, 0, 0, 0, 5, 4, 4, 4, 4, 3, 4, + 4, 1, 2, 4, 1, 7, 4, 4, 4, 4, 3, 4, 3, 4, 5, 7, 4, 4, 4, 2, 5, 2, 6, 0, +}; + +Font::Font() {} + +void Font::load(TextureRepository& repository, Renderer2D* renderer) { + renderer2D = renderer; + + float height = 16.0F; + float width = 16.0F; + + allFont.mode = MODE_REPEAT; + allFont.size = Vec2(255, 127); + + auto filepath = FileUtils::fromCwd("earthbound-Font.png"); + auto* texture = repository.add(filepath); + texture->addLink(allFont.id); + + int column = 0; + int arrow = 0; + + for (int i = 0; i < FONT_CHAR_SIZE; i++) { + font[i].id = allFont.id; + font[i].mode = MODE_REPEAT; + font[i].size = Vec2(width, height); + font[i].offset = Vec2(width * column, height * arrow); + column++; + + if (column == 16) { + arrow++; + column = 0; + } + } +} + +void Font::free(TextureRepository& repository) { + repository.freeBySprite(allFont); + for (int i = 0; i < FONT_CHAR_SIZE; i++) { + repository.freeBySprite(font[i]); + } +} + +void Font::drawText(const char* text, const int& x, const int& y, Color color) { + drawText(std::string(text), x, y, color); +} + +void Font::drawText(const std::string& text, const int& x, const int& y, + Color color) { + int sizeText = text.size(); + + int offsetY = 0; + int offsetX = 0; + + for (int i = 0; i < sizeText; i++) { + int fontPos = text[i]; + Sprite fontSpr = font[0]; + + for (int j = 0; j < FONT_CHAR_SIZE; j++) { + if (fontPos == chars[j]) { + fontPos = j; + fontSpr = font[j]; + fontSpr.color = color; + fontSpr.position = Vec2(x + offsetX, y + offsetY); + break; + } + } + + if (fontPos == '\n') { + offsetY += 18; + offsetX = 0.0f; + } else { + if ((fontPos != ' ') && (fontPos != '\t')) { + renderer2D->render(fontSpr); + offsetX += charWidths[fontPos] + 2; + } else { + offsetX += 2; + } + } + } +} + +} // namespace Tyra \ No newline at end of file diff --git a/tutorials/10-sprite-sheet/src/main.cpp b/tutorials/10-sprite-sheet/src/main.cpp index 18d8d5c..d854e6c 100644 --- a/tutorials/10-sprite-sheet/src/main.cpp +++ b/tutorials/10-sprite-sheet/src/main.cpp @@ -6,7 +6,6 @@ # Copyright 2022-2023, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 # Guido Diego Quispe Robles -# Sandro Sobczyński */ #include "engine.hpp" @@ -15,7 +14,8 @@ /** * In this tutorial we will learn: * - How works the offset of the sprite - * - how works the texture mapping + * - How works the texture mapping + * - How to write text (font) */ int main() { diff --git a/tutorials/10-sprite-sheet/src/tutorial_10.cpp b/tutorials/10-sprite-sheet/src/tutorial_10.cpp index 7aa61aa..727b6cf 100644 --- a/tutorials/10-sprite-sheet/src/tutorial_10.cpp +++ b/tutorials/10-sprite-sheet/src/tutorial_10.cpp @@ -6,7 +6,6 @@ # Copyright 2022-2023, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 # Guido Diego Quispe Robles -# Sandro Sobczyński */ #include @@ -14,21 +13,23 @@ namespace Tyra { -Tutorial10::Tutorial10(Engine* t_engine) : engine(t_engine), pad(&t_engine->pad){ } +Tutorial10::Tutorial10(Engine* t_engine) + : padTimer(0), engine(t_engine), pad(&t_engine->pad) {} Tutorial10::~Tutorial10() { engine->renderer.getTextureRepository().freeBySprite(sprite); engine->renderer.getTextureRepository().freeBySprite(spriteFlip); engine->renderer.getTextureRepository().freeBySprite(spriteScale); - engine->renderer.getTextureRepository().freeBySprite(spriteStrech); - font.FreeFont(engine->renderer.getTextureRepository()); + engine->renderer.getTextureRepository().freeBySprite(spriteStretch); + font.free(engine->renderer.getTextureRepository()); } void Tutorial10::init() { engine->renderer.setClearScreenColor(Color(32.0F, 32.0F, 32.0F)); /** Load all the sprites of the sprite sheet. */ - font.LoadFont(engine->renderer.getTextureRepository(),&engine->renderer.renderer2D); + font.load(engine->renderer.getTextureRepository(), + &engine->renderer.renderer2D); /** Sprite contains rectangle information. */ loadSprite(); @@ -40,129 +41,150 @@ void Tutorial10::init() { textureFilter = TyraNearest; engine->renderer.core.renderer2D.setTextureMappingType(textureFilter); - } void Tutorial10::loop() { auto& renderer = engine->renderer; /** Change the texture filtering of the texture. - * + * * The options are: * TyraNearest (Point Sampling): - * uses the color of the texel closest to the pixel center for the pixel color. - * + * uses the color of the texel closest to the pixel center for the pixel + * color. + * * TyraLinear (Bilinear Sampling): * the four nearest texels to the pixel center are sampled * and their colors are combined by weighted average according to distance. - * + * * By default it is linear. - */ + */ renderer.core.renderer2D.setTextureMappingType(textureFilter); - - if(engine->pad.getClicked().Cross){ - textureFilter = TyraNearest; - }else if(engine->pad.getClicked().Circle){ - textureFilter = TyraLinear; - } - static int timer = 0; + handlePad(); - /** Move the offset of the sprites. - * - * The offset of the sprite need to be equal or greater to zero - * or a graphical error occurs. - * - * And the sum of the sprite size and the offset must be less than 1024 - * or a graphical error occurs. - * - * Sum with repeat mode: - * Max = sprite.size + sprite.offset. - * - * Sum with strecth mode: - * Max = original size of the image + sprite.offset. - * - * If it continues moving past these values - * in a moment it will return to normal but - * the error will be repeated with another value. - */ - - if(timer <= 0){ - if(pad->getLeftJoyPad().v <= 100){ //up - sprite.offset -= Vec2(0,16); - spriteFlip.offset -= Vec2(0,16); - spriteScale.offset -= Vec2(0,16); - spriteStrech.offset -= Vec2(0,16); timer = 20; - printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); - }else if(pad->getLeftJoyPad().v >= 200 ){ //down - sprite.offset += Vec2(0,16); - spriteFlip.offset += Vec2(0,16); - spriteScale.offset += Vec2(0,16); - spriteStrech.offset += Vec2(0,16); timer = 20; - printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); - } - - if (pad->getLeftJoyPad().h <= 100) { // left - sprite.offset -= Vec2(16,0); - spriteFlip.offset -= Vec2(16,0); - spriteScale.offset -= Vec2(16,0); - spriteStrech.offset -= Vec2(16,0); timer = 20; - printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); - } else if (pad->getLeftJoyPad().h >= 200 ) { //right - sprite.offset += Vec2(16,0); - spriteFlip.offset += Vec2(16,0); - spriteScale.offset += Vec2(16,0); - spriteStrech.offset += Vec2(16,0); timer = 20; - printf("offset: %f,%f\n",sprite.offset.x,sprite.offset.y); - } - - }else{ - timer--; - } - /** Begin frame will clear our screen. */ renderer.beginFrame(); /** Render sprite. */ renderer.renderer2D.render(sprite); renderer.core.renderer2D.setTextureMappingType(TyraLinear); - renderer.renderer2D.render(spriteFlip); + renderer.renderer2D.render(spriteFlip); renderer.core.renderer2D.setTextureMappingType(textureFilter); renderer.renderer2D.render(spriteScale); - renderer.renderer2D.render(spriteStrech); + renderer.renderer2D.render(spriteStretch); - font.DrawText("tests with sprite sheet",(512/2)-60,10,Color(255,255,255)); - font.DrawText("Press Cross for nearest filter",(512/2)-70,50,Color(255,255,255)); - font.DrawText("Press Circle for linear filter",(512/2)-65,70,Color(255,255,255)); - font.DrawText("Use left stick for move the offsets of the sprites",(512/2)-110,90,Color(255,255,255)); - font.DrawText("sprite 32x32\n scaled x3",sprite.position.x+16,sprite.position.y-40,Color(255,255,255)); - font.DrawText("sprite 32x32\nscaled x3 with flip",spriteFlip.position.x+4,spriteFlip.position.y-40,Color(255,255,255)); - font.DrawText("sprite 96x96 with\n repeat mode",spriteScale.position.x+6,spriteScale.position.y-40,Color(255,255,255)); - font.DrawText("sprite 96x96 with\n stretch mode",spriteStrech.position.x+6,spriteStrech.position.y-40,Color(255,255,255)); - - if(textureFilter == TyraLinear){ str_filter = "Filter: Linear";} - else{ str_filter = "Filter: Nearest";} + font.drawText("tests with sprite sheet", (512 / 2) - 60, 10, + Color(255, 255, 255)); + font.drawText("Press Cross for nearest filter", (512 / 2) - 70, 50, + Color(255, 255, 255)); + font.drawText("Press Circle for linear filter", (512 / 2) - 65, 70, + Color(255, 255, 255)); + font.drawText("Use left stick for move the offsets of the sprites", + (512 / 2) - 110, 90, Color(255, 255, 255)); + font.drawText("sprite 32x32\n scaled x3", sprite.position.x + 16, + sprite.position.y - 40, Color(255, 255, 255)); + font.drawText("sprite 32x32\nscaled x3 with flip", spriteFlip.position.x + 4, + spriteFlip.position.y - 40, Color(255, 255, 255)); + font.drawText("sprite 96x96 with\n repeat mode", spriteScale.position.x + 6, + spriteScale.position.y - 40, Color(255, 255, 255)); + font.drawText("sprite 96x96 with\n stretch mode", + spriteStretch.position.x + 6, spriteStretch.position.y - 40, + Color(255, 255, 255)); - static int posX1 = sprite.position.x + 16; - static int posX2 = spriteFlip.position.x + 16; - static int posX3 = spriteStrech.position.x + 16; - static int posX4 = spriteScale.position.x + 16; + if (textureFilter == TyraLinear) { + strFilter = "Filter: Linear"; + } else { + strFilter = "Filter: Nearest"; + } - static int posY1 = sprite.position.y + (sprite.size.y * sprite.scale) + 16; - static int posY2 = spriteFlip.position.y + (spriteFlip.size.y * spriteFlip.scale) + 16; - static int posY3 = spriteStrech.position.y + (spriteStrech.size.y * spriteStrech.scale) + 16; - static int posY4 = spriteScale.position.y + (spriteScale.size.y * spriteScale.scale) + 16; + int posX1 = sprite.position.x + 16; + int posX2 = spriteFlip.position.x + 16; + int posX3 = spriteStretch.position.x + 16; + int posX4 = spriteScale.position.x + 16; - font.DrawText(str_filter,posX1,posY1,Color(255,255,255)); - font.DrawText("Filter: Linear",posX2,posY2,Color(255,255,255)); - font.DrawText(str_filter,posX3,posY3,Color(255,255,255)); - font.DrawText(str_filter,posX4,posY4,Color(255,255,255)); + int posY1 = sprite.position.y + (sprite.size.y * sprite.scale) + 16; + int posY2 = + spriteFlip.position.y + (spriteFlip.size.y * spriteFlip.scale) + 16; + int posY3 = spriteStretch.position.y + + (spriteStretch.size.y * spriteStretch.scale) + 16; + int posY4 = + spriteScale.position.y + (spriteScale.size.y * spriteScale.scale) + 16; + + font.drawText(strFilter, posX1, posY1, Color(255, 255, 255)); + font.drawText("Filter: Linear", posX2, posY2, Color(255, 255, 255)); + font.drawText(strFilter, posX3, posY3, Color(255, 255, 255)); + font.drawText(strFilter, posX4, posY4, Color(255, 255, 255)); /** End frame will perform vsync. */ renderer.endFrame(); } +void Tutorial10::handlePad() { + if (engine->pad.getClicked().Cross) { + textureFilter = TyraNearest; + } else if (engine->pad.getClicked().Circle) { + textureFilter = TyraLinear; + } + + /** Move the offset of the sprites. + * + * The offset of the sprite need to be equal or greater to zero + * or a graphical error occurs. + * + * And the sum of the sprite size and the offset must be less than 1024 + * or a graphical error occurs. + * + * Sum with repeat mode: + * Max = sprite.size + sprite.offset. + * + * Sum with strecth mode: + * Max = original size of the image + sprite.offset. + * + * If it continues moving past these values + * in a moment it will return to normal but + * the error will be repeated with another value. + */ + + if (padTimer <= 0) { + if (pad->getLeftJoyPad().v <= 100) { // up + sprite.offset -= Vec2(0, 16); + spriteFlip.offset -= Vec2(0, 16); + spriteScale.offset -= Vec2(0, 16); + spriteStretch.offset -= Vec2(0, 16); + padTimer = 20; + printf("New offset: %f,%f\n", sprite.offset.x, sprite.offset.y); + } else if (pad->getLeftJoyPad().v >= 200) { // down + sprite.offset += Vec2(0, 16); + spriteFlip.offset += Vec2(0, 16); + spriteScale.offset += Vec2(0, 16); + spriteStretch.offset += Vec2(0, 16); + padTimer = 20; + printf("New offset: %f,%f\n", sprite.offset.x, sprite.offset.y); + } + + if (pad->getLeftJoyPad().h <= 100) { // left + sprite.offset -= Vec2(16, 0); + spriteFlip.offset -= Vec2(16, 0); + spriteScale.offset -= Vec2(16, 0); + spriteStretch.offset -= Vec2(16, 0); + padTimer = 20; + printf("New offset: %f,%f\n", sprite.offset.x, sprite.offset.y); + } else if (pad->getLeftJoyPad().h >= 200) { // right + sprite.offset += Vec2(16, 0); + spriteFlip.offset += Vec2(16, 0); + spriteScale.offset += Vec2(16, 0); + spriteStretch.offset += Vec2(16, 0); + padTimer = 20; + printf("New offset: %f,%f\n", sprite.offset.x, sprite.offset.y); + } + + } else { + padTimer--; + } +} + void Tutorial10::loadSprite() { const auto& screenSettings = engine->renderer.core.getSettings(); @@ -173,9 +195,10 @@ void Tutorial10::loadSprite() { /** Let's scale it down */ sprite.size = Vec2(32.0F, 32.0F); sprite.scale = 3; - + /** Set the position */ - sprite.position = Vec2(offset,screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + sprite.position = + Vec2(offset, screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); spriteFlip.mode = SpriteMode::MODE_REPEAT; @@ -186,19 +209,25 @@ void Tutorial10::loadSprite() { spriteFlip.scale = 3; - spriteFlip.position = Vec2(((offset*2) + (32.0F*3)),screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + spriteFlip.position = + Vec2(((offset * 2) + (32.0F * 3)), + screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); spriteScale.mode = SpriteMode::MODE_REPEAT; - spriteScale.size = Vec2(96.0F,96.0F); + spriteScale.size = Vec2(96.0F, 96.0F); - spriteScale.position = Vec2(((offset*3) + ((32.0F*3)*2)),screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + spriteScale.position = + Vec2(((offset * 3) + ((32.0F * 3) * 2)), + screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); - spriteStrech.mode = SpriteMode::MODE_STRETCH; + spriteStretch.mode = SpriteMode::MODE_STRETCH; - spriteStrech.size = Vec2(96.0F,96.0F); + spriteStretch.size = Vec2(96.0F, 96.0F); - spriteStrech.position = Vec2(((offset*4) + ((32.0F*3)*3)),screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); + spriteStretch.position = + Vec2(((offset * 4) + ((32.0F * 3) * 3)), + screenSettings.getHeight() / 2.0F - sprite.size.y / 2.0F); TYRA_LOG("Sprite created!"); } @@ -253,7 +282,7 @@ void Tutorial10::loadTexture() { spriteFlip.id = sprite.id; spriteScale.id = sprite.id; - spriteStrech.id = sprite.id; + spriteStretch.id = sprite.id; TYRA_LOG("Texture loaded!"); } From 87b983153a69f831d7d2c50bd0104549f9ab509e Mon Sep 17 00:00:00 2001 From: h4570 Date: Mon, 29 May 2023 18:53:30 +0200 Subject: [PATCH 06/16] change tyra version --- engine/inc/info/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/inc/info/version.hpp b/engine/inc/info/version.hpp index d4be1d3..e5c53fc 100644 --- a/engine/inc/info/version.hpp +++ b/engine/inc/info/version.hpp @@ -21,7 +21,7 @@ class Version { ~Version() {} static const u8 major = 2; - static const u8 minor = 1; + static const u8 minor = 2; static const u8 patch = 0; static std::string toString() { From 7401926202617538559cb600354677bfc97e7caa Mon Sep 17 00:00:00 2001 From: freebytego Date: Tue, 25 Jul 2023 08:51:43 +0600 Subject: [PATCH 07/16] Fix music going too fast for first few seconds --- engine/src/audio/audio_song.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/src/audio/audio_song.cpp b/engine/src/audio/audio_song.cpp index 25a6e11..b05f198 100644 --- a/engine/src/audio/audio_song.cpp +++ b/engine/src/audio/audio_song.cpp @@ -148,6 +148,7 @@ void AudioSong::work() { if (chunkReadStatus > 0) { WaitSema(fillbufferSema); // wait until previous chunk wasn't finished + audsrv_wait_audio(chunkReadStatus); audsrv_play_audio(chunk, chunkReadStatus); for (u32 i = 0; i < getListenersCount(); i++) songListeners[i]->listener->onAudioTick(); From 588f45e8707c9f846f63b87e505d29c64614b79b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Sobczy=C5=84ski?= <32263891+h4570@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:22:20 +0200 Subject: [PATCH 08/16] Update README.MD --- README.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/README.MD b/README.MD index 673dc28..fcb5147 100644 --- a/README.MD +++ b/README.MD @@ -121,6 +121,7 @@ List of games developed with Tyra. If you created one, please contact me - I will add it to the list :) * [Tyracraft](https://github.com/Wellinator/tyracraft) by [Wellinator](https://github.com/Wellinator) +* [Game with car](https://github.com/freebytego) by [freebytego](https://github.com/freebytego) * [Rock, paper, scissors](https://github.com/GuidoDQR/my-ps2-game) by [GuidoDQR](https://github.com/GuidoDQR) * [TyraTale](https://github.com/Br4k2n/TyraTale) by [Br4k2n](https://github.com/Br4k2n) From d2da130771c2d0d86bed400938d56443d49f5b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Sobczy=C5=84ski?= <32263891+h4570@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:22:56 +0200 Subject: [PATCH 09/16] Update README.MD --- README.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.MD b/README.MD index fcb5147..10a3736 100644 --- a/README.MD +++ b/README.MD @@ -121,7 +121,7 @@ List of games developed with Tyra. If you created one, please contact me - I will add it to the list :) * [Tyracraft](https://github.com/Wellinator/tyracraft) by [Wellinator](https://github.com/Wellinator) -* [Game with car](https://github.com/freebytego) by [freebytego](https://github.com/freebytego) +* [Game with car](https://github.com/freebytego/gwc-ps2) by [freebytego](https://github.com/freebytego) * [Rock, paper, scissors](https://github.com/GuidoDQR/my-ps2-game) by [GuidoDQR](https://github.com/GuidoDQR) * [TyraTale](https://github.com/Br4k2n/TyraTale) by [Br4k2n](https://github.com/Br4k2n) From 878adf5dbb5d0321efe626575b76fdf705e2183b Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Sat, 4 Nov 2023 22:35:13 -0300 Subject: [PATCH 10/16] Fix writeLogsToFile Deleted logFile smart pointer and getLogFile function. logfile created inside of the statics functions. Debug.cpp can be deleted. --- engine/inc/debug/debug.hpp | 39 +++++++++++++++++++++++--------------- engine/src/debug/debug.cpp | 24 +++++++++++------------ 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/engine/inc/debug/debug.hpp b/engine/inc/debug/debug.hpp index d919b0e..d1e04ea 100644 --- a/engine/inc/debug/debug.hpp +++ b/engine/inc/debug/debug.hpp @@ -48,9 +48,12 @@ class TyraDebug { (void)expander{0, (void(ss << std::forward(args)), 0)...}; if (Tyra::Info::writeLogsToFile) { - auto* logFile = getLogFile(); - *logFile << ss.str(); - logFile->flush(); + std::ofstream logFile; + logFile.open(Tyra::FileUtils::fromCwd("log.txt"), + std::ofstream::out | std::ofstream::app); + logFile << ss.str(); + logFile.flush(); + // logFile.close(); } else { printf("%s", ss.str().c_str()); } @@ -65,9 +68,12 @@ class TyraDebug { ss1 << "|\n"; if (Tyra::Info::writeLogsToFile) { - auto* logFile = getLogFile(); - *logFile << ss1.str(); - logFile->flush(); + std::ofstream logFile; + logFile.open(Tyra::FileUtils::fromCwd("log.txt"), + std::ofstream::out | std::ofstream::app); + logFile << ss1.str(); + logFile.flush(); + // logFile.close(); } else { printf("%s", ss1.str().c_str()); } @@ -80,9 +86,12 @@ class TyraDebug { ss2 << "====================================\n\n"; if (Tyra::Info::writeLogsToFile) { - auto* logFile = getLogFile(); - *logFile << ss2.str(); - logFile->flush(); + std::ofstream logFile; + logFile.open(Tyra::FileUtils::fromCwd("log.txt"), + std::ofstream::out | std::ofstream::app); + logFile << ss2.str(); + logFile.flush(); + // logFile.close(); } else { printf("%s", ss2.str().c_str()); } @@ -92,9 +101,6 @@ class TyraDebug { } private: - static std::unique_ptr logFile; - static std::ofstream* getLogFile(); - template static void writeAssertLines(Arg&& arg, Args&&... args) { std::stringstream ss; @@ -105,9 +111,12 @@ class TyraDebug { 0, (void(ss << "| " << std::forward(args) << "\n"), 0)...}; if (Tyra::Info::writeLogsToFile) { - auto* logfile = getLogFile(); - *logfile << ss.str(); - logFile->flush(); + std::ofstream logFile; + logFile.open(Tyra::FileUtils::fromCwd("log.txt"), + std::ofstream::out | std::ofstream::app); + logFile << ss.str(); + logFile.flush(); + // logFile.close(); } else { printf("%s", ss.str().c_str()); } diff --git a/engine/src/debug/debug.cpp b/engine/src/debug/debug.cpp index 292a10a..1ab67c7 100644 --- a/engine/src/debug/debug.cpp +++ b/engine/src/debug/debug.cpp @@ -8,18 +8,18 @@ # Wellington Carvalho */ -#include "debug/debug.hpp" +// #include "debug/debug.hpp" -std::unique_ptr TyraDebug::logFile; +// std::unique_ptr TyraDebug::logFile; -std::ofstream* TyraDebug::getLogFile() { - if (logFile) { - return logFile.get(); - } else { - logFile = std::make_unique(); - logFile->open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); - return logFile.get(); - } +// std::ofstream* TyraDebug::getLogFile() { +// if (logFile) { +// return logFile.get(); +// } else { +// logFile = std::make_unique(); +// logFile->open(Tyra::FileUtils::fromCwd("log.txt"), +// std::ofstream::out | std::ofstream::app); +// return logFile.get(); +// } -} // namespace Tyra +// } // namespace Tyra From 7736f00d7193a2ba5886f0bcf37cf131aec436d8 Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Sat, 4 Nov 2023 22:40:13 -0300 Subject: [PATCH 11/16] Update debug.hpp formatted with clang --- engine/inc/debug/debug.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/engine/inc/debug/debug.hpp b/engine/inc/debug/debug.hpp index d1e04ea..1be20b2 100644 --- a/engine/inc/debug/debug.hpp +++ b/engine/inc/debug/debug.hpp @@ -50,9 +50,9 @@ class TyraDebug { if (Tyra::Info::writeLogsToFile) { std::ofstream logFile; logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); + std::ofstream::out | std::ofstream::app); logFile << ss.str(); - logFile.flush(); + logFile.flush(); // logFile.close(); } else { printf("%s", ss.str().c_str()); @@ -70,7 +70,7 @@ class TyraDebug { if (Tyra::Info::writeLogsToFile) { std::ofstream logFile; logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); + std::ofstream::out | std::ofstream::app); logFile << ss1.str(); logFile.flush(); // logFile.close(); @@ -88,7 +88,7 @@ class TyraDebug { if (Tyra::Info::writeLogsToFile) { std::ofstream logFile; logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); + std::ofstream::out | std::ofstream::app); logFile << ss2.str(); logFile.flush(); // logFile.close(); @@ -113,7 +113,7 @@ class TyraDebug { if (Tyra::Info::writeLogsToFile) { std::ofstream logFile; logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); + std::ofstream::out | std::ofstream::app); logFile << ss.str(); logFile.flush(); // logFile.close(); From ce4e2f663fe70dd298c7e51dfda1f4a67683f61a Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Sat, 4 Nov 2023 23:27:16 -0300 Subject: [PATCH 12/16] optimization code created writeInLogFile function tested in real PS2 and emulator --- engine/inc/debug/debug.hpp | 30 ++++++------------------------ engine/src/debug/debug.cpp | 23 +++++++++-------------- 2 files changed, 15 insertions(+), 38 deletions(-) diff --git a/engine/inc/debug/debug.hpp b/engine/inc/debug/debug.hpp index 1be20b2..1f4069b 100644 --- a/engine/inc/debug/debug.hpp +++ b/engine/inc/debug/debug.hpp @@ -48,12 +48,7 @@ class TyraDebug { (void)expander{0, (void(ss << std::forward(args)), 0)...}; if (Tyra::Info::writeLogsToFile) { - std::ofstream logFile; - logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); - logFile << ss.str(); - logFile.flush(); - // logFile.close(); + writeInLogFile(&ss); } else { printf("%s", ss.str().c_str()); } @@ -68,12 +63,7 @@ class TyraDebug { ss1 << "|\n"; if (Tyra::Info::writeLogsToFile) { - std::ofstream logFile; - logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); - logFile << ss1.str(); - logFile.flush(); - // logFile.close(); + writeInLogFile(&ss1); } else { printf("%s", ss1.str().c_str()); } @@ -86,12 +76,7 @@ class TyraDebug { ss2 << "====================================\n\n"; if (Tyra::Info::writeLogsToFile) { - std::ofstream logFile; - logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); - logFile << ss2.str(); - logFile.flush(); - // logFile.close(); + writeInLogFile(&ss2); } else { printf("%s", ss2.str().c_str()); } @@ -101,6 +86,8 @@ class TyraDebug { } private: + static void writeInLogFile(std::stringstream* ss); + template static void writeAssertLines(Arg&& arg, Args&&... args) { std::stringstream ss; @@ -111,12 +98,7 @@ class TyraDebug { 0, (void(ss << "| " << std::forward(args) << "\n"), 0)...}; if (Tyra::Info::writeLogsToFile) { - std::ofstream logFile; - logFile.open(Tyra::FileUtils::fromCwd("log.txt"), - std::ofstream::out | std::ofstream::app); - logFile << ss.str(); - logFile.flush(); - // logFile.close(); + writeInLogFile(&ss); } else { printf("%s", ss.str().c_str()); } diff --git a/engine/src/debug/debug.cpp b/engine/src/debug/debug.cpp index 1ab67c7..aff2466 100644 --- a/engine/src/debug/debug.cpp +++ b/engine/src/debug/debug.cpp @@ -8,18 +8,13 @@ # Wellington Carvalho */ -// #include "debug/debug.hpp" +#include "debug/debug.hpp" -// std::unique_ptr TyraDebug::logFile; - -// std::ofstream* TyraDebug::getLogFile() { -// if (logFile) { -// return logFile.get(); -// } else { -// logFile = std::make_unique(); -// logFile->open(Tyra::FileUtils::fromCwd("log.txt"), -// std::ofstream::out | std::ofstream::app); -// return logFile.get(); -// } - -// } // namespace Tyra +void TyraDebug::writeInLogFile(std::stringstream* ss) { + std::ofstream logFile; + logFile.open(Tyra::FileUtils::fromCwd("log.txt"), + std::ofstream::out | std::ofstream::app); + logFile << ss->str(); + logFile.flush(); + // logFile.close(); +} From f4f527b877889403f56c5d7b184b44e570616da2 Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Sat, 4 Nov 2023 23:28:09 -0300 Subject: [PATCH 13/16] Update debug.hpp clang format --- engine/inc/debug/debug.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/inc/debug/debug.hpp b/engine/inc/debug/debug.hpp index 1f4069b..159bc51 100644 --- a/engine/inc/debug/debug.hpp +++ b/engine/inc/debug/debug.hpp @@ -87,7 +87,7 @@ class TyraDebug { private: static void writeInLogFile(std::stringstream* ss); - + template static void writeAssertLines(Arg&& arg, Args&&... args) { std::stringstream ss; From 19c673767c39eeff46178ad9c6e6e08227c21f96 Mon Sep 17 00:00:00 2001 From: Guido Diego Quispe Robles Date: Wed, 8 Nov 2023 16:07:37 -0300 Subject: [PATCH 14/16] Debug Update Screen debug for errors --- Makefile.base | 2 +- engine/inc/debug/debug.hpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Makefile.base b/Makefile.base index e31c0b7..653ac9a 100644 --- a/Makefile.base +++ b/Makefile.base @@ -16,7 +16,7 @@ IRXEMBEDDEDEXT := irx-em CFLAGS += -D_EE -Wall -O3 LINKFLAGS += -O3 -Wl,-zmax-page-size=128 ASFLAGS += -O3 -LIB += -lstdc++ -ldma -lpacket2 -lgraph -ldraw -lmath3d -lpng -lz -lpad -laudsrv -lpatches -lcdvd +LIB += -lstdc++ -ldma -lpacket2 -lgraph -ldraw -lmath3d -lpng -ldebug -lz -lpad -laudsrv -lpatches -lcdvd INC += -I$(PS2DEV)/ps2sdk/ee/include -I$(PS2DEV)/ps2sdk/common/include -I$(PS2DEV)/ps2sdk/ports/include #--------------------------------------------------------------------------------- diff --git a/engine/inc/debug/debug.hpp b/engine/inc/debug/debug.hpp index 159bc51..a8d3e97 100644 --- a/engine/inc/debug/debug.hpp +++ b/engine/inc/debug/debug.hpp @@ -20,6 +20,7 @@ #else // IF Debug #include +#include #include #include #include @@ -81,7 +82,12 @@ class TyraDebug { printf("%s", ss2.str().c_str()); } + init_scr(); for (;;) { + scr_setXY(20, 10); + scr_printf(ss1.str().c_str()); + writeAssertLinesInScreen(args...); + scr_printf(ss2.str().c_str()); } } @@ -103,6 +109,18 @@ class TyraDebug { printf("%s", ss.str().c_str()); } } + + template + static void writeAssertLinesInScreen(Arg&& arg, Args&&... args) { + std::stringstream ss; + + ss << "| " << std::forward(arg) << "\n"; + using expander = int[]; + (void)expander{ + 0, (void(ss << "| " << std::forward(args) << "\n"), 0)...}; + + scr_printf(ss.str().c_str()); + } }; #endif // NDEBUG \ No newline at end of file From b344fd4141c4d71cb927de15d3691673b24cc832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Fri, 10 Nov 2023 13:09:28 -0300 Subject: [PATCH 15/16] Compact IRX externs --- engine/src/irx/irx_loader.cpp | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/engine/src/irx/irx_loader.cpp b/engine/src/irx/irx_loader.cpp index c36f9b8..32b095d 100644 --- a/engine/src/irx/irx_loader.cpp +++ b/engine/src/irx/irx_loader.cpp @@ -20,30 +20,18 @@ #include "file/file_utils.hpp" // external IRX modules +#define EXTERN_IRX(_irx) \ + extern u8 _irx[]; \ + extern int size_##_irx -extern u8 sio2man_irx[]; -extern int size_sio2man_irx; - -extern u8 padman_irx[]; -extern int size_padman_irx; - -extern u8 audsrv_irx[]; -extern int size_audsrv_irx; - -extern u8 libsd_irx[]; -extern int size_libsd_irx; - -extern u8 bdm_irx[]; -extern int size_bdm_irx; - -extern u8 bdmfs_fatfs_irx[]; -extern int size_bdmfs_fatfs_irx; - -extern u8 usbd_irx[]; -extern int size_usbd_irx; - -extern u8 usbmass_bd_irx[]; -extern int size_usbmass_bd_irx; +EXTERN_IRX(io2man_irx); +EXTERN_IRX(padman_irx); +EXTERN_IRX(audsrv_irx); +EXTERN_IRX(libsd_irx); +EXTERN_IRX(bdm_irx); +EXTERN_IRX(bdmfs_fatfs_irx); +EXTERN_IRX(usbd_irx); +EXTERN_IRX(usbmass_bd_irx); namespace Tyra { From 795910de69cf42191a5f08660b8926a5aa39d904 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:45:57 -0300 Subject: [PATCH 16/16] Update irx_loader.cpp --- engine/src/irx/irx_loader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/src/irx/irx_loader.cpp b/engine/src/irx/irx_loader.cpp index 32b095d..a60bef2 100644 --- a/engine/src/irx/irx_loader.cpp +++ b/engine/src/irx/irx_loader.cpp @@ -24,7 +24,7 @@ extern u8 _irx[]; \ extern int size_##_irx -EXTERN_IRX(io2man_irx); +EXTERN_IRX(sio2man_irx); EXTERN_IRX(padman_irx); EXTERN_IRX(audsrv_irx); EXTERN_IRX(libsd_irx);