Moved many KRPipeline public members to private.

Added KRPipeline::hasUniform to avoid accessing private members directly in KRMaterial.
Added KRPipeline::setUniform overload, for setting an array of Matrix4's.
This commit is contained in:
2022-08-02 00:43:36 -07:00
parent 74ed52fefd
commit 2dab7a2b48
3 changed files with 38 additions and 18 deletions

View File

@@ -357,7 +357,7 @@ void KRMaterial::bind(const KRNode::RenderInfo& ri, ModelFormat modelFormat, __u
pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_RIM_POWER, rim_power);
// Bind bones
if(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS] != -1) {
if(pShader->hasUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS)) {
float bone_mats[256 * 16];
float *bone_mat_component = bone_mats;
for(int bone_index=0; bone_index < bones.size(); bone_index++) {
@@ -384,8 +384,8 @@ void KRMaterial::bind(const KRNode::RenderInfo& ri, ModelFormat modelFormat, __u
*bone_mat_component++ = t[i];
}
}
if(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS] != -1) {
glUniformMatrix4fv(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS], (GLsizei)bones.size(), GL_FALSE, bone_mats);
if(pShader->hasUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS)) {
pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS, (Matrix4*)bone_mats, bones.size());
}
}

View File

@@ -115,8 +115,10 @@ KRPipeline::KRPipeline(KRContext& context, KRSurface& surface, const PipelineInf
, m_pushConstantBuffer(nullptr)
, m_pushConstantBufferSize(0)
{
memset(m_pushConstants[0].size, 0, KRENGINE_NUM_UNIFORMS);
memset(m_pushConstants[0].offset, 0, KRENGINE_NUM_UNIFORMS * sizeof(int));
for (int i = 0; i < static_cast<int>(ShaderStages::shaderStageCount); i++) {
memset(m_pushConstants[i].size, 0, KRENGINE_NUM_UNIFORMS);
memset(m_pushConstants[i].offset, 0, KRENGINE_NUM_UNIFORMS * sizeof(int));
}
m_pipelineLayout = nullptr;
m_graphicsPipeline = nullptr;
@@ -481,6 +483,16 @@ void KRPipeline::setUniform(int location, float value)
}
}
bool KRPipeline::hasUniform(int location) const
{
for (int i = 0; i < static_cast<int>(ShaderStages::shaderStageCount); i++) {
if (m_pushConstants[i].size) {
return true;
}
}
return false;
}
void KRPipeline::setUniform(int location, int value)
{
if (m_pushConstants[0].size[location] == sizeof(value)) {
@@ -520,6 +532,12 @@ void KRPipeline::setUniform(int location, const Matrix4 &value)
}
}
void KRPipeline::setUniform(int location, const Matrix4* value, const size_t count)
{
// TODO - Vulkan refactoring
// GLDEBUG(glUniformMatrix4fv(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS], (GLsizei)bones.size(), GL_FALSE, bone_mats));
}
bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KRViewport &viewport, const Matrix4 &matModel, const std::vector<KRPointLight *> *point_lights, const std::vector<KRDirectionalLight *> *directional_lights, const std::vector<KRSpotLight *> *spot_lights, const KRNode::RenderPass &renderPass)
{
setUniform(KRENGINE_UNIFORM_ABSOLUTE_TIME, getContext().getAbsoluteTime());

View File

@@ -293,6 +293,18 @@ public:
shaderStageCount
};
bool hasUniform(int location) const;
void setUniform(int location, float value);
void setUniform(int location, int value);
void setUniform(int location, const Vector2 &value);
void setUniform(int location, const Vector3 &value);
void setUniform(int location, const Vector4 &value);
void setUniform(int location, const Matrix4 &value);
void setUniform(int location, const Matrix4* value, const size_t count);
VkPipeline& getPipeline();
private:
static const char* KRENGINE_UNIFORM_NAMES[];
struct PushConstantStageInfo
@@ -307,16 +319,6 @@ public:
char m_szKey[256];
void setUniform(int location, float value);
void setUniform(int location, int value);
void setUniform(int location, const Vector2 &value);
void setUniform(int location, const Vector3 &value);
void setUniform(int location, const Vector4 &value);
void setUniform(int location, const Matrix4 &value);
VkPipeline& getPipeline();
private:
VkPipelineLayout m_pipelineLayout;
VkPipeline m_graphicsPipeline;
VkPipelineLayout m_pushConstantsLayout;