3 #include <cuda_runtime.h>
13 inline DYN_FUNC
int isless (
T const& a,
T const& b,
T const EPS =
EPSILON) {
return (a + EPS < b); }
14 template <typename T, typename D, typename std::enable_if<!std::is_same<T, D>::value,
int>::type = 0>
15 inline DYN_FUNC
int isless (
T const& a, D
const& b,
T const EPS =
EPSILON) {
return isless(a,
static_cast<T>(b), EPS); }
18 inline DYN_FUNC
int isleq (
T const& a,
T const& b,
T const EPS =
EPSILON) {
return (a < b + EPS); }
19 template <typename T, typename D, typename std::enable_if<!std::is_same<T, D>::value,
int>::type = 0>
20 inline DYN_FUNC
int isleq (
T const& a, D
const& b,
T const EPS =
EPSILON) {
return isleq(a,
static_cast<T>(b), EPS); }
23 inline DYN_FUNC
int isgreat (
T const& a,
T const& b,
T const EPS =
EPSILON) {
return (a > b + EPS); }
24 template <typename T, typename D, typename std::enable_if<!std::is_same<T, D>::value,
int>::type = 0>
28 inline DYN_FUNC
int isgeq (
T const& a,
T const& b,
T const EPS =
EPSILON) {
return (a + EPS > b); }
29 template <typename T, typename D, typename std::enable_if<!std::is_same<T, D>::value,
int>::type = 0>
30 inline DYN_FUNC
int isgeq (
T const& a, D
const& b,
T const EPS =
EPSILON) {
return isgeq(a,
static_cast<T>(b), EPS); }
33 inline DYN_FUNC
int iseq (
T const& a,
T const& b,
T const EPS =
EPSILON) {
return (b < a + EPS && a < b + EPS); }
34 template <typename T, typename D, typename std::enable_if<!std::is_same<T, D>::value,
int>::type = 0>
35 inline DYN_FUNC
int iseq (
T const& a, D
const& b,
T const EPS =
EPSILON) {
return iseq(a,
static_cast<T>(b), EPS); }
42 inline DYN_FUNC
T clamp(
const T& v,
const T& lo,
const T& hi)
44 return (v < lo) ? lo : (hi < v) ? hi : v;
51 ret[0] = (v[0] < lo[0]) ? lo[0] : (hi[0] < v[0]) ? hi[0] : v[0];
52 ret[1] = (v[1] < lo[1]) ? lo[1] : (hi[1] < v[1]) ? hi[1] : v[1];
61 ret[0] = (v[0] < lo[0]) ? lo[0] : (hi[0] < v[0]) ? hi[0] : v[0];
62 ret[1] = (v[1] < lo[1]) ? lo[1] : (hi[1] < v[1]) ? hi[1] : v[1];
63 ret[2] = (v[2] < lo[2]) ? lo[2] : (hi[2] < v[2]) ? hi[2] : v[2];
72 ret[0] = (v[0] < lo[0]) ? lo[0] : (hi[0] < v[0]) ? hi[0] : v[0];
73 ret[1] = (v[1] < lo[1]) ? lo[1] : (hi[1] < v[1]) ? hi[1] : v[1];
74 ret[2] = (v[2] < lo[2]) ? lo[2] : (hi[2] < v[2]) ? hi[2] : v[2];
75 ret[3] = (v[3] < lo[3]) ? lo[3] : (hi[3] < v[3]) ? hi[3] : v[3];
81 inline DYN_FUNC
T abs(
const T& v)
83 return v <
T(0) ? - v : v;
90 ret[0] = (v[0] <
T(0)) ? -v[0] : v[0];
91 ret[1] = (v[1] <
T(0)) ? -v[1] : v[1];
100 ret[0] = (v[0] <
T(0)) ? -v[0] : v[0];
101 ret[1] = (v[1] <
T(0)) ? -v[1] : v[1];
102 ret[2] = (v[2] <
T(0)) ? -v[2] : v[2];
107 template <
typename T>
111 ret[0] = (v[0] <
T(0)) ? -v[0] : v[0];
112 ret[1] = (v[1] <
T(0)) ? -v[1] : v[1];
113 ret[2] = (v[2] <
T(0)) ? -v[2] : v[2];
114 ret[3] = (v[3] <
T(0)) ? -v[3] : v[3];
119 template <
typename T>
122 return v0 < v1 ? v0 : v1;
125 template <
typename T>
129 ret[0] = (v0[0] < v1[0]) ? v0[0] : v1[0];
130 ret[1] = (v0[1] < v1[1]) ? v0[1] : v1[1];
135 template <
typename T>
139 ret[0] = (v0[0] < v1[0]) ? v0[0] : v1[0];
140 ret[1] = (v0[1] < v1[1]) ? v0[1] : v1[1];
141 ret[2] = (v0[2] < v1[2]) ? v0[2] : v1[2];
146 template <
typename T>
150 ret[0] = (v0[0] < v1[0]) ? v0[0] : v1[0];
151 ret[1] = (v0[1] < v1[1]) ? v0[1] : v1[1];
152 ret[2] = (v0[2] < v1[2]) ? v0[2] : v1[2];
153 ret[3] = (v0[3] < v1[3]) ? v0[3] : v1[3];
159 template <
typename T>
162 return v0 > v1 ? v0 : v1;
165 template <
typename T>
169 ret[0] = (v0[0] > v1[0]) ? v0[0] : v1[0];
170 ret[1] = (v0[1] > v1[1]) ? v0[1] : v1[1];
175 template <
typename T>
179 ret[0] = (v0[0] > v1[0]) ? v0[0] : v1[0];
180 ret[1] = (v0[1] > v1[1]) ? v0[1] : v1[1];
181 ret[2] = (v0[2] > v1[2]) ? v0[2] : v1[2];
186 template <
typename T>
190 ret[0] = (v0[0] > v1[0]) ? v0[0] : v1[0];
191 ret[1] = (v0[1] > v1[1]) ? v0[1] : v1[1];
192 ret[2] = (v0[2] > v1[2]) ? v0[2] : v1[2];
193 ret[3] = (v0[3] > v1[3]) ? v0[3] : v1[3];
198 template <
typename T>
201 return U[0] *
V[0] + U[1] *
V[1];
204 template <
typename T>
207 return U[0] *
V[0] + U[1] *
V[1] + U[2] *
V[2];
210 template <
typename T>
214 U[1] *
V[2] - U[2] *
V[1],
215 U[2] *
V[0] - U[0] *
V[2],
216 U[0] *
V[1] - U[1] *
V[0]
220 template <
typename T>
227 template <
typename T>
233 template <
typename T>
240 inline DYN_FUNC
unsigned int lowbit(
unsigned int x) {
return x & (-x);}
243 inline DYN_FUNC
unsigned int countbit(
unsigned int x) {
unsigned int cnt = 0;
while(x) {x -=
lowbit(x); cnt++;}
return cnt;}
248 if (!(x & 0xFFFF0000)) r += 16, x <<= 16;
249 if (!(x & 0xFF000000)) r += 8, x <<= 8;
250 if (!(x & 0xF0000000)) r += 4, x <<= 4;
251 if (!(x & 0xC0000000)) r += 2, x <<= 2;
252 if (!(x & 0x80000000)) r += 1, x <<= 1;
263 inline DYN_FUNC
int checkbit(
unsigned int const&x,
unsigned int const& y) {
return (x >> y) & 1u;}
This is an implementation of AdditiveCCD based on peridyno.
DYN_FUNC int sign(T const &a, T const EPS=EPSILON)
DYN_FUNC int isleq(T const &a, T const &b, T const EPS=EPSILON)
DYN_FUNC Vector< T, 2 > perp(Vector< T, 2 > const &v)
DYN_FUNC T dotperp(Vector< T, 2 > const &v0, Vector< T, 2 > const &v1)
DYN_FUNC Vector< T, 3 > cross(Vector< T, 3 > const &U, Vector< T, 3 > const &V)
DYN_FUNC T dot(Vector< T, 2 > const &U, Vector< T, 2 > const &V)
DYN_FUNC int isless(T const &a, T const &b, T const EPS=EPSILON)
DYN_FUNC T abs(const T &v)
DYN_FUNC unsigned int lowbit(unsigned int x)
DYN_FUNC unsigned int __builtin_clz(unsigned int x)
DYN_FUNC T minimum(const T &v0, const T &v1)
DYN_FUNC T dotcross(Vector< T, 3 > const &U, Vector< T, 3 > const &V, Vector< T, 3 > const &W)
DYN_FUNC unsigned int MSB(unsigned int x)
DYN_FUNC int isgreat(T const &a, T const &b, T const EPS=EPSILON)
DYN_FUNC T clamp(const T &v, const T &lo, const T &hi)
DYN_FUNC T maximum(const T &v0, const T &v1)
DYN_FUNC int isgeq(T const &a, T const &b, T const EPS=EPSILON)
DYN_FUNC int checkbit(unsigned int const &x, unsigned int const &y)
DYN_FUNC unsigned int countbit(unsigned int x)
DYN_FUNC int iseq(T const &a, T const &b, T const EPS=EPSILON)
DYN_FUNC unsigned int lownum(unsigned int x)