#pragma once #include "particle.hpp" namespace kel { namespace lbm { template class particle_aabb final { }; template::type radius> class particle_aabb > > final { public: using Schema = sch::ParticleGroup>; using AABB = Struct< Member"a">, Member"b"> >; public: static constexpr saw::data get(const saw::data& p_grp, const saw::data>& i, const saw::data>& meta){ auto& parts = p_grp.template get<"particles">(); auto& pi = parts.at(i); auto& pirb = pi.template get<"rigid_body">(); auto& pirb_pos = pirb.template get<"position">(); saw::data aabb; auto& a = aabb.template get<"a">(); auto& b = aabb.template get<"b">(); saw::data> rad_d; rad_d.at({}).set(radius); saw::data> lower; saw::data> upper; for(uint64_t i{0u}; i < D; ++i){ lower.at({{i}}) = pirb_pos.at({{i}}) >= rad_d.at({}) ? (pirb_pos.at({{i}}) - rad_d.at({})) : saw::data{0}; a.at({i}) = lower.at({{i}}).template cast_to(); upper.at({{i}}) = pirb_pos.at({{i}}) + rad_d.at({}); b.at({i}) = (upper.at({{i}})+saw::data{1}).template cast_to() } return aabb; } }; } }