15 #include <vsg/core/Data.h>
16 #include <vsg/core/Object.h>
17 #include <vsg/core/Version.h>
19 #include <vsg/maths/box.h>
20 #include <vsg/maths/mat3.h>
21 #include <vsg/maths/mat4.h>
22 #include <vsg/maths/plane.h>
23 #include <vsg/maths/quat.h>
24 #include <vsg/maths/sphere.h>
25 #include <vsg/maths/vec2.h>
26 #include <vsg/maths/vec3.h>
27 #include <vsg/maths/vec4.h>
29 #include <vsg/io/FileSystem.h>
30 #include <vsg/io/ObjectFactory.h>
33 #include <unordered_map>
54 virtual void read(
size_t num, int8_t* value) = 0;
55 virtual void read(
size_t num, uint8_t* value) = 0;
56 virtual void read(
size_t num, int16_t* value) = 0;
57 virtual void read(
size_t num, uint16_t* value) = 0;
58 virtual void read(
size_t num, int32_t* value) = 0;
59 virtual void read(
size_t num, uint32_t* value) = 0;
60 virtual void read(
size_t num, int64_t* value) = 0;
61 virtual void read(
size_t num, uint64_t* value) = 0;
62 virtual void read(
size_t num,
float* value) = 0;
63 virtual void read(
size_t num,
double* value) = 0;
64 virtual void read(
size_t num, std::string* value) = 0;
65 virtual void read(
size_t num, std::wstring* value) = 0;
66 virtual void read(
size_t num,
Path* value) = 0;
72 void read(
size_t num,
char* value) { read(num,
reinterpret_cast<int8_t*
>(value)); }
73 void read(
size_t num,
bool* value) { read(num,
reinterpret_cast<int8_t*
>(value)); }
76 void read(
size_t num, vec2* value) { read(num * value->size(), value->data()); }
77 void read(
size_t num, vec3* value) { read(num * value->size(), value->data()); }
78 void read(
size_t num, vec4* value) { read(num * value->size(), value->data()); }
79 void read(
size_t num, dvec2* value) { read(num * value->size(), value->data()); }
80 void read(
size_t num, dvec3* value) { read(num * value->size(), value->data()); }
81 void read(
size_t num, dvec4* value) { read(num * value->size(), value->data()); }
82 void read(
size_t num, bvec2* value) { read(num * value->size(), value->data()); }
83 void read(
size_t num, bvec3* value) { read(num * value->size(), value->data()); }
84 void read(
size_t num, bvec4* value) { read(num * value->size(), value->data()); }
85 void read(
size_t num, ubvec2* value) { read(num * value->size(), value->data()); }
86 void read(
size_t num, ubvec3* value) { read(num * value->size(), value->data()); }
87 void read(
size_t num, ubvec4* value) { read(num * value->size(), value->data()); }
88 void read(
size_t num, svec2* value) { read(num * value->size(), value->data()); }
89 void read(
size_t num, svec3* value) { read(num * value->size(), value->data()); }
90 void read(
size_t num, svec4* value) { read(num * value->size(), value->data()); }
91 void read(
size_t num, usvec2* value) { read(num * value->size(), value->data()); }
92 void read(
size_t num, usvec3* value) { read(num * value->size(), value->data()); }
93 void read(
size_t num, usvec4* value) { read(num * value->size(), value->data()); }
94 void read(
size_t num, ivec2* value) { read(num * value->size(), value->data()); }
95 void read(
size_t num, ivec3* value) { read(num * value->size(), value->data()); }
96 void read(
size_t num, ivec4* value) { read(num * value->size(), value->data()); }
97 void read(
size_t num, uivec2* value) { read(num * value->size(), value->data()); }
98 void read(
size_t num, uivec3* value) { read(num * value->size(), value->data()); }
99 void read(
size_t num, uivec4* value) { read(num * value->size(), value->data()); }
100 void read(
size_t num, quat* value) { read(num * value->size(), value->data()); }
101 void read(
size_t num, dquat* value) { read(num * value->size(), value->data()); }
102 void read(
size_t num, mat3* value) { read(num * value->size(), value->data()); }
103 void read(
size_t num, dmat3* value) { read(num * value->size(), value->data()); }
104 void read(
size_t num, mat4* value) { read(num * value->size(), value->data()); }
105 void read(
size_t num, dmat4* value) { read(num * value->size(), value->data()); }
106 void read(
size_t num, sphere* value) { read(num * value->size(), value->data()); }
107 void read(
size_t num, dsphere* value) { read(num * value->size(), value->data()); }
108 void read(
size_t num, box* value) { read(num * value->size(), value->data()); }
109 void read(
size_t num, dbox* value) { read(num * value->size(), value->data()); }
110 void read(
size_t num, plane* value) { read(num * value->size(), value->data()); }
111 void read(
size_t num, dplane* value) { read(num * value->size(), value->data()); }
115 void read(
size_t num, T* value)
117 if constexpr (has_read_write<T>())
119 for (
size_t i = 0; i < num; ++i) value[i].read(*
this);
123 read(num *
sizeof(T),
reinterpret_cast<uint8_t*
>(value));
128 void read(
const char* propertyName,
ref_ptr<T>& arg)
130 if (!matchPropertyName(propertyName))
return;
131 arg = read().cast<T>();
135 void readObjects(
const char* propertyName, T& values)
137 if (!matchPropertyName(propertyName))
return;
139 uint32_t numElements = 0;
140 read(1, &numElements);
141 values.resize(numElements);
143 using element_type =
typename T::value_type::element_type;
144 const char* element_name = type_name<element_type>();
146 for (uint32_t i = 0; i < numElements; ++i)
148 read(element_name, values[i]);
153 void readValues(
const char* propertyName, std::vector<T>& values)
155 if (!matchPropertyName(propertyName))
return;
157 uint32_t numElements = 0;
158 read(1, &numElements);
159 values.resize(numElements);
161 for (uint32_t i = 0; i < numElements; ++i)
163 read(
"element", values[i]);
168 void readValues(
const char* propertyName, std::set<T>& values)
170 if (!matchPropertyName(propertyName))
return;
172 uint32_t numElements = 0;
173 read(1, &numElements);
175 for (uint32_t i = 0; i < numElements; ++i)
184 template<
typename... Args>
185 void read(
const char* propertyName, Args&... args)
187 if (!matchPropertyName(propertyName))
return;
190 (read(1, &(args)), ...);
205 if (!matchPropertyName(propertyName))
return ref_ptr<T>();
208 return ref_ptr<T>(
dynamic_cast<T*
>(
object.get()));
215 if (!matchPropertyName(propertyName))
return;
217 arg = read().cast<T>();
225 read(propertyName, v);
230 template<
typename W,
typename T>
234 read(propertyName, read_value);
235 value =
static_cast<T
>(read_value);
238 using ObjectID = uint32_t;
239 using ObjectIDMap = std::map<ObjectID, ref_ptr<Object>>;
241 ObjectIDMap objectIDMap;
248 virtual bool version_less(uint32_t major, uint32_t minor, uint32_t patch, uint32_t soversion = 0)
const;
249 virtual bool version_greater_equal(uint32_t major, uint32_t minor, uint32_t patch, uint32_t soversion = 0)
const;