Fixed slot collision between fade map and material texture table

This commit is contained in:
Olivier Prat 2018-07-10 16:16:51 +02:00
parent 50d16eca80
commit 6814c487ec
3 changed files with 30 additions and 30 deletions

View file

@ -33,43 +33,41 @@ void FadeEffect::build(render::Task::TaskConcept& task, const task::Varying& edi
render::ShapePipeline::BatchSetter FadeEffect::getBatchSetter() const {
return [this](const render::ShapePipeline& shapePipeline, gpu::Batch& batch, render::Args*) {
batch.setResourceTexture(shapePipeline.locations->fadeMaskTextureUnit, _maskMap);
batch.setUniformBuffer(shapePipeline.locations->fadeParameterBufferUnit, _configurations);
batch.setResourceTexture(render::ShapePipeline::Slot::FADE_MASK, _maskMap);
batch.setUniformBuffer(render::ShapePipeline::Slot::FADE_PARAMETERS, _configurations);
};
}
render::ShapePipeline::ItemSetter FadeEffect::getItemUniformSetter() const {
return [](const render::ShapePipeline& shapePipeline, render::Args* args, const render::Item& item) {
if (!render::TransitionStage::isIndexInvalid(item.getTransitionId())) {
if (shapePipeline.locations->fadeObjectParameterBufferUnit >= 0) {
auto scene = args->_scene;
auto batch = args->_batch;
auto transitionStage = scene->getStage<render::TransitionStage>(render::TransitionStage::getName());
auto& transitionState = transitionStage->getTransition(item.getTransitionId());
auto scene = args->_scene;
auto batch = args->_batch;
auto transitionStage = scene->getStage<render::TransitionStage>(render::TransitionStage::getName());
auto& transitionState = transitionStage->getTransition(item.getTransitionId());
if (transitionState.paramsBuffer._size != sizeof(gpu::StructBuffer<FadeObjectParams>)) {
static_assert(sizeof(transitionState.paramsBuffer) == sizeof(gpu::StructBuffer<FadeObjectParams>), "Assuming gpu::StructBuffer is a helper class for gpu::BufferView");
transitionState.paramsBuffer = gpu::StructBuffer<FadeObjectParams>();
}
const auto fadeCategory = FadeJob::transitionToCategory[transitionState.eventType];
auto& paramsConst = static_cast<gpu::StructBuffer<FadeObjectParams>&>(transitionState.paramsBuffer).get();
if (paramsConst.category != fadeCategory
|| paramsConst.threshold != transitionState.threshold
|| glm::vec3(paramsConst.baseOffset) != transitionState.baseOffset
|| glm::vec3(paramsConst.noiseOffset) != transitionState.noiseOffset
|| glm::vec3(paramsConst.baseInvSize) != transitionState.baseInvSize) {
auto& params = static_cast<gpu::StructBuffer<FadeObjectParams>&>(transitionState.paramsBuffer).edit();
params.category = fadeCategory;
params.threshold = transitionState.threshold;
params.baseInvSize = glm::vec4(transitionState.baseInvSize, 0.0f);
params.noiseOffset = glm::vec4(transitionState.noiseOffset, 0.0f);
params.baseOffset = glm::vec4(transitionState.baseOffset, 0.0f);
}
batch->setUniformBuffer(shapePipeline.locations->fadeObjectParameterBufferUnit, transitionState.paramsBuffer);
if (transitionState.paramsBuffer._size != sizeof(gpu::StructBuffer<FadeObjectParams>)) {
static_assert(sizeof(transitionState.paramsBuffer) == sizeof(gpu::StructBuffer<FadeObjectParams>), "Assuming gpu::StructBuffer is a helper class for gpu::BufferView");
transitionState.paramsBuffer = gpu::StructBuffer<FadeObjectParams>();
}
const auto fadeCategory = FadeJob::transitionToCategory[transitionState.eventType];
auto& paramsConst = static_cast<gpu::StructBuffer<FadeObjectParams>&>(transitionState.paramsBuffer).get();
if (paramsConst.category != fadeCategory
|| paramsConst.threshold != transitionState.threshold
|| glm::vec3(paramsConst.baseOffset) != transitionState.baseOffset
|| glm::vec3(paramsConst.noiseOffset) != transitionState.noiseOffset
|| glm::vec3(paramsConst.baseInvSize) != transitionState.baseInvSize) {
auto& params = static_cast<gpu::StructBuffer<FadeObjectParams>&>(transitionState.paramsBuffer).edit();
params.category = fadeCategory;
params.threshold = transitionState.threshold;
params.baseInvSize = glm::vec4(transitionState.baseInvSize, 0.0f);
params.noiseOffset = glm::vec4(transitionState.noiseOffset, 0.0f);
params.baseOffset = glm::vec4(transitionState.baseOffset, 0.0f);
}
batch->setUniformBuffer(render::ShapePipeline::Slot::FADE_OBJECT_PARAMETERS, transitionState.paramsBuffer);
}
};
}

View file

@ -95,6 +95,7 @@ void ShapePlumber::addPipeline(const Filter& filter, const gpu::ShaderPointer& p
slotBindings.insert(gpu::Shader::Binding(std::string("skyboxMap"), Slot::MAP::LIGHT_AMBIENT_MAP));
slotBindings.insert(gpu::Shader::Binding(std::string("fadeMaskMap"), Slot::MAP::FADE_MASK));
slotBindings.insert(gpu::Shader::Binding(std::string("fadeParametersBuffer"), Slot::BUFFER::FADE_PARAMETERS));
slotBindings.insert(gpu::Shader::Binding(std::string("fadeObjectParametersBuffer"), Slot::BUFFER::FADE_OBJECT_PARAMETERS));
slotBindings.insert(gpu::Shader::Binding(std::string("hazeBuffer"), Slot::BUFFER::HAZE_MODEL));
if (key.isTranslucent()) {

View file

@ -240,6 +240,7 @@ public:
LIGHT_AMBIENT_BUFFER,
HAZE_MODEL,
FADE_PARAMETERS,
FADE_OBJECT_PARAMETERS,
LIGHT_CLUSTER_GRID_FRUSTUM_GRID_SLOT,
LIGHT_CLUSTER_GRID_CLUSTER_GRID_SLOT,
LIGHT_CLUSTER_GRID_CLUSTER_CONTENT_SLOT,
@ -254,9 +255,9 @@ public:
ROUGHNESS,
OCCLUSION,
SCATTERING,
FADE_MASK,
LIGHT_AMBIENT_MAP = 10,
FADE_MASK,
};
};