载入中...
搜索中...
未找到
Scene.h
浏览该文件的文档.
1#pragma once
2
3#include "common/Module.h"
4#include "scene/NodeDesc.h"
5#include "scene/SceneHost.h"
7#include "scene/SceneObject.h"
8
9#include <cstdint>
10#include <string>
11#include <unordered_map>
12#include <vector>
13
14namespace ssq {
15class Object;
16}
17
18namespace eve::graphics {
19class Renderable2D;
20class Renderable3D;
21class Camera3D;
22}
23
24namespace eve::physics {
25class Body;
26class Body3D;
27}
28
29namespace eve::audio {
30class Source;
31}
32
33namespace eve::spatial {
34class Octree;
35}
36
37namespace eve::scene {
38
39class SceneObject;
40
48class Scene : public Module {
49public:
51 Scene();
52 ~Scene() override = default;
53
55 SceneHost *mountAs(const std::string &name, NodeDesc root);
63 SceneHost *remountAs(const std::string &name, NodeDesc root);
64
66 bool select(const std::string &name);
68 SceneHost *findHost(const std::string &name) const;
70 SceneHost *findHostByOwner(uint32_t ownerId) const;
72 SceneHost *current() const { return selected_; }
74 void bindOwner(uint32_t ownerId);
75
77 void setHostVisible(bool visible);
79 void setHostLayer(int layer);
80
82 void updateTransforms();
85
87 bool setNodePosition(const std::string &id, float x, float y, float z);
89 bool setNodeRotation(const std::string &id, float yaw, float pitch, float roll);
91 bool setNodeScale(const std::string &id, float sx, float sy, float sz);
93 bool setNodeVisible(const std::string &id, bool visible);
94
96 bool linkRenderable2D(const std::string &nodeId, graphics::Renderable2D *r);
98 bool linkRenderable3D(const std::string &nodeId, graphics::Renderable3D *r);
100 bool unlinkNode(const std::string &nodeId);
101
102 // --- Generic link system (host-scoped primitives; script wrappers in
103 // kSceneEntityScript provide selected-host convenience + NodeRef forms) ---
104 bool linkRenderable2DAt(const std::string &hostName, const std::string &nodeId,
106 bool linkRenderable3DAt(const std::string &hostName, const std::string &nodeId,
108 bool linkPhysics2DAt(const std::string &hostName, const std::string &nodeId,
109 physics::Body *b, const std::string &mode);
110 bool linkPhysics3DAt(const std::string &hostName, const std::string &nodeId,
111 physics::Body3D *b, const std::string &mode);
112 bool linkCamera3DAt(const std::string &hostName, const std::string &nodeId,
114 bool linkAudio3DAt(const std::string &hostName, const std::string &nodeId,
117 bool unlinkNodeAt(const std::string &hostName, const std::string &nodeId);
119 bool unlinkNodeKindAt(const std::string &hostName, const std::string &nodeId,
120 const std::string &kind);
121 int linkCountAt(const std::string &hostName, const std::string &nodeId);
122
123 // --- Script-API completeness (host-scoped primitives; script wrappers in
124 // kSceneEntityScript provide selected-host convenience + NodeRef forms) ---
125
126 std::vector<float> getNodePositionAt(const std::string &hostName,
127 const std::string &nodeId) const;
128 std::vector<float> getNodeRotationAt(const std::string &hostName,
129 const std::string &nodeId) const;
130 std::vector<float> getNodeScaleAt(const std::string &hostName,
131 const std::string &nodeId) const;
132 bool getNodeVisibleAt(const std::string &hostName, const std::string &nodeId) const;
133 std::vector<float> getNodeWorldPositionAt(const std::string &hostName,
134 const std::string &nodeId) const;
135 std::vector<float> getNodeWorldRotationAt(const std::string &hostName,
136 const std::string &nodeId) const;
137 std::vector<float> getNodeWorldScaleAt(const std::string &hostName,
138 const std::string &nodeId) const;
139
140 std::vector<float> localToWorldAt(const std::string &hostName,
141 const std::string &nodeId, float x, float y,
142 float z) const;
143 std::vector<float> worldToLocalAt(const std::string &hostName,
144 const std::string &nodeId, float x, float y,
145 float z) const;
146
148 bool setNodeParentAt(const std::string &hostName, const std::string &childId,
149 const std::string &parentId);
151 bool removeNodeAt(const std::string &hostName, const std::string &nodeId);
152 bool addChildAt(const std::string &hostName, const std::string &parentId,
153 const std::string &childId);
154 bool removeChildAt(const std::string &hostName, const std::string &parentId,
155 const std::string &childId);
156
157 bool setNodeQuaternionAt(const std::string &hostName, const std::string &nodeId,
158 float qx, float qy, float qz, float qw);
159 std::vector<float> getNodeQuaternionAt(const std::string &hostName,
160 const std::string &nodeId) const;
162 bool setNodeLookAtAt(const std::string &hostName, const std::string &nodeId,
163 float tx, float ty, float tz);
164
165 bool addNodeTagAt(const std::string &hostName, const std::string &nodeId,
166 const std::string &tag);
167 bool removeNodeTagAt(const std::string &hostName, const std::string &nodeId,
168 const std::string &tag);
169 bool hasNodeTagAt(const std::string &hostName, const std::string &nodeId,
170 const std::string &tag) const;
171 std::vector<std::string> getNodeTagsAt(const std::string &hostName,
172 const std::string &nodeId) const;
173 std::vector<std::string> collectIdsByTagAt(const std::string &hostName,
174 const std::string &tag) const;
175 bool setNodeLayerAt(const std::string &hostName, const std::string &nodeId, int layer);
176 int getNodeLayerAt(const std::string &hostName, const std::string &nodeId) const;
177
184 bool setNodeEventHandlerAt(const std::string &hostName, ssq::Object cb);
185
186 // --- Bounds (picking / culling / spatial index) ---
187 bool setNodeBoundsAt(const std::string &hostName, const std::string &nodeId,
188 float minX, float minY, float minZ, float maxX, float maxY,
189 float maxZ);
190 bool hasNodeBoundsAt(const std::string &hostName, const std::string &nodeId) const;
191 std::vector<float> getNodeBoundsAt(const std::string &hostName,
192 const std::string &nodeId) const;
193
194 // --- Serialization (SceneHost ↔ JSON) ---
195 std::string serializeHostAt(const std::string &hostName) const;
196 bool deserializeHostAt(const std::string &hostName, const std::string &json);
197
198 // --- Picking ---
200 std::string pickRayAt(const std::string &hostName, float ox, float oy, float oz,
201 float dx, float dy, float dz) const;
203 std::string pickScreenAt(const std::string &hostName, graphics::Camera3D *cam,
204 float screenX, float screenY, float viewW, float viewH) const;
205
206 // --- Culling / spatial index ---
208 std::vector<std::string> collectFrustumIdsAt(const std::string &hostName,
209 graphics::Camera3D *cam, float viewW,
210 float viewH) const;
212 bool syncSpatialIndexAt(const std::string &hostName, spatial::Octree *ot) const;
214 std::string nodeIdFromSpatialIdAt(const std::string &hostName, int index) const;
215
216 // --- Query / traverse (current host; script-friendly, id-based) ---
217 bool hasNode(const std::string &id);
218 int getNodeCount();
219 std::string getRootId();
220 std::string getParentId(const std::string &id);
221 int getChildCount(const std::string &id);
222 std::string getChildIdAt(const std::string &parentId, int childOrdinal);
223 std::string findIdByName(const std::string &name);
224 std::string findIdByPath(const std::string &path);
225 std::string getNodePath(const std::string &id);
226 bool isAncestor(const std::string &ancestorId, const std::string &nodeId);
227 bool isDescendant(const std::string &nodeId, const std::string &ancestorId);
228 std::vector<std::string> collectIds();
229 std::vector<std::string> collectIdsFrom(const std::string &id);
230 std::vector<std::string> collectIdsByName(const std::string &name);
231 std::vector<std::string> collectIdsVisible(bool visible);
232 std::vector<std::string> collectChildIds(const std::string &parentId);
234 std::vector<std::string> walkDepthFirstIds();
235 std::vector<std::string> walkBreadthFirstIds();
236
237 // --- Imperative builder (script / isomorphic to UI) ---
238 void beginBuild();
239 void beginNode(const std::string &id, const std::string &name = "");
240 void beginGroup(const std::string &id = "");
241 void end();
242 void addNode(const std::string &id, const std::string &name = "");
243 void setBuildPosition(float x, float y, float z = 0.f);
244 void setBuildRotation(float yaw, float pitch = 0.f, float roll = 0.f);
245 void setBuildScale(float sx, float sy, float sz = 1.f);
246 void setBuildSpace(const std::string &space);
247 void setBuildVisible(bool visible);
248 bool mountBuild();
249 bool mountBuildAs(const std::string &name);
250 bool remountBuildAs(const std::string &name);
251
252 // ------------------------------------------------------------------
253 // Per-node script entities (eve.SceneEntity). Native primitives called by
254 // script wrappers injected in expose(); see kSceneEntityScript.
255 // ------------------------------------------------------------------
256
258 SceneHost *resolveHost(const std::string &hostName) const;
259
261 bool rootEntity(const std::string &hostName, const std::string &nodeId,
262 ssq::Object instance);
264 bool unrootEntityAt(const std::string &hostName, const std::string &nodeId,
265 int index);
267 int forEachEntity(const std::string &hostName, const std::string &nodeId,
268 ssq::Object cb);
270 void updateScripts(float dt);
271
272 std::string currentHostName() const;
273 SceneNodeRef *getNodeRefAt(const std::string &hostName,
274 const std::string &nodeId) const;
275 SceneNodeRef *getNodeRefByPathAt(const std::string &hostName,
276 const std::string &path) const;
277
278private:
279 SceneHost *ensureSelected(const std::string &preferredName = "");
280 NodeDesc &currentParent();
281 void pushOpen(NodeDesc d);
282 bool buildComplete() const;
283
284 SceneObject *findSceneObjectById(uint32_t id) const;
285 SceneObject *ensureSceneObject(SceneHost *host, SceneNode *node,
286 const std::string &hostName);
288 void pruneOrphanObjects();
290 void teardownBindings(SceneObject *obj);
292 void syncBindingRefs(SceneObject *obj);
293
294 bool callMethod(HSQOBJECT inst, const char *name, float dt);
295 bool callMethod0(HSQOBJECT inst, const char *name);
296 bool callCallback(HSQOBJECT fn, HSQOBJECT inst, int index);
297 void callEventCallback(const std::string &hostName, const std::string &action,
298 const std::string &nodeId, const std::string &parentId);
299
300 SceneHost *selected_ = nullptr;
301 HSQUIRRELVM vm_ = nullptr;
302 std::unordered_map<std::string, HSQOBJECT> eventCbs_;
303
304 std::vector<NodeDesc> openStack_;
305 NodeDesc builtRoot_;
306 bool hasBuiltRoot_ = false;
307};
308
309} // namespace eve::scene
struct SQVM * HSQUIRRELVM
Tok kind
int y
Definition Grass.cpp:135
int z
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
uint32_t b
uint32_t c
TileLayer * layer
const char * name
Definition RockMesh.cpp:21
SettlementPipeline::Stage fn
int d
uint32_t s
Definition Weather.cpp:28
A playable audio source (static buffer or streaming decoder). Not thread-safe for playback control ex...
Definition Source.h:30
Default renderable entity for declarative 2D sprites / solid quads.
3D rigid body (Box3D) in meter-space coordinates (+Y up by convention). Owned by a World3D; create sh...
Definition Body3D.h:16
2D rigid body (Box2D) in pixel-space coordinates. Owned by a World; create shapes with newRectangleFi...
Definition Body.h:16
ECS mount point for one scene graph (full scene or nested subtree root). Isomorphic to eve::ui::UIHos...
Definition SceneHost.h:80
Script handle to a scene node (hostName + nodeId). Deliberately holds strings rather than arena point...
Per-node ECS identity (created lazily when a node needs script bindings or engine components)....
Definition SceneObject.h:21
Declarative scene module (eve.Scene).
Definition Scene.h:48
void beginNode(const std::string &id, const std::string &name="")
Definition Scene.cpp:721
SceneNodeRef * getNodeRefByPathAt(const std::string &hostName, const std::string &path) const
Definition Scene.cpp:929
bool linkPhysics3DAt(const std::string &hostName, const std::string &nodeId, physics::Body3D *b, const std::string &mode)
SceneHost * resolveHost(const std::string &hostName) const
Host-qualified resolution: empty hostName → currently selected host.
Definition Scene.cpp:807
void setBuildSpace(const std::string &space)
Definition Scene.cpp:768
bool mountBuild()
Definition Scene.cpp:774
std::vector< std::string > collectIdsFrom(const std::string &id)
void updateTransforms()
Propagate transforms (+ link sync) for all hosts (or current if selected).
Definition Scene.cpp:660
bool setNodeParentAt(const std::string &hostName, const std::string &childId, const std::string &parentId)
Reparent by id; empty parentId detaches. Cycle-safe.
std::vector< std::string > collectIds()
bool linkCamera3DAt(const std::string &hostName, const std::string &nodeId, graphics::Camera3D *c)
SceneHost * current() const
Currently selected host, or nullptr.
Definition Scene.h:72
std::string serializeHostAt(const std::string &hostName) const
Definition Scene.cpp:696
std::vector< std::string > collectIdsByTagAt(const std::string &hostName, const std::string &tag) const
void setBuildVisible(bool visible)
Definition Scene.cpp:770
std::vector< float > getNodeRotationAt(const std::string &hostName, const std::string &nodeId) const
std::string findIdByPath(const std::string &path)
bool rootEntity(const std::string &hostName, const std::string &nodeId, ssq::Object instance)
Root one script instance on a node (creates SceneObject lazily).
Definition Scene.cpp:834
std::string pickScreenAt(const std::string &hostName, graphics::Camera3D *cam, float screenX, float screenY, float viewW, float viewH) const
Screen-space picking through a Camera3D (camera.screenToRay).
void beginBuild()
Definition Scene.cpp:708
bool setNodeQuaternionAt(const std::string &hostName, const std::string &nodeId, float qx, float qy, float qz, float qw)
SceneHost * remount(NodeDesc root)
Replaces the selected host's tree.
Definition Scene.cpp:616
bool getNodeVisibleAt(const std::string &hostName, const std::string &nodeId) const
std::vector< float > worldToLocalAt(const std::string &hostName, const std::string &nodeId, float x, float y, float z) const
SceneHost * remountAs(const std::string &name, NodeDesc root)
Creates/replaces a named host (does not select it).
Definition Scene.cpp:632
void setBuildRotation(float yaw, float pitch=0.f, float roll=0.f)
Definition Scene.cpp:754
void updateScripts(float dt)
updateTransformsAll() + call update(dt) on every rooted instance.
Definition Scene.cpp:898
std::vector< float > getNodePositionAt(const std::string &hostName, const std::string &nodeId) const
SceneHost * findHost(const std::string &name) const
Finds a host by name, or nullptr.
Definition Scene.cpp:643
std::vector< float > getNodeWorldPositionAt(const std::string &hostName, const std::string &nodeId) const
int getNodeLayerAt(const std::string &hostName, const std::string &nodeId) const
bool linkPhysics2DAt(const std::string &hostName, const std::string &nodeId, physics::Body *b, const std::string &mode)
bool removeNodeAt(const std::string &hostName, const std::string &nodeId)
Detach node from its parent (arena node stays; rebuild to delete).
SceneHost * mountAs(const std::string &name, NodeDesc root)
Creates/replaces a named host from a NodeDesc tree and selects it.
Definition Scene.cpp:604
~Scene() override=default
SceneNodeRef * getNodeRefAt(const std::string &hostName, const std::string &nodeId) const
Definition Scene.cpp:921
std::vector< std::string > collectChildIds(const std::string &parentId)
void setHostVisible(bool visible)
Shows/hides every host (or the selected one when a host is selected).
Definition Scene.cpp:652
bool unlinkNodeAt(const std::string &hostName, const std::string &nodeId)
Remove every link on the node.
bool setNodePosition(const std::string &id, float x, float y, float z)
Script-friendly TRS setters on the current host; each marks the transform dirty.
std::vector< std::string > collectIdsVisible(bool visible)
bool linkAudio3DAt(const std::string &hostName, const std::string &nodeId, audio::Source *s)
bool setNodeLookAtAt(const std::string &hostName, const std::string &nodeId, float tx, float ty, float tz)
Orient node so its local +Z axis points at (tx,ty,tz).
std::string currentHostName() const
Definition Scene.cpp:917
std::vector< float > getNodeWorldRotationAt(const std::string &hostName, const std::string &nodeId) const
bool hasNode(const std::string &id)
void bindOwner(uint32_t ownerId)
Binds the selected host to a UI/scene owner id.
Definition Scene.cpp:647
std::string getNodePath(const std::string &id)
std::string findIdByName(const std::string &name)
int getChildCount(const std::string &id)
bool removeNodeTagAt(const std::string &hostName, const std::string &nodeId, const std::string &tag)
bool linkRenderable3DAt(const std::string &hostName, const std::string &nodeId, graphics::Renderable3D *r)
void setBuildPosition(float x, float y, float z=0.f)
Definition Scene.cpp:747
bool mountBuildAs(const std::string &name)
Definition Scene.cpp:782
bool isAncestor(const std::string &ancestorId, const std::string &nodeId)
void beginGroup(const std::string &id="")
Definition Scene.cpp:726
SceneHost * remountReconcile(NodeDesc root)
Remount with key reconcile (props-only when structure matches).
Definition Scene.cpp:624
bool setNodeScale(const std::string &id, float sx, float sy, float sz)
Sets the local scale of a node.
std::string getParentId(const std::string &id)
std::vector< std::string > collectIdsByName(const std::string &name)
void setHostLayer(int layer)
Sets the render layer of every host (or the selected one).
Definition Scene.cpp:656
bool unlinkNodeKindAt(const std::string &hostName, const std::string &nodeId, const std::string &kind)
Remove links of one kind ("renderable2d"|"renderable3d"|"physics2d"|...).
SceneHost * mount(NodeDesc root)
Mounts the tree as an auto-named host and selects it.
Definition Scene.cpp:614
std::vector< float > getNodeScaleAt(const std::string &hostName, const std::string &nodeId) const
std::string nodeIdFromSpatialIdAt(const std::string &hostName, int index) const
Map a spatial-index id (arena index) back to a node id.
std::vector< std::string > getNodeTagsAt(const std::string &hostName, const std::string &nodeId) const
void updateTransformsAll()
Propagate transforms for every host regardless of selection.
Definition Scene.cpp:665
int linkCountAt(const std::string &hostName, const std::string &nodeId)
bool hasNodeBoundsAt(const std::string &hostName, const std::string &nodeId) const
bool deserializeHostAt(const std::string &hostName, const std::string &json)
Definition Scene.cpp:701
std::vector< std::string > walkBreadthFirstIds()
bool unrootEntityAt(const std::string &hostName, const std::string &nodeId, int index)
Remove a rooted script instance by its index in the binding list.
Definition Scene.cpp:854
bool remountBuildAs(const std::string &name)
Definition Scene.cpp:790
bool linkRenderable3D(const std::string &nodeId, graphics::Renderable3D *r)
Links a 3D renderable to a node in the current host.
bool setNodeLayerAt(const std::string &hostName, const std::string &nodeId, int layer)
bool setNodeRotation(const std::string &id, float yaw, float pitch, float roll)
Sets the local rotation (yaw/pitch/roll in degrees) of a node.
bool unlinkNode(const std::string &nodeId)
Removes every link on a node in the current host.
bool syncSpatialIndexAt(const std::string &hostName, spatial::Octree *ot) const
Insert every bounded node's world AABB into an octree (id = arena index).
bool setNodeEventHandlerAt(const std::string &hostName, ssq::Object cb)
Register a script callback for node lifecycle events on a host: cb(action, nodeId,...
std::vector< float > getNodeQuaternionAt(const std::string &hostName, const std::string &nodeId) const
void addNode(const std::string &id, const std::string &name="")
Definition Scene.cpp:743
bool removeChildAt(const std::string &hostName, const std::string &parentId, const std::string &childId)
bool setNodeBoundsAt(const std::string &hostName, const std::string &nodeId, float minX, float minY, float minZ, float maxX, float maxY, float maxZ)
bool setNodeVisible(const std::string &id, bool visible)
Shows/hides a node.
std::string getRootId()
bool addChildAt(const std::string &hostName, const std::string &parentId, const std::string &childId)
std::string getChildIdAt(const std::string &parentId, int childOrdinal)
bool linkRenderable2DAt(const std::string &hostName, const std::string &nodeId, graphics::Renderable2D *r)
std::vector< float > localToWorldAt(const std::string &hostName, const std::string &nodeId, float x, float y, float z) const
std::vector< float > getNodeWorldScaleAt(const std::string &hostName, const std::string &nodeId) const
bool select(const std::string &name)
Selects a named host; false when it does not exist.
Definition Scene.cpp:636
bool isDescendant(const std::string &nodeId, const std::string &ancestorId)
bool hasNodeTagAt(const std::string &hostName, const std::string &nodeId, const std::string &tag) const
std::vector< std::string > walkDepthFirstIds()
DFS order of ids under root (same as collectIds). Kept for script naming clarity.
std::vector< std::string > collectFrustumIdsAt(const std::string &hostName, graphics::Camera3D *cam, float viewW, float viewH) const
Ids of nodes whose world AABB intersects the camera frustum.
void setBuildScale(float sx, float sy, float sz=1.f)
Definition Scene.cpp:761
std::vector< float > getNodeBoundsAt(const std::string &hostName, const std::string &nodeId) const
std::string pickRayAt(const std::string &hostName, float ox, float oy, float oz, float dx, float dy, float dz) const
Nearest node id hit by a world ray (nodes with bounds), or "".
bool addNodeTagAt(const std::string &hostName, const std::string &nodeId, const std::string &tag)
SceneHost * findHostByOwner(uint32_t ownerId) const
Finds the host bound to an owner id, or nullptr.
Definition Scene.cpp:645
bool linkRenderable2D(const std::string &nodeId, graphics::Renderable2D *r)
Links a 2D renderable to a node in the current host.
int forEachEntity(const std::string &hostName, const std::string &nodeId, ssq::Object cb)
Call cb(instance, index) for every rooted instance; returns count.
Definition Scene.cpp:875
Region octree for 3D AABB broad-phase / scene culling. Same storage rules as QuadTree (smallest fully...
Definition Octree.h:16
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition AnimTrail.h:6
NodeDesc node(std::string id, std::vector< NodeDesc > children, std::string name)
Definition NodeDesc.cpp:214
EVEngine ECS 集成层:底层实现使用 sunxfancy/ECS.hpp https://github.com/sunxfancy/ECS.hpp
Definition ECS.h:12
Declarative scene-node description (build once / on dirty → flatten into SceneHost::Tree)....
Definition NodeDesc.h:15
Retained scene node (arena). Conceptual GameObject; isomorphic to eve::ui::UINode.
Definition SceneHost.h:39