void StaticModelGroup::RemoveInstanceNode(Node* node) { if (!node) return; WeakPtr<Node> instanceWeak(node); node->RemoveListener(this); instanceNodes_.Remove(instanceWeak); UpdateNodeIDs(); OnMarkedDirty(GetNode()); MarkNetworkUpdate(); }
void StaticModelGroup::RemoveInstanceNode(Node* node) { if (!node) return; WeakPtr<Node> instanceWeak(node); Vector<WeakPtr<Node> >::Iterator i = instanceNodes_.Find(instanceWeak); if (i == instanceNodes_.End()) return; node->RemoveListener(this); instanceNodes_.Erase(i); UpdateNumTransforms(); }
void StaticModelGroup::AddInstanceNode(Node* node) { if (!node) return; WeakPtr<Node> instanceWeak(node); if (instanceNodes_.Contains(instanceWeak)) return; // Add as a listener for the instance node, so that we know to dirty the transforms when the node moves or is enabled/disabled node->AddListener(this); instanceNodes_.Push(instanceWeak); UpdateNumTransforms(); }
void StaticModelGroup::ApplyAttributes() { if (!nodeIDsDirty_) return; // Remove all old instance nodes before searching for new. Can not call RemoveAllInstances() as that would modify // the ID list on its own for (unsigned i = 0; i < instanceNodes_.Size(); ++i) { Node* node = instanceNodes_[i]; if (node) node->RemoveListener(this); } instanceNodes_.Clear(); Scene* scene = GetScene(); if (scene) { // The first index stores the number of IDs redundantly. This is for editing for (unsigned i = 1; i < nodeIDsAttr_.Size(); ++i) { Node* node = scene->GetNode(nodeIDsAttr_[i].GetUInt()); if (node) { WeakPtr<Node> instanceWeak(node); node->AddListener(this); instanceNodes_.Push(instanceWeak); } } } worldTransforms_.Resize(instanceNodes_.Size()); nodeIDsDirty_ = false; OnMarkedDirty(GetNode()); }
void StaticModelGroup::ApplyAttributes() { if (!nodesDirty_) return; // Remove all old instance nodes before searching for new for (unsigned i = 0; i < instanceNodes_.Size(); ++i) { Node* node = instanceNodes_[i]; if (node) node->RemoveListener(this); } instanceNodes_.Clear(); Scene* scene = GetScene(); if (scene) { // The first index stores the number of IDs redundantly. This is for editing for (unsigned i = 1; i < nodeIDsAttr_.Size(); ++i) { Node* node = scene->GetNode(nodeIDsAttr_[i].GetUInt()); if (node) { WeakPtr<Node> instanceWeak(node); node->AddListener(this); instanceNodes_.Push(instanceWeak); } } } worldTransforms_.Resize(instanceNodes_.Size()); numWorldTransforms_ = 0; // Correct amount will be found during world bounding box update nodesDirty_ = false; OnMarkedDirty(GetNode()); }