|
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 |
|