Added KRCamera argument to getShaderValue calls, enabling viewport specific shader reflection
Some checks failed
CMake on multiple platforms / build (Release, cl, cl, windows-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, macos-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, ubuntu-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, gcc, g++, ubuntu-latest) (push) Has been cancelled

Eliminated more direct setPushConstant calls
This commit is contained in:
2026-06-01 23:05:25 -07:00
parent 1b2703b902
commit 447f2d730d
25 changed files with 178 additions and 136 deletions

View File

@@ -37,7 +37,7 @@
using namespace hydra; using namespace hydra;
KRModelView::KRModelView(KRViewport* viewport, const hydra::Matrix4& matModel, KRDirectionalLight* directionalLight) KRModelView::KRModelView(const KRViewport* viewport, const hydra::Matrix4& matModel, KRDirectionalLight* directionalLight)
: m_viewport(viewport) : m_viewport(viewport)
, m_matModel(matModel) , m_matModel(matModel)
, m_directionalLight(directionalLight) , m_directionalLight(directionalLight)
@@ -53,7 +53,7 @@ KRModelView::~KRModelView()
} }
bool KRModelView::getShaderValue(ShaderValue value, Vector3* output) const bool KRModelView::getShaderValue(const KRCamera* camera, ShaderValue value, Vector3* output) const
{ {
if (m_directionalLight) { if (m_directionalLight) {
switch (value) { switch (value) {
@@ -95,7 +95,7 @@ bool KRModelView::getShaderValue(ShaderValue value, Vector3* output) const
return false; return false;
} }
} }
bool KRModelView::getShaderValue(ShaderValue value, Matrix4* output) const bool KRModelView::getShaderValue(const KRCamera* camera, ShaderValue value, Matrix4* output) const
{ {
if (m_directionalLight) { if (m_directionalLight) {
switch (value) { switch (value) {

View File

@@ -44,14 +44,14 @@ class KRModelView
: public KRReflectedObject : public KRReflectedObject
{ {
public: public:
KRModelView(KRViewport* viewport, const hydra::Matrix4& matModel, KRDirectionalLight* directionalLight); KRModelView(const KRViewport* viewport, const hydra::Matrix4& matModel, KRDirectionalLight* directionalLight);
~KRModelView(); ~KRModelView();
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const final;
bool getShaderValue(ShaderValue value, hydra::Matrix4* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix4* output) const final;
private: private:
KRViewport* m_viewport; const KRViewport* m_viewport;
hydra::Matrix4 m_matModel; hydra::Matrix4 m_matModel;
KRDirectionalLight* m_directionalLight; KRDirectionalLight* m_directionalLight;

View File

@@ -569,7 +569,7 @@ bool KRPipeline::setImageBindings(const std::vector<const KRReflectedObject*> ob
return success; return success;
} }
bool KRPipeline::setPushConstants(const std::vector<const KRReflectedObject*> objects) bool KRPipeline::setPushConstants(const KRCamera* camera, const std::vector<const KRReflectedObject*> objects)
{ {
bool success = true; bool success = true;
for (StageInfo& stageInfo : m_stages) { for (StageInfo& stageInfo : m_stages) {
@@ -580,7 +580,7 @@ bool KRPipeline::setPushConstants(const std::vector<const KRReflectedObject*> ob
void* constant = (pushConstants.buffer + pushConstants.offset[static_cast<size_t>(i)]); void* constant = (pushConstants.buffer + pushConstants.offset[static_cast<size_t>(i)]);
bool found = false; bool found = false;
for (const KRReflectedObject* object : objects) { for (const KRReflectedObject* object : objects) {
if (object->getShaderValue(static_cast<ShaderValue>(i), pushConstants.type[static_cast<size_t>(i)], constant)) { if (object->getShaderValue(camera, static_cast<ShaderValue>(i), pushConstants.type[static_cast<size_t>(i)], constant)) {
found = true; found = true;
break; break;
} }
@@ -678,7 +678,7 @@ void KRPipeline::updateDescriptorBinding()
bool KRPipeline::updatePushConstants(KRNode::RenderInfo& ri, const Matrix4& matModel) bool KRPipeline::updatePushConstants(KRNode::RenderInfo& ri, const Matrix4& matModel)
{ {
if (!setPushConstants(ri.reflectedObjects)) { if (!setPushConstants(ri.camera, ri.reflectedObjects)) {
return false; return false;
} }
setPushConstant(ShaderValue::absolute_time, getContext().getAbsoluteTime()); setPushConstant(ShaderValue::absolute_time, getContext().getAbsoluteTime());

View File

@@ -222,7 +222,7 @@ public:
static const size_t kPushConstantCount = static_cast<size_t>(ShaderValue::NUM_SHADER_VALUES); static const size_t kPushConstantCount = static_cast<size_t>(ShaderValue::NUM_SHADER_VALUES);
bool setImageBindings(const std::vector<const KRReflectedObject*> objects); bool setImageBindings(const std::vector<const KRReflectedObject*> objects);
bool setPushConstants(const std::vector<const KRReflectedObject*> objects); bool setPushConstants(const KRCamera* camera, const std::vector<const KRReflectedObject*> objects);
bool hasPushConstant(ShaderValue location) const; bool hasPushConstant(ShaderValue location) const;
void setPushConstant(ShaderValue location, float value); void setPushConstant(ShaderValue location, float value);
void setPushConstant(ShaderValue location, int value); void setPushConstant(ShaderValue location, int value);

View File

@@ -183,11 +183,12 @@ void KRRenderSettings::setViewportSize(const Vector2& size)
m_viewportSize = size; m_viewportSize = size;
} }
float KRRenderSettings::getPerspectiveNearZ() float KRRenderSettings::getPerspectiveNearZ() const
{ {
return perspective_nearz; return perspective_nearz;
} }
float KRRenderSettings::getPerspectiveFarZ()
float KRRenderSettings::getPerspectiveFarZ() const
{ {
return perspective_farz; return perspective_farz;
} }
@@ -225,7 +226,7 @@ void KRRenderSettings::setEnableRealtimeOcclusion(bool enable)
m_enable_realtime_occlusion = enable; m_enable_realtime_occlusion = enable;
} }
bool KRRenderSettings::getShaderValue(ShaderValue value, float* output) const bool KRRenderSettings::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::fog_near: case ShaderValue::fog_near:
@@ -251,7 +252,7 @@ bool KRRenderSettings::getShaderValue(ShaderValue value, float* output) const
} }
} }
bool KRRenderSettings::getShaderValue(ShaderValue value, Vector3* output) const bool KRRenderSettings::getShaderValue(const KRCamera* camera, ShaderValue value, Vector3* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::fog_color: case ShaderValue::fog_color:

View File

@@ -48,8 +48,8 @@ public:
const hydra::Vector2& getViewportSize(); const hydra::Vector2& getViewportSize();
void setViewportSize(const hydra::Vector2& size); void setViewportSize(const hydra::Vector2& size);
float getPerspectiveNearZ(); float getPerspectiveNearZ() const;
float getPerspectiveFarZ(); float getPerspectiveFarZ() const;
void setPerspectiveNear(float v); void setPerspectiveNear(float v);
void setPerpsectiveFarZ(float v); void setPerpsectiveFarZ(float v);
@@ -137,6 +137,6 @@ private:
float m_lodBias; float m_lodBias;
bool m_enable_realtime_occlusion; bool m_enable_realtime_occlusion;
bool getShaderValue(ShaderValue value, float* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const final;
}; };

View File

@@ -219,92 +219,92 @@ const char* getShaderValueName(int index)
return SHADER_VALUE_NAMES[index]; return SHADER_VALUE_NAMES[index];
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, ShaderValueType type, void* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, ShaderValueType type, void* output) const
{ {
switch (type) { switch (type) {
case ShaderValueType::type_bool: case ShaderValueType::type_bool:
return getShaderValue(value, static_cast<bool*>(output)); return getShaderValue(camera, value, static_cast<bool*>(output));
case ShaderValueType::type_int32: case ShaderValueType::type_int32:
return getShaderValue(value, static_cast<int32_t*>(output)); return getShaderValue(camera, value, static_cast<int32_t*>(output));
case ShaderValueType::type_int64: case ShaderValueType::type_int64:
return getShaderValue(value, static_cast<int64_t*>(output)); return getShaderValue(camera, value, static_cast<int64_t*>(output));
case ShaderValueType::type_float32: case ShaderValueType::type_float32:
return getShaderValue(value, static_cast<float*>(output)); return getShaderValue(camera, value, static_cast<float*>(output));
case ShaderValueType::type_float64: case ShaderValueType::type_float64:
return getShaderValue(value, static_cast<double*>(output)); return getShaderValue(camera, value, static_cast<double*>(output));
case ShaderValueType::type_vector2: case ShaderValueType::type_vector2:
return getShaderValue(value, static_cast<Vector2*>(output)); return getShaderValue(camera, value, static_cast<Vector2*>(output));
case ShaderValueType::type_vector3: case ShaderValueType::type_vector3:
return getShaderValue(value, static_cast<Vector3*>(output)); return getShaderValue(camera, value, static_cast<Vector3*>(output));
case ShaderValueType::type_vector4: case ShaderValueType::type_vector4:
return getShaderValue(value, static_cast<Vector4*>(output)); return getShaderValue(camera, value, static_cast<Vector4*>(output));
case ShaderValueType::type_matrix2: case ShaderValueType::type_matrix2:
return getShaderValue(value, static_cast<Matrix2*>(output)); return getShaderValue(camera, value, static_cast<Matrix2*>(output));
case ShaderValueType::type_matrix2x3: case ShaderValueType::type_matrix2x3:
return getShaderValue(value, static_cast<Matrix2x3*>(output)); return getShaderValue(camera, value, static_cast<Matrix2x3*>(output));
case ShaderValueType::type_matrix4: case ShaderValueType::type_matrix4:
return getShaderValue(value, static_cast<Matrix4*>(output)); return getShaderValue(camera, value, static_cast<Matrix4*>(output));
default: default:
return false; return false;
} }
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, bool* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, bool* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, int32_t* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, int32_t* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, int64_t* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, int64_t* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, float* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, double* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, double* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, hydra::Vector2* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector2* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, hydra::Vector3* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, hydra::Vector4* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector4* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, hydra::Matrix2* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix2* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, hydra::Matrix2x3* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix2x3* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, hydra::Matrix4* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix4* output) const
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, KRResourceBinding* output) const bool KRReflectedObject::getShaderValue(const KRCamera* camera, ShaderValue value, KRResourceBinding* output) const
{ {
return false; return false;
} }

View File

@@ -39,6 +39,7 @@
class KRResourceBinding; class KRResourceBinding;
class KRSampler; class KRSampler;
class KRTextureBinding; class KRTextureBinding;
class KRCamera;
enum class ShaderValueType : uint8_t enum class ShaderValueType : uint8_t
{ {
@@ -223,19 +224,19 @@ const char* getShaderValueName(int index);
class KRReflectedObject class KRReflectedObject
{ {
public: public:
bool getShaderValue(ShaderValue value, ShaderValueType type, void* output) const; bool getShaderValue(const KRCamera* camera, ShaderValue value, ShaderValueType type, void* output) const;
virtual bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const; virtual bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const;
protected: protected:
virtual bool getShaderValue(ShaderValue value, bool* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, bool* output) const;
virtual bool getShaderValue(ShaderValue value, int32_t* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, int32_t* output) const;
virtual bool getShaderValue(ShaderValue value, int64_t* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, int64_t* output) const;
virtual bool getShaderValue(ShaderValue value, float* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const;
virtual bool getShaderValue(ShaderValue value, double* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, double* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Vector2* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector2* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Vector3* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Vector4* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector4* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Matrix2* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix2* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Matrix2x3* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix2x3* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Matrix4* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix4* output) const;
virtual bool getShaderValue(ShaderValue value, KRResourceBinding* output) const; virtual bool getShaderValue(const KRCamera* camera, ShaderValue value, KRResourceBinding* output) const;
}; };

View File

@@ -55,7 +55,7 @@ KRViewport::KRViewport(const Vector2& size, const Matrix4& matView, const Matrix
calculateDerivedValues(); calculateDerivedValues();
} }
bool KRViewport::getShaderValue(ShaderValue value, Matrix4* output) const bool KRViewport::getShaderValue(const KRCamera* camera, ShaderValue value, Matrix4* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::projection_matrix: case ShaderValue::projection_matrix:
@@ -69,7 +69,7 @@ bool KRViewport::getShaderValue(ShaderValue value, Matrix4* output) const
} }
} }
bool KRViewport::getShaderValue(ShaderValue value, Vector4* output) const bool KRViewport::getShaderValue(const KRCamera* camera, ShaderValue value, Vector4* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::viewport: case ShaderValue::viewport:

View File

@@ -47,8 +47,8 @@ public:
KRViewport(const hydra::Vector2& size, const hydra::Matrix4& matView, const hydra::Matrix4& matProjection); KRViewport(const hydra::Vector2& size, const hydra::Matrix4& matView, const hydra::Matrix4& matProjection);
~KRViewport(); ~KRViewport();
bool getShaderValue(ShaderValue value, hydra::Vector4* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector4* output) const final;
bool getShaderValue(ShaderValue value, hydra::Matrix4* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Matrix4* output) const final;
const hydra::Vector2& getSize() const; const hydra::Vector2& getSize() const;
const hydra::Matrix4& getViewMatrix() const; const hydra::Matrix4& getViewMatrix() const;

View File

@@ -823,11 +823,16 @@ std::string KRCamera::getDebugText()
} }
KRViewport* KRCamera::getViewport() const KRViewport* KRCamera::getViewport() const
{ {
return &m_viewport; return &m_viewport;
} }
const KRRenderSettings* KRCamera::getSettings() const
{
return &settings;
}
void KRCamera::setFadeColor(const Vector4& fade_color) void KRCamera::setFadeColor(const Vector4& fade_color)
{ {
m_fade_color = fade_color; m_fade_color = fade_color;
@@ -838,14 +843,14 @@ Vector4 KRCamera::getFadeColor()
return m_fade_color; return m_fade_color;
} }
bool KRCamera::getShaderValue(ShaderValue value, hydra::Vector4* output) const bool KRCamera::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector4* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::fade_color: case ShaderValue::fade_color:
*output = m_fade_color; *output = m_fade_color;
return true; return true;
default: default:
return KRNode::getShaderValue(value, output); return KRNode::getShaderValue(camera, value, output);
} }
} }

View File

@@ -66,9 +66,9 @@ public:
bool alwaysStreamResources() override; bool alwaysStreamResources() override;
KRRenderSettings settings; KRRenderSettings settings;
const KRRenderSettings* getSettings() const;
KRViewport* getViewport(); const KRViewport* getViewport() const;
virtual std::string getElementName() override; virtual std::string getElementName() override;
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent) override; virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent) override;
@@ -85,7 +85,7 @@ public:
const std::string getSkyBox() const; const std::string getSkyBox() const;
protected: protected:
bool getShaderValue(ShaderValue value, hydra::Vector4* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector4* output) const override;
bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const override; bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const override;
private: private:

View File

@@ -171,6 +171,31 @@ void KRLight::getResourceBindings(std::list<KRResourceBinding*>& bindings)
bindings.push_back(&m_flareTexture.val); bindings.push_back(&m_flareTexture.val);
} }
Matrix4 KRLight::getParticleModelMatrix(const KRViewport& viewport) const
{
Matrix4 particleModelMatrix;
particleModelMatrix.scale(KRLIGHT_PARTICLE_RANGE); // Scale the box symetrically to ensure that we don't have an uneven distribution of particles for different angles of the view frustrum
particleModelMatrix.translate(viewport.getCameraPosition());
return particleModelMatrix;
}
int KRLight::getParticleCount() const
{
int particle_count = (int)(m_dust_particle_density * pow(KRLIGHT_PARTICLE_RANGE, 3));
if (particle_count > KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES) {
particle_count = KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES;
}
return particle_count;
}
int KRLight::getSliceCount(const KRCamera* camera) const
{
int slice_count = (int)(camera->getSettings()->volumetric_environment_quality * 495.0) + 5;
return slice_count;
}
void KRLight::render(RenderInfo& ri) void KRLight::render(RenderInfo& ri)
{ {
KRNode::render(ri); KRNode::render(ri);
@@ -187,17 +212,6 @@ void KRLight::render(RenderInfo& ri)
if (ri.viewport->visible(getBounds()) || true) { // FINDME, HACK need to remove "|| true"? if (ri.viewport->visible(getBounds()) || true) { // FINDME, HACK need to remove "|| true"?
float particle_range = 600.0f;
int particle_count = (int)(m_dust_particle_density * pow(particle_range, 3));
if (particle_count > KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES) {
particle_count = KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES;
}
Matrix4 particleModelMatrix;
particleModelMatrix.scale(particle_range); // Scale the box symetrically to ensure that we don't have an uneven distribution of particles for different angles of the view frustrum
particleModelMatrix.translate(ri.viewport->getCameraPosition());
std::vector<KRDirectionalLight*> this_directional_light; std::vector<KRDirectionalLight*> this_directional_light;
std::vector<KRSpotLight*> this_spot_light; std::vector<KRSpotLight*> this_spot_light;
std::vector<KRPointLight*> this_point_light; std::vector<KRPointLight*> this_point_light;
@@ -227,15 +241,9 @@ void KRLight::render(RenderInfo& ri)
info.vertexAttributes = (1 << KRMesh::KRENGINE_ATTRIB_VERTEX) | (1 << KRMesh::KRENGINE_ATTRIB_TEXUVA); info.vertexAttributes = (1 << KRMesh::KRENGINE_ATTRIB_VERTEX) | (1 << KRMesh::KRENGINE_ATTRIB_TEXUVA);
info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES; info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES;
KRPipeline* pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); KRPipeline* pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info);
if (pParticleShader) { if (pParticleShader && pParticleShader->bind(ri, getParticleModelMatrix(*ri.viewport))) { // TODO: Pass light index to shader
pParticleShader->setPushConstant(ShaderValue::dust_particle_color, m_color.val * ri.camera->settings.dust_particle_intensity * m_dust_particle_intensity * m_intensity);
pParticleShader->setPushConstant(ShaderValue::particle_origin, Matrix4::DotWDiv(Matrix4::Invert(particleModelMatrix), Vector3::Zero()));
if (pParticleShader->bind(ri, particleModelMatrix)) { // TODO: Pass light index to shader
m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_RANDOM_PARTICLES, 1.0f); m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_RANDOM_PARTICLES, 1.0f);
vkCmdDraw(ri.commandBuffer, getParticleCount() *3, 1, 0, 0);
vkCmdDraw(ri.commandBuffer, particle_count * 3, 1, 0, 0);
}
} }
} }
} }
@@ -261,12 +269,6 @@ void KRLight::render(RenderInfo& ri)
this_point_light.push_back(point_light); this_point_light.push_back(point_light);
} }
int slice_count = (int)(ri.camera->settings.volumetric_environment_quality * 495.0) + 5;
float slice_near = -ri.camera->settings.getPerspectiveNearZ();
float slice_far = -ri.camera->settings.volumetric_environment_max_distance;
float slice_spacing = (slice_far - slice_near) / slice_count;
PipelineInfo info{}; PipelineInfo info{};
info.shader_name = &shader_name; info.shader_name = &shader_name;
info.pCamera = ri.camera; info.pCamera = ri.camera;
@@ -281,11 +283,9 @@ void KRLight::render(RenderInfo& ri)
KRPipeline* pFogShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); KRPipeline* pFogShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info);
if (pFogShader) { if (pFogShader) {
pFogShader->setPushConstant(ShaderValue::slice_depth_scale, Vector2::Create(slice_near, slice_spacing));
pFogShader->setPushConstant(ShaderValue::light_color, (m_color.val * ri.camera->settings.volumetric_environment_intensity * m_intensity * -slice_spacing / 10.0f));
if (pFogShader->bind(ri, Matrix4())) { // TODO: Pass indexes of lights to shader if (pFogShader->bind(ri, Matrix4())) { // TODO: Pass indexes of lights to shader
m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_VOLUMETRIC_LIGHTING, 1.0f); m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_VOLUMETRIC_LIGHTING, 1.0f);
vkCmdDraw(ri.commandBuffer, slice_count * 6, 1, 0, 0); vkCmdDraw(ri.commandBuffer, getSliceCount(ri.camera) * 6, 1, 0, 0);
} }
} }
@@ -447,7 +447,7 @@ int KRLight::configureShadowBufferViewports(const KRViewport& viewport)
void KRLight::renderShadowBuffers(RenderInfo& ri) void KRLight::renderShadowBuffers(RenderInfo& ri)
{ {
KRViewport* prevViewport = ri.viewport; const KRViewport* prevViewport = ri.viewport;
for (int iShadow = 0; iShadow < m_cShadowBuffers; iShadow++) { for (int iShadow = 0; iShadow < m_cShadowBuffers; iShadow++) {
if (!shadowValid[iShadow]) { if (!shadowValid[iShadow]) {
shadowValid[iShadow] = true; shadowValid[iShadow] = true;
@@ -515,7 +515,7 @@ KRViewport* KRLight::getShadowViewports()
return m_shadowViewports; return m_shadowViewports;
} }
bool KRLight::getShaderValue(ShaderValue value, float* output) const bool KRLight::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::light_intensity: case ShaderValue::light_intensity:
@@ -534,11 +534,34 @@ bool KRLight::getShaderValue(ShaderValue value, float* output) const
*output = m_dust_particle_size; *output = m_dust_particle_size;
return true; return true;
default: default:
return KRNode::getShaderValue(value, output); return KRNode::getShaderValue(camera, value, output);
} }
} }
bool KRLight::getShaderValue(ShaderValue value, hydra::Vector3* output) const bool KRLight::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector2* output) const
{
if (camera) {
switch (value) {
case ShaderValue::slice_depth_scale:
{
int slice_count = getSliceCount(camera);
float slice_near = -camera->getSettings()->getPerspectiveNearZ();
float slice_far = -camera->getSettings()->volumetric_environment_max_distance;
float slice_spacing = (slice_far - slice_near) / slice_count;
*output = Vector2::Create(slice_near, slice_spacing);
return true;
}
break;
default:
break;
}
}
return KRNode::getShaderValue(camera, value, output);
}
bool KRLight::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::light_position: case ShaderValue::light_position:
@@ -547,12 +570,17 @@ bool KRLight::getShaderValue(ShaderValue value, hydra::Vector3* output) const
case ShaderValue::light_color: case ShaderValue::light_color:
*output = m_color; *output = m_color;
return true; return true;
case ShaderValue::particle_origin:
*output = Matrix4::DotWDiv(Matrix4::Invert(getParticleModelMatrix(*camera->getViewport())), Vector3::Zero());
return true;
case ShaderValue::dust_particle_color:
*output = m_color.val * m_dust_particle_intensity * m_intensity * camera->settings.dust_particle_intensity;
return true;
default: default:
return KRNode::getShaderValue(value, output); return KRNode::getShaderValue(camera, value, output);
} }
} }
bool KRLight::getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const bool KRLight::getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const
{ {
if (name == "flareTexture") { if (name == "flareTexture") {

View File

@@ -36,6 +36,7 @@
#include "resources/texture/KRTextureBinding.h" #include "resources/texture/KRTextureBinding.h"
static const float KRLIGHT_MIN_INFLUENCE = 0.15f; // 0.05f static const float KRLIGHT_MIN_INFLUENCE = 0.15f; // 0.05f
static const float KRLIGHT_PARTICLE_RANGE = 600.0f;
// KRENGINE_MAX_SHADOW_BUFFERS must be at least 6 to allow omni-directional lights to render cube maps // KRENGINE_MAX_SHADOW_BUFFERS must be at least 6 to allow omni-directional lights to render cube maps
@@ -76,8 +77,9 @@ public:
protected: protected:
KRLight(KRScene& scene, std::string name); KRLight(KRScene& scene, std::string name);
bool getShaderValue(ShaderValue value, float* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const override;
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector2* output) const override;
bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const override;
bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const final; bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const final;
// Properties // Properties
@@ -107,4 +109,9 @@ protected:
virtual int configureShadowBufferViewports(const KRViewport& viewport); virtual int configureShadowBufferViewports(const KRViewport& viewport);
void renderShadowBuffers(RenderInfo& ri); void renderShadowBuffers(RenderInfo& ri);
private:
hydra::Matrix4 getParticleModelMatrix(const KRViewport& viewport) const;
int getParticleCount() const;
int getSliceCount(const KRCamera* camera) const;
}; };

View File

@@ -354,25 +354,25 @@ AABB KRModel::getBounds()
} }
bool KRModel::getShaderValue(ShaderValue value, hydra::Vector3* output) const bool KRModel::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::rim_color: case ShaderValue::rim_color:
*output = m_rim_color; *output = m_rim_color;
return true; return true;
default: default:
return KRNode::getShaderValue(value, output); return KRNode::getShaderValue(camera, value, output);
} }
} }
bool KRModel::getShaderValue(ShaderValue value, float* output) const bool KRModel::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::rim_power: case ShaderValue::rim_power:
*output = m_rim_power; *output = m_rim_power;
return true; return true;
default: default:
return KRNode::getShaderValue(value, output); return KRNode::getShaderValue(camera, value, output);
} }
} }

