evolving the basic gfx abstractions
[nexus3d] / src / gfx.h
index beac8c1..5faf474 100644 (file)
--- a/src/gfx.h
+++ b/src/gfx.h
@@ -1,7 +1,80 @@
 #ifndef NEXUS3D_GFX_H_
 #define NEXUS3D_GFX_H_
 
+#include <stddef.h>
+
+enum nex_state_flags {
+       NEX_DEPTH_TEST          = 0x0001,
+       NEX_STENCIL_TEST        = 0x0002,
+       NEX_BLEND                       = 0x0004,
+};
+
+enum nex_vattr_type {
+       NEX_FLOAT,
+       NEX_VEC2, NEX_VEC3, NEX_VEC4,
+       NEX_COL3, NEX_COL4
+};
+
+enum nex_primitive {
+       NEX_POINTS,
+       NEX_LINES,
+       NEX_LINE_STRIP,
+       NEX_TRIANGLES,
+       NEX_TRIANGLE_STRIP,
+       NEX_TRIANGLE_FAN
+};
+
+enum nex_sdr_type {
+       NEX_SDR_VERTEX,
+       NEX_SDR_PIXEL
+};
+
+typedef struct nex_buffer nex_buffer;
+typedef struct nex_geometry nex_geometry;
+typedef struct nex_shader nex_shader;
+typedef struct nex_sdrprog nex_sdrprog;
+
 void nex_clear(void);
+void nex_clearcolor(float r, float g, float b);
+void nex_cleardepth(float z);
+void nex_clearstencil(unsigned int s);
+
 void nex_viewport(int x, int y, int w, int h);
 
+/* --- buffers and geometry --- */
+nex_buffer *nex_alloc_buffer(size_t sz, const void *data);
+void nex_free_buffer(nex_buffer *buf);
+nex_geometry *nex_alloc_geometry(void);
+void nex_free_geometry(nex_geometry *geom);
+
+void nex_geom_vbuffer(nex_geometry *geom, unsigned int bufid, const nex_buffer *buf,
+               unsigned int stride);
+void nex_geom_ibuffer(nex_geometry *geom, const nex_buffer *buf);
+void nex_geom_vattr(nex_geometry *geom, unsigned int attr,
+               enum nex_vattr_type type, int bufid, unsigned int offs);
+
+void nex_draw_geometry(const nex_geometry *geom, enum nex_primitive prim, unsigned int count);
+
+/* --- shaders --- */
+nex_shader *nex_alloc_shader(enum nex_sdr_type type);
+void nex_free_shader(nex_shader *sdr); /* refcounted */
+
+nex_sdrprog *nex_alloc_sdrprog(void);
+void nex_free_sdrprog(nex_sdrprog *prog);
+
+void nex_sdrname(nex_shader *sdr, const char *name);
+void nex_sdrsrc(nex_shader *sdr, const char *src);
+void nex_sdrbin(nex_shader *sdr, void *bin, size_t sz);
+
+void nex_sdrconst_int(nex_shader *sdr, int id, int val);
+void nex_sdrconst_float(nex_shader *sdr, int id, float val);
+int nex_build_shader(nex_shader *sdr);
+
+void nex_attach_shader(nex_sdrprog *prog, nex_shader *sdr);
+int nex_build_sdrprog(nex_sdrprog *prog);
+void nex_bind_sdrprog(nex_sdrprog *prog);
+
+nex_shader *nex_load_shader(const char *path, enum nex_sdr_type type);
+nex_sdrprog *nex_load_sdrprog(const char *vpath, const char *ppath);
+
 #endif /* NEXUS3D_GFX_H_ */