diff --git a/extern/libphysis b/extern/libphysis index bccb050..3a1bc27 160000 --- a/extern/libphysis +++ b/extern/libphysis @@ -1 +1 @@ -Subproject commit bccb0503fadb1cd69f27e9aa62ff4d446de76226 +Subproject commit 3a1bc2770dd8cb4ccadccb60c1ae20692aaeb00f diff --git a/parts/mdl/mdlpart.cpp b/parts/mdl/mdlpart.cpp index 9118993..7687378 100644 --- a/parts/mdl/mdlpart.cpp +++ b/parts/mdl/mdlpart.cpp @@ -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 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)); } } diff --git a/parts/mtrl/mtrlpart.cpp b/parts/mtrl/mtrlpart.cpp index 86d7f6e..c14f3d4 100644 --- a/parts/mtrl/mtrlpart.cpp +++ b/parts/mtrl/mtrlpart.cpp @@ -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); } } diff --git a/renderer/include/drawobject.h b/renderer/include/drawobject.h index d48ac83..7718f55 100644 --- a/renderer/include/drawobject.h +++ b/renderer/include/drawobject.h @@ -29,6 +29,8 @@ struct RenderMaterial { RenderTexture *normalTexture = nullptr; RenderTexture *specularTexture = nullptr; RenderTexture *multiTexture = nullptr; + + Buffer materialBuffer; }; struct DrawObject { diff --git a/renderer/include/gamerenderer.h b/renderer/include/gamerenderer.h index 4a479a6..b2178ab 100644 --- a/renderer/include/gamerenderer.h +++ b/renderer/include/gamerenderer.h @@ -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; diff --git a/renderer/src/gamerenderer.cpp b/renderer/src/gamerenderer.cpp index c3d73e2..c9d6813 100644 --- a/renderer/src/gamerenderer.cpp +++ b/renderer/src/gamerenderer.cpp @@ -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); diff --git a/renderer/src/rendermanager.cpp b/renderer/src/rendermanager.cpp index 7249cfc..c93399f 100644 --- a/renderer/src/rendermanager.cpp +++ b/renderer/src/rendermanager.cpp @@ -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);