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_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!

View File

@ -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"},
}

View File

@ -778,7 +778,42 @@ void render_gl_cube_map(map_t *map, map_chunk_t *chunk, float x, float y, float
average_light_vertex4 = 0.0f;
}
/* Quad 1 */
/* 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 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 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);
@ -806,6 +841,8 @@ void render_gl_cube_map(map_t *map, map_chunk_t *chunk, float x, float y, float
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,8 +889,42 @@ 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));
/* 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 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 */
/* Quad 2 */
/* vertex 1 */
cr = r*s2; cg = g*s2, cb = b*s2;
cr = render_darken_color(cr, average_light_vertex1);
@ -881,6 +952,8 @@ void render_gl_cube_map(map_t *map, map_chunk_t *chunk, float x, float y, float
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
}