Resize quadtree entity capacity as needed.
This commit is contained in:
parent
6b1e62dd38
commit
b004dd95ab
|
@ -52,8 +52,6 @@ void initBattle(void)
|
||||||
app.delegate.draw = &draw;
|
app.delegate.draw = &draw;
|
||||||
memset(&app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS);
|
memset(&app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS);
|
||||||
|
|
||||||
battle.quadtree.w = BATTLE_AREA_WIDTH;
|
|
||||||
battle.quadtree.h = BATTLE_AREA_HEIGHT;
|
|
||||||
initQuadtree(&battle.quadtree);
|
initQuadtree(&battle.quadtree);
|
||||||
|
|
||||||
initBullets();
|
initBullets();
|
||||||
|
|
|
@ -30,14 +30,22 @@ static void addCandidate(Entity *e);
|
||||||
static int candidatesComparator(const void *a, const void *b);
|
static int candidatesComparator(const void *a, const void *b);
|
||||||
static void getAllEntsWithinNode(int x, int y, int w, int h, Entity *ignore, Quadtree *root);
|
static void getAllEntsWithinNode(int x, int y, int w, int h, Entity *ignore, Quadtree *root);
|
||||||
static void destroyQuadtreeNode(Quadtree *root);
|
static void destroyQuadtreeNode(Quadtree *root);
|
||||||
|
static void resizeQTEntCapacity(Quadtree *root);
|
||||||
|
|
||||||
void initQuadtree(Quadtree *root)
|
void initQuadtree(Quadtree *root)
|
||||||
{
|
{
|
||||||
Quadtree *node;
|
Quadtree *node;
|
||||||
int i, w, h;
|
int i, w, h;
|
||||||
|
|
||||||
|
/* entire battlefield */
|
||||||
if (root->depth == 0)
|
if (root->depth == 0)
|
||||||
{
|
{
|
||||||
|
root->w = BATTLE_AREA_WIDTH;
|
||||||
|
root->h = BATTLE_AREA_HEIGHT;
|
||||||
|
root->capacity = QT_INITIAL_CAPACITY;
|
||||||
|
root->ents = malloc(sizeof(Entity*) * root->capacity);
|
||||||
|
memset(root->ents, 0, sizeof(Entity*) * root->capacity);
|
||||||
|
|
||||||
memory = 0;
|
memory = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +63,9 @@ void initQuadtree(Quadtree *root)
|
||||||
root->node[i] = node;
|
root->node[i] = node;
|
||||||
|
|
||||||
node->depth = root->depth + 1;
|
node->depth = root->depth + 1;
|
||||||
|
node->capacity = QT_INITIAL_CAPACITY;
|
||||||
|
node->ents = malloc(sizeof(Entity*) * node->capacity);
|
||||||
|
memset(node->ents, 0, sizeof(Entity*) * node->capacity);
|
||||||
|
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
|
@ -110,13 +121,35 @@ void addToQuadtree(Entity *e, Quadtree *root)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (root->numEnts < QT_MAX_ENTS)
|
if (root->numEnts == root->capacity)
|
||||||
{
|
{
|
||||||
root->ents[root->numEnts++] = e;
|
resizeQTEntCapacity(root);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Couldn't add %s to quadtree - out of node ent space", e->name);
|
root->ents[root->numEnts++] = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void resizeQTEntCapacity(Quadtree *root)
|
||||||
|
{
|
||||||
|
int i, n;
|
||||||
|
Entity **ents;
|
||||||
|
|
||||||
|
n = root->capacity + QT_INITIAL_CAPACITY;
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing QT node: %d -> %d\n", root->capacity, n);
|
||||||
|
|
||||||
|
ents = malloc(sizeof(Entity*) * n);
|
||||||
|
memset(ents, 0, sizeof(Entity*) * n);
|
||||||
|
|
||||||
|
for (i = 0 ; i < root->capacity ; i++)
|
||||||
|
{
|
||||||
|
ents[i] = root->ents[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
free(root->ents);
|
||||||
|
|
||||||
|
root->ents = ents;
|
||||||
|
root->capacity = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int getIndex(Quadtree *root, int x, int y, int w, int h)
|
static int getIndex(Quadtree *root, int x, int y, int w, int h)
|
||||||
|
@ -184,7 +217,7 @@ static void removeEntity(Entity *e, Quadtree *root)
|
||||||
|
|
||||||
n = root->numEnts;
|
n = root->numEnts;
|
||||||
|
|
||||||
for (i = 0 ; i < QT_MAX_ENTS ; i++)
|
for (i = 0 ; i < root->capacity ; i++)
|
||||||
{
|
{
|
||||||
if (root->ents[i] == e)
|
if (root->ents[i] == e)
|
||||||
{
|
{
|
||||||
|
@ -279,6 +312,8 @@ static void destroyQuadtreeNode(Quadtree *root)
|
||||||
{
|
{
|
||||||
destroyQuadtreeNode(root->node[i]);
|
destroyQuadtreeNode(root->node[i]);
|
||||||
|
|
||||||
|
free(root->node[i]->ents);
|
||||||
|
|
||||||
free(root->node[i]);
|
free(root->node[i]);
|
||||||
|
|
||||||
root->node[i] = NULL;
|
root->node[i] = NULL;
|
||||||
|
|
|
@ -20,4 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
|
|
||||||
|
#define QT_MAX_DEPTH 6
|
||||||
|
#define QT_MAX_CANDIDATES 256
|
||||||
|
#define QT_INITIAL_CAPACITY 8
|
||||||
|
|
||||||
extern Battle battle;
|
extern Battle battle;
|
||||||
|
|
|
@ -60,10 +60,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#define MAX_FIGHTER_GUNS 12
|
#define MAX_FIGHTER_GUNS 12
|
||||||
#define MAX_TARGET_RANGE 65536
|
#define MAX_TARGET_RANGE 65536
|
||||||
|
|
||||||
#define QT_MAX_DEPTH 5
|
|
||||||
#define QT_MAX_ENTS 96
|
|
||||||
#define QT_MAX_CANDIDATES 256
|
|
||||||
|
|
||||||
#define BATTLE_AREA_CELLS 50
|
#define BATTLE_AREA_CELLS 50
|
||||||
#define BATTLE_AREA_WIDTH (640 * BATTLE_AREA_CELLS)
|
#define BATTLE_AREA_WIDTH (640 * BATTLE_AREA_CELLS)
|
||||||
#define BATTLE_AREA_HEIGHT (360 * BATTLE_AREA_CELLS)
|
#define BATTLE_AREA_HEIGHT (360 * BATTLE_AREA_CELLS)
|
||||||
|
|
|
@ -267,7 +267,8 @@ struct StarSystem {
|
||||||
struct Quadtree {
|
struct Quadtree {
|
||||||
int depth;
|
int depth;
|
||||||
int x, y, w, h;
|
int x, y, w, h;
|
||||||
Entity *ents[QT_MAX_ENTS];
|
Entity **ents;
|
||||||
|
int capacity;
|
||||||
int numEnts;
|
int numEnts;
|
||||||
Quadtree *node[4];
|
Quadtree *node[4];
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue