mirror of
https://github.com/overte-org/overte.git
synced 2025-06-24 05:40:29 +02:00
Merge pull request #14443 from SamGondelman/hud
Case 19660: Fix HUD crash
This commit is contained in:
commit
864e9ca8ae
2 changed files with 32 additions and 16 deletions
|
@ -534,18 +534,26 @@ void OpenGLDisplayPlugin::updateFrameData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> OpenGLDisplayPlugin::getHUDOperator() {
|
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> OpenGLDisplayPlugin::getHUDOperator() {
|
||||||
return [this](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
|
auto hudPipeline = _hudPipeline;
|
||||||
if (_hudPipeline && hudTexture) {
|
auto hudMirrorPipeline = _mirrorHUDPipeline;
|
||||||
|
auto hudStereo = isStereo();
|
||||||
|
auto hudCompositeFramebufferSize = _compositeFramebuffer->getSize();
|
||||||
|
std::array<glm::ivec4, 2> hudEyeViewports;
|
||||||
|
for_each_eye([&](Eye eye) {
|
||||||
|
hudEyeViewports[eye] = eyeViewport(eye);
|
||||||
|
});
|
||||||
|
return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
|
||||||
|
if (hudPipeline && hudTexture) {
|
||||||
batch.enableStereo(false);
|
batch.enableStereo(false);
|
||||||
batch.setPipeline(mirror ? _mirrorHUDPipeline : _hudPipeline);
|
batch.setPipeline(mirror ? hudMirrorPipeline : hudPipeline);
|
||||||
batch.setResourceTexture(0, hudTexture);
|
batch.setResourceTexture(0, hudTexture);
|
||||||
if (isStereo()) {
|
if (hudStereo) {
|
||||||
for_each_eye([&](Eye eye) {
|
for_each_eye([&](Eye eye) {
|
||||||
batch.setViewportTransform(eyeViewport(eye));
|
batch.setViewportTransform(hudEyeViewports[eye]);
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
batch.setViewportTransform(ivec4(uvec2(0), _compositeFramebuffer->getSize()));
|
batch.setViewportTransform(ivec4(uvec2(0), hudCompositeFramebufferSize));
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -420,18 +420,26 @@ void HmdDisplayPlugin::HUDRenderer::updatePipeline() {
|
||||||
|
|
||||||
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::HUDRenderer::render(HmdDisplayPlugin& plugin) {
|
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::HUDRenderer::render(HmdDisplayPlugin& plugin) {
|
||||||
updatePipeline();
|
updatePipeline();
|
||||||
return [this](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
|
|
||||||
if (pipeline && hudTexture) {
|
|
||||||
batch.setPipeline(pipeline);
|
|
||||||
|
|
||||||
batch.setInputFormat(format);
|
auto hudPipeline = pipeline;
|
||||||
gpu::BufferView posView(vertices, VERTEX_OFFSET, vertices->getSize(), VERTEX_STRIDE, format->getAttributes().at(gpu::Stream::POSITION)._element);
|
auto hudFormat = format;
|
||||||
gpu::BufferView uvView(vertices, TEXTURE_OFFSET, vertices->getSize(), VERTEX_STRIDE, format->getAttributes().at(gpu::Stream::TEXCOORD)._element);
|
auto hudVertices = vertices;
|
||||||
|
auto hudIndices = indices;
|
||||||
|
auto hudUniformBuffer = uniformsBuffer;
|
||||||
|
auto hudUniforms = uniforms;
|
||||||
|
auto hudIndexCount = indexCount;
|
||||||
|
return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
|
||||||
|
if (hudPipeline && hudTexture) {
|
||||||
|
batch.setPipeline(hudPipeline);
|
||||||
|
|
||||||
|
batch.setInputFormat(hudFormat);
|
||||||
|
gpu::BufferView posView(hudVertices, VERTEX_OFFSET, hudVertices->getSize(), VERTEX_STRIDE, hudFormat->getAttributes().at(gpu::Stream::POSITION)._element);
|
||||||
|
gpu::BufferView uvView(hudVertices, TEXTURE_OFFSET, hudVertices->getSize(), VERTEX_STRIDE, hudFormat->getAttributes().at(gpu::Stream::TEXCOORD)._element);
|
||||||
batch.setInputBuffer(gpu::Stream::POSITION, posView);
|
batch.setInputBuffer(gpu::Stream::POSITION, posView);
|
||||||
batch.setInputBuffer(gpu::Stream::TEXCOORD, uvView);
|
batch.setInputBuffer(gpu::Stream::TEXCOORD, uvView);
|
||||||
batch.setIndexBuffer(gpu::UINT16, indices, 0);
|
batch.setIndexBuffer(gpu::UINT16, hudIndices, 0);
|
||||||
uniformsBuffer->setSubData(0, uniforms);
|
hudUniformBuffer->setSubData(0, hudUniforms);
|
||||||
batch.setUniformBuffer(0, uniformsBuffer);
|
batch.setUniformBuffer(0, hudUniformBuffer);
|
||||||
|
|
||||||
auto compositorHelper = DependencyManager::get<CompositorHelper>();
|
auto compositorHelper = DependencyManager::get<CompositorHelper>();
|
||||||
glm::mat4 modelTransform = compositorHelper->getUiTransform();
|
glm::mat4 modelTransform = compositorHelper->getUiTransform();
|
||||||
|
@ -441,7 +449,7 @@ std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDis
|
||||||
batch.setModelTransform(modelTransform);
|
batch.setModelTransform(modelTransform);
|
||||||
batch.setResourceTexture(0, hudTexture);
|
batch.setResourceTexture(0, hudTexture);
|
||||||
|
|
||||||
batch.drawIndexed(gpu::TRIANGLES, indexCount);
|
batch.drawIndexed(gpu::TRIANGLES, hudIndexCount);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue