@@ -103,6 +103,58 @@ class IGeometryBase : public virtual core::IReferenceCounted
103
103
// using `nbl::hlsl::` concepts instead of `std::` so that `nbl::hlsl::float16_t` can be used
104
104
union SAABBStorage
105
105
{
106
+ template <typename Visitor>
107
+ inline void visit (const EAABBFormat format, Visitor&& visitor)
108
+ {
109
+ switch (format)
110
+ {
111
+ case EAABBFormat::F64:
112
+ visitor (f64 );
113
+ break ;
114
+ case EAABBFormat::U64:
115
+ visitor (u64 );
116
+ break ;
117
+ case EAABBFormat::S64:
118
+ visitor (s64);
119
+ break ;
120
+ case EAABBFormat::F32:
121
+ visitor (f32 );
122
+ break ;
123
+ case EAABBFormat::U32:
124
+ visitor (u32 );
125
+ break ;
126
+ case EAABBFormat::S32:
127
+ visitor (s32);
128
+ break ;
129
+ case EAABBFormat::F16:
130
+ visitor (f16 );
131
+ break ;
132
+ case EAABBFormat::U16: [[fallthrough]];
133
+ case EAABBFormat::U16_NORM:
134
+ visitor (u16 );
135
+ break ;
136
+ case EAABBFormat::S16: [[fallthrough]];
137
+ case EAABBFormat::S16_NORM:
138
+ visitor (s16);
139
+ break ;
140
+ case EAABBFormat::U8: [[fallthrough]];
141
+ case EAABBFormat::U8_NORM:
142
+ visitor (u8 );
143
+ break ;
144
+ case EAABBFormat::S8: [[fallthrough]];
145
+ case EAABBFormat::S8_NORM:
146
+ visitor (s8);
147
+ break ;
148
+ default :
149
+ break ;
150
+ }
151
+ }
152
+ template <typename Visitor>
153
+ inline void visit (const EAABBFormat format, Visitor&& visitor) const
154
+ {
155
+ const_cast <SAABBStorage*>(this )->visit (format,std::forward<Visitor>(visitor));
156
+ }
157
+
106
158
hlsl::shapes::AABB<4 ,hlsl::float64_t > f64 = hlsl::shapes::AABB<4 ,hlsl::float64_t >::create ();
107
159
hlsl::shapes::AABB<4 ,uint64_t > u64 ;
108
160
hlsl::shapes::AABB<4 ,int64_t > s64;
@@ -154,57 +206,9 @@ class IGeometryBase : public virtual core::IReferenceCounted
154
206
155
207
//
156
208
template <typename Visitor>
157
- inline void visitAABB (Visitor& visitor)
158
- {
159
- switch (rangeFormat)
160
- {
161
- case EAABBFormat::F64:
162
- visitor (encodedDataRange.f64 );
163
- break ;
164
- case EAABBFormat::U64:
165
- visitor (encodedDataRange.u64 );
166
- break ;
167
- case EAABBFormat::S64:
168
- visitor (encodedDataRange.s64 );
169
- break ;
170
- case EAABBFormat::F32:
171
- visitor (encodedDataRange.f32 );
172
- break ;
173
- case EAABBFormat::U32:
174
- visitor (encodedDataRange.u32 );
175
- break ;
176
- case EAABBFormat::S32:
177
- visitor (encodedDataRange.s32 );
178
- break ;
179
- case EAABBFormat::F16:
180
- visitor (encodedDataRange.f16 );
181
- break ;
182
- case EAABBFormat::U16: [[fallthrough]];
183
- case EAABBFormat::U16_NORM:
184
- visitor (encodedDataRange.u16 );
185
- break ;
186
- case EAABBFormat::S16: [[fallthrough]];
187
- case EAABBFormat::S16_NORM:
188
- visitor (encodedDataRange.s16 );
189
- break ;
190
- case EAABBFormat::U8: [[fallthrough]];
191
- case EAABBFormat::U8_NORM:
192
- visitor (encodedDataRange.u8 );
193
- break ;
194
- case EAABBFormat::S8: [[fallthrough]];
195
- case EAABBFormat::S8_NORM:
196
- visitor (encodedDataRange.s8 );
197
- break ;
198
- default :
199
- break ;
200
- }
201
- }
209
+ inline void visitAABB (Visitor&& visitor) {encodedDataRange.visit (rangeFormat,std::forward<Visitor>(visitor));}
202
210
template <typename Visitor>
203
- inline void visitAABB (const Visitor& visitor) const
204
- {
205
- auto tmp = [&visitor](const auto & aabb)->void {visitor (aabb);};
206
- const_cast <typename std::decay_t <decltype (*this )>*>(this )->visitAABB (tmp);
207
- }
211
+ inline void visitAABB (Visitor&& visitor) const {encodedDataRange.visit (rangeFormat,std::forward<Visitor>(visitor));}
208
212
209
213
//
210
214
inline void resetRange (const EAABBFormat newFormat)
@@ -240,7 +244,13 @@ class IGeometryBase : public virtual core::IReferenceCounted
240
244
EAABBFormat rangeFormat : int (EAABBFormat::BitCount) = EAABBFormat::F64;
241
245
};
242
246
247
+ virtual EAABBFormat getAABBFormat () const = 0;
243
248
virtual const SAABBStorage& getAABB () const = 0;
249
+ template <typename Visitor>
250
+ inline void visitAABB (Visitor&& visitor) const
251
+ {
252
+ getAABB ().visit (getAABBFormat (),std::forward<Visitor>(visitor));
253
+ }
244
254
245
255
protected:
246
256
virtual inline ~IGeometryBase () = default ;
@@ -276,7 +286,7 @@ class IGeometry : public std::conditional_t<std::is_same_v<BufferType,ICPUBuffer
276
286
explicit inline operator SBufferBinding<const BufferType>() const
277
287
{
278
288
if (*this )
279
- return {.offset =src.offset ,.buffer =smart_refctd_ptr (src.buffer )};
289
+ return {.offset =src.offset ,.buffer =core:: smart_refctd_ptr (src.buffer )};
280
290
return {};
281
291
}
282
292
0 commit comments