// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved. #include "SceneQuery.h" #include "Engine/Scripting/Script.h" #include "Engine/Profiler/Profiler.h" Actor* SceneQuery::RaycastScene(const Ray& ray) { PROFILE_CPU(); #if SCENE_QUERIES_WITH_LOCK ScopeLock lock(Level::ScenesLock); #endif Actor* target; Actor* minTarget = nullptr; float distance; Vector3 normal; float minDistance = MAX_float; for (int32 i = 0; i < Level::Scenes.Count(); i++) { target = Level::Scenes[i]->Intersects(ray, distance, normal); if (target) { if (minDistance > distance) { minDistance = distance; minTarget = target; } } } return minTarget; } bool GetAllSceneObjectsQuery(Actor* actor, Array& objects) { objects.Add(actor); objects.Add(reinterpret_cast(actor->Scripts.Get()), actor->Scripts.Count()); return true; } void SceneQuery::GetAllSceneObjects(Actor* root, Array& objects) { ASSERT(root); PROFILE_CPU(); Function&)> func(GetAllSceneObjectsQuery); root->TreeExecuteChildren&>(func, objects); } bool GetAllSerializableSceneObjectsQuery(Actor* actor, Array& objects) { if ((actor->HideFlags & HideFlags::DontSave) != 0) return false; objects.Add(actor); objects.Add(reinterpret_cast(actor->Scripts.Get()), actor->Scripts.Count()); return true; } void SceneQuery::GetAllSerializableSceneObjects(Actor* root, Array& objects) { ASSERT(root); PROFILE_CPU(); Function&)> func(GetAllSerializableSceneObjectsQuery); root->TreeExecute&>(func, objects); } bool GetAllActorsQuery(Actor* actor, Array& actors) { actors.Add(actor); return true; } void SceneQuery::GetAllActors(Actor* root, Array& actors) { PROFILE_CPU(); ASSERT(root); Function&)> func(GetAllActorsQuery); root->TreeExecuteChildren&>(func, actors); } void SceneQuery::GetAllActors(Array& actors) { PROFILE_CPU(); #if SCENE_QUERIES_WITH_LOCK ScopeLock lock(Level::ScenesLock); #endif for (int32 i = 0; i < Level::Scenes.Count(); i++) GetAllActors(Level::Scenes[i], actors); }