import msp_interface; import common; import lighting; import shadow; import environment; struct BasicMaterialParameters { vec4 diffuse; vec4 specular; vec4 emission; float shininess; float reflectivity; }; layout(set=1) uniform BasicMaterial { BasicMaterialParameters basic_material; AlphaCutoffParams alpha_cutoff; }; layout(set=1) uniform sampler2D diffuse_map; layout(set=1) uniform sampler2D specular_map; layout(set=1) uniform sampler2D shininess_map; layout(set=1) uniform sampler2D emission_map; layout(set=1) uniform sampler2D reflectivity_map; layout(constant_id=auto) const bool use_diffuse_map = false; layout(constant_id=auto) const bool use_specular = false; layout(constant_id=auto) const bool use_specular_map = false; layout(constant_id=auto) const bool use_shininess_map = false; layout(constant_id=auto) const bool use_emission = false; layout(constant_id=auto) const bool use_emission_map = false; layout(constant_id=auto) const bool use_reflectivity = false; layout(constant_id=auto) const bool use_reflectivity_map = false; #pragma MSP stage(fragment) virtual vec4 get_diffuse_color() { if(use_diffuse_map) return texture(diffuse_map, texcoord.xy); else return basic_material.diffuse; } virtual vec3 get_specular_color() { if(use_specular_map) return texture(specular_map, texcoord.xy).rgb; else return basic_material.specular.rgb; } virtual float get_shininess_value() { if(use_shininess_map) return texture(shininess_map, texcoord.xy).r*255.0; else return basic_material.shininess; } virtual vec3 get_emission_color() { if(use_emission_map) return texture(emission_map, texcoord.xy).rgb; else return basic_material.emission.rgb; } virtual float get_reflectivity_value() { if(use_reflectivity_map) return texture(reflectivity_map, texcoord.xy).r; else return basic_material.reflectivity; } vec3 phong_ambient(vec3 surface_diffuse) { return ambient_color.rgb*surface_diffuse; } vec3 phong_one_light(vec3 light, vec3 normal, vec3 look, vec3 surface_diffuse, vec3 surface_specular, float shininess) { float diffuse_intensity = max(dot(light, normal), 0.0); vec3 color = surface_diffuse*diffuse_intensity; if(use_specular) { vec3 reflected = reflect(look, normal); float specular_intensity = pow(max(dot(reflected, light), 0.0), shininess); color += surface_specular*specular_intensity; } return color; } vec3 phong_lighting(vec3 normal, vec3 look, vec3 surface_diffuse, vec3 surface_specular, float shininess) { vec3 color = phong_ambient(surface_diffuse); for(int i=0; i