View File

@@ -96,6 +96,6 @@ private:
private: private:
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const override;
bool getShaderValue(ShaderValue value, float* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const override;
}; };

View File

@@ -116,7 +116,7 @@ public:
std::vector<KRPointLight*> point_lights; std::vector<KRPointLight*> point_lights;
std::vector<KRDirectionalLight*> directional_lights; std::vector<KRDirectionalLight*> directional_lights;
std::vector<KRSpotLight*> spot_lights; std::vector<KRSpotLight*> spot_lights;
KRViewport* viewport; const KRViewport* viewport;
KRRenderPass* renderPass; KRRenderPass* renderPass;
KRPipeline* pipeline; KRPipeline* pipeline;

View File

@@ -111,14 +111,14 @@ void KRParticleSystemNewtonian::render(RenderInfo& ri)
} }
} }
bool KRParticleSystemNewtonian::getShaderValue(ShaderValue value, float* output) const bool KRParticleSystemNewtonian::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::dust_particle_size: case ShaderValue::dust_particle_size:
*output = 1.0f; *output = 1.0f;
return true; return true;
default: default:
return KRParticleSystem::getShaderValue(value, output); return KRParticleSystem::getShaderValue(camera, value, output);
} }
} }

View File

@@ -52,7 +52,7 @@ public:
virtual void physicsUpdate(float deltaTime) override; virtual void physicsUpdate(float deltaTime) override;
virtual bool hasPhysics() override; virtual bool hasPhysics() override;
protected: protected:
bool getShaderValue(ShaderValue value, float* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const override;
private: private:
float m_particlesAbsoluteTime; float m_particlesAbsoluteTime;
}; };

