void DisneyLayeredBRDF::evaluate_inputs( const ShadingContext& shading_context, InputEvaluator& input_evaluator, const ShadingPoint& shading_point, const size_t offset) const { char* ptr = reinterpret_cast<char*>(input_evaluator.data()); DisneyBRDFInputValues* values = reinterpret_cast<DisneyBRDFInputValues*>(ptr + offset); memset(values, 0, sizeof(DisneyBRDFInputValues)); Color3d base_color(0.0); for (size_t i = 0, e = m_parent->get_layer_count(); i < e; ++i) { const DisneyMaterialLayer& layer = m_parent->get_layer(i, shading_context.get_thread_index()); layer.evaluate_expressions( shading_point, shading_context.get_oiio_texture_system(), base_color, *values); } // Colors in SeExpr are always in the sRGB color space. base_color = srgb_to_linear_rgb(base_color); values->m_base_color = Color3f(base_color); values->precompute_tint_color(); }
void ColorSource::initialize_from_3d_color( const ColorEntity& color_entity, const InputFormat input_format) { const ColorValueArray& values = color_entity.get_values(); if (values.size() == 1) m_linear_rgb.set(values[0]); else if (values.size() == 3) m_linear_rgb = Color3f(values[0], values[1], values[2]); else m_linear_rgb.set(0.0f); m_scalar = static_cast<double>(m_linear_rgb[0]); if (input_format == InputFormatSpectralIlluminance || input_format == InputFormatSpectralReflectance) { switch (color_entity.get_color_space()) { case ColorSpaceLinearRGB: linear_rgb_to_spectrum( input_format, m_linear_rgb, m_spectrum); break; case ColorSpaceSRGB: linear_rgb_to_spectrum( input_format, srgb_to_linear_rgb(m_linear_rgb), m_spectrum); break; case ColorSpaceCIEXYZ: linear_rgb_to_spectrum( input_format, ciexyz_to_linear_rgb(m_linear_rgb), m_spectrum); break; default: assert(!"Invalid color space."); break; } } else m_spectrum.set(0.0f); }
void ColorSource::initialize_from_color3(const ColorEntity& color_entity) { Color3f color; const ColorValueArray& values = color_entity.get_values(); if (values.size() == 1) color.set(values[0]); else if (values.size() == 3) color = Color3f(values[0], values[1], values[2]); else { m_scalar = ScalarInput(0.0); m_linear_rgb.set(0.0f); m_spectrum.set(0.0f); return; } m_scalar = static_cast<double>(color[0]); switch (color_entity.get_color_space()) { case ColorSpaceLinearRGB: m_linear_rgb = color; break; case ColorSpaceSRGB: m_linear_rgb = srgb_to_linear_rgb(color); break; case ColorSpaceCIEXYZ: m_linear_rgb = ciexyz_to_linear_rgb(color); break; default: assert(!"Invalid color space."); break; } m_spectrum = m_linear_rgb; }