/*
* Copyright (C) 2013 Patrick "P. J." McDermott
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program. If not, see
* .
*/
#include
#include "logging.h"
#include "resources/image.h"
#include "resources/map.h"
#include "viewport.h"
#include "area.h"
#include "palettes.h"
#include "demo.h"
#define DEMO() \
do { \
start = SDL_GetTicks(); \
vp->x = x + map->tilewidth / 2 - vp->w / 2; \
vp->y = y + map->tileheight / 2 - vp->h / 2; \
/* \
* See the following resources when computing realistic \
* daylight cycles: \
* * \
* * \
*/ \
if (i % i_max < i_max / 6 * 2) { \
/* 00:00 - 04:00 */ \
t_max = i_max / 6 * 2; \
pal_start = map->palettes[MAP_PALETTE_MORN] \
.palette->palette; \
pal_end = map->palettes[MAP_PALETTE_DAY] \
.palette->palette; \
} else if (i % i_max < i_max / 6 * 4) { \
/* 04:00 - 12:00 */ \
t_max = i_max / 6 * 2; \
pal_start = map->palettes[MAP_PALETTE_DAY] \
.palette->palette; \
pal_end = map->palettes[MAP_PALETTE_EVE] \
.palette->palette; \
} else if (i % i_max < i_max / 6 * 5) { \
/* 12:00 - 20:00 */ \
t_max = i_max / 6 * 1; \
pal_start = map->palettes[MAP_PALETTE_EVE] \
.palette->palette; \
pal_end = map->palettes[MAP_PALETTE_NIGHT] \
.palette->palette; \
} else { \
/* 04:00 - 12:00 */ \
t_max = i_max / 6 * 1; \
pal_start = map->palettes[MAP_PALETTE_NIGHT] \
.palette->palette; \
pal_end = map->palettes[MAP_PALETTE_MORN] \
.palette->palette; \
} \
if (!cycle_palettes_cosine(i, t_max, \
pal_start, pal_end, pal)) { \
warn("Failed to cycle palettes"); \
} \
set_area_palette(a, pal); \
if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, \
pal->colors, 0, pal->ncolors)) { \
warn("Failed to set palette"); \
} \
render_area_to_viewport(a, vp); \
SDL_Flip(vp->screen); \
++i; \
end = SDL_GetTicks(); \
total += end - start; \
SDL_Delay(10); \
} while (0)
void
demo(void)
{
struct viewport *vp;
struct map *map;
struct area *a;
SDL_Palette *pal;
struct map_exit *e;
vp = init_viewport(320, 240, 8);
map = map_get(MAPSDIR "/db16-route.tmx");
if (map == NULL) {
map = map_get("data/maps/db16-route.tmx");
}
if (map == NULL) {
err(1, "Where's the map, George?");
}
pal = map->palettes[MAP_PALETTE_DAY].palette->palette;
if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, pal->colors,
0, pal->ncolors)) {
warn("Failed to set palette");
}
a = area_new(map, vp->screen->format->palette);
for (e = map->map_exits_head; e != NULL; e = e->next) {
debug("Map exit (size %dx%d) at (%d,%d) "
"to map %s (size %dx%d) at (%d,%d)",
e->width, e->height,
e->x, e->y,
e->target_map_name,
e->target_map->width, e->target_map->height,
e->target_x_coord, e->target_y_coord);
}
/* Demo */
{
Uint32 total, start, end;
int i, i_max, t_max;
int x, y;
SDL_Palette *pal_start, *pal_end;
pal = malloc(sizeof(*pal));
if (pal == NULL) {
err(1, "Failed to allocate palette");
}
pal->colors = calloc(64, sizeof(*pal->colors));
if (pal->colors == NULL) {
err(1, "Failed to allocate palette colors");
}
pal->ncolors = 64;
i = 0;
i_max = 1440;
total = 0;
x = 9 * map->tilewidth ;
y = 58 * map->tileheight;
for (; y > 50 * map->tileheight; y -= 1) DEMO(); /* Up */
for (; x < 12 * map->tilewidth ; x += 1) DEMO(); /* Right */
for (; y > 43 * map->tileheight; y -= 1) DEMO(); /* Up */
for (; x > 5 * map->tilewidth ; x -= 1) DEMO(); /* Left */
for (; y > 32 * map->tileheight; y -= 1) DEMO(); /* Up */
for (; x < 13 * map->tilewidth ; x += 1) DEMO(); /* Right */
for (; y > 31 * map->tileheight; y -= 1) DEMO(); /* Up */
for (; x < 16 * map->tilewidth ; x += 1) DEMO(); /* Right */
for (; y < 34 * map->tileheight; y += 1) DEMO(); /* Down */
for (; x < 24 * map->tilewidth ; x += 1) DEMO(); /* Right */
for (; y > 15 * map->tileheight; y -= 1) DEMO(); /* Up */
for (; x > 11 * map->tilewidth ; x -= 1) DEMO(); /* Left */
for (; y > 5 * map->tileheight; y -= 1) DEMO(); /* Up */
for (; x < 17 * map->tilewidth ; x += 1) DEMO(); /* Right */
for (; y > 1 * map->tileheight; y -= 1) DEMO(); /* Up */
debug("Rendered %d frames in %d milliseconds", i, total);
}
}