PSMoveService
ClientGeometry.h
1 #ifndef CLIENT_GEOMETRY_H
2 #define CLIENT_GEOMETRY_H
3 
4 //-- includes -----
5 #include "ClientConfig.h"
6 
7 //-- pre-declarations -----
8 struct PSMovePosition;
9 
10 //-- declarations -----
11 struct CLIENTPSMOVEAPI PSMoveFloatVector2
12 {
13  float i, j;
14 
15  // psuedo-constructor to keep this a POD type
16  static PSMoveFloatVector2 create(float i, float j);
17 
18  PSMoveFloatVector2 operator + (const PSMoveFloatVector2 &other) const;
19  PSMoveFloatVector2 operator - (const PSMoveFloatVector2 &other) const;
20  PSMoveFloatVector2 operator * (const float s) const;
21 
22  PSMoveFloatVector2 unsafe_divide(const float s) const;
23  PSMoveFloatVector2 unsafe_divide(const PSMoveFloatVector2 &v) const;
24  PSMoveFloatVector2 safe_divide(const float s, const PSMoveFloatVector2 &default_result) const;
25  PSMoveFloatVector2 safe_divide(const PSMoveFloatVector2 &v, const PSMoveFloatVector2 &default_result) const;
26 
27  PSMoveFloatVector2 abs() const;
28  PSMoveFloatVector2 square() const;
29 
30  float length() const;
31  float normalize_with_default(const PSMoveFloatVector2 &default_result);
32 
33  float minValue() const;
34  float maxValue() const;
35 
36  static float dot(const PSMoveFloatVector2 &a, const PSMoveFloatVector2 &b);
39 };
40 
41 struct CLIENTPSMOVEAPI PSMoveFloatVector3
42 {
43  float i, j, k;
44 
45  // psuedo-constructor to keep this a POD type
46  static PSMoveFloatVector3 create(float i, float j, float k);
47 
48  PSMovePosition castToPSMovePosition() const;
49 
50  PSMoveFloatVector3 operator + (const PSMoveFloatVector3 &other) const;
51  PSMoveFloatVector3 operator - (const PSMoveFloatVector3 &other) const;
52  PSMoveFloatVector3 operator * (const float s) const;
53 
54  PSMoveFloatVector3 unsafe_divide(const float s) const;
55  PSMoveFloatVector3 unsafe_divide(const PSMoveFloatVector3 &v) const;
56  PSMoveFloatVector3 safe_divide(const float s, const PSMoveFloatVector3 &default_result) const;
57  PSMoveFloatVector3 safe_divide(const PSMoveFloatVector3 &v, const PSMoveFloatVector3 &default_result) const;
58 
59  PSMoveFloatVector3 abs() const;
60  PSMoveFloatVector3 square() const;
61 
62  float length() const;
63  float normalize_with_default(const PSMoveFloatVector3 &default_result);
64 
65  float minValue() const;
66  float maxValue() const;
67 
68  static float dot(const PSMoveFloatVector3 &a, const PSMoveFloatVector3 &b);
71 };
72 
73 struct CLIENTPSMOVEAPI PSMoveIntVector3
74 {
75  int i, j, k;
76 
77  // psuedo-constructor to keep this a POD type
78  static PSMoveIntVector3 create(int i, int j, int k);
79 
80  PSMoveFloatVector3 castToFloatVector3() const;
81 
82  PSMoveIntVector3 operator + (const PSMoveIntVector3 &other) const;
83  PSMoveIntVector3 operator - (const PSMoveIntVector3 &other) const;
84 
85  PSMoveIntVector3 unsafe_divide(const int s) const;
86  PSMoveIntVector3 unsafe_divide(const PSMoveIntVector3 &v) const;
87  PSMoveIntVector3 safe_divide(const int s, const PSMoveIntVector3 &default_result) const;
88  PSMoveIntVector3 safe_divide(const PSMoveIntVector3 &v, const PSMoveIntVector3 &default_result) const;
89 
90  PSMoveIntVector3 abs() const;
91  PSMoveIntVector3 square() const;
92 
93  int lengthSquared() const;
94 
95  int minValue() const;
96  int maxValue() const;
97 
98  static PSMoveIntVector3 min(const PSMoveIntVector3 &a, const PSMoveIntVector3 &b);
99  static PSMoveIntVector3 max(const PSMoveIntVector3 &a, const PSMoveIntVector3 &b);
100 };
101 
102 struct CLIENTPSMOVEAPI PSMovePosition
103 {
104  float x, y, z;
105 
106  // psuedo-constructor to keep this a POD type
107  static PSMovePosition create(float x, float y, float z);
108 
109  PSMoveFloatVector3 toPSMoveFloatVector3() const;
110  PSMoveFloatVector3 operator - (const PSMovePosition &other) const;
111  PSMovePosition operator + (const PSMoveFloatVector3 &v) const;
112  PSMovePosition operator - (const PSMoveFloatVector3 &v) const;
113  PSMovePosition operator * (const float s) const;
114 };
115 
117 struct CLIENTPSMOVEAPI PSMoveScreenLocation
118 {
119  float x, y;
120 
121  // psuedo-constructor to keep this a POD type
122  static PSMoveScreenLocation create(float x, float y);
123 
124  PSMoveFloatVector2 toPSMoveFloatVector2() const;
125  PSMoveFloatVector2 operator - (const PSMoveScreenLocation &other) const;
126 };
127 
128 struct CLIENTPSMOVEAPI PSMoveQuaternion
129 {
130  float w, x, y, z;
131 
132  // psuedo-constructor to keep this a POD type
133  static PSMoveQuaternion create(float w, float x, float y, float z);
134 
135  PSMoveQuaternion operator + (const PSMoveQuaternion &other) const;
136  PSMoveQuaternion operator * (const PSMoveQuaternion &other) const;
137 
138  PSMoveQuaternion unsafe_divide(const float s) const;
139  PSMoveQuaternion safe_divide(const float s, const PSMoveQuaternion &default_result) const;
140  PSMoveQuaternion inverse() const;
141  static PSMoveQuaternion concat(const PSMoveQuaternion &first, const PSMoveQuaternion &second);
142  PSMoveFloatVector3 rotate_vector(const PSMoveFloatVector3 &v) const;
143  PSMovePosition rotate_position(const PSMovePosition &v) const;
144 
145  float length() const;
146  PSMoveQuaternion &normalize_with_default(const PSMoveQuaternion &default_result);
147 };
148 
149 struct CLIENTPSMOVEAPI PSMoveMatrix3x3
150 {
151  float m[3][3]; // storage is row major order: [x0,x1,x2,y0,y1,y1,z0,z1,z2]
152 
153  static PSMoveMatrix3x3 create(
154  const PSMoveFloatVector3 &basis_x,
155  const PSMoveFloatVector3 &basis_y,
156  const PSMoveFloatVector3 &basis_z);
157  static PSMoveMatrix3x3 create(const PSMoveQuaternion &q);
158 
159  PSMoveFloatVector3 basis_x() const;
160  PSMoveFloatVector3 basis_y() const;
161  PSMoveFloatVector3 basis_z() const;
162 };
163 
164 struct CLIENTPSMOVEAPI PSMovePose
165 {
166  PSMovePosition Position;
167  PSMoveQuaternion Orientation;
168 
169  void Clear();
170  PSMovePose inverse() const;
171  static PSMovePose concat(const PSMovePose &first, const PSMovePose &second);
172  PSMovePosition apply_transform(const PSMovePosition &p) const;
173  PSMovePosition apply_inverse_transform(const PSMovePosition &p) const;
174 };
175 
176 struct CLIENTPSMOVEAPI PSMoveFrustum
177 {
178  PSMovePosition origin; // cm
179  PSMoveFloatVector3 forward, left, up;
180  float HFOV, VFOV; // radians
181  float zNear, zFar; // cm
182 
183  void set_pose(const PSMovePose &pose);
184 };
185 
186 struct CLIENTPSMOVEAPI PSMoveTrackingProjection
187 {
188  enum eShapeType {
189  INVALID_PROJECTION = -1,
190 
191  Ellipse,
192  LightBar,
193 
194  MAX_TRACKING_PROJECTION_TYPES
195  };
196 
197  union{
198  struct {
199  PSMoveScreenLocation center;
200  float half_x_extent;
201  float half_y_extent;
202  float angle;
203  } ellipse;
204 
205  struct {
206  PSMoveScreenLocation triangle[3];
207  PSMoveScreenLocation quad[4];
208  } lightbar;
209  } shape;
210 
211  eShapeType shape_type;
212 };
213 
214 struct CLIENTPSMOVEAPI PSMoveVolume
215 {
216  PSMovePosition vertices[4];
217  int vertex_count;
218  float up_height;
219 };
220 
221 //-- constants -----
222 CLIENTPSMOVEAPI extern const PSMoveIntVector3 *k_psmove_int_vector3_zero;
223 CLIENTPSMOVEAPI extern const PSMoveFloatVector3 *k_psmove_float_vector3_zero;
224 CLIENTPSMOVEAPI extern const PSMoveIntVector3 *k_psmove_int_vector3_one;
225 CLIENTPSMOVEAPI extern const PSMoveFloatVector3 *k_psmove_float_vector3_one;
226 CLIENTPSMOVEAPI extern const PSMoveFloatVector3 *k_psmove_float_vector3_i;
227 CLIENTPSMOVEAPI extern const PSMoveFloatVector3 *k_psmove_float_vector3_j;
228 CLIENTPSMOVEAPI extern const PSMoveFloatVector3 *k_psmove_float_vector3_k;
229 CLIENTPSMOVEAPI extern const PSMovePosition *k_psmove_position_origin;
230 CLIENTPSMOVEAPI extern const PSMoveQuaternion *k_psmove_quaternion_identity;
231 CLIENTPSMOVEAPI extern const PSMoveMatrix3x3 *k_psmove_matrix_identity;
232 CLIENTPSMOVEAPI extern const PSMovePose *k_psmove_pose_identity;
233 
234 #endif // CLIENT_GEOMETRY_H
genType max(genType const &x, genType const &y)
Returns y if x < y; otherwise, it returns x.
Definition: func_common.inl:307
genType::value_type dot(genType const &x, genType const &y)
Returns the dot product of x and y, i.e., result = x * y.
Definition: func_geometric.inl:134
Definition: ClientGeometry.h:128
Definition: ClientGeometry.h:73
Definition: ClientGeometry.h:41
Definition: ClientGeometry.h:176
A screen location in the space [-frameWidth/2, -frameHeight/2]x[frameWidth/2, frameHeight/2].
Definition: ClientGeometry.h:117
Definition: ClientGeometry.h:11
Definition: ClientGeometry.h:186
Definition: ClientGeometry.h:149
Definition: ClientGeometry.h:102
Definition: ClientGeometry.h:164
Definition: ClientGeometry.h:214
genType::value_type length(genType const &x)
Returns the length of x, i.e., sqrt(x * x).
Definition: func_geometric.inl:36
genType min(genType const &x, genType const &y)
Returns y if y < x; otherwise, it returns x.
Definition: func_common.inl:288
detail::tmat2x2< valType > inverse(detail::tmat2x2< valType > const &m)
Return the inverse of a mat2 matrix.
genType abs(genType const &x)
Returns x if x >= 0; otherwise, it returns -x.