opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
vertex_format.h
Go to the documentation of this file.
1#pragma once
2
7
8#include <cstddef>
9#include <initializer_list>
10#include <optional>
11#include <span>
12#include <vector>
13
14namespace osc
15{
17 public:
18 // describes a vertex attribute's layout within a `VertexFormat`
19 //
20 // i.e. it's a `VertexAttributeDescriptor` that has a known offset within `VertexFormat`
22 public:
27
28 friend bool operator==(const VertexAttributeLayout&, const VertexAttributeLayout&) = default;
29
30 size_t offset() const { return offset_; }
31 private:
32 size_t offset_;
33 };
34
35 // iterates over each attribute's layout within `VertexFormat`
37 public:
41 using iterator_category = std::input_iterator_tag;
42
43 VertexAttributeLayoutIterator() = default; // to satisfy `std::ranges::range`
44
46 std::vector<VertexAttributeDescriptor>::const_iterator iter) :
47
48 iter_{iter}
49 {}
50
52 {
53 return lhs.iter_ == rhs.iter_;
54 }
55
57 {
58 offset_ += iter_->stride();
59 ++iter_;
60 return *this;
61 }
62
64 {
65 auto tmp = *this;
66 ++(*this);
67 return tmp;
68 }
69
71 {
72 return VertexAttributeLayout{*iter_, offset_};
73 }
74 private:
75 size_t offset_ = 0;
76 std::vector<VertexAttributeDescriptor>::const_iterator iter_{};
77 };
78
79 // C++20 ranges support for `VertexAttributeLayoutIterator`
81 public:
85
87 const std::vector<VertexAttributeDescriptor>& descriptions) :
88 descriptions_{&descriptions}
89 {}
90
92 {
93 return VertexAttributeLayoutIterator{descriptions_->begin()};
94 }
95
97 {
98 return VertexAttributeLayoutIterator{descriptions_->end()};
99 }
100 private:
101 const std::vector<VertexAttributeDescriptor>* descriptions_ = nullptr;
102 };
103
104 // constructs an "empty" format
105 VertexFormat() = default;
106
107 // attribute descriptions must:
108 //
109 // - have at least a `VertexAttribute::Position`
110 // - all be unique
111 explicit VertexFormat(std::span<const VertexAttributeDescriptor>);
112
113 VertexFormat(std::initializer_list<VertexAttributeDescriptor> il) :
114 VertexFormat{std::span{il.begin(), il.end()}}
115 {}
116
117 friend bool operator==(const VertexFormat&, const VertexFormat&) = default;
118
119 void clear()
120 {
121 *this = VertexFormat{};
122 }
123
124 [[nodiscard]] bool empty() const
125 {
126 return attribute_descriptions_.empty();
127 }
128
129 bool contains(VertexAttribute attribute) const
130 {
131 return cpp23::contains(attribute_descriptions_, attribute, &VertexAttributeDescriptor::attribute);
132 }
133
134 size_t num_attributes() const
135 {
136 return attribute_descriptions_.size();
137 }
138
140 {
141 return VertexAttributeLayoutRange{attribute_descriptions_};
142 }
143
144 std::optional<VertexAttributeLayout> attribute_layout(VertexAttribute attribute) const
145 {
147 }
148
149 size_t stride() const
150 {
151 return stride_;
152 }
153
156 private:
157 size_t calc_stride() const;
158
159 std::vector<VertexAttributeDescriptor> attribute_descriptions_;
160 size_t stride_ = 0;
161 };
162}
Definition vertex_attribute_descriptor.h:10
VertexAttribute attribute() const
Definition vertex_attribute_descriptor.h:22
VertexAttributeLayoutIterator & operator++()
Definition vertex_format.h:56
VertexAttributeLayoutIterator operator++(int)
Definition vertex_format.h:63
VertexAttributeLayoutIterator(std::vector< VertexAttributeDescriptor >::const_iterator iter)
Definition vertex_format.h:45
ptrdiff_t difference_type
Definition vertex_format.h:38
reference operator*() const
Definition vertex_format.h:70
VertexAttributeLayout value_type
Definition vertex_format.h:39
friend bool operator==(const VertexAttributeLayoutIterator &lhs, const VertexAttributeLayoutIterator &rhs)
Definition vertex_format.h:51
std::input_iterator_tag iterator_category
Definition vertex_format.h:41
const_iterator end() const
Definition vertex_format.h:96
VertexAttributeLayoutRange(const std::vector< VertexAttributeDescriptor > &descriptions)
Definition vertex_format.h:86
const_iterator begin() const
Definition vertex_format.h:91
Definition vertex_format.h:21
VertexAttributeLayout(const VertexAttributeDescriptor &descriptor, size_t offset)
Definition vertex_format.h:23
size_t offset() const
Definition vertex_format.h:30
friend bool operator==(const VertexAttributeLayout &, const VertexAttributeLayout &)=default
Definition vertex_format.h:16
friend bool operator==(const VertexFormat &, const VertexFormat &)=default
VertexFormat()=default
VertexFormat(std::initializer_list< VertexAttributeDescriptor > il)
Definition vertex_format.h:113
VertexAttributeLayoutRange attribute_layouts() const
Definition vertex_format.h:139
bool empty() const
Definition vertex_format.h:124
void erase(VertexAttribute)
size_t num_attributes() const
Definition vertex_format.h:134
size_t stride() const
Definition vertex_format.h:149
void insert(const VertexAttributeDescriptor &)
bool contains(VertexAttribute attribute) const
Definition vertex_format.h:129
std::optional< VertexAttributeLayout > attribute_layout(VertexAttribute attribute) const
Definition vertex_format.h:144
VertexFormat(std::span< const VertexAttributeDescriptor >)
void clear()
Definition vertex_format.h:119
constexpr bool contains(I first, S last, const T &value, Proj proj={})
Definition ranges.h:18
Definition custom_decoration_generator.h:5
VertexAttribute
Definition vertex_attribute.h:9
std::optional< std::ranges::range_value_t< R > > find_or_nullopt(R &&r, const T &value, Proj proj={})
Definition algorithms.h:85
constexpr U to(T &&value)
Definition conversion.h:56