mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 19:02:55 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into atp
This commit is contained in:
commit
8363b0d522
23 changed files with 548 additions and 396 deletions
1
cmake/externals/boostconfig/CMakeLists.txt
vendored
1
cmake/externals/boostconfig/CMakeLists.txt
vendored
|
@ -16,3 +16,4 @@ ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR)
|
||||||
|
|
||||||
set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE TYPE INTERNAL)
|
set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE TYPE INTERNAL)
|
||||||
|
|
||||||
|
set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
|
||||||
|
|
|
@ -1211,49 +1211,6 @@ PropertiesTool = function(opts) {
|
||||||
webView.setVisible(visible);
|
webView.setVisible(visible);
|
||||||
};
|
};
|
||||||
|
|
||||||
vecToPolar = function(direction) {
|
|
||||||
var x = direction.x;
|
|
||||||
var y = direction.y;
|
|
||||||
var z = direction.z;
|
|
||||||
var pitch, yaw;
|
|
||||||
pitch = -Math.asin(y);
|
|
||||||
var c = Math.cos(-pitch);
|
|
||||||
if (Math.abs(pitch) > (Math.PI / 2.0 - epsilon)) {
|
|
||||||
//handle gymbal lock
|
|
||||||
if (pitch > 0) {
|
|
||||||
pitch = Math.PI / 2.0;
|
|
||||||
} else {
|
|
||||||
pitch = -Math.PI / 2.0;
|
|
||||||
}
|
|
||||||
yaw = 0.0;
|
|
||||||
} else {
|
|
||||||
if (z < 0) {
|
|
||||||
if(x > 0 && x < 1) {
|
|
||||||
yaw = Math.PI - Math.asin(x / c);
|
|
||||||
} else {
|
|
||||||
yaw = -Math.asin(x / c) - Math.PI;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
yaw = Math.asin(x / c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
x: pitch * RADIANS_TO_DEGREES,
|
|
||||||
y: yaw * RADIANS_TO_DEGREES,
|
|
||||||
z: 0.0 //discard roll component
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
polarToVec = function(orientation) {
|
|
||||||
var pitch = orientation.x * DEGREES_TO_RADIANS;
|
|
||||||
var yaw = orientation.y * DEGREES_TO_RADIANS;
|
|
||||||
return {
|
|
||||||
x: Math.cos(pitch) * Math.sin(yaw),
|
|
||||||
y: Math.sin(-pitch),
|
|
||||||
z: Math.cos(pitch) * Math.cos(yaw)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
selectionManager.addEventListener(function() {
|
selectionManager.addEventListener(function() {
|
||||||
data = {
|
data = {
|
||||||
type: 'update',
|
type: 'update',
|
||||||
|
@ -1267,7 +1224,8 @@ PropertiesTool = function(opts) {
|
||||||
entity.properties.rotation = Quat.safeEulerAngles(entity.properties.rotation);
|
entity.properties.rotation = Quat.safeEulerAngles(entity.properties.rotation);
|
||||||
}
|
}
|
||||||
if (entity.properties.keyLightDirection !== undefined) {
|
if (entity.properties.keyLightDirection !== undefined) {
|
||||||
entity.properties.keyLightDirection = vecToPolar(entity.properties.keyLightDirection);
|
entity.properties.keyLightDirection = Vec3.multiply(RADIANS_TO_DEGREES, Vec3.toPolar(entity.properties.keyLightDirection));
|
||||||
|
entity.properties.keyLightDirection.z = 0.0;
|
||||||
}
|
}
|
||||||
selections.push(entity);
|
selections.push(entity);
|
||||||
}
|
}
|
||||||
|
@ -1297,7 +1255,8 @@ PropertiesTool = function(opts) {
|
||||||
data.properties.rotation = Quat.fromPitchYawRollDegrees(rotation.x, rotation.y, rotation.z);
|
data.properties.rotation = Quat.fromPitchYawRollDegrees(rotation.x, rotation.y, rotation.z);
|
||||||
}
|
}
|
||||||
if (data.properties.keyLightDirection !== undefined) {
|
if (data.properties.keyLightDirection !== undefined) {
|
||||||
data.properties.keyLightDirection = polarToVec(data.properties.keyLightDirection);
|
data.properties.keyLightDirection = Vec3.fromPolar(
|
||||||
|
data.properties.keyLightDirection.x * DEGREES_TO_RADIANS, data.properties.keyLightDirection.y * DEGREES_TO_RADIANS);
|
||||||
}
|
}
|
||||||
Entities.editEntity(selectionManager.selections[0], data.properties);
|
Entities.editEntity(selectionManager.selections[0], data.properties);
|
||||||
if (data.properties.name != undefined) {
|
if (data.properties.name != undefined) {
|
||||||
|
|
|
@ -9,11 +9,9 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <sstream>
|
#include "Application.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <sstream>
|
||||||
#include <cmath>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
#include <glm/gtx/component_wise.hpp>
|
#include <glm/gtx/component_wise.hpp>
|
||||||
|
@ -61,6 +59,7 @@
|
||||||
#include <DependencyManager.h>
|
#include <DependencyManager.h>
|
||||||
#include <EntityScriptingInterface.h>
|
#include <EntityScriptingInterface.h>
|
||||||
#include <ErrorDialog.h>
|
#include <ErrorDialog.h>
|
||||||
|
#include <FramebufferCache.h>
|
||||||
#include <gpu/Batch.h>
|
#include <gpu/Batch.h>
|
||||||
#include <gpu/Context.h>
|
#include <gpu/Context.h>
|
||||||
#include <gpu/GLBackend.h>
|
#include <gpu/GLBackend.h>
|
||||||
|
@ -87,12 +86,12 @@
|
||||||
#include <SettingHandle.h>
|
#include <SettingHandle.h>
|
||||||
#include <SimpleAverage.h>
|
#include <SimpleAverage.h>
|
||||||
#include <SoundCache.h>
|
#include <SoundCache.h>
|
||||||
|
#include <TextureCache.h>
|
||||||
#include <Tooltip.h>
|
#include <Tooltip.h>
|
||||||
#include <UserActivityLogger.h>
|
#include <UserActivityLogger.h>
|
||||||
#include <UUID.h>
|
#include <UUID.h>
|
||||||
#include <VrMenu.h>
|
#include <VrMenu.h>
|
||||||
|
|
||||||
#include "Application.h"
|
|
||||||
#include "AudioClient.h"
|
#include "AudioClient.h"
|
||||||
#include "DiscoverabilityManager.h"
|
#include "DiscoverabilityManager.h"
|
||||||
#include "GLCanvas.h"
|
#include "GLCanvas.h"
|
||||||
|
@ -266,6 +265,8 @@ bool setupEssentials(int& argc, char** argv) {
|
||||||
auto audioScope = DependencyManager::set<AudioScope>();
|
auto audioScope = DependencyManager::set<AudioScope>();
|
||||||
auto deferredLightingEffect = DependencyManager::set<DeferredLightingEffect>();
|
auto deferredLightingEffect = DependencyManager::set<DeferredLightingEffect>();
|
||||||
auto textureCache = DependencyManager::set<TextureCache>();
|
auto textureCache = DependencyManager::set<TextureCache>();
|
||||||
|
auto framebufferCache = DependencyManager::set<FramebufferCache>();
|
||||||
|
|
||||||
auto animationCache = DependencyManager::set<AnimationCache>();
|
auto animationCache = DependencyManager::set<AnimationCache>();
|
||||||
auto ddeFaceTracker = DependencyManager::set<DdeFaceTracker>();
|
auto ddeFaceTracker = DependencyManager::set<DdeFaceTracker>();
|
||||||
auto modelBlender = DependencyManager::set<ModelBlender>();
|
auto modelBlender = DependencyManager::set<ModelBlender>();
|
||||||
|
@ -731,6 +732,7 @@ Application::~Application() {
|
||||||
DependencyManager::destroy<OffscreenUi>();
|
DependencyManager::destroy<OffscreenUi>();
|
||||||
DependencyManager::destroy<AvatarManager>();
|
DependencyManager::destroy<AvatarManager>();
|
||||||
DependencyManager::destroy<AnimationCache>();
|
DependencyManager::destroy<AnimationCache>();
|
||||||
|
DependencyManager::destroy<FramebufferCache>();
|
||||||
DependencyManager::destroy<TextureCache>();
|
DependencyManager::destroy<TextureCache>();
|
||||||
DependencyManager::destroy<GeometryCache>();
|
DependencyManager::destroy<GeometryCache>();
|
||||||
DependencyManager::destroy<ScriptCache>();
|
DependencyManager::destroy<ScriptCache>();
|
||||||
|
@ -764,12 +766,7 @@ void Application::initializeGL() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qCDebug(interfaceapp) << "GL Version: " << QString((const char*) glGetString(GL_VERSION));
|
#ifdef WIN32
|
||||||
qCDebug(interfaceapp) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION));
|
|
||||||
qCDebug(interfaceapp) << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR));
|
|
||||||
qCDebug(interfaceapp) << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
GLenum err = glewInit();
|
GLenum err = glewInit();
|
||||||
if (GLEW_OK != err) {
|
if (GLEW_OK != err) {
|
||||||
/* Problem: glewInit failed, something is seriously wrong. */
|
/* Problem: glewInit failed, something is seriously wrong. */
|
||||||
|
@ -781,7 +778,7 @@ void Application::initializeGL() {
|
||||||
int swapInterval = wglGetSwapIntervalEXT();
|
int swapInterval = wglGetSwapIntervalEXT();
|
||||||
qCDebug(interfaceapp, "V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF"));
|
qCDebug(interfaceapp, "V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF"));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
// TODO: Write the correct code for Linux...
|
// TODO: Write the correct code for Linux...
|
||||||
|
@ -977,7 +974,7 @@ void Application::paintGL() {
|
||||||
|
|
||||||
{
|
{
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
auto primaryFbo = DependencyManager::get<TextureCache>()->getPrimaryFramebuffer();
|
auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebuffer();
|
||||||
batch.setFramebuffer(primaryFbo);
|
batch.setFramebuffer(primaryFbo);
|
||||||
// clear the normal and specular buffers
|
// clear the normal and specular buffers
|
||||||
batch.clearFramebuffer(
|
batch.clearFramebuffer(
|
||||||
|
@ -988,7 +985,7 @@ void Application::paintGL() {
|
||||||
vec4(vec3(0), 1), 1.0, 0.0);
|
vec4(vec3(0), 1), 1.0, 0.0);
|
||||||
|
|
||||||
// Viewport is assigned to the size of the framebuffer
|
// Viewport is assigned to the size of the framebuffer
|
||||||
QSize size = DependencyManager::get<TextureCache>()->getFrameBufferSize();
|
QSize size = DependencyManager::get<FramebufferCache>()->getFrameBufferSize();
|
||||||
renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height());
|
renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height());
|
||||||
batch.setViewportTransform(renderArgs._viewport);
|
batch.setViewportTransform(renderArgs._viewport);
|
||||||
renderArgs._context->render(batch);
|
renderArgs._context->render(batch);
|
||||||
|
@ -1004,7 +1001,7 @@ void Application::paintGL() {
|
||||||
|
|
||||||
{
|
{
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
auto primaryFbo = DependencyManager::get<TextureCache>()->getPrimaryFramebuffer();
|
auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebuffer();
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
batch.blit(primaryFbo, glm::ivec4(0, 0, _renderResolution.x, _renderResolution.y),
|
batch.blit(primaryFbo, glm::ivec4(0, 0, _renderResolution.x, _renderResolution.y),
|
||||||
nullptr, glm::ivec4(0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height()));
|
nullptr, glm::ivec4(0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height()));
|
||||||
|
@ -1078,7 +1075,7 @@ void Application::resizeGL() {
|
||||||
|
|
||||||
if (_renderResolution != toGlm(renderSize)) {
|
if (_renderResolution != toGlm(renderSize)) {
|
||||||
_renderResolution = toGlm(renderSize);
|
_renderResolution = toGlm(renderSize);
|
||||||
DependencyManager::get<TextureCache>()->setFrameBufferSize(renderSize);
|
DependencyManager::get<FramebufferCache>()->setFrameBufferSize(renderSize);
|
||||||
|
|
||||||
loadViewFrustum(_myCamera, _viewFrustum);
|
loadViewFrustum(_myCamera, _viewFrustum);
|
||||||
}
|
}
|
||||||
|
@ -2980,7 +2977,7 @@ PickRay Application::computePickRay(float x, float y) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
QImage Application::renderAvatarBillboard(RenderArgs* renderArgs) {
|
QImage Application::renderAvatarBillboard(RenderArgs* renderArgs) {
|
||||||
auto primaryFramebuffer = DependencyManager::get<TextureCache>()->getPrimaryFramebuffer();
|
auto primaryFramebuffer = DependencyManager::get<FramebufferCache>()->getPrimaryFramebuffer();
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFramebuffer));
|
glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFramebuffer));
|
||||||
|
|
||||||
// clear the alpha channel so the background is transparent
|
// clear the alpha channel so the background is transparent
|
||||||
|
@ -3415,11 +3412,11 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi
|
||||||
// set the bounds of rear mirror view
|
// set the bounds of rear mirror view
|
||||||
gpu::Vec4i viewport;
|
gpu::Vec4i viewport;
|
||||||
if (billboard) {
|
if (billboard) {
|
||||||
QSize size = DependencyManager::get<TextureCache>()->getFrameBufferSize();
|
QSize size = DependencyManager::get<FramebufferCache>()->getFrameBufferSize();
|
||||||
viewport = gpu::Vec4i(region.x(), size.height() - region.y() - region.height(), region.width(), region.height());
|
viewport = gpu::Vec4i(region.x(), size.height() - region.y() - region.height(), region.width(), region.height());
|
||||||
} else {
|
} else {
|
||||||
// if not rendering the billboard, the region is in device independent coordinates; must convert to device
|
// if not rendering the billboard, the region is in device independent coordinates; must convert to device
|
||||||
QSize size = DependencyManager::get<TextureCache>()->getFrameBufferSize();
|
QSize size = DependencyManager::get<FramebufferCache>()->getFrameBufferSize();
|
||||||
float ratio = (float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale();
|
float ratio = (float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale();
|
||||||
int x = region.x() * ratio, y = region.y() * ratio, width = region.width() * ratio, height = region.height() * ratio;
|
int x = region.x() * ratio, y = region.y() * ratio, width = region.width() * ratio, height = region.height() * ratio;
|
||||||
viewport = gpu::Vec4i(x, size.height() - y - height, width, height);
|
viewport = gpu::Vec4i(x, size.height() - y - height, width, height);
|
||||||
|
@ -4473,7 +4470,11 @@ void Application::friendsWindowClosed() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::postLambdaEvent(std::function<void()> f) {
|
void Application::postLambdaEvent(std::function<void()> f) {
|
||||||
|
if (this->thread() == QThread::currentThread()) {
|
||||||
|
f();
|
||||||
|
} else {
|
||||||
QCoreApplication::postEvent(this, new LambdaEvent(f));
|
QCoreApplication::postEvent(this, new LambdaEvent(f));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::initPlugins() {
|
void Application::initPlugins() {
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include <ScriptEngine.h>
|
#include <ScriptEngine.h>
|
||||||
#include <ShapeManager.h>
|
#include <ShapeManager.h>
|
||||||
#include <StDev.h>
|
#include <StDev.h>
|
||||||
#include <TextureCache.h>
|
|
||||||
#include <udt/PacketHeaders.h>
|
#include <udt/PacketHeaders.h>
|
||||||
#include <ViewFrustum.h>
|
#include <ViewFrustum.h>
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include <QElapsedTimer>
|
#include <QElapsedTimer>
|
||||||
|
#include <gpu/GPUConfig.h>
|
||||||
#include <gpu/Batch.h>
|
#include <gpu/Batch.h>
|
||||||
#include <gpu/Context.h>
|
#include <gpu/Context.h>
|
||||||
#include <NumericalConstants.h>
|
#include <NumericalConstants.h>
|
||||||
|
@ -24,14 +24,17 @@
|
||||||
#include <RenderArgs.h>
|
#include <RenderArgs.h>
|
||||||
#include <ViewFrustum.h>
|
#include <ViewFrustum.h>
|
||||||
|
|
||||||
#include "../../libraries/render-utils/standardTransformPNTC_vert.h"
|
#include "../../libraries/render-utils/stars_vert.h"
|
||||||
#include "../../libraries/render-utils/stars_frag.h"
|
#include "../../libraries/render-utils/stars_frag.h"
|
||||||
|
|
||||||
|
#include "../../libraries/render-utils/standardTransformPNTC_vert.h"
|
||||||
|
#include "../../libraries/render-utils/starsGrid_frag.h"
|
||||||
|
|
||||||
//static const float TILT = 0.23f;
|
//static const float TILT = 0.23f;
|
||||||
static const float TILT = 0.0f;
|
static const float TILT = 0.0f;
|
||||||
static const unsigned int STARFIELD_NUM_STARS = 50000;
|
static const unsigned int STARFIELD_NUM_STARS = 50000;
|
||||||
static const unsigned int STARFIELD_SEED = 1;
|
static const unsigned int STARFIELD_SEED = 1;
|
||||||
//static const float STAR_COLORIZATION = 0.1f;
|
static const float STAR_COLORIZATION = 0.1f;
|
||||||
|
|
||||||
static const float TAU = 6.28318530717958f;
|
static const float TAU = 6.28318530717958f;
|
||||||
//static const float HALF_TAU = TAU / 2.0f;
|
//static const float HALF_TAU = TAU / 2.0f;
|
||||||
|
@ -109,41 +112,28 @@ unsigned computeStarColor(float colorization) {
|
||||||
return red | (green << 8) | (blue << 16);
|
return red | (green << 8) | (blue << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct StarVertex {
|
||||||
|
vec4 position;
|
||||||
|
vec4 colorAndSize;
|
||||||
|
};
|
||||||
|
|
||||||
// FIXME star colors
|
// FIXME star colors
|
||||||
void Stars::render(RenderArgs* renderArgs, float alpha) {
|
void Stars::render(RenderArgs* renderArgs, float alpha) {
|
||||||
static gpu::BufferPointer vertexBuffer;
|
static gpu::BufferPointer vertexBuffer;
|
||||||
static gpu::Stream::FormatPointer streamFormat;
|
static gpu::Stream::FormatPointer streamFormat;
|
||||||
static gpu::Element positionElement, colorElement;
|
static gpu::Element positionElement, colorElement;
|
||||||
static gpu::PipelinePointer _pipeline;
|
static gpu::PipelinePointer _gridPipeline;
|
||||||
|
static gpu::PipelinePointer _starsPipeline;
|
||||||
static int32_t _timeSlot{ -1 };
|
static int32_t _timeSlot{ -1 };
|
||||||
static std::once_flag once;
|
static std::once_flag once;
|
||||||
|
|
||||||
const int VERTICES_SLOT = 0;
|
const int VERTICES_SLOT = 0;
|
||||||
//const int COLOR_SLOT = 2;
|
const int COLOR_SLOT = 1;
|
||||||
|
|
||||||
std::call_once(once, [&] {
|
std::call_once(once, [&] {
|
||||||
QElapsedTimer startTime;
|
{
|
||||||
startTime.start();
|
|
||||||
vertexBuffer.reset(new gpu::Buffer);
|
|
||||||
|
|
||||||
srand(STARFIELD_SEED);
|
|
||||||
unsigned limit = STARFIELD_NUM_STARS;
|
|
||||||
std::vector<vec3> points;
|
|
||||||
points.resize(limit);
|
|
||||||
for (size_t star = 0; star < limit; ++star) {
|
|
||||||
points[star] = fromPolar(randPolar());
|
|
||||||
//auto color = computeStarColor(STAR_COLORIZATION);
|
|
||||||
//vertexBuffer->append(sizeof(color), (const gpu::Byte*)&color);
|
|
||||||
}
|
|
||||||
vertexBuffer->append(sizeof(vec3) * limit, (const gpu::Byte*)&points[0]);
|
|
||||||
streamFormat.reset(new gpu::Stream::Format()); // 1 for everyone
|
|
||||||
streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0);
|
|
||||||
positionElement = streamFormat->getAttributes().at(gpu::Stream::POSITION)._element;
|
|
||||||
double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms
|
|
||||||
qDebug() << "Total time to generate stars: " << timeDiff << " msec";
|
|
||||||
|
|
||||||
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(standardTransformPNTC_vert)));
|
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(standardTransformPNTC_vert)));
|
||||||
auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(stars_frag)));
|
auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(starsGrid_frag)));
|
||||||
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps));
|
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps));
|
||||||
gpu::Shader::makeProgram((*program));
|
gpu::Shader::makeProgram((*program));
|
||||||
_timeSlot = program->getBuffers().findLocation(UNIFORM_TIME_NAME);
|
_timeSlot = program->getBuffers().findLocation(UNIFORM_TIME_NAME);
|
||||||
|
@ -154,7 +144,49 @@ void Stars::render(RenderArgs* renderArgs, float alpha) {
|
||||||
// enable decal blend
|
// enable decal blend
|
||||||
state->setDepthTest(gpu::State::DepthTest(false));
|
state->setDepthTest(gpu::State::DepthTest(false));
|
||||||
state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA);
|
state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA);
|
||||||
_pipeline.reset(gpu::Pipeline::create(program, state));
|
_gridPipeline.reset(gpu::Pipeline::create(program, state));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(stars_vert)));
|
||||||
|
auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(stars_frag)));
|
||||||
|
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps));
|
||||||
|
gpu::Shader::makeProgram((*program));
|
||||||
|
auto state = gpu::StatePointer(new gpu::State());
|
||||||
|
// enable decal blend
|
||||||
|
state->setDepthTest(gpu::State::DepthTest(false));
|
||||||
|
state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA);
|
||||||
|
_starsPipeline.reset(gpu::Pipeline::create(program, state));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QElapsedTimer startTime;
|
||||||
|
startTime.start();
|
||||||
|
vertexBuffer.reset(new gpu::Buffer);
|
||||||
|
|
||||||
|
srand(STARFIELD_SEED);
|
||||||
|
unsigned limit = STARFIELD_NUM_STARS;
|
||||||
|
std::vector<StarVertex> points;
|
||||||
|
points.resize(limit);
|
||||||
|
for (size_t star = 0; star < limit; ++star) {
|
||||||
|
points[star].position = vec4(fromPolar(randPolar()), 1);
|
||||||
|
float size = frand() * 2.5f + 0.5f;
|
||||||
|
if (frand() < STAR_COLORIZATION) {
|
||||||
|
vec3 color(frand() / 2.0f + 0.5f, frand() / 2.0f + 0.5f, frand() / 2.0f + 0.5f);
|
||||||
|
points[star].colorAndSize = vec4(color, size);
|
||||||
|
} else {
|
||||||
|
vec3 color(frand() / 2.0f + 0.5f);
|
||||||
|
points[star].colorAndSize = vec4(color, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms
|
||||||
|
qDebug() << "Total time to generate stars: " << timeDiff << " msec";
|
||||||
|
|
||||||
|
vertexBuffer->append(sizeof(StarVertex) * limit, (const gpu::Byte*)&points[0]);
|
||||||
|
streamFormat.reset(new gpu::Stream::Format()); // 1 for everyone
|
||||||
|
streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::XYZW), 0);
|
||||||
|
streamFormat->setAttribute(gpu::Stream::COLOR, COLOR_SLOT, gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::RGBA));
|
||||||
|
positionElement = streamFormat->getAttributes().at(gpu::Stream::POSITION)._element;
|
||||||
|
colorElement = streamFormat->getAttributes().at(gpu::Stream::COLOR)._element;
|
||||||
});
|
});
|
||||||
|
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
|
@ -168,18 +200,31 @@ void Stars::render(RenderArgs* renderArgs, float alpha) {
|
||||||
batch.setResourceTexture(0, textureCache->getWhiteTexture());
|
batch.setResourceTexture(0, textureCache->getWhiteTexture());
|
||||||
|
|
||||||
// Render the world lines
|
// Render the world lines
|
||||||
batch.setPipeline(_pipeline);
|
batch.setPipeline(_gridPipeline);
|
||||||
static auto start = usecTimestampNow();
|
static auto start = usecTimestampNow();
|
||||||
float msecs = (float)(usecTimestampNow() - start) / (float)USECS_PER_MSEC;
|
float msecs = (float)(usecTimestampNow() - start) / (float)USECS_PER_MSEC;
|
||||||
float secs = msecs / (float)MSECS_PER_SECOND;
|
float secs = msecs / (float)MSECS_PER_SECOND;
|
||||||
batch._glUniform1f(_timeSlot, secs);
|
batch._glUniform1f(_timeSlot, secs);
|
||||||
geometryCache->renderUnitCube(batch);
|
geometryCache->renderUnitCube(batch);
|
||||||
|
|
||||||
|
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
|
||||||
|
|
||||||
|
static const size_t VERTEX_STRIDE = sizeof(StarVertex);
|
||||||
|
size_t offset = offsetof(StarVertex, position);
|
||||||
|
gpu::BufferView posView(vertexBuffer, offset, vertexBuffer->getSize(), VERTEX_STRIDE, positionElement);
|
||||||
|
offset = offsetof(StarVertex, colorAndSize);
|
||||||
|
gpu::BufferView colView(vertexBuffer, offset, vertexBuffer->getSize(), VERTEX_STRIDE, colorElement);
|
||||||
|
|
||||||
// Render the stars
|
// Render the stars
|
||||||
geometryCache->useSimpleDrawPipeline(batch);
|
batch.setPipeline(_starsPipeline);
|
||||||
|
batch._glEnable(GL_PROGRAM_POINT_SIZE_EXT);
|
||||||
|
batch._glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
|
||||||
|
batch._glEnable(GL_POINT_SMOOTH);
|
||||||
|
|
||||||
batch.setInputFormat(streamFormat);
|
batch.setInputFormat(streamFormat);
|
||||||
batch.setInputBuffer(VERTICES_SLOT, gpu::BufferView(vertexBuffer, positionElement));
|
batch.setInputBuffer(VERTICES_SLOT, posView);
|
||||||
|
batch.setInputBuffer(COLOR_SLOT, colView);
|
||||||
batch.draw(gpu::Primitive::POINTS, STARFIELD_NUM_STARS);
|
batch.draw(gpu::Primitive::POINTS, STARFIELD_NUM_STARS);
|
||||||
|
|
||||||
renderArgs->_context->render(batch);
|
renderArgs->_context->render(batch);
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,6 +253,9 @@ void MyAvatar::updateFromTrackers(float deltaTime) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FaceTracker* tracker = Application::getInstance()->getActiveFaceTracker();
|
||||||
|
bool inFacetracker = tracker && !tracker->isMuted();
|
||||||
|
|
||||||
if (inHmd) {
|
if (inHmd) {
|
||||||
estimatedPosition = qApp->getHeadPosition();
|
estimatedPosition = qApp->getHeadPosition();
|
||||||
estimatedPosition.x *= -1.0f;
|
estimatedPosition.x *= -1.0f;
|
||||||
|
@ -260,12 +263,17 @@ void MyAvatar::updateFromTrackers(float deltaTime) {
|
||||||
|
|
||||||
const float OCULUS_LEAN_SCALE = 0.05f;
|
const float OCULUS_LEAN_SCALE = 0.05f;
|
||||||
estimatedPosition /= OCULUS_LEAN_SCALE;
|
estimatedPosition /= OCULUS_LEAN_SCALE;
|
||||||
} else {
|
} else if (inFacetracker) {
|
||||||
FaceTracker* tracker = Application::getInstance()->getActiveFaceTracker();
|
|
||||||
if (tracker && !tracker->isMuted()) {
|
|
||||||
estimatedPosition = tracker->getHeadTranslation();
|
estimatedPosition = tracker->getHeadTranslation();
|
||||||
_trackedHeadPosition = estimatedPosition;
|
_trackedHeadPosition = estimatedPosition;
|
||||||
estimatedRotation = glm::degrees(safeEulerAngles(tracker->getHeadRotation()));
|
estimatedRotation = glm::degrees(safeEulerAngles(tracker->getHeadRotation()));
|
||||||
|
if (Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_MIRROR) {
|
||||||
|
// Invert yaw and roll when in mirror mode
|
||||||
|
// NOTE: this is kinda a hack, it's the same hack we use to make the head tilt. But it's not really a mirror
|
||||||
|
// it just makes you feel like you're looking in a mirror because the body movements of the avatar appear to
|
||||||
|
// match your body movements.
|
||||||
|
YAW(estimatedRotation) *= -1.0f;
|
||||||
|
ROLL(estimatedRotation) *= -1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +320,7 @@ void MyAvatar::updateFromTrackers(float deltaTime) {
|
||||||
// NOTE: this is kinda a hack, it's the same hack we use to make the head tilt. But it's not really a mirror
|
// NOTE: this is kinda a hack, it's the same hack we use to make the head tilt. But it's not really a mirror
|
||||||
// it just makes you feel like you're looking in a mirror because the body movements of the avatar appear to
|
// it just makes you feel like you're looking in a mirror because the body movements of the avatar appear to
|
||||||
// match your body movements.
|
// match your body movements.
|
||||||
if (inHmd && Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_MIRROR) {
|
if ((inHmd || inFacetracker) && Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_MIRROR) {
|
||||||
relativePosition.x = -relativePosition.x;
|
relativePosition.x = -relativePosition.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <PathUtils.h>
|
#include <PathUtils.h>
|
||||||
#include <SharedUtil.h>
|
#include <SharedUtil.h>
|
||||||
#include <UserActivityLogger.h>
|
#include <UserActivityLogger.h>
|
||||||
|
#include <FramebufferCache.h>
|
||||||
|
|
||||||
#include <OVR_CAPI_GL.h>
|
#include <OVR_CAPI_GL.h>
|
||||||
|
|
||||||
|
@ -646,7 +647,7 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto primaryFBO = DependencyManager::get<TextureCache>()->getPrimaryFramebuffer();
|
auto primaryFBO = DependencyManager::get<FramebufferCache>()->getPrimaryFramebuffer();
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFBO));
|
glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFBO));
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
@ -706,7 +707,7 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const
|
||||||
_activeEye = ovrEye_Count;
|
_activeEye = ovrEye_Count;
|
||||||
|
|
||||||
gpu::FramebufferPointer finalFbo;
|
gpu::FramebufferPointer finalFbo;
|
||||||
finalFbo = DependencyManager::get<TextureCache>()->getPrimaryFramebuffer();
|
finalFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebuffer();
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
// restore our normal viewport
|
// restore our normal viewport
|
||||||
|
|
|
@ -270,8 +270,8 @@ void ApplicationCompositor::displayOverlayTextureHmd(RenderArgs* renderArgs, int
|
||||||
|
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
geometryCache->useSimpleDrawPipeline(batch);
|
geometryCache->useSimpleDrawPipeline(batch);
|
||||||
batch._glDisable(GL_DEPTH_TEST);
|
//batch._glDisable(GL_DEPTH_TEST);
|
||||||
batch._glDisable(GL_CULL_FACE);
|
//batch._glDisable(GL_CULL_FACE);
|
||||||
//batch._glBindTexture(GL_TEXTURE_2D, texture);
|
//batch._glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
//batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
//batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
//batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
//batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
|
|
@ -209,7 +209,8 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder(RenderArgs* renderAr
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
geometryCache->useSimpleDrawPipeline(batch);
|
geometryCache->useSimpleDrawPipeline(batch);
|
||||||
batch.setProjectionTransform(mat4());
|
batch.setProjectionTransform(mat4());
|
||||||
batch.setModelTransform(mat4());
|
batch.setModelTransform(Transform());
|
||||||
|
batch.setViewTransform(Transform());
|
||||||
batch.setResourceTexture(0, DependencyManager::get<TextureCache>()->getWhiteTexture());
|
batch.setResourceTexture(0, DependencyManager::get<TextureCache>()->getWhiteTexture());
|
||||||
batch._glLineWidth(CONNECTION_STATUS_BORDER_LINE_WIDTH);
|
batch._glLineWidth(CONNECTION_STATUS_BORDER_LINE_WIDTH);
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,6 @@ TextOverlay::TextOverlay() :
|
||||||
_topMargin(DEFAULT_MARGIN),
|
_topMargin(DEFAULT_MARGIN),
|
||||||
_fontSize(DEFAULT_FONTSIZE)
|
_fontSize(DEFAULT_FONTSIZE)
|
||||||
{
|
{
|
||||||
|
|
||||||
qApp->postLambdaEvent([=] {
|
qApp->postLambdaEvent([=] {
|
||||||
static std::once_flag once;
|
static std::once_flag once;
|
||||||
std::call_once(once, [] {
|
std::call_once(once, [] {
|
||||||
|
@ -117,7 +116,7 @@ TextOverlay::TextOverlay(const TextOverlay* textOverlay) :
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
while (!_qmlElement) {
|
while (!_qmlElement) {
|
||||||
QThread::sleep(1);
|
QThread::msleep(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,14 +146,12 @@ xColor TextOverlay::getBackgroundColor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextOverlay::render(RenderArgs* args) {
|
void TextOverlay::render(RenderArgs* args) {
|
||||||
|
if (!_qmlElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (_visible != _qmlElement->isVisible()) {
|
if (_visible != _qmlElement->isVisible()) {
|
||||||
_qmlElement->setVisible(_visible);
|
_qmlElement->setVisible(_visible);
|
||||||
}
|
}
|
||||||
float pulseLevel = updatePulse();
|
|
||||||
static float _oldPulseLevel = 0.0f;
|
|
||||||
if (pulseLevel != _oldPulseLevel) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include "Texture.h"
|
#include "Texture.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
class QImage;
|
||||||
|
|
||||||
namespace gpu {
|
namespace gpu {
|
||||||
|
|
||||||
typedef Element Format;
|
typedef Element Format;
|
||||||
|
@ -132,6 +134,8 @@ public:
|
||||||
static const uint32 MAX_NUM_RENDER_BUFFERS = 8;
|
static const uint32 MAX_NUM_RENDER_BUFFERS = 8;
|
||||||
static uint32 getMaxNumRenderBuffers() { return MAX_NUM_RENDER_BUFFERS; }
|
static uint32 getMaxNumRenderBuffers() { return MAX_NUM_RENDER_BUFFERS; }
|
||||||
|
|
||||||
|
void getImage(QImage* result) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SwapchainPointer _swapchain;
|
SwapchainPointer _swapchain;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "Texture.h"
|
#include "Texture.h"
|
||||||
#include <math.h>
|
|
||||||
#include <glm/gtc/constants.hpp>
|
#include <glm/gtc/constants.hpp>
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "GeometryCache.h"
|
#include "GeometryCache.h"
|
||||||
#include "RenderUtil.h"
|
#include "RenderUtil.h"
|
||||||
#include "TextureCache.h"
|
#include "TextureCache.h"
|
||||||
|
#include "FramebufferCache.h"
|
||||||
|
|
||||||
|
|
||||||
#include "simple_vert.h"
|
#include "simple_vert.h"
|
||||||
|
@ -215,8 +216,6 @@ void DeferredLightingEffect::addSpotLight(const glm::vec3& position, float radiu
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeferredLightingEffect::prepare(RenderArgs* args) {
|
void DeferredLightingEffect::prepare(RenderArgs* args) {
|
||||||
|
|
||||||
auto textureCache = DependencyManager::get<TextureCache>();
|
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
|
|
||||||
// clear the normal and specular buffers
|
// clear the normal and specular buffers
|
||||||
|
@ -228,29 +227,31 @@ void DeferredLightingEffect::prepare(RenderArgs* args) {
|
||||||
args->_context->render(batch);
|
args->_context->render(batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gpu::FramebufferPointer _copyFBO;
|
||||||
|
|
||||||
void DeferredLightingEffect::render(RenderArgs* args) {
|
void DeferredLightingEffect::render(RenderArgs* args) {
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
|
|
||||||
// perform deferred lighting, rendering to free fbo
|
// perform deferred lighting, rendering to free fbo
|
||||||
auto textureCache = DependencyManager::get<TextureCache>();
|
auto framebufferCache = DependencyManager::get<FramebufferCache>();
|
||||||
|
|
||||||
QSize framebufferSize = textureCache->getFrameBufferSize();
|
QSize framebufferSize = framebufferCache->getFrameBufferSize();
|
||||||
|
|
||||||
// binding the first framebuffer
|
// binding the first framebuffer
|
||||||
auto freeFBO = DependencyManager::get<TextureCache>()->getSecondaryFramebuffer();
|
_copyFBO = framebufferCache->getFramebuffer();
|
||||||
batch.setFramebuffer(freeFBO);
|
batch.setFramebuffer(_copyFBO);
|
||||||
|
|
||||||
batch.setViewportTransform(args->_viewport);
|
batch.setViewportTransform(args->_viewport);
|
||||||
|
|
||||||
batch.clearColorFramebuffer(freeFBO->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f));
|
batch.clearColorFramebuffer(_copyFBO->getBufferMask(), glm::vec4(0.0f, 0.0f, 0.0f, 0.0f));
|
||||||
|
|
||||||
batch.setResourceTexture(0, textureCache->getPrimaryColorTexture());
|
batch.setResourceTexture(0, framebufferCache->getPrimaryColorTexture());
|
||||||
|
|
||||||
batch.setResourceTexture(1, textureCache->getPrimaryNormalTexture());
|
batch.setResourceTexture(1, framebufferCache->getPrimaryNormalTexture());
|
||||||
|
|
||||||
batch.setResourceTexture(2, textureCache->getPrimarySpecularTexture());
|
batch.setResourceTexture(2, framebufferCache->getPrimarySpecularTexture());
|
||||||
|
|
||||||
batch.setResourceTexture(3, textureCache->getPrimaryDepthTexture());
|
batch.setResourceTexture(3, framebufferCache->getPrimaryDepthTexture());
|
||||||
|
|
||||||
float sMin = args->_viewport.x / (float)framebufferSize.width();
|
float sMin = args->_viewport.x / (float)framebufferSize.width();
|
||||||
float sWidth = args->_viewport.z / (float)framebufferSize.width();
|
float sWidth = args->_viewport.z / (float)framebufferSize.width();
|
||||||
|
@ -267,7 +268,7 @@ void DeferredLightingEffect::render(RenderArgs* args) {
|
||||||
const LightLocations* locations = &_directionalLightLocations;
|
const LightLocations* locations = &_directionalLightLocations;
|
||||||
bool shadowsEnabled = _viewState->getShadowsEnabled();
|
bool shadowsEnabled = _viewState->getShadowsEnabled();
|
||||||
if (shadowsEnabled) {
|
if (shadowsEnabled) {
|
||||||
batch.setResourceTexture(4, textureCache->getShadowFramebuffer()->getDepthStencilBuffer());
|
batch.setResourceTexture(4, framebufferCache->getShadowFramebuffer()->getDepthStencilBuffer());
|
||||||
|
|
||||||
program = _directionalLightShadowMap;
|
program = _directionalLightShadowMap;
|
||||||
locations = &_directionalLightShadowMapLocations;
|
locations = &_directionalLightShadowMapLocations;
|
||||||
|
@ -294,7 +295,7 @@ void DeferredLightingEffect::render(RenderArgs* args) {
|
||||||
}
|
}
|
||||||
batch.setPipeline(program);
|
batch.setPipeline(program);
|
||||||
}
|
}
|
||||||
batch._glUniform1f(locations->shadowScale, 1.0f / textureCache->getShadowFramebuffer()->getWidth());
|
batch._glUniform1f(locations->shadowScale, 1.0f / framebufferCache->getShadowFramebuffer()->getWidth());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (useSkyboxCubemap) {
|
if (useSkyboxCubemap) {
|
||||||
|
@ -535,17 +536,16 @@ void DeferredLightingEffect::render(RenderArgs* args) {
|
||||||
// End of the Lighting pass
|
// End of the Lighting pass
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DeferredLightingEffect::copyBack(RenderArgs* args) {
|
void DeferredLightingEffect::copyBack(RenderArgs* args) {
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
auto textureCache = DependencyManager::get<TextureCache>();
|
auto framebufferCache = DependencyManager::get<FramebufferCache>();
|
||||||
QSize framebufferSize = textureCache->getFrameBufferSize();
|
QSize framebufferSize = framebufferCache->getFrameBufferSize();
|
||||||
|
|
||||||
auto freeFBO = DependencyManager::get<TextureCache>()->getSecondaryFramebuffer();
|
batch.setFramebuffer(framebufferCache->getPrimaryFramebuffer());
|
||||||
|
|
||||||
batch.setFramebuffer(textureCache->getPrimaryFramebuffer());
|
|
||||||
batch.setPipeline(_blitLightBuffer);
|
batch.setPipeline(_blitLightBuffer);
|
||||||
|
|
||||||
batch.setResourceTexture(0, freeFBO->getRenderBuffer(0));
|
batch.setResourceTexture(0, _copyFBO->getRenderBuffer(0));
|
||||||
|
|
||||||
batch.setProjectionTransform(glm::mat4());
|
batch.setProjectionTransform(glm::mat4());
|
||||||
batch.setViewTransform(Transform());
|
batch.setViewTransform(Transform());
|
||||||
|
@ -567,6 +567,7 @@ void DeferredLightingEffect::copyBack(RenderArgs* args) {
|
||||||
|
|
||||||
args->_context->syncCache();
|
args->_context->syncCache();
|
||||||
args->_context->render(batch);
|
args->_context->render(batch);
|
||||||
|
framebufferCache->releaseFramebuffer(_copyFBO);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeferredLightingEffect::setupTransparent(RenderArgs* args, int lightBufferUnit) {
|
void DeferredLightingEffect::setupTransparent(RenderArgs* args, int lightBufferUnit) {
|
||||||
|
|
144
libraries/render-utils/src/FramebufferCache.cpp
Normal file
144
libraries/render-utils/src/FramebufferCache.cpp
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
//
|
||||||
|
// FramebufferCache.cpp
|
||||||
|
// interface/src/renderer
|
||||||
|
//
|
||||||
|
// Created by Andrzej Kapolka on 8/6/13.
|
||||||
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "FramebufferCache.h"
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
|
#include <QMap>
|
||||||
|
#include <QQueue>
|
||||||
|
#include <gpu/Batch.h>
|
||||||
|
#include <gpu/GPUConfig.h>
|
||||||
|
#include "RenderUtilsLogging.h"
|
||||||
|
|
||||||
|
static QQueue<gpu::FramebufferPointer> _cachedFramebuffers;
|
||||||
|
|
||||||
|
FramebufferCache::FramebufferCache() {
|
||||||
|
}
|
||||||
|
|
||||||
|
FramebufferCache::~FramebufferCache() {
|
||||||
|
_cachedFramebuffers.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FramebufferCache::setFrameBufferSize(QSize frameBufferSize) {
|
||||||
|
//If the size changed, we need to delete our FBOs
|
||||||
|
if (_frameBufferSize != frameBufferSize) {
|
||||||
|
_frameBufferSize = frameBufferSize;
|
||||||
|
_primaryFramebuffer.reset();
|
||||||
|
_primaryDepthTexture.reset();
|
||||||
|
_primaryColorTexture.reset();
|
||||||
|
_primaryNormalTexture.reset();
|
||||||
|
_primarySpecularTexture.reset();
|
||||||
|
_cachedFramebuffers.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FramebufferCache::createPrimaryFramebuffer() {
|
||||||
|
_primaryFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create());
|
||||||
|
|
||||||
|
auto colorFormat = gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA);
|
||||||
|
auto width = _frameBufferSize.width();
|
||||||
|
auto height = _frameBufferSize.height();
|
||||||
|
|
||||||
|
auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT);
|
||||||
|
_primaryColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
||||||
|
_primaryNormalTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
||||||
|
_primarySpecularTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
||||||
|
|
||||||
|
_primaryFramebuffer->setRenderBuffer(0, _primaryColorTexture);
|
||||||
|
_primaryFramebuffer->setRenderBuffer(1, _primaryNormalTexture);
|
||||||
|
_primaryFramebuffer->setRenderBuffer(2, _primarySpecularTexture);
|
||||||
|
|
||||||
|
|
||||||
|
auto depthFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::DEPTH);
|
||||||
|
_primaryDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler));
|
||||||
|
|
||||||
|
_primaryFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
gpu::FramebufferPointer FramebufferCache::getPrimaryFramebuffer() {
|
||||||
|
if (!_primaryFramebuffer) {
|
||||||
|
createPrimaryFramebuffer();
|
||||||
|
}
|
||||||
|
return _primaryFramebuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
gpu::TexturePointer FramebufferCache::getPrimaryDepthTexture() {
|
||||||
|
if (!_primaryDepthTexture) {
|
||||||
|
createPrimaryFramebuffer();
|
||||||
|
}
|
||||||
|
return _primaryDepthTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
gpu::TexturePointer FramebufferCache::getPrimaryColorTexture() {
|
||||||
|
if (!_primaryColorTexture) {
|
||||||
|
createPrimaryFramebuffer();
|
||||||
|
}
|
||||||
|
return _primaryColorTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
gpu::TexturePointer FramebufferCache::getPrimaryNormalTexture() {
|
||||||
|
if (!_primaryNormalTexture) {
|
||||||
|
createPrimaryFramebuffer();
|
||||||
|
}
|
||||||
|
return _primaryNormalTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
gpu::TexturePointer FramebufferCache::getPrimarySpecularTexture() {
|
||||||
|
if (!_primarySpecularTexture) {
|
||||||
|
createPrimaryFramebuffer();
|
||||||
|
}
|
||||||
|
return _primarySpecularTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FramebufferCache::setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool normal, bool specular) {
|
||||||
|
GLenum buffers[3];
|
||||||
|
int bufferCount = 0;
|
||||||
|
if (color) {
|
||||||
|
buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
|
||||||
|
}
|
||||||
|
if (normal) {
|
||||||
|
buffers[bufferCount++] = GL_COLOR_ATTACHMENT1;
|
||||||
|
}
|
||||||
|
if (specular) {
|
||||||
|
buffers[bufferCount++] = GL_COLOR_ATTACHMENT2;
|
||||||
|
}
|
||||||
|
batch._glDrawBuffers(bufferCount, buffers);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gpu::FramebufferPointer FramebufferCache::getFramebuffer() {
|
||||||
|
if (_cachedFramebuffers.isEmpty()) {
|
||||||
|
_cachedFramebuffers.push_back(gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height())));
|
||||||
|
}
|
||||||
|
gpu::FramebufferPointer result = _cachedFramebuffers.front();
|
||||||
|
_cachedFramebuffers.pop_front();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FramebufferCache::releaseFramebuffer(const gpu::FramebufferPointer& framebuffer) {
|
||||||
|
if (QSize(framebuffer->getSize().x, framebuffer->getSize().y) == _frameBufferSize) {
|
||||||
|
_cachedFramebuffers.push_back(framebuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gpu::FramebufferPointer FramebufferCache::getShadowFramebuffer() {
|
||||||
|
if (!_shadowFramebuffer) {
|
||||||
|
const int SHADOW_MAP_SIZE = 2048;
|
||||||
|
_shadowFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::createShadowmap(SHADOW_MAP_SIZE));
|
||||||
|
}
|
||||||
|
return _shadowFramebuffer;
|
||||||
|
}
|
67
libraries/render-utils/src/FramebufferCache.h
Normal file
67
libraries/render-utils/src/FramebufferCache.h
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
//
|
||||||
|
// Created by Bradley Austin Davis on 2015/07/20
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef hifi_FramebufferCache_h
|
||||||
|
#define hifi_FramebufferCache_h
|
||||||
|
|
||||||
|
#include <QSize>
|
||||||
|
|
||||||
|
#include <gpu/Framebuffer.h>
|
||||||
|
#include <DependencyManager.h>
|
||||||
|
|
||||||
|
namespace gpu {
|
||||||
|
class Batch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Stores cached textures, including render-to-texture targets.
|
||||||
|
class FramebufferCache : public Dependency {
|
||||||
|
SINGLETON_DEPENDENCY
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// Sets the desired texture resolution for the framebuffer objects.
|
||||||
|
void setFrameBufferSize(QSize frameBufferSize);
|
||||||
|
const QSize& getFrameBufferSize() const { return _frameBufferSize; }
|
||||||
|
|
||||||
|
/// Returns a pointer to the primary framebuffer object. This render target includes a depth component, and is
|
||||||
|
/// used for scene rendering.
|
||||||
|
gpu::FramebufferPointer getPrimaryFramebuffer();
|
||||||
|
|
||||||
|
gpu::TexturePointer getPrimaryDepthTexture();
|
||||||
|
gpu::TexturePointer getPrimaryColorTexture();
|
||||||
|
gpu::TexturePointer getPrimaryNormalTexture();
|
||||||
|
gpu::TexturePointer getPrimarySpecularTexture();
|
||||||
|
|
||||||
|
/// Returns the framebuffer object used to render shadow maps;
|
||||||
|
gpu::FramebufferPointer getShadowFramebuffer();
|
||||||
|
|
||||||
|
/// Enables or disables draw buffers on the primary framebuffer. Note: the primary framebuffer must be bound.
|
||||||
|
void setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool normal = false, bool specular = false);
|
||||||
|
|
||||||
|
/// Returns a free framebuffer with a single color attachment for temp or intra-frame operations
|
||||||
|
gpu::FramebufferPointer getFramebuffer();
|
||||||
|
// TODO add sync functionality to the release, so we don't reuse a framebuffer being read from
|
||||||
|
/// Releases a free framebuffer back for reuse
|
||||||
|
void releaseFramebuffer(const gpu::FramebufferPointer& framebuffer);
|
||||||
|
|
||||||
|
private:
|
||||||
|
FramebufferCache();
|
||||||
|
virtual ~FramebufferCache();
|
||||||
|
|
||||||
|
void createPrimaryFramebuffer();
|
||||||
|
|
||||||
|
gpu::FramebufferPointer _primaryFramebuffer;
|
||||||
|
gpu::TexturePointer _primaryDepthTexture;
|
||||||
|
gpu::TexturePointer _primaryColorTexture;
|
||||||
|
gpu::TexturePointer _primaryNormalTexture;
|
||||||
|
gpu::TexturePointer _primarySpecularTexture;
|
||||||
|
|
||||||
|
gpu::FramebufferPointer _shadowFramebuffer;
|
||||||
|
QSize _frameBufferSize{ 100, 100 };
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // hifi_FramebufferCache_h
|
|
@ -9,6 +9,13 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include "TextureCache.h"
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
#include <glm/gtc/random.hpp>
|
||||||
|
|
||||||
#include <gpu/Batch.h>
|
#include <gpu/Batch.h>
|
||||||
#include <gpu/GLBackend.h>
|
#include <gpu/GLBackend.h>
|
||||||
#include <gpu/GPUConfig.h>
|
#include <gpu/GPUConfig.h>
|
||||||
|
@ -19,21 +26,10 @@
|
||||||
#include <QThreadPool>
|
#include <QThreadPool>
|
||||||
#include <qimagereader.h>
|
#include <qimagereader.h>
|
||||||
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/gtc/random.hpp>
|
|
||||||
|
|
||||||
#include "RenderUtilsLogging.h"
|
#include "RenderUtilsLogging.h"
|
||||||
#include "TextureCache.h"
|
|
||||||
|
|
||||||
|
TextureCache::TextureCache() {
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
TextureCache::TextureCache() :
|
|
||||||
_permutationNormalTexture(0),
|
|
||||||
_whiteTexture(0),
|
|
||||||
_blueTexture(0),
|
|
||||||
_frameBufferSize(100, 100)
|
|
||||||
{
|
|
||||||
const qint64 TEXTURE_DEFAULT_UNUSED_MAX_SIZE = DEFAULT_UNUSED_MAX_SIZE;
|
const qint64 TEXTURE_DEFAULT_UNUSED_MAX_SIZE = DEFAULT_UNUSED_MAX_SIZE;
|
||||||
setUnusedResourceCacheSize(TEXTURE_DEFAULT_UNUSED_MAX_SIZE);
|
setUnusedResourceCacheSize(TEXTURE_DEFAULT_UNUSED_MAX_SIZE);
|
||||||
}
|
}
|
||||||
|
@ -41,23 +37,6 @@ TextureCache::TextureCache() :
|
||||||
TextureCache::~TextureCache() {
|
TextureCache::~TextureCache() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureCache::setFrameBufferSize(QSize frameBufferSize) {
|
|
||||||
//If the size changed, we need to delete our FBOs
|
|
||||||
if (_frameBufferSize != frameBufferSize) {
|
|
||||||
_frameBufferSize = frameBufferSize;
|
|
||||||
|
|
||||||
_primaryFramebuffer.reset();
|
|
||||||
_primaryDepthTexture.reset();
|
|
||||||
_primaryColorTexture.reset();
|
|
||||||
_primaryNormalTexture.reset();
|
|
||||||
_primarySpecularTexture.reset();
|
|
||||||
|
|
||||||
_secondaryFramebuffer.reset();
|
|
||||||
|
|
||||||
_tertiaryFramebuffer.reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// use fixed table of permutations. Could also make ordered list programmatically
|
// use fixed table of permutations. Could also make ordered list programmatically
|
||||||
// and then shuffle algorithm. For testing, this ensures consistent behavior in each run.
|
// and then shuffle algorithm. For testing, this ensures consistent behavior in each run.
|
||||||
// this list taken from Ken Perlin's Improved Noise reference implementation (orig. in Java) at
|
// this list taken from Ken Perlin's Improved Noise reference implementation (orig. in Java) at
|
||||||
|
@ -175,113 +154,6 @@ NetworkTexturePointer TextureCache::getTexture(const QUrl& url, TextureType type
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureCache::createPrimaryFramebuffer() {
|
|
||||||
_primaryFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create());
|
|
||||||
|
|
||||||
auto colorFormat = gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA);
|
|
||||||
auto width = _frameBufferSize.width();
|
|
||||||
auto height = _frameBufferSize.height();
|
|
||||||
|
|
||||||
auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT);
|
|
||||||
_primaryColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
|
||||||
_primaryNormalTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
|
||||||
_primarySpecularTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
|
||||||
|
|
||||||
_primaryFramebuffer->setRenderBuffer(0, _primaryColorTexture);
|
|
||||||
_primaryFramebuffer->setRenderBuffer(1, _primaryNormalTexture);
|
|
||||||
_primaryFramebuffer->setRenderBuffer(2, _primarySpecularTexture);
|
|
||||||
|
|
||||||
|
|
||||||
auto depthFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::DEPTH);
|
|
||||||
_primaryDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler));
|
|
||||||
|
|
||||||
_primaryFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::FramebufferPointer TextureCache::getPrimaryFramebuffer() {
|
|
||||||
if (!_primaryFramebuffer) {
|
|
||||||
createPrimaryFramebuffer();
|
|
||||||
}
|
|
||||||
return _primaryFramebuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::TexturePointer TextureCache::getPrimaryDepthTexture() {
|
|
||||||
if (!_primaryDepthTexture) {
|
|
||||||
createPrimaryFramebuffer();
|
|
||||||
}
|
|
||||||
return _primaryDepthTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::TexturePointer TextureCache::getPrimaryColorTexture() {
|
|
||||||
if (!_primaryColorTexture) {
|
|
||||||
createPrimaryFramebuffer();
|
|
||||||
}
|
|
||||||
return _primaryColorTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::TexturePointer TextureCache::getPrimaryNormalTexture() {
|
|
||||||
if (!_primaryNormalTexture) {
|
|
||||||
createPrimaryFramebuffer();
|
|
||||||
}
|
|
||||||
return _primaryNormalTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::TexturePointer TextureCache::getPrimarySpecularTexture() {
|
|
||||||
if (!_primarySpecularTexture) {
|
|
||||||
createPrimaryFramebuffer();
|
|
||||||
}
|
|
||||||
return _primarySpecularTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLuint TextureCache::getPrimaryDepthTextureID() {
|
|
||||||
return gpu::GLBackend::getTextureID(getPrimaryDepthTexture());
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextureCache::setPrimaryDrawBuffers(bool color, bool normal, bool specular) {
|
|
||||||
gpu::Batch batch;
|
|
||||||
setPrimaryDrawBuffers(batch, color, normal, specular);
|
|
||||||
gpu::GLBackend::renderBatch(batch);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextureCache::setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool normal, bool specular) {
|
|
||||||
GLenum buffers[3];
|
|
||||||
int bufferCount = 0;
|
|
||||||
if (color) {
|
|
||||||
buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
|
|
||||||
}
|
|
||||||
if (normal) {
|
|
||||||
buffers[bufferCount++] = GL_COLOR_ATTACHMENT1;
|
|
||||||
}
|
|
||||||
if (specular) {
|
|
||||||
buffers[bufferCount++] = GL_COLOR_ATTACHMENT2;
|
|
||||||
}
|
|
||||||
batch._glDrawBuffers(bufferCount, buffers);
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::FramebufferPointer TextureCache::getSecondaryFramebuffer() {
|
|
||||||
if (!_secondaryFramebuffer) {
|
|
||||||
_secondaryFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height()));
|
|
||||||
}
|
|
||||||
return _secondaryFramebuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::FramebufferPointer TextureCache::getTertiaryFramebuffer() {
|
|
||||||
if (!_tertiaryFramebuffer) {
|
|
||||||
_tertiaryFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height()));
|
|
||||||
}
|
|
||||||
return _tertiaryFramebuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::FramebufferPointer TextureCache::getShadowFramebuffer() {
|
|
||||||
if (!_shadowFramebuffer) {
|
|
||||||
const int SHADOW_MAP_SIZE = 2048;
|
|
||||||
_shadowFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::createShadowmap(SHADOW_MAP_SIZE));
|
|
||||||
|
|
||||||
_shadowTexture = _shadowFramebuffer->getDepthStencilBuffer();
|
|
||||||
}
|
|
||||||
return _shadowFramebuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a texture version of an image file
|
/// Returns a texture version of an image file
|
||||||
gpu::TexturePointer TextureCache::getImageTexture(const QString& path) {
|
gpu::TexturePointer TextureCache::getImageTexture(const QString& path) {
|
||||||
QImage image = QImage(path).mirrored(false, true);
|
QImage image = QImage(path).mirrored(false, true);
|
||||||
|
|
|
@ -13,8 +13,6 @@
|
||||||
#define hifi_TextureCache_h
|
#define hifi_TextureCache_h
|
||||||
|
|
||||||
#include <gpu/Texture.h>
|
#include <gpu/Texture.h>
|
||||||
#include <gpu/Framebuffer.h>
|
|
||||||
|
|
||||||
#include <model/Light.h>
|
#include <model/Light.h>
|
||||||
|
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
|
@ -39,10 +37,6 @@ class TextureCache : public ResourceCache, public Dependency {
|
||||||
SINGLETON_DEPENDENCY
|
SINGLETON_DEPENDENCY
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Sets the desired texture resolution for the framebuffer objects.
|
|
||||||
void setFrameBufferSize(QSize frameBufferSize);
|
|
||||||
const QSize& getFrameBufferSize() const { return _frameBufferSize; }
|
|
||||||
|
|
||||||
/// Returns the ID of the permutation/normal texture used for Perlin noise shader programs. This texture
|
/// Returns the ID of the permutation/normal texture used for Perlin noise shader programs. This texture
|
||||||
/// has two lines: the first, a set of random numbers in [0, 255] to be used as permutation offsets, and
|
/// has two lines: the first, a set of random numbers in [0, 255] to be used as permutation offsets, and
|
||||||
/// the second, a set of random unit vectors to be used as noise gradients.
|
/// the second, a set of random unit vectors to be used as noise gradients.
|
||||||
|
@ -67,33 +61,6 @@ public:
|
||||||
NetworkTexturePointer getTexture(const QUrl& url, TextureType type = DEFAULT_TEXTURE, bool dilatable = false,
|
NetworkTexturePointer getTexture(const QUrl& url, TextureType type = DEFAULT_TEXTURE, bool dilatable = false,
|
||||||
const QByteArray& content = QByteArray());
|
const QByteArray& content = QByteArray());
|
||||||
|
|
||||||
/// Returns a pointer to the primary framebuffer object. This render target includes a depth component, and is
|
|
||||||
/// used for scene rendering.
|
|
||||||
gpu::FramebufferPointer getPrimaryFramebuffer();
|
|
||||||
|
|
||||||
gpu::TexturePointer getPrimaryDepthTexture();
|
|
||||||
gpu::TexturePointer getPrimaryColorTexture();
|
|
||||||
gpu::TexturePointer getPrimaryNormalTexture();
|
|
||||||
gpu::TexturePointer getPrimarySpecularTexture();
|
|
||||||
|
|
||||||
/// Returns the ID of the primary framebuffer object's depth texture. This contains the Z buffer used in rendering.
|
|
||||||
uint32_t getPrimaryDepthTextureID();
|
|
||||||
|
|
||||||
/// Enables or disables draw buffers on the primary framebuffer. Note: the primary framebuffer must be bound.
|
|
||||||
void setPrimaryDrawBuffers(bool color, bool normal = false, bool specular = false);
|
|
||||||
void setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool normal = false, bool specular = false);
|
|
||||||
|
|
||||||
/// Returns a pointer to the secondary framebuffer object, used as an additional render target when performing full
|
|
||||||
/// screen effects.
|
|
||||||
gpu::FramebufferPointer getSecondaryFramebuffer();
|
|
||||||
|
|
||||||
/// Returns a pointer to the tertiary framebuffer object, used as an additional render target when performing full
|
|
||||||
/// screen effects.
|
|
||||||
gpu::FramebufferPointer getTertiaryFramebuffer();
|
|
||||||
|
|
||||||
/// Returns the framebuffer object used to render shadow maps;
|
|
||||||
gpu::FramebufferPointer getShadowFramebuffer();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual QSharedPointer<Resource> createResource(const QUrl& url,
|
virtual QSharedPointer<Resource> createResource(const QUrl& url,
|
||||||
|
@ -110,23 +77,7 @@ private:
|
||||||
gpu::TexturePointer _blueTexture;
|
gpu::TexturePointer _blueTexture;
|
||||||
gpu::TexturePointer _blackTexture;
|
gpu::TexturePointer _blackTexture;
|
||||||
|
|
||||||
|
|
||||||
QHash<QUrl, QWeakPointer<NetworkTexture> > _dilatableNetworkTextures;
|
QHash<QUrl, QWeakPointer<NetworkTexture> > _dilatableNetworkTextures;
|
||||||
|
|
||||||
gpu::TexturePointer _primaryDepthTexture;
|
|
||||||
gpu::TexturePointer _primaryColorTexture;
|
|
||||||
gpu::TexturePointer _primaryNormalTexture;
|
|
||||||
gpu::TexturePointer _primarySpecularTexture;
|
|
||||||
gpu::FramebufferPointer _primaryFramebuffer;
|
|
||||||
void createPrimaryFramebuffer();
|
|
||||||
|
|
||||||
gpu::FramebufferPointer _secondaryFramebuffer;
|
|
||||||
gpu::FramebufferPointer _tertiaryFramebuffer;
|
|
||||||
|
|
||||||
gpu::FramebufferPointer _shadowFramebuffer;
|
|
||||||
gpu::TexturePointer _shadowTexture;
|
|
||||||
|
|
||||||
QSize _frameBufferSize;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A simple object wrapper for an OpenGL texture.
|
/// A simple object wrapper for an OpenGL texture.
|
||||||
|
|
|
@ -1,63 +1,17 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
#line __LINE__
|
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// stars.frag
|
|
||||||
// fragment shader
|
// fragment shader
|
||||||
//
|
//
|
||||||
// Created by Bradley Austin Davis on 2015/06/19
|
// Created by Bradley Austin Davis on 6/10/15.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
varying vec2 varTexcoord;
|
varying vec4 varColor;
|
||||||
varying vec3 varNomral;
|
|
||||||
varying vec3 varPosition;
|
|
||||||
|
|
||||||
uniform float iGlobalTime;
|
|
||||||
|
|
||||||
const float PI = 3.14159;
|
|
||||||
const float TAU = 3.14159 * 2.0;
|
|
||||||
const int latitudeCount = 5;
|
|
||||||
const float latitudeDist = PI / 2.0 / float(latitudeCount);
|
|
||||||
const int meridianCount = 4;
|
|
||||||
const float merdianDist = PI / float(meridianCount);
|
|
||||||
|
|
||||||
|
|
||||||
float clampLine(float val, float target) {
|
|
||||||
return clamp((1.0 - abs((val - target)) - 0.998) * 500.0, 0.0, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
float latitude(vec2 pos, float angle) {
|
|
||||||
float result = clampLine(pos.y, angle);
|
|
||||||
if (angle != 0.0) {
|
|
||||||
result += clampLine(pos.y, -angle);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
float meridian(vec2 pos, float angle) {
|
|
||||||
return clampLine(pos.x, angle) + clampLine(pos.x + PI, angle);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec2 toPolar(in vec3 dir) {
|
|
||||||
vec2 polar = vec2(atan(dir.z, dir.x), asin(dir.y));
|
|
||||||
return polar;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mainVR( out vec4 fragColor, in vec2 fragCoord, in vec3 fragRayOri, in vec3 fragRayDir )
|
|
||||||
{
|
|
||||||
vec2 polar = toPolar(fragRayDir);
|
|
||||||
//polar.x += mod(iGlobalTime / 12.0, PI / 4.0) - PI / 4.0;
|
|
||||||
float c = 0.0;
|
|
||||||
for (int i = 0; i < latitudeCount - 1; ++i) {
|
|
||||||
c += latitude(polar, float(i) * latitudeDist);
|
|
||||||
}
|
|
||||||
for (int i = 0; i < meridianCount; ++i) {
|
|
||||||
c += meridian(polar, float(i) * merdianDist);
|
|
||||||
}
|
|
||||||
const vec3 col_lines = vec3(102.0 / 255.0, 136.0 / 255.0, 221.0 / 255.0);
|
|
||||||
fragColor = vec4(c * col_lines, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
mainVR(gl_FragColor, gl_FragCoord.xy, vec3(0.0), normalize(varPosition));
|
gl_FragColor = varColor; //vec4(varColor, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
32
libraries/render-utils/src/stars.slv
Normal file
32
libraries/render-utils/src/stars.slv
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<@include gpu/Config.slh@>
|
||||||
|
<$VERSION_HEADER$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
|
//
|
||||||
|
// standardTransformPNTC.slv
|
||||||
|
// vertex shader
|
||||||
|
//
|
||||||
|
// Created by Sam Gateau on 6/10/2015.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
<@include gpu/Transform.slh@>
|
||||||
|
|
||||||
|
<$declareStandardTransform()$>
|
||||||
|
|
||||||
|
varying vec3 varPosition;
|
||||||
|
varying vec4 varColor;
|
||||||
|
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
varColor = gl_Color.rgba;
|
||||||
|
|
||||||
|
// standard transform
|
||||||
|
TransformCamera cam = getTransformCamera();
|
||||||
|
TransformObject obj = getTransformObject();
|
||||||
|
<$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$>
|
||||||
|
varPosition = gl_Vertex.xyz;
|
||||||
|
gl_PointSize = gl_Color.a;
|
||||||
|
}
|
63
libraries/render-utils/src/starsGrid.slf
Normal file
63
libraries/render-utils/src/starsGrid.slf
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
<@include gpu/Config.slh@>
|
||||||
|
<$VERSION_HEADER$>
|
||||||
|
#line __LINE__
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
|
// stars.frag
|
||||||
|
// fragment shader
|
||||||
|
//
|
||||||
|
// Created by Bradley Austin Davis on 2015/06/19
|
||||||
|
|
||||||
|
varying vec2 varTexcoord;
|
||||||
|
varying vec3 varNomral;
|
||||||
|
varying vec3 varPosition;
|
||||||
|
|
||||||
|
uniform float iGlobalTime;
|
||||||
|
|
||||||
|
const float PI = 3.14159;
|
||||||
|
const float TAU = 3.14159 * 2.0;
|
||||||
|
const int latitudeCount = 5;
|
||||||
|
const float latitudeDist = PI / 2.0 / float(latitudeCount);
|
||||||
|
const int meridianCount = 4;
|
||||||
|
const float merdianDist = PI / float(meridianCount);
|
||||||
|
|
||||||
|
|
||||||
|
float clampLine(float val, float target) {
|
||||||
|
return clamp((1.0 - abs((val - target)) - 0.998) * 500.0, 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float latitude(vec2 pos, float angle) {
|
||||||
|
float result = clampLine(pos.y, angle);
|
||||||
|
if (angle != 0.0) {
|
||||||
|
result += clampLine(pos.y, -angle);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
float meridian(vec2 pos, float angle) {
|
||||||
|
return clampLine(pos.x, angle) + clampLine(pos.x + PI, angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 toPolar(in vec3 dir) {
|
||||||
|
vec2 polar = vec2(atan(dir.z, dir.x), asin(dir.y));
|
||||||
|
return polar;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mainVR( out vec4 fragColor, in vec2 fragCoord, in vec3 fragRayOri, in vec3 fragRayDir )
|
||||||
|
{
|
||||||
|
vec2 polar = toPolar(fragRayDir);
|
||||||
|
//polar.x += mod(iGlobalTime / 12.0, PI / 4.0) - PI / 4.0;
|
||||||
|
float c = 0.0;
|
||||||
|
for (int i = 0; i < latitudeCount - 1; ++i) {
|
||||||
|
c += latitude(polar, float(i) * latitudeDist);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < meridianCount; ++i) {
|
||||||
|
c += meridian(polar, float(i) * merdianDist);
|
||||||
|
}
|
||||||
|
const vec3 col_lines = vec3(102.0 / 255.0, 136.0 / 255.0, 221.0 / 255.0);
|
||||||
|
fragColor = vec4(c * col_lines, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
mainVR(gl_FragColor, gl_FragCoord.xy, vec3(0.0), normalize(varPosition));
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
#include "ScriptEngineLogging.h"
|
#include "ScriptEngineLogging.h"
|
||||||
|
#include "NumericalConstants.h"
|
||||||
#include "Vec3.h"
|
#include "Vec3.h"
|
||||||
|
|
||||||
glm::vec3 Vec3::reflect(const glm::vec3& v1, const glm::vec3& v2) {
|
glm::vec3 Vec3::reflect(const glm::vec3& v1, const glm::vec3& v2) {
|
||||||
|
@ -73,3 +74,52 @@ void Vec3::print(const QString& lable, const glm::vec3& v) {
|
||||||
bool Vec3::equal(const glm::vec3& v1, const glm::vec3& v2) {
|
bool Vec3::equal(const glm::vec3& v1, const glm::vec3& v2) {
|
||||||
return v1 == v2;
|
return v1 == v2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glm::vec3 Vec3::toPolar(const glm::vec3& v) {
|
||||||
|
float radius = length(v);
|
||||||
|
if (glm::abs(radius) < EPSILON) {
|
||||||
|
return glm::vec3(0.0f, 0.0f, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 u = v / radius;
|
||||||
|
|
||||||
|
float elevation, azimuth;
|
||||||
|
|
||||||
|
elevation = glm::asin(-u.y);
|
||||||
|
azimuth = atan2(v.x, v.z);
|
||||||
|
|
||||||
|
// Round off small decimal values
|
||||||
|
if (glm::abs(elevation) < EPSILON) {
|
||||||
|
elevation = 0.0f;
|
||||||
|
}
|
||||||
|
if (glm::abs(azimuth) < EPSILON) {
|
||||||
|
azimuth = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return glm::vec3(elevation, azimuth, radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 Vec3::fromPolar(const glm::vec3& polar) {
|
||||||
|
float x = glm::cos(polar.x) * glm::sin(polar.y);
|
||||||
|
float y = glm::sin(-polar.x);
|
||||||
|
float z = glm::cos(polar.x) * glm::cos(polar.y);
|
||||||
|
|
||||||
|
// Round small values to 0
|
||||||
|
if (glm::abs(x) < EPSILON) {
|
||||||
|
x = 0.0f;
|
||||||
|
}
|
||||||
|
if (glm::abs(y) < EPSILON) {
|
||||||
|
y = 0.0f;
|
||||||
|
}
|
||||||
|
if (glm::abs(z) < EPSILON) {
|
||||||
|
z = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return polar.z * glm::vec3(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 Vec3::fromPolar(float elevation, float azimuth) {
|
||||||
|
glm::vec3 v = glm::vec3(elevation, azimuth, 1.0f);
|
||||||
|
return fromPolar(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,9 @@ public slots:
|
||||||
glm::vec3 mix(const glm::vec3& v1, const glm::vec3& v2, float m);
|
glm::vec3 mix(const glm::vec3& v1, const glm::vec3& v2, float m);
|
||||||
void print(const QString& lable, const glm::vec3& v);
|
void print(const QString& lable, const glm::vec3& v);
|
||||||
bool equal(const glm::vec3& v1, const glm::vec3& v2);
|
bool equal(const glm::vec3& v1, const glm::vec3& v2);
|
||||||
|
glm::vec3 toPolar(const glm::vec3& v);
|
||||||
|
glm::vec3 fromPolar(const glm::vec3& polar);
|
||||||
|
glm::vec3 fromPolar(float elevation, float azimuth);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
#include "OffscreenUi.h"
|
#include "OffscreenUi.h"
|
||||||
#include <QOpenGLFramebufferObject>
|
|
||||||
#include <QOpenGLDebugLogger>
|
#include <QOpenGLDebugLogger>
|
||||||
#include <QQuickWindow>
|
#include <QQuickWindow>
|
||||||
#include <QGLWidget>
|
#include <QGLWidget>
|
||||||
|
|
Loading…
Reference in a new issue