summaryrefslogtreecommitdiffstats
path: root/src/area.c
diff options
context:
space:
mode:
authorP. J. McDermott <pjm@nac.net>2013-02-19 00:04:27 (EST)
committer P. J. McDermott <pjm@nac.net>2013-02-19 00:04:27 (EST)
commitd97803995c8512738297dcff27ceec60bd023405 (patch)
tree28c009e10304f76fa7a9b75ab95b41da301c38d6 /src/area.c
parenta1fabc10623b9e9a4177e8e0344d5edccdcf60b7 (diff)
downloadoverworld-rpg-d97803995c8512738297dcff27ceec60bd023405.zip
overworld-rpg-d97803995c8512738297dcff27ceec60bd023405.tar.gz
overworld-rpg-d97803995c8512738297dcff27ceec60bd023405.tar.bz2
Implement and test renderer.
Diffstat (limited to 'src/area.c')
-rw-r--r--src/area.c112
1 files changed, 107 insertions, 5 deletions
diff --git a/src/area.c b/src/area.c
index 3a03198..ae8b071 100644
--- a/src/area.c
+++ b/src/area.c
@@ -2,6 +2,101 @@
#include "area.h"
#include "layer.h"
#include "viewport.h"
+#include "resources/map.h"
+#include "logging.h"
+
+static void blit_map_layers(struct map *, struct area *);
+static void blit_map_layer(struct map *, enum map_layer_id,
+ struct area *, enum area_layer_id);
+
+struct area *
+area_new(struct map *map)
+{
+ struct area *a;
+
+ a = malloc(sizeof(*a));
+ if (a == NULL) {
+ return NULL;
+ }
+
+ blit_map_layers(map, a);
+
+ return a;
+}
+
+static void
+blit_map_layers(struct map *map, struct area *area)
+{
+ blit_map_layer(map, MAP_LAYER_GROUND, area, AREA_LAYER_GROUND);
+ blit_map_layer(map, MAP_LAYER_OBJ_LOW, area, AREA_LAYER_OBJ_LOW);
+ blit_map_layer(map, MAP_LAYER_OBJ_MID, area, AREA_LAYER_OBJ_MID);
+ blit_map_layer(map, MAP_LAYER_OBJ_HIGH, area, AREA_LAYER_OBJ_HIGH);
+}
+
+static void
+blit_map_layer(struct map *map, enum map_layer_id map_layer,
+ struct area *area, enum area_layer_id area_layer)
+{
+ int i;
+ Uint32 gid;
+ int tile_found;
+ struct map_tileset *mts;
+ Uint32 mts_lastgid;
+ SDL_Rect tilerect, layerrect;
+
+ area->map_layers[area_layer] = SDL_CreateRGBSurface(
+ SDL_SWSURFACE | SDL_SRCCOLORKEY | SDL_SRCALPHA,
+ map->width * map->tilewidth,
+ map->height * map->tileheight,
+ 32,
+ 0x000000FF,
+ 0x0000FF00,
+ 0x00FF0000,
+ 0x00000000);
+ SDL_SetColorKey(area->map_layers[area_layer], SDL_SRCCOLORKEY, 0);
+ for (i = 0; i < map->width * map->height; ++i) {
+ gid = map->layers[map_layer].tiles[i];
+ if (gid == 0) {
+ continue;
+ }
+ tile_found = 0;
+ for (mts = map->tilesets_head; mts != NULL; mts = mts->next) {
+ mts_lastgid = mts->firstgid +
+ mts->tileset->width * mts->tileset->height;
+ if (gid >= mts->firstgid && gid < mts_lastgid) {
+ gid -= mts->firstgid;
+ tilerect.x = gid % mts->tileset->width;
+ tilerect.y = gid / mts->tileset->width;
+ tilerect.w = mts->tileset->tilewidth;
+ tilerect.h = mts->tileset->tileheight;
+ tilerect.x *= tilerect.w;
+ tilerect.y *= tilerect.h;
+ layerrect.x = i % map->width;
+ layerrect.y = i / map->width;
+ layerrect.w = mts->tileset->tilewidth;
+ layerrect.h = mts->tileset->tileheight;
+ layerrect.x *= layerrect.w;
+ layerrect.y *= layerrect.h;
+#if 0
+ debug("Blitting %dx%d tile at (%d,%d) "
+ "onto layer at (%d,%d)...",
+ tilerect.w, tilerect.h,
+ tilerect.x, tilerect.y,
+ layerrect.x, layerrect.y);
+#endif
+ SDL_BlitSurface(mts->tileset->image->image,
+ &tilerect,
+ area->map_layers[area_layer],
+ &layerrect);
+ tile_found = 1;
+ break;
+ }
+ }
+ if (!tile_found) {
+ warn("Tile with gid 0x%8.8x not found", gid);
+ }
+ }
+}
void
render_area_to_viewport(struct area *area, struct viewport *vp)
@@ -25,26 +120,33 @@ void
render_area_to_surface(struct area *area, SDL_Rect *arearect,
SDL_Surface *dst, SDL_Rect *dstrect)
{
+ debug("Rendering %dx%d area rect at (%d,%d) "
+ "onto %dx%d surface rect at (%d,%d)...",
+ arearect->w, arearect->h, arearect->x, arearect->y,
+ dstrect->w, dstrect->h, dstrect->x, dstrect->y);
+
/* Fast fill with black to avoid artifacts in off-map pixels. */
- SDL_FillRect(dst, dstrect, 0);
+ /* NB: This is gray, at least temporarily. */
+ SDL_FillRect(dst, dstrect, SDL_MapRGB(dst->format, 63, 63, 63));
/* Blit ground layer. */
- SDL_BlitSurface(area->map_layers[LAYER_GROUND], arearect,
+ SDL_BlitSurface(area->map_layers[AREA_LAYER_GROUND], arearect,
dst, dstrect);
/* Blit low objects layer. */
- SDL_BlitSurface(area->map_layers[LAYER_OBJ_LOW], arearect,
+ SDL_BlitSurface(area->map_layers[AREA_LAYER_OBJ_LOW], arearect,
dst, dstrect);
+/* return;*/
/* TODO: Blit low sprites. */
/* Blit middle objects layer. */
- SDL_BlitSurface(area->map_layers[LAYER_OBJ_MID], arearect,
+ SDL_BlitSurface(area->map_layers[AREA_LAYER_OBJ_MID], arearect,
dst, dstrect);
/* TODO: Blit high sprites. */
/* Blit high objects layer. */
- SDL_BlitSurface(area->map_layers[LAYER_OBJ_HIGH], arearect,
+ SDL_BlitSurface(area->map_layers[AREA_LAYER_OBJ_HIGH], arearect,
dst, dstrect);
}