nuclear@4: #include "material.h" nuclear@4: nuclear@4: MatAttrib::MatAttrib() nuclear@4: : value(1), color(1, 1, 1), map(0) nuclear@4: { nuclear@4: } nuclear@4: nuclear@4: MatAttrib::MatAttrib(const Color &col, Texture *tex) nuclear@4: { nuclear@4: set_color(col); nuclear@4: map = tex; nuclear@4: } nuclear@4: nuclear@4: void MatAttrib::set_value(float val) nuclear@4: { nuclear@4: value = val; nuclear@4: color = Color{val, val, val}; nuclear@4: } nuclear@4: nuclear@4: void MatAttrib::set_color(const Color &col) nuclear@4: { nuclear@4: color = col; nuclear@4: value = color_luminance(col); nuclear@4: } nuclear@4: nuclear@4: void MatAttrib::set_map(Texture *tex) nuclear@4: { nuclear@4: map = tex; nuclear@4: } nuclear@4: nuclear@4: Texture *MatAttrib::get_map() const nuclear@4: { nuclear@4: return map; nuclear@4: } nuclear@4: nuclear@4: float MatAttrib::get_value() const nuclear@4: { nuclear@4: return value; nuclear@4: } nuclear@4: nuclear@4: float MatAttrib::get_value(float u, float v) const nuclear@4: { nuclear@4: return map ? value * color_luminance(map->lookup(u, v)) : value; nuclear@4: } nuclear@4: nuclear@4: const Color &MatAttrib::get_color() const nuclear@4: { nuclear@4: return color; nuclear@4: } nuclear@4: nuclear@4: Color MatAttrib::get_color(float u, float v) const nuclear@4: { nuclear@4: return map ? color * map->lookup(u, v) : color; nuclear@4: } nuclear@4: nuclear@4: nuclear@4: // --- class Material --- nuclear@4: nuclear@4: MatAttrib Material::def_attrib; nuclear@4: nuclear@4: Material::Material() nuclear@4: { nuclear@4: } nuclear@4: nuclear@4: void Material::set_attrib(const char *name, const Color &color, Texture *tex) nuclear@4: { nuclear@4: attrib[name] = MatAttrib{color, tex}; nuclear@4: } nuclear@4: nuclear@4: MatAttrib &Material::get_attrib(const char *name) nuclear@4: { nuclear@4: auto it = attrib.find(name); nuclear@4: if(it == attrib.end()) { nuclear@4: return def_attrib; nuclear@4: } nuclear@4: return it->second; nuclear@4: } nuclear@4: nuclear@4: const MatAttrib &Material::get_attrib(const char *name) const nuclear@4: { nuclear@4: auto it = attrib.find(name); nuclear@4: if(it == attrib.end()) { nuclear@4: return def_attrib; nuclear@4: } nuclear@4: return it->second; nuclear@4: } nuclear@4: nuclear@4: float Material::get_attrib_value(const char *name) const nuclear@4: { nuclear@4: return get_attrib(name).get_value(); nuclear@4: } nuclear@4: nuclear@4: float Material::get_attrib_value(const char *name, float u, float v) const nuclear@4: { nuclear@4: return get_attrib(name).get_value(u, v); nuclear@4: } nuclear@4: nuclear@4: Color Material::get_attrib_color(const char *name) const nuclear@4: { nuclear@4: return get_attrib(name).get_color(); nuclear@4: } nuclear@4: nuclear@4: Color Material::get_attrib_color(const char *name, float u, float v) const nuclear@4: { nuclear@4: return get_attrib(name).get_color(u, v); nuclear@4: } nuclear@4: