summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/context_glfw.c5
-rw-r--r--src/engine.c7
-rw-r--r--src/gl.c45
-rw-r--r--src/gl.h6
-rw-r--r--src/objects/c1
-rw-r--r--src/objects/effect.c1
-rw-r--r--src/objects/material.c3
-rw-r--r--src/objects/object.c8
-rw-r--r--src/objects/pass.c39
-rw-r--r--src/objects/scene.c7
-rw-r--r--src/shader.c12
-rw-r--r--src/texture.c26
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
}
diff --git a/src/gl.c b/src/gl.c
index 5243a01..a03083e 100644
--- a/src/gl.c
+++ b/src/gl.c
@@ -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;
}
diff --git a/src/gl.h b/src/gl.h
index 0e52d6d..885293d 100644
--- a/src/gl.h
+++ b/src/gl.h
@@ -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) {