From 82db59f4c92005f12dba28f199180b85bb8ac8dd Mon Sep 17 00:00:00 2001 From: "Francois Truphemus (melchips)" Date: Sun, 7 Jul 2013 17:21:01 +0200 Subject: [PATCH] Ambient occlusion on sides is now rendered equally (see "Details regarding meshing" at http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/) --- include/common.h | 2 +- pkg/base/version.lua | 7 +- src/gl/render.c | 175 ++++++++++++++++++++++++++++++------------- 3 files changed, 129 insertions(+), 55 deletions(-) diff --git a/include/common.h b/include/common.h index 67ee67e..9263497 100644 --- a/include/common.h +++ b/include/common.h @@ -19,7 +19,7 @@ #define VERSION_X 1 #define VERSION_Y 0 #define VERSION_A 0 -#define VERSION_Z 3 +#define VERSION_Z 4 // Remember to bump "Z" basically every time you change the engine! // Remember to bump the version in Lua too! // Remember to document API changes in a new version! diff --git a/pkg/base/version.lua b/pkg/base/version.lua index 826f51b..a6c9518 100644 --- a/pkg/base/version.lua +++ b/pkg/base/version.lua @@ -16,9 +16,9 @@ ]] VERSION_ENGINE = { - cmp={0,1,0,0,3}, - num=4194304+3, - str="0.1-3", + cmp={0,1,0,0,4}, + num=4194304+4, + str="0.1-4", } VERSION_BUGS = { @@ -91,5 +91,6 @@ VERSION_BUGS = { {intro=nil, fix=nil, msg="Occasional crash in sackit_module_free on common.mus_free - this is probably a sackit bug."}, {intro=nil, fix=nil, msg="Sound distance attenuation affected by zoom (workaround implemented)"}, {intro=nil, fix=4194304+3, msg="[OpenGL] Frustum culling not supported"}, +{intro=nil, fix=4194304+4, msg="[OpenGL] Ambient occlusion on sides not rendered equally"}, } diff --git a/src/gl/render.c b/src/gl/render.c index 3288c5f..91abe05 100644 --- a/src/gl/render.c +++ b/src/gl/render.c @@ -778,34 +778,71 @@ void render_gl_cube_map(map_t *map, map_chunk_t *chunk, float x, float y, float average_light_vertex4 = 0.0f; } - /* Quad 1 */ - /* vertex 1 */ - cr = r*s1; cg = g*s1, cb = b*s1; - cr = render_darken_color(cr, average_light_vertex1); - cg = render_darken_color(cg, average_light_vertex1); - cb = render_darken_color(cb, average_light_vertex1); - ARR_ADD(x,y,z); + /* Check if the quad needs to be rotated (fix for ambient occlusion on sides) */ + if (average_light_vertex1 + average_light_vertex3 > average_light_vertex2 + average_light_vertex4) + { + /* Quad 1 rotated */ + + /* vertex 2 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex2); + cg = render_darken_color(cg, average_light_vertex2); + cb = render_darken_color(cb, average_light_vertex2); + ARR_ADD(x+rad*ua,y+rad*ub,z+rad*uc); - /* vertex 2 */ - cr = r*s1; cg = g*s1, cb = b*s1; - cr = render_darken_color(cr, average_light_vertex2); - cg = render_darken_color(cg, average_light_vertex2); - cb = render_darken_color(cb, average_light_vertex2); - ARR_ADD(x+rad*ua,y+rad*ub,z+rad*uc); + /* vertex 3 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex3); + cg = render_darken_color(cg, average_light_vertex3); + cb = render_darken_color(cb, average_light_vertex3); + ARR_ADD(x+rad*(ua+va),y+rad*(ub+vb),z+rad*(uc+vc)); - /* vertex 3 */ - cr = r*s1; cg = g*s1, cb = b*s1; - cr = render_darken_color(cr, average_light_vertex3); - cg = render_darken_color(cg, average_light_vertex3); - cb = render_darken_color(cb, average_light_vertex3); - ARR_ADD(x+rad*(ua+va),y+rad*(ub+vb),z+rad*(uc+vc)); + /* vertex 4 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex4); + cg = render_darken_color(cg, average_light_vertex4); + cb = render_darken_color(cb, average_light_vertex4); + ARR_ADD(x+rad*va,y+rad*vb,z+rad*vc); - /* vertex 4 */ - cr = r*s1; cg = g*s1, cb = b*s1; - cr = render_darken_color(cr, average_light_vertex4); - cg = render_darken_color(cg, average_light_vertex4); - cb = render_darken_color(cb, average_light_vertex4); - ARR_ADD(x+rad*va,y+rad*vb,z+rad*vc); + /* vertex 1 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex1); + cg = render_darken_color(cg, average_light_vertex1); + cb = render_darken_color(cb, average_light_vertex1); + ARR_ADD(x,y,z); + + } else { + /* Quad 1 normal */ + + /* vertex 1 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex1); + cg = render_darken_color(cg, average_light_vertex1); + cb = render_darken_color(cb, average_light_vertex1); + ARR_ADD(x,y,z); + + /* vertex 2 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex2); + cg = render_darken_color(cg, average_light_vertex2); + cb = render_darken_color(cb, average_light_vertex2); + ARR_ADD(x+rad*ua,y+rad*ub,z+rad*uc); + + /* vertex 3 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex3); + cg = render_darken_color(cg, average_light_vertex3); + cb = render_darken_color(cb, average_light_vertex3); + ARR_ADD(x+rad*(ua+va),y+rad*(ub+vb),z+rad*(uc+vc)); + + /* vertex 4 */ + cr = r*s1; cg = g*s1, cb = b*s1; + cr = render_darken_color(cr, average_light_vertex4); + cg = render_darken_color(cg, average_light_vertex4); + cb = render_darken_color(cb, average_light_vertex4); + ARR_ADD(x+rad*va,y+rad*vb,z+rad*vc); + + } } /* check visibility of the face (is face exposed to air ?) */ @@ -852,35 +889,71 @@ void render_gl_cube_map(map_t *map, map_chunk_t *chunk, float x, float y, float average_light_vertex4 = 0.0f; } + /* Check if the quad needs to be rotated (fix for ambient occlusion on sides) */ + if (average_light_vertex1 + average_light_vertex3 > average_light_vertex2 + average_light_vertex4) + { + /* Quad 2 rotated */ + + /* vertex 2 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex2); + cg = render_darken_color(cg, average_light_vertex2); + cb = render_darken_color(cb, average_light_vertex2); + ARR_ADD(x+rad*(1-va),y+rad*(1-vb),z+rad*(1-vc)); - /* Quad 2 */ - /* vertex 1 */ - cr = r*s2; cg = g*s2, cb = b*s2; - cr = render_darken_color(cr, average_light_vertex1); - cg = render_darken_color(cg, average_light_vertex1); - cb = render_darken_color(cb, average_light_vertex1); - ARR_ADD(x+rad,y+rad,z+rad); + /* vertex 3 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex3); + cg = render_darken_color(cg, average_light_vertex3); + cb = render_darken_color(cb, average_light_vertex3); + ARR_ADD(x+rad*(1-ua-va),y+rad*(1-ub-vb),z+rad*(1-uc-vc)); - /* vertex 2 */ - cr = r*s2; cg = g*s2, cb = b*s2; - cr = render_darken_color(cr, average_light_vertex2); - cg = render_darken_color(cg, average_light_vertex2); - cb = render_darken_color(cb, average_light_vertex2); - ARR_ADD(x+rad*(1-va),y+rad*(1-vb),z+rad*(1-vc)); - - /* vertex 3 */ - cr = r*s2; cg = g*s2, cb = b*s2; - cr = render_darken_color(cr, average_light_vertex3); - cg = render_darken_color(cg, average_light_vertex3); - cb = render_darken_color(cb, average_light_vertex3); - ARR_ADD(x+rad*(1-ua-va),y+rad*(1-ub-vb),z+rad*(1-uc-vc)); + /* vertex 4 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex4); + cg = render_darken_color(cg, average_light_vertex4); + cb = render_darken_color(cb, average_light_vertex4); + ARR_ADD(x+rad*(1-ua),y+rad*(1-ub),z+rad*(1-uc)); - /* vertex 4 */ - cr = r*s2; cg = g*s2, cb = b*s2; - cr = render_darken_color(cr, average_light_vertex4); - cg = render_darken_color(cg, average_light_vertex4); - cb = render_darken_color(cb, average_light_vertex4); - ARR_ADD(x+rad*(1-ua),y+rad*(1-ub),z+rad*(1-uc)); + /* vertex 1 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex1); + cg = render_darken_color(cg, average_light_vertex1); + cb = render_darken_color(cb, average_light_vertex1); + ARR_ADD(x+rad,y+rad,z+rad); + + } else { + /* Quad 2 normal */ + + /* vertex 1 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex1); + cg = render_darken_color(cg, average_light_vertex1); + cb = render_darken_color(cb, average_light_vertex1); + ARR_ADD(x+rad,y+rad,z+rad); + + /* vertex 2 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex2); + cg = render_darken_color(cg, average_light_vertex2); + cb = render_darken_color(cb, average_light_vertex2); + ARR_ADD(x+rad*(1-va),y+rad*(1-vb),z+rad*(1-vc)); + + /* vertex 3 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex3); + cg = render_darken_color(cg, average_light_vertex3); + cb = render_darken_color(cb, average_light_vertex3); + ARR_ADD(x+rad*(1-ua-va),y+rad*(1-ub-vb),z+rad*(1-uc-vc)); + + /* vertex 4 */ + cr = r*s2; cg = g*s2, cb = b*s2; + cr = render_darken_color(cr, average_light_vertex4); + cg = render_darken_color(cg, average_light_vertex4); + cb = render_darken_color(cb, average_light_vertex4); + ARR_ADD(x+rad*(1-ua),y+rad*(1-ub),z+rad*(1-uc)); + + } } #undef ARR_ADD }