Skip to content

Commit 8371edb

Browse files
committed
The use of Quternions/Transforms, rebased
1 parent 1d05355 commit 8371edb

36 files changed

+903
-603
lines changed

cont/base/springcontent/shaders/GLSL/ModelVertProgGL4.glsl

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ layout(std140, binding = 1) uniform UniformParamsBuffer {
8383
vec4 teamColor[255]; //all team colors
8484
};
8585

86+
/*
87+
struct Transform {
88+
vec4 quat;
89+
vec4 trSc;
90+
};
91+
92+
layout(std140, binding = 0) readonly buffer TransformBuffer {
93+
Transform transforms[];
94+
};
95+
*/
96+
8697
layout(std140, binding = 0) readonly buffer MatrixBuffer {
8798
mat4 mat[];
8899
};
@@ -132,6 +143,37 @@ uint GetUnpackedValue(uint packedValue, uint byteNum) {
132143
return (packedValue >> (8u * byteNum)) & 0xFFu;
133144
}
134145

146+
vec4 MultiplyQuat(vec4 a, vec4 b)
147+
{
148+
return vec4(a.w * b.w - dot(a.w, b.w), a.w * b.xyz + b.w * a.xyz + cross(a.xyz, b.xyz));
149+
}
150+
151+
vec3 RotateByQuaternion(vec4 q, vec3 v) {
152+
return 2.0f * dot(q.xyz, v) * q.xyz + (q.w * q.w - dot(q.xyz, q.xyz)) * v + 2.0 * q.w * cross(q.xyz, v);
153+
}
154+
155+
vec4 RotateByQuaternion(vec4 q, vec4 v) {
156+
return vec4(RotateByQuaternion(q, v.xyz), v.w);
157+
}
158+
159+
vec3 ApplyTransform(Transform tra, vec3 v) {
160+
return RotateByQuaternion(tra.quat, v * tra.trSc.w) + tra.trSc.xyz;
161+
}
162+
163+
vec4 ApplyTransform(Transform tra, vec4 v) {
164+
return vec4(ApplyTransform(tra, v.xyz), v.w);
165+
}
166+
167+
Transform ApplyTransform(Transform parentTra, Transform childTra) {
168+
return Transform(
169+
MultiplyQuat(parentTra.quat, childTra.quat),
170+
vec4(
171+
parentTra.trSc.xyz + RotateByQuaternion(parentTra.quat, parentTra.trSc.w * childTra.trSc.xyz),
172+
parentTra.trSc.w * childTra.trSc.w
173+
)
174+
);
175+
}
176+
135177
void GetModelSpaceVertex(out vec4 msPosition, out vec3 msNormal)
136178
{
137179
bool staticModel = (matrixMode > 0);
@@ -237,4 +279,4 @@ void main(void)
237279
TransformPlayerCam(worldPos);
238280
break;
239281
};
240-
}
282+
}

rts/Game/Game.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -739,8 +739,11 @@ void CGame::PreLoadRendering()
739739
geometricObjects = new CGeometricObjects();
740740

741741
// load components that need to exist before PostLoadSimulation
742-
matrixUploader.Init();
743-
modelsUniformsUploader.Init();
742+
modelUniformsStorage.Init();
743+
//transformsMemStorage.Init(); // Add?
744+
745+
transformsUploader.Init();
746+
modelUniformsUploader.Init();
744747
worldDrawer.InitPre();
745748
}
746749

@@ -1000,8 +1003,9 @@ void CGame::KillRendering()
10001003
icon::iconHandler.Kill();
10011004
spring::SafeDelete(geometricObjects);
10021005
worldDrawer.Kill();
1003-
matrixUploader.Kill();
1004-
modelsUniformsUploader.Kill();
1006+
1007+
transformsUploader.Kill();
1008+
modelUniformsUploader.Kill();
10051009
}
10061010

10071011
void CGame::KillInterface()
@@ -1044,6 +1048,9 @@ void CGame::KillSimulation()
10441048
unitHandler.Kill();
10451049
projectileHandler.Kill();
10461050

1051+
modelUniformsStorage.Kill();
1052+
//transformsMemStorage.Kill(); //Add?
1053+
10471054
LOG("[Game::%s][3]", __func__);
10481055
IPathManager::FreeInstance(pathManager);
10491056
IMapDamage::FreeMapDamage(mapDamage);
@@ -1473,8 +1480,8 @@ bool CGame::UpdateUnsynced(const spring_time currentTime)
14731480
shadowHandler.Update();
14741481
{
14751482
worldDrawer.Update(newSimFrame);
1476-
matrixUploader.Update();
1477-
modelsUniformsUploader.Update();
1483+
transformsUploader.Update();
1484+
modelUniformsUploader.Update();
14781485
}
14791486

