void LightSampler::sample( const Vector3d& s, LightSample& sample) const { assert(m_emitter_cdf.valid()); const EmitterCDF::ItemWeightPair result = m_emitter_cdf.sample(s[0]); const size_t emitter_index = result.first; const double emitter_prob = result.second; if (emitter_index < m_light_count) { sample.m_triangle = 0; sample_light( Vector2d(s[1], s[2]), emitter_index, emitter_prob, sample); } else { sample.m_light = 0; sample_emitting_triangle( Vector2d(s[1], s[2]), emitter_index - m_light_count, emitter_prob, sample); } assert(sample.m_triangle || sample.m_light); assert(sample.m_triangle == 0 || sample.m_triangle->m_edf); assert(sample.m_probability > 0.0); }
void LightSampler::sample_single_light( const size_t light_index, const Vector2d& s, LightSample& sample) const { sample.m_triangle = 0; sample_light(s, light_index, 1.0, sample); assert(sample.m_light); assert(sample.m_probability == 1.0); }
void main1(void *arg) { color Kd = color(diffuse(), diffuse(), diffuse()); normal Nf = faceforward(normalize(N()), I()); vector V = -normalize(I()); while (illuminance(P(), Nf, PI / 2.0f)) { color C = 0.0f; color last = 0.0f; int num_samples = 0; while (sample_light()) { C += Cl() * ( color_() * Kd * (normalize(L()) % Nf) + cosinePower() * specularColor() * specularbrdf(normalize(L()), Nf, V, 0.1f/*roughness()*/) ); ++ num_samples; if ((num_samples % 4) == 0) { color current = C * (1.0f / (scalar)num_samples); if (converged(current, last)){ break; } last = current; } } C *= (1.0f / (scalar)num_samples); Ci() += C; } if ( ! less_than( &transparency(), LIQ_SCALAR_ALMOST_ZERO ) ) {//transparent Ci() = Ci() * ( 1.0f - transparency() ) + trace_transparent() * transparency(); }//else{ opacity } setOutputForMaya(); }