Exemplo n.º 1
0
void MaterialNode::receiveFragmentCreate(void* user,
                                         VNodeID nodeID,
                                         VNMFragmentID fragmentID,
                                         VNMFragmentType type,
                                         const VMatFrag* value)
{
  Session* session = Session::getCurrent();

  MaterialNode* node = dynamic_cast<MaterialNode*>(session->getNodeByID(nodeID));
  if (!node)
    return;

  Fragment* fragment = node->getFragmentByID(fragmentID);
  if (fragment)
  {
    if (type != fragment->mType)
    {
      const Fragment::ObserverList& observers = fragment->getObservers();
      for (Fragment::ObserverList::const_iterator i = observers.begin();  i != observers.end();  i++)
        (*i)->onSetType(*fragment, type);

      fragment->mType = type;
      fragment->mValue = *value;
      fragment->updateStructureVersion();

      //for (Fragment::ObserverList::const_iterator i = observers.begin();  i != observers.end();  i++)
      //  (*i)->postSetType(*fragment, type);
    }
    else
    {
      const Fragment::ObserverList& observers = fragment->getObservers();
      for (Fragment::ObserverList::const_iterator i = observers.begin();  i != observers.end();  i++)
        (*i)->onSetValue(*fragment, *value);

      fragment->mValue = *value;
      fragment->updateDataVersion();

      //for (Fragment::ObserverList::const_iterator i = observers.begin();  i != observers.end();  i++)
      //  (*i)->postFragChange(*fragment, frag);
    }
  }
  else
  {
    fragment = new Fragment(fragmentID, *node, type, *value);

	// Notify node observers.
    const MaterialNode::ObserverList& nObservers = node->getObservers();
    for (MaterialNode::ObserverList::const_iterator i = nObservers.begin();  i != nObservers.end();  i++)
    {
      if (MaterialNodeObserver* observer = dynamic_cast<MaterialNodeObserver*>(*i))
        observer->onCreateFragment(*node, *fragment);
    }

    node->mFragments.push_back(fragment);
    node->updateStructureVersion();

    //for (MaterialNode::ObserverList::const_iterator i = nObservers.begin();  i != nObservers.end();  i++)
    //{
    //  if (MaterialNodeObserver* observer = dynamic_cast<MaterialNodeObserver*>(*i))
    //    observer->postCreateFragment(*node, *fragment);
    //}
  }
}