20 return std::string{ Util::StringFormat<string>(
"{}.{}", componentName,
Util::MakeXMLSafe(fieldName)).c_str() };
30 if (1u << i ==
to_base(compType))
57 , _componentType(type)
97 inputBuffer >> tempVer;
109 pt.put(_name.c_str(),
"");
113 auto entryName = GetFullFieldName(_name.c_str(), field._name);
114 if (!field._serialise)
137 pt.put(entryName +
".position.<xmlattr>.x", position.
x);
138 pt.put(entryName +
".position.<xmlattr>.y", position.
y);
139 pt.put(entryName +
".position.<xmlattr>.z", position.
z);
141 pt.put(entryName +
".orientation.<xmlattr>.x", orientationEuler.
pitch);
142 pt.put(entryName +
".orientation.<xmlattr>.y", orientationEuler.
yaw);
143 pt.put(entryName +
".orientation.<xmlattr>.z", orientationEuler.
roll);
145 pt.put(entryName +
".scale.<xmlattr>.x", scale.x);
146 pt.put(entryName +
".scale.<xmlattr>.y", scale.y);
147 pt.put(entryName +
".scale.<xmlattr>.z", scale.z);
163 pt.put(entryName +
".aabb.min.<xmlattr>.x", bb.
getMin().
x);
164 pt.put(entryName +
".aabb.min.<xmlattr>.y", bb.
getMin().
y);
165 pt.put(entryName +
".aabb.min.<xmlattr>.z", bb.
getMin().
z);
166 pt.put(entryName +
".aabb.max.<xmlattr>.x", bb.
getMax().
x);
167 pt.put(entryName +
".aabb.max.<xmlattr>.y", bb.
getMax().
y);
168 pt.put(entryName +
".aabb.max.<xmlattr>.z", bb.
getMax().
z);
179 pt.put(entryName +
".aabb.center.<xmlattr>.x", bs.
getCenter().
x);
180 pt.put(entryName +
".aabb.center.<xmlattr>.y", bs.
getCenter().
y);
181 pt.put(entryName +
".aabb.center.<xmlattr>.z", bs.
getCenter().
z);
182 pt.put(entryName +
".aabb.radius", bs.
getRadius());
190 if (!pt.get(_name.c_str(),
"").empty())
194 auto entryName = GetFullFieldName(_name.c_str(), field._name);
195 if (!field._serialise)
215 position.
set(pt.get<
F32>(entryName +
".position.<xmlattr>.x", 0.0f),
216 pt.get<
F32>(entryName +
".position.<xmlattr>.y", 0.0f),
217 pt.get<
F32>(entryName +
".position.<xmlattr>.z", 0.0f));
219 orientationEuler.
pitch = pt.get<
F32>(entryName +
".orientation.<xmlattr>.x", 0.0f);
220 orientationEuler.
yaw = pt.get<
F32>(entryName +
".orientation.<xmlattr>.y", 0.0f);
221 orientationEuler.
roll = pt.get<
F32>(entryName +
".orientation.<xmlattr>.z", 0.0f);
223 scale.set(pt.get<
F32>(entryName +
".scale.<xmlattr>.x", 1.0f),
224 pt.get<
F32>(entryName +
".scale.<xmlattr>.y", 1.0f),
225 pt.get<
F32>(entryName +
".scale.<xmlattr>.z", 1.0f));
250 pt.get<
F32>(entryName +
".aabb.min.<xmlattr>.x", -1.0f),
251 pt.get<
F32>(entryName +
".aabb.min.<xmlattr>.y", -1.0f),
252 pt.get<
F32>(entryName +
".aabb.min.<xmlattr>.z", -1.0f)
256 pt.get<
F32>(entryName +
".aabb.max.<xmlattr>.x", 1.0f),
257 pt.get<
F32>(entryName +
".aabb.max.<xmlattr>.y", 1.0f),
258 pt.get<
F32>(entryName +
".aabb.max.<xmlattr>.z", 1.0f)
271 pt.get<
F32>(entryName +
".aabb.center.<xmlattr>.x", 0.f),
272 pt.get<
F32>(entryName +
".aabb.center.<xmlattr>.y", 0.f),
273 pt.get<
F32>(entryName +
".aabb.center.<xmlattr>.z", 0.f)
275 bs.
setRadius(pt.get<
F32>(entryName +
".aabb.radius", 1.0f));
288 T val = pt.get(name, field.
get<T>());
297 template<
typename T,
size_t num_comp>
303 pt.put((entryName +
".<xmlattr>.x").c_str(), data.x);
304 pt.put((entryName +
".<xmlattr>.y").c_str(), data.y);
305 if constexpr (num_comp > 2)
307 pt.put((entryName +
".<xmlattr>.z").c_str(), data.z);
308 if constexpr(num_comp > 3)
310 pt.put((entryName +
".<xmlattr>.w").c_str(), data.w);
315 template<
typename T,
size_t num_comp>
318 T data = field.
get<T>();
320 data.x = pt.get((entryName +
".<xmlattr>.x").c_str(), data.x);
321 data.y = pt.get((entryName +
".<xmlattr>.y").c_str(), data.y);
323 if constexpr(num_comp > 2)
325 data.z = pt.get((entryName +
".<xmlattr>.z").c_str(), data.z);
326 if constexpr(num_comp > 3)
328 data.w = pt.get((entryName +
".<xmlattr>.w").c_str(), data.w);
334 using U =
decltype(data.x);
338 if constexpr(num_comp > 2)
341 if constexpr(num_comp > 3)
351 template<
typename T,
size_t num_rows>
357 pt.put((entryName +
".<xmlattr>.00").c_str(), data.m[0][0]);
358 pt.put((entryName +
".<xmlattr>.01").c_str(), data.m[0][1]);
359 pt.put((entryName +
".<xmlattr>.10").c_str(), data.m[1][0]);
360 pt.put((entryName +
".<xmlattr>.11").c_str(), data.m[1][1]);
362 if constexpr(num_rows > 2)
364 pt.put((entryName +
".<xmlattr>.02").c_str(), data.m[0][2]);
365 pt.put((entryName +
".<xmlattr>.12").c_str(), data.m[1][2]);
366 pt.put((entryName +
".<xmlattr>.20").c_str(), data.m[2][0]);
367 pt.put((entryName +
".<xmlattr>.21").c_str(), data.m[2][1]);
368 pt.put((entryName +
".<xmlattr>.22").c_str(), data.m[2][2]);
370 if constexpr(num_rows > 3)
372 pt.put((entryName +
".<xmlattr>.03").c_str(), data.m[0][3]);
373 pt.put((entryName +
".<xmlattr>.13").c_str(), data.m[1][3]);
374 pt.put((entryName +
".<xmlattr>.23").c_str(), data.m[2][3]);
375 pt.put((entryName +
".<xmlattr>.30").c_str(), data.m[3][0]);
376 pt.put((entryName +
".<xmlattr>.31").c_str(), data.m[3][1]);
377 pt.put((entryName +
".<xmlattr>.32").c_str(), data.m[3][2]);
378 pt.put((entryName +
".<xmlattr>.33").c_str(), data.m[3][3]);
383 template<
typename T,
size_t num_rows>
386 T data = field.
get<T>();
388 data.m[0][0] = pt.get((entryName +
".<xmlattr>.00").c_str(), data.m[0][0]);
389 data.m[0][1] = pt.get((entryName +
".<xmlattr>.01").c_str(), data.m[0][1]);
390 data.m[1][0] = pt.get((entryName +
".<xmlattr>.10").c_str(), data.m[1][0]);
391 data.m[1][1] = pt.get((entryName +
".<xmlattr>.11").c_str(), data.m[1][1]);
393 if constexpr(num_rows > 2)
395 data.m[0][2] = pt.get((entryName +
".<xmlattr>.02").c_str(), data.m[0][2]);
396 data.m[1][2] = pt.get((entryName +
".<xmlattr>.12").c_str(), data.m[1][2]);
397 data.m[2][0] = pt.get((entryName +
".<xmlattr>.20").c_str(), data.m[2][0]);
398 data.m[2][1] = pt.get((entryName +
".<xmlattr>.21").c_str(), data.m[2][1]);
399 data.m[2][2] = pt.get((entryName +
".<xmlattr>.22").c_str(), data.m[2][2]);
401 if constexpr(num_rows > 3)
403 data.m[0][3] = pt.get((entryName +
".<xmlattr>.03").c_str(), data.m[0][3]);
404 data.m[1][3] = pt.get((entryName +
".<xmlattr>.13").c_str(), data.m[1][3]);
405 data.m[2][3] = pt.get((entryName +
".<xmlattr>.23").c_str(), data.m[2][3]);
406 data.m[3][0] = pt.get((entryName +
".<xmlattr>.30").c_str(), data.m[3][0]);
407 data.m[3][1] = pt.get((entryName +
".<xmlattr>.31").c_str(), data.m[3][1]);
408 data.m[3][2] = pt.get((entryName +
".<xmlattr>.32").c_str(), data.m[3][2]);
409 data.m[3][3] = pt.get((entryName +
".<xmlattr>.33").c_str(), data.m[3][3]);
415 using U =
typename std::remove_reference<
decltype(T::mat[0])>::type;
416 for (
U8 i = 0u; i < num_rows * num_rows; ++i)
428 auto entryName = GetFullFieldName(_name.c_str(), field.
_name);
434 pt.put(entryName.c_str(), field.
get<
bool>());
460 pt.put(entryName.c_str(), field.
get<
F32>());
464 pt.put(entryName.c_str(), field.
get<
D64>());
472 saveVector<vec2<I64>, 2>(entryName, field, pt);
476 saveVector<vec2<I32>, 2>(entryName, field, pt);
480 saveVector<vec2<I16>, 2>(entryName, field, pt);
484 saveVector<vec2<I8>, 2>(entryName, field, pt);
495 saveVector<vec3<I64>, 3>(entryName, field, pt);
499 saveVector<vec3<I32>, 3>(entryName, field, pt);
503 saveVector<vec3<I16>, 3>(entryName, field, pt);
507 saveVector<vec3<I8>, 3>(entryName, field, pt);
518 saveVector<vec4<I64>, 4>(entryName, field, pt);
522 saveVector<vec4<I32>, 4>(entryName, field, pt);
526 saveVector<vec4<I16>, 4>(entryName, field, pt);
530 saveVector<vec4<I8>, 4>(entryName, field, pt);
541 saveVector<vec2<U64>, 2>(entryName, field, pt);
545 saveVector<vec2<U32>, 2>(entryName, field, pt);
549 saveVector<vec2<U16>, 2>(entryName, field, pt);
553 saveVector<vec2<U8>, 2>(entryName, field, pt);
564 saveVector<vec3<U64>, 3>(entryName, field, pt);
568 saveVector<vec3<U32>, 3>(entryName, field, pt);
572 saveVector<vec3<U16>, 3>(entryName, field, pt);
576 saveVector<vec3<U8>, 3>(entryName, field, pt);
587 saveVector<vec4<U64>, 4>(entryName, field, pt);
591 saveVector<vec4<U32>, 4>(entryName, field, pt);
595 saveVector<vec4<U16>, 4>(entryName, field, pt);
599 saveVector<vec4<U8>, 4>(entryName, field, pt);
606 saveVector<vec2<F32>, 2>(entryName, field, pt);
610 saveVector<vec3<F32>, 3>(entryName, field, pt);
614 saveVector<vec4<F32>, 4>(entryName, field, pt);
618 saveVector<vec2<D64>, 2>(entryName, field, pt);
622 saveVector<vec3<D64>, 3>(entryName, field, pt);
626 saveVector<vec4<D64>, 4>(entryName, field, pt);
633 saveMatrix<mat2<I64>, 2>(entryName, field, pt);
637 saveMatrix<mat2<I32>, 2>(entryName, field, pt);
641 saveMatrix<mat2<I16>, 2>(entryName, field, pt);
645 saveMatrix<mat2<I8>, 2>(entryName, field, pt);
656 saveMatrix<mat3<I64>, 3>(entryName, field, pt);
660 saveMatrix<mat3<I32>, 3>(entryName, field, pt);
664 saveMatrix<mat3<I16>, 3>(entryName, field, pt);
668 saveMatrix<mat3<I8>, 3>(entryName, field, pt);
679 saveMatrix<mat4<I64>, 4>(entryName, field, pt);
683 saveMatrix<mat4<I32>, 4>(entryName, field, pt);
687 saveMatrix<mat4<I16>, 4>(entryName, field, pt);
691 saveMatrix<mat4<I8>, 4>(entryName, field, pt);
702 saveMatrix<mat2<U64>, 2>(entryName, field, pt);
706 saveMatrix<mat2<U32>, 2>(entryName, field, pt);
710 saveMatrix<mat2<U16>, 2>(entryName, field, pt);
714 saveMatrix<mat2<U8>, 2>(entryName, field, pt);
725 saveMatrix<mat3<U64>, 3>(entryName, field, pt);
729 saveMatrix<mat3<U32>, 3>(entryName, field, pt);
733 saveMatrix<mat3<U16>, 3>(entryName, field, pt);
737 saveMatrix<mat3<U8>, 3>(entryName, field, pt);
748 saveMatrix<mat4<U64>, 4>(entryName, field, pt);
752 saveMatrix<mat4<U32>, 4>(entryName, field, pt);
756 saveMatrix<mat4<U16>, 4>(entryName, field, pt);
760 saveMatrix<mat4<U8>, 4>(entryName, field, pt);
767 saveMatrix<mat2<F32>, 2>(entryName, field, pt);
771 saveMatrix<mat3<F32>, 3>(entryName, field, pt);
775 saveMatrix<mat4<F32>, 4>(entryName, field, pt);
779 saveMatrix<mat2<D64>, 2>(entryName, field, pt);
783 saveMatrix<mat3<D64>, 3>(entryName, field, pt);
787 saveMatrix<mat4<D64>, 4>(entryName, field, pt);
793 pt.put((entryName +
".<xmlattr>.r").c_str(), data.
r);
794 pt.put((entryName +
".<xmlattr>.g").c_str(), data.
g);
795 pt.put((entryName +
".<xmlattr>.b").c_str(), data.
b);
801 pt.put((entryName +
".<xmlattr>.r").c_str(), data.
r);
802 pt.put((entryName +
".<xmlattr>.g").c_str(), data.
g);
803 pt.put((entryName +
".<xmlattr>.b").c_str(), data.
b);
804 pt.put((entryName +
".<xmlattr>.a").c_str(), data.
a);
812 auto entryName = GetFullFieldName(_name.c_str(), field.
_name);
818 bool val = pt.get(entryName.c_str(), field.
get<
bool>());
819 field.
set<
bool>(val);
845 field.
set<
F32>(GetClamped<F32>(field, pt, entryName.c_str()));
849 field.
set<
D64>(GetClamped<D64>(field, pt, entryName.c_str()));
925 loadVector<vec2<F32>, 2>(entryName, field, pt);
929 loadVector<vec3<F32>, 3>(entryName, field, pt);
933 loadVector<vec4<F32>, 4>(entryName, field, pt);
937 loadVector<vec2<D64>, 2>(entryName, field, pt);
941 loadVector<vec3<D64>, 3>(entryName, field, pt);
945 loadVector<vec4<D64>, 4>(entryName, field, pt);
1021 loadMatrix<mat2<F32>, 2>(entryName, field, pt);
1025 loadMatrix<mat3<F32>, 3>(entryName, field, pt);
1029 loadMatrix<mat4<F32>, 4>(entryName, field, pt);
1033 loadMatrix<mat2<D64>, 2>(entryName, field, pt);
1037 loadMatrix<mat3<D64>, 3>(entryName, field, pt);
1041 loadMatrix<mat4<D64>, 4>(entryName, field, pt);
1046 data.
set(pt.get((entryName +
".<xmlattr>.r").c_str(), data.
r),
1047 pt.get((entryName +
".<xmlattr>.g").c_str(), data.
g),
1048 pt.get((entryName +
".<xmlattr>.b").c_str(), data.
b));
1054 data.
set(pt.get((entryName +
".<xmlattr>.r").c_str(), data.
r),
1055 pt.get((entryName +
".<xmlattr>.g").c_str(), data.
g),
1056 pt.get((entryName +
".<xmlattr>.b").c_str(), data.
b),
1057 pt.get((entryName +
".<xmlattr>.a").c_str(), data.
a));
static void onRemoveComponent(const Editor &editor, const EditorComponent &comp)
void setMin(const vec3< F32 > &min) noexcept
const vec3< F32 > & getMax() const noexcept
const vec3< F32 > & getMin() const noexcept
void setMax(const vec3< F32 > &max) noexcept
const vec3< F32 > & getCenter() const noexcept
void setRadius(F32 radius) noexcept
F32 getRadius() const noexcept
void setCenter(const vec3< F32 > ¢er) noexcept
void saveToXML(boost::property_tree::ptree &pt) const
void loadFromXML(const boost::property_tree::ptree &pt)
~EditorComponent() override
bool loadCache(ByteBuffer &inputBuffer)
bool saveCache(ByteBuffer &outputBuffer) const
void saveFieldToXML(const EditorComponentField &field, boost::property_tree::ptree &pt) const
vector< EditorComponentField > _fields
DELEGATE< void, std::string_view > _onChangedCbk
void registerField(EditorComponentField &&field)
void loadFieldFromXML(EditorComponentField &field, const boost::property_tree::ptree &pt)
void onChanged(const EditorComponentField &field) const
EditorComponent(PlatformContext &context, ComponentType type, std::string_view name)
Utility class that adds basic GUID management to objects.
void loadFromXML(const std::string &entryName, const boost::property_tree::ptree &pt)
PlatformContext & context() noexcept
vec3< Angle::RADIANS< T > > getEuler() const noexcept
void fromEuler(const vec3< Angle::DEGREES< T > > &v) noexcept
void set(const T *v) noexcept
set the 3 components of the vector manually using a source pointer to a (large enough) array
void set(const T *v) noexcept
set the 4 components of the vector manually using a source pointer to a (large enough) array
constexpr DEGREES< T > to_DEGREES(RADIANS< T > angle) noexcept
constexpr bool ENABLE_EDITOR
static const char * componentType[]
ComponentType StringToComponentType(const std::string_view name)
const char * ComponentTypeToString(const ComponentType compType) noexcept
string MakeXMLSafe(std::string_view subject)
void loadVector(const std::string &entryName, EditorComponentField &field, const boost::property_tree::ptree &pt)
void saveMatrix(const std::string &entryName, const EditorComponentField &field, boost::property_tree::ptree &pt)
void saveVector(const std::string &entryName, const EditorComponentField &field, boost::property_tree::ptree &pt)
std::string GetFullFieldName(const char *componentName, const Str< 32 > &fieldName)
void loadMatrix(const std::string &entryName, EditorComponentField &field, const boost::property_tree::ptree &pt)
T GetClamped(const EditorComponentField &field, const boost::property_tree::ptree &pt, const char *name)
Handle console commands that start with a forward slash.
constexpr U32 to_U32(const T value)
constexpr U16 BYTE_BUFFER_VERSION
::value constexpr void CLAMP(T &n, T min, T max) noexcept
Clamps value n between min and max.
bool dvd_erase_if(eastl::vector< T, A > &vec, Predicate &&pred)
@ DROPDOWN_TYPE
Only U8 types supported!
constexpr auto to_base(const Type value) -> Type
void set(const T &dataIn)
vec2< F32 > _range
Used by slider_type as a min / max range or dropdown as selected_index / count.
PushConstantType _basicType
PushConstantSize _basicTypeSize
EditorComponentFieldType _type