From 06f4056887168d8e1f6bf45497a8be8073cf826e Mon Sep 17 00:00:00 2001 From: kearwood Date: Tue, 2 Aug 2022 01:04:00 -0700 Subject: [PATCH] Added KRPipeline::Uniform enum class to replace existing untyped enum. --- kraken/KRCamera.cpp | 2 +- kraken/KRDirectionalLight.cpp | 6 +- kraken/KRLight.cpp | 14 +-- kraken/KRMaterial.cpp | 42 +++---- kraken/KRParticleSystemNewtonian.cpp | 2 +- kraken/KRPipeline.cpp | 164 +++++++++++++-------------- kraken/KRPipeline.h | 26 +++-- kraken/KRPointLight.cpp | 10 +- kraken/KRSprite.cpp | 2 +- 9 files changed, 136 insertions(+), 132 deletions(-) diff --git a/kraken/KRCamera.cpp b/kraken/KRCamera.cpp index c76c600..502de77 100755 --- a/kraken/KRCamera.cpp +++ b/kraken/KRCamera.cpp @@ -550,7 +550,7 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) KRPipeline *postShader = m_pContext->getPipelineManager()->getPipeline(surface, info); - postShader->setUniform(KRPipeline::KRENGINE_UNIFORM_FADE_COLOR, m_fade_color); + postShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_FADE_COLOR, m_fade_color); postShader->bind(commandBuffer, *this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 0, compositeDepthTexture); diff --git a/kraken/KRDirectionalLight.cpp b/kraken/KRDirectionalLight.cpp index 7f838fe..ccb1bca 100755 --- a/kraken/KRDirectionalLight.cpp +++ b/kraken/KRDirectionalLight.cpp @@ -152,9 +152,9 @@ void KRDirectionalLight::render(RenderInfo& ri) { info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_STRIP; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_DIRECTION_VIEW_SPACE, light_direction_view_space); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_COLOR, m_color); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_INTENSITY, m_intensity * 0.01f); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_DIRECTION_VIEW_SPACE, light_direction_view_space); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_COLOR, m_color); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_INTENSITY, m_intensity * 0.01f); pShader->bind(ri.commandBuffer, *ri.camera, ri.viewport, getModelMatrix(), nullptr, &this_light, nullptr, ri.renderPass); // Render a full screen quad diff --git a/kraken/KRLight.cpp b/kraken/KRLight.cpp index 4e59b1b..47347a5 100755 --- a/kraken/KRLight.cpp +++ b/kraken/KRLight.cpp @@ -270,9 +270,9 @@ void KRLight::render(RenderInfo& ri) { info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline *pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); - pParticleShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_COLOR, m_color * ri.camera->settings.dust_particle_intensity * m_dust_particle_intensity * m_intensity); - pParticleShader->setUniform(KRPipeline::KRENGINE_UNIFORM_PARTICLE_ORIGIN, Matrix4::DotWDiv(Matrix4::Invert(particleModelMatrix), Vector3::Zero())); - pParticleShader->setUniform(KRPipeline::KRENGINE_UNIFORM_FLARE_SIZE, m_dust_particle_size); + pParticleShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_COLOR, m_color * ri.camera->settings.dust_particle_intensity * m_dust_particle_intensity * m_intensity); + pParticleShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_PARTICLE_ORIGIN, Matrix4::DotWDiv(Matrix4::Invert(particleModelMatrix), Vector3::Zero())); + pParticleShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_FLARE_SIZE, m_dust_particle_size); pParticleShader->bind(ri.commandBuffer, *ri.camera, ri.viewport, particleModelMatrix, &this_point_light, &this_directional_light, &this_spot_light, ri.renderPass); m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_RANDOM_PARTICLES, 1.0f); @@ -322,8 +322,8 @@ void KRLight::render(RenderInfo& ri) { float slice_far = -ri.camera->settings.volumetric_environment_max_distance; float slice_spacing = (slice_far - slice_near) / slice_count; - pFogShader->setUniform(KRPipeline::KRENGINE_UNIFORM_SLICE_DEPTH_SCALE, Vector2::Create(slice_near, slice_spacing)); - pFogShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_COLOR, (m_color * ri.camera->settings.volumetric_environment_intensity * m_intensity * -slice_spacing / 1000.0f)); + pFogShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_SLICE_DEPTH_SCALE, Vector2::Create(slice_near, slice_spacing)); + pFogShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_COLOR, (m_color * ri.camera->settings.volumetric_environment_intensity * m_intensity * -slice_spacing / 1000.0f)); pFogShader->bind(ri.commandBuffer, *ri.camera, ri.viewport, Matrix4(), &this_point_light, &this_directional_light, &this_spot_light, KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE); m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_VOLUMETRIC_LIGHTING, 1.0f); @@ -411,8 +411,8 @@ void KRLight::render(RenderInfo& ri) { KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_ALPHA, 1.0f); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_FLARE_SIZE, m_flareSize); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_ALPHA, 1.0f); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_FLARE_SIZE, m_flareSize); pShader->bind(ri.commandBuffer, *ri.camera, ri.viewport, getModelMatrix(), &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass); m_pContext->getTextureManager()->selectTexture(0, m_pFlareTexture, 0.0f, KRTexture::TEXTURE_USAGE_LIGHT_FLARE); diff --git a/kraken/KRMaterial.cpp b/kraken/KRMaterial.cpp index 4602b31..ace48da 100755 --- a/kraken/KRMaterial.cpp +++ b/kraken/KRMaterial.cpp @@ -353,11 +353,11 @@ void KRMaterial::bind(const KRNode::RenderInfo& ri, ModelFormat modelFormat, __u KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); // Rim highlighting parameters - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_RIM_COLOR, rim_color); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_RIM_POWER, rim_power); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_RIM_COLOR, rim_color); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_RIM_POWER, rim_power); // Bind bones - if(pShader->hasUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS)) { + if(pShader->hasUniform(KRPipeline::Uniform::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,40 +384,40 @@ void KRMaterial::bind(const KRNode::RenderInfo& ri, ModelFormat modelFormat, __u *bone_mat_component++ = t[i]; } } - if(pShader->hasUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS)) { - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS, (Matrix4*)bone_mats, bones.size()); + if(pShader->hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_BONE_TRANSFORMS)) { + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_BONE_TRANSFORMS, (Matrix4*)bone_mats, bones.size()); } } - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_AMBIENT, m_ambientColor + ri.camera->settings.ambient_intensity); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_AMBIENT, m_ambientColor + ri.camera->settings.ambient_intensity); if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_OPAQUE) { // We pre-multiply the light color with the material color in the forward renderer - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_DIFFUSE, Vector3::Create(m_diffuseColor.x * ri.camera->settings.light_intensity.x, m_diffuseColor.y * ri.camera->settings.light_intensity.y, m_diffuseColor.z * ri.camera->settings.light_intensity.z)); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_DIFFUSE, Vector3::Create(m_diffuseColor.x * ri.camera->settings.light_intensity.x, m_diffuseColor.y * ri.camera->settings.light_intensity.y, m_diffuseColor.z * ri.camera->settings.light_intensity.z)); } else { - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_DIFFUSE, m_diffuseColor); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_DIFFUSE, m_diffuseColor); } if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_OPAQUE) { // We pre-multiply the light color with the material color in the forward renderer - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_SPECULAR, Vector3::Create(m_specularColor.x * ri.camera->settings.light_intensity.x, m_specularColor.y * ri.camera->settings.light_intensity.y, m_specularColor.z * ri.camera->settings.light_intensity.z)); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_SPECULAR, Vector3::Create(m_specularColor.x * ri.camera->settings.light_intensity.x, m_specularColor.y * ri.camera->settings.light_intensity.y, m_specularColor.z * ri.camera->settings.light_intensity.z)); } else { - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_SPECULAR, m_specularColor); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_SPECULAR, m_specularColor); } - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_SHININESS, m_ns); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_REFLECTION, m_reflectionColor); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_DIFFUSETEXTURE_SCALE, m_diffuseMapScale); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_SPECULARTEXTURE_SCALE, m_specularMapScale); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_REFLECTIONTEXTURE_SCALE, m_reflectionMapScale); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_NORMALTEXTURE_SCALE, m_normalMapScale); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_DIFFUSETEXTURE_OFFSET, m_diffuseMapOffset); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_SPECULARTEXTURE_OFFSET, m_specularMapOffset); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_REFLECTIONTEXTURE_OFFSET, m_reflectionMapOffset); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_NORMALTEXTURE_OFFSET, m_normalMapOffset); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_SHININESS, m_ns); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_REFLECTION, m_reflectionColor); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_DIFFUSETEXTURE_SCALE, m_diffuseMapScale); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_SPECULARTEXTURE_SCALE, m_specularMapScale); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_REFLECTIONTEXTURE_SCALE, m_reflectionMapScale); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_NORMALTEXTURE_SCALE, m_normalMapScale); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_DIFFUSETEXTURE_OFFSET, m_diffuseMapOffset); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_SPECULARTEXTURE_OFFSET, m_specularMapOffset); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_REFLECTIONTEXTURE_OFFSET, m_reflectionMapOffset); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_NORMALTEXTURE_OFFSET, m_normalMapOffset); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_ALPHA, m_tr); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_ALPHA, m_tr); if(bDiffuseMap) { m_pContext->getTextureManager()->selectTexture(0, m_pDiffuseMap, lod_coverage, KRTexture::TEXTURE_USAGE_DIFFUSE_MAP); diff --git a/kraken/KRParticleSystemNewtonian.cpp b/kraken/KRParticleSystemNewtonian.cpp index f7ed811..6edbb77 100755 --- a/kraken/KRParticleSystemNewtonian.cpp +++ b/kraken/KRParticleSystemNewtonian.cpp @@ -104,7 +104,7 @@ void KRParticleSystemNewtonian::render(RenderInfo& ri) { info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline *pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); - pParticleShader->setUniform(KRPipeline::KRENGINE_UNIFORM_FLARE_SIZE, 1.0f); + pParticleShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_FLARE_SIZE, 1.0f); pParticleShader->bind(ri.commandBuffer, *ri.camera, ri.viewport, getModelMatrix(), &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass); m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_RANDOM_PARTICLES, 1.0f); diff --git a/kraken/KRPipeline.cpp b/kraken/KRPipeline.cpp index 969643c..7e65d09 100644 --- a/kraken/KRPipeline.cpp +++ b/kraken/KRPipeline.cpp @@ -116,8 +116,8 @@ KRPipeline::KRPipeline(KRContext& context, KRSurface& surface, const PipelineInf , m_pushConstantBufferSize(0) { for (int i = 0; i < static_cast(ShaderStages::shaderStageCount); i++) { - memset(m_pushConstants[i].size, 0, KRENGINE_NUM_UNIFORMS); - memset(m_pushConstants[i].offset, 0, KRENGINE_NUM_UNIFORMS * sizeof(int)); + memset(m_pushConstants[i].size, 0, kUniformCount); + memset(m_pushConstants[i].offset, 0, kUniformCount * sizeof(int)); } m_pipelineLayout = nullptr; @@ -198,7 +198,7 @@ KRPipeline::KRPipeline(KRContext& context, KRSurface& surface, const PipelineInf m_pushConstantBufferSize = block.size; // Get push constant offsets - for (int iUniform = 0; iUniform < KRENGINE_NUM_UNIFORMS; iUniform++) { + for (int iUniform = 0; iUniform < static_cast(Uniform::KRENGINE_NUM_UNIFORMS); iUniform++) { for (int iMember = 0; iMember < block.member_count; iMember++) { const SpvReflectBlockVariable& member = block.members[iMember]; if (stricmp(KRENGINE_UNIFORM_NAMES[iUniform], member.name) == 0) @@ -475,72 +475,72 @@ KRPipeline::~KRPipeline() { } } -void KRPipeline::setUniform(int location, float value) +void KRPipeline::setUniform(Uniform location, float value) { - if (m_pushConstants[0].size[location] == sizeof(value)) { - float* constant = (float*)(m_pushConstantBuffer + m_pushConstants[0].offset[location]); + if (m_pushConstants[0].size[static_cast(location)] == sizeof(value)) { + float* constant = (float*)(m_pushConstantBuffer + m_pushConstants[0].offset[static_cast(location)]); *constant = value; } } -bool KRPipeline::hasUniform(int location) const +bool KRPipeline::hasUniform(Uniform location) const { for (int i = 0; i < static_cast(ShaderStages::shaderStageCount); i++) { - if (m_pushConstants[i].size) { + if (m_pushConstants[i].size[static_cast(location)]) { return true; } } return false; } -void KRPipeline::setUniform(int location, int value) +void KRPipeline::setUniform(Uniform location, int value) { - if (m_pushConstants[0].size[location] == sizeof(value)) { - int* constant = (int*)(m_pushConstantBuffer + m_pushConstants[0].offset[location]); + if (m_pushConstants[0].size[static_cast(location)] == sizeof(value)) { + int* constant = (int*)(m_pushConstantBuffer + m_pushConstants[0].offset[static_cast(location)]); *constant = value; } } -void KRPipeline::setUniform(int location, const Vector2 &value) +void KRPipeline::setUniform(Uniform location, const Vector2 &value) { - if (m_pushConstants[0].size[location] == sizeof(value)) { - Vector2* constant = (Vector2*)(m_pushConstantBuffer + m_pushConstants[0].offset[location]); + if (m_pushConstants[0].size[static_cast(location)] == sizeof(value)) { + Vector2* constant = (Vector2*)(m_pushConstantBuffer + m_pushConstants[0].offset[static_cast(location)]); *constant = value; } } -void KRPipeline::setUniform(int location, const Vector3 &value) +void KRPipeline::setUniform(Uniform location, const Vector3 &value) { - if (m_pushConstants[0].size[location] == sizeof(value)) { - Vector3* constant = (Vector3*)(m_pushConstantBuffer + m_pushConstants[0].offset[location]); + if (m_pushConstants[0].size[static_cast(location)] == sizeof(value)) { + Vector3* constant = (Vector3*)(m_pushConstantBuffer + m_pushConstants[0].offset[static_cast(location)]); *constant = value; } } -void KRPipeline::setUniform(int location, const Vector4 &value) +void KRPipeline::setUniform(Uniform location, const Vector4 &value) { - if (m_pushConstants[0].size[location] == sizeof(value)) { - Vector4* constant = (Vector4*)(m_pushConstantBuffer + m_pushConstants[0].offset[location]); + if (m_pushConstants[0].size[static_cast(location)] == sizeof(value)) { + Vector4* constant = (Vector4*)(m_pushConstantBuffer + m_pushConstants[0].offset[static_cast(location)]); *constant = value; } } -void KRPipeline::setUniform(int location, const Matrix4 &value) +void KRPipeline::setUniform(Uniform location, const Matrix4 &value) { - if (m_pushConstants[0].size[location] == sizeof(value)) { - Matrix4* constant = (Matrix4*)(m_pushConstantBuffer + m_pushConstants[0].offset[location]); + if (m_pushConstants[0].size[static_cast(location)] == sizeof(value)) { + Matrix4* constant = (Matrix4*)(m_pushConstantBuffer + m_pushConstants[0].offset[static_cast(location)]); *constant = value; } } -void KRPipeline::setUniform(int location, const Matrix4* value, const size_t count) +void KRPipeline::setUniform(Uniform 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)); + // GLDEBUG(glUniformMatrix4fv(pShader->m_pushConstants[0].offset[KRPipeline::Uniform::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 *point_lights, const std::vector *directional_lights, const std::vector *spot_lights, const KRNode::RenderPass &renderPass) { - setUniform(KRENGINE_UNIFORM_ABSOLUTE_TIME, getContext().getAbsoluteTime()); + setUniform(Uniform::KRENGINE_UNIFORM_ABSOLUTE_TIME, getContext().getAbsoluteTime()); int light_directional_count = 0; //int light_point_count = 0; @@ -554,7 +554,7 @@ bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KR KRDirectionalLight* directional_light = (*light_itr); if (light_directional_count == 0) { int cShadowBuffers = directional_light->getShadowBufferCount(); - if (m_pushConstants[0].size[KRENGINE_UNIFORM_SHADOWTEXTURE1] && cShadowBuffers > 0) { + if (hasUniform(Uniform::KRENGINE_UNIFORM_SHADOWTEXTURE1) && cShadowBuffers > 0) { if (m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 3, directional_light->getShadowTextures()[0])) { GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); @@ -564,7 +564,7 @@ bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KR m_pContext->getTextureManager()->_setWrapModeT(3, GL_CLAMP_TO_EDGE); } - if (m_pushConstants[0].size[KRENGINE_UNIFORM_SHADOWTEXTURE2] && cShadowBuffers > 1 && camera.settings.m_cShadowBuffers > 1) { + if (hasUniform(Uniform::KRENGINE_UNIFORM_SHADOWTEXTURE2) && cShadowBuffers > 1 && camera.settings.m_cShadowBuffers > 1) { if (m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 4, directional_light->getShadowTextures()[1])) { GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); @@ -573,7 +573,7 @@ bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KR m_pContext->getTextureManager()->_setWrapModeT(4, GL_CLAMP_TO_EDGE); } - if (m_pushConstants[0].size[KRENGINE_UNIFORM_SHADOWTEXTURE3] && cShadowBuffers > 2 && camera.settings.m_cShadowBuffers > 2) { + if (hasUniform(Uniform::KRENGINE_UNIFORM_SHADOWTEXTURE3) && cShadowBuffers > 2 && camera.settings.m_cShadowBuffers > 2) { if (m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 5, directional_light->getShadowTextures()[2])) { GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); GLDEBUG(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); @@ -586,17 +586,17 @@ bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KR matBias.translate(1.0, 1.0, 1.0); matBias.scale(0.5); for (int iShadow = 0; iShadow < cShadowBuffers; iShadow++) { - setUniform(KRENGINE_UNIFORM_SHADOWMVP1 + iShadow, matModel * directional_light->getShadowViewports()[iShadow].getViewProjectionMatrix() * matBias); + setUniform(static_cast(static_cast(Uniform::KRENGINE_UNIFORM_SHADOWMVP1) + iShadow), matModel * directional_light->getShadowViewports()[iShadow].getViewProjectionMatrix() * matBias); } - if (m_pushConstants[0].size[KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE]) { + if (hasUniform(Uniform::KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE)) { Matrix4 inverseModelMatrix = matModel; inverseModelMatrix.invert(); // Bind the light direction vector Vector3 lightDirObject = Matrix4::Dot(inverseModelMatrix, directional_light->getWorldLightDirection()); lightDirObject.normalize(); - setUniform(KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE, lightDirObject); + setUniform(Uniform::KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE, lightDirObject); } } @@ -608,57 +608,57 @@ bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KR //light_spot_count = spot_lights.size(); } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE]) { + if(hasUniform(Uniform::KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE)) { Matrix4 inverseModelMatrix = matModel; inverseModelMatrix.invert(); - if(m_pushConstants[0].size[KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE]) { + if(hasUniform(Uniform::KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE)) { // Transform location of camera to object space for calculation of specular halfVec Vector3 cameraPosObject = Matrix4::Dot(inverseModelMatrix, viewport.getCameraPosition()); - setUniform(KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE, cameraPosObject); + setUniform(Uniform::KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE, cameraPosObject); } } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_MVP] || m_pushConstants[0].size[KRPipeline::KRENGINE_UNIFORM_INVMVP]) { + if(hasUniform(Uniform::KRENGINE_UNIFORM_MVP) || hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_INVMVP)) { // Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram Matrix4 mvpMatrix = matModel * viewport.getViewProjectionMatrix(); - setUniform(KRENGINE_UNIFORM_MVP, mvpMatrix); + setUniform(Uniform::KRENGINE_UNIFORM_MVP, mvpMatrix); - if(m_pushConstants[0].size[KRPipeline::KRENGINE_UNIFORM_INVMVP]) { - setUniform(KRPipeline::KRENGINE_UNIFORM_INVMVP, Matrix4::Invert(mvpMatrix)); + if(hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_INVMVP)) { + setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_INVMVP, Matrix4::Invert(mvpMatrix)); } } - if(m_pushConstants[0].size[KRPipeline::KRENGINE_UNIFORM_VIEW_SPACE_MODEL_ORIGIN] || m_pushConstants[0].size[KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE] || m_pushConstants[0].size[KRPipeline::KRENGINE_UNIFORM_MODEL_VIEW]) { + if(hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_VIEW_SPACE_MODEL_ORIGIN) || hasUniform(Uniform::KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE) || hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MODEL_VIEW)) { Matrix4 matModelView = matModel * viewport.getViewMatrix(); - setUniform(KRENGINE_UNIFORM_MODEL_VIEW, matModelView); + setUniform(Uniform::KRENGINE_UNIFORM_MODEL_VIEW, matModelView); - if(m_pushConstants[0].size[KRPipeline::KRENGINE_UNIFORM_VIEW_SPACE_MODEL_ORIGIN]) { + if(hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_VIEW_SPACE_MODEL_ORIGIN)) { Vector3 view_space_model_origin = Matrix4::Dot(matModelView, Vector3::Zero()); // Origin point of model space is the light source position. No perspective, so no w divide required - setUniform(KRENGINE_UNIFORM_VIEW_SPACE_MODEL_ORIGIN, view_space_model_origin); + setUniform(Uniform::KRENGINE_UNIFORM_VIEW_SPACE_MODEL_ORIGIN, view_space_model_origin); } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE]) { + if(hasUniform(Uniform::KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE)) { Matrix4 matModelViewInverseTranspose = matModelView; matModelViewInverseTranspose.transpose(); matModelViewInverseTranspose.invert(); - setUniform(KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE, matModelViewInverseTranspose); + setUniform(Uniform::KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE, matModelViewInverseTranspose); } } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_MODEL_INVERSE_TRANSPOSE]) { + if(hasUniform(Uniform::KRENGINE_UNIFORM_MODEL_INVERSE_TRANSPOSE)) { Matrix4 matModelInverseTranspose = matModel; matModelInverseTranspose.transpose(); matModelInverseTranspose.invert(); - setUniform(KRENGINE_UNIFORM_MODEL_INVERSE_TRANSPOSE, matModelInverseTranspose); + setUniform(Uniform::KRENGINE_UNIFORM_MODEL_INVERSE_TRANSPOSE, matModelInverseTranspose); } - if(m_pushConstants[0].size[KRPipeline::KRENGINE_UNIFORM_INVP]) { - setUniform(KRENGINE_UNIFORM_INVP, viewport.getInverseProjectionMatrix()); + if(hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_INVP)) { + setUniform(Uniform::KRENGINE_UNIFORM_INVP, viewport.getInverseProjectionMatrix()); } - if(m_pushConstants[0].size[KRPipeline::KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE]) { + if(hasUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE)) { Matrix4 matInvMVPNoTranslate = matModel * viewport.getViewMatrix();; // Remove the translation matInvMVPNoTranslate.getPointer()[3] = 0; @@ -670,16 +670,16 @@ bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KR matInvMVPNoTranslate.getPointer()[15] = 1.0; matInvMVPNoTranslate = matInvMVPNoTranslate * viewport.getProjectionMatrix(); matInvMVPNoTranslate.invert(); - setUniform(KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE, matInvMVPNoTranslate); + setUniform(Uniform::KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE, matInvMVPNoTranslate); } - setUniform(KRENGINE_UNIFORM_MODEL_MATRIX, matModel); - if(m_pushConstants[0].size[KRENGINE_UNIFORM_PROJECTION_MATRIX]) { - setUniform(KRENGINE_UNIFORM_PROJECTION_MATRIX, viewport.getProjectionMatrix()); + setUniform(Uniform::KRENGINE_UNIFORM_MODEL_MATRIX, matModel); + if(hasUniform(Uniform::KRENGINE_UNIFORM_PROJECTION_MATRIX)) { + setUniform(Uniform::KRENGINE_UNIFORM_PROJECTION_MATRIX, viewport.getProjectionMatrix()); } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_VIEWPORT]) { - setUniform(KRENGINE_UNIFORM_VIEWPORT, Vector4::Create( + if(hasUniform(Uniform::KRENGINE_UNIFORM_VIEWPORT)) { + setUniform(Uniform::KRENGINE_UNIFORM_VIEWPORT, Vector4::Create( (float)0.0, (float)0.0, (float)viewport.getSize().x, @@ -688,47 +688,47 @@ bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KR ); } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_VIEWPORT_DOWNSAMPLE]) { - setUniform(KRENGINE_UNIFORM_VIEWPORT_DOWNSAMPLE, camera.getDownsample()); + if(hasUniform(Uniform::KRENGINE_UNIFORM_VIEWPORT_DOWNSAMPLE)) { + setUniform(Uniform::KRENGINE_UNIFORM_VIEWPORT_DOWNSAMPLE, camera.getDownsample()); } // Fog parameters - setUniform(KRENGINE_UNIFORM_FOG_NEAR, camera.settings.fog_near); - setUniform(KRENGINE_UNIFORM_FOG_FAR, camera.settings.fog_far); - setUniform(KRENGINE_UNIFORM_FOG_DENSITY, camera.settings.fog_density); - setUniform(KRENGINE_UNIFORM_FOG_COLOR, camera.settings.fog_color); + setUniform(Uniform::KRENGINE_UNIFORM_FOG_NEAR, camera.settings.fog_near); + setUniform(Uniform::KRENGINE_UNIFORM_FOG_FAR, camera.settings.fog_far); + setUniform(Uniform::KRENGINE_UNIFORM_FOG_DENSITY, camera.settings.fog_density); + setUniform(Uniform::KRENGINE_UNIFORM_FOG_COLOR, camera.settings.fog_color); - if(m_pushConstants[0].size[KRENGINE_UNIFORM_FOG_SCALE]) { - setUniform(KRENGINE_UNIFORM_FOG_SCALE, 1.0f / (camera.settings.fog_far - camera.settings.fog_near)); + if(hasUniform(Uniform::KRENGINE_UNIFORM_FOG_SCALE)) { + setUniform(Uniform::KRENGINE_UNIFORM_FOG_SCALE, 1.0f / (camera.settings.fog_far - camera.settings.fog_near)); } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_EXPONENTIAL]) { - setUniform(KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_EXPONENTIAL, -camera.settings.fog_density * 1.442695f); // -fog_density / log(2) + if(hasUniform(Uniform::KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_EXPONENTIAL)) { + setUniform(Uniform::KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_EXPONENTIAL, -camera.settings.fog_density * 1.442695f); // -fog_density / log(2) } - if(m_pushConstants[0].size[KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_SQUARED]) { - setUniform(KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_SQUARED, (float)(-camera.settings.fog_density * camera.settings.fog_density * 1.442695)); // -fog_density * fog_density / log(2) + if(hasUniform(Uniform::KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_SQUARED)) { + setUniform(Uniform::KRENGINE_UNIFORM_DENSITY_PREMULTIPLIED_SQUARED, (float)(-camera.settings.fog_density * camera.settings.fog_density * 1.442695)); // -fog_density * fog_density / log(2) } // Sets the diffuseTexture variable to the first texture unit - setUniform(KRENGINE_UNIFORM_DIFFUSETEXTURE, 0); + setUniform(Uniform::KRENGINE_UNIFORM_DIFFUSETEXTURE, 0); // Sets the specularTexture variable to the second texture unit - setUniform(KRENGINE_UNIFORM_SPECULARTEXTURE, 1); + setUniform(Uniform::KRENGINE_UNIFORM_SPECULARTEXTURE, 1); // Sets the normalTexture variable to the third texture unit - setUniform(KRENGINE_UNIFORM_NORMALTEXTURE, 2); + setUniform(Uniform::KRENGINE_UNIFORM_NORMALTEXTURE, 2); // Sets the shadowTexture variable to the fourth texture unit - setUniform(KRENGINE_UNIFORM_SHADOWTEXTURE1, 3); - setUniform(KRENGINE_UNIFORM_SHADOWTEXTURE2, 4); - setUniform(KRENGINE_UNIFORM_SHADOWTEXTURE3, 5); - setUniform(KRENGINE_UNIFORM_REFLECTIONCUBETEXTURE, 4); - setUniform(KRENGINE_UNIFORM_LIGHTMAPTEXTURE, 5); - setUniform(KRENGINE_UNIFORM_GBUFFER_FRAME, 6); - setUniform(KRENGINE_UNIFORM_GBUFFER_DEPTH, 7); // Texture unit 7 is used for reading the depth buffer in gBuffer pass #2 and in post-processing pass - setUniform(KRENGINE_UNIFORM_REFLECTIONTEXTURE, 7); // Texture unit 7 is used for the reflection map textures in gBuffer pass #3 and when using forward rendering - setUniform(KRENGINE_UNIFORM_DEPTH_FRAME, 0); - setUniform(KRENGINE_UNIFORM_RENDER_FRAME, 1); - setUniform(KRENGINE_UNIFORM_VOLUMETRIC_ENVIRONMENT_FRAME, 2); + setUniform(Uniform::KRENGINE_UNIFORM_SHADOWTEXTURE1, 3); + setUniform(Uniform::KRENGINE_UNIFORM_SHADOWTEXTURE2, 4); + setUniform(Uniform::KRENGINE_UNIFORM_SHADOWTEXTURE3, 5); + setUniform(Uniform::KRENGINE_UNIFORM_REFLECTIONCUBETEXTURE, 4); + setUniform(Uniform::KRENGINE_UNIFORM_LIGHTMAPTEXTURE, 5); + setUniform(Uniform::KRENGINE_UNIFORM_GBUFFER_FRAME, 6); + setUniform(Uniform::KRENGINE_UNIFORM_GBUFFER_DEPTH, 7); // Texture unit 7 is used for reading the depth buffer in gBuffer pass #2 and in post-processing pass + setUniform(Uniform::KRENGINE_UNIFORM_REFLECTIONTEXTURE, 7); // Texture unit 7 is used for the reflection map textures in gBuffer pass #3 and when using forward rendering + setUniform(Uniform::KRENGINE_UNIFORM_DEPTH_FRAME, 0); + setUniform(Uniform::KRENGINE_UNIFORM_RENDER_FRAME, 1); + setUniform(Uniform::KRENGINE_UNIFORM_VOLUMETRIC_ENVIRONMENT_FRAME, 2); if(m_pushConstantBuffer) { vkCmdPushConstants(commandBuffer, m_pushConstantsLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, m_pushConstantBufferSize, m_pushConstantBuffer); diff --git a/kraken/KRPipeline.h b/kraken/KRPipeline.h index 7fb9f8e..48718f2 100644 --- a/kraken/KRPipeline.h +++ b/kraken/KRPipeline.h @@ -212,7 +212,7 @@ public: bool bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KRViewport &viewport, const Matrix4 &matModel, const std::vector *point_lights, const std::vector *directional_lights, const std::vector*spot_lights, const KRNode::RenderPass &renderPass); - enum { + enum class Uniform : uint8_t { KRENGINE_UNIFORM_MATERIAL_AMBIENT = 0, KRENGINE_UNIFORM_MATERIAL_DIFFUSE, KRENGINE_UNIFORM_MATERIAL_SPECULAR, @@ -284,6 +284,8 @@ public: KRENGINE_NUM_UNIFORMS }; + static const size_t kUniformCount = static_cast(Uniform::KRENGINE_NUM_UNIFORMS); + enum class ShaderStages : uint8_t { vertex = 0, @@ -292,15 +294,17 @@ public: compute, shaderStageCount }; + + static const size_t kShaderStageCount = static_cast(ShaderStages::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); + bool hasUniform(Uniform location) const; + void setUniform(Uniform location, float value); + void setUniform(Uniform location, int value); + void setUniform(Uniform location, const Vector2 &value); + void setUniform(Uniform location, const Vector3 &value); + void setUniform(Uniform location, const Vector4 &value); + void setUniform(Uniform location, const Matrix4 &value); + void setUniform(Uniform location, const Matrix4* value, const size_t count); VkPipeline& getPipeline(); @@ -309,8 +313,8 @@ private: struct PushConstantStageInfo { - int offset[KRENGINE_NUM_UNIFORMS]; - __uint8_t size[KRENGINE_NUM_UNIFORMS]; + int offset[kUniformCount]; + __uint8_t size[kUniformCount]; }; PushConstantStageInfo m_pushConstants[static_cast(ShaderStages::shaderStageCount)]; diff --git a/kraken/KRPointLight.cpp b/kraken/KRPointLight.cpp index c8cf651..845cfe7 100755 --- a/kraken/KRPointLight.cpp +++ b/kraken/KRPointLight.cpp @@ -112,11 +112,11 @@ void KRPointLight::render(RenderInfo& ri) info.modelFormat = bInsideLight ? ModelFormat::KRENGINE_MODEL_FORMAT_STRIP : ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_COLOR, m_color); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_INTENSITY, m_intensity * 0.01f); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_DECAY_START, getDecayStart()); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_CUTOFF, KRLIGHT_MIN_INFLUENCE); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_POSITION, light_position); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_COLOR, m_color); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_INTENSITY, m_intensity * 0.01f); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_DECAY_START, getDecayStart()); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_CUTOFF, KRLIGHT_MIN_INFLUENCE); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_LIGHT_POSITION, light_position); pShader->bind(ri.commandBuffer, *ri.camera, ri.viewport, sphereModelMatrix, &this_light, nullptr, nullptr, ri.renderPass); if(bInsideLight) { diff --git a/kraken/KRSprite.cpp b/kraken/KRSprite.cpp index 6921bcc..936ea6d 100755 --- a/kraken/KRSprite.cpp +++ b/kraken/KRSprite.cpp @@ -158,7 +158,7 @@ void KRSprite::render(RenderInfo& ri) { info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_STRIP; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_ALPHA, m_spriteAlpha); + pShader->setUniform(KRPipeline::Uniform::KRENGINE_UNIFORM_MATERIAL_ALPHA, m_spriteAlpha); pShader->bind(ri.commandBuffer, *ri.camera, ri.viewport, getModelMatrix(), &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass); m_pContext->getTextureManager()->selectTexture(0, m_pSpriteTexture, 0.0f, KRTexture::TEXTURE_USAGE_SPRITE);