1
0
Fork 0
mirror of https://github.com/bolero-MURAKAMI/Sprout synced 2025-08-03 12:49:50 +00:00

[sprout.darkroom] implement refraction process

This commit is contained in:
bolero-MURAKAMI 2013-12-12 23:29:50 +09:00
parent 8e306168da
commit 63ac0d0df5
10 changed files with 494 additions and 69 deletions

View file

@ -218,14 +218,70 @@ namespace sprout {
//
// refract
//
// namespace detail {
// template<typename Incident, typename Normal, typename Refraction, typename InNor, typename K>
// inline SPROUT_CONSTEXPR Incident
// refract_impl_1(Incident const& incid, Normal const& nor, Refraction const& eta, InNor const& t, K const& k) {
// return k < 0 ? sprout::tuples::remake<Incident>(incid, 0, 0, 0)
// : sprout::darkroom::coords::sub(
// sprout::darkroom::coords::scale(incid, eta),
// sprout::darkroom::coords::scale(nor, eta * t * sprout::sqrt(k))
// )
// ;
// }
// template<typename Incident, typename Normal, typename Refraction, typename InNor>
// inline SPROUT_CONSTEXPR Incident
// refract_impl(Incident const& incid, Normal const& nor, Refraction const& eta, InNor const& t) {
// return sprout::darkroom::coords::detail::refract_impl_1(
// incid, nor, eta,
// t, 1 - eta * eta * (1 - t * t)
// );
// }
// } // namespace detail
// template<typename Incident, typename Normal, typename Refraction>
// inline SPROUT_CONSTEXPR Incident
// refract(Incident const& incid, Normal const& nor, Refraction const& eta) {
// return sprout::darkroom::coords::detail::refract_impl(
// incid, nor, eta,
// sprout::darkroom::coords::dot(incid, nor)
// );
// }
// namespace detail {
// template<typename Incident, typename Normal, typename Refraction, typename InNor, typename K>
// inline SPROUT_CONSTEXPR Incident
// refract_impl_1(Incident const& incid, Normal const& nor, Refraction const& eta, InNor const& t, K const& k) {
// return k < 0 ? sprout::tuples::remake<Incident>(incid, 0, 0, 0)
// : sprout::darkroom::coords::sub(
// sprout::darkroom::coords::scale(sprout::darkroom::coords::sub(incid, sprout::darkroom::coords::scale(nor, t)), eta),
// sprout::darkroom::coords::scale(nor, eta * t * sprout::math::sqrt(k))
// )
// ;
// }
// template<typename Incident, typename Normal, typename Refraction, typename InNor>
// inline SPROUT_CONSTEXPR Incident
// refract_impl(Incident const& incid, Normal const& nor, Refraction const& eta, InNor const& t) {
// return sprout::darkroom::coords::detail::refract_impl_1(
// incid, nor, eta,
// t, 1 - eta * eta * (1 - t * t)
// );
// }
// } // namespace detail
// template<typename Incident, typename Normal, typename Refraction>
// inline SPROUT_CONSTEXPR Incident
// refract(Incident const& incid, Normal const& nor, Refraction const& eta) {
// return sprout::darkroom::coords::detail::refract_impl(
// incid, nor, eta,
// sprout::darkroom::coords::dot(incid, nor)
// );
// }
namespace detail {
template<typename Incident, typename Normal, typename Refraction, typename InNor, typename K>
inline SPROUT_CONSTEXPR Incident
refract_impl_1(Incident const& incid, Normal const& nor, Refraction const& eta, InNor const& t, K const& k) {
return k < 0 ? sprout::tuples::remake<Incident>(incid, 0, 0, 0)
: sprout::darkroom::coords::sub(
sprout::darkroom::coords::scale(incid, eta),
sprout::darkroom::coords::scale(nor, eta * t * sprout::sqrt(k))
: sprout::darkroom::coords::scale(
sprout::darkroom::coords::add(incid, sprout::darkroom::coords::scale(nor, t - sprout::math::sqrt(k))),
1 / eta
)
;
}
@ -234,7 +290,7 @@ namespace sprout {
refract_impl(Incident const& incid, Normal const& nor, Refraction const& eta, InNor const& t) {
return sprout::darkroom::coords::detail::refract_impl_1(
incid, nor, eta,
t, 1 - eta * eta * (1 - t * t)
t, eta * eta + t * t - 1
);
}
} // namespace detail
@ -243,7 +299,7 @@ namespace sprout {
refract(Incident const& incid, Normal const& nor, Refraction const& eta) {
return sprout::darkroom::coords::detail::refract_impl(
incid, nor, eta,
sprout::darkroom::coords::dot(incid, nor)
-sprout::darkroom::coords::dot(incid, nor)
);
}
} // namespace coords