1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-26 05:37:46 +00:00

Use the parameters defined in the material instead of hardcoding

This was only useful for testing, the new renderer loads the parameters
the material stores now.
This commit is contained in:
Joshua Goins 2024-04-27 18:44:53 -04:00
parent c1b45611a2
commit 7cd519fac2
7 changed files with 34 additions and 17 deletions

2
extern/libphysis vendored

@ -1 +1 @@
Subproject commit bccb0503fadb1cd69f27e9aa62ff4d446de76226
Subproject commit 3a1bc2770dd8cb4ccadccb60c1ae20692aaeb00f

View file

@ -228,6 +228,30 @@ RenderMaterial MDLPart::createMaterial(const physis_Material &material)
auto shpkData = physis_gamedata_extract_file(data, shpkPath.c_str());
if (shpkData.data != nullptr) {
newMaterial.shaderPackage = physis_parse_shpk(shpkData);
// create the material parameters for this shader package
newMaterial.materialBuffer =
renderer->device().createBuffer(newMaterial.shaderPackage.material_parameters_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
// assumed to be floats, maybe not always true?
std::vector<float> buffer(newMaterial.shaderPackage.material_parameters_size / sizeof(float));
// copy the material data
for (int i = 0; i < newMaterial.shaderPackage.num_material_parameters; i++) {
auto param = newMaterial.shaderPackage.material_parameters[i];
for (int j = 0; j < newMaterial.mat.num_constants; j++) {
auto constant = newMaterial.mat.constants[j];
if (constant.id == param.id) {
for (int 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));
}
}

View file

@ -221,7 +221,7 @@ void MtrlPart::rebuild()
auto layout = new QFormLayout();
groupBox->setLayout(layout);
auto label = new QLabel(QString::number(constant.value));
auto label = new QLabel(QStringLiteral("%1 %2 %3 %4").arg(constant.values[0]).arg(constant.values[1]).arg(constant.values[2]).arg(constant.values[3]));
layout->addRow(i18n("Value:"), label);
}
}

View file

@ -29,6 +29,8 @@ struct RenderMaterial {
RenderTexture *normalTexture = nullptr;
RenderTexture *specularTexture = nullptr;
RenderTexture *multiTexture = nullptr;
Buffer materialBuffer;
};
struct DrawObject {

View file

@ -84,7 +84,6 @@ private:
Buffer g_CameraParameter;
Buffer g_InstanceParameter;
Buffer g_ModelParameter;
Buffer g_MaterialParameter;
Buffer g_TransparencyMaterialParameter;
Buffer g_CommonParameter;
Buffer g_LightParam;

View file

@ -98,16 +98,6 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
m_device.copyToBuffer(g_ModelParameter, &modelParameter, sizeof(ModelParameter));
}
// material data
{
g_MaterialParameter = m_device.createBuffer(sizeof(MaterialParameters), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
MaterialParameters materialParameter{};
materialParameter.parameters[0] = glm::vec4(1.0f, 1.0f, 1.0f, 0.0f); // diffuse color then alpha threshold
materialParameter.parameters[5].z = 1.0f;
m_device.copyToBuffer(g_MaterialParameter, &materialParameter, sizeof(MaterialParameters));
}
// material data
{
g_TransparencyMaterialParameter = m_device.createBuffer(sizeof(MaterialParameters), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
@ -1202,7 +1192,7 @@ GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline
info->range = buffer.size;
};
auto bindBuffer = [this, &useUniformBuffer, &info, j, &object, pass](const char *name) {
auto bindBuffer = [this, &useUniformBuffer, &info, j, &object, pass, material](const char *name) {
qInfo() << "Requesting" << name << "at" << j;
if (strcmp(name, "g_CameraParameter") == 0) {
@ -1219,7 +1209,9 @@ GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline
// The composite semi-transparency uses a different alphathreshold
useUniformBuffer(g_TransparencyMaterialParameter);
} else {
useUniformBuffer(g_MaterialParameter);
Q_ASSERT(material);
Q_ASSERT(material->materialBuffer.buffer);
useUniformBuffer(material->materialBuffer);
}
} else if (strcmp(name, "g_LightParam") == 0) {
useUniformBuffer(g_LightParam);

View file

@ -100,8 +100,8 @@ RenderManager::RenderManager(GameData *data)
createInfo.ppEnabledExtensionNames = instanceExtensions.data();
createInfo.enabledExtensionCount = instanceExtensions.size();
createInfo.pApplicationInfo = &applicationInfo;
createInfo.ppEnabledLayerNames = layers;
createInfo.enabledLayerCount = 1;
// createInfo.ppEnabledLayerNames = layers;
// createInfo.enabledLayerCount = 1;
vkCreateInstance(&createInfo, nullptr, &m_device->instance);