Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
StreamOut.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
8
10
13{
14public:
16 virtual ~StreamOut() = default;
17
19 virtual void WriteBytes(const void *inData, size_t inNumBytes) = 0;
20
22 virtual bool IsFailed() const = 0;
23
25 template <class T, std::enable_if_t<std::is_trivially_copyable_v<T>, bool> = true>
26 void Write(const T &inT)
27 {
28 WriteBytes(&inT, sizeof(inT));
29 }
30
32 template <class T, class A, std::enable_if_t<std::is_trivially_copyable_v<T>, bool> = true>
33 void Write(const Array<T, A> &inT)
34 {
35 uint32 len = uint32(inT.size());
36 Write(len);
37 if (!IsFailed())
38 {
39 if constexpr (std::is_same_v<T, Vec3> || std::is_same_v<T, DVec3> || std::is_same_v<T, DMat44>)
40 {
41 // These types have unused components that we don't want to write
42 for (typename Array<T, A>::size_type i = 0; i < len; ++i)
43 Write(inT[i]);
44 }
45 else
46 {
47 // Write all elements at once
48 WriteBytes(inT.data(), len * sizeof(T));
49 }
50 }
51 }
52
54 template <class Type, class Traits, class Allocator>
55 void Write(const std::basic_string<Type, Traits, Allocator> &inString)
56 {
57 uint32 len = uint32(inString.size());
58 Write(len);
59 if (!IsFailed())
60 WriteBytes(inString.data(), len * sizeof(Type));
61 }
62
64 template <class T, class A, typename F>
65 void Write(const Array<T, A> &inT, const F &inWriteElement)
66 {
67 uint32 len = uint32(inT.size());
68 Write(len);
69 if (!IsFailed())
70 for (typename Array<T, A>::size_type i = 0; i < len; ++i)
71 inWriteElement(inT[i], *this);
72 }
73
75 void Write(const Vec3 &inVec)
76 {
77 WriteBytes(&inVec, 3 * sizeof(float));
78 }
79
81 void Write(const DVec3 &inVec)
82 {
83 WriteBytes(&inVec, 3 * sizeof(double));
84 }
85
87 void Write(const DMat44 &inVec)
88 {
89 Write(inVec.GetColumn4(0));
90 Write(inVec.GetColumn4(1));
91 Write(inVec.GetColumn4(2));
92
93 Write(inVec.GetTranslation());
94 }
95};
96
#define JPH_EXPORT
Definition: Core.h:236
#define JPH_NAMESPACE_END
Definition: Core.h:378
std::uint32_t uint32
Definition: Core.h:455
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
Definition: Array.h:36
size_t size_type
Definition: Array.h:39
const T * data() const
Definition: Array.h:442
size_type size() const
Returns amount of elements in the array.
Definition: Array.h:318
Holds a 4x4 matrix of floats with the last column consisting of doubles.
Definition: DMat44.h:13
JPH_INLINE Vec4 GetColumn4(uint inCol) const
Definition: DMat44.h:115
JPH_INLINE DVec3 GetTranslation() const
Definition: DMat44.h:111
Definition: DVec3.h:14
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition: NonCopyable.h:11
Simple binary output stream.
Definition: StreamOut.h:13
void Write(const Vec3 &inVec)
Write a Vec3 (don't write W)
Definition: StreamOut.h:75
void Write(const DMat44 &inVec)
Write a DMat44 (don't write W component of translation)
Definition: StreamOut.h:87
void Write(const Array< T, A > &inT, const F &inWriteElement)
Write a vector of primitives to the binary stream using a custom write function.
Definition: StreamOut.h:65
virtual bool IsFailed() const =0
Returns true if there was an IO failure.
void Write(const DVec3 &inVec)
Write a DVec3 (don't write W)
Definition: StreamOut.h:81
void Write(const T &inT)
Write a primitive (e.g. float, int, etc.) to the binary stream.
Definition: StreamOut.h:26
void Write(const Array< T, A > &inT)
Write a vector of primitives to the binary stream.
Definition: StreamOut.h:33
virtual void WriteBytes(const void *inData, size_t inNumBytes)=0
Write a string of bytes to the binary stream.
void Write(const std::basic_string< Type, Traits, Allocator > &inString)
Write a string to the binary stream (writes the number of characters and then the characters)
Definition: StreamOut.h:55
virtual ~StreamOut()=default
Virtual destructor.
Definition: Vec3.h:17