diff options
Diffstat (limited to 'src/graphic.c')
-rw-r--r-- | src/graphic.c | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/src/graphic.c b/src/graphic.c index f708304..c0b1d24 100644 --- a/src/graphic.c +++ b/src/graphic.c @@ -204,12 +204,12 @@ int paintTerrain(gameIni_t *gIni, gameRess_t *gRess, gameState_t *gState) { return 0; } -int renderTerrain(SDL_Renderer *rend, gameState_t *gState) { - int res; +int renderTerrainToTexture(SDL_Renderer *rend, gameState_t *gState) { + int res, pitch; SDL_Rect src_rect, dst_rect; SDL_Surface *tmp_surf; SDL_PixelFormat *pf = gState->terrain->format; - SDL_Texture * tmp_tex; + Uint32 *pixels; tmp_surf = SDL_CreateRGBSurface(0,MPL_WIN_W, LEVEL_HEIGHT, // pf->BitsPerPixel, pf->Rmask, pf->Gmask, pf->Bmask, pf->Amask); @@ -238,25 +238,34 @@ int renderTerrain(SDL_Renderer *rend, gameState_t *gState) { "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" - ); - + if (gState->terrainSprite.t == NULL) { + gState->terrainSprite.t = SDL_CreateTexture(rend, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, dst_rect.w, dst_rect.h); + MPL_CHECK( + gState->terrainSprite.t, + { SDL_FreeSurface(tmp_surf); return 3; }, + SDL_LOG_PRIORITY_CRITICAL, + "Can't SDL_CreateTexture for terrainSprite" + ); + gState->terrainSprite.size = dst_rect; + gState->terrainSprite.frames = 1; + } - res=SDL_RenderCopy(rend, tmp_tex, &dst_rect, &dst_rect); + res=SDL_LockTexture(gState->terrainSprite.t, NULL, (void **)&pixels, &pitch); MPL_CHECK( - res==0, - { SDL_FreeSurface(tmp_surf); SDL_DestroyTexture(tmp_tex); return 4; }, + (res==0) && (pitch == dst_rect.w * sizeof(Uint32)), + { SDL_FreeSurface(tmp_surf); + SDL_UnlockTexture(gState->terrainSprite.t); + return 3; + }, SDL_LOG_PRIORITY_CRITICAL, - "Can't SDL_RenderCopy() the terrain" + "Can't SDL_CreateTexture for terrainSprite" ); + (void) SDL_memcpy(pixels, tmp_surf->pixels, dst_rect.h * pitch); + SDL_UnlockTexture(gState->terrainSprite.t); + SDL_FreeSurface(tmp_surf); - SDL_DestroyTexture(tmp_tex); +// SDL_DestroyTexture(gState->terrainSprite.t); //TODO mais pas ici !! return 0; } @@ -270,7 +279,11 @@ int renderSprites(SDL_Renderer *rend, gameState_t *gState) { for(i=0,res=0 ; i < gState->renderListSize && res==0 ; i++) { src = dst = renderList[i].sprite->size; src.y = src.h * renderList[i].currframe; - dst.x = renderList[i].x; + if ( renderList[i].absolute ) { + dst.x = renderList[i].x; + } else { + dst.x = renderList[i].x - gState->cameraX; + } dst.y = renderList[i].y; res=SDL_RenderCopy(rend, renderList[i].sprite->t, &src, &dst); } |