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:
parent
e61f7741e1
commit
82db59f4c9
@ -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!
|
||||
|
@ -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"},
|
||||
}
|
||||
|
||||
|
173
src/gl/render.c
173
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 */
|
||||
|
||||
/* 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 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 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 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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user