15 #include <vsg/core/Data.h>
17 #include <vsg/maths/mat4.h>
18 #include <vsg/maths/vec2.h>
19 #include <vsg/maths/vec3.h>
20 #include <vsg/maths/vec4.h>
22 #include <vsg/io/Input.h>
23 #include <vsg/io/Output.h>
25 #define VSG_array(N, T) \
28 constexpr const char* type_name<N>() noexcept { return "vsg::" #N; }
52 _data = _allocate(_size);
54 for (
auto& v : rhs) *(dest_v++) = v;
60 Data(in_properties,
sizeof(value_type)),
61 _data(_allocate(numElements)),
62 _size(numElements) {
dirty(); }
64 Array(uint32_t numElements, value_type* data,
Properties in_properties = {}) :
65 Data(in_properties,
sizeof(value_type)),
67 _size(numElements) {
dirty(); }
69 Array(uint32_t numElements,
const value_type& value,
Properties in_properties = {}) :
70 Data(in_properties,
sizeof(value_type)),
71 _data(_allocate(numElements)),
74 for (
auto& v : *
this) v = value;
83 assign(data, offset, stride, numElements, in_properties);
86 explicit Array(std::initializer_list<value_type> l) :
87 _data(_allocate(l.size())),
88 _size(
static_cast<uint32_t
>(l.size()))
93 for (
const value_type& v : l) { (*itr++) = v; }
98 explicit Array(
ref_ptr<Data> data, uint32_t offset, uint32_t stride, std::initializer_list<value_type> l) :
102 assign(data, offset, stride, l.size());
105 for (
const value_type& v : l) { (*itr++) = v; }
110 template<
typename... Args>
126 std::size_t sizeofObject()
const noexcept
override {
return sizeof(
Array); }
127 const char* className()
const noexcept
override {
return type_name<Array>(); }
128 const std::type_info&
type_info() const noexcept
override {
return typeid(*this); }
129 bool is_compatible(
const std::type_info& type)
const noexcept
override {
return typeid(
Array) == type || Data::is_compatible(type); }
132 void accept(Visitor& visitor)
override;
133 void accept(ConstVisitor& visitor)
const override;
135 void read(Input& input)
override
137 std::size_t original_total_size = size();
141 uint32_t width_size = input.readValue<uint32_t>(
"size");
143 if (
auto data_storage = input.readObject<Data>(
"storage"))
145 uint32_t offset = input.readValue<uint32_t>(
"offset");
150 if (input.matchPropertyName(
"data"))
152 std::size_t new_total_size = computeValueCountIncludingMipmaps(width_size, 1, 1,
properties.maxNumMipmaps);
156 if (original_total_size != new_total_size)
160 _data = _allocate(new_total_size);
165 _data = _allocate(new_total_size);
172 if (_data) input.read(new_total_size, _data);
178 void write(Output& output)
const override
182 output.writeValue<uint32_t>(
"size", _size);
183 output.writeObject(
"storage", _storage);
186 auto offset = (
reinterpret_cast<uintptr_t
>(_data) -
reinterpret_cast<uintptr_t
>(_storage->dataPointer()));
187 output.writeValue<uint32_t>(
"offset", offset);
191 output.writePropertyName(
"data");
192 output.write(size(), _data);
193 output.writeEndOfLine();
196 std::size_t size()
const {
return (
properties.maxNumMipmaps <= 1) ? _size : computeValueCountIncludingMipmaps(_size, 1, 1,
properties.maxNumMipmaps); }
198 bool available()
const {
return _data !=
nullptr; }
199 bool empty()
const {
return _data ==
nullptr; }
210 Array& operator=(
const Array& rhs)
212 if (&rhs ==
this)
return *
this;
221 _data = _allocate(_size);
223 for (
auto& v : rhs) *(dest_v++) = v;
231 void assign(uint32_t numElements, value_type* data, Properties in_properties = {})
244 void assign(ref_ptr<Data> storage, uint32_t offset, uint32_t stride, uint32_t numElements, Properties in_properties = {})
251 if (_storage && _storage->dataPointer())
253 _data =
reinterpret_cast<value_type*
>(
reinterpret_cast<uint8_t*
>(_storage->dataPointer()) + offset);
267 void* dataRelease()
override
282 std::size_t valueSize()
const override {
return sizeof(value_type); }
283 std::size_t valueCount()
const override {
return size(); }
285 bool dataAvailable()
const override {
return available(); }
286 std::size_t dataSize()
const override {
return size() *
properties.stride; }
288 void* dataPointer()
override {
return _data; }
289 const void* dataPointer()
const override {
return _data; }
291 void* dataPointer(std::size_t i)
override {
return data(i); }
292 const void* dataPointer(std::size_t i)
const override {
return data(i); }
294 uint32_t dimensions()
const override {
return 1; }
296 uint32_t width()
const override {
return _size; }
297 uint32_t height()
const override {
return 1; }
298 uint32_t depth()
const override {
return 1; }
300 value_type* data() {
return _data; }
301 const value_type* data()
const {
return _data; }
303 inline value_type* data(std::size_t i) {
return reinterpret_cast<value_type*
>(
reinterpret_cast<uint8_t*
>(_data) + i *
properties.stride); }
304 inline const value_type* data(std::size_t i)
const {
return reinterpret_cast<const value_type*
>(
reinterpret_cast<const uint8_t*
>(_data) + i *
properties.stride); }
306 value_type& operator[](std::size_t i) {
return *data(i); }
307 const value_type& operator[](std::size_t i)
const {
return *data(i); }
309 value_type& at(std::size_t i) {
return *data(i); }
310 const value_type& at(std::size_t i)
const {
return *data(i); }
312 void set(std::size_t i,
const value_type& v) { *data(i) = v; }
314 Data* storage() {
return _storage; }
315 const Data* storage()
const {
return _storage; }
317 iterator begin() {
return iterator{_data,
properties.stride}; }
318 const_iterator begin()
const {
return const_iterator{_data,
properties.stride}; }
320 iterator end() {
return iterator{data(_size),
properties.stride}; }
321 const_iterator end()
const {
return const_iterator{data(_size),
properties.stride}; }
329 value_type* _allocate(
size_t size)
const
334 return new value_type[size];
336 return new (std::malloc(
sizeof(value_type) * size)) value_type[size];
338 return new (vsg::allocate(
sizeof(value_type) * size, ALLOCATOR_AFFINITY_DATA)) value_type[size];
343 if (!_storage && _data)
350 vsg::deallocate(_data);
357 ref_ptr<Data> _storage;
360 VSG_array(byteArray, int8_t);
361 VSG_array(ubyteArray, uint8_t);
362 VSG_array(shortArray, int16_t);
363 VSG_array(ushortArray, uint16_t);
364 VSG_array(intArray, int32_t);
365 VSG_array(uintArray, uint32_t);
366 VSG_array(floatArray,
float);
367 VSG_array(doubleArray,
double);
369 VSG_array(vec2Array, vec2);
370 VSG_array(vec3Array, vec3);
371 VSG_array(vec4Array, vec4);
373 VSG_array(dvec2Array, dvec2);
374 VSG_array(dvec3Array, dvec3);
375 VSG_array(dvec4Array, dvec4);
377 VSG_array(bvec2Array, bvec2);
378 VSG_array(bvec3Array, bvec3);
379 VSG_array(bvec4Array, bvec4);
381 VSG_array(ubvec2Array, ubvec2);
382 VSG_array(ubvec3Array, ubvec3);
383 VSG_array(ubvec4Array, ubvec4);
385 VSG_array(svec2Array, svec2);
386 VSG_array(svec3Array, svec3);
387 VSG_array(svec4Array, svec4);
389 VSG_array(usvec2Array, usvec2);
390 VSG_array(usvec3Array, usvec3);
391 VSG_array(usvec4Array, usvec4);
393 VSG_array(ivec2Array, ivec2);
394 VSG_array(ivec3Array, ivec3);
395 VSG_array(ivec4Array, ivec4);
397 VSG_array(uivec2Array, uivec2);
398 VSG_array(uivec3Array, uivec3);
399 VSG_array(uivec4Array, uivec4);
401 VSG_array(mat4Array, mat4);
402 VSG_array(dmat4Array, dmat4);
404 VSG_array(block64Array, block64);
405 VSG_array(block128Array, block128);
const std::type_info & type_info() const noexcept override
return the std::type_info of this Object
Definition: Array.h:128
Properties properties
properties of the data such as format, origin, stride, dataVariance etc.
Definition: Data.h:173
void dirty()
increment the ModifiedCount to signify the data has been modified
Definition: Data.h:206
AllocatorType allocatorType
hint as how the data values may change during the lifetime of the vsg::Data.
Definition: Data.h:125