/*! \details No detailed. */ SampledWavelengths WavelengthSampler::sampleRandomly( Sampler& sampler, PathState& path_state) noexcept { using zisc::cast; constexpr uint sample_size = SampledWavelengths::size(); constexpr Float inverse_probability = cast<Float>(CoreConfig::spectraSize()) / cast<Float>(sample_size); std::array<uint16, sample_size> wavelengths; for (uint i = 0; i < sample_size; ++i) { const Float offset = sampler.draw1D(path_state); path_state.setDimension(path_state.dimension() + 1); const Float position = cast<Float>(CoreConfig::spectraSize()) * offset; const uint index = cast<uint>(position); const uint16 wavelength = getWavelength(index); wavelengths[i] = wavelength; } std::sort(wavelengths.begin(), wavelengths.end()); SampledWavelengths sampled_wavelengths; for (uint i = 0; i < sample_size; ++i) sampled_wavelengths.set(i, wavelengths[i], inverse_probability); sampled_wavelengths.selectPrimaryWavelength(sampler, path_state); return sampled_wavelengths; }
/*! */ inline LightSourceInfo UniformLightSourceSampler::sampleInfo( Sampler& sampler, const PathState& path_state) const noexcept { const auto& light_source_list = lightSourceList(); const Float k = zisc::cast<Float>(light_source_list.size()); const Float r = sampler.draw1D(path_state); const uint light_number = zisc::cast<uint>(k * r); return LightSourceInfo{light_source_list[light_number], weightPerLight()}; }
/*! \details No detailed. */ SampledWavelengths WavelengthSampler::sampleRegularly( Sampler& sampler, PathState& path_state) noexcept { using zisc::cast; constexpr uint sample_size = SampledWavelengths::size(); constexpr Float interval = cast<Float>(CoreConfig::spectraSize()) / cast<Float>(sample_size); constexpr Float inverse_probability = interval; SampledWavelengths sampled_wavelengths; const Float offset = sampler.draw1D(path_state); for (uint i = 0; i < sample_size; ++i) { path_state.setDimension(path_state.dimension() + 1); const uint index = cast<uint>(interval * (cast<Float>(i) + offset)); const uint16 wavelength = getWavelength(index); sampled_wavelengths.set(i, wavelength, inverse_probability); } sampled_wavelengths.selectPrimaryWavelength(sampler, path_state); return sampled_wavelengths; }