|
|
@@ -13,15 +13,16 @@
|
|
|
#define NODE_DIRTY_ALL (NODE_DIRTY_WORLD | NODE_DIRTY_BOUNDS)
|
|
|
|
|
|
// Node property flags
|
|
|
-#define NODE_FLAG_TRANSPARENT 1
|
|
|
+#define NODE_FLAG_VISIBLE 1
|
|
|
+#define NODE_FLAG_TRANSPARENT 2
|
|
|
|
|
|
namespace gameplay
|
|
|
{
|
|
|
|
|
|
Node::Node(const char* id)
|
|
|
: _scene(NULL), _firstChild(NULL), _nextSibling(NULL), _prevSibling(NULL), _parent(NULL), _childCount(NULL),
|
|
|
- _nodeFlags(0), _camera(NULL), _light(NULL), _model(NULL), _form(NULL), _audioSource(NULL), _particleEmitter(NULL),
|
|
|
- _collisionObject(NULL), _dirtyBits(NODE_DIRTY_ALL), _notifyHierarchyChanged(true)
|
|
|
+ _nodeFlags(NODE_FLAG_VISIBLE), _camera(NULL), _light(NULL), _model(NULL), _form(NULL), _audioSource(NULL), _particleEmitter(NULL),
|
|
|
+ _collisionObject(NULL), _dirtyBits(NODE_DIRTY_ALL), _notifyHierarchyChanged(true), _userData(NULL)
|
|
|
{
|
|
|
if (id)
|
|
|
{
|
|
|
@@ -49,6 +50,15 @@ Node::~Node()
|
|
|
SAFE_RELEASE(_particleEmitter);
|
|
|
SAFE_RELEASE(_form);
|
|
|
SAFE_DELETE(_collisionObject);
|
|
|
+
|
|
|
+ // Cleanup user data
|
|
|
+ if (_userData)
|
|
|
+ {
|
|
|
+ // Call custom cleanup callback if specified
|
|
|
+ if (_userData->cleanupCallback)
|
|
|
+ _userData->cleanupCallback(_userData->pointer);
|
|
|
+ SAFE_DELETE(_userData);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Node* Node::create(const char* id)
|
|
|
@@ -199,20 +209,61 @@ Node* Node::getParent() const
|
|
|
return _parent;
|
|
|
}
|
|
|
|
|
|
+bool Node::isVisible() const
|
|
|
+{
|
|
|
+ return ((_nodeFlags & NODE_FLAG_VISIBLE) == NODE_FLAG_VISIBLE);
|
|
|
+}
|
|
|
+
|
|
|
+void Node::setVisible(bool visible)
|
|
|
+{
|
|
|
+ if (visible)
|
|
|
+ _nodeFlags |= NODE_FLAG_VISIBLE;
|
|
|
+ else
|
|
|
+ _nodeFlags &= ~NODE_FLAG_VISIBLE;
|
|
|
+}
|
|
|
+
|
|
|
bool Node::isTransparent() const
|
|
|
{
|
|
|
return ((_nodeFlags & NODE_FLAG_TRANSPARENT) == NODE_FLAG_TRANSPARENT);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-void Node::setTransparent(bool flag)
|
|
|
+void Node::setTransparent(bool transparent)
|
|
|
{
|
|
|
- if (flag)
|
|
|
+ if (transparent)
|
|
|
_nodeFlags |= NODE_FLAG_TRANSPARENT;
|
|
|
else
|
|
|
_nodeFlags &= ~NODE_FLAG_TRANSPARENT;
|
|
|
}
|
|
|
|
|
|
+void* Node::getUserPointer() const
|
|
|
+{
|
|
|
+ return (_userData ? _userData->pointer : NULL);
|
|
|
+}
|
|
|
+
|
|
|
+void Node::setUserPointer(void* pointer, void (*cleanupCallback)(void*))
|
|
|
+{
|
|
|
+ // If existing user pointer is being changed, call cleanup function to free previous pointer
|
|
|
+ if (_userData && _userData->pointer && _userData->cleanupCallback && pointer != _userData->pointer)
|
|
|
+ {
|
|
|
+ _userData->cleanupCallback(_userData->pointer);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pointer)
|
|
|
+ {
|
|
|
+ // Assign user pointer
|
|
|
+ if (_userData == NULL)
|
|
|
+ _userData = new UserData();
|
|
|
+
|
|
|
+ _userData->pointer = pointer;
|
|
|
+ _userData->cleanupCallback = cleanupCallback;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Clear user pointer
|
|
|
+ SAFE_DELETE(_userData);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
unsigned int Node::getChildCount() const
|
|
|
{
|
|
|
return _childCount;
|