summaryrefslogtreecommitdiff
path: root/src/graphic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphic.c')
-rw-r--r--src/graphic.c47
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);
}