Blame projects/jigsaw/tile.c

Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#include "tile.h"
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Tile tileAdd(TileMap *tm, int ts, double s) {
Ivan Mahonin fdbd7d
  if (ts <= 0) return (Tile){};
Ivan Mahonin fdbd7d
  if (ts > TM_SIZE) ts = TM_SIZE;
Ivan Mahonin fdbd7d
  if (ts > TM_SIZE - tm->x) { tm->x = 0; tm->y0 = tm->y1; }
Ivan Mahonin fdbd7d
  if (ts > TM_SIZE - tm->y0) {
Ivan Mahonin fdbd7d
    TileMap *ntm = (TileMap*)alloc(sizeof(*ntm));
Ivan Mahonin fdbd7d
    *ntm = *tm;
Ivan Mahonin fdbd7d
    memset(tm, 0, sizeof(*tm));
Ivan Mahonin fdbd7d
    tm->next = ntm;
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  if (!tm->fb) tm->fb = createFramebufferEx(TM_SIZE, TM_SIZE, NULL, FALSE, FALSE, TRUE);
Ivan Mahonin fdbd7d
  if (!tm->tex) tm->tex = createAnimationFromFramebuffer(tm->fb);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  Tile t = { {tm->x/(double)TM_SIZE, tm->y0/(double)TM_SIZE}, ts/(double)TM_SIZE, s, tm->fb, tm->tex };
Ivan Mahonin fdbd7d
  tm->x += ts;
Ivan Mahonin fdbd7d
  if (tm->y1 < tm->y0 + ts) tm->y1 = tm->y0 + ts;
Ivan Mahonin fdbd7d
  return t;
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void tileClear(TileMap *tm) {
Ivan Mahonin fdbd7d
  if (tm->next) tileClear(tm->next);
Ivan Mahonin fdbd7d
  tm->x = tm->y0 = tm->y1 = 0;
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void tileFree(TileMap *tm) {
Ivan Mahonin fdbd7d
  if (tm->next) { tileFree(tm->next); free(tm->next); }
Ivan Mahonin fdbd7d
  if (tm->tex) animationDestroy(tm->tex);
Ivan Mahonin fdbd7d
  if (tm->fb) framebufferDestroy(tm->fb);
Ivan Mahonin fdbd7d
  memset(tm, 0, sizeof(*tm));
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d