X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbasicmaterial.cpp;h=362fc9db14e6a8636960bec3a746cd8e62715ed8;hp=7ba8380c1b47b62db0dad9746d19db1a1ec5413b;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=3500f13f51dabadd2e7f06b81820936520cc8115 diff --git a/source/basicmaterial.cpp b/source/basicmaterial.cpp index 7ba8380c..362fc9db 100644 --- a/source/basicmaterial.cpp +++ b/source/basicmaterial.cpp @@ -5,7 +5,8 @@ using namespace std; namespace Msp { namespace GL { -BasicMaterial::BasicMaterial() +BasicMaterial::BasicMaterial(): + receive_shadows(false) { set_diffuse(Color(1.0f)); set_specular(Color(0.0f)); @@ -14,6 +15,38 @@ BasicMaterial::BasicMaterial() set_reflectivity(0.0f); } +string BasicMaterial::create_program_source() const +{ + string source = "import phong;\n"; + if(diffuse.texture) + source += "const bool use_diffuse_map = true;\n"; + if(specular.texture || specular.value.r || specular.value.g || specular.value.b) + { + source += "const bool use_specular = true;\n"; + if(specular.texture) + source += "const bool use_specular_map = true;\n"; + if(shininess.texture) + source += "const bool use_shininess_map = true;\n"; + } + if(normal.texture) + source += "const bool use_normal_map = true;\n"; + if(emission.texture || emission.value.r || emission.value.g || emission.value.b) + { + source += "const bool use_emission = true;\n"; + if(emission.texture) + source += "const bool use_emission_map = true;\n"; + } + if(reflectivity.value || reflectivity.texture) + { + source += "const bool use_reflectivity = true;\n"; + if (reflectivity.texture) + source += "const bool use_reflectivity_map = true;\n"; + } + if(receive_shadows) + source += "const bool use_shadow_map = true;\n"; + return source; +} + void BasicMaterial::attach_textures_to(Texturing &texturing, ProgramData &tex_shdata) const { attach_texture_to(diffuse.texture, texturing, tex_shdata, "diffuse_map"); @@ -84,29 +117,36 @@ void BasicMaterial::set_reflectivity_map(const Texture *tex) reflectivity.texture = tex; } +void BasicMaterial::set_receive_shadows(bool s) +{ + receive_shadows = s; +} + DataFile::Loader::ActionMap BasicMaterial::Loader::shared_actions; BasicMaterial::Loader::Loader(BasicMaterial &m): - DerivedObjectLoader >(m) + DerivedObjectLoader >(m) { set_actions(shared_actions); } BasicMaterial::Loader::Loader(BasicMaterial &m, Collection &c): - DerivedObjectLoader >(m, c) + DerivedObjectLoader >(m, c) { set_actions(shared_actions); } void BasicMaterial::Loader::init_actions() { + Material::PropertyLoader::init_actions(); add_property("diffuse", &BasicMaterial::set_diffuse, &BasicMaterial::set_diffuse_map, true); add_property("specular", &BasicMaterial::set_specular, &BasicMaterial::set_specular_map, false); add_property("normal", &BasicMaterial::set_normal_map); add_property("emission", &BasicMaterial::set_emission, &BasicMaterial::set_emission_map, false); add_property("shininess", &BasicMaterial::set_shininess, &BasicMaterial::set_shininess_map); add_property("reflectivity", &BasicMaterial::set_reflectivity, &BasicMaterial::set_reflectivity_map); + add("receive_shadows", &BasicMaterial::receive_shadows); } } // namespace GL