This commit is contained in:
SamGondelman 2016-06-28 15:59:58 -07:00
parent 12b5cccfc7
commit a82930cb7a
3 changed files with 43 additions and 28 deletions

View file

@ -1,6 +1,6 @@
set(TARGET_NAME display-plugins) set(TARGET_NAME display-plugins)
setup_hifi_library(OpenGL) setup_hifi_library(OpenGL)
link_hifi_libraries(shared plugins render-utils ui-plugins gl gpu-gl ui) link_hifi_libraries(shared plugins ui-plugins gl gpu-gl ui)
target_opengl() target_opengl()

View file

@ -21,7 +21,9 @@
#include <gl/GLWidget.h> #include <gl/GLWidget.h>
#include <shared/NsightHelpers.h> #include <shared/NsightHelpers.h>
#include <TextureCache.h> #include <NetworkAccessManager.h>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <gpu/DrawUnitQuadTexcoord_vert.h> #include <gpu/DrawUnitQuadTexcoord_vert.h>
#include <gpu/DrawTexture_frag.h> #include <gpu/DrawTexture_frag.h>
@ -64,28 +66,39 @@ bool HmdDisplayPlugin::internalActivate() {
_firstPreview = true; _firstPreview = true;
if (_previewTextureID == 0) { if (_previewTextureID == 0) {
const QString url("https://hifi-content.s3.amazonaws.com/samuel/preview.png"); const QUrl previewURL("https://hifi-content.s3.amazonaws.com/samuel/preview.png");
_previewTexture = DependencyManager::get<TextureCache>()->getTexture(url); QNetworkAccessManager& manager = NetworkAccessManager::getInstance();
QNetworkRequest request(previewURL);
// const QString path("/Users/computer33/Documents/preview.png"); request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
// QImage previewTexture(path); // connect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(downloadFinished(QNetworkReply*)));
// if (!previewTexture.isNull()) { manager.get(request);
if (_previewTexture && _previewTexture->isLoaded()) {
// previewTexture = previewTexture.mirrored(false, true);
glGenTextures(1, &_previewTextureID);
glBindTexture(GL_TEXTURE_2D, _previewTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _previewTexture->getWidth(), _previewTexture->getHeight(), 0,
GL_BGRA, GL_UNSIGNED_BYTE, _previewTexture->getGPUTexture()->accessStoredMipFace(0)->readData());
using namespace oglplus;
oglplus::Texture::MinFilter(TextureTarget::_2D, TextureMinFilter::Linear);
oglplus::Texture::MagFilter(TextureTarget::_2D, TextureMagFilter::Linear);
glBindTexture(GL_TEXTURE_2D, 0);
}
} }
return Parent::internalActivate(); return Parent::internalActivate();
} }
void HmdDisplayPlugin::downloadFinished(QNetworkReply* reply) {
if (reply->error() != QNetworkReply::NetworkError::NoError) {
qDebug() << "HMDDisplayPlugin: error downloading preview image" << reply->errorString();
return;
}
QImage previewTexture;
previewTexture.loadFromData(reply->readAll());
if (!previewTexture.isNull()) {
previewTexture = previewTexture.mirrored(false, true);
glGenTextures(1, &_previewTextureID);
glBindTexture(GL_TEXTURE_2D, _previewTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, previewTexture.width(), previewTexture.height(), 0,
GL_BGRA, GL_UNSIGNED_BYTE, previewTexture.bits());
using namespace oglplus;
Texture::MinFilter(TextureTarget::_2D, TextureMinFilter::Linear);
Texture::MagFilter(TextureTarget::_2D, TextureMagFilter::Linear);
glBindTexture(GL_TEXTURE_2D, 0);
}
}
void HmdDisplayPlugin::internalDeactivate() { void HmdDisplayPlugin::internalDeactivate() {
if (_previewTextureID != 0) { if (_previewTextureID != 0) {
glDeleteTextures(1, &_previewTextureID); glDeleteTextures(1, &_previewTextureID);
@ -270,7 +283,8 @@ void HmdDisplayPlugin::customizeContext() {
using namespace oglplus; using namespace oglplus;
if (!_enablePreview) { if (!_enablePreview) {
compileProgram(_previewProgram, DrawUnitQuadTexcoord_vert, DrawTexture_frag); std::string version("#version 410 core\n");
compileProgram(_previewProgram, version + DrawUnitQuadTexcoord_vert, version + DrawTexture_frag);
PREVIEW_TEXTURE_LOCATION = Uniform<int>(*_previewProgram, "colorMap").Location(); PREVIEW_TEXTURE_LOCATION = Uniform<int>(*_previewProgram, "colorMap").Location();
} }
@ -313,8 +327,8 @@ void HmdDisplayPlugin::compositeScene() {
useProgram(_reprojectionProgram); useProgram(_reprojectionProgram);
using namespace oglplus; using namespace oglplus;
oglplus::Texture::MinFilter(TextureTarget::_2D, TextureMinFilter::Linear); Texture::MinFilter(TextureTarget::_2D, TextureMinFilter::Linear);
oglplus::Texture::MagFilter(TextureTarget::_2D, TextureMagFilter::Linear); Texture::MagFilter(TextureTarget::_2D, TextureMagFilter::Linear);
Uniform<glm::mat3>(*_reprojectionProgram, REPROJECTION_MATRIX_LOCATION).Set(_currentPresentFrameInfo.presentReprojection); Uniform<glm::mat3>(*_reprojectionProgram, REPROJECTION_MATRIX_LOCATION).Set(_currentPresentFrameInfo.presentReprojection);
//Uniform<glm::mat4>(*_reprojectionProgram, PROJECTION_MATRIX_LOCATION).Set(_eyeProjections); //Uniform<glm::mat4>(*_reprojectionProgram, PROJECTION_MATRIX_LOCATION).Set(_eyeProjections);
//Uniform<glm::mat4>(*_reprojectionProgram, INVERSE_PROJECTION_MATRIX_LOCATION).Set(_eyeInverseProjections); //Uniform<glm::mat4>(*_reprojectionProgram, INVERSE_PROJECTION_MATRIX_LOCATION).Set(_eyeInverseProjections);
@ -385,7 +399,7 @@ void HmdDisplayPlugin::internalPresent() {
if (_enablePreview) { if (_enablePreview) {
float windowAspect = aspect(windowSize); float windowAspect = aspect(windowSize);
float sceneAspect = aspect(_renderTargetSize); float sceneAspect = aspect(_renderTargetSize);
if (_enablePreview && _monoPreview) { if (_monoPreview) {
sceneAspect /= 2.0f; sceneAspect /= 2.0f;
} }
float aspectRatio = sceneAspect / windowAspect; float aspectRatio = sceneAspect / windowAspect;
@ -419,9 +433,9 @@ void HmdDisplayPlugin::internalPresent() {
}); });
swapBuffers(); swapBuffers();
} else if (_firstPreview || windowSize != _prevWindowSize || devicePixelRatio != _prevDevicePixelRatio) { } else if (_firstPreview || windowSize != _prevWindowSize || devicePixelRatio != _prevDevicePixelRatio) {
if (_previewTexture) qDebug() << _previewTexture->getBytesReceived(); if (_previewTextureID != 0) {
if (PREVIEW_TEXTURE_LOCATION != -1 && _previewTextureID != 0) {
useProgram(_previewProgram); useProgram(_previewProgram);
windowSize *= devicePixelRatio;
glViewport(0, 0, windowSize.x, windowSize.y); glViewport(0, 0, windowSize.x, windowSize.y);
glUniform1i(PREVIEW_TEXTURE_LOCATION, 0); glUniform1i(PREVIEW_TEXTURE_LOCATION, 0);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);

View file

@ -14,8 +14,7 @@
#include "../OpenGLDisplayPlugin.h" #include "../OpenGLDisplayPlugin.h"
class NetworkTexture; class QNetworkReply;
using NetworkTexturePointer = QSharedPointer<NetworkTexture>;
class HmdDisplayPlugin : public OpenGLDisplayPlugin { class HmdDisplayPlugin : public OpenGLDisplayPlugin {
using Parent = OpenGLDisplayPlugin; using Parent = OpenGLDisplayPlugin;
@ -89,6 +88,9 @@ protected:
FrameInfo _currentPresentFrameInfo; FrameInfo _currentPresentFrameInfo;
FrameInfo _currentRenderFrameInfo; FrameInfo _currentRenderFrameInfo;
public slots:
void downloadFinished(QNetworkReply* reply);
private: private:
bool _enablePreview { false }; bool _enablePreview { false };
bool _monoPreview { true }; bool _monoPreview { true };
@ -96,7 +98,6 @@ private:
bool _firstPreview { true }; bool _firstPreview { true };
ProgramPtr _previewProgram; ProgramPtr _previewProgram;
GLuint _previewTextureID { 0 }; GLuint _previewTextureID { 0 };
NetworkTexturePointer _previewTexture { nullptr };
glm::uvec2 _prevWindowSize { 0, 0 }; glm::uvec2 _prevWindowSize { 0, 0 };
qreal _prevDevicePixelRatio { 0 }; qreal _prevDevicePixelRatio { 0 };
ShapeWrapperPtr _sphereSection; ShapeWrapperPtr _sphereSection;