summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-21 21:45:21 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-21 21:45:21 +0200
commit8d9a2b8fd5d2088d699c2bceb3a54592c33b7b84 (patch)
treec3261a8f8c91aab324e31406ca14a5598585aa0b
parent56b49ddc50df51f8aee02a41e54fb3d297080828 (diff)
downloadmplemmings-8d9a2b8fd5d2088d699c2bceb3a54592c33b7b84.tar.gz
mplemmings-8d9a2b8fd5d2088d699c2bceb3a54592c33b7b84.tar.bz2
mplemmings-8d9a2b8fd5d2088d699c2bceb3a54592c33b7b84.zip
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.
-rw-r--r--src/graphic.c65
-rw-r--r--src/include/graphic.h6
-rw-r--r--src/test/testrender.c20
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 <SDL.h>
+#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<rlLen;i++) {
@@ -110,6 +103,7 @@ int main(int argc, char **argv) {
}
}
SDL_Delay(100);
+// tick++;
}
unloadStyleRes(&gRess);
unloadMiscRes(&gRess);