21#include "Bullet/btBulletCollisionCommon.h"
23#include <unordered_map>
24#include <unordered_set>
31#define DECLARE_NODE(Class, Parent) \
32 DECLARE_FACTORY(Class, Node); \
33 DECLARE_OBJECT(Class, Parent); \
34 DECLARE_SCRIPT_LINK(Class, Parent, Node) \
37#define DEFINE_NODE(Class, Parent) \
38 DEFINE_FACTORY(Class, Node); \
39 DEFINE_OBJECT(Class); \
40 DEFINE_SCRIPT_LINK(Class, Parent, Node);
42typedef std::unordered_map<std::string, NetFunc>
NetFuncMap;
48template<
typename T = Node>
51template<
typename T = Node>
57 std::vector<NetDatum> mReplicatedData;
60 bool mReplicate =
false;
61 bool mReplicateTransform =
false;
62 bool mForceReplicate =
false;
78 static Factory* FindFactory(
const char* className);
80 static NodePtr Construct(
const std::string& name);
82 static void Destruct(
Node* node);
87 virtual void Create();
89 void DestroyDeferred();
93 virtual void LoadStream(
Stream& stream,
Platform platform, uint32_t version);
95 virtual void Copy(
Node* srcNode,
bool recurse);
101 virtual void PrepareTick(std::vector<NodePtrWeak>& outTickNodes,
bool game,
bool recurse);
102 virtual void Tick(
float deltaTime);
103 virtual void EditorTick(
float deltaTime);
104 uint32_t GetLastTickedFrame()
const;
105 virtual void Render();
106 virtual void OnInstanced();
113 virtual void OnSpawnedInEditor();
119 virtual void GatherReplicatedData(std::vector<NetDatum>& outData);
120 virtual void GatherNetFuncs(std::vector<NetFunc>& outFuncs);
122 void GatherPropertyOverrides(std::vector<Property>& outOverrides);
123 void ApplyPropertyOverrides(
const std::vector<Property>& overs);
127 virtual void OnCollision(
130 glm::vec3 impactPoint,
131 glm::vec3 impactNormal,
132 btPersistentManifold* manifold);
136 uint64_t GetPersistentUuid()
const;
137 void SetPersistentUuid(uint64_t uuid);
138 void EnsurePersistentUuid();
140 void EmitSignal(
const std::string& name,
const std::vector<Datum>& args);
142 void ConnectSignal(
const std::string& name,
Node* listener,
const ScriptFunc& func);
143 void DisconnectSignal(
const std::string& name,
Node* listener);
146 void RenderSelected(
bool renderChildren);
149 Node* CreateChild(
const char* typeName);
150 Node* CreateChildClone(
Node* srcNode,
bool recurse);
151 NodePtr Clone(
bool recurse,
bool instantiateLinkedScene =
true,
bool resolveNodePaths =
false);
152 void DestroyAllChildren();
155 bool IsWorldRoot()
const;
158 template<
class NodeClass>
161 return (NodeClass*)CreateChild(NodeClass::GetStaticType());
164 template<
class NodeClass>
167 return ResolvePtr<NodeClass>(CreateChild(NodeClass::GetStaticType()));
170 template<
class NodeClass>
173 NodeClass* ret = (NodeClass*)CreateChild(NodeClass::GetStaticType());
178 template<
class NodeClass>
181 NodeClass* ret = (NodeClass*)CreateChild(NodeClass::GetStaticType());
183 return ResolvePtr<NodeClass>(ret);
186 bool IsDestroyed()
const;
187 bool IsPendingDestroy()
const;
188 bool IsDoomed()
const;
190 bool HasStarted()
const;
191 bool HasAwoken()
const;
193 void EnableTick(
bool enable);
194 bool IsTickEnabled()
const;
196 virtual void SetWorld(
World* world,
bool subRoot);
199 void SetScene(
Scene* scene);
210 uint8_t GetEffectiveTargetScreen(
Node* sceneRoot =
nullptr);
212 std::vector<NetDatum>& GetReplicatedData();
214 void SetNetId(
NetId id);
215 NetId GetNetId()
const;
218 void SetOwningHost(
NetHostId hostId,
bool setAsPawn =
false);
220 void SetReplicate(
bool replicate);
221 bool IsReplicated()
const;
222 void SetReplicateTransform(
bool repTransform);
223 bool IsTransformReplicated()
const;
225 void ForceReplication();
226 void ClearForcedReplication();
227 bool NeedsForcedReplication();
229 virtual bool CheckNetRelevance(
Node* playerNode);
230 bool IsAlwaysRelevant()
const;
231 void SetAlwaysRelevant(
bool alwaysRelevant);
233 bool HasTag(
const std::string& tag);
234 void AddTag(
const std::string& tag);
235 void RemoveTag(
const std::string& tag);
237 void SetName(
const std::string& newName);
238 const std::string& GetName()
const;
239 virtual void SetActive(
bool active);
240 bool IsActive(
bool recurse =
false)
const;
241 virtual void SetVisible(
bool visible);
242 bool IsVisible(
bool recurse =
false)
const;
243 void SetTransient(
bool transient);
244 virtual bool IsTransient()
const;
245 void SetPersistent(
bool persistent);
246 bool IsPersistent()
const;
248 void SetDefault(
bool isDefault);
249 bool IsDefault()
const;
251 void SetUserdataCreated(
bool created);
252 bool IsUserdataCreated()
const;
254 virtual const char* GetTypeName()
const;
257 virtual bool IsNode3D()
const;
258 virtual bool IsWidget()
const;
259 virtual bool IsPrimitive3D()
const;
260 virtual bool IsLight3D()
const;
263 const Node* GetParent()
const;
264 const std::vector<NodePtr>& GetChildren()
const;
266 virtual void Attach(
Node* parent,
bool keepWorldTransform =
false, int32_t index = -1);
267 void Detach(
bool keepWorldTransform =
false);
268 void AddChild(
Node* child, int32_t index = -1);
269 void RemoveChild(
Node* child);
270 void RemoveChild(int32_t index);
275 AddChild(child.
Get(), index);
281 RemoveChild(child.
Get());
284 int32_t FindChildIndex(
const std::string& name)
const;
285 int32_t FindChildIndex(
Node* child)
const;
286 Node* FindChild(
const std::string& name,
bool recurse)
const;
287 Node* FindChildWithTag(
const std::string& name,
bool recurse)
const;
288 Node* FindDescendant(
const std::string& name);
289 Node* FindAncestor(
const std::string& name);
290 bool HasAncestor(
Node* node);
291 Node* GetChild(int32_t index)
const;
293 uint32_t GetNumChildren()
const;
294 int32_t FindParentNodeIndex()
const;
296 void SetHitCheckId(uint32_t
id);
297 uint32_t GetHitCheckId()
const;
299 bool IsLateTickEnabled()
const;
300 void EnableLateTick(
bool enable);
303 void SetScriptFile(
const std::string& fileName);
305 bool DoChildrenHaveUniqueNames()
const;
306 void BreakSceneLink();
307 bool IsSceneLinked(
bool ignoreInPie =
true)
const;
308 bool IsSceneLinkedChild(
bool ignoreInPie =
true);
309 bool IsForeign()
const;
311 bool HasAuthority()
const;
312 bool IsOwned()
const;
313 bool IsLocallyControlled()
const;
315 Datum GetField(
const std::string& key);
316 void SetField(
const std::string& name,
const Datum& value);
317 Datum GetField(int32_t key);
318 void SetField(int32_t key,
const Datum& value);
319 Datum CallFunction(
const std::string& name,
const std::vector<Datum>& args = {});
321 NetFunc* FindNetFunc(
const char* name);
322 NetFunc* FindNetFunc(uint16_t index);
324 void InvokeNetFunc(
const char* name);
325 void InvokeNetFunc(
const char* name,
Datum param0);
326 void InvokeNetFunc(
const char* name,
Datum param0,
Datum param1);
327 void InvokeNetFunc(
const char* name,
Datum param0,
Datum param1,
Datum param2);
333 void InvokeNetFunc(
const char* name,
const std::vector<Datum>& params);
335 static void ProcessPendingDestroys();
337 static void RegisterNetFuncs(
Node* node);
339 static void Deleter(
Node* node);
347 Node* child = FindChild(name, recurse);
348 if (child !=
nullptr)
350 ret = child->
As<T>();
359 bool traverseChildren =
true;
363 traverseChildren = func(
this);
366 if (traverseChildren)
370 for (int32_t i = int32_t(mChildren.size()) - 1; i >= 0; --i)
372 mChildren[i]->Traverse(func, inverted);
377 for (uint32_t i = 0; i < mChildren.size(); ++i)
379 mChildren[i]->Traverse(func, inverted);
404 for (int32_t i = int32_t(mChildren.size()) - 1; i >= 0; --i)
406 cont = mChildren[i]->ForEach(func, inverted);
416 for (uint32_t i = 0; i < mChildren.size(); ++i)
418 cont = mChildren[i]->ForEach(func, inverted);
428 if (cont && inverted)
436 template<
class NodeClass>
440 NodeClass* newNode = (NodeClass*)Node::CreateInstance(NodeClass::GetStaticType());
443 if (newNode !=
nullptr)
445 newNodePtr.
Set(newNode,
nullptr);
447 newNodePtr->mSelf = PtrStaticCast<Node>(newNodePtr);
448 newNodePtr->Create();
456 static bool HandlePropChange(
Datum* datum, uint32_t index,
const void* newValue);
458 static bool OnRep_OwningHost(
Datum* datum, uint32_t index,
const void* newValue);
460 void TickCommon(
float deltaTime);
462 virtual void SetParent(
Node* parent);
463 void ValidateUniqueChildName(
Node* newChild);
465 void SendNetFunc(
NetFunc* func, uint32_t numParams,
const Datum** params);
480 uint32_t mLastTickedFrame = 0;
482 bool mVisible =
true;
483 bool mTransient =
false;
484 bool mPersistent =
false;
485 bool mDefault =
false;
486 bool mUserdataCreated =
false;
487 bool mHasStarted =
false;
488 bool mHasAwoken =
false;
489 bool mDestroyed =
false;
490 bool mTickEnabled =
true;
491 bool mLateTick =
false;
495 uint8_t mTargetScreen = 0;
498 uint64_t mPersistentUuid = 0;
507 bool mReplicate =
false;
508 bool mReplicateTransform =
false;
509 bool mForceReplicate =
false;
510 bool mAlwaysRelevant =
true;
519 bool ShouldExposeVariable()
const;
520 void SetExposeVariable(
bool expose);
521 bool AreAllChildrenHiddenInTree()
const;
523 uint32_t mHitCheckId = 0;
524 bool mExposeVariable =
false;
525 bool mHiddenInTree =
false;
554 return PtrStaticCast<T>(nodePtr);
571 return PtrStaticCast<T>(selfWeak);
#define INVALID_HOST_ID
Definition Constants.h:44
#define INVALID_NODE_ID
Definition Constants.h:42
#define INVALID_NET_ID
Definition Constants.h:41
uint32_t NetId
Definition EngineTypes.h:73
Platform
Definition EngineTypes.h:32
uint8_t NetHostId
Definition EngineTypes.h:626
uint32_t TypeId
Definition EngineTypes.h:72
uint32_t NodeId
Definition EngineTypes.h:74
World * GetWorld(int32_t index)
Definition Engine.cpp:1228
PipelineConfig
Definition GraphicsTypes.h:66
std::unordered_map< std::string, NetFunc > NetFuncMap
Definition Node.h:42
bool(* NodeTraversalFP)(Node *)
Definition Node.h:45
SharedPtr< T > ResolvePtr(Node *node)
Definition Node.h:540
WeakPtr< T > ResolveWeakPtr(Node *node)
Definition Node.h:558
Export macros for Polyphase Engine symbols.
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
void(* SignalHandlerFP)(Node *, const std::vector< Datum > &)
Definition Signals.h:11
VertexType
Definition Vertex.h:7
std::vector< NetDatum > mReplicatedData
Definition Node.h:504
SceneRef mScene
Definition Node.h:494
DECLARE_FACTORY(Node, Node)
SharedPtr< NodeClass > CreateChildSp(const char *name)
Definition Node.h:179
std::string mScriptFile
Definition Node.h:479
void Traverse(T func, bool inverted=false)
Definition Node.h:357
NodePtrWeak mParent
Definition Node.h:474
NodeClass * CreateChild(const char *name)
Definition Node.h:171
std::vector< NodePtr > mChildren
Definition Node.h:476
std::string mName
Definition Node.h:471
static std::unordered_map< TypeId, NetFuncMap > sTypeNetFuncMap
Definition Node.h:467
static SharedPtr< NodeClass > Construct()
Definition Node.h:437
NodePtrWeak mSelf
Definition Node.h:475
void SetTargetScreen(uint8_t screen)
Definition Node.h:203
DECLARE_FACTORY_MANAGER(Node)
static std::unordered_set< NodePtrWeak > sPendingDestroySet
Definition Node.h:468
DECLARE_OBJECT(Node, Object)
static NodeId sNextNodeId
Definition Node.h:469
SharedPtr< NodeClass > CreateChildSp()
Definition Node.h:165
bool ForEach(T func, bool inverted=false)
Definition Node.h:391
static void Deleter(Node *node)
Definition Node.cpp:146
std::unordered_map< std::string, Node * > mChildNameMap
Definition Node.h:477
void AddChild(const SharedPtr< T > &child, int32_t index=-1)
Definition Node.h:273
std::unordered_map< std::string, Signal > mSignalMap
Definition Node.h:478
DECLARE_SCRIPT_LINK_BASE(Node)
uint8_t GetTargetScreen() const
Definition Node.h:202
T * FindChild(const std::string &name, bool recurse)
Definition Node.h:344
NodeClass * CreateChild()
Definition Node.h:159
const WeakPtr< Node > & GetSelfPtr() const
Definition Node.h:341
std::vector< std::string > mTags
Definition Node.h:496
void RemoveChild(const SharedPtr< Node > &child)
Definition Node.h:279
virtual void GatherProperties(std::vector< Property > &props)
Definition Object.h:41
T * As() const
Definition Object.h:52
Definition Primitive3d.h:46
Definition ScriptFunc.h:10
Definition SmartPointer.h:33
void SetDeleter(typename RefCount< T >::DeleterFP deleteFunc)
Definition SmartPointer.h:234
void Set(T *pointer, RefCount< T > *refCount)
Definition SmartPointer.h:156
T * Get() const
Definition SmartPointer.h:247
Definition SmartPointer.h:312
RefCount< T > * GetRefCount() const
Definition SmartPointer.h:531
SharedPtr< T > Lock() const
Definition SmartPointer.h:492
const T * GetPointerRaw() const
Definition SmartPointer.h:551
Definition EngineTypes.h:330