Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/SoftBody/SoftBodyCreationSettings.cpp
21520 views
1
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2
// SPDX-FileCopyrightText: 2023 Jorrit Rouwe
3
// SPDX-License-Identifier: MIT
4
5
#include <Jolt/Jolt.h>
6
7
#include <Jolt/Physics/SoftBody/SoftBodyCreationSettings.h>
8
#include <Jolt/ObjectStream/TypeDeclarations.h>
9
#include <Jolt/Core/StreamIn.h>
10
#include <Jolt/Core/StreamOut.h>
11
12
JPH_NAMESPACE_BEGIN
13
14
JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(SoftBodyCreationSettings)
15
{
16
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mSettings)
17
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mPosition)
18
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mRotation)
19
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mUserData)
20
JPH_ADD_ENUM_ATTRIBUTE(SoftBodyCreationSettings, mObjectLayer)
21
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mCollisionGroup)
22
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mNumIterations)
23
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mLinearDamping)
24
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mMaxLinearVelocity)
25
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mRestitution)
26
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mFriction)
27
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mPressure)
28
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mGravityFactor)
29
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mVertexRadius)
30
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mUpdatePosition)
31
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mMakeRotationIdentity)
32
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mAllowSleeping)
33
JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mFacesDoubleSided)
34
}
35
36
void SoftBodyCreationSettings::SaveBinaryState(StreamOut &inStream) const
37
{
38
inStream.Write(mPosition);
39
inStream.Write(mRotation);
40
inStream.Write(mUserData);
41
inStream.Write(mObjectLayer);
42
mCollisionGroup.SaveBinaryState(inStream);
43
inStream.Write(mNumIterations);
44
inStream.Write(mLinearDamping);
45
inStream.Write(mMaxLinearVelocity);
46
inStream.Write(mRestitution);
47
inStream.Write(mFriction);
48
inStream.Write(mPressure);
49
inStream.Write(mGravityFactor);
50
inStream.Write(mVertexRadius);
51
inStream.Write(mUpdatePosition);
52
inStream.Write(mMakeRotationIdentity);
53
inStream.Write(mAllowSleeping);
54
inStream.Write(mFacesDoubleSided);
55
}
56
57
void SoftBodyCreationSettings::RestoreBinaryState(StreamIn &inStream)
58
{
59
inStream.Read(mPosition);
60
inStream.Read(mRotation);
61
inStream.Read(mUserData);
62
inStream.Read(mObjectLayer);
63
mCollisionGroup.RestoreBinaryState(inStream);
64
inStream.Read(mNumIterations);
65
inStream.Read(mLinearDamping);
66
inStream.Read(mMaxLinearVelocity);
67
inStream.Read(mRestitution);
68
inStream.Read(mFriction);
69
inStream.Read(mPressure);
70
inStream.Read(mGravityFactor);
71
inStream.Read(mVertexRadius);
72
inStream.Read(mUpdatePosition);
73
inStream.Read(mMakeRotationIdentity);
74
inStream.Read(mAllowSleeping);
75
inStream.Read(mFacesDoubleSided);
76
}
77
78
void SoftBodyCreationSettings::SaveWithChildren(StreamOut &inStream, SharedSettingsToIDMap *ioSharedSettingsMap, MaterialToIDMap *ioMaterialMap, GroupFilterToIDMap *ioGroupFilterMap) const
79
{
80
// Save creation settings
81
SaveBinaryState(inStream);
82
83
// Save shared settings
84
if (ioSharedSettingsMap != nullptr && ioMaterialMap != nullptr)
85
mSettings->SaveWithMaterials(inStream, *ioSharedSettingsMap, *ioMaterialMap);
86
else
87
inStream.Write(~uint32(0));
88
89
// Save group filter
90
StreamUtils::SaveObjectReference(inStream, mCollisionGroup.GetGroupFilter(), ioGroupFilterMap);
91
}
92
93
SoftBodyCreationSettings::SBCSResult SoftBodyCreationSettings::sRestoreWithChildren(StreamIn &inStream, IDToSharedSettingsMap &ioSharedSettingsMap, IDToMaterialMap &ioMaterialMap, IDToGroupFilterMap &ioGroupFilterMap)
94
{
95
SBCSResult result;
96
97
// Read creation settings
98
SoftBodyCreationSettings settings;
99
settings.RestoreBinaryState(inStream);
100
if (inStream.IsEOF() || inStream.IsFailed())
101
{
102
result.SetError("Error reading body creation settings");
103
return result;
104
}
105
106
// Read shared settings
107
SoftBodySharedSettings::SettingsResult settings_result = SoftBodySharedSettings::sRestoreWithMaterials(inStream, ioSharedSettingsMap, ioMaterialMap);
108
if (settings_result.HasError())
109
{
110
result.SetError(settings_result.GetError());
111
return result;
112
}
113
settings.mSettings = settings_result.Get();
114
115
// Read group filter
116
Result gfresult = StreamUtils::RestoreObjectReference(inStream, ioGroupFilterMap);
117
if (gfresult.HasError())
118
{
119
result.SetError(gfresult.GetError());
120
return result;
121
}
122
settings.mCollisionGroup.SetGroupFilter(gfresult.Get());
123
124
result.Set(settings);
125
return result;
126
}
127
128
JPH_NAMESPACE_END
129
130