Blame projects/jigsaw/phisics.h

Ivan Mahonin fdbd7d
#ifndef PHISICS_H
Ivan Mahonin fdbd7d
#define PHISICS_H
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#include "common.h"
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
typedef struct PhLink PhLink;
Ivan Mahonin fdbd7d
typedef struct PhNode PhNode;
Ivan Mahonin fdbd7d
typedef struct PhGroup PhGroup;
Ivan Mahonin fdbd7d
typedef struct Physics Physics;
Ivan Mahonin fdbd7d
typedef PhLink *PhCell;
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
struct PhLink {
Ivan Mahonin fdbd7d
  PhNode *node;
Ivan Mahonin fdbd7d
  PhCell *cell;
Ivan Mahonin fdbd7d
  PhLink *prev, *next;
Ivan Mahonin fdbd7d
};
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
struct PhNode {
Ivan Mahonin fdbd7d
  PhGroup *group;
Ivan Mahonin fdbd7d
  PhNode *prev, *next;
Ivan Mahonin fdbd7d
  PhLink l[4];
Ivan Mahonin fdbd7d
  double r;
Ivan Mahonin fdbd7d
  Vec p, gp, gk;
Ivan Mahonin fdbd7d
  size_t mark; // temporary mark
Ivan Mahonin fdbd7d
  PhNode *chain; // temporary chain
Ivan Mahonin fdbd7d
};
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
struct PhGroup {
Ivan Mahonin fdbd7d
  Physics *ph;
Ivan Mahonin fdbd7d
  PhGroup *prev, *next;
Ivan Mahonin fdbd7d
  PhNode *first, *last;
Ivan Mahonin fdbd7d
  int cnt;
Ivan Mahonin fdbd7d
  Vec go, o, dx;
Ivan Mahonin fdbd7d
};
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
struct Physics {
Ivan Mahonin fdbd7d
  PhGroup *first, *last;
Ivan Mahonin fdbd7d
  
Ivan Mahonin fdbd7d
  double cs;
Ivan Mahonin fdbd7d
  int hw, hh;
Ivan Mahonin fdbd7d
  PhCell *cells;
Ivan Mahonin fdbd7d
  size_t lastMark;
Ivan Mahonin fdbd7d
  
Ivan Mahonin fdbd7d
  Vec b0, b1;
Ivan Mahonin fdbd7d
  int fixangle;
Ivan Mahonin fdbd7d
};
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void phLinkUnreg(PhLink *l);
Ivan Mahonin fdbd7d
void phLinkReg(PhLink *l, PhCell *c);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void phNodeUnregCell(PhNode *n);
Ivan Mahonin fdbd7d
void phNodeRegCell(PhNode *n, PhCell *c, int stride);
Ivan Mahonin fdbd7d
void phNodeUpdateCell(PhNode *n);
Ivan Mahonin fdbd7d
void phNodeUnreg(PhNode *n);
Ivan Mahonin fdbd7d
void phNodeReg(PhNode *n, PhGroup *g);
Ivan Mahonin fdbd7d
int phNodeBound(PhNode *n, Vec b0, Vec b1);
Ivan Mahonin fdbd7d
int phNodeCollision(PhNode *n);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
static inline Vec phGroupTrans(PhGroup *g, Vec gp) { return vtrans(vsub(gp, g->go), g->dx, g->o); }
Ivan Mahonin fdbd7d
static inline Vec phGroupUntrans(PhGroup *g, Vec p) { return vadd(vuntrans(p, g->dx, g->o), g->go); }
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void phGroupUpdateCells(PhGroup *g);
Ivan Mahonin fdbd7d
void phGroupUnreg(PhGroup *g);
Ivan Mahonin fdbd7d
void phGroupReg(PhGroup *g, Physics *ph);
Ivan Mahonin fdbd7d
void phGroupRecalc(PhGroup *g);
Ivan Mahonin fdbd7d
void phGroupPlaceNodes(PhGroup *g);
Ivan Mahonin fdbd7d
void phGroupFix(PhGroup *g, int fixangle);
Ivan Mahonin fdbd7d
void phGroupMove(PhGroup *g, Vec gp, Vec p, int fixangle);
Ivan Mahonin fdbd7d
void phGroupMerge(PhGroup *a, PhGroup *b);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void physicsAlloc(Physics *ph, int hw, int hh, double cs);
Ivan Mahonin fdbd7d
void physicsFree(Physics *ph);
Ivan Mahonin fdbd7d
PhCell* physicsCell(Physics *ph, Vec p);
Ivan Mahonin fdbd7d
void physicsClear(Physics *ph);
Ivan Mahonin fdbd7d
int physicsUpdate(Physics *ph);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void physicsDrawDebug(Physics *ph);
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#endif