33#ifndef DVD_SCENE_MANAGER_H
34#define DVD_SCENE_MANAGER_H
62 class ProjectScenePool;
63 class ProjectManagerProject;
65 class ProjectManagerScene;
66 class ProjectManagerEditor;
67 class ProjectManagerKernel;
68 class ProjectManagerRenderPass;
69 class ProjectManagerSSRAccessor;
70 class ProjectManagerCameraAccessor;
88 struct MemoryBarrierCommand;
95 class RenderPassExecutor;
96 class ShaderComputeQueue;
97 class SSRPreRenderOperator;
98 class DirectionalLightSystem;
99 class ContentExplorerWindow;
100 class SolutionExplorerWindow;
101 class GUIConsoleCommandParser;
103 struct CameraSnapshot;
104 struct SizeChangeParams;
134 return !target._targetScene._name.empty();
139 return !target._targetProject._name.empty();
220 static std::atomic_size_t index = 0u;
222 const size_t idx = index.fetch_add( 1u );
231 return entry.first == idx;
278 [[nodiscard]]
bool onKeyDown( const Input::KeyEvent& key ) override;
280 [[nodiscard]]
bool onKeyUp( const Input::KeyEvent& key ) override;
282 [[nodiscard]]
bool joystickAxisMoved( const Input::JoystickEvent& arg ) override;
284 [[nodiscard]]
bool joystickPovMoved( const Input::JoystickEvent& arg ) override;
289 [[nodiscard]]
bool joystickBallMoved( const Input::JoystickEvent& arg ) override;
291 [[nodiscard]]
bool joystickAddRemove( const Input::JoystickEvent& arg ) override;
292 [[nodiscard]]
bool joystickRemap( const Input::JoystickEvent& arg ) override;
294 [[nodiscard]]
bool mouseMoved( const Input::MouseMoveEvent& arg ) override;
300 [[nodiscard]]
bool onTextEvent( const Input::TextEvent& arg ) override;
341 void drawCustomUI( const
Rect<
I32>& targetViewport, GFX::CommandBuffer& bufferInOut, GFX::MemoryBarrierCommand& memCmdInOut );
342 void postRender( GFX::CommandBuffer& bufferInOut, GFX::MemoryBarrierCommand& memCmdInOut );
343 void debugDraw( GFX::CommandBuffer& bufferInOut, GFX::MemoryBarrierCommand& memCmdInOut );
423 manager.
addPlayer( parentScene, playerNode, queue );
443 return manager->
init();
448 manager->initPostLoadState();
468 return manager->getEnvProbes();
555 mgr->
findNode( cameraEye, nodeGUID, nodesOut );
560 mgr->initDefaultCullValues( stage, cullParamsInOut );
570 mgr->
debugDraw( bufferInOut, memCmdInOut );
575 mgr->
drawCustomUI( targetViewport, bufferInOut, memCmdInOut );
585 return mgr->playerCamera();
590 return mgr->activeProject()->getActiveScene()->state()->playerState();
595 return *mgr->activeProject()->getActiveScene()->lightPool();
600 return mgr->activeProject()->getActiveScene()->state()->renderState();
static Camera * playerCamera(const Divide::ProjectManager *mgr, const PlayerIndex idx, const bool skipOverride=false) noexcept
static Camera * playerCamera(const Divide::ProjectManager &mgr, const PlayerIndex idx, const bool skipOverride=false) noexcept
static BoundingSphere moveCameraToNode(const Divide::ProjectManager *mgr, Camera *camera, const SceneGraphNode *targetNode)
static Camera * playerCamera(const Divide::ProjectManager &mgr, const bool skipOverride=false) noexcept
static Camera * playerCamera(const Divide::ProjectManager *mgr, const bool skipOverride=false) noexcept
static bool saveNode(const Divide::ProjectManager *mgr, const SceneGraphNode *targetNode)
static Camera * playerCamera(const Divide::ProjectManager *mgr, PlayerIndex idx, bool skipOverride=false) noexcept
static bool loadNode(const Divide::ProjectManager *mgr, SceneGraphNode *targetNode)
static void editorPreviewNode(Divide::ProjectManager *mgr, const I64 editorPreviewNode)
static Camera * playerCamera(const Divide::ProjectManager *mgr, bool skipOverride=false) noexcept
static SceneEnvironmentProbePool * getEnvProbes(const Divide::ProjectManager *manager) noexcept
static bool networkUpdate(Divide::ProjectManager *manager, const U64 frameCount)
static ProjectIDs & init(Divide::ProjectManager *manager)
static void currentPlayerPass(Divide::ProjectManager *manager, const PlayerIndex idx)
static void initPostLoadState(Divide::ProjectManager *manager) noexcept
static bool onFrameStart(Divide::Project &project)
static void idle(Divide::Project &project)
static void waitForSaveTask(Divide::ProjectManager &mgr)
static bool onFrameEnd(Divide::Project &project)
static void drawCustomUI(Divide::ProjectManager *mgr, const Rect< I32 > &targetViewport, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static SceneRenderState & renderState(Divide::ProjectManager *mgr) noexcept
static const SceneStatePerPlayer & playerState(const Divide::ProjectManager *mgr) noexcept
static const Camera * playerCamera(const Divide::ProjectManager *mgr) noexcept
static LightPool & lightPool(Divide::ProjectManager *mgr)
static void postRender(Divide::ProjectManager *mgr, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static void prepareLightData(Divide::ProjectManager *mgr, const RenderStage stage, const CameraSnapshot &cameraSnapshot, GFX::MemoryBarrierCommand &memCmdInOut)
static void cullScene(Divide::ProjectManager *mgr, const NodeCullParams &cullParams, const U16 cullFlags, VisibleNodeList<> &nodesOut)
static void initDefaultCullValues(Divide::ProjectManager *mgr, const RenderStage stage, NodeCullParams &cullParamsInOut) noexcept
static void findNode(Divide::ProjectManager *mgr, const vec3< F32 > &cameraEye, const I64 nodeGUID, VisibleNodeList<> &nodesOut)
static void debugDraw(Divide::ProjectManager *mgr, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
static std::pair< Handle< Texture >, SamplerDescriptor > getSkyTexture(const Divide::ProjectManager *mgr)
static void removePlayer(Divide::ProjectManager &manager, Scene *parentScene, SceneGraphNode *playerNode, const bool queue)
static void getNodesInScreenRect(const Divide::ProjectManager &manager, const Rect< I32 > &screenRect, const Camera &camera, vector< SceneGraphNode * > &nodesOut)
static void addPlayer(Divide::ProjectManager &manager, Scene *parentScene, SceneGraphNode *playerNode, const bool queue)
static bool unloadScene(Divide::Project &project, Scene *scene)
The kernel is the main system that connects all of our various systems: windows, gfx,...
static bool saveNodeToXML(Scene *activeScene, const SceneGraphNode *node)
static bool saveScene(Scene *activeScene, bool toCache, const DELEGATE< void, std::string_view > &msgCallback, const DELEGATE< void, bool > &finishCallback)
static bool loadNodeFromXML(Scene *activeScene, SceneGraphNode *node)
static bool loadScene(Scene *activeScene)
void setActiveScene(Scene *scene)
Scene * getActiveScene() const noexcept
PROPERTY_R_IW(ProjectID, id)
bool switchSceneInternal()
SwitchSceneTarget _sceneSwitchTarget
bool unloadScene(Scene *scene)
PROPERTY_R(ScenePool, scenePool)
ProjectManager & _parentManager
vector< SceneEntry > _sceneEntries
const SceneEntries & getSceneEntries() const noexcept
static bool CreateNewScene(const SceneEntry &scene, const ProjectID &projectID)
static bool CreateNewProject(const ProjectID &projectID)
bool switchScene(const SwitchSceneTarget &scene)
Scene * loadScene(const SceneEntry &sceneEntry)
ProjectManager & parent() noexcept
bool loadComplete() const noexcept
Check if the scene was loaded properly.
void addPlayerInternal(Scene *parentScene, SceneGraphNode *playerNode)
SwitchProjectTarget _projectSwitchTarget
bool joystickPovMoved(const Input::JoystickEvent &arg) override
Joystick direction change: return true if input was consumed.
bool mouseButtonPressed(const Input::MouseButtonEvent &arg) override
Mouse button pressed: return true if input was consumed.
bool saveActiveScene(bool toCache, bool deferred, const DELEGATE< void, std::string_view > &msgCallback={}, const DELEGATE< void, bool > &finishCallback={})
bool joystickBallMoved(const Input::JoystickEvent &arg) override
void initPostLoadState() noexcept
bool mouseButtonReleased(const Input::MouseButtonEvent &arg) override
Mouse button released: return true if input was consumed.
vector< std::pair< size_t, DELEGATE< void, U8, const vector< SceneGraphNode * > & > > > _selectionChangeCallbacks
void getSortedReflectiveNodes(const Camera *camera, RenderStage stage, bool inView, VisibleNodeList<> &nodesOut) const
get the full list of reflective nodes
static bool OnStartup(PlatformContext &context)
void setSelected(PlayerIndex idx, const vector< SceneGraphNode * > &SGNs, bool recursive)
bool frameStarted(const FrameEvent &evt) override
void drawCustomUI(const Rect< I32 > &targetViewport, GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
~ProjectManager() override
void findNode(const vec3< F32 > &cameraEye, const I64 nodeGUID, VisibleNodeList<> &nodesOut)
Searches the scenegraph for the specified nodeGUID and, if found, adds it to nodesOut.
U8 playerPass() const noexcept
VisibleNodeList _recentlyRenderedNodes
eastl::queue< std::pair< Scene *, SceneGraphNode * > > _playerAddQueue
void getSortedRefractiveNodes(const Camera *camera, RenderStage stage, bool inView, VisibleNodeList<> &nodesOut) const
get the full list of refractive nodes
void editorPreviewNode(const I64 editorPreviewNode) noexcept
void removePlayerInternal(Scene *parentScene, SceneGraphNode *playerNode)
ErrorCode loadProjectInternal()
bool onKeyDown(const Input::KeyEvent &key) override
Key pressed: return true if input was consumed.
eastl::queue< std::pair< Scene *, SceneGraphNode * > > _playerRemoveQueue
std::pair< Handle< Texture >, SamplerDescriptor > getSkyTexture() const
Camera * playerCamera(bool skipOverride=false) const noexcept
bool networkUpdate(U64 frameCount)
const PlatformContext & platformContext() const noexcept
bool joystickRemap(const Input::JoystickEvent &arg) override
bool saveNode(const SceneGraphNode *targetNode) const
void removePlayer(Scene *parentScene, SceneGraphNode *playerNode, bool queue)
void addPlayer(Scene *parentScene, SceneGraphNode *playerNode, bool queue)
void prepareLightData(RenderStage stage, const CameraSnapshot &cameraSnapshot, GFX::MemoryBarrierCommand &memCmdInOut)
bool joystickButtonPressed(const Input::JoystickEvent &arg) override
Joystick button pressed: return true if input was consumed.
ErrorCode loadProject(const ProjectID &targetProject, bool deferToStartOfFrame)
bool joystickAddRemove(const Input::JoystickEvent &arg) override
bool frameEnded(const FrameEvent &evt) override
frameEnded is called after the buffers have been swapped
size_t addSelectionCallback(const DELEGATE< void, U8, const vector< SceneGraphNode * > & > &selectionCallback)
const VisibleNodeList & getRenderedNodeList() const noexcept
std::array< Time::ProfileTimer *, to_base(RenderStage::COUNT)> _sceneGraphCullTimers
void postRender(GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
void getNodesInScreenRect(const Rect< I32 > &screenRect, const Camera &camera, vector< SceneGraphNode * > &nodesOut) const
void debugDraw(GFX::CommandBuffer &bufferInOut, GFX::MemoryBarrierCommand &memCmdInOut)
void initDefaultCullValues(RenderStage stage, NodeCullParams &cullParamsInOut) noexcept
init default culling values like max cull distance and other scene related states
bool joystickAxisMoved(const Input::JoystickEvent &arg) override
Joystick axis change: return true if input was consumed.
void cullSceneGraph(const NodeCullParams &cullParams, const U16 cullFlags, VisibleNodeList<> &nodesOut)
cull the SceneGraph against the current view frustum.
bool onKeyUp(const Input::KeyEvent &key) override
Key released: return true if input was consumed.
bool mouseMoved(const Input::MouseMoveEvent &arg) override
Mouse moved: return true if input was consumed.
PlayerIndex _currentPlayerPass
bool removeSelectionCallback(const size_t idx)
void onResolutionChange(const SizeChangeParams ¶ms)
void onNodeDestroy(Scene *parentScene, SceneGraphNode *node)
void currentPlayerPass(PlayerIndex idx)
bool resetSelection(PlayerIndex idx, const bool resetIfLocked)
SceneEnvironmentProbePool * getEnvProbes() const noexcept
void mouseMovedExternally(const Input::MouseMoveEvent &arg)
bool loadNode(SceneGraphNode *targetNode) const
U8 activePlayerCount() const noexcept
AI::Navigation::DivideRecast * recast() const noexcept
void onChangeFocus(bool hasFocus)
AI::Navigation::DivideRecast_uptr _recast
static bool OnShutdown(PlatformContext &context)
BoundingSphere moveCameraToNode(Camera *camera, const SceneGraphNode *targetNode) const
bool joystickButtonReleased(const Input::JoystickEvent &arg) override
Joystick button released: return true if input was consumed.
void updateSceneState(U64 deltaGameTimeUS, U64 deltaAppTimeUS)
Update animations, network data, sounds, triggers etc.
bool onTextEvent(const Input::TextEvent &arg) override
All the information needed for a single light's shadowmap.
An API-independent representation of a texture.
Handle console commands that start with a forward slash.
DELEGATE_STD< Ret, Args... > DELEGATE
vector< SceneEntry > SceneEntries
vector< ProjectID > ProjectIDs
eastl::vector< Type > vector
bool IsSet(const SwitchSceneTarget &target) noexcept
bool operator==(const DisplayManager::OutputDisplayProperties &lhs, const DisplayManager::OutputDisplayProperties &rhs) noexcept
bool dvd_erase_if(eastl::vector< T, A > &vec, Predicate &&pred)
Project const SceneEntry & entry
constexpr auto to_base(const Type value) -> Type
bool _deferToStartOfFrame
bool _unloadPreviousScene
bool _loadInSeparateThread