geom: move geometry primitives to own namespace
This commit is contained in:
parent
51b8ef762a
commit
20bafa2cfb
23
Makefile.am
23
Makefile.am
@ -9,8 +9,6 @@ AM_CXXFLAGS = $(BOOST_CPPFLAGS) $(ZLIB_CFLAGS)
|
||||
## Source definitions
|
||||
|
||||
UTIL_FILES = \
|
||||
aabb.cpp \
|
||||
aabb.hpp \
|
||||
backtrace.hpp \
|
||||
bezier.cpp \
|
||||
bezier.hpp \
|
||||
@ -56,6 +54,17 @@ UTIL_FILES = \
|
||||
format.ipp \
|
||||
fourcc.cpp \
|
||||
fourcc.hpp \
|
||||
geom/fwd.hpp \
|
||||
geom/aabb.cpp \
|
||||
geom/aabb.hpp \
|
||||
geom/iostream.cpp \
|
||||
geom/iostream.hpp \
|
||||
geom/plane.cpp \
|
||||
geom/plane.hpp \
|
||||
geom/ray.cpp \
|
||||
geom/ray.hpp \
|
||||
geom/sphere.cpp \
|
||||
geom/sphere.hpp \
|
||||
guid.cpp \
|
||||
guid.hpp \
|
||||
hash.hpp \
|
||||
@ -196,8 +205,6 @@ UTIL_FILES = \
|
||||
noise/turbulence.ipp \
|
||||
pascal.cpp \
|
||||
pascal.hpp \
|
||||
plane.cpp \
|
||||
plane.hpp \
|
||||
platform.hpp \
|
||||
point.cpp \
|
||||
point.hpp \
|
||||
@ -221,8 +228,6 @@ UTIL_FILES = \
|
||||
rational.cpp \
|
||||
rational.hpp \
|
||||
rational.ipp \
|
||||
ray.cpp \
|
||||
ray.hpp \
|
||||
region.cpp \
|
||||
region.hpp \
|
||||
region.ipp \
|
||||
@ -231,8 +236,6 @@ UTIL_FILES = \
|
||||
signal.hpp \
|
||||
signal.ipp \
|
||||
si.hpp \
|
||||
sphere.cpp \
|
||||
sphere.hpp \
|
||||
stats.cpp \
|
||||
stats.hpp \
|
||||
stream.cpp \
|
||||
@ -352,7 +355,6 @@ AM_LDFLAGS += $(BOOST_LDFLAGS) $(BOOST_FILESYSTEM_LIB) $(BOOST_SYSTEM_LIB)
|
||||
AM_CXXFLAGS += -I$(top_srcdir)
|
||||
|
||||
TEST_BIN = \
|
||||
test/aabb \
|
||||
test/backtrace \
|
||||
test/bezier \
|
||||
test/bitwise \
|
||||
@ -368,6 +370,8 @@ TEST_BIN = \
|
||||
test/fixed \
|
||||
test/float \
|
||||
test/format \
|
||||
test/geom/aabb \
|
||||
test/geom/ray \
|
||||
test/hash/murmur \
|
||||
test/hash/fasthash \
|
||||
test/hmac \
|
||||
@ -377,7 +381,6 @@ TEST_BIN = \
|
||||
test/introspection \
|
||||
test/ip \
|
||||
test/json_types \
|
||||
test/ray \
|
||||
test/maths \
|
||||
test/matrix \
|
||||
test/md2 \
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include "aabb.hpp"
|
||||
#include "debug.hpp"
|
||||
|
||||
using util::AABB;
|
||||
using util::geom::AABB;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
@ -223,7 +223,7 @@ namespace debug {
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
std::ostream&
|
||||
util::operator<< (std::ostream &os, AABB<S,T> b)
|
||||
util::geom::operator<< (std::ostream &os, util::geom::AABB<S,T> b)
|
||||
{
|
||||
os << "AABB(" << b.p0 << ", " << b.p1 << ")";
|
||||
return os;
|
||||
@ -232,9 +232,9 @@ util::operator<< (std::ostream &os, AABB<S,T> b)
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
#define INSTANTIATE_S_T(S,T) \
|
||||
namespace util { template struct AABB<S,T>; } \
|
||||
namespace util { namespace geom { template struct AABB<S,T>; } } \
|
||||
template bool debug::valid (const AABB<S,T>&); \
|
||||
template std::ostream& util::operator<< (std::ostream&, AABB<S,T>);
|
||||
template std::ostream& util::geom::operator<< (std::ostream&, AABB<S,T>);
|
||||
|
||||
#define INSTANTIATE(T) \
|
||||
INSTANTIATE_S_T(2,T) \
|
@ -15,16 +15,15 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __UTIL_AABB_HPP
|
||||
#define __UTIL_AABB_HPP
|
||||
#ifndef __UTIL_GEOM_AABB_HPP
|
||||
#define __UTIL_GEOM_AABB_HPP
|
||||
|
||||
#include "point.hpp"
|
||||
#include "extent.hpp"
|
||||
#include "../point.hpp"
|
||||
#include "../extent.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
|
||||
namespace util {
|
||||
namespace util { namespace geom {
|
||||
template <size_t S, typename T>
|
||||
struct AABB {
|
||||
AABB () = default;
|
||||
@ -68,6 +67,6 @@ namespace util {
|
||||
|
||||
template <size_t S, typename T>
|
||||
std::ostream& operator<< (std::ostream&, AABB<S,T>);
|
||||
}
|
||||
} }
|
||||
|
||||
#endif
|
33
geom/fwd.hpp
Normal file
33
geom/fwd.hpp
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||
*/
|
||||
|
||||
#ifndef __UTIL_GEOM_FWD_HPP
|
||||
#define __UTIL_GEOM_FWD_HPP
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
namespace util { namespace geom {
|
||||
template <size_t S, typename T> struct ray;
|
||||
template <size_t S, typename T> struct plane;
|
||||
template <size_t S, typename T> struct AABB;
|
||||
template <size_t S, typename T> struct sphere;
|
||||
template <size_t S, typename T> struct ellipse;
|
||||
template <size_t S, typename T> struct rect;
|
||||
template <size_t S, typename T> struct cylinder;
|
||||
template <size_t S, typename T> struct tri;
|
||||
} }
|
||||
|
||||
#endif
|
@ -14,32 +14,20 @@
|
||||
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||
*/
|
||||
|
||||
#include "sphere.hpp"
|
||||
#include "./iostream.hpp"
|
||||
|
||||
using util::sphere;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
sphere<S,T>::sphere (point<S,T> _centre, T _radius):
|
||||
centre (_centre),
|
||||
radius (_radius)
|
||||
{
|
||||
CHECK_GE (_radius, 0);
|
||||
}
|
||||
#include "../geom/sphere.hpp"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
template <size_t S, typename T>
|
||||
std::ostream&
|
||||
util::operator<< (std::ostream &os, sphere<S,T> s)
|
||||
util::geom::operator<< (std::ostream &os, util::geom::sphere<S,T> s)
|
||||
{
|
||||
return os << "sphere(" << s.centre << ',' << s.radius << ')';
|
||||
}
|
||||
|
||||
template std::ostream& util::operator<< (std::ostream&, sphere<2,float>);
|
||||
template std::ostream& util::operator<< (std::ostream&, sphere<3,float>);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template struct util::sphere<2,float>;
|
||||
template struct util::sphere<3,float>;
|
||||
template std::ostream& util::geom::operator<< (std::ostream&, util::geom::sphere<2,float>);
|
||||
template std::ostream& util::geom::operator<< (std::ostream&, util::geom::sphere<3,float>);
|
30
geom/iostream.hpp
Normal file
30
geom/iostream.hpp
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||
*/
|
||||
|
||||
#ifndef __UTIL_GEOM_IOSTREAM_HPP
|
||||
#define __UTIL_GEOM_IOSTREAM_HPP
|
||||
|
||||
#include "./fwd.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace util { namespace geom {
|
||||
template <size_t S, typename T>
|
||||
std::ostream&
|
||||
operator<< (std::ostream&, sphere<S,T>);
|
||||
} }
|
||||
|
||||
#endif
|
@ -19,10 +19,13 @@
|
||||
|
||||
#include "debug.hpp"
|
||||
|
||||
using util::geom::plane;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
util::plane<S,T>::plane (util::point<S,T> _p,
|
||||
util::vector<S,T> _n):
|
||||
plane<S,T>::plane (point<S,T> _p,
|
||||
vector<S,T> _n):
|
||||
p (_p),
|
||||
n (_n)
|
||||
{
|
||||
@ -31,5 +34,5 @@ util::plane<S,T>::plane (util::point<S,T> _p,
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template struct util::plane<2,float>;
|
||||
template struct util::plane<3,float>;
|
||||
template struct util::geom::plane<2,float>;
|
||||
template struct util::geom::plane<3,float>;
|
@ -20,7 +20,7 @@
|
||||
#include "point.hpp"
|
||||
#include "vector.hpp"
|
||||
|
||||
namespace util {
|
||||
namespace util { namespace geom {
|
||||
template <size_t S, typename T>
|
||||
struct plane {
|
||||
plane (util::point<S,T> p,
|
||||
@ -33,6 +33,6 @@ namespace util {
|
||||
|
||||
typedef plane<2,float> plane2f;
|
||||
typedef plane<3,float> plane3f;
|
||||
}
|
||||
} }
|
||||
|
||||
#endif
|
@ -16,9 +16,10 @@
|
||||
|
||||
#include "ray.hpp"
|
||||
|
||||
#include "debug.hpp"
|
||||
#include "ops.hpp"
|
||||
#include "../debug.hpp"
|
||||
|
||||
using util::ray;
|
||||
using util::geom::ray;
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -137,15 +138,15 @@ ray<S,T>::at (T t) const
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
template <size_t S, typename T>
|
||||
std::ostream&
|
||||
util::operator<< (std::ostream &os, ray<S,T> r)
|
||||
util::geom::operator<< (std::ostream &os, ray<S,T> r)
|
||||
{
|
||||
return os << "ray(" << r.origin << ',' << r.direction << ')';
|
||||
}
|
||||
|
||||
template std::ostream& util::operator<< (std::ostream&, ray<3,float>);
|
||||
template std::ostream& util::operator<< (std::ostream&, ray<3,double>);
|
||||
template std::ostream& util::geom::operator<< (std::ostream&, ray<3,float>);
|
||||
template std::ostream& util::geom::operator<< (std::ostream&, ray<3,double>);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
template struct util::ray<2,float>;
|
||||
template struct util::ray<3,float>;
|
||||
template struct util::geom::ray<2,float>;
|
||||
template struct util::geom::ray<3,float>;
|
@ -14,8 +14,8 @@
|
||||
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||
*/
|
||||
|
||||
#ifndef __UTIL_RAY_HPP
|
||||
#define __UTIL_RAY_HPP
|
||||
#ifndef __UTIL_GEOM_RAY_HPP
|
||||
#define __UTIL_GEOM_RAY_HPP
|
||||
|
||||
#include "point.hpp"
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace util {
|
||||
namespace util { namespace geom {
|
||||
template <size_t S, typename T>
|
||||
struct ray {
|
||||
ray (point<S,T> origin,
|
||||
@ -56,6 +56,6 @@ namespace util {
|
||||
|
||||
typedef ray<2,float> ray2f;
|
||||
typedef ray<3,float> ray3f;
|
||||
}
|
||||
} }
|
||||
|
||||
#endif
|
20
geom/sphere.cpp
Normal file
20
geom/sphere.cpp
Normal file
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||
*/
|
||||
|
||||
#include "sphere.hpp"
|
||||
|
||||
using util::geom::sphere;
|
||||
|
@ -14,27 +14,20 @@
|
||||
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||
*/
|
||||
|
||||
#ifndef __UTIL_SPHERE_HPP
|
||||
#define __UTIL_SPHERE_HPP
|
||||
#ifndef __UTIL_GEOM_SPHERE_HPP
|
||||
#define __UTIL_GEOM_SPHERE_HPP
|
||||
|
||||
#include "point.hpp"
|
||||
#include "../point.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace util {
|
||||
namespace util { namespace geom {
|
||||
template <size_t S, typename T>
|
||||
struct sphere {
|
||||
sphere (point<S,T> centre, T radius);
|
||||
|
||||
point<S,T> centre;
|
||||
T radius;
|
||||
};
|
||||
|
||||
template <size_t S, typename T>
|
||||
std::ostream& operator<< (std::ostream&, sphere<S,T>);
|
||||
|
||||
typedef sphere<2,float> sphere2f;
|
||||
typedef sphere<3,float> sphere3f;
|
||||
}
|
||||
} }
|
||||
|
||||
#endif
|
@ -20,7 +20,6 @@
|
||||
#define __UTIL_NOISE_BASIS_PATCH_IPP
|
||||
|
||||
#include "../../types.hpp"
|
||||
#include "../../ray.hpp"
|
||||
#include "../../vector.hpp"
|
||||
|
||||
|
||||
|
@ -1,9 +1,11 @@
|
||||
#include "aabb.hpp"
|
||||
#include "geom/aabb.hpp"
|
||||
|
||||
#include "tap.hpp"
|
||||
|
||||
#include <tuple>
|
||||
|
||||
using util::geom::AABB2f;
|
||||
|
||||
|
||||
int
|
||||
main (int, char**)
|
||||
@ -12,38 +14,38 @@ main (int, char**)
|
||||
|
||||
{
|
||||
// Test contraction
|
||||
util::AABB2f box {
|
||||
AABB2f box {
|
||||
{ 2, 2 },
|
||||
{ 8, 8 }
|
||||
};
|
||||
|
||||
box.contract (2.f);
|
||||
|
||||
tap.expect_eq<util::AABB2f, util::AABB2f> (box, { { 3, 3 }, { 7, 7 }}, "over contraction");
|
||||
tap.expect_eq<AABB2f, AABB2f> (box, { { 3, 3 }, { 7, 7 }}, "over contraction");
|
||||
}
|
||||
|
||||
{
|
||||
// Test expansion
|
||||
util::AABB2f box {
|
||||
AABB2f box {
|
||||
{ 2, 2 },
|
||||
{ 8, 8 }
|
||||
};
|
||||
|
||||
box.expand (2.f);
|
||||
|
||||
tap.expect_eq<util::AABB2f, util::AABB2f> (box, { { 1, 1 }, { 9, 9 }}, "expansion");
|
||||
tap.expect_eq<AABB2f, AABB2f> (box, { { 1, 1 }, { 9, 9 }}, "expansion");
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
// Ensure we don't wrap-around on unsigned position types when contracting
|
||||
util::AABB2f small {
|
||||
AABB2f small {
|
||||
{ 0, 0 },
|
||||
{ 1, 1 }
|
||||
};
|
||||
|
||||
small.contract (10);
|
||||
|
||||
tap.expect_eq<util::AABB2f, util::AABB2f> (small, { { 0.5f, 0.5f }, { 0.5f, 0.5f }}, "unsigned over-contract");
|
||||
tap.expect_eq<AABB2f, AABB2f> (small, { { 0.5f, 0.5f }, { 0.5f, 0.5f }}, "unsigned over-contract");
|
||||
}
|
||||
}
|
@ -1,17 +1,19 @@
|
||||
#include "aabb.hpp"
|
||||
#include "debug.hpp"
|
||||
#include "plane.hpp"
|
||||
#include "ray.hpp"
|
||||
#include "geom/aabb.hpp"
|
||||
#include "geom/plane.hpp"
|
||||
#include "geom/ray.hpp"
|
||||
#include "tap.hpp"
|
||||
|
||||
using util::geom::ray2f;
|
||||
using util::geom::ray3f;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
test_intersect_plane (util::TAP::logger &tap)
|
||||
{
|
||||
// trivial case: origin ray facing z, plane at unit z facing -z.
|
||||
const util::ray3f l ({0,0,0}, {0,0, 1});
|
||||
const util::plane3f p ({0,0,1}, {0,0,-1});
|
||||
const util::geom::ray3f l ({0,0,0}, {0,0, 1});
|
||||
const util::geom::plane3f p ({0,0,1}, {0,0,-1});
|
||||
|
||||
tap.expect_eq (l.intersect (p), 1.f, "ray-plane intersect");
|
||||
}
|
||||
@ -21,20 +23,22 @@ test_intersect_plane (util::TAP::logger &tap)
|
||||
void
|
||||
test_intersect_aabb (util::TAP::logger &tap)
|
||||
{
|
||||
using util::geom::AABB2f;
|
||||
|
||||
// trivial case: unit aabb at origin, ray from (0.5,-0.5) upwards
|
||||
const util::AABB2f box {
|
||||
const AABB2f box {
|
||||
{ 0.f, 0.f },
|
||||
{ 1.f, 1.f }
|
||||
};
|
||||
|
||||
const util::ray2f forward {
|
||||
const ray2f forward {
|
||||
{ 0.5f, -0.5f },
|
||||
{ 0.f, 1.f }
|
||||
};
|
||||
|
||||
tap.expect_eq (forward.intersect (box), 0.5f, "ray-aabb intersect");
|
||||
|
||||
const util::ray2f behind {
|
||||
const ray2f behind {
|
||||
{ 0.5f, 2.f },
|
||||
{ 0.f, 1.f }
|
||||
};
|
||||
@ -47,15 +51,17 @@ test_intersect_aabb (util::TAP::logger &tap)
|
||||
void
|
||||
test_intersect_sphere (util::TAP::logger &tap)
|
||||
{
|
||||
const util::sphere3f s = {{0.f, 0.f, 0.f}, 1.f};
|
||||
using util::geom::sphere3f;
|
||||
|
||||
const util::ray3f r0 {{0.f, 2.f, 0.f}, {0.f, -1.f, 0.f}};
|
||||
const sphere3f s = {{0.f, 0.f, 0.f}, 1.f};
|
||||
|
||||
const ray3f r0 {{0.f, 2.f, 0.f}, {0.f, -1.f, 0.f}};
|
||||
tap.expect_eq (r0.intersect (s), 1.f, "ray-sphere simple");
|
||||
|
||||
const util::ray3f r1 {{0.f, 1.f, 0.f}, {0.f, 1.f, 0.f}};
|
||||
const ray3f r1 {{0.f, 1.f, 0.f}, {0.f, 1.f, 0.f}};
|
||||
tap.expect_eq (r1.intersect (s), 0.f, "ray-sphere adjacent");
|
||||
|
||||
const util::ray3f r2 {{0.f, 2.f, 0.f}, {0.f, 1.f, 0.f}};
|
||||
const ray3f r2 {{0.f, 2.f, 0.f}, {0.f, 1.f, 0.f}};
|
||||
tap.expect_nan (r2.intersect (s), "ray-sphere no-intersect");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user