From 07f6f9ea2aa06f7174b0a3783910f5805a5037ae Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Sat, 7 Mar 2015 03:16:57 +1100 Subject: [PATCH] aabb: initial stub --- Makefile.am | 2 + aabb.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ aabb.hpp | 51 +++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 aabb.cpp create mode 100644 aabb.hpp diff --git a/Makefile.am b/Makefile.am index e5dcf262..a430e5e4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,6 +9,8 @@ AM_CXXFLAGS = $(BOOST_CPPFLAGS) $(ZLIB_CFLAGS) ## Source definitions UTIL_FILES = \ + aabb.cpp \ + aabb.hpp \ backtrace.hpp \ bezier.cpp \ bezier.hpp \ diff --git a/aabb.cpp b/aabb.cpp new file mode 100644 index 00000000..b54a496b --- /dev/null +++ b/aabb.cpp @@ -0,0 +1,105 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2015 Danny Robson + */ + + +#include "aabb.hpp" +#include "debug.hpp" + +using util::AABB; + +//----------------------------------------------------------------------------- +template +AABB::AABB (point _p0, point _p1): + p0 (_p0), + p1 (_p1) +{ + debug::sanity (*this); +} + + +//----------------------------------------------------------------------------- +template +util::extent +AABB::magnitude (void) const +{ + extent out; + for (size_t i = 0; i < S; ++i) + out[i] = p1[i] - p0[i]; + return out; +} + + +//----------------------------------------------------------------------------- +template +AABB +AABB::operator+ (vector v) const +{ + return { p0 + v, p1 + v }; +} + + +//----------------------------------------------------------------------------- +template +AABB +AABB::operator- (vector v) const +{ + return { p0 - v, p1 - v }; +} + + +//----------------------------------------------------------------------------- +namespace debug { + template + struct validator { + static bool is_valid (const AABB &b) + { + for (size_t i = 0; i < S; ++i) + if (b.p1[i] < b.p0[i]) + return false; + + return true; + } + }; +} + + +//----------------------------------------------------------------------------- +template +std::ostream& +util::operator<< (std::ostream &os, AABB b) +{ + os << "AABB(" << b.p0 << ", " << b.p1 << ")"; + return os; +} + + +//----------------------------------------------------------------------------- +#define INSTANTIATE_S_T(S,T) \ +template struct AABB; \ +template bool debug::valid (const AABB&); \ +template std::ostream& util::operator<< (std::ostream&, AABB); + +#define INSTANTIATE(T) \ +INSTANTIATE_S_T(2,T) \ +INSTANTIATE_S_T(3,T) + +INSTANTIATE(uint32_t) +INSTANTIATE(uint64_t) +INSTANTIATE(float) +INSTANTIATE(double) diff --git a/aabb.hpp b/aabb.hpp new file mode 100644 index 00000000..e952242e --- /dev/null +++ b/aabb.hpp @@ -0,0 +1,51 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2015 Danny Robson + */ + + +#ifndef __UTIL_AABB_HPP +#define __UTIL_AABB_HPP + +#include "point.hpp" +#include "extent.hpp" + +#include + +namespace util { + template + struct AABB { + AABB () = default; + AABB (point, point); + + extent magnitude (void) const; + + AABB operator+ (vector) const; + AABB operator- (vector) const; + + point p0; + point p1; + }; + + typedef AABB<2,float> AABB2f; + typedef AABB<3,float> AABB3f; + + template + std::ostream& operator<< (std::ostream&, AABB); +} + +#endif