HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
R32G32B32SFloat.hpp
1// Copyright 2020 Pokitec
2// All rights reserved.
3
4#pragma once
5
6#include "TTauri/Foundation/vec.hpp"
7#include <immintrin.h>
8#include <emmintrin.h>
9#include <algorithm>
10
11namespace tt {
12
14 // Red, Green, Blue, Alpha in binary32 (native endian).
16
17public:
18 tt_force_inline R32G32B32SFloat() = default;
19 tt_force_inline R32G32B32SFloat(R32G32B32SFloat const &rhs) noexcept = default;
20 tt_force_inline R32G32B32SFloat(R32G32B32SFloat &&rhs) noexcept = default;
21 tt_force_inline R32G32B32SFloat &operator=(R32G32B32SFloat const &rhs) noexcept = default;
22 tt_force_inline R32G32B32SFloat &operator=(R32G32B32SFloat &&rhs) noexcept = default;
23
24 tt_force_inline R32G32B32SFloat(vec const &rhs) noexcept {
25 alignas(16) std::array<float,4> tmp;
26 _mm_storeu_ps(tmp.data(), rhs);
27 std::memcpy(v.data(), tmp.data(), sizeof(v));
28 }
29
30 tt_force_inline R32G32B32SFloat &operator=(vec const &rhs) noexcept {
31 alignas(16) std::array<float,4> tmp;
32 _mm_storeu_ps(tmp.data(), rhs);
33 std::memcpy(v.data(), tmp.data(), sizeof(v));
34 return *this;
35 }
36
37 tt_force_inline operator vec () const noexcept {
38 alignas(16) std::array<float,4> tmp;
39 std::memcpy(tmp.data(), v.data(), sizeof(v));
40 tmp[3] = 0.0;
41 return _mm_loadu_ps(tmp.data());
42 }
43
44 [[nodiscard]] tt_force_inline friend bool operator==(R32G32B32SFloat const &lhs, R32G32B32SFloat const &rhs) noexcept {
45 return lhs.v == rhs.v;
46 }
47 [[nodiscard]] tt_force_inline friend bool operator!=(R32G32B32SFloat const &lhs, R32G32B32SFloat const &rhs) noexcept {
48 return !(lhs == rhs);
49 }
50};
51
52}
Definition R32G32B32SFloat.hpp:13
A 4D vector.
Definition vec.hpp:37
T data(T... args)
T memcpy(T... args)