diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/error.c | 116 | ||||
| -rw-r--r-- | src/shader.c | 82 | 
2 files changed, 164 insertions, 34 deletions
diff --git a/src/error.c b/src/error.c new file mode 100644 index 0000000..6fc45ad --- /dev/null +++ b/src/error.c @@ -0,0 +1,116 @@ +#include "../include/common.h" + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +void honey_error_clear_strings() { +  memset(honey_error_data.string1, 0, HONEY_ERROR_DATA_STRING_LENGTH); +  memset(honey_error_data.string2, 0, HONEY_ERROR_DATA_STRING_LENGTH); +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +void honey_error_set_string1(char* string) { +  size_t n_bytes = strlen(string) + 1; +  if (n_bytes > HONEY_ERROR_DATA_STRING_LENGTH) +    n_bytes = HONEY_ERROR_DATA_STRING_LENGTH; +  memcpy(honey_error_data.string1, string, n_bytes); +  honey_error_data.string1[HONEY_ERROR_DATA_STRING_LENGTH-1] = 0; +} + +void honey_error_set_string2(char* string) { +  size_t n_bytes = strlen(string) + 1; +  if (n_bytes > HONEY_ERROR_DATA_STRING_LENGTH) +    n_bytes = HONEY_ERROR_DATA_STRING_LENGTH; +  memcpy(honey_error_data.string2, string, n_bytes); +  honey_error_data.string2[HONEY_ERROR_DATA_STRING_LENGTH-1] = 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +void honey_human_readable_error(char* error_string, honey_error error) { +  size_t string_size = sizeof(char)*3*HONEY_ERROR_DATA_STRING_LENGTH; +     +  switch(error) { +  case HONEY_OK: +    snprintf(error_string, string_size, "[honey] OK"); +    break; + +  case HONEY_MEMORY_ALLOCATION_ERROR: +    snprintf(error_string, string_size, "[honey] ERROR: failed to allocate memory"); +    break; + +  case HONEY_FILE_READ_ERROR: +    if (honey_error_data.string1 != NULL) { +      snprintf(error_string, +               string_size, +               "[honey] ERROR: failed to read file '%s'", +               honey_error_data.string1); +    } else { +      snprintf(error_string, string_size, "[honey] ERROR: failed to read file"); +    } +    break; + +  case HONEY_VERTEX_SHADER_COMPILATION_ERROR: +    if (honey_error_data.string1 != NULL) { +      if (honey_error_data.string2 != NULL) { +        snprintf(error_string, +                 string_size, +                 "[honey] ERROR: failed to compile vertex shader '%s'\n" +                 "[honey] GLSL compiler output:\n%s\n", +                 honey_error_data.string2, +                 honey_error_data.string1); +      } else { +        snprintf(error_string, +                 string_size, +                 "[honey] ERROR: failed to compile vertex shader\n" +                 "[honey] GLSL compiler output:\n%s\n", +                 honey_error_data.string1); +      } +    } else { +      snprintf(error_string, +               string_size, +               "[honey] ERROR: failed to compile vertex shader."); +    } +    break; + + +  case HONEY_FRAGMENT_SHADER_COMPILATION_ERROR: +    if (honey_error_data.string1 != NULL) { +      if (honey_error_data.string2 != NULL) { +        snprintf(error_string, +                 string_size, +                 "[honey] ERROR: failed to compile fragment shader '%s'\n" +                 "[honey] GLSL compiler output:\n%s\n", +                 honey_error_data.string2, +                 honey_error_data.string1); +      } else { +        snprintf(error_string, +                 string_size, +                 "[honey] ERROR: failed to compile fragment shader\n" +                 "[honey] GLSL compiler output:\n%s\n", +                 honey_error_data.string1); +      } +    } else { +      snprintf(error_string, +               string_size, +               "[honey] ERROR: failed to compile fragment shader."); +    } +    break; +         +  case HONEY_SHADER_LINK_ERROR: + +  case HONEY_MESH_BAD_VERTEX_DATA: + +  case HONEY_MESH_BAD_INDEX_DATA: + +  default: +    break; +  } +} +     + +     +     +     +     +     diff --git a/src/shader.c b/src/shader.c index b7f2916..d250629 100644 --- a/src/shader.c +++ b/src/shader.c @@ -1,46 +1,59 @@ -#include "include/shader.h" +#include "../include/shader.h"  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -static char* read_file(char* file_path) { +static honey_error read_file(char** destination, char* file_path) {    FILE* f = fopen(file_path, "r");    if (f == NULL) { -    return NULL; +    honey_error_set_string1(file_path); +    return HONEY_FILE_READ_ERROR;    }    fseek(f, 0, SEEK_END);    long fsize = ftell(f);    fseek(f, 0, SEEK_SET); -  char* file_string = malloc(fsize + 1); -  if (file_string == NULL) { -    return NULL; +  *destination = malloc(fsize + 1); +  if (*destination == NULL) { +    return HONEY_MEMORY_ALLOCATION_ERROR;    } -  fread(file_string, 1, fsize, f); +  fread(*destination, 1, fsize, f);    fclose(f); -  file_string[fsize] = 0; +  (*destination)[fsize] = 0; -  return file_string; +  return HONEY_OK;  }  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -enum honey_shader_result honey_shader_load(honey_shader* shader, -                                           char* vertex_shader_path, -                                           char* fragment_shader_path) { -  enum honey_shader_result result; - +honey_error honey_shader_load(honey_shader* shader, +                              char* vertex_shader_path, +                              char* fragment_shader_path) {    /* load vertex shader code */ -  char* vertex_shader_code = read_file(vertex_shader_path); +  char* vertex_shader_code; +  honey_error result = read_file(&vertex_shader_code, +                                 vertex_shader_path); +  if (result != HONEY_OK) +    return result;    /* load fragment shader code */ -  char* fragment_shader_code = read_file(fragment_shader_path); +  char* fragment_shader_code; +  result = read_file(&fragment_shader_code, +                     fragment_shader_path); +  if (result != HONEY_OK) +    return result;    result = honey_shader_new(shader,                              vertex_shader_code,                              fragment_shader_code); +  if (result == HONEY_VERTEX_SHADER_COMPILATION_ERROR) +    honey_error_set_string2(vertex_shader_path); + +  if (result == HONEY_FRAGMENT_SHADER_COMPILATION_ERROR) +    honey_error_set_string2(fragment_shader_path); +    free(vertex_shader_code);    free(fragment_shader_code); @@ -49,11 +62,9 @@ enum honey_shader_result honey_shader_load(honey_shader* shader,  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -enum honey_shader_result honey_shader_new(honey_shader* shader, -                                          char* vertex_shader_code, -                                          char* fragment_shader_code) { -  enum honey_shader_result result; -   +honey_error honey_shader_new(honey_shader* shader, +                             char* vertex_shader_code, +                             char* fragment_shader_code) {      /* compile shaders */    int success;    char error[512]; @@ -63,10 +74,11 @@ enum honey_shader_result honey_shader_new(honey_shader* shader,    glCompileShader(vertex_shader);    glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);    if (!success) { -    glGetShaderInfoLog(vertex_shader, 512, NULL, error); -    printf("Failed to compile vertex shader: %s\n", error); -    result = VERTEX_SHADER_FAILED; -    return result; +    honey_error_clear_strings(); +    char compiler_error[HONEY_ERROR_DATA_STRING_LENGTH]; +    glGetShaderInfoLog(vertex_shader, HONEY_ERROR_DATA_STRING_LENGTH, NULL, compiler_error); +    honey_error_set_string1(compiler_error); +    return HONEY_VERTEX_SHADER_COMPILATION_ERROR;    }    int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); @@ -74,10 +86,11 @@ enum honey_shader_result honey_shader_new(honey_shader* shader,    glCompileShader(fragment_shader);    glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);    if (!success) { -    glGetShaderInfoLog(fragment_shader, 512, NULL, error); -    printf("Failed to compile fragment shader: %s\n", error); -    result = FRAGMENT_SHADER_FAILED; -    return result; +    honey_error_clear_strings(); +    char compiler_error[HONEY_ERROR_DATA_STRING_LENGTH]; +    glGetShaderInfoLog(fragment_shader, HONEY_ERROR_DATA_STRING_LENGTH, NULL, compiler_error); +    honey_error_set_string1(compiler_error); +    return HONEY_FRAGMENT_SHADER_COMPILATION_ERROR;    }    /* link shaders */ @@ -87,16 +100,17 @@ enum honey_shader_result honey_shader_new(honey_shader* shader,    glLinkProgram(*shader);    glGetShaderiv(*shader, GL_LINK_STATUS, &success);    if (!success) { -    glGetProgramInfoLog(*shader, 512, NULL, error); -    printf("Failed to link shaders: %s\n", error); -    result = SHADER_LINK_FAILED; -    return result; +    honey_error_clear_strings(); +    char compiler_error[HONEY_ERROR_DATA_STRING_LENGTH]; +    glGetShaderInfoLog(vertex_shader, HONEY_ERROR_DATA_STRING_LENGTH, NULL, compiler_error); +    honey_error_set_string1(compiler_error); +    return HONEY_SHADER_LINK_ERROR;    }    glDeleteShader(vertex_shader);    glDeleteShader(fragment_shader); -  result = SHADER_OK; +  return HONEY_OK;  }  /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */  | 
