00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 inline
00024 sheep::Real IBDF::EvaluateSpecular(const Context &context,
00025 const sheep::Vector3 &incoming,
00026 sheep::Vector3 *outgoing) const
00027 {
00028 return 0.0;
00029 }
00030
00031 inline
00032 void IBDF::Sample(const Context &context,
00033 const sheep::Vector3 &incoming,
00034 sheep::Vector3 *outgoing,
00035 sheep::Real *prob,
00036 sheep::Real *value) const
00037 {
00038 assert(!IsSpecular());
00039 assert(incoming.IsUnitLength());
00040 assert(incoming.m_y > 0.0);
00041 assert(outgoing);
00042 assert(prob);
00043 assert(value);
00044
00045 const sheep::Real xi1 = context.m_rng->RandomReal1();
00046 const sheep::Real xi2 = context.m_rng->RandomReal1();
00047
00048 *outgoing = sheep::CosineHemisphereSampling(xi1, xi2);
00049 assert(outgoing->IsUnitLength());
00050
00051 *prob = ComputeScatteringProbability(incoming, *outgoing);
00052
00053 *value = Evaluate(context, incoming, *outgoing);
00054 }
00055
00056 inline
00057 sheep::Real IBDF::ComputeScatteringProbability(const sheep::Vector3 &incoming,
00058 const sheep::Vector3 &outgoing) const
00059 {
00060 assert(!IsSpecular());
00061 assert(incoming.IsUnitLength());
00062 assert(incoming.m_y > 0.0);
00063 assert(outgoing.IsUnitLength());
00064 assert(outgoing.m_y > 0.0);
00065
00066
00067 return outgoing.m_y / sheep::PI;
00068 }