diff options
Diffstat (limited to 'libphysics/blockmap.c')
| -rw-r--r-- | libphysics/blockmap.c | 146 |
1 files changed, 0 insertions, 146 deletions
diff --git a/libphysics/blockmap.c b/libphysics/blockmap.c deleted file mode 100644 index 26af021..0000000 --- a/libphysics/blockmap.c +++ /dev/null @@ -1,146 +0,0 @@ -#include <vecmath.h> -#include <physics.h> - -#include <stdlib.h> -#include <string.h> - -#include "dat.h" - -#define BUCKETS 0x10000 /* must be a power of 2 */ - -#define BUCKETMASK (BUCKETS - 1) - -#define PHI 1.618033988749895 -#define HMUL (int)(BUCKETS / PHI) - -#define LENGTH(X) (sizeof (X) / sizeof (X)[0]) - -static int hash(int a); -static void makeblockmap(Body *b); - -static void enqueuetest(TestCollision *t); -static void bodycollisionmap(Body *); -static void bodycollisionmapsub(Body *, BlockmapNode *); -static BlockmapNode *allocnode(void); - -static void phxmakeblkmap(void); -static BlockmapNode *phxnodelist(float x, float y); - -static BlockmapNode nodes[(1 << 20)]; -static int nodesi; -static BlockmapNode *lists[BUCKETS]; - -static TestCollision testcollision[0x1000]; -static int testcollisioncount; - -void -__phxbroadphasereset(void) -{ - static int count = 0; - if(count == 0) - phxmakeblkmap(); - count = (count + 1) % 4; -} - -void -__phxbroadphase(int n, BodyID bid[n]) -{ - testcollisioncount = 0; - for(int i = 0; i < n; i++) { - Body *b = phxbodypool + bid[i]; - bodycollisionmap(b); - } - __phxnarrowphase(testcollisioncount, testcollision); -} - -void -phxmakeblkmap() -{ - nodesi = 0; - - for(int i = 0; i < BUCKETS; i++) - lists[i] = NULL; - - for(int i = 0; i < phxbodypoolsize; i++) { - Body *b = phxbodypool + i; - if(!b->active) - continue; - makeblockmap(b); - } -} - -void -makeblockmap(Body *b) -{ - BlockmapNode *n; - if((n = allocnode()) == NULL) - return; - - n->id = b - phxbodypool; - n->next = NULL; - - int mapx = (int)floorf(b->pos[0] / BLOCK_SIZE); - int mapy = (int)floorf(b->pos[1] / BLOCK_SIZE); - int h = hash(mapx + hash(mapy)); - - n->next = lists[h]; - lists[h] = n; -} - -int -hash(int a) -{ - return (a * HMUL) & BUCKETMASK; -} - -BlockmapNode * -allocnode(void) -{ - if(nodesi == (sizeof(nodes) / sizeof(nodes[0]))) - return NULL; - return nodes + nodesi++; -} - -BlockmapNode * -phxnodelist(float x, float y) -{ - int mapx = (int)floorf(x / BLOCK_SIZE); - int mapy = (int)floorf(y / BLOCK_SIZE); - int h = hash(mapx + hash(mapy)); - return lists[h]; -} - -void -bodycollisionmap(Body *a) -{ - for(int y = -1; y <= 1; y++) - for(int x = -1; x <= 1; x++) { - bodycollisionmapsub(a, phxnodelist( - a->pos[0] + x * BLOCK_SIZE, - a->pos[1] + y * BLOCK_SIZE - )); - } -} - -void -bodycollisionmapsub(Body *a, BlockmapNode *n) -{ - while(n) { - Body *b = phxbodypool + n->id; - enqueuetest(&(TestCollision) { - .a = a - phxbodypool, - .b = b - phxbodypool - }); - n = n->next; - } -} - -void -enqueuetest(TestCollision *t) -{ - testcollision[testcollisioncount++] = *t; - if(testcollisioncount >= LENGTH(testcollision)) { - __phxnarrowphase(testcollisioncount, testcollision); - testcollisioncount = 0; - } -} |
