From bacdaf416f23c18afd3f328aa25a64024561fe20 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 12 Jun 2015 17:15:41 +0200 Subject: [PATCH 01/19] Working on the Job input/output mechanism --- libraries/render/src/render/DrawTask.cpp | 22 +++++ libraries/render/src/render/DrawTask.h | 109 ++++++++++++++++++++++- 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 53964ac1db..c012b1dfc7 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -56,6 +56,28 @@ void DrawSceneTask::run(const SceneContextPointer& sceneContext, const RenderCon Job::~Job() { } + + +void FetchCullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems) { + PerformanceTimer perfTimer("FetchCullItems::run"); + + auto& scene = sceneContext->_scene; + auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); + auto& renderDetails = renderContext->args->_details; + + ItemIDsBounds inItems; + inItems.reserve(items.size()); + for (auto id : items) { + inItems.emplace_back(id); + } + + ItemIDsBounds& renderedItems = inItems; + + outItems._items.reserve(inItems.size()); + cullItems(sceneContext, renderContext, renderedItems, outItems._items); +} + + void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { PerformanceTimer perfTimer("cullItems"); assert(renderContext->args); diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 0052c314c0..37fff55245 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -16,16 +16,62 @@ namespace render { + + + + template void jobRun(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { } +template void jobRunI(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input) { } +template void jobRunO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, O& output) { + jobModel.run(sceneContext, renderContext, output); +} +template void jobRunIO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) { } class Job { public: + class Varying { + public: + + Varying() {} + template + Varying(T data) : _concept(new Model(data)) {} + + protected: + friend class Job; + + std::vector> _consumerJobs; + + void addJobConsumer(const std::shared_ptr& job) { + _consumerJobs.push_back(job); + } + + class Concept { + public: + virtual ~Concept() = default; + }; + template class Model : public Concept { + public: + typedef T Data; + Data _data; + Model(Data data): _data(data) {} + }; + }; + typedef std::shared_ptr VaryingPointer; + template Job(T data) : _concept(new Model(data)) {} + + + template + static Job* createO(T data) { return new Job(new ModelO(data)); } + Job(const Job& other) : _concept(other._concept) {} ~Job(); + const VaryingPointer& getInput() const { return _concept->getInput(); } + const VaryingPointer& getOutput() const { return _concept->getOutput(); } + virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { if (_concept) { _concept->run(sceneContext, renderContext); @@ -33,21 +79,70 @@ public: } protected: + class Concept { public: virtual ~Concept() = default; + virtual const VaryingPointer& getInput() const { return VaryingPointer(); } + virtual const VaryingPointer& getOutput() const { return VaryingPointer(); } virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; }; + Job(Concept* concept) : _concept(concept) {} + template class Model : public Concept { public: typedef T Data; - + Data _data; + Model(Data data): _data(data) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRun(_data, sceneContext, renderContext); } }; +public: + template class ModelI : public Concept { + public: + typedef T Data; + typedef I Input; + + Data _data; + VaryingPointer _intput; + + ModelI(Data data): _data(data) {} + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input); } + }; + + template class ModelO : public Concept { + public: + typedef T Data; + typedef O Output; + + Data _data; + VaryingPointer _output; + + ModelO(Data data): _data(data), _output(new Varying::Model(Output())) {} + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunO(_data, sceneContext, renderContext, _output); } + }; + + template class ModelIO : public Concept { + public: + typedef T Data; + typedef I Input; + typedef O Output; + + Data _data; + VaryingPointer _intput; + VaryingPointer _output; + + ModelIO(Data data, Output output): _data(data), _output(new Varying::Model(output)) {} + + void setInput(const VaryingPointer& input) { _input = input; } + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunIO(_data, sceneContext, renderContext, _input, _output); } + }; std::shared_ptr _concept; }; @@ -61,6 +156,18 @@ void cullItems(const SceneContextPointer& sceneContext, const RenderContextPoint void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems = -1); +class CulledItems { +public: + ItemIDsBounds _items; +}; + +class FetchCullItems { +public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems); + + typedef Job::ModelO JobModel; +}; + void materialSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); From 22961fcc9ddcd3903060be1384eaedcc9503eedd Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Mon, 15 Jun 2015 15:44:56 -0700 Subject: [PATCH 02/19] added camera mode to keep player in center of view --- interface/src/Application.cpp | 15 +++++++++++++-- interface/src/Application.h | 1 + interface/src/Menu.cpp | 3 +++ interface/src/Menu.h | 1 + 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a1ab6d35ae..a0e90cf2b5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -901,13 +901,18 @@ void Application::paintGL() { } } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { - _myCamera.setPosition(_myAvatar->getDefaultEyePosition() + - _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale()); if (OculusManager::isConnected()) { _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation()); } else { _myCamera.setRotation(_myAvatar->getHead()->getOrientation()); } + if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) { + _myCamera.setPosition(_myAvatar->getDefaultEyePosition() + + _myCamera.getRotation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale()); + } else { + _myCamera.setPosition(_myAvatar->getDefaultEyePosition() + + _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale()); + } } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))); @@ -2384,6 +2389,12 @@ void Application::cameraMenuChanged() { } } +void Application::rotationModeChanged() { + if (!Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) { + _myAvatar->setHeadPitch(0); + } +} + void Application::updateCamera(float deltaTime) { PerformanceTimer perfTimer("updateCamera"); bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); diff --git a/interface/src/Application.h b/interface/src/Application.h index 68bf60781a..7e9d9b201c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -453,6 +453,7 @@ private slots: void setEnable3DTVMode(bool enable3DTVMode); void setEnableVRMode(bool enableVRMode); void cameraMenuChanged(); + void rotationModeChanged(); glm::vec2 getScaledScreenPoint(glm::vec2 projectedPoint); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 6242318170..d27f3e02a6 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -254,6 +254,9 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FullscreenMirror, 0, // QML Qt::Key_H, false, qApp, SLOT(cameraMenuChanged())); + + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::CenterPlayerInView, + 0, false, qApp, SLOT(rotationModeChanged())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::HMDTools, #ifdef Q_OS_MAC diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 6107744abc..ebd6931bdb 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -197,6 +197,7 @@ namespace MenuOption { const QString FrameTimer = "Show Timer"; const QString Fullscreen = "Fullscreen"; const QString FullscreenMirror = "Fullscreen Mirror"; + const QString CenterPlayerInView = "Center Player In View"; const QString GlowWhenSpeaking = "Glow When Speaking"; const QString NamesAboveHeads = "Names Above Heads"; const QString GoToUser = "Go To User"; From 9be87758fd24048334a2bf89183d41ff7458fa2c Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 16 Jun 2015 15:00:47 +0200 Subject: [PATCH 03/19] Improving the design of the Jobs and varying --- interface/src/avatar/SkeletonModel.cpp | 3 +- libraries/fbx/src/FBXReader.cpp | 35 ++++- .../src/DeferredLightingEffect.cpp | 4 +- .../render-utils/src/DeferredLightingEffect.h | 4 +- .../render-utils/src/RenderDeferredTask.cpp | 81 +++++++++-- .../render-utils/src/RenderDeferredTask.h | 40 +++--- libraries/render/src/render/DrawTask.cpp | 136 +++++++++++------- libraries/render/src/render/DrawTask.h | 134 +++++++++++------ 8 files changed, 310 insertions(+), 127 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 2aa08d36f3..9497e2099d 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -260,7 +260,8 @@ void SkeletonModel::updateJointState(int index) { } JointState& state = _jointStates[index]; const FBXJoint& joint = state.getFBXJoint(); - if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { + // if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { + if (joint.parentIndex > -1 && joint.parentIndex <= _jointStates.size()) { const JointState& parentState = _jointStates.at(joint.parentIndex); const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (index == geometry.leanJointIndex) { diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index de8f53c503..764ef5bc93 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -516,6 +516,24 @@ QVector createVec4Vector(const QVector& doubleVector) { return values; } + +QVector createVec4VectorRGBA(const QVector& doubleVector, glm::vec4& average) { + QVector values; + for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 4 * 4); it != end; ) { + float x = *it++; + float y = *it++; + float z = *it++; + float w = *it++; + auto val = glm::vec4(x, y, z, w); + values.append(val); + average += val; + } + if (!values.isEmpty()) { + average *= (1.0f / float(values.size())); + } + return values; +} + QVector createVec3Vector(const QVector& doubleVector) { QVector values; for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 3 * 3); it != end; ) { @@ -799,6 +817,7 @@ public: QVector normalIndices; bool colorsByVertex; + glm::vec4 averageColor{1.0f, 1.0f, 1.0f, 1.0f}; QVector colors; QVector colorIndices; @@ -940,8 +959,7 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) { bool indexToDirect = false; foreach (const FBXNode& subdata, child.children) { if (subdata.name == "Colors") { - data.colors = createVec4Vector(getDoubleVector(subdata)); - + data.colors = createVec4VectorRGBA(getDoubleVector(subdata), data.averageColor); } else if (subdata.name == "ColorsIndex") { data.colorIndices = getIntVector(subdata); @@ -956,6 +974,19 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) { // hack to work around wacky Makehuman exports data.colorsByVertex = true; } + +#if defined(FBXREADER_KILL_BLACK_COLOR_ATTRIBUTE) + // Potential feature where we decide to kill the color attribute is to dark? + // Tested with the model: + // https://hifi-public.s3.amazonaws.com/ryan/gardenLight2.fbx + // let's check if we did have true data ? + if (glm::all(glm::lessThanEqual(data.averageColor, glm::vec4(0.09f)))) { + data.colors.clear(); + data.colorIndices.clear(); + data.colorsByVertex = false; + qCDebug(modelformat) << "LayerElementColor has an average value of 0.0f... let's forget it."; + } +#endif } else if (child.name == "LayerElementUV") { if (child.properties.at(0).toInt() == 0) { diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index f0a52af086..569892f6e8 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -191,7 +191,7 @@ void DeferredLightingEffect::addSpotLight(const glm::vec3& position, float radiu } } -void DeferredLightingEffect::prepare() { +void DeferredLightingEffect::prepare(RenderArgs* args) { // clear the normal and specular buffers auto textureCache = DependencyManager::get(); textureCache->setPrimaryDrawBuffers(false, true, false); @@ -205,7 +205,7 @@ void DeferredLightingEffect::prepare() { textureCache->setPrimaryDrawBuffers(true, false, false); } -void DeferredLightingEffect::render() { +void DeferredLightingEffect::render(RenderArgs* args) { // perform deferred lighting, rendering to free fbo glDisable(GL_BLEND); glDisable(GL_LIGHTING); diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index bd7fcb286b..2440c78df3 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -66,8 +66,8 @@ public: void addSpotLight(const glm::vec3& position, float radius, const glm::vec3& color = glm::vec3(1.0f, 1.0f, 1.0f), float intensity = 0.5f, const glm::quat& orientation = glm::quat(), float exponent = 0.0f, float cutoff = PI); - void prepare(); - void render(); + void prepare(RenderArgs* args); + void render(RenderArgs* args); void copyBack(RenderArgs* args); void setupTransparent(RenderArgs* args, int lightBufferUnit); diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index d9dda279e0..978a3dede2 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -21,18 +21,18 @@ using namespace render; -template <> void render::jobRun(const PrepareDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("PrepareDeferred"); - DependencyManager::get()->prepare(); + DependencyManager::get()->prepare(renderContext->args); } -template <> void render::jobRun(const RenderDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("RenderDeferred"); - DependencyManager::get()->render(); + DependencyManager::get()->render(renderContext->args); // renderContext->args->_context->syncCache(); } -template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("ResolveDeferred"); DependencyManager::get()->copyBack(renderContext->args); renderContext->args->_context->syncCache(); @@ -40,7 +40,7 @@ template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPo } - +/* RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(PrepareDeferred())); _jobs.push_back(Job(DrawBackground())); @@ -53,6 +53,22 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(DrawPostLayered())); _jobs.push_back(Job(ResetGLState())); } +*/ +RenderDeferredTask::RenderDeferredTask() : Task() { + _jobs.push_back(Job(new PrepareDeferred::JobModel())); + _jobs.push_back(Job(new DrawBackground::JobModel())); + _jobs.push_back(Job(new FetchItems::JobModel())); + _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawLight::JobModel())); + _jobs.push_back(Job(new ResetGLState::JobModel())); + _jobs.push_back(Job(new RenderDeferred::JobModel())); + _jobs.push_back(Job(new ResolveDeferred::JobModel())); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel())); + _jobs.push_back(Job(new DrawPostLayered::JobModel())); + _jobs.push_back(Job(new ResetGLState::JobModel())); +} RenderDeferredTask::~RenderDeferredTask() { } @@ -77,9 +93,8 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend } }; - - -template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +/* +void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawOpaqueDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -126,7 +141,7 @@ template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContex } } */ - +/* if (renderContext->_renderOpaque) { RenderArgs* args = renderContext->args; gpu::Batch batch; @@ -153,13 +168,49 @@ template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContex renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems); + renderContext->args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; } } +*/ +void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { + PerformanceTimer perfTimer("DrawOpaqueDeferred"); + assert(renderContext->args); + assert(renderContext->args->_viewFrustum); -template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + RenderArgs* args = renderContext->args; + gpu::Batch batch; + args->_batch = &batch; + + glm::mat4 projMat; + Transform viewMat; + args->_viewFrustum->evalProjectionMatrix(projMat); + args->_viewFrustum->evalViewTransform(viewMat); + if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { + viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); + } + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); + + { + GLenum buffers[3]; + int bufferCount = 0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; + batch._glDrawBuffers(bufferCount, buffers); + } + + renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); + + renderContext->args->_context->syncCache(); + args->_context->render((*args->_batch)); + args->_batch = nullptr; +} + +void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawTransparentDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -172,7 +223,13 @@ template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneC ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.push_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds& renderedItems = inItems; diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index e2cac53c0d..b587c7526b 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -16,39 +16,47 @@ class PrepareDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; }; -namespace render { -template <> void jobRun(const PrepareDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} + class RenderDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; }; -namespace render { -template <> void jobRun(const RenderDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} class ResolveDeferred { public: -}; -namespace render { -template <> void jobRun(const ResolveDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + typedef render::Job::Model JobModel; +}; class DrawOpaqueDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const render::ItemIDsBounds& inItems); + + typedef render::Job::ModelI JobModel; }; -namespace render { -template <> void jobRun(const DrawOpaqueDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} + +/*class DrawOpaqueDeferred { +public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; +}; +*/ class DrawTransparentDeferred { public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; }; -namespace render { -template <> void jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); -} class RenderDeferredTask : public render::Task { public: diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 1ab8c29294..743d19765a 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -26,10 +26,10 @@ using namespace render; DrawSceneTask::DrawSceneTask() : Task() { - _jobs.push_back(Job(DrawOpaque())); - _jobs.push_back(Job(DrawLight())); - _jobs.push_back(Job(DrawTransparent())); - _jobs.push_back(Job(ResetGLState())); + _jobs.push_back(Job(new Job::Model())); + _jobs.push_back(Job(new Job::Model())); + _jobs.push_back(Job(new Job::Model())); + _jobs.push_back(Job(new Job::Model())); } DrawSceneTask::~DrawSceneTask() { @@ -58,24 +58,6 @@ Job::~Job() { -void FetchCullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems) { - PerformanceTimer perfTimer("FetchCullItems::run"); - - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); - auto& renderDetails = renderContext->args->_details; - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - inItems.emplace_back(id); - } - - ItemIDsBounds& renderedItems = inItems; - - outItems._items.reserve(inItems.size()); - cullItems(sceneContext, renderContext, renderedItems, outItems._items); -} void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { @@ -90,17 +72,9 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont renderDetails->_considered += inItems.size(); // Culling / LOD - for (auto itemDetails : inItems) { - auto item = scene->getItem(itemDetails.id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - - bound = item.getBound(); - } - - if (bound.isNull()) { - outItems.emplace_back(ItemIDAndBounds(itemDetails.id)); // One more Item to render + for (auto item : inItems) { + if (item.bounds.isNull()) { + outItems.emplace_back(item); // One more Item to render continue; } @@ -109,16 +83,16 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont bool outOfView; { PerformanceTimer perfTimer("boxInFrustum"); - outOfView = args->_viewFrustum->boxInFrustum(bound) == ViewFrustum::OUTSIDE; + outOfView = args->_viewFrustum->boxInFrustum(item.bounds) == ViewFrustum::OUTSIDE; } if (!outOfView) { bool bigEnoughToRender; { PerformanceTimer perfTimer("shouldRender"); - bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true; + bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, item.bounds) : true; } if (bigEnoughToRender) { - outItems.emplace_back(ItemIDAndBounds(itemDetails.id, bound)); // One more Item to render + outItems.emplace_back(item); // One more Item to render } else { renderDetails->_tooSmall++; } @@ -129,6 +103,36 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont renderDetails->_rendered += outItems.size(); } + +void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems) { + PerformanceTimer perfTimer("FetchCullItems::run"); + + auto& scene = sceneContext->_scene; + auto& items = scene->getMasterBucket().at(_filter); + auto& renderDetails = renderContext->args->_details; + + outItems.clear(); + outItems.reserve(items.size()); + for (auto id : items) { + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + outItems.emplace_back(ItemIDAndBounds(id, bound)); + } +} + +void CullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { + PerformanceTimer perfTimer("CullItems::run"); + + outItems.clear(); + outItems.reserve(inItems.size()); + cullItems(sceneContext, renderContext, inItems, outItems); +} + + struct ItemBound { float _centerDepth = 0.0f; float _nearDepth = 0.0f; @@ -161,9 +165,10 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende // Allocate and simply copy + outItems.clear(); outItems.reserve(inItems.size()); - + // Make a local dataset of the center distance and closest point distance std::vector itemBounds; itemBounds.reserve(outItems.size()); @@ -191,6 +196,13 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende } } + +void DepthSortItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { + outItems.clear(); + outItems.reserve(inItems.size()); + depthSortItems(sceneContext, renderContext, _frontToBack, inItems, outItems); +} + void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems) { PerformanceTimer perfTimer("renderItems"); auto& scene = sceneContext->_scene; @@ -205,6 +217,11 @@ void render::renderItems(const SceneContextPointer& sceneContext, const RenderCo int numItems = 0; for (auto itemDetails : inItems) { auto item = scene->getItem(itemDetails.id); + if (numItems + 1 >= maxDrawnItems) { + item.render(args); + + return; + } item.render(args); numItems++; if (numItems >= maxDrawnItems) { @@ -246,8 +263,7 @@ void addClearStateCommands(gpu::Batch& batch) { // Back to no program batch._glUseProgram(0); } - -template <> void render::jobRun(const ResetGLState& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void ResetGLState::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { gpu::Batch theBatch; addClearStateCommands(theBatch); @@ -255,7 +271,7 @@ template <> void render::jobRun(const ResetGLState& job, const SceneContextPoint renderContext->args->_context->render(theBatch); } -template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +template <> void render::jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawOpaque"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -268,7 +284,13 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.emplace_back(ItemIDAndBounds(id)); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds& renderedItems = inItems; @@ -324,7 +346,7 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer } -template <> void render::jobRun(const DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +template <> void render::jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawTransparent"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -337,7 +359,13 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.emplace_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds& renderedItems = inItems; @@ -407,7 +435,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo } } -template <> void render::jobRun(const DrawLight& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawLight"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -420,7 +448,13 @@ template <> void render::jobRun(const DrawLight& job, const SceneContextPointer& ItemIDsBounds inItems; inItems.reserve(items.size()); for (auto id : items) { - inItems.emplace_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } ItemIDsBounds culledItems; @@ -435,7 +469,7 @@ template <> void render::jobRun(const DrawLight& job, const SceneContextPointer& args->_batch = nullptr; } -template <> void render::jobRun(const DrawBackground& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawBackground"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -472,7 +506,7 @@ template <> void render::jobRun(const DrawBackground& job, const SceneContextPoi args->_context->syncCache(); } -template <> void render::jobRun(const DrawPostLayered& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { +void DrawPostLayered::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawPostLayered"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -487,7 +521,13 @@ template <> void render::jobRun(const DrawPostLayered& job, const SceneContextPo for (auto id : items) { auto& item = scene->getItem(id); if (item.getKey().isVisible() && (item.getLayer() > 0)) { - inItems.emplace_back(id); + auto item = scene->getItem(id); + AABox bound; + { + PerformanceTimer perfTimer("getBound"); + bound = item.getBound(); + } + inItems.emplace_back(ItemIDAndBounds(id, bound)); } } if (inItems.empty()) { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 37fff55245..d81dee2b37 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -20,22 +20,35 @@ namespace render { -template void jobRun(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { } -template void jobRunI(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input) { } -template void jobRunO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, O& output) { +template void jobRun(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + jobModel.run(sceneContext, renderContext); +} +template void jobRunI(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input) { + jobModel.run(sceneContext, renderContext, input); +} +template void jobRunO(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, O& output) { jobModel.run(sceneContext, renderContext, output); } -template void jobRunIO(const T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) { } +template void jobRunIO(T& jobModel, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const I& input, O& output) { + jobModel.run(sceneContext, renderContext, input, output); +} class Job { public: + // Varying represent a varying piece of data class Varying { public: + Varying(const Varying& var): _concept(var._concept) {} + Varying() {} template - Varying(T data) : _concept(new Model(data)) {} + Varying(const T& data) : _concept(new Job::Varying::Model(data)) {} + + // Access the _data contained win the concept explicitely + template T& edit() { return (static_cast*> (_concept.get())->_data); } + template const T& get() const { return (static_cast*> (_concept.get())->_data); } protected: friend class Job; @@ -54,64 +67,66 @@ public: public: typedef T Data; Data _data; - Model(Data data): _data(data) {} + Model(const Model& source): _data(source.data) {} + Model(const Data& data): _data(data) {} + virtual ~Model() {} }; + + std::shared_ptr _concept; }; - typedef std::shared_ptr VaryingPointer; - - template - Job(T data) : _concept(new Model(data)) {} - - - template - static Job* createO(T data) { return new Job(new ModelO(data)); } Job(const Job& other) : _concept(other._concept) {} ~Job(); - const VaryingPointer& getInput() const { return _concept->getInput(); } - const VaryingPointer& getOutput() const { return _concept->getOutput(); } + const Varying getInput() const { return _concept->getInput(); } + const Varying getOutput() const { return _concept->getOutput(); } - virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { if (_concept) { _concept->run(sceneContext, renderContext); } } protected: +public: class Concept { public: virtual ~Concept() = default; - virtual const VaryingPointer& getInput() const { return VaryingPointer(); } - virtual const VaryingPointer& getOutput() const { return VaryingPointer(); } + virtual const Varying getInput() const { return Varying(); } + virtual const Varying getOutput() const { return Varying(); } virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; }; Job(Concept* concept) : _concept(concept) {} +public: template class Model : public Concept { public: typedef T Data; Data _data; + Model() {} Model(Data data): _data(data) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRun(_data, sceneContext, renderContext); } }; -public: + template class ModelI : public Concept { public: typedef T Data; typedef I Input; Data _data; - VaryingPointer _intput; + Varying _input; + const Varying getInput() const { return _input; } + + ModelI(const Varying& input): _input(input) {} ModelI(Data data): _data(data) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input); } + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input.get()); } }; template class ModelO : public Concept { @@ -120,11 +135,19 @@ public: typedef O Output; Data _data; - VaryingPointer _output; + Varying _output; - ModelO(Data data): _data(data), _output(new Varying::Model(Output())) {} + const Varying getOutput() const { return _output; } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunO(_data, sceneContext, renderContext, _output); } + ModelO() : _output(Output()) { + + } + + ModelO(Data data): _data(data), _output(Output()) {} + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + jobRunO(_data, sceneContext, renderContext, _output.edit()); + } }; template class ModelIO : public Concept { @@ -134,14 +157,18 @@ public: typedef O Output; Data _data; - VaryingPointer _intput; - VaryingPointer _output; + Varying _input; + Varying _output; - ModelIO(Data data, Output output): _data(data), _output(new Varying::Model(output)) {} + const Varying getInput() const { return _input; } + const Varying getOutput() const { return _output; } - void setInput(const VaryingPointer& input) { _input = input; } + ModelIO(const Varying& input): _input(input), _output(Output()) {} + ModelIO(Data data, Output output): _data(data), _output(output) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunIO(_data, sceneContext, renderContext, _input, _output); } + void setInput(const Varying& input) { _input = input; } + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunIO(_data, sceneContext, renderContext, _input.get(), _output.edit()); } }; std::shared_ptr _concept; @@ -156,56 +183,74 @@ void cullItems(const SceneContextPointer& sceneContext, const RenderContextPoint void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems = -1); -class CulledItems { + +class FetchItems { public: - ItemIDsBounds _items; + ItemFilter _filter = ItemFilter::Builder::opaqueShape().withoutLayered(); + + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems); + + typedef Job::ModelO JobModel; }; -class FetchCullItems { +class CullItems { public: - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, CulledItems& outItems); + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); - typedef Job::ModelO JobModel; + typedef Job::ModelIO JobModel; }; +class DepthSortItems { +public: + bool _frontToBack = true; + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); + + typedef Job::ModelIO JobModel; +}; -void materialSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); class DrawOpaque { public: }; -template <> void jobRun(const DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); +template <> void jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawTransparent { public: }; -template <> void jobRun(const DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); +template <> void jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawLight { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const DrawLight& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawBackground { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const DrawBackground& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); class DrawPostLayered { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const DrawPostLayered& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - - class ResetGLState { public: + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + + typedef Job::Model JobModel; }; -template <> void jobRun(const ResetGLState& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); + class DrawSceneTask : public Task { @@ -233,6 +278,7 @@ public: // standard builders allocating the main buckets void allocateStandardMaterialBuckets(); }; +void materialSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems); } From b1ff877af1a5d1d96a09fcb00b4668efce8068ed Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 16 Jun 2015 15:56:38 +0200 Subject: [PATCH 04/19] trying to improve something ? --- libraries/render/src/render/DrawTask.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 743d19765a..d8b154d1f0 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -105,7 +105,7 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("FetchCullItems::run"); + PerformanceTimer perfTimer("FetchItems::run"); auto& scene = sceneContext->_scene; auto& items = scene->getMasterBucket().at(_filter); @@ -114,13 +114,13 @@ void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContex outItems.clear(); outItems.reserve(items.size()); for (auto id : items) { - auto item = scene->getItem(id); - AABox bound; + auto& item = scene->getItem(id); + /* AABox bound; { - PerformanceTimer perfTimer("getBound"); + // PerformanceTimer perfTimer("getBound"); bound = item.getBound(); - } - outItems.emplace_back(ItemIDAndBounds(id, bound)); + }*/ + outItems.emplace_back(ItemIDAndBounds(id, item.getBound())); } } From d1ac3148f025c4fc0f05552f05b13334977d0761 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 16 Jun 2015 17:33:53 +0200 Subject: [PATCH 05/19] migrating the transparent pipeline --- libraries/render-utils/src/Model.cpp | 1 + .../render-utils/src/RenderDeferredTask.cpp | 51 +++++++++++++++++-- .../render-utils/src/RenderDeferredTask.h | 12 +---- libraries/render/src/render/DrawTask.h | 4 ++ 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 71178070c6..c2b5540aee 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1795,6 +1795,7 @@ AABox Model::getPartBounds(int meshIndex, int partIndex) { } void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool translucent) { + PerformanceTimer perfTimer("Model::renderPart"); if (!_readyWhenAdded) { return; // bail asap diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 978a3dede2..9266018796 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -57,7 +57,7 @@ RenderDeferredTask::RenderDeferredTask() : Task() { RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new PrepareDeferred::JobModel())); _jobs.push_back(Job(new DrawBackground::JobModel())); - _jobs.push_back(Job(new FetchItems::JobModel())); + _jobs.push_back(Job(new FetchItems::JobModel(FetchItems()))); _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput()))); @@ -65,7 +65,10 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new ResetGLState::JobModel())); _jobs.push_back(Job(new RenderDeferred::JobModel())); _jobs.push_back(Job(new ResolveDeferred::JobModel())); - _jobs.push_back(Job(new DrawTransparentDeferred::JobModel())); + _jobs.push_back(Job(new FetchItems::JobModel(FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); + _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel(_jobs.back().getOutput()))); _jobs.push_back(Job(new DrawPostLayered::JobModel())); _jobs.push_back(Job(new ResetGLState::JobModel())); } @@ -209,7 +212,7 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend args->_context->render((*args->_batch)); args->_batch = nullptr; } - +/* void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("DrawTransparentDeferred"); assert(renderContext->args); @@ -288,4 +291,44 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const // reset blend function to standard... glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); } -} +}*/ + +void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { + PerformanceTimer perfTimer("DrawTransparentDeferred"); + assert(renderContext->args); + assert(renderContext->args->_viewFrustum); + auto& renderDetails = renderContext->args->_details; + + RenderArgs* args = renderContext->args; + gpu::Batch batch; + args->_batch = &batch; + + glm::mat4 projMat; + Transform viewMat; + args->_viewFrustum->evalProjectionMatrix(projMat); + args->_viewFrustum->evalViewTransform(viewMat); + if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { + viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); + } + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); + + const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; + + { + GLenum buffers[3]; + int bufferCount = 0; + buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; + batch._glDrawBuffers(bufferCount, buffers); + args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; + } + + + renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems); + + args->_context->render((*args->_batch)); + args->_batch = nullptr; + + // reset blend function to standard... + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); +} \ No newline at end of file diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index b587c7526b..3c1de8e6d6 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -43,19 +43,11 @@ public: typedef render::Job::ModelI JobModel; }; -/*class DrawOpaqueDeferred { -public: - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); - - typedef render::Job::Model JobModel; -}; -*/ - class DrawTransparentDeferred { public: - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const render::ItemIDsBounds& inItems); - typedef render::Job::Model JobModel; + typedef render::Job::ModelI JobModel; }; class RenderDeferredTask : public render::Task { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index d81dee2b37..cb4b4ae26e 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -186,6 +186,10 @@ void renderItems(const SceneContextPointer& sceneContext, const RenderContextPoi class FetchItems { public: + + FetchItems() {} + FetchItems(const ItemFilter& filter): _filter(filter) {} + ItemFilter _filter = ItemFilter::Builder::opaqueShape().withoutLayered(); void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems); From 17322645f2bd1e5990d8699fb7bafd54c6248c38 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Wed, 17 Jun 2015 11:17:38 -0700 Subject: [PATCH 06/19] added mouselook script, reticle and icons need changes --- examples/mouseLook.js | 235 ++++++++++++++++++ interface/src/devices/KeyboardMouseDevice.cpp | 2 - .../ControllerScriptingInterface.cpp | 8 + .../scripting/ControllerScriptingInterface.h | 2 + interface/src/ui/UserInputMapper.cpp | 16 ++ interface/src/ui/UserInputMapper.h | 2 + 6 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 examples/mouseLook.js diff --git a/examples/mouseLook.js b/examples/mouseLook.js new file mode 100644 index 0000000000..06b1565926 --- /dev/null +++ b/examples/mouseLook.js @@ -0,0 +1,235 @@ +// +// mouseLook.js +// examples +// +// Created by Sam Gondelman on 6/16/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 +// + +HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; + +var lastX = Window.getCursorPositionX(); +var lastY = Window.getCursorPositionY(); +var yawFromMouse = 0; +var pitchFromMouse = 0; + +var yawSpeed = 0; +var pitchSpeed = 0; + +var DEFAULT_PARAMETERS = { + MOUSE_YAW_SCALE: -0.125, + MOUSE_PITCH_SCALE: -0.125, + MOUSE_SENSITIVITY: 0.5, + + // Damping frequency, adjust to change mouse look behavior + W: 10, +} + +var movementParameters = DEFAULT_PARAMETERS; + +var mouseLook = (function () { + + var MOUSELOOK_BUTTON_URL = HIFI_PUBLIC_BUCKET + "images/tools/directory.svg", + CURSORMODE_BUTTON_URL = HIFI_PUBLIC_BUCKET + "images/tools/marketplace.svg", + BUTTON_WIDTH = 50, + BUTTON_HEIGHT = 50, + BUTTON_ALPHA = 0.9, + BUTTON_MARGIN = 8, + mouseLookButton, + EDIT_TOOLBAR_BUTTONS = 10, // Number of buttons in edit.js toolbar + viewport, + active = false, + keyboardID = 0; + + function updateButtonPosition() { + Overlays.editOverlay(mouseLookButton, { + x: viewport.x - BUTTON_WIDTH - BUTTON_MARGIN, + y: viewport.y - BUTTON_HEIGHT - BUTTON_MARGIN + }); + } + + function onKeyPressEvent(event) { + if (event.text == 'm' && event.isMeta) { + active = !active; + updateMapping(); + Overlays.editOverlay(mouseLookButton, { + imageURL: active ? MOUSELOOK_BUTTON_URL : CURSORMODE_BUTTON_URL + }); + } + } + + function updateMapping() { + if (keyboardID != 0) { + if (active) { + // Turn mouselook on + yawFromMouse = 0; + pitchFromMouse = 0; + yawSpeed = 0; + pitchSpeed = 0; + + // remove right click modifier from mouse pitch and yaw + var rightClick = Controller.getAvailableInputs(keyboardID)[46].input.channel; + var a = Controller.getAvailableInputs(keyboardID)[10].input.channel; + var d = Controller.getAvailableInputs(keyboardID)[13].input.channel; + var left = Controller.getAvailableInputs(keyboardID)[36].input.channel; + var right = Controller.getAvailableInputs(keyboardID)[38].input.channel; + var shift = Controller.getAvailableInputs(keyboardID)[41].input.channel; + + for (i = 6; i <= 9; i++) { + var inputChannels = Controller.getAllActions()[i].inputChannels; + for (j = 0; j < inputChannels.length; j++) { + var inputChannel = inputChannels[j]; + + // Get rid of right click modifier on pitch and yaw + // if (inputChannel.modifier.device == keyboardID && + // inputChannel.modifier.channel == rightClick) { + // Controller.removeInputChannel(inputChannel); + // inputChannel.modifier.device = 0; + // inputChannel.modifier.channel = 0; + // inputChannel.modifier.type = 0; + // inputChannel.modifier.id = 0; + // Controller.addInputChannel(inputChannel); + // } + + // make a, d, left, and right strafe + if ((inputChannel.input.channel == a || inputChannel.input.channel == left) && inputChannel.modifier.device == 0) { + Controller.removeInputChannel(inputChannel); + inputChannel.action = 2; + Controller.addInputChannel(inputChannel); + } else if ((inputChannel.input.channel == d || inputChannel.input.channel == right) && inputChannel.modifier.device == 0) { + Controller.removeInputChannel(inputChannel); + inputChannel.action = 3; + Controller.addInputChannel(inputChannel); + } + } + } + // make shift + a/d/left/right change yaw/pitch + for (i = 2; i <= 3; i++) { + var inputChannels = Controller.getAllActions()[i].inputChannels; + for (j = 0; j < inputChannels.length; j++) { + var inputChannel = inputChannels[j]; + if ((inputChannel.input.channel == a || inputChannel.input.channel == left) && inputChannel.modifier.channel == shift) { + Controller.removeInputChannel(inputChannel); + inputChannel.action = 6; + Controller.addInputChannel(inputChannel); + } else if ((inputChannel.input.channel == d || inputChannel.input.channel == right) && inputChannel.modifier.channel == shift) { + Controller.removeInputChannel(inputChannel); + inputChannel.action = 7; + Controller.addInputChannel(inputChannel); + } + } + } + } else { + Controller.resetDevice(keyboardID); + } + } + } + + function onScriptUpdate(dt) { + var oldViewport = viewport; + + viewport = Controller.getViewportDimensions(); + + if (viewport.x !== oldViewport.x || viewport.y !== oldViewport.y) { + updateButtonPosition(); + } + + if (active && Window.hasFocus()) { + var x = Window.getCursorPositionX(); + // I'm not sure why this + 0.5 is necessary? + var y = Window.getCursorPositionY() + 0.5; + + yawFromMouse += ((x - lastX) * movementParameters.MOUSE_YAW_SCALE * movementParameters.MOUSE_SENSITIVITY); + pitchFromMouse += ((y - lastY) * movementParameters.MOUSE_PITCH_SCALE * movementParameters.MOUSE_SENSITIVITY); + pitchFromMouse = Math.max(-180, Math.min(180, pitchFromMouse)); + + resetCursorPosition(); + + // Here we use a linear damping model - http://en.wikipedia.org/wiki/Damping#Linear_damping + // Because we are using a critically damped model (no oscillation), ΞΆ = 1 and + // so we derive the formula: acceleration = -(2 * w0 * v) - (w0^2 * x) + var W = movementParameters.W; + yawAccel = (W * W * yawFromMouse) - (2 * W * yawSpeed); + pitchAccel = (W * W * pitchFromMouse) - (2 * W * pitchSpeed); + + yawSpeed += yawAccel * dt; + var yawMove = yawSpeed * dt; + var newOrientation = Quat.multiply(MyAvatar.orientation, Quat.fromVec3Degrees( { x: 0, y: yawMove, z: 0 } )); + MyAvatar.orientation = newOrientation; + yawFromMouse -= yawMove; + + pitchSpeed += pitchAccel * dt; + var pitchMove = pitchSpeed * dt; + var newPitch = MyAvatar.headPitch + pitchMove; + MyAvatar.headPitch = newPitch; + pitchFromMouse -= pitchMove; + } + } + + function resetCursorPosition() { + var newX = Window.x + Window.innerWidth / 2; + var newY = Window.y + Window.innerHeight / 2; + Window.setCursorPosition(newX, newY); + lastX = newX; + lastY = newY; + } + + function setUp() { + viewport = Controller.getViewportDimensions(); + + mouseLookButton = Overlays.addOverlay("image", { + imageURL: CURSORMODE_BUTTON_URL, + width: BUTTON_WIDTH, + height: BUTTON_HEIGHT, + x: viewport.x - BUTTON_WIDTH - BUTTON_MARGIN, + y: viewport.y - BUTTON_MARGIN - BUTTON_HEIGHT, + alpha: BUTTON_ALPHA, + visible: true + }); + + updateButtonPosition(); + + keyboardID = Controller.findDevice("Keyboard"); + + Controller.keyPressEvent.connect(onKeyPressEvent); + + Menu.menuItemEvent.connect(handleMenuEvent); + + Script.update.connect(onScriptUpdate); + } + + function setupMenu() { + Menu.addMenuItem({ menuName: "View", menuItemName: "Mouselook Mode", shortcutKey: "META+M", + afterItem: "Mirror", isCheckable: true, isChecked: false }); + } + + setupMenu(); + + function cleanupMenu() { + Menu.removeMenuItem("View", "Mouselook Mode"); + } + + function handleMenuEvent(menuItem) { + if (menuItem == "Mouselook Mode") { + active = !active; + updateMapping(); + Overlays.editOverlay(mouseLookButton, { + imageURL: active ? MOUSELOOK_BUTTON_URL : CURSORMODE_BUTTON_URL + }); + } + } + + function tearDown() { + Overlays.deleteOverlay(mouseLookButton); + if (keyboardID != 0) { + Controller.resetDevice(keyboardID); + } + cleanupMenu(); + } + + setUp(); + Script.scriptEnding.connect(tearDown); +}()); \ No newline at end of file diff --git a/interface/src/devices/KeyboardMouseDevice.cpp b/interface/src/devices/KeyboardMouseDevice.cpp index fcb60cca26..9fadf7be82 100755 --- a/interface/src/devices/KeyboardMouseDevice.cpp +++ b/interface/src/devices/KeyboardMouseDevice.cpp @@ -242,8 +242,6 @@ void KeyboardMouseDevice::assignDefaultInputMapping(UserInputMapper& mapper) { mapper.addInputChannel(UserInputMapper::VERTICAL_DOWN, makeInput(Qt::Key_PageDown), BUTTON_MOVE_SPEED); mapper.addInputChannel(UserInputMapper::VERTICAL_UP, makeInput(Qt::Key_PageUp), BUTTON_MOVE_SPEED); - mapper.addInputChannel(UserInputMapper::BOOM_IN, makeInput(Qt::Key_Up), makeInput(Qt::Key_Shift), BUTTON_BOOM_SPEED); - mapper.addInputChannel(UserInputMapper::BOOM_OUT, makeInput(Qt::Key_Down), makeInput(Qt::Key_Shift), BUTTON_BOOM_SPEED); mapper.addInputChannel(UserInputMapper::LATERAL_LEFT, makeInput(Qt::Key_Left), makeInput(Qt::RightButton), BUTTON_YAW_SPEED); mapper.addInputChannel(UserInputMapper::LATERAL_RIGHT, makeInput(Qt::Key_Right), makeInput(Qt::RightButton), BUTTON_YAW_SPEED); mapper.addInputChannel(UserInputMapper::LATERAL_LEFT, makeInput(Qt::Key_Left), makeInput(Qt::Key_Shift), BUTTON_YAW_SPEED); diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 2c747195a7..5bee51c9b9 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -457,6 +457,14 @@ void ControllerScriptingInterface::resetAllDeviceBindings() { Application::getUserInputMapper()->resetAllDeviceBindings(); } +void ControllerScriptingInterface::resetDevice(unsigned int device) { + Application::getUserInputMapper()->resetDevice(device); +} + +int ControllerScriptingInterface::findDevice(QString name) { + Application::getUserInputMapper()->findDevice(name); +} + InputController::InputController(int deviceTrackerId, int subTrackerId, QObject* parent) : AbstractInputController(), _deviceTrackerId(deviceTrackerId), diff --git a/interface/src/scripting/ControllerScriptingInterface.h b/interface/src/scripting/ControllerScriptingInterface.h index 9414dc887b..3a54826195 100644 --- a/interface/src/scripting/ControllerScriptingInterface.h +++ b/interface/src/scripting/ControllerScriptingInterface.h @@ -91,6 +91,8 @@ public slots: Q_INVOKABLE virtual bool removeInputChannel(UserInputMapper::InputChannel inputChannel); Q_INVOKABLE virtual QVector getAvailableInputs(unsigned int device); Q_INVOKABLE virtual void resetAllDeviceBindings(); + Q_INVOKABLE virtual void resetDevice(unsigned int device); + Q_INVOKABLE virtual int findDevice(QString name); virtual bool isPrimaryButtonPressed() const; virtual glm::vec2 getPrimaryJoystickPosition() const; diff --git a/interface/src/ui/UserInputMapper.cpp b/interface/src/ui/UserInputMapper.cpp index 2c28b79c75..127aead761 100755 --- a/interface/src/ui/UserInputMapper.cpp +++ b/interface/src/ui/UserInputMapper.cpp @@ -41,6 +41,22 @@ void UserInputMapper::resetAllDeviceBindings() { } } +void UserInputMapper::resetDevice(uint16 deviceID) { + auto device = _registeredDevices.find(deviceID); + if (device != _registeredDevices.end()) { + device->second->resetDeviceBindings(); + } +} + +int UserInputMapper::findDevice(QString name) { + for (auto device : _registeredDevices) { + if (device.second->_name == name) { + return device.first; + } + } + return 0; +} + bool UserInputMapper::addInputChannel(Action action, const Input& input, float scale) { return addInputChannel(action, input, Input(), scale); } diff --git a/interface/src/ui/UserInputMapper.h b/interface/src/ui/UserInputMapper.h index 84ca192e3e..91aa724ea6 100755 --- a/interface/src/ui/UserInputMapper.h +++ b/interface/src/ui/UserInputMapper.h @@ -116,6 +116,8 @@ public: QString getDeviceName(uint16 deviceID) { return _registeredDevices[deviceID]->_name; } QVector getAvailableInputs(uint16 deviceID) { return _registeredDevices[deviceID]->getAvailabeInputs(); } void resetAllDeviceBindings(); + void resetDevice(uint16 deviceID); + int findDevice(QString name); // Actions are the output channels of the Mapper, that's what the InputChannel map to // For now the Actions are hardcoded, this is bad, but we will fix that in the near future From 3af0c138ddacf63d6f708094ea6b6e50576f637a Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Wed, 17 Jun 2015 11:39:11 -0700 Subject: [PATCH 07/19] removed button image, extraneous variables --- examples/mouseLook.js | 56 +------------------------------------------ 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/examples/mouseLook.js b/examples/mouseLook.js index 06b1565926..e955423986 100644 --- a/examples/mouseLook.js +++ b/examples/mouseLook.js @@ -32,32 +32,17 @@ var movementParameters = DEFAULT_PARAMETERS; var mouseLook = (function () { - var MOUSELOOK_BUTTON_URL = HIFI_PUBLIC_BUCKET + "images/tools/directory.svg", - CURSORMODE_BUTTON_URL = HIFI_PUBLIC_BUCKET + "images/tools/marketplace.svg", - BUTTON_WIDTH = 50, + var BUTTON_WIDTH = 50, BUTTON_HEIGHT = 50, BUTTON_ALPHA = 0.9, BUTTON_MARGIN = 8, - mouseLookButton, - EDIT_TOOLBAR_BUTTONS = 10, // Number of buttons in edit.js toolbar - viewport, active = false, keyboardID = 0; - function updateButtonPosition() { - Overlays.editOverlay(mouseLookButton, { - x: viewport.x - BUTTON_WIDTH - BUTTON_MARGIN, - y: viewport.y - BUTTON_HEIGHT - BUTTON_MARGIN - }); - } - function onKeyPressEvent(event) { if (event.text == 'm' && event.isMeta) { active = !active; updateMapping(); - Overlays.editOverlay(mouseLookButton, { - imageURL: active ? MOUSELOOK_BUTTON_URL : CURSORMODE_BUTTON_URL - }); } } @@ -70,8 +55,6 @@ var mouseLook = (function () { yawSpeed = 0; pitchSpeed = 0; - // remove right click modifier from mouse pitch and yaw - var rightClick = Controller.getAvailableInputs(keyboardID)[46].input.channel; var a = Controller.getAvailableInputs(keyboardID)[10].input.channel; var d = Controller.getAvailableInputs(keyboardID)[13].input.channel; var left = Controller.getAvailableInputs(keyboardID)[36].input.channel; @@ -83,17 +66,6 @@ var mouseLook = (function () { for (j = 0; j < inputChannels.length; j++) { var inputChannel = inputChannels[j]; - // Get rid of right click modifier on pitch and yaw - // if (inputChannel.modifier.device == keyboardID && - // inputChannel.modifier.channel == rightClick) { - // Controller.removeInputChannel(inputChannel); - // inputChannel.modifier.device = 0; - // inputChannel.modifier.channel = 0; - // inputChannel.modifier.type = 0; - // inputChannel.modifier.id = 0; - // Controller.addInputChannel(inputChannel); - // } - // make a, d, left, and right strafe if ((inputChannel.input.channel == a || inputChannel.input.channel == left) && inputChannel.modifier.device == 0) { Controller.removeInputChannel(inputChannel); @@ -129,14 +101,6 @@ var mouseLook = (function () { } function onScriptUpdate(dt) { - var oldViewport = viewport; - - viewport = Controller.getViewportDimensions(); - - if (viewport.x !== oldViewport.x || viewport.y !== oldViewport.y) { - updateButtonPosition(); - } - if (active && Window.hasFocus()) { var x = Window.getCursorPositionX(); // I'm not sure why this + 0.5 is necessary? @@ -178,20 +142,6 @@ var mouseLook = (function () { } function setUp() { - viewport = Controller.getViewportDimensions(); - - mouseLookButton = Overlays.addOverlay("image", { - imageURL: CURSORMODE_BUTTON_URL, - width: BUTTON_WIDTH, - height: BUTTON_HEIGHT, - x: viewport.x - BUTTON_WIDTH - BUTTON_MARGIN, - y: viewport.y - BUTTON_MARGIN - BUTTON_HEIGHT, - alpha: BUTTON_ALPHA, - visible: true - }); - - updateButtonPosition(); - keyboardID = Controller.findDevice("Keyboard"); Controller.keyPressEvent.connect(onKeyPressEvent); @@ -216,14 +166,10 @@ var mouseLook = (function () { if (menuItem == "Mouselook Mode") { active = !active; updateMapping(); - Overlays.editOverlay(mouseLookButton, { - imageURL: active ? MOUSELOOK_BUTTON_URL : CURSORMODE_BUTTON_URL - }); } } function tearDown() { - Overlays.deleteOverlay(mouseLookButton); if (keyboardID != 0) { Controller.resetDevice(keyboardID); } From c0797313a16a5589e33a349e3b28e472fbee0a51 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Wed, 17 Jun 2015 12:08:23 -0700 Subject: [PATCH 08/19] added mouseLook.js to default scripts --- examples/defaultScripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/defaultScripts.js b/examples/defaultScripts.js index b5e3e3f551..545830fe3e 100644 --- a/examples/defaultScripts.js +++ b/examples/defaultScripts.js @@ -18,3 +18,4 @@ Script.load("users.js"); Script.load("grab.js"); Script.load("pointer.js"); Script.load("directory.js"); +Script.load("mouseLook.js"); From 015799712655804e54a4516fa7ff64c3a08b4278 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Wed, 17 Jun 2015 14:42:11 -0700 Subject: [PATCH 09/19] fix findDevice --- interface/src/scripting/ControllerScriptingInterface.cpp | 2 +- interface/src/ui/UserInputMapper.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 5bee51c9b9..851c523c5d 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -462,7 +462,7 @@ void ControllerScriptingInterface::resetDevice(unsigned int device) { } int ControllerScriptingInterface::findDevice(QString name) { - Application::getUserInputMapper()->findDevice(name); + return Application::getUserInputMapper()->findDevice(name); } InputController::InputController(int deviceTrackerId, int subTrackerId, QObject* parent) : diff --git a/interface/src/ui/UserInputMapper.cpp b/interface/src/ui/UserInputMapper.cpp index 127aead761..fd2f384fb6 100755 --- a/interface/src/ui/UserInputMapper.cpp +++ b/interface/src/ui/UserInputMapper.cpp @@ -50,7 +50,7 @@ void UserInputMapper::resetDevice(uint16 deviceID) { int UserInputMapper::findDevice(QString name) { for (auto device : _registeredDevices) { - if (device.second->_name == name) { + if (device.second->_name.split(" (")[0] == name) { return device.first; } } From 3baf6d80ae785851092559499cc339e85b8fad22 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Thu, 18 Jun 2015 10:10:54 -0700 Subject: [PATCH 10/19] removed magic numbers from mouseLook.js --- examples/mouseLook.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/examples/mouseLook.js b/examples/mouseLook.js index e955423986..49cd7dbe59 100644 --- a/examples/mouseLook.js +++ b/examples/mouseLook.js @@ -46,6 +46,18 @@ var mouseLook = (function () { } } + function findInput(name) { + var availableInputs = Controller.getAvailableInputs(keyboardID); + for (i = 0; i < availableInputs.length; i++) { + if (availableInputs[i].inputName == name) { + return availableInputs[i].input; + } + } + + // If the input isn't found, it will default to the first available input + return availableInputs[0].input; + } + function updateMapping() { if (keyboardID != 0) { if (active) { @@ -55,11 +67,11 @@ var mouseLook = (function () { yawSpeed = 0; pitchSpeed = 0; - var a = Controller.getAvailableInputs(keyboardID)[10].input.channel; - var d = Controller.getAvailableInputs(keyboardID)[13].input.channel; - var left = Controller.getAvailableInputs(keyboardID)[36].input.channel; - var right = Controller.getAvailableInputs(keyboardID)[38].input.channel; - var shift = Controller.getAvailableInputs(keyboardID)[41].input.channel; + var a = findInput("A").channel; + var d = findInput("D").channel; + var left = findInput("Left").channel; + var right = findInput("Right").channel; + var shift = findInput("Shift").channel; for (i = 6; i <= 9; i++) { var inputChannels = Controller.getAllActions()[i].inputChannels; From fb42613344b3ac9c21264d5faf4cc35e93bba6f0 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 18 Jun 2015 20:25:51 +0200 Subject: [PATCH 11/19] Fixing transparency that i just broke --- .../render-utils/src/RenderDeferredTask.cpp | 59 ++--- libraries/render/src/render/DrawTask.cpp | 239 +----------------- libraries/render/src/render/DrawTask.h | 45 +--- 3 files changed, 37 insertions(+), 306 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 79f369dd5e..0589512435 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -25,54 +25,34 @@ using namespace render; void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("PrepareDeferred"); DependencyManager::get()->prepare(renderContext->args); } void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("RenderDeferred"); DependencyManager::get()->render(renderContext->args); -// renderContext->args->_context->syncCache(); } void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { PerformanceTimer perfTimer("ResolveDeferred"); DependencyManager::get()->copyBack(renderContext->args); - renderContext->args->_context->syncCache(); - } - -/* RenderDeferredTask::RenderDeferredTask() : Task() { - _jobs.push_back(Job(PrepareDeferred())); - _jobs.push_back(Job(DrawBackground())); - _jobs.push_back(Job(DrawOpaqueDeferred())); - _jobs.push_back(Job(DrawLight())); - _jobs.push_back(Job(ResetGLState())); - _jobs.push_back(Job(RenderDeferred())); - _jobs.push_back(Job(ResolveDeferred())); - _jobs.push_back(Job(DrawTransparentDeferred())); - _jobs.push_back(Job(DrawOverlay3D())); - _jobs.push_back(Job(ResetGLState())); -} -*/ -RenderDeferredTask::RenderDeferredTask() : Task() { - _jobs.push_back(Job(new PrepareDeferred::JobModel())); - _jobs.push_back(Job(new DrawBackground::JobModel())); - _jobs.push_back(Job(new FetchItems::JobModel(FetchItems()))); - _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawLight::JobModel())); + _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); + _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchOpaque", FetchItems()))); + _jobs.push_back(Job(new CullItems::JobModel("CullOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); _jobs.push_back(Job(new ResetGLState::JobModel())); - _jobs.push_back(Job(new RenderDeferred::JobModel())); - _jobs.push_back(Job(new ResolveDeferred::JobModel())); - _jobs.push_back(Job(new FetchItems::JobModel(FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); - _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawTransparentDeferred::JobModel(_jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOverlay3D::JobModel())); + _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); + _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); + _jobs.push_back(Job(new CullItems::JobModel("CullTransparent", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); _jobs.push_back(Job(new ResetGLState::JobModel())); } @@ -100,7 +80,6 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend }; void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { - PerformanceTimer perfTimer("DrawOpaqueDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -108,6 +87,8 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend gpu::Batch batch; args->_batch = &batch; + renderContext->_numDrawnOpaqueItems = inItems.size(); + glm::mat4 projMat; Transform viewMat; args->_viewFrustum->evalProjectionMatrix(projMat); @@ -129,13 +110,14 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); + // Before rendering the batch make sure we re in sync with gl state + args->_context->syncCache(); renderContext->args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; } void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) { - PerformanceTimer perfTimer("DrawTransparentDeferred"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); auto& renderDetails = renderContext->args->_details; @@ -144,6 +126,8 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const gpu::Batch batch; args->_batch = &batch; + renderContext->_numDrawnTransparentItems = inItems.size(); + glm::mat4 projMat; Transform viewMat; args->_viewFrustum->evalProjectionMatrix(projMat); @@ -166,6 +150,8 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems); + // Before rendering the batch make sure we re in sync with gl state + args->_context->syncCache(); args->_context->render((*args->_batch)); args->_batch = nullptr; @@ -189,7 +175,6 @@ const gpu::PipelinePointer& DrawOverlay3D::getOpaquePipeline() const { } void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawOverlay3D"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 28f4fea110..69dd7fc387 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -25,11 +25,6 @@ using namespace render; DrawSceneTask::DrawSceneTask() : Task() { - - _jobs.push_back(Job(new Job::Model())); - _jobs.push_back(Job(new Job::Model())); - _jobs.push_back(Job(new Job::Model())); - _jobs.push_back(Job(new Job::Model())); } DrawSceneTask::~DrawSceneTask() { @@ -61,7 +56,6 @@ Job::~Job() { void render::cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("cullItems"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -105,8 +99,6 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("FetchItems::run"); - auto& scene = sceneContext->_scene; auto& items = scene->getMasterBucket().at(_filter); auto& renderDetails = renderContext->args->_details; @@ -125,7 +117,6 @@ void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContex } void CullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("CullItems::run"); outItems.clear(); outItems.reserve(inItems.size()); @@ -156,7 +147,6 @@ struct BackToFrontSort { }; void render::depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { - PerformanceTimer perfTimer("depthSortItems"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -204,7 +194,6 @@ void DepthSortItems::run(const SceneContextPointer& sceneContext, const RenderCo } void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, int maxDrawnItems) { - PerformanceTimer perfTimer("renderItems"); auto& scene = sceneContext->_scene; RenderArgs* args = renderContext->args; // render @@ -271,172 +260,7 @@ void ResetGLState::run(const SceneContextPointer& sceneContext, const RenderCont renderContext->args->_context->render(theBatch); } -template <> void render::jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawOpaque"); - assert(renderContext->args); - assert(renderContext->args->_viewFrustum); - - // render opaques - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); - auto& renderDetails = renderContext->args->_details; - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); - } - ItemIDsBounds& renderedItems = inItems; - - renderContext->_numFeedOpaqueItems = renderedItems.size(); - - ItemIDsBounds culledItems; - culledItems.reserve(inItems.size()); - if (renderContext->_cullOpaque) { - renderDetails.pointTo(RenderDetails::OPAQUE_ITEM); - cullItems(sceneContext, renderContext, renderedItems, culledItems); - renderDetails.pointTo(RenderDetails::OTHER_ITEM); - renderedItems = culledItems; - } - - renderContext->_numDrawnOpaqueItems = renderedItems.size(); - - ItemIDsBounds sortedItems; - sortedItems.reserve(culledItems.size()); - if (renderContext->_sortOpaque) { - depthSortItems(sceneContext, renderContext, true, renderedItems, sortedItems); // Sort Front to back opaque items! - renderedItems = sortedItems; - } - - if (renderContext->_renderOpaque) { - RenderArgs* args = renderContext->args; - gpu::Batch batch; - args->_batch = &batch; - - glm::mat4 projMat; - Transform viewMat; - args->_viewFrustum->evalProjectionMatrix(projMat); - args->_viewFrustum->evalViewTransform(viewMat); - if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { - viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); - } - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - - { - GLenum buffers[3]; - int bufferCount = 0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; - batch._glDrawBuffers(bufferCount, buffers); - } - - renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems); - - args->_context->render((*args->_batch)); - args->_batch = nullptr; - } -} - - -template <> void render::jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawTransparent"); - assert(renderContext->args); - assert(renderContext->args->_viewFrustum); - - // render transparents - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape()); - auto& renderDetails = renderContext->args->_details; - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); - } - ItemIDsBounds& renderedItems = inItems; - - renderContext->_numFeedTransparentItems = renderedItems.size(); - - ItemIDsBounds culledItems; - culledItems.reserve(inItems.size()); - if (renderContext->_cullTransparent) { - renderDetails.pointTo(RenderDetails::TRANSLUCENT_ITEM); - cullItems(sceneContext, renderContext, inItems, culledItems); - renderDetails.pointTo(RenderDetails::OTHER_ITEM); - renderedItems = culledItems; - } - - renderContext->_numDrawnTransparentItems = renderedItems.size(); - - ItemIDsBounds sortedItems; - sortedItems.reserve(culledItems.size()); - if (renderContext->_sortTransparent) { - depthSortItems(sceneContext, renderContext, false, renderedItems, sortedItems); // Sort Back to front transparent items! - renderedItems = sortedItems; - } - - if (renderContext->_renderTransparent) { - RenderArgs* args = renderContext->args; - gpu::Batch batch; - args->_batch = &batch; - - glm::mat4 projMat; - Transform viewMat; - args->_viewFrustum->evalProjectionMatrix(projMat); - args->_viewFrustum->evalViewTransform(viewMat); - if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { - viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); - } - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - - const float MOSTLY_OPAQUE_THRESHOLD = 0.75f; - const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; - - // render translucent meshes afterwards - { - GLenum buffers[2]; - int bufferCount = 0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; - batch._glDrawBuffers(bufferCount, buffers); - args->_alphaThreshold = MOSTLY_OPAQUE_THRESHOLD; - } - - renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); - - { - GLenum buffers[3]; - int bufferCount = 0; - buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; - batch._glDrawBuffers(bufferCount, buffers); - args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; - } - - - renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); - - args->_context->render((*args->_batch)); - args->_batch = nullptr; - } -} - void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawLight"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -449,12 +273,7 @@ void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContext inItems.reserve(items.size()); for (auto id : items) { auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); + inItems.emplace_back(ItemIDAndBounds(id, item.getBound())); } ItemIDsBounds culledItems; @@ -470,7 +289,6 @@ void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContext } void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawBackground"); assert(renderContext->args); assert(renderContext->args->_viewFrustum); @@ -506,61 +324,6 @@ void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderCo args->_context->syncCache(); } -void DrawPostLayered::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - PerformanceTimer perfTimer("DrawPostLayered"); - assert(renderContext->args); - assert(renderContext->args->_viewFrustum); - - // render backgrounds - auto& scene = sceneContext->_scene; - auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape().withLayered()); - - - ItemIDsBounds inItems; - inItems.reserve(items.size()); - for (auto id : items) { - auto& item = scene->getItem(id); - if (item.getKey().isVisible() && (item.getLayer() > 0)) { - auto item = scene->getItem(id); - AABox bound; - { - PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - } - inItems.emplace_back(ItemIDAndBounds(id, bound)); - } - } - if (inItems.empty()) { - return; - } - - RenderArgs* args = renderContext->args; - gpu::Batch batch; - args->_batch = &batch; - - glm::mat4 projMat; - Transform viewMat; - args->_viewFrustum->evalProjectionMatrix(projMat); - args->_viewFrustum->evalViewTransform(viewMat); - if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { - viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f)); - } - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - - batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0); - - renderItems(sceneContext, renderContext, inItems); - - // Force the context sync - args->_context->syncCache(); - - args->_context->render((*args->_batch)); - args->_batch = nullptr; - -} - - void ItemMaterialBucketMap::insert(const ItemID& id, const model::MaterialKey& key) { // Insert the itemID in every bucket where it filters true for (auto& bucket : (*this)) { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 67a41f1abf..2455c75091 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -13,6 +13,9 @@ #define hifi_render_Task_h #include "Engine.h" +#include "gpu/Batch.h" +#include + namespace render { @@ -79,9 +82,9 @@ public: const Varying getOutput() const { return _concept->getOutput(); } void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - if (_concept) { - _concept->run(sceneContext, renderContext); - } + PerformanceTimer perfTimer(getName().c_str()); + PROFILE_RANGE(getName().c_str()); + _concept->run(sceneContext, renderContext); } protected: @@ -129,9 +132,8 @@ public: const Varying getInput() const { return _input; } - ModelI(const Varying& input): _input(input) {} - ModelI(const Varying& input, const std::string& name): Concept(name), _input(input) {} - ModelI(Data data): _data(data) {} + ModelI(const std::string& name, const Varying& input): Concept(name), _input(input) {} + ModelI(const std::string& name, Data data): Concept(name), _data(data) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input.get()); } }; @@ -146,11 +148,11 @@ public: const Varying getOutput() const { return _output; } - ModelO() : _output(Output()) { + ModelO(const std::string& name): Concept(name), _output(Output()) { } - ModelO(Data data): _data(data), _output(Output()) {} + ModelO(const std::string& name, Data data): Concept(name), _data(data), _output(Output()) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunO(_data, sceneContext, renderContext, _output.edit()); @@ -170,8 +172,8 @@ public: const Varying getInput() const { return _input; } const Varying getOutput() const { return _output; } - ModelIO(const Varying& input): _input(input), _output(Output()) {} - ModelIO(Data data, Output output): _data(data), _output(output) {} + ModelIO(const std::string& name, const Varying& input, Data data = Data()): Concept(name), _data(data), _input(input), _output(Output()) {} + ModelIO(const std::string& name, Data data, Output output): Concept(name), _data(data), _output(output) {} void setInput(const Varying& input) { _input = input; } @@ -215,24 +217,13 @@ class DepthSortItems { public: bool _frontToBack = true; + DepthSortItems(bool frontToBack = true) : _frontToBack(frontToBack) {} + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outITems); typedef Job::ModelIO JobModel; }; - - -class DrawOpaque { -public: -}; -template <> void jobRun(DrawOpaque& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - - -class DrawTransparent { -public: -}; -template <> void jobRun(DrawTransparent& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - class DrawLight { public: void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); @@ -247,14 +238,6 @@ public: typedef Job::Model JobModel; }; - -class DrawPostLayered { -public: - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); - - typedef Job::Model JobModel; -}; - class ResetGLState { public: void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext); From fb7ddde0caef1fa1ef0b83ca88f8c621a50441c3 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Thu, 18 Jun 2015 15:29:20 -0700 Subject: [PATCH 12/19] removed magic numbers --- examples/mouseLook.js | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/examples/mouseLook.js b/examples/mouseLook.js index 49cd7dbe59..bf48a51c79 100644 --- a/examples/mouseLook.js +++ b/examples/mouseLook.js @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; - var lastX = Window.getCursorPositionX(); var lastY = Window.getCursorPositionY(); var yawFromMouse = 0; @@ -53,11 +51,21 @@ var mouseLook = (function () { return availableInputs[i].input; } } - // If the input isn't found, it will default to the first available input return availableInputs[0].input; } + function findAction(name) { + var actions = Controller.getAllActions(); + for (var i = 0; i < actions.length; i++) { + if (actions[i].actionName == name) { + return i; + } + } + // If the action isn't found, it will default to the first available action + return 0; + } + function updateMapping() { if (keyboardID != 0) { if (active) { @@ -73,35 +81,34 @@ var mouseLook = (function () { var right = findInput("Right").channel; var shift = findInput("Shift").channel; - for (i = 6; i <= 9; i++) { + for (var i = findAction("YAW_LEFT"); i <= findAction("YAW_RIGHT"); i++) { var inputChannels = Controller.getAllActions()[i].inputChannels; - for (j = 0; j < inputChannels.length; j++) { + for (var j = 0; j < inputChannels.length; j++) { var inputChannel = inputChannels[j]; - // make a, d, left, and right strafe if ((inputChannel.input.channel == a || inputChannel.input.channel == left) && inputChannel.modifier.device == 0) { Controller.removeInputChannel(inputChannel); - inputChannel.action = 2; + inputChannel.action = findAction("LATERAL_LEFT"); Controller.addInputChannel(inputChannel); } else if ((inputChannel.input.channel == d || inputChannel.input.channel == right) && inputChannel.modifier.device == 0) { Controller.removeInputChannel(inputChannel); - inputChannel.action = 3; + inputChannel.action = findAction("LATERAL_RIGHT"); Controller.addInputChannel(inputChannel); } } } - // make shift + a/d/left/right change yaw/pitch - for (i = 2; i <= 3; i++) { + for (var i = findAction("LATERAL_LEFT"); i <= findAction("LATERAL_RIGHT"); i++) { var inputChannels = Controller.getAllActions()[i].inputChannels; - for (j = 0; j < inputChannels.length; j++) { + for (var j = 0; j < inputChannels.length; j++) { var inputChannel = inputChannels[j]; + // make shift + a/d/left/right change yaw/pitch if ((inputChannel.input.channel == a || inputChannel.input.channel == left) && inputChannel.modifier.channel == shift) { Controller.removeInputChannel(inputChannel); - inputChannel.action = 6; + inputChannel.action = findAction("YAW_LEFT"); Controller.addInputChannel(inputChannel); } else if ((inputChannel.input.channel == d || inputChannel.input.channel == right) && inputChannel.modifier.channel == shift) { Controller.removeInputChannel(inputChannel); - inputChannel.action = 7; + inputChannel.action = findAction("YAW_RIGHT"); Controller.addInputChannel(inputChannel); } } @@ -146,8 +153,8 @@ var mouseLook = (function () { } function resetCursorPosition() { - var newX = Window.x + Window.innerWidth / 2; - var newY = Window.y + Window.innerHeight / 2; + var newX = Window.x + Window.innerWidth / 2.0; + var newY = Window.y + Window.innerHeight / 2.0; Window.setCursorPosition(newX, newY); lastX = newX; lastY = newY; From 31633eca1015b6e3ce87cb6bc6742ea43053f1d8 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 10:41:40 +0200 Subject: [PATCH 13/19] IMproving the probe system and cleaning the engine script --- examples/utilities/tools/renderEngineDebug.js | 58 +++++++------------ interface/src/Application.cpp | 5 +- .../render-utils/src/RenderDeferredTask.cpp | 51 ++++++++++------ libraries/render/src/render/DrawTask.cpp | 9 ++- libraries/render/src/render/DrawTask.h | 7 ++- libraries/render/src/render/Engine.h | 4 ++ .../src/SceneScriptingInterface.cpp | 2 + .../src/SceneScriptingInterface.h | 10 +++- 8 files changed, 81 insertions(+), 65 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 79b0010210..6a2eb1cf37 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -10,25 +10,7 @@ Script.include("cookies.js"); -var panel = new Panel(10, 400); - -panel.newCheckbox("Enable Cull Opaque", - function(value) { Scene.setEngineCullOpaque((value != 0)); }, - function() { return Scene.doEngineCullOpaque(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Sort Opaque", - function(value) { Scene.setEngineSortOpaque((value != 0)); }, - function() { return Scene.doEngineSortOpaque(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Render Opaque", - function(value) { Scene.setEngineRenderOpaque((value != 0)); }, - function() { return Scene.doEngineRenderOpaque(); }, - function(value) { return (value); } -); +var panel = new Panel(10, 800); panel.newSlider("Num Feed Opaques", 0, 1000, function(value) { }, @@ -48,24 +30,6 @@ panel.newSlider("Max Drawn Opaques", -1, 1000, function(value) { return (value); } ); -panel.newCheckbox("Enable Cull Transparent", - function(value) { Scene.setEngineCullTransparent((value != 0)); }, - function() { return Scene.doEngineCullTransparent(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Sort Transparent", - function(value) { Scene.setEngineSortTransparent((value != 0)); }, - function() { return Scene.doEngineSortTransparent(); }, - function(value) { return (value); } -); - -panel.newCheckbox("Enable Render Transparent", - function(value) { Scene.setEngineRenderTransparent((value != 0)); }, - function() { return Scene.doEngineRenderTransparent(); }, - function(value) { return (value); } -); - panel.newSlider("Num Feed Transparents", 0, 100, function(value) { }, function() { return Scene.getEngineNumFeedTransparentItems(); }, @@ -84,6 +48,24 @@ panel.newSlider("Max Drawn Transparents", -1, 100, function(value) { return (value); } ); +panel.newSlider("Num Feed Overlay3Ds", 0, 100, + function(value) { }, + function() { return Scene.getEngineNumFeedOverlay3DItems(); }, + function(value) { return (value); } +); + +panel.newSlider("Num Drawn Overlay3Ds", 0, 100, + function(value) { }, + function() { return Scene.getEngineNumDrawnOverlay3DItems(); }, + function(value) { return (value); } +); + +panel.newSlider("Max Drawn Overlay3Ds", -1, 100, + function(value) { Scene.setEngineMaxDrawnOverlay3DItems(value); }, + function() { return Scene.getEngineMaxDrawnOverlay3DItems(); }, + function(value) { return (value); } +); + var tickTackPeriod = 500; function updateCounters() { @@ -91,6 +73,8 @@ function updateCounters() { panel.set("Num Drawn Opaques", panel.get("Num Drawn Opaques")); panel.set("Num Feed Transparents", panel.get("Num Feed Transparents")); panel.set("Num Drawn Transparents", panel.get("Num Drawn Transparents")); + panel.set("Num Feed Overlay3Ds", panel.get("Num Feed Overlay3Ds")); + panel.set("Num Drawn Overlay3Ds", panel.get("Num Drawn Overlay3Ds")); } Script.setInterval(updateCounters, tickTackPeriod); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index bd4c4b14ed..2086e651c4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3541,6 +3541,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderContext._maxDrawnOpaqueItems = sceneInterface->getEngineMaxDrawnOpaqueItems(); renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems(); + renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems(); renderArgs->_shouldRender = LODManager::shouldRender; @@ -3557,7 +3558,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se sceneInterface->setEngineFeedTransparentItems(engineRC->_numFeedTransparentItems); sceneInterface->setEngineDrawnTransparentItems(engineRC->_numDrawnTransparentItems); - + + sceneInterface->setEngineFeedOverlay3DItems(engineRC->_numFeedOverlay3DItems); + sceneInterface->setEngineDrawnOverlay3DItems(engineRC->_numDrawnOverlay3DItems); } //Render the sixense lasers if (Menu::getInstance()->isOptionChecked(MenuOption::SixenseLasers)) { diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 0589512435..e75813ad27 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -38,22 +38,35 @@ void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderC } RenderDeferredTask::RenderDeferredTask() : Task() { - _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); - _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); - _jobs.push_back(Job(new FetchItems::JobModel("FetchOpaque", FetchItems()))); - _jobs.push_back(Job(new CullItems::JobModel("CullOpaque", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortOpaque", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); - _jobs.push_back(Job(new ResetGLState::JobModel())); - _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); - _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); - _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", FetchItems(ItemFilter::Builder::transparentShape().withoutLayered())))); - _jobs.push_back(Job(new CullItems::JobModel("CullTransparent", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); - _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); - _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); - _jobs.push_back(Job(new ResetGLState::JobModel())); + _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); + _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchOpaque", + FetchItems( + [] (const RenderContextPointer& context, int count) { + context->_numFeedOpaqueItems = count; + } + ) + ))); + _jobs.push_back(Job(new CullItems::JobModel("CullOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortOpaque", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); + _jobs.push_back(Job(new ResetGLState::JobModel())); + _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); + _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); + _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", + FetchItems( + ItemFilter::Builder::transparentShape().withoutLayered(), + [] (const RenderContextPointer& context, int count) { + context->_numFeedTransparentItems = count; + } + ) + ))); + _jobs.push_back(Job(new CullItems::JobModel("CullTransparent", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); + _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); + _jobs.push_back(Job(new ResetGLState::JobModel())); } RenderDeferredTask::~RenderDeferredTask() { @@ -191,7 +204,9 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon inItems.emplace_back(id); } } - + renderContext->_numFeedOverlay3DItems = inItems.size(); + renderContext->_numDrawnOverlay3DItems = inItems.size(); + RenderArgs* args = renderContext->args; gpu::Batch batch; args->_batch = &batch; @@ -212,7 +227,7 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon if (!inItems.empty()) { batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0); - renderItems(sceneContext, renderContext, inItems); + renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOverlay3DItems); } // Before rendering the batch make sure we re in sync with gl state diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 69dd7fc387..203b192230 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -107,13 +107,12 @@ void FetchItems::run(const SceneContextPointer& sceneContext, const RenderContex outItems.reserve(items.size()); for (auto id : items) { auto& item = scene->getItem(id); - /* AABox bound; - { - // PerformanceTimer perfTimer("getBound"); - bound = item.getBound(); - }*/ outItems.emplace_back(ItemIDAndBounds(id, item.getBound())); } + + if (_probeNumItems) { + _probeNumItems(renderContext, outItems.size()); + } } void CullItems::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems, ItemIDsBounds& outItems) { diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 2455c75091..8a4d424005 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -195,11 +195,12 @@ void renderItems(const SceneContextPointer& sceneContext, const RenderContextPoi class FetchItems { public: - - FetchItems() {} - FetchItems(const ItemFilter& filter): _filter(filter) {} + typedef std::function ProbeNumItems; + FetchItems(const ProbeNumItems& probe): _probeNumItems(probe) {} + FetchItems(const ItemFilter& filter, const ProbeNumItems& probe): _filter(filter), _probeNumItems(probe) {} ItemFilter _filter = ItemFilter::Builder::opaqueShape().withoutLayered(); + ProbeNumItems _probeNumItems; void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems); diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index 121d6458e9..054f7e5ce4 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -45,6 +45,10 @@ public: int _numDrawnTransparentItems = 0; int _maxDrawnTransparentItems = -1; + int _numFeedOverlay3DItems = 0; + int _numDrawnOverlay3DItems = 0; + int _maxDrawnOverlay3DItems = -1; + RenderContext() {} }; typedef std::shared_ptr RenderContextPointer; diff --git a/libraries/script-engine/src/SceneScriptingInterface.cpp b/libraries/script-engine/src/SceneScriptingInterface.cpp index 679ec1180f..debba309c5 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.cpp +++ b/libraries/script-engine/src/SceneScriptingInterface.cpp @@ -159,4 +159,6 @@ void SceneScriptingInterface::clearEngineCounters() { _numDrawnOpaqueItems = 0; _numFeedTransparentItems = 0; _numDrawnTransparentItems = 0; + _numFeedOverlay3DItems = 0; + _numDrawnOverlay3DItems = 0; } diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h index 543f55a971..8359aa58fa 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.h +++ b/libraries/script-engine/src/SceneScriptingInterface.h @@ -90,17 +90,22 @@ public: Q_INVOKABLE int getEngineNumDrawnOpaqueItems() { return _numDrawnOpaqueItems; } void setEngineDrawnTransparentItems(int count) { _numDrawnTransparentItems = count; } Q_INVOKABLE int getEngineNumDrawnTransparentItems() { return _numDrawnTransparentItems; } + void setEngineDrawnOverlay3DItems(int count) { _numDrawnOverlay3DItems = count; } + Q_INVOKABLE int getEngineNumDrawnOverlay3DItems() { return _numDrawnOverlay3DItems; } void setEngineFeedOpaqueItems(int count) { _numFeedOpaqueItems = count; } Q_INVOKABLE int getEngineNumFeedOpaqueItems() { return _numFeedOpaqueItems; } void setEngineFeedTransparentItems(int count) { _numFeedTransparentItems = count; } Q_INVOKABLE int getEngineNumFeedTransparentItems() { return _numFeedTransparentItems; } + void setEngineFeedOverlay3DItems(int count) { _numFeedOverlay3DItems = count; } + Q_INVOKABLE int getEngineNumFeedOverlay3DItems() { return _numFeedOverlay3DItems; } Q_INVOKABLE void setEngineMaxDrawnOpaqueItems(int count) { _maxDrawnOpaqueItems = count; } Q_INVOKABLE int getEngineMaxDrawnOpaqueItems() { return _maxDrawnOpaqueItems; } Q_INVOKABLE void setEngineMaxDrawnTransparentItems(int count) { _maxDrawnTransparentItems = count; } Q_INVOKABLE int getEngineMaxDrawnTransparentItems() { return _maxDrawnTransparentItems; } - + Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; } + Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; } signals: void shouldRenderAvatarsChanged(bool shouldRenderAvatars); void shouldRenderEntitiesChanged(bool shouldRenderEntities); @@ -124,9 +129,12 @@ protected: int _numDrawnOpaqueItems = 0; int _numFeedTransparentItems = 0; int _numDrawnTransparentItems = 0; + int _numFeedOverlay3DItems = 0; + int _numDrawnOverlay3DItems = 0; int _maxDrawnOpaqueItems = -1; int _maxDrawnTransparentItems = -1; + int _maxDrawnOverlay3DItems = -1; }; From 9adfdb06fe95c0808ffb738f237eee2e03a2ea17 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 11:00:27 +0200 Subject: [PATCH 14/19] undo local modif to SKeletonModel.cpp --- interface/src/avatar/SkeletonModel.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 9497e2099d..8c52c79ca0 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -41,7 +41,6 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : _headClipDistance(DEFAULT_NEAR_CLIP) { assert(_owningAvatar); - _enableShapes = true; } SkeletonModel::~SkeletonModel() { @@ -255,13 +254,9 @@ void SkeletonModel::applyPalmData(int jointIndex, PalmData& palm) { } void SkeletonModel::updateJointState(int index) { - if (index > _jointStates.size()) { - return; // bail - } JointState& state = _jointStates[index]; const FBXJoint& joint = state.getFBXJoint(); - // if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { - if (joint.parentIndex > -1 && joint.parentIndex <= _jointStates.size()) { + if (joint.parentIndex != -1) { const JointState& parentState = _jointStates.at(joint.parentIndex); const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (index == geometry.leanJointIndex) { From 5a2d2485c0805fc28da390cbc08ccaff2ba4f1c1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 16:30:48 +0200 Subject: [PATCH 15/19] Fix the cookie cutter problem in stereo, the alphaThreshold wasn 't assigned correctly for opaque --- examples/utilities/tools/cookies.js | 25 +++++++++++++++ examples/utilities/tools/renderEngineDebug.js | 31 +++++++++++++++---- libraries/gpu/src/gpu/GLBackend.cpp | 8 +++++ libraries/gpu/src/gpu/GLBackendTexture.cpp | 4 +-- .../render-utils/src/RenderDeferredTask.cpp | 2 ++ libraries/render/src/render/DrawTask.cpp | 1 - 6 files changed, 62 insertions(+), 9 deletions(-) diff --git a/examples/utilities/tools/cookies.js b/examples/utilities/tools/cookies.js index 136b5b7f82..2ec34fcec8 100755 --- a/examples/utilities/tools/cookies.js +++ b/examples/utilities/tools/cookies.js @@ -120,6 +120,23 @@ Slider = function(x,y,width,thumbSize) { this.onValueChanged = function(value) {}; + this.setMaxValue = function(maxValue) { + if (this.maxValue == maxValue) { + return; + } + var currentVal = this.getValue(); + this.maxValue = maxValue; + this.setValue(currentVal); + } + this.setMinValue = function(minValue) { + if (this.minValue == minValue) { + return; + } + var currentVal = this.getValue(); + this.minValue = minValue; + this.setValue(currentVal); + } + this.destroy = function() { Overlays.deleteOverlay(this.background); Overlays.deleteOverlay(this.thumb); @@ -613,6 +630,14 @@ Panel = function(x, y) { return null; } + this.getWidget = function(name) { + var item = this.items[name]; + if (item != null) { + return item.widget; + } + return null; + } + this.update = function(name) { var item = this.items[name]; if (item != null) { diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 6a2eb1cf37..8185a24078 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -69,12 +69,31 @@ panel.newSlider("Max Drawn Overlay3Ds", -1, 100, var tickTackPeriod = 500; function updateCounters() { - panel.set("Num Feed Opaques", panel.get("Num Feed Opaques")); - panel.set("Num Drawn Opaques", panel.get("Num Drawn Opaques")); - panel.set("Num Feed Transparents", panel.get("Num Feed Transparents")); - panel.set("Num Drawn Transparents", panel.get("Num Drawn Transparents")); - panel.set("Num Feed Overlay3Ds", panel.get("Num Feed Overlay3Ds")); - panel.set("Num Drawn Overlay3Ds", panel.get("Num Drawn Overlay3Ds")); + var numFeedOpaques = panel.get("Num Feed Opaques"); + var numFeedTransparents = panel.get("Num Feed Transparents"); + var numFeedOverlay3Ds = panel.get("Num Feed Overlay3Ds"); + + panel.set("Num Feed Opaques", numFeedOpaques); + panel.set("Num Drawn Opaques", panel.get("Num Drawn Opaques")); + panel.set("Num Feed Transparents", numFeedTransparents); + panel.set("Num Drawn Transparents", panel.get("Num Drawn Transparents")); + panel.set("Num Feed Overlay3Ds", numFeedOverlay3Ds); + panel.set("Num Drawn Overlay3Ds", panel.get("Num Drawn Overlay3Ds")); + + var numMax = Math.max(numFeedOpaques * 1.2, 1); + panel.getWidget("Num Feed Opaques").setMaxValue(numMax); + panel.getWidget("Num Drawn Opaques").setMaxValue(numMax); + panel.getWidget("Max Drawn Opaques").setMaxValue(numMax); + + numMax = Math.max(numFeedTransparents * 1.2, 1); + panel.getWidget("Num Feed Transparents").setMaxValue(numMax); + panel.getWidget("Num Drawn Transparents").setMaxValue(numMax); + panel.getWidget("Max Drawn Transparents").setMaxValue(numMax); + + numMax = Math.max(numFeedOverlay3Ds * 1.2, 1); + panel.getWidget("Num Feed Overlay3Ds").setMaxValue(numMax); + panel.getWidget("Num Drawn Overlay3Ds").setMaxValue(numMax); + panel.getWidget("Max Drawn Overlay3Ds").setMaxValue(numMax); } Script.setInterval(updateCounters, tickTackPeriod); diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 154d6b9e3f..5ef101225c 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -450,6 +450,7 @@ void GLBackend::do_glUniform1i(Batch& batch, uint32 paramOffset) { // because these uniform setters are deprecated and we don;t want to create side effect return; } + updatePipeline(); glUniform1f( batch._params[paramOffset + 1]._int, batch._params[paramOffset + 0]._int); @@ -472,6 +473,8 @@ void GLBackend::do_glUniform1f(Batch& batch, uint32 paramOffset) { // because these uniform setters are deprecated and we don;t want to create side effect return; } + updatePipeline(); + glUniform1f( batch._params[paramOffset + 1]._int, batch._params[paramOffset + 0]._float); @@ -494,6 +497,7 @@ void GLBackend::do_glUniform2f(Batch& batch, uint32 paramOffset) { // because these uniform setters are deprecated and we don;t want to create side effect return; } + updatePipeline(); glUniform2f( batch._params[paramOffset + 2]._int, batch._params[paramOffset + 1]._float, @@ -518,6 +522,7 @@ void GLBackend::do_glUniform3f(Batch& batch, uint32 paramOffset) { // because these uniform setters are deprecated and we don;t want to create side effect return; } + updatePipeline(); glUniform3f( batch._params[paramOffset + 3]._int, batch._params[paramOffset + 2]._float, @@ -542,6 +547,7 @@ void GLBackend::do_glUniform3fv(Batch& batch, uint32 paramOffset) { // because these uniform setters are deprecated and we don;t want to create side effect return; } + updatePipeline(); glUniform3fv( batch._params[paramOffset + 2]._int, batch._params[paramOffset + 1]._uint, @@ -567,6 +573,7 @@ void GLBackend::do_glUniform4fv(Batch& batch, uint32 paramOffset) { // because these uniform setters are deprecated and we don;t want to create side effect return; } + updatePipeline(); glUniform4fv( batch._params[paramOffset + 2]._int, batch._params[paramOffset + 1]._uint, @@ -592,6 +599,7 @@ void GLBackend::do_glUniformMatrix4fv(Batch& batch, uint32 paramOffset) { // because these uniform setters are deprecated and we don;t want to create side effect return; } + updatePipeline(); glUniformMatrix4fv( batch._params[paramOffset + 3]._int, batch._params[paramOffset + 2]._uint, diff --git a/libraries/gpu/src/gpu/GLBackendTexture.cpp b/libraries/gpu/src/gpu/GLBackendTexture.cpp index 999173e5b7..05e1e8fed8 100755 --- a/libraries/gpu/src/gpu/GLBackendTexture.cpp +++ b/libraries/gpu/src/gpu/GLBackendTexture.cpp @@ -343,10 +343,10 @@ GLBackend::GLTexture* GLBackend::syncGPUObject(const Texture& texture) { if (bytes && texture.isAutogenerateMips()) { glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } else { + }/* else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - } + }*/ object->_target = GL_TEXTURE_2D; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index e75813ad27..ced83da5e9 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -119,6 +119,8 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; batch._glDrawBuffers(bufferCount, buffers); + const float OPAQUE_ALPHA_THRESHOLD = 0.5f; + args->_alphaThreshold = OPAQUE_ALPHA_THRESHOLD; } renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 203b192230..6076ec0006 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -207,7 +207,6 @@ void render::renderItems(const SceneContextPointer& sceneContext, const RenderCo auto item = scene->getItem(itemDetails.id); if (numItems + 1 >= maxDrawnItems) { item.render(args); - return; } item.render(args); From 67473ac2541bc4a088ef4acce098a07efac569e3 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 19 Jun 2015 15:37:05 +0200 Subject: [PATCH 16/19] Fix rotation handle crash --- interface/src/ui/overlays/Circle3DOverlay.cpp | 356 +++++++++--------- 1 file changed, 168 insertions(+), 188 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 77debf304f..d8b481d75f 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -11,6 +11,7 @@ // include this before QGLWidget, which includes an earlier version of OpenGL #include "InterfaceConfig.h" +#include #include #include #include @@ -101,206 +102,185 @@ void Circle3DOverlay::render(RenderArgs* args) { bool colorChanged = colorX.red != _lastColor.red || colorX.green != _lastColor.green || colorX.blue != _lastColor.blue; _lastColor = colorX; - glDisable(GL_LIGHTING); - - glm::vec3 position = getPosition(); - glm::vec3 center = getCenter(); - glm::vec2 dimensions = getDimensions(); - glm::quat rotation = getRotation(); - - float glowLevel = getGlowLevel(); - Glower* glower = NULL; - if (glowLevel > 0.0f) { - glower = new Glower(glowLevel); - } - - glPushMatrix(); - glTranslatef(position.x, position.y, position.z); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - glPushMatrix(); - glm::vec3 positionToCenter = center - position; - glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); - glScalef(dimensions.x / 2.0f, dimensions.y / 2.0f, 1.0f); - - glLineWidth(_lineWidth); - - auto geometryCache = DependencyManager::get(); - - // for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise - // we just draw a line... - if (getIsSolid()) { - if (_quadVerticesID == GeometryCache::UNKNOWN_ID) { - _quadVerticesID = geometryCache->allocateID(); - } - - if (geometryChanged || colorChanged) { - - QVector points; - - float angle = startAt; - float angleInRadians = glm::radians(angle); - glm::vec2 firstInnerPoint(cosf(angleInRadians) * innerRadius, sinf(angleInRadians) * innerRadius); - glm::vec2 firstOuterPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); - - points << firstInnerPoint << firstOuterPoint; - - while (angle < endAt) { - angleInRadians = glm::radians(angle); - glm::vec2 thisInnerPoint(cosf(angleInRadians) * innerRadius, sinf(angleInRadians) * innerRadius); - glm::vec2 thisOuterPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); - - points << thisOuterPoint << thisInnerPoint; - - angle += SLICE_ANGLE; - } - - // get the last slice portion.... - angle = endAt; - angleInRadians = glm::radians(angle); - glm::vec2 lastInnerPoint(cosf(angleInRadians) * innerRadius, sinf(angleInRadians) * innerRadius); - glm::vec2 lastOuterPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); - - points << lastOuterPoint << lastInnerPoint; - - geometryCache->updateVertices(_quadVerticesID, points, color); - } - - geometryCache->renderVertices(gpu::QUAD_STRIP, _quadVerticesID); - - } else { - if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { - _lineVerticesID = geometryCache->allocateID(); - } - - if (geometryChanged || colorChanged) { - QVector points; - - float angle = startAt; - float angleInRadians = glm::radians(angle); - glm::vec2 firstPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); - points << firstPoint; - - while (angle < endAt) { - angle += SLICE_ANGLE; - angleInRadians = glm::radians(angle); - glm::vec2 thisPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); - points << thisPoint; - - if (getIsDashedLine()) { - angle += SLICE_ANGLE / 2.0f; // short gap - angleInRadians = glm::radians(angle); - glm::vec2 dashStartPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); - points << dashStartPoint; - } - } - - // get the last slice portion.... - angle = endAt; - angleInRadians = glm::radians(angle); - glm::vec2 lastPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); - points << lastPoint; - - geometryCache->updateVertices(_lineVerticesID, points, color); - } + auto geometryCache = DependencyManager::get(); + Transform transform; + transform.setTranslation(getCenter()); + transform.setRotation(getRotation()); + transform.setScale(glm::vec3(getDimensions(), 0.01f)); + + + auto& batch = *args->_batch; + batch._glLineWidth(_lineWidth); + batch.setModelTransform(transform); + DependencyManager::get()->bindSimpleProgram(batch); + + // for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise + // we just draw a line... + if (getIsSolid()) { + if (_quadVerticesID == GeometryCache::UNKNOWN_ID) { + _quadVerticesID = geometryCache->allocateID(); + } + + if (geometryChanged || colorChanged) { + + QVector points; + + float angle = startAt; + float angleInRadians = glm::radians(angle); + glm::vec2 firstInnerPoint(cosf(angleInRadians) * innerRadius, sinf(angleInRadians) * innerRadius); + glm::vec2 firstOuterPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); + + points << firstInnerPoint << firstOuterPoint; + + while (angle < endAt) { + angleInRadians = glm::radians(angle); + glm::vec2 thisInnerPoint(cosf(angleInRadians) * innerRadius, sinf(angleInRadians) * innerRadius); + glm::vec2 thisOuterPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); + + points << thisOuterPoint << thisInnerPoint; + + angle += SLICE_ANGLE; + } + + // get the last slice portion.... + angle = endAt; + angleInRadians = glm::radians(angle); + glm::vec2 lastInnerPoint(cosf(angleInRadians) * innerRadius, sinf(angleInRadians) * innerRadius); + glm::vec2 lastOuterPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); + + points << lastOuterPoint << lastInnerPoint; + + geometryCache->updateVertices(_quadVerticesID, points, color); + } + + geometryCache->renderVertices(batch, gpu::QUAD_STRIP, _quadVerticesID); + + } else { + if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { + _lineVerticesID = geometryCache->allocateID(); + } + + if (geometryChanged || colorChanged) { + QVector points; + + float angle = startAt; + float angleInRadians = glm::radians(angle); + glm::vec2 firstPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); + points << firstPoint; + + while (angle < endAt) { + angle += SLICE_ANGLE; + angleInRadians = glm::radians(angle); + glm::vec2 thisPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); + points << thisPoint; + if (getIsDashedLine()) { - geometryCache->renderVertices(gpu::LINES, _lineVerticesID); - } else { - geometryCache->renderVertices(gpu::LINE_STRIP, _lineVerticesID); + angle += SLICE_ANGLE / 2.0f; // short gap + angleInRadians = glm::radians(angle); + glm::vec2 dashStartPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); + points << dashStartPoint; } } - - // draw our tick marks - // for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise - // we just draw a line... - if (getHasTickMarks()) { - - if (_majorTicksVerticesID == GeometryCache::UNKNOWN_ID) { - _majorTicksVerticesID = geometryCache->allocateID(); + + // get the last slice portion.... + angle = endAt; + angleInRadians = glm::radians(angle); + glm::vec2 lastPoint(cosf(angleInRadians) * outerRadius, sinf(angleInRadians) * outerRadius); + points << lastPoint; + + geometryCache->updateVertices(_lineVerticesID, points, color); + } + + if (getIsDashedLine()) { + geometryCache->renderVertices(batch, gpu::LINES, _lineVerticesID); + } else { + geometryCache->renderVertices(batch, gpu::LINE_STRIP, _lineVerticesID); + } + } + + // draw our tick marks + // for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise + // we just draw a line... + if (getHasTickMarks()) { + + if (_majorTicksVerticesID == GeometryCache::UNKNOWN_ID) { + _majorTicksVerticesID = geometryCache->allocateID(); + } + if (_minorTicksVerticesID == GeometryCache::UNKNOWN_ID) { + _minorTicksVerticesID = geometryCache->allocateID(); + } + + if (geometryChanged) { + QVector majorPoints; + QVector minorPoints; + + // draw our major tick marks + if (getMajorTickMarksAngle() > 0.0f && getMajorTickMarksLength() != 0.0f) { + + float tickMarkAngle = getMajorTickMarksAngle(); + float angle = startAt - fmodf(startAt, tickMarkAngle) + tickMarkAngle; + float angleInRadians = glm::radians(angle); + float tickMarkLength = getMajorTickMarksLength(); + float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius; + float endRadius = startRadius + tickMarkLength; + + while (angle <= endAt) { + angleInRadians = glm::radians(angle); + + glm::vec2 thisPointA(cosf(angleInRadians) * startRadius, sinf(angleInRadians) * startRadius); + glm::vec2 thisPointB(cosf(angleInRadians) * endRadius, sinf(angleInRadians) * endRadius); + + majorPoints << thisPointA << thisPointB; + + angle += tickMarkAngle; } - if (_minorTicksVerticesID == GeometryCache::UNKNOWN_ID) { - _minorTicksVerticesID = geometryCache->allocateID(); - } - - if (geometryChanged) { - QVector majorPoints; - QVector minorPoints; - - // draw our major tick marks - if (getMajorTickMarksAngle() > 0.0f && getMajorTickMarksLength() != 0.0f) { - - float tickMarkAngle = getMajorTickMarksAngle(); - float angle = startAt - fmodf(startAt, tickMarkAngle) + tickMarkAngle; - float angleInRadians = glm::radians(angle); - float tickMarkLength = getMajorTickMarksLength(); - float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius; - float endRadius = startRadius + tickMarkLength; - - while (angle <= endAt) { - angleInRadians = glm::radians(angle); - - glm::vec2 thisPointA(cosf(angleInRadians) * startRadius, sinf(angleInRadians) * startRadius); - glm::vec2 thisPointB(cosf(angleInRadians) * endRadius, sinf(angleInRadians) * endRadius); - - majorPoints << thisPointA << thisPointB; - - angle += tickMarkAngle; - } - } - - // draw our minor tick marks - if (getMinorTickMarksAngle() > 0.0f && getMinorTickMarksLength() != 0.0f) { - - float tickMarkAngle = getMinorTickMarksAngle(); - float angle = startAt - fmodf(startAt, tickMarkAngle) + tickMarkAngle; - float angleInRadians = glm::radians(angle); - float tickMarkLength = getMinorTickMarksLength(); - float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius; - float endRadius = startRadius + tickMarkLength; - - while (angle <= endAt) { - angleInRadians = glm::radians(angle); - - glm::vec2 thisPointA(cosf(angleInRadians) * startRadius, sinf(angleInRadians) * startRadius); - glm::vec2 thisPointB(cosf(angleInRadians) * endRadius, sinf(angleInRadians) * endRadius); - - minorPoints << thisPointA << thisPointB; - - angle += tickMarkAngle; - } - } - - xColor majorColorX = getMajorTickMarksColor(); - glm::vec4 majorColor(majorColorX.red / MAX_COLOR, majorColorX.green / MAX_COLOR, majorColorX.blue / MAX_COLOR, alpha); - - geometryCache->updateVertices(_majorTicksVerticesID, majorPoints, majorColor); - - xColor minorColorX = getMinorTickMarksColor(); - glm::vec4 minorColor(minorColorX.red / MAX_COLOR, minorColorX.green / MAX_COLOR, minorColorX.blue / MAX_COLOR, alpha); - - geometryCache->updateVertices(_minorTicksVerticesID, minorPoints, minorColor); - } - - geometryCache->renderVertices(gpu::LINES, _majorTicksVerticesID); - - geometryCache->renderVertices(gpu::LINES, _minorTicksVerticesID); } - - - glPopMatrix(); - glPopMatrix(); - + + // draw our minor tick marks + if (getMinorTickMarksAngle() > 0.0f && getMinorTickMarksLength() != 0.0f) { + + float tickMarkAngle = getMinorTickMarksAngle(); + float angle = startAt - fmodf(startAt, tickMarkAngle) + tickMarkAngle; + float angleInRadians = glm::radians(angle); + float tickMarkLength = getMinorTickMarksLength(); + float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius; + float endRadius = startRadius + tickMarkLength; + + while (angle <= endAt) { + angleInRadians = glm::radians(angle); + + glm::vec2 thisPointA(cosf(angleInRadians) * startRadius, sinf(angleInRadians) * startRadius); + glm::vec2 thisPointB(cosf(angleInRadians) * endRadius, sinf(angleInRadians) * endRadius); + + minorPoints << thisPointA << thisPointB; + + angle += tickMarkAngle; + } + } + + xColor majorColorX = getMajorTickMarksColor(); + glm::vec4 majorColor(majorColorX.red / MAX_COLOR, majorColorX.green / MAX_COLOR, majorColorX.blue / MAX_COLOR, alpha); + + geometryCache->updateVertices(_majorTicksVerticesID, majorPoints, majorColor); + + xColor minorColorX = getMinorTickMarksColor(); + glm::vec4 minorColor(minorColorX.red / MAX_COLOR, minorColorX.green / MAX_COLOR, minorColorX.blue / MAX_COLOR, alpha); + + geometryCache->updateVertices(_minorTicksVerticesID, minorPoints, minorColor); + } + + geometryCache->renderVertices(batch, gpu::LINES, _majorTicksVerticesID); + + geometryCache->renderVertices(batch, gpu::LINES, _minorTicksVerticesID); + } + if (geometryChanged) { _lastStartAt = startAt; _lastEndAt = endAt; _lastInnerRadius = innerRadius; _lastOuterRadius = outerRadius; } - - if (glower) { - delete glower; - } } void Circle3DOverlay::setProperties(const QScriptValue &properties) { From 9c7f24eeb6385e8c34cf6f2877a519d4883d29bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 19 Jun 2015 16:50:38 +0200 Subject: [PATCH 17/19] Add culled option for simple programs --- interface/src/ui/overlays/Circle3DOverlay.cpp | 2 +- .../src/DeferredLightingEffect.cpp | 27 ++++++++++++++++--- .../render-utils/src/DeferredLightingEffect.h | 4 ++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index d8b481d75f..034095291f 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -113,7 +113,7 @@ void Circle3DOverlay::render(RenderArgs* args) { auto& batch = *args->_batch; batch._glLineWidth(_lineWidth); batch.setModelTransform(transform); - DependencyManager::get()->bindSimpleProgram(batch); + DependencyManager::get()->bindSimpleProgram(batch, false, false); // for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise // we just draw a line... diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index f0a52af086..5ebd798c19 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -61,15 +61,26 @@ void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) { gpu::Shader::BindingSet slotBindings; gpu::Shader::makeProgram(*program, slotBindings); gpu::Shader::makeProgram(*programTextured, slotBindings); - + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); state->setCullMode(gpu::State::CULL_BACK); state->setDepthTest(true, true, gpu::LESS_EQUAL); state->setBlendFunction(false, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + + + gpu::StatePointer stateCullNone = gpu::StatePointer(new gpu::State()); + stateCullNone->setCullMode(gpu::State::CULL_NONE); + stateCullNone->setDepthTest(true, true, gpu::LESS_EQUAL); + stateCullNone->setBlendFunction(false, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + _simpleProgram = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); + _simpleProgramCullNone = gpu::PipelinePointer(gpu::Pipeline::create(program, stateCullNone)); _simpleProgramTextured = gpu::PipelinePointer(gpu::Pipeline::create(programTextured, state)); + _simpleProgramTexturedCullNone = gpu::PipelinePointer(gpu::Pipeline::create(programTextured, stateCullNone)); _viewState = viewState; loadLightProgram(directional_light_frag, false, _directionalLight, _directionalLightLocations); @@ -106,13 +117,21 @@ void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) { lp->setAmbientSpherePreset(gpu::SphericalHarmonics::Preset(_ambientLightMode % gpu::SphericalHarmonics::NUM_PRESET)); } -void DeferredLightingEffect::bindSimpleProgram(gpu::Batch& batch, bool textured) { +void DeferredLightingEffect::bindSimpleProgram(gpu::Batch& batch, bool textured, bool culled) { // DependencyManager::get()->setPrimaryDrawBuffers(batch, true, true, true); if (textured) { - batch.setPipeline(_simpleProgramTextured); + if (culled) { + batch.setPipeline(_simpleProgramTextured); + } else { + batch.setPipeline(_simpleProgramTexturedCullNone); + } } else { - batch.setPipeline(_simpleProgram); + if (culled) { + batch.setPipeline(_simpleProgram); + } else { + batch.setPipeline(_simpleProgramCullNone); + } } } diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index bd7fcb286b..e841fed321 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -34,7 +34,7 @@ public: void init(AbstractViewStateInterface* viewState); /// Sets up the state necessary to render static untextured geometry with the simple program. - void bindSimpleProgram(gpu::Batch& batch, bool textured = false); + void bindSimpleProgram(gpu::Batch& batch, bool textured = false, bool culled = true); /// Tears down the state necessary to render static untextured geometry with the simple program. void releaseSimpleProgram(gpu::Batch& batch); @@ -100,7 +100,9 @@ private: static void loadLightProgram(const char* fragSource, bool limited, ProgramObject& program, LightLocations& locations); gpu::PipelinePointer _simpleProgram; + gpu::PipelinePointer _simpleProgramCullNone; gpu::PipelinePointer _simpleProgramTextured; + gpu::PipelinePointer _simpleProgramTexturedCullNone; ProgramObject _directionalSkyboxLight; LightLocations _directionalSkyboxLightLocations; From b0f5990bd73d20013f8dc3da82a5a6f53be16ba7 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 17:13:29 +0200 Subject: [PATCH 18/19] fix syntax --- libraries/fbx/src/FBXReader.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index fd207dc773..236e2979f5 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -506,7 +506,7 @@ FBXNode parseFBX(QIODevice* device) { QVector createVec4Vector(const QVector& doubleVector) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 4 * 4); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 4) * 4); it != end; ) { float x = *it++; float y = *it++; float z = *it++; @@ -519,7 +519,7 @@ QVector createVec4Vector(const QVector& doubleVector) { QVector createVec4VectorRGBA(const QVector& doubleVector, glm::vec4& average) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 4 * 4); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 4) * 4); it != end; ) { float x = *it++; float y = *it++; float z = *it++; @@ -536,7 +536,7 @@ QVector createVec4VectorRGBA(const QVector& doubleVector, glm QVector createVec3Vector(const QVector& doubleVector) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 3 * 3); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 3) * 3); it != end; ) { float x = *it++; float y = *it++; float z = *it++; @@ -547,7 +547,7 @@ QVector createVec3Vector(const QVector& doubleVector) { QVector createVec2Vector(const QVector& doubleVector) { QVector values; - for (const double* it = doubleVector.constData(), *end = it + (doubleVector.size() / 2 * 2); it != end; ) { + for (const double* it = doubleVector.constData(), *end = it + ((doubleVector.size() / 2) * 2); it != end; ) { float s = *it++; float t = *it++; values.append(glm::vec2(s, -t)); From 598d0a5375babc73b68f90ea36bb7c14f34e48a1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 19 Jun 2015 17:44:56 +0200 Subject: [PATCH 19/19] Just remove these changes on SkeletonModel.cpp --- interface/src/avatar/SkeletonModel.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 8c52c79ca0..2aa08d36f3 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -41,6 +41,7 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : _headClipDistance(DEFAULT_NEAR_CLIP) { assert(_owningAvatar); + _enableShapes = true; } SkeletonModel::~SkeletonModel() { @@ -254,9 +255,12 @@ void SkeletonModel::applyPalmData(int jointIndex, PalmData& palm) { } void SkeletonModel::updateJointState(int index) { + if (index > _jointStates.size()) { + return; // bail + } JointState& state = _jointStates[index]; const FBXJoint& joint = state.getFBXJoint(); - if (joint.parentIndex != -1) { + if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { const JointState& parentState = _jointStates.at(joint.parentIndex); const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (index == geometry.leanJointIndex) {