Files
2026-06-22 11:49:35 +02:00

170 lines
4.5 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __NUI_SCENE__
#define __NUI_SCENE__
#include "ui/ui_item.h"
#include "ui/ui_cursor.h"
#include "ui/ui_message.h"
#include "ui/ui_event_handler.h"
#include "ui/ui_window_skin.h"
#include "ui/ui_scene_event_interface.h"
#include "scene3d/scene_io_flag.h"
#include "motion/scene_motion_container.h"
#include "core/tool_mode.h"
#include "core/clock.h"
#include "core/ace.h"
#include "color/color.h"
namespace GS {
namespace GPU { class TriangleBatch; }
namespace Render { class RasterFont; }
namespace S2D {
struct Group;
struct Camera;
class Window;
class Widget;
/*!
@short Scene 2D
@author Emmanuel Julien (ejulien@nworks.fr)
*/
class Scene : public SharedObject, public ACE::Unit
{
uint current_item_uid;
protected:
SharedList <Item *> item_list;
Item *lock;
Matrix3 screen_to_ui, ui_to_screen;
SharedPtr <Camera> default_camera, current_camera;
Widget *RecurseWidgetBelowCursor(Window *, Widget *, int x, int y);
void ProcessCursorEnterLeaveWidget(Cursor *, Window *, Widget *);
/// Execute an ACE command.
bool ExecCommand(ACE::Command *, float dt);
Core::sClock clock;
public:
String name;
void SetClock(Core::Clock * = 0);
/*!
@name Script system.
@{
*/
Script::sVM vm;
AutoPtr <ISceneEvent> scene_event;
AutoPtr <Script::ScriptedObject> scripted_object;
void SetAsScriptGlobalScene(Script::IVM * = 0);
/*!
@}
@name Item list.
@{
*/
const SharedList <Item *> &GetItemList() const { return item_list; }
/// Get item 2d from name.
Item *ItemFromName(const char *name, Item *parent = 0) const;
/// Get item 2d from unique identifier.
Item *ItemFromUid(uint) const;
void SetupItemComponents(Item *);
void AddItem(Item *, bool setup_components);
bool RemoveItem(Item *);
void DeleteAllItems();
/*!
@}
@name Motion system.
@{
*/
Core::SceneMotionContainer motion;
/*!
@short Start a motion on the scene items.
@note Request an animation source group if you need control on the
started animation sources.
*/
void SetMotion(const char *name, Automation::SourceGroup ** = 0, float blend = Units::Sec(0.1), Automation::Player::AddSourceMode = Automation::Player::SourceSet, float weight = 1);
/// @}
Camera *GetDefaultCamera() const { return default_camera; }
Camera *GetCurrentCamera() const { return current_camera; }
void SetCurrentCamera(Camera *camera = 0);
/// Lock all UI events to a specific item.
void Lock(Item *i) { lock = i; }
void Unlock() { lock = 0; }
void UpdateCursor(Cursor *);
/// Call event handler.
bool CallEventHandler(Cursor *, EventCode, EventTable *);
void CallEventHandler(Cursor *, Widget *, EventCode, bool can_propagate = true);
void DrawProfilerText(Renderer &, Render::RasterFont *font[2], float &x, float &y);
sWindowSkin window_skin;
Matrix3 offset_matrix; ///< Global post-projection offset matrix.
Color global_fade_color;
/// Normalized screen coordinates to scene coordinates in pixels.
const Matrix3 &GetScreenToUIMatrix() const { return screen_to_ui; }
/// Scene coordinates in pixels to normalized screen coordinates.
const Matrix3 &GetUIToScreenMatrix() const { return ui_to_screen; }
float GetGlobalFadeEffect() const;
void SetGlobalFadeEffect(float opacity = 1);
/// Evaluate scene.
void Update();
void SetRenderMatrices(Renderer &);
void Render(Renderer &, GPU::TriangleBatch * = 0);
void RenderGlobalFade(Renderer &);
void RenderSetup(Core::ResourceFactories *);
void Setup();
void Reset();
void Clear();
bool IsItemToBeSaved(Item *, const Group *, uint save_flag) const;
NML::Tag *LinkInfoAsMetaTag(Item *, const Group *, uint flag) const;
bool FromMetaFileStoreGroup(const char *, Group ** = 0, uint = SceneIOAll, ToolMode = NoTool, int load_level = 0);
bool FromMetaTagStoreGroup(const NML::Tag &, Group **group = 0, uint = SceneIOAll, ToolMode = NoTool, int load_level = 0);
bool FromMetaTag(const NML::Tag &tag, ToolMode tool = NoTool) { return FromMetaTagStoreGroup(tag, 0, SceneIOAll, tool); }
NML::Tag *AsMetaTag(const Group *, uint = SceneIOAll, ToolMode = NoTool) const;
NML::Tag *AsMetaTag() const { return AsMetaTag(0); }
Scene(Script::IVM * = 0);
virtual ~Scene();
};
} // S2D
} // GS
#endif // __NUI_SCENE__