Blame projects/jigsaw/phisics.c

Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#include "phisics.h"
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void physicsAlloc(Physics *ph, int hw, int hh, double cs) {
Ivan Mahonin fdbd7d
  ph->cs = maxd(PRECISION, cs);
Ivan Mahonin fdbd7d
  ph->hw = hw > 2 ? hw : 2;
Ivan Mahonin fdbd7d
  ph->hh = hh > 2 ? hh : 2;
Ivan Mahonin fdbd7d
  ph->cells = (PhCell*)alloc(4*ph->hh*ph->hw*ASIZEOF(*ph->cells));
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void physicsFree(Physics *ph) {
Ivan Mahonin fdbd7d
  free(ph->cells);
Ivan Mahonin fdbd7d
  memset(ph, 0, sizeof(*ph));
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
PhCell* physicsCell(Physics *ph, Vec p) {
Ivan Mahonin fdbd7d
  int cx = (int)floor(p.x/ph->cs + ph->hw - 0.5);
Ivan Mahonin fdbd7d
  int cy = (int)floor(p.y/ph->cs + ph->hh - 0.5);
Ivan Mahonin fdbd7d
  if (cx > 2*(ph->hw-1)) cx = 2*(ph->hw-1);
Ivan Mahonin fdbd7d
  if (cy > 2*(ph->hh-1)) cy = 2*(ph->hh-1);
Ivan Mahonin fdbd7d
  if (cx < 0) cx = 0;
Ivan Mahonin fdbd7d
  if (cy < 0) cy = 0;
Ivan Mahonin fdbd7d
  return ph->cells + 2*ph->hw*cy + cx;
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void physicsClear(Physics *ph) {
Ivan Mahonin fdbd7d
  while(ph->first) {
Ivan Mahonin fdbd7d
    while(ph->first->first) phNodeUnreg(ph->first->first);
Ivan Mahonin fdbd7d
    phGroupUnreg(ph->first);
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
int physicsUpdate(Physics *ph) {
Ivan Mahonin fdbd7d
  int res = 0;
Ivan Mahonin fdbd7d
  // collision
Ivan Mahonin fdbd7d
  //for(PhGroup *g = ph->first; g; g = g->next)
Ivan Mahonin fdbd7d
  //  for(PhNode *n = g->first; n; n = n->next)
Ivan Mahonin fdbd7d
  //    res += phNodeCollision(n);
Ivan Mahonin fdbd7d
  // bounds
Ivan Mahonin fdbd7d
  for(PhGroup *g = ph->first; g; g = g->next)
Ivan Mahonin dcf1b6
    if (!g->fixed)
Ivan Mahonin dcf1b6
      for(PhNode *n = g->first; n; n = n->next)
Ivan Mahonin dcf1b6
        res += phNodeBound(n, ph->b0, ph->b1);
Ivan Mahonin fdbd7d
  // fix
Ivan Mahonin fdbd7d
  for(PhGroup *g = ph->first; g; g = g->next)
Ivan Mahonin fdbd7d
    phGroupFix(g, ph->fixangle);
Ivan Mahonin fdbd7d
  return res;
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void physicsDrawDebug(Physics *ph) {
Ivan Mahonin fdbd7d
  int seed = rand();
Ivan Mahonin fdbd7d
  srand(0);
Ivan Mahonin fdbd7d
  saveState();
Ivan Mahonin fdbd7d
  noFill();
Ivan Mahonin fdbd7d
  for(PhGroup *g = ph->first; g; g = g->next) {
Ivan Mahonin fdbd7d
    stroke(randColorPtr(g));
Ivan Mahonin fdbd7d
    for(PhNode *n = g->first; n; n = n->next)
Ivan Mahonin fdbd7d
      circle(n->p.x, n->p.y, n->r);
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
  restoreState();
Ivan Mahonin fdbd7d
  srand(seed);
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d