autoreleasepool, renderer
parent
f32b5e76ae
commit
2fb02ae7a7
@ -0,0 +1,9 @@
|
||||
#ifndef ERROR_H
|
||||
#define ERROR_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define error(x) fprintf(stderr, "ERROR: (%s:%d): %s\n", __FILE__, __LINE__, (x))
|
||||
#define debug(x) fprintf(stdout, "DEBUG: (%s:%d): %s\n", __FILE__, __LINE__, (x))
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,71 @@
|
||||
#include "gc.h"
|
||||
#include "error.h"
|
||||
|
||||
#define MAX_OBJECTS 64
|
||||
|
||||
//private
|
||||
static int idx = 0; //INDEX
|
||||
static freeable rp[MAX_OBJECTS]; //release pool
|
||||
|
||||
//public
|
||||
|
||||
//allocate new pool
|
||||
arp *arp_new(size_t cap) {
|
||||
arp *arp = calloc(1, sizeof(arp));
|
||||
arp->objects = calloc(cap, sizeof(freeable));
|
||||
arp->idx = 0;
|
||||
arp->cap = cap;
|
||||
//arp_add(arp, arp, arp_release); //free self upon draining
|
||||
return arp;
|
||||
}
|
||||
|
||||
//add object to pool
|
||||
void arp_add(arp *arp, void *obj, void *des) {
|
||||
if (arp->idx >= arp->cap) {
|
||||
error("autoreleasepool at max capacity");
|
||||
return; //max capacity
|
||||
}
|
||||
|
||||
arp->objects[arp->idx++] = (freeable) {
|
||||
.self = obj,
|
||||
.free = des,
|
||||
};
|
||||
}
|
||||
|
||||
//release all objects in pool
|
||||
void arp_drain(arp *arp) {
|
||||
for (int i = 0; i < arp->idx; i++) {
|
||||
freeable obj = arp->objects[i];
|
||||
obj.free(obj.self);
|
||||
}
|
||||
|
||||
arp->idx = 0;
|
||||
}
|
||||
|
||||
//release pool
|
||||
void arp_release(arp *arp) {
|
||||
for (int i = 0; i < arp->idx; i++) {
|
||||
debug("freed object");
|
||||
freeable obj = arp->objects[i];
|
||||
obj.free(obj.self);
|
||||
}
|
||||
free(arp->objects);
|
||||
free(arp);
|
||||
}
|
||||
|
||||
//add object to pool
|
||||
void autorelease(void *obj, void *des) {
|
||||
rp[idx++] = (freeable) {
|
||||
.self = obj,
|
||||
.free = des,
|
||||
};
|
||||
}
|
||||
|
||||
//release all objects
|
||||
void release(void) {
|
||||
for (int i = 0; i < idx; i++) {
|
||||
rp[i].free(rp[i].self);
|
||||
}
|
||||
|
||||
idx = 0;
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
#ifndef GC_H
|
||||
#define GC_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef void (*destructor)(void *);
|
||||
typedef struct freeable {
|
||||
void *self;
|
||||
destructor free;
|
||||
} freeable;
|
||||
|
||||
typedef struct arp {
|
||||
freeable *objects;
|
||||
int idx;
|
||||
int cap;
|
||||
} arp;
|
||||
|
||||
arp *arp_new(size_t cap); //allocate new pool
|
||||
void arp_add(arp *arp, void *obj, void *des); //add object to pool
|
||||
void arp_drain(arp *arp); //release all objects in pool
|
||||
void arp_release(arp *arp); //release pool
|
||||
|
||||
//add an already allocated object to the gc
|
||||
void autorelease(void *obj, void *des);
|
||||
void release(void);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,42 @@
|
||||
#include <stdlib.h>
|
||||
#include "layout.h"
|
||||
#include "error.h"
|
||||
|
||||
renderable rable_new(void *obj, void (*func)(void *, float, float)) {
|
||||
return (renderable) {
|
||||
.object = obj,
|
||||
.render = func,
|
||||
.pos = (Vector2){0,0}
|
||||
};
|
||||
}
|
||||
|
||||
void rable_render(renderable rable) {
|
||||
rable.render(rable.object, rable.pos.x, rable.pos.y);
|
||||
}
|
||||
|
||||
renderer *rdr_new(int cap) {
|
||||
renderer *rdr = calloc(1, sizeof(renderer));
|
||||
rdr->objects = calloc(cap, sizeof(renderable));
|
||||
rdr->cap = cap;
|
||||
rdr->idx = 0;
|
||||
return rdr;
|
||||
}
|
||||
|
||||
void rdr_add(renderer *rdr, void *obj, renderfunc func) {
|
||||
if (rdr->idx >= rdr->cap) {
|
||||
error("renderer at max capacity");
|
||||
return;
|
||||
}
|
||||
|
||||
rdr->objects[rdr->idx++] = rable_new(obj, func);
|
||||
}
|
||||
void rdr_render(renderer *rdr) {
|
||||
for (int i = 0; i < rdr->idx; i++) {
|
||||
rdr->objects[i].render(rdr->objects[i].object, rdr->objects[i].pos.x, rdr->objects[i].pos.y);
|
||||
}
|
||||
}
|
||||
|
||||
void rdr_free(renderer *rdr) {
|
||||
free(rdr->objects);
|
||||
free(rdr);
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
#ifndef LM_H //layout manager
|
||||
#define LM_H
|
||||
|
||||
#include <raylib.h>
|
||||
|
||||
/*
|
||||
need to make a get_size function for objects
|
||||
so the layout manager can place them correctly
|
||||
*/
|
||||
|
||||
typedef void (*renderfunc)(void *, float, float);
|
||||
|
||||
typedef struct renderable {
|
||||
void *object;
|
||||
void (*render)(void *object, float x, float y);
|
||||
Vector2 pos;
|
||||
} renderable;
|
||||
|
||||
renderable rable_new(void *obj, void (*func)(void *, float, float));
|
||||
void rable_render(renderable rable);
|
||||
|
||||
typedef struct renderer {
|
||||
renderable *objects;
|
||||
int idx;
|
||||
int cap;
|
||||
} renderer;
|
||||
|
||||
renderer *rdr_new(int cap);
|
||||
void rdr_add(renderer *rdr, void *obj, renderfunc func);
|
||||
void rdr_render(renderer *rdr);
|
||||
void rdr_free(renderer *rdr);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,22 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <raylib.h>
|
||||
#include "title.h"
|
||||
//^ includes "text.h"
|
||||
|
||||
title title_new(char *name, char *cat, int a, int c) {
|
||||
char *at = calloc(32, sizeof(char));
|
||||
sprintf(at, "%d/%d", a, c);
|
||||
text *at_text = txt_new(at, strlen(at)); //does a memcpy
|
||||
free(at);
|
||||
|
||||
return (title) {
|
||||
.game_name = txt_new(name, strlen(name)),
|
||||
.category = txt_new(cat, strlen(cat)),
|
||||
.attempts = at_text
|
||||
};
|
||||
}
|
||||
|
||||
void title_render(title *t, float x, float y) {
|
||||
//draw the stuff
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
#ifndef TITLE_H
|
||||
#define TITLE_H
|
||||
#include "text.h"
|
||||
|
||||
typedef struct title {
|
||||
text *game_name;
|
||||
text *category;
|
||||
text *attempts;
|
||||
} title;
|
||||
|
||||
title title_new(char *name, char *cat, int a, int c);
|
||||
void title_render(title *t, float x, float y);
|
||||
void title_free(title *t);
|
||||
|
||||
#endif
|
||||
Loading…
Reference in New Issue