载入中...
搜索中...
未找到
Scene.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Module.h"
6#include "common/Result.h"
7#include "scene/NodeDesc.h"
8#include "scene/SceneHost.h"
10#include "scene/SceneObject.h"
11
12#include <cstdint>
13#include <string>
14#include <unordered_map>
15#include <vector>
16
17namespace ssq {
18class Object;
19}
20
21namespace eve::graphics {
22class Renderable2D;
23class Renderable3D;
24class Camera3D;
25}
26
27namespace eve::physics {
28class Body;
29class Body3D;
30}
31
32namespace eve::audio {
33class Source;
34}
35
36namespace eve::spatial {
37class Octree;
38}
39
40namespace eve::scene {
41
42class SceneObject;
43
52public:
55 Scene();
57 ~Scene() override;
58
65 [[nodiscard]] eve::Result<SceneHost *> mountAs(const std::string &name, NodeDesc root);
70 [[nodiscard]] eve::Result<SceneHost *> mount(NodeDesc root);
75 [[nodiscard]] eve::Result<SceneHost *> remount(NodeDesc root);
80 [[nodiscard]] eve::Result<SceneHost *> remountReconcile(NodeDesc root);
85 [[nodiscard]] eve::Result<SceneHost *> remountAs(const std::string &name, NodeDesc root);
86
88 bool select(const std::string &name);
93 [[nodiscard]] eve::Result<SceneHost *> findHost(const std::string &name) const;
98 [[nodiscard]] eve::Result<SceneHost *> findHostByOwner(uint32_t ownerId) const;
100 [[nodiscard]] SceneHost *current() const noexcept { return selected_; }
102 void bindOwner(uint32_t ownerId);
103
105 void setHostVisible(bool visible);
107 void setHostLayer(int layer);
108
110 void updateTransforms();
112 void updateTransformsAll();
113
115 bool setNodePosition(const std::string &id, float x, float y, float z);
117 bool setNodeRotation(const std::string &id, float yaw, float pitch, float roll);
119 bool setNodeScale(const std::string &id, float sx, float sy, float sz);
121 bool setNodeVisible(const std::string &id, bool visible);
122
124 bool linkRenderable2D(const std::string &nodeId, graphics::Renderable2D *r);
126 bool linkRenderable3D(const std::string &nodeId, graphics::Renderable3D *r);
128 bool unlinkNode(const std::string &nodeId);
129
130 // --- Generic link system (host-scoped primitives; script wrappers in
131 // kSceneEntityScript provide selected-host convenience + NodeRef forms) ---
133 bool linkRenderable2DAt(const std::string &hostName, const std::string &nodeId,
136 bool linkRenderable3DAt(const std::string &hostName, const std::string &nodeId,
139 bool linkPhysics2DAt(const std::string &hostName, const std::string &nodeId,
140 physics::Body *b, const std::string &mode);
142 bool linkPhysics3DAt(const std::string &hostName, const std::string &nodeId,
143 physics::Body3D *b, const std::string &mode);
145 bool linkCamera3DAt(const std::string &hostName, const std::string &nodeId,
148 bool linkAudio3DAt(const std::string &hostName, const std::string &nodeId,
151 bool unlinkNodeAt(const std::string &hostName, const std::string &nodeId);
153 bool unlinkNodeKindAt(const std::string &hostName, const std::string &nodeId,
154 const std::string &kind);
156 int linkCountAt(const std::string &hostName, const std::string &nodeId);
157
158 // --- Script-API completeness (host-scoped primitives; script wrappers in
159 // kSceneEntityScript provide selected-host convenience + NodeRef forms) ---
160
162 std::vector<float> getNodePositionAt(const std::string &hostName,
163 const std::string &nodeId) const;
165 std::vector<float> getNodeRotationAt(const std::string &hostName,
166 const std::string &nodeId) const;
168 std::vector<float> getNodeScaleAt(const std::string &hostName,
169 const std::string &nodeId) const;
171 bool getNodeVisibleAt(const std::string &hostName, const std::string &nodeId) const;
173 std::vector<float> getNodeWorldPositionAt(const std::string &hostName,
174 const std::string &nodeId) const;
176 std::vector<float> getNodeWorldRotationAt(const std::string &hostName,
177 const std::string &nodeId) const;
179 std::vector<float> getNodeWorldScaleAt(const std::string &hostName,
180 const std::string &nodeId) const;
181
183 std::vector<float> localToWorldAt(const std::string &hostName,
184 const std::string &nodeId, float x, float y,
185 float z) const;
187 std::vector<float> worldToLocalAt(const std::string &hostName,
188 const std::string &nodeId, float x, float y,
189 float z) const;
190
192 bool setNodeParentAt(const std::string &hostName, const std::string &childId,
193 const std::string &parentId);
195 bool removeNodeAt(const std::string &hostName, const std::string &nodeId);
197 bool addChildAt(const std::string &hostName, const std::string &parentId,
198 const std::string &childId);
200 bool removeChildAt(const std::string &hostName, const std::string &parentId,
201 const std::string &childId);
202
204 bool setNodeQuaternionAt(const std::string &hostName, const std::string &nodeId,
205 float qx, float qy, float qz, float qw);
207 std::vector<float> getNodeQuaternionAt(const std::string &hostName,
208 const std::string &nodeId) const;
210 bool setNodeLookAtAt(const std::string &hostName, const std::string &nodeId,
211 float tx, float ty, float tz);
212
214 bool addNodeTagAt(const std::string &hostName, const std::string &nodeId,
215 const std::string &tag);
217 bool removeNodeTagAt(const std::string &hostName, const std::string &nodeId,
218 const std::string &tag);
220 bool hasNodeTagAt(const std::string &hostName, const std::string &nodeId,
221 const std::string &tag) const;
223 std::vector<std::string> getNodeTagsAt(const std::string &hostName,
224 const std::string &nodeId) const;
226 std::vector<std::string> collectIdsByTagAt(const std::string &hostName,
227 const std::string &tag) const;
229 bool setNodeLayerAt(const std::string &hostName, const std::string &nodeId, int layer);
231 int getNodeLayerAt(const std::string &hostName, const std::string &nodeId) const;
232
239 bool setNodeEventHandlerAt(const std::string &hostName, ssq::Object cb);
240
241 // --- Bounds (picking / culling / spatial index) ---
243 bool setNodeBoundsAt(const std::string &hostName, const std::string &nodeId,
244 float minX, float minY, float minZ, float maxX, float maxY,
245 float maxZ);
247 bool hasNodeBoundsAt(const std::string &hostName, const std::string &nodeId) const;
249 std::vector<float> getNodeBoundsAt(const std::string &hostName,
250 const std::string &nodeId) const;
251
252 // --- Serialization (SceneHost ↔ JSON) ---
254 std::string serializeHostAt(const std::string &hostName) const;
256 bool deserializeHostAt(const std::string &hostName, const std::string &json);
257
258 // --- Picking ---
260 std::string pickRayAt(const std::string &hostName, float ox, float oy, float oz,
261 float dx, float dy, float dz) const;
263 std::string pickScreenAt(const std::string &hostName, graphics::Camera3D *cam,
264 float screenX, float screenY, float viewW, float viewH) const;
265
266 // --- Culling / spatial index ---
268 std::vector<std::string> collectFrustumIdsAt(const std::string &hostName,
269 graphics::Camera3D *cam, float viewW,
270 float viewH) const;
282 [[nodiscard]] Result<int> applyPcgTerrainCullingAt(const std::string &hostName,
283 graphics::Camera3D *cam,float viewW,float viewH,const std::string &tag);
285 bool syncSpatialIndexAt(const std::string &hostName, spatial::Octree *ot) const;
287 std::string nodeIdFromSpatialIdAt(const std::string &hostName, int index) const;
288
289 // --- Query / traverse (current host; script-friendly, id-based) ---
291 bool hasNode(const std::string &id);
293 int getNodeCount();
295 std::string getRootId();
297 std::string getParentId(const std::string &id);
299 int getChildCount(const std::string &id);
301 std::string getChildIdAt(const std::string &parentId, int childOrdinal);
303 std::string findIdByName(const std::string &name);
305 std::string findIdByPath(const std::string &path);
307 std::string getNodePath(const std::string &id);
309 bool isAncestor(const std::string &ancestorId, const std::string &nodeId);
311 bool isDescendant(const std::string &nodeId, const std::string &ancestorId);
313 std::vector<std::string> collectIds();
315 std::vector<std::string> collectIdsFrom(const std::string &id);
317 std::vector<std::string> collectIdsByName(const std::string &name);
319 std::vector<std::string> collectIdsVisible(bool visible);
321 std::vector<std::string> collectChildIds(const std::string &parentId);
323 std::vector<std::string> walkDepthFirstIds();
325 std::vector<std::string> walkBreadthFirstIds();
326
327 // --- Imperative builder (script / isomorphic to UI) ---
329 void beginBuild();
331 void beginNode(const std::string &id, const std::string &name = "");
333 void beginGroup(const std::string &id = "");
335 void end();
337 void addNode(const std::string &id, const std::string &name = "");
339 void setBuildPosition(float x, float y, float z = 0.f);
341 void setBuildRotation(float yaw, float pitch = 0.f, float roll = 0.f);
343 void setBuildScale(float sx, float sy, float sz = 1.f);
345 void setBuildSpace(const std::string &space);
347 void setBuildVisible(bool visible);
349 bool mountBuild();
351 bool mountBuildAs(const std::string &name);
353 bool remountBuildAs(const std::string &name);
354
355 // ------------------------------------------------------------------
356 // Per-node script entities (eve.SceneEntity). Native primitives called by
357 // script wrappers injected in expose(); see kSceneEntityScript.
358 // ------------------------------------------------------------------
359
361 [[nodiscard]] SceneHost *resolveHost(const std::string &hostName) const;
362
364 bool rootEntity(const std::string &hostName, const std::string &nodeId,
365 ssq::Object instance);
367 bool unrootEntityAt(const std::string &hostName, const std::string &nodeId,
368 int index);
370 int forEachEntity(const std::string &hostName, const std::string &nodeId,
371 ssq::Object cb);
373 void updateScripts(float dt);
374
386 [[nodiscard]] eve::Result<void> scheduleDetachEntityAt(const std::string &hostName,
387 const std::string &nodeId,
388 ssq::Object instance);
390 void flushDelayedDetaches();
391
393 std::string currentHostName() const;
395 [[nodiscard]] SceneNodeRef *getNodeRefAt(const std::string &hostName, const std::string &nodeId) const;
397 [[nodiscard]] SceneNodeRef *getNodeRefByPathAt(const std::string &hostName, const std::string &path) const;
398
399private:
400 struct DelayedDetach {
401 std::string hostName;
402 std::string nodeId;
403 HSQOBJECT instance{};
404 };
405 [[nodiscard]] SceneHost *ensureSelected(const std::string &preferredName = "");
406 NodeDesc &currentParent();
407 void pushOpen(NodeDesc d);
408 bool buildComplete() const;
409
410 [[nodiscard]] SceneObject *findSceneObjectById(uint32_t id) const;
411 [[nodiscard]] SceneObject *findSceneObjectByPersistentId(eve::SceneObjectId id) const;
412 [[nodiscard]] SceneObject *ensureSceneObject(SceneHost *host, SceneNode *node, const std::string &hostName);
414 void pruneOrphanObjects();
416 void teardownBindings(SceneObject *obj);
418 void syncBindingRefs(SceneObject *obj);
419
420 bool callMethod(HSQOBJECT inst, const char *name, float dt);
421 bool callMethod0(HSQOBJECT inst, const char *name);
422 bool callCallback(HSQOBJECT fn, HSQOBJECT inst, int index);
423 void callEventCallback(const std::string &hostName, const std::string &action,
424 const std::string &nodeId, const std::string &parentId);
425
426 SceneHost *selected_ = nullptr;
427 HSQUIRRELVM vm_ = nullptr;
428 std::unordered_map<std::string, HSQOBJECT> eventCbs_;
429 std::vector<DelayedDetach> delayedDetaches_;
430 bool flushingDelayedDetaches_ = false;
431
432 std::vector<NodeDesc> openStack_;
433 NodeDesc builtRoot_;
434 bool hasBuiltRoot_ = false;
435};
436
437} // namespace eve::scene
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
int root
Definition AnimSmr.cpp:119
const std::string & s
struct SQVM * HSQUIRRELVM
std::string nodeId
std::uint64_t parentId
#define EVENGINE_API_PLATFORM
Definition Export.h:107
double r
std::int32_t c
TokenKind kind
std::string name
MeleePoint3 b
Definition MeleeHit.cpp:41
const std::string * tag
TileLayer * layer
std::string action
Definition PlayHost.cpp:117
std::string path
Definition PlayHost.cpp:110
float d
Move-only, checked operation results for the common layer.
const RoadNode * node
float dz
float dy
float dx
bool visible
UIHostHandle host
uint32_t index
double oy
double ox
float qy
float qx
float qw
float qz
EVENGINE_API_FOUNDATION public API.
Definition Module.h:46
Move-only operation result carrying either a value or Status.
Definition Result.h:155
A playable audio source (static buffer or streaming decoder). Not thread-safe for playback control ex...
Definition Source.h:30
Id128 public API.
Definition Identity.h:112
EVENGINE_API_BACKENDS public API.
Default renderable entity for declarative 2D sprites / solid quads.
EVENGINE_API_BACKENDS public API.
3D rigid body (Box3D) in meter-space coordinates (+Y up by convention). Owned by a World3D; create pr...
Definition Body3D.h:24
2D rigid body (Box2D) in pixel-space coordinates. Owned by a World; create shapes with newRectangleFi...
Definition Body.h:21
ECS mount point for one scene graph (full scene or nested subtree root). Isomorphic to eve::ui::UIHos...
Definition SceneHost.h:89
Script handle to a scene node (hostName + nodeId). Deliberately holds strings rather than arena point...
Declarative scene module (eve.Scene).
Definition Scene.h:51
SceneHost * current() const noexcept
Currently selected borrowed host, or nullptr.
Definition Scene.h:100
Region octree for 3D AABB broad-phase / scene culling. Same storage rules as QuadTree (smallest fully...
Definition Octree.h:18
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
Optional physics backend for vehicle mobility and body attach.
Definition Climbing.h:36
EVEngine ECS 集成层:底层实现使用 sunxfancy/ECS.hpp https://github.com/sunxfancy/ECS.hpp
Definition ECS.h:14
SettlementPipeline::Stage fn
Declarative scene-node description (build once / on dirty → flatten into SceneHost::Tree)....
Definition NodeDesc.h:19