first render
[nexus3d] / src / gl / gfx_gl.c
index c0a830d..a735f28 100644 (file)
@@ -7,6 +7,8 @@
 #include "nexus3d_impl.h"
 #include "gfx_gl.h"
 
+static unsigned int cur_state;
+
 void nex_clear(void)
 {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
@@ -32,6 +34,46 @@ void nex_viewport(int x, int y, int w, int h)
        glViewport(x, y, w, h);
 }
 
+static unsigned int glstateopt(enum nex_state_opt opt)
+{
+       switch(opt) {
+       case NEX_DEPTH_TEST:
+               return GL_DEPTH_TEST;
+       case NEX_STENCIL_TEST:
+               return GL_STENCIL_TEST;
+       case NEX_BLEND:
+               return GL_BLEND;
+       case NEX_CULL_FACE:
+               return GL_CULL_FACE;
+       default:
+               break;
+       }
+       return 0;
+}
+
+void nex_enable(enum nex_state_opt opt)
+{
+       unsigned int glst = glstateopt(opt);
+       if(glst > 0) {
+               glEnable(glst);
+               cur_state |= (1 << opt);
+       }
+}
+
+void nex_disable(enum nex_state_opt opt)
+{
+       unsigned int glst = glstateopt(opt);
+       if(glst > 0) {
+               glDisable(glst);
+               cur_state &= ~(1 << opt);
+       }
+}
+
+int nex_is_enabled(enum nex_state_opt opt)
+{
+       return cur_state & (1 << opt) ? 1 : 0;
+}
+
 nex_buffer *nex_alloc_buffer(size_t sz, const void *data)
 {
        nex_buffer *buf;
@@ -351,6 +393,30 @@ int nex_build_sdrprog(nex_sdrprog *prog)
        return status ? 0 : -1;
 }
 
+void nex_bind_sdrprog(nex_sdrprog *prog)
+{
+       glUseProgram(prog->prog);
+}
+
+int nex_find_uniform(nex_sdrprog *prog, const char *name)
+{
+       return glGetUniformLocation(prog->prog, name);
+}
+
+void nex_uniform_mat4(nex_sdrprog *prog, int loc, const float *mat)
+{
+       if(loc < 0) return;
+       glProgramUniformMatrix4fv(prog->prog, loc, 1, 0, mat);
+}
+
+void nex_uniform_mat4_name(nex_sdrprog *prog, const char *name, const float *mat)
+{
+       int loc = glGetUniformLocation(prog->prog, name);
+       if(loc >= 0) {
+               glProgramUniformMatrix4fv(prog->prog, loc, 1, 0, mat);
+       }
+}
+
 #define SPIRV_MAGIC            0x07230203
 #define SPIRV_CIGAM            0x03022307
 struct spirv_header {
@@ -440,8 +506,3 @@ err:
        }
        return 0;
 }
-
-void nex_bind_sdrprog(nex_sdrprog *prog)
-{
-       glUseProgram(prog->prog);
-}