diff --git a/trunk/fcl/include/fcl/data_types.h b/trunk/fcl/include/fcl/data_types.h new file mode 100644 index 0000000000000000000000000000000000000000..1683592898483213c408cda02e82025a4fbaf319 --- /dev/null +++ b/trunk/fcl/include/fcl/data_types.h @@ -0,0 +1,48 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2011, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** \author Jia Pan */ + +#ifndef FCL_DATA_TYPES_H +#define FCL_DATA_TYPES_H + +#include <inttypes.h> + +typedef double FCL_REAL; +typedef uint64_t FCL_INT64; +typedef int64_t FCL_UINT64; +typedef unsigned int FCL_UINT32; +typedef int FCL_INT32; + +#endif diff --git a/trunk/fcl/include/fcl/morton.h b/trunk/fcl/include/fcl/morton.h new file mode 100644 index 0000000000000000000000000000000000000000..b409c16ec75b9057fa2dcb4f8ef1e8535ae0e5e7 --- /dev/null +++ b/trunk/fcl/include/fcl/morton.h @@ -0,0 +1,174 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2011, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** \author Jia Pan */ + +#ifndef FCL_MORTON_H +#define FCL_MORTON_H + +#include <boost/dynamic_bitset.hpp> +#include "fcl/data_types.h" +#include "fcl/BV/AABB.h" + +namespace fcl +{ + +static inline FCL_UINT32 quantize(FCL_REAL x, FCL_UINT32 n) +{ + return std::max(std::min((FCL_UINT32)(x * (FCL_REAL)n), FCL_UINT32(n-1)), FCL_UINT32(0)); +} + +static inline FCL_UINT32 morton_code(FCL_UINT32 x, FCL_UINT32 y, FCL_UINT32 z) +{ + x = (x | (x << 16)) & 0x030000FF; + x = (x | (x << 8)) & 0x0300F00F; + x = (x | (x << 4)) & 0x030C30C3; + x = (x | (x << 2)) & 0x09249249; + + y = (y | (y << 16)) & 0x030000FF; + y = (y | (y << 8)) & 0x0300F00F; + y = (y | (y << 4)) & 0x030C30C3; + y = (y | (y << 2)) & 0x09249249; + + z = (z | (z << 16)) & 0x030000FF; + z = (z | (z << 8)) & 0x0300F00F; + z = (z | (z << 4)) & 0x030C30C3; + z = (z | (z << 2)) & 0x09249249; + + return x | (y << 1) | (z << 2); +} + +static inline FCL_UINT64 morton_code60(FCL_UINT32 x, FCL_UINT32 y, FCL_UINT32 z) +{ + FCL_UINT32 lo_x = x & 1023u; + FCL_UINT32 lo_y = y & 1023u; + FCL_UINT32 lo_z = z & 1023u; + FCL_UINT32 hi_x = x >> 10u; + FCL_UINT32 hi_y = y >> 10u; + FCL_UINT32 hi_z = z >> 10u; + + return (FCL_UINT64(morton_code(hi_x, hi_y, hi_z)) << 30) | FCL_UINT64(morton_code(lo_x, lo_y, lo_z)); +} + +template<typename T> +struct morton_functor {}; + +template<> +struct morton_functor<FCL_UINT32> +{ + morton_functor(const AABB& bbox) : base(bbox.min_), + inv(1.0 / (bbox.max_[0] - bbox.min_[0]), + 1.0 / (bbox.max_[1] - bbox.min_[1]), + 1.0 / (bbox.max_[2] - bbox.min_[2])) + {} + + FCL_UINT32 operator() (const Vec3f& point) const + { + FCL_UINT32 x = quantize((point[0] - base[0]) * inv[0], 1024u); + FCL_UINT32 y = quantize((point[1] - base[1]) * inv[1], 1024u); + FCL_UINT32 z = quantize((point[2] - base[2]) * inv[2], 1024u); + + return morton_code(x, y, z); + } + + const Vec3f base; + const Vec3f inv; +}; + + +template<> +struct morton_functor<FCL_UINT64> +{ + morton_functor(const AABB& bbox) : base(bbox.min_), + inv(1.0 / (bbox.max_[0] - bbox.min_[0]), + 1.0 / (bbox.max_[1] - bbox.min_[1]), + 1.0 / (bbox.max_[2] - bbox.min_[2])) + {} + + FCL_UINT64 operator() (const Vec3f& point) const + { + FCL_UINT32 x = quantize((point[0] - base[0]) * inv[0], 1u << 20); + FCL_UINT32 y = quantize((point[1] - base[1]) * inv[1], 1u << 20); + FCL_UINT32 z = quantize((point[2] - base[2]) * inv[2], 1u << 20); + + return morton_code60(x, y, z); + } + + const Vec3f base; + const Vec3f inv; +}; + +template<> +struct morton_functor<boost::dynamic_bitset<> > +{ + morton_functor(const AABB& bbox, size_t bit_num_) : base(bbox.min_), + inv(1.0 / (bbox.max_[0] - bbox.min_[0]), + 1.0 / (bbox.max_[1] - bbox.min_[1]), + 1.0 / (bbox.max_[2] - bbox.min_[2])), + bit_num(bit_num_) + {} + + boost::dynamic_bitset<> operator() (const Vec3f& point) const + { + FCL_REAL x = (point[0] - base[0]) * inv[0]; + FCL_REAL y = (point[1] - base[1]) * inv[1]; + FCL_REAL z = (point[2] - base[2]) * inv[2]; + int start_bit = bit_num * 3 - 1; + boost::dynamic_bitset<> bits(bit_num * 3); + + x *= 2; + y *= 2; + z *= 2; + + for(size_t i = 0; i < bit_num; ++i) + { + bits[start_bit--] = ((z < 1) ? 0 : 1); + bits[start_bit--] = ((y < 1) ? 0 : 1); + bits[start_bit--] = ((x < 1) ? 0 : 1); + x = ((x >= 1) ? 2*(x-1) : 2*x); + y = ((y >= 1) ? 2*(y-1) : 2*y); + z = ((z >= 1) ? 2*(z-1) : 2*z); + } + + return bits; + } + + const Vec3f base; + const Vec3f inv; + const size_t bit_num; +}; + +} + +#endif