Skip to content

Commit d612e96

Browse files
committed
add cast getter to polymorphic properties, simplify spline data reading
1 parent 87ca1ad commit d612e96

6 files changed

Lines changed: 64 additions & 27 deletions

File tree

libsave/include/SatisfactorySave/GameTypes/Properties/ArrayProperty.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include <concepts>
4+
35
#include "../Arrays/Base/Array.h"
46
#include "Base/PropertyImpl.h"
57

@@ -16,5 +18,13 @@ namespace SatisfactorySave {
1618
[[nodiscard]] inline FName& ArrayType() {
1719
return tag_.InnerType;
1820
}
21+
22+
template<std::derived_from<Array> T>
23+
inline T& get() const {
24+
if (const auto val = std::dynamic_pointer_cast<T>(Value); val != nullptr) {
25+
return *val;
26+
}
27+
throw std::runtime_error("Array type invalid: " + std::string(T::TypeName));
28+
}
1929
};
2030
} // namespace SatisfactorySave

libsave/include/SatisfactorySave/GameTypes/Properties/MapProperty.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include <vector>
3+
#include <concepts>
44

55
#include "../MapTypes/Base/MapTypeList.h"
66
#include "Base/Property.h"
@@ -36,5 +36,21 @@ namespace SatisfactorySave {
3636

3737
std::shared_ptr<MapTypeList> Keys;
3838
std::shared_ptr<MapTypeList> Values;
39+
40+
template<std::derived_from<MapTypeList> T>
41+
inline T& get_keys() const {
42+
if (const auto val = std::dynamic_pointer_cast<T>(Keys); val != nullptr) {
43+
return *val;
44+
}
45+
throw std::runtime_error("MapTypeList type invalid: " + std::string(T::TypeName));
46+
}
47+
48+
template<std::derived_from<MapTypeList> T>
49+
inline T& get_values() const {
50+
if (const auto val = std::dynamic_pointer_cast<T>(Values); val != nullptr) {
51+
return *val;
52+
}
53+
throw std::runtime_error("MapTypeList type invalid: " + std::string(T::TypeName));
54+
}
3955
};
4056
} // namespace SatisfactorySave

libsave/include/SatisfactorySave/GameTypes/Properties/SetProperty.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include <concepts>
4+
35
#include "../Sets/Base/Set.h"
46
#include "Base/PropertyImpl.h"
57

@@ -16,5 +18,13 @@ namespace SatisfactorySave {
1618
[[nodiscard]] inline FName& SetType() {
1719
return tag_.InnerType;
1820
}
21+
22+
template<std::derived_from<Set> T>
23+
inline T& get() const {
24+
if (const auto val = std::dynamic_pointer_cast<T>(Value); val != nullptr) {
25+
return *val;
26+
}
27+
throw std::runtime_error("Set type invalid: " + std::string(T::TypeName));
28+
}
1929
};
2030
} // namespace SatisfactorySave

libsave/include/SatisfactorySave/GameTypes/Properties/StructProperty.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <concepts>
34
#include <memory>
45

56
#include "../Structs/Base/Struct.h"
@@ -23,5 +24,13 @@ namespace SatisfactorySave {
2324
[[nodiscard]] inline FGuid& StructGuid() {
2425
return tag_.StructGuid;
2526
}
27+
28+
template<std::derived_from<Struct> T>
29+
inline T& get() const {
30+
if (const auto val = std::dynamic_pointer_cast<T>(Value); val != nullptr) {
31+
return *val;
32+
}
33+
throw std::runtime_error("Struct type invalid: " + std::string(T::TypeName));
34+
}
2635
};
2736
} // namespace SatisfactorySave

map/src/MapWindow/DataView/SplineData.cpp

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,54 +9,44 @@
99
#include "Utils/GLMUtil.h"
1010

