Skip to content

Commit ca9f618

Browse files
committed
complete static mesh parsing
1 parent 7e127a3 commit ca9f618

10 files changed

Lines changed: 378 additions & 6 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#pragma once
2+
3+
#include "../../../../IO/Archive/Archive.h"
4+
#include "Vector.h"
5+
6+
namespace SatisfactorySave {
7+
8+
template<typename T, typename TExtent>
9+
struct TBoxSphereBounds {
10+
public:
11+
TVector<T> Origin;
12+
TVector<TExtent> BoxExtent;
13+
TExtent SphereRadius = static_cast<TExtent>(0.0);
14+
15+
void serialize(Archive& ar) {
16+
ar << Origin;
17+
ar << BoxExtent;
18+
ar << SphereRadius;
19+
}
20+
};
21+
22+
using FBoxSphereBounds3f = TBoxSphereBounds<float, float>;
23+
using FBoxSphereBounds3d = TBoxSphereBounds<double, double>;
24+
using FBoxSphereBounds = FBoxSphereBounds3d;
25+
} // namespace SatisfactorySave
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#pragma once
2+
3+
#include <array>
4+
#include <cstdint>
5+
#include <vector>
6+
7+
#include "../../../IO/Archive/Archive.h"
8+
#include "../Core/Math/Box.h"
9+
#include "../Core/Math/IntVector.h"
10+
#include "../Core/Math/Vector2D.h"
11+
#include "../CoreUObject/Serialization/BulkData.h"
12+
#include "satisfactorysave_export.h"
13+
14+
namespace SatisfactorySave {
15+
class SATISFACTORYSAVE_API FSparseDistanceFieldMip {
16+
public:
17+
FIntVector IndirectionDimensions;
18+
int32_t NumDistanceFieldBricks = 0;
19+
FVector VolumeToVirtualUVScale;
20+
FVector VolumeToVirtualUVAdd;
21+
FVector2D DistanceFieldToVolumeScaleBias;
22+
uint32_t BulkOffset = 0;
23+
uint32_t BulkSize = 0;
24+
25+
void serialize(Archive& ar) {
26+
ar << IndirectionDimensions;
27+
ar << NumDistanceFieldBricks;
28+
ar << VolumeToVirtualUVScale;
29+
ar << VolumeToVirtualUVAdd;
30+
ar << DistanceFieldToVolumeScaleBias;
31+
ar << BulkOffset;
32+
ar << BulkSize;
33+
}
34+
};
35+
36+
class SATISFACTORYSAVE_API FDistanceFieldVolumeData {
37+
public:
38+
FBox LocalSpaceMeshBounds;
39+
bool bMostlyTwoSided;
40+
std::array<FSparseDistanceFieldMip, /*DistanceField::NumMips*/ 3> Mips;
41+
std::vector<uint8_t> AlwaysLoadedMip;
42+
FByteBulkData StreamableMips;
43+
44+
void serialize(Archive& ar) {
45+
ar << LocalSpaceMeshBounds;
46+
ar << bMostlyTwoSided;
47+
ar << Mips;
48+
ar << AlwaysLoadedMip;
49+
ar << StreamableMips;
50+
}
51+
};
52+
} // namespace SatisfactorySave

libsave/include/SatisfactorySave/GameTypes/UE/Engine/Engine/StaticMesh.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,34 @@
11
#pragma once
22

3+
#include <cstdint>
4+
#include <vector>
5+
36
#include "../../../../IO/Archive/Archive.h"
7+
#include "../../../FactoryGame/FGObjectReference.h"
8+
#include "../../Core/UObject/NameTypes.h"
49
#include "../../CoreUObject/UObject/Object.h"
10+
#include "../MeshUVChannelInfo.h"
511
#include "../StaticMeshResources.h"
612
#include "satisfactorysave_export.h"
713

