Skip to content

Commit 092037b

Browse files
committed
Fix crash when loading an invalid shader package
It tries to make a buffer of zero size, which does not make any sense.
1 parent d82333a commit 092037b

File tree

1 file changed

+18
-17
lines changed

1 file changed

+18
-17
lines changed

parts/mdl/mdlpart.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -221,31 +221,32 @@ RenderMaterial MDLPart::createMaterial(const physis_Material &material)
221221
auto shpkData = physis_gamedata_extract_file(data, shpkPath.c_str());
222222
if (shpkData.data != nullptr) {
223223
newMaterial.shaderPackage = physis_parse_shpk(shpkData);
224+
if (newMaterial.shaderPackage.p_ptr) {
225+
// create the material parameters for this shader package
226+
newMaterial.materialBuffer =
227+
renderer->device().createBuffer(newMaterial.shaderPackage.material_parameters_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
228+
renderer->device().nameBuffer(newMaterial.materialBuffer, "g_MaterialParameter"); // TODO: add material name
224229

225-
// create the material parameters for this shader package
226-
newMaterial.materialBuffer =
227-
renderer->device().createBuffer(newMaterial.shaderPackage.material_parameters_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
228-
renderer->device().nameBuffer(newMaterial.materialBuffer, "g_MaterialParameter"); // TODO: add material name
230+
// assumed to be floats, maybe not always true?
231+
std::vector<float> buffer(newMaterial.shaderPackage.material_parameters_size / sizeof(float));
229232

230-
// assumed to be floats, maybe not always true?
231-
std::vector<float> buffer(newMaterial.shaderPackage.material_parameters_size / sizeof(float));
233+
// copy the material data
234+
for (uint32_t i = 0; i < newMaterial.shaderPackage.num_material_parameters; i++) {
235+
auto param = newMaterial.shaderPackage.material_parameters[i];
232236

233-
// copy the material data
234-
for (uint32_t i = 0; i < newMaterial.shaderPackage.num_material_parameters; i++) {
235-
auto param = newMaterial.shaderPackage.material_parameters[i];
237+
for (uint32_t j = 0; j < newMaterial.mat.num_constants; j++) {
238+
auto constant = newMaterial.mat.constants[j];
236239

237-
for (uint32_t j = 0; j < newMaterial.mat.num_constants; j++) {
238-
auto constant = newMaterial.mat.constants[j];
239-
240-
if (constant.id == param.id) {
241-
for (uint32_t z = 0; z < constant.num_values; z++) {
242-
buffer[(param.byte_offset / sizeof(float)) + z] = constant.values[z];
240+
if (constant.id == param.id) {
241+
for (uint32_t z = 0; z < constant.num_values; z++) {
242+
buffer[(param.byte_offset / sizeof(float)) + z] = constant.values[z];
243+
}
243244
}
244245
}
245246
}
246-
}
247247

248-
renderer->device().copyToBuffer(newMaterial.materialBuffer, buffer.data(), buffer.size() * sizeof(float));
248+
renderer->device().copyToBuffer(newMaterial.materialBuffer, buffer.data(), buffer.size() * sizeof(float));
249+
}
249250
}
250251
}
251252

0 commit comments

Comments
 (0)