19#include <XPLMGraphics.h>
25#include "acfutils/png.h"
26#include "acfutils/shader.h"
30#define LACF_GL_PIC_CACHE_SIZE (1 << 10)
38 glutils_cache_t *cache;
44static const char *vert_shader =
47 "attribute vec3 vtx_pos;\n"
48 "attribute vec2 vtx_tex0;\n"
49 "varying vec2 tex_coord;\n"
51 " tex_coord = vtx_tex0;\n"
52 " gl_Position = pvm * vec4(vtx_pos, 1.0);\n"
55static const char *frag_shader =
57 "uniform sampler2D tex;\n"
58 "uniform float alpha;\n"
59 "varying vec2 tex_coord;\n"
61 " gl_FragColor = texture2D(tex, tex_coord);\n"
62 " gl_FragColor.a *= alpha;\n"
66load_image(lacf_gl_pic_t *pic)
74 buf = png_load_from_file_rgba(pic->path, &pic->w, &pic->h);
78 glGenTextures(1, &pic->tex);
80 glBindTexture(GL_TEXTURE_2D, pic->tex);
81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
82 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
83 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pic->w, pic->h, 0, GL_RGBA,
84 GL_UNSIGNED_BYTE, buf);
101 lacf_gl_pic_t *pic =
safe_calloc(1,
sizeof (*pic));
105 fdr_find(&pic->proj_matrix,
"sim/graphics/view/projection_matrix");
106 fdr_find(&pic->mv_matrix,
"sim/graphics/view/modelview_matrix");
162 return (load_image(pic));
181 glDeleteTextures(1, &pic->tex);
184 if (pic->cache != NULL) {
188 if (pic->shader != 0) {
189 glDeleteProgram(pic->shader);
254 mat4 proj_matrix, mv_matrix, pvm;
262 glm_mat4_mul(proj_matrix, mv_matrix, pvm);
264 if (pic->shader == 0) {
265 pic->shader = shader_prog_from_text(
"lacf_gl_pic_shader",
266 vert_shader, frag_shader,
267 "vtx_pos", VTX_ATTRIB_POS,
268 "vtx_tex0", VTX_ATTRIB_TEX0, NULL);
271 glUseProgram(pic->shader);
272 glUniform1f(glGetUniformLocation(pic->shader,
"alpha"), alpha);
273 glUniformMatrix4fv(glGetUniformLocation(pic->shader,
"pvm"),
274 1, GL_FALSE, (
const GLfloat *)pvm);
304 if (pic->tex == 0 && !load_image(pic))
307 size =
VECT2(pic->w, pic->h);
308 if (pic->cache == NULL)
311 p[0] =
VECT2(pos.x, pos.y);
312 p[1] =
VECT2(pos.x, pos.y + size.y);
313 p[2] =
VECT2(pos.x + size.x, pos.y + size.y);
314 p[3] =
VECT2(pos.x + size.x, pos.y);
317 XPLMBindTexture2d(pic->tex, 0);
318 glUniform1i(glGetUniformLocation(prog,
"vtx_tex0"), 0);
320 XPLMBindTexture2d(0, 0);
#define VERIFY3F(x, op, y)
void lacf_free(void *buf)
#define dr_getvf32(__dr, __ff, __off, __num)
void glutils_cache_destroy(glutils_cache_t *cache)
glutils_quads_t * glutils_cache_get_2D_quads(glutils_cache_t *cache, const vect2_t *p, const vect2_t *t, size_t num_pts)
void glutils_draw_quads(glutils_quads_t *quads, GLint prog)
glutils_cache_t * glutils_cache_new(size_t cap_bytes)
char * mkpathname(const char *comp,...)
GLuint lacf_gl_pic_get_tex(lacf_gl_pic_t *pic)
void lacf_gl_pic_draw_custom(lacf_gl_pic_t *pic, vect2_t pos, vect2_t size, GLuint prog)
void lacf_gl_pic_unload(lacf_gl_pic_t *pic)
bool_t lacf_gl_pic_load(lacf_gl_pic_t *pic)
lacf_gl_pic_t * lacf_gl_pic_new_from_dir(const char *dirpath, const char *filename)
lacf_gl_pic_t * lacf_gl_pic_new(const char *path)
int lacf_gl_pic_get_width(lacf_gl_pic_t *pic)
void lacf_gl_pic_destroy(lacf_gl_pic_t *pic)
void lacf_gl_pic_draw(lacf_gl_pic_t *pic, vect2_t pos, vect2_t size, float alpha)
int lacf_gl_pic_get_height(lacf_gl_pic_t *pic)
static char * safe_strdup(const char *str2)
static void * safe_calloc(size_t nmemb, size_t size)