Construct drawlist at end of game_init()
This commit is contained in:
parent
8763c437b3
commit
56dbf9dbb4
77
game/main.c
77
game/main.c
@ -51,6 +51,9 @@
|
|||||||
|
|
||||||
#define MAXOBJTYPES 8
|
#define MAXOBJTYPES 8
|
||||||
#define INITOBJCOLCAP 16
|
#define INITOBJCOLCAP 16
|
||||||
|
#define MAXENTITIES 32
|
||||||
|
|
||||||
|
#define QSORT_STACKSIZE 64
|
||||||
|
|
||||||
#define NELEMS(a) (sizeof(a) / sizeof(a[0]))
|
#define NELEMS(a) (sizeof(a) / sizeof(a[0]))
|
||||||
|
|
||||||
@ -128,8 +131,14 @@ typedef struct {
|
|||||||
objtype_t objtypes[MAXOBJTYPES];
|
objtype_t objtypes[MAXOBJTYPES];
|
||||||
objcol_t objcol;
|
objcol_t objcol;
|
||||||
dynentity_t p;
|
dynentity_t p;
|
||||||
|
entity_t *drawlist;
|
||||||
} gamestate_t;
|
} gamestate_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int y;
|
||||||
|
entity_t *e;
|
||||||
|
} y_entity_ref_t;
|
||||||
|
|
||||||
const engineconf_t game_conf = {
|
const engineconf_t game_conf = {
|
||||||
.win = {
|
.win = {
|
||||||
.title = "2D Game",
|
.title = "2D Game",
|
||||||
@ -339,6 +348,72 @@ load_map(gamestate_t *state, const char *path, SDL_Renderer *renderer)
|
|||||||
xmlFreeDoc(doc);
|
xmlFreeDoc(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void y_entity_ref_swap(y_entity_ref_t *a, y_entity_ref_t *b)
|
||||||
|
{
|
||||||
|
y_entity_ref_t tmp = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_drawlist(gamestate_t *state)
|
||||||
|
{
|
||||||
|
y_entity_ref_t buf[MAXENTITIES];
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
// Populate buffer with player and objects
|
||||||
|
buf[n].y = (int)rint(state->p.pos.y) + state->p.ext.y / 2;
|
||||||
|
buf[n++].e = (entity_t *)&state->p;
|
||||||
|
for (unsigned i = 0; i < state->objcol.n; ++i) {
|
||||||
|
assert(n < MAXENTITIES);
|
||||||
|
objentity_t *obj = state->objcol.buf + i;
|
||||||
|
buf[n].y = obj->pos.y;
|
||||||
|
buf[n++].e = (entity_t *)obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quicksort on y value
|
||||||
|
int stack[QSORT_STACKSIZE], *sp = stack;
|
||||||
|
int l = 0, h = n;
|
||||||
|
assert(n != 0);
|
||||||
|
while (1) {
|
||||||
|
int pivot = buf[l].y;
|
||||||
|
int i = l, j = h;
|
||||||
|
do {
|
||||||
|
for (++i; buf[i].y <= pivot; ++i)
|
||||||
|
;
|
||||||
|
for (--j; buf[j].y > pivot; --j)
|
||||||
|
;
|
||||||
|
if (i < j)
|
||||||
|
y_entity_ref_swap(buf + i, buf + j);
|
||||||
|
} while (i < j);
|
||||||
|
y_entity_ref_swap(buf + l, buf + j);
|
||||||
|
assert(sp + 2 <= stack + QSORT_STACKSIZE);
|
||||||
|
if (j + 2 < h) {
|
||||||
|
*sp++ = j + 1;
|
||||||
|
*sp++ = h;
|
||||||
|
}
|
||||||
|
if (l + 1 < j) {
|
||||||
|
h = j;
|
||||||
|
} else if (sp != stack) {
|
||||||
|
h = *(--sp);
|
||||||
|
l = *(--sp);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up drawlist from buffer
|
||||||
|
state->drawlist = buf[0].e;
|
||||||
|
int i = 0;
|
||||||
|
buf[i].e->prev = NULL;
|
||||||
|
buf[i].e->next = buf[i + 1].e;
|
||||||
|
for (++i; i < n - 1; ++i) {
|
||||||
|
buf[i].e->prev = buf[i - 1].e;
|
||||||
|
buf[i].e->next = buf[i + 1].e;
|
||||||
|
}
|
||||||
|
buf[i].e->prev = buf[i - 1].e;
|
||||||
|
buf[i].e->next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void game_init(int argc, char *argv[], void *mem, SDL_Renderer *renderer)
|
void game_init(int argc, char *argv[], void *mem, SDL_Renderer *renderer)
|
||||||
{
|
{
|
||||||
char path[MAX_PATH_LEN];
|
char path[MAX_PATH_LEN];
|
||||||
@ -389,6 +464,8 @@ void game_init(int argc, char *argv[], void *mem, SDL_Renderer *renderer)
|
|||||||
state->p.ext.x = PWIDTH;
|
state->p.ext.x = PWIDTH;
|
||||||
state->p.ext.y = PHEIGHT;
|
state->p.ext.y = PHEIGHT;
|
||||||
state->p.tex = state->pidle;
|
state->p.tex = state->pidle;
|
||||||
|
|
||||||
|
init_drawlist(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void game_teardown(void *mem)
|
void game_teardown(void *mem)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user