From efdbfedb30686de0d4a8e50b6cc7ba1d8f3d2614 Mon Sep 17 00:00:00 2001 From: Crayon2000 Date: Mon, 4 Mar 2024 15:35:56 -0500 Subject: [PATCH] First limited TPL implementation --- GRRLIB/GRRLIB/GRRLIB_texEdit.c | 35 ++++++++++++++++++ GRRLIB/GRRLIB/grrlib.h | 3 ++ GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h | 1 + GRRLIB/GRRLIB/grrlib/GRRLIB_texSetup.h | 6 ++- examples/basic_drawing/Makefile | 16 ++++++-- examples/basic_drawing/source/main.c | 7 ++++ .../basic_drawing/textures/ballsprites.png | Bin 0 -> 5600 bytes examples/basic_drawing/textures/textures.scf | 1 + 8 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 examples/basic_drawing/textures/ballsprites.png create mode 100644 examples/basic_drawing/textures/textures.scf diff --git a/GRRLIB/GRRLIB/GRRLIB_texEdit.c b/GRRLIB/GRRLIB/GRRLIB_texEdit.c index a4c6892..a416ae3 100644 --- a/GRRLIB/GRRLIB/GRRLIB_texEdit.c +++ b/GRRLIB/GRRLIB/GRRLIB_texEdit.c @@ -143,6 +143,41 @@ GRRLIB_texImg* GRRLIB_CreateEmptyTexture (const u32 width, const u32 height) return GRRLIB_CreateEmptyTextureFmt(width, height, GX_TF_RGBA8); } +/** + * Set TPL data to a GRRLIB_texImg structure. + * @param my_tpl The TPL buffer to set. + * @param size Size of the TPL buffer to set. + * @return A GRRLIB_texImg structure filled with image information. + */ +GRRLIB_texImg* GRRLIB_LoadTextureTPL (u8 *my_tpl, const int size) { + u16 width = 0; + u16 height = 0; + const s32 id = 0; // Only id zero is valid for now + GRRLIB_texImg *my_texture = NULL; + + if(my_tpl == NULL || !size || + (my_texture = calloc(1, sizeof(GRRLIB_texImg))) == NULL) { + return NULL; + } + + TPLFile *tdf = calloc(1, sizeof(TPLFile)); + if (tdf && TPL_OpenTPLFromMemory(tdf, my_tpl, size) == 1) { + TPL_GetTextureInfo(tdf, id, NULL, &width, &height); + my_texture->data = (u8 *)my_tpl; + my_texture->w = width; + my_texture->h = height; + my_texture->tdf = tdf; + my_texture->tplid = id; + GRRLIB_SetHandle( my_texture, 0, 0 ); + GRRLIB_FlushTex( my_texture ); + } + else { + free(my_texture); + return NULL; + } + return my_texture; +} + /** * Load a texture from a buffer. * @param my_img The JPEG, PNG or Bitmap buffer to load. diff --git a/GRRLIB/GRRLIB/grrlib.h b/GRRLIB/GRRLIB/grrlib.h index a2b30e8..c3229bb 100644 --- a/GRRLIB/GRRLIB/grrlib.h +++ b/GRRLIB/GRRLIB/grrlib.h @@ -43,6 +43,7 @@ THE SOFTWARE. // Includes //============================================================================== #include +#include //============================================================================== //============================================================================== @@ -123,6 +124,8 @@ typedef struct GRRLIB_texImg { f32 ofnormaltexy;/**< Offset of normalized texture on y. */ void *data; /**< Pointer to the texture data. */ + TPLFile *tdf; /**< Pointer to the a TPL file structure. */ + s32 tplid; /**< ID to the texture number in the file. */ } GRRLIB_texImg; //------------------------------------------------------------------------------ diff --git a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h index d79a6aa..e24dca0 100644 --- a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h +++ b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h @@ -142,6 +142,7 @@ GRRLIB_texImg* GRRLIB_LoadTexturePNG (const u8 *my_png); GRRLIB_texImg* GRRLIB_LoadTextureJPG (const u8 *my_jpg); GRRLIB_texImg* GRRLIB_LoadTextureJPGEx (const u8 *my_jpg, const u32 my_size); GRRLIB_texImg* GRRLIB_LoadTextureBMP (const u8 *my_bmp); +GRRLIB_texImg* GRRLIB_LoadTextureTPL (u8 *my_tpl, const int size); //------------------------------------------------------------------------------ // GRRLIB_gecko.c - USB_Gecko output facilities diff --git a/GRRLIB/GRRLIB/grrlib/GRRLIB_texSetup.h b/GRRLIB/GRRLIB/grrlib/GRRLIB_texSetup.h index ca3acdd..3fb59ed 100644 --- a/GRRLIB/GRRLIB/grrlib/GRRLIB_texSetup.h +++ b/GRRLIB/GRRLIB/grrlib/GRRLIB_texSetup.h @@ -49,7 +49,11 @@ void GRRLIB_FreeTexture (GRRLIB_texImg *tex) { if(tex == NULL) { return; } - if (tex->data != NULL) { + if (tex->tdf != NULL) { + TPL_CloseTPLFile(tex->tdf); + free(tex->tdf); + } + else if (tex->data != NULL) { free(tex->data); } free(tex); diff --git a/examples/basic_drawing/Makefile b/examples/basic_drawing/Makefile index 90b5b97..00e94b5 100644 --- a/examples/basic_drawing/Makefile +++ b/examples/basic_drawing/Makefile @@ -19,6 +19,7 @@ TARGET := $(notdir $(CURDIR)) BUILD := build SOURCES := source DATA := data +TEXTURES := textures INCLUDES := #--------------------------------------------------------------------------------- @@ -51,7 +52,8 @@ ifneq ($(BUILD),$(notdir $(CURDIR))) export OUTPUT := $(CURDIR)/$(TARGET) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ + $(foreach dir,$(TEXTURES),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/$(BUILD) @@ -63,6 +65,8 @@ CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) +SCFFILES := $(foreach dir,$(TEXTURES),$(notdir $(wildcard $(dir)/*.scf))) +TPLFILES := $(SCFFILES:.scf=.tpl) #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C @@ -73,11 +77,11 @@ else export LD := $(CXX) endif -export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) $(addsuffix .o,$(TPLFILES)) export OFILES_SOURCES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(sFILES:.s=.o) $(SFILES:.S=.o) export OFILES := $(OFILES_BIN) $(OFILES_SOURCES) -export HFILES := $(addsuffix .h,$(subst .,_,$(BINFILES))) +export HFILES := $(addsuffix .h,$(subst .,_,$(BINFILES))) $(addsuffix .h,$(subst .,_,$(TPLFILES))) #--------------------------------------------------------------------------------- # build a list of include paths @@ -155,6 +159,12 @@ $(OFILES_SOURCES) : $(HFILES) @echo $(notdir $<) $(bin2o) +#--------------------------------------------------------------------------------- +%.tpl.o %_tpl.h : %.tpl +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + -include $(DEPENDS) #--------------------------------------------------------------------------------- diff --git a/examples/basic_drawing/source/main.c b/examples/basic_drawing/source/main.c index ebece40..e665498 100644 --- a/examples/basic_drawing/source/main.c +++ b/examples/basic_drawing/source/main.c @@ -22,6 +22,9 @@ #include "ocean_bmf.h" #include "frontal_bmf.h" +#include "textures_tpl.h" +#include "textures.h" + // Tile stuff #define TILE_DELAY 10 #define TILE_UP 12 * 0 @@ -91,6 +94,8 @@ int main() { GRRLIB_texImg *tex_BMfont5 = GRRLIB_LoadTexture(BMfont5_png); GRRLIB_InitTileSet(tex_BMfont5, 8, 16, 0); + GRRLIB_texImg *tex_test_tpl = GRRLIB_LoadTextureTPL(textures_tpl, textures_tpl_size); + while(1) { WPAD_SetVRes(0, 640, 480); WPAD_ScanPads(); @@ -109,6 +114,8 @@ int main() { GRRLIB_DrawImg(10, 50, tex_test_jpg, 0, 1, 1, GRRLIB_WHITE); // Draw a jpeg GRRLIB_DrawImg(350, 50, tex_test_bmp, 0, 4, 4, GRRLIB_WHITE); // Draw a bitmap + GRRLIB_DrawImg(400, 150, tex_test_tpl, 0, 2, 2, GRRLIB_WHITE); // Draw a TPL + // Draw a sprite GRRLIB_DrawTile(600, 400, tex_sprite_png, 0, 2, 2, GRRLIB_WHITE, 12*4); // Rupee GRRLIB_DrawTile(320+left, 240+top, tex_sprite_png, 0, 2, 2, GRRLIB_WHITE, frame); diff --git a/examples/basic_drawing/textures/ballsprites.png b/examples/basic_drawing/textures/ballsprites.png new file mode 100644 index 0000000000000000000000000000000000000000..910cea245f21059a2022c15b9e741ebaa4713947 GIT binary patch literal 5600 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

dxB;@bdWp5l^V693EGU zCI#zL&l{tPSrgD&F|7i##^bzjJo8jdNGCW7REWKVEbLrct*f@n=L1T+yf1@5)d;g$ z&7dFJoC(E_52xG__?K`kT!4Fo+piy=O-k4sF2=wm6u0 zhFwjs)Ev#C_77*C{li&||GtjqmeVGAY51!Nb#O9o}M@$0g=@a+lyKY9!!AX5$_1Pf!Ua# zr|9|!v_+d@>3l$Nbt-;bv;z=L2d7-6Eah2q47d#d*+5I6^UNVlrcO zba?IK35|<@`2>Uuv09WQyl)x9;r#%pk9X;I2Z&fyUbJ_h8^mh@>A;Z#WrPqGr@^w| zNFW4<1eb(%v1D#NPkhbf-fO2);e$z_--*Rmtm$J>V?tzkaDdHOUes(pkJT1Df+q8l z*w6CyJgP2T$-ZZsRnPJY&r7W1=Il)EE(B{1?e(a2>73*Mw{d z;;Bv~KzY2m59e1Gi)~ztAhpVks0e}>2ol%7bUZ;KP(GExO)iOjEQuw7bLU{$0WWD{ z{oVguij_^Y?V*iD*$&zi(cIH}rA?y4bc+*A1yCYDBs7R?5ML2|6Ss$}@ovW5Z~XBC z%i$M3|KqYgjB(m(70+#3C^U0oL~DhKee(qX$=SIei5G<0$3tt4kMvmMV{Y+pKfg?j zEQP_zn}5%l{y#%hjVKiz*j)1vf=6i!?UXsuVwnpRU&jcLgwOjwa)dV?Bs&1#y5spk z&m_|pTu`Wd(2Qu#)<~ko1VN#d%pIPW)SZ_kd=Pvpgc>j0+&dk9PiZ4_f!cJ?HkQW9 z6liT?%Bc;?B;4ApaBy)Ui53gKiN%q31XtlEqlco!G8b4{D2&3G$O+oilhv*N+iGut z`TuK$6hWNegTe)&@sTOMA1!v@1)X`~gVNo&gwiF-*hpw-i_Ye+a+5lbFt>ut2hN>d zXzztYPKk6}AeCCLY5r{_FOYvH3`ct}n# zkJZaRES>eoKpC_tQF_4$&)H!KD5ay&QT>aM7d#<2!t9WHfA`-XnHB!hXRpcmRUH9H zf@fw}BWSG<7Uu&bu*3+5vGa7l)wRO7a#h9v2@$$fF$!g9y8a!l%FV_MM`KTHM-GACh8l z7G(=SCkLqKjxd4{!<>Xbs3uJBzI5Ms|4znNp8JTb_G46t`(DjU+&F(qu#zvB*0D3x zj`t55kF>zy#eXD4e;rfyQMO!Eey+whGu-rmdi*A{(arCQ;3vlyK6y=6`>|70m_?o6 uIH(*P%>sAF!hihF-<$IZ-yi=kj{gITq6zKy`cm8g0000