Toggle navigation
PlayRho
0.9.0
GitHub
Main Page
Modules
Classes
Files
Examples
File List
File Members
Collision
ContactFeature.hpp
Go to the documentation of this file.
1
/*
2
* Original work Copyright (c) 2006-2009 Erin Catto http://www.box2d.org
3
* Modified work Copyright (c) 2017 Louis Langholtz https://github.com/louis-langholtz/PlayRho
4
*
5
* This software is provided 'as-is', without any express or implied
6
* warranty. In no event will the authors be held liable for any damages
7
* arising from the use of this software.
8
*
9
* Permission is granted to anyone to use this software for any purpose,
10
* including commercial applications, and to alter it and redistribute it
11
* freely, subject to the following restrictions:
12
*
13
* 1. The origin of this software must not be misrepresented; you must not
14
* claim that you wrote the original software. If you use this software
15
* in a product, an acknowledgment in the product documentation would be
16
* appreciated but is not required.
17
* 2. Altered source versions must be plainly marked as such, and must not be
18
* misrepresented as being the original software.
19
* 3. This notice may not be removed or altered from any source distribution.
20
*/
21
22
#ifndef PLAYRHO_COLLISION_CONTACTFEATURE_HPP
23
#define PLAYRHO_COLLISION_CONTACTFEATURE_HPP
24
25
#include <
PlayRho/Common/Math.hpp
>
26
#include <ostream>
27
28
namespace
playrho
{
29
39
struct
ContactFeature
40
{
41
using
Index
= std::uint8_t;
42
44
enum
Type
: std::uint8_t
45
{
46
e_vertex
= 0,
47
e_face
= 1
48
};
49
50
// Fit data into 4-byte large structure...
51
52
Type
typeA
;
53
Index
indexA
;
54
Type
typeB
;
55
Index
indexB
;
56
};
57
60
PLAYRHO_CONSTEXPR
inline
ContactFeature
GetVertexVertexContactFeature
(
ContactFeature::Index
a,
61
ContactFeature::Index
b) noexcept
62
{
63
return
ContactFeature
{
ContactFeature::e_vertex
, a,
ContactFeature::e_vertex
, b};
64
}
65
68
PLAYRHO_CONSTEXPR
inline
ContactFeature
GetVertexFaceContactFeature
(
ContactFeature::Index
a,
69
ContactFeature::Index
b) noexcept
70
{
71
return
ContactFeature
{
ContactFeature::e_vertex
, a,
ContactFeature::e_face
, b};
72
}
73
76
PLAYRHO_CONSTEXPR
inline
ContactFeature
GetFaceVertexContactFeature
(
ContactFeature::Index
a,
77
ContactFeature::Index
b) noexcept
78
{
79
return
ContactFeature
{
ContactFeature::e_face
, a,
ContactFeature::e_vertex
, b};
80
}
81
84
PLAYRHO_CONSTEXPR
inline
ContactFeature
GetFaceFaceContactFeature
(
ContactFeature::Index
a,
85
ContactFeature::Index
b) noexcept
86
{
87
return
ContactFeature
{
ContactFeature::e_face
, a,
ContactFeature::e_face
, b};
88
}
89
92
PLAYRHO_CONSTEXPR
inline
ContactFeature
Flip
(
ContactFeature
val) noexcept
93
{
94
return
ContactFeature
{val.
typeB
, val.indexB, val.typeA, val.indexA};
95
}
96
99
PLAYRHO_CONSTEXPR
inline
bool
operator==
(
ContactFeature
lhs,
ContactFeature
rhs) noexcept
100
{
101
return
(lhs.typeA == rhs.typeA) && (lhs.indexA == rhs.indexA)
102
&& (lhs.typeB == rhs.typeB) && (lhs.indexB == rhs.indexB);
103
}
104
107
PLAYRHO_CONSTEXPR
inline
bool
operator!=
(
ContactFeature
lhs,
ContactFeature
rhs) noexcept
108
{
109
return
!(lhs == rhs);
110
}
111
113
inline
const
char
*
GetName
(
ContactFeature::Type
type) noexcept
114
{
115
switch
(type)
116
{
117
case
ContactFeature::e_face
:
return
"face"
;
118
case
ContactFeature::e_vertex
:
return
"vertex"
;
119
}
120
return
"unknown"
;
121
}
122
124
inline ::std::ostream&
operator<<
(::std::ostream& os,
const
ContactFeature
& value)
125
{
126
os <<
"{"
;
127
os <<
GetName
(value.
typeA
);
128
os <<
","
;
129
os << unsigned(value.
indexA
);
130
os <<
","
;
131
os <<
GetName
(value.
typeB
);
132
os <<
","
;
133
os << unsigned(value.
indexB
);
134
os <<
"}"
;
135
return
os;
136
}
137
138
};
// namespace playrho
139
140
#endif // PLAYRHO_COLLISION_CONTACTFEATURE_HPP