Improved PickItemJob with item key filter

This commit is contained in:
Olivier Prat 2017-08-09 11:52:31 +02:00
parent 44ee7c4bf1
commit 0fb4e42e1f
2 changed files with 16 additions and 11 deletions

View file

@ -10,7 +10,7 @@
// //
#include "PickItemsJob.h" #include "PickItemsJob.h"
PickItemsJob::PickItemsJob() { PickItemsJob::PickItemsJob(render::ItemKey::Flags validKeys, render::ItemKey::Flags excludeKeys) : _validKeys{ validKeys }, _excludeKeys{ excludeKeys } {
} }
void PickItemsJob::configure(const Config& config) { void PickItemsJob::configure(const Config& config) {
@ -21,28 +21,31 @@ void PickItemsJob::run(const render::RenderContextPointer& renderContext, const
float minIsectDistance = std::numeric_limits<float>::max(); float minIsectDistance = std::numeric_limits<float>::max();
auto& itemBounds = input; auto& itemBounds = input;
auto itemID = findNearestItem(renderContext, itemBounds, minIsectDistance); auto item = findNearestItem(renderContext, itemBounds, minIsectDistance);
if (render::Item::isValidID(itemID)) { if (render::Item::isValidID(item.id)) {
output.emplace_back(itemID); output.push_back(item);
} }
} }
render::ItemID PickItemsJob::findNearestItem(const render::RenderContextPointer& renderContext, const render::ItemBounds& inputs, float& minIsectDistance) const { render::ItemBound PickItemsJob::findNearestItem(const render::RenderContextPointer& renderContext, const render::ItemBounds& inputs, float& minIsectDistance) const {
const glm::vec3 rayOrigin = renderContext->args->getViewFrustum().getPosition(); const glm::vec3 rayOrigin = renderContext->args->getViewFrustum().getPosition();
const glm::vec3 rayDirection = renderContext->args->getViewFrustum().getDirection(); const glm::vec3 rayDirection = renderContext->args->getViewFrustum().getDirection();
BoxFace face; BoxFace face;
glm::vec3 normal; glm::vec3 normal;
float isectDistance; float isectDistance;
render::ItemID nearestItem = render::Item::INVALID_ITEM_ID; render::ItemBound nearestItem( render::Item::INVALID_ITEM_ID );
const float minDistance = 1.f; const float minDistance = 1.f;
const float maxDistance = 50.f; const float maxDistance = 50.f;
render::ItemKey itemKey;
for (const auto& itemBound : inputs) { for (const auto& itemBound : inputs) {
if (!itemBound.bound.contains(rayOrigin) && itemBound.bound.findRayIntersection(rayOrigin, rayDirection, isectDistance, face, normal)) { if (!itemBound.bound.contains(rayOrigin) && itemBound.bound.findRayIntersection(rayOrigin, rayDirection, isectDistance, face, normal)) {
auto& item = renderContext->_scene->getItem(itemBound.id); auto& item = renderContext->_scene->getItem(itemBound.id);
if (item.getKey().isWorldSpace() && isectDistance>minDistance && isectDistance < minIsectDistance && isectDistance<maxDistance) { itemKey = item.getKey();
nearestItem = itemBound.id; if (itemKey.isWorldSpace() && isectDistance>minDistance && isectDistance < minIsectDistance && isectDistance<maxDistance
&& (itemKey._flags & _validKeys)!=0 && (itemKey._flags & _excludeKeys)==0) {
nearestItem = itemBound;
minIsectDistance = isectDistance; minIsectDistance = isectDistance;
} }
} }

View file

@ -13,6 +13,7 @@
#define hifi_render_utils_PickItemsJob_h #define hifi_render_utils_PickItemsJob_h
#include <render/Engine.h> #include <render/Engine.h>
#include <render/Item.h>
class PickItemsConfig : public render::Job::Config { class PickItemsConfig : public render::Job::Config {
@ -30,16 +31,17 @@ public:
using Output = render::ItemBounds; using Output = render::ItemBounds;
using JobModel = render::Job::ModelIO<PickItemsJob, Input, Output, Config>; using JobModel = render::Job::ModelIO<PickItemsJob, Input, Output, Config>;
PickItemsJob(); PickItemsJob(render::ItemKey::Flags validKeys = render::ItemKey::Builder().withTypeMeta().withTypeShape().build()._flags, render::ItemKey::Flags excludeKeys = 0);
void configure(const Config& config); void configure(const Config& config);
void run(const render::RenderContextPointer& renderContext, const PickItemsJob::Input& input, PickItemsJob::Output& output); void run(const render::RenderContextPointer& renderContext, const PickItemsJob::Input& input, PickItemsJob::Output& output);
private: private:
bool _isEnabled{ false }; render::ItemKey::Flags _validKeys;
render::ItemKey::Flags _excludeKeys;
render::ItemID findNearestItem(const render::RenderContextPointer& renderContext, const render::ItemBounds& inputs, float& minIsectDistance) const; render::ItemBound findNearestItem(const render::RenderContextPointer& renderContext, const render::ItemBounds& inputs, float& minIsectDistance) const;
}; };
#endif // hifi_render_utils_PickItemsJob_h #endif // hifi_render_utils_PickItemsJob_h