|
|
@@ -123,7 +123,7 @@ namespace BansheeEngine
|
|
|
lightDirParam.set(Vector4(0.707f, 0.707f, 0.707f, 0.0f));
|
|
|
}
|
|
|
|
|
|
- void LitTexRenderableHandler::initializeProxy(const RenderableProxyPtr& proxy)
|
|
|
+ void LitTexRenderableHandler::initializeRenderElem(RenderableElement* element)
|
|
|
{
|
|
|
static auto paramsMatch = [](const GpuParamDataDesc& a, const GpuParamDataDesc& b)
|
|
|
{
|
|
|
@@ -131,116 +131,110 @@ namespace BansheeEngine
|
|
|
a.arraySize == b.arraySize && a.arrayElementStride == b.arrayElementStride;
|
|
|
};
|
|
|
|
|
|
- for (auto& element : proxy->renderableElements)
|
|
|
- {
|
|
|
- element->rendererData = PerObjectData();
|
|
|
- PerObjectData* rendererData = any_cast_unsafe<PerObjectData>(&element->rendererData);
|
|
|
+ element->rendererData = PerObjectData();
|
|
|
+ PerObjectData* rendererData = any_cast_unsafe<PerObjectData>(&element->rendererData);
|
|
|
|
|
|
- ShaderProxyPtr shader = element->material->shader;
|
|
|
+ ShaderProxyPtr shader = element->material->shader;
|
|
|
|
|
|
- const Map<String, SHADER_PARAM_BLOCK_DESC>& paramBlockDescs = shader->paramBlocks;
|
|
|
- const Map<String, SHADER_DATA_PARAM_DESC>& dataParamDescs = shader->dataParams;
|
|
|
- String staticBlockName;
|
|
|
- String perFrameBlockName;
|
|
|
- String perObjectBlockName;
|
|
|
+ const Map<String, SHADER_PARAM_BLOCK_DESC>& paramBlockDescs = shader->paramBlocks;
|
|
|
+ const Map<String, SHADER_DATA_PARAM_DESC>& dataParamDescs = shader->dataParams;
|
|
|
+ String staticBlockName;
|
|
|
+ String perFrameBlockName;
|
|
|
+ String perObjectBlockName;
|
|
|
|
|
|
- String wvpParamName;
|
|
|
+ String wvpParamName;
|
|
|
|
|
|
- for (auto& paramBlockDesc : paramBlockDescs)
|
|
|
+ for (auto& paramBlockDesc : paramBlockDescs)
|
|
|
+ {
|
|
|
+ switch (paramBlockDesc.second.rendererSemantic)
|
|
|
{
|
|
|
- switch (paramBlockDesc.second.rendererSemantic)
|
|
|
- {
|
|
|
- case RBS_Static:
|
|
|
- staticBlockName = paramBlockDesc.second.name;
|
|
|
- break;
|
|
|
- case RBS_PerFrame:
|
|
|
- perFrameBlockName = paramBlockDesc.second.name;
|
|
|
- break;
|
|
|
- case RBS_PerObject:
|
|
|
- perObjectBlockName = paramBlockDesc.second.name;
|
|
|
- break;
|
|
|
- }
|
|
|
+ case RBS_Static:
|
|
|
+ staticBlockName = paramBlockDesc.second.name;
|
|
|
+ break;
|
|
|
+ case RBS_PerFrame:
|
|
|
+ perFrameBlockName = paramBlockDesc.second.name;
|
|
|
+ break;
|
|
|
+ case RBS_PerObject:
|
|
|
+ perObjectBlockName = paramBlockDesc.second.name;
|
|
|
+ break;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- for (auto& paramDesc : dataParamDescs)
|
|
|
- {
|
|
|
- if (paramDesc.second.rendererSemantic == RPS_WorldViewProjTfrm)
|
|
|
- wvpParamName = paramDesc.second.gpuVariableName;
|
|
|
- }
|
|
|
+ for (auto& paramDesc : dataParamDescs)
|
|
|
+ {
|
|
|
+ if (paramDesc.second.rendererSemantic == RPS_WorldViewProjTfrm)
|
|
|
+ wvpParamName = paramDesc.second.gpuVariableName;
|
|
|
+ }
|
|
|
|
|
|
- UINT32 idx = 0;
|
|
|
- for (auto& gpuParams : element->material->params)
|
|
|
- {
|
|
|
- const GpuParamDesc& paramsDesc = gpuParams->getParamDesc();
|
|
|
+ UINT32 idx = 0;
|
|
|
+ for (auto& gpuParams : element->material->params)
|
|
|
+ {
|
|
|
+ const GpuParamDesc& paramsDesc = gpuParams->getParamDesc();
|
|
|
|
|
|
- if (staticBlockName != "")
|
|
|
+ if (staticBlockName != "")
|
|
|
+ {
|
|
|
+ auto findIter = paramsDesc.paramBlocks.find(staticBlockName);
|
|
|
+ if (findIter != paramsDesc.paramBlocks.end())
|
|
|
{
|
|
|
- auto findIter = paramsDesc.paramBlocks.find(staticBlockName);
|
|
|
- if (findIter != paramsDesc.paramBlocks.end())
|
|
|
+ // TODO - We only compare block sizes but not actual contents. Should I check them too?
|
|
|
+ // Probably shouldn't concern myself with that here, instead check that on a higher level.
|
|
|
+ if (findIter->second.blockSize == staticParamBlockDesc.blockSize)
|
|
|
{
|
|
|
- // TODO - We only compare block sizes but not actual contents. Should I check them too?
|
|
|
- // Probably shouldn't concern myself with that here, instead check that on a higher level.
|
|
|
- if (findIter->second.blockSize == staticParamBlockDesc.blockSize)
|
|
|
- {
|
|
|
- UINT32 slotIdx = findIter->second.slot;
|
|
|
- element->material->rendererBuffers.push_back(MaterialProxy::BufferBindInfo(idx, slotIdx, staticParamBuffer));
|
|
|
- }
|
|
|
+ UINT32 slotIdx = findIter->second.slot;
|
|
|
+ element->material->rendererBuffers.push_back(MaterialProxy::BufferBindInfo(idx, slotIdx, staticParamBuffer));
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (perFrameBlockName != "")
|
|
|
+ if (perFrameBlockName != "")
|
|
|
+ {
|
|
|
+ auto findIter = paramsDesc.paramBlocks.find(perFrameBlockName);
|
|
|
+ if (findIter != paramsDesc.paramBlocks.end())
|
|
|
{
|
|
|
- auto findIter = paramsDesc.paramBlocks.find(perFrameBlockName);
|
|
|
- if (findIter != paramsDesc.paramBlocks.end())
|
|
|
+ if (findIter->second.blockSize == perFrameParamBlockDesc.blockSize)
|
|
|
{
|
|
|
- if (findIter->second.blockSize == perFrameParamBlockDesc.blockSize)
|
|
|
- {
|
|
|
- UINT32 slotIdx = findIter->second.slot;
|
|
|
- element->material->rendererBuffers.push_back(MaterialProxy::BufferBindInfo(idx, slotIdx, perFrameParamBuffer));
|
|
|
- }
|
|
|
+ UINT32 slotIdx = findIter->second.slot;
|
|
|
+ element->material->rendererBuffers.push_back(MaterialProxy::BufferBindInfo(idx, slotIdx, perFrameParamBuffer));
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (perObjectBlockName != "")
|
|
|
+ if (perObjectBlockName != "")
|
|
|
+ {
|
|
|
+ auto findIter = paramsDesc.paramBlocks.find(perObjectBlockName);
|
|
|
+ if (findIter != paramsDesc.paramBlocks.end())
|
|
|
{
|
|
|
- auto findIter = paramsDesc.paramBlocks.find(perObjectBlockName);
|
|
|
- if (findIter != paramsDesc.paramBlocks.end())
|
|
|
+ if (findIter->second.blockSize == perObjectParamBlockDesc.blockSize)
|
|
|
{
|
|
|
- if (findIter->second.blockSize == perObjectParamBlockDesc.blockSize)
|
|
|
- {
|
|
|
- if (rendererData->perObjectParamBuffer == nullptr)
|
|
|
- rendererData->perObjectParamBuffer = HardwareBufferManager::instance().createGpuParamBlockBuffer(perObjectParamBlockDesc.blockSize * sizeof(UINT32));
|
|
|
+ if (rendererData->perObjectParamBuffer == nullptr)
|
|
|
+ rendererData->perObjectParamBuffer = HardwareBufferManager::instance().createGpuParamBlockBuffer(perObjectParamBlockDesc.blockSize * sizeof(UINT32));
|
|
|
|
|
|
- rendererData->perObjectBuffers.push_back(MaterialProxy::BufferBindInfo(idx, findIter->second.slot, rendererData->perObjectParamBuffer));
|
|
|
+ rendererData->perObjectBuffers.push_back(MaterialProxy::BufferBindInfo(idx, findIter->second.slot, rendererData->perObjectParamBuffer));
|
|
|
|
|
|
- if (!rendererData->hasWVPParam && wvpParamName != "")
|
|
|
+ if (!rendererData->hasWVPParam && wvpParamName != "")
|
|
|
+ {
|
|
|
+ auto findIter2 = paramsDesc.params.find(wvpParamName);
|
|
|
+ if (findIter2 != paramsDesc.params.end())
|
|
|
{
|
|
|
- auto findIter2 = paramsDesc.params.find(wvpParamName);
|
|
|
- if (findIter2 != paramsDesc.params.end())
|
|
|
+ if (paramsMatch(findIter2->second, wvpParamDesc))
|
|
|
{
|
|
|
- if (paramsMatch(findIter2->second, wvpParamDesc))
|
|
|
- {
|
|
|
- gpuParams->getParam(wvpParamName, rendererData->wvpParam);
|
|
|
- rendererData->hasWVPParam = true;
|
|
|
- }
|
|
|
+ gpuParams->getParam(wvpParamName, rendererData->wvpParam);
|
|
|
+ rendererData->hasWVPParam = true;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- idx++;
|
|
|
}
|
|
|
|
|
|
- bindGlobalBuffers(element);
|
|
|
+ idx++;
|
|
|
}
|
|
|
+
|
|
|
+ bindGlobalBuffers(element);
|
|
|
}
|
|
|
|
|
|
- void LitTexRenderableHandler::bindPerObjectBuffers(const RenderableProxyPtr& renderable, const RenderableElement* element)
|
|
|
+ void LitTexRenderableHandler::bindPerObjectBuffers(const RenderableElement* element)
|
|
|
{
|
|
|
- if (renderable->renderableType != RenType_LitTextured)
|
|
|
- return;
|
|
|
-
|
|
|
const PerObjectData* rendererData = any_cast_unsafe<PerObjectData>(&element->rendererData);
|
|
|
for (auto& perObjectBuffer : rendererData->perObjectBuffers)
|
|
|
{
|