Skip to content

Commit 3d3326e

Browse files
committed
Math vector type avec(T,N,A) and vec(T,N)
**Changes** - add FTE_IS_SCALAR(T) to check if type is a vector or not - add FTE_BIT_CEIL(N) to round up to power 2 - align modes FTE_ALIGN_[UNK|NUM|VEC|MAT|STD] - add avec(T,N,A) and vec(T,N) as avec(T,N,FTE_ALIGN_STD) - quake type defines for new vector type FTE_ALIGN_STD default aligns if vector size N is a power of 2 **Fixes** - rename WIDTH_CHAR to QWIDTH_CHAR because of limits.h conflicts - rename qtv qboolean values to qfalse/qtrue
1 parent 8561747 commit 3d3326e

3 files changed

Lines changed: 47 additions & 19 deletions

File tree

engine/client/sbar.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ static mpic_t *Sbar_Q2CachePic(char *name)
335335

336336
#define ICON_WIDTH 24
337337
#define ICON_HEIGHT 24
338-
#define CHAR_WIDTH 16
338+
#define QCHAR_WIDTH 16
339339
#define ICON_SPACE 8
340340
static void SCR_DrawField (float x, float y, int color, float width, int value)
341341
{
@@ -356,7 +356,7 @@ static void SCR_DrawField (float x, float y, int color, float width, int value)
356356
l = strlen(num);
357357
if (l > width)
358358
l = width;
359-
x += 2 + CHAR_WIDTH*(width - l);
359+
x += 2 + QCHAR_WIDTH*(width - l);
360360

361361
ptr = num;
362362
while (*ptr && l)
@@ -369,7 +369,7 @@ static void SCR_DrawField (float x, float y, int color, float width, int value)
369369
p = Sbar_Q2CachePic(q2sb_nums[color][frame]);
370370
if (p && R_GetShaderSizes(p, &pw, &ph, false)>0)
371371
R2D_ScalePic (x,y,pw, ph, p);
372-
x += CHAR_WIDTH;
372+
x += QCHAR_WIDTH;
373373
ptr++;
374374
l--;
375375
}

engine/common/mathlib.h

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,52 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1919
*/
2020
// mathlib.h
2121

22+
#define BITOP_RUP1__(x) ( (x) | ( (x) >> 1))
23+
#define BITOP_RUP2__(x) (BITOP_RUP1__(x) | (BITOP_RUP1__(x) >> 2))
24+
#define BITOP_RUP4__(x) (BITOP_RUP2__(x) | (BITOP_RUP2__(x) >> 4))
25+
#define BITOP_RUP8__(x) (BITOP_RUP4__(x) | (BITOP_RUP4__(x) >> 8))
26+
#define BITOP_RUP16__(x) (BITOP_RUP8__(x) | (BITOP_RUP8__(x) >> 16))
27+
#define BITOP_RUP(x) (BITOP_RUP16__((uint32_t)(x) - 1) + 1)
28+
29+
#define BITOP_LOG2__(x) (((((x) & 0xffff0000) != 0) << 4) \
30+
|((((x) & 0xff00ff00) != 0) << 3) \
31+
|((((x) & 0xf0f0f0f0) != 0) << 2) \
32+
|((((x) & 0xcccccccc) != 0) << 1) \
33+
|((((x) & 0xaaaaaaaa) != 0) << 0))
34+
35+
#define BITOP_LOG2(x) BITOP_LOG2__(BITOP_RUP(x))
36+
37+
#define FTE_BIT_CEIL(x) BITOP_RUP(x)
38+
#define FTE_IS_SCALAR(T) sizeof(T) != sizeof(T[1])
39+
40+
enum align
41+
{
42+
FTE_ALIGN_UNK = (0 << 0),
43+
FTE_ALIGN_NUM = (1 << 0),
44+
FTE_ALIGN_VEC = (1 << 1),
45+
FTE_ALIGN_MAT = (1 << 2),
46+
FTE_ALIGN_STD = (1 << 3), /* aligns if power 2 */
47+
};
48+
49+
#define avec(T,N,A) \
50+
typeof(T FTE_ALIGN(((N == FTE_BIT_CEIL(N) && A != FTE_ALIGN_NUM && A != FTE_ALIGN_VEC) || ((A == FTE_ALIGN_VEC && FTE_IS_SCALAR(T)) || (A == FTE_ALIGN_MAT)) ? FTE_BIT_CEIL(N) : 1) * alignof(T))[N])
51+
#define vec(T,N) avec(T,N,FTE_ALIGN_STD)
52+
2253
typedef float vec_t;
23-
typedef vec_t vec2_t[2];
24-
typedef vec_t vec3_t[3];
25-
typedef vec_t vec4_t[4];
26-
typedef vec_t vec5_t[5];
54+
typedef vec(vec_t, 2) vec2_t;
55+
typedef vec(vec_t, 3) vec3_t;
56+
typedef vec(vec_t, 4) vec4_t;
57+
typedef vec(vec_t, 5) vec5_t;
2758

2859
typedef int ivec_t;
29-
typedef ivec_t ivec2_t[2];
30-
typedef ivec_t ivec3_t[3];
31-
typedef ivec_t ivec4_t[4];
32-
typedef ivec_t ivec5_t[5];
33-
34-
/*16-byte aligned vectors, for auto-vectorising, should propogate to structs
35-
sse and altivec can unroll loops using aligned reads, which should be faster... 4 at once.
36-
*/
37-
typedef FTE_ALIGN(16) vec3_t avec3_t;
38-
typedef FTE_ALIGN(16) vec4_t avec4_t;
39-
typedef FTE_ALIGN(4) qbyte byte_vec4_t[4];
60+
typedef vec(ivec_t, 2) ivec2_t;
61+
typedef vec(ivec_t, 3) ivec3_t;
62+
typedef vec(ivec_t, 4) ivec4_t;
63+
typedef vec(ivec_t, 5) ivec5_t;
64+
65+
typedef avec(vec_t, 3, FTE_ALIGN_VEC) avec3_t;
66+
typedef avec(vec_t, 4, FTE_ALIGN_VEC) avec4_t;
67+
typedef avec(qbyte, 4, FTE_ALIGN_VEC) byte_vec4_t;
4068

4169
//VECV_STRIDE is used only as an argument for opengl.
4270
#ifdef FTE_TARGET_WEB

fteqtv/qtv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ size_t CalcHMAC(hashfunc_t *hashfunc, unsigned char *digest, size_t maxdigestsiz
299299

300300

301301
#ifndef __cplusplus
302-
typedef enum {false, true} qboolean;
302+
typedef enum {qfalse = (const int)false, qtrue = (const int)true} qboolean;
303303
#else
304304
typedef int qboolean;
305305
extern "C" {

0 commit comments

Comments
 (0)