15 #include <vsg/core/Data.h>
16 #include <vsg/core/type_name.h>
18 #include <vsg/maths/box.h>
19 #include <vsg/maths/mat3.h>
20 #include <vsg/maths/mat4.h>
21 #include <vsg/maths/quat.h>
22 #include <vsg/maths/sphere.h>
23 #include <vsg/maths/vec2.h>
24 #include <vsg/maths/vec3.h>
25 #include <vsg/maths/vec4.h>
27 #include <vsg/io/Input.h>
28 #include <vsg/io/Output.h>
30 #define VSG_value(N, T) \
33 constexpr const char* type_name<N>() noexcept { return "vsg::" #N; }
46 Data(rhs), _value(rhs._value) {
dirty(); }
47 explicit Value(
const value_type& in_value) :
48 _value(in_value) {
dirty(); }
50 template<
typename... Args>
51 explicit Value(Args&&... args) :
52 _value(args...) {
dirty(); }
54 template<
typename... Args>
60 std::size_t sizeofObject()
const noexcept
override {
return sizeof(
Value); }
61 const char* className()
const noexcept
override {
return type_name<Value>(); }
62 const std::type_info&
type_info() const noexcept
override {
return typeid(*this); }
63 bool is_compatible(
const std::type_info& type)
const noexcept
override {
return typeid(
Value) == type || Data::is_compatible(type); }
66 void accept(Visitor& visitor)
override;
67 void accept(ConstVisitor& visitor)
const override;
69 void read(Input& input)
override
72 if (input.version_greater_equal(0, 6, 1))
73 input.read(
"value", _value);
75 input.read(
"Value", _value);
79 void write(Output& output)
const override
82 if (output.version_greater_equal(0, 6, 1))
83 output.write(
"value", _value);
85 output.write(
"Value", _value);
88 std::size_t valueSize()
const override {
return sizeof(value_type); }
89 std::size_t valueCount()
const override {
return 1; }
91 bool dataAvailable()
const override {
return true; }
92 std::size_t dataSize()
const override {
return sizeof(value_type); }
94 void* dataPointer()
override {
return &_value; }
95 const void* dataPointer()
const override {
return &_value; }
97 void* dataPointer(
size_t)
override {
return &_value; }
98 const void* dataPointer(
size_t)
const override {
return &_value; }
100 void* dataRelease()
override {
return nullptr; }
102 std::uint32_t dimensions()
const override {
return 0; }
104 std::uint32_t width()
const override {
return 1; }
105 std::uint32_t height()
const override {
return 1; }
106 std::uint32_t depth()
const override {
return 1; }
108 Value& operator=(
const Value& rhs)
113 Value& operator=(
const value_type& rhs)
119 operator value_type&() {
return _value; }
120 operator const value_type&()
const {
return _value; }
122 value_type& value() {
return _value; }
123 const value_type& value()
const {
return _value; }
125 void set(
const value_type& value) { _value = value; }
146 if (
object && (
typeid(*
object) ==
typeid(ValueT)))
148 const ValueT* vo =
static_cast<const ValueT*
>(
getObject(key));
161 template<
typename T,
typename... Args>
162 T value(T defaultValue,
const std::string& match, Args&&... args)
165 ((args && args->getValue(match, v)) || ...);
169 VSG_value(stringValue, std::string);
170 VSG_value(boolValue,
bool);
171 VSG_value(intValue,
int);
172 VSG_value(uintValue,
unsigned int);
173 VSG_value(floatValue,
float);
174 VSG_value(doubleValue,
double);
176 VSG_value(vec2Value, vec2);
177 VSG_value(vec3Value, vec3);
178 VSG_value(vec4Value, vec4);
180 VSG_value(dvec2Value, dvec2);
181 VSG_value(dvec3Value, dvec3);
182 VSG_value(dvec4Value, dvec4);
184 VSG_value(bvec2Value, bvec2);
185 VSG_value(bvec3Value, bvec3);
186 VSG_value(bvec4Value, bvec4);
188 VSG_value(ubvec2Value, ubvec2);
189 VSG_value(ubvec3Value, ubvec3);
190 VSG_value(ubvec4Value, ubvec4);
192 VSG_value(svec2Value, svec2);
193 VSG_value(svec3Value, svec3);
194 VSG_value(svec4Value, svec4);
196 VSG_value(usvec2Value, usvec2);
197 VSG_value(usvec3Value, usvec3);
198 VSG_value(usvec4Value, usvec4);
200 VSG_value(ivec2Value, ivec2);
201 VSG_value(ivec3Value, ivec3);
202 VSG_value(ivec4Value, ivec4);
204 VSG_value(uivec2Value, uivec2);
205 VSG_value(uivec3Value, uivec3);
206 VSG_value(uivec4Value, uivec4);
208 VSG_value(mat3Value, mat3);
209 VSG_value(dmat3Value, dmat3);
211 VSG_value(mat4Value, mat4);
212 VSG_value(dmat4Value, dmat4);
214 VSG_value(quatValue, quat);
215 VSG_value(dquatValue, dquat);
217 VSG_value(sphereValue, sphere);
218 VSG_value(dsphereValue, dsphere);
220 VSG_value(boxValue, box);
221 VSG_value(dboxValue, dbox);
void dirty()
increment the ModifiedCount to signify the data has been modified
Definition: Data.h:206
void setObject(const std::string &key, ref_ptr< Object > object)
assign an Object associated with key
bool getValue(const std::string &key, T &value) const
get specified value type, return false if value associated with key is not assigned or is not the cor...
Definition: Value.h:142
void setValue(const std::string &key, const T &value)
Definition: Value.h:135
Object * getObject(const std::string &key)
get Object pointer associated with key, return nullptr if no object associated with key has been assi...
const std::type_info & type_info() const noexcept override
return the std::type_info of this Object
Definition: Value.h:62