summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-18 20:55:55 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-18 20:55:55 +0200
commit2e8fce8250fdfc6c6d644c9354d4a3318975bae8 (patch)
tree058b876910dfb3353cab52f425f837205ee7843b
parentf02db00ad4f41b4d098557a63461f6c5766c3273 (diff)
downloadmplemmings-2e8fce8250fdfc6c6d644c9354d4a3318975bae8.tar.gz
mplemmings-2e8fce8250fdfc6c6d644c9354d4a3318975bae8.tar.bz2
mplemmings-2e8fce8250fdfc6c6d644c9354d4a3318975bae8.zip
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 ?
-rw-r--r--src/graphic.c22
-rw-r--r--src/include/graphic.h11
-rw-r--r--src/include/utils.h10
-rw-r--r--src/loader.c36
-rw-r--r--src/sandbox/sprite.c4
-rw-r--r--src/sandbox/sprite_gif.c4
-rw-r--r--src/test/testrender.c106
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;i<list_size && res==0;i++) {
+ src = dst = render_list[i].sprite->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);
+ }
+}
+
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; i<MAX_TILES_COUNT;i++) {
- SDL_DestroyTexture(gRess->tiles[i].t);
+ DESTROYTEXTURE_SAFE(gRess->tiles[i].t);
}
for(i=0; i<MAX_OBJECTS_COUNT;i++) {
- SDL_DestroyTexture(gRess->objects[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; i<MAX_LEMMANIM_COUNT; i++) {
- SDL_DestroyTexture(gRess->lemmingAnims[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 <levelpack_name> <level_ini_name>\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;i<rlLen;i++) {
+ render_item_t *it = &render_list[i];
+ if (it->animate==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; i<MAX_LEMMANIM_COUNT; i++) {
+ rlLen=addRLitem(render_list, &gRess->lemmingAnims[i], rlMaxLen);
+ }
+ rlLen=addRLitem(render_list, NULL, rlMaxLen);
+
+ for (i=0; i<MAX_LEMMANIM_COUNT; i++) {
+ rlLen=addRLitem(render_list, &gRess->lemmingMasks[i], rlMaxLen);
+ }
+ rlLen=addRLitem(render_list, NULL, rlMaxLen);
+
+ for (i=0; i<MAX_LEMMANIM_COUNT; i++) {
+ rlLen=addRLitem(render_list, &gRess->lemmingIMasks[i], rlMaxLen);
+ }
+ rlLen=addRLitem(render_list, NULL, rlMaxLen);
+
+ for (i=0; i<MAX_OBJECTS_COUNT; i++) {
+ rlLen=addRLitem(render_list, &gRess->objects[i], rlMaxLen);
+ }
+ rlLen=addRLitem(render_list, NULL, rlMaxLen);
+
+ for (i=0; i<MAX_OBJECTS_COUNT; i++) {
+ rlLen=addRLitem(render_list, &gRess->objectMasks[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; i<MAX_TILES_COUNT; i++) {
+ rlLen=addRLitem(render_list, &gRess->tiles[i], rlMaxLen);
+ }
+ rlLen=addRLitem(render_list, NULL, rlMaxLen);
+ return rlLen;
+}
+