View File

@@ -137,14 +137,14 @@ void KRPointLight::render(RenderInfo& ri)
ri.reflectedObjects.pop_back(); ri.reflectedObjects.pop_back();
} }
bool KRPointLight::getShaderValue(ShaderValue value, float* output) const bool KRPointLight::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
return KRLight::getShaderValue(value, output); return KRLight::getShaderValue(camera, value, output);
} }
bool KRPointLight::getShaderValue(ShaderValue value, hydra::Vector3* output) const bool KRPointLight::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const
{ {
return KRLight::getShaderValue(value, output); return KRLight::getShaderValue(camera, value, output);
} }
void KRPointLight::generateMesh() void KRPointLight::generateMesh()

View File

@@ -46,8 +46,8 @@ public:
virtual void render(RenderInfo& ri) override; virtual void render(RenderInfo& ri) override;
protected: protected:
bool getShaderValue(ShaderValue value, float* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const override;
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const override;
private: private:
void generateMesh(); void generateMesh();

View File

@@ -145,11 +145,11 @@ void KRSprite::render(RenderInfo& ri)
ri.reflectedObjects.pop_back(); ri.reflectedObjects.pop_back();
} }
bool KRSprite::getShaderValue(ShaderValue value, float* output) const bool KRSprite::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
switch (value) { switch (value) {
default: default:
return KRNode::getShaderValue(value, output); return KRNode::getShaderValue(camera, value, output);
} }
} }

