summaryrefslogtreecommitdiff
path: root/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4fComparison.h
blob: 7ab63fb0e68e9870ba940c61b0f79f300585c2a9 (plain)
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
#pragma once

#include <Havok/Common/Base/Memory/Router/hkMemoryRouter.h>
#include <Havok/Common/Base/Types/hkBaseDefs.h>
#include <Havok/Common/Base/Types/hkBaseTypes.h>

#ifdef __aarch64__
#include <arm_neon.h>
#define HK_VECTOR4F_AARCH64_NEON
#endif

class hkVector4fComparison {
public:
    HK_DECLARE_CLASS_ALLOCATOR(hkVector4fComparison)

    enum Mask {
        INDEX_W = 3,
        INDEX_Z = 2,
        INDEX_Y = 1,
        INDEX_X = 0,

        MASK_NONE = 0x0,              // 0000
        MASK_W = (1 << INDEX_W),      // 0001
        MASK_Z = (1 << INDEX_Z),      // 0010
        MASK_ZW = (MASK_Z | MASK_W),  // 0011

        MASK_Y = (1 << INDEX_Y),        // 0100
        MASK_YW = (MASK_Y | MASK_W),    // 0101
        MASK_YZ = (MASK_Y | MASK_Z),    // 0110
        MASK_YZW = (MASK_YZ | MASK_W),  // 0111

        MASK_X = (1 << INDEX_X),        // 1000
        MASK_XW = (MASK_X | MASK_W),    // 1001
        MASK_XZ = (MASK_X | MASK_Z),    // 1010
        MASK_XZW = (MASK_XZ | MASK_W),  // 1011

        MASK_XY = (MASK_X | MASK_Y),     // 1100
        MASK_XYW = (MASK_XY | MASK_W),   // 1101
        MASK_XYZ = (MASK_XY | MASK_Z),   // 1110
        MASK_XYZW = (MASK_XY | MASK_ZW)  // 1111
    };

    HK_FORCE_INLINE static hkVector4fComparison convert(const m128& x) { return {x}; }

    HK_FORCE_INLINE void setAnd(hkVector4fComparisonParameter a, hkVector4fComparisonParameter b);
    HK_FORCE_INLINE void setAndNot(hkVector4fComparisonParameter a,
                                   hkVector4fComparisonParameter b);
    HK_FORCE_INLINE void setXor(hkVector4fComparisonParameter a, hkVector4fComparisonParameter b);
    HK_FORCE_INLINE void setOr(hkVector4fComparisonParameter a, hkVector4fComparisonParameter b);
    HK_FORCE_INLINE void setNot(hkVector4fComparisonParameter a);

    HK_FORCE_INLINE void setSelect(hkVector4fComparisonParameter comp,
                                   hkVector4fComparisonParameter trueValue,
                                   hkVector4fComparisonParameter falseValue);

    template <Mask m = Mask::MASK_XYZW>
    HK_FORCE_INLINE hkBool32 allAreSet() const;
    HK_FORCE_INLINE hkBool32 allAreSet(Mask m) const;

    template <Mask M = Mask::MASK_XYZW>
    HK_FORCE_INLINE hkBool32 anyIsSet() const;
    HK_FORCE_INLINE hkBool32 anyIsSet(Mask m) const;

    m128u m_mask;
};