diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8ef077e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "shimatta-opengl"] + path = shimatta-opengl + url = ssh://git@git.shimatta.de/mhu/shimatta-opengl.git diff --git a/shimatta-opengl b/shimatta-opengl new file mode 160000 index 0000000..c2e8301 --- /dev/null +++ b/shimatta-opengl @@ -0,0 +1 @@ +Subproject commit c2e830124354d23618cdee614b79b7a6a975a7cc diff --git a/shimatta-opengl/CMakeLists.txt b/shimatta-opengl/CMakeLists.txt deleted file mode 100644 index 67e388a..0000000 --- a/shimatta-opengl/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(shimatta-opengl LANGUAGES C) - -find_package(PkgConfig REQUIRED) -pkg_search_module(GLIB REQUIRED glib-2.0) -pkg_check_modules(EPOXY REQUIRED epoxy) - -add_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter) -aux_source_directory("src" SRC_DIR) - -add_library(${PROJECT_NAME} SHARED ${SRC_DIR}) -target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_include_directories(${PROJECT_NAME} PRIVATE ${EPOXY_INCLUDE_DIRS}) -target_link_libraries(${PROJECT_NAME} PUBLIC ${GLIB_LDFLAGS} ${EPOXY_LDFLAGS}) -target_link_directories(${PROJECT_NAME} PUBLIC ${GLIB_LINK_DIRS} ${EPOXY_LINK_DIRS}) -target_include_directories(${PROJECT_NAME} PUBLIC ${GLIB_INCLUDE_DIRS}) - diff --git a/shimatta-opengl/include/shimatta-opengl-program.h b/shimatta-opengl/include/shimatta-opengl-program.h deleted file mode 100644 index b10e902..0000000 --- a/shimatta-opengl/include/shimatta-opengl-program.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of Shimatta OpenGL. - * -* Foobar is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -* -* Shimatta OpenGL is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with GtkGraphView. If not, see . -*/ - -#include -#include - -G_BEGIN_DECLS - -#define SHIMATTA_TYPE_OPENGL_PROGRAM (shimatta_opengl_program_get_type()) - -G_DECLARE_FINAL_TYPE(ShimattaOpenglProgram, shimatta_opengl_program, SHIMATTA, OPENGL_PROGRAM, GObject); - -/** - * @brief generate a new shader program using the source code for the shaders - * @param vertex_shader Vertex shader source code - * @param geometry_shader Geometry shader source code - * @param fragment_shader Fragement shader source code - * @return New shader program - */ -ShimattaOpenglProgram *shimatta_opengl_program_new_from_data(const char *vertex_shader, - const char *geometry_shader, - const char *fragment_shader); - -/** - * @brief shimatta_opengl_program_new_from_file - * @param vertex_shader Source file for the vertex shader - * @param geometry_shader Source file for the geometry shader - * @param fragment_shader source file for the fragment shader - * @return New shader program - * @note The files have tobe accessible when calling @ref shimatta_opengl_program_compile - */ -ShimattaOpenglProgram *shimatta_opengl_program_new_from_file(const char *vertex_shader, - const char *geometry_shader, - const char *fragment_shader); - -/** - * @brief Compile the OpenGL Program - * @param program Shader Program - * @param error_text Error message from compilation. May be NULL. - * @param error_text_size Size in bytes of the error_text buffer. May be 0. - * @return 0 if successful. If Error error text will hold the error. 1 is returned if program is already compiled - */ -int shimatta_opengl_program_compile(ShimattaOpenglProgram *program, char *error_text, size_t error_text_size); - -/** - * @brief Active shader program. - * - * The activation only works, if the program is compiled successfully - * - * @param program Shader program - * @return 0 if successful - */ -int shimatta_opengl_program_use(ShimattaOpenglProgram *program); - -/** - * @brief Check if shader program is compiled - * @param program Shader program - * @return true if successfully built - */ -gboolean shimatta_opengl_program_is_compiled(ShimattaOpenglProgram *program); - -G_END_DECLS diff --git a/shimatta-opengl/src/shimatta-opengl-program.c b/shimatta-opengl/src/shimatta-opengl-program.c deleted file mode 100644 index 3e807f5..0000000 --- a/shimatta-opengl/src/shimatta-opengl-program.c +++ /dev/null @@ -1,311 +0,0 @@ -/* - * This file is part of Shimatta OpenGL. - * -* Foobar is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -* -* Shimatta OpenGL is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with GtkGraphView. If not, see . -*/ - -#include -#include - -struct _ShimattaOpenglProgram { - GObject super; -}; - -typedef struct { - GLuint shader_id; - gboolean compiled; - char *fragment_file; - char *vertex_file; - char *geometry_file; - char *fragment_src; - char *vertex_src; - char *geometry_src; - -} ShimattaOpenglProgramPrivate; - -G_DEFINE_TYPE_WITH_PRIVATE(ShimattaOpenglProgram, shimatta_opengl_program, G_TYPE_OBJECT); - -static void shimatta_opengl_program_dispose(GObject *self) -{ - ShimattaOpenglProgram *prog; - ShimattaOpenglProgramPrivate *priv; - - g_return_if_fail(SHIMATTA_IS_OPENGL_PROGRAM(self)); - - prog = SHIMATTA_OPENGL_PROGRAM(self); - priv = shimatta_opengl_program_get_instance_private(prog); - if (priv->compiled) { - priv->compiled = false; - glDeleteProgram(priv->shader_id); - } - - if (priv->fragment_src) - g_free(priv->fragment_src); - if (priv->geometry_src) - g_free(priv->geometry_src); - if (priv->vertex_src) - g_free(priv->vertex_src); - if (priv->vertex_file) - g_free(priv->vertex_file); - if (priv->fragment_file) - g_free(priv->fragment_file); - if (priv->geometry_file) - g_free(priv->geometry_file); - -} - -static void shimatta_opengl_program_class_init(ShimattaOpenglProgramClass *klass) -{ - (void)klass; - GObjectClass *oclass; - - oclass = G_OBJECT_CLASS(klass); - oclass->dispose = shimatta_opengl_program_dispose; - - return; -} - -static void shimatta_opengl_program_init(ShimattaOpenglProgram *self) -{ - ShimattaOpenglProgramPrivate *priv; - - priv = shimatta_opengl_program_get_instance_private(self); - - priv->shader_id = 0; - priv->vertex_src = NULL; - priv->vertex_file = NULL; - priv->fragment_src = NULL; - priv->geometry_src = NULL; - priv->fragment_file = NULL; - priv->geometry_file = NULL; - priv->compiled = false; -} - -ShimattaOpenglProgram *shimatta_opengl_program_new_from_data(const char *vertex_shader, const char *geometry_shader, - const char *fragment_shader) -{ - ShimattaOpenglProgram *ret; - ShimattaOpenglProgramPrivate *priv; - - ret = g_object_new(SHIMATTA_TYPE_OPENGL_PROGRAM, NULL); - priv = shimatta_opengl_program_get_instance_private(ret); - - priv->fragment_src = g_strdup(fragment_shader); - priv->geometry_src = g_strdup(geometry_shader); - priv->vertex_src= g_strdup(vertex_shader); - - return ret; -} - -ShimattaOpenglProgram *shimatta_opengl_program_new_from_file(const char *vertex_shader, const char *geometry_shader, - const char *fragment_shader) -{ - ShimattaOpenglProgram *ret; - ShimattaOpenglProgramPrivate *priv; - - ret = g_object_new(SHIMATTA_TYPE_OPENGL_PROGRAM, NULL); - priv = shimatta_opengl_program_get_instance_private(ret); - - priv->vertex_file = g_strdup(vertex_shader); - priv->geometry_file = g_strdup(geometry_shader); - priv->fragment_file = g_strdup(fragment_shader); - - return ret; -} - -int shimatta_opengl_program_use(ShimattaOpenglProgram *program) -{ - ShimattaOpenglProgramPrivate *priv; - - g_return_val_if_fail(SHIMATTA_IS_OPENGL_PROGRAM(program), -1001); - - if (!shimatta_opengl_program_is_compiled(program)) - return -1; - - priv = shimatta_opengl_program_get_instance_private(program); - - glUseProgram(priv->shader_id); - - return 0; -} - -gboolean shimatta_opengl_program_is_compiled(ShimattaOpenglProgram *program) -{ - ShimattaOpenglProgramPrivate *priv; - - g_return_val_if_fail(SHIMATTA_IS_OPENGL_PROGRAM(program), FALSE); - priv = shimatta_opengl_program_get_instance_private(program); - - return priv->compiled; -} - -static char *load_shader_from_source_file(const char *src_file) -{ - -} - -static int compile_shader(const char *src, char *error_text, size_t error_text_size, gboolean use_error, - GLuint shader_type, GLuint *shader_id_out) -{ - GLuint shader_id; - GLint success; - int ret = 0; - - if (!shader_id_out || !src) - return -1000; - - shader_id = glCreateShader(shader_type); - glShaderSource(shader_id, 1, &src, NULL); - glCompileShader(shader_id); - glGetShaderiv(shader_id, GL_COMPILE_STATUS, &success); - - if (!success) { - ret = -1; - if (use_error) { - glGetShaderInfoLog(shader_id, error_text_size, NULL, error_text); - } - glDeleteShader(shader_id); - } else { - *shader_id_out = shader_id; - } - - return ret; -} - -int shimatta_opengl_program_compile(ShimattaOpenglProgram *program, char *error_text, size_t error_text_size) -{ - gboolean use_error = FALSE; - ShimattaOpenglProgramPrivate *priv; - char *shader_source_code; - int ret_val = 0; - int status; - GLint success; - GLuint vertex_shader, fragment_shader, geometry_shader; - gboolean vertex_built = FALSE, fragment_built = FALSE, geometry_built = FALSE; - - g_return_val_if_fail(SHIMATTA_IS_OPENGL_PROGRAM(program), -1001); - - if (error_text && error_text_size > 0) - use_error = TRUE; - - priv = shimatta_opengl_program_get_instance_private(program); - - if (priv->compiled == TRUE) { - return 1; - } - - priv->shader_id = glCreateProgram(); - - if (priv->vertex_src) { - shader_source_code = priv->vertex_src; - } else if (priv->vertex_file) { - shader_source_code = load_shader_from_source_file(priv->vertex_file); - if (!shader_source_code) { - ret_val = -1; - goto return_value; - } - - } else { - shader_source_code = NULL; - } - - /* Build the vertex shader */ - if (shader_source_code) { - status = compile_shader(shader_source_code, error_text, error_text_size, use_error, GL_VERTEX_SHADER, - &vertex_shader); - - free(shader_source_code); - - if (status) { - ret_val = -2; - goto return_value; - } - vertex_built = TRUE; - glAttachShader(priv->shader_id, vertex_shader); - } - - /* Build the fragment shader */ - if (priv->fragment_src) { - shader_source_code = priv->fragment_src; - } else if (priv->fragment_file) { - shader_source_code = load_shader_from_source_file(priv->fragment_file); - if (!shader_source_code) { - ret_val = -1; - goto return_value; - } - } else { - shader_source_code = NULL; - } - - if (shader_source_code) { - status = compile_shader(shader_source_code, error_text, error_text_size, use_error, GL_FRAGMENT_SHADER, - &fragment_shader); - - free(shader_source_code); - - if (status) { - ret_val = -2; - goto return_value; - } - fragment_built = TRUE; - glAttachShader(priv->shader_id, fragment_shader); - } - - /* Build the geometry shader */ - if (priv->geometry_src) { - shader_source_code = priv->geometry_src; - } else if (priv->geometry_file) { - shader_source_code = load_shader_from_source_file(priv->geometry_file); - if (!shader_source_code) { - ret_val = -1; - goto return_value; - } - } else { - shader_source_code = NULL; - } - - if (shader_source_code) { - status = compile_shader(shader_source_code, error_text, error_text_size, use_error, GL_GEOMETRY_SHADER, - &geometry_shader); - - free(shader_source_code); - - if (status) { - ret_val = -2; - goto return_value; - } - geometry_built = TRUE; - glAttachShader(priv->shader_id, geometry_shader); - } - - glLinkProgram(priv->shader_id); - glGetShaderiv(priv->shader_id, GL_LINK_STATUS, &success); - if (!success) { - if (use_error) - glGetShaderInfoLog(priv->shader_id, error_text_size, NULL, error_text); - ret_val = -3; - glDeleteProgram(priv->shader_id); - } else { - priv->compiled = TRUE; - } - -return_value: - if (vertex_built) - glDeleteShader(vertex_shader); - if (geometry_built) - glDeleteShader(geometry_shader); - if (fragment_built) - glDeleteShader(fragment_shader); - - return ret_val; -}