View File

@@ -59,7 +59,7 @@ public:
protected: protected:
bool getShaderValue(ShaderValue value, float* output) const override; bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const override;
bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const final; bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const final;
KRNODE_PROPERTY(KRTextureBinding, m_spriteTexture, KRTexture::TEXTURE_USAGE_SPRITE, "sprite_texture"); KRNODE_PROPERTY(KRTextureBinding, m_spriteTexture, KRTexture::TEXTURE_USAGE_SPRITE, "sprite_texture");

View File

@@ -834,7 +834,7 @@ bool KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_
return success; return success;
} }
bool KRMaterial::getShaderValue(ShaderValue value, float* output) const bool KRMaterial::getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_baseColor_map_rotation: case ShaderValue::material_baseColor_map_rotation:
@@ -933,7 +933,7 @@ bool KRMaterial::getShaderValue(ShaderValue value, float* output) const
return false; return false;
} }
bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector2* output) const bool KRMaterial::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector2* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_baseColor_map_scale: case ShaderValue::material_baseColor_map_scale:
@@ -1020,7 +1020,7 @@ bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector2* output) const
return false; return false;
} }
bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector3* output) const bool KRMaterial::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_emissive_factor: case ShaderValue::material_emissive_factor:
@@ -1038,7 +1038,7 @@ bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector3* output) const
return false; return false;
} }
bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector4* output) const bool KRMaterial::getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector4* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_baseColor_factor: case ShaderValue::material_baseColor_factor:
@@ -1049,7 +1049,7 @@ bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector4* output) const
} }
} }
bool KRMaterial::getShaderValue(ShaderValue value, KRResourceBinding* output) const bool KRMaterial::getShaderValue(const KRCamera* camera, ShaderValue value, KRResourceBinding* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_baseColor_map_texture: case ShaderValue::material_baseColor_map_texture:
@@ -1096,7 +1096,7 @@ bool KRMaterial::getShaderValue(ShaderValue value, KRResourceBinding* output) co
} }
} }
bool KRMaterial::getShaderValue(ShaderValue value, int64_t* output) const bool KRMaterial::getShaderValue(const KRCamera* camera, ShaderValue value, int64_t* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_shadingModel: case ShaderValue::material_shadingModel:
@@ -1146,7 +1146,7 @@ bool KRMaterial::getShaderValue(ShaderValue value, int64_t* output) const
} }
} }
bool KRMaterial::getShaderValue(ShaderValue value, bool* output) const bool KRMaterial::getShaderValue(const KRCamera* camera, ShaderValue value, bool* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_doubleSided: case ShaderValue::material_doubleSided:

View File

@@ -183,12 +183,12 @@ public:
float m_transmissionFactor = 0.f; float m_transmissionFactor = 0.f;
private: private:
bool getShaderValue(ShaderValue value, float* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, float* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector2* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector2* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector3* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector4* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, hydra::Vector4* output) const final;
bool getShaderValue(ShaderValue value, KRResourceBinding* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, KRResourceBinding* output) const final;
bool getShaderValue(ShaderValue value, int64_t* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, int64_t* output) const final;
bool getShaderValue(ShaderValue value, bool* output) const final; bool getShaderValue(const KRCamera* camera, ShaderValue value, bool* output) const final;
bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const final; bool getImageBinding(const std::string& name, const KRTextureBinding** binding, KRSampler** sample) const final;
}; };