14801487
mouse->UpdateCursorCameraDir(); // make sure mouse->dir is in sync with camera

rts/Lua/LuaOpenGL.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,7 @@ static void GLObjectPieceMultMatrix(lua_State* L, const CSolidObject* obj)
14241424
if (lmp == nullptr)
14251425
return;
14261426

1427-
glMultMatrixf(lmp->GetModelSpaceMatrix());
1427+
glMultMatrixf(lmp->GetModelSpaceTransform().ToMatrix());
14281428
}
14291429

14301430
static bool GLObjectDrawWithLuaMat(lua_State* L, CSolidObject* obj, LuaObjType objType)

rts/Lua/LuaShaders.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,7 @@ namespace {
10121012
if (o == nullptr)
10131013
luaL_error(L, "gl.%s() Invalid %s id (%d)", func, &spring::TypeToCStr<T>()[1], id);
10141014

1015-
ModelUniformData& uni = modelsUniformsStorage.GetObjUniformsArray(o);
1015+
ModelUniformData& uni = modelUniformsStorage.GetObjUniformsArray(o);
10161016

10171017
std::array<float, ModelUniformData::MAX_MODEL_UD_UNIFORMS> floatArray = {0};
10181018
int size = LuaUtils::ParseFloatArray(L, 2, floatArray.data(), ModelUniformData::MAX_MODEL_UD_UNIFORMS);

rts/Lua/LuaSyncedRead.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8421,7 +8421,7 @@ static int GetSolidObjectPieceMatrix(lua_State* L, const CSolidObject* o)
84218421
if (lmp == nullptr)
84228422
return 0;
84238423

8424-
const CMatrix44f& mat = lmp->GetModelSpaceMatrix();
8424+
const CMatrix44f& mat = lmp->GetModelSpaceTransform().ToMatrix();
84258425

84268426
for (float mi: mat.m) {
84278427
lua_pushnumber(L, mi);

rts/Lua/LuaVBOImpl.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,10 +1023,10 @@ SInstanceData LuaVBOImpl::InstanceDataFromGetData(int id, int attrID, uint8_t de
10231023
uint32_t teamID = defTeamID;
10241024

10251025
const TObj* obj = LuaUtils::SolIdToObject<TObj>(id, __func__);
1026-
const uint32_t matOffset = static_cast<uint32_t>(matrixUploader.GetElemOffset(obj));
1027-
const uint32_t uniIndex = static_cast<uint32_t>(modelsUniformsStorage.GetObjOffset(obj)); //doesn't need to exist for defs and model. Don't check for validity
1026+
const uint32_t traOffset = static_cast<uint32_t>(transformsUploader.GetElemOffset(obj));
1027+
const uint32_t uniIndex = static_cast<uint32_t>(modelUniformsStorage.GetObjOffset(obj)); //doesn't need to exist for defs and model. Don't check for validity
10281028

1029-
if (matOffset == ~0u) {
1029+
if (traOffset == ~0u) {
10301030
LuaUtils::SolLuaError("[LuaVBOImpl::%s] Invalid data supplied. See infolog for details", __func__);
10311031
}
10321032

@@ -1040,14 +1040,14 @@ SInstanceData LuaVBOImpl::InstanceDataFromGetData(int id, int attrID, uint8_t de
10401040
size_t bposeIndex = 0;
10411041
if constexpr (std::is_same<TObj, S3DModel>::value) {
10421042
numPieces = static_cast<uint16_t>(obj->numPieces);
1043-
bposeIndex = matrixUploader.GetElemOffset(obj);
1043+
bposeIndex = transformsUploader.GetElemOffset(obj);
10441044
}
10451045
else {
10461046
numPieces = static_cast<uint16_t>(obj->model->numPieces);
1047-
bposeIndex = matrixUploader.GetElemOffset(obj->model);
1047+
bposeIndex = transformsUploader.GetElemOffset(obj->model);
10481048
}
10491049

1050-
return SInstanceData(matOffset, teamID, drawFlags, numPieces, uniIndex, bposeIndex);
1050+
return SInstanceData(traOffset, teamID, drawFlags, numPieces, uniIndex, bposeIndex);
10511051
}
10521052

10531053
template<typename TObj>
@@ -1215,7 +1215,7 @@ size_t LuaVBOImpl::ModelsVBO()
12151215
* Data Layout:
12161216
* ```
12171217
* SInstanceData:
1218-
* , matOffset{ matOffset_ } // updated during the following draw frames
1218+
* , traOffset{ matOffset_ } // updated during the following draw frames
12191219
* , uniOffset{ uniOffset_ } // updated during the following draw frames
12201220
* , info{ teamIndex, drawFlags, 0, 0 } // not updated during the following draw frames
12211221
* , aux1 { 0u }
@@ -1254,7 +1254,7 @@ size_t LuaVBOImpl::InstanceDataFromUnitDefIDs(const sol::stack_table& ids, int a
12541254
* Data Layout
12551255
* ```
12561256
* SInstanceData:
1257-
* , matOffset{ matOffset_ } // updated during the following draw frames
1257+
* , traOffset{ matOffset_ } // updated during the following draw frames
12581258
* , uniOffset{ uniOffset_ } // updated during the following draw frames
12591259
* , info{ teamIndex, drawFlags, 0, 0 } // not updated during the following draw frames
12601260
* , aux1 { 0u }
@@ -1294,7 +1294,7 @@ size_t LuaVBOImpl::InstanceDataFromFeatureDefIDs(const sol::stack_table& ids, in
12941294
*
12951295
* ```
12961296
* SInstanceData:
1297-
* , matOffset{ matOffset_ } // updated during the following draw frames
1297+
* , traOffset{ matOffset_ } // updated during the following draw frames
12981298
* , uniOffset{ uniOffset_ } // updated during the following draw frames
12991299
* , info{ teamIndex, drawFlags, 0, 0 } // not updated during the following draw frames
13001300
* , aux1 { 0u }

rts/Rendering/Common/ModelDrawer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
namespace GL { struct GeometryBuffer; }
2323
template<typename T> class ScopedModelDrawerImpl;
24-
class ScopedMatricesMemAlloc;
24+
class ScopedTransformMemAlloc;
2525

2626

2727
static constexpr const char* ModelDrawerNames[ModelDrawerTypes::MODEL_DRAWER_CNT] = {
@@ -110,7 +110,7 @@ class CModelDrawerBase : public CModelDrawerConcept {
110110
static bool CanDrawDeferred() { return modelDrawerState->CanDrawDeferred(); }
111111
static bool SetTeamColor(int team, const float alpha = 1.0f) { return modelDrawerState->SetTeamColor(team, alpha); }
112112
static void SetNanoColor(const float4& color) { modelDrawerState->SetNanoColor(color); }
113-
static const ScopedMatricesMemAlloc& GetMatricesMemAlloc(const ObjType* o) { return const_cast<const TDrawerData*>(modelDrawerData)->GetObjectMatricesMemAlloc(o); }
113+
static const ScopedTransformMemAlloc& GetTransformMemAlloc(const ObjType* o) { return const_cast<const TDrawerData*>(modelDrawerData)->GetObjectTransformMemAlloc(o); }
114114
public:
115115
virtual void Update() const = 0;
116116
// Draw*

rts/Rendering/Common/ModelDrawerData.h

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,18 @@ class CModelDrawerDataBase : public CModelDrawerDataConcept
6969

7070
void ClearPreviousDrawFlags() { for (auto object : unsortedObjects) object->previousDrawFlag = 0; }
7171

72-
const ScopedMatricesMemAlloc& GetObjectMatricesMemAlloc(const T* o) const {
73-
const auto it = matricesMemAllocs.find(const_cast<T*>(o));
74-
return (it != matricesMemAllocs.end()) ? it->second : ScopedMatricesMemAlloc::Dummy();
72+
const auto& GetObjectTransformMemAlloc(const T* o) const {
73+
const auto it = scTransMemAllocMap.find(const_cast<T*>(o));
74+
return (it != scTransMemAllocMap.end()) ? it->second : ScopedTransformMemAlloc::Dummy();
7575
}
76-
ScopedMatricesMemAlloc& GetObjectMatricesMemAlloc(const T* o) { return matricesMemAllocs[const_cast<T*>(o)]; }
76+
auto& GetObjectTransformMemAlloc(const T* o) { return scTransMemAllocMap[const_cast<T*>(o)]; }
7777
private:
7878
static constexpr int MMA_SIZE0 = 2 << 16;
7979
protected:
8080
std::array<ModelRenderContainer<T>, MODELTYPE_CNT> modelRenderers;
8181

8282
std::vector<T*> unsortedObjects;
83-
std::unordered_map<T*, ScopedMatricesMemAlloc> matricesMemAllocs;
83+
std::unordered_map<T*, ScopedTransformMemAlloc> scTransMemAllocMap;
8484

8585
bool& mtModelDrawer;
8686
};
@@ -100,15 +100,15 @@ inline CModelDrawerDataBase<T>::CModelDrawerDataBase(const std::string& ecName,
100100
: CModelDrawerDataConcept(ecName, ecOrder)
101101
, mtModelDrawer(mtModelDrawer_)
102102
{
103-
matricesMemAllocs.reserve(MMA_SIZE0);
103+
scTransMemAllocMap.reserve(MMA_SIZE0);
104104
for (auto& mr : modelRenderers) { mr.Clear(); }
105105
}
106106

107107
template<typename T>
108108
inline CModelDrawerDataBase<T>::~CModelDrawerDataBase()
109109
{
110110
unsortedObjects.clear();
111-
matricesMemAllocs.clear();
111+
scTransMemAllocMap.clear();
112112
}
113113

114114
template<typename T>
@@ -126,9 +126,9 @@ inline void CModelDrawerDataBase<T>::AddObject(const T* co, bool add)
126126
unsortedObjects.emplace_back(o);
127127

128128
const uint32_t numMatrices = (o->model ? o->model->numPieces : 0) + 1u;
129-
matricesMemAllocs.emplace(o, ScopedMatricesMemAlloc(numMatrices));
129+
scTransMemAllocMap.emplace(o, ScopedTransformMemAlloc(numMatrices));
130130

131-
modelsUniformsStorage.GetObjOffset(co);
131+
modelUniformsStorage.AddObject(co);
132132
}
133133

134134
template<typename T>
@@ -141,8 +141,8 @@ inline void CModelDrawerDataBase<T>::DelObject(const T* co, bool del)
141141
}
142142

143143
if (del && spring::VectorErase(unsortedObjects, o)) {
144-
matricesMemAllocs.erase(o);
145-
modelsUniformsStorage.GetObjOffset(co);
144+
scTransMemAllocMap.erase(o);
145+
modelUniformsStorage.DelObject(co);
146146
}
147147
}
148148

@@ -157,15 +157,13 @@ inline void CModelDrawerDataBase<T>::UpdateObject(const T* co, bool init)
157157
template<typename T>
158158
inline void CModelDrawerDataBase<T>::UpdateObjectSMMA(const T* o)
159159
{
160-
ScopedMatricesMemAlloc& smma = GetObjectMatricesMemAlloc(o);
160+
ScopedTransformMemAlloc& smma = GetObjectTransformMemAlloc(o);
161161

162-
const auto tmNew = o->GetTransformMatrix();
163-
const auto& tmOld = const_cast<const ScopedMatricesMemAlloc&>(smma)[0];
162+
const auto tmNew = Transform::FromMatrix(o->GetTransformMatrix());
164163

165164
// from one point it doesn't worth the comparison, cause units usually move
166-
// but having not updated smma[0] allows for longer solid no-update areas in ModelsUniformsUploader::UpdateDerived()
167-
if (tmNew != tmOld)
168-
smma[0] = tmNew;
165+
// but having not updated smma[0] allows for longer solid no-update areas in ModelUniformsUploader::UpdateDerived()
166+
smma.UpdateIfChanged(0, tmNew);
169167

170168
for (int i = 0; i < o->localModel.pieces.size(); ++i) {
171169
const LocalModelPiece& lmp = o->localModel.pieces[i];
@@ -175,22 +173,25 @@ inline void CModelDrawerDataBase<T>::UpdateObjectSMMA(const T* o)
175173
continue;
176174

177175
if unlikely(!lmp.GetScriptVisible()) {
178-
smma[i + 1] = CMatrix44f::Zero();
176+
//smma[i + 1] = CMatrix44f::Zero();
177+
smma.UpdateForced(i + 1, Transform::Zero());
179178
continue;
180179
}
181180

182-
smma[i + 1] = lmp.GetModelSpaceMatrix();
181+
// UpdateIfChanged is not needed, wasCustomDirty takes that role
182+
smma.UpdateForced(i + 1, lmp.GetModelSpaceTransform());
183183
}
184184
}
185185

186186
template<typename T>
187187
inline void CModelDrawerDataBase<T>::UpdateObjectUniforms(const T* o)
188188
{
189-
auto& uni = modelsUniformsStorage.GetObjUniformsArray(o);
189+
auto& uni = modelUniformsStorage.GetObjUniformsArray(o);
190190
uni.drawFlag = o->drawFlag;
191191

192192
if (gu->spectatingFullView || o->IsInLosForAllyTeam(gu->myAllyTeam)) {
193193
uni.id = o->id;
194+
// TODO remove drawPos, replace with pos
194195
uni.drawPos = float4{ o->drawPos, o->heading * math::PI / SPRING_MAX_HEADING };
195196
uni.speed = o->speed;
196197
uni.maxHealth = o->maxHealth;

rts/Rendering/DebugColVolDrawer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ static void DrawObjectDebugPieces(const CSolidObject* o, const float4& defColor)
9696
float4{ (1.0f - (hitDeltaTime / 150.0f)), 0.0f, 0.0f, 1.0f } :
9797
defColor;
9898

99-
const CMatrix44f mp = mo * lmp->GetModelSpaceMatrix();
99+
const CMatrix44f mp = mo * lmp->GetModelSpaceTransform().ToMatrix();
100100
// factors in the volume offsets
101101
DrawCollisionVolume(lmpVol, mp, curColor);
102102
}

0 commit comments

Comments
 (0)