mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 17:14:59 +02:00
first pass at blitting correct hmd preview (in mono)
This commit is contained in:
parent
688b5dad8b
commit
f18e64ed1a
5 changed files with 34 additions and 14 deletions
|
@ -497,16 +497,26 @@ void OpenGLDisplayPlugin::submitFrame(const gpu::FramePointer& newFrame) {
|
|||
_newFrameQueue.push(newFrame);
|
||||
});
|
||||
}
|
||||
|
||||
void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer texture, glm::ivec4 viewport, const glm::ivec4 scissor) {
|
||||
renderFromTexture(batch, texture, viewport, scissor, gpu::FramebufferPointer());
|
||||
}
|
||||
|
||||
void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer texture, glm::ivec4 viewport, const glm::ivec4 scissor, gpu::FramebufferPointer copyFbo /*=gpu::FramebufferPointer()*/) {
|
||||
auto fbo = gpu::FramebufferPointer();
|
||||
batch.enableStereo(false);
|
||||
batch.resetViewTransform();
|
||||
batch.setFramebuffer(gpu::FramebufferPointer());
|
||||
batch.setFramebuffer(fbo);
|
||||
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0));
|
||||
batch.setStateScissorRect(scissor);
|
||||
batch.setViewportTransform(viewport);
|
||||
batch.setResourceTexture(0, texture);
|
||||
batch.setPipeline(_presentPipeline);
|
||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
||||
if (copyFbo) {
|
||||
gpu::Vec4i rect {0, 0, scissor.z, scissor.w};
|
||||
batch.blit(fbo, rect, copyFbo, rect);
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLDisplayPlugin::updateFrameData() {
|
||||
|
|
|
@ -113,6 +113,7 @@ protected:
|
|||
// Plugin specific functionality to send the composed scene to the output window or device
|
||||
virtual void internalPresent();
|
||||
|
||||
void renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer texture, glm::ivec4 viewport, const glm::ivec4 scissor, gpu::FramebufferPointer fbo);
|
||||
void renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer texture, glm::ivec4 viewport, const glm::ivec4 scissor);
|
||||
virtual void updateFrameData();
|
||||
|
||||
|
|
|
@ -242,7 +242,6 @@ void HmdDisplayPlugin::internalPresent() {
|
|||
|
||||
glm::ivec4 viewport = getViewportForSourceSize(sourceSize);
|
||||
glm::ivec4 scissor = viewport;
|
||||
|
||||
render([&](gpu::Batch& batch) {
|
||||
|
||||
if (_monoPreview) {
|
||||
|
@ -287,10 +286,11 @@ void HmdDisplayPlugin::internalPresent() {
|
|||
|
||||
viewport.z *= 2;
|
||||
}
|
||||
DependencyManager::get<TextureCache>()->setHmdPreviewTexture(_compositeFramebuffer->getRenderBuffer(0));
|
||||
renderFromTexture(batch, _compositeFramebuffer->getRenderBuffer(0), viewport, scissor);
|
||||
auto fbo = DependencyManager::get<TextureCache>()->getHmdPreviewFramebuffer();
|
||||
renderFromTexture(batch, _compositeFramebuffer->getRenderBuffer(0), viewport, scissor, fbo);
|
||||
});
|
||||
swapBuffers();
|
||||
|
||||
} else if (_clearPreviewFlag) {
|
||||
QImage image;
|
||||
if (_vsyncEnabled) {
|
||||
|
|
|
@ -970,13 +970,6 @@ void ImageReader::read() {
|
|||
Q_ARG(int, texture->getHeight()));
|
||||
}
|
||||
|
||||
void TextureCache::setHmdPreviewTexture(gpu::TexturePointer texturePointer) {
|
||||
if (!_hmdPreviewNetworkTexture) {
|
||||
_hmdPreviewNetworkTexture.reset(new NetworkTexture(HMD_PREVIEW_FRAME_URL));
|
||||
}
|
||||
_hmdPreviewNetworkTexture->setImage(texturePointer, texturePointer->getWidth(), texturePointer->getHeight());
|
||||
}
|
||||
|
||||
NetworkTexturePointer TextureCache::getResourceTexture(QUrl resourceTextureUrl) {
|
||||
gpu::TexturePointer texture;
|
||||
if (resourceTextureUrl == SPECTATOR_CAMERA_FRAME_URL) {
|
||||
|
@ -991,15 +984,30 @@ NetworkTexturePointer TextureCache::getResourceTexture(QUrl resourceTextureUrl)
|
|||
}
|
||||
}
|
||||
}
|
||||
// FIXME: Generalize this, DRY up this code
|
||||
if (resourceTextureUrl == HMD_PREVIEW_FRAME_URL) {
|
||||
if (_hmdPreviewNetworkTexture) {
|
||||
return _hmdPreviewNetworkTexture;
|
||||
if (!_hmdPreviewNetworkTexture) {
|
||||
_hmdPreviewNetworkTexture.reset(new NetworkTexture(resourceTextureUrl));
|
||||
}
|
||||
if (_hmdPreviewFramebuffer) {
|
||||
texture = _hmdPreviewFramebuffer->getRenderBuffer(0);
|
||||
if (texture) {
|
||||
_hmdPreviewNetworkTexture->setImage(texture, texture->getWidth(), texture->getHeight());
|
||||
return _hmdPreviewNetworkTexture;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NetworkTexturePointer();
|
||||
}
|
||||
|
||||
const gpu::FramebufferPointer& TextureCache::getHmdPreviewFramebuffer() {
|
||||
if (!_hmdPreviewFramebuffer) {
|
||||
_hmdPreviewFramebuffer.reset(gpu::Framebuffer::create("hmdPreview",gpu::Element::COLOR_SRGBA_32, 2040, 1024));
|
||||
}
|
||||
return _hmdPreviewFramebuffer;
|
||||
}
|
||||
|
||||
const gpu::FramebufferPointer& TextureCache::getSpectatorCameraFramebuffer() {
|
||||
if (!_spectatorCameraFramebuffer) {
|
||||
resetSpectatorCameraFramebuffer(2048, 1024);
|
||||
|
|
|
@ -170,7 +170,7 @@ public:
|
|||
NetworkTexturePointer getResourceTexture(QUrl resourceTextureUrl);
|
||||
const gpu::FramebufferPointer& getSpectatorCameraFramebuffer();
|
||||
void resetSpectatorCameraFramebuffer(int width, int height);
|
||||
void setHmdPreviewTexture(gpu::TexturePointer texturePointer);
|
||||
const gpu::FramebufferPointer& getHmdPreviewFramebuffer();
|
||||
|
||||
protected:
|
||||
// Overload ResourceCache::prefetch to allow specifying texture type for loads
|
||||
|
@ -205,6 +205,7 @@ private:
|
|||
gpu::FramebufferPointer _spectatorCameraFramebuffer;
|
||||
|
||||
NetworkTexturePointer _hmdPreviewNetworkTexture;
|
||||
gpu::FramebufferPointer _hmdPreviewFramebuffer;
|
||||
};
|
||||
|
||||
#endif // hifi_TextureCache_h
|
||||
|
|
Loading…
Reference in a new issue