summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/honey.c63
-rw-r--r--src/honey.h8
-rw-r--r--src/primitives/primitives.c2
-rw-r--r--src/texture/texture.c89
-rw-r--r--src/texture/texture.h21
5 files changed, 166 insertions, 17 deletions
diff --git a/src/honey.c b/src/honey.c
index 1328a5f..ce1a38c 100644
--- a/src/honey.c
+++ b/src/honey.c
@@ -54,6 +54,48 @@ bool honey_parse_options(honey_options* options, int argc, char** argv)
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+static int honey_lua_clear_color(lua_State* L)
+{
+ float* color_array;
+ bool color, depth, stencil;
+ honey_lua_parse_arguments(L, 4,
+ HONEY_USERDATA, &color_array,
+ HONEY_BOOLEAN, &color,
+ HONEY_BOOLEAN, &depth,
+ HONEY_BOOLEAN, &stencil);
+ float r = color_array[0];
+ float g = color_array[1];
+ float b = color_array[2];
+ float a = color_array[3];
+
+ int clear_flags = 0;
+ if (color)
+ clear_flags = clear_flags | GL_COLOR_BUFFER_BIT;
+ if (depth)
+ clear_flags = clear_flags | GL_DEPTH_BUFFER_BIT;
+ if (stencil)
+ clear_flags = clear_flags | GL_STENCIL_BUFFER_BIT;
+
+ glClearColor(r, g, b, a);
+ glClear(clear_flags);
+ return 0;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+int honey_lua_enable_depth_test(lua_State* L)
+{
+ bool enable;
+ honey_lua_parse_arguments(L, 1, HONEY_BOOLEAN, &enable);
+ if (enable)
+ glEnable(GL_DEPTH_TEST);
+ else
+ glDisable(GL_DEPTH_TEST);
+ return 0;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
bool honey_setup(lua_State** L)
{
@@ -88,6 +130,15 @@ bool honey_setup(lua_State** L)
lua_pushcfunction(*L, honey_exit);
lua_setfield(*L, -2, "exit");
+ lua_pushcfunction(*L, honey_set_framebuffer);
+ lua_setfield(*L, -2, "set_framebuffer");
+
+ lua_pushcfunction(*L, honey_lua_clear_color);
+ lua_setfield(*L, -2, "clear_color");
+
+ lua_pushcfunction(*L, honey_lua_enable_depth_test);
+ lua_setfield(*L, -2, "enable_depth_test");
+
lua_setglobal(*L, "honey");
return true;
@@ -145,8 +196,6 @@ bool honey_run(lua_State* L, honey_options opts) {
if (drawTime > 0.016) {
drawTime -= 0.016;
- glClearColor(0,0,0,1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (draw_callback != LUA_NOREF) {
lua_rawgeti(L, LUA_REGISTRYINDEX, draw_callback);
@@ -185,3 +234,13 @@ int honey_get_callback(lua_State* L, char* callback)
return ref;
}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+int honey_set_framebuffer(lua_State* L)
+{
+ int framebuffer;
+ honey_lua_parse_arguments(L, 1, HONEY_INTEGER, &framebuffer);
+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+ return 0;
+}
diff --git a/src/honey.h b/src/honey.h
index 8231b70..5a2e6c2 100644
--- a/src/honey.h
+++ b/src/honey.h
@@ -68,4 +68,12 @@ bool honey_run(lua_State* L, honey_options opts);
*/
int honey_get_callback(lua_State* L, char* callback);
+/** @brief Set the current render target.
+ *
+ * @param[in] framebuffer The framebuffer to target, or 0 to target the window's framebuffer.
+ *
+ * @returns Nothing.
+ */
+int honey_set_framebuffer(lua_State* L);
+
#endif
diff --git a/src/primitives/primitives.c b/src/primitives/primitives.c
index 8293d4d..d499248 100644
--- a/src/primitives/primitives.c
+++ b/src/primitives/primitives.c
@@ -60,7 +60,7 @@ honey_result honey_mesh_new_textured_plane(honey_mesh* mesh,
unsigned int indices[] = {
0, 1, 2,
- 1, 2, 3 };
+ 3, 2, 1 };
unsigned int attrib_sizes[] = { 3, 3, 2 };
diff --git a/src/texture/texture.c b/src/texture/texture.c
index 6df19a7..9ddf441 100644
--- a/src/texture/texture.c
+++ b/src/texture/texture.c
@@ -6,6 +6,37 @@ static int honey_lua_texture_new(lua_State* L)
return 1;
}
+static int honey_lua_texture_create(lua_State* L)
+{
+ honey_texture* texture;
+ int width, height;
+ char* type;
+ honey_lua_parse_arguments(L, 4,
+ HONEY_USERDATA, &texture,
+ HONEY_STRING, &type,
+ HONEY_INTEGER, &width,
+ HONEY_INTEGER, &height);
+
+ if (strcmp(type, "greyscale") == 0)
+ honey_texture_new_greyscale(texture, width, height, NULL);
+ else if (strcmp(type, "rgb") == 0)
+ honey_texture_new_rgb(texture, width, height, NULL);
+ else if (strcmp(type, "rgba") == 0)
+ honey_texture_new_rgba(texture, width, height, NULL);
+ else if (strcmp(type, "depth") == 0)
+ honey_texture_new_depth(texture, width, height, NULL);
+ else {
+ char* error;
+ honey_format_string(&error,
+ "unknown texture type '%s'",
+ type);
+ lua_pushstring(L, error);
+ free(error);
+ lua_error(L);
+ }
+ return 0;
+}
+
static int honey_lua_texture_load(lua_State* L)
{
honey_texture* texture;
@@ -38,15 +69,43 @@ static int honey_lua_texture_use(lua_State* L)
return 0;
}
+static int honey_lua_framebuffer_new(lua_State* L)
+{
+ honey_texture* draw, *depth;
+ if (lua_isuserdata(L, 1))
+ draw = lua_touserdata(L, 1);
+ else
+ draw = NULL;
+
+ if (lua_isuserdata(L, 2))
+ depth = lua_touserdata(L, 2);
+ else
+ depth = NULL;
+
+ int width, height;
+ honey_lua_parse_arguments(L, 4, HONEY_ANY, HONEY_ANY,
+ HONEY_INTEGER, &width,
+ HONEY_INTEGER, &height);
+
+ unsigned int framebuffer;
+ honey_texture_framebuffer_object_new(&framebuffer,
+ draw, depth,
+ width, height);
+ lua_pushinteger(L, framebuffer);
+ return 1;
+}
+
void honey_setup_texture(lua_State* L)
{
honey_lua_element texture_elements[] = {
{ "new", HONEY_FUNCTION, { .function = honey_lua_texture_new } },
+ { "new_framebuffer", HONEY_FUNCTION, { .function = honey_lua_framebuffer_new } },
+ { "create", HONEY_FUNCTION, { .function = honey_lua_texture_create } },
{ "load", HONEY_FUNCTION, { .function = honey_lua_texture_load } },
{ "use", HONEY_FUNCTION, { .function = honey_lua_texture_use } },
};
- honey_lua_create_table(L, texture_elements, 3);
+ honey_lua_create_table(L, texture_elements, 5);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -182,10 +241,26 @@ void honey_texture_use(honey_texture texture, int texture_unit) {
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-//honey_result honey_texture_framebuffer_object_new(unsigned int* destination,
-// int width, int height)
-//{
-// glGenFramebuffers(1, destination);
-// glBindFramebuffer(GL_FRAMEBUFFER, *destination);
+void honey_texture_framebuffer_object_new(unsigned int* destination,
+ honey_texture* draw,
+ honey_texture* depth,
+ int width, int height)
+{
+ glGenFramebuffers(1, destination);
+ glBindFramebuffer(GL_FRAMEBUFFER, *destination);
+
+ if (draw != NULL)
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, draw->id, 0);
+ else {
+ glDrawBuffer(GL_NONE);
+ glReadBuffer(GL_NONE);
+ }
-
+ if (depth != NULL)
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth->id, 0);
+
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+ printf("framebuffer is not complete!\n");
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+}
diff --git a/src/texture/texture.h b/src/texture/texture.h
index 785fef0..9dc0308 100644
--- a/src/texture/texture.h
+++ b/src/texture/texture.h
@@ -37,7 +37,7 @@ void honey_setup_texture(lua_State* L);
* @param[in] height The height in pixels of the texture to create.
* @param[in] data The data to populate the texture with, or NULL to leave it unpopulated.
*
- * @returns HONEY_OK on success, and appropriate error on failure.
+ * @returns Nothing.
*/
void honey_texture_new_greyscale(honey_texture* texture,
int width, int height,
@@ -50,7 +50,7 @@ void honey_texture_new_greyscale(honey_texture* texture,
* @param[in] height The height in pixels of the texture to create.
* @param[in] data The data to populate the texture with, or NULL to leave it unpopulated.
*
- * @returns HONEY_OK on success, and appropriate error on failure.
+ * @returns Nothing.
*/
void honey_texture_new_rgb(honey_texture* texture,
int width, int height,
@@ -63,7 +63,7 @@ void honey_texture_new_rgb(honey_texture* texture,
* @param[in] height The height in pixels of the texture to create.
* @param[in] data The data to populate the texture with, or NULL to leave it unpopulated.
*
- * @returns HONEY_OK on success, and appropriate error on failure.
+ * @returns Nothing.
*/
void honey_texture_new_rgba(honey_texture* texture,
int width, int height,
@@ -76,7 +76,7 @@ void honey_texture_new_rgba(honey_texture* texture,
* @param[in] height The height in pixels of the texture to create.
* @param[in] data The data to populate the texture with, or NULL to leave it unpopulated.
*
- * @returns HONEY_OK on success, and appropriate error on failure.
+ * @returns Nothing.
*/
void honey_texture_new_depth(honey_texture* texture,
int width, int height,
@@ -102,13 +102,20 @@ void honey_texture_use(honey_texture texture, int texture_unit);
/** @brief Create a framebuffer object.
*
+ * You must specify at least one of draw and depth; otherwise, the framebuffer will
+ * be incomplete and fail.
+ *
* @param[out] destination Pointer to store the resulting OpenGL handle in.
+ * @param[in] draw Pointer to a texture to draw to.
+ * @param[in] depth Pointer to a depth texture.
* @param[in] width The width in pixels of the FBO.
* @param[in] height The height in pixels of the FBO.
*
- * @returns HONEY_OK on success; appropriate error otherwise.
+ * @returns Nothing.
*/
-honey_result honey_texture_framebuffer_object_new(unsigned int* destination,
- int width, int height);
+void honey_texture_framebuffer_object_new(unsigned int* destination,
+ honey_texture* draw,
+ honey_texture* depth,
+ int width, int height);
#endif