MaterialX 1.38.2
Unit.h
Go to the documentation of this file.
1//
2// TM & (c) 2019 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd.
3// All rights reserved. See LICENSE.txt for license.
4//
5
6#ifndef MATERIALX_UNIT_H_
7#define MATERIALX_UNIT_H_
8
11
13
16
17namespace MaterialX
18{
19
20class UnitConverter;
21class LinearUnitConverter;
22class UnitConverterRegistry;
23
25using UnitConverterPtr = shared_ptr<UnitConverter>;
27using ConstUnitConverterPtr = shared_ptr<const UnitConverter>;
28
30using LinearUnitConverterPtr = shared_ptr<LinearUnitConverter>;
32using ConstLinearUnitConverterPtr = shared_ptr<const LinearUnitConverter>;
33
35using UnitConverterRegistryPtr = shared_ptr<UnitConverterRegistry>;
37using ConstUnitConverterRegistryPtr = shared_ptr<const UnitConverterRegistry>;
38
42class MX_CORE_API UnitConverter
43{
44 public:
45 UnitConverter() { }
46 virtual ~UnitConverter() { }
47
52 virtual float convert(float input, const string& inputUnit, const string& outputUnit) const = 0;
53
56 virtual int getUnitAsInteger(const string&) const { return -1; }
57
60 virtual string getUnitFromInteger(int) const { return EMPTY_STRING; }
61
66 virtual Vector2 convert(const Vector2& input, const string& inputUnit, const string& outputUnit) const = 0;
67
72 virtual Vector3 convert(const Vector3& input, const string& inputUnit, const string& outputUnit) const = 0;
73
78 virtual Vector4 convert(const Vector4& input, const string& inputUnit, const string& outputUnit) const = 0;
79
81 virtual void write(DocumentPtr doc) const = 0;
82};
83
86class MX_CORE_API LinearUnitConverter : public UnitConverter
87{
88 public:
89 virtual ~LinearUnitConverter() { }
90
93
95 const string& getUnitType() const
96 {
97 return _unitType;
98 }
99
101 void write(DocumentPtr doc) const override;
102
105
108 const std::unordered_map<string, float>& getUnitScale() const
109 {
110 return _unitScale;
111 }
112
116 float conversionRatio(const string& inputUnit, const string& outputUnit) const;
117
122 float convert(float input, const string& inputUnit, const string& outputUnit) const override;
123
128 Vector2 convert(const Vector2& input, const string& inputUnit, const string& outputUnit) const override;
129
134 Vector3 convert(const Vector3& input, const string& inputUnit, const string& outputUnit) const override;
135
140 Vector4 convert(const Vector4& input, const string& inputUnit, const string& outputUnit) const override;
141
145
148 int getUnitAsInteger(const string& unitName) const override;
149
152 virtual string getUnitFromInteger(int index) const override;
153
155
156 private:
158
159 private:
160 std::unordered_map<string, float> _unitScale;
161 std::unordered_map<string, int> _unitEnumeration;
162 string _unitType;
163};
164
166using UnitConverterPtrMap = std::unordered_map<string, UnitConverterPtr>;
167
170class MX_CORE_API UnitConverterRegistry
171{
172 public:
173 virtual ~UnitConverterRegistry() { }
174
176 static UnitConverterRegistryPtr create();
177
180 bool addUnitConverter(UnitTypeDefPtr def, UnitConverterPtr converter);
181
184 bool removeUnitConverter(UnitTypeDefPtr def);
185
188 UnitConverterPtr getUnitConverter(UnitTypeDefPtr def);
189
191 void clearUnitConverters();
192
195 int getUnitAsInteger(const string& unitName) const;
196
198 void write(DocumentPtr doc) const;
199
200 private:
203
204 UnitConverterRegistry& operator=(const UnitConverterRegistry&) = delete;
205
206 private:
207 UnitConverterPtrMap _unitConverters;
208};
209
210} // namespace MaterialX
211
212#endif
Definition element subclasses.
shared_ptr< UnitTypeDef > UnitTypeDefPtr
A shared pointer to a UnitTypeDef.
Definition: Definition.h:68
The top-level Document class.
shared_ptr< Document > DocumentPtr
A shared pointer to a Document.
Definition: Document.h:23
Import and export declarations for the Core library.
shared_ptr< const LinearUnitConverter > ConstLinearUnitConverterPtr
A shared pointer to a const LinearUnitConverter.
Definition: Unit.h:32
shared_ptr< UnitConverter > UnitConverterPtr
A shared pointer to a UnitConverter.
Definition: Unit.h:25
shared_ptr< const UnitConverterRegistry > ConstUnitConverterRegistryPtr
A shared pointer to a const UnitConverterRegistry.
Definition: Unit.h:37
shared_ptr< const UnitConverter > ConstUnitConverterPtr
A shared pointer to a const UnitConverter.
Definition: Unit.h:27
shared_ptr< UnitConverterRegistry > UnitConverterRegistryPtr
A shared pointer to a UnitConverterRegistry.
Definition: Unit.h:35
std::unordered_map< string, UnitConverterPtr > UnitConverterPtrMap
Map of unit converters.
Definition: Unit.h:166
shared_ptr< LinearUnitConverter > LinearUnitConverterPtr
A shared pointer to a LinearUnitConverter.
Definition: Unit.h:30
A converter class for linear units that require only a scalar multiplication.
Definition: Unit.h:87
const string & getUnitType() const
Return the unit type string.
Definition: Unit.h:95
const std::unordered_map< string, float > & getUnitScale() const
Return the mappings from unit names to the scale value defined by a linear converter.
Definition: Unit.h:108
An abstract base class for unit converters.
Definition: Unit.h:43
virtual string getUnitFromInteger(int) const
Given an integer index return the unit name in the map used by the converter Returns Empty string if ...
Definition: Unit.h:60
virtual Vector3 convert(const Vector3 &input, const string &inputUnit, const string &outputUnit) const =0
Convert a given value in a given unit to a desired unit.
virtual float convert(float input, const string &inputUnit, const string &outputUnit) const =0
Convert a given value in a given unit to a desired unit.
virtual int getUnitAsInteger(const string &) const
Given a unit name return a value that it can map to as an integer Returns -1 value if not found.
Definition: Unit.h:56
virtual Vector4 convert(const Vector4 &input, const string &inputUnit, const string &outputUnit) const =0
Convert a given value in a given unit to a desired unit.
virtual Vector2 convert(const Vector2 &input, const string &inputUnit, const string &outputUnit) const =0
Convert a given value in a given unit to a desired unit.
virtual void write(DocumentPtr doc) const =0
Create unit definitions in a document based on the converter.
A registry for unit converters.
Definition: Unit.h:171
A unit definition element within a Document.
Definition: Definition.h:427
A vector of two floating-point values.
Definition: Types.h:284
A vector of three floating-point values.
Definition: Types.h:303
A vector of four floating-point values.
Definition: Types.h:324