From 2e8fce8250fdfc6c6d644c9354d4a3318975bae8 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Thu, 18 Jul 2013 20:55:55 +0200 Subject: Fin du codage de testrender.c. Diverses mises au point autour de ca. Bug connu : la police de grande taille ne se charge pas bien. Texture trop longue ? --- src/graphic.c | 22 ++++++++-- src/include/graphic.h | 11 ++++- src/include/utils.h | 10 ++++- src/loader.c | 36 +++++++++------- src/sandbox/sprite.c | 4 +- src/sandbox/sprite_gif.c | 4 +- src/test/testrender.c | 106 ++++++++++++++++++++++++++++++++++++++++------- 7 files changed, 156 insertions(+), 37 deletions(-) diff --git a/src/graphic.c b/src/graphic.c index b1844a3..f55f461 100644 --- a/src/graphic.c +++ b/src/graphic.c @@ -25,7 +25,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,SDL_LOG_PRIORITY_INFO, - "SDL_GetWindowPixelFormat() returns %i", SDL_GetWindowPixelFormat(*win) + "SDL_GetWindowPixelFormat() returns 0x%x", SDL_GetWindowPixelFormat(*win) ); *rend=SDL_CreateRenderer(*win,-1, rend_flags); @@ -36,6 +36,8 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 "SDL_CreateRenderer(...,SDL_RENDERER_ACCELERATED) failed" ); + SDL_SetRenderDrawColor(*rend, 0xA0, 0xA0, 0xA0, 0xFF); + res=SDL_GetRendererInfo(*rend, rend_info); MPL_CHECK( res==0, @@ -49,7 +51,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 tf=rend_info->texture_formats[i]; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,SDL_LOG_PRIORITY_INFO, - "rend_info->texture_formats[%i] == %i", i, tf + "rend_info->texture_formats[%i] == 0x%x", i, tf ); } @@ -82,7 +84,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 //FIXME : to be implmented #if 0 -int paintTerrain(gameIni_t *gIni, gameRess_t *gRess, gameGraphics_t *gGraph) { +int paint_terrain(gameIni_t *gIni, gameRess_t *gRess, gameGraphics_t *gGraph) { int res, i, modifier; int x,y,xmin,xmax,ymin,ymax,y2,xdst,ydst; Uint32 dstPixel, dstStencil; @@ -187,3 +189,17 @@ int paintTerrain(gameIni_t *gIni, gameRess_t *gRess, gameGraphics_t *gGraph) { return 0; } #endif + +void render_all(SDL_Renderer *rend, render_item_t render_list[], int list_size) { + int i, res; + SDL_Rect src,dst; + + for(i=0,res=0;isize; + src.y = src.h * render_list[i].currframe; + dst.x = render_list[i].x; + dst.y = render_list[i].y; + /*res=*/ (void) SDL_RenderCopy(rend, render_list[i].sprite->t, &src, &dst); + } +} + diff --git a/src/include/graphic.h b/src/include/graphic.h index 6188af3..41cd526 100644 --- a/src/include/graphic.h +++ b/src/include/graphic.h @@ -5,8 +5,17 @@ #include "data_ini.h" #include "data_ress.h" +typedef struct { + sprite_t *sprite; + int currframe; + int animate; /* Is currently animating ? */ + int x,y; /* Level-based coords, not camera-based */ +} render_item_t; + void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint32 win_flags, Uint32 rend_flags, SDL_Window **win, SDL_Renderer **rend, SDL_RendererInfo *rend_info, SDL_Rect *viewport); -int paintTerrain(gameIni_t *gIni, gameRess_t *gRess, gameGraphics_t *gGraph); +//int paint_terrain(gameIni_t *gIni, gameRess_t *gRess, gameGraphics_t *gGraph); + +void render_all(SDL_Renderer *rend, render_item_t render_list[], int list_size); #endif /*GRAPHIC_H*/ diff --git a/src/include/utils.h b/src/include/utils.h index 7f43d8f..11fdeee 100644 --- a/src/include/utils.h +++ b/src/include/utils.h @@ -1,4 +1,6 @@ +#define MAX_PATH_LEN 255 + /* Macro for error checking and logging */ #define MPL_CHECK(expr, fail_code, priority, ...) \ if (! (expr)) { \ @@ -8,4 +10,10 @@ fail_code; \ } -#define MAX_PATH_LEN 255 +/* Macro that check and set NULL texture pointer when destroying */ +#define DESTROYTEXTURE_SAFE(t) \ +if (t != NULL) { \ + SDL_DestroyTexture(t); \ + t=NULL; \ +} + diff --git a/src/loader.c b/src/loader.c index e6e748d..0d16c48 100644 --- a/src/loader.c +++ b/src/loader.c @@ -35,11 +35,11 @@ int loadStyleRes(SDL_Renderer *rend, gameIni_t *gIni, char data_basepath[], game void unloadStyleRes(gameRess_t *gRess) { int i; for(i=0; itiles[i].t); + DESTROYTEXTURE_SAFE(gRess->tiles[i].t); } for(i=0; iobjects[i].t); - SDL_DestroyTexture(gRess->objectMasks[i].t); + DESTROYTEXTURE_SAFE(gRess->objects[i].t); + DESTROYTEXTURE_SAFE(gRess->objectMasks[i].t); } } @@ -77,7 +77,7 @@ int loadMiscRes(SDL_Renderer *rend, char data_basepath[], gameRess_t *gRess) { if (res != 0) return res; (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/countdown.gif", data_basepath); - res=loadSprite(rend,filepath,6,&gRess->countdown); + res=loadSprite(rend,filepath,5,&gRess->countdown); if (res != 0) return res; (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemmfont.gif", data_basepath); @@ -94,14 +94,14 @@ int loadMiscRes(SDL_Renderer *rend, char data_basepath[], gameRess_t *gRess) { void unloadMiscRes(gameRess_t *gRess) { int i; for(i=0; ilemmingAnims[i].t); - SDL_DestroyTexture(gRess->lemmingMasks[i].t); - SDL_DestroyTexture(gRess->lemmingIMasks[i].t); + DESTROYTEXTURE_SAFE(gRess->lemmingAnims[i].t); + DESTROYTEXTURE_SAFE(gRess->lemmingMasks[i].t); + DESTROYTEXTURE_SAFE(gRess->lemmingIMasks[i].t); } - SDL_DestroyTexture(gRess->cursor.t); - SDL_DestroyTexture(gRess->countdown.t); - SDL_DestroyTexture(gRess->font1.t); - SDL_DestroyTexture(gRess->font2.t); + DESTROYTEXTURE_SAFE(gRess->cursor.t); + DESTROYTEXTURE_SAFE(gRess->countdown.t); + DESTROYTEXTURE_SAFE(gRess->font1.t); + DESTROYTEXTURE_SAFE(gRess->font2.t); } /* frames is for animated sprites and is the number of images. Assumed to be all in a column */ @@ -110,10 +110,18 @@ int loadSprite(SDL_Renderer *rend, char *giffilepath, int frames, sprite_t *spri SDL_RWops *rwop; //int res; + MPL_CHECK( + frames > 0, + {return 1;}, + SDL_LOG_PRIORITY_WARN, + "loadSprite(rend, \"%s\", frames, sprite) failed : invalid frames value %i", + giffilepath, frames + ); + rwop = SDL_RWFromFile(giffilepath,"r"); MPL_CHECK( rwop, - {return 1;}, + {return 2;}, SDL_LOG_PRIORITY_WARN, "loadSprite(rend, \"%s\", frames, sprite) failed : problem opening file", giffilepath ); @@ -122,7 +130,7 @@ int loadSprite(SDL_Renderer *rend, char *giffilepath, int frames, sprite_t *spri MPL_CHECK( surf, - {return 2;}, + {return 3;}, SDL_LOG_PRIORITY_WARN, "loadSprite(rend, \"%s\", frames, sprite) failed : can't decode file", giffilepath ); @@ -130,7 +138,7 @@ int loadSprite(SDL_Renderer *rend, char *giffilepath, int frames, sprite_t *spri sprite->t = SDL_CreateTextureFromSurface(rend, surf); MPL_CHECK( sprite->t, - {SDL_FreeSurface(surf); return 2;}, + {SDL_FreeSurface(surf); return 4;}, SDL_LOG_PRIORITY_WARN, "loadSprite(rend, \"%s\", frames, sprite) failed : can't convert surface to texture", giffilepath ); diff --git a/src/sandbox/sprite.c b/src/sandbox/sprite.c index ec33b36..0223997 100644 --- a/src/sandbox/sprite.c +++ b/src/sandbox/sprite.c @@ -108,7 +108,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,SDL_LOG_PRIORITY_INFO, - "SDL_GetWindowPixelFormat() returns %i", SDL_GetWindowPixelFormat(*win) + "SDL_GetWindowPixelFormat() returns 0x%x", SDL_GetWindowPixelFormat(*win) ); *rend=SDL_CreateRenderer(*win,-1, rend_flags); @@ -132,7 +132,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 tf=rend_info->texture_formats[i]; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,SDL_LOG_PRIORITY_INFO, - "rend_info->texture_formats[%i] == %i", i, tf + "rend_info->texture_formats[%i] == 0x%x", i, tf ); } diff --git a/src/sandbox/sprite_gif.c b/src/sandbox/sprite_gif.c index 48657df..d2a3a70 100644 --- a/src/sandbox/sprite_gif.c +++ b/src/sandbox/sprite_gif.c @@ -110,7 +110,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,SDL_LOG_PRIORITY_INFO, - "SDL_GetWindowPixelFormat() returns %i", SDL_GetWindowPixelFormat(*win) + "SDL_GetWindowPixelFormat() returns 0x%x", SDL_GetWindowPixelFormat(*win) ); *rend=SDL_CreateRenderer(*win,-1, rend_flags); @@ -134,7 +134,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 tf=rend_info->texture_formats[i]; SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,SDL_LOG_PRIORITY_INFO, - "rend_info->texture_formats[%i] == %i", i, tf + "rend_info->texture_formats[%i] == 0x%x", i, tf ); } diff --git a/src/test/testrender.c b/src/test/testrender.c index 93fa217..f4c5173 100644 --- a/src/test/testrender.c +++ b/src/test/testrender.c @@ -4,12 +4,16 @@ #include "utils.h" #define DATA_BASEPATH "./data" +#define MAX_RENDERLIST_LEN 256 + +int buildTestRL(gameRess_t *gRess, int rlMaxLen, render_item_t render_list[]); int main(int argc, char **argv) { int res; char filepath[MAX_PATH_LEN]; gameIni_t gIni; gameRess_t gRess; + render_item_t render_list[MAX_RENDERLIST_LEN]; if (argc != 3) { fprintf(stderr, "Usage %s \n", argv[0]); @@ -54,12 +58,12 @@ int main(int argc, char **argv) { SDL_Rect sdl_viewport; SDL_Event sdl_ev; - int mainloop_end=0; + int rlLen, mainloop_end=0; - SDL_Rect win_pos = { .x=SDL_WINDOWPOS_UNDEFINED, .y=SDL_WINDOWPOS_UNDEFINED, .w=640, .h=480 }; - Uint32 init_flags = SDL_INIT_TIMER|SDL_INIT_VIDEO;//|SDL_INIT_EVENTS; + SDL_Rect win_pos = { .x=SDL_WINDOWPOS_UNDEFINED, .y=SDL_WINDOWPOS_UNDEFINED, .w=1920, .h=1200 }; + Uint32 init_flags = SDL_INIT_TIMER|SDL_INIT_VIDEO; Uint32 win_flags = SDL_WINDOW_SHOWN; - Uint32 rend_flags = SDL_RENDERER_ACCELERATED; + Uint32 rend_flags = SDL_RENDERER_ACCELERATED; // | SDL_RENDERER_PRESENTVSYNC; my_SDL_init_or_die(__FILE__, win_pos, init_flags, win_flags, rend_flags, &sdl_win, &sdl_rend, &sdl_rend_info, &sdl_viewport); @@ -71,26 +75,28 @@ int main(int argc, char **argv) { res=loadStyleRes(sdl_rend, &gIni, DATA_BASEPATH, &gRess); if (res!=0) exit(res); + rlLen=buildTestRL(&gRess, MAX_RENDERLIST_LEN, render_list); /* Main render loop */ while (!mainloop_end) { + int i; + /* Check for events */ while (SDL_PollEvent(&sdl_ev)) { - if (sdl_ev.type == SDL_QUIT || sdl_ev.type == SDL_KEYDOWN) { + if (sdl_ev.type == SDL_QUIT) { mainloop_end = 1; } } - /* Draw a gray background */ - SDL_SetRenderDrawColor(sdl_rend, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(sdl_rend); - - /* Blit the sprite onto the screen */ - SDL_RenderCopy(sdl_rend, gRess.objects[0].t, NULL, NULL); - //SDL_RenderCopy(sdl_rend, t1, &t1_src, &t1_dst); - - /* Update the screen */ + render_all(sdl_rend, render_list, rlLen); SDL_RenderPresent(sdl_rend); - SDL_Delay(50); + for (i=0;ianimate==1) { + it->currframe = (it->currframe + 1) % it->sprite->frames; + } + } + SDL_Delay(100); } unloadStyleRes(&gRess); unloadMiscRes(&gRess); @@ -101,3 +107,75 @@ int main(int argc, char **argv) { return 0; } + +int addRLitem(render_item_t list[], sprite_t *it, int rlMaxLen) { + static int cur=0, curr_x=0, curr_y=0, tmp_h=0; + + if (it == NULL) { + curr_y += tmp_h; + curr_x = tmp_h = 0; + return cur; + } + if (cur > rlMaxLen || it->t == NULL) return cur; + + list[cur].sprite = it; + list[cur].x = curr_x; + list[cur].y = curr_y; + list[cur].currframe = 0; + + if (it->frames > 1) { + list[cur].animate = 1; /* By defaut, animate */ + } + curr_x += it->size.w + 1; + if (tmp_h < it->size.h) tmp_h = it->size.h; + + cur++; + if (curr_x >= 1920) { + curr_x=0; + curr_y += tmp_h; + tmp_h=0; + } + + return cur; +} + +int buildTestRL(gameRess_t *gRess, int rlMaxLen, render_item_t render_list[]) { + int i, rlLen; + + for (i=0; ilemmingAnims[i], rlMaxLen); + } + rlLen=addRLitem(render_list, NULL, rlMaxLen); + + for (i=0; ilemmingMasks[i], rlMaxLen); + } + rlLen=addRLitem(render_list, NULL, rlMaxLen); + + for (i=0; ilemmingIMasks[i], rlMaxLen); + } + rlLen=addRLitem(render_list, NULL, rlMaxLen); + + for (i=0; iobjects[i], rlMaxLen); + } + rlLen=addRLitem(render_list, NULL, rlMaxLen); + + for (i=0; iobjectMasks[i], rlMaxLen); + } + rlLen=addRLitem(render_list, NULL, rlMaxLen); + + rlLen=addRLitem(render_list, &gRess->font1, rlMaxLen); + rlLen=addRLitem(render_list, &gRess->font2, rlMaxLen); + rlLen=addRLitem(render_list, &gRess->countdown, rlMaxLen); + rlLen=addRLitem(render_list, &gRess->cursor, rlMaxLen); + + for (i=0; itiles[i], rlMaxLen); + } + rlLen=addRLitem(render_list, NULL, rlMaxLen); + return rlLen; +} + -- cgit v1.2.3