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:
parent
8e306168da
commit
63ac0d0df5
10 changed files with 494 additions and 69 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue