int query(int p,int l,int r,int ql,int qr){ if(ql <= l && r <= qr) return seg[p]; int mid = (r+l)/2; bool nul = 1; int res = 0,tmp = 0; if(ql <= mid) res = query(2*p,l,mid,ql,qr),nul = 0; if(mid < qr){ tmp = query(2*p+1,mid+1,r,ql,qr); if(!nul) res = a_max(res,tmp); else res = tmp; } return res; }
void BoundCreation::MergeAABBs(const AABB * aabb_a, const AABB * aabb_b, AABB * rtn_aabb) { Eigen::Vector3f a_min(aabb_a->GetCenter() - aabb_a->GetExtents()); Eigen::Vector3f a_max(aabb_a->GetCenter() + aabb_a->GetExtents()); Eigen::Vector3f b_min(aabb_b->GetCenter() - aabb_b->GetExtents()); Eigen::Vector3f b_max(aabb_b->GetCenter() + aabb_b->GetExtents()); Eigen::Vector3f rtn_min; Eigen::Vector3f rtn_max; rtn_min[0] = std::min(a_min[0], b_min[0]); rtn_min[1] = std::min(a_min[1], b_min[1]); rtn_min[2] = std::min(a_min[2], b_min[2]); rtn_max[0] = std::max(a_max[0], b_max[0]); rtn_max[1] = std::max(a_max[1], b_max[1]); rtn_max[2] = std::max(a_max[2], b_max[2]); rtn_aabb->SetExtents((rtn_max - rtn_min) * 0.5f); rtn_aabb->SetCenter((rtn_max + rtn_min) * 0.5f); }
void upd(int p) { seg[p] = a_max(seg[p<<1],seg[(p<<1)+1]); }