1111
namespace {
12+
using namespace Satisfactory3DMap;
13+
1214
struct SplinePointData {
1315
glm::vec3 location;
1416
glm::vec3 arriveTangent;
1517
glm::vec3 leaveTangent;
1618
};
1719

18-
std::vector<SplinePointData> getSplineData(const SatisfactorySave::SaveObject& a) {
20+
std::vector<SplinePointData> getSplineData(const s::SaveObject& a) {
1921
if (a.Object == nullptr) {
2022
throw std::runtime_error("Invalid Object!");
2123
}
22-
auto& ap = a.Object->Properties.get<SatisfactorySave::ArrayProperty>("mSplineData");
23-
if (ap.ArrayType() != SatisfactorySave::StructProperty::TypeName) {
24-
throw std::runtime_error("Expect StructProperty!");
25-
}
26-
27-
auto& sa = dynamic_cast<SatisfactorySave::StructArray&>(*ap.Value);
24+
auto& sa = a.Object->Properties.get<s::ArrayProperty>("mSplineData").get<s::StructArray>();
2825
if (sa.StructName() != "SplinePointData") {
29-
throw std::runtime_error("Expect SplinePointData!");
26+
throw std::runtime_error("Expect struct SplinePointData!");
3027
}
3128

3229
std::vector<SplinePointData> result;
3330
for (const auto& s : sa.Values) {
34-
const auto& ps = dynamic_cast<SatisfactorySave::PropertyStruct&>(*s);
35-
const auto& locationStruct = *ps.Data.get<SatisfactorySave::StructProperty>("Location").Value;
36-
const auto& arriveTangentStruct = *ps.Data.get<SatisfactorySave::StructProperty>("ArriveTangent").Value;
37-
const auto& leaveTangentStruct = *ps.Data.get<SatisfactorySave::StructProperty>("LeaveTangent").Value;
38-
39-
SplinePointData data;
40-
data.location =
41-
Satisfactory3DMap::glmCast(dynamic_cast<const SatisfactorySave::VectorStruct&>(locationStruct).Data);
42-
data.arriveTangent = Satisfactory3DMap::glmCast(
43-
dynamic_cast<const SatisfactorySave::VectorStruct&>(arriveTangentStruct).Data);
44-
data.leaveTangent = Satisfactory3DMap::glmCast(
45-
dynamic_cast<const SatisfactorySave::VectorStruct&>(leaveTangentStruct).Data);
31+
const auto& ps = dynamic_cast<s::PropertyStruct&>(*s);
32+
SplinePointData data{
33+
glmCast(ps.Data.get<s::StructProperty>("Location").get<s::VectorStruct>().Data),
34+
glmCast(ps.Data.get<s::StructProperty>("ArriveTangent").get<s::VectorStruct>().Data),
35+
glmCast(ps.Data.get<s::StructProperty>("LeaveTangent").get<s::VectorStruct>().Data),
36+
};
4637

4738
// transform to [meter]
4839
data.location *= glm::vec3(0.01f);
4940
data.leaveTangent *= glm::vec3(0.01f);
5041
data.arriveTangent *= glm::vec3(0.01f);
5142
// transform to world-coords
52-
const auto location_world = (glm::translate(glm::mat4(1.0f), data.location) *
53-
Satisfactory3DMap::glmCast(a.actorHeader().Transform))[3];
43+
const auto location_world =
44+
(glm::translate(glm::mat4(1.0f), data.location) * glmCast(a.actorHeader().Transform))[3];
5445
data.location = glm::vec3(location_world) / location_world.w;
5546

5647
// Subtract actor position, will be later added in shader from global transformation list.
5748
// This allows updating the position independently of spline data.
58-
data.location -=
59-
glm::vec3(Satisfactory3DMap::glmCast(a.actorHeader().Transform) * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
49+
data.location -= glm::vec3(glmCast(a.actorHeader().Transform) * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
6050

6151
result.emplace_back(data);
6252
}
@@ -92,7 +82,7 @@ namespace {
9282
}
9383
} // namespace
9484

95-
Satisfactory3DMap::SplineData::SplineData(const SatisfactorySave::SaveObject& actor) {
85+
Satisfactory3DMap::SplineData::SplineData(const s::SaveObject& actor) {
9686
auto splineData = getSplineData(actor);
9787

9888
length_ = 0.0f;

map/src/MapWindow/DataView/SplineData.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
#include "SatisfactorySave/GameTypes/Save/SaveObject.h"
88

9+
namespace s = SatisfactorySave;
10+
911
namespace Satisfactory3DMap {
1012

1113
struct SplineSegmentGpu {
@@ -20,7 +22,7 @@ namespace Satisfactory3DMap {
2022

2123
class SplineData {
2224
public:
23-
explicit SplineData(const SatisfactorySave::SaveObject& actor);
25+
explicit SplineData(const s::SaveObject& actor);
2426
~SplineData() = default;
2527

2628
[[nodiscard]] const std::vector<SplineSegmentGpu>& splineSegments() const {

0 commit comments

Comments
 (0)