forked from nillerusr/source-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconvert.h
More file actions
279 lines (222 loc) · 7.29 KB
/
convert.h
File metadata and controls
279 lines (222 loc) · 7.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef CONVERT_H
#define CONVERT_H
#pragma once
#include "mathlib/vector.h"
#include "mathlib/mathlib.h"
#include "ivp_physics.hxx"
struct cplane_t;
#include "vphysics_interface.h"
// UNDONE: Remove all conversion/scaling
// Convert our units (inches) to IVP units (meters)
struct vphysics_units_t
{
float unitScaleMeters; // factor that converts game units to meters
float unitScaleMetersInv; // factor that converts meters to game units
float globalCollisionTolerance; // global collision tolerance in game units
float collisionSweepEpsilon; // collision sweep tests clip at this, must be the same as engine's DIST_EPSILON
float collisionSweepIncrementalEpsilon; // near-zero test for incremental steps in collision sweep tests
};
extern vphysics_units_t g_PhysicsUnits;
#define HL2IVP_FACTOR g_PhysicsUnits.unitScaleMeters
#define IVP2HL(x) (float)(x * (g_PhysicsUnits.unitScaleMetersInv))
#define HL2IVP(x) (double)(x * HL2IVP_FACTOR)
// Convert HL engine units to IVP units
inline void ConvertPositionToIVP( const Vector &in, IVP_U_Float_Point &out )
{
float tmpZ;
tmpZ = in[1];
out.k[0] = HL2IVP(in[0]);
out.k[1] = -HL2IVP(in[2]);
out.k[2] = HL2IVP(tmpZ);
}
inline void ConvertPositionToIVP( const Vector &in, IVP_U_Point &out )
{
float tmpZ;
tmpZ = in[1];
out.k[0] = HL2IVP(in[0]);
out.k[1] = -HL2IVP(in[2]);
out.k[2] = HL2IVP(tmpZ);
}
inline void ConvertPositionToIVP( const Vector &in, IVP_U_Float_Point3 &out )
{
float tmpZ;
tmpZ = in[1];
out.k[0] = HL2IVP(in[0]);
out.k[1] = -HL2IVP(in[2]);
out.k[2] = HL2IVP(tmpZ);
}
inline void ConvertPositionToIVP( float &x, float &y, float &z )
{
float tmpZ;
tmpZ = y;
y = -HL2IVP(z);
z = HL2IVP(tmpZ);
x = HL2IVP(x);
}
inline void ConvertDirectionToIVP( const Vector &in, IVP_U_Float_Point &out )
{
float tmpZ;
tmpZ = in[1];
out.k[0] = in[0];
out.k[1] = -in[2];
out.k[2] = tmpZ;
}
inline void ConvertDirectionToIVP( const Vector &in, IVP_U_Point &out )
{
float tmpZ;
tmpZ = in[1];
out.k[0] = in[0];
out.k[1] = -in[2];
out.k[2] = tmpZ;
}
// forces are handled the same as positions & velocities (scaled by distance conversion factor)
#define ConvertForceImpulseToIVP ConvertPositionToIVP
#define ConvertForceImpulseToHL ConvertPositionToHL
inline float ConvertAngleToIVP( float angleIn )
{
return DEG2RAD(angleIn);
}
inline void ConvertAngularImpulseToIVP( const AngularImpulse &in, IVP_U_Float_Point &out )
{
float tmpZ;
tmpZ = in[1];
out.k[0] = DEG2RAD(in[0]);
out.k[1] = -DEG2RAD(in[2]);
out.k[2] = DEG2RAD(tmpZ);
}
inline float ConvertDistanceToIVP( float distance )
{
return HL2IVP( distance );
}
inline void ConvertPlaneToIVP( const Vector &pNormal, float dist, IVP_U_Hesse &plane )
{
ConvertDirectionToIVP( pNormal, (IVP_U_Point &)plane );
// HL stores planes as Ax + By + Cz = D
// IVP stores them as Ax + BY + Cz + D = 0
plane.hesse_val = -ConvertDistanceToIVP( dist );
}
inline void ConvertPlaneToIVP( const Vector &pNormal, float dist, IVP_U_Float_Hesse &plane )
{
ConvertDirectionToIVP( pNormal, (IVP_U_Float_Point &)plane );
// HL stores planes as Ax + By + Cz = D
// IVP stores them as Ax + BY + Cz + D = 0
plane.hesse_val = -ConvertDistanceToIVP( dist );
}
inline float ConvertDensityToIVP( float density )
{
return density;
}
// in convert.cpp
extern void ConvertMatrixToIVP( const matrix3x4_t& matrix, IVP_U_Matrix &out );
extern void ConvertRotationToIVP( const QAngle &angles, IVP_U_Matrix3 &out );
extern void ConvertRotationToIVP( const QAngle& angles, IVP_U_Quat &out );
extern void ConvertBoxToIVP( const Vector &mins, const Vector &maxs, Vector &outmins, Vector &outmaxs );
extern int ConvertCoordinateAxisToIVP( int axisIndex );
extern int ConvertCoordinateAxisToHL( int axisIndex );
// IVP to HL conversions
inline void ConvertPositionToHL( const IVP_U_Point &point, Vector& out )
{
float tmpY = IVP2HL(point.k[2]);
out[2] = -IVP2HL(point.k[1]);
out[1] = tmpY;
out[0] = IVP2HL(point.k[0]);
}
inline void ConvertPositionToHL( const IVP_U_Float_Point &point, Vector& out )
{
float tmpY = IVP2HL(point.k[2]);
out[2] = -IVP2HL(point.k[1]);
out[1] = tmpY;
out[0] = IVP2HL(point.k[0]);
}
inline void ConvertPositionToHL( const IVP_U_Float_Point3 &point, Vector& out )
{
float tmpY = IVP2HL(point.k[2]);
out[2] = -IVP2HL(point.k[1]);
out[1] = tmpY;
out[0] = IVP2HL(point.k[0]);
}
inline void ConvertDirectionToHL( const IVP_U_Point &point, Vector& out )
{
float tmpY = point.k[2];
out[2] = -point.k[1];
out[1] = tmpY;
out[0] = point.k[0];
}
inline void ConvertDirectionToHL( const IVP_U_Float_Point &point, Vector& out )
{
float tmpY = point.k[2];
out[2] = -point.k[1];
out[1] = tmpY;
out[0] = point.k[0];
}
inline float ConvertAngleToHL( float angleIn )
{
return RAD2DEG(angleIn);
}
inline void ConvertAngularImpulseToHL( const IVP_U_Float_Point &point, AngularImpulse &out )
{
float tmpY = point.k[2];
out[2] = -RAD2DEG(point.k[1]);
out[1] = RAD2DEG(tmpY);
out[0] = RAD2DEG(point.k[0]);
}
inline float ConvertDistanceToHL( float distance )
{
return IVP2HL( distance );
}
// NOTE: Converts in place
inline void ConvertPlaneToHL( cplane_t &plane )
{
IVP_U_Float_Hesse tmp(plane.normal.x, plane.normal.y, plane.normal.z, -plane.dist);
ConvertDirectionToHL( (IVP_U_Float_Point &)tmp, plane.normal );
// HL stores planes as Ax + By + Cz = D
// IVP stores them as Ax + BY + Cz + D = 0
plane.dist = -ConvertDistanceToHL( tmp.hesse_val );
}
inline void ConvertPlaneToHL( const IVP_U_Float_Hesse &plane, Vector *pNormalOut, float *pDistOut )
{
if ( pNormalOut )
{
ConvertDirectionToHL( plane, *pNormalOut );
}
// HL stores planes as Ax + By + Cz = D
// IVP stores them as Ax + BY + Cz + D = 0
if ( pDistOut )
{
*pDistOut = -ConvertDistanceToHL( plane.hesse_val );
}
}
inline float ConvertVolumeToHL( float volume )
{
float factor = IVP2HL(1.0);
factor = (factor * factor * factor);
return factor * volume;
}
#define INSQR_PER_METERSQR (1.f / (METERS_PER_INCH*METERS_PER_INCH))
inline float ConvertEnergyToHL( float energy )
{
return energy * INSQR_PER_METERSQR;
}
inline void IVP_Float_PointAbs( IVP_U_Float_Point &out, const IVP_U_Float_Point &in )
{
out.k[0] = fabsf( in.k[0] );
out.k[1] = fabsf( in.k[1] );
out.k[2] = fabsf( in.k[2] );
}
// convert.cpp
extern void ConvertRotationToHL( const IVP_U_Matrix3 &in, QAngle &angles );
extern void ConvertMatrixToHL( const IVP_U_Matrix &in, matrix3x4_t& output );
extern void ConvertRotationToHL( const IVP_U_Quat &in, QAngle& angles );
extern void TransformIVPToLocal( IVP_U_Point &pointInOut, IVP_Real_Object *pObject, bool translate );
extern void TransformLocalToIVP( IVP_U_Point &pointInOut, IVP_Real_Object *pObject, bool translate );
extern void TransformIVPToLocal( const IVP_U_Point &pointIn, IVP_U_Point &pointOut, IVP_Real_Object *pObject, bool translate );
extern void TransformLocalToIVP( const IVP_U_Point &pointIn, IVP_U_Point &pointOut, IVP_Real_Object *pObject, bool translate );
extern void TransformLocalToIVP( const IVP_U_Float_Point &pointIn, IVP_U_Point &pointOut, IVP_Real_Object *pObject, bool translate );
extern void TransformLocalToIVP( const IVP_U_Float_Point &pointIn, IVP_U_Float_Point &pointOut, IVP_Real_Object *pObject, bool translate );
#endif // CONVERT_H