#version 150 compatibility uniform int culling_mode; uniform int map_color_to_material; uniform int illumination_mode; int surface_side_handling(in vec3 position, inout vec3 normal, inout vec4 color) { // sign of dot product between normal and view vector tells us side that we see float sign_indicator = dot(normal, position); int side = (sign_indicator < 0.0) ? 1 : 0; // perform face culling switch (culling_mode) { case 1: // backface culling if (sign_indicator > 0.0) { return -1; } break; case 2: // frontface culling if (sign_indicator < 0.0) { return -1; } break; } // based on illumination mode and side, overwrite color with material color if needed, and overwrite normal with negated normal if needed if (illumination_mode > 0) { // negate normal for back faces in double sided illumination if (illumination_mode == 2 && side == 0) { normal = -normal; } // overwrite color with diffuse material color if no color mapping turned on if (side == 1) { if ((map_color_to_material & 1) == 0) { color = gl_FrontMaterial.diffuse; } } else { if ((map_color_to_material & 2) == 0) { color = gl_BackMaterial.diffuse; } } } return side; }