16 static struct rbtree *rb;
18 static size_t io_read(void *buf, size_t bytes, void *uptr);
19 static long io_seek(long offs, int whence, void *uptr);
20 static void del_rbnode(struct rbnode *rb, void *cls);
24 if(!(rb = rb_create(RB_KEY_STRING))) {
27 rb_set_delete_func(rb, del_rbnode, 0);
31 void destroy_assman(void)
37 unsigned int get_tex2d(const char *fname)
40 struct img_pixmap pixmap;
43 if((id = lookup_asset(fname))) {
47 if(!(io.uptr = ass_fopen(fname, "rb"))) {
48 fprintf(stderr, "failed to open image: %s\n", fname);
56 if(img_read(&pixmap, &io) == -1) {
57 fprintf(stderr, "failed to read image file: %s\n", fname);
63 if(!(id = img_gltexture(&pixmap))) {
64 fprintf(stderr, "failed to create OpenGL texture from: %s\n", fname);
69 printf("loaded 2D texture: %s\n", fname);
70 add_asset(fname, ASS_TEX, id);
75 unsigned int get_texcube(const char *fname)
80 static unsigned int load_sdr(const char *fname, unsigned int type)
87 if(!(fp = ass_fopen(fname, "rb"))) {
88 fprintf(stderr, "failed to load vertex shader: %s\n", fname);
91 ass_fseek(fp, 0, SEEK_END);
93 ass_fseek(fp, 0, SEEK_SET);
95 buf = malloc_nf(sz + 1);
96 if(ass_fread(buf, 1, sz, fp) < sz) {
97 fprintf(stderr, "failed to read vertex shader: %s\n", fname);
106 case GL_VERTEX_SHADER:
107 printf("vertex shader %s ", fname);
109 sdr = create_vertex_shader(buf);
112 case GL_FRAGMENT_SHADER:
113 printf("pixel shader %s ", fname);
115 sdr = create_pixel_shader(buf);
119 fprintf(stderr, "unknown shader type (%d) %s\n", type, fname);
127 unsigned int get_vsdr(const char *fname)
131 if((sdr = lookup_asset(fname))) {
135 if((sdr = load_sdr(fname, GL_VERTEX_SHADER))) {
136 add_asset(fname, ASS_SDR, sdr);
141 unsigned int get_psdr(const char *fname)
145 if((sdr = lookup_asset(fname))) {
149 if((sdr = load_sdr(fname, GL_FRAGMENT_SHADER))) {
150 add_asset(fname, ASS_SDR, sdr);
155 unsigned int get_sdrprog(const char *vfname, const char *pfname)
157 unsigned int vsdr, psdr, prog;
160 progname = alloca(strlen(vfname) + strlen(pfname) + 2);
161 sprintf(progname, "%s,%s", vfname, pfname);
163 if((prog = lookup_asset(progname))) {
167 if(!(vsdr = get_vsdr(vfname)) || !(psdr = get_psdr(pfname))) {
170 if(!(prog = create_program_link(vsdr, psdr, 0))) {
173 add_asset(progname, ASS_PROG, prog);
177 int add_asset(const char *name, int type, unsigned int id)
181 ass = malloc_nf(sizeof *ass);
183 ass->name = strdup_nf(name);
186 if(rb_insert(rb, (char*)ass->name, ass) == -1) {
192 unsigned int lookup_asset(const char *name)
196 if(!(n = rb_find(rb, (char*)name))) {
199 return ((struct asset*)n->data)->id;
202 unsigned int load_sdrprog(const char *vfname, const char *pfname)
204 unsigned int vsdr, psdr, prog;
206 if(!(vsdr = load_sdr(vfname, GL_VERTEX_SHADER)) || !(psdr = load_sdr(pfname, GL_FRAGMENT_SHADER))) {
209 if(!(prog = create_program_link(vsdr, psdr, 0))) {
215 static size_t io_read(void *buf, size_t bytes, void *uptr)
217 return ass_fread(buf, 1, bytes, uptr);
220 static long io_seek(long offs, int whence, void *uptr)
222 return ass_fseek(uptr, offs, whence);
225 static void del_rbnode(struct rbnode *rb, void *cls)
227 struct asset *ass = rb->data;
233 glDeleteTextures(1, &ass->id);
237 glDeleteShader(ass->id);
241 glDeleteProgram(ass->id);