Don't use quadtree for drawing.
This commit is contained in:
parent
c555aeccbe
commit
4a1958319c
|
@ -121,7 +121,7 @@ void doBullets(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (collision(b->x - (b->w / 2) - battle.camera.x, b->y - (b->h / 2) - battle.camera.y, b->w * 2, b->h * 2, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT))
|
if (isOnBattleScreen(b->x, b->y, b->w, b->h))
|
||||||
{
|
{
|
||||||
bulletsToDraw[i++] = b;
|
bulletsToDraw[i++] = b;
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ extern void drawText(int x, int y, int size, int align, SDL_Color c, const char
|
||||||
extern void playSound(int id);
|
extern void playSound(int id);
|
||||||
extern char *getTranslatedString(char *string);
|
extern char *getTranslatedString(char *string);
|
||||||
extern void *resize(void *array, int oldSize, int newSize);
|
extern void *resize(void *array, int oldSize, int newSize);
|
||||||
|
extern int isOnBattleScreen(int x, int y, int w, int h);
|
||||||
|
|
||||||
extern Battle battle;
|
extern Battle battle;
|
||||||
extern Colors colors;
|
extern Colors colors;
|
||||||
|
|
|
@ -104,7 +104,7 @@ void doDebris(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (collision(d->x - 16 - battle.camera.x, d->y - 16 - battle.camera.y, 32, 32, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT))
|
if (isOnBattleScreen(d->x, d->y, 32, 32))
|
||||||
{
|
{
|
||||||
debrisToDraw[i++] = d;
|
debrisToDraw[i++] = d;
|
||||||
|
|
||||||
|
|
|
@ -31,5 +31,6 @@ extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int
|
||||||
extern SDL_Texture *getTexture(char *filename);
|
extern SDL_Texture *getTexture(char *filename);
|
||||||
extern void addDebrisFire(int x, int y);
|
extern void addDebrisFire(int x, int y);
|
||||||
extern void *resize(void *array, int oldSize, int newSize);
|
extern void *resize(void *array, int oldSize, int newSize);
|
||||||
|
extern int isOnBattleScreen(int x, int y, int w, int h);
|
||||||
|
|
||||||
extern Battle battle;
|
extern Battle battle;
|
||||||
|
|
|
@ -91,7 +91,7 @@ void doEffects(void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
onScreen = collision(e->x - (e->size / 2) - battle.camera.x, e->y - (e->size / 2) - battle.camera.y, e->size * 2, e->size * 2, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
|
onScreen = isOnBattleScreen(e->x, e->y, e->size, e->size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ extern SDL_Texture *getTexture(char *name);
|
||||||
extern void blit(SDL_Texture *t, int x, int y, int center);
|
extern void blit(SDL_Texture *t, int x, int y, int center);
|
||||||
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
|
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
|
||||||
extern void *resize(void *array, int oldSize, int newSize);
|
extern void *resize(void *array, int oldSize, int newSize);
|
||||||
|
extern int isOnBattleScreen(int x, int y, int w, int h);
|
||||||
|
|
||||||
extern App app;
|
extern App app;
|
||||||
extern Battle battle;
|
extern Battle battle;
|
||||||
|
|
|
@ -30,11 +30,15 @@ static void drawTargetRects(Entity *e);
|
||||||
static int drawComparator(const void *a, const void *b);
|
static int drawComparator(const void *a, const void *b);
|
||||||
static void notifyNewArrivals(void);
|
static void notifyNewArrivals(void);
|
||||||
static int isCapitalShipComponent(Entity *e);
|
static int isCapitalShipComponent(Entity *e);
|
||||||
|
static void resizeDrawList(void);
|
||||||
|
|
||||||
static Entity deadHead;
|
static Entity deadHead;
|
||||||
static Entity *deadTail;
|
static Entity *deadTail;
|
||||||
static int disabledGlow;
|
static int disabledGlow;
|
||||||
static int disabledGlowDir;
|
static int disabledGlowDir;
|
||||||
|
static Entity **entsToDraw;
|
||||||
|
static int drawCapacity;
|
||||||
|
static int numEntsToDraw;
|
||||||
|
|
||||||
void initEntities(void)
|
void initEntities(void)
|
||||||
{
|
{
|
||||||
|
@ -44,6 +48,11 @@ void initEntities(void)
|
||||||
|
|
||||||
disabledGlow = DISABLED_GLOW_MAX;
|
disabledGlow = DISABLED_GLOW_MAX;
|
||||||
disabledGlowDir = -DISABLED_GLOW_SPEED;
|
disabledGlowDir = -DISABLED_GLOW_SPEED;
|
||||||
|
|
||||||
|
drawCapacity = INITIAL_ENTITY_DRAW_CAPACITY;
|
||||||
|
|
||||||
|
entsToDraw = malloc(sizeof(Entity*) * drawCapacity);
|
||||||
|
memset(entsToDraw, 0, sizeof(Entity*) * drawCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity *spawnEntity(void)
|
Entity *spawnEntity(void)
|
||||||
|
@ -75,6 +84,10 @@ void doEntities(void)
|
||||||
player->health = player->maxHealth;
|
player->health = player->maxHealth;
|
||||||
player->shield = player->maxShield;
|
player->shield = player->maxShield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
numEntsToDraw = 0;
|
||||||
|
|
||||||
|
memset(entsToDraw, 0, sizeof(Entity*) * drawCapacity);
|
||||||
|
|
||||||
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
|
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
|
||||||
{
|
{
|
||||||
|
@ -167,6 +180,16 @@ void doEntities(void)
|
||||||
{
|
{
|
||||||
addToQuadtree(e, &battle.quadtree);
|
addToQuadtree(e, &battle.quadtree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isOnBattleScreen(e->x, e->y, e->w, e->h))
|
||||||
|
{
|
||||||
|
entsToDraw[numEntsToDraw++] = e;
|
||||||
|
|
||||||
|
if (numEntsToDraw == drawCapacity)
|
||||||
|
{
|
||||||
|
resizeDrawList();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -262,6 +285,19 @@ void doEntities(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void resizeDrawList(void)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = drawCapacity + INITIAL_ENTITY_DRAW_CAPACITY;
|
||||||
|
|
||||||
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing entity draw capacity: %d -> %d\n", drawCapacity, n);
|
||||||
|
|
||||||
|
entsToDraw = resize(entsToDraw, sizeof(Entity*) * drawCapacity, sizeof(Entity*) * n);
|
||||||
|
|
||||||
|
drawCapacity = n;
|
||||||
|
}
|
||||||
|
|
||||||
static void restrictToBattleArea(Entity *e)
|
static void restrictToBattleArea(Entity *e)
|
||||||
{
|
{
|
||||||
float force;
|
float force;
|
||||||
|
@ -363,17 +399,12 @@ static int isCapitalShipComponent(Entity *e)
|
||||||
|
|
||||||
void drawEntities(void)
|
void drawEntities(void)
|
||||||
{
|
{
|
||||||
Entity *e, **candidates;
|
Entity *e;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
qsort(entsToDraw, numEntsToDraw, sizeof(Entity*), drawComparator);
|
||||||
|
|
||||||
candidates = getAllEntsWithin(battle.camera.x, battle.camera.y, SCREEN_WIDTH, SCREEN_HEIGHT, NULL);
|
for (i = 0, e = entsToDraw[i] ; e != NULL ; e = entsToDraw[++i])
|
||||||
|
|
||||||
/* count number of candidates for use with qsort */
|
|
||||||
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i]) {}
|
|
||||||
|
|
||||||
qsort(candidates, i, sizeof(Entity*), drawComparator);
|
|
||||||
|
|
||||||
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
|
|
||||||
{
|
{
|
||||||
self = e;
|
self = e;
|
||||||
|
|
||||||
|
@ -559,15 +590,27 @@ void countNumEnemies(void)
|
||||||
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "battle.numInitialEnemies=%d", battle.numInitialEnemies);
|
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "battle.numInitialEnemies=%d", battle.numInitialEnemies);
|
||||||
}
|
}
|
||||||
|
|
||||||
void addAllEntsToQuadtree(void)
|
void addVisibleEntsToDrawList(void)
|
||||||
{
|
{
|
||||||
|
int numEntsToDraw = 0;
|
||||||
Entity *e;
|
Entity *e;
|
||||||
|
|
||||||
|
battle.camera.x = player->x - (SCREEN_WIDTH / 2);
|
||||||
|
battle.camera.y = player->y - (SCREEN_HEIGHT / 2);
|
||||||
|
|
||||||
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
|
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
|
||||||
{
|
{
|
||||||
if (e->active)
|
if (e->active)
|
||||||
{
|
{
|
||||||
addToQuadtree(e, &battle.quadtree);
|
if (isOnBattleScreen(e->x, e->y, e->w, e->h))
|
||||||
|
{
|
||||||
|
entsToDraw[numEntsToDraw++] = e;
|
||||||
|
|
||||||
|
if (numEntsToDraw == drawCapacity)
|
||||||
|
{
|
||||||
|
resizeDrawList();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
|
|
||||||
#define DISABLED_GLOW_SPEED 3
|
#define INITIAL_ENTITY_DRAW_CAPACITY 8
|
||||||
#define DISABLED_GLOW_MIN 128
|
#define DISABLED_GLOW_SPEED 3
|
||||||
#define DISABLED_GLOW_MAX 255
|
#define DISABLED_GLOW_MIN 128
|
||||||
|
#define DISABLED_GLOW_MAX 255
|
||||||
|
|
||||||
extern void blitRotated(SDL_Texture *texture, int x, int y, float angle);
|
extern void blitRotated(SDL_Texture *texture, int x, int y, float angle);
|
||||||
extern void doFighter(void);
|
extern void doFighter(void);
|
||||||
|
@ -35,6 +36,9 @@ extern void drawShieldHitEffect(Entity *e);
|
||||||
extern void removeFromQuadtree(Entity *e, Quadtree *root);
|
extern void removeFromQuadtree(Entity *e, Quadtree *root);
|
||||||
extern void addToQuadtree(Entity *e, Quadtree *root);
|
extern void addToQuadtree(Entity *e, Quadtree *root);
|
||||||
extern void updateCapitalShipComponentProperties(Entity *parent, long flags);
|
extern void updateCapitalShipComponentProperties(Entity *parent, long flags);
|
||||||
|
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
|
||||||
|
extern void *resize(void *array, int oldSize, int newSize);
|
||||||
|
extern int isOnBattleScreen(int x, int y, int w, int h);
|
||||||
|
|
||||||
extern App app;
|
extern App app;
|
||||||
extern Battle battle;
|
extern Battle battle;
|
||||||
|
|
|
@ -183,6 +183,25 @@ void drawBackground(SDL_Texture *texture)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int isOnBattleScreen(int x, int y, int w, int h)
|
||||||
|
{
|
||||||
|
x -= (w / 2);
|
||||||
|
x -= (SCREEN_WIDTH / 2);
|
||||||
|
x -= battle.camera.x;
|
||||||
|
|
||||||
|
y -= (h / 2);
|
||||||
|
y -= (SCREEN_HEIGHT / 2);
|
||||||
|
y -= battle.camera.y;
|
||||||
|
|
||||||
|
w *= 2;
|
||||||
|
w += SCREEN_WIDTH;
|
||||||
|
|
||||||
|
h *= 2;
|
||||||
|
h += SCREEN_HEIGHT;
|
||||||
|
|
||||||
|
return collision(x, y, w, h, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
void saveScreenshot(void)
|
void saveScreenshot(void)
|
||||||
{
|
{
|
||||||
static int i = 0;
|
static int i = 0;
|
||||||
|
|
|
@ -22,7 +22,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
|
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
|
||||||
extern void drawMouse(void);
|
extern void drawMouse(void);
|
||||||
|
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
|
||||||
|
|
||||||
extern App app;
|
extern App app;
|
||||||
|
extern Battle battle;
|
||||||
extern Colors colors;
|
extern Colors colors;
|
||||||
extern Dev dev;
|
extern Dev dev;
|
||||||
|
|
|
@ -225,7 +225,7 @@ void loadMission(char *filename)
|
||||||
|
|
||||||
initMissionInfo();
|
initMissionInfo();
|
||||||
|
|
||||||
addAllEntsToQuadtree();
|
addVisibleEntsToDrawList();
|
||||||
|
|
||||||
playMusic(music);
|
playMusic(music);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ extern char *getPlanetTextureName(int n);
|
||||||
extern char *getMusicFilename(int n);
|
extern char *getMusicFilename(int n);
|
||||||
extern int getJSONValue(cJSON *node, char *name, int defValue);
|
extern int getJSONValue(cJSON *node, char *name, int defValue);
|
||||||
extern char *getJSONValueStr(cJSON *node, char *name, char *defValue);
|
extern char *getJSONValueStr(cJSON *node, char *name, char *defValue);
|
||||||
extern void addAllEntsToQuadtree(void);
|
extern void addVisibleEntsToDrawList(void);
|
||||||
extern void loadObjectives(cJSON *node);
|
extern void loadObjectives(cJSON *node);
|
||||||
extern void loadPlayer(cJSON *node);
|
extern void loadPlayer(cJSON *node);
|
||||||
extern void loadCapitalShips(cJSON *node);
|
extern void loadCapitalShips(cJSON *node);
|
||||||
|
|
Loading…
Reference in New Issue