Big CleanUp
This commit is contained in:
		
							
								
								
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @@ -55,6 +55,7 @@ | ||||
|         "ratio": "cpp", | ||||
|         "regex": "cpp", | ||||
|         "shared_mutex": "cpp", | ||||
|         "valarray": "cpp" | ||||
|         "valarray": "cpp", | ||||
|         "random": "cpp" | ||||
|     } | ||||
| } | ||||
							
								
								
									
										86
									
								
								include/renderd7/BitmapPrinter.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								include/renderd7/BitmapPrinter.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
| #include <vector> | ||||
|  | ||||
| #include <renderd7/bmp.hpp> | ||||
| #include <renderd7/bmpconverter.hpp> | ||||
|  | ||||
| #include <renderd7/Image.hpp> | ||||
|  | ||||
| #include <renderd7/Time.hpp> | ||||
| #include <renderd7/Screen.hpp> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     class BitmapPrinter | ||||
|     { | ||||
|         public: | ||||
|         BitmapPrinter(int w, int h); | ||||
|         ~BitmapPrinter(); | ||||
|         bool DecodeFile(std::string file); | ||||
|          | ||||
|         bool DecodeMem(std::vector<unsigned char> buffer); | ||||
|         void DrawPixel(int x, int y, u8 b, u8 g, u8 r, u8 a); | ||||
|         void DrawRect(int x, int y, int w, int h, u8 line_w, u8 b, u8 g, u8 r, u8 a); | ||||
|         void DrawRectFilled(int x, int y, int w, int h, u8 b, u8 g, u8 r, u8 a); | ||||
|         void UsePreMap(BMP map); | ||||
|         void UsePrePrintMap(BitmapPrinter printmap); | ||||
|         BMP GetBitmap(){ return bitmap; } | ||||
|         void SaveBmp(std::string name); | ||||
|         void SavePng(std::string name); | ||||
|  | ||||
|         void CreateScreen(C3D_RenderTarget *target); | ||||
|         bool DrawScreenDirectF(int framerate); | ||||
|         bool DrawScreenDirect(); | ||||
|         void DrawScreenF(int framerate); | ||||
|         void DrawScreen(); | ||||
|         bool UpdateScreenF(int framerate); | ||||
|         bool UpdateScreen(); | ||||
|         void Clear(u8 b = 0, u8 g = 0, u8 r = 0, u8 a = 255); | ||||
|         void ClearBlank(); | ||||
|         RenderD7::Image GetImage(); | ||||
|         /// Test to Find out The Best Settings for BitmapPrinter | ||||
|         void Benchmark(); | ||||
|         /// Setup the Benchmark | ||||
|         /// \param framerate The Fps of the ScreenUpdates | ||||
|         void SetupBenchmark(int framerate); | ||||
|         bool IsBenchmarkRunning() { return this->benchmark; } | ||||
|  | ||||
|         void DrawText(int x, int y, float t_size, u32 color, std::string text); | ||||
|         private: | ||||
|         //funcs | ||||
|         void DrawChar(u32 posX, u32 posY, u32 color, char character); | ||||
|         //parameter | ||||
|         int frame = 0; | ||||
|         RenderD7::Image renderframe; | ||||
|         bool isscreen = false; | ||||
|         C3D_RenderTarget* targetr; | ||||
|         BMP bitmap = BMP(20, 20, true); //Need to Set e Predefined Bitmap. If not the System will Crash. | ||||
|         BMP blank = BMP(20, 20, true);  //Need to Set e Predefined Bitmap. If not the System will Crash. | ||||
|  | ||||
|         /////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|         //Benchmark Stuff; | ||||
|         bool benchmark = false; | ||||
|         bool setupbenchmark; | ||||
|         float frametime = 0; | ||||
|         uint64_t lastTime = 0; | ||||
|         float dtt = 0.f; | ||||
|         float dtt2 = 0.f; | ||||
|         float dtt3 = 0.f; | ||||
|         float timer = 0; | ||||
|         float mhdtt = 0; | ||||
|         float mdtt2; | ||||
|         float mdtt3; | ||||
|  | ||||
|         float fpsClock = 0.f; | ||||
| 	    int frameCounter = 0, fps = 0; | ||||
|  | ||||
|         std::vector<float> hdttt; | ||||
|         std::vector<float> hdttt2; | ||||
|         std::vector<float> hdttt3; | ||||
|         std::vector<int> fpscountc; | ||||
|         int renderedframes = 0; | ||||
|         int testfps = 60; | ||||
|         //////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     }; | ||||
| } | ||||
| @@ -1,23 +0,0 @@ | ||||
| #pragma once | ||||
| #include <renderd7/Time.hpp> | ||||
|  | ||||
| namespace rnd7 { | ||||
|     class Clock { | ||||
|     public: | ||||
|         Clock() {}; | ||||
|  | ||||
|         virtual ~Clock() {}; | ||||
|  | ||||
|          | ||||
|         virtual Time getCurrentTime() const { return Time{}; }; | ||||
|  | ||||
|         Time getElapsedTime() const; | ||||
|  | ||||
|         Time restart(); | ||||
|  | ||||
|     protected: | ||||
|  | ||||
|         Time m_startTime; ///< Time of last reset, in microseconds | ||||
|     }; | ||||
|  | ||||
| } | ||||
							
								
								
									
										39
									
								
								include/renderd7/Color.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								include/renderd7/Color.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
| #include <unistd.h> | ||||
| #include <memory> | ||||
| #include <cstring> | ||||
| #include <functional> | ||||
| #include <sstream> | ||||
| #include <regex> | ||||
|  | ||||
| #define UNPACK_RGBA(col) (uint8_t) (col >> 24), (col >> 16), (col >> 8), (col) | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     namespace Color | ||||
|     { | ||||
|         enum ColorFmt | ||||
|         { | ||||
|             RGBA8, | ||||
|             RGB8, | ||||
|             RGB565, | ||||
|             BGRA8, | ||||
|             BGR8 | ||||
|         }; | ||||
|         struct rgba | ||||
|         { | ||||
|             uint8_t r, g, b, a; | ||||
|         }; | ||||
|         class RGBA{ | ||||
|             public: | ||||
|             RGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a) : m_r(r),m_g(g),m_b(b),m_a(a){} | ||||
|             uint32_t toRGBA() const {return (m_r << 24) | (m_g << 16) | (m_b << 8) | m_a;} | ||||
|              | ||||
|             uint8_t m_r, m_g ,m_b, m_a; | ||||
|         }; | ||||
|         std::string RGB2Hex(int r, int g, int b); | ||||
|         uint32_t Hex(const std::string color, uint8_t a = 255); | ||||
|         uint32_t Convert(uint32_t src, RenderD7::Color::ColorFmt srcFormat, RenderD7::Color::ColorFmt dstFormat); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										48
									
								
								include/renderd7/Image.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								include/renderd7/Image.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| #pragma once | ||||
| #include <citro2d.h> | ||||
| #include <citro3d.h> | ||||
| #include <memory> | ||||
|  | ||||
| #include <renderd7/Sheet.hpp> | ||||
| #include <renderd7/bmp.hpp> | ||||
| #include <renderd7/bmpconverter.hpp> | ||||
|  | ||||
| #include <renderd7/external/lodepng.h> | ||||
| #include <renderd7/Color.hpp> | ||||
| #include <cassert> | ||||
| #include <cstring> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     /// Image Class | ||||
|     class Image | ||||
|     { | ||||
|         public: | ||||
|         Image(){} | ||||
|         ~Image(); | ||||
|  | ||||
|         void Unload(); | ||||
|         /// Load Image from Png | ||||
|         /// \param path path to png file | ||||
|         void LoadPng(const std::string path); | ||||
|         /// Load the Image from buffer | ||||
|         /// \param buffer the frame buffer | ||||
|         void LoadPFromBuffer(const std::vector<u8> &buffer); | ||||
|         void LoadFromBitmap(BMP bitmap); | ||||
|         /// Draw the Image directly | ||||
|         /// \param x The x position | ||||
|         /// \param y the y position | ||||
|         /// \param scaleX x scale from 0.0 to 1.0 | ||||
|         /// \param scaleY y scale from 0.0 to 1.0 | ||||
|         bool Draw(float x, float y, float scaleX = 1.0f, float scaleY = 1.0f); | ||||
|         /// \brief Get The Image | ||||
|         /// \return C2D_Image | ||||
|         C2D_Image Get(){return this->img;} | ||||
|  | ||||
|         void FromSheet(RenderD7::Sheet sheet, size_t index); | ||||
|         /// \param img this is the C2D_Image | ||||
|         C2D_Image img; | ||||
|         /// \param loadet whether the image is loadet or not | ||||
|         bool loadet = false; | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										17
									
								
								include/renderd7/Ovl.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								include/renderd7/Ovl.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| #pragma once | ||||
| #include <memory> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     class Ovl { | ||||
|         public: | ||||
|         virtual ~Ovl(){} | ||||
|         virtual void Draw() const = 0; | ||||
|         virtual void Logic() = 0; | ||||
|         inline bool IsKilled() {return this->iskilled; } | ||||
|         inline void Kill() { iskilled = true; } | ||||
|         private: | ||||
|         bool iskilled = false; | ||||
|     }; | ||||
|     void AddOvl(std::unique_ptr<RenderD7::Ovl> scene); | ||||
| } | ||||
							
								
								
									
										15
									
								
								include/renderd7/Screen.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								include/renderd7/Screen.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| #pragma once | ||||
| #include <citro3d.h> | ||||
| #include <citro2d.h> | ||||
|  | ||||
|  | ||||
| extern C3D_RenderTarget* Top; | ||||
| extern C3D_RenderTarget* TopRight; | ||||
| extern C3D_RenderTarget* Bottom; | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     /// Set current RenderScreen | ||||
|     /// \param target The RenderTarget Top, Bottom | ||||
|     void OnScreen(C3D_RenderTarget *target); | ||||
| } | ||||
							
								
								
									
										23
									
								
								include/renderd7/Sheet.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								include/renderd7/Sheet.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| #pragma once | ||||
| #include <citro2d.h> | ||||
| #include <citro3d.h> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     /** The Spritesheet Class */ | ||||
|     class Sheet | ||||
|     { | ||||
|         public: | ||||
|         /// Construct sheet | ||||
|         Sheet(); | ||||
|         // Deconstruct sheet | ||||
|         ~Sheet(); | ||||
|         /// Load a Sritesheet | ||||
|         /// \param path Path to the Spritesheet (.t3x) | ||||
|         Result Load(const char *path); | ||||
|         /// Unload the Spritesheet | ||||
|         void Free(); | ||||
|         /// The Spritesheet | ||||
|         C2D_SpriteSheet spritesheet; | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										40
									
								
								include/renderd7/Sprite.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								include/renderd7/Sprite.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <citro2d.h> | ||||
| #include <citro3d.h> | ||||
|  | ||||
| #include <renderd7/Sheet.hpp> | ||||
| #include <renderd7/Image.hpp> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     /// Sprite Class | ||||
|     class Sprite | ||||
|     { | ||||
|         public: | ||||
|         /// \brief Construct Sprite | ||||
|         Sprite(); | ||||
|         /// \brief Deconstruct Sprite | ||||
|         ~Sprite(); | ||||
|         /// \brief Load a Sprite From SpriteSheet | ||||
|         /// \param sheet the Sheet to load from.(RenderD7::Sheet) | ||||
|         /// \param index the number of the Sprite in the Sheet | ||||
|         void FromSheet(RenderD7::Sheet *sheet, size_t index); | ||||
|         /// \brief Load a Sprite From SpriteSheet | ||||
|         /// \param img the Image to load from.(RenderD7::Image) | ||||
|         void FromImage(RenderD7::Image *img); | ||||
|         bool Draw(); | ||||
|         void SetCenter(float x, float y); | ||||
|         void SetPos(float x, float y); | ||||
|         void SetScale(float x, float y); | ||||
|         void SetRotation(float rotation); | ||||
|         void Rotate(float speed); | ||||
|         float getWidth(); | ||||
|         float getHeigh(); | ||||
|         float getPosX(); | ||||
|         float getPosY(); | ||||
|         private: | ||||
|         C2D_ImageTint tint; | ||||
|         C2D_Sprite sprite; | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										25
									
								
								include/renderd7/SpriteAnimation.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								include/renderd7/SpriteAnimation.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <renderd7/Sprite.hpp> | ||||
| #include <renderd7/Sheet.hpp> | ||||
|  | ||||
| #include <citro2d.h> | ||||
| #include <citro3d.h> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     class SpriteSheetAnimation : public RenderD7::Sprite | ||||
|     { | ||||
|         public: | ||||
|         SpriteSheetAnimation(); | ||||
|         ~SpriteSheetAnimation(); | ||||
|         void Setup(RenderD7::Sheet *sheet, size_t imagecount, size_t startimage, float frame_begin, float frame_finish); | ||||
|         void Play(float timespeed); | ||||
|         private: | ||||
|         size_t images; | ||||
|         size_t imgs = 0; | ||||
|         float D_totaltime; | ||||
|         RenderD7::Sheet *sheet; | ||||
|         float time; | ||||
|     }; | ||||
| } | ||||
| @@ -1,82 +1,8 @@ | ||||
| namespace rnd7 { | ||||
| class Time { | ||||
|     public: | ||||
| #pragma once | ||||
| #include <string> | ||||
|  | ||||
|         Time(); | ||||
|  | ||||
|         float asSeconds() const; | ||||
|  | ||||
|         int asMilliseconds() const; | ||||
|  | ||||
|         long asMicroseconds() const; | ||||
|  | ||||
|         static const Time Zero_; | ||||
|  | ||||
|     private: | ||||
|  | ||||
|         friend Time seconds(float); | ||||
|  | ||||
|         friend Time milliseconds(int); | ||||
|  | ||||
|         friend Time microseconds(long); | ||||
|  | ||||
|         explicit Time(long microseconds); | ||||
|  | ||||
|     private: | ||||
|  | ||||
|         long m_microseconds; ///< Time value stored as microseconds | ||||
|     }; | ||||
|  | ||||
|     Time seconds(float amount); | ||||
|  | ||||
|     Time milliseconds(int amount); | ||||
|  | ||||
|     Time microseconds(long amount); | ||||
|  | ||||
|     bool operator==(Time left, Time right); | ||||
|  | ||||
|     bool operator!=(Time left, Time right); | ||||
|  | ||||
|     bool operator<(Time left, Time right); | ||||
|  | ||||
|     bool operator>(Time left, Time right); | ||||
|     bool operator<=(Time left, Time right); | ||||
|  | ||||
|     bool operator>=(Time left, Time right); | ||||
|  | ||||
|     Time operator-(Time right); | ||||
|     Time operator+(Time left, Time right); | ||||
|  | ||||
|     Time &operator+=(Time &left, Time right); | ||||
|  | ||||
|     Time operator-(Time left, Time right); | ||||
|  | ||||
|     Time &operator-=(Time &left, Time right); | ||||
|  | ||||
|     Time operator*(Time left, float right); | ||||
|  | ||||
|     Time operator*(Time left, long right); | ||||
|  | ||||
|     Time operator*(float left, Time right); | ||||
|  | ||||
|     Time operator*(long left, Time right); | ||||
|  | ||||
|     Time &operator*=(Time &left, float right); | ||||
|  | ||||
|     Time &operator*=(Time &left, long right); | ||||
|  | ||||
|     Time operator/(Time left, float right); | ||||
|  | ||||
|     Time operator/(Time left, long right); | ||||
|  | ||||
|     Time &operator/=(Time &left, float right); | ||||
|  | ||||
|     Time &operator/=(Time &left, long right); | ||||
|  | ||||
|     float operator/(Time left, Time right); | ||||
|  | ||||
|     Time operator%(Time left, Time right); | ||||
|  | ||||
|     Time &operator%=(Time &left, Time right); | ||||
|  | ||||
| }  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     std::string FormatString(std::string fmt_str, ...); | ||||
|     std::string GetTimeStr(void); | ||||
| } | ||||
							
								
								
									
										23
									
								
								include/renderd7/Toast.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								include/renderd7/Toast.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| #pragma once | ||||
