示例#1
0
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);
}
示例#3
0
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;
}