mirror of
https://github.com/redstrate/Novus.git
synced 2025-05-04 00:47:46 +00:00
Fix crash when loading an invalid shader package
It tries to make a buffer of zero size, which does not make any sense.
This commit is contained in:
parent
d82333ae3e
commit
092037b0d5
1 changed files with 18 additions and 17 deletions
|
@ -221,31 +221,32 @@ RenderMaterial MDLPart::createMaterial(const physis_Material &material)
|
||||||
auto shpkData = physis_gamedata_extract_file(data, shpkPath.c_str());
|
auto shpkData = physis_gamedata_extract_file(data, shpkPath.c_str());
|
||||||
if (shpkData.data != nullptr) {
|
if (shpkData.data != nullptr) {
|
||||||
newMaterial.shaderPackage = physis_parse_shpk(shpkData);
|
newMaterial.shaderPackage = physis_parse_shpk(shpkData);
|
||||||
|
if (newMaterial.shaderPackage.p_ptr) {
|
||||||
|
// create the material parameters for this shader package
|
||||||
|
newMaterial.materialBuffer =
|
||||||
|
renderer->device().createBuffer(newMaterial.shaderPackage.material_parameters_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||||
|
renderer->device().nameBuffer(newMaterial.materialBuffer, "g_MaterialParameter"); // TODO: add material name
|
||||||
|
|
||||||
// create the material parameters for this shader package
|
// assumed to be floats, maybe not always true?
|
||||||
newMaterial.materialBuffer =
|
std::vector<float> buffer(newMaterial.shaderPackage.material_parameters_size / sizeof(float));
|
||||||
renderer->device().createBuffer(newMaterial.shaderPackage.material_parameters_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
|
||||||
renderer->device().nameBuffer(newMaterial.materialBuffer, "g_MaterialParameter"); // TODO: add material name
|
|
||||||
|
|
||||||
// assumed to be floats, maybe not always true?
|
// copy the material data
|
||||||
std::vector<float> buffer(newMaterial.shaderPackage.material_parameters_size / sizeof(float));
|
for (uint32_t i = 0; i < newMaterial.shaderPackage.num_material_parameters; i++) {
|
||||||
|
auto param = newMaterial.shaderPackage.material_parameters[i];
|
||||||
|
|
||||||
// copy the material data
|
for (uint32_t j = 0; j < newMaterial.mat.num_constants; j++) {
|
||||||
for (uint32_t i = 0; i < newMaterial.shaderPackage.num_material_parameters; i++) {
|
auto constant = newMaterial.mat.constants[j];
|
||||||
auto param = newMaterial.shaderPackage.material_parameters[i];
|
|
||||||
|
|
||||||
for (uint32_t j = 0; j < newMaterial.mat.num_constants; j++) {
|
if (constant.id == param.id) {
|
||||||
auto constant = newMaterial.mat.constants[j];
|
for (uint32_t z = 0; z < constant.num_values; z++) {
|
||||||
|
buffer[(param.byte_offset / sizeof(float)) + z] = constant.values[z];
|
||||||
if (constant.id == param.id) {
|
}
|
||||||
for (uint32_t z = 0; z < constant.num_values; z++) {
|
|
||||||
buffer[(param.byte_offset / sizeof(float)) + z] = constant.values[z];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
renderer->device().copyToBuffer(newMaterial.materialBuffer, buffer.data(), buffer.size() * sizeof(float));
|
renderer->device().copyToBuffer(newMaterial.materialBuffer, buffer.data(), buffer.size() * sizeof(float));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue