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