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/)

This commit is contained in:
Francois Truphemus (melchips) 2013-07-07 17:21:01 +02:00
parent e61f7741e1
commit 82db59f4c9
3 changed files with 129 additions and 55 deletions

View File

@ -19,7 +19,7 @@
#define VERSION_X 1 #define VERSION_X 1
#define VERSION_Y 0 #define VERSION_Y 0
#define VERSION_A 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 "Z" basically every time you change the engine!
// Remember to bump the version in Lua too! // Remember to bump the version in Lua too!
// Remember to document API changes in a new version! // Remember to document API changes in a new version!

View File

@ -16,9 +16,9 @@
]] ]]
VERSION_ENGINE = { VERSION_ENGINE = {
cmp={0,1,0,0,3}, cmp={0,1,0,0,4},
num=4194304+3, num=4194304+4,
str="0.1-3", str="0.1-4",
} }
VERSION_BUGS = { 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="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=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+3, msg="[OpenGL] Frustum culling not supported"},
{intro=nil, fix=4194304+4, msg="[OpenGL] Ambient occlusion on sides not rendered equally"},
} }

View File

@ -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; average_light_vertex4 = 0.0f;
} }
/* Quad 1 */ /* Check if the quad needs to be rotated (fix for ambient occlusion on sides) */
/* vertex 1 */ if (average_light_vertex1 + average_light_vertex3 > average_light_vertex2 + average_light_vertex4)
cr = r*s1; cg = g*s1, cb = b*s1; {
cr = render_darken_color(cr, average_light_vertex1); /* Quad 1 rotated */
cg = render_darken_color(cg, average_light_vertex1);
cb = render_darken_color(cb, average_light_vertex1); /* vertex 2 */
ARR_ADD(x,y,z); 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 */ /* vertex 3 */
cr = r*s1; cg = g*s1, cb = b*s1; cr = r*s1; cg = g*s1, cb = b*s1;
cr = render_darken_color(cr, average_light_vertex2); cr = render_darken_color(cr, average_light_vertex3);
cg = render_darken_color(cg, average_light_vertex2); cg = render_darken_color(cg, average_light_vertex3);
cb = render_darken_color(cb, average_light_vertex2); cb = render_darken_color(cb, average_light_vertex3);
ARR_ADD(x+rad*ua,y+rad*ub,z+rad*uc); ARR_ADD(x+rad*(ua+va),y+rad*(ub+vb),z+rad*(uc+vc));
/* vertex 3 */ /* vertex 4 */
cr = r*s1; cg = g*s1, cb = b*s1; cr = r*s1; cg = g*s1, cb = b*s1;
cr = render_darken_color(cr, average_light_vertex3); cr = render_darken_color(cr, average_light_vertex4);
cg = render_darken_color(cg, average_light_vertex3); cg = render_darken_color(cg, average_light_vertex4);
cb = render_darken_color(cb, average_light_vertex3); cb = render_darken_color(cb, average_light_vertex4);
ARR_ADD(x+rad*(ua+va),y+rad*(ub+vb),z+rad*(uc+vc)); ARR_ADD(x+rad*va,y+rad*vb,z+rad*vc);
/* vertex 4 */ /* vertex 1 */
cr = r*s1; cg = g*s1, cb = b*s1; cr = r*s1; cg = g*s1, cb = b*s1;
cr = render_darken_color(cr, average_light_vertex4); cr = render_darken_color(cr, average_light_vertex1);
cg = render_darken_color(cg, average_light_vertex4); cg = render_darken_color(cg, average_light_vertex1);
cb = render_darken_color(cb, average_light_vertex4); cb = render_darken_color(cb, average_light_vertex1);
ARR_ADD(x+rad*va,y+rad*vb,z+rad*vc); 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 ?) */ /* 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; 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 3 */
/* vertex 1 */ cr = r*s2; cg = g*s2, cb = b*s2;
cr = r*s2; cg = g*s2, cb = b*s2; cr = render_darken_color(cr, average_light_vertex3);
cr = render_darken_color(cr, average_light_vertex1); cg = render_darken_color(cg, average_light_vertex3);
cg = render_darken_color(cg, average_light_vertex1); cb = render_darken_color(cb, average_light_vertex3);
cb = render_darken_color(cb, average_light_vertex1); ARR_ADD(x+rad*(1-ua-va),y+rad*(1-ub-vb),z+rad*(1-uc-vc));
ARR_ADD(x+rad,y+rad,z+rad);
/* vertex 2 */ /* vertex 4 */
cr = r*s2; cg = g*s2, cb = b*s2; cr = r*s2; cg = g*s2, cb = b*s2;
cr = render_darken_color(cr, average_light_vertex2); cr = render_darken_color(cr, average_light_vertex4);
cg = render_darken_color(cg, average_light_vertex2); cg = render_darken_color(cg, average_light_vertex4);
cb = render_darken_color(cb, average_light_vertex2); cb = render_darken_color(cb, average_light_vertex4);
ARR_ADD(x+rad*(1-va),y+rad*(1-vb),z+rad*(1-vc)); ARR_ADD(x+rad*(1-ua),y+rad*(1-ub),z+rad*(1-uc));
/* 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 */ /* vertex 1 */
cr = r*s2; cg = g*s2, cb = b*s2; cr = r*s2; cg = g*s2, cb = b*s2;
cr = render_darken_color(cr, average_light_vertex4); cr = render_darken_color(cr, average_light_vertex1);
cg = render_darken_color(cg, average_light_vertex4); cg = render_darken_color(cg, average_light_vertex1);
cb = render_darken_color(cb, average_light_vertex4); cb = render_darken_color(cb, average_light_vertex1);
ARR_ADD(x+rad*(1-ua),y+rad*(1-ub),z+rad*(1-uc)); 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 #undef ARR_ADD
} }