void Node::PrepareNetworkUpdate() { // Update dependency nodes list first dependencyNodes_.Clear(); // Add the parent node, but if it is local, traverse to the first non-local node if (parent_ && parent_ != scene_) { Node* current = parent_; while (current->id_ >= FIRST_LOCAL_ID) current = current->parent_; if (current && current != scene_) dependencyNodes_.Push(current); } // Let the components add their dependencies for (Vector<SharedPtr<Component> >::ConstIterator i = components_.Begin(); i != components_.End(); ++i) { Component* component = *i; if (component->GetID() < FIRST_LOCAL_ID) component->GetDependencyNodes(dependencyNodes_); } // Then check for node attribute changes if (!networkState_) AllocateNetworkState(); const Vector<AttributeInfo>* attributes = networkState_->attributes_; unsigned numAttributes = attributes->Size(); if (networkState_->currentValues_.Size() != numAttributes) { networkState_->currentValues_.Resize(numAttributes); networkState_->previousValues_.Resize(numAttributes); // Copy the default attribute values to the previous state as a starting point for (unsigned i = 0; i < numAttributes; ++i) networkState_->previousValues_[i] = attributes->At(i).defaultValue_; } // Check for attribute changes for (unsigned i = 0; i < numAttributes; ++i) { const AttributeInfo& attr = attributes->At(i); OnGetAttribute(attr, networkState_->currentValues_[i]); if (networkState_->currentValues_[i] != networkState_->previousValues_[i]) { networkState_->previousValues_[i] = networkState_->currentValues_[i]; // Mark the attribute dirty in all replication states that are tracking this node for (PODVector<ReplicationState*>::Iterator j = networkState_->replicationStates_.Begin(); j != networkState_->replicationStates_.End(); ++j) { NodeReplicationState* nodeState = static_cast<NodeReplicationState*>(*j); nodeState->dirtyAttributes_.Set(i); // Add node to the dirty set if not added yet if (!nodeState->markedDirty_) { nodeState->markedDirty_ = true; nodeState->sceneState_->dirtyNodes_.Insert(id_); } } } } // Finally check for user var changes for (VariantMap::ConstIterator i = vars_.Begin(); i != vars_.End(); ++i) { VariantMap::ConstIterator j = networkState_->previousVars_.Find(i->first_); if (j == networkState_->previousVars_.End() || j->second_ != i->second_) { networkState_->previousVars_[i->first_] = i->second_; // Mark the var dirty in all replication states that are tracking this node for (PODVector<ReplicationState*>::Iterator j = networkState_->replicationStates_.Begin(); j != networkState_->replicationStates_.End(); ++j) { NodeReplicationState* nodeState = static_cast<NodeReplicationState*>(*j); nodeState->dirtyVars_.Insert(i->first_); if (!nodeState->markedDirty_) { nodeState->markedDirty_ = true; nodeState->sceneState_->dirtyNodes_.Insert(id_); } } } } networkUpdate_ = false; }