814
namespace SatisfactorySave {
15+
struct SATISFACTORYSAVE_API FStaticMaterial {
16+
FObjectReferenceDisc MaterialInterface;
17+
FName MaterialSlotName;
18+
FMeshUVChannelInfo UVChannelData;
19+
20+
void serialize(Archive& ar) {
21+
ar << MaterialInterface;
22+
ar << MaterialSlotName;
23+
ar << UVChannelData;
24+
}
25+
};
26+
927
class SATISFACTORYSAVE_API UStaticMesh : public UObject {
1028
public:
1129
FStaticMeshRenderData RenderData;
30+
std::vector<FStaticMaterial> StaticMaterials;
31+
uint8_t MaxShadowLOD = 0;
1232

1333
void serialize(Archive& ar) override;
1434
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#pragma once
2+
3+
#include <vector>
4+
5+
#include "../../../IO/Archive/Archive.h"
6+
#include "../Core/Math/Box.h"
7+
#include "MeshCardRepresentation.h"
8+
#include "satisfactorysave_export.h"
9+
10+
namespace SatisfactorySave {
11+
class SATISFACTORYSAVE_API FLumenCardBuildData {
12+
public:
13+
FLumenCardOBBf OBB;
14+
uint8_t AxisAlignedDirectionIndex = 0;
15+
16+
void serialize(Archive& ar) {
17+
ar << OBB;
18+
ar << AxisAlignedDirectionIndex;
19+
}
20+
};
21+
22+
class SATISFACTORYSAVE_API FMeshCardsBuildData {
23+
public:
24+
FBox Bounds;
25+
bool bMostlyTwoSided;
26+
std::vector<FLumenCardBuildData> CardBuildData;
27+
28+
void serialize(Archive& ar) {
29+
ar << Bounds;
30+
ar << bMostlyTwoSided;
31+
ar << CardBuildData;
32+
}
33+
};
34+
35+
class SATISFACTORYSAVE_API FCardRepresentationData {
36+
public:
37+
FMeshCardsBuildData MeshCardsBuildData;
38+
39+
void serialize(Archive& ar) {
40+
ar << MeshCardsBuildData;
41+
}
42+
};
43+
} // namespace SatisfactorySave
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#pragma once
2+
3+
#include "../../../IO/Archive/Archive.h"
4+
#include "../Core/Math/Vector.h"
5+
6+
namespace SatisfactorySave {
7+
template<typename T>
8+
class TLumenCardOBB {
9+
public:
10+
TVector<T> Origin;
11+
TVector<T> AxisX;
12+
TVector<T> AxisY;
13+
TVector<T> AxisZ;
14+
TVector<T> Extent;
15+
16+
void serialize(Archive& ar) {
17+
ar << AxisX;
18+
ar << AxisY;
19+
ar << AxisZ;
20+
ar << Origin;
21+
ar << Extent;
22+
}
23+
};
24+
25+
using FLumenCardOBBf = TLumenCardOBB<float>;
26+
using FLumenCardOBBd = TLumenCardOBB<double>;
27+
} // namespace SatisfactorySave
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
3+
#include <array>
4+
5+
#include "../../../IO/Archive/Archive.h"
6+
#include "satisfactorysave_export.h"
7+
8+
namespace SatisfactorySave {
9+
struct SATISFACTORYSAVE_API FMeshUVChannelInfo {
10+
public:
11+
bool bInitialized = false;
12+
bool bOverrideDensities = false;
13+
std::array<float, /*MAX_TEXCOORDS*/ 4> LocalUVDensities{};
14+
15+
void serialize(Archive& ar) {
16+
ar << bInitialized;
17+
ar << bOverrideDensities;
18+
19+
for (auto& localUVDensity : LocalUVDensities) {
20+
ar << localUVDensity;
21+
}
22+
}
23+
};
24+
} // namespace SatisfactorySave
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include "../../../IO/Archive/Archive.h"
4+
#include "satisfactorysave_export.h"
5+
6+
namespace SatisfactorySave {
7+
struct SATISFACTORYSAVE_API FPerPlatformFloat {
8+
public:
9+
bool bCooked = false;
10+
float Default = 0.0f;
11+
12+
void serialize(Archive& ar) {
13+
ar << bCooked;
14+
ar << Default;
15+
}
16+
};
17+
} // namespace SatisfactorySave
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
#include <vector>
5+
6+
#include "../../../../IO/Archive/Archive.h"
7+
#include "../../Core/Math/Vector.h"
8+
#include "../../Core/Math/Vector4.h"
9+
#include "../../CoreUObject/Serialization/BulkData.h"
10+
#include "satisfactorysave_export.h"
11+
12+
#define NANITE_MAX_BVH_NODE_FANOUT_BITS 2
13+
#define NANITE_MAX_BVH_NODE_FANOUT (1 << NANITE_MAX_BVH_NODE_FANOUT_BITS)
14+
15+
namespace SatisfactorySave {
16+
17+
struct SATISFACTORYSAVE_API FPackedHierarchyNode {
18+
FVector4f LODBounds[NANITE_MAX_BVH_NODE_FANOUT];
19+
20+
struct {
21+
FVector3f BoxBoundsCenter;
22+
uint32_t MinLODError_MaxParentLODError = 0;
23+
} Misc0[NANITE_MAX_BVH_NODE_FANOUT];
24+
25+
struct {
26+
FVector3f BoxBoundsExtent;
27+
uint32_t ChildStartReference = 0;
28+
} Misc1[NANITE_MAX_BVH_NODE_FANOUT];
29+
30+
struct {
31+
uint32_t ResourcePageIndex_NumPages_GroupPartSize = 0;
32+
} Misc2[NANITE_MAX_BVH_NODE_FANOUT];
33+
34+
void serialize(Archive& ar) {
35+
for (uint32_t i = 0; i < NANITE_MAX_BVH_NODE_FANOUT; i++) {
36+
ar << LODBounds[i];
37+
ar << Misc0[i].BoxBoundsCenter;
38+
ar << Misc0[i].MinLODError_MaxParentLODError;
39+
ar << Misc1[i].BoxBoundsExtent;
40+
ar << Misc1[i].ChildStartReference;
41+
ar << Misc2[i].ResourcePageIndex_NumPages_GroupPartSize;
42+
}
43+
}
44+
};
45+
46+
struct SATISFACTORYSAVE_API FPageStreamingState {
47+
uint32_t BulkOffset;
48+
uint32_t BulkSize;
49+
uint32_t PageSize;
50+
uint32_t DependenciesStart;
51+
uint16_t DependenciesNum;
52+
uint8_t MaxHierarchyDepth;
53+
uint8_t Flags;
54+
55+
void serialize(Archive& ar) {
56+
ar << BulkOffset;
57+
ar << BulkSize;
58+
ar << PageSize;
59+
ar << DependenciesStart;
60+
ar << DependenciesNum;
61+
ar << MaxHierarchyDepth;
62+
ar << Flags;
63+
}
64+
};
65+
66+
struct SATISFACTORYSAVE_API FResources {
67+
std::vector<uint8_t> RootData;
68+
FByteBulkData StreamablePages;
69+
std::vector<uint16_t> ImposterAtlas;
70+
std::vector<FPackedHierarchyNode> HierarchyNodes;
71+
std::vector<uint32_t> HierarchyRootOffsets;
72+
std::vector<FPageStreamingState> PageStreamingStates;
73+
std::vector<uint32_t> PageDependencies;
74+
uint32_t NumRootPages = 0;
75+
int32_t PositionPrecision = 0;
76+
int32_t NormalPrecision = 0;
77+
uint32_t NumInputTriangles = 0;
78+
uint32_t NumInputVertices = 0;
79+
uint16_t NumInputMeshes = 0;
80+
uint16_t NumInputTexCoords = 0;
81+
uint32_t NumClusters = 0;
82+
uint32_t ResourceFlags = 0;
83+
84+
void serialize(Archive& ar) {
85+
// https://github.com/EpicGames/UnrealEngine/blob/5.3.2-release/Engine/Source/Runtime/Engine/Private/Rendering/NaniteResources.cpp#L233
86+
87+
// FStripDataFlags
88+
FStripDataFlags flags;
89+
ar << flags;
90+
flags.validateOnlyEditorDataIsStripped();
91+
92+
ar << ResourceFlags;
93+
ar << StreamablePages;
94+
ar << RootData;
95+
ar << PageStreamingStates;
96+
ar << HierarchyNodes;
97+
ar << HierarchyRootOffsets;
98+
ar << PageDependencies;
99+
ar << ImposterAtlas;
100+
ar << NumRootPages;
101+
ar << PositionPrecision;
102+
ar << NormalPrecision;
103+
ar << NumInputTriangles;
104+
ar << NumInputVertices;
105+
ar << NumInputMeshes;
106+
ar << NumInputTexCoords;
107+
ar << NumClusters;
108+
}
109+
};
110+
} // namespace SatisfactorySave

0 commit comments

Comments
 (0)