Draw sprite to GUI
This commit is contained in:
parent
06b8bba27f
commit
147cf1b05d
2
Makefile
2
Makefile
|
@ -64,7 +64,7 @@ eobjects != $(call rm,$(eobjects),sqlite pl_mpeg_extract_frames pl_mpeg_player y
|
|||
|
||||
engincs != find source/engine -maxdepth 1 -type d
|
||||
includeflag != find source -type d -name include
|
||||
includeflag += engincs
|
||||
includeflag += $(engincs) source/engine/thirdparty/Nuklear
|
||||
includeflag := $(addprefix -I, $(includeflag))
|
||||
|
||||
WARNING_FLAGS = -Wall# -pedantic -Wextra -Wwrite-strings -Wno-incompatible-function-pointer-types -Wno-incompatible-pointer-types -Wno-unused-function
|
||||
|
|
|
@ -183,11 +183,9 @@ void renderText(const char *text, mfloat_t pos[2], float scale, mfloat_t color[3
|
|||
shader_use(shader);
|
||||
shader_setvec3(shader, "textColor", color);
|
||||
|
||||
cpVect campos = cam_pos();
|
||||
|
||||
mfloat_t cursor[2] = { 0.f };
|
||||
cursor[0] = pos[0] + campos.x;
|
||||
cursor[1] = pos[1] + campos.y;
|
||||
cursor[0] = pos[0];
|
||||
cursor[1] = pos[1];
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindVertexArray(VAO);
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "gameobject.h"
|
||||
#include "openglrender.h"
|
||||
#include "2dphysics.h"
|
||||
#include "sprite.h"
|
||||
|
||||
#include "yugine.h"
|
||||
|
||||
|
@ -70,6 +71,16 @@ s7_pointer s7_gui_text(s7_scheme *sc, s7_pointer args) {
|
|||
return s7_car(args);
|
||||
}
|
||||
|
||||
s7_pointer s7_gui_img(s7_scheme *sc, s7_pointer args) {
|
||||
const char *img = s7_string(s7_car(args));
|
||||
float x = s7_real(s7_cadr(args));
|
||||
float y = s7_real(s7_caddr(args));
|
||||
|
||||
gui_draw_img(img, x, y);
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
s7_pointer s7_settings_cmd(s7_scheme *sc, s7_pointer args) {
|
||||
int cmd = s7_integer(s7_car(args));
|
||||
double val = s7_real(s7_cadr(args));
|
||||
|
@ -132,18 +143,32 @@ s7_pointer s7_win_cmd(s7_scheme *sc, s7_pointer args) {
|
|||
int cmd = s7_integer(s7_cadr(args));
|
||||
struct window *w = window_i(win);
|
||||
|
||||
/*
|
||||
3: return win width
|
||||
4: return win height
|
||||
|
||||
*/
|
||||
|
||||
switch (cmd) {
|
||||
case 0: // toggle fullscreen
|
||||
case 0: /* toggle fullscreen */
|
||||
window_togglefullscreen(w);
|
||||
break;
|
||||
|
||||
case 1: // Fullscreen on
|
||||
case 1: /* Fullscreen on */
|
||||
window_makefullscreen(w);
|
||||
break;
|
||||
|
||||
case 2: // Fullscreen off
|
||||
case 2: /* Fullscreen off */
|
||||
window_unfullscreen(w);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
return s7_make_integer(sc, w->width);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
return s7_make_integer(sc, w->height);
|
||||
break;
|
||||
}
|
||||
|
||||
return args;
|
||||
|
@ -365,6 +390,7 @@ void ffi_load() {
|
|||
S7_FUNC(ui_rendertext, 3);
|
||||
|
||||
S7_FUNC(gui_text, 4);
|
||||
S7_FUNC(gui_img, 3);
|
||||
|
||||
S7_FUNC(gen_cmd, 2);
|
||||
S7_FUNC(sys_cmd, 1);
|
||||
|
|
|
@ -123,9 +123,6 @@ void add_zoom(float val) { zoom = val; }
|
|||
|
||||
void openglRender(struct window *window)
|
||||
{
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glClearColor(0.3f, 0.3f, 0.3f, 1.f);
|
||||
|
||||
|
||||
//////////// 2D projection
|
||||
mfloat_t projection[16] = { 0.f };
|
||||
|
@ -135,31 +132,36 @@ void openglRender(struct window *window)
|
|||
pos.y,
|
||||
window->height*zoom + pos.y, -1.f, 1.f);
|
||||
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, projUBO);
|
||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, 64, projection);
|
||||
|
||||
//shader_setmat4(vid_shader, "projection", projection);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
mfloat_t ui_projection[16] = { 0.f };
|
||||
mat4_ortho(ui_projection, 0,
|
||||
window->width,
|
||||
0,
|
||||
window->height, -1.f, 1.f);
|
||||
|
||||
// Clear color and depth
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
////// TEXT && GUI
|
||||
call_gui();
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, projUBO);
|
||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, 64, projection);
|
||||
|
||||
//// DEBUG
|
||||
if (debugDrawPhysics)
|
||||
gameobject_draw_debugs();
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
///// Sprites
|
||||
glDepthFunc(GL_LESS);
|
||||
shader_use(spriteShader);
|
||||
sprite_draw_all();
|
||||
|
||||
glDepthFunc(GL_ALWAYS);
|
||||
shader_use(textShader);
|
||||
shader_setmat4(textShader, "projection", projection);
|
||||
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
//// DEBUG
|
||||
if (debugDrawPhysics)
|
||||
gameobject_draw_debugs();
|
||||
|
||||
////// TEXT && GUI
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, projUBO);
|
||||
glBufferSubData(GL_UNIFORM_BUFFER, 0, 64, ui_projection);
|
||||
call_gui();
|
||||
}
|
||||
|
||||
void BindUniformBlock(GLuint shaderID, const char *bufferName, GLuint bufferBind)
|
||||
|
|
|
@ -133,13 +133,7 @@ void sprite_initialize()
|
|||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||
}
|
||||
|
||||
void sprite_draw(struct sprite *sprite)
|
||||
{
|
||||
if (sprite->tex != NULL) {
|
||||
|
||||
//shader_use(spriteShader);
|
||||
|
||||
|
||||
void tex_draw(struct Texture *tex, float pos[2], float angle, float size[2], float offset[2]) {
|
||||
mfloat_t model[16] = { 0.f };
|
||||
mfloat_t r_model[16] = { 0.f };
|
||||
mfloat_t s_model[16] = { 0.f };
|
||||
|
@ -147,41 +141,51 @@ void sprite_draw(struct sprite *sprite)
|
|||
memcpy(r_model, UNITMAT4, sizeof(UNITMAT4));
|
||||
memcpy(s_model, UNITMAT4, sizeof(UNITMAT4));
|
||||
|
||||
mfloat_t t_scale[2] = { size[0] * tex->width, size[1] * tex->height };
|
||||
mfloat_t t_offset[2] = { offset[0] * t_scale[0], offset[1] * t_scale[1] };
|
||||
|
||||
|
||||
mfloat_t t_move[2] = { 0.f };
|
||||
mfloat_t t_scale[2] = { 0.f };
|
||||
|
||||
t_scale[0] = sprite->size[0] * sprite->tex->width * sprite->go->scale;
|
||||
t_scale[1] = sprite->size[1] * sprite->tex->height * sprite->go->scale;
|
||||
|
||||
t_move[0] = sprite->pos[0] * t_scale[0];
|
||||
t_move[1] = sprite->pos[1] * t_scale[1];
|
||||
|
||||
mat4_translate_vec2(model, t_move);
|
||||
mat4_translate_vec2(model, t_offset);
|
||||
mat4_scale_vec2(model, t_scale);
|
||||
mat4_rotation_z(r_model, cpBodyGetAngle(sprite->go->body));
|
||||
|
||||
mat4_rotation_z(r_model, angle);
|
||||
|
||||
mat4_multiply(model, r_model, model);
|
||||
|
||||
cpVect pos = cpBodyGetPosition(sprite->go->body);
|
||||
t_move[0] = pos.x;
|
||||
t_move[1] = pos.y;
|
||||
mat4_translate_vec2(model, t_move);
|
||||
|
||||
mat4_translate_vec2(model, pos);
|
||||
|
||||
float white[3] = { 1.f, 1.f, 1.f };
|
||||
shader_setmat4(spriteShader, "model", model);
|
||||
shader_setvec3(spriteShader, "spriteColor", sprite->color);
|
||||
shader_setvec3(spriteShader, "spriteColor", white);
|
||||
|
||||
//tex_bind(sprite->tex);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, sprite->tex->id);
|
||||
glBindTexture(GL_TEXTURE_2D, tex->id);
|
||||
|
||||
glBindVertexArray(quadVAO);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
}
|
||||
|
||||
void sprite_draw(struct sprite *sprite)
|
||||
{
|
||||
if (sprite->tex) {
|
||||
cpVect cpos = cpBodyGetPosition(sprite->go->body);
|
||||
float pos[2] = {cpos.x, cpos.y};
|
||||
|
||||
float size[2] = { sprite->size[0] * sprite->go->scale, sprite->size[1] * sprite->go->scale };
|
||||
|
||||
tex_draw(sprite->tex, pos, cpBodyGetAngle(sprite->go->body), size, sprite->pos);
|
||||
}
|
||||
}
|
||||
|
||||
void gui_draw_img(const char *img, float x, float y) {
|
||||
shader_use(spriteShader);
|
||||
struct Texture *tex = texture_loadfromfile(img);
|
||||
float pos[2] = {x, y};
|
||||
float size[2] = {1.f, 1.f};
|
||||
float offset[2] = { 0.f, 0.f };
|
||||
tex_draw(tex, pos, 0.f, size, offset);
|
||||
}
|
||||
|
||||
void spriteanim_draw(struct sprite *sprite)
|
||||
{
|
||||
shader_use(animSpriteShader);
|
||||
|
|
|
@ -46,4 +46,7 @@ void sprite_draw_all();
|
|||
unsigned int incrementAnimFrame(unsigned int interval, struct sprite *sprite);
|
||||
|
||||
|
||||
void gui_draw_img(const char *img, float x, float y);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -29,7 +29,7 @@ struct Texture *texture_pullfromfile(const char *path)
|
|||
tex->anim.ms = 1;
|
||||
|
||||
int n;
|
||||
stbi_set_flip_vertically_on_load(0);
|
||||
stbi_set_flip_vertically_on_load(1);
|
||||
unsigned char *data = stbi_load(path, &tex->width, &tex->height, &n, 4);
|
||||
|
||||
while (data == NULL) {
|
||||
|
@ -250,3 +250,5 @@ void anim_bkwd(struct TexAnimation *anim)
|
|||
{
|
||||
anim_decr(anim);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -76,4 +76,6 @@ void tex_anim_calc_uv(struct TexAnimation *anim);
|
|||
void tex_anim_set(struct TexAnimation *anim);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -154,9 +154,6 @@ void window_handle_event(struct window *w)
|
|||
"Changed size of window %d: width %d, height %d.",
|
||||
w->id, w->width, w->height);
|
||||
window_makecurrent(w);
|
||||
w.projection =
|
||||
glm::ortho(0.f, (float) width, 0.f, (float) height, -1.f,
|
||||
1.f);
|
||||
w->render = true;
|
||||
break;
|
||||
|
||||
|
|
|
@ -18,7 +18,6 @@ struct window {
|
|||
bool minimized;
|
||||
bool iconified;
|
||||
bool shown;
|
||||
float projection[16];
|
||||
void (*nuke_gui)();
|
||||
};
|
||||
|
||||
|
|
|
@ -40,10 +40,11 @@
|
|||
(define (set_phys fps) (settings_cmd 2 (/ 1 fps)))
|
||||
(define (zoom! amt) (settings_cmd 5 amt))
|
||||
|
||||
(define (win_fulltoggle w) (win_cmd w 0))
|
||||
(define (win_fullscreen w) (win_cmd w 1))
|
||||
(define (win_unfullscreen w) (win_cmd w 2))
|
||||
(define (win_title s) (win_cmd 0 3 s))
|
||||
(define (win_fulltoggle) (win_cmd 0 0))
|
||||
(define (win_fullscreen) (win_cmd 0 1))
|
||||
(define (win_unfullscreen) (win_cmd 0 2))
|
||||
(define (win_w) (win_cmd 0 3))
|
||||
(define (win_h) (win_cmd 0 4))
|
||||
|
||||
(define (load_level s) (gen_cmd 0 s))
|
||||
(define (load_prefab s) (gen_cmd 1 s))
|
||||
|
@ -71,7 +72,8 @@
|
|||
(register 0 ,f))))
|
||||
|
||||
(define-macro (gui . expr)
|
||||
`(registertype gui ,@expr))
|
||||
`(registertype gui
|
||||
(let ((x 0) (y 0)) ,@expr)))
|
||||
|
||||
(define-macro (while condition . body)
|
||||
(let ((loop (gensym)))
|
||||
|
|
|
@ -2,7 +2,10 @@
|
|||
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
|
||||
out vec2 TexCoords;
|
||||
|
||||
uniform mat4 projection;
|
||||
layout (std140) uniform Projection
|
||||
{
|
||||
mat4 projection;
|
||||
};
|
||||
|
||||
void main()
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue