     vec3 viewDir = normalize(viewPos - f_position);
     vec3 result = vec3(0);
 
-#define USE_DIRECTIONAL_LIGHT  0
+#define USE_DIRECTIONAL_LIGHT  1
 #define USE_POINT_LIGHT        1
-#define USE_SPOT_LIGHT         0
+#define USE_SPOT_LIGHT         1
 
 #if USE_DIRECTIONAL_LIGHT
     result += calc_directional_light(directionalLight, f_normal, f_position, viewDir, shadowVal);

    vec3 lightDir = normalize(-light.direction);
    vec3 norm = normalize(normal);

/*
    vec3 texel = texture(material.diffuseMap, f_texcoord).xyz;
    if (useDefaultCubeMap) {
        texel = cubemap_reflect().xyz;
    }
*/


    // ambient
    vec3 ambient = light.ambient * material.ambient * vec3(texture(material.diffuseMap, f_texcoord));
    //vec3 ambient = light.ambient * material.ambient * texel;

    // diffuse
    float diff = max(dot(norm, lightDir), 0.0f);



    //vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuseMap, f_texcoord));
    vec3 diffuse = light.diffuse * (diff * material.diffuse * texture(material.diffuseMap, f_texcoord).xyz);
    //vec3 diffuse = light.diffuse * (diff * material.diffuse * texel);



    // specular
    //

    vec3 lightDir = normalize(light.position - fragPosition);
    vec3 norm = normalize(normal);

    //
    // TODO: cleaner cutoff lighting if surface is facing away from the light direction
    //
    if(dot(lightDir, norm) < 0.0f) {
        return vec3(0.0f);
    }

    vec3 texel = texture(material.diffuseMap, f_texcoord).xyz;
    if (useDefaultCubeMap) {
        //texel = cubemap_reflect().xyz;
        texel = vec3(1.0, 0.0, 1.0);
    }

    // ambient
    vec3 ambient = light.ambient * material.ambient * texel;

    // diffuse
    float diff = max(dot(norm, lightDir), 0.0f);
    vec3 diffuse = light.diffuse * (diff * material.diffuse * texel);

    // specular
    bool useBlinn = false;
