Skip to content

Commit a902a79

Browse files
committed
Fix a bad assumption about Dawntrail bone matrix data
For some reason, I thought there was a limit of 768 bones which doesn't make any sense. No, it's a 768 element array of vec4s which is clearly a 256 element array of mat 3x4s.
1 parent 253e9e0 commit a902a79

File tree

9 files changed

+14
-13
lines changed

9 files changed

+14
-13
lines changed

parts/mdl/mdlpart.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ void MDLPart::reloadBoneData()
207207
}
208208

209209
for (uint32_t i = 0; i < model->boneData.size(); i++) {
210-
model->boneData[i] = glm::mat4(1.0f);
210+
model->boneData[i] = glm::mat3x4(1.0f);
211211
}
212212

213213
for (uint32_t i = 0; i < model->model.num_affected_bones; i++) {

renderer/include/drawobject.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#pragma once
55

6+
#include "shaderstructs.h"
67
#include "texture.h"
78

89
struct RenderPart {
@@ -37,7 +38,7 @@ struct RenderMaterial {
3738
struct DrawObject {
3839
physis_MDL model;
3940
std::vector<RenderPart> parts;
40-
std::array<glm::mat4, 768> boneData; // JOINT_MATRIX_SIZE_DAWNTRAIL
41+
std::array<glm::mat3x4, JOINT_MATRIX_SIZE_DAWNTRAIL> boneData; // JOINT_MATRIX_SIZE_DAWNTRAIL
4142
std::vector<RenderMaterial> materials;
4243
bool skinned = false;
4344

renderer/include/shaderstructs.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ struct CameraParameter {
2222
glm::mat4 m_unknown4; // noooo idea
2323
};
2424

25-
const int JOINT_MATRIX_SIZE_ARR = 64;
26-
const int JOINT_MATRIX_SIZE_DAWNTRAIL = 768;
25+
const int JOINT_MATRIX_SIZE_DAWNTRAIL = 256;
2726

2827
struct CameraLight {
2928
glm::vec4 m_DiffuseSpecular;

renderer/shaders/mesh.vert

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ layout(std430, push_constant) uniform PushConstant {
2828
};
2929

3030
layout(std430, binding = 2) buffer readonly BoneInformation {
31-
mat4 bones[768];
31+
mat3x4 bones[256];
3232
};
3333

3434
void main() {

renderer/shaders/mesh.vert.spv

16 Bytes
Binary file not shown.

renderer/shaders/skinned.vert

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ layout(std430, push_constant) uniform PushConstant {
2828
};
2929

3030
layout(binding = 2) uniform BoneInformation {
31-
mat4 bones[768];
31+
mat3x4 bones[256];
3232
};
3333

3434
void main() {
35-
mat4 BoneTransform = bones[boneOffset + inBoneIds[0]] * inBoneWeights[0];
36-
BoneTransform += bones[boneOffset + inBoneIds[1]] * inBoneWeights[1];
37-
BoneTransform += bones[boneOffset + inBoneIds[2]] * inBoneWeights[2];
38-
BoneTransform += bones[boneOffset + inBoneIds[3]] * inBoneWeights[3];
35+
mat4 BoneTransform = mat4(bones[boneOffset + inBoneIds[0]]) * inBoneWeights[0];
36+
BoneTransform += mat4(bones[boneOffset + inBoneIds[1]]) * inBoneWeights[1];
37+
BoneTransform += mat4(bones[boneOffset + inBoneIds[2]]) * inBoneWeights[2];
38+
BoneTransform += mat4(bones[boneOffset + inBoneIds[3]]) * inBoneWeights[3];
3939

4040
BoneTransform = model * BoneTransform;
4141

renderer/shaders/skinned.vert.spv

1.69 KB
Binary file not shown.

renderer/src/rendermanager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ void RenderManager::reloadDrawObject(DrawObject &DrawObject, uint32_t lod)
572572
DrawObject.parts.push_back(renderPart);
573573
}
574574

575-
const size_t bufferSize = sizeof(glm::mat4) * JOINT_MATRIX_SIZE_DAWNTRAIL;
575+
const size_t bufferSize = sizeof(glm::mat3x4) * JOINT_MATRIX_SIZE_DAWNTRAIL;
576576
DrawObject.boneInfoBuffer = m_device->createBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
577577
}
578578

renderer/src/simplerenderer.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "camera.h"
88
#include "device.h"
99
#include "drawobject.h"
10+
#include "shaderstructs.h"
1011
#include "swapchain.h"
1112

1213
SimpleRenderer::SimpleRenderer(Device &device)
@@ -88,7 +89,7 @@ void SimpleRenderer::render(VkCommandBuffer commandBuffer, Camera &camera, Scene
8889

8990
// copy bone data
9091
{
91-
const size_t bufferSize = sizeof(glm::mat4) * 768;
92+
const size_t bufferSize = sizeof(glm::mat3x4) * JOINT_MATRIX_SIZE_DAWNTRAIL;
9293
void *mapped_data = nullptr;
9394
vkMapMemory(m_device.device, model.sourceObject->boneInfoBuffer.memory, 0, bufferSize, 0, &mapped_data);
9495

@@ -467,7 +468,7 @@ VkDescriptorSet SimpleRenderer::createDescriptorFor(const DrawObject &model, con
467468
return VK_NULL_HANDLE;
468469
}
469470

470-
const size_t bufferSize = sizeof(glm::mat4) * 768;
471+
const size_t bufferSize = sizeof(glm::mat4) * JOINT_MATRIX_SIZE_DAWNTRAIL;
471472

472473
std::vector<VkWriteDescriptorSet> writes;
473474

0 commit comments

Comments
 (0)