summaryrefslogtreecommitdiff
path: root/src/texture/texture.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/texture/texture.c')
-rw-r--r--src/texture/texture.c171
1 files changed, 132 insertions, 39 deletions
diff --git a/src/texture/texture.c b/src/texture/texture.c
index 1bb798a..6df19a7 100644
--- a/src/texture/texture.c
+++ b/src/texture/texture.c
@@ -10,12 +10,10 @@ static int honey_lua_texture_load(lua_State* L)
{
honey_texture* texture;
char* texture_path;
- bool use_alpha;
honey_lua_parse_arguments(L, 3,
HONEY_USERDATA, &texture,
- HONEY_STRING, &texture_path,
- HONEY_BOOLEAN, &use_alpha);
- enum honey_texture_result result = honey_texture_load(texture, texture_path, use_alpha);
+ HONEY_STRING, &texture_path);
+ enum honey_texture_result result = honey_texture_load(texture, texture_path);
if (result != TEXTURE_OK) {
char* error;
honey_format_string(&error,
@@ -53,46 +51,141 @@ void honey_setup_texture(lua_State* L)
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+static void generate_texture(honey_texture* texture,
+ int width, int height,
+ int format, int type,
+ void* data)
+{
+ unsigned int texture_id;
+ glGenTextures(1, &texture_id);
+ glBindTexture(GL_TEXTURE_2D, texture_id);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexImage2D(GL_TEXTURE_2D, 0,
+ format,
+ width, height, 0,
+ format,
+ type, data);
+
+ texture->id = texture_id;
+ texture->width = width;
+ texture->height = height;
+
+ switch(format) {
+ case GL_RED:
+ texture->type = GREY;
+ texture->channels = 1;
+ break;
+
+ case GL_RGB:
+ texture->type = RGB;
+ texture->channels = 3;
+ break;
+
+ case GL_RGBA:
+ texture->type = RGBA;
+ texture->channels = 4;
+ break;
+
+ case GL_DEPTH_COMPONENT:
+ texture->type = DEPTH;
+ texture->channels = 1;
+ break;
+
+ default:
+ break;
+ }
+
+ return HONEY_OK;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_texture_new_greyscale(honey_texture* texture,
+ int height, int width,
+ unsigned char* data)
+{
+ generate_texture(texture, width, height, GL_RED, GL_UNSIGNED_BYTE, data);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_texture_new_rgb(honey_texture* texture,
+ int height, int width,
+ unsigned char* data)
+{
+ generate_texture(texture, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_texture_new_rgba(honey_texture* texture,
+ int height, int width,
+ unsigned char* data)
+{
+ generate_texture(texture, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+void honey_texture_new_depth(honey_texture* texture,
+ int height, int width,
+ float* data)
+{
+ generate_texture(texture, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, data);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
enum honey_texture_result honey_texture_load(honey_texture* texture,
- char* texture_path,
- bool alpha_channel) {
- unsigned int texture_id;
- glGenTextures(1, &texture_id);
- glBindTexture(GL_TEXTURE_2D, texture_id);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- int width, height, channels;
- unsigned char* image_data = stbi_load(texture_path, &width, &height, &channels, 0);
- if (image_data == NULL) {
- fprintf(stderr, "ERROR: failed to load '%s'\n", texture_path);
- return TEXTURE_FAILED;
- }
-
- if (alpha_channel) {
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
- }
- else {
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_data);
- }
-
- glGenerateMipmap(GL_TEXTURE_2D);
- stbi_image_free(image_data);
-
- (*texture).texture_id = texture_id;
- (*texture).width = width;
- (*texture).height = height;
- (*texture).channels = channels;
-
- return TEXTURE_OK;
+ char* texture_path)
+{
+ int width, height, channels;
+ unsigned char* image_data = stbi_load(texture_path, &width, &height, &channels, 0);
+ if (image_data == NULL) {
+ return TEXTURE_FAILED;
+ }
+
+ switch(channels) {
+ case 1:
+ honey_texture_new_greyscale(texture, width, height, image_data);
+ break;
+
+ case 3:
+ honey_texture_new_rgb(texture, width, height, image_data);
+ break;
+
+ case 4:
+ honey_texture_new_rgba(texture, width, height, image_data);
+ break;
+
+ default:
+ return TEXTURE_CHANNEL_ERROR;
+ }
+
+ glGenerateMipmap(GL_TEXTURE_2D);
+ stbi_image_free(image_data);
+
+ return TEXTURE_OK;
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
void honey_texture_use(honey_texture texture, int texture_unit) {
glActiveTexture(GL_TEXTURE0 + texture_unit);
- glBindTexture(GL_TEXTURE_2D, texture.texture_id);
+ glBindTexture(GL_TEXTURE_2D, texture.id);
}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+//honey_result honey_texture_framebuffer_object_new(unsigned int* destination,
+// int width, int height)
+//{
+// glGenFramebuffers(1, destination);
+// glBindFramebuffer(GL_FRAMEBUFFER, *destination);
+
+