Skip to content
Snippets Groups Projects
Commit b3e7386b authored by Sebastian Pape's avatar Sebastian Pape
Browse files

Fixed some bugs that lead to a crash/bugs, when deleting objects

parent 11b41de3
Branches
No related tags found
No related merge requests found
Showing with 66 additions and 8 deletions
...@@ -305,9 +305,22 @@ void HMDNavigationBehavior::UpdateInsersectionData() { ...@@ -305,9 +305,22 @@ void HMDNavigationBehavior::UpdateInsersectionData() {
glm::vec3 ori = ori_ / ori_.w; glm::vec3 ori = ori_ / ori_.w;
glm::vec3 forward = normalize(glm::vec3(transform * glm::vec4(0, 0, -1, 0))); glm::vec3 forward = normalize(glm::vec3(transform * glm::vec4(0, 0, -1, 0)));
select_->UpdateInsersectThreadData( // filter out elements that are not interactable
ori, forward, transform, auto entities_with_selector =
scene_->GetEntitiesWithComponents<phx::Selector>()); scene_->GetEntitiesWithComponents<phx::Selector>();
std::vector<phx::Entity*> entities_interactable(
entities_with_selector.size());
;
auto it = std::copy_if(
entities_with_selector.begin(), entities_with_selector.end(),
entities_interactable.begin(), [](phx::Entity* e) {
return e->GetFirstComponent<phx::Selector>()->IsInteractable();
});
entities_interactable.resize(std::distance(
entities_interactable.begin(), it)); // shrink container to new size
select_->UpdateInsersectThreadData(ori, forward, transform,
entities_interactable);
} }
void HMDNavigationBehavior::ButtonChange( void HMDNavigationBehavior::ButtonChange(
......
...@@ -45,6 +45,7 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager, ...@@ -45,6 +45,7 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager,
LensSideType type1, LensSideType type2, optix::float3 frontCenter, LensSideType type1, LensSideType type2, optix::float3 frontCenter,
float lensradius, float thickness, float radius, float radius2) { float lensradius, float thickness, float radius, float radius2) {
manager_ = manager; manager_ = manager;
scene_ = scene;
CreateGlassMaterialInstance(); CreateGlassMaterialInstance();
geometry_ = manager->GetContext()->createGeometryInstance( geometry_ = manager->GetContext()->createGeometryInstance(
...@@ -136,7 +137,9 @@ Lens::~Lens() { ...@@ -136,7 +137,9 @@ Lens::~Lens() {
geometry_group_->destroy(); geometry_group_->destroy();
transform_->destroy(); transform_->destroy();
acceleration_structure_->destroy(); acceleration_structure_->destroy();
scene_->RemoveEntity(entity_);
delete support_rod_; delete support_rod_;
manager_->TopAccelerationMarkDirty();
} }
void Lens::NextLensSideType1() { void Lens::NextLensSideType1() {
......
...@@ -116,6 +116,8 @@ class Lens { ...@@ -116,6 +116,8 @@ class Lens {
void ChangedWaveLength(float wavelength_nm); void ChangedWaveLength(float wavelength_nm);
void RemoveSupportRod() { support_rod_->Remove(); }
private: private:
std::array<glm::vec3, 2u> ComputeAABBFromCylinder(glm::vec3 orientation, std::array<glm::vec3, 2u> ComputeAABBFromCylinder(glm::vec3 orientation,
float halfLength1, float halfLength1,
...@@ -141,6 +143,7 @@ class Lens { ...@@ -141,6 +143,7 @@ class Lens {
void RecalculateBoundingBox(); void RecalculateBoundingBox();
SupportRod* support_rod_; SupportRod* support_rod_;
OptixContextManager* manager_; OptixContextManager* manager_;
phx::Scene* scene_;
phx::Selector* selector_; phx::Selector* selector_;
bool grabbed_ = false; bool grabbed_ = false;
......
...@@ -43,10 +43,13 @@ ObjectManager::ObjectManager(phx::Engine* engine, phx::Scene* scene, ...@@ -43,10 +43,13 @@ ObjectManager::ObjectManager(phx::Engine* engine, phx::Scene* scene,
: phx::System(engine) { : phx::System(engine) {
manager_ = manager; manager_ = manager;
scene_ = scene; scene_ = scene;
selection_system_ = engine->GetSystem<SelectionSystem>();
bin_ = phx::SceneLoader::InsertModelIntoScene( bin_ = phx::SceneLoader::InsertModelIntoScene(
"models/opticalBench/room/bin.obj", scene); "models/opticalBench/room/bin.obj", scene);
bin_->AddComponent<phx::Selector>(bin_)->SetMove(nullptr); // deactivate move auto select_bin = bin_->AddComponent<phx::Selector>(bin_);
select_bin->SetMove(nullptr); // deactivate move
select_bin->SetInteractable(false);
bin_->GetFirstComponent<phx::Transform>()->Translate( bin_->GetFirstComponent<phx::Transform>()->Translate(
glm::vec3(0.0f, 0.0f, -1.5f)); // Position on floor glm::vec3(0.0f, 0.0f, -1.5f)); // Position on floor
...@@ -142,9 +145,10 @@ void ObjectManager::DeleteLens(Lens* l) { ...@@ -142,9 +145,10 @@ void ObjectManager::DeleteLens(Lens* l) {
registered_lenses_.end()); registered_lenses_.end());
if (hmd_nav_ != nullptr) hmd_nav_->DeletedObject(); if (hmd_nav_ != nullptr) hmd_nav_->DeletedObject();
menu_->UnregisterLens(l); menu_->UnregisterLens(l);
make_invalid_ = true; make_invalid_ = true;
selection_system_->ResetHoveredGrabbed();
l->RemoveSupportRod();
delete l; delete l;
} }
...@@ -154,8 +158,9 @@ void ObjectManager::DeleteTarget(TestPatternFrame* t) { ...@@ -154,8 +158,9 @@ void ObjectManager::DeleteTarget(TestPatternFrame* t) {
registered_frames_.end()); registered_frames_.end());
if (hmd_nav_ != nullptr) hmd_nav_->DeletedObject(); if (hmd_nav_ != nullptr) hmd_nav_->DeletedObject();
make_invalid_ = true; make_invalid_ = true;
selection_system_->ResetHoveredGrabbed();
t->RemoveSupportRod();
delete t; delete t;
} }
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "lens.hpp" #include "lens.hpp"
#include "menu_manager.hpp" #include "menu_manager.hpp"
#include "phx/suppress_warnings.hpp" #include "phx/suppress_warnings.hpp"
#include "selection_system.hpp"
#include "test_pattern_frame.hpp" #include "test_pattern_frame.hpp"
#include <mutex> #include <mutex>
...@@ -83,6 +84,7 @@ class ObjectManager : public phx::System { ...@@ -83,6 +84,7 @@ class ObjectManager : public phx::System {
private: private:
phx::Entity* bin_; phx::Entity* bin_;
SelectionSystem* selection_system_;
phx::MaterialHandle* bin_mat_ = nullptr; phx::MaterialHandle* bin_mat_ = nullptr;
const glm::vec3 kBinColorBase_ = glm::vec3(0.189474f, 0.189474f, 0.189474f); const glm::vec3 kBinColorBase_ = glm::vec3(0.189474f, 0.189474f, 0.189474f);
......
...@@ -41,6 +41,7 @@ SUPPRESS_WARNINGS_END ...@@ -41,6 +41,7 @@ SUPPRESS_WARNINGS_END
SupportRod::SupportRod(phx::Scene* scene, phx::Selector* selector, SupportRod::SupportRod(phx::Scene* scene, phx::Selector* selector,
bool append_to_move) { bool append_to_move) {
selector_ = selector; selector_ = selector;
scene_ = scene;
rod_support_entity_ = LoadAndInsertRod(scene); rod_support_entity_ = LoadAndInsertRod(scene);
rod_holder_entity_ = LoadAndInsertRod(scene); rod_holder_entity_ = LoadAndInsertRod(scene);
...@@ -93,6 +94,13 @@ SupportRod::SupportRod(phx::Scene* scene, phx::Selector* selector, ...@@ -93,6 +94,13 @@ SupportRod::SupportRod(phx::Scene* scene, phx::Selector* selector,
SupportRod::~SupportRod() {} SupportRod::~SupportRod() {}
// Cant be done in Destructor, else it crashes at close, since the entities
// might be deleted already
void SupportRod::Remove() {
scene_->RemoveEntity(rod_support_entity_);
scene_->RemoveEntity(rod_holder_entity_);
}
phx::Entity* SupportRod::LoadAndInsertRod(phx::Scene* scene) { phx::Entity* SupportRod::LoadAndInsertRod(phx::Scene* scene) {
auto model = phx::ResourceUtils::LoadResourceFromFile<phx::Model>( auto model = phx::ResourceUtils::LoadResourceFromFile<phx::Model>(
"models/opticalBench/rod/rod.obj"); "models/opticalBench/rod/rod.obj");
......
...@@ -50,8 +50,11 @@ class SupportRod { ...@@ -50,8 +50,11 @@ class SupportRod {
void Moved() { move_function_(); } void Moved() { move_function_(); }
void Remove();
private: private:
phx::Entity* LoadAndInsertRod(phx::Scene* scene); phx::Entity* LoadAndInsertRod(phx::Scene* scene);
phx::Scene* scene_;
phx::Entity* rod_support_entity_; phx::Entity* rod_support_entity_;
phx::Entity* rod_holder_entity_; phx::Entity* rod_holder_entity_;
phx::Selector* selector_; phx::Selector* selector_;
......
...@@ -45,7 +45,8 @@ SUPPRESS_WARNINGS_END ...@@ -45,7 +45,8 @@ SUPPRESS_WARNINGS_END
#include "phx/rendering/components/transform.hpp" #include "phx/rendering/components/transform.hpp"
SelectionSystem::SelectionSystem(phx::Engine* engine) : phx::System(engine) { SelectionSystem::SelectionSystem(phx::Engine* engine) : phx::System(engine) {
intersection_thread_ = std::thread(&SelectionSystem::IntersectionThreadFunction, this); intersection_thread_ =
std::thread(&SelectionSystem::IntersectionThreadFunction, this);
} }
SelectionSystem::~SelectionSystem() {} SelectionSystem::~SelectionSystem() {}
...@@ -159,6 +160,12 @@ void SelectionSystem::IntersectionThreadFunction() { ...@@ -159,6 +160,12 @@ void SelectionSystem::IntersectionThreadFunction() {
res = nullptr; res = nullptr;
for (auto i = 0u; i < entities.size(); ++i) { for (auto i = 0u; i < entities.size(); ++i) {
auto scene_entities = engine_->GetScene()->GetEntities();
// Check if already deleted
if (std::find(scene_entities.begin(), scene_entities.end(),
entities[i]) == scene_entities.end()) {
continue;
}
curr = entities[i]->GetFirstComponent<phx::Selector>(); curr = entities[i]->GetFirstComponent<phx::Selector>();
current_intersection = curr->Intersect(ori, dir); current_intersection = curr->Intersect(ori, dir);
......
...@@ -56,6 +56,10 @@ class SelectionSystem : public phx::System { ...@@ -56,6 +56,10 @@ class SelectionSystem : public phx::System {
std::vector<phx::Entity*> entities); std::vector<phx::Entity*> entities);
void KillThread(); void KillThread();
void ResetHoveredGrabbed() {
selector_currently_grabbed_entity_ = nullptr;
selector_currently_hovered_entity_ = nullptr;
}
private: private:
std::thread intersection_thread_; std::thread intersection_thread_;
......
...@@ -138,11 +138,15 @@ class Selector : public Component { ...@@ -138,11 +138,15 @@ class Selector : public Component {
if (external_update_function_ != nullptr) external_update_function_(); if (external_update_function_ != nullptr) external_update_function_();
} }
bool IsInteractable() { return interactable; }
void SetInteractable(bool b) { interactable = b; }
private: private:
AABB collider_; AABB collider_;
void SwapMinMaxVectorEntries(glm::vec3& min, glm::vec3& max); void SwapMinMaxVectorEntries(glm::vec3& min, glm::vec3& max);
bool manipulation_helper_attachable_ = false; bool manipulation_helper_attachable_ = false;
float intersection_dist_ = 0.05f; float intersection_dist_ = 0.05f;
bool interactable = true;
// selection functions // selection functions
std::function<void(glm::mat4, std::chrono::milliseconds)> hover_function_ = std::function<void(glm::mat4, std::chrono::milliseconds)> hover_function_ =
......
...@@ -40,6 +40,7 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene, ...@@ -40,6 +40,7 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene,
std::string image, glm::vec3 pos, std::string image, glm::vec3 pos,
bool use_interpolation) { bool use_interpolation) {
manager_ = manager; manager_ = manager;
scene_ = scene;
material_ = manager_->GetTargetMaterial(); material_ = manager_->GetTargetMaterial();
transform_ = manager_->GetContext()->createTransform(); transform_ = manager_->GetContext()->createTransform();
...@@ -109,9 +110,11 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene, ...@@ -109,9 +110,11 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene,
TestPatternFrame::~TestPatternFrame() { TestPatternFrame::~TestPatternFrame() {
manager_->GetTopObject()->removeChild(transform_); manager_->GetTopObject()->removeChild(transform_);
geometry_->destroy(); geometry_->destroy();
acceleration_->destroy();
geometry_group_->destroy(); geometry_group_->destroy();
transform_->destroy(); transform_->destroy();
acceleration_->destroy(); scene_->RemoveEntity(entity_);
manager_->TopAccelerationMarkDirty();
delete support_rod_; delete support_rod_;
} }
......
...@@ -49,6 +49,8 @@ class TestPatternFrame { ...@@ -49,6 +49,8 @@ class TestPatternFrame {
void Translate(glm::vec3 pos); void Translate(glm::vec3 pos);
void RemoveSupportRod() { support_rod_->Remove(); }
private: private:
optix::Transform transform_; optix::Transform transform_;
optix::GeometryInstance geometry_; optix::GeometryInstance geometry_;
...@@ -64,6 +66,7 @@ class TestPatternFrame { ...@@ -64,6 +66,7 @@ class TestPatternFrame {
} }
phx::Entity* entity_; phx::Entity* entity_;
phx::Scene* scene_;
SupportRod* support_rod_; SupportRod* support_rod_;
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment