From 8d9a2b8fd5d2088d699c2bceb3a54592c33b7b84 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 21 Jul 2013 21:45:21 +0200 Subject: Tentative de rendu du terrain sans passer par une grosse texture (car ne fonctionne pas avec mon netbook : ca fait un carre noir. Idem pour la police font1 qui fait plus de 2000 px de haut. --- src/graphic.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++---- src/include/graphic.h | 6 ++++- src/test/testrender.c | 20 ++++++---------- 3 files changed, 72 insertions(+), 19 deletions(-) diff --git a/src/graphic.c b/src/graphic.c index 7f25437..3a64cfa 100644 --- a/src/graphic.c +++ b/src/graphic.c @@ -84,7 +84,6 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 #define PIXEL32(s,x,y) (((Uint32 *)s->pixels)[y*s->w + x]) -//FIXME : to be implmented int paint_terrain(gameIni_t *gIni, gameRess_t *gRess) { int res, res2, bpp; int i, modifier; @@ -129,10 +128,10 @@ int paint_terrain(gameIni_t *gIni, gameRess_t *gRess) { for(i=0 ; i < gIni->level.terrainCount ; i++) { int tid=gIni->level.terrains[i].id; MPL_CHECK( - tid > 0 && tid < MAX_TILES_COUNT, + tid >= 0 && tid < MAX_TILES_COUNT, { return 4; }, SDL_LOG_PRIORITY_CRITICAL, - "paintTerrain(), gIni->level.terrains[%].id == %i and it's out of range", i, tid + "paintTerrain(), gIni->level.terrains[%i].id == %i and it is out of range", i, tid ); tile=gRess->tiles[tid]; @@ -211,7 +210,62 @@ int paint_terrain(gameIni_t *gIni, gameRess_t *gRess) { return 0; } -void render_all(SDL_Renderer *rend, render_item_t render_list[], int list_size) { +int render_terrain(SDL_Renderer *rend, SDL_Surface *terrain, int xPos) { + int res; + SDL_Rect src_rect, dst_rect; + SDL_Surface *tmp_surf; + SDL_PixelFormat *pf = terrain->format; + SDL_Texture * tmp_tex; + + tmp_surf = SDL_CreateRGBSurface(0,MPL_WIN_W, LEVEL_HEIGHT, + pf->BitsPerPixel, pf->Rmask, pf->Gmask, pf->Bmask, pf->Amask); + + MPL_CHECK( + tmp_surf, + { return 1; }, + SDL_LOG_PRIORITY_CRITICAL, + "Can't SDL_CreateRGBSurface() for converting terrain" + ); + + src_rect.x=xPos; + src_rect.y=0; + src_rect.w=MPL_WIN_W; + src_rect.h=LEVEL_HEIGHT; + + dst_rect=src_rect; + dst_rect.x=0; + + res = SDL_BlitSurface(terrain, &src_rect, tmp_surf, &dst_rect); + MPL_CHECK( + res==0, + { SDL_FreeSurface(tmp_surf); return 2; }, + SDL_LOG_PRIORITY_CRITICAL, + "Can't SDL_BlitSurface(terrain,...)" + ); + + tmp_tex = SDL_CreateTextureFromSurface(rend, tmp_surf); + MPL_CHECK( + tmp_tex, + { SDL_FreeSurface(tmp_surf); return 3; }, + SDL_LOG_PRIORITY_CRITICAL, + "Can't convert terrain to texture" + ); + + res=SDL_RenderCopy(rend, tmp_tex, &dst_rect, &dst_rect); + MPL_CHECK( + res==0, + { SDL_FreeSurface(tmp_surf); SDL_DestroyTexture(tmp_tex); return 4; }, + SDL_LOG_PRIORITY_CRITICAL, + "Can't SDL_RenderCopy() the terrain" + ); + + SDL_FreeSurface(tmp_surf); + SDL_DestroyTexture(tmp_tex); + + return 0; +} + +int render_sprites(SDL_Renderer *rend, render_item_t render_list[], int list_size) { int i, res; SDL_Rect src,dst; @@ -220,7 +274,8 @@ void render_all(SDL_Renderer *rend, render_item_t render_list[], int list_size) 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); + res=SDL_RenderCopy(rend, render_list[i].sprite->t, &src, &dst); } + return res; } diff --git a/src/include/graphic.h b/src/include/graphic.h index 269c283..9876034 100644 --- a/src/include/graphic.h +++ b/src/include/graphic.h @@ -2,6 +2,9 @@ #define GRAPHIC_H #include +#define MPL_WIN_W 640 +#define MPL_WIN_H 480 + #include "data_ini.h" #include "data_ress.h" @@ -16,6 +19,7 @@ void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint3 int paint_terrain(gameIni_t *gIni, gameRess_t *gRess); -void render_all(SDL_Renderer *rend, render_item_t render_list[], int list_size); +int render_sprites(SDL_Renderer *rend, render_item_t render_list[], int list_size); +int render_terrain(SDL_Renderer *rend, SDL_Surface *terrain, int xPos); #endif /*GRAPHIC_H*/ diff --git a/src/test/testrender.c b/src/test/testrender.c index c831089..6493507 100644 --- a/src/test/testrender.c +++ b/src/test/testrender.c @@ -58,9 +58,9 @@ int main(int argc, char **argv) { SDL_Rect sdl_viewport; SDL_Event sdl_ev; - int rlLen, mainloop_end=0; + int rlLen, mainloop_end, tick; - SDL_Rect win_pos = { .x=SDL_WINDOWPOS_UNDEFINED, .y=SDL_WINDOWPOS_UNDEFINED, .w=640, .h=480 }; + SDL_Rect win_pos = { .x=SDL_WINDOWPOS_UNDEFINED, .y=SDL_WINDOWPOS_UNDEFINED, .w=MPL_WIN_W, .h=MPL_WIN_H }; Uint32 init_flags = SDL_INIT_TIMER|SDL_INIT_VIDEO; Uint32 win_flags = SDL_WINDOW_SHOWN; Uint32 rend_flags = SDL_RENDERER_ACCELERATED; // | SDL_RENDERER_PRESENTVSYNC; @@ -77,19 +77,12 @@ int main(int argc, char **argv) { res=paint_terrain(&gIni, &gRess); if (res!=0) exit(res); - - SDL_Texture * terr = SDL_CreateTextureFromSurface(sdl_rend, gRess.terrain); - MPL_CHECK( - terr, - { exit(1); }, - SDL_LOG_PRIORITY_CRITICAL, - "Can't convert terrain to texture" - ); rlLen=buildTestRL(&gRess, MAX_RENDERLIST_LEN, render_list); /* Main render loop */ - while (!mainloop_end) { + mainloop_end = tick = 0; + while (!mainloop_end && tick<16) { int i; /* Check for events */ @@ -99,8 +92,8 @@ int main(int argc, char **argv) { } } SDL_RenderClear(sdl_rend); - (void) SDL_RenderCopy(sdl_rend, terr, NULL, NULL); - render_all(sdl_rend, render_list, rlLen); + (void) render_terrain(sdl_rend, gRess.terrain, gIni.level.xPos); + (void) render_sprites(sdl_rend, render_list, rlLen); SDL_RenderPresent(sdl_rend); for (i=0;i