void ColorSource::initialize_from_spectrum(
    const ColorEntity&      color_entity)
{
    const ColorValueArray& values = color_entity.get_values();

    if (values.size() > 0)
    {
        // todo: this should be user-settable.
        const LightingConditions lighting_conditions(
            IlluminantCIED65,
            XYZCMFCIE196410Deg);

        m_scalar = static_cast<double>(values[0]);

        m_spectrum =
            spectral_values_to_spectrum(
                color_entity.get_wavelength_range(),
                values);

        m_linear_rgb =
            ciexyz_to_linear_rgb(
                spectrum_to_ciexyz<float>(lighting_conditions, m_spectrum));
    }
    else
    {
        m_scalar = 0.0;
        m_linear_rgb.set(0.0f);
        m_spectrum.set(0.0f);
    }
}
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;
}