diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/context_glfw.c | 5 | ||||
| -rw-r--r-- | src/engine.c | 7 | ||||
| -rw-r--r-- | src/gl.c | 45 | ||||
| -rw-r--r-- | src/gl.h | 6 | ||||
| -rw-r--r-- | src/objects/c | 1 | ||||
| -rw-r--r-- | src/objects/effect.c | 1 | ||||
| -rw-r--r-- | src/objects/material.c | 3 | ||||
| -rw-r--r-- | src/objects/object.c | 8 | ||||
| -rw-r--r-- | src/objects/pass.c | 39 | ||||
| -rw-r--r-- | src/objects/scene.c | 7 | ||||
| -rw-r--r-- | src/shader.c | 12 | ||||
| -rw-r--r-- | src/texture.c | 26 |
12 files changed, 99 insertions, 61 deletions
diff --git a/src/context_glfw.c b/src/context_glfw.c index 7dbb457..6470205 100644 --- a/src/context_glfw.c +++ b/src/context_glfw.c @@ -38,10 +38,11 @@ static bool create_window(mri_context *c, float width, float height, const char glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + //glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA); - glDisable(GL_CULL_FACE); + //glDisable(GL_CULL_FACE); - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); print_gl_info(); diff --git a/src/engine.c b/src/engine.c index 537e5f5..0cf7fe4 100644 --- a/src/engine.c +++ b/src/engine.c @@ -1,7 +1,9 @@ #include "engine.h" +#include "cglm/vec4.h" #include "objects/object.h" #include "objects/scene.h" +#include "src/context.h" #include "src/objects/types.h" #include "src/shader.h" #include "src/texture.h" @@ -27,7 +29,7 @@ void mri_engine_load(mri_engine *engine, mri_scene *scene) { engine->combine_buffer = mri_engine_get_or_new_framebuffer(engine, mstr_c("_rt_FullFrameBuffer"), engine->context->width, engine->context->height, - 1.f, scene->clear_color); + 1.f, NULL); mri_shader_load(&engine->mininal_shader, mstr_c("minimal")); mri_shader_compile(&engine->mininal_shader); @@ -53,7 +55,7 @@ mri_framebuffer *mri_engine_get_or_new_framebuffer(mri_engine *engine, mstr *nam if (!buffer) { buffer = mvec_next(engine->framebuffers); mri_framebuffer_create(buffer, name, width, height, scale); - mri_framebuffer_load(buffer, clear_color); + mri_framebuffer_load(buffer, engine->scene->clear_color); } return buffer; @@ -89,6 +91,7 @@ void mri_engine_run(mri_engine *engine) { mri_engine_update(engine); mri_engine_draw(engine); + while (engine->context->current_time(engine->context) < time + 1.f / TARGET_FPS) { usleep(2000); // 2ms } @@ -3,7 +3,9 @@ #include <moro.h> +#include "cglm/vec4.h" #include "gl.h" +#include "src/log.h" void bind_gl_texture(gl_texture *tex, unsigned int index) { glActiveTexture(GL_TEXTURE0 + index); @@ -17,12 +19,12 @@ void create_gl_texture(gl_texture *tex, bool interp, bool clamp_uv, int mm_count if (interp) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + if (clamp_uv) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); @@ -53,20 +55,18 @@ void destroy_gl_texture(gl_texture *tex) { glDeleteTextures(1, &tex->id); } -void bind_gl_framebuffer(gl_framebuffer *fbo, bool clear) { - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo->id); +void bind_gl_framebuffer(gl_framebuffer *buffer, bool clear) { + glBindFramebuffer(GL_FRAMEBUFFER, buffer->id); if (clear) { - glClearColor(fbo->clear_color[1], fbo->clear_color[1], fbo->clear_color[2], - fbo->clear_color[3]); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClearBufferfv(GL_COLOR, 0, buffer->clear_color); } } -void create_gl_framebuffer(gl_framebuffer *fbo, float width, float height, vec4 clear_color) { - glGenFramebuffers(1, &fbo->id); +void create_gl_framebuffer(gl_framebuffer *buffer, float width, float height, vec4 clear_color) { + glGenFramebuffers(1, &buffer->id); - glGenTextures(1, &fbo->texture.id); - glBindTexture(GL_TEXTURE_2D, fbo->texture.id); + glGenTextures(1, &buffer->texture.id); + glBindTexture(GL_TEXTURE_2D, buffer->texture.id); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); @@ -76,22 +76,19 @@ void create_gl_framebuffer(gl_framebuffer *fbo, float width, float height, vec4 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindFramebuffer(GL_FRAMEBUFFER, fbo->id); + glBindFramebuffer(GL_FRAMEBUFFER, buffer->id); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - fbo->texture.id, 0); + buffer->texture.id, 0); - memcpy(fbo->clear_color, clear_color, sizeof(vec4)); + glm_vec4_copy(clear_color, buffer->clear_color); - glClearColor(fbo->clear_color[1], fbo->clear_color[1], fbo->clear_color[2], - fbo->clear_color[3]); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDrawBuffers(1, (GLenum[]){GL_COLOR_ATTACHMENT0}); - glGenerateMipmap(GL_TEXTURE_2D); + glClearBufferfv(GL_COLOR, 0, (vec4){1.f, 1.f, 1.f, 1.f}); } -void destroy_gl_framebuffer(gl_framebuffer *fbo) { - glDeleteFramebuffers(1, &fbo->id); +void destroy_gl_framebuffer(gl_framebuffer *buffer) { + glDeleteFramebuffers(1, &buffer->id); } static void set_gl_object(gl_object *obj, float *vertices, int vertex_count) { @@ -189,13 +186,13 @@ void create_gl_shader(gl_shader *shader, char *vs_source, char *fs_source) { unsigned int vs_shader = glCreateShader(GL_VERTEX_SHADER); if (!compile_check_error(vs_shader, vs_source, error)) { - //log_error("failed to compile vertex shader (%s, %s)", shader->name, error); + log_error("failed to compile vertex shader (%s)", error); return; } unsigned int fs_shader = glCreateShader(GL_FRAGMENT_SHADER); if (!compile_check_error(fs_shader, fs_source, error)) { - //log_error("failed to compile fragment shader (%s, %s)", shader->name, error); + log_error("failed to compile fragment shader (%s)", error); return; } @@ -44,9 +44,9 @@ void upload_gl_texture(gl_texture *tex, unsigned char *data, int width, int heig unsigned int format); void destroy_gl_texture(gl_texture *tex); -void bind_gl_framebuffer(gl_framebuffer *fbo, bool clear); -void create_gl_framebuffer(gl_framebuffer *fbo, float width, float height, vec4 clear_color); -void destroy_gl_framebuffer(gl_framebuffer *fbo); +void bind_gl_framebuffer(gl_framebuffer *buffer, bool clear); +void create_gl_framebuffer(gl_framebuffer *buffer, float width, float height, vec4 clear_color); +void destroy_gl_framebuffer(gl_framebuffer *buffer); void create_gl_object(gl_object *obj, gl_obj_type type, float width, float height); void bind_gl_object(gl_object *obj); diff --git a/src/objects/c b/src/objects/c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/objects/c @@ -0,0 +1 @@ + diff --git a/src/objects/effect.c b/src/objects/effect.c index f90fad8..1bc0726 100644 --- a/src/objects/effect.c +++ b/src/objects/effect.c @@ -10,6 +10,7 @@ #include <jansson.h> void mri_effect_parse(mri_effect *effect, json_t *root) { + mvec_init(effect->passes); mvec_init(effect->passes0); mvec_init(effect->passes1); diff --git a/src/objects/material.c b/src/objects/material.c index d49b0ea..c340463 100644 --- a/src/objects/material.c +++ b/src/objects/material.c @@ -11,6 +11,7 @@ void mri_material_parse(mri_material *material, json_t *value) { mvec_init(material->passes); + mvec_init(material->passes0); if (json_is_string(value)) { mri_asset *material_asset = mri_asset_manager_get(mstr_c(json_string_value(value)), NONE); @@ -67,7 +68,7 @@ void mri_material_load(mri_engine *engine, mri_material *material, mri_material_ void mri_material_draw(mri_engine *engine, mri_material *material) { mri_render_pass *pass; mvec_loop_ptr(material->passes, pass, i) { - log_debug("background (%.*s): %i", pass->object->name->len, pass->object->name->ptr, i); + //log_debug("background (%.*s): %i", pass->object->name->len, pass->object->name->ptr, i); mri_render_pass_draw(engine, pass); } } diff --git a/src/objects/object.c b/src/objects/object.c index b3b57c2..d525d3a 100644 --- a/src/objects/object.c +++ b/src/objects/object.c @@ -54,10 +54,7 @@ void mri_object_parse(mri_object *object, json_t *root) { json_t *effect; json_t *effects = json_object_get(root, "effects"); json_array(effect, effects) { - bool visible; - json_get_bool(&visible, effect, "visible"); - if (visible) - mri_effect_parse(mvec_next(object->effects), effect); + mri_effect_parse(mvec_next(object->effects), effect); } } @@ -177,7 +174,8 @@ void mri_object_draw(mri_engine *engine, mri_object *object) { glDrawArrays(GL_TRIANGLES, 0, 6); - log_debug("combine (%.*s)", object->name->len, object->name->ptr); + + //log_debug("combine (%.*s)", object->name->len, object->name->ptr); } void mri_object_unload(mri_object *object) { diff --git a/src/objects/pass.c b/src/objects/pass.c index f0cac99..e5604e6 100644 --- a/src/objects/pass.c +++ b/src/objects/pass.c @@ -1,9 +1,12 @@ +#include <jansson.h> #include <unistd.h> +#include "moro_str.h" #include "pass.h" #include "material.h" #include "model.h" #include "object.h" +#include "scene.h" #include "../json.h" #include "../texture.h" @@ -138,7 +141,7 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri if (pass->target) { rpass->target = mri_engine_get_or_new_framebuffer(engine, pass->target, engine->width, engine->height, 2.f, - (vec4){0.f, 0.f, 0.f, 0.2f}); + (vec4){0.f, 0.f, 0.f, 0.4f}); } else { // If no target was specified pick the next buffer in the // alternating AB buffers. @@ -213,7 +216,7 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri int index = shader_uniform->uname->ptr[9] - '0'; if (rpass->textures[index]) { memcpy(shader_uniform->value, - &rpass->textures[index]->texture_resolution, sizeof(vec4)); + rpass->textures[index]->texture_resolution, sizeof(vec4)); } } } @@ -224,15 +227,30 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri if (!shader_uniform->name) continue; if (mstr_eq(pass_uniform->name, shader_uniform->name)) { memcpy(shader_uniform->value, pass_uniform->value, sizeof(vec4)); + break; } } - // Handle combo value overrides. mri_combo *pass_combo, *shader_combo; - mvec_loop_ptr(rpass->combos, pass_combo, i) mvec_loop_ptr(rpass->shader.combos, shader_combo, s) { - if (mstr_eq(pass_combo->name, shader_combo->name)) { - shader_combo->value = pass_combo->value; + if (mstr_eq(shader_combo->name, mstr_c("AUDIOPROCESSING"))) { + shader_combo->value = 0; + break; + } + } + + // Handle combo value overrides. + mvec_loop_ptr(rpass->combos, pass_combo, i) { + bool override = false; + mvec_loop_ptr(rpass->shader.combos, shader_combo, s) { + if (mstr_eq(pass_combo->name, shader_combo->name)) { + shader_combo->value = pass_combo->value; + override = true; + break; + } + } + if (!override) { + mvec_push(rpass->shader.combos, *pass_combo); } } @@ -245,7 +263,7 @@ void mri_pass_load(mri_engine *engine, mri_pass *pass, mri_pass_stage stage, mri } void mri_render_pass_draw(mri_engine *engine, mri_render_pass *pass) { - mri_framebuffer_bind(pass->target, pass->combine); + mri_framebuffer_bind(pass->target, false); mri_shader_bind(engine, &pass->shader, pass->model); bind_gl_object(pass->gl_object); @@ -257,6 +275,11 @@ void mri_render_pass_draw(mri_engine *engine, mri_render_pass *pass) { glViewport(0, 0, pass->target->width, pass->target->height); glDrawArrays(GL_TRIANGLES, 0, 6); + for (int i = 0; i < pass->shader.texture_count; i++) { + glActiveTexture(GL_TEXTURE0 + i); + glBindTexture(GL_TEXTURE_2D, 0); + } + if (0) { glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, pass->target->buffer.id); @@ -268,7 +291,7 @@ void mri_render_pass_draw(mri_engine *engine, mri_render_pass *pass) { engine->context->swap_buffers(engine->context); - usleep(1000000); + usleep(5000000); } } diff --git a/src/objects/scene.c b/src/objects/scene.c index db6656f..e320acf 100644 --- a/src/objects/scene.c +++ b/src/objects/scene.c @@ -30,7 +30,7 @@ void mri_scene_parse(mri_scene *scene) { json_get_bool(&scene->clear_enabled, general, "clearenabled"); json_get_vec3((vec3 *)&scene->clear_color, general, "clearcolor"); - scene->clear_color[3] = 0.f; + scene->clear_color[3] = 1.f; json_get_vec3(&scene->ambient_color, general, "ambientcolor"); json_get_vec3(&scene->skylight_color, general, "skylightcolor"); @@ -43,10 +43,7 @@ void mri_scene_parse(mri_scene *scene) { json_t *object; json_t *objects = json_object_get(root, "objects"); json_array(object, objects) { - bool visible; - json_get_bool(&visible, object, "visible"); - if (visible && !(json_is_null(json_object_get(object, "image")))) - mri_object_parse(mvec_next(scene->objects), object); + mri_object_parse(mvec_next(scene->objects), object); } json_decref(root); diff --git a/src/shader.c b/src/shader.c index ed8090d..3df4a21 100644 --- a/src/shader.c +++ b/src/shader.c @@ -21,15 +21,15 @@ static const char *gl_compat = "#define lowp\n" "#define mul(x, y) (y * x)\n" "#define frac fract\n" - "#define CAST2(x) (vec2(x))\n" - "#define CAST3(x) (vec3(x))\n" - "#define CAST4(x) (vec4(x))\n" + "#define CAST2(x) vec2(x)\n" + "#define CAST3(x) vec3(x)\n" + "#define CAST4(x) vec4(x)\n" "#define CAST3X3(x) (mat3(x))\n" "#define saturate(x) (clamp(x, 0.0, 1.0))\n" "#define texSample2D texture2D\n" "#define texSample2DLod texture2DLod\n" "#define texture2DLod texture2D\n" - "#define atan2(y,x) atan(y,x)\n" + "#define atan2 atan\n" "#define ddx dFdx\n" "#define ddy(x) dFdy(-(x))\n" "#define GLSL 1\n"; @@ -231,9 +231,9 @@ void mri_shader_bind(mri_engine *engine, mri_shader *shader, mat4 mvp) { set_gl_uniform_named("g_Time", &shader->gl_shader, TYPE_FLOAT, &engine->time); - set_gl_uniform_named("g_TexelSize", &shader->gl_shader, TYPE_VEC2, &engine->texel_size[0]); + set_gl_uniform_named("g_TexelSize", &shader->gl_shader, TYPE_VEC2, engine->texel_size); set_gl_uniform_named("g_TexelSizeHalf", &shader->gl_shader, TYPE_VEC2, - &engine->texel_half_size[0]); + engine->texel_half_size); mat4 _mvp, _inverse; diff --git a/src/texture.c b/src/texture.c index 288a2ed..edc81a0 100644 --- a/src/texture.c +++ b/src/texture.c @@ -1,5 +1,7 @@ #define STB_IMAGE_IMPLEMENTATION #include <stb_image.h> +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include <stb_image_write.h> #include <lz4.h> #include <moro.h> @@ -16,6 +18,19 @@ static unsigned char *load_image_rgba(unsigned char *data, int len) { return stbi_load_from_memory(data, len, &w, &h, &channels, 4); } +static uint32_t rgba_to_brga(uint32_t x) { + return ((x) & 0xff00ff00) | + ((x >> 16) & 0xFF) | + ((x << 16) & 0xFF0000); +} + +static uint32_t argb_to_brga(uint32_t x) { + return ((x & 0xFF000000) >> 24) | //______AA + ((x & 0x00FF0000) >> 8) | //____RR__ + ((x & 0x0000FF00) << 8) | //__GG____ + ((x & 0x000000FF) << 24); +} + mri_texture *mri_texture_load(mri_asset *asset) { // check if texture was previously loaded @@ -92,9 +107,10 @@ mri_texture *mri_texture_load(mri_asset *asset) { if (iformat == -1) { switch (t->format) { - case RGBA8888: + case RGBA8888: { upload_gl_texture(&t->texture, buffer, mwidth, mheight, i, GL_RGBA); break; + } case DXT5: log_warn("%s", "DXT5 Texture"); break; @@ -150,10 +166,10 @@ void mri_framebuffer_create(mri_framebuffer *buffer, mstr *name, float width, fl buffer->width = width / scale; buffer->height = height / scale; - buffer->texture.texture_resolution[0] = width; - buffer->texture.texture_resolution[1] = height; - buffer->texture.texture_resolution[2] = width; - buffer->texture.texture_resolution[3] = height; + buffer->texture.texture_resolution[0] = buffer->width; + buffer->texture.texture_resolution[1] = buffer->height; + buffer->texture.texture_resolution[2] = buffer->width; + buffer->texture.texture_resolution[3] = buffer->height; } void mri_framebuffer_load(mri_framebuffer *buffer, vec4 clear_color) { |