| #include <renderd7/Ovl.hpp> | ||||
| #include <renderd7/Image.hpp> | ||||
| #include <renderd7/BitmapPrinter.hpp> | ||||
| #include <renderd7/Color.hpp> | ||||
| #include <renderd7/Screen.hpp> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|     class Toast : public RenderD7::Ovl | ||||
|     { | ||||
|         public: | ||||
|         Toast(std::string head, std::string msg); | ||||
|         void Draw(void) const override; | ||||
|         void Logic() override; | ||||
|         private: | ||||
|         RenderD7::BitmapPrinter toast = RenderD7::BitmapPrinter(400, 70); | ||||
|         RenderD7::Image *toastrendered; | ||||
|         std::string head, msg; | ||||
|         int msgposy = 240; | ||||
|         int delay = 0; | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										144
									
								
								include/renderd7/debugfont.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								include/renderd7/debugfont.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | ||||
| /* | ||||
|   This file was autogenerated by raw2c. | ||||
| Visit http://www.devkitpro.org | ||||
| */ | ||||
|  | ||||
| //--------------------------------------------------------------------------------- | ||||
| #ifndef _debugfont_h_ | ||||
| #define _debugfont_h_ | ||||
| //--------------------------------------------------------------------------------- | ||||
| static const unsigned char debugfont[] = { | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, | ||||
|     0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e, 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, | ||||
|     0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x3c, 0x3c, 0x18, 0xff, 0xe7, 0x18, 0x3c, 0x00, | ||||
|     0x10, 0x38, 0x7c, 0xfe, 0xee, 0x10, 0x38, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, | ||||
|     0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, | ||||
|     0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78, | ||||
|     0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x08, 0x0c, 0x0a, 0x0a, 0x08, 0x78, 0xf0, 0x00, | ||||
|     0x18, 0x14, 0x1a, 0x16, 0x72, 0xe2, 0x0e, 0x1c, 0x10, 0x54, 0x38, 0xee, 0x38, 0x54, 0x10, 0x00, | ||||
|     0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00, 0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00, | ||||
|     0x18, 0x3c, 0x5a, 0x18, 0x5a, 0x3c, 0x18, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00, | ||||
|     0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x00, 0x1c, 0x22, 0x38, 0x44, 0x44, 0x38, 0x88, 0x70, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x18, 0x3c, 0x5a, 0x18, 0x5a, 0x3c, 0x18, 0x7e, | ||||
|     0x18, 0x3c, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x5a, 0x3c, 0x18, 0x00, | ||||
|     0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, | ||||
|     0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x24, 0x42, 0xff, 0x42, 0x24, 0x00, 0x00, | ||||
|     0x00, 0x10, 0x38, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x00, | ||||
|     0x6c, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, | ||||
|     0x10, 0x7c, 0xd0, 0x7c, 0x16, 0xfc, 0x10, 0x00, 0x00, 0x66, 0xac, 0xd8, 0x36, 0x6a, 0xcc, 0x00, | ||||
|     0x38, 0x4c, 0x38, 0x78, 0xce, 0xcc, 0x7a, 0x00, 0x30, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00, 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, | ||||
|     0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x20, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x00, | ||||
|     0x7c, 0xce, 0xde, 0xf6, 0xe6, 0xe6, 0x7c, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x7e, 0x00, | ||||
|     0x7c, 0xc6, 0x06, 0x1c, 0x70, 0xc6, 0xfe, 0x00, 0x7c, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0x7c, 0x00, | ||||
|     0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00, 0xfe, 0xc0, 0xfc, 0x06, 0x06, 0xc6, 0x7c, 0x00, | ||||
|     0x7c, 0xc6, 0xc0, 0xfc, 0xc6, 0xc6, 0x7c, 0x00, 0xfe, 0xc6, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00, | ||||
|     0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0x00, 0x7c, 0xc6, 0xc6, 0x7e, 0x06, 0xc6, 0x7c, 0x00, | ||||
|     0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x10, 0x20, | ||||
|     0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, | ||||
|     0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00, | ||||
|     0x7c, 0x82, 0x9e, 0xa6, 0x9e, 0x80, 0x7c, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, | ||||
|     0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, | ||||
|     0xfc, 0x66, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00, | ||||
|     0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xce, 0xc6, 0x7e, 0x00, | ||||
|     0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, | ||||
|     0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00, | ||||
|     0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x82, 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0x00, | ||||
|     0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, | ||||
|     0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x06, | ||||
|     0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xe6, 0x00, 0x7c, 0xc6, 0xc0, 0x7c, 0x06, 0xc6, 0x7c, 0x00, | ||||
|     0x7e, 0x5a, 0x5a, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, | ||||
|     0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x82, 0x00, | ||||
|     0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x3c, 0x00, | ||||
|     0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00, 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00, | ||||
|     0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, | ||||
|     0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, | ||||
|     0x30, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, | ||||
|     0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc6, 0x7c, 0x00, | ||||
|     0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00, | ||||
|     0x1c, 0x36, 0x30, 0x78, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x78, | ||||
|     0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, | ||||
|     0x00, 0x0c, 0x00, 0x1c, 0x0c, 0x0c, 0xcc, 0x78, 0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00, | ||||
|     0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0xcc, 0xfe, 0xd6, 0xd6, 0xd6, 0x00, | ||||
|     0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, | ||||
|     0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0, 0x00, 0x00, 0x7c, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e, | ||||
|     0x00, 0x00, 0xde, 0x76, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x7c, 0xc0, 0x7c, 0x06, 0x7c, 0x00, | ||||
|     0x10, 0x30, 0xfc, 0x30, 0x30, 0x34, 0x18, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, | ||||
|     0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, | ||||
|     0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8, | ||||
|     0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00, 0x0e, 0x18, 0x18, 0x30, 0x18, 0x18, 0x0e, 0x00, | ||||
|     0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0xe0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xe0, 0x00, | ||||
|     0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00, | ||||
|     0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x70, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, | ||||
|     0x0e, 0x10, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00, 0x7c, 0x82, 0x38, 0x0c, 0x7c, 0xcc, 0x76, 0x00, | ||||
|     0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, 0xe0, 0x10, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, | ||||
|     0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x7c, 0xc0, 0xc0, 0x7c, 0x18, 0x70, | ||||
|     0x7c, 0x82, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00, | ||||
|     0xe0, 0x10, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, | ||||
|     0x7c, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xe0, 0x10, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, | ||||
|     0xc6, 0x00, 0x7c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00, 0x38, 0x38, 0x7c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00, | ||||
|     0x0e, 0x10, 0xfe, 0x60, 0x78, 0x60, 0xfe, 0x00, 0x00, 0x00, 0x7c, 0x12, 0x7e, 0xd0, 0x7e, 0x00, | ||||
|     0x7e, 0xc8, 0xc8, 0xfe, 0xc8, 0xc8, 0xce, 0x00, 0x7c, 0x82, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, | ||||
|     0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0xe0, 0x10, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, | ||||
|     0x7c, 0x82, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0xe0, 0x10, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, | ||||
|     0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, | ||||
|     0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x18, 0x7c, 0xd6, 0xd0, 0xd6, 0x7c, 0x18, 0x00, | ||||
|     0x38, 0x6c, 0x60, 0xf0, 0x60, 0xf2, 0xdc, 0x00, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x00, | ||||
|     0xf8, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0x06, 0x0e, 0x1b, 0x18, 0x3c, 0x18, 0x18, 0xd8, 0x70, | ||||
|     0x0e, 0x10, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, 0x0e, 0x10, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, | ||||
|     0x0e, 0x10, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x0e, 0x10, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, | ||||
|     0x66, 0x98, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x98, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0x00, | ||||
|     0x38, 0x0c, 0x3c, 0x34, 0x00, 0x7e, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, | ||||
|     0x30, 0x00, 0x30, 0x60, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0xc0, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00, 0xc0, 0xc8, 0xd0, 0xfe, 0x46, 0x8c, 0x1e, 0x00, | ||||
|     0xc0, 0xc8, 0xd0, 0xec, 0x5c, 0xbe, 0x0c, 0x00, 0x18, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x18, 0x00, | ||||
|     0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, | ||||
|     0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, | ||||
|     0xdb, 0x77, 0xdb, 0xee, 0xdb, 0x77, 0xdb, 0xee, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, | ||||
|     0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, | ||||
|     0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, | ||||
|     0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, | ||||
|     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, | ||||
|     0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, | ||||
|     0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, | ||||
|     0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, | ||||
|     0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, | ||||
|     0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, | ||||
|     0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, | ||||
|     0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, | ||||
|     0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, | ||||
|     0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, | ||||
|     0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, | ||||
|     0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, | ||||
|     0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x74, 0xcc, 0xc8, 0xdc, 0x76, 0x00, 0x78, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xdc, 0x40, | ||||
|     0xfe, 0x62, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x02, 0x7e, 0xec, 0x6c, 0x6c, 0x48, 0x00, | ||||
|     0xfe, 0x62, 0x30, 0x18, 0x30, 0x62, 0xfe, 0x00, 0x00, 0x00, 0x7e, 0xd0, 0xc8, 0xc8, 0x70, 0x00, | ||||
|     0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xf8, 0x80, 0x00, 0x00, 0x7e, 0xd8, 0x18, 0x18, 0x10, 0x00, | ||||
|     0x38, 0x10, 0x7c, 0xd6, 0xd6, 0x7c, 0x10, 0x38, 0x7c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x7c, 0x00, | ||||
|     0x7c, 0xc6, 0xc6, 0xc6, 0x6c, 0x28, 0xee, 0x00, 0x3c, 0x22, 0x18, 0x7c, 0xcc, 0xcc, 0x78, 0x00, | ||||
|     0x00, 0x00, 0x66, 0x99, 0x99, 0x66, 0x00, 0x00, 0x00, 0x06, 0x7c, 0x9e, 0xf2, 0x7c, 0xc0, 0x00, | ||||
|     0x00, 0x00, 0x7c, 0xc0, 0xf8, 0xc0, 0x7c, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, | ||||
|     0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x7e, 0x00, | ||||
|     0x30, 0x18, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0x00, 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0x7c, 0x00, | ||||
|     0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70, | ||||
|     0x00, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, | ||||
|     0x38, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c, 0x00, | ||||
|     0xd8, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x30, 0xc0, 0xf0, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||
|  | ||||
| }; | ||||
| const int debugfont_size = sizeof(debugfont); | ||||
| //--------------------------------------------------------------------------------- | ||||
| #endif //_font_h_ | ||||
| //--------------------------------------------------------------------------------- | ||||
| @@ -28,10 +28,18 @@ | ||||
| #include <renderd7/thread.hpp> | ||||
| #include <renderd7/ini.hpp> | ||||
| #include <renderd7/stringtool.hpp> | ||||
| #include <renderd7/Clock.hpp> | ||||
| #include <renderd7/bmp.hpp> | ||||
| #include <renderd7/bmpconverter.hpp> | ||||
|  | ||||
| #include <renderd7/Toast.hpp> | ||||
| #include <renderd7/Ovl.hpp> | ||||
| #include <renderd7/BitmapPrinter.hpp> | ||||
| #include <renderd7/Image.hpp> | ||||
| #include <renderd7/Sprite.hpp> | ||||
| #include <renderd7/SpriteAnimation.hpp> | ||||
| #include <renderd7/Sheet.hpp> | ||||
| #include <renderd7/Color.hpp> | ||||
| #include <renderd7/Time.hpp> | ||||
| #include <renderd7/Screen.hpp> | ||||
|  | ||||
| extern "C" | ||||
| { | ||||
| @@ -42,9 +50,9 @@ extern "C" | ||||
| #define CHANGELOG "0.8.0: Implement BitmapPrinter\n0.7.3: Implement Over Render Overlay Framework\n0.7.2: Implement MT to csv file saving. Add RGB2HEX. \n0.7.1: Add the New Overlay Handler. Its Just in code and does nothing yet. \n0.7.0: Made Big Progress In the MT Ovl but it still crashes On a Scnd C3D_FrameEnd(). Implement 800px but doesn't work that good. \n0.6.2: Fix Crash when exiting trouth Home Menu.  \n0.6.10: rewrite Threadsystem, Improve framerate\n0.6.02: Fix Code in lang.hpp\nadd Draw Text Left Function.\nadd changelog\n0.6.01: add Threading system." | ||||
| #define DEFAULT_CENTER 0.5f | ||||
|  | ||||
| extern C3D_RenderTarget* Top; | ||||
| /*extern C3D_RenderTarget* Top; | ||||
| extern C3D_RenderTarget* TopRight; | ||||
| extern C3D_RenderTarget* Bottom; | ||||
| extern C3D_RenderTarget* Bottom;*/ | ||||
|  | ||||
| extern u32 d7_hDown; | ||||
| extern u32 d7_hHeld; | ||||
| @@ -77,84 +85,6 @@ namespace RenderD7 | ||||
|         float correcty = 0; //Correct Y Position | ||||
|         float txtsize = 0.7f;  //Set Text Size | ||||
|     }; | ||||
|     /// Set current RenderScreen | ||||
|     /// \param target The RenderTarget Top, Bottom | ||||
|     void OnScreen(C3D_RenderTarget *target); | ||||
|     /** The Spritesheet Class */ | ||||
|     class Sheet | ||||
|     { | ||||
|         public: | ||||
|         /// Construct sheet | ||||
|         Sheet(); | ||||
|         // Deconstruct sheet | ||||
|         ~Sheet(); | ||||
|         /// Load a Sritesheet | ||||
|         /// \param path Path to the Spritesheet (.t3x) | ||||
|         Result Load(const char *path); | ||||
|         /// Unload the Spritesheet | ||||
|         void Free(); | ||||
|         /// The Spritesheet | ||||
|         C2D_SpriteSheet spritesheet; | ||||
|     }; | ||||
|     /// Image Class | ||||
|     class Image | ||||
|     { | ||||
|         public: | ||||
|         ~Image(); | ||||
|  | ||||
|         void Unload(); | ||||
|         /// Load Image from Png | ||||
|         /// \param path path to png file | ||||
|         void LoadPng(const std::string path); | ||||
|         /// Load the Image from buffer | ||||
|         /// \param buffer the frame buffer | ||||
|         void LoadPFromBuffer(const std::vector<u8> &buffer); | ||||
|         void LoadFromBitmap(BMP bitmap); | ||||
|         /// Draw the Image directly | ||||
|         /// \param x The x position | ||||
|         /// \param y the y position | ||||
|         /// \param scaleX x scale from 0.0 to 1.0 | ||||
|         /// \param scaleY y scale from 0.0 to 1.0 | ||||
|         bool Draw(float x, float y, float scaleX = 1.0f, float scaleY = 1.0f); | ||||
|         /// \brief Get The Image | ||||
|         /// \return C2D_Image | ||||
|         C2D_Image Get(){return this->img;} | ||||
|  | ||||
|         void FromSheet(RenderD7::Sheet sheet, size_t index); | ||||
|         /// \param img this is the C2D_Image | ||||
|         C2D_Image img; | ||||
|         /// \param loadet whether the image is loadet or not | ||||
|         bool loadet = false; | ||||
|     }; | ||||
|     /// Sprite Class | ||||
|     class Sprite | ||||
|     { | ||||
|         public: | ||||
|         /// \brief Construct Sprite | ||||
|         Sprite(); | ||||
|         /// \brief Deconstruct Sprite | ||||
|         ~Sprite(); | ||||
|         /// \brief Load a Sprite From SpriteSheet | ||||
|         /// \param sheet the Sheet to load from.(RenderD7::Sheet) | ||||
|         /// \param index the number of the Sprite in the Sheet | ||||
|         void FromSheet(RenderD7::Sheet *sheet, size_t index); | ||||
|         /// \brief Load a Sprite From SpriteSheet | ||||
|         /// \param img the Image to load from.(RenderD7::Image) | ||||
|         void FromImage(RenderD7::Image *img); | ||||
|         bool Draw(); | ||||
|         void SetCenter(float x, float y); | ||||
|         void SetPos(float x, float y); | ||||
|         void SetScale(float x, float y); | ||||
|         void SetRotation(float rotation); | ||||
|         void Rotate(float speed); | ||||
|         float getWidth(); | ||||
|         float getHeigh(); | ||||
|         float getPosX(); | ||||
|         float getPosY(); | ||||
|         private: | ||||
|         C2D_ImageTint tint; | ||||
|         C2D_Sprite sprite; | ||||
|     }; | ||||
|  | ||||
|     class Scene { | ||||
|     public: | ||||
| @@ -209,17 +139,6 @@ namespace RenderD7 | ||||
|  | ||||
|     void LoadSettings(); | ||||
|  | ||||
|     class Ovl { | ||||
|         public: | ||||
|         virtual ~Ovl(){} | ||||
|         virtual void Draw() const = 0; | ||||
|         virtual void Logic() = 0; | ||||
|         inline bool IsKilled() {return this->iskilled; } | ||||
|         inline void Kill() { iskilled = true; } | ||||
|         private: | ||||
|         bool iskilled = false; | ||||
|     }; | ||||
|  | ||||
|     class DSP_NF : public RenderD7::Ovl | ||||
|     { | ||||
|         public: | ||||
| @@ -231,35 +150,7 @@ namespace RenderD7 | ||||
|         int delay = 0; | ||||
|     }; | ||||
|  | ||||
|     class Toast : public RenderD7::Ovl | ||||
|     { | ||||
|         public: | ||||
|         Toast(std::string head, std::string msg); | ||||
|         void Draw(void) const override; | ||||
|         void Logic() override; | ||||
|         private: | ||||
|         std::string head, msg; | ||||
|         int msgposy = 240; | ||||
|         int delay = 0; | ||||
|     }; | ||||
|  | ||||
|     void AddOvl(std::unique_ptr<RenderD7::Ovl> scene); | ||||
|     namespace Color | ||||
|     { | ||||
|         struct rgba | ||||
|         { | ||||
|             u8 r, g, b, a; | ||||
|         }; | ||||
|         class RGBA{ | ||||
|             public: | ||||
|             RGBA(u8 r, u8 g, u8 b, u8 a) : m_r(r),m_g(g),m_b(b),m_a(a){} | ||||
|             u32 toRGBA() const {return (m_r << 24) | (m_g << 16) | (m_b << 8) | m_a;} | ||||
|              | ||||
|             u8 m_r, m_g ,m_b, m_a; | ||||
|         }; | ||||
|         std::string RGB2Hex(int r, int g, int b); | ||||
|         u32 Hex(const std::string color, u8 a = 255); | ||||
|     } | ||||
|      | ||||
|     int GetRandomInt(int b, int e); | ||||
|     void DrawMetrikOvl(); | ||||
|     bool DrawImageFromSheet(RenderD7::Sheet* sheet, size_t index, float x, float y, float scaleX = 1.0, float scaleY = 1.0); | ||||
| @@ -331,21 +222,6 @@ namespace RenderD7 | ||||
|     void FrameEnd(); | ||||
|     void ToggleRD7SR(); | ||||
|     bool IsRD7SR(); | ||||
|  | ||||
|     class SpriteSheetAnimation : public RenderD7::Sprite | ||||
|     { | ||||
|         public: | ||||
|         SpriteSheetAnimation(); | ||||
|         ~SpriteSheetAnimation(); | ||||
|         void Setup(RenderD7::Sheet *sheet, size_t imagecount, size_t startimage, float frame_begin, float frame_finish); | ||||
|         void Play(float timespeed); | ||||
|         private: | ||||
|         size_t images; | ||||
|         size_t imgs = 0; | ||||
|         float D_totaltime; | ||||
|         RenderD7::Sheet *sheet; | ||||
|         float time; | ||||
|     }; | ||||
|      | ||||
|  | ||||
|     struct TLBtn | ||||
| @@ -388,8 +264,7 @@ namespace RenderD7 | ||||
|         u32 outcol, incol, chcol; | ||||
|     }; | ||||
|     void DrawCheckbox(Checkbox box); | ||||
|     std::string FormatString(std::string fmt_str, ...); | ||||
|     std::string GetTimeStr(void); | ||||
|      | ||||
|     class Console | ||||
|     { | ||||
|          public: | ||||
| @@ -412,76 +287,7 @@ namespace RenderD7 | ||||
|            RenderD7::Color::rgba barcolor = {0, 0, 0, 255}; | ||||
|     }; | ||||
|  | ||||
|     bool NameIsEndingWith(const std::string &name, const std::vector<std::string> &extensions); | ||||
|     void GetDirContentsExt(std::vector<RenderD7::DirContent> &dircontent, const std::vector<std::string> &extensions); | ||||
|     void GetDirContents(std::vector<RenderD7::DirContent> &dircontent); | ||||
|  | ||||
|     class BitmapPrinter | ||||
|     { | ||||
|         public: | ||||
|         BitmapPrinter(int w, int h); | ||||
|         ~BitmapPrinter(); | ||||
|         bool DecodeFile(std::string file); | ||||
|          | ||||
|         bool DecodeMem(std::vector<unsigned char> buffer); | ||||
|         void DrawPixel(int x, int y, u8 b, u8 g, u8 r, u8 a); | ||||
|         void DrawRect(int x, int y, int w, int h, u8 line_w, u8 b, u8 g, u8 r, u8 a); | ||||
|         void DrawRectFilled(int x, int y, int w, int h, u8 b, u8 g, u8 r, u8 a); | ||||
|         void UsePreMap(BMP map); | ||||
|         void UsePrePrintMap(BitmapPrinter printmap); | ||||
|         BMP GetBitmap(){ return bitmap; } | ||||
|         void SaveBmp(std::string name); | ||||
|         void SavePng(std::string name); | ||||
|  | ||||
|         void CreateScreen(C3D_RenderTarget *target); | ||||
|         void DrawScreenDirectF(int framerate); | ||||
|         void DrawScreenDirect(); | ||||
|         void DrawScreenF(int framerate); | ||||
|         void DrawScreen(); | ||||
|         void UpdateScreenF(int framerate); | ||||
|         void UpdateScreen(); | ||||
|         void Clear(u8 b = 0, u8 g = 0, u8 r = 0, u8 a = 255); | ||||
|         void ClearBlank(); | ||||
|         RenderD7::Image GetImage(); | ||||
|         /// Test to Find out The Best Settings for BitmapPrinter | ||||
|         void Benchmark(); | ||||
|         /// Setup the Benchmark | ||||
|         /// \param framerate The Fps of the ScreenUpdates | ||||
|         void SetupBenchmark(int framerate); | ||||
|         bool IsBenchmarkRunning() { return this->benchmark; } | ||||
|  | ||||
|         void DrawText(int x, int y, float t_size, u32 color, std::string text); | ||||
|         private: | ||||
|         int frame = 0; | ||||
|         RenderD7::Image renderframe; | ||||
|         bool isscreen = false; | ||||
|         C3D_RenderTarget* targetr; | ||||
|         BMP bitmap = BMP(20, 20, true); //Need to Set e Predefined Bitmap. If not the System will Crash. | ||||
|         BMP blank = BMP(20, 20, true);  //Need to Set e Predefined Bitmap. If not the System will Crash. | ||||
|  | ||||
|         /////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|         //Benchmark Stuff; | ||||
|         bool benchmark = false; | ||||
|         bool setupbenchmark; | ||||
|         float frametime = 0; | ||||
|         uint64_t lastTime = 0; | ||||
|         float dtt = 0.f; | ||||
|         float dtt2 = 0.f; | ||||
|         float dtt3 = 0.f; | ||||
|         float timer = 0; | ||||
|         float mhdtt = 0; | ||||
|         float mdtt2; | ||||
|         float mdtt3; | ||||
|  | ||||
|         float fpsClock = 0.f; | ||||
| 	    int frameCounter = 0, fps = 0; | ||||
|  | ||||
|         std::vector<float> hdttt; | ||||
|         std::vector<float> hdttt2; | ||||
|         std::vector<float> hdttt3; | ||||
|         std::vector<int> fpscountc; | ||||
|         int renderedframes = 0; | ||||
|         int testfps = 60; | ||||
|         //////////////////////////////////////////////////////////////////////////////////////////////// | ||||
|     }; | ||||
| } /// RenderD7 | ||||
|   | ||||
| @@ -1,4 +1,24 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
|  | ||||
| namespace RenderD7 | ||||
| { | ||||
|   inline bool NameIsEndingWith(const std::string &name, const std::vector<std::string> &extensions) | ||||
|   { | ||||
|     if (name.substr(0, 2) == "._") return false; | ||||
|  | ||||
| 	  if (name.size() == 0) return false; | ||||
|  | ||||
| 	  if (extensions.size() == 0) return true; | ||||
|  | ||||
| 	  for(int i = 0; i < (int)extensions.size(); i++) { | ||||
| 		  const std::string ext = extensions.at(i); | ||||
| 		  if (strcasecmp(name.c_str() + name.size() - ext.size(), ext.c_str()) == 0) return true; | ||||
| 	  } | ||||
|  | ||||
| 	  return false; | ||||
|   } | ||||
| } | ||||
| template<class T> | ||||
| T GetFileName(T const & path, T const & delims = "/\\") | ||||
| { | ||||
|   | ||||
							
								
								
									
										386
									
								
								source/BitmapPrinter.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										386
									
								
								source/BitmapPrinter.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,386 @@ | ||||
| #include <renderd7/BitmapPrinter.hpp> | ||||
| #include <renderd7/Ovl.hpp> | ||||
| #include <renderd7/Toast.hpp> | ||||
| #include <renderd7/stringtool.hpp> | ||||
|  | ||||
| extern bool shouldbe_disabled; | ||||
| extern std::string csvpc; | ||||
|  | ||||
| RenderD7::BitmapPrinter::BitmapPrinter(int w, int h) | ||||
| { | ||||
| 	BMP newmap(w, h, true); | ||||
| 	bitmap = newmap; | ||||
| 	//renderframe.LoadPFromBuffer(BitmapConverter::ConvertData(bitmap.DATA())); | ||||
| 	blank = newmap; | ||||
| } | ||||
|  | ||||
| RenderD7::BitmapPrinter::~BitmapPrinter() | ||||
| { | ||||
| 	if(this->renderframe.loadet) this->renderframe.Unload(); | ||||
| } | ||||
|  | ||||
| bool RenderD7::BitmapPrinter::DecodeFile(std::string file) | ||||
| { | ||||
| 	unsigned error = bitmap.read(file.c_str()); | ||||
| 	 | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter", "Error Code: " + std::to_string(error))); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
| bool RenderD7::BitmapPrinter::DecodeMem(std::vector<unsigned char> buffer) | ||||
| { | ||||
| 	unsigned error = bitmap.read_mem(buffer); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter", "Error Code: " + std::to_string(error))); | ||||
| 		return false; | ||||
| 	} | ||||
| 	return true; | ||||
| }	 | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawPixel(int x, int y, u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	unsigned error = bitmap.set_pixel(x, bitmap.bmp_info_header.height - y, b, g, r, a); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter->Pixel", "Error Code: " + std::to_string(error))); | ||||
| 	} | ||||
| } | ||||
| void RenderD7::BitmapPrinter::DrawRect(int x, int y, int w, int h, u8 line_w, u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	unsigned error = bitmap.draw_rectangle(x, bitmap.bmp_info_header.height - y - h,  w, h, b, g, r, a, line_w); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter->Rect", "Error Code: " + std::to_string(error))); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawRectFilled(int x, int y, int w, int h, u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	unsigned error = bitmap.fill_region(x, bitmap.bmp_info_header.height - h - y, w, h, b, g, r, a); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter->RectF", "Error Code: " + std::to_string(error))); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::SaveBmp(std::string name) | ||||
| { | ||||
| 	if(!RenderD7::NameIsEndingWith(name, {"bmp"})) | ||||
|     { | ||||
|         name += ".bmp"; | ||||
|     } | ||||
| 	bitmap.write(name.c_str()); | ||||
| } | ||||
| void RenderD7::BitmapPrinter::SavePng(std::string name) | ||||
| { | ||||
| 	if(!RenderD7::NameIsEndingWith(name, {"png"})) | ||||
|     { | ||||
|         name += ".png"; | ||||
|     } | ||||
| 	std::vector<unsigned char> ImageBuffer; | ||||
| 	ImageBuffer = BitmapConverter::ConvertData(bitmap.DATA()); | ||||
| 	lodepng::save_file(ImageBuffer, name); | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::CreateScreen(C3D_RenderTarget *target) | ||||
| { | ||||
| 	isscreen = true; | ||||
| 	targetr = target; | ||||
| 	if (target == Top) | ||||
| 	{ | ||||
| 		bitmap = BMP(400, 240, true); | ||||
| 		blank = BMP(400, 240, true);	 | ||||
| 	} | ||||
| 	if (target == TopRight) | ||||
| 	{ | ||||
| 		bitmap = BMP(400, 240, true); | ||||
| 		blank = BMP(400, 240, true); | ||||
| 	} | ||||
| 	if (target == Bottom) | ||||
| 	{ | ||||
| 		bitmap = BMP(320, 240, true); | ||||
| 		blank = BMP(320, 240, true); | ||||
| 	} | ||||
| 	renderframe.LoadPFromBuffer(BitmapConverter::ConvertData(bitmap.DATA())); | ||||
| 	 | ||||
| } | ||||
| bool RenderD7::BitmapPrinter::DrawScreenDirectF(int framerate) | ||||
| { | ||||
| 	bool updtt = false; | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(frame == (60/framerate)){ | ||||
| 			RenderD7::OnScreen(targetr); | ||||
| 			if(renderframe.loadet) renderframe.Unload(); | ||||
| 			renderframe.LoadFromBitmap(bitmap); | ||||
| 			frame = 0; | ||||
| 			updtt = true; | ||||
| 		} | ||||
| 		 | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 		frame++; | ||||
| 	} | ||||
| 	return updtt; | ||||
| } | ||||
|  | ||||
| bool RenderD7::BitmapPrinter::DrawScreenDirect() | ||||
| { | ||||
| 	bool updtt = false; | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		RenderD7::OnScreen(targetr); | ||||
| 		if(renderframe.loadet) renderframe.Unload(); | ||||
| 		renderframe.LoadFromBitmap(bitmap); | ||||
| 		updtt = true; | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 	}	 | ||||
| 	return updtt; | ||||
| } | ||||
|  | ||||
| RenderD7::Image RenderD7::BitmapPrinter::GetImage() | ||||
| { | ||||
| 	RenderD7::Image img; | ||||
| 	img.LoadFromBitmap(bitmap); | ||||
| 	return img; | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::UsePreMap(BMP map) | ||||
| { | ||||
| 	bitmap = map; | ||||
| } | ||||
| void RenderD7::BitmapPrinter::UsePrePrintMap(BitmapPrinter printmap) | ||||
| { | ||||
| 	bitmap = printmap.GetBitmap(); | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::Clear(u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	bitmap.fill_region(0, 0, bitmap.bmp_info_header.width, bitmap.bmp_info_header.height, b, g, r, a); | ||||
| } | ||||
| void RenderD7::BitmapPrinter::ClearBlank() | ||||
| { | ||||
| 	bitmap = blank; | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawScreenF(int framerate) | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(frame == (60/framerate)){ | ||||
| 			RenderD7::OnScreen(targetr); | ||||
| 			frame = 0; | ||||
| 		} | ||||
| 		 | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 		frame++; | ||||
| 	} | ||||
| } | ||||
| void RenderD7::BitmapPrinter::DrawScreen() | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		RenderD7::OnScreen(targetr); | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 	} | ||||
| } | ||||
| bool RenderD7::BitmapPrinter::UpdateScreenF(int framerate) | ||||
| { | ||||
| 	bool updtt = false; | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(frame == (60/framerate)){ | ||||
| 			if(renderframe.loadet) renderframe.Unload(); | ||||
| 			renderframe.LoadFromBitmap(bitmap); | ||||
| 			frame = 0; | ||||
| 			updtt = true; | ||||
| 		} | ||||
| 		frame++; | ||||
| 	} | ||||
| 	return updtt; | ||||
| } | ||||
| bool RenderD7::BitmapPrinter::UpdateScreen() | ||||
| { | ||||
| 	bool updtt = false; | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(renderframe.loadet) renderframe.Unload(); | ||||
| 		renderframe.LoadFromBitmap(bitmap); | ||||
| 		updtt = true; | ||||
| 	}	 | ||||
| 	return updtt; | ||||
| } | ||||
|  | ||||
| #define TICKS_PER_MSEC 268111.856 | ||||
|  | ||||
| void RenderD7::BitmapPrinter::Benchmark() | ||||
| { | ||||
| 	if(setupbenchmark) | ||||
| 	{ | ||||
| 		frametime = 0; | ||||
| 		renderedframes = 0; | ||||
| 		timer = 0; | ||||
| 		setupbenchmark = false; | ||||
| 		lastTime = svcGetSystemTick();  | ||||
| 	} | ||||
| 	if(benchmark) | ||||
| 	{ | ||||
| 		if(timer >= 60) | ||||
| 		{ | ||||
| 			std::string renderedf = std::to_string(renderedframes); | ||||
| 			std::string avgdtt = std::to_string(mhdtt); | ||||
| 			float alldtt = 0; | ||||
| 			for (size_t i = 1; i < hdttt.size(); i++) | ||||
| 			{ | ||||
| 				alldtt += hdttt[i]; | ||||
| 			} | ||||
| 			float alldtt2 = 0; | ||||
| 			for (size_t i = 0; i < hdttt2.size(); i++) | ||||
| 			{ | ||||
| 				alldtt2 += hdttt2[i]; | ||||
| 			} | ||||
| 			float alldtt3 = 0; | ||||
| 			for (size_t i = 0; i < hdttt3.size(); i++) | ||||
| 			{ | ||||
| 				alldtt3 += hdttt3[i]; | ||||
| 			} | ||||
| 			int allfps = 0; | ||||
| 			for (size_t f = 1; f < fpscountc.size(); f++) | ||||
| 			{ | ||||
| 				allfps += fpscountc[f]; | ||||
| 			} | ||||
| 			 | ||||
| 			 | ||||
| 			std::string avgcpu = std::to_string((alldtt/(float)hdttt.size()-1)); | ||||
| 			std::string avgcpu2 = std::to_string(((alldtt2/(float)hdttt2.size())*1000)); | ||||
| 			std::string avgcpu3 = std::to_string(((alldtt3/(float)hdttt3.size())*1000)); | ||||
| 			std::string avgfps = std::to_string((allfps/(int)fpscountc.size()-1)); | ||||
|  | ||||
| 			std::string resultt = "Frames Rendered: " + renderedf + "\nMax Cpu Time: " + avgdtt + "\nAvg Cpu Time: " + avgcpu + "\nAvg Fps: " + avgfps + "\nAvg RenderTime: " + avgcpu2 + "ms/f\nAvg ConvertTime: " + avgcpu3 + "ms\n"; | ||||
| 			this->ClearBlank(); | ||||
| 			this->DrawText(0, 0, 0, RenderD7::Color::Hex("#ffffff"), resultt); | ||||
| 			std::string outname = csvpc + "/benchmark_" + RenderD7::GetTimeStr() + ".png"; | ||||
| 			this->SavePng(outname); | ||||
| 			RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("Benchmark", "Saved to: \n" + outname)); | ||||
| 			benchmark = false; | ||||
| 		} | ||||
| 		uint64_t currentTime = svcGetSystemTick(); | ||||
| 		dtt = ((float)(currentTime / (float)TICKS_PER_MSEC) - (float)(lastTime / (float)TICKS_PER_MSEC)) / 1000.f; | ||||
| 		lastTime = currentTime; | ||||
| 		lastTime = currentTime; | ||||
| 		frameCounter++; | ||||
| 		fpsClock += dtt; | ||||
| 		if (fpsClock >= 1.f) { | ||||
| 			fps = frameCounter; | ||||
| 			frameCounter = 0; | ||||
| 			fpsClock = 0.f; | ||||
| 		} | ||||
| 		uint64_t lastTime2 = svcGetSystemTick(); | ||||
| 		this->ClearBlank(); | ||||
| 		this->DrawRectFilled(0, 0, this->bitmap.bmp_info_header.width, this->bitmap.bmp_info_header.width, 255, 255, 255, 255); | ||||
| 		this->DrawRect(5, 5, this->bitmap.bmp_info_header.width - 10, this->bitmap.bmp_info_header.height - 10, 5, 0, 0, 0, 0); | ||||
| 		//this->DrawText(20, 20, 0, RenderD7::Color::Hex("#ffffff"), "Fps: " + std::to_string(fps)); | ||||
| 		this->DrawText(0, 0, 0.5f, RenderD7::Color::Hex("#ff0000"), "Time: " + std::to_string(timer)); | ||||
| 		this->DrawText(0, 20, 0.5f, RenderD7::Color::Hex("#ff0000"), "Fps: " + std::to_string(fps)); | ||||
| 		this->DrawText(0, 40, 0.5f, RenderD7::Color::Hex("#ff0000"), "dt: " + std::to_string(dtt)); | ||||
| 		this->DrawText(0, 60, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxRenderTime: " + std::to_string(mdtt2*1000) + "ms/f"); | ||||
| 		this->DrawText(0, 80, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxConvertTime: " + std::to_string(mdtt3*1000) + "ms"); | ||||
| 		uint64_t currentTime2 = svcGetSystemTick(); | ||||
| 		dtt2 = ((float)(currentTime2 / (float)TICKS_PER_MSEC) - (float)(lastTime2 / (float)TICKS_PER_MSEC)) / 1000.f; | ||||
| 		hdttt2.push_back(dtt2); | ||||
| 		lastTime2 = svcGetSystemTick(); | ||||
| 		bool updgg = this->UpdateScreenF(testfps); | ||||
| 		currentTime2 = svcGetSystemTick(); | ||||
| 		dtt3 = ((float)(currentTime2 / (float)TICKS_PER_MSEC) - (float)(lastTime2 / (float)TICKS_PER_MSEC)) / 1000.f; | ||||
| 		if(updgg) hdttt3.push_back(dtt3); | ||||
| 		if (!shouldbe_disabled) this->DrawScreen(); | ||||
| 		renderedframes++; | ||||
| 		if(mdtt2 < dtt2) | ||||
| 		{ | ||||
| 			mdtt2 = dtt2; | ||||
| 		} | ||||
| 		if(mdtt3 < dtt3 && updgg) | ||||
| 		{ | ||||
| 			mdtt3 = dtt3; | ||||
| 		} | ||||
| 		timer+= 1*dtt; | ||||
| 		float hdtt = C3D_GetProcessingTime(); | ||||
| 		hdttt.push_back(hdtt); | ||||
| 		fpscountc.push_back(fps); | ||||
| 		if(mhdtt < hdtt) | ||||
| 		{ | ||||
| 			mhdtt = C3D_GetProcessingTime(); | ||||
| 		} | ||||
| 		/*if (!shouldbe_disabled) | ||||
| 		{ | ||||
| 			RenderD7::OnScreen(Bottom); | ||||
| 			RenderD7::DrawText(0, 0, 0.5f, RenderD7::Color::Hex("#ff0000"), "Time: " + std::to_string(timer)); | ||||
| 			RenderD7::DrawText(0, 20, 0.5f, RenderD7::Color::Hex("#ff0000"), "Fps: " + std::to_string(fps)); | ||||
| 			RenderD7::DrawText(0, 40, 0.5f, RenderD7::Color::Hex("#ff0000"), "dt: " + std::to_string(dtt)); | ||||
| 			RenderD7::DrawText(0, 60, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxRenderTime: " + std::to_string(mdtt2*1000) + "ms/f"); | ||||
| 			RenderD7::DrawText(0, 80, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxConvertTime: " + std::to_string(mdtt3*1000) + "ms"); | ||||
|  | ||||
| 		}*/ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::SetupBenchmark(int framerate) | ||||
| { | ||||
| 	benchmark = true; | ||||
| 	setupbenchmark = true; | ||||
| 	this->testfps = framerate; | ||||
| } | ||||
|  | ||||
| #include <renderd7/debugfont.h> | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawChar(u32 posX, u32 posY, u32 color, char character) | ||||
| { | ||||
| 	for(u32 y = 0; y < 8; y++) | ||||
|     { | ||||
|         char charPos = debugfont[character * 8 + y]; | ||||
|  | ||||
|         for(u32 x = 0; x < 8; x++) | ||||
|             if(((charPos >> (7 - x)) & 1) == 1) | ||||
|             { | ||||
| 				DrawPixel((int)posX + x + 1, (int)posY + y + 1, 255, 255, 255, 255); | ||||
|             } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #define SPACING_Y 10 | ||||
| #define SPACING_X 8 | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawText(int x, int y, float t_size, u32 color, std::string text) | ||||
| { | ||||
| 	for(u32 i = 0, line_i = 0; i < strlen(text.c_str()); i++) | ||||
|         switch(text[i]) | ||||
|         { | ||||
|             case '\n': | ||||
|                 y += SPACING_Y; | ||||
|                 line_i = 0; | ||||
|                 break; | ||||
|  | ||||
|             case '\t': | ||||
|                 line_i += 2; | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 //Make sure we never get out of the screen | ||||
|                 if(line_i >= (((u32)this->bitmap.bmp_info_header.width) - (u32)x) / SPACING_X) | ||||
|                 { | ||||
|                     y += SPACING_Y; | ||||
|                     line_i = 1; //Little offset so we know the same text continues | ||||
|                     if(text[i] == ' ') break; //Spaces at the start look weird | ||||
|                 } | ||||
|  | ||||
|                 this->DrawChar((u32)x + line_i * SPACING_X, (u32)y, color, text[i]); | ||||
|  | ||||
|                 line_i++; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
| } | ||||
| @@ -1,20 +0,0 @@ | ||||
| #include <renderd7/Clock.hpp> | ||||
|  | ||||
| namespace rnd7 { | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time Clock::getElapsedTime() const { | ||||
|         return getCurrentTime() - m_startTime; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time Clock::restart() { | ||||
|         Time now = getCurrentTime(); | ||||
|         Time elapsed = now - m_startTime; | ||||
|         m_startTime = now; | ||||
|  | ||||
|         return elapsed; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										92
									
								
								source/Color.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								source/Color.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| #include <renderd7/Color.hpp> | ||||
|  | ||||
| #define RGBA8(r, g, b, a) ((((r) & 0xFF) << 0) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16) | (((a) & 0xFF) << 24)) | ||||
|  | ||||
| uint32_t RenderD7::Color::Hex(const std::string color, uint8_t a) | ||||
| { | ||||
|     if (color.length() < 7 || std::regex_search(color.substr(1), std::regex("[^0-9A-Fa-f]"))) { // invalid color. | ||||
| 		return RenderD7::Color::Hex("#000000", 0); | ||||
| 	} | ||||
|     int r = std::stoi(color.substr(1, 2), nullptr, 16); | ||||
| 	int g = std::stoi(color.substr(3, 2), nullptr, 16); | ||||
| 	int b = std::stoi(color.substr(5, 2), nullptr, 16); | ||||
| 	return RGBA8(r, g, b, a); | ||||
| } | ||||
|  | ||||
| std::string RenderD7::Color::RGB2Hex(int r, int g, int b) | ||||
| { | ||||
|   	std::stringstream ss; | ||||
|   	ss << "#"; | ||||
|   	ss << std::hex << (r << 16 | g << 8 | b ); | ||||
|   	return ss.str(); | ||||
| } | ||||
|  | ||||
| uint32_t RenderD7::Color::Convert(uint32_t src, RenderD7::Color::ColorFmt srcFormat, RenderD7::Color::ColorFmt dstFormat) | ||||
| { | ||||
|     uint32_t result = 0x00000000; | ||||
|     //uint8_t red, green, blue, alpha = 0x00; | ||||
|     /*switch(srcFormat) | ||||
|     { | ||||
|         case RGBA8: | ||||
|         { | ||||
|             red, green, blue, alpha = (UNPACK_RGBA(src)); | ||||
|             switch (dstFormat) | ||||
|             { | ||||
|             case RGBA8: | ||||
|             { | ||||
|                 result = ((((red) & 0xFF) << 0) | (((green) & 0xFF) << 8) | (((blue) & 0xFF) << 16) | (((alpha) & 0xFF) << 24)); | ||||
|                 break; | ||||
|             } | ||||
|             case RGB8: | ||||
|             { | ||||
|                 result = ((((red) & 0xFF) << 0) | (((green) & 0xFF) << 8) | (((blue) & 0xFF) << 16)); | ||||
|                 break; | ||||
|             } | ||||
|             case RGB565: | ||||
|             { | ||||
|                 //NOTYET | ||||
|                 break; | ||||
|             } | ||||
|             case BGRA8: | ||||
|             { | ||||
|                 result = ((((blue)  & 0xFF) << 16) | (((green) & 0xFF) << 8) | (((red) & 0xFF) << 0 | (((alpha) & 0xFF) << 24))); | ||||
|                 break; | ||||
|             } | ||||
|             case BGR8: | ||||
|             { | ||||
|                 result = ((((blue) & 0xFF) << 16) | (((green) & 0xFF) << 8) | (((red) & 0xFF) << 0)); | ||||
|                 break; | ||||
|             } | ||||
|                  | ||||
|             default: | ||||
|                 break; | ||||
|             } | ||||
|              | ||||
|             break; | ||||
|         } | ||||
|         case RGB8: | ||||
|         { | ||||
|             result[2] = src[2]; | ||||
|             result[1] = src[1]; | ||||
|             result[0] = src[0]; | ||||
|             break; | ||||
|         } | ||||
|         case RGB565: | ||||
|         { | ||||
|             // thanks neobrain | ||||
|             uint16_t px = *(uint16_t *)src; | ||||
|             blue = px & 0x1F; | ||||
|             green = (px >> 5) & 0x3F; | ||||
|             red = (px >> 11) & 0x1F; | ||||
|  | ||||
|             result[0] = (blue  << 3) | (blue  >> 2); | ||||
|             result[1] = (green << 2) | (green >> 4); | ||||
|             result[2] = (red   << 3) | (red   >> 2); | ||||
|  | ||||
|             break; | ||||
|         } | ||||
|          | ||||
|         default: break; | ||||
|     }*/ | ||||
|     return result; | ||||
| } | ||||
							
								
								
									
										255
									
								
								source/Image.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								source/Image.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,255 @@ | ||||
| #include <renderd7/Image.hpp> | ||||
| #include <renderd7/Ovl.hpp> | ||||
| #include <renderd7/Toast.hpp> | ||||
| extern bool usedbgmsg; | ||||
|  | ||||
| static u32 GetNextPowerOf2(u32 v) { | ||||
|     v--; | ||||
|     v |= v >> 1; | ||||
|     v |= v >> 2; | ||||
|     v |= v >> 4; | ||||
|     v |= v >> 8; | ||||
|     v |= v >> 16; | ||||
|     v++; | ||||
|     return (v >= 64 ? v : 64); | ||||
| } | ||||
|  | ||||
| static bool C3DTexToC2DImage(C2D_Image *texture, u32 width, u32 height, u8 *buf) { | ||||
|     if (width >= 1024 || height >= 1024) | ||||
|         return false; | ||||
|      | ||||
|     C3D_Tex *tex = new C3D_Tex[sizeof(C3D_Tex)]; | ||||
|     Tex3DS_SubTexture *subtex = new Tex3DS_SubTexture[sizeof(Tex3DS_SubTexture)]; | ||||
|     subtex->width = static_cast<u16>(width); | ||||
|     subtex->height = static_cast<u16>(height); | ||||
|     // RGBA -> ABGR | ||||
|     for (u32 row = 0; row < subtex->width; row++) { | ||||
|         for (u32 col = 0; col < subtex->height; col++) { | ||||
|             u32 z = (row + col * subtex->width) * 4; | ||||
|              | ||||
|             u8 r = *(u8 *)(buf + z); | ||||
|             u8 g = *(u8 *)(buf + z + 1); | ||||
|             u8 b = *(u8 *)(buf + z + 2); | ||||
|             u8 a = *(u8 *)(buf + z + 3); | ||||
|              | ||||
|             *(buf + z) = a; | ||||
|             *(buf + z + 1) = b; | ||||
|             *(buf + z + 2) = g; | ||||
|             *(buf + z + 3) = r; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     u32 w_pow2 = GetNextPowerOf2(subtex->width); | ||||
|     u32 h_pow2 = GetNextPowerOf2(subtex->height); | ||||
|     subtex->left = 0.f; | ||||
|     subtex->top = 1.f; | ||||
|     subtex->right = (subtex->width /static_cast<float>(w_pow2)); | ||||
|     subtex->bottom = (1.0 - (subtex->height / static_cast<float>(h_pow2))); | ||||
|     C3D_TexInit(tex, static_cast<u16>(w_pow2), static_cast<u16>(h_pow2), GPU_RGBA8); | ||||
|     C3D_TexSetFilter(tex, GPU_NEAREST, GPU_NEAREST); | ||||
|      | ||||
|     std::memset(tex->data, 0, tex->size); | ||||
|      | ||||
|     for (u32 x = 0; x < subtex->width; x++) { | ||||
|         for (u32 y = 0; y < subtex->height; y++) { | ||||
|             u32 dst_pos = ((((y >> 3) * (w_pow2 >> 3) + (x >> 3)) << 6) + ((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) | ((x & 4) << 2) | ((y & 4) << 3))) * 4; | ||||
|             u32 src_pos = (y * subtex->width + x) * 4; | ||||
|             std::memcpy(&(static_cast<u8 *>(tex->data))[dst_pos], &(static_cast<u8 *>(buf))[src_pos], 4); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     C3D_TexFlush(tex); | ||||
|     tex->border = RenderD7::Color::Hex("#000000", 0); | ||||
|     C3D_TexSetWrap(tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER); | ||||
|     if (tex && subtex) { | ||||
|         texture->tex = tex; | ||||
|         texture->subtex = subtex; | ||||
|         return true; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| extern "C" | ||||
| { | ||||
| 	#include <renderd7/external/libnsbmp/libnsbmp.h> | ||||
| } | ||||
| static const u32 BYTES_PER_PIXEL = 4; | ||||
| #define MAX_IMAGE_BYTES (48 * 1024 * 1024) | ||||
|  | ||||
| namespace LIBBMP { | ||||
|     static void *bitmap_create(int width, int height, [[maybe_unused]] unsigned int state) { | ||||
|         /* ensure a stupidly large (>50Megs or so) bitmap is not created */ | ||||
|         if ((static_cast<long long>(width) * static_cast<long long>(height)) > (MAX_IMAGE_BYTES/BYTES_PER_PIXEL)) | ||||
|             return nullptr; | ||||
|          | ||||
|         return std::calloc(width * height, BYTES_PER_PIXEL); | ||||
|     } | ||||
|      | ||||
|     static unsigned char *bitmap_get_buffer(void *bitmap) { | ||||
|         assert(bitmap); | ||||
|         return static_cast<unsigned char *>(bitmap); | ||||
|     } | ||||
|      | ||||
|     static size_t bitmap_get_bpp([[maybe_unused]] void *bitmap) { | ||||
|         return BYTES_PER_PIXEL; | ||||
|     } | ||||
|      | ||||
|     static void bitmap_destroy(void *bitmap) { | ||||
|         assert(bitmap); | ||||
|         std::free(bitmap); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| unsigned Image_to_C3D(C2D_Image img, const std::vector<unsigned char>& bmpc) { | ||||
| 	bmp_bitmap_callback_vt bitmap_callbacks = { | ||||
|             LIBBMP::bitmap_create, | ||||
|             LIBBMP::bitmap_destroy, | ||||
|             LIBBMP::bitmap_get_buffer, | ||||
|             LIBBMP::bitmap_get_bpp | ||||
|         }; | ||||
|          | ||||
|         bmp_result code = BMP_OK; | ||||
|         bmp_image bmp; | ||||
|         bmp_create(&bmp, &bitmap_callbacks); | ||||
|          | ||||
|         code = bmp_analyse(&bmp, bmpc.size(), (u8*)bmpc.data()); | ||||
|         if (code != BMP_OK) { | ||||
|             bmp_finalise(&bmp); | ||||
|             return 1; | ||||
|         } | ||||
|          | ||||
|         code = bmp_decode(&bmp); | ||||
|         if (code != BMP_OK) { | ||||
|             if ((code != BMP_INSUFFICIENT_DATA) && (code != BMP_DATA_ERROR)) { | ||||
|                 bmp_finalise(&bmp); | ||||
|                 return 2; | ||||
|             } | ||||
|              | ||||
|             /* skip if the decoded image would be ridiculously large */ | ||||
|             if ((bmp.width * bmp.height) > 200000) { | ||||
|                 bmp_finalise(&bmp); | ||||
|                 return 3; | ||||
|             } | ||||
|         } | ||||
| 		C2D_Image* texture = new C2D_Image(); | ||||
|         bool ret = C3DTexToC2DImage(texture, static_cast<u32>(bmp.width), static_cast<u32>(bmp.height), static_cast<u8 *>(bmp.bitmap)); | ||||
|         bmp_finalise(&bmp); | ||||
| 		delete texture; | ||||
| 		if (!ret) | ||||
| 		{ | ||||
| 			return 4; | ||||
| 		} | ||||
|   	return 0; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::LoadPng(const std::string path) | ||||
| { | ||||
| 	if (usedbgmsg) | ||||
| 	{ | ||||
| 		//RenderD7::Msg::Display("RenderD7", "Loading Png:" + path, Top); | ||||
| 	} | ||||
| 	std::vector<u8> ImageBuffer; | ||||
| 	unsigned width, height; | ||||
| 	if (loadet) | ||||
| 	{ | ||||
| 		C3D_TexDelete(this->img.tex); | ||||
| 		loadet = false; | ||||
| 	} | ||||
| 	lodepng::decode(ImageBuffer, width, height, path); | ||||
|  | ||||
| 	this->img.tex = new C3D_Tex; | ||||
| 	this->img.subtex = new Tex3DS_SubTexture({(u16)width, (u16)height, 0.0f, 1.0f, width / 1024.0f, 1.0f - (height / 1024.0f)}); | ||||
|  | ||||
| 	C3D_TexInit(this->img.tex, 1024, 1024, GPU_RGBA8); | ||||
| 	C3D_TexSetFilter(this->img.tex, GPU_LINEAR, GPU_LINEAR); | ||||
| 	this->img.tex->border = 0xFFFFFFFF; | ||||
| 	C3D_TexSetWrap(this->img.tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER); | ||||
|  | ||||
| 	for (u32 x = 0; x < width && x < 1024; x++) { | ||||
| 		for (u32 y = 0; y < height && y < 1024; y++) { | ||||
| 			const u32 dstPos = ((((y >> 3) * (1024 >> 3) + (x >> 3)) << 6) + | ||||
| 								((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) | | ||||
| 								((x & 4) << 2) | ((y & 4) << 3))) * 4; | ||||
|  | ||||
| 			const u32 srcPos = (y * width + x) * 4; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 0] = ImageBuffer.data()[srcPos + 3]; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 1] = ImageBuffer.data()[srcPos + 2]; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 2] = ImageBuffer.data()[srcPos + 1]; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 3] = ImageBuffer.data()[srcPos + 0]; | ||||
| 		} | ||||
| 	} | ||||
| 	loadet = true; | ||||
| } | ||||
|  | ||||
| RenderD7::Image::~Image() | ||||
| { | ||||
| 	if(loadet) C3D_TexDelete(img.tex); | ||||
| 	loadet = false; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::Unload() | ||||
| { | ||||
| 	if(loadet) C3D_TexDelete(img.tex); | ||||
| 	loadet = false; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::LoadPFromBuffer(const std::vector<u8> &buffer) | ||||
| { | ||||
| 	std::vector<u8> ImageBuffer; | ||||
| 	if (loadet) | ||||
| 	{ | ||||
| 		C3D_TexDelete(this->img.tex); | ||||
| 		loadet = false; | ||||
| 	} | ||||
| 	unsigned width, height; | ||||
| 	lodepng::decode(ImageBuffer, width, height, buffer); | ||||
|  | ||||
| 	img.tex = new C3D_Tex; | ||||
| 	img.subtex = new Tex3DS_SubTexture({(u16)width, (u16)height, 0.0f, 1.0f, width / 512.0f, 1.0f - (height / 512.0f)}); | ||||
|  | ||||
| 	C3D_TexInit(img.tex, 512, 512, GPU_RGBA8); | ||||
| 	C3D_TexSetFilter(img.tex, GPU_LINEAR, GPU_LINEAR); | ||||
| 	img.tex->border = 0xFFFFFFFF; | ||||
| 	C3D_TexSetWrap(img.tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER); | ||||
|  | ||||
| 	for (u32 x = 0; x < width && x < 512; x++) { | ||||
| 		for (u32 y = 0; y < height && y < 512; y++) { | ||||
| 			const u32 dstPos = ((((y >> 3) * (512 >> 3) + (x >> 3)) << 6) + | ||||
| 								((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) | | ||||
| 								((x & 4) << 2) | ((y & 4) << 3))) * 4; | ||||
|  | ||||
| 			const u32 srcPos = (y * width + x) * 4; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 0] = ImageBuffer.data()[srcPos + 3]; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 1] = ImageBuffer.data()[srcPos + 2]; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 2] = ImageBuffer.data()[srcPos + 1]; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 3] = ImageBuffer.data()[srcPos + 0]; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::FromSheet(RenderD7::Sheet sheet, size_t index) | ||||
| { | ||||
| 	 | ||||
| } | ||||
|  | ||||
| bool RenderD7::Image::Draw(float x, float y, float scaleX, float scaleY) | ||||
| { | ||||
| 	if(loadet) return C2D_DrawImageAt(this->img, x, y, 0.5f, nullptr, scaleX, scaleY); | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::LoadFromBitmap(BMP bitmap) | ||||
| { | ||||
| 	loadet = false; | ||||
| 	unsigned error = Image_to_C3D(this->img, bitmap.DATA()); | ||||
| 	if (error == 0) | ||||
| 	{ | ||||
| 		this->loadet = true; | ||||
| 	} | ||||
| 	 | ||||
|   	if(error) { | ||||
|     std::cout << "BMP decoding error " << error << std::endl; | ||||
|     RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("Bmp - Error", "Code: " + std::to_string(error))); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										9
									
								
								source/Screen.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								source/Screen.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| #include <renderd7/Screen.hpp> | ||||
|  | ||||
| extern bool currentScreen; | ||||
|  | ||||
| void RenderD7::OnScreen(C3D_RenderTarget *target) | ||||
| { | ||||
|     C2D_SceneBegin(target); | ||||
| 	currentScreen = (target == Top || target == TopRight) ? 1 : 0; | ||||
| } | ||||
							
								
								
									
										21
									
								
								source/Sheet.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								source/Sheet.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #include <renderd7/Sheet.hpp> | ||||
|  | ||||
| RenderD7::Sheet::Sheet() | ||||
| { | ||||
|     // | ||||
| } | ||||
| RenderD7::Sheet::~Sheet() | ||||
| { | ||||
|     // | ||||
| } | ||||
|  | ||||
| Result RenderD7::Sheet::Load(const char *path) | ||||
| { | ||||
| 	this->spritesheet = C2D_SpriteSheetLoad(path); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void RenderD7::Sheet::Free() | ||||
| { | ||||
| 	C2D_SpriteSheetFree(this->spritesheet); | ||||
| } | ||||
							
								
								
									
										60
									
								
								source/Sprite.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								source/Sprite.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| #include <renderd7/Sprite.hpp> | ||||
|  | ||||
| RenderD7::Sprite::Sprite() | ||||
| { | ||||
| // | ||||
| } | ||||
| RenderD7::Sprite::~Sprite() | ||||
| { | ||||
| 	// | ||||
| } | ||||
| void RenderD7::Sprite::FromSheet(RenderD7::Sheet *sheet, size_t index) | ||||
| { | ||||
| 	C2D_SpriteFromSheet(&this->sprite, sheet->spritesheet, index); | ||||
| } | ||||
| bool RenderD7::Sprite::Draw() | ||||
| { | ||||
| 	return C2D_DrawSprite(&this->sprite); | ||||
| } | ||||
| void RenderD7::Sprite::SetCenter(float x, float y) | ||||
| { | ||||
| 	C2D_SpriteSetCenter(&this->sprite, x, y); | ||||
| } | ||||
| void RenderD7::Sprite::SetPos(float x, float y) | ||||
| { | ||||
| 	C2D_SpriteSetPos(&this->sprite, x, y); | ||||
| } | ||||
| void RenderD7::Sprite::SetRotation(float rotation) | ||||
| { | ||||
| 	C2D_SpriteSetRotation(&this->sprite, rotation); | ||||
| } | ||||
| void RenderD7::Sprite::Rotate(float speed) | ||||
| { | ||||
| 	C2D_SpriteRotateDegrees(&this->sprite, speed); | ||||
| } | ||||
| float RenderD7::Sprite::getHeigh() | ||||
| { | ||||
| 	return this->sprite.params.pos.h; | ||||
| } | ||||
| float RenderD7::Sprite::getWidth() | ||||
| { | ||||
| 	return this->sprite.params.pos.w; | ||||
| } | ||||
| float RenderD7::Sprite::getPosX() | ||||
| { | ||||
| 	return this->sprite.params.pos.x; | ||||
| } | ||||
| float RenderD7::Sprite::getPosY() | ||||
| { | ||||
| 	return this->sprite.params.pos.y; | ||||
| } | ||||
|  | ||||
| void RenderD7::Sprite::FromImage(RenderD7::Image *img) | ||||
| { | ||||
| 	C2D_SpriteFromImage(&this->sprite, img->img); | ||||
| } | ||||
|  | ||||
| void RenderD7::Sprite::SetScale(float x, float y) | ||||
| { | ||||
| 	C2D_SpriteScale(&this->sprite, x, y); | ||||
| } | ||||
							
								
								
									
										41
									
								
								source/SpriteSheetAnimation.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								source/SpriteSheetAnimation.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| #include <renderd7/SpriteAnimation.hpp> | ||||
| #include <renderd7/log.hpp> | ||||
|  | ||||
| extern Log renderd7log; | ||||
|  | ||||
| RenderD7::SpriteSheetAnimation::SpriteSheetAnimation() | ||||
| { | ||||
|     renderd7log.Write("SpriteSheetAnimation createt!"); | ||||
| } | ||||
| RenderD7::SpriteSheetAnimation::~SpriteSheetAnimation() | ||||
| { | ||||
|     // | ||||
| } | ||||
|  | ||||
| void RenderD7::SpriteSheetAnimation::Setup(RenderD7::Sheet *sheet, size_t imagecount, size_t startimage, float frame_begin, float frame_finish) | ||||
| { | ||||
|     D_totaltime = frame_begin; | ||||
|     renderd7log.Write("frame_begin success"); | ||||
|     this->images = imagecount; | ||||
|     renderd7log.Write("imagecount success"); | ||||
|     this->sheet = sheet; | ||||
|     renderd7log.Write("sheet success"); | ||||
|     this->time = frame_finish; | ||||
|     renderd7log.Write("frame_finish success"); | ||||
|     RenderD7::SpriteSheetAnimation::FromSheet(this->sheet, startimage); | ||||
| } | ||||
| void RenderD7::SpriteSheetAnimation::Play(float timespeed) | ||||
| { | ||||
|     D_totaltime += timespeed; | ||||
|     if (D_totaltime >= time) | ||||
|     { | ||||
|         D_totaltime -= time; | ||||
|         imgs++; | ||||
|         if (imgs == images) | ||||
|         { | ||||
|             imgs = 0; | ||||
|         } | ||||
|     } | ||||
|     RenderD7::SpriteSheetAnimation::FromSheet(sheet, imgs); | ||||
|     //RenderD7::SpriteSheetAnimation::Draw(); | ||||
| } | ||||
							
								
								
									
										219
									
								
								source/Time.cpp
									
									
									
									
									
								
							
							
						
						
									
										219
									
								
								source/Time.cpp
									
									
									
									
									
								
							| @@ -1,200 +1,23 @@ | ||||
| #include <renderd7/Time.hpp> | ||||
|  | ||||
|  | ||||
| namespace rnd7 { | ||||
| //////////////////////////////////////////////////////////// | ||||
|     const Time Time::Zero_; | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time::Time() : | ||||
|             m_microseconds(0) { | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     float Time::asSeconds() const { | ||||
|         return m_microseconds / 1000000.f; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     int Time::asMilliseconds() const { | ||||
|         return static_cast<int>(m_microseconds / 1000); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     long Time::asMicroseconds() const { | ||||
|         return m_microseconds; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time::Time(long microseconds) : | ||||
|             m_microseconds(microseconds) { | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time seconds(float amount) { | ||||
|         return Time(static_cast<long>(amount * 1000000)); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time milliseconds(int amount) { | ||||
|         return Time(static_cast<long>(amount) * 1000); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time microseconds(long amount) { | ||||
|         return Time(amount); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     bool operator==(Time left, Time right) { | ||||
|         return left.asMicroseconds() == right.asMicroseconds(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     bool operator!=(Time left, Time right) { | ||||
|         return left.asMicroseconds() != right.asMicroseconds(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     bool operator<(Time left, Time right) { | ||||
|         return left.asMicroseconds() < right.asMicroseconds(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     bool operator>(Time left, Time right) { | ||||
|         return left.asMicroseconds() > right.asMicroseconds(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     bool operator<=(Time left, Time right) { | ||||
|         return left.asMicroseconds() <= right.asMicroseconds(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     bool operator>=(Time left, Time right) { | ||||
|         return left.asMicroseconds() >= right.asMicroseconds(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator-(Time right) { | ||||
|         return microseconds(-right.asMicroseconds()); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator+(Time left, Time right) { | ||||
|         return microseconds(left.asMicroseconds() + right.asMicroseconds()); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time &operator+=(Time &left, Time right) { | ||||
|         return left = left + right; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator-(Time left, Time right) { | ||||
|         return microseconds(left.asMicroseconds() - right.asMicroseconds()); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time &operator-=(Time &left, Time right) { | ||||
|         return left = left - right; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator*(Time left, float right) { | ||||
|         return seconds(left.asSeconds() * right); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator*(Time left, long right) { | ||||
|         return microseconds(left.asMicroseconds() * right); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator*(float left, Time right) { | ||||
|         return right * left; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator*(long left, Time right) { | ||||
|         return right * left; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time &operator*=(Time &left, float right) { | ||||
|         return left = left * right; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time &operator*=(Time &left, long right) { | ||||
|         return left = left * right; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator/(Time left, float right) { | ||||
|         return seconds(left.asSeconds() / right); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator/(Time left, long right) { | ||||
|         return microseconds(left.asMicroseconds() / right); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time &operator/=(Time &left, float right) { | ||||
|         return left = left / right; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time &operator/=(Time &left, long right) { | ||||
|         return left = left / right; | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     float operator/(Time left, Time right) { | ||||
|         return left.asSeconds() / right.asSeconds(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time operator%(Time left, Time right) { | ||||
|         return microseconds(left.asMicroseconds() % right.asMicroseconds()); | ||||
|     } | ||||
|  | ||||
|  | ||||
| //////////////////////////////////////////////////////////// | ||||
|     Time &operator%=(Time &left, Time right) { | ||||
|         return left = left % right; | ||||
|     } | ||||
|  | ||||
| #include <memory> | ||||
| #include <stdio.h> | ||||
| #include <stdarg.h>   | ||||
| #include <time.h> | ||||
|  | ||||
| std::string RenderD7::FormatString(std::string fmt_str, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	char* fp = NULL; | ||||
| 	va_start(ap, fmt_str); | ||||
| 	vasprintf(&fp, fmt_str.c_str(), ap); | ||||
| 	va_end(ap); | ||||
| 	std::unique_ptr<char, decltype(free)*> formatted(fp, free); | ||||
| 	return std::string(formatted.get()); | ||||
| } | ||||
|  | ||||
| std::string RenderD7::GetTimeStr(void) | ||||
| { | ||||
| 	time_t unixTime       = time(NULL); | ||||
| 	struct tm* timeStruct = gmtime((const time_t*)&unixTime); | ||||
| 	return RenderD7::FormatString("%02i:%02i:%02i", timeStruct->tm_hour, timeStruct->tm_min, timeStruct->tm_sec); | ||||
| } | ||||
|   | ||||
							
								
								
									
										36
									
								
								source/Toast.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								source/Toast.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| #include <renderd7/Toast.hpp> | ||||
|  | ||||
| RenderD7::Toast::Toast(std::string head, std::string msg) | ||||
| { | ||||
| 	this->head = head; | ||||
| 	this->msg = msg; | ||||
|     this->toast = RenderD7::BitmapPrinter(400, 70); | ||||
|     this->toast.ClearBlank(); | ||||
| 	this->toast.DrawRectFilled(0, 0, 400, 70, 40, 40, 40, 255); | ||||
| 	this->toast.DrawRectFilled(0, 0, 400, 25, 70, 70, 70, 255); | ||||
| 	this->toast.DrawText(4, 5, 0, RenderD7::Color::Hex("#ffffff"), this->head); | ||||
| 	this->toast.DrawText(4, 40, 0, RenderD7::Color::Hex("#ffffff"), this->msg); | ||||
| 	this->toastrendered->LoadPFromBuffer(this->toast.GetBitmap().DATA()); | ||||
| } | ||||
|  | ||||
| void RenderD7::Toast::Draw(void) const | ||||
| { | ||||
| 	RenderD7::OnScreen(Top); | ||||
| 	/*RenderD7::DrawRect(0, msgposy, 400, 70, RenderD7::Color::Hex("#111111")); | ||||
| 	RenderD7::DrawRect(0, msgposy, 400, 25, RenderD7::Color::Hex("#222222")); | ||||
| 	RenderD7::DrawText(2, msgposy+3, 0.7f, RenderD7::Color::Hex("#ffffff"), head); | ||||
| 	RenderD7::DrawText(2, msgposy+30, 0.6f, RenderD7::Color::Hex("#ffffff"), msg);*/ | ||||
| 	toastrendered->Draw(0, 0); | ||||
| } | ||||
|  | ||||
| void RenderD7::Toast::Logic() | ||||
| { | ||||
| 	this->delay++/*=1*(int)RenderD7::GetDeltaTime()*/; | ||||
| 	if (msgposy > 170 && delay < 2*60) msgposy--/*=(int)RenderD7::GetDeltaTime()*/; | ||||
| 	 | ||||
| 	if (delay >= 5*60) | ||||
| 	{ | ||||
| 		msgposy++/*=(int)RenderD7::GetDeltaTime*/; | ||||
| 		if(msgposy > 400) this->Kill(); | ||||
| 	} | ||||
| } | ||||
| @@ -2,7 +2,6 @@ | ||||
| #include <renderd7/log.hpp> | ||||
| #include <regex> | ||||
|  | ||||
| #define RGBA8(r, g, b, a) ((((r) & 0xFF) << 0) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16) | (((a) & 0xFF) << 24)) | ||||
| #define D7_NOTHING C2D_Color32(0, 0, 0, 0) | ||||
| #define CFGVER "3" | ||||
| Log renderd7log; | ||||
| @@ -124,15 +123,6 @@ void screenon() | ||||
|     gspLcdExit(); | ||||
| } | ||||
|  | ||||
| RenderD7::SpriteSheetAnimation::SpriteSheetAnimation() | ||||
| { | ||||
|     renderd7log.Write("SpriteSheetAnimation createt!"); | ||||
| } | ||||
| RenderD7::SpriteSheetAnimation::~SpriteSheetAnimation() | ||||
| { | ||||
|     // | ||||
| } | ||||
|  | ||||
| float RenderD7::GetDeltaTime() | ||||
| { | ||||
| 	return delta_time; | ||||
| @@ -218,33 +208,6 @@ void RenderD7::SetupLog() | ||||
| { | ||||
|     renderd7log.Init("RenderD7/RenderD7.log"); | ||||
| } | ||||
| void RenderD7::SpriteSheetAnimation::Setup(RenderD7::Sheet *sheet, size_t imagecount, size_t startimage, float frame_begin, float frame_finish) | ||||
| { | ||||
|     D_totaltime = frame_begin; | ||||
|     renderd7log.Write("frame_begin success"); | ||||
|     this->images = imagecount; | ||||
|     renderd7log.Write("imagecount success"); | ||||
|     this->sheet = sheet; | ||||
|     renderd7log.Write("sheet success"); | ||||
|     this->time = frame_finish; | ||||
|     renderd7log.Write("frame_finish success"); | ||||
|     RenderD7::SpriteSheetAnimation::FromSheet(this->sheet, startimage); | ||||
| } | ||||
| void RenderD7::SpriteSheetAnimation::Play(float timespeed) | ||||
| { | ||||
|     D_totaltime += timespeed; | ||||
|     if (D_totaltime >= time) | ||||
|     { | ||||
|         D_totaltime -= time; | ||||
|         imgs++; | ||||
|         if (imgs == images) | ||||
|         { | ||||
|             imgs = 0; | ||||
|         } | ||||
|     } | ||||
|     RenderD7::SpriteSheetAnimation::FromSheet(sheet, imgs); | ||||
|     //RenderD7::SpriteSheetAnimation::Draw(); | ||||
| } | ||||
|  | ||||
| void RenderD7::Error::DisplayError(std::string toptext, std::string errortext, int timesec) | ||||
| { | ||||
| @@ -287,24 +250,6 @@ void RenderD7::Error::DisplayFatalError(std::string toptext, std::string errorte | ||||
| 		} | ||||
|     } | ||||
| } | ||||
| u32 RenderD7::Color::Hex(const std::string color, u8 a) | ||||
| { | ||||
|     if (color.length() < 7 || std::regex_search(color.substr(1), std::regex("[^0-9A-Fa-f]"))) { // invalid color. | ||||
| 		return D7_NOTHING; | ||||
| 	} | ||||
|     int r = std::stoi(color.substr(1, 2), nullptr, 16); | ||||
| 	int g = std::stoi(color.substr(3, 2), nullptr, 16); | ||||
| 	int b = std::stoi(color.substr(5, 2), nullptr, 16); | ||||
| 	return RGBA8(r, g, b, a); | ||||
| } | ||||
|  | ||||
| std::string RenderD7::Color::RGB2Hex(int r, int g, int b) | ||||
| { | ||||
|   	std::stringstream ss; | ||||
|   	ss << "#"; | ||||
|   	ss << std::hex << (r << 16 | g << 8 | b ); | ||||
|   	return ss.str(); | ||||
| } | ||||
|  | ||||
| void RenderD7::Scene::doDraw() { | ||||
| 	if(!RenderD7::Scene::scenes.empty()) | ||||
| @@ -326,12 +271,6 @@ void RenderD7::Scene::Back() { | ||||
| 		RenderD7::Scene::scenes.pop(); | ||||
| } | ||||
|  | ||||
| void RenderD7::OnScreen(C3D_RenderTarget *target) | ||||
| { | ||||
|     C2D_SceneBegin(target); | ||||
| 	currentScreen = (target == Top || target == TopRight) ? 1 : 0; | ||||
| } | ||||
|  | ||||
| void frameloop() | ||||
| { | ||||
| 	frames++; | ||||
| @@ -382,86 +321,6 @@ bool RenderD7::MainLoop() | ||||
|     return running; | ||||
| } | ||||
|  | ||||
|  | ||||
| RenderD7::Sheet::Sheet() | ||||
| { | ||||
|     // | ||||
| } | ||||
| RenderD7::Sheet::~Sheet() | ||||
| { | ||||
|     // | ||||
| } | ||||
|  | ||||
| Result RenderD7::Sheet::Load(const char *path) | ||||
| { | ||||
| 	this->spritesheet = C2D_SpriteSheetLoad(path); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void RenderD7::Sheet::Free() | ||||
| { | ||||
| 	C2D_SpriteSheetFree(this->spritesheet); | ||||
| } | ||||
|  | ||||
| RenderD7::Sprite::Sprite() | ||||
| { | ||||
| // | ||||
| } | ||||
| RenderD7::Sprite::~Sprite() | ||||
| { | ||||
| 	// | ||||
| } | ||||
| void RenderD7::Sprite::FromSheet(RenderD7::Sheet *sheet, size_t index) | ||||
| { | ||||
| 	C2D_SpriteFromSheet(&this->sprite, sheet->spritesheet, index); | ||||
| } | ||||
| bool RenderD7::Sprite::Draw() | ||||
| { | ||||
| 	return C2D_DrawSprite(&this->sprite); | ||||
| } | ||||
| void RenderD7::Sprite::SetCenter(float x, float y) | ||||
| { | ||||
| 	C2D_SpriteSetCenter(&this->sprite, x, y); | ||||
| } | ||||
| void RenderD7::Sprite::SetPos(float x, float y) | ||||
| { | ||||
| 	C2D_SpriteSetPos(&this->sprite, x, y); | ||||
| } | ||||
| void RenderD7::Sprite::SetRotation(float rotation) | ||||
| { | ||||
| 	C2D_SpriteSetRotation(&this->sprite, rotation); | ||||
| } | ||||
| void RenderD7::Sprite::Rotate(float speed) | ||||
| { | ||||
| 	C2D_SpriteRotateDegrees(&this->sprite, speed); | ||||
| } | ||||
| float RenderD7::Sprite::getHeigh() | ||||
| { | ||||
| 	return this->sprite.params.pos.h; | ||||
| } | ||||
| float RenderD7::Sprite::getWidth() | ||||
| { | ||||
| 	return this->sprite.params.pos.w; | ||||
| } | ||||
| float RenderD7::Sprite::getPosX() | ||||
| { | ||||
| 	return this->sprite.params.pos.x; | ||||
| } | ||||
| float RenderD7::Sprite::getPosY() | ||||
| { | ||||
| 	return this->sprite.params.pos.y; | ||||
| } | ||||
|  | ||||
| void RenderD7::Sprite::FromImage(RenderD7::Image *img) | ||||
| { | ||||
| 	C2D_SpriteFromImage(&this->sprite, img->img); | ||||
| } | ||||
|  | ||||
| void RenderD7::Sprite::SetScale(float x, float y) | ||||
| { | ||||
| 	C2D_SpriteScale(&this->sprite, x, y); | ||||
| } | ||||
|  | ||||
| void RenderD7::ClearTextBufs(void) | ||||
| { | ||||
| 	C2D_TextBufClear(TextBuf); | ||||
| @@ -895,21 +754,6 @@ void RenderD7::DrawSTObject(std::vector<RenderD7::TObject> tobject, int tobjecti | ||||
| 	RenderD7::DrawText(tobject[tobjectindex].x + (tobject[tobjectindex].w/2) - RenderD7::GetTextHeight(tobject[tobjectindex].txtsize , tobject[tobjectindex].text) + tobject[tobjectindex].correctx, tobject[tobjectindex].y + (tobject[tobjectindex].h/2) - RenderD7::GetTextHeight(tobject[tobjectindex].txtsize, tobject[tobjectindex].text) + tobject[tobjectindex].correcty, tobject[tobjectindex].txtsize, txtcolor, tobject[tobjectindex].text); | ||||
| } | ||||
|  | ||||
| bool RenderD7::NameIsEndingWith(const std::string &name, const std::vector<std::string> &extensions) { | ||||
| 	if (name.substr(0, 2) == "._") return false; | ||||
|  | ||||
| 	if (name.size() == 0) return false; | ||||
|  | ||||
| 	if (extensions.size() == 0) return true; | ||||
|  | ||||
| 	for(int i = 0; i < (int)extensions.size(); i++) { | ||||
| 		const std::string ext = extensions.at(i); | ||||
| 		if (strcasecmp(name.c_str() + name.size() - ext.size(), ext.c_str()) == 0) return true; | ||||
| 	} | ||||
|  | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| bool dirEntryPredicate(const RenderD7::DirContent &lhs, const RenderD7::DirContent &rhs) { | ||||
| 	if (!lhs.isDir && rhs.isDir) return false; | ||||
| 	if (lhs.isDir && !rhs.isDir) return true; | ||||
| @@ -949,172 +793,11 @@ void RenderD7::GetDirContents(std::vector<RenderD7::DirContent> &dircontent) { | ||||
| 	RenderD7::GetDirContentsExt(dircontent, {}); | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::LoadPng(const std::string path) | ||||
| { | ||||
| 	if (usedbgmsg) | ||||
| 	{ | ||||
| 		RenderD7::Msg::Display("RenderD7", "Loading Png:" + path, Top); | ||||
| 	} | ||||
| 	std::vector<u8> ImageBuffer; | ||||
| 	unsigned width, height; | ||||
| 	if (loadet) | ||||
| 	{ | ||||
| 		C3D_TexDelete(this->img.tex); | ||||
| 		loadet = false; | ||||
| 	} | ||||
| 	lodepng::decode(ImageBuffer, width, height, path); | ||||
|  | ||||
| 	this->img.tex = new C3D_Tex; | ||||
| 	this->img.subtex = new Tex3DS_SubTexture({(u16)width, (u16)height, 0.0f, 1.0f, width / 1024.0f, 1.0f - (height / 1024.0f)}); | ||||
|  | ||||
| 	C3D_TexInit(this->img.tex, 1024, 1024, GPU_RGBA8); | ||||
| 	C3D_TexSetFilter(this->img.tex, GPU_LINEAR, GPU_LINEAR); | ||||
| 	this->img.tex->border = 0xFFFFFFFF; | ||||
| 	C3D_TexSetWrap(this->img.tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER); | ||||
|  | ||||
| 	for (u32 x = 0; x < width && x < 1024; x++) { | ||||
| 		for (u32 y = 0; y < height && y < 1024; y++) { | ||||
| 			const u32 dstPos = ((((y >> 3) * (1024 >> 3) + (x >> 3)) << 6) + | ||||
| 								((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) | | ||||
| 								((x & 4) << 2) | ((y & 4) << 3))) * 4; | ||||
|  | ||||
| 			const u32 srcPos = (y * width + x) * 4; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 0] = ImageBuffer.data()[srcPos + 3]; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 1] = ImageBuffer.data()[srcPos + 2]; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 2] = ImageBuffer.data()[srcPos + 1]; | ||||
| 			((uint8_t *)this->img.tex->data)[dstPos + 3] = ImageBuffer.data()[srcPos + 0]; | ||||
| 		} | ||||
| 	} | ||||
| 	loadet = true; | ||||
| } | ||||
|  | ||||
| RenderD7::Image::~Image() | ||||
| { | ||||
| 	if(loadet) C3D_TexDelete(img.tex); | ||||
| 	loadet = false; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::Unload() | ||||
| { | ||||
| 	if(loadet) C3D_TexDelete(img.tex); | ||||
| 	loadet = false; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::LoadPFromBuffer(const std::vector<u8> &buffer) | ||||
| { | ||||
| 	std::vector<u8> ImageBuffer; | ||||
| 	if (loadet) | ||||
| 	{ | ||||
| 		C3D_TexDelete(this->img.tex); | ||||
| 		loadet = false; | ||||
| 	} | ||||
| 	unsigned width, height; | ||||
| 	lodepng::decode(ImageBuffer, width, height, buffer); | ||||
|  | ||||
| 	img.tex = new C3D_Tex; | ||||
| 	img.subtex = new Tex3DS_SubTexture({(u16)width, (u16)height, 0.0f, 1.0f, width / 512.0f, 1.0f - (height / 512.0f)}); | ||||
|  | ||||
| 	C3D_TexInit(img.tex, 512, 512, GPU_RGBA8); | ||||
| 	C3D_TexSetFilter(img.tex, GPU_LINEAR, GPU_LINEAR); | ||||
| 	img.tex->border = 0xFFFFFFFF; | ||||
| 	C3D_TexSetWrap(img.tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER); | ||||
|  | ||||
| 	for (u32 x = 0; x < width && x < 512; x++) { | ||||
| 		for (u32 y = 0; y < height && y < 512; y++) { | ||||
| 			const u32 dstPos = ((((y >> 3) * (512 >> 3) + (x >> 3)) << 6) + | ||||
| 								((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) | | ||||
| 								((x & 4) << 2) | ((y & 4) << 3))) * 4; | ||||
|  | ||||
| 			const u32 srcPos = (y * width + x) * 4; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 0] = ImageBuffer.data()[srcPos + 3]; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 1] = ImageBuffer.data()[srcPos + 2]; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 2] = ImageBuffer.data()[srcPos + 1]; | ||||
| 			((uint8_t *)img.tex->data)[dstPos + 3] = ImageBuffer.data()[srcPos + 0]; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static u32 GetNextPowerOf2(u32 v) { | ||||
|     v--; | ||||
|     v |= v >> 1; | ||||
|     v |= v >> 2; | ||||
|     v |= v >> 4; | ||||
|     v |= v >> 8; | ||||
|     v |= v >> 16; | ||||
|     v++; | ||||
|     return (v >= 64 ? v : 64); | ||||
| } | ||||
|  | ||||
| static bool C3DTexToC2DImage(C2D_Image *texture, u32 width, u32 height, u8 *buf) { | ||||
|     if (width >= 1024 || height >= 1024) | ||||
|         return false; | ||||
|      | ||||
|     C3D_Tex *tex = new C3D_Tex[sizeof(C3D_Tex)]; | ||||
|     Tex3DS_SubTexture *subtex = new Tex3DS_SubTexture[sizeof(Tex3DS_SubTexture)]; | ||||
|     subtex->width = static_cast<u16>(width); | ||||
|     subtex->height = static_cast<u16>(height); | ||||
|     // RGBA -> ABGR | ||||
|     for (u32 row = 0; row < subtex->width; row++) { | ||||
|         for (u32 col = 0; col < subtex->height; col++) { | ||||
|             u32 z = (row + col * subtex->width) * 4; | ||||
|              | ||||
|             u8 r = *(u8 *)(buf + z); | ||||
|             u8 g = *(u8 *)(buf + z + 1); | ||||
|             u8 b = *(u8 *)(buf + z + 2); | ||||
|             u8 a = *(u8 *)(buf + z + 3); | ||||
|              | ||||
|             *(buf + z) = a; | ||||
|             *(buf + z + 1) = b; | ||||
|             *(buf + z + 2) = g; | ||||
|             *(buf + z + 3) = r; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     u32 w_pow2 = GetNextPowerOf2(subtex->width); | ||||
|     u32 h_pow2 = GetNextPowerOf2(subtex->height); | ||||
|     subtex->left = 0.f; | ||||
|     subtex->top = 1.f; | ||||
|     subtex->right = (subtex->width /static_cast<float>(w_pow2)); | ||||
|     subtex->bottom = (1.0 - (subtex->height / static_cast<float>(h_pow2))); | ||||
|     C3D_TexInit(tex, static_cast<u16>(w_pow2), static_cast<u16>(h_pow2), GPU_RGBA8); | ||||
|     C3D_TexSetFilter(tex, GPU_NEAREST, GPU_NEAREST); | ||||
|      | ||||
|     std::memset(tex->data, 0, tex->size); | ||||
|      | ||||
|     for (u32 x = 0; x < subtex->width; x++) { | ||||
|         for (u32 y = 0; y < subtex->height; y++) { | ||||
|             u32 dst_pos = ((((y >> 3) * (w_pow2 >> 3) + (x >> 3)) << 6) + ((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) | ((x & 4) << 2) | ((y & 4) << 3))) * 4; | ||||
|             u32 src_pos = (y * subtex->width + x) * 4; | ||||
|             std::memcpy(&(static_cast<u8 *>(tex->data))[dst_pos], &(static_cast<u8 *>(buf))[src_pos], 4); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     C3D_TexFlush(tex); | ||||
|     tex->border = RenderD7::Color::Hex("#000000", 0); | ||||
|     C3D_TexSetWrap(tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER); | ||||
|     if (tex && subtex) { | ||||
|         texture->tex = tex; | ||||
|         texture->subtex = subtex; | ||||
|         return true; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::FromSheet(RenderD7::Sheet sheet, size_t index) | ||||
| { | ||||
| 	 | ||||
| } | ||||
|  | ||||
| bool RenderD7::DrawImage(C2D_Image img, float x, float y, float scaleX, float scaleY) | ||||
| { | ||||
| 	return C2D_DrawImageAt(img, x, y, 0.5f, nullptr, scaleX, scaleY); | ||||
| } | ||||
|  | ||||
| bool RenderD7::Image::Draw(float x, float y, float scaleX, float scaleY) | ||||
| { | ||||
| 	if(loadet) return C2D_DrawImageAt(this->img, x, y, 0.5f, nullptr, scaleX, scaleY); | ||||
| 	return false; | ||||
| } | ||||
| bool RenderD7::FS::FileExist(const std::string& path) | ||||
| { | ||||
| 	FILE *test = fopen(path.c_str(), "r"); | ||||
| @@ -1473,449 +1156,3 @@ bool RenderD7::Console::Update() | ||||
|      bool dr_sc = true; | ||||
|      return dr_sc; | ||||
| } | ||||
|  | ||||
|  | ||||
| std::string RenderD7::FormatString(std::string fmt_str, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	char* fp = NULL; | ||||
| 	va_start(ap, fmt_str); | ||||
| 	vasprintf(&fp, fmt_str.c_str(), ap); | ||||
| 	va_end(ap); | ||||
| 	std::unique_ptr<char, decltype(free)*> formatted(fp, free); | ||||
| 	return std::string(formatted.get()); | ||||
| } | ||||
|  | ||||
| std::string RenderD7::GetTimeStr(void) | ||||
| { | ||||
| 	time_t unixTime       = time(NULL); | ||||
| 	struct tm* timeStruct = gmtime((const time_t*)&unixTime); | ||||
| 	return RenderD7::FormatString("%02i:%02i:%02i", timeStruct->tm_hour, timeStruct->tm_min, timeStruct->tm_sec); | ||||
| } | ||||
| extern "C" | ||||
| { | ||||
| 	#include <renderd7/external/libnsbmp/libnsbmp.h> | ||||
| } | ||||
| static const u32 BYTES_PER_PIXEL = 4; | ||||
| #define MAX_IMAGE_BYTES (48 * 1024 * 1024) | ||||
|  | ||||
| namespace LIBBMP { | ||||
|     static void *bitmap_create(int width, int height, [[maybe_unused]] unsigned int state) { | ||||
|         /* ensure a stupidly large (>50Megs or so) bitmap is not created */ | ||||
|         if ((static_cast<long long>(width) * static_cast<long long>(height)) > (MAX_IMAGE_BYTES/BYTES_PER_PIXEL)) | ||||
|             return nullptr; | ||||
|          | ||||
|         return std::calloc(width * height, BYTES_PER_PIXEL); | ||||
|     } | ||||
|      | ||||
|     static unsigned char *bitmap_get_buffer(void *bitmap) { | ||||
|         assert(bitmap); | ||||
|         return static_cast<unsigned char *>(bitmap); | ||||
|     } | ||||
|      | ||||
|     static size_t bitmap_get_bpp([[maybe_unused]] void *bitmap) { | ||||
|         return BYTES_PER_PIXEL; | ||||
|     } | ||||
|      | ||||
|     static void bitmap_destroy(void *bitmap) { | ||||
|         assert(bitmap); | ||||
|         std::free(bitmap); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| unsigned Image_to_C3D(C2D_Image img, const std::vector<unsigned char>& bmpc) { | ||||
| 	bmp_bitmap_callback_vt bitmap_callbacks = { | ||||
|             LIBBMP::bitmap_create, | ||||
|             LIBBMP::bitmap_destroy, | ||||
|             LIBBMP::bitmap_get_buffer, | ||||
|             LIBBMP::bitmap_get_bpp | ||||
|         }; | ||||
|          | ||||
|         bmp_result code = BMP_OK; | ||||
|         bmp_image bmp; | ||||
|         bmp_create(&bmp, &bitmap_callbacks); | ||||
|          | ||||
|         code = bmp_analyse(&bmp, bmpc.size(), (u8*)bmpc.data()); | ||||
|         if (code != BMP_OK) { | ||||
|             bmp_finalise(&bmp); | ||||
|             return 1; | ||||
|         } | ||||
|          | ||||
|         code = bmp_decode(&bmp); | ||||
|         if (code != BMP_OK) { | ||||
|             if ((code != BMP_INSUFFICIENT_DATA) && (code != BMP_DATA_ERROR)) { | ||||
|                 bmp_finalise(&bmp); | ||||
|                 return 2; | ||||
|             } | ||||
|              | ||||
|             /* skip if the decoded image would be ridiculously large */ | ||||
|             if ((bmp.width * bmp.height) > 200000) { | ||||
|                 bmp_finalise(&bmp); | ||||
|                 return 3; | ||||
|             } | ||||
|         } | ||||
| 		C2D_Image* texture = new C2D_Image(); | ||||
|         bool ret = C3DTexToC2DImage(texture, static_cast<u32>(bmp.width), static_cast<u32>(bmp.height), static_cast<u8 *>(bmp.bitmap)); | ||||
|         bmp_finalise(&bmp); | ||||
| 		delete texture; | ||||
| 		if (!ret) | ||||
| 		{ | ||||
| 			return 4; | ||||
| 		} | ||||
|   	return 0; | ||||
| } | ||||
|  | ||||
| void RenderD7::Image::LoadFromBitmap(BMP bitmap) | ||||
| { | ||||
| 	loadet = false; | ||||
| 	unsigned error = Image_to_C3D(this->img, bitmap.DATA()); | ||||
| 	if (error == 0) | ||||
| 	{ | ||||
| 		this->loadet = true; | ||||
| 	} | ||||
| 	 | ||||
|   	if(error) { | ||||
|     std::cout << "BMP decoding error " << error << std::endl; | ||||
|     RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("Bmp - Error", "Code: " + std::to_string(error))); | ||||
|   } | ||||
| } | ||||
|  | ||||
| RenderD7::Toast::Toast(std::string head, std::string msg) | ||||
| { | ||||
| 	this->head = head; | ||||
| 	this->msg = msg; | ||||
| } | ||||
|  | ||||
| void RenderD7::Toast::Draw(void) const | ||||
| { | ||||
| 	RenderD7::OnScreen(Top); | ||||
| 	RenderD7::DrawRect(0, msgposy, 400, 70, RenderD7::Color::Hex("#111111")); | ||||
| 	RenderD7::DrawRect(0, msgposy, 400, 25, RenderD7::Color::Hex("#222222")); | ||||
| 	RenderD7::DrawText(2, msgposy+3, 0.7f, RenderD7::Color::Hex("#ffffff"), head); | ||||
| 	RenderD7::DrawText(2, msgposy+30, 0.6f, RenderD7::Color::Hex("#ffffff"), msg); | ||||
| } | ||||
|  | ||||
| void RenderD7::Toast::Logic() | ||||
| { | ||||
| 	this->delay++/*=(int)RenderD7::GetDeltaTime()*/; | ||||
| 	if (msgposy > 170 && delay < 2*60) msgposy--/*=(int)RenderD7::GetDeltaTime()*/; | ||||
| 	 | ||||
| 	if (delay >= 5*60) | ||||
| 	{ | ||||
| 		msgposy++/*=(int)RenderD7::GetDeltaTime*/; | ||||
| 		if(msgposy > 400) this->Kill(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| RenderD7::BitmapPrinter::BitmapPrinter(int w, int h) | ||||
| { | ||||
| 	BMP newmap(w, h, true); | ||||
| 	bitmap = newmap; | ||||
| 	//renderframe.LoadPFromBuffer(BitmapConverter::ConvertData(bitmap.DATA())); | ||||
| 	blank = newmap; | ||||
| } | ||||
|  | ||||
| RenderD7::BitmapPrinter::~BitmapPrinter() | ||||
| { | ||||
| 	if(this->renderframe.loadet) this->renderframe.Unload(); | ||||
| } | ||||
|  | ||||
| bool RenderD7::BitmapPrinter::DecodeFile(std::string file) | ||||
| { | ||||
| 	unsigned error = bitmap.read(file.c_str()); | ||||
| 	 | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter", "Error Code: " + std::to_string(error))); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
| bool RenderD7::BitmapPrinter::DecodeMem(std::vector<unsigned char> buffer) | ||||
| { | ||||
| 	unsigned error = bitmap.read_mem(buffer); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter", "Error Code: " + std::to_string(error))); | ||||
| 		return false; | ||||
| 	} | ||||
| 	return true; | ||||
| }	 | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawPixel(int x, int y, u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	unsigned error = bitmap.set_pixel(x, bitmap.bmp_info_header.height - y, b, g, r, a); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter->Pixel", "Error Code: " + std::to_string(error))); | ||||
| 	} | ||||
| } | ||||
| void RenderD7::BitmapPrinter::DrawRect(int x, int y, int w, int h, u8 line_w, u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	unsigned error = bitmap.draw_rectangle(x, bitmap.bmp_info_header.height - y - h,  w, h, b, g, r, a, line_w); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter->Rect", "Error Code: " + std::to_string(error))); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawRectFilled(int x, int y, int w, int h, u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	unsigned error = bitmap.fill_region(x, bitmap.bmp_info_header.height - h - y, w, h, b, g, r, a); | ||||
| 	if (error) | ||||
| 	{ | ||||
| 		RenderD7::AddOvl(std::make_unique<RenderD7::Toast>("BitmapPrinter->RectF", "Error Code: " + std::to_string(error))); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::SaveBmp(std::string name) | ||||
| { | ||||
| 	if(!RenderD7::NameIsEndingWith(name, {"bmp"})) | ||||
|     { | ||||
|         name += ".bmp"; | ||||
|     } | ||||
| 	bitmap.write(name.c_str()); | ||||
| } | ||||
| void RenderD7::BitmapPrinter::SavePng(std::string name) | ||||
| { | ||||
| 	if(!RenderD7::NameIsEndingWith(name, {"png"})) | ||||
|     { | ||||
|         name += ".png"; | ||||
|     } | ||||
| 	std::vector<unsigned char> ImageBuffer; | ||||
| 	ImageBuffer = BitmapConverter::ConvertData(bitmap.DATA()); | ||||
| 	lodepng::save_file(ImageBuffer, name); | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::CreateScreen(C3D_RenderTarget *target) | ||||
| { | ||||
| 	isscreen = true; | ||||
| 	targetr = target; | ||||
| 	if (target == Top) | ||||
| 	{ | ||||
| 		bitmap = BMP(400, 240, true); | ||||
| 		blank = BMP(400, 240, true);	 | ||||
| 	} | ||||
| 	if (target == TopRight) | ||||
| 	{ | ||||
| 		bitmap = BMP(400, 240, true); | ||||
| 		blank = BMP(400, 240, true); | ||||
| 	} | ||||
| 	if (target == Bottom) | ||||
| 	{ | ||||
| 		bitmap = BMP(320, 240, true); | ||||
| 		blank = BMP(320, 240, true); | ||||
| 	} | ||||
| 	renderframe.LoadPFromBuffer(BitmapConverter::ConvertData(bitmap.DATA())); | ||||
| 	 | ||||
| } | ||||
| void RenderD7::BitmapPrinter::DrawScreenDirectF(int framerate) | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(frame == (60/framerate)){ | ||||
| 			RenderD7::OnScreen(targetr); | ||||
| 			if(renderframe.loadet) renderframe.Unload(); | ||||
| 			renderframe.LoadFromBitmap(bitmap); | ||||
| 			frame = 0; | ||||
| 		} | ||||
| 		 | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 		frame++; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawScreenDirect() | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		RenderD7::OnScreen(targetr); | ||||
| 		if(renderframe.loadet) renderframe.Unload(); | ||||
| 		renderframe.LoadFromBitmap(bitmap); | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 	}	 | ||||
| } | ||||
|  | ||||
| RenderD7::Image RenderD7::BitmapPrinter::GetImage() | ||||
| { | ||||
| 	RenderD7::Image img; | ||||
| 	img.LoadFromBitmap(bitmap); | ||||
| 	return img; | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::UsePreMap(BMP map) | ||||
| { | ||||
| 	bitmap = map; | ||||
| } | ||||
| void RenderD7::BitmapPrinter::UsePrePrintMap(BitmapPrinter printmap) | ||||
| { | ||||
| 	bitmap = printmap.GetBitmap(); | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::Clear(u8 b, u8 g, u8 r, u8 a) | ||||
| { | ||||
| 	bitmap.fill_region(0, 0, bitmap.bmp_info_header.width, bitmap.bmp_info_header.height, b, g, r, a); | ||||
| } | ||||
| void RenderD7::BitmapPrinter::ClearBlank() | ||||
| { | ||||
| 	bitmap = blank; | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawScreenF(int framerate) | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(frame == (60/framerate)){ | ||||
| 			RenderD7::OnScreen(targetr); | ||||
| 			frame = 0; | ||||
| 		} | ||||
| 		 | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 		frame++; | ||||
| 	} | ||||
| } | ||||
| void RenderD7::BitmapPrinter::DrawScreen() | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		RenderD7::OnScreen(targetr); | ||||
| 		if(renderframe.loadet) renderframe.Draw(0, 0); | ||||
| 	} | ||||
| } | ||||
| void RenderD7::BitmapPrinter::UpdateScreenF(int framerate) | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(frame == (60/framerate)){ | ||||
| 			if(renderframe.loadet) renderframe.Unload(); | ||||
| 			renderframe.LoadFromBitmap(bitmap); | ||||
| 			frame = 0; | ||||
| 		} | ||||
| 		frame++; | ||||
| 	} | ||||
| } | ||||
| void RenderD7::BitmapPrinter::UpdateScreen() | ||||
| { | ||||
| 	if (isscreen) | ||||
| 	{ | ||||
| 		if(renderframe.loadet) renderframe.Unload(); | ||||
| 		renderframe.LoadFromBitmap(bitmap); | ||||
| 	}	 | ||||
| } | ||||
|  | ||||
| #define TICKS_PER_MSEC 268111.856 | ||||
|  | ||||
| void RenderD7::BitmapPrinter::Benchmark() | ||||
| { | ||||
| 	if(setupbenchmark) | ||||
| 	{ | ||||
| 		frametime = 0; | ||||
| 		renderedframes = 0; | ||||
| 		timer = 0; | ||||
| 		setupbenchmark = false; | ||||
| 		lastTime = svcGetSystemTick();  | ||||
| 	} | ||||
| 	if(benchmark) | ||||
| 	{ | ||||
| 		if(timer >= 60) | ||||
| 		{ | ||||
| 			std::string renderedf = std::to_string(renderedframes); | ||||
| 			std::string avgdtt = std::to_string(mhdtt); | ||||
| 			float alldtt = 0; | ||||
| 			for (size_t i = 1; i < hdttt.size(); i++) | ||||
| 			{ | ||||
| 				alldtt += hdttt[i]; | ||||
| 			} | ||||
| 			float alldtt2 = 0; | ||||
| 			for (size_t i = 1; i < hdttt2.size(); i++) | ||||
| 			{ | ||||
| 				alldtt2 += hdttt2[i]; | ||||
| 			} | ||||
| 			float alldtt3 = 0; | ||||
| 			for (size_t i = 1; i < hdttt3.size(); i++) | ||||
| 			{ | ||||
| 				alldtt3 += hdttt3[i]; | ||||
| 			} | ||||
| 			int allfps = 0; | ||||
| 			for (size_t f = 1; f < fpscountc.size(); f++) | ||||
| 			{ | ||||
| 				allfps += fpscountc[f]; | ||||
| 			} | ||||
| 			 | ||||
| 			 | ||||
| 			std::string avgcpu = std::to_string((alldtt/(float)hdttt.size()-1)); | ||||
| 			std::string avgcpu2 = std::to_string(((alldtt2/(float)hdttt2.size()-1)*1000)); | ||||
| 			std::string avgcpu3 = std::to_string(((alldtt3/(float)hdttt3.size()-1)*1000)); | ||||
| 			std::string avgfps = std::to_string((allfps/(int)fpscountc.size()-1)); | ||||
|  | ||||
| 			std::string resultt = "Frames Rendered: " + renderedf + "\nMax Cpu Time: " + avgdtt + "\nAvg Cpu Time: " + avgcpu + "\nAvg Fps: " + avgfps + "\nAvg RenderTime: " + avgcpu2 + "ms/f\nAvg ConvertTime: " + avgcpu3 + "ms\n"; | ||||
| 			RenderD7::Error::DisplayError("Result", resultt, 30); | ||||
| 			benchmark = false; | ||||
| 		} | ||||
| 		uint64_t currentTime = svcGetSystemTick(); | ||||
| 		dtt = ((float)(currentTime / (float)TICKS_PER_MSEC) - (float)(lastTime / (float)TICKS_PER_MSEC)) / 1000.f; | ||||
| 		lastTime = currentTime; | ||||
| 		last_time = currentTime; | ||||
| 		frameCounter++; | ||||
| 		fpsClock += dtt; | ||||
| 		if (fpsClock >= 1.f) { | ||||
| 			fps = frameCounter; | ||||
| 			frameCounter = 0; | ||||
| 			fpsClock = 0.f; | ||||
| 		} | ||||
| 		uint64_t lastTime2 = svcGetSystemTick(); | ||||
| 		this->ClearBlank(); | ||||
| 		this->DrawRectFilled(0, 0, this->bitmap.bmp_info_header.width, this->bitmap.bmp_info_header.width, 255, 255, 255, 255); | ||||
| 		this->DrawRect(5, 5, this->bitmap.bmp_info_header.width - 10, this->bitmap.bmp_info_header.height - 10, 5, 0, 0, 0, 0); | ||||
| 		uint64_t currentTime2 = svcGetSystemTick(); | ||||
| 		dtt2 = ((float)(currentTime2 / (float)TICKS_PER_MSEC) - (float)(lastTime2 / (float)TICKS_PER_MSEC)) / 1000.f; | ||||
| 		hdttt2.push_back(dtt2); | ||||
| 		lastTime2 = svcGetSystemTick(); | ||||
| 		this->UpdateScreenF(testfps); | ||||
| 		currentTime2 = svcGetSystemTick(); | ||||
| 		dtt3 = ((float)(currentTime2 / (float)TICKS_PER_MSEC) - (float)(lastTime2 / (float)TICKS_PER_MSEC)) / 1000.f; | ||||
| 		hdttt3.push_back(dtt3); | ||||
| 		if (!shouldbe_disabled) this->DrawScreen(); | ||||
| 		renderedframes++; | ||||
| 		if(mdtt2 < dtt2) | ||||
| 		{ | ||||
| 			mdtt2 = dtt2; | ||||
| 		} | ||||
| 		if(mdtt3 < dtt3) | ||||
| 		{ | ||||
| 			mdtt3 = dtt3; | ||||
| 		} | ||||
| 		timer+= 1*dtt; | ||||
| 		float hdtt = C3D_GetProcessingTime(); | ||||
| 		hdttt.push_back(hdtt); | ||||
| 		fpscountc.push_back(fps); | ||||
| 		if(mhdtt < hdtt) | ||||
| 		{ | ||||
| 			mhdtt = C3D_GetProcessingTime(); | ||||
| 		} | ||||
| 		if (!shouldbe_disabled) | ||||
| 		{ | ||||
| 			RenderD7::OnScreen(Bottom); | ||||
| 			RenderD7::DrawText(0, 0, 0.5f, RenderD7::Color::Hex("#ff0000"), "Time: " + std::to_string(timer)); | ||||
| 			RenderD7::DrawText(0, 20, 0.5f, RenderD7::Color::Hex("#ff0000"), "Fps: " + std::to_string(fps)); | ||||
| 			RenderD7::DrawText(0, 40, 0.5f, RenderD7::Color::Hex("#ff0000"), "dt: " + std::to_string(dtt)); | ||||
| 			RenderD7::DrawText(0, 60, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxRenderTime: " + std::to_string(mdtt2*1000) + "ms/f"); | ||||
| 			RenderD7::DrawText(0, 80, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxConvertTime: " + std::to_string(mdtt3*1000) + "ms"); | ||||
|  | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::SetupBenchmark(int framerate) | ||||
| { | ||||
| 	benchmark = true; | ||||
| 	setupbenchmark = true; | ||||
| 	this->testfps = framerate; | ||||
| } | ||||
|  | ||||
| void RenderD7::BitmapPrinter::DrawText(int x, int y, float t_size, u32 color, std::string text) | ||||
| { | ||||
| 	//Todo | ||||
| } | ||||
		Reference in New Issue
	
	Block a user