Blame projects/jigsaw/puzzle.h

Ivan Mahonin fdbd7d
#ifndef PUZZLE_H
Ivan Mahonin fdbd7d
#define PUZZLE_H
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#include "line.h"
Ivan Mahonin fdbd7d
#include "tile.h"
Ivan Mahonin fdbd7d
#include "phisics.h"
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#define PF_RENDERED  (1 << 0)
Ivan Mahonin fdbd7d
#define PF_BORDER_L  (1 << 1)
Ivan Mahonin fdbd7d
#define PF_BORDER_R  (1 << 2)
Ivan Mahonin fdbd7d
#define PF_BORDER_T  (1 << 3)
Ivan Mahonin fdbd7d
#define PF_BORDER_B  (1 << 4)
Ivan Mahonin fdbd7d
#define PF_HANDLE_L  (1 << 5)
Ivan Mahonin fdbd7d
#define PF_HANDLE_R  (1 << 6)
Ivan Mahonin fdbd7d
#define PF_HANDLE_T  (1 << 7)
Ivan Mahonin fdbd7d
#define PF_HANDLE_B  (1 << 8)
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#define PF_BORDERS   (PF_BORDER_L|PF_BORDER_R|PF_BORDER_T|PF_BORDER_B)
Ivan Mahonin fdbd7d
#define PF_RENDERING (PF_BORDERS|PF_RENDERED)
Ivan Mahonin fdbd7d
#define PF_HANDLES   (PF_HANDLE_L|PF_HANDLE_R|PF_HANDLE_T|PF_HANDLE_B)
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#define PCP_BODY     1
Ivan Mahonin fdbd7d
#define PCP_EDGE     2
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
typedef struct Puzzle Puzzle;
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
typedef struct {
Ivan Mahonin fdbd7d
  Puzzle *pz;
Ivan Mahonin fdbd7d
  int r, c;
Ivan Mahonin fdbd7d
  Tile t;
Ivan Mahonin fdbd7d
  PhGroup *parent;
Ivan Mahonin fdbd7d
  PhGroup group;
Ivan Mahonin fdbd7d
  PhNode nodes[5];
Ivan Mahonin fdbd7d
  Flags flags;
Ivan Mahonin fdbd7d
} Chunk;
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
struct Puzzle {
Ivan Mahonin fdbd7d
  int rows, cols, turn;
Ivan Mahonin fdbd7d
  Vertex **hlines;
Ivan Mahonin fdbd7d
  Vertex **vlines;
Ivan Mahonin fdbd7d
  
Ivan Mahonin fdbd7d
  Physics ph;
Ivan Mahonin fdbd7d
  Chunk **chunks;
Ivan Mahonin fdbd7d
  int groups;
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  Animation image;
Ivan Mahonin fdbd7d
  TileMap tm;
Ivan Mahonin fdbd7d
  Vec cs;
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  Chunk **chunksOrder;
Ivan Mahonin fdbd7d
  int activeChunks;
Ivan Mahonin fdbd7d
  Vec gmouse;
Ivan Mahonin fdbd7d
  int mousefix;
Ivan Mahonin dcf1b6
  int longframe;
Ivan Mahonin fdbd7d
};
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
static inline Vec chunkGroupPos(Chunk *c)
Ivan Mahonin fdbd7d
  { return vmulv( vadd(vec(c->c, c->r), vecxy(0.5)), c->pz->cs ); }
Ivan Mahonin fdbd7d
static inline Vec chunkWorldPos(Chunk *c)
Ivan Mahonin fdbd7d
  { return phGroupTrans(c->parent, chunkGroupPos(c)); }
Ivan Mahonin dcf1b6
static inline int chunkId(Chunk *c)
Ivan Mahonin dcf1b6
  { return c - c->pz->chunks[0]; }
Ivan Mahonin dcf1b6
static inline int chunkGid(Chunk *c)
Ivan Mahonin dcf1b6
  { return chunkId( (Chunk*)((char*)c->parent - offsetof(Chunk, group)) ); }
Ivan Mahonin fdbd7d
Ivan Mahonin dcf1b6
  
Ivan Mahonin fdbd7d
unsigned int chunkCalcEdges(Chunk *c);
Ivan Mahonin fdbd7d
void chunkDrawBase(Chunk *c, unsigned int edges);
Ivan Mahonin fdbd7d
void chunkDraw(Chunk *c);
Ivan Mahonin fdbd7d
void chunkDrawDebug(Chunk *c);
Ivan Mahonin fdbd7d
void chunkRender(Chunk *c);
Ivan Mahonin fdbd7d
void chunkMerge(Chunk *a, Chunk *b);
Ivan Mahonin fdbd7d
void chunkTryMerge(Chunk *a, int dr, int dc);
Ivan Mahonin fdbd7d
Flags chunkCheckPoint(Chunk *c, Vec p);
Ivan Mahonin fdbd7d
int chunkCheckEdge(Chunk *c, Vec p);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void puzzleAlloc(Puzzle *pz, int rows, int cols);
Ivan Mahonin fdbd7d
void puzzleFree(Puzzle *pz);
Ivan Mahonin fdbd7d
void puzzleClearImages(Puzzle *pz);
Ivan Mahonin fdbd7d
void puzzleGenLines(Puzzle *pz, double cellw, double cellh, double jitter, double depth);
Ivan Mahonin fdbd7d
void puzzleRecalcGroups(Puzzle *pz);
Ivan Mahonin fdbd7d
void puzzleGenChunks(Puzzle *pz);
Ivan Mahonin fdbd7d
void puzzleRenderChunks(Puzzle *pz, int size, double m);
Ivan Mahonin dcf1b6
int puzzlePopupGroup(Puzzle *pz, PhGroup *g);
Ivan Mahonin fdbd7d
int puzzleChooseChunks(Puzzle *pz, Vec mouse);
Ivan Mahonin fdbd7d
void puzzleReleaseChunks(Puzzle *pz);
Ivan Mahonin fdbd7d
void puzzleUpdate(Puzzle *pz, Vec hs, Vec mouse);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#endif